@datamoc/mw_games 0.34.0 → 0.35.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.
@@ -0,0 +1,534 @@
1
+ import fengari from '@datamoc/fengari';
2
+ /**
3
+ * Optional Lua integration host for a game-owned API, embedded modules and resumable handlers.
4
+ * The JSON-only ScriptHost stays independent. This host opens no system libraries, compiles
5
+ * text only and bounds calls, compilation and coroutine resumes. Tables read normally become
6
+ * arrays/objects/Maps; reference() and createTable() retain Lua identity explicitly.
7
+ * Host callbacks are trusted synchronous code. Proxy tables follow Lua's ordinary metatable
8
+ * rules: rawget/rawset bypass bindings. Neither heap size nor arbitrary host code is bounded.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { createFengariRuntime } from '@datamoc/mw_games/mwl/fengari';
13
+ *
14
+ * const runtime = createFengariRuntime({ modules: { rules: 'return { cost = 4 }' } });
15
+ * let gold = 10;
16
+ * runtime.set('game.side', runtime.createTable({
17
+ * get: (key) => key === 'gold' ? gold : null,
18
+ * set: (key, value) => { if (key === 'gold' && typeof value === 'number') gold = value; },
19
+ * }));
20
+ * runtime.defineFunction('game.balance', () => gold);
21
+ * runtime.defineYieldingFunction('game.ask', (prompt) => [prompt]);
22
+ * runtime.run('function dialogue() game.side.gold = game.side.gold - require("rules").cost; return game.ask("Continue?") end');
23
+ * const dialogue = runtime.coroutine('dialogue');
24
+ * console.log(dialogue.resume().values); // ['Continue?']
25
+ * console.log(dialogue.resume([true]).values); // [true]
26
+ * runtime.dispose();
27
+ * ```
28
+ */
29
+ export function createFengariRuntime(options = {}) {
30
+ const { lua, lauxlib } = fengari;
31
+ const instructionLimit = options.instructionLimit ?? 100_000;
32
+ const memoryLimit = options.memoryLimit ?? 32 * 1024 * 1024;
33
+ for (const [name, value] of [
34
+ ['instructionLimit', instructionLimit],
35
+ ['memoryLimit', memoryLimit],
36
+ ]) {
37
+ if (!Number.isSafeInteger(value) || value < 1)
38
+ throw new RangeError(`${name} must be a positive safe integer`);
39
+ }
40
+ if (options.timeLimit !== undefined && (!Number.isFinite(options.timeLimit) || options.timeLimit <= 0))
41
+ throw new RangeError('timeLimit must be a positive finite number');
42
+ const sources = new Map(Object.entries(options.modules ?? {}));
43
+ for (const source of sources.values())
44
+ text(source);
45
+ const vm = new fengari.FengariVm(undefined, options.seed ?? 0x6d7767, {
46
+ sandbox: true,
47
+ remove: ['print'],
48
+ limits: { instructions: instructionLimit, totalAllocation: memoryLimit, timeMs: options.timeLimit },
49
+ });
50
+ const L = vm.state;
51
+ let disposed = false;
52
+ let depth = 0;
53
+ const references = new Map();
54
+ const proxies = new Map();
55
+ const coroutines = new Map();
56
+ const bytes = fengari.to_luastring;
57
+ function text(source) {
58
+ if (typeof source !== 'string' || source.startsWith('\x1b'))
59
+ throw new Error('Lua source must be text, not binary bytecode');
60
+ }
61
+ function limitError() {
62
+ return vm.luaError(`Lua ${vm.limitHit} limit exceeded`, '');
63
+ }
64
+ function pushPath(path) {
65
+ pathParts(path);
66
+ vm.pushPath(L, path);
67
+ }
68
+ function guard(action) {
69
+ if (disposed)
70
+ throw new Error('Lua runtime is disposed');
71
+ depth++;
72
+ try {
73
+ return vm.guarded(() => {
74
+ // Indexing a bound table can execute Lua even during a host-side get/set,
75
+ // so every operation runs protected and an error cannot panic the state.
76
+ let result;
77
+ try {
78
+ result = vm.protect(action);
79
+ }
80
+ catch (error) {
81
+ throw vm.limitHit === null ? error : limitError();
82
+ }
83
+ if (vm.limitHit !== null)
84
+ throw limitError();
85
+ return result;
86
+ });
87
+ }
88
+ finally {
89
+ depth--;
90
+ }
91
+ }
92
+ function own(native) {
93
+ const ref = {
94
+ type: native.type,
95
+ dispose() {
96
+ if (!references.delete(ref))
97
+ return;
98
+ native.release();
99
+ for (const [pointer, proxy] of proxies)
100
+ if (proxy === ref)
101
+ proxies.delete(pointer);
102
+ },
103
+ };
104
+ references.set(ref, native);
105
+ return ref;
106
+ }
107
+ function nativeRef(ref) {
108
+ const native = references.get(ref);
109
+ if (!native)
110
+ throw new Error('Lua reference is released or belongs to another runtime');
111
+ return native;
112
+ }
113
+ function toNative(value, seen = new Map(), depth = 0) {
114
+ if (depth > 128)
115
+ throw new RangeError('Lua value is too deeply nested');
116
+ if (value === undefined || value === null)
117
+ return null;
118
+ if (typeof value !== 'object') {
119
+ if (!['boolean', 'number', 'string', 'bigint'].includes(typeof value))
120
+ throw new TypeError('Unsupported Lua value');
121
+ return value;
122
+ }
123
+ if (value instanceof Uint8Array)
124
+ return value;
125
+ if ('dispose' in value && typeof value.dispose === 'function' && 'type' in value)
126
+ return nativeRef(value);
127
+ if (seen.has(value))
128
+ return seen.get(value);
129
+ if (value instanceof Map) {
130
+ const result = new Map();
131
+ seen.set(value, result);
132
+ for (const [key, entry] of value)
133
+ result.set(toNative(key, seen, depth + 1), toNative(entry, seen, depth + 1));
134
+ return result;
135
+ }
136
+ if (!Array.isArray(value) &&
137
+ Object.getPrototypeOf(value) !== Object.prototype &&
138
+ Object.getPrototypeOf(value) !== null)
139
+ throw new TypeError('Unsupported Lua value');
140
+ const result = Array.isArray(value) ? [] : {};
141
+ seen.set(value, result);
142
+ for (const [key, entry] of Object.entries(value))
143
+ Object.defineProperty(result, key, {
144
+ value: toNative(entry, seen, depth + 1),
145
+ writable: true,
146
+ enumerable: true,
147
+ configurable: true,
148
+ });
149
+ return result;
150
+ }
151
+ function read(state, index, seen = new Map(), depth = 0) {
152
+ if (depth > 128)
153
+ throw new RangeError('Lua value is too deeply nested');
154
+ const pointer = lua.lua_topointer(state, index);
155
+ const proxy = proxies.get(pointer);
156
+ if (proxy)
157
+ return proxy;
158
+ if (lua.lua_type(state, index) !== lua.LUA_TTABLE) {
159
+ const value = vm.read(index, 0, state);
160
+ if (value instanceof fengari.Userdata)
161
+ throw new TypeError('Unsupported Lua light userdata');
162
+ return value instanceof fengari.LuaRef ? own(value) : value;
163
+ }
164
+ const previous = seen.get(pointer);
165
+ if (previous)
166
+ return previous;
167
+ lua.lua_checkstack(state, 8);
168
+ const table = lua.lua_absindex(state, index);
169
+ const kind = vm.classifyKeys(state, table);
170
+ let result;
171
+ if (kind === 'array')
172
+ result = [];
173
+ else if (kind === 'map')
174
+ result = new Map();
175
+ else
176
+ result = {};
177
+ seen.set(pointer, result);
178
+ lua.lua_pushnil(state);
179
+ while (lua.lua_next(state, table) !== 0) {
180
+ const entry = read(state, -1, seen, depth + 1);
181
+ if (result instanceof Map)
182
+ result.set(read(state, -2, seen, depth + 1), entry);
183
+ else if (Array.isArray(result))
184
+ result[Number(lua.lua_tointeger(state, -2)) - 1] = entry;
185
+ else {
186
+ const name = String(read(state, -2, seen, depth + 1));
187
+ Object.defineProperty(result, name, {
188
+ value: entry,
189
+ enumerable: true,
190
+ writable: true,
191
+ configurable: true,
192
+ });
193
+ }
194
+ lua.lua_pop(state, 1);
195
+ }
196
+ return result;
197
+ }
198
+ function callStack(args) {
199
+ if (lua.lua_pcall(L, args, 1, 0) !== lua.LUA_OK)
200
+ vm.throwLuaError(L);
201
+ return read(L, -1);
202
+ }
203
+ function pathParts(path) {
204
+ if (!/^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(path))
205
+ throw new Error(`Invalid Lua global path: ${path}`);
206
+ return path.split('.');
207
+ }
208
+ function setPath(path, push) {
209
+ const parts = pathParts(path);
210
+ if (parts.length === 1) {
211
+ push();
212
+ lua.lua_setglobal(L, bytes(path));
213
+ return;
214
+ }
215
+ lua.lua_getglobal(L, bytes(parts[0]));
216
+ if (lua.lua_isnil(L, -1)) {
217
+ lua.lua_pop(L, 1);
218
+ lua.lua_newtable(L);
219
+ lua.lua_pushvalue(L, -1);
220
+ lua.lua_setglobal(L, bytes(parts[0]));
221
+ }
222
+ for (const part of parts.slice(1, -1)) {
223
+ if (!lua.lua_istable(L, -1))
224
+ throw new Error(`Lua global path is not a table: ${path}`);
225
+ lua.lua_getfield(L, -1, bytes(part));
226
+ if (lua.lua_isnil(L, -1)) {
227
+ lua.lua_pop(L, 1);
228
+ lua.lua_newtable(L);
229
+ lua.lua_pushvalue(L, -1);
230
+ lua.lua_setfield(L, -3, bytes(part));
231
+ }
232
+ lua.lua_remove(L, -2);
233
+ }
234
+ if (!lua.lua_istable(L, -1))
235
+ throw new Error(`Lua global path is not a table: ${path}`);
236
+ push();
237
+ lua.lua_setfield(L, -2, bytes(parts.at(-1)));
238
+ }
239
+ function protectedCallback(fn) {
240
+ return (state) => {
241
+ try {
242
+ return fn(state);
243
+ }
244
+ catch (error) {
245
+ lua.lua_pushstring(state, bytes(error instanceof Error ? error.message : String(error)));
246
+ return lua.lua_error(state);
247
+ }
248
+ };
249
+ }
250
+ function callback(fn, mode = 'single') {
251
+ const pushResults = protectedCallback((state) => {
252
+ const args = Array.from({ length: lua.lua_gettop(state) }, (_, index) => read(state, index + 1));
253
+ const result = fn(...args);
254
+ let values;
255
+ if (mode === 'single')
256
+ values = result === undefined ? [] : [result];
257
+ else
258
+ values = result;
259
+ for (const value of values)
260
+ vm.push(toNative(value), state);
261
+ return values.length;
262
+ });
263
+ return (state) => {
264
+ const count = pushResults(state);
265
+ return mode === 'yield' ? lua.lua_yield(state, count) : count;
266
+ };
267
+ }
268
+ function capture(index) {
269
+ const type = lua.lua_type(L, index);
270
+ const name = lua.lua_typename(L, type);
271
+ if (![lua.LUA_TTABLE, lua.LUA_TFUNCTION, lua.LUA_TTHREAD, lua.LUA_TUSERDATA].includes(type))
272
+ throw new Error('Only Lua tables, functions, threads and userdata can be referenced');
273
+ lua.lua_pushvalue(L, index);
274
+ return own(new fengari.LuaRef(vm, lauxlib.luaL_ref(L, lua.LUA_REGISTRYINDEX), fengari.to_jsstring(name)));
275
+ }
276
+ function key(value) {
277
+ if (typeof value !== 'string' && typeof value !== 'number')
278
+ throw new TypeError('Lua binding keys must be strings or numbers');
279
+ return value;
280
+ }
281
+ const runtime = {
282
+ run(source, chunkName = '=game') {
283
+ text(source);
284
+ return guard(() => {
285
+ const buffer = bytes(source);
286
+ const status = lauxlib.luaL_loadbufferx(L, buffer, buffer.length, bytes(chunkName), bytes('t'));
287
+ if (status !== lua.LUA_OK)
288
+ vm.throwLuaError(L);
289
+ return callStack(0);
290
+ });
291
+ },
292
+ call(target, args = []) {
293
+ return guard(() => {
294
+ if (typeof target === 'string')
295
+ pushPath(target);
296
+ else {
297
+ if (target.type !== 'function')
298
+ throw new TypeError('Lua call target must be a function');
299
+ vm.push(nativeRef(target), L);
300
+ }
301
+ for (const value of args)
302
+ vm.push(toNative(value), L);
303
+ return callStack(args.length);
304
+ });
305
+ },
306
+ get(path) {
307
+ return guard(() => {
308
+ pushPath(path);
309
+ return read(L, -1);
310
+ });
311
+ },
312
+ set(path, value) {
313
+ guard(() => setPath(path, () => vm.push(toNative(value), L)));
314
+ },
315
+ reference(path) {
316
+ return guard(() => {
317
+ pushPath(path);
318
+ return capture(-1);
319
+ });
320
+ },
321
+ defineFunction(path, fn) {
322
+ guard(() => setPath(path, () => lua.lua_pushjsfunction(L, callback(fn))));
323
+ },
324
+ defineYieldingFunction(path, fn) {
325
+ guard(() => setPath(path, () => lua.lua_pushjsfunction(L, callback(fn, 'yield'))));
326
+ },
327
+ createTable(binding) {
328
+ return guard(() => {
329
+ lua.lua_newtable(L);
330
+ const pointer = lua.lua_topointer(L, -1);
331
+ lua.lua_newtable(L);
332
+ const methods = {
333
+ __index: (_table, index) => binding.get(key(index)),
334
+ __newindex: (_table, index, value) => {
335
+ if (!binding.set)
336
+ throw new Error('Lua table binding is read-only');
337
+ binding.set(key(index), value);
338
+ },
339
+ };
340
+ if (binding.length)
341
+ methods.__len = () => binding.length();
342
+ for (const [name, fn] of Object.entries(methods)) {
343
+ lua.lua_pushjsfunction(L, callback(fn));
344
+ lua.lua_setfield(L, -2, bytes(name));
345
+ }
346
+ if (binding.keys) {
347
+ lua.lua_pushjsfunction(L, protectedCallback((state) => {
348
+ const keys = [...binding.keys()];
349
+ let index = 0;
350
+ lua.lua_pushjsfunction(state, callback(() => {
351
+ if (index === keys.length)
352
+ return [];
353
+ const next = keys[index++];
354
+ return [next, binding.get(next)];
355
+ }, 'multi'));
356
+ lua.lua_pushnil(state);
357
+ lua.lua_pushnil(state);
358
+ return 3;
359
+ }));
360
+ lua.lua_setfield(L, -2, bytes('__pairs'));
361
+ }
362
+ lua.lua_pushboolean(L, false);
363
+ lua.lua_setfield(L, -2, bytes('__metatable'));
364
+ lua.lua_setmetatable(L, -2);
365
+ const ref = capture(-1);
366
+ proxies.set(pointer, ref);
367
+ return ref;
368
+ });
369
+ },
370
+ coroutine(target) {
371
+ return guard(() => {
372
+ if (typeof target === 'string')
373
+ pushPath(target);
374
+ else
375
+ vm.push(nativeRef(target), L);
376
+ let thread;
377
+ if (lua.lua_isthread(L, -1))
378
+ thread = lua.lua_tothread(L, -1);
379
+ else if (lua.lua_isfunction(L, -1)) {
380
+ thread = lua.lua_newthread(L);
381
+ lua.lua_pop(L, 1);
382
+ lua.lua_xmove(L, thread, 1);
383
+ }
384
+ else
385
+ throw new TypeError('Lua coroutine target must be a function or thread');
386
+ if (coroutines.has(thread))
387
+ throw new Error('Lua coroutine already has a host controller');
388
+ let closed = false;
389
+ let running = false;
390
+ let failure;
391
+ const coroutine = {
392
+ get status() {
393
+ if (closed || disposed)
394
+ return 'dead';
395
+ if (running)
396
+ return 'running';
397
+ const status = lua.lua_status(thread);
398
+ return status === lua.LUA_YIELD || (status === lua.LUA_OK && lua.lua_gettop(thread) > 0)
399
+ ? 'suspended'
400
+ : 'dead';
401
+ },
402
+ resume(args = []) {
403
+ if (closed)
404
+ throw new Error('Lua coroutine is closed');
405
+ if (coroutine.status !== 'suspended')
406
+ throw new Error(`Cannot resume ${coroutine.status} Lua coroutine`);
407
+ return guard(() => {
408
+ for (const value of args)
409
+ vm.push(toNative(value), thread);
410
+ running = true;
411
+ try {
412
+ const result = lua.lua_resume(thread, L, args.length);
413
+ if (result !== lua.LUA_OK && result !== lua.LUA_YIELD) {
414
+ // Keep the error on the thread stack until close(), so pending
415
+ // __close handlers receive it instead of a discarded stack value.
416
+ failure = vm.errorMessage(thread, -1);
417
+ throw vm.luaError(failure, failure);
418
+ }
419
+ const values = Array.from({ length: lua.lua_gettop(thread) }, (_, index) => read(thread, index + 1));
420
+ lua.lua_settop(thread, 0);
421
+ if (result === lua.LUA_OK)
422
+ coroutines.delete(thread);
423
+ return { done: result === lua.LUA_OK, values };
424
+ }
425
+ finally {
426
+ running = false;
427
+ }
428
+ });
429
+ },
430
+ close() {
431
+ if (closed || disposed)
432
+ return;
433
+ if (running)
434
+ throw new Error('Cannot close a running Lua coroutine');
435
+ guard(() => {
436
+ try {
437
+ const result = lua.lua_closethread(thread, L);
438
+ if (result !== lua.LUA_OK) {
439
+ const message = vm.errorMessage(thread, -1);
440
+ if (message !== failure)
441
+ throw vm.luaError(message, message);
442
+ }
443
+ }
444
+ finally {
445
+ closed = true;
446
+ coroutines.delete(thread);
447
+ }
448
+ });
449
+ },
450
+ };
451
+ coroutines.set(thread, coroutine);
452
+ return coroutine;
453
+ });
454
+ },
455
+ dispose() {
456
+ if (disposed)
457
+ return;
458
+ if (depth !== 0)
459
+ throw new Error('Cannot dispose an active Lua runtime');
460
+ let failure;
461
+ try {
462
+ for (const coroutine of coroutines.values()) {
463
+ try {
464
+ coroutine.close();
465
+ }
466
+ catch (error) {
467
+ failure ??= error;
468
+ }
469
+ }
470
+ }
471
+ finally {
472
+ for (const ref of references.keys())
473
+ ref.dispose();
474
+ lua.lua_close(L);
475
+ disposed = true;
476
+ }
477
+ if (failure !== undefined)
478
+ throw failure;
479
+ },
480
+ };
481
+ try {
482
+ runtime.defineFunction('__mwg_source', (name) => {
483
+ if (typeof name !== 'string' || !sources.has(name))
484
+ throw new Error(`Unknown embedded Lua module: ${String(name)}`);
485
+ return sources.get(name);
486
+ });
487
+ runtime.run(`
488
+ local compile, source = load, __mwg_source
489
+ __mwg_source = nil; __random = nil; load = nil
490
+ local cache, loading = {}, {}
491
+ function dofile(name)
492
+ local fn, err = compile(source(name), '@' .. name, 't')
493
+ if not fn then error(err, 2) end
494
+ return fn()
495
+ end
496
+ local execute = dofile
497
+ function require(name)
498
+ if cache[name] ~= nil and cache[name] ~= false then return cache[name] end
499
+ if loading[name] then error('Cyclic embedded Lua module: ' .. name, 2) end
500
+ local cleanup <close> = setmetatable({}, { __close = function() loading[name] = nil end })
501
+ loading[name] = true
502
+ local ok, result = pcall(execute, name)
503
+ loading[name] = nil
504
+ if not ok then error(result, 2) end
505
+ if result == nil then result = true end
506
+ cache[name] = result
507
+ return result
508
+ end
509
+ math.randomseed = function() end
510
+ getmetatable('').__metatable = false
511
+ `, '=mwg-runtime');
512
+ runtime.defineFunction('math.random', (...args) => {
513
+ if (args.length === 0)
514
+ return vm.nextRandom();
515
+ const lower = args.length === 1 ? 1 : args[0];
516
+ const upper = args.length === 1 ? args[0] : args[1];
517
+ if (args.length > 2 ||
518
+ typeof lower !== 'number' ||
519
+ typeof upper !== 'number' ||
520
+ !Number.isSafeInteger(lower) ||
521
+ !Number.isSafeInteger(upper) ||
522
+ upper < lower ||
523
+ !Number.isSafeInteger(upper - lower + 1))
524
+ throw new RangeError('math.random interval must contain safe integers');
525
+ return lower + Math.floor(vm.nextRandom() * (upper - lower + 1));
526
+ });
527
+ return runtime;
528
+ }
529
+ catch (error) {
530
+ runtime.dispose();
531
+ throw error;
532
+ }
533
+ }
534
+ //# sourceMappingURL=fengari-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fengari-runtime.js","sourceRoot":"","sources":["../../src/mwl/fengari-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,22 @@
1
+ import type { LuaToJsOptions, LuaToJsResult } from '@datamoc/fengari';
1
2
  import type { ScriptHost } from './scripts.ts';
