@ranjeet_/digital-pet 0.2.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/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Digital Pet contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
package/README.md ADDED
@@ -0,0 +1,283 @@
1
+ # Digital Pet for the Web
2
+
3
+ `@ranjeet_/digital-pet` is a framework-neutral Web Component that adds an
4
+ animated companion to any website. The default pet is Shiro, a golden retriever,
5
+ but the displayed name is customizable.
6
+
7
+ ## Features
8
+
9
+ - Switchable 2D illustrated and 3D WebGL views
10
+ - Golden-retriever coat, feathering, flexible tail, balls, and fetch animation
11
+ - Sit, walk, run, jump, down, sleep, roll over, handshake, hi-five, salute,
12
+ namaste, speak, quiet, fetch, feed, treat, and surprise commands
13
+ - Optional barking sound with volume controls
14
+ - Cursor awareness, drag interaction, autonomous behavior, and corner naps
15
+ - Small, normal, large, and extra-large sizes saved in `localStorage`
16
+ - Accessible controls, Shadow DOM style isolation, reduced motion, and print handling
17
+ - Works with plain HTML, React, Next.js, Vue, Nuxt, Angular, Svelte, SvelteKit,
18
+ Astro, and other frameworks that support Custom Elements
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm install @ranjeet_/digital-pet
24
+ ```
25
+
26
+ Import the package once in browser code:
27
+
28
+ ```js
29
+ import "@ranjeet_/digital-pet";
30
+ ```
31
+
32
+ Then render the custom element:
33
+
34
+ ```html
35
+ <digital-pet
36
+ name="Shiro"
37
+ size="normal"
38
+ renderer="3d"
39
+ controls="true"
40
+ sound="false"
41
+ ></digital-pet>
42
+ ```
43
+
44
+ ## Direct Script
45
+
46
+ Use the hosted ES module without a package manager:
47
+
48
+ ```html
49
+ <script
50
+ type="module"
51
+ src="https://ranjeet447.github.io/digital-pet/downloads/digital-pet-v0.2.0.js"
52
+ ></script>
53
+
54
+ <digital-pet renderer="3d" controls="true"></digital-pet>
55
+ ```
56
+
57
+ Use the versioned URL in production so a later release cannot change behavior
58
+ without an intentional update. `digital-pet.js` is also published as a moving
59
+ alias for demos and users who explicitly want the latest version.
60
+
61
+ ## Frameworks
62
+
63
+ ### React and Next.js
64
+
65
+ Load Digital Pet in a client component because it uses browser APIs:
66
+
67
+ ```tsx
68
+ "use client";
69
+
70
+ import { createElement, useEffect } from "react";
71
+
72
+ export function DigitalPet() {
73
+ useEffect(() => {
74
+ void import("@ranjeet_/digital-pet");
75
+ }, []);
76
+
77
+ return createElement("digital-pet", {
78
+ name: "Shiro",
79
+ renderer: "3d",
80
+ controls: "true",
81
+ sound: "false",
82
+ });
83
+ }
84
+ ```
85
+
86
+ Render this component once in the root layout. `createElement` avoids requiring
87
+ custom JSX type declarations.
88
+
89
+ ### Vue
90
+
91
+ ```vue
92
+ <script setup>
93
+ import "@ranjeet_/digital-pet";
94
+ </script>
95
+
96
+ <template>
97
+ <digital-pet renderer="3d" controls="true" />
98
+ </template>
99
+ ```
100
+
101
+ If Vue reports an unresolved component warning, configure the compiler:
102
+
103
+ ```js
104
+ // vite.config.js
105
+ vue({
106
+ template: {
107
+ compilerOptions: {
108
+ isCustomElement: (tag) => tag === "digital-pet",
109
+ },
110
+ },
111
+ });
112
+ ```
113
+
114
+ ### Nuxt
115
+
116
+ Create `plugins/digital-pet.client.ts`:
117
+
118
+ ```ts
119
+ import "@ranjeet_/digital-pet";
120
+
121
+ export default defineNuxtPlugin(() => {});
122
+ ```
123
+
124
+ Add the Vue custom-element configuration in `nuxt.config.ts`:
125
+
126
+ ```ts
127
+ export default defineNuxtConfig({
128
+ vue: {
129
+ compilerOptions: {
130
+ isCustomElement: (tag) => tag === "digital-pet",
131
+ },
132
+ },
133
+ });
134
+ ```
135
+
136
+ ### Angular
137
+
138
+ Import the package in `main.ts`:
139
+
140
+ ```ts
141
+ import "@ranjeet_/digital-pet";
142
+ ```
143
+
144
+ Allow the Custom Element in the component:
145
+
146
+ ```ts
147
+ import { Component, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
148
+
149
+ @Component({
150
+ selector: "app-root",
151
+ standalone: true,
152
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
153
+ template: `<digital-pet renderer="3d" controls="true"></digital-pet>`,
154
+ })
155
+ export class AppComponent {}
156
+ ```
157
+
158
+ ### Svelte
159
+
160
+ ```svelte
161
+ <script>
162
+ import { onMount } from "svelte";
163
+
164
+ onMount(() => import("@ranjeet_/digital-pet"));
165
+ </script>
166
+
167
+ <digital-pet renderer="3d" controls="true"></digital-pet>
168
+ ```
169
+
170
+ ### SvelteKit
171
+
172
+ Use the same component and import it inside `onMount`, or disable SSR for the
173
+ small wrapper component that renders `<digital-pet>`.
174
+
175
+ ### Astro
176
+
177
+ ```astro
178
+ <digital-pet renderer="3d" controls="true"></digital-pet>
179
+
180
+ <script>
181
+ import "@ranjeet_/digital-pet";
182
+ </script>
183
+ ```
184
+
185
+ The Custom Element upgrades in the browser; no framework hydration directive is
186
+ required.
187
+
188
+ ## JavaScript API
189
+
190
+ ```js
191
+ import { mountDigitalPet } from "@ranjeet_/digital-pet";
192
+
193
+ const shiro = mountDigitalPet({
194
+ name: "Shiro",
195
+ size: "normal",
196
+ renderer: "3d",
197
+ controls: true,
198
+ cursorInteraction: true,
199
+ sound: false,
200
+ volume: 0.65,
201
+ startCorner: "bottom-right",
202
+ });
203
+
204
+ shiro.command("sit");
205
+ shiro.command("fetch");
206
+ shiro.command("feed");
207
+ shiro.command("treat");
208
+ shiro.command("sleep");
209
+ shiro.setSize("large");
210
+ shiro.setRenderer("2d");
211
+ shiro.bringToPointer();
212
+ shiro.bringTo(500, 600);
213
+ shiro.hide();
214
+ shiro.show();
215
+ ```
216
+
217
+ Commands:
218
+
219
+ ```text
220
+ sit, walk, run, jump, down, sleep, roll-over, handshake, hi-five,
221
+ salute, namaste, speak, quiet, fetch, feed, treat, surprise
222
+ ```
223
+
224
+ Attributes:
225
+
226
+ | Attribute | Values | Default |
227
+ | --- | --- | --- |
228
+ | `name` | any non-empty name | `Shiro` |
229
+ | `size` | `small`, `normal`, `large`, `extra-large` | saved value or `normal` |
230
+ | `remember-size` | `true`, `false` | `true` |
231
+ | `controls` | `true`, `false` | `true` |
232
+ | `renderer` | `2d`, `3d`, `auto` | `auto` |
233
+ | `sound` | `true`, `false` | `false` |
234
+ | `volume` | number from `0` to `1` | `0.65` |
235
+ | `cursor-interaction` | `true`, `false` | `true` |
236
+ | `start-corner` | `bottom-left`, `bottom-right` | `bottom-right` |
237
+ | `z-index` | any valid integer | `2147483000` |
238
+
239
+ Events:
240
+
241
+ ```js
242
+ shiro.addEventListener("digital-pet-command", (event) => {
243
+ console.log(event.detail.command);
244
+ });
245
+
246
+ shiro.addEventListener("digital-pet-size-change", (event) => {
247
+ console.log(event.detail.size);
248
+ });
249
+
250
+ shiro.addEventListener("digital-pet-renderer-change", (event) => {
251
+ console.log(event.detail.renderer);
252
+ });
253
+
254
+ shiro.addEventListener("digital-pet-care", (event) => {
255
+ console.log(event.detail.action, event.detail.hunger);
256
+ });
257
+
258
+ shiro.addEventListener("digital-pet-name-change", (event) => {
259
+ console.log(event.detail.name);
260
+ });
261
+
262
+ shiro.addEventListener("digital-pet-visibility-change", (event) => {
263
+ console.log(event.detail.visible);
264
+ });
265
+ ```
266
+
267
+ ## Development
268
+
269
+ ```bash
270
+ npm install
271
+ npm run check
272
+ npm run build
273
+ python3 -m http.server 4173 -d .
274
+ ```
275
+
276
+ Open `http://localhost:4173/demo/`.
277
+
278
+ ## Publishing
279
+
280
+ 1. Update the version in `package.json`.
281
+ 2. Run `npm run check`, `npm run build`, and `npm pack --dry-run`.
282
+ 3. Authenticate with npm.
283
+ 4. Run `npm publish --access public`.
@@ -0,0 +1,10 @@
1
+ # Sound Asset
2
+
3
+ `bark-cute.mp3` is used for optional Digital Pet bark effects.
4
+
5
+ - Source: [Barking Dog Cute Sound](https://pixabay.com/sound-effects/nature-barking-dog-cute-sound-463192/)
6
+ - Provider: Pixabay
7
+ - License: [Pixabay Content License](https://pixabay.com/service/license-summary/)
8
+
9
+ The application keeps sounds disabled by default. Users must enable them through
10
+ the pet controls or the `sound="true"` attribute.
Binary file
@@ -0,0 +1,150 @@
1
+ export declare const DIGITAL_PET_COMMANDS: readonly ["sit", "walk", "run", "jump", "down", "sleep", "roll-over", "handshake", "hi-five", "salute", "namaste", "speak", "quiet", "fetch", "feed", "treat", "surprise"];
2
+ export declare const DIGITAL_PET_SIZES: readonly ["small", "normal", "large", "extra-large"];
3
+ export declare const DIGITAL_PET_RENDERERS: readonly ["2d", "3d"];
4
+ export type DigitalPetCommand = (typeof DIGITAL_PET_COMMANDS)[number];
5
+ export type DigitalPetSize = (typeof DIGITAL_PET_SIZES)[number];
6
+ export type DigitalPetRenderer = (typeof DIGITAL_PET_RENDERERS)[number];
7
+ export interface DigitalPetOptions {
8
+ name?: string;
9
+ controls?: boolean;
10
+ cursorInteraction?: boolean;
11
+ sound?: boolean;
12
+ volume?: number;
13
+ renderer?: "auto" | DigitalPetRenderer;
14
+ size?: DigitalPetSize;
15
+ zIndex?: number;
16
+ startCorner?: "bottom-left" | "bottom-right";
17
+ }
18
+ export declare class DigitalPetElement extends HTMLElement {
19
+ static readonly tagName = "digital-pet";
20
+ static get observedAttributes(): string[];
21
+ private canvas;
22
+ private readonly fallbackCanvas;
23
+ private readonly webglCanvas;
24
+ private readonly context;
25
+ private readonly launcher;
26
+ private readonly panel;
27
+ private readonly commandsContainer;
28
+ private readonly sizesContainer;
29
+ private readonly reducedMotion;
30
+ private readonly barkAudio;
31
+ private threeRenderer;
32
+ private animationFrame;
33
+ private lastFrame;
34
+ private nextDecisionAt;
35
+ private behaviorStartedAt;
36
+ private behaviorEndsAt;
37
+ private behavior;
38
+ private sizeValue;
39
+ private position;
40
+ private targetX;
41
+ private direction;
42
+ private facingScale;
43
+ private horizontalVelocity;
44
+ private renderedBounce;
45
+ private pointer;
46
+ private pointerMovedAt;
47
+ private dragging;
48
+ private dragOffset;
49
+ private dragStart;
50
+ private didDrag;
51
+ private ballColor;
52
+ private visible;
53
+ private connected;
54
+ private resizeObserver;
55
+ private soundEnabled;
56
+ private volume;
57
+ private rendererValue;
58
+ private hunger;
59
+ private lastHungerUpdate;
60
+ constructor();
61
+ connectedCallback(): void;
62
+ disconnectedCallback(): void;
63
+ attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void;
64
+ command(command: DigitalPetCommand): void;
65
+ randomTrick(): void;
66
+ setSize(size: DigitalPetSize, persist?: boolean): void;
67
+ setRenderer(renderer: DigitalPetRenderer): void;
68
+ bringToPointer(): void;
69
+ bringTo(x: number, y: number): void;
70
+ show(): void;
71
+ hide(): void;
72
+ get isVisible(): boolean;
73
+ private get displayWidth();
74
+ private get displayHeight();
75
+ private get cursorInteractionEnabled();
76
+ private get petName();
77
+ private updatePetName;
78
+ private dispatchCareEvent;
79
+ private dispatchVisibilityChange;
80
+ private playBark;
81
+ private requireElement;
82
+ private renderControlButtons;
83
+ private bindControls;
84
+ private openPanel;
85
+ private closePanel;
86
+ private readInitialSize;
87
+ private placeInStartCorner;
88
+ private applyCanvasSize;
89
+ private initializeRenderer;
90
+ private dispatchRendererChange;
91
+ private syncRendererControls;
92
+ private syncSoundControls;
93
+ private syncSizeButtons;
94
+ private readonly handleGlobalPointerMove;
95
+ private readonly handlePointerDown;
96
+ private readonly handleCanvasPointerMove;
97
+ private readonly handlePointerUp;
98
+ private readonly handleResize;
99
+ private readonly handleVisibilityChange;
100
+ private readonly handleReducedMotionChange;
101
+ private readonly tick;
102
+ private update;
103
+ private updateCursorReaction;
104
+ private updateMovement;
105
+ private updateChase;
106
+ private chooseAutonomousBehavior;
107
+ private startMoving;
108
+ private setBehavior;
109
+ private setTimedBehavior;
110
+ private moveToNearestCorner;
111
+ private clampPosition;
112
+ private say;
113
+ private draw;
114
+ private bodyBounce;
115
+ private bodyLean;
116
+ private wagAngle;
117
+ private get behaviorProgress();
118
+ private applyTrickTransform;
119
+ private drawStandingShiro;
120
+ private drawLyingShiro;
121
+ private drawRollingShiro;
122
+ private drawSittingShiro;
123
+ private drawHead;
124
+ private get mouthOpen();
125
+ private legOffset;
126
+ private drawPlumeTail;
127
+ private drawChestRuff;
128
+ private drawFeatheredLeg;
129
+ private drawRaisedPaw;
130
+ private drawNamastePaws;
131
+ private drawEar;
132
+ private drawFaceDetails;
133
+ private drawEarFeathering;
134
+ private drawFurTufts;
135
+ private drawEye;
136
+ private drawClosedEye;
137
+ private drawSoundLines;
138
+ private drawFetchBall;
139
+ private drawRestingBalls;
140
+ private drawBall;
141
+ private drawShadow;
142
+ }
143
+ export declare function defineDigitalPet(tagName?: string): void;
144
+ export declare function mountDigitalPet(options?: DigitalPetOptions): DigitalPetElement;
145
+ declare global {
146
+ interface HTMLElementTagNameMap {
147
+ "digital-pet": DigitalPetElement;
148
+ }
149
+ }
150
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,4KAkBvB,CAAC;AAEX,eAAO,MAAM,iBAAiB,sDAAuD,CAAC;AACtF,eAAO,MAAM,qBAAqB,uBAAwB,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AACtE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IACvC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;CAC9C;AA2VD,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,MAAM,CAAC,QAAQ,CAAC,OAAO,iBAAiB;IAExC,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyD;IACvF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuE;IACjG,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,gBAAgB,CAAqB;;IAyB7C,iBAAiB,IAAI,IAAI;IA2BzB,oBAAoB,IAAI,IAAI;IAa5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiC/F,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAmEzC,WAAW,IAAI,IAAI;IAgBnB,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,UAAO,GAAG,IAAI;IAkCnD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAW/C,cAAc,IAAI,IAAI;IAMtB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAQnC,IAAI,IAAI,IAAI;IAOZ,IAAI,IAAI,IAAI;IASZ,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,wBAAwB,GAEnC;IAED,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,oBAAoB;IAuC5B,OAAO,CAAC,YAAY;IAiDpB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAGtC;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAShC;IAEF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAStC;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAS9B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAG3B;IAEF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAOrC;IAEF,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAIxC;IAEF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAuBnB;IAEF,OAAO,CAAC,MAAM;IA2Bd,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,GAAG;IAcX,OAAO,CAAC,IAAI;IAkCZ,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,QAAQ;IAehB,OAAO,KAAK,gBAAgB,GAG3B;IAED,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,QAAQ;IAsEhB,OAAO,KAAK,SAAS,GAIpB;IAED,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,OAAO;IAoCf,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,UAAU;CAOnB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,SAA4B,GAAG,IAAI,CAQ1E;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,iBAAsB,GAAG,iBAAiB,CAclF;AAiJD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,iBAAiB,CAAC;KAClC;CACF"}