@jango-blockchained/hoox-shared 1.0.9 → 1.1.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 (74) hide show
  1. package/README.md +17 -0
  2. package/dist/analytics.d.ts +23 -1
  3. package/dist/analytics.d.ts.map +1 -1
  4. package/dist/analytics.js +14 -3
  5. package/dist/api-client.d.ts +12 -2
  6. package/dist/api-client.d.ts.map +1 -1
  7. package/dist/api-client.js +74 -7
  8. package/dist/colors.d.ts +63 -24
  9. package/dist/colors.d.ts.map +1 -1
  10. package/dist/colors.js +60 -19
  11. package/dist/config.d.ts +34 -1
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +61 -6
  14. package/dist/cron-handler.d.ts +2 -2
  15. package/dist/cron-handler.d.ts.map +1 -1
  16. package/dist/d1/index.js +1 -0
  17. package/dist/d1/repository.js +297 -0
  18. package/dist/d1/schemas.js +81 -0
  19. package/dist/exchanges/base-exchange-client.js +120 -0
  20. package/dist/exchanges/types.js +1 -0
  21. package/dist/index.d.ts +21 -11
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +580 -60
  24. package/dist/middleware/auth.d.ts +42 -6
  25. package/dist/middleware/auth.d.ts.map +1 -1
  26. package/dist/middleware/auth.js +151 -0
  27. package/dist/middleware/cors.d.ts +28 -2
  28. package/dist/middleware/cors.d.ts.map +1 -1
  29. package/dist/middleware/cors.js +77 -0
  30. package/dist/middleware/index.d.ts +2 -2
  31. package/dist/middleware/index.d.ts.map +1 -1
  32. package/dist/middleware/index.js +192 -107
  33. package/dist/middleware/logger.js +202 -0
  34. package/dist/middleware/rate-limit.d.ts.map +1 -1
  35. package/dist/middleware/rate-limit.js +181 -0
  36. package/dist/middleware/security-headers.js +58 -0
  37. package/dist/middleware/validate.js +56 -0
  38. package/dist/operator-transport.d.ts +61 -0
  39. package/dist/operator-transport.d.ts.map +1 -0
  40. package/dist/operator-transport.js +87 -0
  41. package/dist/path-utils.d.ts +59 -1
  42. package/dist/path-utils.d.ts.map +1 -1
  43. package/dist/path-utils.js +89 -2
  44. package/dist/queue-handler.d.ts +3 -3
  45. package/dist/queue-handler.d.ts.map +1 -1
  46. package/dist/router.d.ts +2 -2
  47. package/dist/router.d.ts.map +1 -1
  48. package/dist/schemas/index.js +7 -4
  49. package/dist/schemas/registry.js +387 -0
  50. package/dist/schemas/types.js +1 -0
  51. package/dist/schemas/validators.d.ts.map +1 -1
  52. package/dist/schemas/validators.js +290 -0
  53. package/dist/service-bindings.d.ts +65 -0
  54. package/dist/service-bindings.d.ts.map +1 -1
  55. package/dist/service-bindings.js +216 -1
  56. package/dist/session.d.ts.map +1 -1
  57. package/dist/session.js +97 -2
  58. package/dist/sse.d.ts +12 -3
  59. package/dist/sse.d.ts.map +1 -1
  60. package/dist/sse.js +70 -7
  61. package/dist/stores/config-store.d.ts.map +1 -1
  62. package/dist/stores/config-store.js +129 -6
  63. package/dist/stores/service-store.d.ts.map +1 -1
  64. package/dist/stores/service-store.js +96 -25
  65. package/dist/types.d.ts +66 -1
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js +11 -0
  68. package/dist/wizard/engine.js +501 -0
  69. package/dist/wizard/index.js +2 -1
  70. package/dist/wizard/persistence.js +31 -0
  71. package/dist/wizard/presets.js +199 -0
  72. package/dist/wizard/provisioner.js +1 -0
  73. package/dist/wizard/types.js +1 -0
  74. package/package.json +38 -12