3
+ export { createFengariRuntime } from './fengari-runtime.ts';
4
+ export type { FengariValue, FengariReference, FengariCoroutine, FengariTableBinding, FengariRuntimeOptions, FengariRuntime, } from './fengari-runtime.ts';
5
+ export type { LuaToJsOptions, LuaToJsResult };
6
+ /**
7
+ * Translates Lua source to readable JavaScript without running it, for a game that
8
+ * is leaving Lua scripting behind. Metatables, coroutines, general `goto` and some
9
+ * patterns are not translated: they stay as `TODO(lua2js)` comments and `warnings`.
10
+ * Throws a `LuaSyntaxError` for source that does not parse.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { luaToJs } from '@datamoc/mw_games/mwl/fengari';
15
+ *
16
+ * const { code } = luaToJs('function double(n) return n * 2 end', { format: 'esm' });
17
+ * ```
18
+ */
19
+ export declare function luaToJs(source: string, options?: LuaToJsOptions): LuaToJsResult;
2
20
  export interface FengariScriptHostOptions {
3
21
  readonly instructionLimit?: number;
4
22
  /** bytes of string and buffer data one call may allocate; defaults to 32 MB */
@@ -1 +1 @@
1
- {"version":3,"file":"fengari.d.ts","sourceRoot":"","sources":["../../src/mwl/fengari.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA6B,UAAU,EAAe,MAAM,cAAc,CAAC;AAEvF,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAaD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,UAAU,CAqK1F"}
1
+ {"version":3,"file":"fengari.d.ts","sourceRoot":"","sources":["../../src/mwl/fengari.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,KAAK,EAA6B,UAAU,EAAe,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EACX,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,GACd,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAEnF;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,UAAU,CAuJ1F"}