@usequeek/app-sdk 0.4.0 → 0.5.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.
@@ -1,5 +1,5 @@
1
- import { Hono } from "hono";
2
1
  import { INSTALL_EVENT, RESYNC_EVENT, SETTINGS_EVENT, UNINSTALL_EVENT, } from "./handoff.js";
2
+ import { decodeBody, readHeader, toResponse, } from "./delivery.js";
3
3
  import { MAX_TIMESTAMP_SKEW_SECONDS, verifyQueekSignatureDetailed, WEBHOOK_ID_HEADER, WEBHOOK_SIGNATURE_HEADER, WEBHOOK_TIMESTAMP_HEADER, } from "./signatures.js";
4
4
  /**
5
5
  * Build the storable installation record from install `data`. Timestamps
@@ -60,179 +60,214 @@ export function saveResyncedInstallation(existing, data, nowIso = new Date().toI
60
60
  tokenKid: existing.tokenKid,
61
61
  };
62
62
  }
63
- export function createInstallHandlers(options) {
64
- const app = new Hono();
65
- const maxSkew = options.maxSkewSeconds ?? MAX_TIMESTAMP_SKEW_SECONDS;
66
- async function guard(id, timestamp, signatureHeader, rawBody) {
67
- if (!id || !timestamp || !signatureHeader) {
68
- return { ok: false, status: 401, reason: "missing signature headers" };
69
- }
70
- const checked = verifyQueekSignatureDetailed({ id, timestamp, body: rawBody, signatureHeader, secret: options.appSecret }, { nowSeconds: options.nowSeconds, maxSkewSeconds: maxSkew });
71
- if (!checked.ok) {
72
- return {
73
- ok: false,
74
- status: 401,
75
- reason: checked.reason === "stale_timestamp" ? "stale timestamp" : "signature mismatch",
76
- };
77
- }
78
- return { ok: true, id };
63
+ /**
64
+ * Layer 1: handle one signed install-handoff delivery (`install`,
65
+ * `uninstall`, or `settings`, taken from the input path's last segment)
66
+ * from plain data — no `Request`, no framework. Same options, same
67
+ * behaviour, same errors/status codes at every layer.
68
+ */
69
+ export async function handleInstallDelivery(input, options) {
70
+ if ((input.method ?? "POST").toUpperCase() !== "POST") {
71
+ return { status: 405, body: { ok: false, error: "method_not_allowed" } };
79
72
  }
80
- function parseEnvelope(rawBody) {
81
- try {
82
- const parsed = JSON.parse(rawBody);
83
- if (typeof parsed !== "object" || parsed === null)
84
- return null;
85
- return parsed;
86
- }
87
- catch {
73
+ const route = trailingSegment(input.path ?? "");
74
+ const rawBody = decodeBody(input.rawBody);
75
+ if (route === "install")
76
+ return installDelivery(rawBody, input.headers, options);
77
+ if (route === "uninstall")
78
+ return uninstallDelivery(rawBody, input.headers, options);
79
+ if (route === "settings")
80
+ return settingsDelivery(rawBody, input.headers, options);
81
+ return { status: 404, body: { ok: false, error: "unknown_route" } };
82
+ }
83
+ /** Last path segment of a pathname or full URL (query/fragment stripped, trailing slashes ignored). */
84
+ function trailingSegment(path) {
85
+ const withoutQuery = path.split("?", 1)[0] ?? "";
86
+ const withoutFragment = withoutQuery.split("#", 1)[0] ?? "";
87
+ const trimmed = withoutFragment.replace(/\/+$/, "");
88
+ return trimmed.slice(trimmed.lastIndexOf("/") + 1);
89
+ }
90
+ /**
91
+ * Layer 2: the Web-standard wrapper, built ONLY on layer 1 — reads
92
+ * `await request.arrayBuffer()` + headers, calls the core, builds the
93
+ * `Response`.
94
+ */
95
+ export async function handleInstallRequest(request, options) {
96
+ return toResponse(await handleInstallDelivery({
97
+ rawBody: new Uint8Array(await request.arrayBuffer()),
98
+ headers: request.headers,
99
+ method: request.method,
100
+ path: new URL(request.url).pathname,
101
+ }, options));
102
+ }
103
+ async function guard(options, headers, rawBody) {
104
+ const id = readHeader(headers, WEBHOOK_ID_HEADER);
105
+ const timestamp = readHeader(headers, WEBHOOK_TIMESTAMP_HEADER);
106
+ const signatureHeader = readHeader(headers, WEBHOOK_SIGNATURE_HEADER);
107
+ if (!id || !timestamp || !signatureHeader) {
108
+ return { ok: false, status: 401, reason: "missing signature headers" };
109
+ }
110
+ const checked = verifyQueekSignatureDetailed({ id, timestamp, body: rawBody, signatureHeader, secret: options.appSecret }, { nowSeconds: options.nowSeconds, maxSkewSeconds: options.maxSkewSeconds ?? MAX_TIMESTAMP_SKEW_SECONDS });
111
+ if (!checked.ok) {
112
+ return {
113
+ ok: false,
114
+ status: 401,
115
+ reason: checked.reason === "stale_timestamp" ? "stale timestamp" : "signature mismatch",
116
+ };
117
+ }
118
+ return { ok: true, id };
119
+ }
120
+ function parseEnvelope(rawBody) {
121
+ try {
122
+ const parsed = JSON.parse(rawBody);
123
+ if (typeof parsed !== "object" || parsed === null)
88
124
  return null;
89
- }
125
+ return parsed;
90
126
  }
91
- function isInstallPayload(data) {
92
- return (!!data &&
93
- typeof data === "object" &&
94
- typeof data.installation?.id === "string" &&
95
- typeof data.api_base === "string");
96
- }
97
- /** Default resync apply: merge into the existing row (keeping
98
- * `installedAt`, the cached token and stored values the resync omits) or
99
- * store a fresh row when nothing is stored (post-outage recovery). */
100
- async function applyResync(data) {
101
- const existing = await options.store.getInstallation(data.installation.id);
102
- await options.store.saveInstallation(existing
103
- ? saveResyncedInstallation(existing, data, new Date().toISOString())
104
- : installationRecordFromInstall(data, new Date().toISOString()));
105
- }
106
- app.post("/install", async (c) => {
107
- const rawBody = await c.req.text();
108
- const checked = await guard(c.req.header(WEBHOOK_ID_HEADER), c.req.header(WEBHOOK_TIMESTAMP_HEADER), c.req.header(WEBHOOK_SIGNATURE_HEADER), rawBody);
109
- if (!checked.ok)
110
- return c.json({ ok: false, error: checked.reason }, checked.status);
111
- const envelope = parseEnvelope(rawBody);
112
- if (!envelope)
113
- return c.json({ ok: false, error: "invalid_envelope" }, 400);
114
- // The platform resync handoff redelivers the install-shaped data under
115
- // `type: app/resync` (same signed channel, same verification): it lands
116
- // here as well as on `/settings` (the backend aims at `settings_url`
117
- // first, falling back to `install_url`).
118
- if (envelope.type !== INSTALL_EVENT && envelope.type !== RESYNC_EVENT) {
119
- return c.json({ ok: false, error: "unexpected event type" }, 400);
120
- }
121
- if (!isInstallPayload(envelope.data)) {
122
- return c.json({ ok: false, error: "invalid install payload" }, 400);
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ function isInstallPayload(data) {
132
+ return (!!data &&
133
+ typeof data === "object" &&
134
+ typeof data.installation?.id === "string" &&
135
+ typeof data.api_base === "string");
136
+ }
137
+ /** Default resync apply: merge into the existing row (keeping
138
+ * `installedAt`, the cached token and stored values the resync omits) or
139
+ * store a fresh row when nothing is stored (post-outage recovery). */
140
+ async function applyResync(store, data) {
141
+ const existing = await store.getInstallation(data.installation.id);
142
+ await store.saveInstallation(existing
143
+ ? saveResyncedInstallation(existing, data, new Date().toISOString())
144
+ : installationRecordFromInstall(data, new Date().toISOString()));
145
+ }
146
+ async function installDelivery(rawBody, headers, options) {
147
+ const checked = await guard(options, headers, rawBody);
148
+ if (!checked.ok)
149
+ return { status: checked.status, body: { ok: false, error: checked.reason } };
150
+ const envelope = parseEnvelope(rawBody);
151
+ if (!envelope)
152
+ return { status: 400, body: { ok: false, error: "invalid_envelope" } };
153
+ // The platform resync handoff redelivers the install-shaped data under
154
+ // `type: app/resync` (same signed channel, same verification): it lands
155
+ // here as well as on `settings` (the backend aims at `settings_url`
156
+ // first, falling back to `install_url`).
157
+ if (envelope.type !== INSTALL_EVENT && envelope.type !== RESYNC_EVENT) {
158
+ return { status: 400, body: { ok: false, error: "unexpected event type" } };
159
+ }
160
+ if (!isInstallPayload(envelope.data)) {
161
+ return { status: 400, body: { ok: false, error: "invalid install payload" } };
162
+ }
163
+ // Atomic claim on the HEADER id (never the body id): exactly one
164
+ // same-id delivery runs the callback.
165
+ if (!(await options.store.claimWebhookId(checked.id))) {
166
+ return { status: 409, body: { ok: false, error: "duplicate delivery" } };
167
+ }
168
+ try {
169
+ if (options.onInstall) {
170
+ // A resync envelope is install-shaped, so the install callback
171
+ // handles it (apps merge via `saveResyncedInstallation` there).
172
+ await options.onInstall(envelope);
123
173
  }
124
- // Atomic claim on the HEADER id (never the body id): exactly one
125
- // same-id delivery runs the callback.
126
- if (!(await options.store.claimWebhookId(checked.id))) {
127
- return c.json({ ok: false, error: "duplicate delivery" }, 409);
174
+ else {
175
+ // A resync redelivers the install envelope for an EXISTING
176
+ // installation: merge idempotently (keep `installedAt` + the cached
177
+ // token) instead of resetting the row.
178
+ await applyResync(options.store, envelope.data);
128
179
  }
129
- try {
130
- if (options.onInstall) {
131
- // A resync envelope is install-shaped, so the install callback
132
- // handles it (apps merge via `saveResyncedInstallation` there).
133
- await options.onInstall(envelope);
134
- }
135
- else {
136
- // A resync redelivers the install envelope for an EXISTING
137
- // installation: merge idempotently (keep `installedAt` + the cached
138
- // token) instead of resetting the row.
139
- await applyResync(envelope.data);
140
- }
180
+ }
181
+ catch {
182
+ // Non-2xx on purpose: Queek revokes the key and the merchant retries
183
+ // as a fresh install. The claim is released so the retry can land.
184
+ await options.store.releaseWebhookId(checked.id);
185
+ return { status: 500, body: { ok: false, error: "install_failed" } };
186
+ }
187
+ return { status: 200, body: { ok: true } };
188
+ }
189
+ async function uninstallDelivery(rawBody, headers, options) {
190
+ const checked = await guard(options, headers, rawBody);
191
+ if (!checked.ok)
192
+ return { status: checked.status, body: { ok: false, error: checked.reason } };
193
+ const envelope = parseEnvelope(rawBody);
194
+ if (!envelope)
195
+ return { status: 400, body: { ok: false, error: "invalid_envelope" } };
196
+ if (envelope.type !== UNINSTALL_EVENT) {
197
+ return { status: 400, body: { ok: false, error: "unexpected event type" } };
198
+ }
199
+ if (!(await options.store.claimWebhookId(checked.id))) {
200
+ return { status: 409, body: { ok: false, error: "duplicate delivery" } };
201
+ }
202
+ try {
203
+ if (options.onUninstall) {
204
+ await options.onUninstall(envelope);
141
205
  }
142
- catch {
143
- // Non-2xx on purpose: Queek revokes the key and the merchant retries
144
- // as a fresh install. The claim is released so the retry can land.
145
- await options.store.releaseWebhookId(checked.id);
146
- return c.json({ ok: false, error: "install_failed" }, 500);
206
+ else {
207
+ await options.store.deleteInstallation(envelope.data.installation.id);
147
208
  }
148
- return c.json({ ok: true });
149
- });
150
- app.post("/uninstall", async (c) => {
151
- const rawBody = await c.req.text();
152
- const checked = await guard(c.req.header(WEBHOOK_ID_HEADER), c.req.header(WEBHOOK_TIMESTAMP_HEADER), c.req.header(WEBHOOK_SIGNATURE_HEADER), rawBody);
153
- if (!checked.ok)
154
- return c.json({ ok: false, error: checked.reason }, checked.status);
155
- const envelope = parseEnvelope(rawBody);
156
- if (!envelope)
157
- return c.json({ ok: false, error: "invalid_envelope" }, 400);
158
- if (envelope.type !== UNINSTALL_EVENT) {
159
- return c.json({ ok: false, error: "unexpected event type" }, 400);
209
+ }
210
+ catch {
211
+ await options.store.releaseWebhookId(checked.id);
212
+ return { status: 500, body: { ok: false, error: "uninstall_failed" } };
213
+ }
214
+ return { status: 200, body: { ok: true } };
215
+ }
216
+ async function settingsDelivery(rawBody, headers, options) {
217
+ const checked = await guard(options, headers, rawBody);
218
+ if (!checked.ok)
219
+ return { status: checked.status, body: { ok: false, error: checked.reason } };
220
+ const envelope = parseEnvelope(rawBody);
221
+ if (!envelope)
222
+ return { status: 400, body: { ok: false, error: "invalid_envelope" } };
223
+ // The platform resync handoff (`type: app/resync`) is delivered to the
224
+ // app's `settings_url` first: it lands here with the install-shaped
225
+ // data, so it takes the resync merge — never the settings callback,
226
+ // whose envelope shape does not fit.
227
+ if (envelope.type !== SETTINGS_EVENT && envelope.type !== RESYNC_EVENT) {
228
+ return { status: 400, body: { ok: false, error: "unexpected event type" } };
229
+ }
230
+ if (envelope.type === RESYNC_EVENT) {
231
+ if (!isInstallPayload(envelope.data)) {
232
+ return { status: 400, body: { ok: false, error: "invalid install payload" } };
160
233
  }
161
234
  if (!(await options.store.claimWebhookId(checked.id))) {
162
- return c.json({ ok: false, error: "duplicate delivery" }, 409);
235
+ return { status: 409, body: { ok: false, error: "duplicate delivery" } };
163
236
  }
164
237
  try {
165
- if (options.onUninstall) {
166
- await options.onUninstall(envelope);
167
- }
168
- else {
169
- await options.store.deleteInstallation(envelope.data.installation.id);
170
- }
238
+ await applyResync(options.store, envelope.data);
171
239
  }
172
240
  catch {
173
241
  await options.store.releaseWebhookId(checked.id);
174
- return c.json({ ok: false, error: "uninstall_failed" }, 500);
242
+ return { status: 500, body: { ok: false, error: "settings_failed" } };
175
243
  }
176
- return c.json({ ok: true });
177
- });
178
- app.post("/settings", async (c) => {
179
- const rawBody = await c.req.text();
180
- const checked = await guard(c.req.header(WEBHOOK_ID_HEADER), c.req.header(WEBHOOK_TIMESTAMP_HEADER), c.req.header(WEBHOOK_SIGNATURE_HEADER), rawBody);
181
- if (!checked.ok)
182
- return c.json({ ok: false, error: checked.reason }, checked.status);
183
- const envelope = parseEnvelope(rawBody);
184
- if (!envelope)
185
- return c.json({ ok: false, error: "invalid_envelope" }, 400);
186
- // The platform resync handoff (`type: app/resync`) is delivered to the
187
- // app's `settings_url` first: it lands here with the install-shaped
188
- // data, so it takes the resync merge — never the settings callback,
189
- // whose envelope shape does not fit.
190
- if (envelope.type !== SETTINGS_EVENT && envelope.type !== RESYNC_EVENT) {
191
- return c.json({ ok: false, error: "unexpected event type" }, 400);
244
+ return { status: 200, body: { ok: true } };
245
+ }
246
+ if (!(await options.store.claimWebhookId(checked.id))) {
247
+ return { status: 409, body: { ok: false, error: "duplicate delivery" } };
248
+ }
249
+ try {
250
+ if (options.onSettings) {
251
+ await options.onSettings(envelope);
192
252
  }
193
- if (envelope.type === RESYNC_EVENT) {
194
- if (!isInstallPayload(envelope.data)) {
195
- return c.json({ ok: false, error: "invalid install payload" }, 400);
196
- }
197
- if (!(await options.store.claimWebhookId(checked.id))) {
198
- return c.json({ ok: false, error: "duplicate delivery" }, 409);
199
- }
200
- try {
201
- await applyResync(envelope.data);
202
- }
203
- catch {
253
+ else {
254
+ const data = envelope.data;
255
+ const existing = await options.store.getInstallation(data.installation.id);
256
+ if (!existing) {
204
257
  await options.store.releaseWebhookId(checked.id);
205
- return c.json({ ok: false, error: "settings_failed" }, 500);
206
- }
207
- return c.json({ ok: true });
208
- }
209
- if (!(await options.store.claimWebhookId(checked.id))) {
210
- return c.json({ ok: false, error: "duplicate delivery" }, 409);
211
- }
212
- try {
213
- if (options.onSettings) {
214
- await options.onSettings(envelope);
215
- }
216
- else {
217
- const data = envelope.data;
218
- const existing = await options.store.getInstallation(data.installation.id);
219
- if (!existing) {
220
- await options.store.releaseWebhookId(checked.id);
221
- return c.json({ ok: false, error: "unknown_installation" }, 404);
222
- }
223
- await options.store.saveInstallation({
224
- ...existing,
225
- settings: data.settings,
226
- updatedAt: new Date().toISOString(),
227
- });
258
+ return { status: 404, body: { ok: false, error: "unknown_installation" } };
228
259
  }
260
+ await options.store.saveInstallation({
261
+ ...existing,
262
+ settings: data.settings,
263
+ updatedAt: new Date().toISOString(),
264
+ });
229
265
  }
230
- catch {
231
- await options.store.releaseWebhookId(checked.id);
232
- return c.json({ ok: false, error: "settings_failed" }, 500);
233
- }
234
- return c.json({ ok: true });
235
- });
236
- return app;
266
+ }
267
+ catch {
268
+ await options.store.releaseWebhookId(checked.id);
269
+ return { status: 500, body: { ok: false, error: "settings_failed" } };
270
+ }
271
+ return { status: 200, body: { ok: true } };
237
272
  }
238
273
  //# sourceMappingURL=install-handlers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-handlers.js","sourceRoot":"","sources":["../src/install-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-handlers.js","sourceRoot":"","sources":["../src/install-handlers.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
- import { Hono } from "hono";
1
+ import { type CoreDelivery, type DeliveryResult } from "./delivery.js";
2
2
  import type { InstallationRecord, InstallationStore } from "./store.js";
3
3
  /**
4
- * Receiver for Queek topic deliveries (`DeliverWebhookJob` in
5
- * queek_backend, one signed POST per installation endpoint).
4
+ * Framework-agnostic receiver for Queek topic deliveries
5
+ * (`DeliverWebhookJob` in queek_backend, one signed POST per installation
6
+ * endpoint) in three thin layers: layer 1
7
+ * `handleWebhookDelivery(input, options)` takes plain data (untouched body
8
+ * bytes + headers) and returns a plain `{ status, body }` result — zero
9
+ * request/response types, so whatever request object each framework
10
+ * supports works; layer 2 `handleWebhookRequest(request, options)` adapts
11
+ * the Web standard onto layer 1; layer 3 (`@usequeek/app-sdk/hono`)
12
+ * adapts Hono onto layer 2.
6
13
  *
7
14
  * Delivery envelope: `{ id, topic, api_version: "v1", created_at, data }`
8
15
  * with `X-Queek-Topic` echoing `topic`. Verification uses the
@@ -56,5 +63,16 @@ export interface WebhookHandlerOptions {
56
63
  nowSeconds?: number;
57
64
  maxSkewSeconds?: number;
58
65
  }
59
- export declare function createWebhookHandler(options: WebhookHandlerOptions): Hono;
66
+ /**
67
+ * Layer 1: handle one signed Queek topic delivery from plain data — no
68
+ * `Request`, no framework. Same options, same behaviour, same
69
+ * errors/status codes at every layer.
70
+ */
71
+ export declare function handleWebhookDelivery(input: CoreDelivery, options: WebhookHandlerOptions): Promise<DeliveryResult>;
72
+ /**
73
+ * Layer 2: the Web-standard wrapper, built ONLY on layer 1 — reads
74
+ * `await request.arrayBuffer()` + headers, calls the core, builds the
75
+ * `Response`. Only `POST` is served; anything else answers 405.
76
+ */
77
+ export declare function handleWebhookRequest(request: Request, options: WebhookHandlerOptions): Promise<Response>;
60
78
  //# sourceMappingURL=webhooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,WAAW,oBAAoB,CAAC,KAAK,GAAG,OAAO;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,kBAAkB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IAAI,CAC9C,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,EACrC,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,iBAAiB,CAAC;IACzB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,uDAAuD;IACvD,aAAa,CAAC,EAAE,CACd,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,KAChE,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAyCD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAiFzE"}
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,cAAc,EAGpB,MAAM,eAAe,CAAC;AAQvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,WAAW,oBAAoB,CAAC,KAAK,GAAG,OAAO;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,kBAAkB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IAAI,CAC9C,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,EACrC,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,iBAAiB,CAAC;IACzB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,uDAAuD;IACvD,aAAa,CAAC,EAAE,CACd,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,KAChE,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAyCD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA2EzB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAanB"}