@contractspec/lib.jobs 1.57.0 → 1.59.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 (92) hide show
  1. package/dist/contracts/index.d.ts +494 -500
  2. package/dist/contracts/index.d.ts.map +1 -1
  3. package/dist/contracts/index.js +298 -461
  4. package/dist/entities/index.d.ts +117 -122
  5. package/dist/entities/index.d.ts.map +1 -1
  6. package/dist/entities/index.js +170 -193
  7. package/dist/events.d.ts +297 -303
  8. package/dist/events.d.ts.map +1 -1
  9. package/dist/events.js +199 -351
  10. package/dist/handlers/gmail-sync-handler.d.ts +5 -9
  11. package/dist/handlers/gmail-sync-handler.d.ts.map +1 -1
  12. package/dist/handlers/gmail-sync-handler.js +8 -8
  13. package/dist/handlers/index.d.ts +5 -9
  14. package/dist/handlers/index.d.ts.map +1 -1
  15. package/dist/handlers/index.js +53 -10
  16. package/dist/handlers/ping-job.d.ts +6 -10
  17. package/dist/handlers/ping-job.d.ts.map +1 -1
  18. package/dist/handlers/ping-job.js +13 -12
  19. package/dist/handlers/storage-document-handler.d.ts +7 -11
  20. package/dist/handlers/storage-document-handler.d.ts.map +1 -1
  21. package/dist/handlers/storage-document-handler.js +15 -13
  22. package/dist/index.d.ts +7 -24
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1366 -64
  25. package/dist/jobs.capability.d.ts +2 -7
  26. package/dist/jobs.capability.d.ts.map +1 -1
  27. package/dist/jobs.capability.js +29 -33
  28. package/dist/jobs.feature.d.ts +1 -6
  29. package/dist/jobs.feature.d.ts.map +1 -1
  30. package/dist/jobs.feature.js +45 -108
  31. package/dist/node/contracts/index.js +318 -0
  32. package/dist/node/entities/index.js +174 -0
  33. package/dist/node/events.js +200 -0
  34. package/dist/node/handlers/gmail-sync-handler.js +9 -0
  35. package/dist/node/handlers/index.js +55 -0
  36. package/dist/node/handlers/ping-job.js +14 -0
  37. package/dist/node/handlers/storage-document-handler.js +16 -0
  38. package/dist/node/index.js +1368 -0
  39. package/dist/node/jobs.capability.js +28 -0
  40. package/dist/node/jobs.feature.js +46 -0
  41. package/dist/node/queue/gcp-cloud-tasks.js +66 -0
  42. package/dist/node/queue/gcp-pubsub.js +54 -0
  43. package/dist/node/queue/index.js +478 -0
  44. package/dist/node/queue/memory-queue.js +160 -0
  45. package/dist/node/queue/register-defined-job.js +15 -0
  46. package/dist/node/queue/scaleway-sqs-queue.js +206 -0
  47. package/dist/node/queue/types.js +10 -0
  48. package/dist/node/scheduler/index.js +117 -0
  49. package/dist/queue/gcp-cloud-tasks.d.ts +33 -36
  50. package/dist/queue/gcp-cloud-tasks.d.ts.map +1 -1
  51. package/dist/queue/gcp-cloud-tasks.js +65 -59
  52. package/dist/queue/gcp-pubsub.d.ts +18 -21
  53. package/dist/queue/gcp-pubsub.d.ts.map +1 -1
  54. package/dist/queue/gcp-pubsub.js +53 -45
  55. package/dist/queue/index.d.ts +6 -15
  56. package/dist/queue/index.d.ts.map +1 -1
  57. package/dist/queue/index.js +476 -20
  58. package/dist/queue/memory-queue.d.ts +25 -29
  59. package/dist/queue/memory-queue.d.ts.map +1 -1
  60. package/dist/queue/memory-queue.js +159 -138
  61. package/dist/queue/register-defined-job.d.ts +3 -7
  62. package/dist/queue/register-defined-job.d.ts.map +1 -1
  63. package/dist/queue/register-defined-job.js +14 -14
  64. package/dist/queue/scaleway-sqs-queue.d.ts +31 -35
  65. package/dist/queue/scaleway-sqs-queue.d.ts.map +1 -1
  66. package/dist/queue/scaleway-sqs-queue.js +205 -173
  67. package/dist/queue/types.d.ts +2 -8
  68. package/dist/queue/types.d.ts.map +1 -1
  69. package/dist/queue/types.js +11 -12
  70. package/dist/scheduler/index.d.ts +68 -72
  71. package/dist/scheduler/index.d.ts.map +1 -1
  72. package/dist/scheduler/index.js +113 -141
  73. package/package.json +176 -50
  74. package/dist/_virtual/_rolldown/runtime.js +0 -36
  75. package/dist/contracts/index.js.map +0 -1
  76. package/dist/entities/index.js.map +0 -1
  77. package/dist/events.js.map +0 -1
  78. package/dist/handlers/gmail-sync-handler.js.map +0 -1
  79. package/dist/handlers/index.js.map +0 -1
  80. package/dist/handlers/ping-job.js.map +0 -1
  81. package/dist/handlers/storage-document-handler.js.map +0 -1
  82. package/dist/index.js.map +0 -1
  83. package/dist/jobs.capability.js.map +0 -1
  84. package/dist/jobs.feature.js.map +0 -1
  85. package/dist/queue/gcp-cloud-tasks.js.map +0 -1
  86. package/dist/queue/gcp-pubsub.js.map +0 -1
  87. package/dist/queue/index.js.map +0 -1
  88. package/dist/queue/memory-queue.js.map +0 -1
  89. package/dist/queue/register-defined-job.js.map +0 -1
  90. package/dist/queue/scaleway-sqs-queue.js.map +0 -1
  91. package/dist/queue/types.js.map +0 -1
  92. package/dist/scheduler/index.js.map +0 -1
