orez-lite 0.9.7

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 (190) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/dist/browser/generated/sqlite3-browser.wasm +0 -0
  4. package/dist/browser/generated/sync_wasm.js +922 -0
  5. package/dist/browser/generated/sync_wasm_bg.wasm +0 -0
  6. package/dist/browser/host.d.ts +10 -0
  7. package/dist/browser/host.d.ts.map +1 -0
  8. package/dist/browser/host.js +496 -0
  9. package/dist/browser/host.js.map +1 -0
  10. package/dist/browser/idb-snapshot.d.ts +11 -0
  11. package/dist/browser/idb-snapshot.d.ts.map +1 -0
  12. package/dist/browser/idb-snapshot.js +122 -0
  13. package/dist/browser/idb-snapshot.js.map +1 -0
  14. package/dist/browser/index.d.ts +5 -0
  15. package/dist/browser/index.d.ts.map +1 -0
  16. package/dist/browser/index.js +5 -0
  17. package/dist/browser/index.js.map +1 -0
  18. package/dist/browser/message-port.d.ts +7 -0
  19. package/dist/browser/message-port.d.ts.map +1 -0
  20. package/dist/browser/message-port.js +188 -0
  21. package/dist/browser/message-port.js.map +1 -0
  22. package/dist/browser/sqlite-adapter.d.ts +53 -0
  23. package/dist/browser/sqlite-adapter.d.ts.map +1 -0
  24. package/dist/browser/sqlite-adapter.js +126 -0
  25. package/dist/browser/sqlite-adapter.js.map +1 -0
  26. package/dist/browser/types.d.ts +52 -0
  27. package/dist/browser/types.d.ts.map +1 -0
  28. package/dist/browser/types.js +2 -0
  29. package/dist/browser/types.js.map +1 -0
  30. package/dist/cf-deploy/bundle.d.ts +18 -0
  31. package/dist/cf-deploy/bundle.d.ts.map +1 -0
  32. package/dist/cf-deploy/bundle.js +273 -0
  33. package/dist/cf-deploy/bundle.js.map +1 -0
  34. package/dist/cf-deploy/config.d.ts +12 -0
  35. package/dist/cf-deploy/config.d.ts.map +1 -0
  36. package/dist/cf-deploy/config.js +11 -0
  37. package/dist/cf-deploy/config.js.map +1 -0
  38. package/dist/cf-deploy/index.d.ts +10 -0
  39. package/dist/cf-deploy/index.d.ts.map +1 -0
  40. package/dist/cf-deploy/index.js +12 -0
  41. package/dist/cf-deploy/index.js.map +1 -0
  42. package/dist/cf-deploy/leaves.d.ts +8 -0
  43. package/dist/cf-deploy/leaves.d.ts.map +1 -0
  44. package/dist/cf-deploy/leaves.js +66 -0
  45. package/dist/cf-deploy/leaves.js.map +1 -0
  46. package/dist/cf-deploy/migration.d.ts +27 -0
  47. package/dist/cf-deploy/migration.d.ts.map +1 -0
  48. package/dist/cf-deploy/migration.js +734 -0
  49. package/dist/cf-deploy/migration.js.map +1 -0
  50. package/dist/cf-deploy/nativeMigrations.d.ts +24 -0
  51. package/dist/cf-deploy/nativeMigrations.d.ts.map +1 -0
  52. package/dist/cf-deploy/nativeMigrations.js +185 -0
  53. package/dist/cf-deploy/nativeMigrations.js.map +1 -0
  54. package/dist/cf-deploy/prune.d.ts +14 -0
  55. package/dist/cf-deploy/prune.d.ts.map +1 -0
  56. package/dist/cf-deploy/prune.js +235 -0
  57. package/dist/cf-deploy/prune.js.map +1 -0
  58. package/dist/cf-deploy/readiness.d.ts +11 -0
  59. package/dist/cf-deploy/readiness.d.ts.map +1 -0
  60. package/dist/cf-deploy/readiness.js +56 -0
  61. package/dist/cf-deploy/readiness.js.map +1 -0
  62. package/dist/cf-deploy/sources.d.ts +3 -0
  63. package/dist/cf-deploy/sources.d.ts.map +1 -0
  64. package/dist/cf-deploy/sources.js +24 -0
  65. package/dist/cf-deploy/sources.js.map +1 -0
  66. package/dist/cf-deploy/wrangler.d.ts +9 -0
  67. package/dist/cf-deploy/wrangler.d.ts.map +1 -0
  68. package/dist/cf-deploy/wrangler.js +48 -0
  69. package/dist/cf-deploy/wrangler.js.map +1 -0
  70. package/dist/cf-do/application-sql.d.ts +49 -0
  71. package/dist/cf-do/application-sql.d.ts.map +1 -0
  72. package/dist/cf-do/application-sql.js +124 -0
  73. package/dist/cf-do/application-sql.js.map +1 -0
  74. package/dist/cf-do/cdc.d.ts +155 -0
  75. package/dist/cf-do/cdc.d.ts.map +1 -0
  76. package/dist/cf-do/cdc.js +723 -0
  77. package/dist/cf-do/cdc.js.map +1 -0
  78. package/dist/cf-do/cursor-pull.d.ts +27 -0
  79. package/dist/cf-do/cursor-pull.d.ts.map +1 -0
  80. package/dist/cf-do/cursor-pull.js +78 -0
  81. package/dist/cf-do/cursor-pull.js.map +1 -0
  82. package/dist/cf-do/lite-data-worker.d.ts +171 -0
  83. package/dist/cf-do/lite-data-worker.d.ts.map +1 -0
  84. package/dist/cf-do/lite-data-worker.js +685 -0
  85. package/dist/cf-do/lite-data-worker.js.map +1 -0
  86. package/dist/cf-do/namespace-backup.d.ts +85 -0
  87. package/dist/cf-do/namespace-backup.d.ts.map +1 -0
  88. package/dist/cf-do/namespace-backup.js +470 -0
  89. package/dist/cf-do/namespace-backup.js.map +1 -0
  90. package/dist/cf-do/row-undo.d.ts +36 -0
  91. package/dist/cf-do/row-undo.d.ts.map +1 -0
  92. package/dist/cf-do/row-undo.js +221 -0
  93. package/dist/cf-do/row-undo.js.map +1 -0
  94. package/dist/cf-do/tx-journal.d.ts +118 -0
  95. package/dist/cf-do/tx-journal.d.ts.map +1 -0
  96. package/dist/cf-do/tx-journal.js +717 -0
  97. package/dist/cf-do/tx-journal.js.map +1 -0
  98. package/dist/cf-do/watermark.d.ts +29 -0
  99. package/dist/cf-do/watermark.d.ts.map +1 -0
  100. package/dist/cf-do/watermark.js +105 -0
  101. package/dist/cf-do/watermark.js.map +1 -0
  102. package/dist/cf-do/worker.d.ts +282 -0
  103. package/dist/cf-do/worker.d.ts.map +1 -0
  104. package/dist/cf-do/worker.js +1999 -0
  105. package/dist/cf-do/worker.js.map +1 -0
  106. package/dist/client.d.ts +2 -0
  107. package/dist/client.d.ts.map +1 -0
  108. package/dist/client.js +2 -0
  109. package/dist/client.js.map +1 -0
  110. package/dist/cloudflare-build.d.ts +9 -0
  111. package/dist/cloudflare-build.d.ts.map +1 -0
  112. package/dist/cloudflare-build.js +9 -0
  113. package/dist/cloudflare-build.js.map +1 -0
  114. package/dist/cloudflare-bun-wasm-loader.d.ts +2 -0
  115. package/dist/cloudflare-bun-wasm-loader.d.ts.map +1 -0
  116. package/dist/cloudflare-bun-wasm-loader.js +2 -0
  117. package/dist/cloudflare-bun-wasm-loader.js.map +1 -0
  118. package/dist/cloudflare-query-compiler.d.ts +2 -0
  119. package/dist/cloudflare-query-compiler.d.ts.map +1 -0
  120. package/dist/cloudflare-query-compiler.js +2 -0
  121. package/dist/cloudflare-query-compiler.js.map +1 -0
  122. package/dist/cloudflare-runtime.d.ts +15 -0
  123. package/dist/cloudflare-runtime.d.ts.map +1 -0
  124. package/dist/cloudflare-runtime.js +11 -0
  125. package/dist/cloudflare-runtime.js.map +1 -0
  126. package/dist/cloudflare-sync.d.ts +3 -0
  127. package/dist/cloudflare-sync.d.ts.map +1 -0
  128. package/dist/cloudflare-sync.js +3 -0
  129. package/dist/cloudflare-sync.js.map +1 -0
  130. package/dist/cloudflare-transaction-query.d.ts +2 -0
  131. package/dist/cloudflare-transaction-query.d.ts.map +1 -0
  132. package/dist/cloudflare-transaction-query.js +2 -0
  133. package/dist/cloudflare-transaction-query.js.map +1 -0
  134. package/dist/cloudflare-vite-wasm-loader.d.ts +2 -0
  135. package/dist/cloudflare-vite-wasm-loader.d.ts.map +1 -0
  136. package/dist/cloudflare-vite-wasm-loader.js +2 -0
  137. package/dist/cloudflare-vite-wasm-loader.js.map +1 -0
  138. package/dist/cloudflare.d.ts +3 -0
  139. package/dist/cloudflare.d.ts.map +1 -0
  140. package/dist/cloudflare.js +3 -0
  141. package/dist/cloudflare.js.map +1 -0
  142. package/dist/do-sql-tracking.d.ts +114 -0
  143. package/dist/do-sql-tracking.d.ts.map +1 -0
  144. package/dist/do-sql-tracking.js +280 -0
  145. package/dist/do-sql-tracking.js.map +1 -0
  146. package/dist/index.d.ts +4 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +3 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/wake.d.ts +22 -0
  151. package/dist/wake.d.ts.map +1 -0
  152. package/dist/wake.js +114 -0
  153. package/dist/wake.js.map +1 -0
  154. package/dist/worker/cf-do-shim.d.ts +53 -0
  155. package/dist/worker/cf-do-shim.d.ts.map +1 -0
  156. package/dist/worker/cf-do-shim.js +66 -0
  157. package/dist/worker/cf-do-shim.js.map +1 -0
  158. package/dist/zero-http/encrypted-column-codec.d.ts +46 -0
  159. package/dist/zero-http/encrypted-column-codec.d.ts.map +1 -0
  160. package/dist/zero-http/encrypted-column-codec.js +676 -0
  161. package/dist/zero-http/encrypted-column-codec.js.map +1 -0
  162. package/dist/zero-http/encrypted-column-conformance.d.ts +7 -0
  163. package/dist/zero-http/encrypted-column-conformance.d.ts.map +1 -0
  164. package/dist/zero-http/encrypted-column-conformance.js +161 -0
  165. package/dist/zero-http/encrypted-column-conformance.js.map +1 -0
  166. package/dist/zero-http/fixture-schema.d.ts +127 -0
  167. package/dist/zero-http/fixture-schema.d.ts.map +1 -0
  168. package/dist/zero-http/fixture-schema.js +56 -0
  169. package/dist/zero-http/fixture-schema.js.map +1 -0
  170. package/dist/zero-http/mount.d.ts +71 -0
  171. package/dist/zero-http/mount.d.ts.map +1 -0
  172. package/dist/zero-http/mount.js +594 -0
  173. package/dist/zero-http/mount.js.map +1 -0
  174. package/dist/zero-http/payload-codec.d.ts +91 -0
  175. package/dist/zero-http/payload-codec.d.ts.map +1 -0
  176. package/dist/zero-http/payload-codec.js +10 -0
  177. package/dist/zero-http/payload-codec.js.map +1 -0
  178. package/dist/zero-http/server.d.ts +16 -0
  179. package/dist/zero-http/server.d.ts.map +1 -0
  180. package/dist/zero-http/server.js +270 -0
  181. package/dist/zero-http/server.js.map +1 -0
  182. package/dist/zero-http/test-harness.d.ts +32 -0
  183. package/dist/zero-http/test-harness.d.ts.map +1 -0
  184. package/dist/zero-http/test-harness.js +77 -0
  185. package/dist/zero-http/test-harness.js.map +1 -0
  186. package/dist/zero-http/transport.d.ts +71 -0
  187. package/dist/zero-http/transport.d.ts.map +1 -0
  188. package/dist/zero-http/transport.js +1106 -0
  189. package/dist/zero-http/transport.js.map +1 -0
  190. package/package.json +116 -0