package/dist/router.d.ts CHANGED
@@ -6,6 +6,6 @@
6
6
  * Path parameters are extracted and passed as the 4th argument to handlers.
7
7
  */
8
8
  import type { Router } from "./types/router";
9
- export type { Handler, RouteParams } from "./types/router";
10
- export declare function createRouter<TEnv = any>(): Router<TEnv>;
9
+ export type { Handler, MiddlewareHandler, RouteParams } from "./types/router";
10
+ export declare function createRouter<TEnv = unknown>(): Router<TEnv>;
11
11
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3D,wBAAgB,YAAY,CAAC,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,CAsMvD"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,wBAAgB,YAAY,CAAC,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CAsM3D"}
@@ -36,7 +36,7 @@ function deriveCalledBy(manifests) {
36
36
  var manifests = {
37
37
  hoox: {
38
38
  name: "hoox",
39
- path: "workers/hoox",
39
+ path: "workers/hoox-worker",
40
40
  vars: {
41
41
  WEBHOOK_API_KEY_BINDING: {
42
42
  type: "secret",
@@ -380,6 +380,7 @@ var manifests = {
380
380
  var CALLED_BY = deriveCalledBy(manifests);
381
381
  var WORKER_MANIFESTS = manifests;
382
382
  var WORKER_NAMES = Object.keys(manifests).sort();
383
+
383
384
  // src/schemas/validators.ts
384
385
  import { parse } from "jsonc-parser";
385
386
  function validateWranglerJsonc(workerName, manifest, jsoncContent) {
@@ -405,7 +406,8 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
405
406
  });
406
407
  return errors;
407
408
  }
408
- const declaredVars = parsed?.vars ?? {};
409
+ const wrangler = parsed;
410
+ const declaredVars = wrangler.vars ?? {};
409
411
  for (const [name, def] of Object.entries(manifest.vars)) {
410
412
  if (!(name in declaredVars)) {
411
413
  errors.push({
@@ -426,7 +428,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
426
428
  });
427
429
  }
428
430
  }
429
- const declaredServices = parsed?.services ?? [];
431
+ const declaredServices = wrangler.services ?? [];
430
432
  for (const expected of manifest.services) {
431
433
  const match = declaredServices.find((s) => s.binding === expected.binding && s.service === expected.service);
432
434
  if (!match) {
@@ -482,7 +484,8 @@ function validateRootSecrets(workerName, manifest, rootJsoncContent) {
482
484
  });
483
485
  return errors;
484
486
  }
485
- const rootSecrets = parsed?.workers?.[workerName]?.secrets ?? [];
487
+ const rootWrangler = parsed;
488
+ const rootSecrets = rootWrangler.workers?.[workerName]?.secrets ?? [];
486
489
  const expectedSecrets = Object.entries(manifest.vars).filter(([_, def]) => def.type === "secret").map(([name]) => name);
487
490
  for (const expected of expectedSecrets) {
488
491
  if (!rootSecrets.includes(expected)) {
@@ -0,0 +1,387 @@
1
+ // @bun
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
+
18
+ // src/schemas/registry.ts
19
+ function deriveCalledBy(manifests) {
20
+ const calledBy = {};
21
+ for (const [workerName, manifest] of Object.entries(manifests)) {
22
+ if (!calledBy[workerName])
23
+ calledBy[workerName] = new Set;
24
+ for (const svc of manifest.services) {
25
+ if (!calledBy[svc.service])
26
+ calledBy[svc.service] = new Set;
27
+ calledBy[svc.service].add(workerName);
28
+ }
29
+ }
30
+ const result = {};
31
+ for (const [worker, callers] of Object.entries(calledBy)) {
32
+ result[worker] = [...callers].sort();
33
+ }
34
+ return result;
35
+ }
36
+ var manifests = {
37
+ hoox: {
38
+ name: "hoox",
39
+ path: "workers/hoox-worker",
40
+ vars: {
41
+ WEBHOOK_API_KEY_BINDING: {
42
+ type: "secret",
43
+ description: "External webhook auth key"
44
+ },
45
+ INTERNAL_KEY_BINDING: {
46
+ type: "secret",
47
+ description: "Inter-worker auth key"
48
+ },
49
+ HA_TOKEN_BINDING: { type: "secret", description: "Home Assistant token" }
50
+ },
51
+ services: [
52
+ {
53
+ binding: "TRADE_SERVICE",
54
+ service: "trade-worker",
55
+ description: "Trading functionality"
56
+ },
57
+ {
58
+ binding: "TELEGRAM_SERVICE",
59
+ service: "telegram-worker",
60
+ description: "Notifications"
61
+ }
62
+ ],
63
+ infrastructure: {
64
+ kv: [
65
+ { binding: "SESSIONS_KV", description: "Webhook session storage" },
66
+ {
67
+ binding: "CONFIG_KV",
68
+ description: "Configuration + rate limiter state"
69
+ }
70
+ ],
71
+ vectorize: [{ binding: "VECTORIZE_INDEX", index: "my-rag-index" }],
72
+ ai: true,
73
+ queues: { producer: ["trade-execution"] },
74
+ durableObjects: [
75
+ { name: "IDEMPOTENCY_STORE", className: "IdempotencyStore" }
76
+ ]
77
+ },
78
+ middleware: [
79
+ "requireAuth",
80
+ "requireInternalAuth",
81
+ "cors",
82
+ "rateLimit",
83
+ "logger",
84
+ "validate"
85
+ ]
86
+ },
87
+ "trade-worker": {
88
+ name: "trade-worker",
89
+ path: "workers/trade-worker",
90
+ vars: {
91
+ INTERNAL_KEY_BINDING: {
92
+ type: "secret",
93
+ description: "Inter-worker auth key"
94
+ },
95
+ TELEGRAM_INTERNAL_KEY_BINDING: {
96
+ type: "secret",
97
+ description: "Telegram outbound auth"
98
+ },
99
+ BINANCE_KEY_BINDING: { type: "secret", description: "Binance API key" },
100
+ BINANCE_SECRET_BINDING: {
101
+ type: "secret",
102
+ description: "Binance API secret"
103
+ },
104
+ MEXC_KEY_BINDING: { type: "secret", description: "MEXC API key" },
105
+ MEXC_SECRET_BINDING: { type: "secret", description: "MEXC API secret" },
106
+ BYBIT_KEY_BINDING: { type: "secret", description: "Bybit API key" },
107
+ BYBIT_SECRET_BINDING: { type: "secret", description: "Bybit API secret" }
108
+ },
109
+ services: [
110
+ {
111
+ binding: "D1_SERVICE",
112
+ service: "d1-worker",
113
+ description: "Database operations"
114
+ },
115
+ {
116
+ binding: "TELEGRAM_SERVICE",
117
+ service: "telegram-worker",
118
+ description: "Notifications"
119
+ }
120
+ ],
121
+ infrastructure: {
122
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }],
123
+ d1: [
124
+ {
125
+ binding: "DB",
126
+ database: "trade-data-db",
127
+ description: "Trade operations"
128
+ }
129
+ ],
130
+ r2: [
131
+ {
132
+ binding: "REPORTS_BUCKET",
133
+ bucket: "trade-reports",
134
+ description: "Trade reports"
135
+ },
136
+ {
137
+ binding: "SYSTEM_LOGS_BUCKET",
138
+ bucket: "hoox-system-logs",
139
+ description: "Verbose exchange logs"
140
+ }
141
+ ],
142
+ queues: { consumer: ["trade-execution"] }
143
+ },
144
+ middleware: ["requireInternalAuth"]
145
+ },
146
+ "telegram-worker": {
147
+ name: "telegram-worker",
148
+ path: "workers/telegram-worker",
149
+ vars: {
150
+ INTERNAL_KEY_BINDING: {
151
+ type: "secret",
152
+ description: "Inter-worker auth key"
153
+ },
154
+ TG_BOT_TOKEN_BINDING: {
155
+ type: "secret",
156
+ description: "Telegram bot token"
157
+ },
158
+ TG_CHAT_ID_BINDING: { type: "secret", description: "Default chat ID" },
159
+ TELEGRAM_SECRET_TOKEN: {
160
+ type: "secret",
161
+ description: "Webhook verification token"
162
+ }
163
+ },
164
+ services: [],
165
+ infrastructure: {
166
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }],
167
+ r2: [
168
+ {
169
+ binding: "UPLOADS_BUCKET",
170
+ bucket: "user-uploads",
171
+ description: "User uploaded files"
172
+ }
173
+ ],
174
+ vectorize: [{ binding: "VECTORIZE_INDEX", index: "my-rag-index" }],
175
+ ai: true
176
+ },
177
+ middleware: ["requireInternalAuth"]
178
+ },
179
+ "d1-worker": {
180
+ name: "d1-worker",
181
+ path: "workers/d1-worker",
182
+ vars: {
183
+ INTERNAL_KEY_BINDING: {
184
+ type: "secret",
185
+ description: "Inter-worker auth key"
186
+ }
187
+ },
188
+ services: [],
189
+ infrastructure: {
190
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }],
191
+ d1: [
192
+ {
193
+ binding: "DB",
194
+ database: "trade-data-db",
195
+ description: "Main database"
196
+ }
197
+ ]
198
+ },
199
+ middleware: ["requireInternalAuth"]
200
+ },
201
+ "web3-wallet-worker": {
202
+ name: "web3-wallet-worker",
203
+ path: "workers/web3-wallet-worker",
204
+ vars: {
205
+ WALLET_PK_SECRET: { type: "secret", description: "Wallet private key" },
206
+ WALLET_MNEMONIC_SECRET: {
207
+ type: "secret",
208
+ description: "Wallet mnemonic phrase"
209
+ }
210
+ },
211
+ services: [
212
+ {
213
+ binding: "TELEGRAM_SERVICE",
214
+ service: "telegram-worker",
215
+ description: "Notifications"
216
+ }
217
+ ],
218
+ infrastructure: {},
219
+ middleware: ["requireInternalAuth"]
220
+ },
221
+ "agent-worker": {
222
+ name: "agent-worker",
223
+ path: "workers/agent-worker",
224
+ vars: {
225
+ AGENT_INTERNAL_KEY: { type: "secret", description: "Agent worker auth" },
226
+ INTERNAL_KEY_BINDING: {
227
+ type: "secret",
228
+ description: "Inter-worker auth key"
229
+ }
230
+ },
231
+ services: [
232
+ {
233
+ binding: "TRADE_SERVICE",
234
+ service: "trade-worker",
235
+ description: "Trading functionality"
236
+ },
237
+ {
238
+ binding: "TELEGRAM_SERVICE",
239
+ service: "telegram-worker",
240
+ description: "Notifications"
241
+ }
242
+ ],
243
+ infrastructure: {
244
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }],
245
+ d1: [
246
+ {
247
+ binding: "DB",
248
+ database: "trade-data-db",
249
+ description: "Portfolio queries"
250
+ }
251
+ ],
252
+ ai: true
253
+ },
254
+ middleware: ["requireInternalAuth"],
255
+ cron: ["*/5 * * * *"]
256
+ },
257
+ "email-worker": {
258
+ name: "email-worker",
259
+ path: "workers/email-worker",
260
+ vars: {
261
+ INTERNAL_KEY_BINDING: {
262
+ type: "secret",
263
+ description: "Inter-worker auth key"
264
+ },
265
+ EMAIL_HOST_BINDING: { type: "secret", description: "Email IMAP host" },
266
+ EMAIL_USER_BINDING: { type: "secret", description: "Email username" },
267
+ EMAIL_PASS_BINDING: { type: "secret", description: "Email password" },
268
+ TRADE_WORKER_NAME: {
269
+ type: "plaintext",
270
+ description: "Trade worker service name",
271
+ default: "trade-worker"
272
+ },
273
+ USE_IMAP: {
274
+ type: "plaintext",
275
+ description: "Use IMAP for email",
276
+ default: "false"
277
+ },
278
+ MAILGUN_API_KEY: { type: "secret", description: "Mailgun API key" },
279
+ EMAIL_SCAN_SUBJECT: { type: "secret", description: "Email scan subject" }
280
+ },
281
+ services: [
282
+ {
283
+ binding: "TRADE_SERVICE",
284
+ service: "trade-worker",
285
+ description: "Trading functionality"
286
+ }
287
+ ],
288
+ infrastructure: {
289
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }]
290
+ },
291
+ middleware: ["requireInternalAuth"],
292
+ cron: ["*/5 * * * *"]
293
+ },
294
+ "analytics-worker": {
295
+ name: "analytics-worker",
296
+ path: "workers/analytics-worker",
297
+ vars: {
298
+ CLOUDFLARE_API_TOKEN: {
299
+ type: "secret",
300
+ description: "CF API token for Analytics SQL"
301
+ },
302
+ CLOUDFLARE_ACCOUNT_ID: {
303
+ type: "plaintext",
304
+ description: "CF Account ID"
305
+ }
306
+ },
307
+ services: [],
308
+ infrastructure: {
309
+ analyticsEngine: true
310
+ },
311
+ middleware: []
312
+ },
313
+ "report-worker": {
314
+ name: "report-worker",
315
+ path: "workers/report-worker",
316
+ vars: {
317
+ CF_API_TOKEN_BINDING: {
318
+ type: "secret",
319
+ description: "CF API token for Browser Rendering"
320
+ },
321
+ ACCOUNT_ID: { type: "plaintext", description: "CF Account ID" }
322
+ },
323
+ services: [
324
+ {
325
+ binding: "D1_SERVICE",
326
+ service: "d1-worker",
327
+ description: "Database queries"
328
+ },
329
+ {
330
+ binding: "TELEGRAM_SERVICE",
331
+ service: "telegram-worker",
332
+ description: "Notifications"
333
+ }
334
+ ],
335
+ infrastructure: {
336
+ r2: [
337
+ {
338
+ binding: "REPORTS_BUCKET",
339
+ bucket: "trade-reports",
340
+ description: "PDF reports"
341
+ }
342
+ ]
343
+ },
344
+ middleware: ["requireInternalAuth"],
345
+ cron: ["0 8 * * *", "0 18 * * *"]
346
+ },
347
+ dashboard: {
348
+ name: "dashboard",
349
+ path: "workers/dashboard",
350
+ vars: {
351
+ DASHBOARD_USER: {
352
+ type: "secret",
353
+ description: "Dashboard admin username"
354
+ },
355
+ DASHBOARD_PASS: {
356
+ type: "secret",
357
+ description: "Dashboard admin password"
358
+ },
359
+ SESSION_SECRET: { type: "secret", description: "Session encryption key" }
360
+ },
361
+ services: [
362
+ {
363
+ binding: "D1_SERVICE",
364
+ service: "d1-worker",
365
+ description: "Database queries"
366
+ },
367
+ {
368
+ binding: "AGENT_SERVICE",
369
+ service: "agent-worker",
370
+ description: "AI risk data"
371
+ }
372
+ ],
373
+ infrastructure: {
374
+ kv: [{ binding: "CONFIG_KV", description: "Configuration" }],
375
+ ai: true
376
+ },
377
+ middleware: []
378
+ }
379
+ };
380
+ var CALLED_BY = deriveCalledBy(manifests);
381
+ var WORKER_MANIFESTS = manifests;
382
+ var WORKER_NAMES = Object.keys(manifests).sort();
383
+ export {
384
+ WORKER_NAMES,
385
+ WORKER_MANIFESTS,
386
+ CALLED_BY
387
+ };
@@ -0,0 +1 @@
1
+ // @bun
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA4GnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,EAAE,CAyCnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,eAAe,EAAE,CA6BnB;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAmItE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAYhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAWhE"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAalE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA4GnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,EAAE,CA2CnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,eAAe,EAAE,CA6BnB;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAmItE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAYhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAWhE"}