@@ -1,140 +1,161 @@
1
- import { types_exports } from "./types.js";
2
- import { randomUUID } from "node:crypto";
1
+ // @bun
2
+ // src/queue/types.ts
3
+ export * from "@contractspec/lib.contracts/jobs/queue";
4
+ import {
5
+ calculateBackoff,
6
+ DEFAULT_RETRY_POLICY
7
+ } from "@contractspec/lib.contracts/jobs/queue";
3
8
 
4
- //#region src/queue/memory-queue.ts
5
- /**
6
- * In-memory job queue for development and testing.
7
- */
8
- var MemoryJobQueue = class {
9
- jobs = /* @__PURE__ */ new Map();
10
- handlers = /* @__PURE__ */ new Map();
11
- timer;
12
- activeCount = 0;
13
- pollIntervalMs;
14
- concurrency;
15
- retryPolicy;
16
- constructor(options = {}) {
17
- this.pollIntervalMs = options.pollIntervalMs ?? 200;
18
- this.concurrency = options.concurrency ?? 5;
19
- this.retryPolicy = options.retryPolicy ?? types_exports.DEFAULT_RETRY_POLICY;
20
- }
21
- async enqueue(jobType, payload, options = {}) {
22
- if (options.dedupeKey) {
23
- const existing = Array.from(this.jobs.values()).find((j) => j.dedupeKey === options.dedupeKey && j.status === "pending");
24
- if (existing) return existing;
25
- }
26
- const now = /* @__PURE__ */ new Date();
27
- const scheduledAt = options.delaySeconds ? new Date(now.getTime() + options.delaySeconds * 1e3) : now;
28
- const job = {
29
- id: randomUUID(),
30
- type: jobType,
31
- version: "1.0.0",
32
- payload,
33
- status: "pending",
34
- priority: options.priority ?? 0,
35
- attempts: 0,
36
- maxRetries: options.maxRetries ?? this.retryPolicy.maxRetries,
37
- createdAt: now,
38
- updatedAt: now,
39
- scheduledAt,
40
- dedupeKey: options.dedupeKey,
41
- tenantId: options.tenantId,
42
- userId: options.userId,
43
- traceId: options.traceId,
44
- metadata: options.metadata
45
- };
46
- if (options.timeoutMs) job.timeoutAt = new Date(now.getTime() + options.timeoutMs);
47
- this.jobs.set(job.id, job);
48
- return job;
49
- }
50
- register(jobType, handler) {
51
- this.handlers.set(jobType, handler);
52
- }
53
- start() {
54
- if (this.timer) return;
55
- this.timer = setInterval(() => {
56
- this.processNext();
57
- }, this.pollIntervalMs);
58
- }
59
- async stop() {
60
- if (this.timer) {
61
- clearInterval(this.timer);
62
- this.timer = void 0;
63
- }
64
- while (this.activeCount > 0) await new Promise((resolve) => setTimeout(resolve, 50));
65
- }
66
- async getJob(jobId) {
67
- return this.jobs.get(jobId) ?? null;
68
- }
69
- async cancelJob(jobId) {
70
- const job = this.jobs.get(jobId);
71
- if (!job || job.status !== "pending") return false;
72
- job.status = "cancelled";
73
- job.updatedAt = /* @__PURE__ */ new Date();
74
- return true;
75
- }
76
- async getStats() {
77
- const stats = {
78
- pending: 0,
79
- running: 0,
80
- completed: 0,
81
- failed: 0,
82
- deadLetter: 0
83
- };
84
- for (const job of this.jobs.values()) switch (job.status) {
85
- case "pending":
86
- stats.pending++;
87
- break;
88
- case "running":
89
- stats.running++;
90
- break;
91
- case "completed":
92
- stats.completed++;
93
- break;
94
- case "failed":
95
- stats.failed++;
96
- break;
97
- case "dead_letter":
98
- stats.deadLetter++;
99
- break;
100
- }
101
- return stats;
102
- }
103
- async processNext() {
104
- if (this.activeCount >= this.concurrency) return;
105
- const now = /* @__PURE__ */ new Date();
106
- const job = Array.from(this.jobs.values()).filter((j) => j.status === "pending" && (!j.scheduledAt || j.scheduledAt <= now)).sort((a, b) => {
107
- if (a.priority !== b.priority) return b.priority - a.priority;
108
- return (a.scheduledAt?.getTime() ?? 0) - (b.scheduledAt?.getTime() ?? 0);
109
- })[0];
110
- if (!job) return;
111
- const handler = this.handlers.get(job.type);
112
- if (!handler) return;
113
- this.activeCount++;
114
- job.status = "running";
115
- job.startedAt = /* @__PURE__ */ new Date();
116
- job.updatedAt = /* @__PURE__ */ new Date();
117
- job.attempts += 1;
118
- try {
119
- const result = await handler(job);
120
- job.status = "completed";
121
- job.completedAt = /* @__PURE__ */ new Date();
122
- job.result = result;
123
- } catch (error) {
124
- job.lastError = error instanceof Error ? error.message : "Unknown error";
125
- if (job.attempts >= job.maxRetries) job.status = "dead_letter";
126
- else {
127
- const backoff = (0, types_exports.calculateBackoff)(job.attempts, this.retryPolicy);
128
- job.status = "pending";
129
- job.scheduledAt = new Date(Date.now() + backoff);
130
- }
131
- } finally {
132
- job.updatedAt = /* @__PURE__ */ new Date();
133
- this.activeCount--;
134
- }
135
- }
9
+ // src/queue/memory-queue.ts
10
+ import { randomUUID } from "crypto";
11
+ class MemoryJobQueue {
12
+ jobs = new Map;
13
+ handlers = new Map;
14
+ timer;
15
+ activeCount = 0;
16
+ pollIntervalMs;
17
+ concurrency;
18
+ retryPolicy;
19
+ constructor(options = {}) {
20
+ this.pollIntervalMs = options.pollIntervalMs ?? 200;
21
+ this.concurrency = options.concurrency ?? 5;
22
+ this.retryPolicy = options.retryPolicy ?? DEFAULT_RETRY_POLICY;
23
+ }
24
+ async enqueue(jobType, payload, options = {}) {
25
+ if (options.dedupeKey) {
26
+ const existing = Array.from(this.jobs.values()).find((j) => j.dedupeKey === options.dedupeKey && j.status === "pending");
27
+ if (existing) {
28
+ return existing;
29
+ }
30
+ }
31
+ const now = new Date;
32
+ const scheduledAt = options.delaySeconds ? new Date(now.getTime() + options.delaySeconds * 1000) : now;
33
+ const job = {
34
+ id: randomUUID(),
35
+ type: jobType,
36
+ version: "1.0.0",
37
+ payload,
38
+ status: "pending",
39
+ priority: options.priority ?? 0,
40
+ attempts: 0,
41
+ maxRetries: options.maxRetries ?? this.retryPolicy.maxRetries,
42
+ createdAt: now,
43
+ updatedAt: now,
44
+ scheduledAt,
45
+ dedupeKey: options.dedupeKey,
46
+ tenantId: options.tenantId,
47
+ userId: options.userId,
48
+ traceId: options.traceId,
49
+ metadata: options.metadata
50
+ };
51
+ if (options.timeoutMs) {
52
+ job.timeoutAt = new Date(now.getTime() + options.timeoutMs);
53
+ }
54
+ this.jobs.set(job.id, job);
55
+ return job;
56
+ }
57
+ register(jobType, handler) {
58
+ this.handlers.set(jobType, handler);
59
+ }
60
+ start() {
61
+ if (this.timer)
62
+ return;
63
+ this.timer = setInterval(() => {
64
+ this.processNext();
65
+ }, this.pollIntervalMs);
66
+ }
67
+ async stop() {
68
+ if (this.timer) {
69
+ clearInterval(this.timer);
70
+ this.timer = undefined;
71
+ }
72
+ while (this.activeCount > 0) {
73
+ await new Promise((resolve) => setTimeout(resolve, 50));
74
+ }
75
+ }
76
+ async getJob(jobId) {
77
+ return this.jobs.get(jobId) ?? null;
78
+ }
79
+ async cancelJob(jobId) {
80
+ const job = this.jobs.get(jobId);
81
+ if (!job || job.status !== "pending") {
82
+ return false;
83
+ }
84
+ job.status = "cancelled";
85
+ job.updatedAt = new Date;
86
+ return true;
87
+ }
88
+ async getStats() {
89
+ const stats = {
90
+ pending: 0,
91
+ running: 0,
92
+ completed: 0,
93
+ failed: 0,
94
+ deadLetter: 0
95
+ };
96
+ for (const job of this.jobs.values()) {
97
+ switch (job.status) {
98
+ case "pending":
99
+ stats.pending++;
100
+ break;
101
+ case "running":
102
+ stats.running++;
103
+ break;
104
+ case "completed":
105
+ stats.completed++;
106
+ break;
107
+ case "failed":
108
+ stats.failed++;
109
+ break;
110
+ case "dead_letter":
111
+ stats.deadLetter++;
112
+ break;
113
+ }
114
+ }
115
+ return stats;
116
+ }
117
+ async processNext() {
118
+ if (this.activeCount >= this.concurrency)
119
+ return;
120
+ const now = new Date;
121
+ const pendingJobs = Array.from(this.jobs.values()).filter((j) => j.status === "pending" && (!j.scheduledAt || j.scheduledAt <= now)).sort((a, b) => {
122
+ if (a.priority !== b.priority) {
123
+ return b.priority - a.priority;
124
+ }
125
+ return (a.scheduledAt?.getTime() ?? 0) - (b.scheduledAt?.getTime() ?? 0);
126
+ });
127
+ const job = pendingJobs[0];
128
+ if (!job)
129
+ return;
130
+ const handler = this.handlers.get(job.type);
131
+ if (!handler)
132
+ return;
133
+ this.activeCount++;
134
+ job.status = "running";
135
+ job.startedAt = new Date;
136
+ job.updatedAt = new Date;
137
+ job.attempts += 1;
138
+ try {
139
+ const result = await handler(job);
140
+ job.status = "completed";
141
+ job.completedAt = new Date;
142
+ job.result = result;
143
+ } catch (error) {
144
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
145
+ job.lastError = errorMessage;
146
+ if (job.attempts >= job.maxRetries) {
147
+ job.status = "dead_letter";
148
+ } else {
149
+ const backoff = calculateBackoff(job.attempts, this.retryPolicy);
150
+ job.status = "pending";
151
+ job.scheduledAt = new Date(Date.now() + backoff);
152
+ }
153
+ } finally {
154
+ job.updatedAt = new Date;
155
+ this.activeCount--;
156
+ }
157
+ }
158
+ }
159
+ export {
160
+ MemoryJobQueue
136
161
  };
137
-
138
- //#endregion
139
- export { MemoryJobQueue };
140
- //# sourceMappingURL=memory-queue.js.map
@@ -1,8 +1,4 @@
1
- import { JobQueue } from "@contractspec/lib.contracts/jobs/queue";
2
- import { DefinedJob } from "@contractspec/lib.contracts/jobs/define-job";
3
-
4
- //#region src/queue/register-defined-job.d.ts
5
- declare function registerDefinedJob<TPayload>(queue: JobQueue, def: DefinedJob<TPayload>): void;
6
- //#endregion
7
- export { registerDefinedJob };
1
+ import type { DefinedJob } from '@contractspec/lib.contracts/jobs/define-job';
2
+ import type { JobQueue } from '@contractspec/lib.contracts/jobs/queue';
3
+ export declare function registerDefinedJob<TPayload>(queue: JobQueue, def: DefinedJob<TPayload>): void;
8
4
  //# sourceMappingURL=register-defined-job.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register-defined-job.d.ts","names":[],"sources":["../../src/queue/register-defined-job.ts"],"mappings":";;;;iBAOgB,kBAAA,UAAA,CACd,KAAA,EAAO,QAAA,EACP,GAAA,EAAK,UAAA,CAAW,QAAA"}
1
+ {"version":3,"file":"register-defined-job.d.ts","sourceRoot":"","sources":["../../src/queue/register-defined-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,KAAK,EAGV,QAAQ,EACT,MAAM,wCAAwC,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,QAAQ,EACzC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,GACxB,IAAI,CAYN"}
@@ -1,16 +1,16 @@
1
- //#region src/queue/register-defined-job.ts
1
+ // @bun
2
+ // src/queue/register-defined-job.ts
2
3
  function registerDefinedJob(queue, def) {
3
- const wrapped = async (job) => {
4
- const payload = def.schema.parse(job.payload);
5
- const typedJob = {
6
- ...job,
7
- payload
8
- };
9
- await def.handler(payload, typedJob);
10
- };
11
- queue.register(def.type, wrapped);
4
+ const wrapped = async (job) => {
5
+ const payload = def.schema.parse(job.payload);
6
+ const typedJob = {
7
+ ...job,
8
+ payload
9
+ };
10
+ await def.handler(payload, typedJob);
11
+ };
12
+ queue.register(def.type, wrapped);
12
13
  }
13
-
14
- //#endregion
15
- export { registerDefinedJob };
16
- //# sourceMappingURL=register-defined-job.js.map
14
+ export {
15
+ registerDefinedJob
16
+ };
@@ -1,39 +1,35 @@
1
- import { types_d_exports } from "./types.js";
2
- import { Logger } from "@contractspec/lib.logger";
3
-
4
- //#region src/queue/scaleway-sqs-queue.d.ts
5
- interface ScalewaySqsQueueCredentials {
6
- accessKeyId: string;
7
- secretAccessKey: string;
1
+ import type { Logger } from '@contractspec/lib.logger';
2
+ import type { EnqueueOptions, Job, JobHandler, JobQueue } from './types';
3
+ export interface ScalewaySqsQueueCredentials {
4
+ accessKeyId: string;
5
+ secretAccessKey: string;
8
6
  }
9
- interface ScalewaySqsQueueConfig {
10
- queueUrl: string;
11
- region?: string;
12
- endpoint?: string;
13
- waitTimeSeconds?: number;
14
- maxNumberOfMessages?: number;
15
- visibilityTimeoutSeconds?: number;
16
- credentials?: ScalewaySqsQueueCredentials;
17
- logger?: Logger;
7
+ export interface ScalewaySqsQueueConfig {
8
+ queueUrl: string;
9
+ region?: string;
10
+ endpoint?: string;
11
+ waitTimeSeconds?: number;
12
+ maxNumberOfMessages?: number;
13
+ visibilityTimeoutSeconds?: number;
14
+ credentials?: ScalewaySqsQueueCredentials;
15
+ logger?: Logger;
18
16
  }
19
- declare class ScalewaySqsJobQueue implements types_d_exports.JobQueue {
20
- private readonly sqs;
21
- private readonly queueUrl;
22
- private readonly waitTimeSeconds;
23
- private readonly maxNumberOfMessages;
24
- private readonly visibilityTimeoutSeconds;
25
- private readonly handlers;
26
- private readonly logger?;
27
- private running;
28
- constructor(config: ScalewaySqsQueueConfig);
29
- enqueue<TPayload>(jobType: string, payload: TPayload, options?: types_d_exports.EnqueueOptions): Promise<types_d_exports.Job<TPayload>>;
30
- register<TPayload, TResult = void>(jobType: string, handler: types_d_exports.JobHandler<TPayload, TResult>): void;
31
- start(): void;
32
- stop(): Promise<void>;
33
- private pollLoop;
34
- private deleteMessage;
35
- private sleep;
17
+ export declare class ScalewaySqsJobQueue implements JobQueue {
18
+ private readonly sqs;
19
+ private readonly queueUrl;
20
+ private readonly waitTimeSeconds;
21
+ private readonly maxNumberOfMessages;
22
+ private readonly visibilityTimeoutSeconds;
23
+ private readonly handlers;
24
+ private readonly logger?;
25
+ private running;
26
+ constructor(config: ScalewaySqsQueueConfig);
27
+ enqueue<TPayload>(jobType: string, payload: TPayload, options?: EnqueueOptions): Promise<Job<TPayload>>;
28
+ register<TPayload, TResult = void>(jobType: string, handler: JobHandler<TPayload, TResult>): void;
29
+ start(): void;
30
+ stop(): Promise<void>;
31
+ private pollLoop;
32
+ private deleteMessage;
33
+ private sleep;
36
34
  }
37
- //#endregion
38
- export { ScalewaySqsJobQueue, ScalewaySqsQueueConfig, ScalewaySqsQueueCredentials };
39
35
  //# sourceMappingURL=scaleway-sqs-queue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaleway-sqs-queue.d.ts","names":[],"sources":["../../src/queue/scaleway-sqs-queue.ts"],"mappings":";;;;UAWiB,2BAAA;EACf,WAAA;EACA,eAAA;AAAA;AAAA,UAGe,sBAAA;EACf,QAAA;EACA,MAAA;EACA,QAAA;EACA,eAAA;EACA,mBAAA;EACA,wBAAA;EACA,WAAA,GAAc,2BAAA;EACd,MAAA,GAAS,MAAA;AAAA;AAAA,cASE,mBAAA,YAA+B,eAAA,CAAA,QAAA;EAAA,iBACzB,GAAA;EAAA,iBACA,QAAA;EAAA,iBACA,eAAA;EAAA,iBACA,mBAAA;EAAA,iBACA,wBAAA;EAAA,iBACA,QAAA;EAAA,iBACA,MAAA;EAAA,QACT,OAAA;cAEI,MAAA,EAAQ,sBAAA;EAiCd,OAAA,UAAA,CACJ,OAAA,UACA,OAAA,EAAS,QAAA,EACT,OAAA,GAAS,eAAA,CAAA,cAAA,GACR,OAAA,CAAQ,eAAA,CAAA,GAAA,CAAI,QAAA;EA0Cf,QAAA,0BAAA,CACE,OAAA,UACA,OAAA,EAAS,eAAA,CAAA,UAAA,CAAW,QAAA,EAAU,OAAA;EAQhC,KAAA,CAAA;EAWM,IAAA,CAAA,GAAQ,OAAA;EAAA,QAKA,QAAA;EAAA,QA+GA,aAAA;EAAA,QAeA,KAAA;AAAA"}
1
+ {"version":3,"file":"scaleway-sqs-queue.d.ts","sourceRoot":"","sources":["../../src/queue/scaleway-sqs-queue.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEzE,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE,2BAA2B,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,qBAAa,mBAAoB,YAAW,QAAQ;IAClD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,sBAAsB;IAiCpC,OAAO,CAAC,QAAQ,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,QAAQ,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IA0CzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,GACrC,IAAI;IAOP,KAAK,IAAI,IAAI;IAWP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,QAAQ;YA+GR,aAAa;YAeb,KAAK;CAGpB"}