@@ -0,0 +1,594 @@
1
+ import { createSyncExecutor, reportPushDiagnostics, SyncExecutorRequestError, } from 'orez-sync-executor';
2
+ export class ZeroHttpRequestError extends Error {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message);
6
+ this.status = status;
7
+ this.name = 'ZeroHttpRequestError';
8
+ }
9
+ }
10
+ function authDataToClaims(authData) {
11
+ const claims = { userID: authData?.id ?? 'anon' };
12
+ if (authData)
13
+ claims.authData = authData;
14
+ return claims;
15
+ }
16
+ function quoteIdentifier(value) {
17
+ return `"${value.replaceAll('"', '""')}"`;
18
+ }
19
+ function quoteLiteral(value) {
20
+ return `'${value.replaceAll("'", "''")}'`;
21
+ }
22
+ export function createZeroHttpApplicationDatabase(db, transaction) {
23
+ const tx = {
24
+ async exec(sql, params = []) {
25
+ db.exec(sql, params);
26
+ return { changes: 0 };
27
+ },
28
+ async query(sql, params = []) {
29
+ return db.all(sql, params);
30
+ },
31
+ async queryAst() {
32
+ throw new Error('this zero-http host does not execute server ZQL reads');
33
+ },
34
+ };
35
+ let tail = Promise.resolve();
36
+ return {
37
+ dialect: 'sqlite',
38
+ async transaction(work) {
39
+ if (transaction)
40
+ return transaction(() => work(tx));
41
+ const previous = tail;
42
+ let release = () => { };
43
+ tail = new Promise((resolve) => {
44
+ release = resolve;
45
+ });
46
+ await previous;
47
+ db.exec('BEGIN');
48
+ try {
49
+ const result = await work(tx);
50
+ db.exec('COMMIT');
51
+ return result;
52
+ }
53
+ catch (error) {
54
+ db.exec('ROLLBACK');
55
+ throw error;
56
+ }
57
+ finally {
58
+ release();
59
+ }
60
+ },
61
+ async query(sql, params = []) {
62
+ return db.all(sql, params);
63
+ },
64
+ };
65
+ }
66
+ function isRecord(value) {
67
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
68
+ }
69
+ // this mount syncs every visible row regardless of desired queries, so its
70
+ // authoritative got ack is an echo: extract the hash-level shape of the
71
+ // desired delta and ack it in the same response that carries the rows. rows
72
+ // therefore never lag their ack. query content (name/args or ast) is accepted
73
+ // and ignored.
74
+ function validatePullQueries(value) {
75
+ if (value === undefined)
76
+ return undefined;
77
+ if (!isRecord(value) ||
78
+ typeof value.version !== 'number' ||
79
+ !Number.isSafeInteger(value.version) ||
80
+ value.version < 0 ||
81
+ !Array.isArray(value.patch)) {
82
+ throw new ZeroHttpRequestError(400, 'invalid pull queries');
83
+ }
84
+ const patch = [];
85
+ for (const op of value.patch) {
86
+ if (!isRecord(op))
87
+ throw new ZeroHttpRequestError(400, 'invalid pull queries');
88
+ if (op.op === 'clear') {
89
+ patch.push({ op: 'clear' });
90
+ }
91
+ else if ((op.op === 'put' || op.op === 'del') && typeof op.hash === 'string') {
92
+ patch.push({ op: op.op, hash: op.hash });
93
+ }
94
+ else {
95
+ throw new ZeroHttpRequestError(400, 'invalid pull queries');
96
+ }
97
+ }
98
+ return { version: value.version, patch };
99
+ }
100
+ function validatePull(value) {
101
+ if (!isRecord(value) ||
102
+ typeof value.clientID !== 'string' ||
103
+ typeof value.clientGroupID !== 'string' ||
104
+ (value.cookie !== null &&
105
+ (typeof value.cookie !== 'number' ||
106
+ !Number.isSafeInteger(value.cookie) ||
107
+ value.cookie < 0))) {
108
+ throw new ZeroHttpRequestError(400, 'invalid pull body');
109
+ }
110
+ const queries = validatePullQueries(value.queries);
111
+ return { ...value, queries };
112
+ }
113
+ // a raw sqlite value must reach the client as the column's declared zero
114
+ // type. canonical zero guarantees this at its replication boundary: pg
115
+ // timestamp text parses to epoch-ms numbers (timestampToFpMillis) and
116
+ // unparseable input throws, so a client can never receive a string for a
117
+ // number column — a string that slips through detonates far away, in the
118
+ // client view engine's compareValues. exported for its unit test.
119
+ export function toZeroValue(type, raw) {
120
+ if (raw === null || raw === undefined)
121
+ return null;
122
+ if (type === 'boolean') {
123
+ if (typeof raw === 'boolean')
124
+ return raw;
125
+ return raw === 1 || raw === '1' || raw === 'true' || raw === 't';
126
+ }
127
+ if (type === 'number' && typeof raw === 'string') {
128
+ const numeric = Number(raw);
129
+ if (Number.isFinite(numeric))
130
+ return numeric;
131
+ const timestamp = timestampTextToEpochMs(raw);
132
+ if (timestamp !== null)
133
+ return timestamp;
134
+ throw new Error(`Error parsing ${raw} as a zero number column value`);
135
+ }
136
+ if (type === 'json' && typeof raw === 'string')
137
+ return JSON.parse(raw);
138
+ return raw;
139
+ }
140
+ // SQL/ISO timestamp text -> epoch milliseconds, interpreting a missing offset
141
+ // as UTC. mirrors the rust engine's timestamp_text_to_epoch_ms
142
+ // (crates/sync-core/src/value.rs) so both read boundaries decode the same
143
+ // stable forms the data tier emits.
144
+ function timestampTextToEpochMs(value) {
145
+ if (value.length < 19)
146
+ return null;
147
+ const separator = value[10];
148
+ if (separator !== ' ' && separator !== 'T')
149
+ return null;
150
+ let normalized = `${value.slice(0, 10)}T${value.slice(11)}`;
151
+ if (/[+-]\d{2}$/.test(normalized))
152
+ normalized += ':00';
153
+ else if (!/(?:Z|[+-]\d{2}:\d{2})$/.test(normalized))
154
+ normalized += 'Z';
155
+ const ms = Date.parse(normalized);
156
+ return Number.isFinite(ms) ? ms : null;
157
+ }
158
+ export function createZeroHttpSyncServer(options) {
159
+ const { applicationDatabase, effects, mutators, schema, tables } = options;
160
+ const retainChanges = options.retainChanges ?? 4096;
161
+ const schemaConfig = schema;
162
+ const tableConfigs = tables.map((logical) => {
163
+ const schemaTable = schemaConfig.tables[logical];
164
+ if (!schemaTable)
165
+ throw new TypeError(`unknown table: ${logical}`);
166
+ return {
167
+ logical,
168
+ physical: schemaTable.serverName ?? schemaTable.name ?? logical,
169
+ columns: Object.fromEntries(Object.entries(schemaTable.columns).map(([column, spec]) => {
170
+ const schemaColumn = schemaTable.columns[column];
171
+ if (!schemaColumn)
172
+ throw new TypeError(`unknown column: ${logical}.${column}`);
173
+ return [
174
+ column,
175
+ { physical: schemaColumn.serverName ?? column, type: spec.type },
176
+ ];
177
+ })),
178
+ primaryKey: schemaTable.primaryKey,
179
+ };
180
+ });
181
+ const tableByLogical = new Map(tableConfigs.map((table) => [table.logical, table]));
182
+ const tableByPhysical = new Map(tableConfigs.map((table) => [table.physical, table]));
183
+ for (const [table, columns] of Object.entries(options.visibilityInvalidation?.capture ?? {})) {
184
+ const config = tableByLogical.get(table);
185
+ if (!config)
186
+ throw new TypeError(`visibility invalidation names unknown table: ${table}`);
187
+ for (const column of columns) {
188
+ if (!config.columns[column]) {
189
+ throw new TypeError(`visibility invalidation names unknown column: ${table}.${column}`);
190
+ }
191
+ }
192
+ }
193
+ const executor = createSyncExecutor({
194
+ database: applicationDatabase,
195
+ effects,
196
+ mutators,
197
+ schema,
198
+ });
199
+ // every statement below runs through applicationDatabase, never a raw handle:
200
+ // that is what lets this mount sit on a remote/async application database, and
201
+ // it keeps pull, invalidate and prune on the SAME queue as mutator execution
202
+ // so a push cannot interleave with a pull mid-transaction.
203
+ const ready = executor
204
+ .push({ clientGroupID: '__zero_http_mount__', mutations: [], pushVersion: 1 }, { userID: '__zero_http_mount__' })
205
+ .then(() => applicationDatabase.transaction(async (tx) => {
206
+ await tx.exec(`CREATE TABLE IF NOT EXISTS _zsync_meta (
207
+ lock INTEGER PRIMARY KEY CHECK (lock = 1),
208
+ floor INTEGER NOT NULL,
209
+ initialized INTEGER NOT NULL DEFAULT 0
210
+ )`);
211
+ const metaColumns = await tx.query(`SELECT name FROM pragma_table_info('_zsync_meta')`);
212
+ if (!metaColumns.some((column) => column.name === 'initialized')) {
213
+ await tx.exec('ALTER TABLE _zsync_meta ADD COLUMN initialized INTEGER NOT NULL DEFAULT 0');
214
+ }
215
+ await tx.exec(`INSERT INTO _zsync_meta (lock, floor, initialized) VALUES (1, 0, 0)
216
+ ON CONFLICT (lock) DO NOTHING`);
217
+ const [meta] = await tx.query('SELECT initialized FROM _zsync_meta WHERE lock = 1');
218
+ if (!meta?.initialized) {
219
+ const requestedCookie = options.initialCookie
220
+ ? await options.initialCookie(tx)
221
+ : 0;
222
+ if (!Number.isSafeInteger(requestedCookie) ||
223
+ requestedCookie < 0 ||
224
+ requestedCookie >= Number.MAX_SAFE_INTEGER) {
225
+ throw new TypeError(`invalid initial cookie: ${requestedCookie}`);
226
+ }
227
+ const baseline = Math.max(await watermarkIn(tx), requestedCookie);
228
+ if (baseline === 0) {
229
+ await tx.exec('UPDATE _zsync_meta SET initialized = 1 WHERE lock = 1');
230
+ }
231
+ else {
232
+ const epoch = baseline + 1;
233
+ await tx.exec(`INSERT INTO _zsync_changes ("watermark", "tableName", "op", "pk")
234
+ VALUES (?, '_zsync_meta', 'marker', NULL)`, [epoch]);
235
+ await tx.exec('UPDATE _zsync_meta SET floor = ?, initialized = 1 WHERE lock = 1', [epoch]);
236
+ }
237
+ }
238
+ // membership can shrink across deploys. a retired trigger would keep
239
+ // appending rows this instance cannot map, breaking every later diff.
240
+ const expectedTriggers = new Set(tableConfigs.flatMap((table) => ['i', 'u', 'd'].map((suffix) => `_zsync_tr_${table.physical}_${suffix}`)));
241
+ const installedTriggers = await tx.query(`SELECT name, tbl_name AS "tableName" FROM sqlite_master
242
+ WHERE type = 'trigger' AND name GLOB '_zsync_tr_*'
243
+ ORDER BY name`);
244
+ const retiredTriggers = installedTriggers.filter((trigger) => !expectedTriggers.has(trigger.name));
245
+ if (retiredTriggers.length > 0) {
246
+ const loggedTables = new Set((await tx.query(`SELECT DISTINCT "tableName" AS tableName FROM _zsync_changes
247
+ WHERE "op" = 'row'`)).map((row) => row.tableName));
248
+ for (const tableName of new Set(retiredTriggers.map((trigger) => trigger.tableName))) {
249
+ if (loggedTables.has(tableName)) {
250
+ console.warn(`[zero-http] retired table "${tableName}" has logged sync writes; removed its stale triggers, so future raw SQL writes will not sync. Include the table in this instance if writes continue.`);
251
+ }
252
+ }
253
+ for (const trigger of retiredTriggers) {
254
+ await tx.exec(`DROP TRIGGER IF EXISTS ${quoteIdentifier(trigger.name)}`);
255
+ }
256
+ }
257
+ for (const table of tableConfigs) {
258
+ const capture = [
259
+ ...new Set([
260
+ ...table.primaryKey,
261
+ ...(options.visibilityInvalidation?.capture[table.logical] ?? []),
262
+ ]),
263
+ ];
264
+ const rowObject = (ref) => `json_object(${capture
265
+ .map((column) => `${quoteLiteral(column)}, ${ref}.${quoteIdentifier(table.columns[column].physical)}`)
266
+ .join(', ')})`;
267
+ const trigger = `_zsync_tr_${table.physical}`;
268
+ const physical = quoteIdentifier(table.physical);
269
+ const tableName = quoteLiteral(table.physical);
270
+ for (const suffix of ['i', 'u', 'd']) {
271
+ await tx.exec(`DROP TRIGGER IF EXISTS ${quoteIdentifier(`${trigger}_${suffix}`)}`);
272
+ }
273
+ await tx.exec(`CREATE TRIGGER ${quoteIdentifier(`${trigger}_i`)}
274
+ AFTER INSERT ON ${physical} BEGIN
275
+ INSERT INTO _zsync_changes ("tableName", "op", "pk")
276
+ VALUES (${tableName}, 'row', json_object('before', NULL, 'after', ${rowObject('NEW')}));
277
+ END`);
278
+ await tx.exec(`CREATE TRIGGER ${quoteIdentifier(`${trigger}_u`)}
279
+ AFTER UPDATE ON ${physical} BEGIN
280
+ INSERT INTO _zsync_changes ("tableName", "op", "pk")
281
+ VALUES (${tableName}, 'row', json_object('before', ${rowObject('OLD')}, 'after', ${rowObject('NEW')}));
282
+ INSERT INTO _zsync_changes ("tableName", "op", "pk")
283
+ VALUES ('_zsync_meta', 'marker', NULL);
284
+ END`);
285
+ await tx.exec(`CREATE TRIGGER ${quoteIdentifier(`${trigger}_d`)}
286
+ AFTER DELETE ON ${physical} BEGIN
287
+ INSERT INTO _zsync_changes ("tableName", "op", "pk")
288
+ VALUES (${tableName}, 'row', json_object('before', ${rowObject('OLD')}, 'after', NULL));
289
+ END`);
290
+ }
291
+ }));
292
+ async function watermarkIn(tx) {
293
+ const rows = await tx.query('SELECT COALESCE(MAX("watermark"), 0) AS value FROM _zsync_changes');
294
+ return Number(rows[0].value);
295
+ }
296
+ async function floorIn(tx) {
297
+ const rows = await tx.query('SELECT floor FROM _zsync_meta');
298
+ return Number(rows[0].floor);
299
+ }
300
+ async function claimClient(tx, clientGroupID, clientID, userID) {
301
+ await tx.exec(`INSERT INTO _zsync_clients ("clientGroupID", "clientID", "lastMutationID", "userID")
302
+ SELECT ?, ?, 0, ?
303
+ WHERE NOT EXISTS (
304
+ SELECT 1 FROM _zsync_clients
305
+ WHERE "clientGroupID" = ? AND "userID" IS NOT NULL AND "userID" <> ?
306
+ )
307
+ ON CONFLICT ("clientGroupID", "clientID")
308
+ DO UPDATE SET "userID" = excluded."userID" WHERE "userID" IS NULL`, [clientGroupID, clientID, userID, clientGroupID, userID]);
309
+ const owners = await tx.query(`SELECT DISTINCT "userID" FROM _zsync_clients
310
+ WHERE "clientGroupID" = ? AND "userID" IS NOT NULL`, [clientGroupID]);
311
+ if (owners.some((owner) => owner.userID !== userID)) {
312
+ throw new ZeroHttpRequestError(403, 'client group belongs to a different user');
313
+ }
314
+ }
315
+ async function prune(tx) {
316
+ const cutoff = (await watermarkIn(tx)) - retainChanges;
317
+ if (cutoff <= (await floorIn(tx)))
318
+ return;
319
+ await tx.exec('DELETE FROM _zsync_changes WHERE "watermark" <= ?', [cutoff]);
320
+ await tx.exec('UPDATE _zsync_meta SET floor = ?', [cutoff]);
321
+ }
322
+ async function visibleRows(tx, table, userID) {
323
+ const filter = options.visible?.(table.logical, userID);
324
+ return filter
325
+ ? tx.query(`SELECT * FROM ${quoteIdentifier(table.physical)} WHERE ${filter.where}`, filter.params)
326
+ : tx.query(`SELECT * FROM ${quoteIdentifier(table.physical)}`);
327
+ }
328
+ async function snapshot(tx, userID) {
329
+ const patch = [{ op: 'clear' }];
330
+ for (const table of tableConfigs) {
331
+ for (const row of await visibleRows(tx, table, userID)) {
332
+ patch.push({
333
+ op: 'put',
334
+ tableName: table.physical,
335
+ value: Object.fromEntries(Object.values(table.columns).map((column) => [
336
+ column.physical,
337
+ toZeroValue(column.type, row[column.physical]),
338
+ ])),
339
+ });
340
+ }
341
+ }
342
+ return patch;
343
+ }
344
+ function loggedChanges(rows) {
345
+ return rows.map((row) => {
346
+ const table = String(row.tableName);
347
+ const config = tableByPhysical.get(table);
348
+ if (!config)
349
+ throw new Error(`unknown change-log table: ${table}`);
350
+ const value = JSON.parse(String(row.pk));
351
+ if (!isRecord(value) ||
352
+ !('before' in value) ||
353
+ !('after' in value) ||
354
+ (value.before !== null && !isRecord(value.before)) ||
355
+ (value.after !== null && !isRecord(value.after))) {
356
+ throw new Error(`invalid change-log row for table: ${table}`);
357
+ }
358
+ return {
359
+ table: config.logical,
360
+ before: value.before,
361
+ after: value.after,
362
+ };
363
+ });
364
+ }
365
+ async function changesSince(tx, cookie) {
366
+ return loggedChanges(await tx.query(`SELECT "tableName", "pk" FROM _zsync_changes
367
+ WHERE "watermark" > ? AND "op" = 'row'
368
+ ORDER BY "watermark"`, [cookie]));
369
+ }
370
+ async function diff(tx, changes, userID) {
371
+ const touched = new Map();
372
+ for (const change of changes) {
373
+ const config = tableByLogical.get(change.table);
374
+ if (!config)
375
+ throw new Error(`unknown change-log table: ${change.table}`);
376
+ for (const row of [change.before, change.after]) {
377
+ if (!row)
378
+ continue;
379
+ const pk = Object.fromEntries(config.primaryKey.map((column) => [column, row[column]]));
380
+ touched.set(`${config.physical} ${JSON.stringify(pk)}`, {
381
+ table: config.physical,
382
+ pk,
383
+ });
384
+ }
385
+ }
386
+ const patch = [];
387
+ for (const { table, pk } of touched.values()) {
388
+ const config = tableByPhysical.get(table);
389
+ if (!config)
390
+ throw new Error(`unknown change-log table: ${table}`);
391
+ const where = config.primaryKey
392
+ .map((column) => `${quoteIdentifier(config.columns[column].physical)} = ?`)
393
+ .join(' AND ');
394
+ const params = config.primaryKey.map((column) => pk[column]);
395
+ const filter = options.visible?.(config.logical, userID);
396
+ const row = (await tx.query(`SELECT * FROM ${quoteIdentifier(config.physical)} WHERE ${where}${filter ? ` AND (${filter.where})` : ''}`, filter ? [...params, ...filter.params] : params))[0];
397
+ if (!row) {
398
+ patch.push({
399
+ op: 'del',
400
+ tableName: config.physical,
401
+ id: Object.fromEntries(config.primaryKey.map((column) => [
402
+ config.columns[column].physical,
403
+ toZeroValue(config.columns[column].type, pk[column]),
404
+ ])),
405
+ });
406
+ }
407
+ else {
408
+ patch.push({
409
+ op: 'put',
410
+ tableName: config.physical,
411
+ value: Object.fromEntries(Object.values(config.columns).map((column) => [
412
+ column.physical,
413
+ toZeroValue(column.type, row[column.physical]),
414
+ ])),
415
+ });
416
+ }
417
+ }
418
+ return patch;
419
+ }
420
+ return {
421
+ executor,
422
+ ready: () => ready,
423
+ async watermark() {
424
+ await ready;
425
+ return applicationDatabase.transaction((tx) => watermarkIn(tx));
426
+ },
427
+ async invalidate() {
428
+ await ready;
429
+ await applicationDatabase.transaction(async (tx) => {
430
+ await tx.exec(`INSERT INTO _zsync_changes ("tableName", "op", "pk")
431
+ VALUES ('_zsync_meta', 'marker', NULL)`);
432
+ await tx.exec(`UPDATE _zsync_meta SET floor =
433
+ (SELECT COALESCE(MAX("watermark"), 0) FROM _zsync_changes)`);
434
+ });
435
+ },
436
+ async handlePull(value, authData) {
437
+ await ready;
438
+ const claims = authDataToClaims(authData);
439
+ const body = validatePull(value);
440
+ // acked in every response shape: the client clears its sent desired
441
+ // delta only on `gotQueries.version >= sentVersion`, including when the
442
+ // rows are unchanged.
443
+ const gotQueries = body.queries
444
+ ? { version: body.queries.version, patch: body.queries.patch }
445
+ : undefined;
446
+ return applicationDatabase.transaction(async (tx) => {
447
+ await claimClient(tx, body.clientGroupID, body.clientID, claims.userID);
448
+ await prune(tx);
449
+ const current = await watermarkIn(tx);
450
+ if (body.cookie !== null && body.cookie > current) {
451
+ throw new ZeroHttpRequestError(409, `future cookie ${body.cookie} is ahead of watermark ${current}`);
452
+ }
453
+ if (body.cookie === current) {
454
+ return { cookie: current, unchanged: true, gotQueries };
455
+ }
456
+ const lmids = Object.fromEntries((await tx.query(`SELECT "clientID", "lastMutationID" FROM _zsync_clients
457
+ WHERE "clientGroupID" = ?`, [body.clientGroupID])).map((row) => [String(row.clientID), Number(row.lastMutationID)]));
458
+ const canDiff = body.cookie !== null && body.cookie >= (await floorIn(tx));
459
+ const changes = canDiff ? await changesSince(tx, body.cookie) : [];
460
+ const mustReset = canDiff &&
461
+ options.visibilityInvalidation !== undefined &&
462
+ (await options.visibilityInvalidation.shouldReset({
463
+ transaction: tx,
464
+ userID: claims.userID,
465
+ changes,
466
+ }));
467
+ return {
468
+ cookie: current,
469
+ lastMutationIDChanges: lmids,
470
+ rowsPatch: canDiff && !mustReset
471
+ ? await diff(tx, changes, claims.userID)
472
+ : await snapshot(tx, claims.userID),
473
+ gotQueries,
474
+ };
475
+ });
476
+ },
477
+ async handlePush(value, authData) {
478
+ await ready;
479
+ const result = await executor.push(value, authDataToClaims(authData));
480
+ if ('mutations' in result.pushResponse &&
481
+ result.pushResponse.mutations.length > 0) {
482
+ await applicationDatabase.transaction((tx) => prune(tx));
483
+ }
484
+ return result;
485
+ },
486
+ };
487
+ }
488
+ const DATABASE_ROUTE = /^([A-Za-z0-9_-]{1,64})\/(pull|push)$/;
489
+ export function createZeroHttpMount(options) {
490
+ if (!options.pathPrefix.startsWith('/')) {
491
+ throw new TypeError('pathPrefix must start with /');
492
+ }
493
+ if (options.databaseID !== undefined &&
494
+ !/^[A-Za-z0-9_-]{1,64}$/.test(options.databaseID)) {
495
+ throw new TypeError('databaseID must contain 1-64 URL-safe characters');
496
+ }
497
+ const match = (pathname) => {
498
+ if (!pathname.startsWith(options.pathPrefix))
499
+ return null;
500
+ const suffix = pathname.slice(options.pathPrefix.length);
501
+ if (options.databaseID !== undefined) {
502
+ const operation = /^\/?(pull|push)$/.exec(suffix)?.[1];
503
+ return operation
504
+ ? { databaseID: options.databaseID, operation: operation }
505
+ : null;
506
+ }
507
+ const route = DATABASE_ROUTE.exec(suffix);
508
+ if (!route)
509
+ return null;
510
+ return {
511
+ databaseID: route[1],
512
+ operation: route[2],
513
+ };
514
+ };
515
+ const handle = (route, body, authData) => {
516
+ const server = options.server(route.databaseID);
517
+ return route.operation === 'pull'
518
+ ? server.handlePull(body, authData)
519
+ : server.handlePush(body, authData);
520
+ };
521
+ return {
522
+ match,
523
+ handle,
524
+ async handleRequest(request) {
525
+ const route = match(new URL(request.url).pathname);
526
+ if (!route)
527
+ return null;
528
+ if (request.method !== 'POST') {
529
+ return new Response('method not allowed', { status: 405 });
530
+ }
531
+ let bodyText = '';
532
+ try {
533
+ bodyText = await request.text();
534
+ let body;
535
+ try {
536
+ body = JSON.parse(bodyText);
537
+ }
538
+ catch {
539
+ throw new ZeroHttpRequestError(400, `invalid ${route.operation} body`);
540
+ }
541
+ const authenticated = await options.authenticate(request, route);
542
+ if (authenticated instanceof Response)
543
+ return authenticated;
544
+ if (route.operation === 'push' && options.beforePush) {
545
+ const response = await options.beforePush(request, bodyText);
546
+ if (response)
547
+ return response;
548
+ }
549
+ const server = options.server(route.databaseID);
550
+ const result = route.operation === 'pull'
551
+ ? await server.handlePull(body, authenticated)
552
+ : await server.handlePush(body, authenticated);
553
+ if (route.operation === 'push') {
554
+ await reportPushDiagnostics(options.diagnostics, {
555
+ request,
556
+ bodyText,
557
+ response: result.pushResponse,
558
+ });
559
+ }
560
+ return Response.json(result, {
561
+ headers: route.operation === 'pull' ? { 'cache-control': 'no-store' } : undefined,
562
+ });
563
+ }
564
+ catch (error) {
565
+ const status = error instanceof ZeroHttpRequestError ||
566
+ error instanceof SyncExecutorRequestError
567
+ ? error.status
568
+ : 500;
569
+ if (route.operation === 'push') {
570
+ await reportPushDiagnostics(options.diagnostics, {
571
+ request,
572
+ bodyText,
573
+ error,
574
+ status,
575
+ });
576
+ }
577
+ if (error instanceof ZeroHttpRequestError ||
578
+ error instanceof SyncExecutorRequestError) {
579
+ return Response.json({ error: error.message }, { status: error.status });
580
+ }
581
+ // an opaque "internal error" here is unrecoverable to debug: the client
582
+ // sees a bare 500 and the cause lives only in whichever process ran the
583
+ // mount. name the route and carry the message back so a failing sync is
584
+ // diagnosable from the caller's side.
585
+ console.error(`[zero-http] ${route.operation} error (databaseID=${route.databaseID})`, error);
586
+ return Response.json({
587
+ error: error instanceof Error ? error.message : String(error),
588
+ operation: route.operation,
589
+ }, { status: 500 });
590
+ }
591
+ },
592
+ };
593
+ }
594
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/zero-http/mount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAA;AAsB3B,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAElC;IADX,YACW,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHL,WAAM,GAAN,MAAM,CAAQ;QAIvB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,QAAyB;IACjD,MAAM,MAAM,GAA8B,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,MAAM,EAAE,CAAA;IAC5E,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAgC,CAAA;IAChE,OAAO,MAA0B,CAAA;AACnC,CAAC;AA6BD,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,EAAkB,EAClB,WAA2E;IAE3E,MAAM,EAAE,GAA2B;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE;YACzB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACpB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;QACvB,CAAC;QACD,KAAK,CAAC,KAAK,CACT,GAAW,EACX,SAA6B,EAAE;YAE/B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAU,CAAA;QACrC,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QAC1E,CAAC;KACF,CAAA;IAED,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;IAC5B,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,KAAK,CAAC,WAAW,CACf,IAAuE;YAEvE,IAAI,WAAW;gBAAE,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAA;YACrB,IAAI,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;YACtB,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,OAAO,GAAG,OAAO,CAAA;YACnB,CAAC,CAAC,CAAA;YACF,MAAM,QAAQ,CAAA;YACd,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAChB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC7B,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACjB,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACnB,MAAM,KAAK,CAAA;YACb,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CACT,GAAW,EACX,SAA6B,EAAE;YAE/B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAU,CAAA;QACrC,CAAC;KACF,CAAA;AACH,CAAC;AAkBD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,2EAA2E;AAC3E,wEAAwE;AACxE,4EAA4E;AAC5E,8EAA8E;AAC9E,eAAe;AACf,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;QACpC,KAAK,CAAC,OAAO,GAAG,CAAC;QACjB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAC3B,CAAC;QACD,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;QAC9E,IAAI,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAC7B,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;YACpB,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAC/B,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;gBACnC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EACtB,CAAC;QACD,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClD,OAAO,EAAE,GAAI,KAAmC,EAAE,OAAO,EAAE,CAAA;AAC7D,CAAC;AAED,yEAAyE;AACzE,uEAAuE;AACvE,sEAAsE;AACtE,yEAAyE;AACzE,yEAAyE;AACzE,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAY;IACpD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAClD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAA;QACxC,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,CAAA;IAClE,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAA;QAC5C,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,SAAS,CAAA;QACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,gCAAgC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACtE,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,8EAA8E;AAC9E,+DAA+D;AAC/D,0EAA0E;AAC1E,oCAAoC;AACpC,SAAS,sBAAsB,CAAC,KAAa;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAA;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IACvD,IAAI,UAAU,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;IAC3D,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,UAAU,IAAI,KAAK,CAAA;SACjD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,UAAU,IAAI,GAAG,CAAA;IACtE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAmB,OAY1D;IACC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAA;IACnD,MAAM,YAAY,GAAG,MAAqC,CAAA;IAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAe,EAAE;QACvD,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,SAAS,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAA;QAClE,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,IAAI,IAAI,OAAO;YAC/D,OAAO,EAAE,MAAM,CAAC,WAAW,CACzB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;gBACzD,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBAChD,IAAI,CAAC,YAAY;oBAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,OAAO,IAAI,MAAM,EAAE,CAAC,CAAA;gBAC9E,OAAO;oBACL,MAAM;oBACN,EAAE,QAAQ,EAAE,YAAY,CAAC,UAAU,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;iBACjE,CAAA;YACH,CAAC,CAAC,CACH;YACD,UAAU,EAAE,WAAW,CAAC,UAAU;SACnC,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACnF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACrF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAC3C,OAAO,CAAC,sBAAsB,EAAE,OAAO,IAAI,EAAE,CAC9C,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,SAAS,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAA;QAC9E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,SAAS,CACjB,iDAAiD,KAAK,IAAI,MAAM,EAAE,CACnE,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,QAAQ,EAAE,mBAAmB;QAC7B,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC,CAAA;IAEF,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,2DAA2D;IAC3D,MAAM,KAAK,GAAG,QAAQ;SACnB,IAAI,CACH,EAAE,aAAa,EAAE,qBAAqB,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EACvE,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAClC;SACA,IAAI,CAAC,GAAG,EAAE,CACT,mBAAmB,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC3C,MAAM,EAAE,CAAC,IAAI,CAAC;;;;QAId,CAAC,CAAA;QACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,KAAK,CAChC,mDAAmD,CACpD,CAAA;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,IAAI,CACX,2EAA2E,CAC5E,CAAA;QACH,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CACX;uCAC6B,CAC9B,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B,oDAAoD,CACrD,CAAA;QACD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;YACvB,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa;gBAC3C,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,CAAC,CAAC,CAAC,CAAA;YACL,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC;gBACtC,eAAe,GAAG,CAAC;gBACnB,eAAe,IAAI,MAAM,CAAC,gBAAgB,EAC1C,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC,2BAA2B,eAAe,EAAE,CAAC,CAAA;YACnE,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;YACjE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,EAAE,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAA;gBAC1B,MAAM,EAAE,CAAC,IAAI,CACX;yDAC2C,EAC3C,CAAC,KAAK,CAAC,CACR,CAAA;gBACD,MAAM,EAAE,CAAC,IAAI,CACX,kEAAkE,EAClE,CAAC,KAAK,CAAC,CACR,CAAA;YACH,CAAC;QACH,CAAC;QACD,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,KAAK,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CACzE,CACF,CAAA;QACD,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,KAAK,CAItC;;yBAEe,CAChB,CAAA;QACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CACjD,CAAA;QACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,CACE,MAAM,EAAE,CAAC,KAAK,CACZ;oCACoB,CACrB,CACF,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAC9B,CAAA;YACD,KAAK,MAAM,SAAS,IAAI,IAAI,GAAG,CAC7B,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACpD,EAAE,CAAC;gBACF,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CACV,8BAA8B,SAAS,sJAAsJ,CAC9L,CAAA;gBACH,CAAC;YACH,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC,IAAI,CAAC,0BAA0B,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG;gBACd,GAAG,IAAI,GAAG,CAAC;oBACT,GAAG,KAAK,CAAC,UAAU;oBACnB,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;iBAClE,CAAC;aACH,CAAA;YACD,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,EAAE,CACvC,eAAe,OAAO;iBACnB,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC,QAAQ,CAAC,EAAE,CACxF;iBACA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;YAClB,MAAM,OAAO,GAAG,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAA;YAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAChD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC9C,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,EAAE,CAAC,IAAI,CACX,0BAA0B,eAAe,CAAC,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC,EAAE,CACpE,CAAA;YACH,CAAC;YACD,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,eAAe,CAAC,GAAG,OAAO,IAAI,CAAC;4BAC7C,QAAQ;;oBAEhB,SAAS,iDAAiD,SAAS,CAAC,KAAK,CAAC;YAClF,CAAC,CAAA;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,eAAe,CAAC,GAAG,OAAO,IAAI,CAAC;4BAC7C,QAAQ;;oBAEhB,SAAS,kCAAkC,SAAS,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,KAAK,CAAC;;;YAGjG,CAAC,CAAA;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,eAAe,CAAC,GAAG,OAAO,IAAI,CAAC;4BAC7C,QAAQ;;oBAEhB,SAAS,kCAAkC,SAAS,CAAC,KAAK,CAAC;YACnE,CAAC,CAAA;QACL,CAAC;IACH,CAAC,CAAC,CACH,CAAA;IAEH,KAAK,UAAU,WAAW,CAAC,EAA0B;QACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CACzB,mEAAmE,CACpE,CAAA;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,UAAU,OAAO,CAAC,EAA0B;QAC/C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,UAAU,WAAW,CACxB,EAA0B,EAC1B,aAAqB,EACrB,QAAgB,EAChB,MAAc;QAEd,MAAM,EAAE,CAAC,IAAI,CACX;;;;;;;yEAOmE,EACnE,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CACzD,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;0DACoD,EACpD,CAAC,aAAa,CAAC,CAChB,CAAA;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,0CAA0C,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED,KAAK,UAAU,KAAK,CAAC,EAA0B;QAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAA;QACtD,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;YAAE,OAAM;QACzC,MAAM,EAAE,CAAC,IAAI,CAAC,mDAAmD,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;QAC5E,MAAM,EAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,UAAU,WAAW,CACxB,EAA0B,EAC1B,KAAkB,EAClB,MAAc;QAEd,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,OAAO,MAAM;YACX,CAAC,CAAC,EAAE,CAAC,KAAK,CACN,iBAAiB,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,EACxE,MAAM,CAAC,MAAM,CACd;YACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,UAAU,QAAQ,CACrB,EAA0B,EAC1B,MAAc;QAEd,MAAM,KAAK,GAAc,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,MAAM,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,KAAK;oBACT,SAAS,EAAE,KAAK,CAAC,QAAQ;oBACzB,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC3C,MAAM,CAAC,QAAQ;wBACf,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;qBAC/C,CAAC,CACH;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,SAAS,aAAa,CACpB,IAAwC;QAExC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACnC,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACzC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAY,CAAA;YACnD,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAChB,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC;gBACpB,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;gBACnB,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClD,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAChD,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,OAAO;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,UAAU,YAAY,CACzB,EAA0B,EAC1B,MAAc;QAEd,OAAO,aAAa,CAClB,MAAM,EAAE,CAAC,KAAK,CACZ;;8BAEsB,EACtB,CAAC,MAAM,CAAC,CACT,CACF,CAAA;IACH,CAAC;IAED,KAAK,UAAU,IAAI,CACjB,EAA0B,EAC1B,OAA4C,EAC5C,MAAc;QAEd,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0D,CAAA;QACjF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACzE,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG;oBAAE,SAAQ;gBAClB,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAC3B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CACzD,CAAA;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE;oBACtD,KAAK,EAAE,MAAM,CAAC,QAAQ;oBACtB,EAAE;iBACH,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAc,EAAE,CAAA;QAC3B,KAAK,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACzC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU;iBAC5B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;iBAC3E,IAAI,CAAC,OAAO,CAAC,CAAA;YAChB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACxD,MAAM,GAAG,GAAG,CACV,MAAM,EAAE,CAAC,KAAK,CACZ,iBAAiB,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,GAC9D,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EACtC,EAAE,EACF,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAChD,CACF,CAAC,CAAC,CAAC,CAAA;YACJ,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,KAAK;oBACT,SAAS,EAAE,MAAM,CAAC,QAAQ;oBAC1B,EAAE,EAAE,MAAM,CAAC,WAAW,CACpB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;wBAChC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC,QAAQ;wBAChC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;qBACtD,CAAC,CACH;iBACF,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,KAAK;oBACT,SAAS,EAAE,MAAM,CAAC,QAAQ;oBAC1B,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC5C,MAAM,CAAC,QAAQ;wBACf,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;qBAC/C,CAAC,CACH;iBACF,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO;QACL,QAAQ;QACR,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,KAAK,CAAC,SAAS;YACb,MAAM,KAAK,CAAA;YACX,OAAO,mBAAmB,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;QACjE,CAAC;QACD,KAAK,CAAC,UAAU;YACd,MAAM,KAAK,CAAA;YACX,MAAM,mBAAmB,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBACjD,MAAM,EAAE,CAAC,IAAI,CACX;kDACwC,CACzC,CAAA;gBACD,MAAM,EAAE,CAAC,IAAI,CACX;sEAC4D,CAC7D,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,KAAc,EAAE,QAAyB;YACxD,MAAM,KAAK,CAAA;YACX,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YACzC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAChC,oEAAoE;YACpE,wEAAwE;YACxE,sBAAsB;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO;gBAC7B,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;gBAC9D,CAAC,CAAC,SAAS,CAAA;YACb,OAAO,mBAAmB,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClD,MAAM,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;gBACvE,MAAM,KAAK,CAAC,EAAE,CAAC,CAAA;gBACf,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAA;gBACrC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBAClD,MAAM,IAAI,oBAAoB,CAC5B,GAAG,EACH,iBAAiB,IAAI,CAAC,MAAM,0BAA0B,OAAO,EAAE,CAChE,CAAA;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;gBACzD,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,CACE,MAAM,EAAE,CAAC,KAAK,CACZ;yCAC2B,EAC3B,CAAC,IAAI,CAAC,aAAa,CAAC,CACrB,CACF,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CACnE,CAAA;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;gBACnE,MAAM,SAAS,GACb,OAAO;oBACP,OAAO,CAAC,sBAAsB,KAAK,SAAS;oBAC5C,CAAC,MAAM,OAAO,CAAC,sBAAsB,CAAC,WAAW,CAAC;wBAChD,WAAW,EAAE,EAAE;wBACf,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,OAAO;qBACR,CAAC,CAAC,CAAA;gBACL,OAAO;oBACL,MAAM,EAAE,OAAO;oBACf,qBAAqB,EAAE,KAAK;oBAC5B,SAAS,EACP,OAAO,IAAI,CAAC,SAAS;wBACnB,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;wBACxC,CAAC,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;oBACvC,UAAU;iBACX,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,KAAc,EAAE,QAAyB;YACxD,MAAM,KAAK,CAAA;YACX,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;YACrE,IACE,WAAW,IAAI,MAAM,CAAC,YAAY;gBAClC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EACxC,CAAC;gBACD,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1D,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAYD,MAAM,cAAc,GAAG,sCAAsC,CAAA;AAE7D,MAAM,UAAU,mBAAmB,CAAC,OAanC;IACC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAA;IACrD,CAAC;IACD,IACE,OAAO,CAAC,UAAU,KAAK,SAAS;QAChC,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACjD,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACzE,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAwB,EAAE;QACvD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACxD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtD,OAAO,SAAS;gBACd,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,SAA8B,EAAE;gBAC/E,CAAC,CAAC,IAAI,CAAA;QACV,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE;YACrB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAuB;SAC1C,CAAA;IACH,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAE,IAAa,EAAE,QAAyB,EAAE,EAAE;QAChF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/C,OAAO,KAAK,CAAC,SAAS,KAAK,MAAM;YAC/B,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;YACnC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,OAAO;QACL,KAAK;QACL,MAAM;QACN,KAAK,CAAC,aAAa,CAAC,OAAgB;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;YAClD,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAA;YACvB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;YAED,IAAI,QAAQ,GAAG,EAAE,CAAA;YACjB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC/B,IAAI,IAAa,CAAA;gBACjB,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,oBAAoB,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,SAAS,OAAO,CAAC,CAAA;gBACxE,CAAC;gBAED,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAChE,IAAI,aAAa,YAAY,QAAQ;oBAAE,OAAO,aAAa,CAAA;gBAE3D,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAC5D,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAA;gBAC/B,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;gBAC/C,MAAM,MAAM,GACV,KAAK,CAAC,SAAS,KAAK,MAAM;oBACxB,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC;oBAC9C,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;gBAClD,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;oBAC/B,MAAM,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC/C,OAAO;wBACP,QAAQ;wBACR,QAAQ,EAAG,MAAqB,CAAC,YAAY;qBAC9C,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;oBAC3B,OAAO,EACL,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;iBAC3E,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GACV,KAAK,YAAY,oBAAoB;oBACrC,KAAK,YAAY,wBAAwB;oBACvC,CAAC,CAAC,KAAK,CAAC,MAAM;oBACd,CAAC,CAAC,GAAG,CAAA;gBACT,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;oBAC/B,MAAM,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC/C,OAAO;wBACP,QAAQ;wBACR,KAAK;wBACL,MAAM;qBACP,CAAC,CAAA;gBACJ,CAAC;gBACD,IACE,KAAK,YAAY,oBAAoB;oBACrC,KAAK,YAAY,wBAAwB,EACzC,CAAC;oBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1E,CAAC;gBACD,wEAAwE;gBACxE,wEAAwE;gBACxE,wEAAwE;gBACxE,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CACX,eAAe,KAAK,CAAC,SAAS,sBAAsB,KAAK,CAAC,UAAU,GAAG,EACvE,KAAK,CACN,CAAA;gBACD,OAAO,QAAQ,CAAC,IAAI,CAClB;oBACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAA;YACH,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}