@debuffjp/core 0.9.0 → 0.9.1

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,426 @@
1
+ import { toRGBA } from "./color.js";
2
+ import { debuffSans } from "./debuff-sans.js";
3
+ const NO_OPTIONS = Object.freeze({});
4
+ const WHITE = 0xffffffff;
5
+ /**
6
+ * Immediate-mode drawing in logical units, the same API on WebGL2 and Canvas 2D (ADR 0007).
7
+ * Everything batches automatically; call order is draw order.
8
+ */
9
+ export class Draw {
10
+ backend;
11
+ smooth;
12
+ /** Global alpha multiplier for subsequent draws. */
13
+ alpha = 1;
14
+ /** Quads (sprites, rects, glyph runs…) submitted this frame. Reset each frame; for diagnostics. */
15
+ quads = 0;
16
+ /** Preallocated transform stack: push/pop copy six numbers and never allocate. */
17
+ stack = [];
18
+ depth = 0;
19
+ m = [1, 0, 0, 1, 0, 0];
20
+ frames = new WeakMap();
21
+ clips = [];
22
+ tmp = [1, 0, 0, 1, 0, 0];
23
+ textCache = new TextCache();
24
+ circleTexture;
25
+ backingW = 0;
26
+ backingH = 0;
27
+ /** @internal */
28
+ constructor(backend,
29
+ /** Default filtering for images (false for pixel art). */
30
+ smooth) {
31
+ this.backend = backend;
32
+ this.smooth = smooth;
33
+ }
34
+ /** Which backend is active. */
35
+ get kind() {
36
+ return this.backend.kind;
37
+ }
38
+ /** Draw calls this frame: batched GPU calls on WebGL2, one per quad on Canvas 2D. */
39
+ get drawCalls() {
40
+ return this.backend.drawCalls ?? this.quads;
41
+ }
42
+ /** Raw `WebGL2RenderingContext` or `CanvasRenderingContext2D`. Mixing raw calls with `draw` calls requires care. */
43
+ get raw() {
44
+ return this.backend.raw;
45
+ }
46
+ // ---- transform stack -------------------------------------------------------------------
47
+ push() {
48
+ let slot = this.stack[this.depth];
49
+ if (!slot) {
50
+ slot = [1, 0, 0, 1, 0, 0];
51
+ this.stack[this.depth] = slot;
52
+ }
53
+ copy(this.m, slot);
54
+ this.depth++;
55
+ }
56
+ pop() {
57
+ if (this.depth === 0)
58
+ throw new Error("draw.pop() without a matching push()");
59
+ this.depth--;
60
+ copy(this.stack[this.depth], this.m);
61
+ }
62
+ translate(x, y) {
63
+ const m = this.m;
64
+ m[4] += m[0] * x + m[2] * y;
65
+ m[5] += m[1] * x + m[3] * y;
66
+ }
67
+ scale(x, y = x) {
68
+ const m = this.m;
69
+ m[0] *= x;
70
+ m[1] *= x;
71
+ m[2] *= y;
72
+ m[3] *= y;
73
+ }
74
+ rotate(radians) {
75
+ const c = Math.cos(radians);
76
+ const s = Math.sin(radians);
77
+ const [a, b, cc, d] = this.m;
78
+ this.m[0] = a * c + cc * s;
79
+ this.m[1] = b * c + d * s;
80
+ this.m[2] = cc * c - a * s;
81
+ this.m[3] = d * c - b * s;
82
+ }
83
+ /**
84
+ * Run `fn` with drawing restricted to a rectangle (in current units), then restore. Nested clips
85
+ * intersect. Clips are axis-aligned on screen: under rotation the rectangle's screen bounds are used.
86
+ */
87
+ clip(x, y, w, h, fn) {
88
+ const m = this.m;
89
+ const s = this.renderScale;
90
+ let x0 = Number.POSITIVE_INFINITY;
91
+ let y0 = Number.POSITIVE_INFINITY;
92
+ let x1 = Number.NEGATIVE_INFINITY;
93
+ let y1 = Number.NEGATIVE_INFINITY;
94
+ for (const [px, py] of [
95
+ [x, y],
96
+ [x + w, y],
97
+ [x, y + h],
98
+ [x + w, y + h],
99
+ ]) {
100
+ const sx = (m[0] * px + m[2] * py + m[4]) * s;
101
+ const sy = (m[1] * px + m[3] * py + m[5]) * s;
102
+ x0 = Math.min(x0, sx);
103
+ y0 = Math.min(y0, sy);
104
+ x1 = Math.max(x1, sx);
105
+ y1 = Math.max(y1, sy);
106
+ }
107
+ let rect = {
108
+ x: Math.round(x0),
109
+ y: Math.round(y0),
110
+ w: Math.max(0, Math.round(x1) - Math.round(x0)),
111
+ h: Math.max(0, Math.round(y1) - Math.round(y0)),
112
+ };
113
+ const outer = this.clips.at(-1);
114
+ if (outer)
115
+ rect = intersect(rect, outer);
116
+ this.clips.push(rect);
117
+ this.backend.setClip(rect);
118
+ try {
119
+ fn();
120
+ }
121
+ finally {
122
+ this.clips.pop();
123
+ this.backend.setClip(this.clips.at(-1) ?? null);
124
+ }
125
+ }
126
+ /** Run `fn` with the camera's view applied, then restore. */
127
+ withCamera(camera, fn) {
128
+ this.push();
129
+ const [a, b, c, d, e, f] = camera.view();
130
+ const m = this.m;
131
+ const [ma, mb, mc, md, me, mf] = m;
132
+ m[0] = ma * a + mc * b;
133
+ m[1] = mb * a + md * b;
134
+ m[2] = ma * c + mc * d;
135
+ m[3] = mb * c + md * d;
136
+ m[4] = ma * e + mc * f + me;
137
+ m[5] = mb * e + md * f + mf;
138
+ try {
139
+ fn();
140
+ }
141
+ finally {
142
+ this.pop();
143
+ }
144
+ }
145
+ // ---- drawing ---------------------------------------------------------------------------
146
+ blend(mode) {
147
+ this.backend.setBlend(mode);
148
+ }
149
+ rect(x, y, w, h, color) {
150
+ this.local(x, y, w, h);
151
+ this.quads++;
152
+ this.backend.quad(this.tmp, null, 0, 0, 1, 1, this.withAlpha(toRGBA(color), 1), 0, false);
153
+ }
154
+ /** Filled circle (antialiased). */
155
+ circle(x, y, radius, color) {
156
+ this.local(x - radius, y - radius, radius * 2, radius * 2);
157
+ const tex = this.circle64();
158
+ this.quads++;
159
+ this.backend.quad(this.tmp, tex, 0, 0, 64, 64, this.withAlpha(toRGBA(color), 1), 0, true);
160
+ }
161
+ line(x1, y1, x2, y2, width, color) {
162
+ const dx = x2 - x1;
163
+ const dy = y2 - y1;
164
+ const len = Math.hypot(dx, dy);
165
+ if (len === 0)
166
+ return;
167
+ this.push();
168
+ this.translate(x1, y1);
169
+ this.rotate(Math.atan2(dy, dx));
170
+ this.rect(0, -width / 2, len, width, color);
171
+ this.pop();
172
+ }
173
+ /** Draw an image frame (or a whole image) at `x, y`, anchored by `origin`. Allocation-free hot path. */
174
+ sprite(frame, x, y, o = NO_OPTIONS) {
175
+ const f = "image" in frame ? frame : this.wholeImage(frame);
176
+ const origin = o.origin;
177
+ const ox = -(origin ? origin[0] : 0.5) * f.w;
178
+ const oy = -(origin ? origin[1] : 0.5) * f.h;
179
+ const sx = (o.scaleX ?? 1) * (o.flipX ? -1 : 1);
180
+ const sy = (o.scaleY ?? 1) * (o.flipY ? -1 : 1);
181
+ // tmp = M · T(x, y) · R(rotation) · S(sx, sy) · T(ox, oy) · S(w, h), expanded by hand.
182
+ const m = this.m;
183
+ let a = sx;
184
+ let b = 0;
185
+ let c = 0;
186
+ let d = sy;
187
+ const r = o.rotation;
188
+ if (r) {
189
+ const cos = Math.cos(r);
190
+ const sin = Math.sin(r);
191
+ a = cos * sx;
192
+ b = sin * sx;
193
+ c = -sin * sy;
194
+ d = cos * sy;
195
+ }
196
+ const lx = a * ox + c * oy + x;
197
+ const ly = b * ox + d * oy + y;
198
+ const t = this.tmp;
199
+ t[0] = (m[0] * a + m[2] * b) * f.w;
200
+ t[1] = (m[1] * a + m[3] * b) * f.w;
201
+ t[2] = (m[0] * c + m[2] * d) * f.h;
202
+ t[3] = (m[1] * c + m[3] * d) * f.h;
203
+ t[4] = m[0] * lx + m[2] * ly + m[4];
204
+ t[5] = m[1] * lx + m[3] * ly + m[5];
205
+ const smooth = o.smooth ?? this.smooth;
206
+ if (!smooth && t[1] === 0 && t[2] === 0) {
207
+ // Pixel art: put unrotated sprites on whole pixels. Nearest sampling at fractional positions
208
+ // makes edges gain and lose a pixel from frame to frame, which reads as flicker.
209
+ t[4] = Math.round(t[4]);
210
+ t[5] = Math.round(t[5]);
211
+ }
212
+ const tint = o.tint === undefined ? WHITE : toRGBA(o.tint);
213
+ const alpha = o.alpha ?? 1;
214
+ const color = alpha === 1 && this.alpha === 1 ? tint : this.withAlpha(tint, alpha);
215
+ this.quads++;
216
+ this.backend.quad(t, f.image, f.x, f.y, f.w, f.h, color, o.flash ?? 0, smooth);
217
+ }
218
+ /** Text, rasterised once and cached as a texture (crisp at the current render scale). */
219
+ text(text, x, y, o = {}) {
220
+ if (!text)
221
+ return;
222
+ if (typeof o.font !== "string") {
223
+ this.bitmapText(text, x, y, o.font ?? debuffSans(), o);
224
+ return;
225
+ }
226
+ const entry = this.textCache.get(text, o.font, this.renderScale, (src) => this.backend.invalidate(src));
227
+ const ax = o.align === "center" ? 0.5 : o.align === "right" ? 1 : 0;
228
+ const ay = o.baseline === "middle" ? 0.5 : o.baseline === "bottom" ? 1 : 0;
229
+ this.local(x - ax * entry.w, y - ay * entry.h, entry.w, entry.h);
230
+ const color = this.withAlpha(toRGBA(o.color ?? "#ffffff"), o.alpha ?? 1);
231
+ this.quads++;
232
+ this.backend.quad(this.tmp, entry.canvas, 0, 0, entry.canvas.width, entry.canvas.height, color, 0, true);
233
+ }
234
+ /**
235
+ * The logical box `text()` fills for this string and font, so layouts can align and centre without
236
+ * guessing. Same cache as `text()`, so measuring then drawing rasterises once.
237
+ */
238
+ measure(text, font = debuffSans()) {
239
+ if (!text)
240
+ return { w: 0, h: 0 };
241
+ if (typeof font !== "string")
242
+ return font.measure(text);
243
+ const entry = this.textCache.get(text, font, this.renderScale, (src) => this.backend.invalidate(src));
244
+ return { w: entry.w, h: entry.h };
245
+ }
246
+ bitmapText(text, x, y, font, o) {
247
+ const size = font.measure(text);
248
+ const ay = o.baseline === "middle" ? 0.5 : o.baseline === "bottom" ? 1 : 0;
249
+ const color = this.withAlpha(toRGBA(o.color ?? "#ffffff"), o.alpha ?? 1);
250
+ // Whole-pixel origin: a glyph straddling a pixel boundary would blur or drop a column.
251
+ let ly = Math.round(y - ay * size.h);
252
+ for (const line of text.split("\n")) {
253
+ const w = font.lineWidth(line);
254
+ let lx = Math.round(x - (o.align === "center" ? Math.floor(w / 2) : o.align === "right" ? w : 0));
255
+ for (const ch of line) {
256
+ const g = font.glyph(ch);
257
+ if (!g)
258
+ continue;
259
+ const f = g.frame;
260
+ this.local(lx, ly, f.w, f.h);
261
+ this.quads++;
262
+ this.backend.quad(this.tmp, f.image, f.x, f.y, f.w, f.h, color, 0, false);
263
+ lx += g.advance + font.spacing;
264
+ }
265
+ ly += font.lineHeight;
266
+ }
267
+ }
268
+ /** Re-upload a source whose pixels changed (e.g. a canvas you draw into). */
269
+ invalidate(src) {
270
+ this.backend.invalidate(src);
271
+ }
272
+ // ---- frame lifecycle (called by Game) ----------------------------------------------------
273
+ /** @internal */
274
+ renderScale = 1;
275
+ /** @internal */
276
+ begin(clear, width, height, scale) {
277
+ this.renderScale = scale;
278
+ this.quads = 0;
279
+ this.depth = 0;
280
+ this.clips.length = 0;
281
+ copy(IDENTITY, this.m);
282
+ this.alpha = 1;
283
+ this.backend.setBlend("normal");
284
+ this.backend.begin(toRGBA(clear), width, height, scale);
285
+ }
286
+ /** @internal Reset transform and blend between scene and afterRender hooks. */
287
+ reset() {
288
+ this.depth = 0;
289
+ if (this.clips.length) {
290
+ this.clips.length = 0;
291
+ this.backend.setClip(null);
292
+ }
293
+ copy(IDENTITY, this.m);
294
+ this.alpha = 1;
295
+ this.backend.setBlend("normal");
296
+ }
297
+ /** @internal */
298
+ end() {
299
+ this.backend.end();
300
+ }
301
+ /** @internal Release GPU resources and listeners. */
302
+ dispose() {
303
+ this.backend.dispose();
304
+ }
305
+ /** @internal */
306
+ resize(w, h) {
307
+ this.backingW = w;
308
+ this.backingH = h;
309
+ this.backend.resize(w, h);
310
+ }
311
+ /** @internal Switch to a backend that finished loading (the Canvas 2D fallback), at the current size. */
312
+ setBackend(backend) {
313
+ this.backend.dispose();
314
+ this.backend = backend;
315
+ if (this.backingW)
316
+ backend.resize(this.backingW, this.backingH);
317
+ }
318
+ // ---- internals ---------------------------------------------------------------------------
319
+ /** tmp = current matrix × (translate(x, y) · scale(w, h)): maps the unit square to the rect. */
320
+ local(x, y, w, h) {
321
+ const m = this.m;
322
+ const t = this.tmp;
323
+ t[0] = m[0] * w;
324
+ t[1] = m[1] * w;
325
+ t[2] = m[2] * h;
326
+ t[3] = m[3] * h;
327
+ t[4] = m[0] * x + m[2] * y + m[4];
328
+ t[5] = m[1] * x + m[3] * y + m[5];
329
+ }
330
+ wholeImage(image) {
331
+ let f = this.frames.get(image);
332
+ if (!f) {
333
+ f = wholeImage(image);
334
+ this.frames.set(image, f);
335
+ }
336
+ return f;
337
+ }
338
+ withAlpha(rgba, alpha) {
339
+ const a = Math.round((rgba & 0xff) * alpha * this.alpha);
340
+ return ((rgba & 0xffffff00) | Math.max(0, Math.min(255, a))) >>> 0;
341
+ }
342
+ circle64() {
343
+ if (!this.circleTexture) {
344
+ const c = makeCanvas(64, 64);
345
+ const ctx = c.getContext("2d");
346
+ if (ctx) {
347
+ ctx.fillStyle = "#fff";
348
+ ctx.beginPath();
349
+ ctx.arc(32, 32, 31.5, 0, Math.PI * 2);
350
+ ctx.fill();
351
+ }
352
+ this.circleTexture = c;
353
+ }
354
+ return this.circleTexture;
355
+ }
356
+ }
357
+ const IDENTITY = [1, 0, 0, 1, 0, 0];
358
+ function intersect(a, b) {
359
+ const x = Math.max(a.x, b.x);
360
+ const y = Math.max(a.y, b.y);
361
+ return { x, y, w: Math.max(0, Math.min(a.x + a.w, b.x + b.w) - x), h: Math.max(0, Math.min(a.y + a.h, b.y + b.h) - y) };
362
+ }
363
+ function copy(from, to) {
364
+ to[0] = from[0];
365
+ to[1] = from[1];
366
+ to[2] = from[2];
367
+ to[3] = from[3];
368
+ to[4] = from[4];
369
+ to[5] = from[5];
370
+ }
371
+ function wholeImage(image) {
372
+ const w = "naturalWidth" in image ? image.naturalWidth : image.width;
373
+ const h = "naturalHeight" in image ? image.naturalHeight : image.height;
374
+ return { image, x: 0, y: 0, w, h };
375
+ }
376
+ function makeCanvas(w, h) {
377
+ if (typeof OffscreenCanvas !== "undefined")
378
+ return new OffscreenCanvas(w, h);
379
+ const c = document.createElement("canvas");
380
+ c.width = w;
381
+ c.height = h;
382
+ return c;
383
+ }
384
+ /** LRU cache of rasterised text (white; tinted at draw time). */
385
+ class TextCache {
386
+ entries = new Map();
387
+ clock = 0;
388
+ get(text, font, scale, evict) {
389
+ const key = `${scale}|${font}|${text}`;
390
+ const hit = this.entries.get(key);
391
+ if (hit) {
392
+ hit.used = ++this.clock;
393
+ return hit;
394
+ }
395
+ const measureCtx = makeCanvas(1, 1).getContext("2d");
396
+ if (!measureCtx)
397
+ throw new Error("draw.text needs a 2D canvas for rasterising text");
398
+ measureCtx.font = font;
399
+ const metrics = measureCtx.measureText(text);
400
+ const ascent = metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent;
401
+ const descent = metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent;
402
+ const w = Math.ceil(metrics.width) + 2;
403
+ const h = Math.ceil(ascent + descent) + 2;
404
+ const canvas = makeCanvas(Math.ceil(w * scale), Math.ceil(h * scale));
405
+ const ctx = canvas.getContext("2d");
406
+ if (ctx) {
407
+ ctx.scale(scale, scale);
408
+ ctx.font = font;
409
+ ctx.fillStyle = "#fff";
410
+ ctx.textBaseline = "alphabetic";
411
+ ctx.fillText(text, 1, 1 + ascent);
412
+ }
413
+ const entry = { canvas, w, h, used: ++this.clock };
414
+ this.entries.set(key, entry);
415
+ if (this.entries.size > 256) {
416
+ // Evict the least recently used quarter.
417
+ const old = [...this.entries].sort((a, b) => a[1].used - b[1].used).slice(0, 64);
418
+ for (const [k, e] of old) {
419
+ this.entries.delete(k);
420
+ evict(e.canvas);
421
+ }
422
+ }
423
+ return entry;
424
+ }
425
+ }
426
+ //# sourceMappingURL=draw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw.js","sourceRoot":"","sources":["../../src/render/draw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Backend, BlendMode, ClipRect, Matrix, RawContext, TextureSource } from "./backend.js";
2
+ /** Instanced, multi-texture WebGL2 sprite batcher behind the `draw` API. */
3
+ export declare class WebGL2Backend implements Backend {
4
+ readonly kind: "webgl2";
5
+ readonly raw: RawContext;
6
+ private readonly gl;
7
+ private readonly capacity;
8
+ private readonly data;
9
+ private readonly f32;
10
+ private readonly u32;
11
+ private instanceBuffer;
12
+ private viewLoc;
13
+ private readonly textures;
14
+ private white;
15
+ /** True between webglcontextlost and webglcontextrestored: drawing is skipped. */
16
+ private lost;
17
+ private readonly onLost;
18
+ private readonly onRestored;
19
+ private readonly units;
20
+ private unitCount;
21
+ private lastSrc;
22
+ private last;
23
+ private count;
24
+ private blend;
25
+ private submitted;
26
+ /** Draw calls this frame, counting the batch still pending (read before `end()` flushes it). */
27
+ get drawCalls(): number;
28
+ constructor(gl: WebGL2RenderingContext);
29
+ /** True while the GPU context is lost (e.g. a mobile tab was backgrounded or the driver reset). */
30
+ get contextLost(): boolean;
31
+ /** Create program, buffers and the white texture. Runs at start and after a context restore. */
32
+ private setup;
33
+ begin(clear: number, width: number, height: number): void;
34
+ quad(m: Matrix, src: TextureSource | null, sx: number, sy: number, sw: number, sh: number, color: number, flash: number, smooth: boolean): void;
35
+ setBlend(mode: BlendMode): void;
36
+ setClip(rect: ClipRect | null): void;
37
+ end(): void;
38
+ resize(): void;
39
+ invalidate(src: TextureSource): void;
40
+ dispose(): void;
41
+ private flush;
42
+ private texture;
43
+ private filter;
44
+ private applyBlend;
45
+ }
46
+ //# sourceMappingURL=webgl2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2.d.ts","sourceRoot":"","sources":["../../src/render/webgl2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAyDpG,4EAA4E;AAC5E,qBAAa,aAAc,YAAW,OAAO;IAC3C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2C;IAChE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAElD,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,KAAK,CAAiB;IAC9B,kFAAkF;IAClF,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAIrB;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CASzB;IACF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAK;IAEtB,gGAAgG;IAChG,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,YAAY,EAAE,EAAE,sBAAsB,EAMrC;IAED,mGAAmG;IACnG,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,gGAAgG;IAChG,OAAO,CAAC,KAAK;IA4Cb,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQxD;IAED,IAAI,CACF,CAAC,EAAE,MAAM,EACT,GAAG,EAAE,aAAa,GAAG,IAAI,EACzB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,GACd,IAAI,CAsCN;IAED,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAK9B;IAED,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAWnC;IAED,GAAG,IAAI,IAAI,CAGV;IAED,MAAM,IAAI,IAAI,CAEb;IAED,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAOnC;IAED,OAAO,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,KAAK;IAuBb,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,UAAU;CAKnB"}