@moyodb/sdk 1.4.0 → 1.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.
Files changed (36) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/browser-worker-p7uX85l-.js +4 -0
  3. package/dist/assets/browser-worker-p7uX85l-.js.map +1 -0
  4. package/dist/assets/shared-worker-BALTqEUe.js +2 -0
  5. package/dist/assets/shared-worker-BALTqEUe.js.map +1 -0
  6. package/dist/chunks/{indexing-B0duqlUs.js → indexing-DdpU69Fd.js} +302 -69
  7. package/dist/chunks/{indexing-B0duqlUs.js.map → indexing-DdpU69Fd.js.map} +1 -1
  8. package/dist/codec.d.ts.map +1 -1
  9. package/dist/compression.d.ts.map +1 -1
  10. package/dist/engine/README.md +2 -2
  11. package/dist/engine/moyodb_engine.d.ts +2 -2
  12. package/dist/engine/moyodb_engine.js +22 -22
  13. package/dist/engine/moyodb_engine_bg.wasm +0 -0
  14. package/dist/engine/moyodb_engine_bg.wasm.d.ts +2 -2
  15. package/dist/engine/package.json +1 -1
  16. package/dist/engine/snippets/{moyodb-engine-1d53039816cbc2f7 → moyodb-engine-1f8134232168280b}/js/opfs_shim.js +8 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/indexing.d.ts +7 -0
  19. package/dist/indexing.d.ts.map +1 -1
  20. package/dist/moyodb-sdk.js +1329 -931
  21. package/dist/moyodb-sdk.js.map +1 -1
  22. package/dist/node-engine.js +382 -47
  23. package/dist/node-engine.js.map +1 -1
  24. package/dist/node.js +332 -44
  25. package/dist/node.js.map +1 -1
  26. package/dist/registry.d.ts.map +1 -1
  27. package/dist/subscriptions.d.ts.map +1 -1
  28. package/dist/worker-client.d.ts.map +1 -1
  29. package/dist/worker-server.d.ts.map +1 -1
  30. package/dist/worker.d.ts +10 -3
  31. package/dist/worker.d.ts.map +1 -1
  32. package/package.json +2 -1
  33. package/dist/assets/browser-worker-Bj2ErRvC.js +0 -4
  34. package/dist/assets/browser-worker-Bj2ErRvC.js.map +0 -1
  35. package/dist/assets/shared-worker-CMeTcusa.js +0 -2
  36. package/dist/assets/shared-worker-CMeTcusa.js.map +0 -1
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":[],"sources":["../src/worker-client.ts","../src/registry.ts","../src/change-events.ts","../src/subscriptions.ts","../src/records.ts","../src/sql-types.ts","../src/sql-parser.ts","../src/sql.ts","../src/index.ts","../src/node-worker-client.ts","../src/node-storage.mjs","../src/node.ts"],"sourcesContent":["import type {\n AutocommitCommand,\n IndexScanPage,\n WorkerApi,\n WorkerOpenRequest,\n WorkerScanPage,\n WorkerScanPageRequest\n} from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DebugFailpoint,\n DbStats,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_REQUEST,\n WORKER_PROTOCOL_REQUEST_BATCH,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n deserializeWorkerError,\n decodeWorkerResponsePayload,\n isWorkerProtocolReadyMessage,\n isWorkerProtocolReadyEnvelope,\n isWorkerProtocolResponseBatchMessage,\n isWorkerProtocolResponseMessage,\n prepareWorkerCommandPayload,\n workerProtocolError,\n type AutocommitArgs,\n type WorkerCommand,\n type WorkerCommandArgs,\n type WorkerCommandResult,\n type WorkerProtocolRequestBatchMessage,\n type WorkerProtocolRequestMessage\n} from './worker-protocol';\nimport { clampTimerDelayMs, isRecord } from './internal';\n\ninterface PendingRequest {\n /** Response command; autocommit replies use the inner command's format. */\n command: WorkerCommand;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout> | null;\n}\n\ninterface QueuedRequest {\n message: WorkerProtocolRequestMessage;\n transfer: Transferable[];\n byteLength: number;\n}\n\nfunction clearPendingTimeout(pending: PendingRequest): void {\n if (pending.timeout) {\n clearTimeout(pending.timeout);\n pending.timeout = null;\n }\n}\n\nexport interface WorkerProtocolClientOptions {\n requestTimeoutMs?: number;\n readyTimeoutMs?: number;\n /** Keeps scan packets packed when relaying through SharedWorker. */\n forwardScanPackets?: boolean;\n}\n\nexport interface WorkerTransport {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n}\n\nexport interface WorkerClient extends WorkerApi {\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>>;\n request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>>;\n setFatalHandler(handler: ((error: Error) => void) | null): void;\n whenReady(): Promise<void>;\n dispose(reason?: Error): void;\n acquireMigration?(): Promise<void>;\n releaseMigration?(): Promise<void>;\n setTransactionsInvalidatedHandler?(handler: (() => void) | null): void;\n crash?(): void;\n}\n\nexport class WorkerProtocolClient implements WorkerApi {\n private nextRequestId = 1;\n private pending = new Map<number, PendingRequest>();\n private closed = false;\n private readyResolved = false;\n private readyResolve: (() => void) | null = null;\n private readyReject: ((error: Error) => void) | null = null;\n private ready: Promise<void>;\n private requestTimeoutMs: number;\n private fatalHandler: ((error: Error) => void) | null = null;\n private closeReason: Error | null = null;\n private batching = false;\n private queuedRequests: QueuedRequest[] = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private awaitingReady = 0;\n private readyTimeout: ReturnType<typeof setTimeout> | null = null;\n private forwardScanPackets: boolean;\n\n constructor(\n private readonly worker: WorkerTransport,\n options: WorkerProtocolClientOptions = {}\n ) {\n this.forwardScanPackets = options.forwardScanPackets === true;\n this.requestTimeoutMs = clampTimerDelayMs(options.requestTimeoutMs ?? 0);\n this.ready = new Promise<void>((resolve, reject) => {\n this.readyResolve = resolve;\n this.readyReject = reject;\n });\n const readyTimeoutMs = clampTimerDelayMs(options.readyTimeoutMs ?? 0);\n if (readyTimeoutMs > 0) {\n this.readyTimeout = setTimeout(() => {\n this.fail(workerProtocolError('WorkerReadyTimeoutError', 'worker did not become ready'));\n }, readyTimeoutMs);\n }\n void this.ready.catch(() => undefined);\n this.worker.addEventListener('message', this.handleMessage as EventListener);\n this.worker.addEventListener('messageerror', this.handleMessageError);\n this.worker.addEventListener('error', this.handleError as EventListener);\n }\n\n setFatalHandler(handler: ((error: Error) => void) | null): void {\n this.fatalHandler = handler;\n }\n\n whenReady(): Promise<void> {\n return this.ready;\n }\n\n dispose(reason: Error = workerProtocolError('WorkerTerminatedError', 'worker transport was closed')): void {\n this.disposeInternal(reason, false);\n }\n\n protected fail(reason: Error): void {\n this.disposeInternal(reason, true);\n }\n\n open(request: WorkerOpenRequest): Promise<void> {\n return this.request('open', [request]);\n }\n\n close(): Promise<void> {\n return this.request('close', []);\n }\n\n destroy(): Promise<void> {\n return this.request('destroy', []);\n }\n\n deleteDB(dbName: string): Promise<void> {\n return this.request('deleteDB', [dbName]);\n }\n\n begin(mode: TxMode): Promise<number> {\n return this.request('begin', [mode]);\n }\n\n commit(txId: number): Promise<number> {\n return this.request('commit', [txId]);\n }\n\n rollback(txId: number): Promise<void> {\n return this.request('rollback', [txId]);\n }\n\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>> {\n return this.send('autocommit', [mode, command, args as unknown[]], command) as Promise<WorkerCommandResult<M>>;\n }\n\n createStore(txId: number, name: string, options?: CreateStoreOptions): Promise<void> {\n return this.request('createStore', [txId, name, options]);\n }\n\n dropStore(txId: number, name: string): Promise<void> {\n return this.request('dropStore', [txId, name]);\n }\n\n clearStore(txId: number, name: string): Promise<void> {\n return this.request('clearStore', [txId, name]);\n }\n\n get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('get', [txId, store, key]);\n }\n\n getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.request('getMany', [txId, store, keys]);\n }\n\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('has', [txId, store, key]);\n }\n\n put(txId: number, store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n return this.request('put', [txId, store, key, value, options]);\n }\n\n putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options?: PutOptions\n ): Promise<void> {\n return this.request('putMany', [txId, store, entries, options]);\n }\n\n delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('delete', [txId, store, key]);\n }\n\n deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n return this.request('deleteMany', [txId, store, keys]);\n }\n\n applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n return this.request('applyBatch', [txId, store, ops]);\n }\n\n scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.request('scan', [txId, store, range]);\n }\n\n scanPage(request: WorkerScanPageRequest): Promise<WorkerScanPage> {\n return this.request('scanPage', [request]);\n }\n\n closeCursor(cursorId: number): Promise<void> {\n return this.request('closeCursor', [cursorId]);\n }\n\n getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('getByIndex', [txId, store, indexName, key]);\n }\n\n scanByIndex(txId: number, store: string, indexName: string, range: Range): Promise<ScanItem[]> {\n return this.request('scanByIndex', [txId, store, indexName, range]);\n }\n\n scanByIndexPage(\n txId: number,\n store: string,\n indexName: string,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes?: number\n ): Promise<IndexScanPage> {\n return this.request('scanByIndexPage', [txId, store, indexName, range, cursor, limit, maxBytes]);\n }\n\n getIndexes(txId?: number): Promise<IndexDef[]> {\n return this.request('getIndexes', txId === undefined ? [] : [txId]);\n }\n\n reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n return this.request('reconcileIndexes', [txId, indexes]);\n }\n\n listStores(): Promise<string[]> {\n return this.request('listStores', []);\n }\n\n getVersion(): Promise<number> {\n return this.request('getVersion', []);\n }\n\n changesSince(txId: number, options: ChangeFeedOptions): Promise<ChangeFeed> {\n return this.request('changesSince', [txId, options]);\n }\n\n setSchemaVersion(txId: number, version: number): Promise<void> {\n return this.request('setSchemaVersion', [txId, version]);\n }\n\n exportSnapshot(options?: ExportSnapshotOptions): Promise<Uint8Array> {\n return this.request('exportSnapshot', [options]);\n }\n\n importSnapshot(data: Uint8Array): Promise<void> {\n return this.request('importSnapshot', [data]);\n }\n\n reset(): Promise<void> {\n return this.request('reset', []);\n }\n\n compact(): Promise<CompactionResult> {\n return this.request('compact', []);\n }\n\n rebuild(): Promise<CompactionResult> {\n return this.request('rebuild', []);\n }\n\n stats(): Promise<DbStats> {\n return this.request('stats', []);\n }\n\n storageInfo(): Promise<StorageInfo> {\n return this.request('storageInfo', []);\n }\n\n requestPersistence(): Promise<boolean> {\n return this.request('requestPersistence', []);\n }\n\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.request('setFailpoint', [failpoint]);\n }\n\n async request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>> {\n return (await this.send(command, args, command)) as WorkerCommandResult<M>;\n }\n\n private async send<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>,\n responseCommand: WorkerCommand\n ): Promise<unknown> {\n this.ensureOpen();\n this.awaitingReady += 1;\n try {\n await this.ready;\n } finally {\n this.awaitingReady -= 1;\n }\n this.ensureOpen();\n // Calls awaiting readiness together can share a batch. A lone call posts immediately.\n const shouldQueue = this.batching && (this.awaitingReady > 0 || this.queuedRequests.length > 0);\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const prepared = prepareWorkerCommandPayload(command, args);\n const message: WorkerProtocolRequestMessage = {\n type: WORKER_PROTOCOL_REQUEST,\n version: WORKER_PROTOCOL_VERSION,\n id,\n command,\n args: prepared.args\n } as WorkerProtocolRequestMessage;\n return await new Promise<unknown>((resolve, reject) => {\n const timeout =\n this.requestTimeoutMs > 0\n ? setTimeout(() => {\n const current = this.pending.get(id);\n if (!current || current.timeout === null) {\n return;\n }\n this.pending.delete(id);\n current.timeout = null;\n reject(\n workerProtocolError(\n 'WorkerRequestTimeoutError',\n `worker command ${command} timed out after ${this.requestTimeoutMs}ms`\n )\n );\n }, this.requestTimeoutMs)\n : null;\n this.pending.set(id, {\n command: responseCommand,\n resolve: (value) => resolve(value),\n reject,\n timeout\n });\n try {\n if (shouldQueue) {\n this.queueRequest(message, prepared.transfer);\n } else if (prepared.transfer.length > 0) {\n this.worker.postMessage(message, prepared.transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n this.rejectPending(id, error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private queueRequest(message: WorkerProtocolRequestMessage, transfer: Transferable[]): void {\n const captured = captureWorkerPayload(message, transfer);\n if (!this.pending.has(message.id)) return;\n if (this.queuedRequests.length > 0 && this.queuedBytes + captured.byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flushRequests();\n }\n this.queuedRequests.push({\n message: captured.value,\n transfer: captured.transfer,\n byteLength: captured.byteLength\n });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.flushScheduled = false;\n this.flushRequests();\n });\n }\n if (this.queuedRequests.length >= MAX_WORKER_BATCH_MESSAGES || this.queuedBytes >= MAX_WORKER_BATCH_BYTES) {\n this.flushRequests();\n }\n }\n\n private flushRequests(): void {\n const queued = this.queuedRequests;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n if (this.closed) return;\n const active = queued.filter((entry) => this.pending.has(entry.message.id));\n if (active.length === 0) return;\n const message: WorkerProtocolRequestMessage | WorkerProtocolRequestBatchMessage =\n active.length === 1\n ? active[0].message\n : {\n type: WORKER_PROTOCOL_REQUEST_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n requests: active.map((entry) => entry.message)\n };\n const transfer: Transferable[] = [];\n for (const entry of active) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n try {\n if (transfer.length > 0) {\n this.worker.postMessage(message, transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n const reason = error instanceof Error ? error : new Error(String(error));\n for (const entry of active) this.rejectPending(entry.message.id, reason);\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw this.closeReason ?? workerProtocolError('WorkerTerminatedError', 'worker transport is closed');\n }\n }\n\n private handleMessage = (event: MessageEvent<unknown>): void => {\n const data = event.data;\n if (isWorkerProtocolReadyMessage(data)) {\n if (this.readyResolved) return;\n this.batching = data.batching === 1;\n this.readyResolved = true;\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n this.readyResolve?.();\n this.readyResolve = null;\n this.readyReject = null;\n return;\n }\n if (isWorkerProtocolReadyEnvelope(data)) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol ready message'));\n return;\n }\n if (\n isRecord(data) &&\n (data.type === WORKER_PROTOCOL_RESPONSE || data.type === WORKER_PROTOCOL_RESPONSE_BATCH) &&\n data.version !== WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol response'));\n return;\n }\n if (isWorkerProtocolResponseBatchMessage(data)) {\n for (const response of data.responses) this.handleResponse(response);\n return;\n }\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE_BATCH &&\n data.version === WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'invalid worker response batch'));\n return;\n }\n this.handleResponse(data);\n };\n\n private handleResponse(data: unknown): void {\n if (!isWorkerProtocolResponseMessage(data)) {\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE &&\n data.version === WORKER_PROTOCOL_VERSION &&\n typeof data.id === 'number' &&\n Number.isSafeInteger(data.id)\n ) {\n this.rejectPending(data.id, workerProtocolError('WorkerProtocolError', 'invalid worker response'));\n }\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n clearPendingTimeout(pending);\n try {\n if (data.ok) {\n pending.resolve(\n this.forwardScanPackets &&\n (pending.command === 'scanPage' ||\n pending.command === 'scan' ||\n pending.command === 'scanByIndex' ||\n pending.command === 'scanByIndexPage')\n ? data.result\n : decodeWorkerResponsePayload(pending.command, data.result)\n );\n } else {\n pending.reject(deserializeWorkerError(data.error));\n }\n } catch (error) {\n pending.reject(\n error instanceof Error && error.name === 'WorkerProtocolError'\n ? error\n : workerProtocolError('WorkerProtocolError', 'worker response could not be decoded')\n );\n }\n }\n\n private handleMessageError = (): void => {\n this.fail(workerProtocolError('WorkerMessageError', 'worker message could not be deserialized'));\n };\n\n private handleError = (event: ErrorEvent): void => {\n const error =\n event.error instanceof Error\n ? event.error\n : workerProtocolError('WorkerError', event.message || 'worker runtime failed');\n this.fail(error);\n };\n\n private rejectPending(id: number, error: Error): void {\n const pending = this.pending.get(id);\n if (!pending) {\n return;\n }\n this.pending.delete(id);\n clearPendingTimeout(pending);\n pending.reject(error);\n }\n\n private disposeInternal(reason: Error, notifyFatal: boolean): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n this.worker.removeEventListener('message', this.handleMessage as EventListener);\n this.worker.removeEventListener('messageerror', this.handleMessageError);\n this.worker.removeEventListener('error', this.handleError as EventListener);\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n if (!this.readyResolved) {\n this.readyReject?.(reason);\n }\n this.readyResolve = null;\n this.readyReject = null;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n for (const pending of this.pending.values()) {\n clearPendingTimeout(pending);\n pending.reject(reason);\n }\n this.pending.clear();\n if (notifyFatal) {\n this.fatalHandler?.(reason);\n }\n }\n}\n","import { WorkerProtocolClient, type WorkerClient, type WorkerTransport } from './worker-client';\nimport { SharedWorkerProtocolClient } from './shared-worker-client';\nimport type { ChangeFeedSettings, DebugFailpoint, OpenOptions } from './types';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n UnsupportedPlatformError,\n normalizeError\n} from './errors';\nimport { isRecord, withTimeout } from './internal';\nconst VALID_FAILPOINTS = new Set<Exclude<DebugFailpoint, null>>([\n 'after_wal_flush',\n 'after_main_flush',\n 'before_superblock_flush'\n]);\nconst PERSISTENCE_BRIDGE_INIT = 'moyodb:persistence-bridge:init';\nconst PERSISTENCE_BRIDGE_REQUEST = 'moyodb:persistence-bridge:request';\nconst PERSISTENCE_BRIDGE_RESPONSE = 'moyodb:persistence-bridge:response';\ntype PersistenceBridgeOperation = 'persist' | 'persisted';\ninterface PersistenceBridgeRequest {\n type: typeof PERSISTENCE_BRIDGE_REQUEST;\n id: number;\n op: PersistenceBridgeOperation;\n}\ninterface PersistenceBridgeResponse {\n type: typeof PERSISTENCE_BRIDGE_RESPONSE;\n id: number;\n granted: boolean;\n}\nfunction isPersistenceBridgeRequest(value: unknown): value is PersistenceBridgeRequest {\n return (\n isRecord(value) &&\n value.type === PERSISTENCE_BRIDGE_REQUEST &&\n typeof value.id === 'number' &&\n (value.op === 'persist' || value.op === 'persisted')\n );\n}\ninterface MainThreadPersistenceBridge {\n close(): void;\n}\nexport interface NormalizedOpenOptions {\n workerMode: 'dedicated' | 'shared';\n createIfMissing: boolean;\n ownerWaitMs: number;\n requestPersistence: boolean;\n cachePages: number;\n debugFailpoint: DebugFailpoint;\n changeFeed: Required<ChangeFeedSettings> | null;\n}\nconst DEFAULT_CHANGE_FEED_RETAIN_TXIDS = 100_000;\nexport interface RegistryEntry {\n dbName: string;\n refs: number;\n worker: { terminate(): void | Promise<number> };\n proxy: WorkerClient;\n persistenceBridge: MainThreadPersistenceBridge;\n options: NormalizedOpenOptions;\n invalidated: boolean;\n schemaMigrationInProgress: boolean;\n txInvalidationListeners: Set<() => void>;\n handleInvalidationListeners: Set<() => void>;\n release?: () => Promise<void>;\n destroy?: () => Promise<void>;\n channelName?: string;\n}\nconst registry = new Map<string, RegistryEntry>();\nconst lifecycleOperations = new Map<string, Promise<void>>();\nfunction queueLifecycleOperation<T>(dbName: string, operation: () => Promise<T>): Promise<T> {\n const previous = lifecycleOperations.get(dbName) ?? Promise.resolve();\n const result = previous.then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined\n );\n lifecycleOperations.set(dbName, settled);\n void settled.then(() => {\n if (lifecycleOperations.get(dbName) === settled) {\n lifecycleOperations.delete(dbName);\n }\n });\n return result;\n}\nfunction requirePlainOptionsObject(options: unknown): asserts options is OpenOptions {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidOpenOptionsError('open options must be an object');\n }\n}\nfunction normalizeBoolean(value: unknown, field: string, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'boolean') {\n throw new InvalidOpenOptionsError(`${field} must be a boolean`);\n }\n return value;\n}\nfunction normalizeNonNegativeInteger(value: unknown, field: string, defaultValue: number): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new InvalidOpenOptionsError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\nfunction normalizeCachePages(value: unknown): number {\n return Math.max(1, normalizeNonNegativeInteger(value, 'cachePages', 256));\n}\nfunction normalizeFailpoint(value: unknown): DebugFailpoint {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== 'string' || !VALID_FAILPOINTS.has(value as Exclude<DebugFailpoint, null>)) {\n throw new InvalidOpenOptionsError(`debugFailpoint must be one of: ${Array.from(VALID_FAILPOINTS).join(', ')}`);\n }\n return value as Exclude<DebugFailpoint, null>;\n}\nfunction normalizeChangeFeed(value: unknown): Required<ChangeFeedSettings> | null {\n if (value === undefined) {\n return null;\n }\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new InvalidOpenOptionsError('changeFeed must be an object');\n }\n const settings = value as ChangeFeedSettings;\n const enabled = normalizeBoolean(settings.enabled, 'changeFeed.enabled', true);\n let retainTxids: number | null = DEFAULT_CHANGE_FEED_RETAIN_TXIDS;\n if (settings.retainTxids === null) {\n retainTxids = null;\n } else if (settings.retainTxids !== undefined) {\n retainTxids = normalizeNonNegativeInteger(settings.retainTxids, 'changeFeed.retainTxids', 0);\n if (retainTxids === 0) {\n throw new InvalidOpenOptionsError('changeFeed.retainTxids must be positive; disable the feed instead');\n }\n }\n return { enabled, retainTxids };\n}\nfunction normalizeWorkerMode(value: unknown): NormalizedOpenOptions['workerMode'] {\n if (value === undefined) return 'dedicated';\n if (value !== 'dedicated' && value !== 'shared') {\n throw new InvalidOpenOptionsError('workerMode must be dedicated or shared');\n }\n return value;\n}\nexport function normalizeOptions(options: OpenOptions = {}): NormalizedOpenOptions {\n requirePlainOptionsObject(options);\n return {\n workerMode: normalizeWorkerMode(options.workerMode),\n createIfMissing: normalizeBoolean(options.createIfMissing, 'createIfMissing', true),\n ownerWaitMs: normalizeNonNegativeInteger(options.ownerWaitMs, 'ownerWaitMs', 0),\n requestPersistence: normalizeBoolean(options.requestPersistence, 'requestPersistence', true),\n cachePages: normalizeCachePages(options.cachePages),\n debugFailpoint: normalizeFailpoint(options.debugFailpoint),\n changeFeed: normalizeChangeFeed(options.changeFeed)\n };\n}\nfunction sameChangeFeed(left: NormalizedOpenOptions['changeFeed'], right: NormalizedOpenOptions['changeFeed']) {\n return left?.enabled === right?.enabled && left?.retainTxids === right?.retainTxids;\n}\nexport function assertCompatibleOptions(dbName: string, current: NormalizedOpenOptions, next: NormalizedOpenOptions) {\n if (current.workerMode !== next.workerMode) {\n throw new InvalidOpenOptionsError(`database ${dbName} is already open with workerMode=${current.workerMode}`);\n }\n if (current.cachePages !== next.cachePages) {\n throw new InvalidOpenOptionsError(\n `database ${dbName} is already open in this tab with cachePages=${current.cachePages}; requested cachePages=${next.cachePages}`\n );\n }\n if (next.changeFeed !== null && !sameChangeFeed(current.changeFeed, next.changeFeed)) {\n throw new InvalidOpenOptionsError(\n `database ${dbName} is already open in this tab with a different changeFeed policy`\n );\n }\n}\nasync function callStorageManager(method: 'persist' | 'persisted'): Promise<boolean> {\n const storage = globalThis.navigator.storage;\n if (typeof storage[method] !== 'function') {\n return false;\n }\n return await withTimeout(storage[method](), 1000, false);\n}\nasync function handlePersistenceBridgeRequest(port: MessagePort, request: PersistenceBridgeRequest): Promise<void> {\n const granted = await callStorageManager(request.op);\n const response: PersistenceBridgeResponse = {\n type: PERSISTENCE_BRIDGE_RESPONSE,\n id: request.id,\n granted\n };\n port.postMessage(response);\n}\nfunction createMainThreadPersistenceBridge(worker: WorkerTransport): MainThreadPersistenceBridge {\n const channel = new MessageChannel();\n const port = channel.port1;\n port.addEventListener('message', (event: MessageEvent<unknown>) => {\n const data = event.data;\n if (!isPersistenceBridgeRequest(data)) {\n return;\n }\n void handlePersistenceBridgeRequest(port, data);\n });\n port.start();\n worker.postMessage({ type: PERSISTENCE_BRIDGE_INIT }, [channel.port2]);\n return {\n close() {\n port.close();\n }\n };\n}\nfunction createWorker(\n dbName: string,\n mode: NormalizedOpenOptions['workerMode'] = 'dedicated'\n): {\n worker: RegistryEntry['worker'];\n proxy: WorkerClient;\n persistenceBridge: MainThreadPersistenceBridge;\n} {\n if (mode === 'shared') {\n if (typeof globalThis.SharedWorker !== 'function') {\n throw new UnsupportedPlatformError('SharedWorker is unavailable; workerMode=shared cannot be opened');\n }\n const sharedWorker = new SharedWorker(new URL('./shared-worker.ts', import.meta.url), {\n type: 'module',\n name: `moyodb:${dbName}`\n });\n const proxy = new SharedWorkerProtocolClient(sharedWorker);\n const persistenceBridge = { close() {} };\n return {\n worker: {\n terminate: async () => {\n await proxy.disconnect();\n return 0;\n }\n },\n proxy,\n persistenceBridge\n };\n }\n const worker = new Worker(new URL('./browser-worker.ts', import.meta.url), { type: 'module' });\n const proxy = new WorkerProtocolClient(worker);\n const persistenceBridge = createMainThreadPersistenceBridge(worker);\n return { worker, proxy, persistenceBridge };\n}\nfunction createEntry(\n dbName: string,\n worker: RegistryEntry['worker'],\n proxy: WorkerClient,\n persistenceBridge: MainThreadPersistenceBridge,\n options: NormalizedOpenOptions\n): RegistryEntry {\n const entry: RegistryEntry = {\n dbName,\n refs: 1,\n worker,\n proxy,\n persistenceBridge,\n options,\n invalidated: false,\n schemaMigrationInProgress: false,\n txInvalidationListeners: new Set(),\n handleInvalidationListeners: new Set()\n };\n proxy.setTransactionsInvalidatedHandler?.(() => invalidateTransactions(entry));\n proxy.setFatalHandler(() => {\n const current = registry.get(dbName);\n if (current !== entry || entry.invalidated) {\n return;\n }\n registry.delete(dbName);\n entry.refs = 0;\n invalidateEntry(entry);\n entry.persistenceBridge.close();\n void entry.worker.terminate();\n });\n return entry;\n}\nfunction emitListeners(listeners: Iterable<() => void>) {\n for (const listener of Array.from(listeners)) {\n listener();\n }\n}\nexport function subscribeTransactionsInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.txInvalidationListeners.add(listener);\n return () => {\n entry.txInvalidationListeners.delete(listener);\n };\n}\nexport function subscribeHandleInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.handleInvalidationListeners.add(listener);\n return () => {\n entry.handleInvalidationListeners.delete(listener);\n };\n}\nexport function invalidateTransactions(entry: RegistryEntry): void {\n emitListeners(entry.txInvalidationListeners);\n}\nfunction invalidateEntry(entry: RegistryEntry): void {\n if (entry.invalidated) {\n return;\n }\n entry.invalidated = true;\n invalidateTransactions(entry);\n emitListeners(entry.handleInvalidationListeners);\n}\nexport function unsafeDebugCrashWorker(dbName: string): boolean {\n const current = registry.get(dbName);\n if (!current) {\n return false;\n }\n registry.delete(dbName);\n invalidateEntry(current);\n current.refs = 0;\n current.persistenceBridge.close();\n current.proxy.crash?.();\n current.proxy.dispose(new Error('worker was terminated by unsafeDebugCrashWorker'));\n void current.worker.terminate();\n return true;\n}\nexport async function acquireDbWorker(dbName: string, options: OpenOptions = {}): Promise<RegistryEntry> {\n const normalized = normalizeOptions(options);\n return queueLifecycleOperation(dbName, async () => {\n const existing = registry.get(dbName);\n if (existing) {\n if (existing.invalidated) {\n registry.delete(dbName);\n } else {\n if (existing.schemaMigrationInProgress) {\n throw new DatabaseBusyError(`database ${dbName} is migrating; wait for openDB() to resolve`);\n }\n assertCompatibleOptions(dbName, existing.options, normalized);\n if (normalized.debugFailpoint !== null) {\n try {\n await existing.proxy.setFailpoint(normalized.debugFailpoint);\n } catch (error) {\n throw normalizeError(error);\n }\n }\n existing.refs += 1;\n return existing;\n }\n }\n const { worker, proxy, persistenceBridge } = createWorker(dbName, normalized.workerMode);\n const entry = createEntry(dbName, worker, proxy, persistenceBridge, normalized);\n try {\n await proxy.open({\n dbName,\n options: normalized\n });\n registry.set(dbName, entry);\n return entry;\n } catch (error) {\n persistenceBridge.close();\n proxy.dispose(new Error('worker open failed'));\n await worker.terminate();\n throw normalizeError(error);\n }\n });\n}\nexport async function releaseDbWorker(entry: RegistryEntry): Promise<void> {\n if (entry.release) return entry.release();\n return queueLifecycleOperation(entry.dbName, async () => {\n if (entry.invalidated || registry.get(entry.dbName) !== entry) {\n return;\n }\n entry.refs -= 1;\n if (entry.refs > 0) {\n return;\n }\n registry.delete(entry.dbName);\n try {\n await entry.proxy.close();\n } finally {\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n }\n });\n}\nexport async function destroyDbWorker(entry: RegistryEntry): Promise<void> {\n if (entry.destroy) return entry.destroy();\n return queueLifecycleOperation(entry.dbName, () => destroyEntry(entry));\n}\nasync function destroyEntry(entry: RegistryEntry): Promise<void> {\n if (entry.invalidated || registry.get(entry.dbName) !== entry) {\n throw new DatabaseClosedError();\n }\n if (entry.options.workerMode === 'shared') {\n try {\n await entry.proxy.destroy();\n } catch (error) {\n throw normalizeError(error);\n }\n registry.delete(entry.dbName);\n invalidateEntry(entry);\n entry.refs = 0;\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n return;\n }\n registry.delete(entry.dbName);\n invalidateEntry(entry);\n entry.refs = 0;\n try {\n await entry.proxy.destroy();\n } catch (error) {\n throw normalizeError(error);\n } finally {\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n }\n}\nexport async function deleteDbByName(dbName: string): Promise<void> {\n return queueLifecycleOperation(dbName, async () => {\n const current = registry.get(dbName);\n if (current) {\n await destroyEntry(current);\n return;\n }\n const { worker, proxy, persistenceBridge } = createWorker(dbName);\n try {\n await proxy.deleteDB(dbName);\n } catch (error) {\n throw normalizeError(error);\n } finally {\n persistenceBridge.close();\n proxy.dispose(new Error('temporary worker was terminated'));\n await worker.terminate();\n }\n });\n}\n","import type { DbChange } from './types';\nimport { isRecord } from './internal';\nexport interface StoreChangeSet {\n store: string;\n changes: DbChange[];\n}\nexport interface CommitAppliedEvent {\n type: 'commit_applied';\n dbName: string;\n txid: number;\n stores: StoreChangeSet[];\n}\nexport interface OwnerChangedEvent {\n type: 'owner_changed';\n dbName: string;\n txid: null;\n}\nexport interface DbClosedEvent {\n type: 'db_closed';\n dbName: string;\n txid: null;\n}\nexport interface DbDeletedEvent {\n type: 'db_deleted';\n dbName: string;\n txid: null;\n}\nexport type WorkerBroadcastEvent = CommitAppliedEvent | OwnerChangedEvent | DbClosedEvent | DbDeletedEvent;\nfunction isDbChange(value: unknown): value is DbChange {\n if (!isRecord(value) || !(value.key instanceof Uint8Array)) {\n return false;\n }\n if (value.kind === 'put' || value.kind === 'delete') {\n return true;\n }\n return (value.kind === 'clear' || value.kind === 'drop') && value.key.byteLength === 0;\n}\nfunction isStoreChangeSet(value: unknown): value is StoreChangeSet {\n return (\n isRecord(value) &&\n typeof value.store === 'string' &&\n Array.isArray(value.changes) &&\n value.changes.every(isDbChange)\n );\n}\nexport function isCommitAppliedEvent(value: unknown): value is CommitAppliedEvent {\n return (\n isRecord(value) &&\n value.type === 'commit_applied' &&\n typeof value.dbName === 'string' &&\n typeof value.txid === 'number' &&\n Array.isArray(value.stores) &&\n value.stores.every(isStoreChangeSet)\n );\n}\n","import { DatabaseClosedError } from './errors';\nimport { isCommitAppliedEvent } from './change-events';\nimport { assertPublicStoreName } from './indexing';\nimport type { DbChange, DbSubscriptionCallback, Unsubscribe } from './types';\ninterface SubscriptionEntry {\n active: boolean;\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\ninterface SubscriptionSpec {\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\nfunction cloneChanges(changes: readonly DbChange[]): DbChange[] {\n return changes.map((change) => ({\n key: change.key.slice(),\n kind: change.kind\n }));\n}\nfunction hasKeyPrefix(key: Uint8Array, prefix: Uint8Array): boolean {\n if (prefix.byteLength > key.byteLength) {\n return false;\n }\n for (let index = 0; index < prefix.byteLength; index += 1) {\n if (key[index] !== prefix[index]) {\n return false;\n }\n }\n return true;\n}\nfunction normalizeSubscriptionSpec(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n): SubscriptionSpec {\n if (typeof arg1 === 'function') {\n if (arg2 !== undefined || arg3 !== undefined) {\n throw new TypeError('subscribe(callback) accepts exactly one callback argument');\n }\n return {\n store: null,\n keyPrefix: null,\n callback: arg1\n };\n }\n if (typeof arg1 !== 'string') {\n throw new TypeError('subscribe() storeName must be a string');\n }\n assertPublicStoreName(arg1);\n if (typeof arg2 === 'function') {\n if (arg3 !== undefined) {\n throw new TypeError('subscribe(storeName, callback) accepts exactly two arguments');\n }\n return {\n store: arg1,\n keyPrefix: null,\n callback: arg2\n };\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return {\n store: arg1,\n keyPrefix: arg2.slice(),\n callback: arg3\n };\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n}\nexport class SubscriptionHub {\n #dbName: string;\n #channelName: string;\n #channel: BroadcastChannel | null = null;\n #entries = new Set<SubscriptionEntry>();\n #closed = false;\n constructor(dbName: string, channelName = dbName) {\n this.#dbName = dbName;\n this.#channelName = channelName;\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (this.#closed) {\n throw new DatabaseClosedError();\n }\n const spec = normalizeSubscriptionSpec(arg1, arg2, arg3);\n const entry: SubscriptionEntry = {\n active: true,\n store: spec.store,\n keyPrefix: spec.keyPrefix,\n callback: spec.callback\n };\n this.#ensureChannel();\n this.#entries.add(entry);\n return () => {\n if (!entry.active) {\n return;\n }\n entry.active = false;\n this.#entries.delete(entry);\n if (this.#entries.size === 0) {\n this.#disposeChannel();\n }\n };\n }\n close(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n for (const entry of this.#entries) {\n entry.active = false;\n }\n this.#entries.clear();\n this.#disposeChannel();\n }\n #ensureChannel() {\n if (this.#channel !== null || this.#closed) {\n return;\n }\n const channel = new BroadcastChannel(`db:${this.#channelName}:events`);\n channel.onmessage = (event) => {\n this.#handleMessage(event.data);\n };\n this.#channel = channel;\n }\n #disposeChannel() {\n this.#channel?.close();\n this.#channel = null;\n }\n #handleMessage(payload: unknown) {\n if (!isCommitAppliedEvent(payload) || payload.dbName !== this.#dbName || this.#entries.size === 0) {\n return;\n }\n const entries = Array.from(this.#entries);\n for (const storeEvent of payload.stores) {\n for (const entry of entries) {\n if (!entry.active) {\n continue;\n }\n if (entry.store !== null && entry.store !== storeEvent.store) {\n continue;\n }\n let changes: DbChange[];\n const keyPrefix = entry.keyPrefix;\n if (keyPrefix === null) {\n changes = cloneChanges(storeEvent.changes);\n } else {\n changes = cloneChanges(\n storeEvent.changes.filter(\n (change) =>\n change.kind === 'clear' || change.kind === 'drop' || hasKeyPrefix(change.key, keyPrefix)\n )\n );\n if (changes.length === 0) {\n continue;\n }\n }\n try {\n entry.callback(storeEvent.store, changes, payload.txid);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n }\n}\n","import {\n encodeCompoundKeyParts,\n encodeIndexScalar,\n jsonDecode,\n jsonEncode,\n splitCompoundKey,\n type CompoundKeyPart\n} from './codec';\nimport { TransactionClosedError } from './errors';\nimport type { BatchOp, CreateStoreOptions, DB, PutOptions, Range, Transaction, TxMode } from './types';\n\nexport interface RecordCodec<T> {\n encode(value: T): Uint8Array;\n decode(bytes: Uint8Array): T;\n}\n\nexport interface RecordCodecs<K, V> {\n key: RecordCodec<K>;\n value: RecordCodec<V>;\n}\n\nexport interface RecordRange<K> {\n gt?: K;\n gte?: K;\n lt?: K;\n lte?: K;\n reverse?: boolean;\n limit?: number;\n}\n\nexport interface RecordItem<K, V> {\n key: K;\n value: V;\n}\n\nexport type RecordBatchOp<K, V> = { kind: 'put'; key: K; value: V } | { kind: 'delete'; key: K };\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nconst fatalDecoder = new TextDecoder('utf-8', { fatal: true });\nconst NUMBER_MASK = (1n << 64n) - 1n;\nconst NUMBER_SIGN = 1n << 63n;\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n return left.length === right.length && left.every((byte, index) => byte === right[index]);\n}\n\nfunction decodeScalarKey(bytes: Uint8Array): CompoundKeyPart {\n if (!(bytes instanceof Uint8Array) || bytes.length === 0) {\n throw new TypeError('invalid scalar key encoding');\n }\n let value: CompoundKeyPart;\n switch (bytes[0]) {\n case 0x10:\n value = null;\n break;\n case 0x20:\n value = false;\n break;\n case 0x21:\n value = true;\n break;\n case 0x30: {\n if (bytes.length !== 9) {\n throw new TypeError('invalid number key encoding');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset + 1, 8);\n const ordered = view.getBigUint64(0, false);\n const bits = (ordered & NUMBER_SIGN) !== 0n ? ordered ^ NUMBER_SIGN : ordered ^ NUMBER_MASK;\n const buffer = new ArrayBuffer(8);\n const decoded = new DataView(buffer);\n decoded.setBigUint64(0, bits, false);\n value = decoded.getFloat64(0, false);\n break;\n }\n case 0x40:\n value = fatalDecoder.decode(bytes.subarray(1));\n break;\n case 0x50:\n value = bytes.slice(1);\n break;\n default:\n throw new TypeError('invalid scalar key type');\n }\n if (!sameBytes(encodeIndexScalar(value), bytes)) {\n throw new TypeError('noncanonical scalar key encoding');\n }\n return value;\n}\n\nexport const scalarKeyCodec: RecordCodec<CompoundKeyPart> = Object.freeze({\n encode: encodeIndexScalar,\n decode: decodeScalarKey\n});\n\nfunction typedKeyCodec<T extends CompoundKeyPart>(\n type: string,\n accepts: (value: CompoundKeyPart) => value is T\n): RecordCodec<T> {\n function check(value: CompoundKeyPart): T {\n if (!accepts(value)) {\n throw new TypeError(`key must be ${type}`);\n }\n return value;\n }\n return Object.freeze({\n encode(value: T): Uint8Array {\n return encodeIndexScalar(check(value));\n },\n decode(bytes: Uint8Array): T {\n return check(decodeScalarKey(bytes));\n }\n });\n}\n\nexport const keyCodecs = Object.freeze({\n string: typedKeyCodec('a string', (value): value is string => typeof value === 'string'),\n number: typedKeyCodec('a finite number', (value): value is number => typeof value === 'number'),\n boolean: typedKeyCodec('a boolean', (value): value is boolean => typeof value === 'boolean'),\n null: typedKeyCodec('null', (value): value is null => value === null),\n bytes: typedKeyCodec('Uint8Array', (value): value is Uint8Array => value instanceof Uint8Array)\n});\n\nexport function compoundKeyCodec<T extends readonly CompoundKeyPart[]>(\n ...parts: { [I in keyof T]: RecordCodec<T[I]> }\n): RecordCodec<T> {\n return Object.freeze({\n encode(value: T): Uint8Array {\n if (!Array.isArray(value) || value.length !== parts.length) {\n throw new TypeError(`compound key must contain ${parts.length} parts`);\n }\n return encodeCompoundKeyParts(parts.map((codec, index) => codec.encode(value[index] as CompoundKeyPart)));\n },\n decode(bytes: Uint8Array): T {\n const encoded = splitCompoundKey(bytes);\n if (encoded.length !== parts.length) {\n throw new TypeError(`compound key must contain ${parts.length} parts`);\n }\n return parts.map((codec, index) => codec.decode(encoded[index])) as unknown as T;\n }\n });\n}\n\nfunction assertJsonValue(value: unknown): asserts value is JsonValue {\n const pending: Array<{ value: unknown; leave?: boolean }> = [{ value }];\n const active = new Set<object>();\n while (pending.length > 0) {\n const entry = pending.pop() as { value: unknown; leave?: boolean };\n const current = entry.value;\n if (entry.leave) {\n active.delete(current as object);\n continue;\n }\n if (current === null || typeof current === 'string' || typeof current === 'boolean') {\n continue;\n }\n if (typeof current === 'number' && Number.isFinite(current) && !Object.is(current, -0)) {\n continue;\n }\n if (typeof current !== 'object' || active.has(current)) {\n throw new TypeError('record must contain JSON values without cycles, nonfinite numbers or negative zero');\n }\n const array = Array.isArray(current);\n if (Object.getPrototypeOf(current) !== (array ? Array.prototype : Object.prototype)) {\n throw new TypeError('record objects must be plain objects or arrays');\n }\n active.add(current);\n pending.push({ value: current, leave: true });\n const keys = Reflect.ownKeys(current);\n if (array && keys.length !== current.length + 1) {\n throw new TypeError('record arrays must be dense and have no extra properties');\n }\n for (const key of keys) {\n if (array && key === 'length') {\n continue;\n }\n if (typeof key !== 'string') {\n throw new TypeError('record properties must have string keys');\n }\n if (array && (!/^(?:0|[1-9]\\d*)$/.test(key) || Number(key) >= current.length)) {\n throw new TypeError('record arrays must have no extra properties');\n }\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {\n throw new TypeError('record properties must be enumerable data properties');\n }\n pending.push({ value: descriptor.value as unknown });\n }\n }\n}\n\n/** A type guard checks the application schema. Without one, only the JSON domain is checked. */\nexport function jsonRecordCodec<T = JsonValue>(validate?: (value: unknown) => value is T): RecordCodec<T> {\n function check(value: unknown): T {\n assertJsonValue(value);\n if (validate) {\n if (!validate(value)) {\n throw new TypeError('record does not match its schema');\n }\n assertJsonValue(value);\n }\n return value as T;\n }\n return Object.freeze({\n encode(value: T): Uint8Array {\n return jsonEncode(check(value));\n },\n decode(bytes: Uint8Array): T {\n return check(jsonDecode<unknown>(bytes));\n }\n });\n}\n\nfunction encodeRange<K>(codec: RecordCodec<K>, range: RecordRange<K>): Range {\n const encoded: Range = {};\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n if (Object.hasOwn(range, bound)) {\n encoded[bound] = codec.encode(range[bound] as K);\n }\n }\n if (range.reverse !== undefined) {\n encoded.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n encoded.limit = range.limit;\n }\n return encoded;\n}\n\nexport async function withRecordTransaction<R>(\n db: DB,\n mode: TxMode,\n action: (transaction: Transaction) => Promise<R> | R\n): Promise<R> {\n const transaction = await db.begin(mode);\n let result: R;\n try {\n result = await action(transaction);\n } catch (error) {\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n if (!(rollbackError instanceof TransactionClosedError)) {\n throw new AggregateError([error, rollbackError], 'record transaction and rollback failed', {\n cause: rollbackError\n });\n }\n }\n throw error;\n }\n // SDK completion methods close the transaction even when they fail.\n if (mode === 'readwrite') {\n await transaction.commit();\n } else {\n await transaction.rollback();\n }\n return result;\n}\n\nfunction useTransaction<R>(\n source: DB | Transaction,\n mode: TxMode,\n action: (transaction: Transaction) => Promise<R>\n): Promise<R> {\n return 'begin' in source ? withRecordTransaction(source, mode, action) : action(source);\n}\n\nexport class RecordIndex<I, K, V> {\n readonly name: string;\n #source: DB | Transaction;\n #store: string;\n #indexKey: RecordCodec<I>;\n #codecs: RecordCodecs<K, V>;\n\n constructor(\n source: DB | Transaction,\n store: string,\n name: string,\n indexKey: RecordCodec<I>,\n codecs: RecordCodecs<K, V>\n ) {\n this.#source = source;\n this.#store = store;\n this.name = name;\n this.#indexKey = indexKey;\n this.#codecs = codecs;\n }\n\n async get(key: I): Promise<V | null> {\n const encoded = this.#indexKey.encode(key);\n return useTransaction(this.#source, 'readonly', async (transaction) => {\n const value = await transaction.getByIndex(this.#store, this.name, encoded);\n return value === null ? null : this.#codecs.value.decode(value);\n });\n }\n\n async scan(range: RecordRange<I> = {}): Promise<Array<RecordItem<K, V>>> {\n const encoded = encodeRange(this.#indexKey, range);\n return useTransaction(this.#source, 'readonly', async (transaction) => {\n const rows: Array<RecordItem<K, V>> = [];\n for await (const [key, value] of transaction.scanByIndex(this.#store, this.name, encoded)) {\n rows.push({ key: this.#codecs.key.decode(key), value: this.#codecs.value.decode(value) });\n }\n return rows;\n });\n }\n}\n\nexport class RecordStore<K, V> {\n readonly name: string;\n #source: DB | Transaction;\n #codecs: RecordCodecs<K, V>;\n\n constructor(source: DB | Transaction, name: string, codecs: RecordCodecs<K, V>) {\n this.#source = source;\n this.name = name;\n this.#codecs = codecs;\n }\n\n async get(key: K): Promise<V | null> {\n const value = await this.#source.get(this.name, this.#codecs.key.encode(key));\n return value === null ? null : this.#codecs.value.decode(value);\n }\n\n async getMany(keys: readonly K[]): Promise<Array<V | null>> {\n const values = await this.#source.getMany(\n this.name,\n keys.map((key) => this.#codecs.key.encode(key))\n );\n return values.map((value) => (value === null ? null : this.#codecs.value.decode(value)));\n }\n\n async has(key: K): Promise<boolean> {\n return this.#source.has(this.name, this.#codecs.key.encode(key));\n }\n\n async put(key: K, value: V, options?: PutOptions): Promise<void> {\n await this.#source.put(this.name, this.#codecs.key.encode(key), this.#codecs.value.encode(value), options);\n }\n\n async putMany(entries: ReadonlyArray<readonly [K, V]>, options?: PutOptions): Promise<void> {\n const encoded = entries.map(([key, value]): [Uint8Array, Uint8Array] => [\n this.#codecs.key.encode(key),\n this.#codecs.value.encode(value)\n ]);\n await useTransaction(this.#source, 'readwrite', (transaction) =>\n transaction.putMany(this.name, encoded, options)\n );\n }\n\n async delete(key: K): Promise<boolean> {\n return this.#source.delete(this.name, this.#codecs.key.encode(key));\n }\n\n async deleteMany(keys: readonly K[]): Promise<void> {\n const encoded = keys.map((key) => this.#codecs.key.encode(key));\n await useTransaction(this.#source, 'readwrite', (transaction) => transaction.deleteMany(this.name, encoded));\n }\n\n async applyBatch(operations: ReadonlyArray<RecordBatchOp<K, V>>): Promise<void> {\n const encoded = operations.map((operation): BatchOp => {\n const kind = (operation as { kind: unknown }).kind;\n if (kind !== 'put' && kind !== 'delete') {\n throw new TypeError('record batch operation must be put or delete');\n }\n const key = this.#codecs.key.encode(operation.key);\n if (operation.kind === 'delete') {\n return { kind: 'delete', key };\n }\n return { kind: 'put', key, value: this.#codecs.value.encode(operation.value) };\n });\n await useTransaction(this.#source, 'readwrite', (transaction) => transaction.applyBatch(this.name, encoded));\n }\n\n async scan(range: RecordRange<K> = {}): Promise<Array<RecordItem<K, V>>> {\n const rows = await this.#source.scan(this.name, encodeRange(this.#codecs.key, range));\n return rows.map(({ key, value }) => ({\n key: this.#codecs.key.decode(key),\n value: this.#codecs.value.decode(value)\n }));\n }\n\n async clear(): Promise<void> {\n await this.#source.clearStore(this.name);\n }\n\n index<I>(name: string, key: RecordCodec<I>): RecordIndex<I, K, V> {\n return new RecordIndex(this.#source, this.name, name, key, this.#codecs);\n }\n\n transaction<R>(\n mode: TxMode,\n action: (store: RecordStore<K, V>, transaction: Transaction) => Promise<R> | R\n ): Promise<R> {\n if (!('begin' in this.#source)) {\n return Promise.reject(new TypeError('record store already belongs to a transaction'));\n }\n return withRecordTransaction(this.#source, mode, (transaction) =>\n action(new RecordStore(transaction, this.name, this.#codecs), transaction)\n );\n }\n}\n\n/** Bind codecs to an existing store. The database still enforces store existence. */\nexport function openRecordStore<K, V>(\n source: DB | Transaction,\n name: string,\n codecs: RecordCodecs<K, V>\n): RecordStore<K, V> {\n return new RecordStore(source, name, codecs);\n}\n\nexport async function createRecordStore<K, V>(\n source: DB | Transaction,\n name: string,\n codecs: RecordCodecs<K, V>,\n options?: CreateStoreOptions\n): Promise<RecordStore<K, V>> {\n await source.createStore(name, options);\n return openRecordStore(source, name, codecs);\n}\n","export const SQL_INTEGER_MIN = -(1n << 63n);\nexport const SQL_INTEGER_MAX = (1n << 63n) - 1n;\n\nexport type SqlValue = null | boolean | number | bigint | string | Uint8Array;\nexport type SqlColumnType = 'INTEGER' | 'REAL' | 'TEXT' | 'BOOLEAN' | 'BLOB';\n\nexport interface SqlColumnDefinition {\n name: string;\n type: SqlColumnType;\n primaryKey: boolean;\n nullable: boolean;\n}\n\nexport type SqlValueExpression = { kind: 'literal'; value: SqlValue } | { kind: 'parameter'; index: number };\nexport type SqlComparisonOperator = '=' | '!=' | '<' | '<=' | '>' | '>=';\nexport type SqlExpression =\n | { kind: 'comparison'; column: string; operator: SqlComparisonOperator; value: SqlValueExpression }\n | { kind: 'isNull'; column: string; negated: boolean }\n | { kind: 'and' | 'or'; left: SqlExpression; right: SqlExpression };\n\nexport interface SqlOrderBy {\n column: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface SqlCreateTableStatement {\n kind: 'createTable';\n table: string;\n columns: SqlColumnDefinition[];\n ifNotExists: boolean;\n}\n\nexport interface SqlDropTableStatement {\n kind: 'dropTable';\n table: string;\n ifExists: boolean;\n}\n\nexport interface SqlInsertStatement {\n kind: 'insert';\n table: string;\n columns: string[] | null;\n rows: SqlValueExpression[][];\n}\n\nexport interface SqlSelectStatement {\n kind: 'select';\n table: string;\n columns: string[] | null;\n where: SqlExpression | null;\n orderBy: SqlOrderBy[];\n limit: SqlValueExpression | null;\n offset: SqlValueExpression | null;\n}\n\nexport interface SqlUpdateStatement {\n kind: 'update';\n table: string;\n assignments: { column: string; value: SqlValueExpression }[];\n where: SqlExpression | null;\n}\n\nexport interface SqlDeleteStatement {\n kind: 'delete';\n table: string;\n where: SqlExpression | null;\n}\n\nexport type SqlStatement =\n | SqlCreateTableStatement\n | SqlDropTableStatement\n | SqlInsertStatement\n | SqlSelectStatement\n | SqlUpdateStatement\n | SqlDeleteStatement;\n\nexport interface SqlParseResult {\n statement: SqlStatement;\n parameterCount: number;\n}\n","import {\n SQL_INTEGER_MAX,\n SQL_INTEGER_MIN,\n type SqlColumnDefinition,\n type SqlColumnType,\n type SqlComparisonOperator,\n type SqlExpression,\n type SqlOrderBy,\n type SqlParseResult,\n type SqlStatement,\n type SqlValue,\n type SqlValueExpression\n} from './sql-types';\n\nconst MAX_SQL_LENGTH = 1_048_576;\nconst MAX_TOKENS = 16_384;\nconst MAX_NESTING = 64;\nconst MAX_PREDICATES = 128;\nconst MAX_IDENTIFIER_LENGTH = 128;\nconst MAX_NUMBER_LENGTH = 1_024;\nconst FORBIDDEN_IDENTIFIERS = new Set(['__proto__', 'prototype', 'constructor']);\nconst COLUMN_TYPES = new Set<SqlColumnType>(['INTEGER', 'REAL', 'TEXT', 'BOOLEAN', 'BLOB']);\nconst KEYWORDS = new Set([\n 'CREATE',\n 'TABLE',\n 'IF',\n 'NOT',\n 'EXISTS',\n 'DROP',\n 'INSERT',\n 'INTO',\n 'VALUES',\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'ORDER',\n 'BY',\n 'ASC',\n 'DESC',\n 'LIMIT',\n 'OFFSET',\n 'UPDATE',\n 'SET',\n 'DELETE',\n 'PRIMARY',\n 'KEY',\n 'NULL',\n 'TRUE',\n 'FALSE',\n 'IS',\n 'AND',\n 'OR',\n 'JOIN',\n 'LEFT',\n 'RIGHT',\n 'INNER',\n 'OUTER',\n 'CROSS',\n 'ON',\n 'AS',\n 'DISTINCT',\n 'GROUP',\n 'HAVING',\n 'UNION',\n 'ALL',\n 'IN',\n 'LIKE',\n 'BETWEEN',\n 'DEFAULT',\n 'UNIQUE',\n 'CHECK',\n 'REFERENCES',\n 'CONSTRAINT',\n 'FOREIGN',\n 'AUTOINCREMENT',\n 'RETURNING',\n 'CONFLICT',\n ...COLUMN_TYPES\n]);\n\ntype TokenKind = 'word' | 'identifier' | 'string' | 'number' | 'symbol' | 'parameter' | 'end';\ninterface Token {\n kind: TokenKind;\n text: string;\n position: number;\n}\n\nexport class SqlSyntaxError extends SyntaxError {\n readonly position: number;\n\n constructor(message: string, position: number) {\n super(`${message} at position ${position}`);\n this.name = 'SqlSyntaxError';\n this.position = position;\n }\n}\n\nexport function parseSql(sql: string): SqlParseResult {\n if (typeof sql !== 'string') {\n throw new TypeError('SQL must be a string');\n }\n if (sql.length > MAX_SQL_LENGTH) {\n throw new SqlSyntaxError(`SQL exceeds ${MAX_SQL_LENGTH} characters`, MAX_SQL_LENGTH);\n }\n return new Parser(tokenize(sql)).parse();\n}\n\nexport function bindSqlParameters(parsed: SqlParseResult, parameters: readonly unknown[] = []): SqlValue[] {\n if (!Array.isArray(parameters)) {\n throw new TypeError('SQL parameters must be an array');\n }\n if (parameters.length !== parsed.parameterCount) {\n throw new RangeError(`SQL expects ${parsed.parameterCount} parameters; received ${parameters.length}`);\n }\n return Array.from<unknown, SqlValue>(parameters, (value, index) => {\n if (value === null || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n if (\n !Number.isFinite(value) ||\n (Number.isInteger(value) && !Number.isSafeInteger(value) && fitsSigned64(value))\n ) {\n throw new RangeError(\n `SQL parameter ${index + 1} must be finite; use bigint for integers outside the safe range`\n );\n }\n return value;\n }\n if (typeof value === 'bigint') {\n if (value < SQL_INTEGER_MIN || value > SQL_INTEGER_MAX) {\n throw new RangeError(`SQL parameter ${index + 1} exceeds the signed 64-bit integer range`);\n }\n return value;\n }\n if (typeof value === 'string') {\n if (!hasValidUnicode(value)) {\n throw new TypeError(`SQL parameter ${index + 1} must contain valid Unicode scalar values`);\n }\n return value;\n }\n if (value instanceof Uint8Array) {\n return Uint8Array.from(value);\n }\n throw new TypeError(`SQL parameter ${index + 1} must be null, boolean, number, bigint, string, or Uint8Array`);\n });\n}\n\nexport function resolveSqlValue(expression: SqlValueExpression, parameters: readonly SqlValue[]): SqlValue {\n if (expression.kind === 'literal') {\n return expression.value;\n }\n if (!Number.isSafeInteger(expression.index) || expression.index < 0 || expression.index >= parameters.length) {\n throw new RangeError(`SQL parameter ${expression.index + 1} is missing`);\n }\n const value = parameters.at(expression.index);\n if (value === undefined) {\n throw new RangeError(`SQL parameter ${expression.index + 1} is missing`);\n }\n return value;\n}\n\nclass Parser {\n #tokens: Token[];\n #index = 0;\n #parameterCount = 0;\n #nesting = 0;\n #predicates = 0;\n\n constructor(tokens: Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): SqlParseResult {\n const statement = this.#parseStatement();\n this.#acceptSymbol(';');\n if (this.#current().kind !== 'end') {\n throw this.#error('Unexpected or unsupported SQL syntax');\n }\n return { statement, parameterCount: this.#parameterCount };\n }\n\n #parseStatement(): SqlStatement {\n if (this.#acceptKeyword('CREATE')) {\n return this.#createTable();\n }\n if (this.#acceptKeyword('DROP')) {\n return this.#dropTable();\n }\n if (this.#acceptKeyword('INSERT')) {\n return this.#insert();\n }\n if (this.#acceptKeyword('SELECT')) {\n return this.#select();\n }\n if (this.#acceptKeyword('UPDATE')) {\n return this.#update();\n }\n if (this.#acceptKeyword('DELETE')) {\n return this.#delete();\n }\n throw this.#error('Expected CREATE TABLE, DROP TABLE, INSERT, SELECT, UPDATE, or DELETE');\n }\n\n #createTable(): SqlStatement {\n this.#expectKeyword('TABLE');\n const ifNotExists = this.#acceptKeyword('IF');\n if (ifNotExists) {\n this.#expectKeyword('NOT');\n this.#expectKeyword('EXISTS');\n }\n const table = this.#identifier();\n this.#expectSymbol('(');\n const columns: SqlColumnDefinition[] = [];\n const names = new Set<string>();\n let primaryKeyCount = 0;\n do {\n const name = this.#identifier();\n this.#assertUnique(names, name, 'column');\n const typeToken = this.#current();\n const type = typeToken.text.toUpperCase() as SqlColumnType;\n if (typeToken.kind !== 'word' || !COLUMN_TYPES.has(type)) {\n throw this.#error('Expected INTEGER, REAL, TEXT, BOOLEAN, or BLOB column type');\n }\n this.#index += 1;\n let primaryKey = false;\n let nullable = true;\n let nullabilitySpecified = false;\n for (;;) {\n if (this.#acceptKeyword('PRIMARY')) {\n if (primaryKey) {\n throw this.#error('Duplicate PRIMARY KEY constraint');\n }\n this.#expectKeyword('KEY');\n primaryKey = true;\n primaryKeyCount += 1;\n if (primaryKeyCount > 1) {\n throw this.#error('Only one inline PRIMARY KEY is supported');\n }\n } else if (this.#acceptKeyword('NOT')) {\n this.#expectKeyword('NULL');\n if (nullabilitySpecified) {\n throw this.#error('Duplicate nullability constraint');\n }\n nullable = false;\n nullabilitySpecified = true;\n } else if (this.#acceptKeyword('NULL')) {\n if (nullabilitySpecified) {\n throw this.#error('Duplicate nullability constraint');\n }\n nullable = true;\n nullabilitySpecified = true;\n } else {\n break;\n }\n }\n if (primaryKey && nullable && nullabilitySpecified) {\n throw this.#error('PRIMARY KEY cannot be declared NULL');\n }\n columns.push({ name, type, primaryKey, nullable: primaryKey ? false : nullable });\n } while (this.#acceptSymbol(','));\n this.#expectSymbol(')');\n return { kind: 'createTable', table, columns, ifNotExists };\n }\n\n #dropTable(): SqlStatement {\n this.#expectKeyword('TABLE');\n const ifExists = this.#acceptKeyword('IF');\n if (ifExists) {\n this.#expectKeyword('EXISTS');\n }\n return { kind: 'dropTable', table: this.#identifier(), ifExists };\n }\n\n #insert(): SqlStatement {\n this.#expectKeyword('INTO');\n const table = this.#identifier();\n let columns: string[] | null = null;\n if (this.#acceptSymbol('(')) {\n columns = this.#identifierList();\n this.#expectSymbol(')');\n }\n this.#expectKeyword('VALUES');\n const rows: SqlValueExpression[][] = [];\n let width = columns?.length;\n do {\n this.#expectSymbol('(');\n const row = [this.#value()];\n while (this.#acceptSymbol(',')) {\n row.push(this.#value());\n }\n this.#expectSymbol(')');\n width ??= row.length;\n if (row.length !== width) {\n throw this.#error('INSERT rows must match the column count');\n }\n rows.push(row);\n } while (this.#acceptSymbol(','));\n return { kind: 'insert', table, columns, rows };\n }\n\n #select(): SqlStatement {\n const columns = this.#acceptSymbol('*') ? null : this.#identifierList();\n this.#expectKeyword('FROM');\n const table = this.#identifier();\n const where = this.#where();\n const orderBy: SqlOrderBy[] = [];\n if (this.#acceptKeyword('ORDER')) {\n this.#expectKeyword('BY');\n const names = new Set<string>();\n do {\n const column = this.#identifier();\n this.#assertUnique(names, column, 'ORDER BY column');\n const direction = this.#acceptKeyword('DESC') ? 'desc' : 'asc';\n if (direction === 'asc') {\n this.#acceptKeyword('ASC');\n }\n orderBy.push({ column, direction });\n } while (this.#acceptSymbol(','));\n }\n let limit: SqlValueExpression | null = null;\n let offset: SqlValueExpression | null = null;\n if (this.#acceptKeyword('LIMIT')) {\n limit = this.#rowCount('LIMIT');\n if (this.#acceptKeyword('OFFSET')) {\n offset = this.#rowCount('OFFSET');\n }\n }\n return { kind: 'select', table, columns, where, orderBy, limit, offset };\n }\n\n #update(): SqlStatement {\n const table = this.#identifier();\n this.#expectKeyword('SET');\n const assignments: { column: string; value: SqlValueExpression }[] = [];\n const names = new Set<string>();\n do {\n const column = this.#identifier();\n this.#assertUnique(names, column, 'assignment');\n this.#expectSymbol('=');\n assignments.push({ column, value: this.#value() });\n } while (this.#acceptSymbol(','));\n return { kind: 'update', table, assignments, where: this.#where() };\n }\n\n #delete(): SqlStatement {\n this.#expectKeyword('FROM');\n return { kind: 'delete', table: this.#identifier(), where: this.#where() };\n }\n\n #where(): SqlExpression | null {\n return this.#acceptKeyword('WHERE') ? this.#or() : null;\n }\n\n #or(): SqlExpression {\n let expression = this.#and();\n while (this.#acceptKeyword('OR')) {\n expression = { kind: 'or', left: expression, right: this.#and() };\n }\n return expression;\n }\n\n #and(): SqlExpression {\n let expression = this.#predicate();\n while (this.#acceptKeyword('AND')) {\n expression = { kind: 'and', left: expression, right: this.#predicate() };\n }\n return expression;\n }\n\n #predicate(): SqlExpression {\n if (this.#acceptSymbol('(')) {\n this.#nesting += 1;\n if (this.#nesting > MAX_NESTING) {\n throw this.#error(`WHERE nesting exceeds ${MAX_NESTING}`);\n }\n const expression = this.#or();\n this.#expectSymbol(')');\n this.#nesting -= 1;\n return expression;\n }\n this.#predicates += 1;\n if (this.#predicates > MAX_PREDICATES) {\n throw this.#error(`WHERE predicates exceed ${MAX_PREDICATES}`);\n }\n const column = this.#identifier();\n if (this.#acceptKeyword('IS')) {\n const negated = this.#acceptKeyword('NOT');\n this.#expectKeyword('NULL');\n return { kind: 'isNull', column, negated };\n }\n const token = this.#current();\n if (token.kind !== 'symbol' || !['=', '!=', '<>', '<', '<=', '>', '>='].includes(token.text)) {\n throw this.#error('Expected a comparison operator or IS [NOT] NULL');\n }\n this.#index += 1;\n const operator = (token.text === '<>' ? '!=' : token.text) as SqlComparisonOperator;\n return { kind: 'comparison', column, operator, value: this.#value() };\n }\n\n #rowCount(clause: string): SqlValueExpression {\n const value = this.#value();\n if (\n value.kind === 'literal' &&\n (typeof value.value !== 'number' || !Number.isSafeInteger(value.value) || value.value < 0)\n ) {\n throw this.#error(`${clause} must be a non-negative safe integer or parameter`);\n }\n return value;\n }\n\n #value(): SqlValueExpression {\n const token = this.#current();\n if (token.kind === 'parameter') {\n this.#index += 1;\n return { kind: 'parameter', index: this.#parameterCount++ };\n }\n if (token.kind === 'string') {\n this.#index += 1;\n return { kind: 'literal', value: token.text };\n }\n if (this.#acceptKeyword('NULL')) {\n return { kind: 'literal', value: null };\n }\n if (this.#acceptKeyword('TRUE')) {\n return { kind: 'literal', value: true };\n }\n if (this.#acceptKeyword('FALSE')) {\n return { kind: 'literal', value: false };\n }\n const sign = this.#acceptSymbol('-') ? '-' : this.#acceptSymbol('+') ? '+' : '';\n const number = this.#current();\n if (number.kind === 'number') {\n this.#index += 1;\n return { kind: 'literal', value: parseNumber(sign + number.text, token.position) };\n }\n throw this.#error('Expected a scalar literal or positional ? parameter');\n }\n\n #identifierList(): string[] {\n const names = new Set<string>();\n const columns: string[] = [];\n do {\n const name = this.#identifier();\n this.#assertUnique(names, name, 'column');\n columns.push(name);\n } while (this.#acceptSymbol(','));\n return columns;\n }\n\n #identifier(): string {\n const token = this.#current();\n if (token.kind !== 'identifier' && (token.kind !== 'word' || KEYWORDS.has(token.text.toUpperCase()))) {\n throw this.#error('Expected an identifier; use double quotes for keywords');\n }\n if (\n token.text.length === 0 ||\n token.text.length > MAX_IDENTIFIER_LENGTH ||\n hasControlCharacters(token.text) ||\n FORBIDDEN_IDENTIFIERS.has(token.text.toLowerCase()) ||\n !hasValidUnicode(token.text)\n ) {\n throw this.#error('Invalid or reserved identifier');\n }\n this.#index += 1;\n return token.text;\n }\n\n #assertUnique(names: Set<string>, name: string, label: string): void {\n if (names.has(name)) {\n throw this.#error(`Duplicate ${label}: ${name}`);\n }\n names.add(name);\n }\n\n #current(): Token {\n return this.#tokens[this.#index];\n }\n\n #acceptKeyword(keyword: string): boolean {\n const token = this.#current();\n if (token.kind !== 'word' || token.text.toUpperCase() !== keyword) {\n return false;\n }\n this.#index += 1;\n return true;\n }\n\n #expectKeyword(keyword: string): void {\n if (!this.#acceptKeyword(keyword)) {\n throw this.#error(`Expected ${keyword}`);\n }\n }\n\n #acceptSymbol(symbol: string): boolean {\n const token = this.#current();\n if (token.kind !== 'symbol' || token.text !== symbol) {\n return false;\n }\n this.#index += 1;\n return true;\n }\n\n #expectSymbol(symbol: string): void {\n if (!this.#acceptSymbol(symbol)) {\n throw this.#error(`Expected ${symbol}`);\n }\n }\n\n #error(message: string): SqlSyntaxError {\n return new SqlSyntaxError(message, this.#current().position);\n }\n}\n\nfunction tokenize(sql: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < sql.length) {\n const character = sql[index];\n if (/\\s/u.test(character)) {\n index += 1;\n continue;\n }\n if (sql.startsWith('--', index)) {\n index += 2;\n while (index < sql.length && sql[index] !== '\\n' && sql[index] !== '\\r') {\n index += 1;\n }\n continue;\n }\n if (sql.startsWith('/*', index)) {\n const end = sql.indexOf('*/', index + 2);\n if (end < 0) {\n throw new SqlSyntaxError('Unterminated block comment', index);\n }\n index = end + 2;\n continue;\n }\n if (tokens.length >= MAX_TOKENS) {\n throw new SqlSyntaxError(`SQL token count exceeds ${MAX_TOKENS}`, index);\n }\n const position = index;\n if (character === \"'\" || character === '\"') {\n const quote = character;\n let text = '';\n let closed = false;\n index += 1;\n while (index < sql.length) {\n if (sql[index] === quote) {\n if (sql[index + 1] === quote) {\n text += quote;\n index += 2;\n } else {\n index += 1;\n closed = true;\n break;\n }\n } else {\n text += sql[index++];\n }\n }\n if (!closed) {\n throw new SqlSyntaxError('Unterminated quoted token', position);\n }\n if (!hasValidUnicode(text)) {\n throw new SqlSyntaxError('Quoted token must contain valid Unicode scalar values', position);\n }\n tokens.push({ kind: quote === \"'\" ? 'string' : 'identifier', text, position });\n } else if (/[A-Za-z_]/u.test(character)) {\n index += 1;\n while (index < sql.length && /\\w/u.test(sql[index])) {\n index += 1;\n }\n tokens.push({ kind: 'word', text: sql.slice(position, index), position });\n } else if (/\\d/u.test(character) || (character === '.' && /\\d/u.test(sql[index + 1] ?? ''))) {\n index += 1;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n if (character !== '.' && sql[index] === '.') {\n index += 1;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n }\n if (sql[index] === 'e' || sql[index] === 'E') {\n index += 1;\n if (sql[index] === '+' || sql[index] === '-') {\n index += 1;\n }\n const exponentStart = index;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n if (index === exponentStart) {\n throw new SqlSyntaxError('Invalid numeric exponent', position);\n }\n }\n const text = sql.slice(position, index);\n if (text.length > MAX_NUMBER_LENGTH) {\n throw new SqlSyntaxError(`Numeric literal exceeds ${MAX_NUMBER_LENGTH} characters`, position);\n }\n tokens.push({ kind: 'number', text, position });\n } else if (character === '?') {\n index += 1;\n tokens.push({ kind: 'parameter', text: character, position });\n } else {\n const pair = sql.slice(index, index + 2);\n if (['<=', '>=', '<>', '!='].includes(pair)) {\n index += 2;\n tokens.push({ kind: 'symbol', text: pair, position });\n } else if ('(),;*=<>+-'.includes(character)) {\n index += 1;\n tokens.push({ kind: 'symbol', text: character, position });\n } else {\n throw new SqlSyntaxError(`Unsupported SQL character: ${character}`, position);\n }\n }\n }\n tokens.push({ kind: 'end', text: '', position: sql.length });\n return tokens;\n}\n\nfunction fitsSigned64(value: number): boolean {\n if (!Number.isInteger(value)) {\n return false;\n }\n const integer = BigInt(value);\n return integer >= SQL_INTEGER_MIN && integer <= SQL_INTEGER_MAX;\n}\n\nfunction parseNumber(text: string, position: number): number | bigint {\n if (/^[+-]?\\d+$/u.test(text)) {\n const integer = BigInt(text);\n if (integer < SQL_INTEGER_MIN || integer > SQL_INTEGER_MAX) {\n throw new SqlSyntaxError('Integer literal exceeds the signed 64-bit range', position);\n }\n return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n const value = Number(text);\n // Magnitudes at or above 2^63 are finite REAL values and do not fit in INTEGER.\n if (!Number.isFinite(value) || (Number.isInteger(value) && !Number.isSafeInteger(value) && fitsSigned64(value))) {\n throw new SqlSyntaxError('REAL literal must be finite; use integer notation for large integers', position);\n }\n const [mantissa, exponentText = '0'] = text.toLowerCase().split('e');\n const digits = mantissa.replace(/[+.-]/gu, '');\n const nonzero = /[1-9]/u.test(digits);\n if (value === 0 && nonzero) {\n throw new SqlSyntaxError('REAL literal underflows to zero', position);\n }\n if (Number.isInteger(value) && nonzero) {\n const fractionLength = mantissa.includes('.') ? mantissa.length - mantissa.indexOf('.') - 1 : 0;\n const trailingZeros = digits.length - digits.replace(/0+$/u, '').length;\n if (Number(exponentText) - fractionLength + trailingZeros < 0) {\n throw new SqlSyntaxError('REAL literal loses its fractional part', position);\n }\n }\n return value;\n}\n\nfunction hasValidUnicode(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) as number;\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) as number;\n if (codePoint < 0x20 || codePoint === 0x7f) {\n return true;\n }\n }\n return false;\n}\n","import { indexKey, jsonDecode, jsonEncode, u64Key, utf8Encode } from './codec';\nimport { ConstraintError, SerializationError, StoreNotFoundError } from './errors';\nimport { normalizeIndexDefinitions, serializeNormalizedIndexDefinitions, type NormalizedIndexDef } from './indexing';\nimport { bindSqlParameters, parseSql, resolveSqlValue } from './sql-parser';\nimport type {\n SqlColumnDefinition,\n SqlExpression,\n SqlOrderBy,\n SqlStatement,\n SqlValue,\n SqlValueExpression\n} from './sql-types';\nimport type { DB, IndexDef, Range, ScanItem, Transaction } from './types';\n\nconst CATALOG = '_moyodb_sql_catalog';\nconst OWNER_KEY = Uint8Array.of(0);\nconst OWNER = { format: 'moyodb.sql', version: 1 };\nconst TABLE_OWNER_KEY = Uint8Array.of(255);\nconst TABLE_OWNER_FIELD = '\\u0000moyodb.sql.table';\nconst INTEGER_MIN = -(1n << 63n);\nconst INTEGER_MAX = (1n << 63n) - 1n;\nconst ROW_ID_MAX = (1n << 64n) - 1n;\nconst COLUMN_TYPES = new Set(['INTEGER', 'REAL', 'TEXT', 'BOOLEAN', 'BLOB']);\n\nexport type SqlRow = Record<string, SqlValue>;\nexport interface SqlQueryPlan {\n table: string;\n access: 'primary-key-lookup' | 'primary-key-range' | 'index-lookup' | 'index-range' | 'table-scan';\n column?: string;\n index?: string;\n sort: 'none' | 'memory';\n reason: string;\n}\nexport interface SqlResult {\n rows: SqlRow[];\n rowsAffected: number;\n plan?: SqlQueryPlan;\n}\nexport interface SqlClientOptions {\n indexes?: IndexDef[];\n}\nexport interface SqlClient {\n execute(sql: string, parameters?: readonly unknown[]): Promise<SqlResult>;\n query(sql: string, parameters?: readonly unknown[]): Promise<SqlRow[]>;\n explain(sql: string, parameters?: readonly unknown[]): Promise<SqlQueryPlan>;\n}\nexport class SqlSchemaError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'SqlSchemaError';\n }\n}\nexport class SqlTypeError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = 'SqlTypeError';\n }\n}\ninterface TableSchema {\n version: 1;\n table: string;\n columns: SqlColumnDefinition[];\n nextRowId: string;\n}\ninterface StoredRow {\n key: Uint8Array;\n row: SqlRow;\n}\ninterface AccessPlan {\n public: SqlQueryPlan;\n key?: Uint8Array;\n range?: Range;\n empty?: boolean;\n}\ntype Comparison = Extract<SqlExpression, { kind: 'comparison' }>;\ntype Truth = boolean | null;\n\nexport function createSqlClient(db: DB, options: SqlClientOptions = {}): SqlClient {\n const expectedIndexes = options.indexes === undefined ? null : normalizeIndexDefinitions(options.indexes);\n const run = async (sql: string, parameters: readonly unknown[], explain: boolean): Promise<SqlResult> => {\n const parsed = parseSql(sql);\n const bound = bindSqlParameters(parsed, parameters);\n const statement = parsed.statement;\n if (explain && !isRowStatement(statement)) {\n throw new SqlSchemaError('EXPLAIN requires SELECT, UPDATE, or DELETE');\n }\n const tx = await db.begin(statement.kind === 'select' || explain ? 'readonly' : 'readwrite');\n let finished = false;\n try {\n const indexes = normalizeIndexDefinitions((await tx.listIndexes?.()) ?? []);\n if (\n expectedIndexes &&\n serializeNormalizedIndexDefinitions(expectedIndexes) !== serializeNormalizedIndexDefinitions(indexes)\n ) {\n throw new SqlSchemaError('SQL index definitions do not match the transaction catalog');\n }\n const result = await executeStatement(tx, statement, bound, indexes, explain);\n // Finalization closes the SDK transaction even when it fails.\n finished = true;\n if (tx.mode === 'readwrite') {\n await tx.commit();\n } else {\n await tx.rollback();\n }\n return result;\n } catch (error) {\n if (!finished) {\n try {\n await tx.rollback();\n } catch (rollbackError) {\n throw new AggregateError([error, rollbackError], 'SQL statement and rollback failed', {\n cause: rollbackError\n });\n }\n }\n throw error;\n }\n };\n return {\n execute: (sql, parameters = []) => run(sql, parameters, false),\n async query(sql, parameters = []) {\n if (parseSql(sql).statement.kind !== 'select') {\n throw new SqlSchemaError('query() requires SELECT');\n }\n return (await run(sql, parameters, false)).rows;\n },\n async explain(sql, parameters = []) {\n const result = await run(sql, parameters, true);\n if (!result.plan) {\n throw new SqlSchemaError('statement has no query plan');\n }\n return result.plan;\n }\n };\n}\n\nasync function executeStatement(\n tx: Transaction,\n statement: SqlStatement,\n parameters: SqlValue[],\n indexes: NormalizedIndexDef[],\n explain: boolean\n): Promise<SqlResult> {\n assertTableName(statement.table);\n const catalogExists = await readCatalog(tx);\n const schema = catalogExists ? await readSchema(tx, statement.table) : null;\n if (schema) await assertTableOwnership(tx, schema);\n if (statement.kind === 'createTable') {\n if (schema) {\n if (statement.ifNotExists) return { rows: [], rowsAffected: 0 };\n throw new SqlSchemaError(`table already exists: ${statement.table}`);\n }\n const created: TableSchema = {\n version: 1,\n table: statement.table,\n columns: statement.columns,\n nextRowId: '1'\n };\n validateSchema(created, statement.table);\n if (!catalogExists) {\n await tx.createStore(CATALOG);\n await tx.put(CATALOG, OWNER_KEY, jsonEncode(OWNER));\n }\n await tx.createStore(statement.table);\n await tx.put(statement.table, TABLE_OWNER_KEY, tableOwnerValue(created));\n await tx.put(CATALOG, schemaKey(statement.table), jsonEncode(created));\n return { rows: [], rowsAffected: 0 };\n }\n if (!schema) {\n if (statement.kind === 'dropTable' && statement.ifExists) return { rows: [], rowsAffected: 0 };\n throw new SqlSchemaError(`table does not exist: ${statement.table}`);\n }\n if (statement.kind === 'dropTable') {\n await tx.dropStore(statement.table);\n await tx.delete(CATALOG, schemaKey(statement.table));\n return { rows: [], rowsAffected: 0 };\n }\n if (statement.kind === 'insert') {\n return insertRows(tx, schema, statement, parameters);\n }\n validateWhere(schema, statement.where, parameters);\n if (statement.kind === 'select') {\n validateColumnList(schema, statement.columns);\n for (const order of statement.orderBy) getColumn(schema, order.column);\n }\n if (statement.kind === 'update') {\n validateColumnList(\n schema,\n statement.assignments.map((assignment) => assignment.column)\n );\n for (const assignment of statement.assignments) {\n normalizeValue(getColumn(schema, assignment.column), resolveSqlValue(assignment.value, parameters));\n }\n }\n const orderBy = statement.kind === 'select' ? statement.orderBy : [];\n const plan = planAccess(schema, statement.where, orderBy, parameters, indexes);\n const limit = statement.kind === 'select' ? resolveCount(statement.limit, parameters, 'LIMIT') : null;\n const offset = statement.kind === 'select' ? (resolveCount(statement.offset, parameters, 'OFFSET') ?? 0) : 0;\n if (explain) return { rows: [], rowsAffected: 0, plan: plan.public };\n const maxMatches =\n statement.kind === 'select' && plan.public.sort === 'none' && limit !== null\n ? Math.min(Number.MAX_SAFE_INTEGER, offset + limit)\n : undefined;\n const rows = limit === 0 ? [] : await readRows(tx, schema, plan, statement.where, parameters, maxMatches);\n if (statement.kind === 'select') {\n if (plan.public.sort === 'memory') rows.sort((left, right) => compareRows(left, right, orderBy));\n const selected = rows.slice(offset, limit === null ? undefined : offset + limit);\n return {\n rows: selected.map(({ row }) =>\n projectRow(row, statement.columns ?? schema.columns.map((column) => column.name))\n ),\n rowsAffected: 0,\n plan: plan.public\n };\n }\n if (statement.kind === 'delete') {\n await tx.deleteMany(\n schema.table,\n rows.map(({ key }) => key)\n );\n return { rows: [], rowsAffected: rows.length, plan: plan.public };\n }\n const updates = rows.map(({ key, row }) => {\n const updated = { ...row };\n for (const assignment of statement.assignments) {\n updated[assignment.column] = normalizeValue(\n getColumn(schema, assignment.column),\n resolveSqlValue(assignment.value, parameters)\n );\n }\n const primary = primaryColumn(schema);\n return { oldKey: key, key: primary ? primaryKey(primary, updated[primary.name]) : key, row: updated };\n });\n const destinations = new Set<string>();\n const oldKeys = new Set(rows.map(({ key }) => bytesIdentity(key)));\n for (const update of updates) {\n const identity = bytesIdentity(update.key);\n if (destinations.has(identity)) throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n destinations.add(identity);\n if (!oldKeys.has(identity) && (await tx.has(schema.table, update.key))) {\n throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n }\n }\n await tx.deleteMany(\n schema.table,\n updates.map(({ oldKey }) => oldKey)\n );\n for (const update of updates) await tx.put(schema.table, update.key, encodeRow(schema, update.row));\n return { rows: [], rowsAffected: updates.length, plan: plan.public };\n}\n\nasync function readCatalog(tx: Transaction): Promise<boolean> {\n let value: Uint8Array | null;\n try {\n value = await tx.get(CATALOG, OWNER_KEY);\n } catch (error) {\n if (error instanceof StoreNotFoundError || (error instanceof Error && error.name === 'StoreNotFoundError'))\n return false;\n throw error;\n }\n if (!value) throw new SqlSchemaError(`SQL catalog store is not owned by SQL: ${CATALOG}`);\n const owner: unknown = decodeJson(value);\n if (!isRecord(owner) || owner.format !== OWNER.format || owner.version !== OWNER.version) {\n throw new SqlSchemaError('invalid SQL catalog metadata');\n }\n return true;\n}\n\nasync function readSchema(tx: Transaction, table: string): Promise<TableSchema | null> {\n const value = await tx.get(CATALOG, schemaKey(table));\n if (!value) return null;\n const schema: unknown = decodeJson(value);\n validateSchema(schema, table);\n return schema;\n}\n\nasync function assertTableOwnership(tx: Transaction, schema: TableSchema): Promise<void> {\n let owner: Uint8Array | null;\n try {\n owner = await tx.get(schema.table, TABLE_OWNER_KEY);\n } catch (error) {\n if (error instanceof StoreNotFoundError || (error instanceof Error && error.name === 'StoreNotFoundError')) {\n throw new SqlSchemaError(`SQL table store is missing: ${schema.table}`, { cause: error });\n }\n throw error;\n }\n if (!owner || compareBytes(owner, tableOwnerValue(schema)) !== 0) {\n throw new SqlSchemaError(`SQL table ownership does not match its catalog: ${schema.table}`);\n }\n}\n\nfunction tableOwnerValue(schema: TableSchema): Uint8Array {\n return jsonEncode({\n [TABLE_OWNER_FIELD]: JSON.stringify({\n format: 'moyodb.sql.table',\n version: schema.version,\n table: schema.table,\n columns: schema.columns\n })\n });\n}\n\nfunction validateSchema(value: unknown, table: string): asserts value is TableSchema {\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n value.table !== table ||\n !Array.isArray(value.columns) ||\n !value.columns.length ||\n typeof value.nextRowId !== 'string' ||\n value.nextRowId.length > 20 ||\n !/^[1-9]\\d*$/u.test(value.nextRowId) ||\n BigInt(value.nextRowId) > ROW_ID_MAX + 1n\n ) {\n throw new SqlSchemaError(`invalid schema metadata for ${table}`);\n }\n const names = new Set<string>();\n let primaries = 0;\n for (const candidate of value.columns as unknown[]) {\n if (\n !isRecord(candidate) ||\n typeof candidate.name !== 'string' ||\n !candidate.name.length ||\n typeof candidate.type !== 'string' ||\n !COLUMN_TYPES.has(candidate.type) ||\n typeof candidate.primaryKey !== 'boolean' ||\n typeof candidate.nullable !== 'boolean' ||\n names.has(candidate.name) ||\n (candidate.primaryKey && candidate.nullable)\n ) {\n throw new SqlSchemaError(`invalid column metadata for ${table}`);\n }\n names.add(candidate.name);\n if (candidate.primaryKey) primaries += 1;\n }\n if (primaries > 1) throw new SqlSchemaError(`multiple primary keys in ${table}`);\n}\n\nasync function insertRows(\n tx: Transaction,\n schema: TableSchema,\n statement: Extract<SqlStatement, { kind: 'insert' }>,\n parameters: SqlValue[]\n): Promise<SqlResult> {\n const columns = statement.columns ?? schema.columns.map((column) => column.name);\n validateColumnList(schema, columns);\n const primary = primaryColumn(schema);\n let nextRowId = BigInt(schema.nextRowId);\n const entries: Array<[Uint8Array, Uint8Array]> = [];\n const keys = new Set<string>();\n for (const values of statement.rows) {\n if (values.length !== columns.length) throw new SqlSchemaError('INSERT column count does not match VALUES');\n const row = Object.create(null) as SqlRow;\n for (const column of schema.columns) row[column.name] = null;\n values.forEach((expression, index) => {\n row[columns[index]] = resolveSqlValue(expression, parameters);\n });\n for (const column of schema.columns) row[column.name] = normalizeValue(column, row[column.name]);\n if (!primary && nextRowId > ROW_ID_MAX)\n throw new ConstraintError(`row identifier space exhausted in ${schema.table}`);\n const key = primary ? primaryKey(primary, row[primary.name]) : u64Key(nextRowId++);\n const identity = bytesIdentity(key);\n if (keys.has(identity) || (await tx.has(schema.table, key)))\n throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n keys.add(identity);\n entries.push([key, encodeRow(schema, row)]);\n }\n await tx.putMany(schema.table, entries);\n if (!primary) {\n schema.nextRowId = nextRowId.toString();\n await tx.put(CATALOG, schemaKey(schema.table), jsonEncode(schema));\n }\n return { rows: [], rowsAffected: entries.length };\n}\n\nfunction normalizeValue(column: SqlColumnDefinition, value: SqlValue): SqlValue {\n if (value === null) {\n if (!column.nullable) throw new ConstraintError(`column ${column.name} cannot be NULL`);\n return null;\n }\n switch (column.type) {\n case 'INTEGER': {\n if (typeof value !== 'bigint' && (typeof value !== 'number' || !Number.isSafeInteger(value))) break;\n const integer = typeof value === 'bigint' ? value : BigInt(value);\n if (integer < INTEGER_MIN || integer > INTEGER_MAX) break;\n return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n case 'REAL':\n if (typeof value === 'number' && Number.isFinite(value)) return Object.is(value, -0) ? 0 : value;\n if (typeof value === 'bigint') {\n const asNumber = Number(value);\n // Reject bigints Number would round. Exact powers of two above 2^53 stay finite REAL values.\n if (Number.isFinite(asNumber) && BigInt(asNumber) === value) return asNumber;\n }\n break;\n case 'TEXT':\n if (typeof value === 'string') {\n indexKey(value);\n return value;\n }\n break;\n case 'BOOLEAN':\n if (typeof value === 'boolean') return value;\n break;\n case 'BLOB':\n if (value instanceof Uint8Array) return value.slice();\n break;\n }\n throw new SqlTypeError(`column ${column.name} requires ${column.type}`);\n}\n\nfunction primaryKey(column: SqlColumnDefinition, value: SqlValue): Uint8Array {\n if (value === null) throw new ConstraintError(`primary key ${column.name} cannot be NULL`);\n if (column.type === 'INTEGER') return u64Key(BigInt(value as number | bigint) - INTEGER_MIN);\n if (typeof value === 'bigint') throw new SqlTypeError(`invalid primary key ${column.name}`);\n return indexKey(value);\n}\n\nfunction encodeRow(schema: TableSchema, row: SqlRow): Uint8Array {\n const stored = Object.create(null) as Record<string, unknown>;\n for (const column of schema.columns) stored[column.name] = storedValue(row[column.name]);\n return jsonEncode(stored);\n}\n\nfunction storedValue(value: SqlValue): null | boolean | number | string {\n // Keep native index fields scalar. The table schema restores integers and bytes.\n if (typeof value === 'bigint') return value.toString();\n if (value instanceof Uint8Array) return bytesIdentity(value);\n return value;\n}\n\nfunction decodeRow(schema: TableSchema, item: ScanItem): StoredRow {\n const stored: unknown = decodeJson(item.value);\n if (!isRecord(stored) || Object.keys(stored).length !== schema.columns.length)\n throw new SerializationError(`invalid SQL row in ${schema.table}`);\n const row = Object.create(null) as SqlRow;\n try {\n for (const column of schema.columns) {\n if (!Object.hasOwn(stored, column.name)) throw new Error('missing SQL column');\n let value = stored[column.name];\n if (column.type === 'INTEGER' && typeof value === 'string') {\n if (value.length > 20 || !/^-?(?:0|[1-9]\\d*)$/u.test(value)) throw new Error('invalid stored integer');\n value = BigInt(value);\n } else if (column.type === 'BLOB' && typeof value === 'string') {\n if (value.length % 2 || !/^[0-9a-f]*$/u.test(value)) throw new Error('invalid stored blob');\n value = Uint8Array.from(value.match(/.{2}/gu) ?? [], (byte) => Number.parseInt(byte, 16));\n }\n if (\n value !== null &&\n typeof value !== 'boolean' &&\n typeof value !== 'number' &&\n typeof value !== 'string' &&\n typeof value !== 'bigint' &&\n !(value instanceof Uint8Array)\n )\n throw new Error('invalid stored value');\n row[column.name] = normalizeValue(column, value);\n }\n const primary = primaryColumn(schema);\n if (primary && compareBytes(primaryKey(primary, row[primary.name]), item.key) !== 0)\n throw new Error('SQL row primary key differs from storage key');\n } catch (error) {\n throw new SerializationError(\n `invalid SQL row in ${schema.table}: ${error instanceof Error ? error.message : 'invalid value'}`\n );\n }\n return { key: item.key, row };\n}\n\nfunction validateWhere(schema: TableSchema, expression: SqlExpression | null, parameters: SqlValue[]): void {\n if (!expression) return;\n if ('left' in expression) {\n validateWhere(schema, expression.left, parameters);\n validateWhere(schema, expression.right, parameters);\n return;\n }\n const column = getColumn(schema, expression.column);\n if (expression.kind === 'comparison') {\n const value = resolveSqlValue(expression.value, parameters);\n if (value === null) return;\n if (column.type === 'INTEGER' || column.type === 'REAL') {\n if (typeof value === 'bigint' || (typeof value === 'number' && Number.isFinite(value))) return;\n throw new SqlTypeError(`comparison for ${column.name} requires a numeric value`);\n }\n normalizeValue({ ...column, nullable: true }, value);\n }\n}\n\nfunction evaluateWhere(row: SqlRow, expression: SqlExpression, parameters: SqlValue[]): Truth {\n if ('left' in expression) {\n const left = evaluateWhere(row, expression.left, parameters);\n const right = evaluateWhere(row, expression.right, parameters);\n if (expression.kind === 'and')\n return left === false || right === false ? false : left === null || right === null ? null : true;\n return left === true || right === true ? true : left === null || right === null ? null : false;\n }\n const left = row[expression.column];\n if (expression.kind === 'isNull') return expression.negated ? left !== null : left === null;\n const right = resolveSqlValue(expression.value, parameters);\n if (left === null || right === null) return null;\n const compared = compareValues(left, right);\n switch (expression.operator) {\n case '=':\n return compared === 0;\n case '!=':\n return compared !== 0;\n case '<':\n return compared < 0;\n case '<=':\n return compared <= 0;\n case '>':\n return compared > 0;\n case '>=':\n return compared >= 0;\n }\n}\n\nfunction planAccess(\n schema: TableSchema,\n where: SqlExpression | null,\n orderBy: SqlOrderBy[],\n parameters: SqlValue[],\n indexes: NormalizedIndexDef[]\n): AccessPlan {\n const comparisons = conjunctiveComparisons(where);\n const primary = primaryColumn(schema);\n const candidates: Array<{ column: SqlColumnDefinition; index?: NormalizedIndexDef }> = [];\n if (primary) candidates.push({ column: primary });\n for (const index of indexes) {\n // Native dotted paths address nested fields. SQL columns are flat properties.\n if (\n index.store === schema.table &&\n !index.compound &&\n index.keyPath.length === 1 &&\n !index.keyPath[0].includes('.')\n ) {\n const column = schema.columns.find((entry) => entry.name === index.keyPath[0]);\n if (column) candidates.push({ column, index });\n }\n }\n for (const equalityOnly of [true, false]) {\n for (const candidate of candidates) {\n const selected = comparisons.filter(\n (entry) =>\n entry.column === candidate.column.name &&\n (equalityOnly ? entry.operator === '=' : ['<', '<=', '>', '>='].includes(entry.operator))\n );\n let key: Uint8Array | undefined;\n const range: Range = {};\n for (const comparison of selected) {\n const value = resolveSqlValue(comparison.value, parameters);\n const encoded = planKey(candidate.column, value, Boolean(candidate.index), equalityOnly);\n if (!encoded) continue;\n if (equalityOnly) {\n key = encoded;\n break;\n }\n setRangeBound(range, comparison.operator, encoded);\n }\n if (!key && !Object.keys(range).length) continue;\n const access: SqlQueryPlan['access'] = candidate.index\n ? equalityOnly\n ? 'index-lookup'\n : 'index-range'\n : equalityOnly\n ? 'primary-key-lookup'\n : 'primary-key-range';\n const ordered = traversalOrder(schema, candidate.column, candidate.index, orderBy, key);\n if (ordered && orderBy[0]?.direction === 'desc') range.reverse = true;\n return {\n public: {\n table: schema.table,\n access,\n column: candidate.column.name,\n ...(candidate.index ? { index: candidate.index.name } : {}),\n sort: ordered ? 'none' : 'memory',\n reason: `use ${candidate.index ? `index ${candidate.index.name}` : 'primary key'} for ${equalityOnly ? 'equality' : 'range'}; apply remaining predicates after lookup`\n },\n key,\n range,\n empty: !key && emptyRange(range)\n };\n }\n }\n if (orderBy.length) {\n for (const candidate of candidates) {\n if (!traversalOrder(schema, candidate.column, candidate.index, orderBy)) continue;\n return {\n public: {\n table: schema.table,\n access: candidate.index ? 'index-range' : 'table-scan',\n column: candidate.column.name,\n ...(candidate.index ? { index: candidate.index.name } : {}),\n sort: 'none',\n reason: `use ${candidate.index ? `index ${candidate.index.name}` : 'primary key'} traversal order`\n },\n range: { reverse: orderBy[0].direction === 'desc' }\n };\n }\n }\n return {\n public: {\n table: schema.table,\n access: 'table-scan',\n sort: orderBy.length ? 'memory' : 'none',\n reason: 'no supported primary key or index bound; filter table rows'\n }\n };\n}\n\nfunction traversalOrder(\n schema: TableSchema,\n column: SqlColumnDefinition,\n index: NormalizedIndexDef | undefined,\n orders: SqlOrderBy[],\n key?: Uint8Array\n): boolean {\n if (!orders.length || (key && !index)) return true;\n if (orders[0].column !== column.name) return false;\n if (!index) return orders.length === 1;\n // INTEGER indexes mix numeric keys and decimal strings for large values.\n if (column.type === 'INTEGER' && !key) return false;\n // SQL ties use primary ASC. Reverse index traversal reverses those ties.\n if (orders.length === 1) return orders[0].direction === 'asc' || (index.unique && !column.nullable);\n const primary = primaryColumn(schema);\n return orders.length === 2 && orders[1].column === primary?.name && orders[1].direction === orders[0].direction;\n}\n\nfunction planKey(\n column: SqlColumnDefinition,\n value: SqlValue,\n secondary: boolean,\n equality: boolean\n): Uint8Array | null {\n if (value === null) return null;\n if (column.type === 'INTEGER') {\n if (typeof value !== 'bigint' && (typeof value !== 'number' || !Number.isSafeInteger(value))) return null;\n if (secondary && !equality) return null;\n const normalized = normalizeValue({ ...column, nullable: true }, value);\n return secondary ? indexKey(storedValue(normalized)) : primaryKey(column, normalized);\n }\n if (\n column.type === 'REAL' &&\n typeof value === 'bigint' &&\n (value < BigInt(Number.MIN_SAFE_INTEGER) || value > BigInt(Number.MAX_SAFE_INTEGER))\n )\n return null;\n const normalized = normalizeValue({ ...column, nullable: true }, value);\n return secondary ? indexKey(storedValue(normalized)) : primaryKey(column, normalized);\n}\n\nfunction conjunctiveComparisons(where: SqlExpression | null): Comparison[] {\n if (!where) return [];\n if (where.kind === 'comparison') return [where];\n if (where.kind === 'and') return [...conjunctiveComparisons(where.left), ...conjunctiveComparisons(where.right)];\n return [];\n}\n\nfunction setRangeBound(range: Range, operator: Comparison['operator'], key: Uint8Array): void {\n if (operator === '>' || operator === '>=') {\n const current = range.gt ?? range.gte;\n const compared = current ? compareBytes(key, current) : 1;\n if (compared > 0 || (compared === 0 && operator === '>')) {\n delete range.gt;\n delete range.gte;\n if (operator === '>') range.gt = key;\n else range.gte = key;\n }\n } else if (operator === '<' || operator === '<=') {\n const current = range.lt ?? range.lte;\n const compared = current ? compareBytes(key, current) : -1;\n if (compared < 0 || (compared === 0 && operator === '<')) {\n delete range.lt;\n delete range.lte;\n if (operator === '<') range.lt = key;\n else range.lte = key;\n }\n }\n}\n\nfunction emptyRange(range: Range): boolean {\n const lower = range.gt ?? range.gte;\n const upper = range.lt ?? range.lte;\n if (!lower || !upper) return false;\n const compared = compareBytes(lower, upper);\n return compared > 0 || (compared === 0 && (Boolean(range.gt) || Boolean(range.lt)));\n}\n\nasync function readRows(\n tx: Transaction,\n schema: TableSchema,\n plan: AccessPlan,\n where: SqlExpression | null,\n parameters: SqlValue[],\n maxMatches?: number\n): Promise<StoredRow[]> {\n if (plan.empty) return [];\n const rows: StoredRow[] = [];\n const accept = (item: ScanItem): boolean => {\n if (item.key.length === 1 && item.key[0] === TABLE_OWNER_KEY[0]) return false;\n const row = decodeRow(schema, item);\n if (!where || evaluateWhere(row.row, where, parameters) === true) rows.push(row);\n return maxMatches !== undefined && rows.length >= maxMatches;\n };\n if (plan.public.index) {\n const range = plan.key ? { ...plan.range, gte: plan.key, lte: plan.key } : plan.range;\n for await (const [key, value] of tx.scanByIndex(schema.table, plan.public.index, range, {\n maxRows: Math.min(256, maxMatches ?? 256)\n })) {\n if (accept({ key, value })) break;\n }\n } else if (plan.key) {\n const value = await tx.get(schema.table, plan.key);\n if (value) accept({ key: plan.key, value });\n } else if (typeof tx.scanPage === 'function' && typeof tx.closeScanCursor === 'function') {\n let cursor: number | undefined;\n try {\n for (;;) {\n const page = await tx.scanPage(schema.table, plan.range, {\n cursor,\n maxRows: Math.min(256, maxMatches === undefined ? 256 : maxMatches - rows.length)\n });\n cursor = page.cursor;\n for (const item of page.rows) {\n if (accept(item)) return rows;\n }\n if (page.done) break;\n }\n } finally {\n if (cursor !== undefined) await tx.closeScanCursor(cursor);\n }\n } else {\n // Custom databases that implement the earlier Transaction API have no cursor methods.\n for (const item of await tx.scan(schema.table, plan.range)) {\n if (accept(item)) break;\n }\n }\n return rows;\n}\n\nfunction compareRows(left: StoredRow, right: StoredRow, orders: SqlOrderBy[]): number {\n for (const order of orders) {\n const compared = compareValues(left.row[order.column], right.row[order.column]);\n if (compared) return order.direction === 'desc' ? -compared : compared;\n }\n return compareBytes(left.key, right.key);\n}\n\nfunction compareValues(left: SqlValue, right: SqlValue): number {\n if (left === null) return right === null ? 0 : -1;\n if (right === null) return 1;\n if (\n (typeof left === 'number' || typeof left === 'bigint') &&\n (typeof right === 'number' || typeof right === 'bigint')\n )\n return left < right ? -1 : left > right ? 1 : 0;\n if (typeof left === 'string' && typeof right === 'string') return compareBytes(indexKey(left), indexKey(right));\n if (typeof left === 'boolean' && typeof right === 'boolean') return Number(left) - Number(right);\n if (left instanceof Uint8Array && right instanceof Uint8Array) return compareBytes(left, right);\n throw new SqlTypeError('comparison values have different SQL types');\n}\n\nfunction resolveCount(expression: SqlValueExpression | null, parameters: SqlValue[], clause: string): number | null {\n if (!expression) return null;\n const value = resolveSqlValue(expression, parameters);\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)\n throw new SqlTypeError(`${clause} requires a non-negative safe integer`);\n return value;\n}\n\nfunction projectRow(row: SqlRow, columns: string[]): SqlRow {\n const result: SqlRow = {};\n for (const column of columns)\n Object.defineProperty(result, column, {\n value: row[column] instanceof Uint8Array ? row[column].slice() : row[column],\n enumerable: true,\n configurable: true,\n writable: true\n });\n return result;\n}\n\nfunction validateColumnList(schema: TableSchema, columns: string[] | null): void {\n if (!columns) return;\n const seen = new Set<string>();\n for (const name of columns) {\n getColumn(schema, name);\n if (seen.has(name)) throw new SqlSchemaError(`duplicate column: ${name}`);\n seen.add(name);\n }\n}\n\nfunction getColumn(schema: TableSchema, name: string): SqlColumnDefinition {\n const column = schema.columns.find((entry) => entry.name === name);\n if (!column) throw new SqlSchemaError(`unknown column: ${name}`);\n return column;\n}\n\nfunction primaryColumn(schema: TableSchema): SqlColumnDefinition | undefined {\n return schema.columns.find((column) => column.primaryKey);\n}\nfunction schemaKey(table: string): Uint8Array {\n return utf8Encode(`table:${table}`);\n}\nfunction assertTableName(table: string): void {\n if (table === CATALOG || table.startsWith('__browserdb:'))\n throw new SqlSchemaError(`reserved SQL table name: ${table}`);\n}\nfunction isRowStatement(statement: SqlStatement): boolean {\n return statement.kind === 'select' || statement.kind === 'update' || statement.kind === 'delete';\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction decodeJson(value: Uint8Array): unknown {\n try {\n return jsonDecode<unknown>(value);\n } catch {\n throw new SerializationError('invalid SQL JSON data');\n }\n}\nfunction bytesIdentity(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\nfunction compareBytes(left: Uint8Array, right: Uint8Array): number {\n for (let index = 0; index < Math.min(left.length, right.length); index += 1)\n if (left[index] !== right[index]) return left[index] - right[index];\n return left.length - right.length;\n}\n","import type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DB,\n DbSubscriptionCallback,\n DebugFailpoint,\n ExportSnapshotOptions,\n IndexDef,\n IndexScanOptions,\n MigrateHook,\n OpenOptions,\n PutOptions,\n Range,\n ScanItem,\n ScanCursor,\n ScanPage,\n ScanPageOptions,\n StorageInfo,\n Transaction,\n TxId,\n TxMode,\n Unsubscribe\n} from './types';\nimport {\n acquireDbWorker,\n deleteDbByName,\n destroyDbWorker,\n invalidateTransactions,\n releaseDbWorker,\n subscribeHandleInvalidated,\n subscribeTransactionsInvalidated,\n unsafeDebugCrashWorker as crashWorkerByName,\n type RegistryEntry\n} from './registry';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n normalizeError,\n TransactionClosedError,\n UnsupportedPlatformError,\n VersionError\n} from './errors';\nimport {\n assertPublicStoreName,\n normalizeIndexDefinitions,\n serializeNormalizedIndexDefinitions,\n toPublicIndexDefinitions,\n type NormalizedIndexDef\n} from './indexing';\nimport { SubscriptionHub } from './subscriptions';\nimport { compareStringsByCodeUnit, withTimeout } from './internal';\nimport type { AutocommitCommand, IndexScanPage, WorkerScanPage } from './worker-api';\nimport type { AutocommitArgs, WorkerCommandResult } from './worker-protocol';\n\nconst INDEX_SCAN_PAGE_ROWS = 256;\nconst SCAN_PAGE_ROWS = 256;\nconst SCAN_PAGE_BYTES = 8 * 1024 * 1024 + 18 + 1024 + 12;\n\nasync function callProxy<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw normalizeError(error);\n }\n}\n\nclass TransactionImpl implements Transaction {\n readonly mode: TxMode;\n #entry: RegistryEntry;\n #txId: number;\n #closed = false;\n #scanCursors = new Set<ScanCursor>();\n #onClose: () => void;\n constructor(entry: RegistryEntry, txId: number, mode: TxMode, onClose: () => void) {\n this.#entry = entry;\n this.#txId = txId;\n this.mode = mode;\n this.#onClose = onClose;\n }\n async listIndexes(): Promise<IndexDef[]> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.getIndexes(this.#txId));\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.get(this.#txId, store, key));\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getMany(this.#txId, store, keys));\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.has(this.#txId, store, key));\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.put(this.#txId, store, key, value, normalizePutOptions(options)));\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options: PutOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.putMany(this.#txId, store, entries, normalizePutOptions(options)));\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.delete(this.#txId, store, key));\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.deleteMany(this.#txId, store, keys));\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.applyBatch(this.#txId, store, ops));\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.scan(this.#txId, store, range));\n }\n async scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const normalized = normalizeScanPageOptions(options);\n if (normalized.cursor !== undefined && !this.#scanCursors.has(normalized.cursor)) {\n throw new TypeError('scan cursor does not belong to this transaction');\n }\n const page = await callProxy(() =>\n this.#entry.proxy.scanPage({\n txId: this.#txId,\n store,\n range,\n cursorId: normalized.cursor,\n maxRows: normalized.maxRows,\n maxBytes: normalized.maxBytes\n })\n );\n this.#ensureOpen();\n if (normalized.cursor !== undefined) this.#scanCursors.delete(normalized.cursor);\n if (page.cursorId !== undefined && !this.#closed) this.#scanCursors.add(page.cursorId);\n return publicScanPage(page);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return iterateScanPages(this, store, range, options);\n }\n async closeScanCursor(cursor: ScanCursor): Promise<void> {\n normalizeScanCursor(cursor);\n if (!this.#scanCursors.delete(cursor) || this.#entry.invalidated) return;\n await callProxy(() => this.#entry.proxy.closeCursor(cursor));\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getByIndex(this.#txId, store, indexName, key));\n }\n async *scanByIndex(\n store: string,\n indexName: string,\n range: Range = {},\n options: IndexScanOptions = {}\n ): AsyncIterable<[Uint8Array, Uint8Array]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const { maxRows: pageRows, maxBytes } = normalizeScanPageOptions(options);\n let remaining = range.limit ?? Number.POSITIVE_INFINITY;\n let cursor: Uint8Array | null = null;\n while (remaining > 0) {\n this.#ensureOpen();\n const pageLimit = Math.min(remaining, pageRows, INDEX_SCAN_PAGE_ROWS);\n const resumeAfter: Uint8Array | null = cursor;\n const page: IndexScanPage = await callProxy(() =>\n this.#entry.proxy.scanByIndexPage(this.#txId, store, indexName, range, resumeAfter, pageLimit, maxBytes)\n );\n for (const row of page.rows) {\n yield [row.key, row.value];\n }\n remaining -= page.rows.length;\n if (page.cursor === null) {\n return;\n }\n cursor = page.cursor;\n }\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.createStore(this.#txId, name, normalizeCreateStoreOptions(options)));\n }\n async dropStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.dropStore(this.#txId, name));\n }\n async clearStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.clearStore(this.#txId, name));\n }\n async commit(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.commit(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollback(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.rollback(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollbackIfOpen(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (this.#entry.invalidated) {\n this.#markClosed();\n return;\n }\n try {\n await this.#entry.proxy.rollback(this.#txId);\n } catch (error) {\n const normalized = normalizeError(error);\n if (!(normalized instanceof TransactionClosedError)) {\n throw normalized;\n }\n } finally {\n this.#markClosed();\n }\n }\n forceClose(): void {\n this.#markClosed();\n }\n internalId(): number {\n return this.#txId;\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new TransactionClosedError();\n }\n }\n #markClosed() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#scanCursors.clear();\n this.#onClose();\n }\n}\nclass DBImpl implements DB {\n #entry: RegistryEntry;\n #closed = false;\n #closePromise: Promise<void> | null = null;\n #transactions = new Set<TransactionImpl>();\n #pendingBegins = new Set<Promise<TransactionImpl>>();\n #scanCursors = new Set<ScanCursor>();\n #pendingScanPages = new Set<Promise<WorkerScanPage>>();\n #transactionGeneration = 0;\n #subscriptions: SubscriptionHub;\n #unsubscribeTxInvalidated: (() => void) | null = null;\n #unsubscribeHandleInvalidated: (() => void) | null = null;\n constructor(entry: RegistryEntry) {\n this.#entry = entry;\n this.#subscriptions = new SubscriptionHub(entry.dbName, entry.channelName);\n this.#unsubscribeTxInvalidated = subscribeTransactionsInvalidated(entry, () => {\n this.#forceCloseTransactions();\n });\n this.#unsubscribeHandleInvalidated = subscribeHandleInvalidated(entry, () => {\n this.#markInvalidated();\n });\n }\n async begin(mode: TxMode = 'readonly'): Promise<Transaction> {\n return this.#beginImpl(mode);\n }\n async runSchemaMigration(\n oldVersion: number,\n newVersion: number,\n migrate: MigrateHook,\n targetIndexes: IndexDef[]\n ): Promise<void> {\n this.#ensureOpen();\n const tx = await this.#beginImpl('readwrite');\n const tracker = new MigrationCatalogTracker();\n const migrationTransaction = new MigrationTransactionImpl(tx, tracker);\n const migrationDb = new MigrationDbImpl(this, migrationTransaction, tracker);\n try {\n await this.#entry.proxy.reconcileIndexes(tx.internalId(), targetIndexes);\n await migrate({\n db: migrationDb,\n oldVersion,\n newVersion,\n transaction: migrationTransaction\n });\n await this.#entry.proxy.setSchemaVersion(tx.internalId(), newVersion);\n await tx.commit();\n } catch (error) {\n try {\n await tx.rollbackIfOpen();\n } catch {}\n throw error;\n }\n }\n async listStores(): Promise<string[]> {\n return this.#call(() => this.#entry.proxy.listStores());\n }\n async listIndexes(): Promise<IndexDef[]> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.getIndexes());\n }\n async getVersion(): Promise<number> {\n return this.#call(() => this.#entry.proxy.getVersion());\n }\n async changesSince(txid: TxId, options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n return this.#call(() =>\n this.#entry.proxy.changesSince(normalizeTxId(txid), normalizeChangeFeedOptions(options))\n );\n }\n async #beginImpl(mode: TxMode): Promise<TransactionImpl> {\n this.#ensureOpen();\n const generation = this.#transactionGeneration;\n const pending = callProxy(async () => {\n const txId = await this.#entry.proxy.begin(mode);\n const tx = new TransactionImpl(this.#entry, txId, mode, () => {\n this.#transactions.delete(tx);\n });\n this.#transactions.add(tx);\n if (this.#closed || this.#entry.invalidated) {\n if (this.#entry.invalidated) {\n tx.forceClose();\n }\n throw new DatabaseClosedError();\n }\n if (generation !== this.#transactionGeneration) {\n await tx.rollbackIfOpen();\n throw new TransactionClosedError();\n }\n return tx;\n });\n this.#pendingBegins.add(pending);\n try {\n return await pending;\n } finally {\n this.#pendingBegins.delete(pending);\n }\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'createStore', [name, normalizeCreateStoreOptions(options)]);\n }\n async dropStore(name: string): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'dropStore', [name]);\n }\n async clearStore(name: string): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'clearStore', [name]);\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'get', [store, key]);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'getMany', [store, keys]);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'has', [store, key]);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n assertPublicStoreName(store);\n await this.#autocommit('readwrite', 'put', [store, key, value, normalizePutOptions(options)]);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n assertPublicStoreName(store);\n return this.#autocommit('readwrite', 'delete', [store, key]);\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'scan', [store, range]);\n }\n async scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const normalized = normalizeScanPageOptions(options);\n if (normalized.cursor !== undefined && !this.#scanCursors.has(normalized.cursor)) {\n throw new TypeError('scan cursor does not belong to this database handle');\n }\n const generation = this.#transactionGeneration;\n const pending = callProxy(() =>\n this.#entry.proxy.scanPage({\n store,\n range,\n cursorId: normalized.cursor,\n maxRows: normalized.maxRows,\n maxBytes: normalized.maxBytes\n })\n );\n this.#pendingScanPages.add(pending);\n try {\n const page = await pending;\n if (normalized.cursor !== undefined) this.#scanCursors.delete(normalized.cursor);\n if (page.cursorId !== undefined) this.#scanCursors.add(page.cursorId);\n this.#ensureOpen();\n if (generation !== this.#transactionGeneration) {\n if (page.cursorId !== undefined) await this.closeScanCursor(page.cursorId);\n throw new TransactionClosedError();\n }\n return publicScanPage(page);\n } finally {\n this.#pendingScanPages.delete(pending);\n }\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return iterateScanPages(this, store, range, options);\n }\n async closeScanCursor(cursor: ScanCursor): Promise<void> {\n normalizeScanCursor(cursor);\n if (!this.#scanCursors.delete(cursor) || this.#entry.invalidated) return;\n await callProxy(() => this.#entry.proxy.closeCursor(cursor));\n }\n /** The transaction boundary stays in the worker, so one round trip is enough. */\n async #autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.autocommit(mode, command, args));\n }\n async exportSnapshot(options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n return this.#call(async () => {\n const bytes = await this.#entry.proxy.exportSnapshot(normalizeExportSnapshotOptions(options));\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n });\n }\n async importSnapshot(data: Uint8Array): Promise<void> {\n return this.#callAfterTxInvalidation(() => {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n return this.#entry.proxy.importSnapshot(bytes);\n });\n }\n async reset(): Promise<void> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.reset());\n }\n async compact(): Promise<CompactionResult> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.compact());\n }\n async rebuild(): Promise<CompactionResult> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.rebuild());\n }\n async stats() {\n return this.#call(() => this.#entry.proxy.stats());\n }\n async storageInfo(): Promise<StorageInfo> {\n return this.#call(() => this.#entry.proxy.storageInfo());\n }\n async requestPersistence(): Promise<boolean> {\n return this.#call(() => this.#entry.proxy.requestPersistence());\n }\n async destroy(): Promise<void> {\n return this.#call(() => this.#entry.destroy?.() ?? destroyDbWorker(this.#entry));\n }\n async setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.#call(() => this.#entry.proxy.setFailpoint(failpoint));\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n this.#ensureOpen();\n if (typeof arg1 === 'function') {\n return this.#subscriptions.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (typeof arg1 === 'function') {\n return this.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'watch() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n close(): Promise<void> {\n if (this.#closePromise !== null) {\n return this.#closePromise;\n }\n if (this.#closed) {\n return Promise.resolve();\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#subscriptions.close();\n this.#closePromise = this.#finishClose();\n return this.#closePromise;\n }\n async #finishClose(): Promise<void> {\n await Promise.allSettled(Array.from(this.#pendingBegins));\n await Promise.allSettled(Array.from(this.#pendingScanPages));\n let rollbackError: Error | null = null;\n const cursorResults = await Promise.allSettled(\n Array.from(this.#scanCursors, (cursor) => this.closeScanCursor(cursor))\n );\n for (const result of cursorResults) {\n if (result.status === 'rejected' && rollbackError === null) rollbackError = normalizeError(result.reason);\n }\n const txs = Array.from(this.#transactions);\n if (txs.length > 0) {\n const results = await Promise.allSettled(txs.map((tx) => tx.rollbackIfOpen()));\n for (const result of results) {\n if (result.status === 'rejected' && rollbackError === null) {\n rollbackError = normalizeError(result.reason);\n }\n }\n }\n try {\n await (this.#entry.release?.() ?? releaseDbWorker(this.#entry));\n } catch (error) {\n throw normalizeError(error);\n }\n if (rollbackError) {\n throw rollbackError;\n }\n }\n #disposeRegistrySubscriptions() {\n this.#unsubscribeTxInvalidated?.();\n this.#unsubscribeTxInvalidated = null;\n this.#unsubscribeHandleInvalidated?.();\n this.#unsubscribeHandleInvalidated = null;\n }\n #forceCloseTransactions() {\n this.#transactionGeneration += 1;\n this.#scanCursors.clear();\n for (const tx of Array.from(this.#transactions)) {\n tx.forceClose();\n }\n }\n #markInvalidated() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#forceCloseTransactions();\n this.#subscriptions.close();\n }\n #call<T>(run: () => Promise<T>): Promise<T> {\n this.#ensureOpen();\n return callProxy(run);\n }\n #callAfterTxInvalidation<T>(run: () => Promise<T>): Promise<T> {\n this.#ensureOpen();\n invalidateTransactions(this.#entry);\n return callProxy(run);\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new DatabaseClosedError();\n }\n }\n}\nclass MigrationCatalogTracker {\n #created = new Set<string>();\n #dropped = new Set<string>();\n recordCreate(name: string): void {\n this.#dropped.delete(name);\n this.#created.add(name);\n }\n recordDrop(name: string): void {\n if (this.#created.delete(name)) {\n return;\n }\n this.#dropped.add(name);\n }\n apply(stores: string[]): string[] {\n const visible = new Set(stores);\n for (const name of this.#created) {\n visible.add(name);\n }\n for (const name of this.#dropped) {\n visible.delete(name);\n }\n return Array.from(visible).sort(compareStringsByCodeUnit);\n }\n}\nclass MigrationTransactionImpl implements Transaction {\n #inner: TransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(inner: TransactionImpl, tracker: MigrationCatalogTracker) {\n this.#inner = inner;\n this.#tracker = tracker;\n }\n get mode(): TxMode {\n return this.#inner.mode;\n }\n async listIndexes(): Promise<IndexDef[]> {\n return this.#inner.listIndexes();\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#inner.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n await this.#inner.put(store, key, value, options);\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options: PutOptions = {}): Promise<void> {\n await this.#inner.putMany(store, entries, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.delete(store, key);\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n await this.#inner.deleteMany(store, keys);\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n await this.#inner.applyBatch(store, ops);\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n return this.#inner.scan(store, range);\n }\n scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n return this.#inner.scanPage(store, range, options);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return this.#inner.scanIter(store, range, options);\n }\n closeScanCursor(cursor: ScanCursor): Promise<void> {\n return this.#inner.closeScanCursor(cursor);\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.getByIndex(store, indexName, key);\n }\n scanByIndex(\n store: string,\n indexName: string,\n range: Range = {},\n options: IndexScanOptions = {}\n ): AsyncIterable<[Uint8Array, Uint8Array]> {\n return this.#inner.scanByIndex(store, indexName, range, options);\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#inner.createStore(name, options);\n this.#tracker.recordCreate(name);\n }\n async dropStore(name: string): Promise<void> {\n await this.#inner.dropStore(name);\n this.#tracker.recordDrop(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#inner.clearStore(name);\n }\n commit(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('transaction.commit'));\n }\n rollback(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('transaction.rollback'));\n }\n}\nclass MigrationDbImpl implements DB {\n #db: DBImpl;\n #transaction: MigrationTransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(db: DBImpl, transaction: MigrationTransactionImpl, tracker: MigrationCatalogTracker) {\n this.#db = db;\n this.#transaction = transaction;\n this.#tracker = tracker;\n }\n begin(_mode: TxMode = 'readonly'): Promise<Transaction> {\n return Promise.reject(migrationUnsupportedMethod('db.begin'));\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#transaction.createStore(name, options);\n }\n async dropStore(name: string): Promise<void> {\n await this.#transaction.dropStore(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#transaction.clearStore(name);\n }\n async listStores(): Promise<string[]> {\n return this.#tracker.apply(await this.#db.listStores());\n }\n async listIndexes(): Promise<IndexDef[]> {\n return this.#transaction.listIndexes();\n }\n async getVersion(): Promise<number> {\n return this.#db.getVersion();\n }\n changesSince(_txid: TxId, _options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n return Promise.reject(migrationUnsupportedMethod('db.changesSince'));\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#transaction.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#transaction.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options: PutOptions = {}): Promise<void> {\n await this.#transaction.put(store, key, value, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.delete(store, key);\n }\n async scan(store: string, range: Range = {}): Promise<ScanItem[]> {\n return this.#transaction.scan(store, range);\n }\n scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n return this.#transaction.scanPage(store, range, options);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return this.#transaction.scanIter(store, range, options);\n }\n closeScanCursor(cursor: ScanCursor): Promise<void> {\n return this.#transaction.closeScanCursor(cursor);\n }\n exportSnapshot(_options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n return Promise.reject(migrationUnsupportedMethod('db.exportSnapshot'));\n }\n importSnapshot(_data: Uint8Array): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.importSnapshot'));\n }\n reset(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.reset'));\n }\n compact(): Promise<CompactionResult> {\n return Promise.reject(migrationUnsupportedMethod('db.compact'));\n }\n rebuild(): Promise<CompactionResult> {\n return Promise.reject(migrationUnsupportedMethod('db.rebuild'));\n }\n async stats() {\n return this.#db.stats();\n }\n async storageInfo(): Promise<StorageInfo> {\n return this.#db.storageInfo();\n }\n async requestPersistence(): Promise<boolean> {\n return this.#db.requestPersistence();\n }\n close(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.close'));\n }\n destroy(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.destroy'));\n }\n setFailpoint(_failpoint: DebugFailpoint): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.setFailpoint'));\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.subscribe');\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.watch');\n }\n}\nfunction migrationUnsupportedMethod(method: string): Error {\n const error = new Error(\n `${method}() is not available inside openDB() migrations; use the provided migration transaction and wait for openDB() to resolve`\n );\n error.name = 'InvalidStateError';\n return error;\n}\nfunction publicScanPage(page: WorkerScanPage): ScanPage {\n return { rows: page.rows, cursor: page.cursorId, done: page.done, bytes: page.bytes };\n}\nfunction normalizeScanCursor(value: unknown): ScanCursor {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError('scan cursor must be a positive safe integer');\n }\n return value;\n}\nfunction normalizeScanPageOptions(\n options: unknown\n): Required<Omit<ScanPageOptions, 'cursor'>> & Pick<ScanPageOptions, 'cursor'> {\n const input = normalizeOptionsObject<ScanPageOptions>(options, 'scan page options must be an object');\n const maxRows = input.maxRows ?? SCAN_PAGE_ROWS;\n const maxBytes = input.maxBytes ?? SCAN_PAGE_BYTES;\n if (!Number.isSafeInteger(maxRows) || maxRows <= 0 || maxRows > 0xffff_ffff) {\n throw new TypeError('scan page maxRows must be a positive 32-bit integer');\n }\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 4 || maxBytes > 0xffff_ffff) {\n throw new TypeError('scan page maxBytes must be a 32-bit integer of at least 4');\n }\n return { maxRows, maxBytes, cursor: input.cursor === undefined ? undefined : normalizeScanCursor(input.cursor) };\n}\nasync function* iterateScanPages(\n source: Pick<Transaction, 'scanPage' | 'closeScanCursor'>,\n store: string,\n range: Range,\n options: Omit<ScanPageOptions, 'cursor'>\n): AsyncIterable<ScanItem> {\n const bounds = { ...range };\n for (const field of ['gt', 'gte', 'lt', 'lte'] as const) {\n const bound = bounds[field];\n if (bound instanceof Uint8Array) bounds[field] = bound.slice();\n }\n const pageOptions = normalizeScanPageOptions(options);\n let cursor: ScanCursor | undefined;\n try {\n for (;;) {\n const page = await source.scanPage(store, bounds, { ...pageOptions, cursor });\n cursor = page.cursor;\n for (const row of page.rows) yield row;\n if (page.done) return;\n }\n } finally {\n if (cursor !== undefined) await source.closeScanCursor(cursor);\n }\n}\nfunction normalizeDatabaseName(value: unknown, method: 'openDB' | 'deleteDB' | 'unsafeDebugCrashWorker'): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new TypeError(`${method}() database name must be a non-empty string`);\n }\n if (/[\\uD800-\\uDFFF]/u.test(value)) {\n throw new TypeError(`${method}() database name must contain valid Unicode`);\n }\n if (new TextEncoder().encode(value).length > 127) {\n throw new TypeError(`${method}() database name must contain at most 127 UTF-8 bytes`);\n }\n return value;\n}\ntype ErrorFactory = (message: string) => Error;\n\nconst typeError: ErrorFactory = (message) => new TypeError(message);\nconst invalidOpenOptionsError: ErrorFactory = (message) => new InvalidOpenOptionsError(message);\n\nfunction normalizeOptionsObject<T>(options: unknown, message: string, createError: ErrorFactory = typeError): T {\n if (options === undefined) {\n return {} as T;\n }\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw createError(message);\n }\n return options as T;\n}\n\nfunction normalizeNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError: ErrorFactory = typeError\n): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw createError(message);\n }\n return value;\n}\n\nfunction normalizeOptionalNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError?: ErrorFactory\n): number | undefined {\n return value === undefined ? undefined : normalizeNonNegativeSafeInteger(value, message, createError);\n}\n\nfunction normalizeOpenOptionsInput(options: unknown): OpenOptions {\n return normalizeOptionsObject(options, 'open options must be an object', invalidOpenOptionsError);\n}\nfunction normalizeSchemaVersion(value: unknown): number | undefined {\n return normalizeOptionalNonNegativeSafeInteger(\n value,\n 'version must be a non-negative safe integer',\n invalidOpenOptionsError\n );\n}\nfunction normalizePutOptions(options: unknown): PutOptions {\n const { ttl } = normalizeOptionsObject<{\n ttl?: unknown;\n }>(options, 'put options must be an object');\n const normalizedTtl = normalizeOptionalNonNegativeSafeInteger(ttl, 'ttl must be a non-negative safe integer');\n return normalizedTtl === undefined ? {} : { ttl: normalizedTtl };\n}\nfunction normalizeCompressionOptions<T extends CreateStoreOptions | ExportSnapshotOptions>(\n options: unknown,\n message: string,\n allowSnappy: boolean\n): T {\n const { compression } = normalizeOptionsObject<{\n compression?: unknown;\n }>(options, message);\n if (compression === undefined) {\n return {} as T;\n }\n if (\n compression !== false &&\n compression !== 'gzip' &&\n compression !== 'deflate' &&\n !(allowSnappy && compression === 'snappy')\n ) {\n throw new TypeError(\n allowSnappy\n ? 'compression must be \"gzip\", \"deflate\", \"snappy\", or false'\n : 'compression must be \"gzip\", \"deflate\", or false'\n );\n }\n return { compression } as T;\n}\n\nfunction normalizeCreateStoreOptions(options: unknown): CreateStoreOptions {\n return normalizeCompressionOptions(options, 'createStore options must be an object', true);\n}\n\nfunction normalizeExportSnapshotOptions(options: unknown): ExportSnapshotOptions {\n return normalizeCompressionOptions(options, 'exportSnapshot options must be an object', false);\n}\nfunction normalizeTxId(value: unknown): TxId {\n return normalizeNonNegativeSafeInteger(value, 'txid must be a non-negative safe integer');\n}\nfunction normalizeChangeFeedOptions(options: unknown): ChangeFeedOptions {\n const { stores, limit } = normalizeOptionsObject<{\n stores?: unknown;\n limit?: unknown;\n }>(options, 'change feed options must be an object');\n const normalized: ChangeFeedOptions = {};\n if (stores !== undefined) {\n if (!Array.isArray(stores) || !stores.every((store): store is string => typeof store === 'string')) {\n throw new TypeError('stores must be an array of strings');\n }\n for (const store of stores) {\n assertPublicStoreName(store);\n }\n normalized.stores = [...stores];\n }\n const normalizedLimit = normalizeOptionalNonNegativeSafeInteger(limit, 'limit must be a non-negative safe integer');\n if (normalizedLimit !== undefined) {\n normalized.limit = normalizedLimit;\n }\n return normalized;\n}\nfunction normalizeMigrateHook(value: unknown): MigrateHook | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'function') {\n throw new InvalidOpenOptionsError('migrate must be a function');\n }\n return value as MigrateHook;\n}\nfunction normalizeRequestedIndexes(value: unknown): NormalizedIndexDef[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return normalizeIndexDefinitions(value);\n}\nfunction indexDefinitionsMatch(\n left: ReadonlyArray<NormalizedIndexDef>,\n right: ReadonlyArray<NormalizedIndexDef>\n): boolean {\n return serializeNormalizedIndexDefinitions(left) === serializeNormalizedIndexDefinitions(right);\n}\nasync function loadNormalizedIndexes(entry: RegistryEntry): Promise<NormalizedIndexDef[]> {\n return normalizeIndexDefinitions(await entry.proxy.getIndexes());\n}\nfunction assertMainThreadCapabilities() {\n if (!globalThis.isSecureContext) {\n throw new UnsupportedPlatformError('moyodb requires a secure context (HTTPS)');\n }\n const nav = globalThis.navigator;\n if (typeof nav?.storage?.getDirectory !== 'function') {\n throw new UnsupportedPlatformError('navigator.storage.getDirectory is unavailable');\n }\n if (typeof globalThis.Worker !== 'function') {\n throw new UnsupportedPlatformError('Worker is unavailable');\n }\n if (typeof globalThis.BroadcastChannel === 'undefined') {\n throw new UnsupportedPlatformError('BroadcastChannel is unavailable');\n }\n}\nasync function requestPersistentStorageOnOpen(options: OpenOptions): Promise<void> {\n const nav = globalThis.navigator;\n if ((options.requestPersistence ?? true) && typeof nav.storage.persist === 'function') {\n await withTimeout(nav.storage.persist(), 1000, false);\n }\n}\nexport async function openDB(name: string, options: OpenOptions = {}): Promise<DB> {\n return openDBWithWorker(name, options, async (dbName, normalizedOptions) => {\n assertMainThreadCapabilities();\n await requestPersistentStorageOnOpen(normalizedOptions);\n return acquireDbWorker(dbName, normalizedOptions);\n });\n}\nexport async function openDBWithWorker(\n name: string,\n options: OpenOptions,\n acquire: (name: string, options: OpenOptions) => Promise<RegistryEntry>\n): Promise<DB> {\n const dbName = normalizeDatabaseName(name, 'openDB');\n const normalizedOptions = normalizeOpenOptionsInput(options);\n const requestedVersion = normalizeSchemaVersion(normalizedOptions.version);\n const migrate = normalizeMigrateHook(normalizedOptions.migrate);\n const requestedIndexes = normalizeRequestedIndexes(normalizedOptions.indexes);\n if (requestedVersion === undefined && migrate !== undefined) {\n throw new InvalidOpenOptionsError('migrate requires version');\n }\n if (requestedVersion === undefined && requestedIndexes !== undefined) {\n throw new InvalidOpenOptionsError('indexes requires version');\n }\n const entry = await acquire(dbName, normalizedOptions);\n const db = new DBImpl(entry);\n try {\n await entry.proxy.acquireMigration?.();\n try {\n if (requestedVersion === undefined) {\n return db;\n }\n const [currentVersion, currentIndexes] = await Promise.all([db.getVersion(), loadNormalizedIndexes(entry)]);\n if (requestedVersion < currentVersion) {\n throw new VersionError(\n `cannot open database ${dbName} at schema version ${requestedVersion}; current schema version is ${currentVersion}`\n );\n }\n if (requestedVersion === currentVersion) {\n if (requestedIndexes !== undefined && !indexDefinitionsMatch(requestedIndexes, currentIndexes)) {\n throw new VersionError(\n `database ${dbName} is already at schema version ${currentVersion}, but the requested index catalog does not match the committed schema`\n );\n }\n return db;\n }\n if (entry.refs > 1) {\n throw new DatabaseBusyError(\n `database ${dbName} is already open in this tab; close existing handles before migrating from version ${currentVersion} to ${requestedVersion}`\n );\n }\n if (!migrate) {\n throw new VersionError(\n `database ${dbName} requires migration from version ${currentVersion} to ${requestedVersion}, but no migrate hook was provided`\n );\n }\n const targetIndexes = requestedIndexes ?? currentIndexes;\n entry.schemaMigrationInProgress = true;\n try {\n await db.runSchemaMigration(\n currentVersion,\n requestedVersion,\n migrate,\n toPublicIndexDefinitions(targetIndexes)\n );\n } finally {\n entry.schemaMigrationInProgress = false;\n }\n return db;\n } finally {\n await entry.proxy.releaseMigration?.();\n }\n } catch (error) {\n try {\n await db.close();\n } catch {}\n throw normalizeError(error);\n }\n}\nexport async function deleteDB(name: string): Promise<void> {\n const dbName = normalizeDatabaseName(name, 'deleteDB');\n assertMainThreadCapabilities();\n await deleteDbByName(dbName);\n}\nexport function unsafeDebugCrashWorker(name: string): boolean {\n const dbName = normalizeDatabaseName(name, 'unsafeDebugCrashWorker');\n return crashWorkerByName(dbName);\n}\nexport * from './codec';\nexport * from './errors';\nexport * from './indexing';\nexport * from './records';\nexport * from './sql';\nexport { SqlSyntaxError } from './sql-parser';\nexport type * from './sql-types';\nexport type * from './types';\n","import { Worker, type Transferable as NodeTransferable } from 'node:worker_threads';\nimport { WorkerProtocolClient } from './worker-client';\nimport { workerProtocolError } from './worker-protocol';\n\nexport interface NodeWorkerData {\n directory: string;\n dbName: string;\n channelName: string;\n lockToken: string;\n ownerWaitMs: number;\n encodedDbName: string;\n createIfMissing: boolean;\n}\n\nexport class NodeWorkerTransport {\n readonly proxy: WorkerProtocolClient;\n readonly #worker: Worker;\n readonly #listeners = new Map<string, Set<EventListenerOrEventListenerObject>>();\n readonly #exited: Promise<number>;\n #resolveExit!: (code: number) => void;\n #rejectExit!: (error: unknown) => void;\n #terminating = false;\n #failureEmitted = false;\n\n constructor(data: NodeWorkerData, releaseLease: () => void) {\n this.#exited = new Promise((resolve, reject) => {\n this.#resolveExit = resolve;\n this.#rejectExit = reject;\n });\n void this.#exited.catch(() => {});\n this.#worker = new Worker(new URL('./node-worker.mjs', import.meta.url), { workerData: data });\n this.#worker.on('message', (data: unknown) => {\n this.#emit('message', { data });\n });\n this.#worker.on('messageerror', () => {\n this.#emit('messageerror', {});\n });\n this.#worker.on('error', (error: Error) => {\n this.#failureEmitted = true;\n this.#emit('error', { error, message: error.message });\n });\n this.#worker.once('exit', (code: number) => {\n if (!this.#terminating && !this.#failureEmitted) {\n const error = workerProtocolError('WorkerTerminatedError', `Node worker exited with code ${code}`);\n this.#emit('error', { error, message: error.message });\n }\n try {\n releaseLease();\n this.#resolveExit(code);\n } catch (error) {\n this.#rejectExit(error);\n }\n });\n this.proxy = new WorkerProtocolClient(this, {\n readyTimeoutMs: Math.min(2_147_483_647, 30_000 + data.ownerWaitMs)\n });\n }\n\n postMessage(message: unknown, transfer: Transferable[] = []): void {\n this.#worker.postMessage(message, transfer as NodeTransferable[]);\n }\n\n addEventListener(type: string, listener: EventListenerOrEventListenerObject): void {\n let listeners = this.#listeners.get(type);\n if (!listeners) {\n listeners = new Set();\n this.#listeners.set(type, listeners);\n }\n listeners.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void {\n this.#listeners.get(type)?.delete(listener);\n }\n\n terminate(): Promise<number> {\n if (!this.#terminating) {\n this.#terminating = true;\n void this.#worker.terminate().catch(this.#rejectExit);\n }\n return this.#exited;\n }\n\n #emit(type: string, event: unknown): void {\n for (const listener of Array.from(this.#listeners.get(type) ?? [])) {\n if (typeof listener === 'function') listener(event as Event);\n else listener.handleEvent(event as Event);\n }\n }\n}\n","import fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { basename, dirname, join, relative, resolve, sep } from 'node:path';\nimport { isMainThread } from 'node:worker_threads';\n\nconst LOCK_DIRECTORY = '.moyodb.lock';\nconst PENDING_PREFIX = '.moyodb.pending-';\nconst TOKEN_PATTERN = /^[a-f\\d]{8}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{12}$/i;\n// NativeFileBackend rejects a larger record without deleting it.\nconst MAX_LEASE_RECORD_BYTES = 1024;\nconst MAX_LEASE_PID = 0xffffffff;\nexport const MISSING_DATABASE_MESSAGE = 'database missing and create_if_missing=false';\nlet installedStorage = null;\n\nfunction namedError(name, message, cause) {\n const error = new Error(message, cause === undefined ? undefined : { cause });\n error.name = name;\n error.code = cause?.code ?? name;\n return error;\n}\n\nfunction storageError(error) {\n if (\n ['NotFoundError', 'TypeMismatchError', 'SecurityError', 'DatabaseBusyError', 'StorageError'].includes(\n error?.name\n )\n ) {\n return error;\n }\n if (error?.code === 'ENOENT') return namedError('NotFoundError', error.message, error);\n return namedError('StorageError', error?.message ?? String(error), error);\n}\n\nfunction validateDirectory(directory) {\n if (typeof directory !== 'string' || directory.length === 0 || directory.includes('\\0')) {\n throw new TypeError('directory must be a nonempty filesystem path');\n }\n return resolve(directory);\n}\n\nfunction validateToken(token) {\n if (typeof token !== 'string' || !TOKEN_PATTERN.test(token)) throw new TypeError('invalid storage lock token');\n return token;\n}\n\nfunction validateName(name) {\n if (\n typeof name !== 'string' ||\n name.length === 0 ||\n name === '.' ||\n name === '..' ||\n name.toLowerCase() === LOCK_DIRECTORY ||\n name.toLowerCase().startsWith(PENDING_PREFIX) ||\n Array.from(name).some((character) => character.charCodeAt(0) < 32) ||\n /[<>:\"/\\\\|?*]/.test(name) ||\n /[. ]$/.test(name) ||\n /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i.test(name)\n ) {\n throw new TypeError('invalid storage entry name');\n }\n return name;\n}\n\nfunction entryStat(path, kind) {\n const stat = fs.lstatSync(path);\n if (stat.isSymbolicLink() || (stat.isFile() && stat.nlink !== 1)) {\n throw namedError('SecurityError', 'storage entries must not be links');\n }\n if ((kind === 'directory' && !stat.isDirectory()) || (kind === 'file' && !stat.isFile())) {\n throw namedError('TypeMismatchError', `storage entry is not a ${kind}`);\n }\n if (!stat.isDirectory() && !stat.isFile()) throw namedError('SecurityError', 'unsupported storage entry type');\n return stat;\n}\n\nfunction syncDirectory(path) {\n // Node cannot open directory descriptors on Windows. File flushes still use fsync.\n if (process.platform === 'win32') return;\n const fd = fs.openSync(path, fs.constants.O_RDONLY | (fs.constants.O_DIRECTORY ?? 0));\n try {\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction readLease(directory, token) {\n const lockDirectory = join(directory, LOCK_DIRECTORY);\n entryStat(lockDirectory, 'directory');\n const recordPath = join(lockDirectory, `${validateToken(token)}.json`);\n const stat = entryStat(recordPath, 'file');\n if (stat.size > MAX_LEASE_RECORD_BYTES) {\n throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');\n }\n const owner = JSON.parse(fs.readFileSync(recordPath, 'utf8'));\n if (owner.token !== token || !Number.isSafeInteger(owner.pid) || owner.pid <= 0 || owner.pid > MAX_LEASE_PID) {\n throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');\n }\n return { lockDirectory, recordPath, owner };\n}\n\nfunction removeLease(lease) {\n // Remove only this token. A newer nonempty lease must survive cleanup.\n fs.unlinkSync(lease.recordPath);\n try {\n fs.rmdirSync(lease.lockDirectory);\n } catch (error) {\n if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error?.code)) throw error;\n }\n syncDirectory(dirname(lease.lockDirectory));\n}\n\nfunction removeVacantLease(directory) {\n const path = join(directory, LOCK_DIRECTORY);\n try {\n entryStat(path, 'directory');\n if (fs.readdirSync(path).length !== 0) return false;\n fs.rmdirSync(path);\n syncDirectory(directory);\n return true;\n } catch (error) {\n if (['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error?.code)) return false;\n throw error;\n }\n}\n\nfunction publishLease(directory, pending) {\n const lockDirectory = join(directory, LOCK_DIRECTORY);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n let published = false;\n try {\n fs.renameSync(pending, lockDirectory);\n published = true;\n } catch (error) {\n try {\n fs.lstatSync(lockDirectory);\n } catch {\n throw storageError(error);\n }\n }\n if (published) {\n syncDirectory(directory);\n return;\n }\n let lease;\n try {\n entryStat(lockDirectory, 'directory');\n const records = fs.readdirSync(lockDirectory);\n if (records.length === 0) {\n removeVacantLease(directory);\n continue;\n }\n if (records.length !== 1 || !records[0].endsWith('.json')) throw new Error('incomplete lock record');\n lease = readLease(directory, records[0].slice(0, -5));\n try {\n process.kill(lease.owner.pid, 0);\n } catch (failure) {\n if (failure?.code === 'ESRCH') {\n removeLease(lease);\n continue;\n }\n throw failure;\n }\n } catch (failure) {\n throw namedError('DatabaseBusyError', 'storage directory is locked; its owner cannot be released', failure);\n }\n throw namedError('DatabaseBusyError', `storage directory is owned by process ${lease.owner.pid}`);\n }\n throw namedError('DatabaseBusyError', 'storage directory changed while acquiring its lock');\n}\n\nfunction removePendingLease(directory, token) {\n const pending = join(directory, `${PENDING_PREFIX}${process.pid}-${token}`);\n try {\n entryStat(pending, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') return false;\n throw error;\n }\n const entries = fs.readdirSync(pending);\n if (entries.length === 1 && entries[0] === `${token}.json`) {\n const recordPath = join(pending, entries[0]);\n entryStat(recordPath, 'file');\n fs.unlinkSync(recordPath);\n } else if (entries.length !== 0) {\n throw namedError('SecurityError', 'pending storage lock contains unknown entries');\n }\n fs.rmdirSync(pending);\n return true;\n}\n\nfunction acquireLease(directory, token) {\n const pending = join(directory, `${PENDING_PREFIX}${process.pid}-${token}`);\n const recordPath = join(pending, `${token}.json`);\n let fd;\n let created = false;\n try {\n fs.mkdirSync(pending, { mode: 0o700 });\n created = true;\n fd = fs.openSync(recordPath, 'wx', 0o600);\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, token }));\n fs.fsyncSync(fd);\n fs.closeSync(fd);\n fd = undefined;\n syncDirectory(pending);\n // Publish the complete owner record. Termination before rename cannot block a later owner.\n publishLease(directory, pending);\n } catch (error) {\n const primary = storageError(error);\n if (fd !== undefined) {\n try {\n fs.closeSync(fd);\n } catch (cleanupError) {\n primary.cleanupErrors = [cleanupError];\n }\n }\n if (created) {\n try {\n releaseNodeStorageLease(directory, token);\n } catch (cleanupError) {\n primary.cleanupErrors = [...(primary.cleanupErrors ?? []), cleanupError];\n }\n }\n throw primary;\n }\n}\n\nexport function releaseNodeStorageLease(directory, lockToken) {\n const path = validateDirectory(directory);\n validateToken(lockToken);\n let lease;\n let canonical;\n try {\n canonical = fs.realpathSync(path);\n lease = readLease(canonical, lockToken);\n } catch (error) {\n if (error?.code === 'ENOTDIR') return false;\n if (error?.code === 'ENOENT') {\n if (!canonical) return false;\n const removedPending = removePendingLease(canonical, lockToken);\n return removeVacantLease(canonical) || removedPending;\n }\n throw storageError(error);\n }\n if (lease.owner.pid !== process.pid) return false;\n try {\n removeLease(lease);\n removePendingLease(canonical, lockToken);\n return true;\n } catch (error) {\n if (error?.code === 'ENOENT') return false;\n throw storageError(error);\n }\n}\n\nfunction validPosition(value, label) {\n if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`${label} must be a nonnegative safe integer`);\n return value;\n}\n\nclass AccessHandle {\n #storage;\n #path;\n #fd;\n\n constructor(storage, path, fd) {\n this.#storage = storage;\n this.#path = path;\n this.#fd = fd;\n }\n\n #live() {\n this.#storage.live();\n if (this.#fd === null) throw namedError('InvalidStateError', 'storage access handle is closed');\n return this.#fd;\n }\n\n read(buffer, { at = 0 } = {}) {\n return fs.readSync(this.#live(), buffer, 0, buffer.byteLength, validPosition(at, 'read offset'));\n }\n\n write(buffer, { at = 0 } = {}) {\n validPosition(at, 'write offset');\n validPosition(at + buffer.byteLength, 'write end');\n return fs.writeSync(this.#live(), buffer, 0, buffer.byteLength, at);\n }\n\n getSize() {\n return validPosition(fs.fstatSync(this.#live()).size, 'file size');\n }\n\n truncate(size) {\n fs.ftruncateSync(this.#live(), validPosition(size, 'file size'));\n }\n\n flush() {\n fs.fsyncSync(this.#live());\n }\n\n close() {\n if (this.#fd === null) return;\n const fd = this.#fd;\n this.#fd = null;\n try {\n fs.closeSync(fd);\n } finally {\n this.#storage.handles.delete(this.#path);\n }\n }\n}\n\nclass FileHandle {\n kind = 'file';\n\n constructor(storage, path) {\n this.storage = storage;\n this.path = path;\n this.name = basename(path);\n }\n\n async createSyncAccessHandle() {\n this.storage.check(this.path, 'file');\n if (this.storage.handles.has(this.path)) {\n throw namedError('NoModificationAllowedError', 'storage file already has an access handle');\n }\n let fd;\n try {\n fd = fs.openSync(this.path, fs.constants.O_RDWR | (fs.constants.O_NOFOLLOW ?? 0));\n const stat = fs.fstatSync(fd);\n const expected = this.storage.check(this.path, 'file');\n if (!stat.isFile() || stat.nlink !== 1 || stat.dev !== expected.dev || stat.ino !== expected.ino) {\n throw namedError('SecurityError', 'storage file changed while opening');\n }\n const handle = new AccessHandle(this.storage, this.path, fd);\n this.storage.handles.set(this.path, handle);\n return handle;\n } catch (error) {\n const primary = storageError(error);\n if (fd !== undefined) {\n try {\n fs.closeSync(fd);\n } catch (cleanupError) {\n primary.cleanupErrors = [cleanupError];\n }\n }\n throw primary;\n }\n }\n\n async getFile() {\n return { size: this.storage.check(this.path, 'file').size };\n }\n}\n\nclass DirectoryHandle {\n kind = 'directory';\n\n constructor(storage, path) {\n this.storage = storage;\n this.path = path;\n this.name = basename(path);\n }\n\n async getDirectoryHandle(name, { create = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n try {\n if (create) {\n try {\n fs.mkdirSync(path, { mode: 0o700 });\n syncDirectory(this.path);\n } catch (error) {\n if (error?.code !== 'EEXIST') throw error;\n }\n }\n this.storage.check(path, 'directory');\n return new DirectoryHandle(this.storage, path);\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n async getFileHandle(name, { create = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n try {\n if (create) {\n let fd;\n try {\n fd = fs.openSync(path, 'wx', 0o600);\n fs.fsyncSync(fd);\n } catch (error) {\n if (error?.code !== 'EEXIST') throw error;\n } finally {\n if (fd !== undefined) fs.closeSync(fd);\n }\n if (fd !== undefined) syncDirectory(this.path);\n }\n this.storage.check(path, 'file');\n return new FileHandle(this.storage, path);\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n async *entries() {\n this.storage.check(this.path, 'directory');\n for (const name of fs.readdirSync(this.path).sort()) {\n if (this.path === this.storage.directory && (name === LOCK_DIRECTORY || name.startsWith(PENDING_PREFIX)))\n continue;\n validateName(name);\n const path = join(this.path, name);\n const stat = this.storage.check(path);\n yield [\n name,\n stat.isDirectory() ? new DirectoryHandle(this.storage, path) : new FileHandle(this.storage, path)\n ];\n }\n }\n\n async removeEntry(name, { recursive = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n const stat = this.storage.check(path);\n for (const openPath of this.storage.handles.keys()) {\n if (openPath === path || openPath.startsWith(`${path}${sep}`)) {\n throw namedError('NoModificationAllowedError', 'storage entry has an open access handle');\n }\n }\n try {\n if (stat.isDirectory()) {\n if (recursive) this.storage.removeTree(path);\n else fs.rmdirSync(path);\n } else {\n fs.unlinkSync(path);\n }\n syncDirectory(this.path);\n } catch (error) {\n if (error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n}\n\nclass Storage {\n handles = new Map();\n closed = false;\n\n constructor(directory) {\n this.directory = directory;\n this.identity = entryStat(directory, 'directory');\n }\n\n live() {\n if (this.closed) throw namedError('InvalidStateError', 'Node storage is closed');\n }\n\n check(path, kind) {\n this.live();\n const parts = relative(this.directory, path).split(sep).filter(Boolean);\n if (parts.some((name) => name === '..')) throw namedError('SecurityError', 'storage path leaves its directory');\n let current = this.directory;\n let stat;\n try {\n stat = entryStat(current, 'directory');\n if (stat.dev !== this.identity.dev || stat.ino !== this.identity.ino) {\n throw namedError('SecurityError', 'storage directory changed');\n }\n for (let index = 0; index < parts.length; index += 1) {\n current = join(current, parts[index]);\n stat = entryStat(current, index + 1 === parts.length ? kind : 'directory');\n }\n return stat;\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n removeTree(path) {\n for (const name of fs.readdirSync(path)) {\n const child = join(path, validateName(name));\n const stat = this.check(child);\n if (stat.isDirectory()) this.removeTree(child);\n else fs.unlinkSync(child);\n }\n fs.rmdirSync(path);\n }\n}\n\nclass MountedDirectoryHandle {\n kind = 'directory';\n\n constructor(storage, name, childName, child, remove) {\n this.storage = storage;\n this.name = name;\n this.childName = childName;\n this.child = child;\n this.remove = remove;\n }\n\n async getDirectoryHandle(name, { create = false } = {}) {\n this.storage.live();\n if (validateName(name) !== this.childName)\n throw namedError('NotFoundError', 'directory is outside the database mount');\n return this.child(create);\n }\n\n async getFileHandle(name) {\n this.storage.live();\n validateName(name);\n if (name === this.childName) throw namedError('TypeMismatchError', 'mounted entry is a directory');\n throw namedError('NotFoundError', 'file is outside the database mount');\n }\n\n async *entries() {\n this.storage.live();\n let child;\n try {\n child = this.child(false);\n } catch (error) {\n if (error?.name === 'NotFoundError') return;\n throw error;\n }\n yield [this.childName, child];\n }\n\n async removeEntry(name, { recursive = false } = {}) {\n this.storage.live();\n if (validateName(name) !== this.childName)\n throw namedError('NotFoundError', 'directory is outside the database mount');\n if (!this.remove) throw namedError('NoModificationAllowedError', 'the storage mount cannot be removed');\n await this.remove(recursive);\n }\n}\n\nfunction mountedRoot(storage, encodedDbName) {\n const database = new DirectoryHandle(storage, storage.directory);\n database.name = encodedDbName;\n let exists = true;\n const stackdb = new MountedDirectoryHandle(\n storage,\n 'stackdb',\n encodedDbName,\n (create) => {\n if (!exists && !create) throw namedError('NotFoundError', 'database directory does not exist');\n exists = true;\n return database;\n },\n async (recursive) => {\n if (!exists) throw namedError('NotFoundError', 'database directory does not exist');\n const names = [];\n for await (const [name] of database.entries()) names.push(name);\n if (!recursive && names.length !== 0)\n throw namedError('InvalidModificationError', 'database directory is not empty');\n for (const name of names) await database.removeEntry(name, { recursive });\n // Keep the physical database directory and its lease until the worker stops.\n exists = false;\n }\n );\n return new MountedDirectoryHandle(storage, '', 'stackdb', () => stackdb);\n}\n\nexport function ensureStorageRoot(directory, createIfMissing = true) {\n const path = validateDirectory(directory);\n if (!createIfMissing) {\n try {\n entryStat(path, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n return path;\n }\n fs.mkdirSync(path, { recursive: true });\n return path;\n}\n\nexport async function installNodeStorage(\n directory,\n { lockToken = randomUUID(), encodedDbName, createIfMissing = true } = {}\n) {\n if (isMainThread) throw new Error('Node storage must be installed in a dedicated worker');\n if (installedStorage) throw new Error('Node storage is already installed in this worker');\n const path = validateDirectory(directory);\n validateToken(lockToken);\n if (\n encodedDbName !== undefined &&\n (typeof encodedDbName !== 'string' || !/^(?:[a-f\\d]{2})+$/.test(encodedDbName))\n ) {\n throw new TypeError('encodedDbName must be the lowercase hexadecimal UTF-8 database name');\n }\n if (createIfMissing === false) {\n try {\n entryStat(path, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n let canonical;\n try {\n fs.mkdirSync(path, { recursive: true, mode: 0o700 });\n canonical = fs.realpathSync(path);\n entryStat(canonical, 'directory');\n } catch (error) {\n throw storageError(error);\n }\n acquireLease(canonical, lockToken);\n const previousNavigator = Object.getOwnPropertyDescriptor(globalThis, 'navigator');\n let storage;\n try {\n storage = new Storage(canonical);\n } catch (error) {\n releaseNodeStorageLease(canonical, lockToken);\n throw storageError(error);\n }\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n let failure;\n for (const handle of storage.handles.values()) {\n try {\n handle.close();\n } catch (error) {\n failure ??= error;\n }\n }\n storage.closed = true;\n try {\n releaseNodeStorageLease(canonical, lockToken);\n } catch (error) {\n failure ??= error;\n }\n try {\n if (previousNavigator) Object.defineProperty(globalThis, 'navigator', previousNavigator);\n else delete globalThis.navigator;\n } catch (error) {\n failure ??= error;\n }\n installedStorage = null;\n if (failure) throw failure;\n };\n try {\n const root =\n encodedDbName === undefined ? new DirectoryHandle(storage, canonical) : mountedRoot(storage, encodedDbName);\n Object.defineProperty(globalThis, 'navigator', {\n configurable: true,\n value: {\n storage: {\n getDirectory: async () => {\n storage.live();\n return root;\n }\n }\n }\n });\n installedStorage = storage;\n return { directory: canonical, close };\n } catch (error) {\n close();\n throw error;\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { realpath } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { openDBWithWorker } from './index';\nimport { assertCompatibleOptions, invalidateTransactions, normalizeOptions, type RegistryEntry } from './registry';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n StorageError,\n normalizeError\n} from './errors';\nimport { NodeWorkerTransport } from './node-worker-client';\nimport { MISSING_DATABASE_MESSAGE, ensureStorageRoot, releaseNodeStorageLease } from './node-storage.mjs';\nimport { workerProtocolError } from './worker-protocol';\nimport type { DB, OpenOptions } from './types';\n\nexport type NodeOpenOptions = Omit<OpenOptions, 'workerMode'> & { directory: string };\nexport interface NodeDeleteOptions {\n directory: string;\n}\n\ninterface NodeRegistryEntry extends RegistryEntry {\n directory: string;\n registryKey: string;\n shutdown: Promise<void> | null;\n}\n\nconst registry = new Map<string, NodeRegistryEntry>();\nconst lifecycleOperations = new Map<string, Promise<void>>();\n\nfunction queueLifecycleOperation<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const previous = lifecycleOperations.get(key) ?? Promise.resolve();\n const result = previous.then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined\n );\n lifecycleOperations.set(key, settled);\n void settled.then(() => {\n if (lifecycleOperations.get(key) === settled) lifecycleOperations.delete(key);\n });\n return result;\n}\n\nfunction validateName(name: unknown, method: string): asserts name is string {\n if (typeof name !== 'string' || name.length === 0) {\n throw new TypeError(`${method}() database name must be a non-empty string`);\n }\n if (/[\\uD800-\\uDFFF]/u.test(name)) {\n throw new TypeError(`${method}() database name must contain valid Unicode`);\n }\n if (Buffer.byteLength(name, 'utf8') > 127) {\n throw new TypeError(`${method}() database name must contain at most 127 UTF-8 bytes`);\n }\n}\n\nfunction validateDirectoryOptions(options: unknown): asserts options is NodeDeleteOptions {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidOpenOptionsError('Node options must contain directory');\n }\n const directory = (options as NodeDeleteOptions).directory;\n if (typeof directory !== 'string' || directory.length === 0 || directory.includes('\\0')) {\n throw new InvalidOpenOptionsError('directory must be a non-empty filesystem path');\n }\n}\n\nasync function databaseLocation(\n name: string,\n options: NodeDeleteOptions & { createIfMissing?: boolean }\n): Promise<{\n directory: string;\n registryKey: string;\n}> {\n try {\n ensureStorageRoot(options.directory, options.createIfMissing !== false);\n } catch (error) {\n if (error instanceof Error && error.name === 'StorageError') {\n throw new StorageError(error.message || MISSING_DATABASE_MESSAGE);\n }\n throw error;\n }\n const root = await realpath(options.directory);\n const directory = join(root, 'stackdb', Buffer.from(name, 'utf8').toString('hex'));\n const registryKey = process.platform === 'win32' ? directory.toLowerCase() : directory;\n return { directory, registryKey };\n}\n\nfunction invalidateEntry(entry: NodeRegistryEntry): void {\n if (entry.invalidated) return;\n entry.invalidated = true;\n entry.refs = 0;\n invalidateTransactions(entry);\n for (const listener of Array.from(entry.handleInvalidationListeners)) listener();\n}\n\nfunction shutdownEntry(entry: NodeRegistryEntry, reason: Error): Promise<void> {\n if (entry.shutdown) return entry.shutdown;\n entry.proxy.dispose(reason);\n entry.shutdown = Promise.resolve(entry.worker.terminate()).then(() => undefined);\n return entry.shutdown;\n}\n\nfunction createEntry(dbName: string, directory: string, registryKey: string, options: OpenOptions): NodeRegistryEntry {\n const normalized = normalizeOptions({ ...options, workerMode: 'dedicated' });\n const lockToken = randomUUID();\n const channelName = `node:${createHash('sha256').update(registryKey).digest('hex')}`;\n const worker = new NodeWorkerTransport(\n {\n directory,\n dbName,\n channelName,\n lockToken,\n ownerWaitMs: normalized.ownerWaitMs,\n encodedDbName: Buffer.from(dbName, 'utf8').toString('hex'),\n createIfMissing: normalized.createIfMissing\n },\n () => {\n releaseNodeStorageLease(directory, lockToken);\n }\n );\n const entry: NodeRegistryEntry = {\n dbName,\n directory,\n registryKey,\n worker,\n proxy: worker.proxy,\n persistenceBridge: { close() {} },\n options: normalized,\n refs: 1,\n invalidated: false,\n schemaMigrationInProgress: false,\n txInvalidationListeners: new Set(),\n handleInvalidationListeners: new Set(),\n channelName,\n shutdown: null,\n release: () => releaseEntry(entry),\n destroy: () => queueLifecycleOperation(registryKey, () => destroyEntry(entry))\n };\n worker.proxy.setFatalHandler((error) => {\n if (registry.get(registryKey) === entry) registry.delete(registryKey);\n invalidateEntry(entry);\n void queueLifecycleOperation(registryKey, () => shutdownEntry(entry, error)).catch(() => {});\n });\n return entry;\n}\n\nasync function acquireEntry(\n dbName: string,\n directory: string,\n registryKey: string,\n options: OpenOptions\n): Promise<RegistryEntry> {\n const normalized = normalizeOptions({ ...options, workerMode: 'dedicated' });\n return queueLifecycleOperation(registryKey, async () => {\n const existing = registry.get(registryKey);\n if (existing && !existing.invalidated) {\n if (existing.schemaMigrationInProgress) {\n throw new DatabaseBusyError(`database ${dbName} is migrating; wait for openNodeDB() to resolve`);\n }\n assertCompatibleOptions(dbName, existing.options, normalized);\n if (normalized.debugFailpoint !== null) await existing.proxy.setFailpoint(normalized.debugFailpoint);\n existing.refs += 1;\n return existing;\n }\n const entry = createEntry(dbName, directory, registryKey, options);\n try {\n await entry.proxy.open({ dbName, options: normalized });\n if (entry.invalidated) throw new DatabaseClosedError();\n registry.set(registryKey, entry);\n return entry;\n } catch (error) {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker open failed'));\n throw normalizeError(error);\n }\n });\n}\n\nasync function releaseEntry(entry: NodeRegistryEntry): Promise<void> {\n return queueLifecycleOperation(entry.registryKey, async () => {\n if (entry.invalidated || registry.get(entry.registryKey) !== entry) {\n if (entry.shutdown) await entry.shutdown;\n return;\n }\n entry.refs -= 1;\n if (entry.refs > 0) return;\n registry.delete(entry.registryKey);\n try {\n await entry.proxy.close();\n } finally {\n invalidateEntry(entry);\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker was released'));\n }\n });\n}\n\nasync function destroyEntry(entry: NodeRegistryEntry): Promise<void> {\n if (entry.invalidated || registry.get(entry.registryKey) !== entry) throw new DatabaseClosedError();\n registry.delete(entry.registryKey);\n invalidateEntry(entry);\n try {\n await entry.proxy.destroy();\n } finally {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node database was destroyed'));\n }\n}\n\nexport async function openNodeDB(name: string, options: NodeOpenOptions): Promise<DB> {\n validateName(name, 'openNodeDB');\n validateDirectoryOptions(options);\n const { directory, registryKey } = await databaseLocation(name, options);\n return openDBWithWorker(name, options, (dbName, openOptions) =>\n acquireEntry(dbName, directory, registryKey, openOptions)\n );\n}\n\nexport async function deleteNodeDB(name: string, options: NodeDeleteOptions): Promise<void> {\n validateName(name, 'deleteNodeDB');\n validateDirectoryOptions(options);\n const { directory, registryKey } = await databaseLocation(name, options);\n return queueLifecycleOperation(registryKey, async () => {\n const existing = registry.get(registryKey);\n if (existing) return destroyEntry(existing);\n const entry = createEntry(name, directory, registryKey, {});\n try {\n await entry.proxy.deleteDB(name);\n } finally {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node delete worker was released'));\n }\n });\n}\n\nexport async function unsafeDebugCrashNodeWorker(name: string, options: NodeDeleteOptions): Promise<boolean> {\n validateName(name, 'unsafeDebugCrashNodeWorker');\n validateDirectoryOptions(options);\n const { registryKey } = await databaseLocation(name, options);\n return queueLifecycleOperation(registryKey, async () => {\n const entry = registry.get(registryKey);\n if (!entry) return false;\n registry.delete(registryKey);\n invalidateEntry(entry);\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker was terminated'));\n return true;\n });\n}\n\nexport * from './codec';\nexport * from './errors';\nexport * from './indexing';\nexport * from './records';\nexport * from './sql';\nexport { SqlSyntaxError } from './sql-parser';\nexport type * from './sql-types';\nexport type * from './types';\n"],"mappings":";;;;;;;AAgEA,SAAS,oBAAoB,SAA+B;CACxD,IAAI,QAAQ,SAAS;EACjB,aAAa,QAAQ,OAAO;EAC5B,QAAQ,UAAU;CACtB;AACJ;AA+BA,IAAa,uBAAb,MAAuD;CAoB9B;CAnBrB,gBAAwB;CACxB,0BAAkB,IAAI,IAA4B;CAClD,SAAiB;CACjB,gBAAwB;CACxB,eAA4C;CAC5C,cAAuD;CACvD;CACA;CACA,eAAwD;CACxD,cAAoC;CACpC,WAAmB;CACnB,iBAA0C,CAAC;CAC3C,cAAsB;CACtB,iBAAyB;CACzB,gBAAwB;CACxB,eAA6D;CAC7D;CAEA,YACI,QACA,UAAuC,CAAC,GAC1C;EAFmB,KAAA,SAAA;EAGjB,KAAK,qBAAqB,QAAQ,uBAAuB;EACzD,KAAK,mBAAmB,kBAAkB,QAAQ,oBAAoB,CAAC;EACvE,KAAK,QAAQ,IAAI,SAAe,SAAS,WAAW;GAChD,KAAK,eAAe;GACpB,KAAK,cAAc;EACvB,CAAC;EACD,MAAM,iBAAiB,kBAAkB,QAAQ,kBAAkB,CAAC;EACpE,IAAI,iBAAiB,GACjB,KAAK,eAAe,iBAAiB;GACjC,KAAK,KAAK,oBAAoB,2BAA2B,6BAA6B,CAAC;EAC3F,GAAG,cAAc;EAErB,KAAU,MAAM,YAAY,KAAA,CAAS;EACrC,KAAK,OAAO,iBAAiB,WAAW,KAAK,aAA8B;EAC3E,KAAK,OAAO,iBAAiB,gBAAgB,KAAK,kBAAkB;EACpE,KAAK,OAAO,iBAAiB,SAAS,KAAK,WAA4B;CAC3E;CAEA,gBAAgB,SAAgD;EAC5D,KAAK,eAAe;CACxB;CAEA,YAA2B;EACvB,OAAO,KAAK;CAChB;CAEA,QAAQ,SAAgB,oBAAoB,yBAAyB,6BAA6B,GAAS;EACvG,KAAK,gBAAgB,QAAQ,KAAK;CACtC;CAEA,KAAe,QAAqB;EAChC,KAAK,gBAAgB,QAAQ,IAAI;CACrC;CAEA,KAAK,SAA2C;EAC5C,OAAO,KAAK,QAAQ,QAAQ,CAAC,OAAO,CAAC;CACzC;CAEA,QAAuB;EACnB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,UAAyB;EACrB,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,SAAS,QAA+B;EACpC,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,CAAC;CAC5C;CAEA,MAAM,MAA+B;EACjC,OAAO,KAAK,QAAQ,SAAS,CAAC,IAAI,CAAC;CACvC;CAEA,OAAO,MAA+B;EAClC,OAAO,KAAK,QAAQ,UAAU,CAAC,IAAI,CAAC;CACxC;CAEA,SAAS,MAA6B;EAClC,OAAO,KAAK,QAAQ,YAAY,CAAC,IAAI,CAAC;CAC1C;CAEA,WACI,MACA,SACA,MAC+B;EAC/B,OAAO,KAAK,KAAK,cAAc;GAAC;GAAM;GAAS;EAAiB,GAAG,OAAO;CAC9E;CAEA,YAAY,MAAc,MAAc,SAA6C;EACjF,OAAO,KAAK,QAAQ,eAAe;GAAC;GAAM;GAAM;EAAO,CAAC;CAC5D;CAEA,UAAU,MAAc,MAA6B;EACjD,OAAO,KAAK,QAAQ,aAAa,CAAC,MAAM,IAAI,CAAC;CACjD;CAEA,WAAW,MAAc,MAA6B;EAClD,OAAO,KAAK,QAAQ,cAAc,CAAC,MAAM,IAAI,CAAC;CAClD;CAEA,IAAI,MAAc,OAAe,KAA6C;EAC1E,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;EAAG,CAAC;CACjD;CAEA,QAAQ,MAAc,OAAe,MAA4D;EAC7F,OAAO,KAAK,QAAQ,WAAW;GAAC;GAAM;GAAO;EAAI,CAAC;CACtD;CAEA,IAAI,MAAc,OAAe,KAAmC;EAChE,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;EAAG,CAAC;CACjD;CAEA,IAAI,MAAc,OAAe,KAAiB,OAAmB,SAAqC;EACtG,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;GAAK;GAAO;EAAO,CAAC;CACjE;CAEA,QACI,MACA,OACA,SACA,SACa;EACb,OAAO,KAAK,QAAQ,WAAW;GAAC;GAAM;GAAO;GAAS;EAAO,CAAC;CAClE;CAEA,OAAO,MAAc,OAAe,KAAmC;EACnE,OAAO,KAAK,QAAQ,UAAU;GAAC;GAAM;GAAO;EAAG,CAAC;CACpD;CAEA,WAAW,MAAc,OAAe,MAAwC;EAC5E,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;EAAI,CAAC;CACzD;CAEA,WAAW,MAAc,OAAe,KAAoC;EACxE,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;EAAG,CAAC;CACxD;CAEA,KAAK,MAAc,OAAe,OAAmC;EACjE,OAAO,KAAK,QAAQ,QAAQ;GAAC;GAAM;GAAO;EAAK,CAAC;CACpD;CAEA,SAAS,SAAyD;EAC9D,OAAO,KAAK,QAAQ,YAAY,CAAC,OAAO,CAAC;CAC7C;CAEA,YAAY,UAAiC;EACzC,OAAO,KAAK,QAAQ,eAAe,CAAC,QAAQ,CAAC;CACjD;CAEA,WAAW,MAAc,OAAe,WAAmB,KAA6C;EACpG,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;GAAW;EAAG,CAAC;CACnE;CAEA,YAAY,MAAc,OAAe,WAAmB,OAAmC;EAC3F,OAAO,KAAK,QAAQ,eAAe;GAAC;GAAM;GAAO;GAAW;EAAK,CAAC;CACtE;CAEA,gBACI,MACA,OACA,WACA,OACA,QACA,OACA,UACsB;EACtB,OAAO,KAAK,QAAQ,mBAAmB;GAAC;GAAM;GAAO;GAAW;GAAO;GAAQ;GAAO;EAAQ,CAAC;CACnG;CAEA,WAAW,MAAoC;EAC3C,OAAO,KAAK,QAAQ,cAAc,SAAS,KAAA,IAAY,CAAC,IAAI,CAAC,IAAI,CAAC;CACtE;CAEA,iBAAiB,MAAc,SAAoC;EAC/D,OAAO,KAAK,QAAQ,oBAAoB,CAAC,MAAM,OAAO,CAAC;CAC3D;CAEA,aAAgC;EAC5B,OAAO,KAAK,QAAQ,cAAc,CAAC,CAAC;CACxC;CAEA,aAA8B;EAC1B,OAAO,KAAK,QAAQ,cAAc,CAAC,CAAC;CACxC;CAEA,aAAa,MAAc,SAAiD;EACxE,OAAO,KAAK,QAAQ,gBAAgB,CAAC,MAAM,OAAO,CAAC;CACvD;CAEA,iBAAiB,MAAc,SAAgC;EAC3D,OAAO,KAAK,QAAQ,oBAAoB,CAAC,MAAM,OAAO,CAAC;CAC3D;CAEA,eAAe,SAAsD;EACjE,OAAO,KAAK,QAAQ,kBAAkB,CAAC,OAAO,CAAC;CACnD;CAEA,eAAe,MAAiC;EAC5C,OAAO,KAAK,QAAQ,kBAAkB,CAAC,IAAI,CAAC;CAChD;CAEA,QAAuB;EACnB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,UAAqC;EACjC,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,UAAqC;EACjC,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,QAA0B;EACtB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,cAAoC;EAChC,OAAO,KAAK,QAAQ,eAAe,CAAC,CAAC;CACzC;CAEA,qBAAuC;EACnC,OAAO,KAAK,QAAQ,sBAAsB,CAAC,CAAC;CAChD;CAEA,aAAa,WAA0C;EACnD,OAAO,KAAK,QAAQ,gBAAgB,CAAC,SAAS,CAAC;CACnD;CAEA,MAAM,QAAiC,SAAY,MAA6D;EAC5G,OAAQ,MAAM,KAAK,KAAK,SAAS,MAAM,OAAO;CAClD;CAEA,MAAc,KACV,SACA,MACA,iBACgB;EAChB,KAAK,WAAW;EAChB,KAAK,iBAAiB;EACtB,IAAI;GACA,MAAM,KAAK;EACf,UAAU;GACN,KAAK,iBAAiB;EAC1B;EACA,KAAK,WAAW;EAEhB,MAAM,cAAc,KAAK,aAAa,KAAK,gBAAgB,KAAK,KAAK,eAAe,SAAS;EAC7F,MAAM,KAAK,KAAK;EAChB,KAAK,iBAAiB;EACtB,MAAM,WAAW,4BAA4B,SAAS,IAAI;EAC1D,MAAM,UAAwC;GAC1C,MAAM;GACN,SAAA;GACA;GACA;GACA,MAAM,SAAS;EACnB;EACA,OAAO,MAAM,IAAI,SAAkB,SAAS,WAAW;GACnD,MAAM,UACF,KAAK,mBAAmB,IAClB,iBAAiB;IACb,MAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;IACnC,IAAI,CAAC,WAAW,QAAQ,YAAY,MAChC;IAEJ,KAAK,QAAQ,OAAO,EAAE;IACtB,QAAQ,UAAU;IAClB,OACI,oBACI,6BACA,kBAAkB,QAAQ,mBAAmB,KAAK,iBAAiB,GACvE,CACJ;GACJ,GAAG,KAAK,gBAAgB,IACxB;GACV,KAAK,QAAQ,IAAI,IAAI;IACjB,SAAS;IACT,UAAU,UAAU,QAAQ,KAAK;IACjC;IACA;GACJ,CAAC;GACD,IAAI;IACA,IAAI,aACA,KAAK,aAAa,SAAS,SAAS,QAAQ;SACzC,IAAI,SAAS,SAAS,SAAS,GAClC,KAAK,OAAO,YAAY,SAAS,SAAS,QAAQ;SAElD,KAAK,OAAO,YAAY,OAAO;GAEvC,SAAS,OAAO;IACZ,KAAK,cAAc,IAAI,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;GACpF;EACJ,CAAC;CACL;CAEA,aAAqB,SAAuC,UAAgC;EACxF,MAAM,WAAW,qBAAqB,SAAS,QAAQ;EACvD,IAAI,CAAC,KAAK,QAAQ,IAAI,QAAQ,EAAE,GAAG;EACnC,IAAI,KAAK,eAAe,SAAS,KAAK,KAAK,cAAc,SAAS,aAAA,SAC9D,KAAK,cAAc;EAEvB,KAAK,eAAe,KAAK;GACrB,SAAS,SAAS;GAClB,UAAU,SAAS;GACnB,YAAY,SAAS;EACzB,CAAC;EACD,KAAK,eAAe,SAAS;EAC7B,IAAI,CAAC,KAAK,gBAAgB;GACtB,KAAK,iBAAiB;GACtB,qBAAqB;IACjB,KAAK,iBAAiB;IACtB,KAAK,cAAc;GACvB,CAAC;EACL;EACA,IAAI,KAAK,eAAe,UAAA,OAAuC,KAAK,eAAA,SAChE,KAAK,cAAc;CAE3B;CAEA,gBAA8B;EAC1B,MAAM,SAAS,KAAK;EACpB,KAAK,iBAAiB,CAAC;EACvB,KAAK,cAAc;EACnB,IAAI,KAAK,QAAQ;EACjB,MAAM,SAAS,OAAO,QAAQ,UAAU,KAAK,QAAQ,IAAI,MAAM,QAAQ,EAAE,CAAC;EAC1E,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,UACF,OAAO,WAAW,IACZ,OAAO,EAAE,CAAC,UACV;GACI,MAAM;GACN,SAAA;GACA,UAAU,OAAO,KAAK,UAAU,MAAM,OAAO;EACjD;EACV,MAAM,WAA2B,CAAC;EAClC,KAAK,MAAM,SAAS,QAChB,KAAK,MAAM,UAAU,MAAM,UAAU,SAAS,KAAK,MAAM;EAE7D,IAAI;GACA,IAAI,SAAS,SAAS,GAClB,KAAK,OAAO,YAAY,SAAS,QAAQ;QAEzC,KAAK,OAAO,YAAY,OAAO;EAEvC,SAAS,OAAO;GACZ,MAAM,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GACvE,KAAK,MAAM,SAAS,QAAQ,KAAK,cAAc,MAAM,QAAQ,IAAI,MAAM;EAC3E;CACJ;CAEA,aAA2B;EACvB,IAAI,KAAK,QACL,MAAM,KAAK,eAAe,oBAAoB,yBAAyB,4BAA4B;CAE3G;CAEA,iBAAyB,UAAuC;EAC5D,MAAM,OAAO,MAAM;EACnB,IAAI,6BAA6B,IAAI,GAAG;GACpC,IAAI,KAAK,eAAe;GACxB,KAAK,WAAW,KAAK,aAAa;GAClC,KAAK,gBAAgB;GACrB,IAAI,KAAK,cAAc,aAAa,KAAK,YAAY;GACrD,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,cAAc;GACnB;EACJ;EACA,IAAI,8BAA8B,IAAI,GAAG;GACrC,KAAK,KAAK,oBAAoB,uBAAuB,4CAA4C,CAAC;GAClG;EACJ;EACA,IACI,WAAS,IAAI,MACZ,KAAK,SAAA,qCAAqC,KAAK,SAAA,4CAChD,KAAK,YAAA,GACP;GACE,KAAK,KAAK,oBAAoB,uBAAuB,uCAAuC,CAAC;GAC7F;EACJ;EACA,IAAI,qCAAqC,IAAI,GAAG;GAC5C,KAAK,MAAM,YAAY,KAAK,WAAW,KAAK,eAAe,QAAQ;GACnE;EACJ;EACA,IACI,WAAS,IAAI,KACb,KAAK,SAAA,2CACL,KAAK,YAAA,GACP;GACE,KAAK,KAAK,oBAAoB,uBAAuB,+BAA+B,CAAC;GACrF;EACJ;EACA,KAAK,eAAe,IAAI;CAC5B;CAEA,eAAuB,MAAqB;EACxC,IAAI,CAAC,gCAAgC,IAAI,GAAG;GACxC,IACI,WAAS,IAAI,KACb,KAAK,SAAA,qCACL,KAAK,YAAA,KACL,OAAO,KAAK,OAAO,YACnB,OAAO,cAAc,KAAK,EAAE,GAE5B,KAAK,cAAc,KAAK,IAAI,oBAAoB,uBAAuB,yBAAyB,CAAC;GAErG;EACJ;EACA,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK,EAAE;EACxC,IAAI,CAAC,SACD;EAEJ,KAAK,QAAQ,OAAO,KAAK,EAAE;EAC3B,oBAAoB,OAAO;EAC3B,IAAI;GACA,IAAI,KAAK,IACL,QAAQ,QACJ,KAAK,uBACA,QAAQ,YAAY,cACjB,QAAQ,YAAY,UACpB,QAAQ,YAAY,iBACpB,QAAQ,YAAY,qBACtB,KAAK,SACL,4BAA4B,QAAQ,SAAS,KAAK,MAAM,CAClE;QAEA,QAAQ,OAAO,uBAAuB,KAAK,KAAK,CAAC;EAEzD,SAAS,OAAO;GACZ,QAAQ,OACJ,iBAAiB,SAAS,MAAM,SAAS,wBACnC,QACA,oBAAoB,uBAAuB,sCAAsC,CAC3F;EACJ;CACJ;CAEA,2BAAyC;EACrC,KAAK,KAAK,oBAAoB,sBAAsB,0CAA0C,CAAC;CACnG;CAEA,eAAuB,UAA4B;EAC/C,MAAM,QACF,MAAM,iBAAiB,QACjB,MAAM,QACN,oBAAoB,eAAe,MAAM,WAAW,uBAAuB;EACrF,KAAK,KAAK,KAAK;CACnB;CAEA,cAAsB,IAAY,OAAoB;EAClD,MAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;EACnC,IAAI,CAAC,SACD;EAEJ,KAAK,QAAQ,OAAO,EAAE;EACtB,oBAAoB,OAAO;EAC3B,QAAQ,OAAO,KAAK;CACxB;CAEA,gBAAwB,QAAe,aAA4B;EAC/D,IAAI,KAAK,QACL;EAEJ,KAAK,SAAS;EACd,KAAK,cAAc;EACnB,KAAK,OAAO,oBAAoB,WAAW,KAAK,aAA8B;EAC9E,KAAK,OAAO,oBAAoB,gBAAgB,KAAK,kBAAkB;EACvE,KAAK,OAAO,oBAAoB,SAAS,KAAK,WAA4B;EAC1E,IAAI,KAAK,cAAc,aAAa,KAAK,YAAY;EACrD,KAAK,eAAe;EACpB,IAAI,CAAC,KAAK,eACN,KAAK,cAAc,MAAM;EAE7B,KAAK,eAAe;EACpB,KAAK,cAAc;EACnB,KAAK,iBAAiB,CAAC;EACvB,KAAK,cAAc;EACnB,KAAK,MAAM,WAAW,KAAK,QAAQ,OAAO,GAAG;GACzC,oBAAoB,OAAO;GAC3B,QAAQ,OAAO,MAAM;EACzB;EACA,KAAK,QAAQ,MAAM;EACnB,IAAI,aACA,KAAK,eAAe,MAAM;CAElC;AACJ;;;ACtkBA,IAAM,mCAAmB,IAAI,IAAmC;CAC5D;CACA;CACA;AACJ,CAAC;AAmCD,IAAM,mCAAmC;AAgBzC,IAAM,6BAAW,IAAI,IAA2B;AAChD,IAAM,wCAAsB,IAAI,IAA2B;AAC3D,SAAS,0BAA2B,QAAgB,WAAyC;CAEzF,MAAM,UADW,sBAAoB,IAAI,MAAM,KAAK,QAAQ,QAAQ,EAAA,CAC5C,KAAK,SAAS;CACtC,MAAM,UAAU,OAAO,WACb,KAAA,SACA,KAAA,CACV;CACA,sBAAoB,IAAI,QAAQ,OAAO;CACvC,QAAa,WAAW;EACpB,IAAI,sBAAoB,IAAI,MAAM,MAAM,SACpC,sBAAoB,OAAO,MAAM;CAEzC,CAAC;CACD,OAAO;AACX;AACA,SAAS,0BAA0B,SAAkD;CACjF,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,IAAI,wBAAwB,gCAAgC;AAE1E;AACA,SAAS,iBAAiB,OAAgB,OAAe,cAAgC;CACrF,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,OAAO,UAAU,WACjB,MAAM,IAAI,wBAAwB,GAAG,MAAM,mBAAmB;CAElE,OAAO;AACX;AACA,SAAS,4BAA4B,OAAgB,OAAe,cAA8B;CAC9F,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,IAAI,wBAAwB,GAAG,MAAM,qCAAqC;CAEpF,OAAO;AACX;AACA,SAAS,oBAAoB,OAAwB;CACjD,OAAO,KAAK,IAAI,GAAG,4BAA4B,OAAO,cAAc,GAAG,CAAC;AAC5E;AACA,SAAS,mBAAmB,OAAgC;CACxD,IAAI,UAAU,KAAA,KAAa,UAAU,MACjC,OAAO;CAEX,IAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,IAAI,KAAsC,GACzF,MAAM,IAAI,wBAAwB,kCAAkC,MAAM,KAAK,gBAAgB,CAAC,CAAC,KAAK,IAAI,GAAG;CAEjH,OAAO;AACX;AACA,SAAS,oBAAoB,OAAqD;CAC9E,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAClE,MAAM,IAAI,wBAAwB,8BAA8B;CAEpE,MAAM,WAAW;CACjB,MAAM,UAAU,iBAAiB,SAAS,SAAS,sBAAsB,IAAI;CAC7E,IAAI,cAA6B;CACjC,IAAI,SAAS,gBAAgB,MACzB,cAAc;MACX,IAAI,SAAS,gBAAgB,KAAA,GAAW;EAC3C,cAAc,4BAA4B,SAAS,aAAa,0BAA0B,CAAC;EAC3F,IAAI,gBAAgB,GAChB,MAAM,IAAI,wBAAwB,mEAAmE;CAE7G;CACA,OAAO;EAAE;EAAS;CAAY;AAClC;AACA,SAAS,oBAAoB,OAAqD;CAC9E,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,UAAU,eAAe,UAAU,UACnC,MAAM,IAAI,wBAAwB,wCAAwC;CAE9E,OAAO;AACX;AACA,SAAgB,iBAAiB,UAAuB,CAAC,GAA0B;CAC/E,0BAA0B,OAAO;CACjC,OAAO;EACH,YAAY,oBAAoB,QAAQ,UAAU;EAClD,iBAAiB,iBAAiB,QAAQ,iBAAiB,mBAAmB,IAAI;EAClF,aAAa,4BAA4B,QAAQ,aAAa,eAAe,CAAC;EAC9E,oBAAoB,iBAAiB,QAAQ,oBAAoB,sBAAsB,IAAI;EAC3F,YAAY,oBAAoB,QAAQ,UAAU;EAClD,gBAAgB,mBAAmB,QAAQ,cAAc;EACzD,YAAY,oBAAoB,QAAQ,UAAU;CACtD;AACJ;AACA,SAAS,eAAe,MAA2C,OAA4C;CAC3G,OAAO,MAAM,YAAY,OAAO,WAAW,MAAM,gBAAgB,OAAO;AAC5E;AACA,SAAgB,wBAAwB,QAAgB,SAAgC,MAA6B;CACjH,IAAI,QAAQ,eAAe,KAAK,YAC5B,MAAM,IAAI,wBAAwB,YAAY,OAAO,mCAAmC,QAAQ,YAAY;CAEhH,IAAI,QAAQ,eAAe,KAAK,YAC5B,MAAM,IAAI,wBACN,YAAY,OAAO,+CAA+C,QAAQ,WAAW,yBAAyB,KAAK,YACvH;CAEJ,IAAI,KAAK,eAAe,QAAQ,CAAC,eAAe,QAAQ,YAAY,KAAK,UAAU,GAC/E,MAAM,IAAI,wBACN,YAAY,OAAO,gEACvB;AAER;AAsGA,SAAS,cAAc,WAAiC;CACpD,KAAK,MAAM,YAAY,MAAM,KAAK,SAAS,GACvC,SAAS;AAEjB;AACA,SAAgB,iCAAiC,OAAsB,UAAkC;CACrG,MAAM,wBAAwB,IAAI,QAAQ;CAC1C,aAAa;EACT,MAAM,wBAAwB,OAAO,QAAQ;CACjD;AACJ;AACA,SAAgB,2BAA2B,OAAsB,UAAkC;CAC/F,MAAM,4BAA4B,IAAI,QAAQ;CAC9C,aAAa;EACT,MAAM,4BAA4B,OAAO,QAAQ;CACrD;AACJ;AACA,SAAgB,uBAAuB,OAA4B;CAC/D,cAAc,MAAM,uBAAuB;AAC/C;AACA,SAAS,kBAAgB,OAA4B;CACjD,IAAI,MAAM,aACN;CAEJ,MAAM,cAAc;CACpB,uBAAuB,KAAK;CAC5B,cAAc,MAAM,2BAA2B;AACnD;AAuDA,eAAsB,gBAAgB,OAAqC;CACvE,IAAI,MAAM,SAAS,OAAO,MAAM,QAAQ;CACxC,OAAO,0BAAwB,MAAM,QAAQ,YAAY;EACrD,IAAI,MAAM,eAAe,WAAS,IAAI,MAAM,MAAM,MAAM,OACpD;EAEJ,MAAM,QAAQ;EACd,IAAI,MAAM,OAAO,GACb;EAEJ,WAAS,OAAO,MAAM,MAAM;EAC5B,IAAI;GACA,MAAM,MAAM,MAAM,MAAM;EAC5B,UAAU;GACN,MAAM,kBAAkB,MAAM;GAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;GACpD,MAAM,MAAM,OAAO,UAAU;EACjC;CACJ,CAAC;AACL;AACA,eAAsB,gBAAgB,OAAqC;CACvE,IAAI,MAAM,SAAS,OAAO,MAAM,QAAQ;CACxC,OAAO,0BAAwB,MAAM,cAAc,eAAa,KAAK,CAAC;AAC1E;AACA,eAAe,eAAa,OAAqC;CAC7D,IAAI,MAAM,eAAe,WAAS,IAAI,MAAM,MAAM,MAAM,OACpD,MAAM,IAAI,oBAAoB;CAElC,IAAI,MAAM,QAAQ,eAAe,UAAU;EACvC,IAAI;GACA,MAAM,MAAM,MAAM,QAAQ;EAC9B,SAAS,OAAO;GACZ,MAAM,eAAe,KAAK;EAC9B;EACA,WAAS,OAAO,MAAM,MAAM;EAC5B,kBAAgB,KAAK;EACrB,MAAM,OAAO;EACb,MAAM,kBAAkB,MAAM;EAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;EACpD,MAAM,MAAM,OAAO,UAAU;EAC7B;CACJ;CACA,WAAS,OAAO,MAAM,MAAM;CAC5B,kBAAgB,KAAK;CACrB,MAAM,OAAO;CACb,IAAI;EACA,MAAM,MAAM,MAAM,QAAQ;CAC9B,SAAS,OAAO;EACZ,MAAM,eAAe,KAAK;CAC9B,UAAU;EACN,MAAM,kBAAkB,MAAM;EAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;EACpD,MAAM,MAAM,OAAO,UAAU;CACjC;AACJ;;;AChYA,SAAS,WAAW,OAAmC;CACnD,IAAI,CAAC,WAAS,KAAK,KAAK,EAAE,MAAM,eAAe,aAC3C,OAAO;CAEX,IAAI,MAAM,SAAS,SAAS,MAAM,SAAS,UACvC,OAAO;CAEX,QAAQ,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW,MAAM,IAAI,eAAe;AACzF;AACA,SAAS,iBAAiB,OAAyC;CAC/D,OACI,WAAS,KAAK,KACd,OAAO,MAAM,UAAU,YACvB,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,MAAM,UAAU;AAEtC;AACA,SAAgB,qBAAqB,OAA6C;CAC9E,OACI,WAAS,KAAK,KACd,MAAM,SAAS,oBACf,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,SAAS,YACtB,MAAM,QAAQ,MAAM,MAAM,KAC1B,MAAM,OAAO,MAAM,gBAAgB;AAE3C;;;ACvCA,SAAS,aAAa,SAA0C;CAC5D,OAAO,QAAQ,KAAK,YAAY;EAC5B,KAAK,OAAO,IAAI,MAAM;EACtB,MAAM,OAAO;CACjB,EAAE;AACN;AACA,SAAS,aAAa,KAAiB,QAA6B;CAChE,IAAI,OAAO,aAAa,IAAI,YACxB,OAAO;CAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,YAAY,SAAS,GACpD,IAAI,IAAI,WAAW,OAAO,QACtB,OAAO;CAGf,OAAO;AACX;AACA,SAAS,0BACL,MACA,MACA,MACgB;CAChB,IAAI,OAAO,SAAS,YAAY;EAC5B,IAAI,SAAS,KAAA,KAAa,SAAS,KAAA,GAC/B,MAAM,IAAI,UAAU,2DAA2D;EAEnF,OAAO;GACH,OAAO;GACP,WAAW;GACX,UAAU;EACd;CACJ;CACA,IAAI,OAAO,SAAS,UAChB,MAAM,IAAI,UAAU,wCAAwC;CAEhE,sBAAsB,IAAI;CAC1B,IAAI,OAAO,SAAS,YAAY;EAC5B,IAAI,SAAS,KAAA,GACT,MAAM,IAAI,UAAU,8DAA8D;EAEtF,OAAO;GACH,OAAO;GACP,WAAW;GACX,UAAU;EACd;CACJ;CACA,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO;EACH,OAAO;EACP,WAAW,KAAK,MAAM;EACtB,UAAU;CACd;CAEJ,MAAM,IAAI,UACN,iGACJ;AACJ;AACA,IAAa,kBAAb,MAA6B;CACzB;CACA;CACA,WAAoC;CACpC,2BAAW,IAAI,IAAuB;CACtC,UAAU;CACV,YAAY,QAAgB,cAAc,QAAQ;EAC9C,KAAK,UAAU;EACf,KAAK,eAAe;CACxB;CAIA,UACI,MACA,MACA,MACW;EACX,IAAI,KAAK,SACL,MAAM,IAAI,oBAAoB;EAElC,MAAM,OAAO,0BAA0B,MAAM,MAAM,IAAI;EACvD,MAAM,QAA2B;GAC7B,QAAQ;GACR,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,UAAU,KAAK;EACnB;EACA,KAAK,eAAe;EACpB,KAAK,SAAS,IAAI,KAAK;EACvB,aAAa;GACT,IAAI,CAAC,MAAM,QACP;GAEJ,MAAM,SAAS;GACf,KAAK,SAAS,OAAO,KAAK;GAC1B,IAAI,KAAK,SAAS,SAAS,GACvB,KAAK,gBAAgB;EAE7B;CACJ;CACA,QAAc;EACV,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,MAAM,SAAS,KAAK,UACrB,MAAM,SAAS;EAEnB,KAAK,SAAS,MAAM;EACpB,KAAK,gBAAgB;CACzB;CACA,iBAAiB;EACb,IAAI,KAAK,aAAa,QAAQ,KAAK,SAC/B;EAEJ,MAAM,UAAU,IAAI,iBAAiB,MAAM,KAAK,aAAa,QAAQ;EACrE,QAAQ,aAAa,UAAU;GAC3B,KAAK,eAAe,MAAM,IAAI;EAClC;EACA,KAAK,WAAW;CACpB;CACA,kBAAkB;EACd,KAAK,UAAU,MAAM;EACrB,KAAK,WAAW;CACpB;CACA,eAAe,SAAkB;EAC7B,IAAI,CAAC,qBAAqB,OAAO,KAAK,QAAQ,WAAW,KAAK,WAAW,KAAK,SAAS,SAAS,GAC5F;EAEJ,MAAM,UAAU,MAAM,KAAK,KAAK,QAAQ;EACxC,KAAK,MAAM,cAAc,QAAQ,QAC7B,KAAK,MAAM,SAAS,SAAS;GACzB,IAAI,CAAC,MAAM,QACP;GAEJ,IAAI,MAAM,UAAU,QAAQ,MAAM,UAAU,WAAW,OACnD;GAEJ,IAAI;GACJ,MAAM,YAAY,MAAM;GACxB,IAAI,cAAc,MACd,UAAU,aAAa,WAAW,OAAO;QACtC;IACH,UAAU,aACN,WAAW,QAAQ,QACd,WACG,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU,aAAa,OAAO,KAAK,SAAS,CAC/F,CACJ;IACA,IAAI,QAAQ,WAAW,GACnB;GAER;GACA,IAAI;IACA,MAAM,SAAS,WAAW,OAAO,SAAS,QAAQ,IAAI;GAC1D,SAAS,OAAO;IACZ,qBAAqB;KACjB,MAAM;IACV,CAAC;GACL;EACJ;CAER;AACJ;;;AC1IA,IAAM,eAAe,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;AAC7D,IAAM,eAAe,MAAM,OAAO;AAClC,IAAM,cAAc,MAAM;AAE1B,SAAS,UAAU,MAAkB,OAA4B;CAC7D,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,MAAM,UAAU,SAAS,MAAM,MAAM;AAC5F;AAEA,SAAS,gBAAgB,OAAoC;CACzD,IAAI,EAAE,iBAAiB,eAAe,MAAM,WAAW,GACnD,MAAM,IAAI,UAAU,6BAA6B;CAErD,IAAI;CACJ,QAAQ,MAAM,IAAd;EACI,KAAK;GACD,QAAQ;GACR;EACJ,KAAK;GACD,QAAQ;GACR;EACJ,KAAK;GACD,QAAQ;GACR;EACJ,KAAK,IAAM;GACP,IAAI,MAAM,WAAW,GACjB,MAAM,IAAI,UAAU,6BAA6B;GAGrD,MAAM,UAAU,IADC,SAAS,MAAM,QAAQ,MAAM,aAAa,GAAG,CAC9C,CAAA,CAAK,aAAa,GAAG,KAAK;GAC1C,MAAM,QAAQ,UAAU,iBAAiB,KAAK,UAAU,cAAc,UAAU;GAEhF,MAAM,0BAAU,IAAI,yBAAS,IADV,YAAY,CACF,CAAM;GACnC,QAAQ,aAAa,GAAG,MAAM,KAAK;GACnC,QAAQ,QAAQ,WAAW,GAAG,KAAK;GACnC;EACJ;EACA,KAAK;GACD,QAAQ,aAAa,OAAO,MAAM,SAAS,CAAC,CAAC;GAC7C;EACJ,KAAK;GACD,QAAQ,MAAM,MAAM,CAAC;GACrB;EACJ,SACI,MAAM,IAAI,UAAU,yBAAyB;CACrD;CACA,IAAI,CAAC,UAAU,kBAAkB,KAAK,GAAG,KAAK,GAC1C,MAAM,IAAI,UAAU,kCAAkC;CAE1D,OAAO;AACX;AAEA,IAAa,iBAA+C,OAAO,OAAO;CACtE,QAAQ;CACR,QAAQ;AACZ,CAAC;AAED,SAAS,cACL,MACA,SACc;CACd,SAAS,MAAM,OAA2B;EACtC,IAAI,CAAC,QAAQ,KAAK,GACd,MAAM,IAAI,UAAU,eAAe,MAAM;EAE7C,OAAO;CACX;CACA,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,OAAO,kBAAkB,MAAM,KAAK,CAAC;EACzC;EACA,OAAO,OAAsB;GACzB,OAAO,MAAM,gBAAgB,KAAK,CAAC;EACvC;CACJ,CAAC;AACL;AAEA,IAAa,YAAY,OAAO,OAAO;CACnC,QAAQ,cAAc,aAAa,UAA2B,OAAO,UAAU,QAAQ;CACvF,QAAQ,cAAc,oBAAoB,UAA2B,OAAO,UAAU,QAAQ;CAC9F,SAAS,cAAc,cAAc,UAA4B,OAAO,UAAU,SAAS;CAC3F,MAAM,cAAc,SAAS,UAAyB,UAAU,IAAI;CACpE,OAAO,cAAc,eAAe,UAA+B,iBAAiB,UAAU;AAClG,CAAC;AAED,SAAgB,iBACZ,GAAG,OACW;CACd,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,MAAM,QAChD,MAAM,IAAI,UAAU,6BAA6B,MAAM,OAAO,OAAO;GAEzE,OAAO,uBAAuB,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO,MAAM,MAAyB,CAAC,CAAC;EAC5G;EACA,OAAO,OAAsB;GACzB,MAAM,UAAU,iBAAiB,KAAK;GACtC,IAAI,QAAQ,WAAW,MAAM,QACzB,MAAM,IAAI,UAAU,6BAA6B,MAAM,OAAO,OAAO;GAEzE,OAAO,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO,QAAQ,MAAM,CAAC;EACnE;CACJ,CAAC;AACL;AAEA,SAAS,gBAAgB,OAA4C;CACjE,MAAM,UAAsD,CAAC,EAAE,MAAM,CAAC;CACtE,MAAM,yBAAS,IAAI,IAAY;CAC/B,OAAO,QAAQ,SAAS,GAAG;EACvB,MAAM,QAAQ,QAAQ,IAAI;EAC1B,MAAM,UAAU,MAAM;EACtB,IAAI,MAAM,OAAO;GACb,OAAO,OAAO,OAAiB;GAC/B;EACJ;EACA,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,OAAO,YAAY,WACtE;EAEJ,IAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,GACjF;EAEJ,IAAI,OAAO,YAAY,YAAY,OAAO,IAAI,OAAO,GACjD,MAAM,IAAI,UAAU,oFAAoF;EAE5G,MAAM,QAAQ,MAAM,QAAQ,OAAO;EACnC,IAAI,OAAO,eAAe,OAAO,OAAO,QAAQ,MAAM,YAAY,OAAO,YACrE,MAAM,IAAI,UAAU,gDAAgD;EAExE,OAAO,IAAI,OAAO;EAClB,QAAQ,KAAK;GAAE,OAAO;GAAS,OAAO;EAAK,CAAC;EAC5C,MAAM,OAAO,QAAQ,QAAQ,OAAO;EACpC,IAAI,SAAS,KAAK,WAAW,QAAQ,SAAS,GAC1C,MAAM,IAAI,UAAU,0DAA0D;EAElF,KAAK,MAAM,OAAO,MAAM;GACpB,IAAI,SAAS,QAAQ,UACjB;GAEJ,IAAI,OAAO,QAAQ,UACf,MAAM,IAAI,UAAU,yCAAyC;GAEjE,IAAI,UAAU,CAAC,mBAAmB,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,QAAQ,SAClE,MAAM,IAAI,UAAU,6CAA6C;GAErE,MAAM,aAAa,OAAO,yBAAyB,SAAS,GAAG;GAC/D,IAAI,CAAC,cAAc,CAAC,WAAW,cAAc,CAAC,OAAO,OAAO,YAAY,OAAO,GAC3E,MAAM,IAAI,UAAU,sDAAsD;GAE9E,QAAQ,KAAK,EAAE,OAAO,WAAW,MAAiB,CAAC;EACvD;CACJ;AACJ;;AAGA,SAAgB,gBAA+B,UAA2D;CACtG,SAAS,MAAM,OAAmB;EAC9B,gBAAgB,KAAK;EACrB,IAAI,UAAU;GACV,IAAI,CAAC,SAAS,KAAK,GACf,MAAM,IAAI,UAAU,kCAAkC;GAE1D,gBAAgB,KAAK;EACzB;EACA,OAAO;CACX;CACA,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,OAAO,WAAW,MAAM,KAAK,CAAC;EAClC;EACA,OAAO,OAAsB;GACzB,OAAO,MAAM,WAAoB,KAAK,CAAC;EAC3C;CACJ,CAAC;AACL;AAEA,SAAS,YAAe,OAAuB,OAA8B;CACzE,MAAM,UAAiB,CAAC;CACxB,KAAK,MAAM,SAAS;EAAC;EAAM;EAAO;EAAM;CAAK,GACzC,IAAI,OAAO,OAAO,OAAO,KAAK,GAC1B,QAAQ,SAAS,MAAM,OAAO,MAAM,MAAW;CAGvD,IAAI,MAAM,YAAY,KAAA,GAClB,QAAQ,UAAU,MAAM;CAE5B,IAAI,MAAM,UAAU,KAAA,GAChB,QAAQ,QAAQ,MAAM;CAE1B,OAAO;AACX;AAEA,eAAsB,sBAClB,IACA,MACA,QACU;CACV,MAAM,cAAc,MAAM,GAAG,MAAM,IAAI;CACvC,IAAI;CACJ,IAAI;EACA,SAAS,MAAM,OAAO,WAAW;CACrC,SAAS,OAAO;EACZ,IAAI;GACA,MAAM,YAAY,SAAS;EAC/B,SAAS,eAAe;GACpB,IAAI,EAAE,yBAAyB,yBAC3B,MAAM,IAAI,eAAe,CAAC,OAAO,aAAa,GAAG,0CAA0C,EACvF,OAAO,cACX,CAAC;EAET;EACA,MAAM;CACV;CAEA,IAAI,SAAS,aACT,MAAM,YAAY,OAAO;MAEzB,MAAM,YAAY,SAAS;CAE/B,OAAO;AACX;AAEA,SAAS,eACL,QACA,MACA,QACU;CACV,OAAO,WAAW,SAAS,sBAAsB,QAAQ,MAAM,MAAM,IAAI,OAAO,MAAM;AAC1F;AAEA,IAAa,cAAb,MAAkC;CAC9B;CACA;CACA;CACA;CACA;CAEA,YACI,QACA,OACA,MACA,UACA,QACF;EACE,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,OAAO;EACZ,KAAK,YAAY;EACjB,KAAK,UAAU;CACnB;CAEA,MAAM,IAAI,KAA2B;EACjC,MAAM,UAAU,KAAK,UAAU,OAAO,GAAG;EACzC,OAAO,eAAe,KAAK,SAAS,YAAY,OAAO,gBAAgB;GACnE,MAAM,QAAQ,MAAM,YAAY,WAAW,KAAK,QAAQ,KAAK,MAAM,OAAO;GAC1E,OAAO,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;EAClE,CAAC;CACL;CAEA,MAAM,KAAK,QAAwB,CAAC,GAAqC;EACrE,MAAM,UAAU,YAAY,KAAK,WAAW,KAAK;EACjD,OAAO,eAAe,KAAK,SAAS,YAAY,OAAO,gBAAgB;GACnE,MAAM,OAAgC,CAAC;GACvC,WAAW,MAAM,CAAC,KAAK,UAAU,YAAY,YAAY,KAAK,QAAQ,KAAK,MAAM,OAAO,GACpF,KAAK,KAAK;IAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG;IAAG,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;GAAE,CAAC;GAE5F,OAAO;EACX,CAAC;CACL;AACJ;AAEA,IAAa,cAAb,MAAa,YAAkB;CAC3B;CACA;CACA;CAEA,YAAY,QAA0B,MAAc,QAA4B;EAC5E,KAAK,UAAU;EACf,KAAK,OAAO;EACZ,KAAK,UAAU;CACnB;CAEA,MAAM,IAAI,KAA2B;EACjC,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;EAC5E,OAAO,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;CAClE;CAEA,MAAM,QAAQ,MAA8C;EAKxD,QAAO,MAJc,KAAK,QAAQ,QAC9B,KAAK,MACL,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAClD,EAAA,CACc,KAAK,UAAW,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK,CAAE;CAC3F;CAEA,MAAM,IAAI,KAA0B;EAChC,OAAO,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;CACnE;CAEA,MAAM,IAAI,KAAQ,OAAU,SAAqC;EAC7D,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,GAAG,KAAK,QAAQ,MAAM,OAAO,KAAK,GAAG,OAAO;CAC7G;CAEA,MAAM,QAAQ,SAAyC,SAAqC;EACxF,MAAM,UAAU,QAAQ,KAAK,CAAC,KAAK,WAAqC,CACpE,KAAK,QAAQ,IAAI,OAAO,GAAG,GAC3B,KAAK,QAAQ,MAAM,OAAO,KAAK,CACnC,CAAC;EACD,MAAM,eAAe,KAAK,SAAS,cAAc,gBAC7C,YAAY,QAAQ,KAAK,MAAM,SAAS,OAAO,CACnD;CACJ;CAEA,MAAM,OAAO,KAA0B;EACnC,OAAO,KAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;CACtE;CAEA,MAAM,WAAW,MAAmC;EAChD,MAAM,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;EAC9D,MAAM,eAAe,KAAK,SAAS,cAAc,gBAAgB,YAAY,WAAW,KAAK,MAAM,OAAO,CAAC;CAC/G;CAEA,MAAM,WAAW,YAA+D;EAC5E,MAAM,UAAU,WAAW,KAAK,cAAuB;GACnD,MAAM,OAAQ,UAAgC;GAC9C,IAAI,SAAS,SAAS,SAAS,UAC3B,MAAM,IAAI,UAAU,8CAA8C;GAEtE,MAAM,MAAM,KAAK,QAAQ,IAAI,OAAO,UAAU,GAAG;GACjD,IAAI,UAAU,SAAS,UACnB,OAAO;IAAE,MAAM;IAAU;GAAI;GAEjC,OAAO;IAAE,MAAM;IAAO;IAAK,OAAO,KAAK,QAAQ,MAAM,OAAO,UAAU,KAAK;GAAE;EACjF,CAAC;EACD,MAAM,eAAe,KAAK,SAAS,cAAc,gBAAgB,YAAY,WAAW,KAAK,MAAM,OAAO,CAAC;CAC/G;CAEA,MAAM,KAAK,QAAwB,CAAC,GAAqC;EAErE,QAAO,MADY,KAAK,QAAQ,KAAK,KAAK,MAAM,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,EAAA,CACxE,KAAK,EAAE,KAAK,aAAa;GACjC,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG;GAChC,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;EAC1C,EAAE;CACN;CAEA,MAAM,QAAuB;EACzB,MAAM,KAAK,QAAQ,WAAW,KAAK,IAAI;CAC3C;CAEA,MAAS,MAAc,KAA2C;EAC9D,OAAO,IAAI,YAAY,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK,KAAK,OAAO;CAC3E;CAEA,YACI,MACA,QACU;EACV,IAAI,EAAE,WAAW,KAAK,UAClB,OAAO,QAAQ,uBAAO,IAAI,UAAU,+CAA+C,CAAC;EAExF,OAAO,sBAAsB,KAAK,SAAS,OAAO,gBAC9C,OAAO,IAAI,YAAY,aAAa,KAAK,MAAM,KAAK,OAAO,GAAG,WAAW,CAC7E;CACJ;AACJ;;AAGA,SAAgB,gBACZ,QACA,MACA,QACiB;CACjB,OAAO,IAAI,YAAY,QAAQ,MAAM,MAAM;AAC/C;AAEA,eAAsB,kBAClB,QACA,MACA,QACA,SAC0B;CAC1B,MAAM,OAAO,YAAY,MAAM,OAAO;CACtC,OAAO,gBAAgB,QAAQ,MAAM,MAAM;AAC/C;;;ACnaA,IAAa,kBAAkB,EAAE,MAAM;AACvC,IAAa,mBAAmB,MAAM,OAAO;;;ACa7C,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,wCAAwB,IAAI,IAAI;CAAC;CAAa;CAAa;AAAa,CAAC;AAC/E,IAAM,iCAAe,IAAI,IAAmB;CAAC;CAAW;CAAQ;CAAQ;CAAW;AAAM,CAAC;AAC1F,IAAM,2BAAW,IAAI,IAAI;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAAG;AACP,CAAC;AASD,IAAa,iBAAb,cAAoC,YAAY;CAC5C;CAEA,YAAY,SAAiB,UAAkB;EAC3C,MAAM,GAAG,QAAQ,eAAe,UAAU;EAC1C,KAAK,OAAO;EACZ,KAAK,WAAW;CACpB;AACJ;AAEA,SAAgB,SAAS,KAA6B;CAClD,IAAI,OAAO,QAAQ,UACf,MAAM,IAAI,UAAU,sBAAsB;CAE9C,IAAI,IAAI,SAAS,gBACb,MAAM,IAAI,eAAe,eAAe,eAAe,cAAc,cAAc;CAEvF,OAAO,IAAI,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM;AAC3C;AAEA,SAAgB,kBAAkB,QAAwB,aAAiC,CAAC,GAAe;CACvG,IAAI,CAAC,MAAM,QAAQ,UAAU,GACzB,MAAM,IAAI,UAAU,iCAAiC;CAEzD,IAAI,WAAW,WAAW,OAAO,gBAC7B,MAAM,IAAI,WAAW,eAAe,OAAO,eAAe,wBAAwB,WAAW,QAAQ;CAEzG,OAAO,MAAM,KAAwB,aAAa,OAAO,UAAU;EAC/D,IAAI,UAAU,QAAQ,OAAO,UAAU,WACnC,OAAO;EAEX,IAAI,OAAO,UAAU,UAAU;GAC3B,IACI,CAAC,OAAO,SAAS,KAAK,KACrB,OAAO,UAAU,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,aAAa,KAAK,GAE9E,MAAM,IAAI,WACN,iBAAiB,QAAQ,EAAE,gEAC/B;GAEJ,OAAO;EACX;EACA,IAAI,OAAO,UAAU,UAAU;GAC3B,IAAI,QAAQ,mBAAmB,QAAQ,iBACnC,MAAM,IAAI,WAAW,iBAAiB,QAAQ,EAAE,yCAAyC;GAE7F,OAAO;EACX;EACA,IAAI,OAAO,UAAU,UAAU;GAC3B,IAAI,CAAC,gBAAgB,KAAK,GACtB,MAAM,IAAI,UAAU,iBAAiB,QAAQ,EAAE,0CAA0C;GAE7F,OAAO;EACX;EACA,IAAI,iBAAiB,YACjB,OAAO,WAAW,KAAK,KAAK;EAEhC,MAAM,IAAI,UAAU,iBAAiB,QAAQ,EAAE,8DAA8D;CACjH,CAAC;AACL;AAEA,SAAgB,gBAAgB,YAAgC,YAA2C;CACvG,IAAI,WAAW,SAAS,WACpB,OAAO,WAAW;CAEtB,IAAI,CAAC,OAAO,cAAc,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,WAAW,SAAS,WAAW,QAClG,MAAM,IAAI,WAAW,iBAAiB,WAAW,QAAQ,EAAE,YAAY;CAE3E,MAAM,QAAQ,WAAW,GAAG,WAAW,KAAK;CAC5C,IAAI,UAAU,KAAA,GACV,MAAM,IAAI,WAAW,iBAAiB,WAAW,QAAQ,EAAE,YAAY;CAE3E,OAAO;AACX;AAEA,IAAM,SAAN,MAAa;CACT;CACA,SAAS;CACT,kBAAkB;CAClB,WAAW;CACX,cAAc;CAEd,YAAY,QAAiB;EACzB,KAAK,UAAU;CACnB;CAEA,QAAwB;EACpB,MAAM,YAAY,KAAK,gBAAgB;EACvC,KAAK,cAAc,GAAG;EACtB,IAAI,KAAK,SAAS,CAAC,CAAC,SAAS,OACzB,MAAM,KAAK,OAAO,sCAAsC;EAE5D,OAAO;GAAE;GAAW,gBAAgB,KAAK;EAAgB;CAC7D;CAEA,kBAAgC;EAC5B,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,aAAa;EAE7B,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO,KAAK,WAAW;EAE3B,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,MAAM,KAAK,OAAO,sEAAsE;CAC5F;CAEA,eAA6B;EACzB,KAAK,eAAe,OAAO;EAC3B,MAAM,cAAc,KAAK,eAAe,IAAI;EAC5C,IAAI,aAAa;GACb,KAAK,eAAe,KAAK;GACzB,KAAK,eAAe,QAAQ;EAChC;EACA,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,cAAc,GAAG;EACtB,MAAM,UAAiC,CAAC;EACxC,MAAM,wBAAQ,IAAI,IAAY;EAC9B,IAAI,kBAAkB;EACtB,GAAG;GACC,MAAM,OAAO,KAAK,YAAY;GAC9B,KAAK,cAAc,OAAO,MAAM,QAAQ;GACxC,MAAM,YAAY,KAAK,SAAS;GAChC,MAAM,OAAO,UAAU,KAAK,YAAY;GACxC,IAAI,UAAU,SAAS,UAAU,CAAC,eAAa,IAAI,IAAI,GACnD,MAAM,KAAK,OAAO,4DAA4D;GAElF,KAAK,UAAU;GACf,IAAI,aAAa;GACjB,IAAI,WAAW;GACf,IAAI,uBAAuB;GAC3B,SACI,IAAI,KAAK,eAAe,SAAS,GAAG;IAChC,IAAI,YACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,KAAK,eAAe,KAAK;IACzB,aAAa;IACb,mBAAmB;IACnB,IAAI,kBAAkB,GAClB,MAAM,KAAK,OAAO,0CAA0C;GAEpE,OAAO,IAAI,KAAK,eAAe,KAAK,GAAG;IACnC,KAAK,eAAe,MAAM;IAC1B,IAAI,sBACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,WAAW;IACX,uBAAuB;GAC3B,OAAO,IAAI,KAAK,eAAe,MAAM,GAAG;IACpC,IAAI,sBACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,WAAW;IACX,uBAAuB;GAC3B,OACI;GAGR,IAAI,cAAc,YAAY,sBAC1B,MAAM,KAAK,OAAO,qCAAqC;GAE3D,QAAQ,KAAK;IAAE;IAAM;IAAM;IAAY,UAAU,aAAa,QAAQ;GAAS,CAAC;EACpF,SAAS,KAAK,cAAc,GAAG;EAC/B,KAAK,cAAc,GAAG;EACtB,OAAO;GAAE,MAAM;GAAe;GAAO;GAAS;EAAY;CAC9D;CAEA,aAA2B;EACvB,KAAK,eAAe,OAAO;EAC3B,MAAM,WAAW,KAAK,eAAe,IAAI;EACzC,IAAI,UACA,KAAK,eAAe,QAAQ;EAEhC,OAAO;GAAE,MAAM;GAAa,OAAO,KAAK,YAAY;GAAG;EAAS;CACpE;CAEA,UAAwB;EACpB,KAAK,eAAe,MAAM;EAC1B,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,UAA2B;EAC/B,IAAI,KAAK,cAAc,GAAG,GAAG;GACzB,UAAU,KAAK,gBAAgB;GAC/B,KAAK,cAAc,GAAG;EAC1B;EACA,KAAK,eAAe,QAAQ;EAC5B,MAAM,OAA+B,CAAC;EACtC,IAAI,QAAQ,SAAS;EACrB,GAAG;GACC,KAAK,cAAc,GAAG;GACtB,MAAM,MAAM,CAAC,KAAK,OAAO,CAAC;GAC1B,OAAO,KAAK,cAAc,GAAG,GACzB,IAAI,KAAK,KAAK,OAAO,CAAC;GAE1B,KAAK,cAAc,GAAG;GACtB,UAAU,IAAI;GACd,IAAI,IAAI,WAAW,OACf,MAAM,KAAK,OAAO,yCAAyC;GAE/D,KAAK,KAAK,GAAG;EACjB,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;GAAE,MAAM;GAAU;GAAO;GAAS;EAAK;CAClD;CAEA,UAAwB;EACpB,MAAM,UAAU,KAAK,cAAc,GAAG,IAAI,OAAO,KAAK,gBAAgB;EACtE,KAAK,eAAe,MAAM;EAC1B,MAAM,QAAQ,KAAK,YAAY;EAC/B,MAAM,QAAQ,KAAK,OAAO;EAC1B,MAAM,UAAwB,CAAC;EAC/B,IAAI,KAAK,eAAe,OAAO,GAAG;GAC9B,KAAK,eAAe,IAAI;GACxB,MAAM,wBAAQ,IAAI,IAAY;GAC9B,GAAG;IACC,MAAM,SAAS,KAAK,YAAY;IAChC,KAAK,cAAc,OAAO,QAAQ,iBAAiB;IACnD,MAAM,YAAY,KAAK,eAAe,MAAM,IAAI,SAAS;IACzD,IAAI,cAAc,OACd,KAAK,eAAe,KAAK;IAE7B,QAAQ,KAAK;KAAE;KAAQ;IAAU,CAAC;GACtC,SAAS,KAAK,cAAc,GAAG;EACnC;EACA,IAAI,QAAmC;EACvC,IAAI,SAAoC;EACxC,IAAI,KAAK,eAAe,OAAO,GAAG;GAC9B,QAAQ,KAAK,UAAU,OAAO;GAC9B,IAAI,KAAK,eAAe,QAAQ,GAC5B,SAAS,KAAK,UAAU,QAAQ;EAExC;EACA,OAAO;GAAE,MAAM;GAAU;GAAO;GAAS;GAAO;GAAS;GAAO;EAAO;CAC3E;CAEA,UAAwB;EACpB,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,eAAe,KAAK;EACzB,MAAM,cAA+D,CAAC;EACtE,MAAM,wBAAQ,IAAI,IAAY;EAC9B,GAAG;GACC,MAAM,SAAS,KAAK,YAAY;GAChC,KAAK,cAAc,OAAO,QAAQ,YAAY;GAC9C,KAAK,cAAc,GAAG;GACtB,YAAY,KAAK;IAAE;IAAQ,OAAO,KAAK,OAAO;GAAE,CAAC;EACrD,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;GAAE,MAAM;GAAU;GAAO;GAAa,OAAO,KAAK,OAAO;EAAE;CACtE;CAEA,UAAwB;EACpB,KAAK,eAAe,MAAM;EAC1B,OAAO;GAAE,MAAM;GAAU,OAAO,KAAK,YAAY;GAAG,OAAO,KAAK,OAAO;EAAE;CAC7E;CAEA,SAA+B;EAC3B,OAAO,KAAK,eAAe,OAAO,IAAI,KAAK,IAAI,IAAI;CACvD;CAEA,MAAqB;EACjB,IAAI,aAAa,KAAK,KAAK;EAC3B,OAAO,KAAK,eAAe,IAAI,GAC3B,aAAa;GAAE,MAAM;GAAM,MAAM;GAAY,OAAO,KAAK,KAAK;EAAE;EAEpE,OAAO;CACX;CAEA,OAAsB;EAClB,IAAI,aAAa,KAAK,WAAW;EACjC,OAAO,KAAK,eAAe,KAAK,GAC5B,aAAa;GAAE,MAAM;GAAO,MAAM;GAAY,OAAO,KAAK,WAAW;EAAE;EAE3E,OAAO;CACX;CAEA,aAA4B;EACxB,IAAI,KAAK,cAAc,GAAG,GAAG;GACzB,KAAK,YAAY;GACjB,IAAI,KAAK,WAAW,aAChB,MAAM,KAAK,OAAO,yBAAyB,aAAa;GAE5D,MAAM,aAAa,KAAK,IAAI;GAC5B,KAAK,cAAc,GAAG;GACtB,KAAK,YAAY;GACjB,OAAO;EACX;EACA,KAAK,eAAe;EACpB,IAAI,KAAK,cAAc,gBACnB,MAAM,KAAK,OAAO,2BAA2B,gBAAgB;EAEjE,MAAM,SAAS,KAAK,YAAY;EAChC,IAAI,KAAK,eAAe,IAAI,GAAG;GAC3B,MAAM,UAAU,KAAK,eAAe,KAAK;GACzC,KAAK,eAAe,MAAM;GAC1B,OAAO;IAAE,MAAM;IAAU;IAAQ;GAAQ;EAC7C;EACA,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,YAAY,CAAC;GAAC;GAAK;GAAM;GAAM;GAAK;GAAM;GAAK;EAAI,CAAC,CAAC,SAAS,MAAM,IAAI,GACvF,MAAM,KAAK,OAAO,iDAAiD;EAEvE,KAAK,UAAU;EAEf,OAAO;GAAE,MAAM;GAAc;GAAQ,UADnB,MAAM,SAAS,OAAO,OAAO,MAAM;GACN,OAAO,KAAK,OAAO;EAAE;CACxE;CAEA,UAAU,QAAoC;EAC1C,MAAM,QAAQ,KAAK,OAAO;EAC1B,IACI,MAAM,SAAS,cACd,OAAO,MAAM,UAAU,YAAY,CAAC,OAAO,cAAc,MAAM,KAAK,KAAK,MAAM,QAAQ,IAExF,MAAM,KAAK,OAAO,GAAG,OAAO,kDAAkD;EAElF,OAAO;CACX;CAEA,SAA6B;EACzB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,aAAa;GAC5B,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAa,OAAO,KAAK;GAAkB;EAC9D;EACA,IAAI,MAAM,SAAS,UAAU;GACzB,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAW,OAAO,MAAM;GAAK;EAChD;EACA,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAK;EAE1C,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAK;EAE1C,IAAI,KAAK,eAAe,OAAO,GAC3B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAM;EAE3C,MAAM,OAAO,KAAK,cAAc,GAAG,IAAI,MAAM,KAAK,cAAc,GAAG,IAAI,MAAM;EAC7E,MAAM,SAAS,KAAK,SAAS;EAC7B,IAAI,OAAO,SAAS,UAAU;GAC1B,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAW,OAAO,YAAY,OAAO,OAAO,MAAM,MAAM,QAAQ;GAAE;EACrF;EACA,MAAM,KAAK,OAAO,qDAAqD;CAC3E;CAEA,kBAA4B;EACxB,MAAM,wBAAQ,IAAI,IAAY;EAC9B,MAAM,UAAoB,CAAC;EAC3B,GAAG;GACC,MAAM,OAAO,KAAK,YAAY;GAC9B,KAAK,cAAc,OAAO,MAAM,QAAQ;GACxC,QAAQ,KAAK,IAAI;EACrB,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;CACX;CAEA,cAAsB;EAClB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,iBAAiB,MAAM,SAAS,UAAU,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC,IAC9F,MAAM,KAAK,OAAO,wDAAwD;EAE9E,IACI,MAAM,KAAK,WAAW,KACtB,MAAM,KAAK,SAAS,yBACpB,qBAAqB,MAAM,IAAI,KAC/B,sBAAsB,IAAI,MAAM,KAAK,YAAY,CAAC,KAClD,CAAC,gBAAgB,MAAM,IAAI,GAE3B,MAAM,KAAK,OAAO,gCAAgC;EAEtD,KAAK,UAAU;EACf,OAAO,MAAM;CACjB;CAEA,cAAc,OAAoB,MAAc,OAAqB;EACjE,IAAI,MAAM,IAAI,IAAI,GACd,MAAM,KAAK,OAAO,aAAa,MAAM,IAAI,MAAM;EAEnD,MAAM,IAAI,IAAI;CAClB;CAEA,WAAkB;EACd,OAAO,KAAK,QAAQ,KAAK;CAC7B;CAEA,eAAe,SAA0B;EACrC,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,UAAU,MAAM,KAAK,YAAY,MAAM,SACtD,OAAO;EAEX,KAAK,UAAU;EACf,OAAO;CACX;CAEA,eAAe,SAAuB;EAClC,IAAI,CAAC,KAAK,eAAe,OAAO,GAC5B,MAAM,KAAK,OAAO,YAAY,SAAS;CAE/C;CAEA,cAAc,QAAyB;EACnC,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,YAAY,MAAM,SAAS,QAC1C,OAAO;EAEX,KAAK,UAAU;EACf,OAAO;CACX;CAEA,cAAc,QAAsB;EAChC,IAAI,CAAC,KAAK,cAAc,MAAM,GAC1B,MAAM,KAAK,OAAO,YAAY,QAAQ;CAE9C;CAEA,OAAO,SAAiC;EACpC,OAAO,IAAI,eAAe,SAAS,KAAK,SAAS,CAAC,CAAC,QAAQ;CAC/D;AACJ;AAEA,SAAS,SAAS,KAAsB;CACpC,MAAM,SAAkB,CAAC;CACzB,IAAI,QAAQ;CACZ,OAAO,QAAQ,IAAI,QAAQ;EACvB,MAAM,YAAY,IAAI;EACtB,IAAI,MAAM,KAAK,SAAS,GAAG;GACvB,SAAS;GACT;EACJ;EACA,IAAI,IAAI,WAAW,MAAM,KAAK,GAAG;GAC7B,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,IAAI,WAAW,QAAQ,IAAI,WAAW,MAC/D,SAAS;GAEb;EACJ;EACA,IAAI,IAAI,WAAW,MAAM,KAAK,GAAG;GAC7B,MAAM,MAAM,IAAI,QAAQ,MAAM,QAAQ,CAAC;GACvC,IAAI,MAAM,GACN,MAAM,IAAI,eAAe,8BAA8B,KAAK;GAEhE,QAAQ,MAAM;GACd;EACJ;EACA,IAAI,OAAO,UAAU,YACjB,MAAM,IAAI,eAAe,2BAA2B,cAAc,KAAK;EAE3E,MAAM,WAAW;EACjB,IAAI,cAAc,OAAO,cAAc,MAAK;GACxC,MAAM,QAAQ;GACd,IAAI,OAAO;GACX,IAAI,SAAS;GACb,SAAS;GACT,OAAO,QAAQ,IAAI,QACf,IAAI,IAAI,WAAW,OAAO;IACtB,IAAI,IAAI,QAAQ,OAAO,OAAO;KAC1B,QAAQ;KACR,SAAS;IACb,OAAO;KACH,SAAS;KACT,SAAS;KACT;IACJ;GACJ,OACI,QAAQ,IAAI;GAGpB,IAAI,CAAC,QACD,MAAM,IAAI,eAAe,6BAA6B,QAAQ;GAElE,IAAI,CAAC,gBAAgB,IAAI,GACrB,MAAM,IAAI,eAAe,yDAAyD,QAAQ;GAE9F,OAAO,KAAK;IAAE,MAAM,UAAU,MAAM,WAAW;IAAc;IAAM;GAAS,CAAC;EACjF,OAAO,IAAI,aAAa,KAAK,SAAS,GAAG;GACrC,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEb,OAAO,KAAK;IAAE,MAAM;IAAQ,MAAM,IAAI,MAAM,UAAU,KAAK;IAAG;GAAS,CAAC;EAC5E,OAAO,IAAI,MAAM,KAAK,SAAS,KAAM,cAAc,OAAO,MAAM,KAAK,IAAI,QAAQ,MAAM,EAAE,GAAI;GACzF,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEb,IAAI,cAAc,OAAO,IAAI,WAAW,KAAK;IACzC,SAAS;IACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEjB;GACA,IAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;IAC1C,SAAS;IACT,IAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KACrC,SAAS;IAEb,MAAM,gBAAgB;IACtB,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;IAEb,IAAI,UAAU,eACV,MAAM,IAAI,eAAe,4BAA4B,QAAQ;GAErE;GACA,MAAM,OAAO,IAAI,MAAM,UAAU,KAAK;GACtC,IAAI,KAAK,SAAS,mBACd,MAAM,IAAI,eAAe,2BAA2B,kBAAkB,cAAc,QAAQ;GAEhG,OAAO,KAAK;IAAE,MAAM;IAAU;IAAM;GAAS,CAAC;EAClD,OAAO,IAAI,cAAc,KAAK;GAC1B,SAAS;GACT,OAAO,KAAK;IAAE,MAAM;IAAa,MAAM;IAAW;GAAS,CAAC;EAChE,OAAO;GACH,MAAM,OAAO,IAAI,MAAM,OAAO,QAAQ,CAAC;GACvC,IAAI;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,CAAC,SAAS,IAAI,GAAG;IACzC,SAAS;IACT,OAAO,KAAK;KAAE,MAAM;KAAU,MAAM;KAAM;IAAS,CAAC;GACxD,OAAO,IAAI,aAAa,SAAS,SAAS,GAAG;IACzC,SAAS;IACT,OAAO,KAAK;KAAE,MAAM;KAAU,MAAM;KAAW;IAAS,CAAC;GAC7D,OACI,MAAM,IAAI,eAAe,8BAA8B,aAAa,QAAQ;EAEpF;CACJ;CACA,OAAO,KAAK;EAAE,MAAM;EAAO,MAAM;EAAI,UAAU,IAAI;CAAO,CAAC;CAC3D,OAAO;AACX;AAEA,SAAS,aAAa,OAAwB;CAC1C,IAAI,CAAC,OAAO,UAAU,KAAK,GACvB,OAAO;CAEX,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,WAAW,mBAAmB,WAAW;AACpD;AAEA,SAAS,YAAY,MAAc,UAAmC;CAClE,IAAI,cAAc,KAAK,IAAI,GAAG;EAC1B,MAAM,UAAU,OAAO,IAAI;EAC3B,IAAI,UAAU,mBAAmB,UAAU,iBACvC,MAAM,IAAI,eAAe,mDAAmD,QAAQ;EAExF,OAAO,WAAW,OAAO,OAAO,gBAAgB,KAAK,WAAW,OAAO,OAAO,gBAAgB,IACxF,OAAO,OAAO,IACd;CACV;CACA,MAAM,QAAQ,OAAO,IAAI;CAEzB,IAAI,CAAC,OAAO,SAAS,KAAK,KAAM,OAAO,UAAU,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,aAAa,KAAK,GACzG,MAAM,IAAI,eAAe,wEAAwE,QAAQ;CAE7G,MAAM,CAAC,UAAU,eAAe,OAAO,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG;CACnE,MAAM,SAAS,SAAS,QAAQ,WAAW,EAAE;CAC7C,MAAM,UAAU,SAAS,KAAK,MAAM;CACpC,IAAI,UAAU,KAAK,SACf,MAAM,IAAI,eAAe,mCAAmC,QAAQ;CAExE,IAAI,OAAO,UAAU,KAAK,KAAK,SAAS;EACpC,MAAM,iBAAiB,SAAS,SAAS,GAAG,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG,IAAI,IAAI;EAC9F,MAAM,gBAAgB,OAAO,SAAS,OAAO,QAAQ,QAAQ,EAAE,CAAC,CAAC;EACjE,IAAI,OAAO,YAAY,IAAI,iBAAiB,gBAAgB,GACxD,MAAM,IAAI,eAAe,0CAA0C,QAAQ;CAEnF;CACA,OAAO;AACX;AAEA,SAAS,gBAAgB,OAAwB;CAC7C,KAAK,MAAM,aAAa,OAAO;EAC3B,MAAM,YAAY,UAAU,YAAY,CAAC;EACzC,IAAI,aAAa,SAAU,aAAa,OACpC,OAAO;CAEf;CACA,OAAO;AACX;AAEA,SAAS,qBAAqB,OAAwB;CAClD,KAAK,MAAM,aAAa,OAAO;EAC3B,MAAM,YAAY,UAAU,YAAY,CAAC;EACzC,IAAI,YAAY,MAAQ,cAAc,KAClC,OAAO;CAEf;CACA,OAAO;AACX;;;AC1pBA,IAAM,UAAU;AAChB,IAAM,YAAY,WAAW,GAAG,CAAC;AACjC,IAAM,QAAQ;CAAE,QAAQ;CAAc,SAAS;AAAE;AACjD,IAAM,kBAAkB,WAAW,GAAG,GAAG;AACzC,IAAM,oBAAoB;AAC1B,IAAM,cAAc,EAAE,MAAM;AAC5B,IAAM,eAAe,MAAM,OAAO;AAClC,IAAM,cAAc,MAAM,OAAO;AACjC,IAAM,+BAAe,IAAI,IAAI;CAAC;CAAW;CAAQ;CAAQ;CAAW;AAAM,CAAC;AAwB3E,IAAa,iBAAb,cAAoC,MAAM;CACtC,YAAY,SAAiB,SAAwB;EACjD,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;AACA,IAAa,eAAb,cAAkC,UAAU;CACxC,YAAY,SAAiB;EACzB,MAAM,OAAO;EACb,KAAK,OAAO;CAChB;AACJ;AAoBA,SAAgB,gBAAgB,IAAQ,UAA4B,CAAC,GAAc;CAC/E,MAAM,kBAAkB,QAAQ,YAAY,KAAA,IAAY,OAAO,0BAA0B,QAAQ,OAAO;CACxG,MAAM,MAAM,OAAO,KAAa,YAAgC,YAAyC;EACrG,MAAM,SAAS,SAAS,GAAG;EAC3B,MAAM,QAAQ,kBAAkB,QAAQ,UAAU;EAClD,MAAM,YAAY,OAAO;EACzB,IAAI,WAAW,CAAC,eAAe,SAAS,GACpC,MAAM,IAAI,eAAe,4CAA4C;EAEzE,MAAM,KAAK,MAAM,GAAG,MAAM,UAAU,SAAS,YAAY,UAAU,aAAa,WAAW;EAC3F,IAAI,WAAW;EACf,IAAI;GACA,MAAM,UAAU,0BAA2B,MAAM,GAAG,cAAc,KAAM,CAAC,CAAC;GAC1E,IACI,mBACA,oCAAoC,eAAe,MAAM,oCAAoC,OAAO,GAEpG,MAAM,IAAI,eAAe,4DAA4D;GAEzF,MAAM,SAAS,MAAM,iBAAiB,IAAI,WAAW,OAAO,SAAS,OAAO;GAE5E,WAAW;GACX,IAAI,GAAG,SAAS,aACZ,MAAM,GAAG,OAAO;QAEhB,MAAM,GAAG,SAAS;GAEtB,OAAO;EACX,SAAS,OAAO;GACZ,IAAI,CAAC,UACD,IAAI;IACA,MAAM,GAAG,SAAS;GACtB,SAAS,eAAe;IACpB,MAAM,IAAI,eAAe,CAAC,OAAO,aAAa,GAAG,qCAAqC,EAClF,OAAO,cACX,CAAC;GACL;GAEJ,MAAM;EACV;CACJ;CACA,OAAO;EACH,UAAU,KAAK,aAAa,CAAC,MAAM,IAAI,KAAK,YAAY,KAAK;EAC7D,MAAM,MAAM,KAAK,aAAa,CAAC,GAAG;GAC9B,IAAI,SAAS,GAAG,CAAC,CAAC,UAAU,SAAS,UACjC,MAAM,IAAI,eAAe,yBAAyB;GAEtD,QAAQ,MAAM,IAAI,KAAK,YAAY,KAAK,EAAA,CAAG;EAC/C;EACA,MAAM,QAAQ,KAAK,aAAa,CAAC,GAAG;GAChC,MAAM,SAAS,MAAM,IAAI,KAAK,YAAY,IAAI;GAC9C,IAAI,CAAC,OAAO,MACR,MAAM,IAAI,eAAe,6BAA6B;GAE1D,OAAO,OAAO;EAClB;CACJ;AACJ;AAEA,eAAe,iBACX,IACA,WACA,YACA,SACA,SACkB;CAClB,gBAAgB,UAAU,KAAK;CAC/B,MAAM,gBAAgB,MAAM,YAAY,EAAE;CAC1C,MAAM,SAAS,gBAAgB,MAAM,WAAW,IAAI,UAAU,KAAK,IAAI;CACvE,IAAI,QAAQ,MAAM,qBAAqB,IAAI,MAAM;CACjD,IAAI,UAAU,SAAS,eAAe;EAClC,IAAI,QAAQ;GACR,IAAI,UAAU,aAAa,OAAO;IAAE,MAAM,CAAC;IAAG,cAAc;GAAE;GAC9D,MAAM,IAAI,eAAe,yBAAyB,UAAU,OAAO;EACvE;EACA,MAAM,UAAuB;GACzB,SAAS;GACT,OAAO,UAAU;GACjB,SAAS,UAAU;GACnB,WAAW;EACf;EACA,eAAe,SAAS,UAAU,KAAK;EACvC,IAAI,CAAC,eAAe;GAChB,MAAM,GAAG,YAAY,OAAO;GAC5B,MAAM,GAAG,IAAI,SAAS,WAAW,WAAW,KAAK,CAAC;EACtD;EACA,MAAM,GAAG,YAAY,UAAU,KAAK;EACpC,MAAM,GAAG,IAAI,UAAU,OAAO,iBAAiB,gBAAgB,OAAO,CAAC;EACvE,MAAM,GAAG,IAAI,SAAS,UAAU,UAAU,KAAK,GAAG,WAAW,OAAO,CAAC;EACrE,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;CACvC;CACA,IAAI,CAAC,QAAQ;EACT,IAAI,UAAU,SAAS,eAAe,UAAU,UAAU,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;EAC7F,MAAM,IAAI,eAAe,yBAAyB,UAAU,OAAO;CACvE;CACA,IAAI,UAAU,SAAS,aAAa;EAChC,MAAM,GAAG,UAAU,UAAU,KAAK;EAClC,MAAM,GAAG,OAAO,SAAS,UAAU,UAAU,KAAK,CAAC;EACnD,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;CACvC;CACA,IAAI,UAAU,SAAS,UACnB,OAAO,WAAW,IAAI,QAAQ,WAAW,UAAU;CAEvD,cAAc,QAAQ,UAAU,OAAO,UAAU;CACjD,IAAI,UAAU,SAAS,UAAU;EAC7B,mBAAmB,QAAQ,UAAU,OAAO;EAC5C,KAAK,MAAM,SAAS,UAAU,SAAS,UAAU,QAAQ,MAAM,MAAM;CACzE;CACA,IAAI,UAAU,SAAS,UAAU;EAC7B,mBACI,QACA,UAAU,YAAY,KAAK,eAAe,WAAW,MAAM,CAC/D;EACA,KAAK,MAAM,cAAc,UAAU,aAC/B,eAAe,UAAU,QAAQ,WAAW,MAAM,GAAG,gBAAgB,WAAW,OAAO,UAAU,CAAC;CAE1G;CACA,MAAM,UAAU,UAAU,SAAS,WAAW,UAAU,UAAU,CAAC;CACnE,MAAM,OAAO,WAAW,QAAQ,UAAU,OAAO,SAAS,YAAY,OAAO;CAC7E,MAAM,QAAQ,UAAU,SAAS,WAAW,aAAa,UAAU,OAAO,YAAY,OAAO,IAAI;CACjG,MAAM,SAAS,UAAU,SAAS,WAAY,aAAa,UAAU,QAAQ,YAAY,QAAQ,KAAK,IAAK;CAC3G,IAAI,SAAS,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc;EAAG,MAAM,KAAK;CAAO;CACnE,MAAM,aACF,UAAU,SAAS,YAAY,KAAK,OAAO,SAAS,UAAU,UAAU,OAClE,KAAK,IAAI,OAAO,kBAAkB,SAAS,KAAK,IAChD,KAAA;CACV,MAAM,OAAO,UAAU,IAAI,CAAC,IAAI,MAAM,SAAS,IAAI,QAAQ,MAAM,UAAU,OAAO,YAAY,UAAU;CACxG,IAAI,UAAU,SAAS,UAAU;EAC7B,IAAI,KAAK,OAAO,SAAS,UAAU,KAAK,MAAM,MAAM,UAAU,YAAY,MAAM,OAAO,OAAO,CAAC;EAE/F,OAAO;GACH,MAFa,KAAK,MAAM,QAAQ,UAAU,OAAO,KAAA,IAAY,SAAS,KAEhE,CAAA,CAAS,KAAK,EAAE,UAClB,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI,CAAC,CACpF;GACA,cAAc;GACd,MAAM,KAAK;EACf;CACJ;CACA,IAAI,UAAU,SAAS,UAAU;EAC7B,MAAM,GAAG,WACL,OAAO,OACP,KAAK,KAAK,EAAE,UAAU,GAAG,CAC7B;EACA,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc,KAAK;GAAQ,MAAM,KAAK;EAAO;CACpE;CACA,MAAM,UAAU,KAAK,KAAK,EAAE,KAAK,UAAU;EACvC,MAAM,UAAU,EAAE,GAAG,IAAI;EACzB,KAAK,MAAM,cAAc,UAAU,aAC/B,QAAQ,WAAW,UAAU,eACzB,UAAU,QAAQ,WAAW,MAAM,GACnC,gBAAgB,WAAW,OAAO,UAAU,CAChD;EAEJ,MAAM,UAAU,cAAc,MAAM;EACpC,OAAO;GAAE,QAAQ;GAAK,KAAK,UAAU,WAAW,SAAS,QAAQ,QAAQ,KAAK,IAAI;GAAK,KAAK;EAAQ;CACxG,CAAC;CACD,MAAM,+BAAe,IAAI,IAAY;CACrC,MAAM,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE,UAAU,cAAc,GAAG,CAAC,CAAC;CACjE,KAAK,MAAM,UAAU,SAAS;EAC1B,MAAM,WAAW,cAAc,OAAO,GAAG;EACzC,IAAI,aAAa,IAAI,QAAQ,GAAG,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;EACpG,aAAa,IAAI,QAAQ;EACzB,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAM,MAAM,GAAG,IAAI,OAAO,OAAO,OAAO,GAAG,GAChE,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;CAE5E;CACA,MAAM,GAAG,WACL,OAAO,OACP,QAAQ,KAAK,EAAE,aAAa,MAAM,CACtC;CACA,KAAK,MAAM,UAAU,SAAS,MAAM,GAAG,IAAI,OAAO,OAAO,OAAO,KAAK,UAAU,QAAQ,OAAO,GAAG,CAAC;CAClG,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc,QAAQ;EAAQ,MAAM,KAAK;CAAO;AACvE;AAEA,eAAe,YAAY,IAAmC;CAC1D,IAAI;CACJ,IAAI;EACA,QAAQ,MAAM,GAAG,IAAI,SAAS,SAAS;CAC3C,SAAS,OAAO;EACZ,IAAI,iBAAiB,sBAAuB,iBAAiB,SAAS,MAAM,SAAS,sBACjF,OAAO;EACX,MAAM;CACV;CACA,IAAI,CAAC,OAAO,MAAM,IAAI,eAAe,0CAA0C,SAAS;CACxF,MAAM,QAAiB,WAAW,KAAK;CACvC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,WAAW,MAAM,UAAU,MAAM,YAAY,MAAM,SAC7E,MAAM,IAAI,eAAe,8BAA8B;CAE3D,OAAO;AACX;AAEA,eAAe,WAAW,IAAiB,OAA4C;CACnF,MAAM,QAAQ,MAAM,GAAG,IAAI,SAAS,UAAU,KAAK,CAAC;CACpD,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,SAAkB,WAAW,KAAK;CACxC,eAAe,QAAQ,KAAK;CAC5B,OAAO;AACX;AAEA,eAAe,qBAAqB,IAAiB,QAAoC;CACrF,IAAI;CACJ,IAAI;EACA,QAAQ,MAAM,GAAG,IAAI,OAAO,OAAO,eAAe;CACtD,SAAS,OAAO;EACZ,IAAI,iBAAiB,sBAAuB,iBAAiB,SAAS,MAAM,SAAS,sBACjF,MAAM,IAAI,eAAe,+BAA+B,OAAO,SAAS,EAAE,OAAO,MAAM,CAAC;EAE5F,MAAM;CACV;CACA,IAAI,CAAC,SAAS,aAAa,OAAO,gBAAgB,MAAM,CAAC,MAAM,GAC3D,MAAM,IAAI,eAAe,mDAAmD,OAAO,OAAO;AAElG;AAEA,SAAS,gBAAgB,QAAiC;CACtD,OAAO,WAAW,GACb,oBAAoB,KAAK,UAAU;EAChC,QAAQ;EACR,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,SAAS,OAAO;CACpB,CAAC,EACL,CAAC;AACL;AAEA,SAAS,eAAe,OAAgB,OAA6C;CACjF,IACI,CAAC,SAAS,KAAK,KACf,MAAM,YAAY,KAClB,MAAM,UAAU,SAChB,CAAC,MAAM,QAAQ,MAAM,OAAO,KAC5B,CAAC,MAAM,QAAQ,UACf,OAAO,MAAM,cAAc,YAC3B,MAAM,UAAU,SAAS,MACzB,CAAC,cAAc,KAAK,MAAM,SAAS,KACnC,OAAO,MAAM,SAAS,IAAI,aAAa,IAEvC,MAAM,IAAI,eAAe,+BAA+B,OAAO;CAEnE,MAAM,wBAAQ,IAAI,IAAY;CAC9B,IAAI,YAAY;CAChB,KAAK,MAAM,aAAa,MAAM,SAAsB;EAChD,IACI,CAAC,SAAS,SAAS,KACnB,OAAO,UAAU,SAAS,YAC1B,CAAC,UAAU,KAAK,UAChB,OAAO,UAAU,SAAS,YAC1B,CAAC,aAAa,IAAI,UAAU,IAAI,KAChC,OAAO,UAAU,eAAe,aAChC,OAAO,UAAU,aAAa,aAC9B,MAAM,IAAI,UAAU,IAAI,KACvB,UAAU,cAAc,UAAU,UAEnC,MAAM,IAAI,eAAe,+BAA+B,OAAO;EAEnE,MAAM,IAAI,UAAU,IAAI;EACxB,IAAI,UAAU,YAAY,aAAa;CAC3C;CACA,IAAI,YAAY,GAAG,MAAM,IAAI,eAAe,4BAA4B,OAAO;AACnF;AAEA,eAAe,WACX,IACA,QACA,WACA,YACkB;CAClB,MAAM,UAAU,UAAU,WAAW,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI;CAC/E,mBAAmB,QAAQ,OAAO;CAClC,MAAM,UAAU,cAAc,MAAM;CACpC,IAAI,YAAY,OAAO,OAAO,SAAS;CACvC,MAAM,UAA2C,CAAC;CAClD,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,UAAU,UAAU,MAAM;EACjC,IAAI,OAAO,WAAW,QAAQ,QAAQ,MAAM,IAAI,eAAe,2CAA2C;EAC1G,MAAM,MAAM,OAAO,OAAO,IAAI;EAC9B,KAAK,MAAM,UAAU,OAAO,SAAS,IAAI,OAAO,QAAQ;EACxD,OAAO,SAAS,YAAY,UAAU;GAClC,IAAI,QAAQ,UAAU,gBAAgB,YAAY,UAAU;EAChE,CAAC;EACD,KAAK,MAAM,UAAU,OAAO,SAAS,IAAI,OAAO,QAAQ,eAAe,QAAQ,IAAI,OAAO,KAAK;EAC/F,IAAI,CAAC,WAAW,YAAY,YACxB,MAAM,IAAI,gBAAgB,qCAAqC,OAAO,OAAO;EACjF,MAAM,MAAM,UAAU,WAAW,SAAS,IAAI,QAAQ,KAAK,IAAI,OAAO,WAAW;EACjF,MAAM,WAAW,cAAc,GAAG;EAClC,IAAI,KAAK,IAAI,QAAQ,KAAM,MAAM,GAAG,IAAI,OAAO,OAAO,GAAG,GACrD,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;EACxE,KAAK,IAAI,QAAQ;EACjB,QAAQ,KAAK,CAAC,KAAK,UAAU,QAAQ,GAAG,CAAC,CAAC;CAC9C;CACA,MAAM,GAAG,QAAQ,OAAO,OAAO,OAAO;CACtC,IAAI,CAAC,SAAS;EACV,OAAO,YAAY,UAAU,SAAS;EACtC,MAAM,GAAG,IAAI,SAAS,UAAU,OAAO,KAAK,GAAG,WAAW,MAAM,CAAC;CACrE;CACA,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc,QAAQ;CAAO;AACpD;AAEA,SAAS,eAAe,QAA6B,OAA2B;CAC5E,IAAI,UAAU,MAAM;EAChB,IAAI,CAAC,OAAO,UAAU,MAAM,IAAI,gBAAgB,UAAU,OAAO,KAAK,gBAAgB;EACtF,OAAO;CACX;CACA,QAAQ,OAAO,MAAf;EACI,KAAK,WAAW;GACZ,IAAI,OAAO,UAAU,aAAa,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,IAAI;GAC9F,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;GAChE,IAAI,UAAU,eAAe,UAAU,aAAa;GACpD,OAAO,WAAW,OAAO,OAAO,gBAAgB,KAAK,WAAW,OAAO,OAAO,gBAAgB,IACxF,OAAO,OAAO,IACd;EACV;EACA,KAAK;GACD,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,GAAG,OAAO,EAAE,IAAI,IAAI;GAC3F,IAAI,OAAO,UAAU,UAAU;IAC3B,MAAM,WAAW,OAAO,KAAK;IAE7B,IAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO,OAAO;GACxE;GACA;EACJ,KAAK;GACD,IAAI,OAAO,UAAU,UAAU;IAC3B,SAAS,KAAK;IACd,OAAO;GACX;GACA;EACJ,KAAK;GACD,IAAI,OAAO,UAAU,WAAW,OAAO;GACvC;EACJ,KAAK,QACD,IAAI,iBAAiB,YAAY,OAAO,MAAM,MAAM;CAE5D;CACA,MAAM,IAAI,aAAa,UAAU,OAAO,KAAK,YAAY,OAAO,MAAM;AAC1E;AAEA,SAAS,WAAW,QAA6B,OAA6B;CAC1E,IAAI,UAAU,MAAM,MAAM,IAAI,gBAAgB,eAAe,OAAO,KAAK,gBAAgB;CACzF,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,OAAO,KAAwB,IAAI,WAAW;CAC3F,IAAI,OAAO,UAAU,UAAU,MAAM,IAAI,aAAa,uBAAuB,OAAO,MAAM;CAC1F,OAAO,SAAS,KAAK;AACzB;AAEA,SAAS,UAAU,QAAqB,KAAyB;CAC7D,MAAM,SAAS,OAAO,OAAO,IAAI;CACjC,KAAK,MAAM,UAAU,OAAO,SAAS,OAAO,OAAO,QAAQ,YAAY,IAAI,OAAO,KAAK;CACvF,OAAO,WAAW,MAAM;AAC5B;AAEA,SAAS,YAAY,OAAmD;CAEpE,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS;CACrD,IAAI,iBAAiB,YAAY,OAAO,cAAc,KAAK;CAC3D,OAAO;AACX;AAEA,SAAS,UAAU,QAAqB,MAA2B;CAC/D,MAAM,SAAkB,WAAW,KAAK,KAAK;CAC7C,IAAI,CAAC,SAAS,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC,WAAW,OAAO,QAAQ,QACnE,MAAM,IAAI,mBAAmB,sBAAsB,OAAO,OAAO;CACrE,MAAM,MAAM,OAAO,OAAO,IAAI;CAC9B,IAAI;EACA,KAAK,MAAM,UAAU,OAAO,SAAS;GACjC,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,IAAI,GAAG,MAAM,IAAI,MAAM,oBAAoB;GAC7E,IAAI,QAAQ,OAAO,OAAO;GAC1B,IAAI,OAAO,SAAS,aAAa,OAAO,UAAU,UAAU;IACxD,IAAI,MAAM,SAAS,MAAM,CAAC,sBAAsB,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,wBAAwB;IACrG,QAAQ,OAAO,KAAK;GACxB,OAAO,IAAI,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU;IAC5D,IAAI,MAAM,SAAS,KAAK,CAAC,eAAe,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,qBAAqB;IAC1F,QAAQ,WAAW,KAAK,MAAM,MAAM,QAAQ,KAAK,CAAC,IAAI,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;GAC5F;GACA,IACI,UAAU,QACV,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,EAAE,iBAAiB,aAEnB,MAAM,IAAI,MAAM,sBAAsB;GAC1C,IAAI,OAAO,QAAQ,eAAe,QAAQ,KAAK;EACnD;EACA,MAAM,UAAU,cAAc,MAAM;EACpC,IAAI,WAAW,aAAa,WAAW,SAAS,IAAI,QAAQ,KAAK,GAAG,KAAK,GAAG,MAAM,GAC9E,MAAM,IAAI,MAAM,8CAA8C;CACtE,SAAS,OAAO;EACZ,MAAM,IAAI,mBACN,sBAAsB,OAAO,MAAM,IAAI,iBAAiB,QAAQ,MAAM,UAAU,iBACpF;CACJ;CACA,OAAO;EAAE,KAAK,KAAK;EAAK;CAAI;AAChC;AAEA,SAAS,cAAc,QAAqB,YAAkC,YAA8B;CACxG,IAAI,CAAC,YAAY;CACjB,IAAI,UAAU,YAAY;EACtB,cAAc,QAAQ,WAAW,MAAM,UAAU;EACjD,cAAc,QAAQ,WAAW,OAAO,UAAU;EAClD;CACJ;CACA,MAAM,SAAS,UAAU,QAAQ,WAAW,MAAM;CAClD,IAAI,WAAW,SAAS,cAAc;EAClC,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;EAC1D,IAAI,UAAU,MAAM;EACpB,IAAI,OAAO,SAAS,aAAa,OAAO,SAAS,QAAQ;GACrD,IAAI,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAI;GACxF,MAAM,IAAI,aAAa,kBAAkB,OAAO,KAAK,0BAA0B;EACnF;EACA,eAAe;GAAE,GAAG;GAAQ,UAAU;EAAK,GAAG,KAAK;CACvD;AACJ;AAEA,SAAS,cAAc,KAAa,YAA2B,YAA+B;CAC1F,IAAI,UAAU,YAAY;EACtB,MAAM,OAAO,cAAc,KAAK,WAAW,MAAM,UAAU;EAC3D,MAAM,QAAQ,cAAc,KAAK,WAAW,OAAO,UAAU;EAC7D,IAAI,WAAW,SAAS,OACpB,OAAO,SAAS,SAAS,UAAU,QAAQ,QAAQ,SAAS,QAAQ,UAAU,OAAO,OAAO;EAChG,OAAO,SAAS,QAAQ,UAAU,OAAO,OAAO,SAAS,QAAQ,UAAU,OAAO,OAAO;CAC7F;CACA,MAAM,OAAO,IAAI,WAAW;CAC5B,IAAI,WAAW,SAAS,UAAU,OAAO,WAAW,UAAU,SAAS,OAAO,SAAS;CACvF,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;CAC1D,IAAI,SAAS,QAAQ,UAAU,MAAM,OAAO;CAC5C,MAAM,WAAW,cAAc,MAAM,KAAK;CAC1C,QAAQ,WAAW,UAAnB;EACI,KAAK,KACD,OAAO,aAAa;EACxB,KAAK,MACD,OAAO,aAAa;EACxB,KAAK,KACD,OAAO,WAAW;EACtB,KAAK,MACD,OAAO,YAAY;EACvB,KAAK,KACD,OAAO,WAAW;EACtB,KAAK,MACD,OAAO,YAAY;CAC3B;AACJ;AAEA,SAAS,WACL,QACA,OACA,SACA,YACA,SACU;CACV,MAAM,cAAc,uBAAuB,KAAK;CAChD,MAAM,UAAU,cAAc,MAAM;CACpC,MAAM,aAAiF,CAAC;CACxF,IAAI,SAAS,WAAW,KAAK,EAAE,QAAQ,QAAQ,CAAC;CAChD,KAAK,MAAM,SAAS,SAEhB,IACI,MAAM,UAAU,OAAO,SACvB,CAAC,MAAM,YACP,MAAM,QAAQ,WAAW,KACzB,CAAC,MAAM,QAAQ,EAAE,CAAC,SAAS,GAAG,GAChC;EACE,MAAM,SAAS,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM,QAAQ,EAAE;EAC7E,IAAI,QAAQ,WAAW,KAAK;GAAE;GAAQ;EAAM,CAAC;CACjD;CAEJ,KAAK,MAAM,gBAAgB,CAAC,MAAM,KAAK,GACnC,KAAK,MAAM,aAAa,YAAY;EAChC,MAAM,WAAW,YAAY,QACxB,UACG,MAAM,WAAW,UAAU,OAAO,SACjC,eAAe,MAAM,aAAa,MAAM;GAAC;GAAK;GAAM;GAAK;EAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC/F;EACA,IAAI;EACJ,MAAM,QAAe,CAAC;EACtB,KAAK,MAAM,cAAc,UAAU;GAC/B,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;GAC1D,MAAM,UAAU,QAAQ,UAAU,QAAQ,OAAO,QAAQ,UAAU,KAAK,GAAG,YAAY;GACvF,IAAI,CAAC,SAAS;GACd,IAAI,cAAc;IACd,MAAM;IACN;GACJ;GACA,cAAc,OAAO,WAAW,UAAU,OAAO;EACrD;EACA,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ;EACxC,MAAM,SAAiC,UAAU,QAC3C,eACI,iBACA,gBACJ,eACE,uBACA;EACR,MAAM,UAAU,eAAe,QAAQ,UAAU,QAAQ,UAAU,OAAO,SAAS,GAAG;EACtF,IAAI,WAAW,QAAQ,EAAE,EAAE,cAAc,QAAQ,MAAM,UAAU;EACjE,OAAO;GACH,QAAQ;IACJ,OAAO,OAAO;IACd;IACA,QAAQ,UAAU,OAAO;IACzB,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,IAAI,CAAC;IACzD,MAAM,UAAU,SAAS;IACzB,QAAQ,OAAO,UAAU,QAAQ,SAAS,UAAU,MAAM,SAAS,cAAc,OAAO,eAAe,aAAa,QAAQ;GAChI;GACA;GACA;GACA,OAAO,CAAC,OAAO,WAAW,KAAK;EACnC;CACJ;CAEJ,IAAI,QAAQ,QACR,KAAK,MAAM,aAAa,YAAY;EAChC,IAAI,CAAC,eAAe,QAAQ,UAAU,QAAQ,UAAU,OAAO,OAAO,GAAG;EACzE,OAAO;GACH,QAAQ;IACJ,OAAO,OAAO;IACd,QAAQ,UAAU,QAAQ,gBAAgB;IAC1C,QAAQ,UAAU,OAAO;IACzB,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,IAAI,CAAC;IACzD,MAAM;IACN,QAAQ,OAAO,UAAU,QAAQ,SAAS,UAAU,MAAM,SAAS,cAAc;GACrF;GACA,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC,cAAc,OAAO;EACtD;CACJ;CAEJ,OAAO,EACH,QAAQ;EACJ,OAAO,OAAO;EACd,QAAQ;EACR,MAAM,QAAQ,SAAS,WAAW;EAClC,QAAQ;CACZ,EACJ;AACJ;AAEA,SAAS,eACL,QACA,QACA,OACA,QACA,KACO;CACP,IAAI,CAAC,OAAO,UAAW,OAAO,CAAC,OAAQ,OAAO;CAC9C,IAAI,OAAO,EAAE,CAAC,WAAW,OAAO,MAAM,OAAO;CAC7C,IAAI,CAAC,OAAO,OAAO,OAAO,WAAW;CAErC,IAAI,OAAO,SAAS,aAAa,CAAC,KAAK,OAAO;CAE9C,IAAI,OAAO,WAAW,GAAG,OAAO,OAAO,EAAE,CAAC,cAAc,SAAU,MAAM,UAAU,CAAC,OAAO;CAC1F,MAAM,UAAU,cAAc,MAAM;CACpC,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE,CAAC,WAAW,SAAS,QAAQ,OAAO,EAAE,CAAC,cAAc,OAAO,EAAE,CAAC;AAC1G;AAEA,SAAS,QACL,QACA,OACA,WACA,UACiB;CACjB,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,OAAO,SAAS,WAAW;EAC3B,IAAI,OAAO,UAAU,aAAa,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,IAAI,OAAO;EACrG,IAAI,aAAa,CAAC,UAAU,OAAO;EACnC,MAAM,aAAa,eAAe;GAAE,GAAG;GAAQ,UAAU;EAAK,GAAG,KAAK;EACtE,OAAO,YAAY,SAAS,YAAY,UAAU,CAAC,IAAI,WAAW,QAAQ,UAAU;CACxF;CACA,IACI,OAAO,SAAS,UAChB,OAAO,UAAU,aAChB,QAAQ,OAAO,OAAO,gBAAgB,KAAK,QAAQ,OAAO,OAAO,gBAAgB,IAElF,OAAO;CACX,MAAM,aAAa,eAAe;EAAE,GAAG;EAAQ,UAAU;CAAK,GAAG,KAAK;CACtE,OAAO,YAAY,SAAS,YAAY,UAAU,CAAC,IAAI,WAAW,QAAQ,UAAU;AACxF;AAEA,SAAS,uBAAuB,OAA2C;CACvE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,MAAM,SAAS,cAAc,OAAO,CAAC,KAAK;CAC9C,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,GAAG,uBAAuB,MAAM,IAAI,GAAG,GAAG,uBAAuB,MAAM,KAAK,CAAC;CAC/G,OAAO,CAAC;AACZ;AAEA,SAAS,cAAc,OAAc,UAAkC,KAAuB;CAC1F,IAAI,aAAa,OAAO,aAAa,MAAM;EACvC,MAAM,UAAU,MAAM,MAAM,MAAM;EAClC,MAAM,WAAW,UAAU,aAAa,KAAK,OAAO,IAAI;EACxD,IAAI,WAAW,KAAM,aAAa,KAAK,aAAa,KAAM;GACtD,OAAO,MAAM;GACb,OAAO,MAAM;GACb,IAAI,aAAa,KAAK,MAAM,KAAK;QAC5B,MAAM,MAAM;EACrB;CACJ,OAAO,IAAI,aAAa,OAAO,aAAa,MAAM;EAC9C,MAAM,UAAU,MAAM,MAAM,MAAM;EAClC,MAAM,WAAW,UAAU,aAAa,KAAK,OAAO,IAAI;EACxD,IAAI,WAAW,KAAM,aAAa,KAAK,aAAa,KAAM;GACtD,OAAO,MAAM;GACb,OAAO,MAAM;GACb,IAAI,aAAa,KAAK,MAAM,KAAK;QAC5B,MAAM,MAAM;EACrB;CACJ;AACJ;AAEA,SAAS,WAAW,OAAuB;CACvC,MAAM,QAAQ,MAAM,MAAM,MAAM;CAChC,MAAM,QAAQ,MAAM,MAAM,MAAM;CAChC,IAAI,CAAC,SAAS,CAAC,OAAO,OAAO;CAC7B,MAAM,WAAW,aAAa,OAAO,KAAK;CAC1C,OAAO,WAAW,KAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAK,QAAQ,MAAM,EAAE;AACpF;AAEA,eAAe,SACX,IACA,QACA,MACA,OACA,YACA,YACoB;CACpB,IAAI,KAAK,OAAO,OAAO,CAAC;CACxB,MAAM,OAAoB,CAAC;CAC3B,MAAM,UAAU,SAA4B;EACxC,IAAI,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,OAAO,gBAAgB,IAAI,OAAO;EACxE,MAAM,MAAM,UAAU,QAAQ,IAAI;EAClC,IAAI,CAAC,SAAS,cAAc,IAAI,KAAK,OAAO,UAAU,MAAM,MAAM,KAAK,KAAK,GAAG;EAC/E,OAAO,eAAe,KAAA,KAAa,KAAK,UAAU;CACtD;CACA,IAAI,KAAK,OAAO,OAAO;EACnB,MAAM,QAAQ,KAAK,MAAM;GAAE,GAAG,KAAK;GAAO,KAAK,KAAK;GAAK,KAAK,KAAK;EAAI,IAAI,KAAK;EAChF,WAAW,MAAM,CAAC,KAAK,UAAU,GAAG,YAAY,OAAO,OAAO,KAAK,OAAO,OAAO,OAAO,EACpF,SAAS,KAAK,IAAI,KAAK,cAAc,GAAG,EAC5C,CAAC,GACG,IAAI,OAAO;GAAE;GAAK;EAAM,CAAC,GAAG;CAEpC,OAAO,IAAI,KAAK,KAAK;EACjB,MAAM,QAAQ,MAAM,GAAG,IAAI,OAAO,OAAO,KAAK,GAAG;EACjD,IAAI,OAAO,OAAO;GAAE,KAAK,KAAK;GAAK;EAAM,CAAC;CAC9C,OAAO,IAAI,OAAO,GAAG,aAAa,cAAc,OAAO,GAAG,oBAAoB,YAAY;EACtF,IAAI;EACJ,IAAI;GACA,SAAS;IACL,MAAM,OAAO,MAAM,GAAG,SAAS,OAAO,OAAO,KAAK,OAAO;KACrD;KACA,SAAS,KAAK,IAAI,KAAK,eAAe,KAAA,IAAY,MAAM,aAAa,KAAK,MAAM;IACpF,CAAC;IACD,SAAS,KAAK;IACd,KAAK,MAAM,QAAQ,KAAK,MACpB,IAAI,OAAO,IAAI,GAAG,OAAO;IAE7B,IAAI,KAAK,MAAM;GACnB;EACJ,UAAU;GACN,IAAI,WAAW,KAAA,GAAW,MAAM,GAAG,gBAAgB,MAAM;EAC7D;CACJ,OAEI,KAAK,MAAM,QAAQ,MAAM,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,GACrD,IAAI,OAAO,IAAI,GAAG;CAG1B,OAAO;AACX;AAEA,SAAS,YAAY,MAAiB,OAAkB,QAA8B;CAClF,KAAK,MAAM,SAAS,QAAQ;EACxB,MAAM,WAAW,cAAc,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI,MAAM,OAAO;EAC9E,IAAI,UAAU,OAAO,MAAM,cAAc,SAAS,CAAC,WAAW;CAClE;CACA,OAAO,aAAa,KAAK,KAAK,MAAM,GAAG;AAC3C;AAEA,SAAS,cAAc,MAAgB,OAAyB;CAC5D,IAAI,SAAS,MAAM,OAAO,UAAU,OAAO,IAAI;CAC/C,IAAI,UAAU,MAAM,OAAO;CAC3B,KACK,OAAO,SAAS,YAAY,OAAO,SAAS,cAC5C,OAAO,UAAU,YAAY,OAAO,UAAU,WAE/C,OAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;CAClD,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU,OAAO,aAAa,SAAS,IAAI,GAAG,SAAS,KAAK,CAAC;CAC9G,IAAI,OAAO,SAAS,aAAa,OAAO,UAAU,WAAW,OAAO,OAAO,IAAI,IAAI,OAAO,KAAK;CAC/F,IAAI,gBAAgB,cAAc,iBAAiB,YAAY,OAAO,aAAa,MAAM,KAAK;CAC9F,MAAM,IAAI,aAAa,4CAA4C;AACvE;AAEA,SAAS,aAAa,YAAuC,YAAwB,QAA+B;CAChH,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,QAAQ,gBAAgB,YAAY,UAAU;CACpD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,IAAI,aAAa,GAAG,OAAO,sCAAsC;CAC3E,OAAO;AACX;AAEA,SAAS,WAAW,KAAa,SAA2B;CACxD,MAAM,SAAiB,CAAC;CACxB,KAAK,MAAM,UAAU,SACjB,OAAO,eAAe,QAAQ,QAAQ;EAClC,OAAO,IAAI,mBAAmB,aAAa,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;EACrE,YAAY;EACZ,cAAc;EACd,UAAU;CACd,CAAC;CACL,OAAO;AACX;AAEA,SAAS,mBAAmB,QAAqB,SAAgC;CAC7E,IAAI,CAAC,SAAS;CACd,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,QAAQ,SAAS;EACxB,UAAU,QAAQ,IAAI;EACtB,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,eAAe,qBAAqB,MAAM;EACxE,KAAK,IAAI,IAAI;CACjB;AACJ;AAEA,SAAS,UAAU,QAAqB,MAAmC;CACvE,MAAM,SAAS,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,IAAI;CACjE,IAAI,CAAC,QAAQ,MAAM,IAAI,eAAe,mBAAmB,MAAM;CAC/D,OAAO;AACX;AAEA,SAAS,cAAc,QAAsD;CACzE,OAAO,OAAO,QAAQ,MAAM,WAAW,OAAO,UAAU;AAC5D;AACA,SAAS,UAAU,OAA2B;CAC1C,OAAO,WAAW,SAAS,OAAO;AACtC;AACA,SAAS,gBAAgB,OAAqB;CAC1C,IAAI,UAAU,WAAW,MAAM,WAAW,cAAc,GACpD,MAAM,IAAI,eAAe,4BAA4B,OAAO;AACpE;AACA,SAAS,eAAe,WAAkC;CACtD,OAAO,UAAU,SAAS,YAAY,UAAU,SAAS,YAAY,UAAU,SAAS;AAC5F;AACA,SAAS,SAAS,OAAkD;CAChE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC9E;AACA,SAAS,WAAW,OAA4B;CAC5C,IAAI;EACA,OAAO,WAAoB,KAAK;CACpC,QAAQ;EACJ,MAAM,IAAI,mBAAmB,uBAAuB;CACxD;AACJ;AACA,SAAS,cAAc,OAA2B;CAC9C,OAAO,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAClF;AACA,SAAS,aAAa,MAAkB,OAA2B;CAC/D,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM,GAAG,SAAS,GACtE,IAAI,KAAK,WAAW,MAAM,QAAQ,OAAO,KAAK,SAAS,MAAM;CACjE,OAAO,KAAK,SAAS,MAAM;AAC/B;;;ACpwBA,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAExB,eAAe,UAAa,IAAkC;CAC1D,IAAI;EACA,OAAO,MAAM,GAAG;CACpB,SAAS,OAAO;EACZ,MAAM,eAAe,KAAK;CAC9B;AACJ;AAEA,IAAM,kBAAN,MAA6C;CACzC;CACA;CACA;CACA,UAAU;CACV,+BAAe,IAAI,IAAgB;CACnC;CACA,YAAY,OAAsB,MAAc,MAAc,SAAqB;EAC/E,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,KAAK,OAAO;EACZ,KAAK,WAAW;CACpB;CACA,MAAM,cAAmC;EACrC,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,KAAK,CAAC;CACnE;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;CACxE;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,IAAI,CAAC;CAC7E;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;CACxE;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,UAAsB,CAAC,GAAkB;EAClG,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,oBAAoB,OAAO,CAAC,CAAC;CAC7G;CACA,MAAM,QAAQ,OAAe,SAA0C,UAAsB,CAAC,GAAkB;EAC5G,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,SAAS,oBAAoB,OAAO,CAAC,CAAC;CAC9G;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,GAAG,CAAC;CAC3E;CACA,MAAM,WAAW,OAAe,MAAwC;EACpE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,IAAI,CAAC;CAChF;CACA,MAAM,WAAW,OAAe,KAAoC;EAChE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,GAAG,CAAC;CAC/E;CACA,MAAM,KAAK,OAAe,QAAe,CAAC,GAAwB;EAC9D,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC;CAC3E;CACA,MAAM,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EAC/F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,aAAa,yBAAyB,OAAO;EACnD,IAAI,WAAW,WAAW,KAAA,KAAa,CAAC,KAAK,aAAa,IAAI,WAAW,MAAM,GAC3E,MAAM,IAAI,UAAU,iDAAiD;EAEzE,MAAM,OAAO,MAAM,gBACf,KAAK,OAAO,MAAM,SAAS;GACvB,MAAM,KAAK;GACX;GACA;GACA,UAAU,WAAW;GACrB,SAAS,WAAW;GACpB,UAAU,WAAW;EACzB,CAAC,CACL;EACA,KAAK,YAAY;EACjB,IAAI,WAAW,WAAW,KAAA,GAAW,KAAK,aAAa,OAAO,WAAW,MAAM;EAC/E,IAAI,KAAK,aAAa,KAAA,KAAa,CAAC,KAAK,SAAS,KAAK,aAAa,IAAI,KAAK,QAAQ;EACrF,OAAO,eAAe,IAAI;CAC9B;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,iBAAiB,MAAM,OAAO,OAAO,OAAO;CACvD;CACA,MAAM,gBAAgB,QAAmC;EACrD,oBAAoB,MAAM;EAC1B,IAAI,CAAC,KAAK,aAAa,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;EAClE,MAAM,gBAAgB,KAAK,OAAO,MAAM,YAAY,MAAM,CAAC;CAC/D;CACA,MAAM,WAAW,OAAe,WAAmB,KAA6C;EAC5F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,WAAW,GAAG,CAAC;CAC1F;CACA,OAAO,YACH,OACA,WACA,QAAe,CAAC,GAChB,UAA4B,CAAC,GACU;EACvC,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,EAAE,SAAS,UAAU,aAAa,yBAAyB,OAAO;EACxE,IAAI,YAAY,MAAM,SAAS,OAAO;EACtC,IAAI,SAA4B;EAChC,OAAO,YAAY,GAAG;GAClB,KAAK,YAAY;GACjB,MAAM,YAAY,KAAK,IAAI,WAAW,UAAU,oBAAoB;GACpE,MAAM,cAAiC;GACvC,MAAM,OAAsB,MAAM,gBAC9B,KAAK,OAAO,MAAM,gBAAgB,KAAK,OAAO,OAAO,WAAW,OAAO,aAAa,WAAW,QAAQ,CAC3G;GACA,KAAK,MAAM,OAAO,KAAK,MACnB,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK;GAE7B,aAAa,KAAK,KAAK;GACvB,IAAI,KAAK,WAAW,MAChB;GAEJ,SAAS,KAAK;EAClB;CACJ;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,YAAY,KAAK,OAAO,MAAM,4BAA4B,OAAO,CAAC,CAAC;CAChH;CACA,MAAM,UAAU,MAA6B;EACzC,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;CACxE;CACA,MAAM,WAAW,MAA6B;EAC1C,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,IAAI,CAAC;CACzE;CACA,MAAM,SAAwB;EAC1B,KAAK,YAAY;EACjB,IAAI;GACA,MAAM,gBAAgB,KAAK,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC;EAC9D,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,MAAM,WAA0B;EAC5B,KAAK,YAAY;EACjB,IAAI;GACA,MAAM,gBAAgB,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,CAAC;EAChE,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,MAAM,iBAAgC;EAClC,IAAI,KAAK,SACL;EAEJ,IAAI,KAAK,OAAO,aAAa;GACzB,KAAK,YAAY;GACjB;EACJ;EACA,IAAI;GACA,MAAM,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK;EAC/C,SAAS,OAAO;GACZ,MAAM,aAAa,eAAe,KAAK;GACvC,IAAI,EAAE,sBAAsB,yBACxB,MAAM;EAEd,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,aAAmB;EACf,KAAK,YAAY;CACrB;CACA,aAAqB;EACjB,OAAO,KAAK;CAChB;CACA,cAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,aAC5B,MAAM,IAAI,uBAAuB;CAEzC;CACA,cAAc;EACV,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,aAAa,MAAM;EACxB,KAAK,SAAS;CAClB;AACJ;AACA,IAAM,SAAN,MAA2B;CACvB;CACA,UAAU;CACV,gBAAsC;CACtC,gCAAgB,IAAI,IAAqB;CACzC,iCAAiB,IAAI,IAA8B;CACnD,+BAAe,IAAI,IAAgB;CACnC,oCAAoB,IAAI,IAA6B;CACrD,yBAAyB;CACzB;CACA,4BAAiD;CACjD,gCAAqD;CACrD,YAAY,OAAsB;EAC9B,KAAK,SAAS;EACd,KAAK,iBAAiB,IAAI,gBAAgB,MAAM,QAAQ,MAAM,WAAW;EACzE,KAAK,4BAA4B,iCAAiC,aAAa;GAC3E,KAAK,wBAAwB;EACjC,CAAC;EACD,KAAK,gCAAgC,2BAA2B,aAAa;GACzE,KAAK,iBAAiB;EAC1B,CAAC;CACL;CACA,MAAM,MAAM,OAAe,YAAkC;EACzD,OAAO,KAAK,WAAW,IAAI;CAC/B;CACA,MAAM,mBACF,YACA,YACA,SACA,eACa;EACb,KAAK,YAAY;EACjB,MAAM,KAAK,MAAM,KAAK,WAAW,WAAW;EAC5C,MAAM,UAAU,IAAI,wBAAwB;EAC5C,MAAM,uBAAuB,IAAI,yBAAyB,IAAI,OAAO;EACrE,MAAM,cAAc,IAAI,gBAAgB,MAAM,sBAAsB,OAAO;EAC3E,IAAI;GACA,MAAM,KAAK,OAAO,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa;GACvE,MAAM,QAAQ;IACV,IAAI;IACJ;IACA;IACA,aAAa;GACjB,CAAC;GACD,MAAM,KAAK,OAAO,MAAM,iBAAiB,GAAG,WAAW,GAAG,UAAU;GACpE,MAAM,GAAG,OAAO;EACpB,SAAS,OAAO;GACZ,IAAI;IACA,MAAM,GAAG,eAAe;GAC5B,QAAQ,CAAC;GACT,MAAM;EACV;CACJ;CACA,MAAM,aAAgC;EAClC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,WAAW,CAAC;CAC1D;CACA,MAAM,cAAmC;EACrC,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,CAAC;CACzD;CACA,MAAM,aAA8B;EAChC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,WAAW,CAAC;CAC1D;CACA,MAAM,aAAa,MAAY,UAA6B,CAAC,GAAwB;EACjF,OAAO,KAAK,YACR,KAAK,OAAO,MAAM,aAAa,cAAc,IAAI,GAAG,2BAA2B,OAAO,CAAC,CAC3F;CACJ;CACA,MAAM,WAAW,MAAwC;EACrD,KAAK,YAAY;EACjB,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,UAAU,YAAY;GAClC,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,MAAM,IAAI;GAC/C,MAAM,KAAK,IAAI,gBAAgB,KAAK,QAAQ,MAAM,YAAY;IAC1D,KAAK,cAAc,OAAO,EAAE;GAChC,CAAC;GACD,KAAK,cAAc,IAAI,EAAE;GACzB,IAAI,KAAK,WAAW,KAAK,OAAO,aAAa;IACzC,IAAI,KAAK,OAAO,aACZ,GAAG,WAAW;IAElB,MAAM,IAAI,oBAAoB;GAClC;GACA,IAAI,eAAe,KAAK,wBAAwB;IAC5C,MAAM,GAAG,eAAe;IACxB,MAAM,IAAI,uBAAuB;GACrC;GACA,OAAO;EACX,CAAC;EACD,KAAK,eAAe,IAAI,OAAO;EAC/B,IAAI;GACA,OAAO,MAAM;EACjB,UAAU;GACN,KAAK,eAAe,OAAO,OAAO;EACtC;CACJ;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,eAAe,CAAC,MAAM,4BAA4B,OAAO,CAAC,CAAC;CACnG;CACA,MAAM,UAAU,MAA6B;EACzC,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,aAAa,CAAC,IAAI,CAAC;CAC3D;CACA,MAAM,WAAW,MAA6B;EAC1C,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,cAAc,CAAC,IAAI,CAAC;CAC5D;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,OAAO,CAAC,OAAO,GAAG,CAAC;CAC3D;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,WAAW,CAAC,OAAO,IAAI,CAAC;CAChE;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,OAAO,CAAC,OAAO,GAAG,CAAC;CAC3D;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,UAAsB,CAAC,GAAkB;EAClG,sBAAsB,KAAK;EAC3B,MAAM,KAAK,YAAY,aAAa,OAAO;GAAC;GAAO;GAAK;GAAO,oBAAoB,OAAO;EAAC,CAAC;CAChG;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,aAAa,UAAU,CAAC,OAAO,GAAG,CAAC;CAC/D;CACA,MAAM,KAAK,OAAe,QAAe,CAAC,GAAwB;EAC9D,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,QAAQ,CAAC,OAAO,KAAK,CAAC;CAC9D;CACA,MAAM,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EAC/F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,aAAa,yBAAyB,OAAO;EACnD,IAAI,WAAW,WAAW,KAAA,KAAa,CAAC,KAAK,aAAa,IAAI,WAAW,MAAM,GAC3E,MAAM,IAAI,UAAU,qDAAqD;EAE7E,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,gBACZ,KAAK,OAAO,MAAM,SAAS;GACvB;GACA;GACA,UAAU,WAAW;GACrB,SAAS,WAAW;GACpB,UAAU,WAAW;EACzB,CAAC,CACL;EACA,KAAK,kBAAkB,IAAI,OAAO;EAClC,IAAI;GACA,MAAM,OAAO,MAAM;GACnB,IAAI,WAAW,WAAW,KAAA,GAAW,KAAK,aAAa,OAAO,WAAW,MAAM;GAC/E,IAAI,KAAK,aAAa,KAAA,GAAW,KAAK,aAAa,IAAI,KAAK,QAAQ;GACpE,KAAK,YAAY;GACjB,IAAI,eAAe,KAAK,wBAAwB;IAC5C,IAAI,KAAK,aAAa,KAAA,GAAW,MAAM,KAAK,gBAAgB,KAAK,QAAQ;IACzE,MAAM,IAAI,uBAAuB;GACrC;GACA,OAAO,eAAe,IAAI;EAC9B,UAAU;GACN,KAAK,kBAAkB,OAAO,OAAO;EACzC;CACJ;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,iBAAiB,MAAM,OAAO,OAAO,OAAO;CACvD;CACA,MAAM,gBAAgB,QAAmC;EACrD,oBAAoB,MAAM;EAC1B,IAAI,CAAC,KAAK,aAAa,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;EAClE,MAAM,gBAAgB,KAAK,OAAO,MAAM,YAAY,MAAM,CAAC;CAC/D;;CAEA,MAAM,YACF,MACA,SACA,MAC+B;EAC/B,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,MAAM,SAAS,IAAI,CAAC;CAC5E;CACA,MAAM,eAAe,UAAiC,CAAC,GAAwB;EAC3E,OAAO,KAAK,MAAM,YAAY;GAC1B,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,eAAe,+BAA+B,OAAO,CAAC;GAC5F,OAAO,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK;EACrE,CAAC;CACL;CACA,MAAM,eAAe,MAAiC;EAClD,OAAO,KAAK,+BAA+B;GACvC,MAAM,QAAQ,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI;GACrE,OAAO,KAAK,OAAO,MAAM,eAAe,KAAK;EACjD,CAAC;CACL;CACA,MAAM,QAAuB;EACzB,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,MAAM,CAAC;CACxE;CACA,MAAM,UAAqC;EACvC,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,QAAQ,CAAC;CAC1E;CACA,MAAM,UAAqC;EACvC,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,QAAQ,CAAC;CAC1E;CACA,MAAM,QAAQ;EACV,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,MAAM,CAAC;CACrD;CACA,MAAM,cAAoC;EACtC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,YAAY,CAAC;CAC3D;CACA,MAAM,qBAAuC;EACzC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,mBAAmB,CAAC;CAClE;CACA,MAAM,UAAyB;EAC3B,OAAO,KAAK,YAAY,KAAK,OAAO,UAAU,KAAK,gBAAgB,KAAK,MAAM,CAAC;CACnF;CACA,MAAM,aAAa,WAA0C;EACzD,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,aAAa,SAAS,CAAC;CACrE;CAIA,UACI,MACA,MACA,MACW;EACX,KAAK,YAAY;EACjB,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,eAAe,UAAU,IAAI;EAE7C,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,eAAe,UAAU,MAAM,IAAI;EAEnD,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO,KAAK,eAAe,UAAU,MAAM,MAAM,IAAI;EAEzD,MAAM,IAAI,UACN,iGACJ;CACJ;CAIA,MACI,MACA,MACA,MACW;EACX,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,IAAI;EAE9B,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,MAAM,IAAI;EAEpC,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO,KAAK,UAAU,MAAM,MAAM,IAAI;EAE1C,MAAM,IAAI,UACN,6FACJ;CACJ;CACA,QAAuB;EACnB,IAAI,KAAK,kBAAkB,MACvB,OAAO,KAAK;EAEhB,IAAI,KAAK,SACL,OAAO,QAAQ,QAAQ;EAE3B,KAAK,UAAU;EACf,KAAK,8BAA8B;EACnC,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,KAAK,aAAa;EACvC,OAAO,KAAK;CAChB;CACA,MAAM,eAA8B;EAChC,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,cAAc,CAAC;EACxD,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,iBAAiB,CAAC;EAC3D,IAAI,gBAA8B;EAClC,MAAM,gBAAgB,MAAM,QAAQ,WAChC,MAAM,KAAK,KAAK,eAAe,WAAW,KAAK,gBAAgB,MAAM,CAAC,CAC1E;EACA,KAAK,MAAM,UAAU,eACjB,IAAI,OAAO,WAAW,cAAc,kBAAkB,MAAM,gBAAgB,eAAe,OAAO,MAAM;EAE5G,MAAM,MAAM,MAAM,KAAK,KAAK,aAAa;EACzC,IAAI,IAAI,SAAS,GAAG;GAChB,MAAM,UAAU,MAAM,QAAQ,WAAW,IAAI,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC;GAC7E,KAAK,MAAM,UAAU,SACjB,IAAI,OAAO,WAAW,cAAc,kBAAkB,MAClD,gBAAgB,eAAe,OAAO,MAAM;EAGxD;EACA,IAAI;GACA,OAAO,KAAK,OAAO,UAAU,KAAK,gBAAgB,KAAK,MAAM;EACjE,SAAS,OAAO;GACZ,MAAM,eAAe,KAAK;EAC9B;EACA,IAAI,eACA,MAAM;CAEd;CACA,gCAAgC;EAC5B,KAAK,4BAA4B;EACjC,KAAK,4BAA4B;EACjC,KAAK,gCAAgC;EACrC,KAAK,gCAAgC;CACzC;CACA,0BAA0B;EACtB,KAAK,0BAA0B;EAC/B,KAAK,aAAa,MAAM;EACxB,KAAK,MAAM,MAAM,MAAM,KAAK,KAAK,aAAa,GAC1C,GAAG,WAAW;CAEtB;CACA,mBAAmB;EACf,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,8BAA8B;EACnC,KAAK,wBAAwB;EAC7B,KAAK,eAAe,MAAM;CAC9B;CACA,MAAS,KAAmC;EACxC,KAAK,YAAY;EACjB,OAAO,UAAU,GAAG;CACxB;CACA,yBAA4B,KAAmC;EAC3D,KAAK,YAAY;EACjB,uBAAuB,KAAK,MAAM;EAClC,OAAO,UAAU,GAAG;CACxB;CACA,cAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,aAC5B,MAAM,IAAI,oBAAoB;CAEtC;AACJ;AACA,IAAM,0BAAN,MAA8B;CAC1B,2BAAW,IAAI,IAAY;CAC3B,2BAAW,IAAI,IAAY;CAC3B,aAAa,MAAoB;EAC7B,KAAK,SAAS,OAAO,IAAI;EACzB,KAAK,SAAS,IAAI,IAAI;CAC1B;CACA,WAAW,MAAoB;EAC3B,IAAI,KAAK,SAAS,OAAO,IAAI,GACzB;EAEJ,KAAK,SAAS,IAAI,IAAI;CAC1B;CACA,MAAM,QAA4B;EAC9B,MAAM,UAAU,IAAI,IAAI,MAAM;EAC9B,KAAK,MAAM,QAAQ,KAAK,UACpB,QAAQ,IAAI,IAAI;EAEpB,KAAK,MAAM,QAAQ,KAAK,UACpB,QAAQ,OAAO,IAAI;EAEvB,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,KAAK,wBAAwB;CAC5D;AACJ;AACA,IAAM,2BAAN,MAAsD;CAClD;CACA;CACA,YAAY,OAAwB,SAAkC;EAClE,KAAK,SAAS;EACd,KAAK,WAAW;CACpB;CACA,IAAI,OAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,MAAM,cAAmC;EACrC,OAAO,KAAK,OAAO,YAAY;CACnC;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG;CACrC;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI;CAC1C;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG;CACrC;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,UAAsB,CAAC,GAAkB;EAClG,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,OAAO;CACpD;CACA,MAAM,QAAQ,OAAe,SAA0C,UAAsB,CAAC,GAAkB;EAC5G,MAAM,KAAK,OAAO,QAAQ,OAAO,SAAS,OAAO;CACrD;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,OAAO,KAAK,OAAO,OAAO,OAAO,GAAG;CACxC;CACA,MAAM,WAAW,OAAe,MAAwC;EACpE,MAAM,KAAK,OAAO,WAAW,OAAO,IAAI;CAC5C;CACA,MAAM,WAAW,OAAe,KAAoC;EAChE,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG;CAC3C;CACA,MAAM,KAAK,OAAe,QAAe,CAAC,GAAwB;EAC9D,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK;CACxC;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EACzF,OAAO,KAAK,OAAO,SAAS,OAAO,OAAO,OAAO;CACrD;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,KAAK,OAAO,SAAS,OAAO,OAAO,OAAO;CACrD;CACA,gBAAgB,QAAmC;EAC/C,OAAO,KAAK,OAAO,gBAAgB,MAAM;CAC7C;CACA,MAAM,WAAW,OAAe,WAAmB,KAA6C;EAC5F,OAAO,KAAK,OAAO,WAAW,OAAO,WAAW,GAAG;CACvD;CACA,YACI,OACA,WACA,QAAe,CAAC,GAChB,UAA4B,CAAC,GACU;EACvC,OAAO,KAAK,OAAO,YAAY,OAAO,WAAW,OAAO,OAAO;CACnE;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,MAAM,KAAK,OAAO,YAAY,MAAM,OAAO;EAC3C,KAAK,SAAS,aAAa,IAAI;CACnC;CACA,MAAM,UAAU,MAA6B;EACzC,MAAM,KAAK,OAAO,UAAU,IAAI;EAChC,KAAK,SAAS,WAAW,IAAI;CACjC;CACA,MAAM,WAAW,MAA6B;EAC1C,MAAM,KAAK,OAAO,WAAW,IAAI;CACrC;CACA,SAAwB;EACpB,OAAO,QAAQ,OAAO,2BAA2B,oBAAoB,CAAC;CAC1E;CACA,WAA0B;EACtB,OAAO,QAAQ,OAAO,2BAA2B,sBAAsB,CAAC;CAC5E;AACJ;AACA,IAAM,kBAAN,MAAoC;CAChC;CACA;CACA;CACA,YAAY,IAAY,aAAuC,SAAkC;EAC7F,KAAK,MAAM;EACX,KAAK,eAAe;EACpB,KAAK,WAAW;CACpB;CACA,MAAM,QAAgB,YAAkC;EACpD,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,MAAM,KAAK,aAAa,YAAY,MAAM,OAAO;CACrD;CACA,MAAM,UAAU,MAA6B;EACzC,MAAM,KAAK,aAAa,UAAU,IAAI;CAC1C;CACA,MAAM,WAAW,MAA6B;EAC1C,MAAM,KAAK,aAAa,WAAW,IAAI;CAC3C;CACA,MAAM,aAAgC;EAClC,OAAO,KAAK,SAAS,MAAM,MAAM,KAAK,IAAI,WAAW,CAAC;CAC1D;CACA,MAAM,cAAmC;EACrC,OAAO,KAAK,aAAa,YAAY;CACzC;CACA,MAAM,aAA8B;EAChC,OAAO,KAAK,IAAI,WAAW;CAC/B;CACA,aAAa,OAAa,WAA8B,CAAC,GAAwB;EAC7E,OAAO,QAAQ,OAAO,2BAA2B,iBAAiB,CAAC;CACvE;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,OAAO,KAAK,aAAa,IAAI,OAAO,GAAG;CAC3C;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,OAAO,KAAK,aAAa,QAAQ,OAAO,IAAI;CAChD;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,OAAO,KAAK,aAAa,IAAI,OAAO,GAAG;CAC3C;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,UAAsB,CAAC,GAAkB;EAClG,MAAM,KAAK,aAAa,IAAI,OAAO,KAAK,OAAO,OAAO;CAC1D;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,OAAO,KAAK,aAAa,OAAO,OAAO,GAAG;CAC9C;CACA,MAAM,KAAK,OAAe,QAAe,CAAC,GAAwB;EAC9D,OAAO,KAAK,aAAa,KAAK,OAAO,KAAK;CAC9C;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EACzF,OAAO,KAAK,aAAa,SAAS,OAAO,OAAO,OAAO;CAC3D;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,KAAK,aAAa,SAAS,OAAO,OAAO,OAAO;CAC3D;CACA,gBAAgB,QAAmC;EAC/C,OAAO,KAAK,aAAa,gBAAgB,MAAM;CACnD;CACA,eAAe,WAAkC,CAAC,GAAwB;EACtE,OAAO,QAAQ,OAAO,2BAA2B,mBAAmB,CAAC;CACzE;CACA,eAAe,OAAkC;EAC7C,OAAO,QAAQ,OAAO,2BAA2B,mBAAmB,CAAC;CACzE;CACA,QAAuB;EACnB,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,UAAqC;EACjC,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,UAAqC;EACjC,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,MAAM,QAAQ;EACV,OAAO,KAAK,IAAI,MAAM;CAC1B;CACA,MAAM,cAAoC;EACtC,OAAO,KAAK,IAAI,YAAY;CAChC;CACA,MAAM,qBAAuC;EACzC,OAAO,KAAK,IAAI,mBAAmB;CACvC;CACA,QAAuB;EACnB,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,UAAyB;EACrB,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,aAAa,YAA2C;EACpD,OAAO,QAAQ,OAAO,2BAA2B,iBAAiB,CAAC;CACvE;CAIA,UACI,OACA,OACA,OACW;EACX,MAAM,2BAA2B,cAAc;CACnD;CAIA,MACI,OACA,OACA,OACW;EACX,MAAM,2BAA2B,UAAU;CAC/C;AACJ;AACA,SAAS,2BAA2B,QAAuB;CACvD,MAAM,wBAAQ,IAAI,MACd,GAAG,OAAO,wHACd;CACA,MAAM,OAAO;CACb,OAAO;AACX;AACA,SAAS,eAAe,MAAgC;CACpD,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAU,MAAM,KAAK;EAAM,OAAO,KAAK;CAAM;AACxF;AACA,SAAS,oBAAoB,OAA4B;CACrD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GACtE,MAAM,IAAI,UAAU,6CAA6C;CAErE,OAAO;AACX;AACA,SAAS,yBACL,SAC2E;CAC3E,MAAM,QAAQ,uBAAwC,SAAS,qCAAqC;CACpG,MAAM,UAAU,MAAM,WAAW;CACjC,MAAM,WAAW,MAAM,YAAY;CACnC,IAAI,CAAC,OAAO,cAAc,OAAO,KAAK,WAAW,KAAK,UAAU,YAC5D,MAAM,IAAI,UAAU,qDAAqD;CAE7E,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,KAAK,WAAW,YAC9D,MAAM,IAAI,UAAU,2DAA2D;CAEnF,OAAO;EAAE;EAAS;EAAU,QAAQ,MAAM,WAAW,KAAA,IAAY,KAAA,IAAY,oBAAoB,MAAM,MAAM;CAAE;AACnH;AACA,gBAAgB,iBACZ,QACA,OACA,OACA,SACuB;CACvB,MAAM,SAAS,EAAE,GAAG,MAAM;CAC1B,KAAK,MAAM,SAAS;EAAC;EAAM;EAAO;EAAM;CAAK,GAAY;EACrD,MAAM,QAAQ,OAAO;EACrB,IAAI,iBAAiB,YAAY,OAAO,SAAS,MAAM,MAAM;CACjE;CACA,MAAM,cAAc,yBAAyB,OAAO;CACpD,IAAI;CACJ,IAAI;EACA,SAAS;GACL,MAAM,OAAO,MAAM,OAAO,SAAS,OAAO,QAAQ;IAAE,GAAG;IAAa;GAAO,CAAC;GAC5E,SAAS,KAAK;GACd,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM;GACnC,IAAI,KAAK,MAAM;EACnB;CACJ,UAAU;EACN,IAAI,WAAW,KAAA,GAAW,MAAM,OAAO,gBAAgB,MAAM;CACjE;AACJ;AACA,SAAS,sBAAsB,OAAgB,QAAkE;CAC7G,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAC9C,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,mBAAmB,KAAK,KAAK,GAC7B,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,SAAS,KACzC,MAAM,IAAI,UAAU,GAAG,OAAO,sDAAsD;CAExF,OAAO;AACX;AAGA,IAAM,aAA2B,YAAY,IAAI,UAAU,OAAO;AAClE,IAAM,2BAAyC,YAAY,IAAI,wBAAwB,OAAO;AAE9F,SAAS,uBAA0B,SAAkB,SAAiB,cAA4B,WAAc;CAC5G,IAAI,YAAY,KAAA,GACZ,OAAO,CAAC;CAEZ,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,YAAY,OAAO;CAE7B,OAAO;AACX;AAEA,SAAS,gCACL,OACA,SACA,cAA4B,WACtB;CACN,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,YAAY,OAAO;CAE7B,OAAO;AACX;AAEA,SAAS,wCACL,OACA,SACA,aACkB;CAClB,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,gCAAgC,OAAO,SAAS,WAAW;AACxG;AAEA,SAAS,0BAA0B,SAA+B;CAC9D,OAAO,uBAAuB,SAAS,kCAAkC,uBAAuB;AACpG;AACA,SAAS,uBAAuB,OAAoC;CAChE,OAAO,wCACH,OACA,+CACA,uBACJ;AACJ;AACA,SAAS,oBAAoB,SAA8B;CACvD,MAAM,EAAE,QAAQ,uBAEb,SAAS,+BAA+B;CAC3C,MAAM,gBAAgB,wCAAwC,KAAK,yCAAyC;CAC5G,OAAO,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,cAAc;AACnE;AACA,SAAS,4BACL,SACA,SACA,aACC;CACD,MAAM,EAAE,gBAAgB,uBAErB,SAAS,OAAO;CACnB,IAAI,gBAAgB,KAAA,GAChB,OAAO,CAAC;CAEZ,IACI,gBAAgB,SAChB,gBAAgB,UAChB,gBAAgB,aAChB,EAAE,eAAe,gBAAgB,WAEjC,MAAM,IAAI,UACN,cACM,oEACA,qDACV;CAEJ,OAAO,EAAE,YAAY;AACzB;AAEA,SAAS,4BAA4B,SAAsC;CACvE,OAAO,4BAA4B,SAAS,yCAAyC,IAAI;AAC7F;AAEA,SAAS,+BAA+B,SAAyC;CAC7E,OAAO,4BAA4B,SAAS,4CAA4C,KAAK;AACjG;AACA,SAAS,cAAc,OAAsB;CACzC,OAAO,gCAAgC,OAAO,0CAA0C;AAC5F;AACA,SAAS,2BAA2B,SAAqC;CACrE,MAAM,EAAE,QAAQ,UAAU,uBAGvB,SAAS,uCAAuC;CACnD,MAAM,aAAgC,CAAC;CACvC,IAAI,WAAW,KAAA,GAAW;EACtB,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,OAAO,UAA2B,OAAO,UAAU,QAAQ,GAC7F,MAAM,IAAI,UAAU,oCAAoC;EAE5D,KAAK,MAAM,SAAS,QAChB,sBAAsB,KAAK;EAE/B,WAAW,SAAS,CAAC,GAAG,MAAM;CAClC;CACA,MAAM,kBAAkB,wCAAwC,OAAO,2CAA2C;CAClH,IAAI,oBAAoB,KAAA,GACpB,WAAW,QAAQ;CAEvB,OAAO;AACX;AACA,SAAS,qBAAqB,OAAyC;CACnE,IAAI,UAAU,KAAA,GACV;CAEJ,IAAI,OAAO,UAAU,YACjB,MAAM,IAAI,wBAAwB,4BAA4B;CAElE,OAAO;AACX;AACA,SAAS,0BAA0B,OAAkD;CACjF,IAAI,UAAU,KAAA,GACV;CAEJ,OAAO,0BAA0B,KAAK;AAC1C;AACA,SAAS,sBACL,MACA,OACO;CACP,OAAO,oCAAoC,IAAI,MAAM,oCAAoC,KAAK;AAClG;AACA,eAAe,sBAAsB,OAAqD;CACtF,OAAO,0BAA0B,MAAM,MAAM,MAAM,WAAW,CAAC;AACnE;AA6BA,eAAsB,iBAClB,MACA,SACA,SACW;CACX,MAAM,SAAS,sBAAsB,MAAM,QAAQ;CACnD,MAAM,oBAAoB,0BAA0B,OAAO;CAC3D,MAAM,mBAAmB,uBAAuB,kBAAkB,OAAO;CACzE,MAAM,UAAU,qBAAqB,kBAAkB,OAAO;CAC9D,MAAM,mBAAmB,0BAA0B,kBAAkB,OAAO;CAC5E,IAAI,qBAAqB,KAAA,KAAa,YAAY,KAAA,GAC9C,MAAM,IAAI,wBAAwB,0BAA0B;CAEhE,IAAI,qBAAqB,KAAA,KAAa,qBAAqB,KAAA,GACvD,MAAM,IAAI,wBAAwB,0BAA0B;CAEhE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,iBAAiB;CACrD,MAAM,KAAK,IAAI,OAAO,KAAK;CAC3B,IAAI;EACA,MAAM,MAAM,MAAM,mBAAmB;EACrC,IAAI;GACA,IAAI,qBAAqB,KAAA,GACrB,OAAO;GAEX,MAAM,CAAC,gBAAgB,kBAAkB,MAAM,QAAQ,IAAI,CAAC,GAAG,WAAW,GAAG,sBAAsB,KAAK,CAAC,CAAC;GAC1G,IAAI,mBAAmB,gBACnB,MAAM,IAAI,aACN,wBAAwB,OAAO,qBAAqB,iBAAiB,8BAA8B,gBACvG;GAEJ,IAAI,qBAAqB,gBAAgB;IACrC,IAAI,qBAAqB,KAAA,KAAa,CAAC,sBAAsB,kBAAkB,cAAc,GACzF,MAAM,IAAI,aACN,YAAY,OAAO,gCAAgC,eAAe,sEACtE;IAEJ,OAAO;GACX;GACA,IAAI,MAAM,OAAO,GACb,MAAM,IAAI,kBACN,YAAY,OAAO,qFAAqF,eAAe,MAAM,kBACjI;GAEJ,IAAI,CAAC,SACD,MAAM,IAAI,aACN,YAAY,OAAO,mCAAmC,eAAe,MAAM,iBAAiB,mCAChG;GAEJ,MAAM,gBAAgB,oBAAoB;GAC1C,MAAM,4BAA4B;GAClC,IAAI;IACA,MAAM,GAAG,mBACL,gBACA,kBACA,SACA,yBAAyB,aAAa,CAC1C;GACJ,UAAU;IACN,MAAM,4BAA4B;GACtC;GACA,OAAO;EACX,UAAU;GACN,MAAM,MAAM,MAAM,mBAAmB;EACzC;CACJ,SAAS,OAAO;EACZ,IAAI;GACA,MAAM,GAAG,MAAM;EACnB,QAAQ,CAAC;EACT,MAAM,eAAe,KAAK;CAC9B;AACJ;;;AC7kCA,IAAa,sBAAb,MAAiC;CAC7B;CACA;CACA,6BAAsB,IAAI,IAAqD;CAC/E;CACA;CACA;CACA,eAAe;CACf,kBAAkB;CAElB,YAAY,MAAsB,cAA0B;EACxD,KAAK,UAAU,IAAI,SAAS,SAAS,WAAW;GAC5C,KAAK,eAAe;GACpB,KAAK,cAAc;EACvB,CAAC;EACD,KAAU,QAAQ,YAAY,CAAC,CAAC;EAChC,KAAK,UAAU,IAAI,SAAO,IAAI,IAAI,qBAAqB,YAAY,GAAG,GAAG,EAAE,YAAY,KAAK,CAAC;EAC7F,KAAK,QAAQ,GAAG,YAAY,SAAkB;GAC1C,KAAK,MAAM,WAAW,EAAE,KAAK,CAAC;EAClC,CAAC;EACD,KAAK,QAAQ,GAAG,sBAAsB;GAClC,KAAK,MAAM,gBAAgB,CAAC,CAAC;EACjC,CAAC;EACD,KAAK,QAAQ,GAAG,UAAU,UAAiB;GACvC,KAAK,kBAAkB;GACvB,KAAK,MAAM,SAAS;IAAE;IAAO,SAAS,MAAM;GAAQ,CAAC;EACzD,CAAC;EACD,KAAK,QAAQ,KAAK,SAAS,SAAiB;GACxC,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,iBAAiB;IAC7C,MAAM,QAAQ,oBAAoB,yBAAyB,gCAAgC,MAAM;IACjG,KAAK,MAAM,SAAS;KAAE;KAAO,SAAS,MAAM;IAAQ,CAAC;GACzD;GACA,IAAI;IACA,aAAa;IACb,KAAK,aAAa,IAAI;GAC1B,SAAS,OAAO;IACZ,KAAK,YAAY,KAAK;GAC1B;EACJ,CAAC;EACD,KAAK,QAAQ,IAAI,qBAAqB,MAAM,EACxC,gBAAgB,KAAK,IAAI,YAAe,MAAS,KAAK,WAAW,EACrE,CAAC;CACL;CAEA,YAAY,SAAkB,WAA2B,CAAC,GAAS;EAC/D,KAAK,QAAQ,YAAY,SAAS,QAA8B;CACpE;CAEA,iBAAiB,MAAc,UAAoD;EAC/E,IAAI,YAAY,KAAK,WAAW,IAAI,IAAI;EACxC,IAAI,CAAC,WAAW;GACZ,4BAAY,IAAI,IAAI;GACpB,KAAK,WAAW,IAAI,MAAM,SAAS;EACvC;EACA,UAAU,IAAI,QAAQ;CAC1B;CAEA,oBAAoB,MAAc,UAAoD;EAClF,KAAK,WAAW,IAAI,IAAI,CAAC,EAAE,OAAO,QAAQ;CAC9C;CAEA,YAA6B;EACzB,IAAI,CAAC,KAAK,cAAc;GACpB,KAAK,eAAe;GACpB,KAAU,QAAQ,UAAU,CAAC,CAAC,MAAM,KAAK,WAAW;EACxD;EACA,OAAO,KAAK;CAChB;CAEA,MAAM,MAAc,OAAsB;EACtC,KAAK,MAAM,YAAY,MAAM,KAAK,KAAK,WAAW,IAAI,IAAI,KAAK,CAAC,CAAC,GAC7D,IAAI,OAAO,aAAa,YAAY,SAAS,KAAc;OACtD,SAAS,YAAY,KAAc;CAEhD;AACJ;;;ACpFA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAEtB,IAAM,yBAAyB;AAC/B,IAAM,gBAAgB;AACtB,IAAa,2BAA2B;AAGxC,SAAS,WAAW,MAAM,SAAS,OAAO;CACtC,MAAM,QAAQ,IAAI,MAAM,SAAS,UAAU,KAAA,IAAY,KAAA,IAAY,EAAE,MAAM,CAAC;CAC5E,MAAM,OAAO;CACb,MAAM,OAAO,OAAO,QAAQ;CAC5B,OAAO;AACX;AAEA,SAAS,aAAa,OAAO;CACzB,IACI;EAAC;EAAiB;EAAqB;EAAiB;EAAqB;CAAc,CAAC,CAAC,SACzF,OAAO,IACX,GAEA,OAAO;CAEX,IAAI,OAAO,SAAS,UAAU,OAAO,WAAW,iBAAiB,MAAM,SAAS,KAAK;CACrF,OAAO,WAAW,gBAAgB,OAAO,WAAW,OAAO,KAAK,GAAG,KAAK;AAC5E;AAEA,SAAS,kBAAkB,WAAW;CAClC,IAAI,OAAO,cAAc,YAAY,UAAU,WAAW,KAAK,UAAU,SAAS,IAAI,GAClF,MAAM,IAAI,UAAU,8CAA8C;CAEtE,OAAO,QAAQ,SAAS;AAC5B;AAEA,SAAS,cAAc,OAAO;CAC1B,IAAI,OAAO,UAAU,YAAY,CAAC,cAAc,KAAK,KAAK,GAAG,MAAM,IAAI,UAAU,4BAA4B;CAC7G,OAAO;AACX;AAoBA,SAAS,UAAU,MAAM,MAAM;CAC3B,MAAM,OAAO,GAAG,UAAU,IAAI;CAC9B,IAAI,KAAK,eAAe,KAAM,KAAK,OAAO,KAAK,KAAK,UAAU,GAC1D,MAAM,WAAW,iBAAiB,mCAAmC;CAEzE,IAAK,SAAS,eAAe,CAAC,KAAK,YAAY,KAAO,SAAS,UAAU,CAAC,KAAK,OAAO,GAClF,MAAM,WAAW,qBAAqB,0BAA0B,MAAM;CAE1E,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,KAAK,OAAO,GAAG,MAAM,WAAW,iBAAiB,gCAAgC;CAC7G,OAAO;AACX;AAEA,SAAS,cAAc,MAAM;CAEzB,IAAI,QAAQ,aAAa,SAAS;CAClC,MAAM,KAAK,GAAG,SAAS,MAAM,GAAG,UAAU,YAAY,GAAG,UAAU,eAAe,EAAE;CACpF,IAAI;EACA,GAAG,UAAU,EAAE;CACnB,UAAU;EACN,GAAG,UAAU,EAAE;CACnB;AACJ;AAEA,SAAS,UAAU,WAAW,OAAO;CACjC,MAAM,gBAAgB,KAAK,WAAW,cAAc;CACpD,UAAU,eAAe,WAAW;CACpC,MAAM,aAAa,KAAK,eAAe,GAAG,cAAc,KAAK,EAAE,MAAM;CAErE,IADa,UAAU,YAAY,MAC5B,CAAC,CAAC,OAAO,wBACZ,MAAM,WAAW,qBAAqB,uCAAuC;CAEjF,MAAM,QAAQ,KAAK,MAAM,GAAG,aAAa,YAAY,MAAM,CAAC;CAC5D,IAAI,MAAM,UAAU,SAAS,CAAC,OAAO,cAAc,MAAM,GAAG,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM,eAC3F,MAAM,WAAW,qBAAqB,uCAAuC;CAEjF,OAAO;EAAE;EAAe;EAAY;CAAM;AAC9C;AAEA,SAAS,YAAY,OAAO;CAExB,GAAG,WAAW,MAAM,UAAU;CAC9B,IAAI;EACA,GAAG,UAAU,MAAM,aAAa;CACpC,SAAS,OAAO;EACZ,IAAI,CAAC;GAAC;GAAU;GAAa;EAAQ,CAAC,CAAC,SAAS,OAAO,IAAI,GAAG,MAAM;CACxE;CACA,cAAc,QAAQ,MAAM,aAAa,CAAC;AAC9C;AAEA,SAAS,kBAAkB,WAAW;CAClC,MAAM,OAAO,KAAK,WAAW,cAAc;CAC3C,IAAI;EACA,UAAU,MAAM,WAAW;EAC3B,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO;EAC9C,GAAG,UAAU,IAAI;EACjB,cAAc,SAAS;EACvB,OAAO;CACX,SAAS,OAAO;EACZ,IAAI;GAAC;GAAU;GAAa;EAAQ,CAAC,CAAC,SAAS,OAAO,IAAI,GAAG,OAAO;EACpE,MAAM;CACV;AACJ;AA+CA,SAAS,mBAAmB,WAAW,OAAO;CAC1C,MAAM,UAAU,KAAK,WAAW,GAAG,iBAAiB,QAAQ,IAAI,GAAG,OAAO;CAC1E,IAAI;EACA,UAAU,SAAS,WAAW;CAClC,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,MAAM;CACV;CACA,MAAM,UAAU,GAAG,YAAY,OAAO;CACtC,IAAI,QAAQ,WAAW,KAAK,QAAQ,OAAO,GAAG,MAAM,QAAQ;EACxD,MAAM,aAAa,KAAK,SAAS,QAAQ,EAAE;EAC3C,UAAU,YAAY,MAAM;EAC5B,GAAG,WAAW,UAAU;CAC5B,OAAO,IAAI,QAAQ,WAAW,GAC1B,MAAM,WAAW,iBAAiB,+CAA+C;CAErF,GAAG,UAAU,OAAO;CACpB,OAAO;AACX;AAsCA,SAAgB,wBAAwB,WAAW,WAAW;CAC1D,MAAM,OAAO,kBAAkB,SAAS;CACxC,cAAc,SAAS;CACvB,IAAI;CACJ,IAAI;CACJ,IAAI;EACA,YAAY,GAAG,aAAa,IAAI;EAChC,QAAQ,UAAU,WAAW,SAAS;CAC1C,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,WAAW,OAAO;EACtC,IAAI,OAAO,SAAS,UAAU;GAC1B,IAAI,CAAC,WAAW,OAAO;GACvB,MAAM,iBAAiB,mBAAmB,WAAW,SAAS;GAC9D,OAAO,kBAAkB,SAAS,KAAK;EAC3C;EACA,MAAM,aAAa,KAAK;CAC5B;CACA,IAAI,MAAM,MAAM,QAAQ,QAAQ,KAAK,OAAO;CAC5C,IAAI;EACA,YAAY,KAAK;EACjB,mBAAmB,WAAW,SAAS;EACvC,OAAO;CACX,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,MAAM,aAAa,KAAK;CAC5B;AACJ;AAwTA,SAAgB,kBAAkB,WAAW,kBAAkB,MAAM;CACjE,MAAM,OAAO,kBAAkB,SAAS;CACxC,IAAI,CAAC,iBAAiB;EAClB,IAAI;GACA,UAAU,MAAM,WAAW;EAC/B,SAAS,OAAO;GACZ,IAAI,OAAO,SAAS,UAAU,MAAM,WAAW,gBAAgB,wBAAwB;GACvF,IAAI,OAAO,SAAS,uBAAuB,OAAO,SAAS,iBAAiB,MAAM;GAClF,MAAM,aAAa,KAAK;EAC5B;EACA,OAAO;CACX;CACA,GAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;CACtC,OAAO;AACX;;;ACviBA,IAAM,2BAAW,IAAI,IAA+B;AACpD,IAAM,sCAAsB,IAAI,IAA2B;AAE3D,SAAS,wBAA2B,KAAa,WAAyC;CAEtF,MAAM,UADW,oBAAoB,IAAI,GAAG,KAAK,QAAQ,QAAQ,EAAA,CACzC,KAAK,SAAS;CACtC,MAAM,UAAU,OAAO,WACb,KAAA,SACA,KAAA,CACV;CACA,oBAAoB,IAAI,KAAK,OAAO;CACpC,QAAa,WAAW;EACpB,IAAI,oBAAoB,IAAI,GAAG,MAAM,SAAS,oBAAoB,OAAO,GAAG;CAChF,CAAC;CACD,OAAO;AACX;AAEA,SAAS,aAAa,MAAe,QAAwC;CACzE,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAC5C,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,mBAAmB,KAAK,IAAI,GAC5B,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,OAAO,WAAW,MAAM,MAAM,IAAI,KAClC,MAAM,IAAI,UAAU,GAAG,OAAO,sDAAsD;AAE5F;AAEA,SAAS,yBAAyB,SAAwD;CACtF,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,IAAI,wBAAwB,qCAAqC;CAE3E,MAAM,YAAa,QAA8B;CACjD,IAAI,OAAO,cAAc,YAAY,UAAU,WAAW,KAAK,UAAU,SAAS,IAAI,GAClF,MAAM,IAAI,wBAAwB,+CAA+C;AAEzF;AAEA,eAAe,iBACX,MACA,SAID;CACC,IAAI;EACA,kBAAkB,QAAQ,WAAW,QAAQ,oBAAoB,KAAK;CAC1E,SAAS,OAAO;EACZ,IAAI,iBAAiB,SAAS,MAAM,SAAS,gBACzC,MAAM,IAAI,aAAa,MAAM,WAAA,8CAAmC;EAEpE,MAAM;CACV;CACA,MAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;CAC7C,MAAM,YAAY,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC;CAEjF,OAAO;EAAE;EAAW,aADA,QAAQ,aAAa,UAAU,UAAU,YAAY,IAAI;CAC7C;AACpC;AAEA,SAAS,gBAAgB,OAAgC;CACrD,IAAI,MAAM,aAAa;CACvB,MAAM,cAAc;CACpB,MAAM,OAAO;CACb,uBAAuB,KAAK;CAC5B,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,2BAA2B,GAAG,SAAS;AACnF;AAEA,SAAS,cAAc,OAA0B,QAA8B;CAC3E,IAAI,MAAM,UAAU,OAAO,MAAM;CACjC,MAAM,MAAM,QAAQ,MAAM;CAC1B,MAAM,WAAW,QAAQ,QAAQ,MAAM,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,KAAA,CAAS;CAC/E,OAAO,MAAM;AACjB;AAEA,SAAS,YAAY,QAAgB,WAAmB,aAAqB,SAAyC;CAClH,MAAM,aAAa,iBAAiB;EAAE,GAAG;EAAS,YAAY;CAAY,CAAC;CAC3E,MAAM,YAAY,WAAW;CAC7B,MAAM,cAAc,QAAQ,WAAW,QAAQ,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,KAAK;CACjF,MAAM,SAAS,IAAI,oBACf;EACI;EACA;EACA;EACA;EACA,aAAa,WAAW;EACxB,eAAe,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,SAAS,KAAK;EACzD,iBAAiB,WAAW;CAChC,SACM;EACF,wBAAwB,WAAW,SAAS;CAChD,CACJ;CACA,MAAM,QAA2B;EAC7B;EACA;EACA;EACA;EACA,OAAO,OAAO;EACd,mBAAmB,EAAE,QAAQ,CAAC,EAAE;EAChC,SAAS;EACT,MAAM;EACN,aAAa;EACb,2BAA2B;EAC3B,yCAAyB,IAAI,IAAI;EACjC,6CAA6B,IAAI,IAAI;EACrC;EACA,UAAU;EACV,eAAe,aAAa,KAAK;EACjC,eAAe,wBAAwB,mBAAmB,aAAa,KAAK,CAAC;CACjF;CACA,OAAO,MAAM,iBAAiB,UAAU;EACpC,IAAI,SAAS,IAAI,WAAW,MAAM,OAAO,SAAS,OAAO,WAAW;EACpE,gBAAgB,KAAK;EACrB,wBAA6B,mBAAmB,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAC/F,CAAC;CACD,OAAO;AACX;AAEA,eAAe,aACX,QACA,WACA,aACA,SACsB;CACtB,MAAM,aAAa,iBAAiB;EAAE,GAAG;EAAS,YAAY;CAAY,CAAC;CAC3E,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,WAAW,SAAS,IAAI,WAAW;EACzC,IAAI,YAAY,CAAC,SAAS,aAAa;GACnC,IAAI,SAAS,2BACT,MAAM,IAAI,kBAAkB,YAAY,OAAO,gDAAgD;GAEnG,wBAAwB,QAAQ,SAAS,SAAS,UAAU;GAC5D,IAAI,WAAW,mBAAmB,MAAM,MAAM,SAAS,MAAM,aAAa,WAAW,cAAc;GACnG,SAAS,QAAQ;GACjB,OAAO;EACX;EACA,MAAM,QAAQ,YAAY,QAAQ,WAAW,aAAa,OAAO;EACjE,IAAI;GACA,MAAM,MAAM,MAAM,KAAK;IAAE;IAAQ,SAAS;GAAW,CAAC;GACtD,IAAI,MAAM,aAAa,MAAM,IAAI,oBAAoB;GACrD,SAAS,IAAI,aAAa,KAAK;GAC/B,OAAO;EACX,SAAS,OAAO;GACZ,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,yBAAyB,CAAC;GAClG,MAAM,eAAe,KAAK;EAC9B;CACJ,CAAC;AACL;AAEA,eAAe,aAAa,OAAyC;CACjE,OAAO,wBAAwB,MAAM,aAAa,YAAY;EAC1D,IAAI,MAAM,eAAe,SAAS,IAAI,MAAM,WAAW,MAAM,OAAO;GAChE,IAAI,MAAM,UAAU,MAAM,MAAM;GAChC;EACJ;EACA,MAAM,QAAQ;EACd,IAAI,MAAM,OAAO,GAAG;EACpB,SAAS,OAAO,MAAM,WAAW;EACjC,IAAI;GACA,MAAM,MAAM,MAAM,MAAM;EAC5B,UAAU;GACN,gBAAgB,KAAK;GACrB,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,0BAA0B,CAAC;EACvG;CACJ,CAAC;AACL;AAEA,eAAe,aAAa,OAAyC;CACjE,IAAI,MAAM,eAAe,SAAS,IAAI,MAAM,WAAW,MAAM,OAAO,MAAM,IAAI,oBAAoB;CAClG,SAAS,OAAO,MAAM,WAAW;CACjC,gBAAgB,KAAK;CACrB,IAAI;EACA,MAAM,MAAM,MAAM,QAAQ;CAC9B,UAAU;EACN,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,6BAA6B,CAAC;CAC1G;AACJ;AAEA,eAAsB,WAAW,MAAc,SAAuC;CAClF,aAAa,MAAM,YAAY;CAC/B,yBAAyB,OAAO;CAChC,MAAM,EAAE,WAAW,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CACvE,OAAO,iBAAiB,MAAM,UAAU,QAAQ,gBAC5C,aAAa,QAAQ,WAAW,aAAa,WAAW,CAC5D;AACJ;AAEA,eAAsB,aAAa,MAAc,SAA2C;CACxF,aAAa,MAAM,cAAc;CACjC,yBAAyB,OAAO;CAChC,MAAM,EAAE,WAAW,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CACvE,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,WAAW,SAAS,IAAI,WAAW;EACzC,IAAI,UAAU,OAAO,aAAa,QAAQ;EAC1C,MAAM,QAAQ,YAAY,MAAM,WAAW,aAAa,CAAC,CAAC;EAC1D,IAAI;GACA,MAAM,MAAM,MAAM,SAAS,IAAI;EACnC,UAAU;GACN,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,iCAAiC,CAAC;EAC9G;CACJ,CAAC;AACL;AAEA,eAAsB,2BAA2B,MAAc,SAA8C;CACzG,aAAa,MAAM,4BAA4B;CAC/C,yBAAyB,OAAO;CAChC,MAAM,EAAE,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CAC5D,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,QAAQ,SAAS,IAAI,WAAW;EACtC,IAAI,CAAC,OAAO,OAAO;EACnB,SAAS,OAAO,WAAW;EAC3B,gBAAgB,KAAK;EACrB,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,4BAA4B,CAAC;EACrG,OAAO;CACX,CAAC;AACL"}
1
+ {"version":3,"file":"node.js","names":[],"sources":["../src/worker-client.ts","../src/registry.ts","../src/change-events.ts","../src/subscriptions.ts","../src/records.ts","../src/sql-types.ts","../src/sql-parser.ts","../src/sql.ts","../src/index.ts","../src/node-worker-client.ts","../src/node-storage.mjs","../src/node.ts"],"sourcesContent":["import type {\n AutocommitCommand,\n IndexScanPage,\n WorkerApi,\n WorkerOpenRequest,\n WorkerScanPage,\n WorkerScanPageRequest\n} from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DebugFailpoint,\n DbStats,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_REQUEST,\n WORKER_PROTOCOL_REQUEST_BATCH,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n deserializeWorkerError,\n decodeWorkerResponsePayload,\n isWorkerProtocolReadyMessage,\n isWorkerProtocolReadyEnvelope,\n isWorkerProtocolResponseBatchMessage,\n isWorkerProtocolResponseMessage,\n prepareWorkerCommandPayload,\n workerProtocolError,\n type AutocommitArgs,\n type WorkerCommand,\n type WorkerCommandArgs,\n type WorkerCommandResult,\n type WorkerProtocolRequestBatchMessage,\n type WorkerProtocolRequestMessage\n} from './worker-protocol';\nimport { clampTimerDelayMs, isRecord } from './internal';\n\ninterface PendingRequest {\n /** Response command; autocommit replies use the inner command's format. */\n command: WorkerCommand;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout> | null;\n}\n\ninterface QueuedRequest {\n message: WorkerProtocolRequestMessage;\n transfer: Transferable[];\n byteLength: number;\n}\n\nfunction clearPendingTimeout(pending: PendingRequest): void {\n if (pending.timeout) {\n clearTimeout(pending.timeout);\n pending.timeout = null;\n }\n}\n\nexport interface WorkerProtocolClientOptions {\n requestTimeoutMs?: number;\n readyTimeoutMs?: number;\n /** Keeps scan packets packed when relaying through SharedWorker. */\n forwardScanPackets?: boolean;\n}\n\nexport interface WorkerTransport {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n}\n\nexport interface WorkerClient extends WorkerApi {\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>>;\n request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>>;\n setFatalHandler(handler: ((error: Error) => void) | null): void;\n whenReady(): Promise<void>;\n dispose(reason?: Error): void;\n acquireMigration?(): Promise<void>;\n releaseMigration?(): Promise<void>;\n setTransactionsInvalidatedHandler?(handler: (() => void) | null): void;\n crash?(): void;\n}\n\nexport class WorkerProtocolClient implements WorkerApi {\n private nextRequestId = 1;\n private pending = new Map<number, PendingRequest>();\n private closed = false;\n private readyResolved = false;\n private readyResolve: (() => void) | null = null;\n private readyReject: ((error: Error) => void) | null = null;\n private ready: Promise<void>;\n private requestTimeoutMs: number;\n private fatalHandler: ((error: Error) => void) | null = null;\n private closeReason: Error | null = null;\n private batching = false;\n private queuedRequests: QueuedRequest[] = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private awaitingReady = 0;\n private readyTimeout: ReturnType<typeof setTimeout> | null = null;\n private forwardScanPackets: boolean;\n\n constructor(\n private readonly worker: WorkerTransport,\n options: WorkerProtocolClientOptions = {}\n ) {\n this.forwardScanPackets = options.forwardScanPackets === true;\n this.requestTimeoutMs = clampTimerDelayMs(options.requestTimeoutMs ?? 0);\n this.ready = new Promise<void>((resolve, reject) => {\n this.readyResolve = resolve;\n this.readyReject = reject;\n });\n const readyTimeoutMs = clampTimerDelayMs(options.readyTimeoutMs ?? 0);\n if (readyTimeoutMs > 0) {\n this.readyTimeout = setTimeout(() => {\n this.fail(workerProtocolError('WorkerReadyTimeoutError', 'worker did not become ready'));\n }, readyTimeoutMs);\n }\n void this.ready.catch(() => undefined);\n this.worker.addEventListener('message', this.handleMessage as EventListener);\n this.worker.addEventListener('messageerror', this.handleMessageError);\n this.worker.addEventListener('error', this.handleError as EventListener);\n }\n\n setFatalHandler(handler: ((error: Error) => void) | null): void {\n this.fatalHandler = handler;\n }\n\n whenReady(): Promise<void> {\n return this.ready;\n }\n\n dispose(reason: Error = workerProtocolError('WorkerTerminatedError', 'worker transport was closed')): void {\n this.disposeInternal(reason, false);\n }\n\n protected fail(reason: Error): void {\n this.disposeInternal(reason, true);\n }\n\n open(request: WorkerOpenRequest): Promise<void> {\n return this.request('open', [request]);\n }\n\n close(): Promise<void> {\n return this.request('close', []);\n }\n\n destroy(): Promise<void> {\n return this.request('destroy', []);\n }\n\n deleteDB(dbName: string): Promise<void> {\n return this.request('deleteDB', [dbName]);\n }\n\n begin(mode: TxMode): Promise<number> {\n return this.request('begin', [mode]);\n }\n\n commit(txId: number): Promise<number> {\n return this.request('commit', [txId]);\n }\n\n rollback(txId: number): Promise<void> {\n return this.request('rollback', [txId]);\n }\n\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>> {\n return this.send('autocommit', [mode, command, args as unknown[]], command) as Promise<WorkerCommandResult<M>>;\n }\n\n createStore(txId: number, name: string, options?: CreateStoreOptions): Promise<void> {\n return this.request('createStore', [txId, name, options]);\n }\n\n dropStore(txId: number, name: string): Promise<void> {\n return this.request('dropStore', [txId, name]);\n }\n\n clearStore(txId: number, name: string): Promise<void> {\n return this.request('clearStore', [txId, name]);\n }\n\n get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('get', [txId, store, key]);\n }\n\n getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.request('getMany', [txId, store, keys]);\n }\n\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('has', [txId, store, key]);\n }\n\n put(txId: number, store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n return this.request('put', [txId, store, key, value, options]);\n }\n\n putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options?: PutOptions\n ): Promise<void> {\n return this.request('putMany', [txId, store, entries, options]);\n }\n\n delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('delete', [txId, store, key]);\n }\n\n deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n return this.request('deleteMany', [txId, store, keys]);\n }\n\n applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n return this.request('applyBatch', [txId, store, ops]);\n }\n\n scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.request('scan', [txId, store, range]);\n }\n\n scanPage(request: WorkerScanPageRequest): Promise<WorkerScanPage> {\n return this.request('scanPage', [request]);\n }\n\n closeCursor(cursorId: number): Promise<void> {\n return this.request('closeCursor', [cursorId]);\n }\n\n getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('getByIndex', [txId, store, indexName, key]);\n }\n\n scanByIndex(txId: number, store: string, indexName: string, range: Range): Promise<ScanItem[]> {\n return this.request('scanByIndex', [txId, store, indexName, range]);\n }\n\n scanByIndexPage(\n txId: number,\n store: string,\n indexName: string,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes?: number\n ): Promise<IndexScanPage> {\n return this.request('scanByIndexPage', [txId, store, indexName, range, cursor, limit, maxBytes]);\n }\n\n getIndexes(txId?: number): Promise<IndexDef[]> {\n return this.request('getIndexes', txId === undefined ? [] : [txId]);\n }\n\n reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n return this.request('reconcileIndexes', [txId, indexes]);\n }\n\n listStores(): Promise<string[]> {\n return this.request('listStores', []);\n }\n\n getVersion(): Promise<number> {\n return this.request('getVersion', []);\n }\n\n changesSince(txId: number, options: ChangeFeedOptions): Promise<ChangeFeed> {\n return this.request('changesSince', [txId, options]);\n }\n\n setSchemaVersion(txId: number, version: number): Promise<void> {\n return this.request('setSchemaVersion', [txId, version]);\n }\n\n exportSnapshot(options?: ExportSnapshotOptions): Promise<Uint8Array> {\n return this.request('exportSnapshot', [options]);\n }\n\n importSnapshot(data: Uint8Array): Promise<void> {\n return this.request('importSnapshot', [data]);\n }\n\n reset(): Promise<void> {\n return this.request('reset', []);\n }\n\n compact(): Promise<CompactionResult> {\n return this.request('compact', []);\n }\n\n rebuild(): Promise<CompactionResult> {\n return this.request('rebuild', []);\n }\n\n stats(): Promise<DbStats> {\n return this.request('stats', []);\n }\n\n storageInfo(): Promise<StorageInfo> {\n return this.request('storageInfo', []);\n }\n\n requestPersistence(): Promise<boolean> {\n return this.request('requestPersistence', []);\n }\n\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.request('setFailpoint', [failpoint]);\n }\n\n async request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>> {\n return (await this.send(command, args, command)) as WorkerCommandResult<M>;\n }\n\n private async send<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>,\n responseCommand: WorkerCommand\n ): Promise<unknown> {\n this.ensureOpen();\n this.awaitingReady += 1;\n try {\n await this.ready;\n } finally {\n this.awaitingReady -= 1;\n }\n this.ensureOpen();\n // Calls awaiting readiness together can share a batch. A lone call posts immediately.\n const shouldQueue = this.batching && (this.awaitingReady > 0 || this.queuedRequests.length > 0);\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const prepared = prepareWorkerCommandPayload(command, args);\n const message: WorkerProtocolRequestMessage = {\n type: WORKER_PROTOCOL_REQUEST,\n version: WORKER_PROTOCOL_VERSION,\n id,\n command,\n args: prepared.args\n } as WorkerProtocolRequestMessage;\n return await new Promise<unknown>((resolve, reject) => {\n const timeout =\n this.requestTimeoutMs > 0\n ? setTimeout(() => {\n const current = this.pending.get(id);\n if (!current || current.timeout === null) {\n return;\n }\n this.pending.delete(id);\n current.timeout = null;\n reject(\n workerProtocolError(\n 'WorkerRequestTimeoutError',\n `worker command ${command} timed out after ${this.requestTimeoutMs}ms`\n )\n );\n }, this.requestTimeoutMs)\n : null;\n this.pending.set(id, {\n command: responseCommand,\n resolve,\n reject,\n timeout\n });\n try {\n if (shouldQueue) {\n this.queueRequest(message, prepared.transfer);\n } else if (prepared.transfer.length > 0) {\n this.worker.postMessage(message, prepared.transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n this.rejectPending(id, error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private queueRequest(message: WorkerProtocolRequestMessage, transfer: Transferable[]): void {\n if (!this.pending.has(message.id)) return;\n const byteLength = payloadBytes(message);\n if (this.queuedRequests.length > 0 && this.queuedBytes + byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flushRequests();\n }\n // A full batch posts in this turn, so postMessage is the snapshot.\n const releaseNow =\n this.queuedRequests.length + 1 >= MAX_WORKER_BATCH_MESSAGES ||\n this.queuedBytes + byteLength >= MAX_WORKER_BATCH_BYTES;\n if (releaseNow) {\n this.queuedRequests.push({ message, transfer, byteLength });\n this.queuedBytes += byteLength;\n this.flushRequests();\n return;\n }\n const captured = snapshotQueuedPayload(message, transfer);\n if (!this.pending.has(message.id)) return;\n this.queuedRequests.push({\n message: captured.value,\n transfer: captured.transfer,\n byteLength: captured.byteLength\n });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.flushScheduled = false;\n this.flushRequests();\n });\n }\n }\n\n private flushRequests(): void {\n const queued = this.queuedRequests;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n if (this.closed) return;\n const active = queued.filter((entry) => this.pending.has(entry.message.id));\n if (active.length === 0) return;\n const message: WorkerProtocolRequestMessage | WorkerProtocolRequestBatchMessage =\n active.length === 1\n ? active[0].message\n : {\n type: WORKER_PROTOCOL_REQUEST_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n requests: active.map((entry) => entry.message)\n };\n const transfer: Transferable[] = [];\n for (const entry of active) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n try {\n if (transfer.length > 0) {\n this.worker.postMessage(message, transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n const reason = error instanceof Error ? error : new Error(String(error));\n for (const entry of active) this.rejectPending(entry.message.id, reason);\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw this.closeReason ?? workerProtocolError('WorkerTerminatedError', 'worker transport is closed');\n }\n }\n\n private handleMessage = (event: MessageEvent<unknown>): void => {\n const data = event.data;\n if (isWorkerProtocolReadyMessage(data)) {\n if (this.readyResolved) return;\n this.batching = data.batching === 1;\n this.readyResolved = true;\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n this.readyResolve?.();\n this.readyResolve = null;\n this.readyReject = null;\n return;\n }\n if (isWorkerProtocolReadyEnvelope(data)) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol ready message'));\n return;\n }\n if (\n isRecord(data) &&\n (data.type === WORKER_PROTOCOL_RESPONSE || data.type === WORKER_PROTOCOL_RESPONSE_BATCH) &&\n data.version !== WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol response'));\n return;\n }\n if (isWorkerProtocolResponseBatchMessage(data)) {\n for (const response of data.responses) this.handleResponse(response);\n return;\n }\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE_BATCH &&\n data.version === WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'invalid worker response batch'));\n return;\n }\n this.handleResponse(data);\n };\n\n private handleResponse(data: unknown): void {\n if (!isWorkerProtocolResponseMessage(data)) {\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE &&\n data.version === WORKER_PROTOCOL_VERSION &&\n typeof data.id === 'number' &&\n Number.isSafeInteger(data.id)\n ) {\n this.rejectPending(data.id, workerProtocolError('WorkerProtocolError', 'invalid worker response'));\n }\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n clearPendingTimeout(pending);\n try {\n if (data.ok) {\n pending.resolve(\n this.forwardScanPackets &&\n (pending.command === 'scanPage' ||\n pending.command === 'scan' ||\n pending.command === 'scanByIndex' ||\n pending.command === 'scanByIndexPage')\n ? data.result\n : decodeWorkerResponsePayload(pending.command, data.result)\n );\n } else {\n pending.reject(deserializeWorkerError(data.error));\n }\n } catch (error) {\n pending.reject(\n error instanceof Error && error.name === 'WorkerProtocolError'\n ? error\n : workerProtocolError('WorkerProtocolError', 'worker response could not be decoded')\n );\n }\n }\n\n private handleMessageError = (): void => {\n this.fail(workerProtocolError('WorkerMessageError', 'worker message could not be deserialized'));\n };\n\n private handleError = (event: ErrorEvent): void => {\n const error =\n event.error instanceof Error\n ? event.error\n : workerProtocolError('WorkerError', event.message || 'worker runtime failed');\n this.fail(error);\n };\n\n private rejectPending(id: number, error: Error): void {\n const pending = this.pending.get(id);\n if (!pending) {\n return;\n }\n this.pending.delete(id);\n clearPendingTimeout(pending);\n pending.reject(error);\n }\n\n private disposeInternal(reason: Error, notifyFatal: boolean): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n this.worker.removeEventListener('message', this.handleMessage as EventListener);\n this.worker.removeEventListener('messageerror', this.handleMessageError);\n this.worker.removeEventListener('error', this.handleError as EventListener);\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n if (!this.readyResolved) {\n this.readyReject?.(reason);\n }\n this.readyResolve = null;\n this.readyReject = null;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n for (const pending of this.pending.values()) {\n clearPendingTimeout(pending);\n pending.reject(reason);\n }\n this.pending.clear();\n if (notifyFatal) {\n this.fatalHandler?.(reason);\n }\n }\n}\n\ninterface ViewGeometry {\n offset: number;\n length: number;\n dataView: boolean;\n}\n\nconst STANDARD_VIEW_CONSTRUCTORS = new Set<object>([\n DataView,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array\n]);\n\n/**\n * Freeze a queued payload so the later postMessage is its only structured clone.\n * Listed buffers move now. Other ArrayBuffers are copied. SharedArrayBuffers stay shared.\n */\nfunction snapshotQueuedPayload<T>(\n value: T,\n transfer: readonly Transferable[]\n): { value: T; transfer: Transferable[]; byteLength: number } {\n const moving = new Set<ArrayBuffer>();\n for (const item of transfer) {\n if (!(item instanceof ArrayBuffer) || isResizableBuffer(item)) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n moving.add(item);\n }\n const geometries = new Map<ArrayBufferView, ViewGeometry>();\n if (!isPlainPayload(value, geometries, new WeakSet<object>())) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n const relocated = new Map<ArrayBuffer, ArrayBuffer>();\n for (const buffer of moving) {\n relocated.set(buffer, moveArrayBuffer(buffer));\n }\n const owned: ArrayBuffer[] = [];\n const seen = new WeakMap<object, unknown>();\n const cloneValue = (item: unknown): unknown => {\n if (item === null || typeof item !== 'object') {\n return item;\n }\n const existing = seen.get(item);\n if (existing !== undefined) {\n return existing;\n }\n if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n seen.set(item, item);\n return item;\n }\n if (item instanceof ArrayBuffer) {\n const next = relocated.get(item) ?? item.slice(0);\n seen.set(item, next);\n owned.push(next);\n return next;\n }\n if (ArrayBuffer.isView(item)) {\n const geometry = geometries.get(item);\n if (!geometry) {\n throw workerProtocolError('WorkerProtocolError', 'worker payload could not be queued');\n }\n const buffer = item.buffer;\n const nextBuffer =\n typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer\n ? buffer\n : (cloneValue(buffer) as ArrayBuffer);\n const out = retargetView(item, nextBuffer, geometry);\n seen.set(item, out);\n return out;\n }\n if (Array.isArray(item)) {\n const out = new Array<unknown>(item.length);\n seen.set(item, out);\n for (let index = 0; index < item.length; index += 1) {\n if (index in item) {\n out[index] = cloneValue(item[index]);\n }\n }\n return out;\n }\n const out: Record<string, unknown> = Object.getPrototypeOf(item) === null ? Object.create(null) : {};\n seen.set(item, out);\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n out[key] = cloneValue(record[key]);\n }\n }\n return out;\n };\n const cloned = cloneValue(value) as T;\n return { value: cloned, transfer: owned, byteLength: payloadBytes(cloned) };\n}\n\nfunction payloadBytes(value: unknown): number {\n let byteLength = 0;\n const seen = new WeakSet<object>();\n const visit = (item: unknown): void => {\n if (!Number.isFinite(byteLength)) return;\n if (typeof item === 'string') {\n byteLength += 8 + item.length * 2;\n return;\n }\n if (item === null || typeof item !== 'object') {\n byteLength += 8;\n return;\n }\n if (seen.has(item)) {\n return;\n }\n seen.add(item);\n byteLength += 8;\n if (item instanceof ArrayBuffer) {\n byteLength += item.byteLength;\n } else if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n byteLength += item.byteLength;\n } else if (ArrayBuffer.isView(item)) {\n visit(item.buffer);\n } else if (Array.isArray(item)) {\n if (Object.getPrototypeOf(item) !== Array.prototype || hasExtraKeys(item)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n for (let index = 0; index < item.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(item, String(index));\n if (descriptor && !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n visit(descriptor?.value);\n }\n } else if (item instanceof Map) {\n for (const [key, child] of item) {\n visit(key);\n visit(child);\n }\n } else if (item instanceof Set) {\n for (const child of item) {\n visit(child);\n }\n } else {\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n // Let postMessage evaluate accessors and preserve special data keys.\n if (key === '__proto__' || !descriptor || !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n byteLength += 8 + key.length * 2;\n visit(descriptor.value);\n }\n }\n }\n };\n visit(value);\n return byteLength;\n}\n\nfunction isPlainPayload(\n value: unknown,\n geometries: Map<ArrayBufferView, ViewGeometry>,\n seen: WeakSet<object>\n): boolean {\n if (typeof value === 'function' || typeof value === 'symbol') {\n return false;\n }\n if (value === null || typeof value !== 'object') {\n return true;\n }\n if (seen.has(value)) {\n return true;\n }\n seen.add(value);\n if (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (value instanceof ArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (ArrayBuffer.isView(value)) {\n if (!isStandardView(value)) {\n return false;\n }\n const buffer = value.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n if (isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (!(buffer instanceof ArrayBuffer) || isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (value instanceof Map || value instanceof Set || value instanceof Date || value instanceof RegExp) {\n return false;\n }\n if (Array.isArray(value)) {\n if (hasExtraKeys(value) || hasEnumerableSymbols(value)) {\n return false;\n }\n for (const child of value) {\n if (!isPlainPayload(child, geometries, seen)) {\n return false;\n }\n }\n return true;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n return false;\n }\n if (hasEnumerableSymbols(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key) && !isPlainPayload(record[key], geometries, seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasExtraKeys(value: readonly unknown[]): boolean {\n const record: object = value;\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n continue;\n }\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= value.length || String(index) !== key) {\n return true;\n }\n }\n return false;\n}\n\nfunction hasEnumerableSymbols(value: object): boolean {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, symbol)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isStandardView(view: ArrayBufferView): boolean {\n return STANDARD_VIEW_CONSTRUCTORS.has(view.constructor);\n}\n\nfunction viewGeometry(view: ArrayBufferView): ViewGeometry {\n if (view instanceof DataView) {\n return { offset: view.byteOffset, length: view.byteLength, dataView: true };\n }\n return { offset: view.byteOffset, length: (view as Uint8Array).length, dataView: false };\n}\n\nfunction retargetView(view: ArrayBufferView, buffer: ArrayBufferLike, geometry: ViewGeometry): ArrayBufferView {\n if (geometry.dataView) {\n return new DataView(buffer, geometry.offset, geometry.length);\n }\n const Typed = view.constructor as new (\n buffer: ArrayBufferLike,\n byteOffset: number,\n length: number\n ) => ArrayBufferView;\n return new Typed(buffer, geometry.offset, geometry.length);\n}\n\nfunction moveArrayBuffer(buffer: ArrayBuffer): ArrayBuffer {\n const movable = buffer as ArrayBuffer & { transfer?: () => ArrayBuffer };\n if (typeof movable.transfer === 'function') {\n return movable.transfer();\n }\n return structuredClone(buffer, { transfer: [buffer] });\n}\n\nfunction isResizableBuffer(buffer: ArrayBuffer | SharedArrayBuffer): boolean {\n return (buffer as { resizable?: boolean }).resizable === true;\n}\n","import { WorkerProtocolClient, type WorkerClient, type WorkerTransport } from './worker-client';\nimport { SharedWorkerProtocolClient } from './shared-worker-client';\nimport type { ChangeFeedSettings, DebugFailpoint, OpenOptions } from './types';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n UnsupportedPlatformError,\n normalizeError\n} from './errors';\nimport { isRecord, withTimeout } from './internal';\nconst VALID_FAILPOINTS = new Set<Exclude<DebugFailpoint, null>>([\n 'after_wal_flush',\n 'after_main_flush',\n 'before_superblock_flush'\n]);\nconst PERSISTENCE_BRIDGE_INIT = 'moyodb:persistence-bridge:init';\nconst PERSISTENCE_BRIDGE_REQUEST = 'moyodb:persistence-bridge:request';\nconst PERSISTENCE_BRIDGE_RESPONSE = 'moyodb:persistence-bridge:response';\ntype PersistenceBridgeOperation = 'persist' | 'persisted';\ninterface PersistenceBridgeRequest {\n type: typeof PERSISTENCE_BRIDGE_REQUEST;\n id: number;\n op: PersistenceBridgeOperation;\n}\ninterface PersistenceBridgeResponse {\n type: typeof PERSISTENCE_BRIDGE_RESPONSE;\n id: number;\n granted: boolean;\n}\nfunction isPersistenceBridgeRequest(value: unknown): value is PersistenceBridgeRequest {\n return (\n isRecord(value) &&\n value.type === PERSISTENCE_BRIDGE_REQUEST &&\n typeof value.id === 'number' &&\n (value.op === 'persist' || value.op === 'persisted')\n );\n}\ninterface MainThreadPersistenceBridge {\n close(): void;\n}\nexport interface NormalizedOpenOptions {\n workerMode: 'dedicated' | 'shared';\n createIfMissing: boolean;\n ownerWaitMs: number;\n requestPersistence: boolean;\n cachePages: number;\n debugFailpoint: DebugFailpoint;\n changeFeed: Required<ChangeFeedSettings> | null;\n}\nconst DEFAULT_CHANGE_FEED_RETAIN_TXIDS = 100_000;\nexport interface RegistryEntry {\n dbName: string;\n refs: number;\n worker: { terminate(): void | Promise<number> };\n proxy: WorkerClient;\n persistenceBridge: MainThreadPersistenceBridge;\n options: NormalizedOpenOptions;\n invalidated: boolean;\n schemaMigrationInProgress: boolean;\n txInvalidationListeners: Set<() => void>;\n handleInvalidationListeners: Set<() => void>;\n release?: () => Promise<void>;\n destroy?: () => Promise<void>;\n channelName?: string;\n}\nconst registry = new Map<string, RegistryEntry>();\nconst lifecycleOperations = new Map<string, Promise<void>>();\nfunction queueLifecycleOperation<T>(dbName: string, operation: () => Promise<T> | T): Promise<T> {\n const previous = lifecycleOperations.get(dbName) ?? Promise.resolve();\n const result = previous.then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined\n );\n lifecycleOperations.set(dbName, settled);\n void settled.then(() => {\n if (lifecycleOperations.get(dbName) === settled) {\n lifecycleOperations.delete(dbName);\n }\n });\n return result;\n}\nfunction requirePlainOptionsObject(options: unknown): asserts options is OpenOptions {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidOpenOptionsError('open options must be an object');\n }\n}\nfunction normalizeBoolean(value: unknown, field: string, defaultValue: boolean): boolean {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'boolean') {\n throw new InvalidOpenOptionsError(`${field} must be a boolean`);\n }\n return value;\n}\nfunction normalizeNonNegativeInteger(value: unknown, field: string, defaultValue: number): number {\n if (value === undefined) {\n return defaultValue;\n }\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new InvalidOpenOptionsError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\nfunction normalizeCachePages(value: unknown): number {\n return Math.max(1, normalizeNonNegativeInteger(value, 'cachePages', 256));\n}\nfunction normalizeFailpoint(value: unknown): DebugFailpoint {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== 'string' || !VALID_FAILPOINTS.has(value as Exclude<DebugFailpoint, null>)) {\n throw new InvalidOpenOptionsError(`debugFailpoint must be one of: ${Array.from(VALID_FAILPOINTS).join(', ')}`);\n }\n return value as Exclude<DebugFailpoint, null>;\n}\nfunction normalizeChangeFeed(value: unknown): Required<ChangeFeedSettings> | null {\n if (value === undefined) {\n return null;\n }\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new InvalidOpenOptionsError('changeFeed must be an object');\n }\n const settings = value as ChangeFeedSettings;\n const enabled = normalizeBoolean(settings.enabled, 'changeFeed.enabled', true);\n let retainTxids: number | null = DEFAULT_CHANGE_FEED_RETAIN_TXIDS;\n if (settings.retainTxids === null) {\n retainTxids = null;\n } else if (settings.retainTxids !== undefined) {\n retainTxids = normalizeNonNegativeInteger(settings.retainTxids, 'changeFeed.retainTxids', 0);\n if (retainTxids === 0) {\n throw new InvalidOpenOptionsError('changeFeed.retainTxids must be positive; disable the feed instead');\n }\n }\n return { enabled, retainTxids };\n}\nfunction normalizeWorkerMode(value: unknown): NormalizedOpenOptions['workerMode'] {\n if (value === undefined) return 'dedicated';\n if (value !== 'dedicated' && value !== 'shared') {\n throw new InvalidOpenOptionsError('workerMode must be dedicated or shared');\n }\n return value;\n}\nexport function normalizeOptions(options: OpenOptions = {}): NormalizedOpenOptions {\n requirePlainOptionsObject(options);\n return {\n workerMode: normalizeWorkerMode(options.workerMode),\n createIfMissing: normalizeBoolean(options.createIfMissing, 'createIfMissing', true),\n ownerWaitMs: normalizeNonNegativeInteger(options.ownerWaitMs, 'ownerWaitMs', 0),\n requestPersistence: normalizeBoolean(options.requestPersistence, 'requestPersistence', true),\n cachePages: normalizeCachePages(options.cachePages),\n debugFailpoint: normalizeFailpoint(options.debugFailpoint),\n changeFeed: normalizeChangeFeed(options.changeFeed)\n };\n}\nfunction sameChangeFeed(left: NormalizedOpenOptions['changeFeed'], right: NormalizedOpenOptions['changeFeed']) {\n return left?.enabled === right?.enabled && left?.retainTxids === right?.retainTxids;\n}\nfunction liveOptionsMismatch(\n dbName: string,\n current: NormalizedOpenOptions,\n next: NormalizedOpenOptions\n): string | null {\n if (current.workerMode !== next.workerMode) {\n return `database ${dbName} is already open with workerMode=${current.workerMode}`;\n }\n if (current.cachePages !== next.cachePages) {\n return `database ${dbName} is already open in this tab with cachePages=${current.cachePages}; requested cachePages=${next.cachePages}`;\n }\n if (next.changeFeed !== null && !sameChangeFeed(current.changeFeed, next.changeFeed)) {\n return `database ${dbName} is already open in this tab with a different changeFeed policy`;\n }\n return null;\n}\nexport function assertCompatibleOptions(dbName: string, current: NormalizedOpenOptions, next: NormalizedOpenOptions) {\n const mismatch = liveOptionsMismatch(dbName, current, next);\n if (mismatch !== null) {\n throw new InvalidOpenOptionsError(mismatch);\n }\n}\nasync function callStorageManager(method: 'persist' | 'persisted'): Promise<boolean> {\n const storage = globalThis.navigator.storage;\n if (typeof storage[method] !== 'function') {\n return false;\n }\n return await withTimeout(storage[method](), 1000, false);\n}\nasync function handlePersistenceBridgeRequest(port: MessagePort, request: PersistenceBridgeRequest): Promise<void> {\n const granted = await callStorageManager(request.op);\n const response: PersistenceBridgeResponse = {\n type: PERSISTENCE_BRIDGE_RESPONSE,\n id: request.id,\n granted\n };\n port.postMessage(response);\n}\nfunction createMainThreadPersistenceBridge(worker: WorkerTransport): MainThreadPersistenceBridge {\n const channel = new MessageChannel();\n const port = channel.port1;\n port.addEventListener('message', (event: MessageEvent<unknown>) => {\n const data = event.data;\n if (!isPersistenceBridgeRequest(data)) {\n return;\n }\n void handlePersistenceBridgeRequest(port, data);\n });\n port.start();\n worker.postMessage({ type: PERSISTENCE_BRIDGE_INIT }, [channel.port2]);\n return {\n close() {\n port.close();\n }\n };\n}\nfunction createWorker(\n dbName: string,\n mode: NormalizedOpenOptions['workerMode'] = 'dedicated'\n): {\n worker: RegistryEntry['worker'];\n proxy: WorkerClient;\n persistenceBridge: MainThreadPersistenceBridge;\n} {\n if (mode === 'shared') {\n if (typeof globalThis.SharedWorker !== 'function') {\n throw new UnsupportedPlatformError('SharedWorker is unavailable; workerMode=shared cannot be opened');\n }\n const sharedWorker = new SharedWorker(new URL('./shared-worker.ts', import.meta.url), {\n type: 'module',\n name: `moyodb:${dbName}`\n });\n const proxy = new SharedWorkerProtocolClient(sharedWorker);\n const persistenceBridge = { close() {} };\n return {\n worker: {\n terminate: async () => {\n await proxy.disconnect();\n return 0;\n }\n },\n proxy,\n persistenceBridge\n };\n }\n const worker = new Worker(new URL('./browser-worker.ts', import.meta.url), { type: 'module' });\n const proxy = new WorkerProtocolClient(worker);\n const persistenceBridge = createMainThreadPersistenceBridge(worker);\n return { worker, proxy, persistenceBridge };\n}\nfunction createEntry(\n dbName: string,\n worker: RegistryEntry['worker'],\n proxy: WorkerClient,\n persistenceBridge: MainThreadPersistenceBridge,\n options: NormalizedOpenOptions\n): RegistryEntry {\n const entry: RegistryEntry = {\n dbName,\n refs: 1,\n worker,\n proxy,\n persistenceBridge,\n options,\n invalidated: false,\n schemaMigrationInProgress: false,\n txInvalidationListeners: new Set(),\n handleInvalidationListeners: new Set()\n };\n proxy.setTransactionsInvalidatedHandler?.(() => invalidateTransactions(entry));\n proxy.setFatalHandler(() => {\n const current = registry.get(dbName);\n if (current !== entry || entry.invalidated) {\n return;\n }\n registry.delete(dbName);\n entry.refs = 0;\n invalidateEntry(entry);\n entry.persistenceBridge.close();\n void entry.worker.terminate();\n });\n return entry;\n}\nfunction emitListeners(listeners: Iterable<() => void>) {\n for (const listener of Array.from(listeners)) {\n listener();\n }\n}\nexport function subscribeTransactionsInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.txInvalidationListeners.add(listener);\n return () => {\n entry.txInvalidationListeners.delete(listener);\n };\n}\nexport function subscribeHandleInvalidated(entry: RegistryEntry, listener: () => void): () => void {\n entry.handleInvalidationListeners.add(listener);\n return () => {\n entry.handleInvalidationListeners.delete(listener);\n };\n}\nexport function invalidateTransactions(entry: RegistryEntry): void {\n emitListeners(entry.txInvalidationListeners);\n}\nfunction invalidateEntry(entry: RegistryEntry): void {\n if (entry.invalidated) {\n return;\n }\n entry.invalidated = true;\n invalidateTransactions(entry);\n emitListeners(entry.handleInvalidationListeners);\n}\nexport function unsafeDebugCrashWorker(dbName: string): boolean {\n const current = registry.get(dbName);\n if (!current) {\n return false;\n }\n registry.delete(dbName);\n invalidateEntry(current);\n current.refs = 0;\n current.persistenceBridge.close();\n current.proxy.crash?.();\n current.proxy.dispose(new Error('worker was terminated by unsafeDebugCrashWorker'));\n void current.worker.terminate();\n return true;\n}\nfunction tryReuseIdleEntry(dbName: string, normalized: NormalizedOpenOptions): RegistryEntry | undefined {\n // An idle live owner only needs another handle. In-flight close/delete,\n // migration, and failpoint changes stay queued so one worker keeps the lock.\n if (lifecycleOperations.has(dbName) || normalized.debugFailpoint !== null) {\n return undefined;\n }\n const existing = registry.get(dbName);\n if (!existing || existing.invalidated || existing.schemaMigrationInProgress) {\n return undefined;\n }\n if (liveOptionsMismatch(dbName, existing.options, normalized) !== null) {\n return undefined;\n }\n existing.refs += 1;\n return existing;\n}\nfunction adoptQueuedEntry(\n existing: RegistryEntry,\n dbName: string,\n normalized: NormalizedOpenOptions\n): RegistryEntry | Promise<RegistryEntry> {\n if (existing.schemaMigrationInProgress) {\n throw new DatabaseBusyError(`database ${dbName} is migrating; wait for openDB() to resolve`);\n }\n assertCompatibleOptions(dbName, existing.options, normalized);\n if (normalized.debugFailpoint !== null) {\n return existing.proxy.setFailpoint(normalized.debugFailpoint).then(\n () => {\n existing.refs += 1;\n return existing;\n },\n (error: unknown) => {\n throw normalizeError(error);\n }\n );\n }\n existing.refs += 1;\n return existing;\n}\nasync function openFreshEntry(dbName: string, normalized: NormalizedOpenOptions): Promise<RegistryEntry> {\n const { worker, proxy, persistenceBridge } = createWorker(dbName, normalized.workerMode);\n const entry = createEntry(dbName, worker, proxy, persistenceBridge, normalized);\n try {\n await proxy.open({\n dbName,\n options: normalized\n });\n registry.set(dbName, entry);\n return entry;\n } catch (error) {\n persistenceBridge.close();\n proxy.dispose(new Error('worker open failed'));\n await worker.terminate();\n throw normalizeError(error);\n }\n}\nfunction acquireQueuedEntry(dbName: string, normalized: NormalizedOpenOptions): RegistryEntry | Promise<RegistryEntry> {\n const existing = registry.get(dbName);\n if (existing) {\n if (existing.invalidated) {\n registry.delete(dbName);\n } else {\n return adoptQueuedEntry(existing, dbName, normalized);\n }\n }\n return openFreshEntry(dbName, normalized);\n}\nexport function acquireDbWorker(dbName: string, options: OpenOptions = {}): Promise<RegistryEntry> {\n let normalized: NormalizedOpenOptions;\n try {\n normalized = normalizeOptions(options);\n } catch (error) {\n return Promise.reject(error);\n }\n const reused = tryReuseIdleEntry(dbName, normalized);\n if (reused) {\n return Promise.resolve(reused);\n }\n return queueLifecycleOperation(dbName, () => acquireQueuedEntry(dbName, normalized));\n}\nexport async function releaseDbWorker(entry: RegistryEntry): Promise<void> {\n if (entry.release) return entry.release();\n return queueLifecycleOperation(entry.dbName, async () => {\n if (entry.invalidated || registry.get(entry.dbName) !== entry) {\n return;\n }\n entry.refs -= 1;\n if (entry.refs > 0) {\n return;\n }\n registry.delete(entry.dbName);\n try {\n await entry.proxy.close();\n } finally {\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n }\n });\n}\nexport async function destroyDbWorker(entry: RegistryEntry): Promise<void> {\n if (entry.destroy) return entry.destroy();\n return queueLifecycleOperation(entry.dbName, () => destroyEntry(entry));\n}\nasync function destroyEntry(entry: RegistryEntry): Promise<void> {\n if (entry.invalidated || registry.get(entry.dbName) !== entry) {\n throw new DatabaseClosedError();\n }\n if (entry.options.workerMode === 'shared') {\n try {\n await entry.proxy.destroy();\n } catch (error) {\n throw normalizeError(error);\n }\n registry.delete(entry.dbName);\n invalidateEntry(entry);\n entry.refs = 0;\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n return;\n }\n registry.delete(entry.dbName);\n invalidateEntry(entry);\n entry.refs = 0;\n try {\n await entry.proxy.destroy();\n } catch (error) {\n throw normalizeError(error);\n } finally {\n entry.persistenceBridge.close();\n entry.proxy.dispose(new Error('worker was released'));\n await entry.worker.terminate();\n }\n}\nexport async function deleteDbByName(dbName: string): Promise<void> {\n return queueLifecycleOperation(dbName, async () => {\n const current = registry.get(dbName);\n if (current) {\n await destroyEntry(current);\n return;\n }\n const { worker, proxy, persistenceBridge } = createWorker(dbName);\n try {\n await proxy.deleteDB(dbName);\n } catch (error) {\n throw normalizeError(error);\n } finally {\n persistenceBridge.close();\n proxy.dispose(new Error('temporary worker was terminated'));\n await worker.terminate();\n }\n });\n}\n","import type { DbChange } from './types';\nimport { isRecord } from './internal';\nexport interface StoreChangeSet {\n store: string;\n changes: DbChange[];\n}\nexport interface CommitAppliedEvent {\n type: 'commit_applied';\n dbName: string;\n txid: number;\n stores: StoreChangeSet[];\n}\nexport interface OwnerChangedEvent {\n type: 'owner_changed';\n dbName: string;\n txid: null;\n}\nexport interface DbClosedEvent {\n type: 'db_closed';\n dbName: string;\n txid: null;\n}\nexport interface DbDeletedEvent {\n type: 'db_deleted';\n dbName: string;\n txid: null;\n}\nexport type WorkerBroadcastEvent = CommitAppliedEvent | OwnerChangedEvent | DbClosedEvent | DbDeletedEvent;\nfunction isDbChange(value: unknown): value is DbChange {\n if (!isRecord(value) || !(value.key instanceof Uint8Array)) {\n return false;\n }\n if (value.kind === 'put' || value.kind === 'delete') {\n return true;\n }\n return (value.kind === 'clear' || value.kind === 'drop') && value.key.byteLength === 0;\n}\nfunction isStoreChangeSet(value: unknown): value is StoreChangeSet {\n return (\n isRecord(value) &&\n typeof value.store === 'string' &&\n Array.isArray(value.changes) &&\n value.changes.every(isDbChange)\n );\n}\nexport function isCommitAppliedEvent(value: unknown): value is CommitAppliedEvent {\n return (\n isRecord(value) &&\n value.type === 'commit_applied' &&\n typeof value.dbName === 'string' &&\n typeof value.txid === 'number' &&\n Array.isArray(value.stores) &&\n value.stores.every(isStoreChangeSet)\n );\n}\n","import { DatabaseClosedError } from './errors';\nimport { isCommitAppliedEvent } from './change-events';\nimport { assertPublicStoreName } from './indexing';\nimport type { DbChange, DbSubscriptionCallback, Unsubscribe } from './types';\ninterface SubscriptionEntry {\n active: boolean;\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\ninterface SubscriptionSpec {\n store: string | null;\n keyPrefix: Uint8Array | null;\n callback: DbSubscriptionCallback;\n}\ninterface PendingDelivery {\n entry: SubscriptionEntry;\n changes: DbChange[];\n}\nfunction cloneChanges(changes: readonly DbChange[]): DbChange[] {\n return changes.map((change) => ({\n key: change.key.slice(),\n kind: change.kind\n }));\n}\nfunction hasKeyPrefix(key: Uint8Array, prefix: Uint8Array): boolean {\n if (prefix.byteLength > key.byteLength) {\n return false;\n }\n for (let index = 0; index < prefix.byteLength; index += 1) {\n if (key[index] !== prefix[index]) {\n return false;\n }\n }\n return true;\n}\nfunction matchesPrefix(change: DbChange, prefix: Uint8Array): boolean {\n return change.kind === 'clear' || change.kind === 'drop' || hasKeyPrefix(change.key, prefix);\n}\nfunction includesStoreLevelChange(changes: readonly DbChange[]): boolean {\n for (let index = 0; index < changes.length; index += 1) {\n const kind = changes[index].kind;\n if (kind === 'clear' || kind === 'drop') {\n return true;\n }\n }\n return false;\n}\nfunction prefixBytesOverlap(left: Uint8Array, right: Uint8Array): boolean {\n const limit = Math.min(left.byteLength, right.byteLength);\n for (let index = 0; index < limit; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n return true;\n}\nfunction sharedChanges(changes: DbChange[], prefix: Uint8Array | null): DbChange[] | null {\n if (prefix === null) {\n return changes;\n }\n let selected: DbChange[] | null = null;\n for (let index = 0; index < changes.length; index += 1) {\n const change = changes[index];\n if (matchesPrefix(change, prefix)) {\n if (selected !== null) {\n selected.push(change);\n }\n continue;\n }\n if (selected === null) {\n selected = changes.slice(0, index);\n }\n }\n if (selected === null) {\n return changes.length === 0 ? null : changes;\n }\n return selected.length === 0 ? null : selected;\n}\nfunction viewsIntersect(\n leftPrefix: Uint8Array | null,\n rightPrefix: Uint8Array | null,\n hasStoreLevel: () => boolean\n): boolean {\n if (leftPrefix === null || rightPrefix === null) {\n return true;\n }\n if (prefixBytesOverlap(leftPrefix, rightPrefix)) {\n return true;\n }\n return hasStoreLevel();\n}\nfunction laterViewIntersects(\n deliveries: readonly PendingDelivery[],\n index: number,\n hasStoreLevel: () => boolean\n): boolean {\n const prefix = deliveries[index].entry.keyPrefix;\n for (let later = index + 1; later < deliveries.length; later += 1) {\n if (viewsIntersect(prefix, deliveries[later].entry.keyPrefix, hasStoreLevel)) {\n return true;\n }\n }\n return false;\n}\nfunction normalizeSubscriptionSpec(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n): SubscriptionSpec {\n if (typeof arg1 === 'function') {\n if (arg2 !== undefined || arg3 !== undefined) {\n throw new TypeError('subscribe(callback) accepts exactly one callback argument');\n }\n return {\n store: null,\n keyPrefix: null,\n callback: arg1\n };\n }\n if (typeof arg1 !== 'string') {\n throw new TypeError('subscribe() storeName must be a string');\n }\n assertPublicStoreName(arg1);\n if (typeof arg2 === 'function') {\n if (arg3 !== undefined) {\n throw new TypeError('subscribe(storeName, callback) accepts exactly two arguments');\n }\n return {\n store: arg1,\n keyPrefix: null,\n callback: arg2\n };\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return {\n store: arg1,\n keyPrefix: arg2.slice(),\n callback: arg3\n };\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n}\nexport class SubscriptionHub {\n #dbName: string;\n #channelName: string;\n #channel: BroadcastChannel | null = null;\n #entries = new Set<SubscriptionEntry>();\n #closed = false;\n constructor(dbName: string, channelName = dbName) {\n this.#dbName = dbName;\n this.#channelName = channelName;\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (this.#closed) {\n throw new DatabaseClosedError();\n }\n const spec = normalizeSubscriptionSpec(arg1, arg2, arg3);\n const entry: SubscriptionEntry = {\n active: true,\n store: spec.store,\n keyPrefix: spec.keyPrefix,\n callback: spec.callback\n };\n this.#ensureChannel();\n this.#entries.add(entry);\n return () => {\n if (!entry.active) {\n return;\n }\n entry.active = false;\n this.#entries.delete(entry);\n if (this.#entries.size === 0) {\n this.#disposeChannel();\n }\n };\n }\n close(): void {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n for (const entry of this.#entries) {\n entry.active = false;\n }\n this.#entries.clear();\n this.#disposeChannel();\n }\n #ensureChannel() {\n if (this.#channel !== null || this.#closed) {\n return;\n }\n const channel = new BroadcastChannel(`db:${this.#channelName}:events`);\n channel.onmessage = (event) => {\n this.#handleMessage(event.data);\n };\n this.#channel = channel;\n }\n #disposeChannel() {\n this.#channel?.close();\n this.#channel = null;\n }\n #handleMessage(payload: unknown) {\n if (!isCommitAppliedEvent(payload) || payload.dbName !== this.#dbName || this.#entries.size === 0) {\n return;\n }\n const entries = Array.from(this.#entries);\n for (const storeEvent of payload.stores) {\n const deliveries: PendingDelivery[] = [];\n for (const entry of entries) {\n if (!entry.active) {\n continue;\n }\n if (entry.store !== null && entry.store !== storeEvent.store) {\n continue;\n }\n const changes = sharedChanges(storeEvent.changes, entry.keyPrefix);\n if (changes === null) {\n continue;\n }\n deliveries.push({ entry, changes });\n }\n // The last listener that shares a view reuses the commit's objects.\n // Earlier listeners get private copies before any callback runs.\n if (deliveries.length > 1) {\n let storeLevel: boolean | undefined;\n const hasStoreLevel = (): boolean => {\n if (storeLevel === undefined) {\n storeLevel = includesStoreLevelChange(storeEvent.changes);\n }\n return storeLevel;\n };\n for (let index = 0; index < deliveries.length; index += 1) {\n if (!laterViewIntersects(deliveries, index, hasStoreLevel)) {\n continue;\n }\n deliveries[index].changes = cloneChanges(deliveries[index].changes);\n }\n }\n for (const delivery of deliveries) {\n if (!delivery.entry.active) {\n continue;\n }\n try {\n delivery.entry.callback(storeEvent.store, delivery.changes, payload.txid);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n }\n }\n}\n","import {\n encodeCompoundKeyParts,\n encodeIndexScalar,\n jsonDecode,\n jsonEncode,\n splitCompoundKey,\n type CompoundKeyPart\n} from './codec';\nimport { TransactionClosedError } from './errors';\nimport type { BatchOp, CreateStoreOptions, DB, PutOptions, Range, Transaction, TxMode } from './types';\n\nexport interface RecordCodec<T> {\n encode(value: T): Uint8Array;\n decode(bytes: Uint8Array): T;\n}\n\nexport interface RecordCodecs<K, V> {\n key: RecordCodec<K>;\n value: RecordCodec<V>;\n}\n\nexport interface RecordRange<K> {\n gt?: K;\n gte?: K;\n lt?: K;\n lte?: K;\n reverse?: boolean;\n limit?: number;\n}\n\nexport interface RecordItem<K, V> {\n key: K;\n value: V;\n}\n\nexport type RecordBatchOp<K, V> = { kind: 'put'; key: K; value: V } | { kind: 'delete'; key: K };\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nconst fatalDecoder = new TextDecoder('utf-8', { fatal: true });\nconst NUMBER_MASK = (1n << 64n) - 1n;\nconst NUMBER_SIGN = 1n << 63n;\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n return left.length === right.length && left.every((byte, index) => byte === right[index]);\n}\n\nfunction decodeScalarKey(bytes: Uint8Array): CompoundKeyPart {\n if (!(bytes instanceof Uint8Array) || bytes.length === 0) {\n throw new TypeError('invalid scalar key encoding');\n }\n let value: CompoundKeyPart;\n switch (bytes[0]) {\n case 0x10:\n value = null;\n break;\n case 0x20:\n value = false;\n break;\n case 0x21:\n value = true;\n break;\n case 0x30: {\n if (bytes.length !== 9) {\n throw new TypeError('invalid number key encoding');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset + 1, 8);\n const ordered = view.getBigUint64(0, false);\n const bits = (ordered & NUMBER_SIGN) !== 0n ? ordered ^ NUMBER_SIGN : ordered ^ NUMBER_MASK;\n const buffer = new ArrayBuffer(8);\n const decoded = new DataView(buffer);\n decoded.setBigUint64(0, bits, false);\n value = decoded.getFloat64(0, false);\n break;\n }\n case 0x40:\n value = fatalDecoder.decode(bytes.subarray(1));\n break;\n case 0x50:\n value = bytes.slice(1);\n break;\n default:\n throw new TypeError('invalid scalar key type');\n }\n if (!sameBytes(encodeIndexScalar(value), bytes)) {\n throw new TypeError('noncanonical scalar key encoding');\n }\n return value;\n}\n\nexport const scalarKeyCodec: RecordCodec<CompoundKeyPart> = Object.freeze({\n encode: encodeIndexScalar,\n decode: decodeScalarKey\n});\n\nfunction typedKeyCodec<T extends CompoundKeyPart>(\n type: string,\n accepts: (value: CompoundKeyPart) => value is T\n): RecordCodec<T> {\n function check(value: CompoundKeyPart): T {\n if (!accepts(value)) {\n throw new TypeError(`key must be ${type}`);\n }\n return value;\n }\n return Object.freeze({\n encode(value: T): Uint8Array {\n return encodeIndexScalar(check(value));\n },\n decode(bytes: Uint8Array): T {\n return check(decodeScalarKey(bytes));\n }\n });\n}\n\nexport const keyCodecs = Object.freeze({\n string: typedKeyCodec('a string', (value): value is string => typeof value === 'string'),\n number: typedKeyCodec('a finite number', (value): value is number => typeof value === 'number'),\n boolean: typedKeyCodec('a boolean', (value): value is boolean => typeof value === 'boolean'),\n null: typedKeyCodec('null', (value): value is null => value === null),\n bytes: typedKeyCodec('Uint8Array', (value): value is Uint8Array => value instanceof Uint8Array)\n});\n\nexport function compoundKeyCodec<T extends readonly CompoundKeyPart[]>(\n ...parts: { [I in keyof T]: RecordCodec<T[I]> }\n): RecordCodec<T> {\n return Object.freeze({\n encode(value: T): Uint8Array {\n if (!Array.isArray(value) || value.length !== parts.length) {\n throw new TypeError(`compound key must contain ${parts.length} parts`);\n }\n return encodeCompoundKeyParts(parts.map((codec, index) => codec.encode(value[index] as CompoundKeyPart)));\n },\n decode(bytes: Uint8Array): T {\n const encoded = splitCompoundKey(bytes);\n if (encoded.length !== parts.length) {\n throw new TypeError(`compound key must contain ${parts.length} parts`);\n }\n return parts.map((codec, index) => codec.decode(encoded[index])) as unknown as T;\n }\n });\n}\n\nfunction assertJsonValue(value: unknown): asserts value is JsonValue {\n const pending: Array<{ value: unknown; leave?: boolean }> = [{ value }];\n const active = new Set<object>();\n while (pending.length > 0) {\n const entry = pending.pop() as { value: unknown; leave?: boolean };\n const current = entry.value;\n if (entry.leave) {\n active.delete(current as object);\n continue;\n }\n if (current === null || typeof current === 'string' || typeof current === 'boolean') {\n continue;\n }\n if (typeof current === 'number' && Number.isFinite(current) && !Object.is(current, -0)) {\n continue;\n }\n if (typeof current !== 'object' || active.has(current)) {\n throw new TypeError('record must contain JSON values without cycles, nonfinite numbers or negative zero');\n }\n const array = Array.isArray(current);\n if (Object.getPrototypeOf(current) !== (array ? Array.prototype : Object.prototype)) {\n throw new TypeError('record objects must be plain objects or arrays');\n }\n active.add(current);\n pending.push({ value: current, leave: true });\n const keys = Reflect.ownKeys(current);\n if (array && keys.length !== current.length + 1) {\n throw new TypeError('record arrays must be dense and have no extra properties');\n }\n for (const key of keys) {\n if (array && key === 'length') {\n continue;\n }\n if (typeof key !== 'string') {\n throw new TypeError('record properties must have string keys');\n }\n if (array && (!/^(?:0|[1-9]\\d*)$/.test(key) || Number(key) >= current.length)) {\n throw new TypeError('record arrays must have no extra properties');\n }\n const descriptor = Object.getOwnPropertyDescriptor(current, key);\n if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {\n throw new TypeError('record properties must be enumerable data properties');\n }\n pending.push({ value: descriptor.value as unknown });\n }\n }\n}\n\n/** A type guard checks the application schema. Without one, only the JSON domain is checked. */\nexport function jsonRecordCodec<T = JsonValue>(validate?: (value: unknown) => value is T): RecordCodec<T> {\n function check(value: unknown): T {\n assertJsonValue(value);\n if (validate) {\n if (!validate(value)) {\n throw new TypeError('record does not match its schema');\n }\n assertJsonValue(value);\n }\n return value as T;\n }\n return Object.freeze({\n encode(value: T): Uint8Array {\n return jsonEncode(check(value));\n },\n decode(bytes: Uint8Array): T {\n return check(jsonDecode<unknown>(bytes));\n }\n });\n}\n\nfunction encodeRange<K>(codec: RecordCodec<K>, range: RecordRange<K>): Range {\n const encoded: Range = {};\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n if (Object.hasOwn(range, bound)) {\n encoded[bound] = codec.encode(range[bound] as K);\n }\n }\n if (range.reverse !== undefined) {\n encoded.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n encoded.limit = range.limit;\n }\n return encoded;\n}\n\nexport async function withRecordTransaction<R>(\n db: DB,\n mode: TxMode,\n action: (transaction: Transaction) => Promise<R> | R\n): Promise<R> {\n const transaction = await db.begin(mode);\n let result: R;\n try {\n result = await action(transaction);\n } catch (error) {\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n if (!(rollbackError instanceof TransactionClosedError)) {\n throw new AggregateError([error, rollbackError], 'record transaction and rollback failed', {\n cause: rollbackError\n });\n }\n }\n throw error;\n }\n // SDK completion methods close the transaction even when they fail.\n if (mode === 'readwrite') {\n await transaction.commit();\n } else {\n await transaction.rollback();\n }\n return result;\n}\n\nfunction useTransaction<R>(\n source: DB | Transaction,\n mode: TxMode,\n action: (transaction: Transaction) => Promise<R>\n): Promise<R> {\n return 'begin' in source ? withRecordTransaction(source, mode, action) : action(source);\n}\n\nexport class RecordIndex<I, K, V> {\n readonly name: string;\n #source: DB | Transaction;\n #store: string;\n #indexKey: RecordCodec<I>;\n #codecs: RecordCodecs<K, V>;\n\n constructor(\n source: DB | Transaction,\n store: string,\n name: string,\n indexKey: RecordCodec<I>,\n codecs: RecordCodecs<K, V>\n ) {\n this.#source = source;\n this.#store = store;\n this.name = name;\n this.#indexKey = indexKey;\n this.#codecs = codecs;\n }\n\n async get(key: I): Promise<V | null> {\n const encoded = this.#indexKey.encode(key);\n return useTransaction(this.#source, 'readonly', async (transaction) => {\n const value = await transaction.getByIndex(this.#store, this.name, encoded);\n return value === null ? null : this.#codecs.value.decode(value);\n });\n }\n\n async scan(range: RecordRange<I> = {}): Promise<Array<RecordItem<K, V>>> {\n const encoded = encodeRange(this.#indexKey, range);\n return useTransaction(this.#source, 'readonly', async (transaction) => {\n const rows: Array<RecordItem<K, V>> = [];\n for await (const [key, value] of transaction.scanByIndex(this.#store, this.name, encoded)) {\n rows.push({ key: this.#codecs.key.decode(key), value: this.#codecs.value.decode(value) });\n }\n return rows;\n });\n }\n}\n\nexport class RecordStore<K, V> {\n readonly name: string;\n #source: DB | Transaction;\n #codecs: RecordCodecs<K, V>;\n\n constructor(source: DB | Transaction, name: string, codecs: RecordCodecs<K, V>) {\n this.#source = source;\n this.name = name;\n this.#codecs = codecs;\n }\n\n async get(key: K): Promise<V | null> {\n const value = await this.#source.get(this.name, this.#codecs.key.encode(key));\n return value === null ? null : this.#codecs.value.decode(value);\n }\n\n async getMany(keys: readonly K[]): Promise<Array<V | null>> {\n const values = await this.#source.getMany(\n this.name,\n keys.map((key) => this.#codecs.key.encode(key))\n );\n return values.map((value) => (value === null ? null : this.#codecs.value.decode(value)));\n }\n\n async has(key: K): Promise<boolean> {\n return this.#source.has(this.name, this.#codecs.key.encode(key));\n }\n\n async put(key: K, value: V, options?: PutOptions): Promise<void> {\n await this.#source.put(this.name, this.#codecs.key.encode(key), this.#codecs.value.encode(value), options);\n }\n\n async putMany(entries: ReadonlyArray<readonly [K, V]>, options?: PutOptions): Promise<void> {\n const encoded = entries.map(([key, value]): [Uint8Array, Uint8Array] => [\n this.#codecs.key.encode(key),\n this.#codecs.value.encode(value)\n ]);\n await useTransaction(this.#source, 'readwrite', (transaction) =>\n transaction.putMany(this.name, encoded, options)\n );\n }\n\n async delete(key: K): Promise<boolean> {\n return this.#source.delete(this.name, this.#codecs.key.encode(key));\n }\n\n async deleteMany(keys: readonly K[]): Promise<void> {\n const encoded = keys.map((key) => this.#codecs.key.encode(key));\n await useTransaction(this.#source, 'readwrite', (transaction) => transaction.deleteMany(this.name, encoded));\n }\n\n async applyBatch(operations: ReadonlyArray<RecordBatchOp<K, V>>): Promise<void> {\n const encoded = operations.map((operation): BatchOp => {\n const kind = (operation as { kind: unknown }).kind;\n if (kind !== 'put' && kind !== 'delete') {\n throw new TypeError('record batch operation must be put or delete');\n }\n const key = this.#codecs.key.encode(operation.key);\n if (operation.kind === 'delete') {\n return { kind: 'delete', key };\n }\n return { kind: 'put', key, value: this.#codecs.value.encode(operation.value) };\n });\n await useTransaction(this.#source, 'readwrite', (transaction) => transaction.applyBatch(this.name, encoded));\n }\n\n async scan(range: RecordRange<K> = {}): Promise<Array<RecordItem<K, V>>> {\n const rows = await this.#source.scan(this.name, encodeRange(this.#codecs.key, range));\n return rows.map(({ key, value }) => ({\n key: this.#codecs.key.decode(key),\n value: this.#codecs.value.decode(value)\n }));\n }\n\n async clear(): Promise<void> {\n await this.#source.clearStore(this.name);\n }\n\n index<I>(name: string, key: RecordCodec<I>): RecordIndex<I, K, V> {\n return new RecordIndex(this.#source, this.name, name, key, this.#codecs);\n }\n\n transaction<R>(\n mode: TxMode,\n action: (store: RecordStore<K, V>, transaction: Transaction) => Promise<R> | R\n ): Promise<R> {\n if (!('begin' in this.#source)) {\n return Promise.reject(new TypeError('record store already belongs to a transaction'));\n }\n return withRecordTransaction(this.#source, mode, (transaction) =>\n action(new RecordStore(transaction, this.name, this.#codecs), transaction)\n );\n }\n}\n\n/** Bind codecs to an existing store. The database still enforces store existence. */\nexport function openRecordStore<K, V>(\n source: DB | Transaction,\n name: string,\n codecs: RecordCodecs<K, V>\n): RecordStore<K, V> {\n return new RecordStore(source, name, codecs);\n}\n\nexport async function createRecordStore<K, V>(\n source: DB | Transaction,\n name: string,\n codecs: RecordCodecs<K, V>,\n options?: CreateStoreOptions\n): Promise<RecordStore<K, V>> {\n await source.createStore(name, options);\n return openRecordStore(source, name, codecs);\n}\n","export const SQL_INTEGER_MIN = -(1n << 63n);\nexport const SQL_INTEGER_MAX = (1n << 63n) - 1n;\n\nexport type SqlValue = null | boolean | number | bigint | string | Uint8Array;\nexport type SqlColumnType = 'INTEGER' | 'REAL' | 'TEXT' | 'BOOLEAN' | 'BLOB';\n\nexport interface SqlColumnDefinition {\n name: string;\n type: SqlColumnType;\n primaryKey: boolean;\n nullable: boolean;\n}\n\nexport type SqlValueExpression = { kind: 'literal'; value: SqlValue } | { kind: 'parameter'; index: number };\nexport type SqlComparisonOperator = '=' | '!=' | '<' | '<=' | '>' | '>=';\nexport type SqlExpression =\n | { kind: 'comparison'; column: string; operator: SqlComparisonOperator; value: SqlValueExpression }\n | { kind: 'isNull'; column: string; negated: boolean }\n | { kind: 'and' | 'or'; left: SqlExpression; right: SqlExpression };\n\nexport interface SqlOrderBy {\n column: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface SqlCreateTableStatement {\n kind: 'createTable';\n table: string;\n columns: SqlColumnDefinition[];\n ifNotExists: boolean;\n}\n\nexport interface SqlDropTableStatement {\n kind: 'dropTable';\n table: string;\n ifExists: boolean;\n}\n\nexport interface SqlInsertStatement {\n kind: 'insert';\n table: string;\n columns: string[] | null;\n rows: SqlValueExpression[][];\n}\n\nexport interface SqlSelectStatement {\n kind: 'select';\n table: string;\n columns: string[] | null;\n where: SqlExpression | null;\n orderBy: SqlOrderBy[];\n limit: SqlValueExpression | null;\n offset: SqlValueExpression | null;\n}\n\nexport interface SqlUpdateStatement {\n kind: 'update';\n table: string;\n assignments: { column: string; value: SqlValueExpression }[];\n where: SqlExpression | null;\n}\n\nexport interface SqlDeleteStatement {\n kind: 'delete';\n table: string;\n where: SqlExpression | null;\n}\n\nexport type SqlStatement =\n | SqlCreateTableStatement\n | SqlDropTableStatement\n | SqlInsertStatement\n | SqlSelectStatement\n | SqlUpdateStatement\n | SqlDeleteStatement;\n\nexport interface SqlParseResult {\n statement: SqlStatement;\n parameterCount: number;\n}\n","import {\n SQL_INTEGER_MAX,\n SQL_INTEGER_MIN,\n type SqlColumnDefinition,\n type SqlColumnType,\n type SqlComparisonOperator,\n type SqlExpression,\n type SqlOrderBy,\n type SqlParseResult,\n type SqlStatement,\n type SqlValue,\n type SqlValueExpression\n} from './sql-types';\n\nconst MAX_SQL_LENGTH = 1_048_576;\nconst MAX_TOKENS = 16_384;\nconst MAX_NESTING = 64;\nconst MAX_PREDICATES = 128;\nconst MAX_IDENTIFIER_LENGTH = 128;\nconst MAX_NUMBER_LENGTH = 1_024;\nconst FORBIDDEN_IDENTIFIERS = new Set(['__proto__', 'prototype', 'constructor']);\nconst COLUMN_TYPES = new Set<SqlColumnType>(['INTEGER', 'REAL', 'TEXT', 'BOOLEAN', 'BLOB']);\nconst KEYWORDS = new Set([\n 'CREATE',\n 'TABLE',\n 'IF',\n 'NOT',\n 'EXISTS',\n 'DROP',\n 'INSERT',\n 'INTO',\n 'VALUES',\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'ORDER',\n 'BY',\n 'ASC',\n 'DESC',\n 'LIMIT',\n 'OFFSET',\n 'UPDATE',\n 'SET',\n 'DELETE',\n 'PRIMARY',\n 'KEY',\n 'NULL',\n 'TRUE',\n 'FALSE',\n 'IS',\n 'AND',\n 'OR',\n 'JOIN',\n 'LEFT',\n 'RIGHT',\n 'INNER',\n 'OUTER',\n 'CROSS',\n 'ON',\n 'AS',\n 'DISTINCT',\n 'GROUP',\n 'HAVING',\n 'UNION',\n 'ALL',\n 'IN',\n 'LIKE',\n 'BETWEEN',\n 'DEFAULT',\n 'UNIQUE',\n 'CHECK',\n 'REFERENCES',\n 'CONSTRAINT',\n 'FOREIGN',\n 'AUTOINCREMENT',\n 'RETURNING',\n 'CONFLICT',\n ...COLUMN_TYPES\n]);\n\ntype TokenKind = 'word' | 'identifier' | 'string' | 'number' | 'symbol' | 'parameter' | 'end';\ninterface Token {\n kind: TokenKind;\n text: string;\n position: number;\n}\n\nexport class SqlSyntaxError extends SyntaxError {\n readonly position: number;\n\n constructor(message: string, position: number) {\n super(`${message} at position ${position}`);\n this.name = 'SqlSyntaxError';\n this.position = position;\n }\n}\n\nexport function parseSql(sql: string): SqlParseResult {\n if (typeof sql !== 'string') {\n throw new TypeError('SQL must be a string');\n }\n if (sql.length > MAX_SQL_LENGTH) {\n throw new SqlSyntaxError(`SQL exceeds ${MAX_SQL_LENGTH} characters`, MAX_SQL_LENGTH);\n }\n return new Parser(tokenize(sql)).parse();\n}\n\nexport function bindSqlParameters(parsed: SqlParseResult, parameters: readonly unknown[] = []): SqlValue[] {\n if (!Array.isArray(parameters)) {\n throw new TypeError('SQL parameters must be an array');\n }\n if (parameters.length !== parsed.parameterCount) {\n throw new RangeError(`SQL expects ${parsed.parameterCount} parameters; received ${parameters.length}`);\n }\n return Array.from<unknown, SqlValue>(parameters, (value, index) => {\n if (value === null || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n if (\n !Number.isFinite(value) ||\n (Number.isInteger(value) && !Number.isSafeInteger(value) && fitsSigned64(value))\n ) {\n throw new RangeError(\n `SQL parameter ${index + 1} must be finite; use bigint for integers outside the safe range`\n );\n }\n return value;\n }\n if (typeof value === 'bigint') {\n if (value < SQL_INTEGER_MIN || value > SQL_INTEGER_MAX) {\n throw new RangeError(`SQL parameter ${index + 1} exceeds the signed 64-bit integer range`);\n }\n return value;\n }\n if (typeof value === 'string') {\n if (!hasValidUnicode(value)) {\n throw new TypeError(`SQL parameter ${index + 1} must contain valid Unicode scalar values`);\n }\n return value;\n }\n if (value instanceof Uint8Array) {\n return Uint8Array.from(value);\n }\n throw new TypeError(`SQL parameter ${index + 1} must be null, boolean, number, bigint, string, or Uint8Array`);\n });\n}\n\nexport function resolveSqlValue(expression: SqlValueExpression, parameters: readonly SqlValue[]): SqlValue {\n if (expression.kind === 'literal') {\n return expression.value;\n }\n if (!Number.isSafeInteger(expression.index) || expression.index < 0 || expression.index >= parameters.length) {\n throw new RangeError(`SQL parameter ${expression.index + 1} is missing`);\n }\n const value = parameters.at(expression.index);\n if (value === undefined) {\n throw new RangeError(`SQL parameter ${expression.index + 1} is missing`);\n }\n return value;\n}\n\nclass Parser {\n #tokens: Token[];\n #index = 0;\n #parameterCount = 0;\n #nesting = 0;\n #predicates = 0;\n\n constructor(tokens: Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): SqlParseResult {\n const statement = this.#parseStatement();\n this.#acceptSymbol(';');\n if (this.#current().kind !== 'end') {\n throw this.#error('Unexpected or unsupported SQL syntax');\n }\n return { statement, parameterCount: this.#parameterCount };\n }\n\n #parseStatement(): SqlStatement {\n if (this.#acceptKeyword('CREATE')) {\n return this.#createTable();\n }\n if (this.#acceptKeyword('DROP')) {\n return this.#dropTable();\n }\n if (this.#acceptKeyword('INSERT')) {\n return this.#insert();\n }\n if (this.#acceptKeyword('SELECT')) {\n return this.#select();\n }\n if (this.#acceptKeyword('UPDATE')) {\n return this.#update();\n }\n if (this.#acceptKeyword('DELETE')) {\n return this.#delete();\n }\n throw this.#error('Expected CREATE TABLE, DROP TABLE, INSERT, SELECT, UPDATE, or DELETE');\n }\n\n #createTable(): SqlStatement {\n this.#expectKeyword('TABLE');\n const ifNotExists = this.#acceptKeyword('IF');\n if (ifNotExists) {\n this.#expectKeyword('NOT');\n this.#expectKeyword('EXISTS');\n }\n const table = this.#identifier();\n this.#expectSymbol('(');\n const columns: SqlColumnDefinition[] = [];\n const names = new Set<string>();\n let primaryKeyCount = 0;\n do {\n const name = this.#identifier();\n this.#assertUnique(names, name, 'column');\n const typeToken = this.#current();\n const type = typeToken.text.toUpperCase() as SqlColumnType;\n if (typeToken.kind !== 'word' || !COLUMN_TYPES.has(type)) {\n throw this.#error('Expected INTEGER, REAL, TEXT, BOOLEAN, or BLOB column type');\n }\n this.#index += 1;\n let primaryKey = false;\n let nullable = true;\n let nullabilitySpecified = false;\n for (;;) {\n if (this.#acceptKeyword('PRIMARY')) {\n if (primaryKey) {\n throw this.#error('Duplicate PRIMARY KEY constraint');\n }\n this.#expectKeyword('KEY');\n primaryKey = true;\n primaryKeyCount += 1;\n if (primaryKeyCount > 1) {\n throw this.#error('Only one inline PRIMARY KEY is supported');\n }\n } else if (this.#acceptKeyword('NOT')) {\n this.#expectKeyword('NULL');\n if (nullabilitySpecified) {\n throw this.#error('Duplicate nullability constraint');\n }\n nullable = false;\n nullabilitySpecified = true;\n } else if (this.#acceptKeyword('NULL')) {\n if (nullabilitySpecified) {\n throw this.#error('Duplicate nullability constraint');\n }\n nullable = true;\n nullabilitySpecified = true;\n } else {\n break;\n }\n }\n if (primaryKey && nullable && nullabilitySpecified) {\n throw this.#error('PRIMARY KEY cannot be declared NULL');\n }\n columns.push({ name, type, primaryKey, nullable: primaryKey ? false : nullable });\n } while (this.#acceptSymbol(','));\n this.#expectSymbol(')');\n return { kind: 'createTable', table, columns, ifNotExists };\n }\n\n #dropTable(): SqlStatement {\n this.#expectKeyword('TABLE');\n const ifExists = this.#acceptKeyword('IF');\n if (ifExists) {\n this.#expectKeyword('EXISTS');\n }\n return { kind: 'dropTable', table: this.#identifier(), ifExists };\n }\n\n #insert(): SqlStatement {\n this.#expectKeyword('INTO');\n const table = this.#identifier();\n let columns: string[] | null = null;\n if (this.#acceptSymbol('(')) {\n columns = this.#identifierList();\n this.#expectSymbol(')');\n }\n this.#expectKeyword('VALUES');\n const rows: SqlValueExpression[][] = [];\n let width = columns?.length;\n do {\n this.#expectSymbol('(');\n const row = [this.#value()];\n while (this.#acceptSymbol(',')) {\n row.push(this.#value());\n }\n this.#expectSymbol(')');\n width ??= row.length;\n if (row.length !== width) {\n throw this.#error('INSERT rows must match the column count');\n }\n rows.push(row);\n } while (this.#acceptSymbol(','));\n return { kind: 'insert', table, columns, rows };\n }\n\n #select(): SqlStatement {\n const columns = this.#acceptSymbol('*') ? null : this.#identifierList();\n this.#expectKeyword('FROM');\n const table = this.#identifier();\n const where = this.#where();\n const orderBy: SqlOrderBy[] = [];\n if (this.#acceptKeyword('ORDER')) {\n this.#expectKeyword('BY');\n const names = new Set<string>();\n do {\n const column = this.#identifier();\n this.#assertUnique(names, column, 'ORDER BY column');\n const direction = this.#acceptKeyword('DESC') ? 'desc' : 'asc';\n if (direction === 'asc') {\n this.#acceptKeyword('ASC');\n }\n orderBy.push({ column, direction });\n } while (this.#acceptSymbol(','));\n }\n let limit: SqlValueExpression | null = null;\n let offset: SqlValueExpression | null = null;\n if (this.#acceptKeyword('LIMIT')) {\n limit = this.#rowCount('LIMIT');\n if (this.#acceptKeyword('OFFSET')) {\n offset = this.#rowCount('OFFSET');\n }\n }\n return { kind: 'select', table, columns, where, orderBy, limit, offset };\n }\n\n #update(): SqlStatement {\n const table = this.#identifier();\n this.#expectKeyword('SET');\n const assignments: { column: string; value: SqlValueExpression }[] = [];\n const names = new Set<string>();\n do {\n const column = this.#identifier();\n this.#assertUnique(names, column, 'assignment');\n this.#expectSymbol('=');\n assignments.push({ column, value: this.#value() });\n } while (this.#acceptSymbol(','));\n return { kind: 'update', table, assignments, where: this.#where() };\n }\n\n #delete(): SqlStatement {\n this.#expectKeyword('FROM');\n return { kind: 'delete', table: this.#identifier(), where: this.#where() };\n }\n\n #where(): SqlExpression | null {\n return this.#acceptKeyword('WHERE') ? this.#or() : null;\n }\n\n #or(): SqlExpression {\n let expression = this.#and();\n while (this.#acceptKeyword('OR')) {\n expression = { kind: 'or', left: expression, right: this.#and() };\n }\n return expression;\n }\n\n #and(): SqlExpression {\n let expression = this.#predicate();\n while (this.#acceptKeyword('AND')) {\n expression = { kind: 'and', left: expression, right: this.#predicate() };\n }\n return expression;\n }\n\n #predicate(): SqlExpression {\n if (this.#acceptSymbol('(')) {\n this.#nesting += 1;\n if (this.#nesting > MAX_NESTING) {\n throw this.#error(`WHERE nesting exceeds ${MAX_NESTING}`);\n }\n const expression = this.#or();\n this.#expectSymbol(')');\n this.#nesting -= 1;\n return expression;\n }\n this.#predicates += 1;\n if (this.#predicates > MAX_PREDICATES) {\n throw this.#error(`WHERE predicates exceed ${MAX_PREDICATES}`);\n }\n const column = this.#identifier();\n if (this.#acceptKeyword('IS')) {\n const negated = this.#acceptKeyword('NOT');\n this.#expectKeyword('NULL');\n return { kind: 'isNull', column, negated };\n }\n const token = this.#current();\n if (token.kind !== 'symbol' || !['=', '!=', '<>', '<', '<=', '>', '>='].includes(token.text)) {\n throw this.#error('Expected a comparison operator or IS [NOT] NULL');\n }\n this.#index += 1;\n const operator = (token.text === '<>' ? '!=' : token.text) as SqlComparisonOperator;\n return { kind: 'comparison', column, operator, value: this.#value() };\n }\n\n #rowCount(clause: string): SqlValueExpression {\n const value = this.#value();\n if (\n value.kind === 'literal' &&\n (typeof value.value !== 'number' || !Number.isSafeInteger(value.value) || value.value < 0)\n ) {\n throw this.#error(`${clause} must be a non-negative safe integer or parameter`);\n }\n return value;\n }\n\n #value(): SqlValueExpression {\n const token = this.#current();\n if (token.kind === 'parameter') {\n this.#index += 1;\n return { kind: 'parameter', index: this.#parameterCount++ };\n }\n if (token.kind === 'string') {\n this.#index += 1;\n return { kind: 'literal', value: token.text };\n }\n if (this.#acceptKeyword('NULL')) {\n return { kind: 'literal', value: null };\n }\n if (this.#acceptKeyword('TRUE')) {\n return { kind: 'literal', value: true };\n }\n if (this.#acceptKeyword('FALSE')) {\n return { kind: 'literal', value: false };\n }\n const sign = this.#acceptSymbol('-') ? '-' : this.#acceptSymbol('+') ? '+' : '';\n const number = this.#current();\n if (number.kind === 'number') {\n this.#index += 1;\n return { kind: 'literal', value: parseNumber(sign + number.text, token.position) };\n }\n throw this.#error('Expected a scalar literal or positional ? parameter');\n }\n\n #identifierList(): string[] {\n const names = new Set<string>();\n const columns: string[] = [];\n do {\n const name = this.#identifier();\n this.#assertUnique(names, name, 'column');\n columns.push(name);\n } while (this.#acceptSymbol(','));\n return columns;\n }\n\n #identifier(): string {\n const token = this.#current();\n if (token.kind !== 'identifier' && (token.kind !== 'word' || KEYWORDS.has(token.text.toUpperCase()))) {\n throw this.#error('Expected an identifier; use double quotes for keywords');\n }\n if (\n token.text.length === 0 ||\n token.text.length > MAX_IDENTIFIER_LENGTH ||\n hasControlCharacters(token.text) ||\n FORBIDDEN_IDENTIFIERS.has(token.text.toLowerCase()) ||\n !hasValidUnicode(token.text)\n ) {\n throw this.#error('Invalid or reserved identifier');\n }\n this.#index += 1;\n return token.text;\n }\n\n #assertUnique(names: Set<string>, name: string, label: string): void {\n if (names.has(name)) {\n throw this.#error(`Duplicate ${label}: ${name}`);\n }\n names.add(name);\n }\n\n #current(): Token {\n return this.#tokens[this.#index];\n }\n\n #acceptKeyword(keyword: string): boolean {\n const token = this.#current();\n if (token.kind !== 'word' || token.text.toUpperCase() !== keyword) {\n return false;\n }\n this.#index += 1;\n return true;\n }\n\n #expectKeyword(keyword: string): void {\n if (!this.#acceptKeyword(keyword)) {\n throw this.#error(`Expected ${keyword}`);\n }\n }\n\n #acceptSymbol(symbol: string): boolean {\n const token = this.#current();\n if (token.kind !== 'symbol' || token.text !== symbol) {\n return false;\n }\n this.#index += 1;\n return true;\n }\n\n #expectSymbol(symbol: string): void {\n if (!this.#acceptSymbol(symbol)) {\n throw this.#error(`Expected ${symbol}`);\n }\n }\n\n #error(message: string): SqlSyntaxError {\n return new SqlSyntaxError(message, this.#current().position);\n }\n}\n\nfunction tokenize(sql: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < sql.length) {\n const character = sql[index];\n if (/\\s/u.test(character)) {\n index += 1;\n continue;\n }\n if (sql.startsWith('--', index)) {\n index += 2;\n while (index < sql.length && sql[index] !== '\\n' && sql[index] !== '\\r') {\n index += 1;\n }\n continue;\n }\n if (sql.startsWith('/*', index)) {\n const end = sql.indexOf('*/', index + 2);\n if (end < 0) {\n throw new SqlSyntaxError('Unterminated block comment', index);\n }\n index = end + 2;\n continue;\n }\n if (tokens.length >= MAX_TOKENS) {\n throw new SqlSyntaxError(`SQL token count exceeds ${MAX_TOKENS}`, index);\n }\n const position = index;\n if (character === \"'\" || character === '\"') {\n const quote = character;\n let text = '';\n let closed = false;\n index += 1;\n while (index < sql.length) {\n if (sql[index] === quote) {\n if (sql[index + 1] === quote) {\n text += quote;\n index += 2;\n } else {\n index += 1;\n closed = true;\n break;\n }\n } else {\n text += sql[index++];\n }\n }\n if (!closed) {\n throw new SqlSyntaxError('Unterminated quoted token', position);\n }\n if (!hasValidUnicode(text)) {\n throw new SqlSyntaxError('Quoted token must contain valid Unicode scalar values', position);\n }\n tokens.push({ kind: quote === \"'\" ? 'string' : 'identifier', text, position });\n } else if (/[A-Za-z_]/u.test(character)) {\n index += 1;\n while (index < sql.length && /\\w/u.test(sql[index])) {\n index += 1;\n }\n tokens.push({ kind: 'word', text: sql.slice(position, index), position });\n } else if (/\\d/u.test(character) || (character === '.' && /\\d/u.test(sql[index + 1] ?? ''))) {\n index += 1;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n if (character !== '.' && sql[index] === '.') {\n index += 1;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n }\n if (sql[index] === 'e' || sql[index] === 'E') {\n index += 1;\n if (sql[index] === '+' || sql[index] === '-') {\n index += 1;\n }\n const exponentStart = index;\n while (index < sql.length && /\\d/u.test(sql[index])) {\n index += 1;\n }\n if (index === exponentStart) {\n throw new SqlSyntaxError('Invalid numeric exponent', position);\n }\n }\n const text = sql.slice(position, index);\n if (text.length > MAX_NUMBER_LENGTH) {\n throw new SqlSyntaxError(`Numeric literal exceeds ${MAX_NUMBER_LENGTH} characters`, position);\n }\n tokens.push({ kind: 'number', text, position });\n } else if (character === '?') {\n index += 1;\n tokens.push({ kind: 'parameter', text: character, position });\n } else {\n const pair = sql.slice(index, index + 2);\n if (['<=', '>=', '<>', '!='].includes(pair)) {\n index += 2;\n tokens.push({ kind: 'symbol', text: pair, position });\n } else if ('(),;*=<>+-'.includes(character)) {\n index += 1;\n tokens.push({ kind: 'symbol', text: character, position });\n } else {\n throw new SqlSyntaxError(`Unsupported SQL character: ${character}`, position);\n }\n }\n }\n tokens.push({ kind: 'end', text: '', position: sql.length });\n return tokens;\n}\n\nfunction fitsSigned64(value: number): boolean {\n if (!Number.isInteger(value)) {\n return false;\n }\n const integer = BigInt(value);\n return integer >= SQL_INTEGER_MIN && integer <= SQL_INTEGER_MAX;\n}\n\nfunction parseNumber(text: string, position: number): number | bigint {\n if (/^[+-]?\\d+$/u.test(text)) {\n const integer = BigInt(text);\n if (integer < SQL_INTEGER_MIN || integer > SQL_INTEGER_MAX) {\n throw new SqlSyntaxError('Integer literal exceeds the signed 64-bit range', position);\n }\n return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n const value = Number(text);\n // Magnitudes at or above 2^63 are finite REAL values and do not fit in INTEGER.\n if (!Number.isFinite(value) || (Number.isInteger(value) && !Number.isSafeInteger(value) && fitsSigned64(value))) {\n throw new SqlSyntaxError('REAL literal must be finite; use integer notation for large integers', position);\n }\n const [mantissa, exponentText = '0'] = text.toLowerCase().split('e');\n const digits = mantissa.replace(/[+.-]/gu, '');\n const nonzero = /[1-9]/u.test(digits);\n if (value === 0 && nonzero) {\n throw new SqlSyntaxError('REAL literal underflows to zero', position);\n }\n if (Number.isInteger(value) && nonzero) {\n const fractionLength = mantissa.includes('.') ? mantissa.length - mantissa.indexOf('.') - 1 : 0;\n const trailingZeros = digits.length - digits.replace(/0+$/u, '').length;\n if (Number(exponentText) - fractionLength + trailingZeros < 0) {\n throw new SqlSyntaxError('REAL literal loses its fractional part', position);\n }\n }\n return value;\n}\n\nfunction hasValidUnicode(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) as number;\n if (codePoint >= 0xd800 && codePoint <= 0xdfff) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) as number;\n if (codePoint < 0x20 || codePoint === 0x7f) {\n return true;\n }\n }\n return false;\n}\n","import { indexKey, jsonDecode, jsonEncode, u64Key, utf8Encode } from './codec';\nimport { ConstraintError, SerializationError, StoreNotFoundError } from './errors';\nimport { normalizeIndexDefinitions, serializeNormalizedIndexDefinitions, type NormalizedIndexDef } from './indexing';\nimport { bindSqlParameters, parseSql, resolveSqlValue } from './sql-parser';\nimport type {\n SqlColumnDefinition,\n SqlExpression,\n SqlOrderBy,\n SqlStatement,\n SqlValue,\n SqlValueExpression\n} from './sql-types';\nimport type { DB, IndexDef, Range, ScanItem, Transaction } from './types';\n\nconst CATALOG = '_moyodb_sql_catalog';\nconst OWNER_KEY = Uint8Array.of(0);\nconst OWNER = { format: 'moyodb.sql', version: 1 };\nconst TABLE_OWNER_KEY = Uint8Array.of(255);\nconst TABLE_OWNER_FIELD = '\\u0000moyodb.sql.table';\nconst INTEGER_MIN = -(1n << 63n);\nconst INTEGER_MAX = (1n << 63n) - 1n;\nconst ROW_ID_MAX = (1n << 64n) - 1n;\nconst COLUMN_TYPES = new Set(['INTEGER', 'REAL', 'TEXT', 'BOOLEAN', 'BLOB']);\n\nexport type SqlRow = Record<string, SqlValue>;\nexport interface SqlQueryPlan {\n table: string;\n access: 'primary-key-lookup' | 'primary-key-range' | 'index-lookup' | 'index-range' | 'table-scan';\n column?: string;\n index?: string;\n sort: 'none' | 'memory';\n reason: string;\n}\nexport interface SqlResult {\n rows: SqlRow[];\n rowsAffected: number;\n plan?: SqlQueryPlan;\n}\nexport interface SqlClientOptions {\n indexes?: IndexDef[];\n}\nexport interface SqlClient {\n execute(sql: string, parameters?: readonly unknown[]): Promise<SqlResult>;\n query(sql: string, parameters?: readonly unknown[]): Promise<SqlRow[]>;\n explain(sql: string, parameters?: readonly unknown[]): Promise<SqlQueryPlan>;\n}\nexport class SqlSchemaError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'SqlSchemaError';\n }\n}\nexport class SqlTypeError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = 'SqlTypeError';\n }\n}\ninterface TableSchema {\n version: 1;\n table: string;\n columns: SqlColumnDefinition[];\n nextRowId: string;\n}\ninterface StoredRow {\n key: Uint8Array;\n row: SqlRow;\n}\ninterface AccessPlan {\n public: SqlQueryPlan;\n key?: Uint8Array;\n range?: Range;\n empty?: boolean;\n}\ntype Comparison = Extract<SqlExpression, { kind: 'comparison' }>;\ntype Truth = boolean | null;\n\nexport function createSqlClient(db: DB, options: SqlClientOptions = {}): SqlClient {\n const expectedIndexes = options.indexes === undefined ? null : normalizeIndexDefinitions(options.indexes);\n const run = async (sql: string, parameters: readonly unknown[], explain: boolean): Promise<SqlResult> => {\n const parsed = parseSql(sql);\n const bound = bindSqlParameters(parsed, parameters);\n const statement = parsed.statement;\n if (explain && !isRowStatement(statement)) {\n throw new SqlSchemaError('EXPLAIN requires SELECT, UPDATE, or DELETE');\n }\n const tx = await db.begin(statement.kind === 'select' || explain ? 'readonly' : 'readwrite');\n let finished = false;\n try {\n const indexes = normalizeIndexDefinitions((await tx.listIndexes?.()) ?? []);\n if (\n expectedIndexes &&\n serializeNormalizedIndexDefinitions(expectedIndexes) !== serializeNormalizedIndexDefinitions(indexes)\n ) {\n throw new SqlSchemaError('SQL index definitions do not match the transaction catalog');\n }\n const result = await executeStatement(tx, statement, bound, indexes, explain);\n // Finalization closes the SDK transaction even when it fails.\n finished = true;\n if (tx.mode === 'readwrite') {\n await tx.commit();\n } else {\n await tx.rollback();\n }\n return result;\n } catch (error) {\n if (!finished) {\n try {\n await tx.rollback();\n } catch (rollbackError) {\n throw new AggregateError([error, rollbackError], 'SQL statement and rollback failed', {\n cause: rollbackError\n });\n }\n }\n throw error;\n }\n };\n return {\n execute: (sql, parameters = []) => run(sql, parameters, false),\n async query(sql, parameters = []) {\n if (parseSql(sql).statement.kind !== 'select') {\n throw new SqlSchemaError('query() requires SELECT');\n }\n return (await run(sql, parameters, false)).rows;\n },\n async explain(sql, parameters = []) {\n const result = await run(sql, parameters, true);\n if (!result.plan) {\n throw new SqlSchemaError('statement has no query plan');\n }\n return result.plan;\n }\n };\n}\n\nasync function executeStatement(\n tx: Transaction,\n statement: SqlStatement,\n parameters: SqlValue[],\n indexes: NormalizedIndexDef[],\n explain: boolean\n): Promise<SqlResult> {\n assertTableName(statement.table);\n const catalogExists = await readCatalog(tx);\n const schema = catalogExists ? await readSchema(tx, statement.table) : null;\n if (schema) await assertTableOwnership(tx, schema);\n if (statement.kind === 'createTable') {\n if (schema) {\n if (statement.ifNotExists) return { rows: [], rowsAffected: 0 };\n throw new SqlSchemaError(`table already exists: ${statement.table}`);\n }\n const created: TableSchema = {\n version: 1,\n table: statement.table,\n columns: statement.columns,\n nextRowId: '1'\n };\n validateSchema(created, statement.table);\n if (!catalogExists) {\n await tx.createStore(CATALOG);\n await tx.put(CATALOG, OWNER_KEY, jsonEncode(OWNER));\n }\n await tx.createStore(statement.table);\n await tx.put(statement.table, TABLE_OWNER_KEY, tableOwnerValue(created));\n await tx.put(CATALOG, schemaKey(statement.table), jsonEncode(created));\n return { rows: [], rowsAffected: 0 };\n }\n if (!schema) {\n if (statement.kind === 'dropTable' && statement.ifExists) return { rows: [], rowsAffected: 0 };\n throw new SqlSchemaError(`table does not exist: ${statement.table}`);\n }\n if (statement.kind === 'dropTable') {\n await tx.dropStore(statement.table);\n await tx.delete(CATALOG, schemaKey(statement.table));\n return { rows: [], rowsAffected: 0 };\n }\n if (statement.kind === 'insert') {\n return insertRows(tx, schema, statement, parameters);\n }\n validateWhere(schema, statement.where, parameters);\n if (statement.kind === 'select') {\n validateColumnList(schema, statement.columns);\n for (const order of statement.orderBy) getColumn(schema, order.column);\n }\n if (statement.kind === 'update') {\n validateColumnList(\n schema,\n statement.assignments.map((assignment) => assignment.column)\n );\n for (const assignment of statement.assignments) {\n normalizeValue(getColumn(schema, assignment.column), resolveSqlValue(assignment.value, parameters));\n }\n }\n const orderBy = statement.kind === 'select' ? statement.orderBy : [];\n const plan = planAccess(schema, statement.where, orderBy, parameters, indexes);\n const limit = statement.kind === 'select' ? resolveCount(statement.limit, parameters, 'LIMIT') : null;\n const offset = statement.kind === 'select' ? (resolveCount(statement.offset, parameters, 'OFFSET') ?? 0) : 0;\n if (explain) return { rows: [], rowsAffected: 0, plan: plan.public };\n const maxMatches =\n statement.kind === 'select' && plan.public.sort === 'none' && limit !== null\n ? Math.min(Number.MAX_SAFE_INTEGER, offset + limit)\n : undefined;\n const rows = limit === 0 ? [] : await readRows(tx, schema, plan, statement.where, parameters, maxMatches);\n if (statement.kind === 'select') {\n if (plan.public.sort === 'memory') rows.sort((left, right) => compareRows(left, right, orderBy));\n const selected = rows.slice(offset, limit === null ? undefined : offset + limit);\n return {\n rows: selected.map(({ row }) =>\n projectRow(row, statement.columns ?? schema.columns.map((column) => column.name))\n ),\n rowsAffected: 0,\n plan: plan.public\n };\n }\n if (statement.kind === 'delete') {\n await tx.deleteMany(\n schema.table,\n rows.map(({ key }) => key)\n );\n return { rows: [], rowsAffected: rows.length, plan: plan.public };\n }\n const updates = rows.map(({ key, row }) => {\n const updated = { ...row };\n for (const assignment of statement.assignments) {\n updated[assignment.column] = normalizeValue(\n getColumn(schema, assignment.column),\n resolveSqlValue(assignment.value, parameters)\n );\n }\n const primary = primaryColumn(schema);\n return { oldKey: key, key: primary ? primaryKey(primary, updated[primary.name]) : key, row: updated };\n });\n const destinations = new Set<string>();\n const oldKeys = new Set(rows.map(({ key }) => bytesIdentity(key)));\n for (const update of updates) {\n const identity = bytesIdentity(update.key);\n if (destinations.has(identity)) throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n destinations.add(identity);\n if (!oldKeys.has(identity) && (await tx.has(schema.table, update.key))) {\n throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n }\n }\n await tx.deleteMany(\n schema.table,\n updates.map(({ oldKey }) => oldKey)\n );\n for (const update of updates) await tx.put(schema.table, update.key, encodeRow(schema, update.row));\n return { rows: [], rowsAffected: updates.length, plan: plan.public };\n}\n\nasync function readCatalog(tx: Transaction): Promise<boolean> {\n let value: Uint8Array | null;\n try {\n value = await tx.get(CATALOG, OWNER_KEY);\n } catch (error) {\n if (error instanceof StoreNotFoundError || (error instanceof Error && error.name === 'StoreNotFoundError'))\n return false;\n throw error;\n }\n if (!value) throw new SqlSchemaError(`SQL catalog store is not owned by SQL: ${CATALOG}`);\n const owner: unknown = decodeJson(value);\n if (!isRecord(owner) || owner.format !== OWNER.format || owner.version !== OWNER.version) {\n throw new SqlSchemaError('invalid SQL catalog metadata');\n }\n return true;\n}\n\nasync function readSchema(tx: Transaction, table: string): Promise<TableSchema | null> {\n const value = await tx.get(CATALOG, schemaKey(table));\n if (!value) return null;\n const schema: unknown = decodeJson(value);\n validateSchema(schema, table);\n return schema;\n}\n\nasync function assertTableOwnership(tx: Transaction, schema: TableSchema): Promise<void> {\n let owner: Uint8Array | null;\n try {\n owner = await tx.get(schema.table, TABLE_OWNER_KEY);\n } catch (error) {\n if (error instanceof StoreNotFoundError || (error instanceof Error && error.name === 'StoreNotFoundError')) {\n throw new SqlSchemaError(`SQL table store is missing: ${schema.table}`, { cause: error });\n }\n throw error;\n }\n if (!owner || compareBytes(owner, tableOwnerValue(schema)) !== 0) {\n throw new SqlSchemaError(`SQL table ownership does not match its catalog: ${schema.table}`);\n }\n}\n\nfunction tableOwnerValue(schema: TableSchema): Uint8Array {\n return jsonEncode({\n [TABLE_OWNER_FIELD]: JSON.stringify({\n format: 'moyodb.sql.table',\n version: schema.version,\n table: schema.table,\n columns: schema.columns\n })\n });\n}\n\nfunction validateSchema(value: unknown, table: string): asserts value is TableSchema {\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n value.table !== table ||\n !Array.isArray(value.columns) ||\n !value.columns.length ||\n typeof value.nextRowId !== 'string' ||\n value.nextRowId.length > 20 ||\n !/^[1-9]\\d*$/u.test(value.nextRowId) ||\n BigInt(value.nextRowId) > ROW_ID_MAX + 1n\n ) {\n throw new SqlSchemaError(`invalid schema metadata for ${table}`);\n }\n const names = new Set<string>();\n let primaries = 0;\n for (const candidate of value.columns as unknown[]) {\n if (\n !isRecord(candidate) ||\n typeof candidate.name !== 'string' ||\n !candidate.name.length ||\n typeof candidate.type !== 'string' ||\n !COLUMN_TYPES.has(candidate.type) ||\n typeof candidate.primaryKey !== 'boolean' ||\n typeof candidate.nullable !== 'boolean' ||\n names.has(candidate.name) ||\n (candidate.primaryKey && candidate.nullable)\n ) {\n throw new SqlSchemaError(`invalid column metadata for ${table}`);\n }\n names.add(candidate.name);\n if (candidate.primaryKey) primaries += 1;\n }\n if (primaries > 1) throw new SqlSchemaError(`multiple primary keys in ${table}`);\n}\n\nasync function insertRows(\n tx: Transaction,\n schema: TableSchema,\n statement: Extract<SqlStatement, { kind: 'insert' }>,\n parameters: SqlValue[]\n): Promise<SqlResult> {\n const columns = statement.columns ?? schema.columns.map((column) => column.name);\n validateColumnList(schema, columns);\n const primary = primaryColumn(schema);\n let nextRowId = BigInt(schema.nextRowId);\n const entries: Array<[Uint8Array, Uint8Array]> = [];\n const keys = new Set<string>();\n for (const values of statement.rows) {\n if (values.length !== columns.length) throw new SqlSchemaError('INSERT column count does not match VALUES');\n const row = Object.create(null) as SqlRow;\n for (const column of schema.columns) row[column.name] = null;\n values.forEach((expression, index) => {\n row[columns[index]] = resolveSqlValue(expression, parameters);\n });\n for (const column of schema.columns) row[column.name] = normalizeValue(column, row[column.name]);\n if (!primary && nextRowId > ROW_ID_MAX)\n throw new ConstraintError(`row identifier space exhausted in ${schema.table}`);\n const key = primary ? primaryKey(primary, row[primary.name]) : u64Key(nextRowId++);\n const identity = bytesIdentity(key);\n if (keys.has(identity) || (await tx.has(schema.table, key)))\n throw new ConstraintError(`duplicate primary key in ${schema.table}`);\n keys.add(identity);\n entries.push([key, encodeRow(schema, row)]);\n }\n await tx.putMany(schema.table, entries);\n if (!primary) {\n schema.nextRowId = nextRowId.toString();\n await tx.put(CATALOG, schemaKey(schema.table), jsonEncode(schema));\n }\n return { rows: [], rowsAffected: entries.length };\n}\n\nfunction normalizeValue(column: SqlColumnDefinition, value: SqlValue): SqlValue {\n if (value === null) {\n if (!column.nullable) throw new ConstraintError(`column ${column.name} cannot be NULL`);\n return null;\n }\n switch (column.type) {\n case 'INTEGER': {\n if (typeof value !== 'bigint' && (typeof value !== 'number' || !Number.isSafeInteger(value))) break;\n const integer = typeof value === 'bigint' ? value : BigInt(value);\n if (integer < INTEGER_MIN || integer > INTEGER_MAX) break;\n return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n case 'REAL':\n if (typeof value === 'number' && Number.isFinite(value)) return Object.is(value, -0) ? 0 : value;\n if (typeof value === 'bigint') {\n const asNumber = Number(value);\n // Reject bigints Number would round. Exact powers of two above 2^53 stay finite REAL values.\n if (Number.isFinite(asNumber) && BigInt(asNumber) === value) return asNumber;\n }\n break;\n case 'TEXT':\n if (typeof value === 'string') {\n indexKey(value);\n return value;\n }\n break;\n case 'BOOLEAN':\n if (typeof value === 'boolean') return value;\n break;\n case 'BLOB':\n if (value instanceof Uint8Array) return value.slice();\n break;\n }\n throw new SqlTypeError(`column ${column.name} requires ${column.type}`);\n}\n\nfunction primaryKey(column: SqlColumnDefinition, value: SqlValue): Uint8Array {\n if (value === null) throw new ConstraintError(`primary key ${column.name} cannot be NULL`);\n if (column.type === 'INTEGER') return u64Key(BigInt(value as number | bigint) - INTEGER_MIN);\n if (typeof value === 'bigint') throw new SqlTypeError(`invalid primary key ${column.name}`);\n return indexKey(value);\n}\n\nfunction encodeRow(schema: TableSchema, row: SqlRow): Uint8Array {\n const stored = Object.create(null) as Record<string, unknown>;\n for (const column of schema.columns) stored[column.name] = storedValue(row[column.name]);\n return jsonEncode(stored);\n}\n\nfunction storedValue(value: SqlValue): null | boolean | number | string {\n // Keep native index fields scalar. The table schema restores integers and bytes.\n if (typeof value === 'bigint') return value.toString();\n if (value instanceof Uint8Array) return bytesIdentity(value);\n return value;\n}\n\nfunction decodeRow(schema: TableSchema, item: ScanItem): StoredRow {\n const stored: unknown = decodeJson(item.value);\n if (!isRecord(stored) || Object.keys(stored).length !== schema.columns.length)\n throw new SerializationError(`invalid SQL row in ${schema.table}`);\n const row = Object.create(null) as SqlRow;\n try {\n for (const column of schema.columns) {\n if (!Object.hasOwn(stored, column.name)) throw new Error('missing SQL column');\n let value = stored[column.name];\n if (column.type === 'INTEGER' && typeof value === 'string') {\n if (value.length > 20 || !/^-?(?:0|[1-9]\\d*)$/u.test(value)) throw new Error('invalid stored integer');\n value = BigInt(value);\n } else if (column.type === 'BLOB' && typeof value === 'string') {\n if (value.length % 2 || !/^[0-9a-f]*$/u.test(value)) throw new Error('invalid stored blob');\n value = Uint8Array.from(value.match(/.{2}/gu) ?? [], (byte) => Number.parseInt(byte, 16));\n }\n if (\n value !== null &&\n typeof value !== 'boolean' &&\n typeof value !== 'number' &&\n typeof value !== 'string' &&\n typeof value !== 'bigint' &&\n !(value instanceof Uint8Array)\n )\n throw new Error('invalid stored value');\n row[column.name] = normalizeValue(column, value);\n }\n const primary = primaryColumn(schema);\n if (primary && compareBytes(primaryKey(primary, row[primary.name]), item.key) !== 0)\n throw new Error('SQL row primary key differs from storage key');\n } catch (error) {\n throw new SerializationError(\n `invalid SQL row in ${schema.table}: ${error instanceof Error ? error.message : 'invalid value'}`\n );\n }\n return { key: item.key, row };\n}\n\nfunction validateWhere(schema: TableSchema, expression: SqlExpression | null, parameters: SqlValue[]): void {\n if (!expression) return;\n if ('left' in expression) {\n validateWhere(schema, expression.left, parameters);\n validateWhere(schema, expression.right, parameters);\n return;\n }\n const column = getColumn(schema, expression.column);\n if (expression.kind === 'comparison') {\n const value = resolveSqlValue(expression.value, parameters);\n if (value === null) return;\n if (column.type === 'INTEGER' || column.type === 'REAL') {\n if (typeof value === 'bigint' || (typeof value === 'number' && Number.isFinite(value))) return;\n throw new SqlTypeError(`comparison for ${column.name} requires a numeric value`);\n }\n normalizeValue({ ...column, nullable: true }, value);\n }\n}\n\nfunction evaluateWhere(row: SqlRow, expression: SqlExpression, parameters: SqlValue[]): Truth {\n if ('left' in expression) {\n const left = evaluateWhere(row, expression.left, parameters);\n const right = evaluateWhere(row, expression.right, parameters);\n if (expression.kind === 'and')\n return left === false || right === false ? false : left === null || right === null ? null : true;\n return left === true || right === true ? true : left === null || right === null ? null : false;\n }\n const left = row[expression.column];\n if (expression.kind === 'isNull') return expression.negated ? left !== null : left === null;\n const right = resolveSqlValue(expression.value, parameters);\n if (left === null || right === null) return null;\n const compared = compareValues(left, right);\n switch (expression.operator) {\n case '=':\n return compared === 0;\n case '!=':\n return compared !== 0;\n case '<':\n return compared < 0;\n case '<=':\n return compared <= 0;\n case '>':\n return compared > 0;\n case '>=':\n return compared >= 0;\n }\n}\n\nfunction planAccess(\n schema: TableSchema,\n where: SqlExpression | null,\n orderBy: SqlOrderBy[],\n parameters: SqlValue[],\n indexes: NormalizedIndexDef[]\n): AccessPlan {\n const comparisons = conjunctiveComparisons(where);\n const primary = primaryColumn(schema);\n const candidates: Array<{ column: SqlColumnDefinition; index?: NormalizedIndexDef }> = [];\n if (primary) candidates.push({ column: primary });\n for (const index of indexes) {\n // Native dotted paths address nested fields. SQL columns are flat properties.\n if (\n index.store === schema.table &&\n !index.compound &&\n index.keyPath.length === 1 &&\n !index.keyPath[0].includes('.')\n ) {\n const column = schema.columns.find((entry) => entry.name === index.keyPath[0]);\n if (column) candidates.push({ column, index });\n }\n }\n for (const equalityOnly of [true, false]) {\n for (const candidate of candidates) {\n const selected = comparisons.filter(\n (entry) =>\n entry.column === candidate.column.name &&\n (equalityOnly ? entry.operator === '=' : ['<', '<=', '>', '>='].includes(entry.operator))\n );\n let key: Uint8Array | undefined;\n const range: Range = {};\n for (const comparison of selected) {\n const value = resolveSqlValue(comparison.value, parameters);\n const encoded = planKey(candidate.column, value, Boolean(candidate.index), equalityOnly);\n if (!encoded) continue;\n if (equalityOnly) {\n key = encoded;\n break;\n }\n setRangeBound(range, comparison.operator, encoded);\n }\n if (!key && !Object.keys(range).length) continue;\n const access: SqlQueryPlan['access'] = candidate.index\n ? equalityOnly\n ? 'index-lookup'\n : 'index-range'\n : equalityOnly\n ? 'primary-key-lookup'\n : 'primary-key-range';\n const ordered = traversalOrder(schema, candidate.column, candidate.index, orderBy, key);\n if (ordered && orderBy[0]?.direction === 'desc') range.reverse = true;\n return {\n public: {\n table: schema.table,\n access,\n column: candidate.column.name,\n ...(candidate.index ? { index: candidate.index.name } : {}),\n sort: ordered ? 'none' : 'memory',\n reason: `use ${candidate.index ? `index ${candidate.index.name}` : 'primary key'} for ${equalityOnly ? 'equality' : 'range'}; apply remaining predicates after lookup`\n },\n key,\n range,\n empty: !key && emptyRange(range)\n };\n }\n }\n if (orderBy.length) {\n for (const candidate of candidates) {\n if (!traversalOrder(schema, candidate.column, candidate.index, orderBy)) continue;\n return {\n public: {\n table: schema.table,\n access: candidate.index ? 'index-range' : 'table-scan',\n column: candidate.column.name,\n ...(candidate.index ? { index: candidate.index.name } : {}),\n sort: 'none',\n reason: `use ${candidate.index ? `index ${candidate.index.name}` : 'primary key'} traversal order`\n },\n range: { reverse: orderBy[0].direction === 'desc' }\n };\n }\n }\n return {\n public: {\n table: schema.table,\n access: 'table-scan',\n sort: orderBy.length ? 'memory' : 'none',\n reason: 'no supported primary key or index bound; filter table rows'\n }\n };\n}\n\nfunction traversalOrder(\n schema: TableSchema,\n column: SqlColumnDefinition,\n index: NormalizedIndexDef | undefined,\n orders: SqlOrderBy[],\n key?: Uint8Array\n): boolean {\n if (!orders.length || (key && !index)) return true;\n if (orders[0].column !== column.name) return false;\n if (!index) return orders.length === 1;\n // INTEGER indexes mix numeric keys and decimal strings for large values.\n if (column.type === 'INTEGER' && !key) return false;\n // SQL ties use primary ASC. Reverse index traversal reverses those ties.\n if (orders.length === 1) return orders[0].direction === 'asc' || (index.unique && !column.nullable);\n const primary = primaryColumn(schema);\n return orders.length === 2 && orders[1].column === primary?.name && orders[1].direction === orders[0].direction;\n}\n\nfunction planKey(\n column: SqlColumnDefinition,\n value: SqlValue,\n secondary: boolean,\n equality: boolean\n): Uint8Array | null {\n if (value === null) return null;\n if (column.type === 'INTEGER') {\n if (typeof value !== 'bigint' && (typeof value !== 'number' || !Number.isSafeInteger(value))) return null;\n if (secondary && !equality) return null;\n const normalized = normalizeValue({ ...column, nullable: true }, value);\n return secondary ? indexKey(storedValue(normalized)) : primaryKey(column, normalized);\n }\n if (\n column.type === 'REAL' &&\n typeof value === 'bigint' &&\n (value < BigInt(Number.MIN_SAFE_INTEGER) || value > BigInt(Number.MAX_SAFE_INTEGER))\n )\n return null;\n const normalized = normalizeValue({ ...column, nullable: true }, value);\n return secondary ? indexKey(storedValue(normalized)) : primaryKey(column, normalized);\n}\n\nfunction conjunctiveComparisons(where: SqlExpression | null): Comparison[] {\n if (!where) return [];\n if (where.kind === 'comparison') return [where];\n if (where.kind === 'and') return [...conjunctiveComparisons(where.left), ...conjunctiveComparisons(where.right)];\n return [];\n}\n\nfunction setRangeBound(range: Range, operator: Comparison['operator'], key: Uint8Array): void {\n if (operator === '>' || operator === '>=') {\n const current = range.gt ?? range.gte;\n const compared = current ? compareBytes(key, current) : 1;\n if (compared > 0 || (compared === 0 && operator === '>')) {\n delete range.gt;\n delete range.gte;\n if (operator === '>') range.gt = key;\n else range.gte = key;\n }\n } else if (operator === '<' || operator === '<=') {\n const current = range.lt ?? range.lte;\n const compared = current ? compareBytes(key, current) : -1;\n if (compared < 0 || (compared === 0 && operator === '<')) {\n delete range.lt;\n delete range.lte;\n if (operator === '<') range.lt = key;\n else range.lte = key;\n }\n }\n}\n\nfunction emptyRange(range: Range): boolean {\n const lower = range.gt ?? range.gte;\n const upper = range.lt ?? range.lte;\n if (!lower || !upper) return false;\n const compared = compareBytes(lower, upper);\n return compared > 0 || (compared === 0 && (Boolean(range.gt) || Boolean(range.lt)));\n}\n\nasync function readRows(\n tx: Transaction,\n schema: TableSchema,\n plan: AccessPlan,\n where: SqlExpression | null,\n parameters: SqlValue[],\n maxMatches?: number\n): Promise<StoredRow[]> {\n if (plan.empty) return [];\n const rows: StoredRow[] = [];\n const accept = (item: ScanItem): boolean => {\n if (item.key.length === 1 && item.key[0] === TABLE_OWNER_KEY[0]) return false;\n const row = decodeRow(schema, item);\n if (!where || evaluateWhere(row.row, where, parameters) === true) rows.push(row);\n return maxMatches !== undefined && rows.length >= maxMatches;\n };\n if (plan.public.index) {\n const range = plan.key ? { ...plan.range, gte: plan.key, lte: plan.key } : plan.range;\n for await (const [key, value] of tx.scanByIndex(schema.table, plan.public.index, range, {\n maxRows: Math.min(256, maxMatches ?? 256)\n })) {\n if (accept({ key, value })) break;\n }\n } else if (plan.key) {\n const value = await tx.get(schema.table, plan.key);\n if (value) accept({ key: plan.key, value });\n } else if (typeof tx.scanPage === 'function' && typeof tx.closeScanCursor === 'function') {\n let cursor: number | undefined;\n try {\n for (;;) {\n const page = await tx.scanPage(schema.table, plan.range, {\n cursor,\n maxRows: Math.min(256, maxMatches === undefined ? 256 : maxMatches - rows.length)\n });\n cursor = page.cursor;\n for (const item of page.rows) {\n if (accept(item)) return rows;\n }\n if (page.done) break;\n }\n } finally {\n if (cursor !== undefined) await tx.closeScanCursor(cursor);\n }\n } else {\n // Custom databases that implement the earlier Transaction API have no cursor methods.\n for (const item of await tx.scan(schema.table, plan.range)) {\n if (accept(item)) break;\n }\n }\n return rows;\n}\n\nfunction compareRows(left: StoredRow, right: StoredRow, orders: SqlOrderBy[]): number {\n for (const order of orders) {\n const compared = compareValues(left.row[order.column], right.row[order.column]);\n if (compared) return order.direction === 'desc' ? -compared : compared;\n }\n return compareBytes(left.key, right.key);\n}\n\nfunction compareValues(left: SqlValue, right: SqlValue): number {\n if (left === null) return right === null ? 0 : -1;\n if (right === null) return 1;\n if (\n (typeof left === 'number' || typeof left === 'bigint') &&\n (typeof right === 'number' || typeof right === 'bigint')\n )\n return left < right ? -1 : left > right ? 1 : 0;\n if (typeof left === 'string' && typeof right === 'string') return compareBytes(indexKey(left), indexKey(right));\n if (typeof left === 'boolean' && typeof right === 'boolean') return Number(left) - Number(right);\n if (left instanceof Uint8Array && right instanceof Uint8Array) return compareBytes(left, right);\n throw new SqlTypeError('comparison values have different SQL types');\n}\n\nfunction resolveCount(expression: SqlValueExpression | null, parameters: SqlValue[], clause: string): number | null {\n if (!expression) return null;\n const value = resolveSqlValue(expression, parameters);\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)\n throw new SqlTypeError(`${clause} requires a non-negative safe integer`);\n return value;\n}\n\nfunction projectRow(row: SqlRow, columns: string[]): SqlRow {\n const result: SqlRow = {};\n for (const column of columns)\n Object.defineProperty(result, column, {\n value: row[column] instanceof Uint8Array ? row[column].slice() : row[column],\n enumerable: true,\n configurable: true,\n writable: true\n });\n return result;\n}\n\nfunction validateColumnList(schema: TableSchema, columns: string[] | null): void {\n if (!columns) return;\n const seen = new Set<string>();\n for (const name of columns) {\n getColumn(schema, name);\n if (seen.has(name)) throw new SqlSchemaError(`duplicate column: ${name}`);\n seen.add(name);\n }\n}\n\nfunction getColumn(schema: TableSchema, name: string): SqlColumnDefinition {\n const column = schema.columns.find((entry) => entry.name === name);\n if (!column) throw new SqlSchemaError(`unknown column: ${name}`);\n return column;\n}\n\nfunction primaryColumn(schema: TableSchema): SqlColumnDefinition | undefined {\n return schema.columns.find((column) => column.primaryKey);\n}\nfunction schemaKey(table: string): Uint8Array {\n return utf8Encode(`table:${table}`);\n}\nfunction assertTableName(table: string): void {\n if (table === CATALOG || table.startsWith('__browserdb:'))\n throw new SqlSchemaError(`reserved SQL table name: ${table}`);\n}\nfunction isRowStatement(statement: SqlStatement): boolean {\n return statement.kind === 'select' || statement.kind === 'update' || statement.kind === 'delete';\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction decodeJson(value: Uint8Array): unknown {\n try {\n return jsonDecode<unknown>(value);\n } catch {\n throw new SerializationError('invalid SQL JSON data');\n }\n}\nfunction bytesIdentity(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\nfunction compareBytes(left: Uint8Array, right: Uint8Array): number {\n for (let index = 0; index < Math.min(left.length, right.length); index += 1)\n if (left[index] !== right[index]) return left[index] - right[index];\n return left.length - right.length;\n}\n","import type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DB,\n DbSubscriptionCallback,\n DebugFailpoint,\n ExportSnapshotOptions,\n IndexDef,\n IndexScanOptions,\n MigrateHook,\n OpenOptions,\n PutOptions,\n Range,\n ScanItem,\n ScanCursor,\n ScanPage,\n ScanPageOptions,\n StorageInfo,\n Transaction,\n TxId,\n TxMode,\n Unsubscribe\n} from './types';\nimport {\n acquireDbWorker,\n deleteDbByName,\n destroyDbWorker,\n invalidateTransactions,\n releaseDbWorker,\n subscribeHandleInvalidated,\n subscribeTransactionsInvalidated,\n unsafeDebugCrashWorker as crashWorkerByName,\n type RegistryEntry\n} from './registry';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n normalizeError,\n TransactionClosedError,\n UnsupportedPlatformError,\n VersionError\n} from './errors';\nimport {\n assertPublicStoreName,\n assertValidScanRange,\n normalizeIndexDefinitions,\n serializeNormalizedIndexDefinitions,\n toPublicIndexDefinitions,\n type NormalizedIndexDef\n} from './indexing';\nimport { SubscriptionHub } from './subscriptions';\nimport { compareStringsByCodeUnit, withTimeout } from './internal';\nimport type { AutocommitCommand, IndexScanPage, WorkerScanPage } from './worker-api';\nimport type { AutocommitArgs, WorkerCommandResult } from './worker-protocol';\n\nconst INDEX_SCAN_PAGE_ROWS = 256;\nconst SCAN_PAGE_ROWS = 256;\nconst SCAN_PAGE_BYTES = 8 * 1024 * 1024 + 18 + 1024 + 12;\n/** Reused when a put has no ttl, or a scan range is omitted. Do not mutate. */\nconst EMPTY_RANGE: Range = Object.freeze({});\nconst EMPTY_PUT_OPTIONS: PutOptions = Object.freeze({});\n\nasync function callProxy<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw normalizeError(error);\n }\n}\n\nclass TransactionImpl implements Transaction {\n readonly mode: TxMode;\n #entry: RegistryEntry;\n #txId: number;\n #closed = false;\n #scanCursors = new Set<ScanCursor>();\n #onClose: () => void;\n constructor(entry: RegistryEntry, txId: number, mode: TxMode, onClose: () => void) {\n this.#entry = entry;\n this.#txId = txId;\n this.mode = mode;\n this.#onClose = onClose;\n }\n async listIndexes(): Promise<IndexDef[]> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.getIndexes(this.#txId));\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.get(this.#txId, store, key));\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getMany(this.#txId, store, keys));\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.has(this.#txId, store, key));\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.put(this.#txId, store, key, value, normalizePutOptions(options)));\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options?: PutOptions): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.putMany(this.#txId, store, entries, normalizePutOptions(options)));\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.delete(this.#txId, store, key));\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.deleteMany(this.#txId, store, keys));\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.applyBatch(this.#txId, store, ops));\n }\n async scan(store: string, range?: Range): Promise<ScanItem[]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const bounds = range ?? EMPTY_RANGE;\n assertValidScanRange(bounds);\n return callProxy(() => this.#entry.proxy.scan(this.#txId, store, bounds));\n }\n async scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const normalized = normalizeScanPageOptions(options);\n if (normalized.cursor !== undefined && !this.#scanCursors.has(normalized.cursor)) {\n throw new TypeError('scan cursor does not belong to this transaction');\n }\n const page = await callProxy(() =>\n this.#entry.proxy.scanPage({\n txId: this.#txId,\n store,\n range,\n cursorId: normalized.cursor,\n maxRows: normalized.maxRows,\n maxBytes: normalized.maxBytes\n })\n );\n this.#ensureOpen();\n if (normalized.cursor !== undefined) this.#scanCursors.delete(normalized.cursor);\n if (page.cursorId !== undefined && !this.#closed) this.#scanCursors.add(page.cursorId);\n return publicScanPage(page);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return iterateScanPages(this, store, range, options);\n }\n async closeScanCursor(cursor: ScanCursor): Promise<void> {\n normalizeScanCursor(cursor);\n if (!this.#scanCursors.delete(cursor) || this.#entry.invalidated) return;\n await callProxy(() => this.#entry.proxy.closeCursor(cursor));\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n return callProxy(() => this.#entry.proxy.getByIndex(this.#txId, store, indexName, key));\n }\n async *scanByIndex(\n store: string,\n indexName: string,\n range: Range = EMPTY_RANGE,\n options: IndexScanOptions = {}\n ): AsyncIterable<[Uint8Array, Uint8Array]> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const { maxRows: pageRows, maxBytes } = normalizeScanPageOptions(options);\n const bounds = range;\n assertValidScanRange(bounds);\n let remaining = range.limit ?? Number.POSITIVE_INFINITY;\n let cursor: Uint8Array | null = null;\n const proxy = this.#entry.proxy;\n const txId = this.#txId;\n while (remaining > 0) {\n this.#ensureOpen();\n const pageLimit = Math.min(remaining, pageRows, INDEX_SCAN_PAGE_ROWS);\n let page: IndexScanPage;\n try {\n page = await proxy.scanByIndexPage(txId, store, indexName, bounds, cursor, pageLimit, maxBytes);\n } catch (error) {\n throw normalizeError(error);\n }\n const rows = page.rows;\n for (let index = 0; index < rows.length; index += 1) {\n const row = rows[index];\n yield [row.key, row.value];\n }\n remaining -= rows.length;\n if (page.cursor === null) {\n return;\n }\n cursor = page.cursor;\n }\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.createStore(this.#txId, name, normalizeCreateStoreOptions(options)));\n }\n async dropStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.dropStore(this.#txId, name));\n }\n async clearStore(name: string): Promise<void> {\n this.#ensureOpen();\n assertPublicStoreName(name);\n return callProxy(() => this.#entry.proxy.clearStore(this.#txId, name));\n }\n async commit(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.commit(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollback(): Promise<void> {\n this.#ensureOpen();\n try {\n await callProxy(() => this.#entry.proxy.rollback(this.#txId));\n } finally {\n this.#markClosed();\n }\n }\n async rollbackIfOpen(): Promise<void> {\n if (this.#closed) {\n return;\n }\n if (this.#entry.invalidated) {\n this.#markClosed();\n return;\n }\n try {\n await this.#entry.proxy.rollback(this.#txId);\n } catch (error) {\n const normalized = normalizeError(error);\n if (!(normalized instanceof TransactionClosedError)) {\n throw normalized;\n }\n } finally {\n this.#markClosed();\n }\n }\n forceClose(): void {\n this.#markClosed();\n }\n internalId(): number {\n return this.#txId;\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new TransactionClosedError();\n }\n }\n #markClosed() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#scanCursors.clear();\n this.#onClose();\n }\n}\nclass DBImpl implements DB {\n #entry: RegistryEntry;\n #closed = false;\n #closePromise: Promise<void> | null = null;\n #transactions = new Set<TransactionImpl>();\n #pendingBegins = new Set<Promise<TransactionImpl>>();\n #scanCursors = new Set<ScanCursor>();\n #pendingScanPages = new Set<Promise<WorkerScanPage>>();\n #transactionGeneration = 0;\n #subscriptions: SubscriptionHub;\n #unsubscribeTxInvalidated: (() => void) | null = null;\n #unsubscribeHandleInvalidated: (() => void) | null = null;\n constructor(entry: RegistryEntry) {\n this.#entry = entry;\n this.#subscriptions = new SubscriptionHub(entry.dbName, entry.channelName);\n this.#unsubscribeTxInvalidated = subscribeTransactionsInvalidated(entry, () => {\n this.#forceCloseTransactions();\n });\n this.#unsubscribeHandleInvalidated = subscribeHandleInvalidated(entry, () => {\n this.#markInvalidated();\n });\n }\n async begin(mode: TxMode = 'readonly'): Promise<Transaction> {\n return this.#beginImpl(mode);\n }\n async runSchemaMigration(\n oldVersion: number,\n newVersion: number,\n migrate: MigrateHook,\n targetIndexes: IndexDef[]\n ): Promise<void> {\n this.#ensureOpen();\n const tx = await this.#beginImpl('readwrite');\n const tracker = new MigrationCatalogTracker();\n const migrationTransaction = new MigrationTransactionImpl(tx, tracker);\n const migrationDb = new MigrationDbImpl(this, migrationTransaction, tracker);\n try {\n await this.#entry.proxy.reconcileIndexes(tx.internalId(), targetIndexes);\n await migrate({\n db: migrationDb,\n oldVersion,\n newVersion,\n transaction: migrationTransaction\n });\n await this.#entry.proxy.setSchemaVersion(tx.internalId(), newVersion);\n await tx.commit();\n } catch (error) {\n try {\n await tx.rollbackIfOpen();\n } catch {}\n throw error;\n }\n }\n async listStores(): Promise<string[]> {\n return this.#call(() => this.#entry.proxy.listStores());\n }\n async listIndexes(): Promise<IndexDef[]> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.getIndexes());\n }\n async getVersion(): Promise<number> {\n return this.#call(() => this.#entry.proxy.getVersion());\n }\n async changesSince(txid: TxId, options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n return this.#call(() =>\n this.#entry.proxy.changesSince(normalizeTxId(txid), normalizeChangeFeedOptions(options))\n );\n }\n async #beginImpl(mode: TxMode): Promise<TransactionImpl> {\n this.#ensureOpen();\n const generation = this.#transactionGeneration;\n const pending = callProxy(async () => {\n const txId = await this.#entry.proxy.begin(mode);\n const tx = new TransactionImpl(this.#entry, txId, mode, () => {\n this.#transactions.delete(tx);\n });\n this.#transactions.add(tx);\n if (this.#closed || this.#entry.invalidated) {\n if (this.#entry.invalidated) {\n tx.forceClose();\n }\n throw new DatabaseClosedError();\n }\n if (generation !== this.#transactionGeneration) {\n await tx.rollbackIfOpen();\n throw new TransactionClosedError();\n }\n return tx;\n });\n this.#pendingBegins.add(pending);\n try {\n return await pending;\n } finally {\n this.#pendingBegins.delete(pending);\n }\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'createStore', [name, normalizeCreateStoreOptions(options)]);\n }\n async dropStore(name: string): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'dropStore', [name]);\n }\n async clearStore(name: string): Promise<void> {\n assertPublicStoreName(name);\n await this.#autocommit('readwrite', 'clearStore', [name]);\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'get', [store, key]);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'getMany', [store, keys]);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'has', [store, key]);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n assertPublicStoreName(store);\n await this.#autocommit('readwrite', 'put', [store, key, value, normalizePutOptions(options)]);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n assertPublicStoreName(store);\n return this.#autocommit('readwrite', 'delete', [store, key]);\n }\n async scan(store: string, range?: Range): Promise<ScanItem[]> {\n assertPublicStoreName(store);\n return this.#autocommit('readonly', 'scan', [store, range ?? EMPTY_RANGE]);\n }\n async scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n this.#ensureOpen();\n assertPublicStoreName(store);\n const normalized = normalizeScanPageOptions(options);\n if (normalized.cursor !== undefined && !this.#scanCursors.has(normalized.cursor)) {\n throw new TypeError('scan cursor does not belong to this database handle');\n }\n const generation = this.#transactionGeneration;\n const pending = callProxy(() =>\n this.#entry.proxy.scanPage({\n store,\n range,\n cursorId: normalized.cursor,\n maxRows: normalized.maxRows,\n maxBytes: normalized.maxBytes\n })\n );\n this.#pendingScanPages.add(pending);\n try {\n const page = await pending;\n if (normalized.cursor !== undefined) this.#scanCursors.delete(normalized.cursor);\n if (page.cursorId !== undefined) this.#scanCursors.add(page.cursorId);\n this.#ensureOpen();\n if (generation !== this.#transactionGeneration) {\n if (page.cursorId !== undefined) await this.closeScanCursor(page.cursorId);\n throw new TransactionClosedError();\n }\n return publicScanPage(page);\n } finally {\n this.#pendingScanPages.delete(pending);\n }\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return iterateScanPages(this, store, range, options);\n }\n async closeScanCursor(cursor: ScanCursor): Promise<void> {\n normalizeScanCursor(cursor);\n if (!this.#scanCursors.delete(cursor) || this.#entry.invalidated) return;\n await callProxy(() => this.#entry.proxy.closeCursor(cursor));\n }\n /** The transaction boundary stays in the worker, so one round trip is enough. */\n async #autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>> {\n this.#ensureOpen();\n return callProxy(() => this.#entry.proxy.autocommit(mode, command, args));\n }\n async exportSnapshot(options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n return this.#call(async () => {\n const bytes = await this.#entry.proxy.exportSnapshot(normalizeExportSnapshotOptions(options));\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n });\n }\n async importSnapshot(data: Uint8Array): Promise<void> {\n return this.#callAfterTxInvalidation(() => {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n return this.#entry.proxy.importSnapshot(bytes);\n });\n }\n async reset(): Promise<void> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.reset());\n }\n async compact(): Promise<CompactionResult> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.compact());\n }\n async rebuild(): Promise<CompactionResult> {\n return this.#callAfterTxInvalidation(() => this.#entry.proxy.rebuild());\n }\n async stats() {\n return this.#call(() => this.#entry.proxy.stats());\n }\n async storageInfo(): Promise<StorageInfo> {\n return this.#call(() => this.#entry.proxy.storageInfo());\n }\n async requestPersistence(): Promise<boolean> {\n return this.#call(() => this.#entry.proxy.requestPersistence());\n }\n async destroy(): Promise<void> {\n return this.#call(() => this.#entry.destroy?.() ?? destroyDbWorker(this.#entry));\n }\n async setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.#call(() => this.#entry.proxy.setFailpoint(failpoint));\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n this.#ensureOpen();\n if (typeof arg1 === 'function') {\n return this.#subscriptions.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.#subscriptions.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'subscribe() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n arg1: string | DbSubscriptionCallback,\n arg2?: Uint8Array | DbSubscriptionCallback,\n arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n if (typeof arg1 === 'function') {\n return this.subscribe(arg1);\n }\n if (typeof arg2 === 'function') {\n return this.subscribe(arg1, arg2);\n }\n if (arg2 instanceof Uint8Array && typeof arg3 === 'function') {\n return this.subscribe(arg1, arg2, arg3);\n }\n throw new TypeError(\n 'watch() expects one of: (callback), (storeName, callback), (storeName, keyPrefix, callback)'\n );\n }\n close(): Promise<void> {\n if (this.#closePromise !== null) {\n return this.#closePromise;\n }\n if (this.#closed) {\n return Promise.resolve();\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#subscriptions.close();\n this.#closePromise = this.#finishClose();\n return this.#closePromise;\n }\n async #finishClose(): Promise<void> {\n await Promise.allSettled(Array.from(this.#pendingBegins));\n await Promise.allSettled(Array.from(this.#pendingScanPages));\n let rollbackError: Error | null = null;\n const cursorResults = await Promise.allSettled(\n Array.from(this.#scanCursors, (cursor) => this.closeScanCursor(cursor))\n );\n for (const result of cursorResults) {\n if (result.status === 'rejected' && rollbackError === null) rollbackError = normalizeError(result.reason);\n }\n const txs = Array.from(this.#transactions);\n if (txs.length > 0) {\n const results = await Promise.allSettled(txs.map((tx) => tx.rollbackIfOpen()));\n for (const result of results) {\n if (result.status === 'rejected' && rollbackError === null) {\n rollbackError = normalizeError(result.reason);\n }\n }\n }\n try {\n await (this.#entry.release?.() ?? releaseDbWorker(this.#entry));\n } catch (error) {\n throw normalizeError(error);\n }\n if (rollbackError) {\n throw rollbackError;\n }\n }\n #disposeRegistrySubscriptions() {\n this.#unsubscribeTxInvalidated?.();\n this.#unsubscribeTxInvalidated = null;\n this.#unsubscribeHandleInvalidated?.();\n this.#unsubscribeHandleInvalidated = null;\n }\n #forceCloseTransactions() {\n this.#transactionGeneration += 1;\n this.#scanCursors.clear();\n for (const tx of Array.from(this.#transactions)) {\n tx.forceClose();\n }\n }\n #markInvalidated() {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n this.#disposeRegistrySubscriptions();\n this.#forceCloseTransactions();\n this.#subscriptions.close();\n }\n #call<T>(run: () => Promise<T>): Promise<T> {\n this.#ensureOpen();\n return callProxy(run);\n }\n #callAfterTxInvalidation<T>(run: () => Promise<T>): Promise<T> {\n this.#ensureOpen();\n invalidateTransactions(this.#entry);\n return callProxy(run);\n }\n #ensureOpen() {\n if (this.#closed || this.#entry.invalidated) {\n throw new DatabaseClosedError();\n }\n }\n}\nclass MigrationCatalogTracker {\n #created = new Set<string>();\n #dropped = new Set<string>();\n recordCreate(name: string): void {\n this.#dropped.delete(name);\n this.#created.add(name);\n }\n recordDrop(name: string): void {\n if (this.#created.delete(name)) {\n return;\n }\n this.#dropped.add(name);\n }\n apply(stores: string[]): string[] {\n const visible = new Set(stores);\n for (const name of this.#created) {\n visible.add(name);\n }\n for (const name of this.#dropped) {\n visible.delete(name);\n }\n return Array.from(visible).sort(compareStringsByCodeUnit);\n }\n}\nclass MigrationTransactionImpl implements Transaction {\n #inner: TransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(inner: TransactionImpl, tracker: MigrationCatalogTracker) {\n this.#inner = inner;\n this.#tracker = tracker;\n }\n get mode(): TxMode {\n return this.#inner.mode;\n }\n async listIndexes(): Promise<IndexDef[]> {\n return this.#inner.listIndexes();\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#inner.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n await this.#inner.put(store, key, value, options);\n }\n async putMany(store: string, entries: Array<[Uint8Array, Uint8Array]>, options?: PutOptions): Promise<void> {\n await this.#inner.putMany(store, entries, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#inner.delete(store, key);\n }\n async deleteMany(store: string, keys: Array<Uint8Array>): Promise<void> {\n await this.#inner.deleteMany(store, keys);\n }\n async applyBatch(store: string, ops: Array<BatchOp>): Promise<void> {\n await this.#inner.applyBatch(store, ops);\n }\n async scan(store: string, range?: Range): Promise<ScanItem[]> {\n return this.#inner.scan(store, range);\n }\n scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n return this.#inner.scanPage(store, range, options);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return this.#inner.scanIter(store, range, options);\n }\n closeScanCursor(cursor: ScanCursor): Promise<void> {\n return this.#inner.closeScanCursor(cursor);\n }\n async getByIndex(store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#inner.getByIndex(store, indexName, key);\n }\n scanByIndex(\n store: string,\n indexName: string,\n range: Range = {},\n options: IndexScanOptions = {}\n ): AsyncIterable<[Uint8Array, Uint8Array]> {\n return this.#inner.scanByIndex(store, indexName, range, options);\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#inner.createStore(name, options);\n this.#tracker.recordCreate(name);\n }\n async dropStore(name: string): Promise<void> {\n await this.#inner.dropStore(name);\n this.#tracker.recordDrop(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#inner.clearStore(name);\n }\n commit(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('transaction.commit'));\n }\n rollback(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('transaction.rollback'));\n }\n}\nclass MigrationDbImpl implements DB {\n #db: DBImpl;\n #transaction: MigrationTransactionImpl;\n #tracker: MigrationCatalogTracker;\n constructor(db: DBImpl, transaction: MigrationTransactionImpl, tracker: MigrationCatalogTracker) {\n this.#db = db;\n this.#transaction = transaction;\n this.#tracker = tracker;\n }\n begin(_mode: TxMode = 'readonly'): Promise<Transaction> {\n return Promise.reject(migrationUnsupportedMethod('db.begin'));\n }\n async createStore(name: string, options: CreateStoreOptions = {}): Promise<void> {\n await this.#transaction.createStore(name, options);\n }\n async dropStore(name: string): Promise<void> {\n await this.#transaction.dropStore(name);\n }\n async clearStore(name: string): Promise<void> {\n await this.#transaction.clearStore(name);\n }\n async listStores(): Promise<string[]> {\n return this.#tracker.apply(await this.#db.listStores());\n }\n async listIndexes(): Promise<IndexDef[]> {\n return this.#transaction.listIndexes();\n }\n async getVersion(): Promise<number> {\n return this.#db.getVersion();\n }\n changesSince(_txid: TxId, _options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n return Promise.reject(migrationUnsupportedMethod('db.changesSince'));\n }\n async get(store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.#transaction.get(store, key);\n }\n async getMany(store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.#transaction.getMany(store, keys);\n }\n async has(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.has(store, key);\n }\n async put(store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n await this.#transaction.put(store, key, value, options);\n }\n async delete(store: string, key: Uint8Array): Promise<boolean> {\n return this.#transaction.delete(store, key);\n }\n async scan(store: string, range?: Range): Promise<ScanItem[]> {\n return this.#transaction.scan(store, range);\n }\n scanPage(store: string, range: Range = {}, options: ScanPageOptions = {}): Promise<ScanPage> {\n return this.#transaction.scanPage(store, range, options);\n }\n scanIter(store: string, range: Range = {}, options: Omit<ScanPageOptions, 'cursor'> = {}): AsyncIterable<ScanItem> {\n return this.#transaction.scanIter(store, range, options);\n }\n closeScanCursor(cursor: ScanCursor): Promise<void> {\n return this.#transaction.closeScanCursor(cursor);\n }\n exportSnapshot(_options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n return Promise.reject(migrationUnsupportedMethod('db.exportSnapshot'));\n }\n importSnapshot(_data: Uint8Array): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.importSnapshot'));\n }\n reset(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.reset'));\n }\n compact(): Promise<CompactionResult> {\n return Promise.reject(migrationUnsupportedMethod('db.compact'));\n }\n rebuild(): Promise<CompactionResult> {\n return Promise.reject(migrationUnsupportedMethod('db.rebuild'));\n }\n async stats() {\n return this.#db.stats();\n }\n async storageInfo(): Promise<StorageInfo> {\n return this.#db.storageInfo();\n }\n async requestPersistence(): Promise<boolean> {\n return this.#db.requestPersistence();\n }\n close(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.close'));\n }\n destroy(): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.destroy'));\n }\n setFailpoint(_failpoint: DebugFailpoint): Promise<void> {\n return Promise.reject(migrationUnsupportedMethod('db.setFailpoint'));\n }\n subscribe(callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n subscribe(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.subscribe');\n }\n watch(callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, callback: DbSubscriptionCallback): Unsubscribe;\n watch(storeName: string, keyPrefix: Uint8Array, callback: DbSubscriptionCallback): Unsubscribe;\n watch(\n _arg1: string | DbSubscriptionCallback,\n _arg2?: Uint8Array | DbSubscriptionCallback,\n _arg3?: DbSubscriptionCallback\n ): Unsubscribe {\n throw migrationUnsupportedMethod('db.watch');\n }\n}\nfunction migrationUnsupportedMethod(method: string): Error {\n const error = new Error(\n `${method}() is not available inside openDB() migrations; use the provided migration transaction and wait for openDB() to resolve`\n );\n error.name = 'InvalidStateError';\n return error;\n}\nfunction publicScanPage(page: WorkerScanPage): ScanPage {\n return { rows: page.rows, cursor: page.cursorId, done: page.done, bytes: page.bytes };\n}\nfunction normalizeScanCursor(value: unknown): ScanCursor {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError('scan cursor must be a positive safe integer');\n }\n return value;\n}\nfunction normalizeScanPageOptions(\n options: unknown\n): Required<Omit<ScanPageOptions, 'cursor'>> & Pick<ScanPageOptions, 'cursor'> {\n const input = normalizeOptionsObject<ScanPageOptions>(options, 'scan page options must be an object');\n const maxRows = input.maxRows ?? SCAN_PAGE_ROWS;\n const maxBytes = input.maxBytes ?? SCAN_PAGE_BYTES;\n if (!Number.isSafeInteger(maxRows) || maxRows <= 0 || maxRows > 0xffff_ffff) {\n throw new TypeError('scan page maxRows must be a positive 32-bit integer');\n }\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 4 || maxBytes > 0xffff_ffff) {\n throw new TypeError('scan page maxBytes must be a 32-bit integer of at least 4');\n }\n return { maxRows, maxBytes, cursor: input.cursor === undefined ? undefined : normalizeScanCursor(input.cursor) };\n}\nasync function* iterateScanPages(\n source: Pick<Transaction, 'scanPage' | 'closeScanCursor'>,\n store: string,\n range: Range,\n options: Omit<ScanPageOptions, 'cursor'>\n): AsyncIterable<ScanItem> {\n const bounds = { ...range };\n for (const field of ['gt', 'gte', 'lt', 'lte'] as const) {\n const bound = bounds[field];\n if (bound instanceof Uint8Array) bounds[field] = bound.slice();\n }\n const pageOptions = normalizeScanPageOptions(options);\n let cursor: ScanCursor | undefined;\n try {\n for (;;) {\n const page = await source.scanPage(store, bounds, { ...pageOptions, cursor });\n cursor = page.cursor;\n for (const row of page.rows) yield row;\n if (page.done) return;\n }\n } finally {\n if (cursor !== undefined) await source.closeScanCursor(cursor);\n }\n}\nfunction normalizeDatabaseName(value: unknown, method: 'openDB' | 'deleteDB' | 'unsafeDebugCrashWorker'): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new TypeError(`${method}() database name must be a non-empty string`);\n }\n if (/[\\uD800-\\uDFFF]/u.test(value)) {\n throw new TypeError(`${method}() database name must contain valid Unicode`);\n }\n if (new TextEncoder().encode(value).length > 127) {\n throw new TypeError(`${method}() database name must contain at most 127 UTF-8 bytes`);\n }\n return value;\n}\ntype ErrorFactory = (message: string) => Error;\n\nconst typeError: ErrorFactory = (message) => new TypeError(message);\nconst invalidOpenOptionsError: ErrorFactory = (message) => new InvalidOpenOptionsError(message);\n\nfunction normalizeOptionsObject<T>(options: unknown, message: string, createError: ErrorFactory = typeError): T {\n if (options === undefined) {\n return {} as T;\n }\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw createError(message);\n }\n return options as T;\n}\n\nfunction normalizeNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError: ErrorFactory = typeError\n): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw createError(message);\n }\n return value;\n}\n\nfunction normalizeOptionalNonNegativeSafeInteger(\n value: unknown,\n message: string,\n createError?: ErrorFactory\n): number | undefined {\n return value === undefined ? undefined : normalizeNonNegativeSafeInteger(value, message, createError);\n}\n\nfunction normalizeOpenOptionsInput(options: unknown): OpenOptions {\n return normalizeOptionsObject(options, 'open options must be an object', invalidOpenOptionsError);\n}\nfunction normalizeSchemaVersion(value: unknown): number | undefined {\n return normalizeOptionalNonNegativeSafeInteger(\n value,\n 'version must be a non-negative safe integer',\n invalidOpenOptionsError\n );\n}\nfunction normalizePutOptions(options: unknown): PutOptions {\n if (options === undefined) {\n return EMPTY_PUT_OPTIONS;\n }\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('put options must be an object');\n }\n const ttl = (options as { ttl?: unknown }).ttl;\n if (ttl === undefined) {\n return EMPTY_PUT_OPTIONS;\n }\n if (typeof ttl !== 'number' || !Number.isSafeInteger(ttl) || ttl < 0) {\n throw new TypeError('ttl must be a non-negative safe integer');\n }\n return { ttl };\n}\nfunction normalizeCompressionOptions<T extends CreateStoreOptions | ExportSnapshotOptions>(\n options: unknown,\n message: string,\n allowSnappy: boolean\n): T {\n const { compression } = normalizeOptionsObject<{\n compression?: unknown;\n }>(options, message);\n if (compression === undefined) {\n return {} as T;\n }\n if (\n compression !== false &&\n compression !== 'gzip' &&\n compression !== 'deflate' &&\n !(allowSnappy && compression === 'snappy')\n ) {\n throw new TypeError(\n allowSnappy\n ? 'compression must be \"gzip\", \"deflate\", \"snappy\", or false'\n : 'compression must be \"gzip\", \"deflate\", or false'\n );\n }\n return { compression } as T;\n}\n\nfunction normalizeCreateStoreOptions(options: unknown): CreateStoreOptions {\n return normalizeCompressionOptions(options, 'createStore options must be an object', true);\n}\n\nfunction normalizeExportSnapshotOptions(options: unknown): ExportSnapshotOptions {\n return normalizeCompressionOptions(options, 'exportSnapshot options must be an object', false);\n}\nfunction normalizeTxId(value: unknown): TxId {\n return normalizeNonNegativeSafeInteger(value, 'txid must be a non-negative safe integer');\n}\nfunction normalizeChangeFeedOptions(options: unknown): ChangeFeedOptions {\n const { stores, limit } = normalizeOptionsObject<{\n stores?: unknown;\n limit?: unknown;\n }>(options, 'change feed options must be an object');\n const normalized: ChangeFeedOptions = {};\n if (stores !== undefined) {\n if (!Array.isArray(stores) || !stores.every((store): store is string => typeof store === 'string')) {\n throw new TypeError('stores must be an array of strings');\n }\n for (const store of stores) {\n assertPublicStoreName(store);\n }\n normalized.stores = [...stores];\n }\n const normalizedLimit = normalizeOptionalNonNegativeSafeInteger(limit, 'limit must be a non-negative safe integer');\n if (normalizedLimit !== undefined) {\n normalized.limit = normalizedLimit;\n }\n return normalized;\n}\nfunction normalizeMigrateHook(value: unknown): MigrateHook | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'function') {\n throw new InvalidOpenOptionsError('migrate must be a function');\n }\n return value as MigrateHook;\n}\nfunction normalizeRequestedIndexes(value: unknown): NormalizedIndexDef[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return normalizeIndexDefinitions(value);\n}\nfunction indexDefinitionsMatch(\n left: ReadonlyArray<NormalizedIndexDef>,\n right: ReadonlyArray<NormalizedIndexDef>\n): boolean {\n return serializeNormalizedIndexDefinitions(left) === serializeNormalizedIndexDefinitions(right);\n}\nasync function loadNormalizedIndexes(entry: RegistryEntry): Promise<NormalizedIndexDef[]> {\n return normalizeIndexDefinitions(await entry.proxy.getIndexes());\n}\nfunction assertMainThreadCapabilities() {\n if (!globalThis.isSecureContext) {\n throw new UnsupportedPlatformError('moyodb requires a secure context (HTTPS)');\n }\n const nav = globalThis.navigator;\n if (typeof nav?.storage?.getDirectory !== 'function') {\n throw new UnsupportedPlatformError('navigator.storage.getDirectory is unavailable');\n }\n if (typeof globalThis.Worker !== 'function') {\n throw new UnsupportedPlatformError('Worker is unavailable');\n }\n if (typeof globalThis.BroadcastChannel === 'undefined') {\n throw new UnsupportedPlatformError('BroadcastChannel is unavailable');\n }\n}\nasync function requestPersistentStorageOnOpen(options: OpenOptions): Promise<void> {\n const nav = globalThis.navigator;\n if ((options.requestPersistence ?? true) && typeof nav.storage.persist === 'function') {\n await withTimeout(nav.storage.persist(), 1000, false);\n }\n}\nexport async function openDB(name: string, options: OpenOptions = {}): Promise<DB> {\n return openDBWithWorker(name, options, async (dbName, normalizedOptions) => {\n assertMainThreadCapabilities();\n await requestPersistentStorageOnOpen(normalizedOptions);\n return acquireDbWorker(dbName, normalizedOptions);\n });\n}\nexport async function openDBWithWorker(\n name: string,\n options: OpenOptions,\n acquire: (name: string, options: OpenOptions) => Promise<RegistryEntry>\n): Promise<DB> {\n const dbName = normalizeDatabaseName(name, 'openDB');\n const normalizedOptions = normalizeOpenOptionsInput(options);\n const requestedVersion = normalizeSchemaVersion(normalizedOptions.version);\n const migrate = normalizeMigrateHook(normalizedOptions.migrate);\n const requestedIndexes = normalizeRequestedIndexes(normalizedOptions.indexes);\n if (requestedVersion === undefined && migrate !== undefined) {\n throw new InvalidOpenOptionsError('migrate requires version');\n }\n if (requestedVersion === undefined && requestedIndexes !== undefined) {\n throw new InvalidOpenOptionsError('indexes requires version');\n }\n const entry = await acquire(dbName, normalizedOptions);\n const db = new DBImpl(entry);\n try {\n await entry.proxy.acquireMigration?.();\n try {\n if (requestedVersion === undefined) {\n return db;\n }\n const [currentVersion, currentIndexes] = await Promise.all([db.getVersion(), loadNormalizedIndexes(entry)]);\n if (requestedVersion < currentVersion) {\n throw new VersionError(\n `cannot open database ${dbName} at schema version ${requestedVersion}; current schema version is ${currentVersion}`\n );\n }\n if (requestedVersion === currentVersion) {\n if (requestedIndexes !== undefined && !indexDefinitionsMatch(requestedIndexes, currentIndexes)) {\n throw new VersionError(\n `database ${dbName} is already at schema version ${currentVersion}, but the requested index catalog does not match the committed schema`\n );\n }\n return db;\n }\n if (entry.refs > 1) {\n throw new DatabaseBusyError(\n `database ${dbName} is already open in this tab; close existing handles before migrating from version ${currentVersion} to ${requestedVersion}`\n );\n }\n if (!migrate) {\n throw new VersionError(\n `database ${dbName} requires migration from version ${currentVersion} to ${requestedVersion}, but no migrate hook was provided`\n );\n }\n const targetIndexes = requestedIndexes ?? currentIndexes;\n entry.schemaMigrationInProgress = true;\n try {\n await db.runSchemaMigration(\n currentVersion,\n requestedVersion,\n migrate,\n toPublicIndexDefinitions(targetIndexes)\n );\n } finally {\n entry.schemaMigrationInProgress = false;\n }\n return db;\n } finally {\n await entry.proxy.releaseMigration?.();\n }\n } catch (error) {\n try {\n await db.close();\n } catch {}\n throw normalizeError(error);\n }\n}\nexport async function deleteDB(name: string): Promise<void> {\n const dbName = normalizeDatabaseName(name, 'deleteDB');\n assertMainThreadCapabilities();\n await deleteDbByName(dbName);\n}\nexport function unsafeDebugCrashWorker(name: string): boolean {\n const dbName = normalizeDatabaseName(name, 'unsafeDebugCrashWorker');\n return crashWorkerByName(dbName);\n}\nexport * from './codec';\nexport * from './errors';\nexport * from './indexing';\nexport * from './records';\nexport * from './sql';\nexport { SqlSyntaxError } from './sql-parser';\nexport type * from './sql-types';\nexport type * from './types';\n","import { Worker, type Transferable as NodeTransferable } from 'node:worker_threads';\nimport { WorkerProtocolClient } from './worker-client';\nimport { workerProtocolError } from './worker-protocol';\n\nexport interface NodeWorkerData {\n directory: string;\n dbName: string;\n channelName: string;\n lockToken: string;\n ownerWaitMs: number;\n encodedDbName: string;\n createIfMissing: boolean;\n}\n\nexport class NodeWorkerTransport {\n readonly proxy: WorkerProtocolClient;\n readonly #worker: Worker;\n readonly #listeners = new Map<string, Set<EventListenerOrEventListenerObject>>();\n readonly #exited: Promise<number>;\n #resolveExit!: (code: number) => void;\n #rejectExit!: (error: unknown) => void;\n #terminating = false;\n #failureEmitted = false;\n\n constructor(data: NodeWorkerData, releaseLease: () => void) {\n this.#exited = new Promise((resolve, reject) => {\n this.#resolveExit = resolve;\n this.#rejectExit = reject;\n });\n void this.#exited.catch(() => {});\n this.#worker = new Worker(new URL('./node-worker.mjs', import.meta.url), { workerData: data });\n this.#worker.on('message', (data: unknown) => {\n this.#emit('message', { data });\n });\n this.#worker.on('messageerror', () => {\n this.#emit('messageerror', {});\n });\n this.#worker.on('error', (error: Error) => {\n this.#failureEmitted = true;\n this.#emit('error', { error, message: error.message });\n });\n this.#worker.once('exit', (code: number) => {\n if (!this.#terminating && !this.#failureEmitted) {\n const error = workerProtocolError('WorkerTerminatedError', `Node worker exited with code ${code}`);\n this.#emit('error', { error, message: error.message });\n }\n try {\n releaseLease();\n this.#resolveExit(code);\n } catch (error) {\n this.#rejectExit(error);\n }\n });\n this.proxy = new WorkerProtocolClient(this, {\n readyTimeoutMs: Math.min(2_147_483_647, 30_000 + data.ownerWaitMs)\n });\n }\n\n postMessage(message: unknown, transfer: Transferable[] = []): void {\n this.#worker.postMessage(message, transfer as NodeTransferable[]);\n }\n\n addEventListener(type: string, listener: EventListenerOrEventListenerObject): void {\n let listeners = this.#listeners.get(type);\n if (!listeners) {\n listeners = new Set();\n this.#listeners.set(type, listeners);\n }\n listeners.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void {\n this.#listeners.get(type)?.delete(listener);\n }\n\n terminate(): Promise<number> {\n if (!this.#terminating) {\n this.#terminating = true;\n void this.#worker.terminate().catch(this.#rejectExit);\n }\n return this.#exited;\n }\n\n #emit(type: string, event: unknown): void {\n for (const listener of Array.from(this.#listeners.get(type) ?? [])) {\n if (typeof listener === 'function') listener(event as Event);\n else listener.handleEvent(event as Event);\n }\n }\n}\n","import fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { basename, dirname, join, relative, resolve, sep } from 'node:path';\nimport { isMainThread } from 'node:worker_threads';\n\nconst LOCK_DIRECTORY = '.moyodb.lock';\nconst PENDING_PREFIX = '.moyodb.pending-';\nconst TOKEN_PATTERN = /^[a-f\\d]{8}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{12}$/i;\n// NativeFileBackend rejects a larger record without deleting it.\nconst MAX_LEASE_RECORD_BYTES = 1024;\nconst MAX_LEASE_PID = 0xffffffff;\nexport const MISSING_DATABASE_MESSAGE = 'database missing and create_if_missing=false';\nlet installedStorage = null;\n\nfunction namedError(name, message, cause) {\n const error = new Error(message, cause === undefined ? undefined : { cause });\n error.name = name;\n error.code = cause?.code ?? name;\n return error;\n}\n\nfunction storageError(error) {\n if (\n ['NotFoundError', 'TypeMismatchError', 'SecurityError', 'DatabaseBusyError', 'StorageError'].includes(\n error?.name\n )\n ) {\n return error;\n }\n if (error?.code === 'ENOENT') return namedError('NotFoundError', error.message, error);\n return namedError('StorageError', error?.message ?? String(error), error);\n}\n\nfunction validateDirectory(directory) {\n if (typeof directory !== 'string' || directory.length === 0 || directory.includes('\\0')) {\n throw new TypeError('directory must be a nonempty filesystem path');\n }\n return resolve(directory);\n}\n\nfunction validateToken(token) {\n if (typeof token !== 'string' || !TOKEN_PATTERN.test(token)) throw new TypeError('invalid storage lock token');\n return token;\n}\n\nfunction validateName(name) {\n if (\n typeof name !== 'string' ||\n name.length === 0 ||\n name === '.' ||\n name === '..' ||\n name.toLowerCase() === LOCK_DIRECTORY ||\n name.toLowerCase().startsWith(PENDING_PREFIX) ||\n Array.from(name).some((character) => character.charCodeAt(0) < 32) ||\n /[<>:\"/\\\\|?*]/.test(name) ||\n /[. ]$/.test(name) ||\n /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i.test(name)\n ) {\n throw new TypeError('invalid storage entry name');\n }\n return name;\n}\n\nfunction entryStat(path, kind) {\n const stat = fs.lstatSync(path);\n if (stat.isSymbolicLink() || (stat.isFile() && stat.nlink !== 1)) {\n throw namedError('SecurityError', 'storage entries must not be links');\n }\n if ((kind === 'directory' && !stat.isDirectory()) || (kind === 'file' && !stat.isFile())) {\n throw namedError('TypeMismatchError', `storage entry is not a ${kind}`);\n }\n if (!stat.isDirectory() && !stat.isFile()) throw namedError('SecurityError', 'unsupported storage entry type');\n return stat;\n}\n\nfunction syncDirectory(path) {\n // Node cannot open directory descriptors on Windows. File flushes still use fsync.\n if (process.platform === 'win32') return;\n const fd = fs.openSync(path, fs.constants.O_RDONLY | (fs.constants.O_DIRECTORY ?? 0));\n try {\n fs.fsyncSync(fd);\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction readLease(directory, token) {\n const lockDirectory = join(directory, LOCK_DIRECTORY);\n entryStat(lockDirectory, 'directory');\n const recordPath = join(lockDirectory, `${validateToken(token)}.json`);\n const stat = entryStat(recordPath, 'file');\n if (stat.size > MAX_LEASE_RECORD_BYTES) {\n throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');\n }\n const owner = JSON.parse(fs.readFileSync(recordPath, 'utf8'));\n if (owner.token !== token || !Number.isSafeInteger(owner.pid) || owner.pid <= 0 || owner.pid > MAX_LEASE_PID) {\n throw namedError('DatabaseBusyError', 'storage lock owner cannot be verified');\n }\n return { lockDirectory, recordPath, owner };\n}\n\nfunction removeLease(lease) {\n // Remove only this token. A newer nonempty lease must survive cleanup.\n fs.unlinkSync(lease.recordPath);\n try {\n fs.rmdirSync(lease.lockDirectory);\n } catch (error) {\n if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error?.code)) throw error;\n }\n syncDirectory(dirname(lease.lockDirectory));\n}\n\nfunction removeVacantLease(directory) {\n const path = join(directory, LOCK_DIRECTORY);\n try {\n entryStat(path, 'directory');\n if (fs.readdirSync(path).length !== 0) return false;\n fs.rmdirSync(path);\n syncDirectory(directory);\n return true;\n } catch (error) {\n if (['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error?.code)) return false;\n throw error;\n }\n}\n\nfunction publishLease(directory, pending) {\n const lockDirectory = join(directory, LOCK_DIRECTORY);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n let published = false;\n try {\n fs.renameSync(pending, lockDirectory);\n published = true;\n } catch (error) {\n try {\n fs.lstatSync(lockDirectory);\n } catch {\n throw storageError(error);\n }\n }\n if (published) {\n syncDirectory(directory);\n return;\n }\n let lease;\n try {\n entryStat(lockDirectory, 'directory');\n const records = fs.readdirSync(lockDirectory);\n if (records.length === 0) {\n removeVacantLease(directory);\n continue;\n }\n if (records.length !== 1 || !records[0].endsWith('.json')) throw new Error('incomplete lock record');\n lease = readLease(directory, records[0].slice(0, -5));\n try {\n process.kill(lease.owner.pid, 0);\n } catch (failure) {\n if (failure?.code === 'ESRCH') {\n removeLease(lease);\n continue;\n }\n throw failure;\n }\n } catch (failure) {\n throw namedError('DatabaseBusyError', 'storage directory is locked; its owner cannot be released', failure);\n }\n throw namedError('DatabaseBusyError', `storage directory is owned by process ${lease.owner.pid}`);\n }\n throw namedError('DatabaseBusyError', 'storage directory changed while acquiring its lock');\n}\n\nfunction removePendingLease(directory, token) {\n const pending = join(directory, `${PENDING_PREFIX}${process.pid}-${token}`);\n try {\n entryStat(pending, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') return false;\n throw error;\n }\n const entries = fs.readdirSync(pending);\n if (entries.length === 1 && entries[0] === `${token}.json`) {\n const recordPath = join(pending, entries[0]);\n entryStat(recordPath, 'file');\n fs.unlinkSync(recordPath);\n } else if (entries.length !== 0) {\n throw namedError('SecurityError', 'pending storage lock contains unknown entries');\n }\n fs.rmdirSync(pending);\n return true;\n}\n\nfunction acquireLease(directory, token) {\n const pending = join(directory, `${PENDING_PREFIX}${process.pid}-${token}`);\n const recordPath = join(pending, `${token}.json`);\n let fd;\n let created = false;\n try {\n fs.mkdirSync(pending, { mode: 0o700 });\n created = true;\n fd = fs.openSync(recordPath, 'wx', 0o600);\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, token }));\n fs.fsyncSync(fd);\n fs.closeSync(fd);\n fd = undefined;\n syncDirectory(pending);\n // Publish the complete owner record. Termination before rename cannot block a later owner.\n publishLease(directory, pending);\n } catch (error) {\n const primary = storageError(error);\n if (fd !== undefined) {\n try {\n fs.closeSync(fd);\n } catch (cleanupError) {\n primary.cleanupErrors = [cleanupError];\n }\n }\n if (created) {\n try {\n releaseNodeStorageLease(directory, token);\n } catch (cleanupError) {\n primary.cleanupErrors = [...(primary.cleanupErrors ?? []), cleanupError];\n }\n }\n throw primary;\n }\n}\n\nexport function releaseNodeStorageLease(directory, lockToken) {\n const path = validateDirectory(directory);\n validateToken(lockToken);\n let lease;\n let canonical;\n try {\n canonical = fs.realpathSync(path);\n lease = readLease(canonical, lockToken);\n } catch (error) {\n if (error?.code === 'ENOTDIR') return false;\n if (error?.code === 'ENOENT') {\n if (!canonical) return false;\n const removedPending = removePendingLease(canonical, lockToken);\n return removeVacantLease(canonical) || removedPending;\n }\n throw storageError(error);\n }\n if (lease.owner.pid !== process.pid) return false;\n try {\n removeLease(lease);\n removePendingLease(canonical, lockToken);\n return true;\n } catch (error) {\n if (error?.code === 'ENOENT') return false;\n throw storageError(error);\n }\n}\n\nfunction validPosition(value, label) {\n if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`${label} must be a nonnegative safe integer`);\n return value;\n}\n\nclass AccessHandle {\n #storage;\n #path;\n #fd;\n\n constructor(storage, path, fd) {\n this.#storage = storage;\n this.#path = path;\n this.#fd = fd;\n }\n\n #live() {\n this.#storage.live();\n if (this.#fd === null) throw namedError('InvalidStateError', 'storage access handle is closed');\n return this.#fd;\n }\n\n read(buffer, { at = 0 } = {}) {\n return fs.readSync(this.#live(), buffer, 0, buffer.byteLength, validPosition(at, 'read offset'));\n }\n\n write(buffer, { at = 0 } = {}) {\n validPosition(at, 'write offset');\n validPosition(at + buffer.byteLength, 'write end');\n return fs.writeSync(this.#live(), buffer, 0, buffer.byteLength, at);\n }\n\n getSize() {\n return validPosition(fs.fstatSync(this.#live()).size, 'file size');\n }\n\n truncate(size) {\n fs.ftruncateSync(this.#live(), validPosition(size, 'file size'));\n }\n\n flush() {\n fs.fsyncSync(this.#live());\n }\n\n close() {\n if (this.#fd === null) return;\n const fd = this.#fd;\n this.#fd = null;\n try {\n fs.closeSync(fd);\n } finally {\n this.#storage.handles.delete(this.#path);\n }\n }\n}\n\nclass FileHandle {\n kind = 'file';\n\n constructor(storage, path) {\n this.storage = storage;\n this.path = path;\n this.name = basename(path);\n }\n\n async createSyncAccessHandle() {\n this.storage.check(this.path, 'file');\n if (this.storage.handles.has(this.path)) {\n throw namedError('NoModificationAllowedError', 'storage file already has an access handle');\n }\n let fd;\n try {\n fd = fs.openSync(this.path, fs.constants.O_RDWR | (fs.constants.O_NOFOLLOW ?? 0));\n const stat = fs.fstatSync(fd);\n const expected = this.storage.check(this.path, 'file');\n if (!stat.isFile() || stat.nlink !== 1 || stat.dev !== expected.dev || stat.ino !== expected.ino) {\n throw namedError('SecurityError', 'storage file changed while opening');\n }\n const handle = new AccessHandle(this.storage, this.path, fd);\n this.storage.handles.set(this.path, handle);\n return handle;\n } catch (error) {\n const primary = storageError(error);\n if (fd !== undefined) {\n try {\n fs.closeSync(fd);\n } catch (cleanupError) {\n primary.cleanupErrors = [cleanupError];\n }\n }\n throw primary;\n }\n }\n\n async getFile() {\n return { size: this.storage.check(this.path, 'file').size };\n }\n}\n\nclass DirectoryHandle {\n kind = 'directory';\n\n constructor(storage, path) {\n this.storage = storage;\n this.path = path;\n this.name = basename(path);\n }\n\n async getDirectoryHandle(name, { create = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n try {\n if (create) {\n try {\n fs.mkdirSync(path, { mode: 0o700 });\n syncDirectory(this.path);\n } catch (error) {\n if (error?.code !== 'EEXIST') throw error;\n }\n }\n this.storage.check(path, 'directory');\n return new DirectoryHandle(this.storage, path);\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n async getFileHandle(name, { create = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n try {\n if (create) {\n let fd;\n try {\n fd = fs.openSync(path, 'wx', 0o600);\n fs.fsyncSync(fd);\n } catch (error) {\n if (error?.code !== 'EEXIST') throw error;\n } finally {\n if (fd !== undefined) fs.closeSync(fd);\n }\n if (fd !== undefined) syncDirectory(this.path);\n }\n this.storage.check(path, 'file');\n return new FileHandle(this.storage, path);\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n async *entries() {\n this.storage.check(this.path, 'directory');\n for (const name of fs.readdirSync(this.path).sort()) {\n if (this.path === this.storage.directory && (name === LOCK_DIRECTORY || name.startsWith(PENDING_PREFIX)))\n continue;\n validateName(name);\n const path = join(this.path, name);\n const stat = this.storage.check(path);\n yield [\n name,\n stat.isDirectory() ? new DirectoryHandle(this.storage, path) : new FileHandle(this.storage, path)\n ];\n }\n }\n\n async removeEntry(name, { recursive = false } = {}) {\n this.storage.check(this.path, 'directory');\n const path = join(this.path, validateName(name));\n const stat = this.storage.check(path);\n for (const openPath of this.storage.handles.keys()) {\n if (openPath === path || openPath.startsWith(`${path}${sep}`)) {\n throw namedError('NoModificationAllowedError', 'storage entry has an open access handle');\n }\n }\n try {\n if (stat.isDirectory()) {\n if (recursive) this.storage.removeTree(path);\n else fs.rmdirSync(path);\n } else {\n fs.unlinkSync(path);\n }\n syncDirectory(this.path);\n } catch (error) {\n if (error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n}\n\nclass Storage {\n handles = new Map();\n closed = false;\n\n constructor(directory) {\n this.directory = directory;\n this.identity = entryStat(directory, 'directory');\n }\n\n live() {\n if (this.closed) throw namedError('InvalidStateError', 'Node storage is closed');\n }\n\n check(path, kind) {\n this.live();\n const parts = relative(this.directory, path).split(sep).filter(Boolean);\n if (parts.some((name) => name === '..')) throw namedError('SecurityError', 'storage path leaves its directory');\n let current = this.directory;\n let stat;\n try {\n stat = entryStat(current, 'directory');\n if (stat.dev !== this.identity.dev || stat.ino !== this.identity.ino) {\n throw namedError('SecurityError', 'storage directory changed');\n }\n for (let index = 0; index < parts.length; index += 1) {\n current = join(current, parts[index]);\n stat = entryStat(current, index + 1 === parts.length ? kind : 'directory');\n }\n return stat;\n } catch (error) {\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n\n removeTree(path) {\n for (const name of fs.readdirSync(path)) {\n const child = join(path, validateName(name));\n const stat = this.check(child);\n if (stat.isDirectory()) this.removeTree(child);\n else fs.unlinkSync(child);\n }\n fs.rmdirSync(path);\n }\n}\n\nclass MountedDirectoryHandle {\n kind = 'directory';\n\n constructor(storage, name, childName, child, remove) {\n this.storage = storage;\n this.name = name;\n this.childName = childName;\n this.child = child;\n this.remove = remove;\n }\n\n async getDirectoryHandle(name, { create = false } = {}) {\n this.storage.live();\n if (validateName(name) !== this.childName)\n throw namedError('NotFoundError', 'directory is outside the database mount');\n return this.child(create);\n }\n\n async getFileHandle(name) {\n this.storage.live();\n validateName(name);\n if (name === this.childName) throw namedError('TypeMismatchError', 'mounted entry is a directory');\n throw namedError('NotFoundError', 'file is outside the database mount');\n }\n\n async *entries() {\n this.storage.live();\n let child;\n try {\n child = this.child(false);\n } catch (error) {\n if (error?.name === 'NotFoundError') return;\n throw error;\n }\n yield [this.childName, child];\n }\n\n async removeEntry(name, { recursive = false } = {}) {\n this.storage.live();\n if (validateName(name) !== this.childName)\n throw namedError('NotFoundError', 'directory is outside the database mount');\n if (!this.remove) throw namedError('NoModificationAllowedError', 'the storage mount cannot be removed');\n await this.remove(recursive);\n }\n}\n\nfunction mountedRoot(storage, encodedDbName) {\n const database = new DirectoryHandle(storage, storage.directory);\n database.name = encodedDbName;\n let exists = true;\n const stackdb = new MountedDirectoryHandle(\n storage,\n 'stackdb',\n encodedDbName,\n (create) => {\n if (!exists && !create) throw namedError('NotFoundError', 'database directory does not exist');\n exists = true;\n return database;\n },\n async (recursive) => {\n if (!exists) throw namedError('NotFoundError', 'database directory does not exist');\n const names = [];\n for await (const [name] of database.entries()) names.push(name);\n if (!recursive && names.length !== 0)\n throw namedError('InvalidModificationError', 'database directory is not empty');\n for (const name of names) await database.removeEntry(name, { recursive });\n // Keep the physical database directory and its lease until the worker stops.\n exists = false;\n }\n );\n return new MountedDirectoryHandle(storage, '', 'stackdb', () => stackdb);\n}\n\nexport function ensureStorageRoot(directory, createIfMissing = true) {\n const path = validateDirectory(directory);\n if (!createIfMissing) {\n try {\n entryStat(path, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n return path;\n }\n fs.mkdirSync(path, { recursive: true });\n return path;\n}\n\nexport async function installNodeStorage(\n directory,\n { lockToken = randomUUID(), encodedDbName, createIfMissing = true } = {}\n) {\n if (isMainThread) throw new Error('Node storage must be installed in a dedicated worker');\n if (installedStorage) throw new Error('Node storage is already installed in this worker');\n const path = validateDirectory(directory);\n validateToken(lockToken);\n if (\n encodedDbName !== undefined &&\n (typeof encodedDbName !== 'string' || !/^(?:[a-f\\d]{2})+$/.test(encodedDbName))\n ) {\n throw new TypeError('encodedDbName must be the lowercase hexadecimal UTF-8 database name');\n }\n if (createIfMissing === false) {\n try {\n entryStat(path, 'directory');\n } catch (error) {\n if (error?.code === 'ENOENT') throw namedError('StorageError', MISSING_DATABASE_MESSAGE);\n if (error?.name === 'TypeMismatchError' || error?.name === 'SecurityError') throw error;\n throw storageError(error);\n }\n }\n let canonical;\n try {\n fs.mkdirSync(path, { recursive: true, mode: 0o700 });\n canonical = fs.realpathSync(path);\n entryStat(canonical, 'directory');\n } catch (error) {\n throw storageError(error);\n }\n acquireLease(canonical, lockToken);\n const previousNavigator = Object.getOwnPropertyDescriptor(globalThis, 'navigator');\n let storage;\n try {\n storage = new Storage(canonical);\n } catch (error) {\n releaseNodeStorageLease(canonical, lockToken);\n throw storageError(error);\n }\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n let failure;\n for (const handle of storage.handles.values()) {\n try {\n handle.close();\n } catch (error) {\n failure ??= error;\n }\n }\n storage.closed = true;\n try {\n releaseNodeStorageLease(canonical, lockToken);\n } catch (error) {\n failure ??= error;\n }\n try {\n if (previousNavigator) Object.defineProperty(globalThis, 'navigator', previousNavigator);\n else delete globalThis.navigator;\n } catch (error) {\n failure ??= error;\n }\n installedStorage = null;\n if (failure) throw failure;\n };\n try {\n const root =\n encodedDbName === undefined ? new DirectoryHandle(storage, canonical) : mountedRoot(storage, encodedDbName);\n Object.defineProperty(globalThis, 'navigator', {\n configurable: true,\n value: {\n storage: {\n getDirectory: async () => {\n storage.live();\n return root;\n }\n }\n }\n });\n installedStorage = storage;\n return { directory: canonical, close };\n } catch (error) {\n close();\n throw error;\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { realpath } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { openDBWithWorker } from './index';\nimport { assertCompatibleOptions, invalidateTransactions, normalizeOptions, type RegistryEntry } from './registry';\nimport {\n DatabaseBusyError,\n DatabaseClosedError,\n InvalidOpenOptionsError,\n StorageError,\n normalizeError\n} from './errors';\nimport { NodeWorkerTransport } from './node-worker-client';\nimport { MISSING_DATABASE_MESSAGE, ensureStorageRoot, releaseNodeStorageLease } from './node-storage.mjs';\nimport { workerProtocolError } from './worker-protocol';\nimport type { DB, OpenOptions } from './types';\n\nexport type NodeOpenOptions = Omit<OpenOptions, 'workerMode'> & { directory: string };\nexport interface NodeDeleteOptions {\n directory: string;\n}\n\ninterface NodeRegistryEntry extends RegistryEntry {\n directory: string;\n registryKey: string;\n shutdown: Promise<void> | null;\n}\n\nconst registry = new Map<string, NodeRegistryEntry>();\nconst lifecycleOperations = new Map<string, Promise<void>>();\n\nfunction queueLifecycleOperation<T>(key: string, operation: () => Promise<T>): Promise<T> {\n const previous = lifecycleOperations.get(key) ?? Promise.resolve();\n const result = previous.then(operation);\n const settled = result.then(\n () => undefined,\n () => undefined\n );\n lifecycleOperations.set(key, settled);\n void settled.then(() => {\n if (lifecycleOperations.get(key) === settled) lifecycleOperations.delete(key);\n });\n return result;\n}\n\nfunction validateName(name: unknown, method: string): asserts name is string {\n if (typeof name !== 'string' || name.length === 0) {\n throw new TypeError(`${method}() database name must be a non-empty string`);\n }\n if (/[\\uD800-\\uDFFF]/u.test(name)) {\n throw new TypeError(`${method}() database name must contain valid Unicode`);\n }\n if (Buffer.byteLength(name, 'utf8') > 127) {\n throw new TypeError(`${method}() database name must contain at most 127 UTF-8 bytes`);\n }\n}\n\nfunction validateDirectoryOptions(options: unknown): asserts options is NodeDeleteOptions {\n if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n throw new InvalidOpenOptionsError('Node options must contain directory');\n }\n const directory = (options as NodeDeleteOptions).directory;\n if (typeof directory !== 'string' || directory.length === 0 || directory.includes('\\0')) {\n throw new InvalidOpenOptionsError('directory must be a non-empty filesystem path');\n }\n}\n\nasync function databaseLocation(\n name: string,\n options: NodeDeleteOptions & { createIfMissing?: boolean }\n): Promise<{\n directory: string;\n registryKey: string;\n}> {\n try {\n ensureStorageRoot(options.directory, options.createIfMissing !== false);\n } catch (error) {\n if (error instanceof Error && error.name === 'StorageError') {\n throw new StorageError(error.message || MISSING_DATABASE_MESSAGE);\n }\n throw error;\n }\n const root = await realpath(options.directory);\n const directory = join(root, 'stackdb', Buffer.from(name, 'utf8').toString('hex'));\n const registryKey = process.platform === 'win32' ? directory.toLowerCase() : directory;\n return { directory, registryKey };\n}\n\nfunction invalidateEntry(entry: NodeRegistryEntry): void {\n if (entry.invalidated) return;\n entry.invalidated = true;\n entry.refs = 0;\n invalidateTransactions(entry);\n for (const listener of Array.from(entry.handleInvalidationListeners)) listener();\n}\n\nfunction shutdownEntry(entry: NodeRegistryEntry, reason: Error): Promise<void> {\n if (entry.shutdown) return entry.shutdown;\n entry.proxy.dispose(reason);\n entry.shutdown = Promise.resolve(entry.worker.terminate()).then(() => undefined);\n return entry.shutdown;\n}\n\nfunction createEntry(dbName: string, directory: string, registryKey: string, options: OpenOptions): NodeRegistryEntry {\n const normalized = normalizeOptions({ ...options, workerMode: 'dedicated' });\n const lockToken = randomUUID();\n const channelName = `node:${createHash('sha256').update(registryKey).digest('hex')}`;\n const worker = new NodeWorkerTransport(\n {\n directory,\n dbName,\n channelName,\n lockToken,\n ownerWaitMs: normalized.ownerWaitMs,\n encodedDbName: Buffer.from(dbName, 'utf8').toString('hex'),\n createIfMissing: normalized.createIfMissing\n },\n () => {\n releaseNodeStorageLease(directory, lockToken);\n }\n );\n const entry: NodeRegistryEntry = {\n dbName,\n directory,\n registryKey,\n worker,\n proxy: worker.proxy,\n persistenceBridge: { close() {} },\n options: normalized,\n refs: 1,\n invalidated: false,\n schemaMigrationInProgress: false,\n txInvalidationListeners: new Set(),\n handleInvalidationListeners: new Set(),\n channelName,\n shutdown: null,\n release: () => releaseEntry(entry),\n destroy: () => queueLifecycleOperation(registryKey, () => destroyEntry(entry))\n };\n worker.proxy.setFatalHandler((error) => {\n if (registry.get(registryKey) === entry) registry.delete(registryKey);\n invalidateEntry(entry);\n void queueLifecycleOperation(registryKey, () => shutdownEntry(entry, error)).catch(() => {});\n });\n return entry;\n}\n\nasync function acquireEntry(\n dbName: string,\n directory: string,\n registryKey: string,\n options: OpenOptions\n): Promise<RegistryEntry> {\n const normalized = normalizeOptions({ ...options, workerMode: 'dedicated' });\n return queueLifecycleOperation(registryKey, async () => {\n const existing = registry.get(registryKey);\n if (existing && !existing.invalidated) {\n if (existing.schemaMigrationInProgress) {\n throw new DatabaseBusyError(`database ${dbName} is migrating; wait for openNodeDB() to resolve`);\n }\n assertCompatibleOptions(dbName, existing.options, normalized);\n if (normalized.debugFailpoint !== null) await existing.proxy.setFailpoint(normalized.debugFailpoint);\n existing.refs += 1;\n return existing;\n }\n const entry = createEntry(dbName, directory, registryKey, options);\n try {\n await entry.proxy.open({ dbName, options: normalized });\n if (entry.invalidated) throw new DatabaseClosedError();\n registry.set(registryKey, entry);\n return entry;\n } catch (error) {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker open failed'));\n throw normalizeError(error);\n }\n });\n}\n\nasync function releaseEntry(entry: NodeRegistryEntry): Promise<void> {\n return queueLifecycleOperation(entry.registryKey, async () => {\n if (entry.invalidated || registry.get(entry.registryKey) !== entry) {\n if (entry.shutdown) await entry.shutdown;\n return;\n }\n entry.refs -= 1;\n if (entry.refs > 0) return;\n registry.delete(entry.registryKey);\n try {\n await entry.proxy.close();\n } finally {\n invalidateEntry(entry);\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker was released'));\n }\n });\n}\n\nasync function destroyEntry(entry: NodeRegistryEntry): Promise<void> {\n if (entry.invalidated || registry.get(entry.registryKey) !== entry) throw new DatabaseClosedError();\n registry.delete(entry.registryKey);\n invalidateEntry(entry);\n try {\n await entry.proxy.destroy();\n } finally {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node database was destroyed'));\n }\n}\n\nexport async function openNodeDB(name: string, options: NodeOpenOptions): Promise<DB> {\n validateName(name, 'openNodeDB');\n validateDirectoryOptions(options);\n const { directory, registryKey } = await databaseLocation(name, options);\n return openDBWithWorker(name, options, (dbName, openOptions) =>\n acquireEntry(dbName, directory, registryKey, openOptions)\n );\n}\n\nexport async function deleteNodeDB(name: string, options: NodeDeleteOptions): Promise<void> {\n validateName(name, 'deleteNodeDB');\n validateDirectoryOptions(options);\n const { directory, registryKey } = await databaseLocation(name, options);\n return queueLifecycleOperation(registryKey, async () => {\n const existing = registry.get(registryKey);\n if (existing) return destroyEntry(existing);\n const entry = createEntry(name, directory, registryKey, {});\n try {\n await entry.proxy.deleteDB(name);\n } finally {\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node delete worker was released'));\n }\n });\n}\n\nexport async function unsafeDebugCrashNodeWorker(name: string, options: NodeDeleteOptions): Promise<boolean> {\n validateName(name, 'unsafeDebugCrashNodeWorker');\n validateDirectoryOptions(options);\n const { registryKey } = await databaseLocation(name, options);\n return queueLifecycleOperation(registryKey, async () => {\n const entry = registry.get(registryKey);\n if (!entry) return false;\n registry.delete(registryKey);\n invalidateEntry(entry);\n await shutdownEntry(entry, workerProtocolError('WorkerTerminatedError', 'Node worker was terminated'));\n return true;\n });\n}\n\nexport * from './codec';\nexport * from './errors';\nexport * from './indexing';\nexport * from './records';\nexport * from './sql';\nexport { SqlSyntaxError } from './sql-parser';\nexport type * from './sql-types';\nexport type * from './types';\n"],"mappings":";;;;;;;AAgEA,SAAS,oBAAoB,SAA+B;CACxD,IAAI,QAAQ,SAAS;EACjB,aAAa,QAAQ,OAAO;EAC5B,QAAQ,UAAU;CACtB;AACJ;AA+BA,IAAa,uBAAb,MAAuD;CAoB9B;CAnBrB,gBAAwB;CACxB,0BAAkB,IAAI,IAA4B;CAClD,SAAiB;CACjB,gBAAwB;CACxB,eAA4C;CAC5C,cAAuD;CACvD;CACA;CACA,eAAwD;CACxD,cAAoC;CACpC,WAAmB;CACnB,iBAA0C,CAAC;CAC3C,cAAsB;CACtB,iBAAyB;CACzB,gBAAwB;CACxB,eAA6D;CAC7D;CAEA,YACI,QACA,UAAuC,CAAC,GAC1C;EAFmB,KAAA,SAAA;EAGjB,KAAK,qBAAqB,QAAQ,uBAAuB;EACzD,KAAK,mBAAmB,kBAAkB,QAAQ,oBAAoB,CAAC;EACvE,KAAK,QAAQ,IAAI,SAAe,SAAS,WAAW;GAChD,KAAK,eAAe;GACpB,KAAK,cAAc;EACvB,CAAC;EACD,MAAM,iBAAiB,kBAAkB,QAAQ,kBAAkB,CAAC;EACpE,IAAI,iBAAiB,GACjB,KAAK,eAAe,iBAAiB;GACjC,KAAK,KAAK,oBAAoB,2BAA2B,6BAA6B,CAAC;EAC3F,GAAG,cAAc;EAErB,KAAU,MAAM,YAAY,KAAA,CAAS;EACrC,KAAK,OAAO,iBAAiB,WAAW,KAAK,aAA8B;EAC3E,KAAK,OAAO,iBAAiB,gBAAgB,KAAK,kBAAkB;EACpE,KAAK,OAAO,iBAAiB,SAAS,KAAK,WAA4B;CAC3E;CAEA,gBAAgB,SAAgD;EAC5D,KAAK,eAAe;CACxB;CAEA,YAA2B;EACvB,OAAO,KAAK;CAChB;CAEA,QAAQ,SAAgB,oBAAoB,yBAAyB,6BAA6B,GAAS;EACvG,KAAK,gBAAgB,QAAQ,KAAK;CACtC;CAEA,KAAe,QAAqB;EAChC,KAAK,gBAAgB,QAAQ,IAAI;CACrC;CAEA,KAAK,SAA2C;EAC5C,OAAO,KAAK,QAAQ,QAAQ,CAAC,OAAO,CAAC;CACzC;CAEA,QAAuB;EACnB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,UAAyB;EACrB,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,SAAS,QAA+B;EACpC,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,CAAC;CAC5C;CAEA,MAAM,MAA+B;EACjC,OAAO,KAAK,QAAQ,SAAS,CAAC,IAAI,CAAC;CACvC;CAEA,OAAO,MAA+B;EAClC,OAAO,KAAK,QAAQ,UAAU,CAAC,IAAI,CAAC;CACxC;CAEA,SAAS,MAA6B;EAClC,OAAO,KAAK,QAAQ,YAAY,CAAC,IAAI,CAAC;CAC1C;CAEA,WACI,MACA,SACA,MAC+B;EAC/B,OAAO,KAAK,KAAK,cAAc;GAAC;GAAM;GAAS;EAAiB,GAAG,OAAO;CAC9E;CAEA,YAAY,MAAc,MAAc,SAA6C;EACjF,OAAO,KAAK,QAAQ,eAAe;GAAC;GAAM;GAAM;EAAO,CAAC;CAC5D;CAEA,UAAU,MAAc,MAA6B;EACjD,OAAO,KAAK,QAAQ,aAAa,CAAC,MAAM,IAAI,CAAC;CACjD;CAEA,WAAW,MAAc,MAA6B;EAClD,OAAO,KAAK,QAAQ,cAAc,CAAC,MAAM,IAAI,CAAC;CAClD;CAEA,IAAI,MAAc,OAAe,KAA6C;EAC1E,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;EAAG,CAAC;CACjD;CAEA,QAAQ,MAAc,OAAe,MAA4D;EAC7F,OAAO,KAAK,QAAQ,WAAW;GAAC;GAAM;GAAO;EAAI,CAAC;CACtD;CAEA,IAAI,MAAc,OAAe,KAAmC;EAChE,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;EAAG,CAAC;CACjD;CAEA,IAAI,MAAc,OAAe,KAAiB,OAAmB,SAAqC;EACtG,OAAO,KAAK,QAAQ,OAAO;GAAC;GAAM;GAAO;GAAK;GAAO;EAAO,CAAC;CACjE;CAEA,QACI,MACA,OACA,SACA,SACa;EACb,OAAO,KAAK,QAAQ,WAAW;GAAC;GAAM;GAAO;GAAS;EAAO,CAAC;CAClE;CAEA,OAAO,MAAc,OAAe,KAAmC;EACnE,OAAO,KAAK,QAAQ,UAAU;GAAC;GAAM;GAAO;EAAG,CAAC;CACpD;CAEA,WAAW,MAAc,OAAe,MAAwC;EAC5E,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;EAAI,CAAC;CACzD;CAEA,WAAW,MAAc,OAAe,KAAoC;EACxE,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;EAAG,CAAC;CACxD;CAEA,KAAK,MAAc,OAAe,OAAmC;EACjE,OAAO,KAAK,QAAQ,QAAQ;GAAC;GAAM;GAAO;EAAK,CAAC;CACpD;CAEA,SAAS,SAAyD;EAC9D,OAAO,KAAK,QAAQ,YAAY,CAAC,OAAO,CAAC;CAC7C;CAEA,YAAY,UAAiC;EACzC,OAAO,KAAK,QAAQ,eAAe,CAAC,QAAQ,CAAC;CACjD;CAEA,WAAW,MAAc,OAAe,WAAmB,KAA6C;EACpG,OAAO,KAAK,QAAQ,cAAc;GAAC;GAAM;GAAO;GAAW;EAAG,CAAC;CACnE;CAEA,YAAY,MAAc,OAAe,WAAmB,OAAmC;EAC3F,OAAO,KAAK,QAAQ,eAAe;GAAC;GAAM;GAAO;GAAW;EAAK,CAAC;CACtE;CAEA,gBACI,MACA,OACA,WACA,OACA,QACA,OACA,UACsB;EACtB,OAAO,KAAK,QAAQ,mBAAmB;GAAC;GAAM;GAAO;GAAW;GAAO;GAAQ;GAAO;EAAQ,CAAC;CACnG;CAEA,WAAW,MAAoC;EAC3C,OAAO,KAAK,QAAQ,cAAc,SAAS,KAAA,IAAY,CAAC,IAAI,CAAC,IAAI,CAAC;CACtE;CAEA,iBAAiB,MAAc,SAAoC;EAC/D,OAAO,KAAK,QAAQ,oBAAoB,CAAC,MAAM,OAAO,CAAC;CAC3D;CAEA,aAAgC;EAC5B,OAAO,KAAK,QAAQ,cAAc,CAAC,CAAC;CACxC;CAEA,aAA8B;EAC1B,OAAO,KAAK,QAAQ,cAAc,CAAC,CAAC;CACxC;CAEA,aAAa,MAAc,SAAiD;EACxE,OAAO,KAAK,QAAQ,gBAAgB,CAAC,MAAM,OAAO,CAAC;CACvD;CAEA,iBAAiB,MAAc,SAAgC;EAC3D,OAAO,KAAK,QAAQ,oBAAoB,CAAC,MAAM,OAAO,CAAC;CAC3D;CAEA,eAAe,SAAsD;EACjE,OAAO,KAAK,QAAQ,kBAAkB,CAAC,OAAO,CAAC;CACnD;CAEA,eAAe,MAAiC;EAC5C,OAAO,KAAK,QAAQ,kBAAkB,CAAC,IAAI,CAAC;CAChD;CAEA,QAAuB;EACnB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,UAAqC;EACjC,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,UAAqC;EACjC,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC;CACrC;CAEA,QAA0B;EACtB,OAAO,KAAK,QAAQ,SAAS,CAAC,CAAC;CACnC;CAEA,cAAoC;EAChC,OAAO,KAAK,QAAQ,eAAe,CAAC,CAAC;CACzC;CAEA,qBAAuC;EACnC,OAAO,KAAK,QAAQ,sBAAsB,CAAC,CAAC;CAChD;CAEA,aAAa,WAA0C;EACnD,OAAO,KAAK,QAAQ,gBAAgB,CAAC,SAAS,CAAC;CACnD;CAEA,MAAM,QAAiC,SAAY,MAA6D;EAC5G,OAAQ,MAAM,KAAK,KAAK,SAAS,MAAM,OAAO;CAClD;CAEA,MAAc,KACV,SACA,MACA,iBACgB;EAChB,KAAK,WAAW;EAChB,KAAK,iBAAiB;EACtB,IAAI;GACA,MAAM,KAAK;EACf,UAAU;GACN,KAAK,iBAAiB;EAC1B;EACA,KAAK,WAAW;EAEhB,MAAM,cAAc,KAAK,aAAa,KAAK,gBAAgB,KAAK,KAAK,eAAe,SAAS;EAC7F,MAAM,KAAK,KAAK;EAChB,KAAK,iBAAiB;EACtB,MAAM,WAAW,4BAA4B,SAAS,IAAI;EAC1D,MAAM,UAAwC;GAC1C,MAAM;GACN,SAAA;GACA;GACA;GACA,MAAM,SAAS;EACnB;EACA,OAAO,MAAM,IAAI,SAAkB,SAAS,WAAW;GACnD,MAAM,UACF,KAAK,mBAAmB,IAClB,iBAAiB;IACb,MAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;IACnC,IAAI,CAAC,WAAW,QAAQ,YAAY,MAChC;IAEJ,KAAK,QAAQ,OAAO,EAAE;IACtB,QAAQ,UAAU;IAClB,OACI,oBACI,6BACA,kBAAkB,QAAQ,mBAAmB,KAAK,iBAAiB,GACvE,CACJ;GACJ,GAAG,KAAK,gBAAgB,IACxB;GACV,KAAK,QAAQ,IAAI,IAAI;IACjB,SAAS;IACT;IACA;IACA;GACJ,CAAC;GACD,IAAI;IACA,IAAI,aACA,KAAK,aAAa,SAAS,SAAS,QAAQ;SACzC,IAAI,SAAS,SAAS,SAAS,GAClC,KAAK,OAAO,YAAY,SAAS,SAAS,QAAQ;SAElD,KAAK,OAAO,YAAY,OAAO;GAEvC,SAAS,OAAO;IACZ,KAAK,cAAc,IAAI,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;GACpF;EACJ,CAAC;CACL;CAEA,aAAqB,SAAuC,UAAgC;EACxF,IAAI,CAAC,KAAK,QAAQ,IAAI,QAAQ,EAAE,GAAG;EACnC,MAAM,aAAa,aAAa,OAAO;EACvC,IAAI,KAAK,eAAe,SAAS,KAAK,KAAK,cAAc,aAAA,SACrD,KAAK,cAAc;EAMvB,IAFI,KAAK,eAAe,SAAS,KAAA,OAC7B,KAAK,cAAc,cAAA,SACP;GACZ,KAAK,eAAe,KAAK;IAAE;IAAS;IAAU;GAAW,CAAC;GAC1D,KAAK,eAAe;GACpB,KAAK,cAAc;GACnB;EACJ;EACA,MAAM,WAAW,sBAAsB,SAAS,QAAQ;EACxD,IAAI,CAAC,KAAK,QAAQ,IAAI,QAAQ,EAAE,GAAG;EACnC,KAAK,eAAe,KAAK;GACrB,SAAS,SAAS;GAClB,UAAU,SAAS;GACnB,YAAY,SAAS;EACzB,CAAC;EACD,KAAK,eAAe,SAAS;EAC7B,IAAI,CAAC,KAAK,gBAAgB;GACtB,KAAK,iBAAiB;GACtB,qBAAqB;IACjB,KAAK,iBAAiB;IACtB,KAAK,cAAc;GACvB,CAAC;EACL;CACJ;CAEA,gBAA8B;EAC1B,MAAM,SAAS,KAAK;EACpB,KAAK,iBAAiB,CAAC;EACvB,KAAK,cAAc;EACnB,IAAI,KAAK,QAAQ;EACjB,MAAM,SAAS,OAAO,QAAQ,UAAU,KAAK,QAAQ,IAAI,MAAM,QAAQ,EAAE,CAAC;EAC1E,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,UACF,OAAO,WAAW,IACZ,OAAO,EAAE,CAAC,UACV;GACI,MAAM;GACN,SAAA;GACA,UAAU,OAAO,KAAK,UAAU,MAAM,OAAO;EACjD;EACV,MAAM,WAA2B,CAAC;EAClC,KAAK,MAAM,SAAS,QAChB,KAAK,MAAM,UAAU,MAAM,UAAU,SAAS,KAAK,MAAM;EAE7D,IAAI;GACA,IAAI,SAAS,SAAS,GAClB,KAAK,OAAO,YAAY,SAAS,QAAQ;QAEzC,KAAK,OAAO,YAAY,OAAO;EAEvC,SAAS,OAAO;GACZ,MAAM,SAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;GACvE,KAAK,MAAM,SAAS,QAAQ,KAAK,cAAc,MAAM,QAAQ,IAAI,MAAM;EAC3E;CACJ;CAEA,aAA2B;EACvB,IAAI,KAAK,QACL,MAAM,KAAK,eAAe,oBAAoB,yBAAyB,4BAA4B;CAE3G;CAEA,iBAAyB,UAAuC;EAC5D,MAAM,OAAO,MAAM;EACnB,IAAI,6BAA6B,IAAI,GAAG;GACpC,IAAI,KAAK,eAAe;GACxB,KAAK,WAAW,KAAK,aAAa;GAClC,KAAK,gBAAgB;GACrB,IAAI,KAAK,cAAc,aAAa,KAAK,YAAY;GACrD,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,cAAc;GACnB;EACJ;EACA,IAAI,8BAA8B,IAAI,GAAG;GACrC,KAAK,KAAK,oBAAoB,uBAAuB,4CAA4C,CAAC;GAClG;EACJ;EACA,IACI,WAAS,IAAI,MACZ,KAAK,SAAA,qCAAqC,KAAK,SAAA,4CAChD,KAAK,YAAA,GACP;GACE,KAAK,KAAK,oBAAoB,uBAAuB,uCAAuC,CAAC;GAC7F;EACJ;EACA,IAAI,qCAAqC,IAAI,GAAG;GAC5C,KAAK,MAAM,YAAY,KAAK,WAAW,KAAK,eAAe,QAAQ;GACnE;EACJ;EACA,IACI,WAAS,IAAI,KACb,KAAK,SAAA,2CACL,KAAK,YAAA,GACP;GACE,KAAK,KAAK,oBAAoB,uBAAuB,+BAA+B,CAAC;GACrF;EACJ;EACA,KAAK,eAAe,IAAI;CAC5B;CAEA,eAAuB,MAAqB;EACxC,IAAI,CAAC,gCAAgC,IAAI,GAAG;GACxC,IACI,WAAS,IAAI,KACb,KAAK,SAAA,qCACL,KAAK,YAAA,KACL,OAAO,KAAK,OAAO,YACnB,OAAO,cAAc,KAAK,EAAE,GAE5B,KAAK,cAAc,KAAK,IAAI,oBAAoB,uBAAuB,yBAAyB,CAAC;GAErG;EACJ;EACA,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK,EAAE;EACxC,IAAI,CAAC,SACD;EAEJ,KAAK,QAAQ,OAAO,KAAK,EAAE;EAC3B,oBAAoB,OAAO;EAC3B,IAAI;GACA,IAAI,KAAK,IACL,QAAQ,QACJ,KAAK,uBACA,QAAQ,YAAY,cACjB,QAAQ,YAAY,UACpB,QAAQ,YAAY,iBACpB,QAAQ,YAAY,qBACtB,KAAK,SACL,4BAA4B,QAAQ,SAAS,KAAK,MAAM,CAClE;QAEA,QAAQ,OAAO,uBAAuB,KAAK,KAAK,CAAC;EAEzD,SAAS,OAAO;GACZ,QAAQ,OACJ,iBAAiB,SAAS,MAAM,SAAS,wBACnC,QACA,oBAAoB,uBAAuB,sCAAsC,CAC3F;EACJ;CACJ;CAEA,2BAAyC;EACrC,KAAK,KAAK,oBAAoB,sBAAsB,0CAA0C,CAAC;CACnG;CAEA,eAAuB,UAA4B;EAC/C,MAAM,QACF,MAAM,iBAAiB,QACjB,MAAM,QACN,oBAAoB,eAAe,MAAM,WAAW,uBAAuB;EACrF,KAAK,KAAK,KAAK;CACnB;CAEA,cAAsB,IAAY,OAAoB;EAClD,MAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;EACnC,IAAI,CAAC,SACD;EAEJ,KAAK,QAAQ,OAAO,EAAE;EACtB,oBAAoB,OAAO;EAC3B,QAAQ,OAAO,KAAK;CACxB;CAEA,gBAAwB,QAAe,aAA4B;EAC/D,IAAI,KAAK,QACL;EAEJ,KAAK,SAAS;EACd,KAAK,cAAc;EACnB,KAAK,OAAO,oBAAoB,WAAW,KAAK,aAA8B;EAC9E,KAAK,OAAO,oBAAoB,gBAAgB,KAAK,kBAAkB;EACvE,KAAK,OAAO,oBAAoB,SAAS,KAAK,WAA4B;EAC1E,IAAI,KAAK,cAAc,aAAa,KAAK,YAAY;EACrD,KAAK,eAAe;EACpB,IAAI,CAAC,KAAK,eACN,KAAK,cAAc,MAAM;EAE7B,KAAK,eAAe;EACpB,KAAK,cAAc;EACnB,KAAK,iBAAiB,CAAC;EACvB,KAAK,cAAc;EACnB,KAAK,MAAM,WAAW,KAAK,QAAQ,OAAO,GAAG;GACzC,oBAAoB,OAAO;GAC3B,QAAQ,OAAO,MAAM;EACzB;EACA,KAAK,QAAQ,MAAM;EACnB,IAAI,aACA,KAAK,eAAe,MAAM;CAElC;AACJ;AAQA,IAAM,6CAA6B,IAAI,IAAY;CAC/C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC;;;;;AAMD,SAAS,sBACL,OACA,UAC0D;CAC1D,MAAM,yBAAS,IAAI,IAAiB;CACpC,KAAK,MAAM,QAAQ,UAAU;EACzB,IAAI,EAAE,gBAAgB,gBAAgB,kBAAkB,IAAI,GACxD,OAAO,qBAAqB,OAAO,QAA0B;EAEjE,OAAO,IAAI,IAAI;CACnB;CACA,MAAM,6BAAa,IAAI,IAAmC;CAC1D,IAAI,CAAC,eAAe,OAAO,4BAAY,IAAI,QAAgB,CAAC,GACxD,OAAO,qBAAqB,OAAO,QAA0B;CAEjE,MAAM,4BAAY,IAAI,IAA8B;CACpD,KAAK,MAAM,UAAU,QACjB,UAAU,IAAI,QAAQ,gBAAgB,MAAM,CAAC;CAEjD,MAAM,QAAuB,CAAC;CAC9B,MAAM,uBAAO,IAAI,QAAyB;CAC1C,MAAM,cAAc,SAA2B;EAC3C,IAAI,SAAS,QAAQ,OAAO,SAAS,UACjC,OAAO;EAEX,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,IAAI,aAAa,KAAA,GACb,OAAO;EAEX,IAAI,OAAO,sBAAsB,eAAe,gBAAgB,mBAAmB;GAC/E,KAAK,IAAI,MAAM,IAAI;GACnB,OAAO;EACX;EACA,IAAI,gBAAgB,aAAa;GAC7B,MAAM,OAAO,UAAU,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;GAChD,KAAK,IAAI,MAAM,IAAI;GACnB,MAAM,KAAK,IAAI;GACf,OAAO;EACX;EACA,IAAI,YAAY,OAAO,IAAI,GAAG;GAC1B,MAAM,WAAW,WAAW,IAAI,IAAI;GACpC,IAAI,CAAC,UACD,MAAM,oBAAoB,uBAAuB,oCAAoC;GAEzF,MAAM,SAAS,KAAK;GAKpB,MAAM,MAAM,aAAa,MAHrB,OAAO,sBAAsB,eAAe,kBAAkB,oBACxD,SACC,WAAW,MAAM,GACe,QAAQ;GACnD,KAAK,IAAI,MAAM,GAAG;GAClB,OAAO;EACX;EACA,IAAI,MAAM,QAAQ,IAAI,GAAG;GACrB,MAAM,MAAM,IAAI,MAAe,KAAK,MAAM;GAC1C,KAAK,IAAI,MAAM,GAAG;GAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAC9C,IAAI,SAAS,MACT,IAAI,SAAS,WAAW,KAAK,MAAM;GAG3C,OAAO;EACX;EACA,MAAM,MAA+B,OAAO,eAAe,IAAI,MAAM,OAAO,OAAO,OAAO,IAAI,IAAI,CAAC;EACnG,KAAK,IAAI,MAAM,GAAG;EAClB,MAAM,SAAS;EACf,KAAK,MAAM,OAAO,QACd,IAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAChD,IAAI,OAAO,WAAW,OAAO,IAAI;EAGzC,OAAO;CACX;CACA,MAAM,SAAS,WAAW,KAAK;CAC/B,OAAO;EAAE,OAAO;EAAQ,UAAU;EAAO,YAAY,aAAa,MAAM;CAAE;AAC9E;AAEA,SAAS,aAAa,OAAwB;CAC1C,IAAI,aAAa;CACjB,MAAM,uBAAO,IAAI,QAAgB;CACjC,MAAM,SAAS,SAAwB;EACnC,IAAI,CAAC,OAAO,SAAS,UAAU,GAAG;EAClC,IAAI,OAAO,SAAS,UAAU;GAC1B,cAAc,IAAI,KAAK,SAAS;GAChC;EACJ;EACA,IAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;GAC3C,cAAc;GACd;EACJ;EACA,IAAI,KAAK,IAAI,IAAI,GACb;EAEJ,KAAK,IAAI,IAAI;EACb,cAAc;EACd,IAAI,gBAAgB,aAChB,cAAc,KAAK;OAChB,IAAI,OAAO,sBAAsB,eAAe,gBAAgB,mBACnE,cAAc,KAAK;OAChB,IAAI,YAAY,OAAO,IAAI,GAC9B,MAAM,KAAK,MAAM;OACd,IAAI,MAAM,QAAQ,IAAI,GAAG;GAC5B,IAAI,OAAO,eAAe,IAAI,MAAM,MAAM,aAAa,aAAa,IAAI,GAAG;IACvE,aAAa,OAAO;IACpB;GACJ;GACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;IACjD,MAAM,aAAa,OAAO,yBAAyB,MAAM,OAAO,KAAK,CAAC;IACtE,IAAI,cAAc,EAAE,WAAW,aAAa;KACxC,aAAa,OAAO;KACpB;IACJ;IACA,MAAM,YAAY,KAAK;GAC3B;EACJ,OAAO,IAAI,gBAAgB,KACvB,KAAK,MAAM,CAAC,KAAK,UAAU,MAAM;GAC7B,MAAM,GAAG;GACT,MAAM,KAAK;EACf;OACG,IAAI,gBAAgB,KACvB,KAAK,MAAM,SAAS,MAChB,MAAM,KAAK;OAEZ;GACH,MAAM,SAAS;GACf,KAAK,MAAM,OAAO,QACd,IAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;IACnD,MAAM,aAAa,OAAO,yBAAyB,QAAQ,GAAG;IAE9D,IAAI,QAAQ,eAAe,CAAC,cAAc,EAAE,WAAW,aAAa;KAChE,aAAa,OAAO;KACpB;IACJ;IACA,cAAc,IAAI,IAAI,SAAS;IAC/B,MAAM,WAAW,KAAK;GAC1B;EAER;CACJ;CACA,MAAM,KAAK;CACX,OAAO;AACX;AAEA,SAAS,eACL,OACA,YACA,MACO;CACP,IAAI,OAAO,UAAU,cAAc,OAAO,UAAU,UAChD,OAAO;CAEX,IAAI,UAAU,QAAQ,OAAO,UAAU,UACnC,OAAO;CAEX,IAAI,KAAK,IAAI,KAAK,GACd,OAAO;CAEX,KAAK,IAAI,KAAK;CACd,IAAI,OAAO,sBAAsB,eAAe,iBAAiB,mBAC7D,OAAO,CAAC,kBAAkB,KAAK;CAEnC,IAAI,iBAAiB,aACjB,OAAO,CAAC,kBAAkB,KAAK;CAEnC,IAAI,YAAY,OAAO,KAAK,GAAG;EAC3B,IAAI,CAAC,eAAe,KAAK,GACrB,OAAO;EAEX,MAAM,SAAS,MAAM;EACrB,IAAI,OAAO,sBAAsB,eAAe,kBAAkB,mBAAmB;GACjF,IAAI,kBAAkB,MAAM,GACxB,OAAO;GAEX,WAAW,IAAI,OAAO,aAAa,KAAK,CAAC;GACzC,OAAO;EACX;EACA,IAAI,EAAE,kBAAkB,gBAAgB,kBAAkB,MAAM,GAC5D,OAAO;EAEX,WAAW,IAAI,OAAO,aAAa,KAAK,CAAC;EACzC,OAAO;CACX;CACA,IAAI,iBAAiB,OAAO,iBAAiB,OAAO,iBAAiB,QAAQ,iBAAiB,QAC1F,OAAO;CAEX,IAAI,MAAM,QAAQ,KAAK,GAAG;EACtB,IAAI,aAAa,KAAK,KAAK,qBAAqB,KAAK,GACjD,OAAO;EAEX,KAAK,MAAM,SAAS,OAChB,IAAI,CAAC,eAAe,OAAO,YAAY,IAAI,GACvC,OAAO;EAGf,OAAO;CACX;CACA,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,UAAU,OAAO,aAAa,UAAU,MACxC,OAAO;CAEX,IAAI,qBAAqB,KAAK,GAC1B,OAAO;CAEX,MAAM,SAAS;CACf,KAAK,MAAM,OAAO,QACd,IAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,KAAK,CAAC,eAAe,OAAO,MAAM,YAAY,IAAI,GAClG,OAAO;CAGf,OAAO;AACX;AAEA,SAAS,aAAa,OAAoC;CACtD,MAAM,SAAiB;CACvB,KAAK,MAAM,OAAO,QAAQ;EACtB,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAChD;EAEJ,MAAM,QAAQ,OAAO,GAAG;EACxB,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,MAAM,UAAU,OAAO,KAAK,MAAM,KACpF,OAAO;CAEf;CACA,OAAO;AACX;AAEA,SAAS,qBAAqB,OAAwB;CAClD,KAAK,MAAM,UAAU,OAAO,sBAAsB,KAAK,GACnD,IAAI,OAAO,UAAU,qBAAqB,KAAK,OAAO,MAAM,GACxD,OAAO;CAGf,OAAO;AACX;AAEA,SAAS,eAAe,MAAgC;CACpD,OAAO,2BAA2B,IAAI,KAAK,WAAW;AAC1D;AAEA,SAAS,aAAa,MAAqC;CACvD,IAAI,gBAAgB,UAChB,OAAO;EAAE,QAAQ,KAAK;EAAY,QAAQ,KAAK;EAAY,UAAU;CAAK;CAE9E,OAAO;EAAE,QAAQ,KAAK;EAAY,QAAS,KAAoB;EAAQ,UAAU;CAAM;AAC3F;AAEA,SAAS,aAAa,MAAuB,QAAyB,UAAyC;CAC3G,IAAI,SAAS,UACT,OAAO,IAAI,SAAS,QAAQ,SAAS,QAAQ,SAAS,MAAM;CAEhE,MAAM,QAAQ,KAAK;CAKnB,OAAO,IAAI,MAAM,QAAQ,SAAS,QAAQ,SAAS,MAAM;AAC7D;AAEA,SAAS,gBAAgB,QAAkC;CACvD,MAAM,UAAU;CAChB,IAAI,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,SAAS;CAE5B,OAAO,gBAAgB,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;AACzD;AAEA,SAAS,kBAAkB,QAAkD;CACzE,OAAQ,OAAmC,cAAc;AAC7D;;;ACt3BA,IAAM,mCAAmB,IAAI,IAAmC;CAC5D;CACA;CACA;AACJ,CAAC;AAmCD,IAAM,mCAAmC;AAgBzC,IAAM,6BAAW,IAAI,IAA2B;AAChD,IAAM,wCAAsB,IAAI,IAA2B;AAC3D,SAAS,0BAA2B,QAAgB,WAA6C;CAE7F,MAAM,UADW,sBAAoB,IAAI,MAAM,KAAK,QAAQ,QAAQ,EAAA,CAC5C,KAAK,SAAS;CACtC,MAAM,UAAU,OAAO,WACb,KAAA,SACA,KAAA,CACV;CACA,sBAAoB,IAAI,QAAQ,OAAO;CACvC,QAAa,WAAW;EACpB,IAAI,sBAAoB,IAAI,MAAM,MAAM,SACpC,sBAAoB,OAAO,MAAM;CAEzC,CAAC;CACD,OAAO;AACX;AACA,SAAS,0BAA0B,SAAkD;CACjF,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,IAAI,wBAAwB,gCAAgC;AAE1E;AACA,SAAS,iBAAiB,OAAgB,OAAe,cAAgC;CACrF,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,OAAO,UAAU,WACjB,MAAM,IAAI,wBAAwB,GAAG,MAAM,mBAAmB;CAElE,OAAO;AACX;AACA,SAAS,4BAA4B,OAAgB,OAAe,cAA8B;CAC9F,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,IAAI,wBAAwB,GAAG,MAAM,qCAAqC;CAEpF,OAAO;AACX;AACA,SAAS,oBAAoB,OAAwB;CACjD,OAAO,KAAK,IAAI,GAAG,4BAA4B,OAAO,cAAc,GAAG,CAAC;AAC5E;AACA,SAAS,mBAAmB,OAAgC;CACxD,IAAI,UAAU,KAAA,KAAa,UAAU,MACjC,OAAO;CAEX,IAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,IAAI,KAAsC,GACzF,MAAM,IAAI,wBAAwB,kCAAkC,MAAM,KAAK,gBAAgB,CAAC,CAAC,KAAK,IAAI,GAAG;CAEjH,OAAO;AACX;AACA,SAAS,oBAAoB,OAAqD;CAC9E,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAClE,MAAM,IAAI,wBAAwB,8BAA8B;CAEpE,MAAM,WAAW;CACjB,MAAM,UAAU,iBAAiB,SAAS,SAAS,sBAAsB,IAAI;CAC7E,IAAI,cAA6B;CACjC,IAAI,SAAS,gBAAgB,MACzB,cAAc;MACX,IAAI,SAAS,gBAAgB,KAAA,GAAW;EAC3C,cAAc,4BAA4B,SAAS,aAAa,0BAA0B,CAAC;EAC3F,IAAI,gBAAgB,GAChB,MAAM,IAAI,wBAAwB,mEAAmE;CAE7G;CACA,OAAO;EAAE;EAAS;CAAY;AAClC;AACA,SAAS,oBAAoB,OAAqD;CAC9E,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,UAAU,eAAe,UAAU,UACnC,MAAM,IAAI,wBAAwB,wCAAwC;CAE9E,OAAO;AACX;AACA,SAAgB,iBAAiB,UAAuB,CAAC,GAA0B;CAC/E,0BAA0B,OAAO;CACjC,OAAO;EACH,YAAY,oBAAoB,QAAQ,UAAU;EAClD,iBAAiB,iBAAiB,QAAQ,iBAAiB,mBAAmB,IAAI;EAClF,aAAa,4BAA4B,QAAQ,aAAa,eAAe,CAAC;EAC9E,oBAAoB,iBAAiB,QAAQ,oBAAoB,sBAAsB,IAAI;EAC3F,YAAY,oBAAoB,QAAQ,UAAU;EAClD,gBAAgB,mBAAmB,QAAQ,cAAc;EACzD,YAAY,oBAAoB,QAAQ,UAAU;CACtD;AACJ;AACA,SAAS,eAAe,MAA2C,OAA4C;CAC3G,OAAO,MAAM,YAAY,OAAO,WAAW,MAAM,gBAAgB,OAAO;AAC5E;AACA,SAAS,oBACL,QACA,SACA,MACa;CACb,IAAI,QAAQ,eAAe,KAAK,YAC5B,OAAO,YAAY,OAAO,mCAAmC,QAAQ;CAEzE,IAAI,QAAQ,eAAe,KAAK,YAC5B,OAAO,YAAY,OAAO,+CAA+C,QAAQ,WAAW,yBAAyB,KAAK;CAE9H,IAAI,KAAK,eAAe,QAAQ,CAAC,eAAe,QAAQ,YAAY,KAAK,UAAU,GAC/E,OAAO,YAAY,OAAO;CAE9B,OAAO;AACX;AACA,SAAgB,wBAAwB,QAAgB,SAAgC,MAA6B;CACjH,MAAM,WAAW,oBAAoB,QAAQ,SAAS,IAAI;CAC1D,IAAI,aAAa,MACb,MAAM,IAAI,wBAAwB,QAAQ;AAElD;AAsGA,SAAS,cAAc,WAAiC;CACpD,KAAK,MAAM,YAAY,MAAM,KAAK,SAAS,GACvC,SAAS;AAEjB;AACA,SAAgB,iCAAiC,OAAsB,UAAkC;CACrG,MAAM,wBAAwB,IAAI,QAAQ;CAC1C,aAAa;EACT,MAAM,wBAAwB,OAAO,QAAQ;CACjD;AACJ;AACA,SAAgB,2BAA2B,OAAsB,UAAkC;CAC/F,MAAM,4BAA4B,IAAI,QAAQ;CAC9C,aAAa;EACT,MAAM,4BAA4B,OAAO,QAAQ;CACrD;AACJ;AACA,SAAgB,uBAAuB,OAA4B;CAC/D,cAAc,MAAM,uBAAuB;AAC/C;AACA,SAAS,kBAAgB,OAA4B;CACjD,IAAI,MAAM,aACN;CAEJ,MAAM,cAAc;CACpB,uBAAuB,KAAK;CAC5B,cAAc,MAAM,2BAA2B;AACnD;AA+FA,eAAsB,gBAAgB,OAAqC;CACvE,IAAI,MAAM,SAAS,OAAO,MAAM,QAAQ;CACxC,OAAO,0BAAwB,MAAM,QAAQ,YAAY;EACrD,IAAI,MAAM,eAAe,WAAS,IAAI,MAAM,MAAM,MAAM,OACpD;EAEJ,MAAM,QAAQ;EACd,IAAI,MAAM,OAAO,GACb;EAEJ,WAAS,OAAO,MAAM,MAAM;EAC5B,IAAI;GACA,MAAM,MAAM,MAAM,MAAM;EAC5B,UAAU;GACN,MAAM,kBAAkB,MAAM;GAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;GACpD,MAAM,MAAM,OAAO,UAAU;EACjC;CACJ,CAAC;AACL;AACA,eAAsB,gBAAgB,OAAqC;CACvE,IAAI,MAAM,SAAS,OAAO,MAAM,QAAQ;CACxC,OAAO,0BAAwB,MAAM,cAAc,eAAa,KAAK,CAAC;AAC1E;AACA,eAAe,eAAa,OAAqC;CAC7D,IAAI,MAAM,eAAe,WAAS,IAAI,MAAM,MAAM,MAAM,OACpD,MAAM,IAAI,oBAAoB;CAElC,IAAI,MAAM,QAAQ,eAAe,UAAU;EACvC,IAAI;GACA,MAAM,MAAM,MAAM,QAAQ;EAC9B,SAAS,OAAO;GACZ,MAAM,eAAe,KAAK;EAC9B;EACA,WAAS,OAAO,MAAM,MAAM;EAC5B,kBAAgB,KAAK;EACrB,MAAM,OAAO;EACb,MAAM,kBAAkB,MAAM;EAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;EACpD,MAAM,MAAM,OAAO,UAAU;EAC7B;CACJ;CACA,WAAS,OAAO,MAAM,MAAM;CAC5B,kBAAgB,KAAK;CACrB,MAAM,OAAO;CACb,IAAI;EACA,MAAM,MAAM,MAAM,QAAQ;CAC9B,SAAS,OAAO;EACZ,MAAM,eAAe,KAAK;CAC9B,UAAU;EACN,MAAM,kBAAkB,MAAM;EAC9B,MAAM,MAAM,wBAAQ,IAAI,MAAM,qBAAqB,CAAC;EACpD,MAAM,MAAM,OAAO,UAAU;CACjC;AACJ;;;AC/aA,SAAS,WAAW,OAAmC;CACnD,IAAI,CAAC,WAAS,KAAK,KAAK,EAAE,MAAM,eAAe,aAC3C,OAAO;CAEX,IAAI,MAAM,SAAS,SAAS,MAAM,SAAS,UACvC,OAAO;CAEX,QAAQ,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW,MAAM,IAAI,eAAe;AACzF;AACA,SAAS,iBAAiB,OAAyC;CAC/D,OACI,WAAS,KAAK,KACd,OAAO,MAAM,UAAU,YACvB,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,MAAM,UAAU;AAEtC;AACA,SAAgB,qBAAqB,OAA6C;CAC9E,OACI,WAAS,KAAK,KACd,MAAM,SAAS,oBACf,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,SAAS,YACtB,MAAM,QAAQ,MAAM,MAAM,KAC1B,MAAM,OAAO,MAAM,gBAAgB;AAE3C;;;ACnCA,SAAS,aAAa,SAA0C;CAC5D,OAAO,QAAQ,KAAK,YAAY;EAC5B,KAAK,OAAO,IAAI,MAAM;EACtB,MAAM,OAAO;CACjB,EAAE;AACN;AACA,SAAS,aAAa,KAAiB,QAA6B;CAChE,IAAI,OAAO,aAAa,IAAI,YACxB,OAAO;CAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,YAAY,SAAS,GACpD,IAAI,IAAI,WAAW,OAAO,QACtB,OAAO;CAGf,OAAO;AACX;AACA,SAAS,cAAc,QAAkB,QAA6B;CAClE,OAAO,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU,aAAa,OAAO,KAAK,MAAM;AAC/F;AACA,SAAS,yBAAyB,SAAuC;CACrE,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACpD,MAAM,OAAO,QAAQ,MAAM,CAAC;EAC5B,IAAI,SAAS,WAAW,SAAS,QAC7B,OAAO;CAEf;CACA,OAAO;AACX;AACA,SAAS,mBAAmB,MAAkB,OAA4B;CACtE,MAAM,QAAQ,KAAK,IAAI,KAAK,YAAY,MAAM,UAAU;CACxD,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GACxC,IAAI,KAAK,WAAW,MAAM,QACtB,OAAO;CAGf,OAAO;AACX;AACA,SAAS,cAAc,SAAqB,QAA8C;CACtF,IAAI,WAAW,MACX,OAAO;CAEX,IAAI,WAA8B;CAClC,KAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;EACpD,MAAM,SAAS,QAAQ;EACvB,IAAI,cAAc,QAAQ,MAAM,GAAG;GAC/B,IAAI,aAAa,MACb,SAAS,KAAK,MAAM;GAExB;EACJ;EACA,IAAI,aAAa,MACb,WAAW,QAAQ,MAAM,GAAG,KAAK;CAEzC;CACA,IAAI,aAAa,MACb,OAAO,QAAQ,WAAW,IAAI,OAAO;CAEzC,OAAO,SAAS,WAAW,IAAI,OAAO;AAC1C;AACA,SAAS,eACL,YACA,aACA,eACO;CACP,IAAI,eAAe,QAAQ,gBAAgB,MACvC,OAAO;CAEX,IAAI,mBAAmB,YAAY,WAAW,GAC1C,OAAO;CAEX,OAAO,cAAc;AACzB;AACA,SAAS,oBACL,YACA,OACA,eACO;CACP,MAAM,SAAS,WAAW,MAAM,CAAC,MAAM;CACvC,KAAK,IAAI,QAAQ,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAC5D,IAAI,eAAe,QAAQ,WAAW,MAAM,CAAC,MAAM,WAAW,aAAa,GACvE,OAAO;CAGf,OAAO;AACX;AACA,SAAS,0BACL,MACA,MACA,MACgB;CAChB,IAAI,OAAO,SAAS,YAAY;EAC5B,IAAI,SAAS,KAAA,KAAa,SAAS,KAAA,GAC/B,MAAM,IAAI,UAAU,2DAA2D;EAEnF,OAAO;GACH,OAAO;GACP,WAAW;GACX,UAAU;EACd;CACJ;CACA,IAAI,OAAO,SAAS,UAChB,MAAM,IAAI,UAAU,wCAAwC;CAEhE,sBAAsB,IAAI;CAC1B,IAAI,OAAO,SAAS,YAAY;EAC5B,IAAI,SAAS,KAAA,GACT,MAAM,IAAI,UAAU,8DAA8D;EAEtF,OAAO;GACH,OAAO;GACP,WAAW;GACX,UAAU;EACd;CACJ;CACA,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO;EACH,OAAO;EACP,WAAW,KAAK,MAAM;EACtB,UAAU;CACd;CAEJ,MAAM,IAAI,UACN,iGACJ;AACJ;AACA,IAAa,kBAAb,MAA6B;CACzB;CACA;CACA,WAAoC;CACpC,2BAAW,IAAI,IAAuB;CACtC,UAAU;CACV,YAAY,QAAgB,cAAc,QAAQ;EAC9C,KAAK,UAAU;EACf,KAAK,eAAe;CACxB;CAIA,UACI,MACA,MACA,MACW;EACX,IAAI,KAAK,SACL,MAAM,IAAI,oBAAoB;EAElC,MAAM,OAAO,0BAA0B,MAAM,MAAM,IAAI;EACvD,MAAM,QAA2B;GAC7B,QAAQ;GACR,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,UAAU,KAAK;EACnB;EACA,KAAK,eAAe;EACpB,KAAK,SAAS,IAAI,KAAK;EACvB,aAAa;GACT,IAAI,CAAC,MAAM,QACP;GAEJ,MAAM,SAAS;GACf,KAAK,SAAS,OAAO,KAAK;GAC1B,IAAI,KAAK,SAAS,SAAS,GACvB,KAAK,gBAAgB;EAE7B;CACJ;CACA,QAAc;EACV,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,MAAM,SAAS,KAAK,UACrB,MAAM,SAAS;EAEnB,KAAK,SAAS,MAAM;EACpB,KAAK,gBAAgB;CACzB;CACA,iBAAiB;EACb,IAAI,KAAK,aAAa,QAAQ,KAAK,SAC/B;EAEJ,MAAM,UAAU,IAAI,iBAAiB,MAAM,KAAK,aAAa,QAAQ;EACrE,QAAQ,aAAa,UAAU;GAC3B,KAAK,eAAe,MAAM,IAAI;EAClC;EACA,KAAK,WAAW;CACpB;CACA,kBAAkB;EACd,KAAK,UAAU,MAAM;EACrB,KAAK,WAAW;CACpB;CACA,eAAe,SAAkB;EAC7B,IAAI,CAAC,qBAAqB,OAAO,KAAK,QAAQ,WAAW,KAAK,WAAW,KAAK,SAAS,SAAS,GAC5F;EAEJ,MAAM,UAAU,MAAM,KAAK,KAAK,QAAQ;EACxC,KAAK,MAAM,cAAc,QAAQ,QAAQ;GACrC,MAAM,aAAgC,CAAC;GACvC,KAAK,MAAM,SAAS,SAAS;IACzB,IAAI,CAAC,MAAM,QACP;IAEJ,IAAI,MAAM,UAAU,QAAQ,MAAM,UAAU,WAAW,OACnD;IAEJ,MAAM,UAAU,cAAc,WAAW,SAAS,MAAM,SAAS;IACjE,IAAI,YAAY,MACZ;IAEJ,WAAW,KAAK;KAAE;KAAO;IAAQ,CAAC;GACtC;GAGA,IAAI,WAAW,SAAS,GAAG;IACvB,IAAI;IACJ,MAAM,sBAA+B;KACjC,IAAI,eAAe,KAAA,GACf,aAAa,yBAAyB,WAAW,OAAO;KAE5D,OAAO;IACX;IACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;KACvD,IAAI,CAAC,oBAAoB,YAAY,OAAO,aAAa,GACrD;KAEJ,WAAW,MAAM,CAAC,UAAU,aAAa,WAAW,MAAM,CAAC,OAAO;IACtE;GACJ;GACA,KAAK,MAAM,YAAY,YAAY;IAC/B,IAAI,CAAC,SAAS,MAAM,QAChB;IAEJ,IAAI;KACA,SAAS,MAAM,SAAS,WAAW,OAAO,SAAS,SAAS,QAAQ,IAAI;IAC5E,SAAS,OAAO;KACZ,qBAAqB;MACjB,MAAM;KACV,CAAC;IACL;GACJ;EACJ;CACJ;AACJ;;;AChOA,IAAM,eAAe,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;AAC7D,IAAM,eAAe,MAAM,OAAO;AAClC,IAAM,cAAc,MAAM;AAE1B,SAAS,UAAU,MAAkB,OAA4B;CAC7D,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,MAAM,UAAU,SAAS,MAAM,MAAM;AAC5F;AAEA,SAAS,gBAAgB,OAAoC;CACzD,IAAI,EAAE,iBAAiB,eAAe,MAAM,WAAW,GACnD,MAAM,IAAI,UAAU,6BAA6B;CAErD,IAAI;CACJ,QAAQ,MAAM,IAAd;EACI,KAAK;GACD,QAAQ;GACR;EACJ,KAAK;GACD,QAAQ;GACR;EACJ,KAAK;GACD,QAAQ;GACR;EACJ,KAAK,IAAM;GACP,IAAI,MAAM,WAAW,GACjB,MAAM,IAAI,UAAU,6BAA6B;GAGrD,MAAM,UAAU,IADC,SAAS,MAAM,QAAQ,MAAM,aAAa,GAAG,CAC9C,CAAA,CAAK,aAAa,GAAG,KAAK;GAC1C,MAAM,QAAQ,UAAU,iBAAiB,KAAK,UAAU,cAAc,UAAU;GAEhF,MAAM,0BAAU,IAAI,yBAAS,IADV,YAAY,CACF,CAAM;GACnC,QAAQ,aAAa,GAAG,MAAM,KAAK;GACnC,QAAQ,QAAQ,WAAW,GAAG,KAAK;GACnC;EACJ;EACA,KAAK;GACD,QAAQ,aAAa,OAAO,MAAM,SAAS,CAAC,CAAC;GAC7C;EACJ,KAAK;GACD,QAAQ,MAAM,MAAM,CAAC;GACrB;EACJ,SACI,MAAM,IAAI,UAAU,yBAAyB;CACrD;CACA,IAAI,CAAC,UAAU,kBAAkB,KAAK,GAAG,KAAK,GAC1C,MAAM,IAAI,UAAU,kCAAkC;CAE1D,OAAO;AACX;AAEA,IAAa,iBAA+C,OAAO,OAAO;CACtE,QAAQ;CACR,QAAQ;AACZ,CAAC;AAED,SAAS,cACL,MACA,SACc;CACd,SAAS,MAAM,OAA2B;EACtC,IAAI,CAAC,QAAQ,KAAK,GACd,MAAM,IAAI,UAAU,eAAe,MAAM;EAE7C,OAAO;CACX;CACA,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,OAAO,kBAAkB,MAAM,KAAK,CAAC;EACzC;EACA,OAAO,OAAsB;GACzB,OAAO,MAAM,gBAAgB,KAAK,CAAC;EACvC;CACJ,CAAC;AACL;AAEA,IAAa,YAAY,OAAO,OAAO;CACnC,QAAQ,cAAc,aAAa,UAA2B,OAAO,UAAU,QAAQ;CACvF,QAAQ,cAAc,oBAAoB,UAA2B,OAAO,UAAU,QAAQ;CAC9F,SAAS,cAAc,cAAc,UAA4B,OAAO,UAAU,SAAS;CAC3F,MAAM,cAAc,SAAS,UAAyB,UAAU,IAAI;CACpE,OAAO,cAAc,eAAe,UAA+B,iBAAiB,UAAU;AAClG,CAAC;AAED,SAAgB,iBACZ,GAAG,OACW;CACd,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,MAAM,QAChD,MAAM,IAAI,UAAU,6BAA6B,MAAM,OAAO,OAAO;GAEzE,OAAO,uBAAuB,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO,MAAM,MAAyB,CAAC,CAAC;EAC5G;EACA,OAAO,OAAsB;GACzB,MAAM,UAAU,iBAAiB,KAAK;GACtC,IAAI,QAAQ,WAAW,MAAM,QACzB,MAAM,IAAI,UAAU,6BAA6B,MAAM,OAAO,OAAO;GAEzE,OAAO,MAAM,KAAK,OAAO,UAAU,MAAM,OAAO,QAAQ,MAAM,CAAC;EACnE;CACJ,CAAC;AACL;AAEA,SAAS,gBAAgB,OAA4C;CACjE,MAAM,UAAsD,CAAC,EAAE,MAAM,CAAC;CACtE,MAAM,yBAAS,IAAI,IAAY;CAC/B,OAAO,QAAQ,SAAS,GAAG;EACvB,MAAM,QAAQ,QAAQ,IAAI;EAC1B,MAAM,UAAU,MAAM;EACtB,IAAI,MAAM,OAAO;GACb,OAAO,OAAO,OAAiB;GAC/B;EACJ;EACA,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,OAAO,YAAY,WACtE;EAEJ,IAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,GACjF;EAEJ,IAAI,OAAO,YAAY,YAAY,OAAO,IAAI,OAAO,GACjD,MAAM,IAAI,UAAU,oFAAoF;EAE5G,MAAM,QAAQ,MAAM,QAAQ,OAAO;EACnC,IAAI,OAAO,eAAe,OAAO,OAAO,QAAQ,MAAM,YAAY,OAAO,YACrE,MAAM,IAAI,UAAU,gDAAgD;EAExE,OAAO,IAAI,OAAO;EAClB,QAAQ,KAAK;GAAE,OAAO;GAAS,OAAO;EAAK,CAAC;EAC5C,MAAM,OAAO,QAAQ,QAAQ,OAAO;EACpC,IAAI,SAAS,KAAK,WAAW,QAAQ,SAAS,GAC1C,MAAM,IAAI,UAAU,0DAA0D;EAElF,KAAK,MAAM,OAAO,MAAM;GACpB,IAAI,SAAS,QAAQ,UACjB;GAEJ,IAAI,OAAO,QAAQ,UACf,MAAM,IAAI,UAAU,yCAAyC;GAEjE,IAAI,UAAU,CAAC,mBAAmB,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,QAAQ,SAClE,MAAM,IAAI,UAAU,6CAA6C;GAErE,MAAM,aAAa,OAAO,yBAAyB,SAAS,GAAG;GAC/D,IAAI,CAAC,cAAc,CAAC,WAAW,cAAc,CAAC,OAAO,OAAO,YAAY,OAAO,GAC3E,MAAM,IAAI,UAAU,sDAAsD;GAE9E,QAAQ,KAAK,EAAE,OAAO,WAAW,MAAiB,CAAC;EACvD;CACJ;AACJ;;AAGA,SAAgB,gBAA+B,UAA2D;CACtG,SAAS,MAAM,OAAmB;EAC9B,gBAAgB,KAAK;EACrB,IAAI,UAAU;GACV,IAAI,CAAC,SAAS,KAAK,GACf,MAAM,IAAI,UAAU,kCAAkC;GAE1D,gBAAgB,KAAK;EACzB;EACA,OAAO;CACX;CACA,OAAO,OAAO,OAAO;EACjB,OAAO,OAAsB;GACzB,OAAO,WAAW,MAAM,KAAK,CAAC;EAClC;EACA,OAAO,OAAsB;GACzB,OAAO,MAAM,WAAoB,KAAK,CAAC;EAC3C;CACJ,CAAC;AACL;AAEA,SAAS,YAAe,OAAuB,OAA8B;CACzE,MAAM,UAAiB,CAAC;CACxB,KAAK,MAAM,SAAS;EAAC;EAAM;EAAO;EAAM;CAAK,GACzC,IAAI,OAAO,OAAO,OAAO,KAAK,GAC1B,QAAQ,SAAS,MAAM,OAAO,MAAM,MAAW;CAGvD,IAAI,MAAM,YAAY,KAAA,GAClB,QAAQ,UAAU,MAAM;CAE5B,IAAI,MAAM,UAAU,KAAA,GAChB,QAAQ,QAAQ,MAAM;CAE1B,OAAO;AACX;AAEA,eAAsB,sBAClB,IACA,MACA,QACU;CACV,MAAM,cAAc,MAAM,GAAG,MAAM,IAAI;CACvC,IAAI;CACJ,IAAI;EACA,SAAS,MAAM,OAAO,WAAW;CACrC,SAAS,OAAO;EACZ,IAAI;GACA,MAAM,YAAY,SAAS;EAC/B,SAAS,eAAe;GACpB,IAAI,EAAE,yBAAyB,yBAC3B,MAAM,IAAI,eAAe,CAAC,OAAO,aAAa,GAAG,0CAA0C,EACvF,OAAO,cACX,CAAC;EAET;EACA,MAAM;CACV;CAEA,IAAI,SAAS,aACT,MAAM,YAAY,OAAO;MAEzB,MAAM,YAAY,SAAS;CAE/B,OAAO;AACX;AAEA,SAAS,eACL,QACA,MACA,QACU;CACV,OAAO,WAAW,SAAS,sBAAsB,QAAQ,MAAM,MAAM,IAAI,OAAO,MAAM;AAC1F;AAEA,IAAa,cAAb,MAAkC;CAC9B;CACA;CACA;CACA;CACA;CAEA,YACI,QACA,OACA,MACA,UACA,QACF;EACE,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,OAAO;EACZ,KAAK,YAAY;EACjB,KAAK,UAAU;CACnB;CAEA,MAAM,IAAI,KAA2B;EACjC,MAAM,UAAU,KAAK,UAAU,OAAO,GAAG;EACzC,OAAO,eAAe,KAAK,SAAS,YAAY,OAAO,gBAAgB;GACnE,MAAM,QAAQ,MAAM,YAAY,WAAW,KAAK,QAAQ,KAAK,MAAM,OAAO;GAC1E,OAAO,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;EAClE,CAAC;CACL;CAEA,MAAM,KAAK,QAAwB,CAAC,GAAqC;EACrE,MAAM,UAAU,YAAY,KAAK,WAAW,KAAK;EACjD,OAAO,eAAe,KAAK,SAAS,YAAY,OAAO,gBAAgB;GACnE,MAAM,OAAgC,CAAC;GACvC,WAAW,MAAM,CAAC,KAAK,UAAU,YAAY,YAAY,KAAK,QAAQ,KAAK,MAAM,OAAO,GACpF,KAAK,KAAK;IAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG;IAAG,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;GAAE,CAAC;GAE5F,OAAO;EACX,CAAC;CACL;AACJ;AAEA,IAAa,cAAb,MAAa,YAAkB;CAC3B;CACA;CACA;CAEA,YAAY,QAA0B,MAAc,QAA4B;EAC5E,KAAK,UAAU;EACf,KAAK,OAAO;EACZ,KAAK,UAAU;CACnB;CAEA,MAAM,IAAI,KAA2B;EACjC,MAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;EAC5E,OAAO,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;CAClE;CAEA,MAAM,QAAQ,MAA8C;EAKxD,QAAO,MAJc,KAAK,QAAQ,QAC9B,KAAK,MACL,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAClD,EAAA,CACc,KAAK,UAAW,UAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK,CAAE;CAC3F;CAEA,MAAM,IAAI,KAA0B;EAChC,OAAO,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;CACnE;CAEA,MAAM,IAAI,KAAQ,OAAU,SAAqC;EAC7D,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,GAAG,KAAK,QAAQ,MAAM,OAAO,KAAK,GAAG,OAAO;CAC7G;CAEA,MAAM,QAAQ,SAAyC,SAAqC;EACxF,MAAM,UAAU,QAAQ,KAAK,CAAC,KAAK,WAAqC,CACpE,KAAK,QAAQ,IAAI,OAAO,GAAG,GAC3B,KAAK,QAAQ,MAAM,OAAO,KAAK,CACnC,CAAC;EACD,MAAM,eAAe,KAAK,SAAS,cAAc,gBAC7C,YAAY,QAAQ,KAAK,MAAM,SAAS,OAAO,CACnD;CACJ;CAEA,MAAM,OAAO,KAA0B;EACnC,OAAO,KAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;CACtE;CAEA,MAAM,WAAW,MAAmC;EAChD,MAAM,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC;EAC9D,MAAM,eAAe,KAAK,SAAS,cAAc,gBAAgB,YAAY,WAAW,KAAK,MAAM,OAAO,CAAC;CAC/G;CAEA,MAAM,WAAW,YAA+D;EAC5E,MAAM,UAAU,WAAW,KAAK,cAAuB;GACnD,MAAM,OAAQ,UAAgC;GAC9C,IAAI,SAAS,SAAS,SAAS,UAC3B,MAAM,IAAI,UAAU,8CAA8C;GAEtE,MAAM,MAAM,KAAK,QAAQ,IAAI,OAAO,UAAU,GAAG;GACjD,IAAI,UAAU,SAAS,UACnB,OAAO;IAAE,MAAM;IAAU;GAAI;GAEjC,OAAO;IAAE,MAAM;IAAO;IAAK,OAAO,KAAK,QAAQ,MAAM,OAAO,UAAU,KAAK;GAAE;EACjF,CAAC;EACD,MAAM,eAAe,KAAK,SAAS,cAAc,gBAAgB,YAAY,WAAW,KAAK,MAAM,OAAO,CAAC;CAC/G;CAEA,MAAM,KAAK,QAAwB,CAAC,GAAqC;EAErE,QAAO,MADY,KAAK,QAAQ,KAAK,KAAK,MAAM,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,EAAA,CACxE,KAAK,EAAE,KAAK,aAAa;GACjC,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG;GAChC,OAAO,KAAK,QAAQ,MAAM,OAAO,KAAK;EAC1C,EAAE;CACN;CAEA,MAAM,QAAuB;EACzB,MAAM,KAAK,QAAQ,WAAW,KAAK,IAAI;CAC3C;CAEA,MAAS,MAAc,KAA2C;EAC9D,OAAO,IAAI,YAAY,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK,KAAK,OAAO;CAC3E;CAEA,YACI,MACA,QACU;EACV,IAAI,EAAE,WAAW,KAAK,UAClB,OAAO,QAAQ,uBAAO,IAAI,UAAU,+CAA+C,CAAC;EAExF,OAAO,sBAAsB,KAAK,SAAS,OAAO,gBAC9C,OAAO,IAAI,YAAY,aAAa,KAAK,MAAM,KAAK,OAAO,GAAG,WAAW,CAC7E;CACJ;AACJ;;AAGA,SAAgB,gBACZ,QACA,MACA,QACiB;CACjB,OAAO,IAAI,YAAY,QAAQ,MAAM,MAAM;AAC/C;AAEA,eAAsB,kBAClB,QACA,MACA,QACA,SAC0B;CAC1B,MAAM,OAAO,YAAY,MAAM,OAAO;CACtC,OAAO,gBAAgB,QAAQ,MAAM,MAAM;AAC/C;;;ACnaA,IAAa,kBAAkB,EAAE,MAAM;AACvC,IAAa,mBAAmB,MAAM,OAAO;;;ACa7C,IAAM,iBAAiB;AACvB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,wCAAwB,IAAI,IAAI;CAAC;CAAa;CAAa;AAAa,CAAC;AAC/E,IAAM,iCAAe,IAAI,IAAmB;CAAC;CAAW;CAAQ;CAAQ;CAAW;AAAM,CAAC;AAC1F,IAAM,2BAAW,IAAI,IAAI;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAAG;AACP,CAAC;AASD,IAAa,iBAAb,cAAoC,YAAY;CAC5C;CAEA,YAAY,SAAiB,UAAkB;EAC3C,MAAM,GAAG,QAAQ,eAAe,UAAU;EAC1C,KAAK,OAAO;EACZ,KAAK,WAAW;CACpB;AACJ;AAEA,SAAgB,SAAS,KAA6B;CAClD,IAAI,OAAO,QAAQ,UACf,MAAM,IAAI,UAAU,sBAAsB;CAE9C,IAAI,IAAI,SAAS,gBACb,MAAM,IAAI,eAAe,eAAe,eAAe,cAAc,cAAc;CAEvF,OAAO,IAAI,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM;AAC3C;AAEA,SAAgB,kBAAkB,QAAwB,aAAiC,CAAC,GAAe;CACvG,IAAI,CAAC,MAAM,QAAQ,UAAU,GACzB,MAAM,IAAI,UAAU,iCAAiC;CAEzD,IAAI,WAAW,WAAW,OAAO,gBAC7B,MAAM,IAAI,WAAW,eAAe,OAAO,eAAe,wBAAwB,WAAW,QAAQ;CAEzG,OAAO,MAAM,KAAwB,aAAa,OAAO,UAAU;EAC/D,IAAI,UAAU,QAAQ,OAAO,UAAU,WACnC,OAAO;EAEX,IAAI,OAAO,UAAU,UAAU;GAC3B,IACI,CAAC,OAAO,SAAS,KAAK,KACrB,OAAO,UAAU,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,aAAa,KAAK,GAE9E,MAAM,IAAI,WACN,iBAAiB,QAAQ,EAAE,gEAC/B;GAEJ,OAAO;EACX;EACA,IAAI,OAAO,UAAU,UAAU;GAC3B,IAAI,QAAQ,mBAAmB,QAAQ,iBACnC,MAAM,IAAI,WAAW,iBAAiB,QAAQ,EAAE,yCAAyC;GAE7F,OAAO;EACX;EACA,IAAI,OAAO,UAAU,UAAU;GAC3B,IAAI,CAAC,gBAAgB,KAAK,GACtB,MAAM,IAAI,UAAU,iBAAiB,QAAQ,EAAE,0CAA0C;GAE7F,OAAO;EACX;EACA,IAAI,iBAAiB,YACjB,OAAO,WAAW,KAAK,KAAK;EAEhC,MAAM,IAAI,UAAU,iBAAiB,QAAQ,EAAE,8DAA8D;CACjH,CAAC;AACL;AAEA,SAAgB,gBAAgB,YAAgC,YAA2C;CACvG,IAAI,WAAW,SAAS,WACpB,OAAO,WAAW;CAEtB,IAAI,CAAC,OAAO,cAAc,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,WAAW,SAAS,WAAW,QAClG,MAAM,IAAI,WAAW,iBAAiB,WAAW,QAAQ,EAAE,YAAY;CAE3E,MAAM,QAAQ,WAAW,GAAG,WAAW,KAAK;CAC5C,IAAI,UAAU,KAAA,GACV,MAAM,IAAI,WAAW,iBAAiB,WAAW,QAAQ,EAAE,YAAY;CAE3E,OAAO;AACX;AAEA,IAAM,SAAN,MAAa;CACT;CACA,SAAS;CACT,kBAAkB;CAClB,WAAW;CACX,cAAc;CAEd,YAAY,QAAiB;EACzB,KAAK,UAAU;CACnB;CAEA,QAAwB;EACpB,MAAM,YAAY,KAAK,gBAAgB;EACvC,KAAK,cAAc,GAAG;EACtB,IAAI,KAAK,SAAS,CAAC,CAAC,SAAS,OACzB,MAAM,KAAK,OAAO,sCAAsC;EAE5D,OAAO;GAAE;GAAW,gBAAgB,KAAK;EAAgB;CAC7D;CAEA,kBAAgC;EAC5B,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,aAAa;EAE7B,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO,KAAK,WAAW;EAE3B,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,IAAI,KAAK,eAAe,QAAQ,GAC5B,OAAO,KAAK,QAAQ;EAExB,MAAM,KAAK,OAAO,sEAAsE;CAC5F;CAEA,eAA6B;EACzB,KAAK,eAAe,OAAO;EAC3B,MAAM,cAAc,KAAK,eAAe,IAAI;EAC5C,IAAI,aAAa;GACb,KAAK,eAAe,KAAK;GACzB,KAAK,eAAe,QAAQ;EAChC;EACA,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,cAAc,GAAG;EACtB,MAAM,UAAiC,CAAC;EACxC,MAAM,wBAAQ,IAAI,IAAY;EAC9B,IAAI,kBAAkB;EACtB,GAAG;GACC,MAAM,OAAO,KAAK,YAAY;GAC9B,KAAK,cAAc,OAAO,MAAM,QAAQ;GACxC,MAAM,YAAY,KAAK,SAAS;GAChC,MAAM,OAAO,UAAU,KAAK,YAAY;GACxC,IAAI,UAAU,SAAS,UAAU,CAAC,eAAa,IAAI,IAAI,GACnD,MAAM,KAAK,OAAO,4DAA4D;GAElF,KAAK,UAAU;GACf,IAAI,aAAa;GACjB,IAAI,WAAW;GACf,IAAI,uBAAuB;GAC3B,SACI,IAAI,KAAK,eAAe,SAAS,GAAG;IAChC,IAAI,YACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,KAAK,eAAe,KAAK;IACzB,aAAa;IACb,mBAAmB;IACnB,IAAI,kBAAkB,GAClB,MAAM,KAAK,OAAO,0CAA0C;GAEpE,OAAO,IAAI,KAAK,eAAe,KAAK,GAAG;IACnC,KAAK,eAAe,MAAM;IAC1B,IAAI,sBACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,WAAW;IACX,uBAAuB;GAC3B,OAAO,IAAI,KAAK,eAAe,MAAM,GAAG;IACpC,IAAI,sBACA,MAAM,KAAK,OAAO,kCAAkC;IAExD,WAAW;IACX,uBAAuB;GAC3B,OACI;GAGR,IAAI,cAAc,YAAY,sBAC1B,MAAM,KAAK,OAAO,qCAAqC;GAE3D,QAAQ,KAAK;IAAE;IAAM;IAAM;IAAY,UAAU,aAAa,QAAQ;GAAS,CAAC;EACpF,SAAS,KAAK,cAAc,GAAG;EAC/B,KAAK,cAAc,GAAG;EACtB,OAAO;GAAE,MAAM;GAAe;GAAO;GAAS;EAAY;CAC9D;CAEA,aAA2B;EACvB,KAAK,eAAe,OAAO;EAC3B,MAAM,WAAW,KAAK,eAAe,IAAI;EACzC,IAAI,UACA,KAAK,eAAe,QAAQ;EAEhC,OAAO;GAAE,MAAM;GAAa,OAAO,KAAK,YAAY;GAAG;EAAS;CACpE;CAEA,UAAwB;EACpB,KAAK,eAAe,MAAM;EAC1B,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,UAA2B;EAC/B,IAAI,KAAK,cAAc,GAAG,GAAG;GACzB,UAAU,KAAK,gBAAgB;GAC/B,KAAK,cAAc,GAAG;EAC1B;EACA,KAAK,eAAe,QAAQ;EAC5B,MAAM,OAA+B,CAAC;EACtC,IAAI,QAAQ,SAAS;EACrB,GAAG;GACC,KAAK,cAAc,GAAG;GACtB,MAAM,MAAM,CAAC,KAAK,OAAO,CAAC;GAC1B,OAAO,KAAK,cAAc,GAAG,GACzB,IAAI,KAAK,KAAK,OAAO,CAAC;GAE1B,KAAK,cAAc,GAAG;GACtB,UAAU,IAAI;GACd,IAAI,IAAI,WAAW,OACf,MAAM,KAAK,OAAO,yCAAyC;GAE/D,KAAK,KAAK,GAAG;EACjB,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;GAAE,MAAM;GAAU;GAAO;GAAS;EAAK;CAClD;CAEA,UAAwB;EACpB,MAAM,UAAU,KAAK,cAAc,GAAG,IAAI,OAAO,KAAK,gBAAgB;EACtE,KAAK,eAAe,MAAM;EAC1B,MAAM,QAAQ,KAAK,YAAY;EAC/B,MAAM,QAAQ,KAAK,OAAO;EAC1B,MAAM,UAAwB,CAAC;EAC/B,IAAI,KAAK,eAAe,OAAO,GAAG;GAC9B,KAAK,eAAe,IAAI;GACxB,MAAM,wBAAQ,IAAI,IAAY;GAC9B,GAAG;IACC,MAAM,SAAS,KAAK,YAAY;IAChC,KAAK,cAAc,OAAO,QAAQ,iBAAiB;IACnD,MAAM,YAAY,KAAK,eAAe,MAAM,IAAI,SAAS;IACzD,IAAI,cAAc,OACd,KAAK,eAAe,KAAK;IAE7B,QAAQ,KAAK;KAAE;KAAQ;IAAU,CAAC;GACtC,SAAS,KAAK,cAAc,GAAG;EACnC;EACA,IAAI,QAAmC;EACvC,IAAI,SAAoC;EACxC,IAAI,KAAK,eAAe,OAAO,GAAG;GAC9B,QAAQ,KAAK,UAAU,OAAO;GAC9B,IAAI,KAAK,eAAe,QAAQ,GAC5B,SAAS,KAAK,UAAU,QAAQ;EAExC;EACA,OAAO;GAAE,MAAM;GAAU;GAAO;GAAS;GAAO;GAAS;GAAO;EAAO;CAC3E;CAEA,UAAwB;EACpB,MAAM,QAAQ,KAAK,YAAY;EAC/B,KAAK,eAAe,KAAK;EACzB,MAAM,cAA+D,CAAC;EACtE,MAAM,wBAAQ,IAAI,IAAY;EAC9B,GAAG;GACC,MAAM,SAAS,KAAK,YAAY;GAChC,KAAK,cAAc,OAAO,QAAQ,YAAY;GAC9C,KAAK,cAAc,GAAG;GACtB,YAAY,KAAK;IAAE;IAAQ,OAAO,KAAK,OAAO;GAAE,CAAC;EACrD,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;GAAE,MAAM;GAAU;GAAO;GAAa,OAAO,KAAK,OAAO;EAAE;CACtE;CAEA,UAAwB;EACpB,KAAK,eAAe,MAAM;EAC1B,OAAO;GAAE,MAAM;GAAU,OAAO,KAAK,YAAY;GAAG,OAAO,KAAK,OAAO;EAAE;CAC7E;CAEA,SAA+B;EAC3B,OAAO,KAAK,eAAe,OAAO,IAAI,KAAK,IAAI,IAAI;CACvD;CAEA,MAAqB;EACjB,IAAI,aAAa,KAAK,KAAK;EAC3B,OAAO,KAAK,eAAe,IAAI,GAC3B,aAAa;GAAE,MAAM;GAAM,MAAM;GAAY,OAAO,KAAK,KAAK;EAAE;EAEpE,OAAO;CACX;CAEA,OAAsB;EAClB,IAAI,aAAa,KAAK,WAAW;EACjC,OAAO,KAAK,eAAe,KAAK,GAC5B,aAAa;GAAE,MAAM;GAAO,MAAM;GAAY,OAAO,KAAK,WAAW;EAAE;EAE3E,OAAO;CACX;CAEA,aAA4B;EACxB,IAAI,KAAK,cAAc,GAAG,GAAG;GACzB,KAAK,YAAY;GACjB,IAAI,KAAK,WAAW,aAChB,MAAM,KAAK,OAAO,yBAAyB,aAAa;GAE5D,MAAM,aAAa,KAAK,IAAI;GAC5B,KAAK,cAAc,GAAG;GACtB,KAAK,YAAY;GACjB,OAAO;EACX;EACA,KAAK,eAAe;EACpB,IAAI,KAAK,cAAc,gBACnB,MAAM,KAAK,OAAO,2BAA2B,gBAAgB;EAEjE,MAAM,SAAS,KAAK,YAAY;EAChC,IAAI,KAAK,eAAe,IAAI,GAAG;GAC3B,MAAM,UAAU,KAAK,eAAe,KAAK;GACzC,KAAK,eAAe,MAAM;GAC1B,OAAO;IAAE,MAAM;IAAU;IAAQ;GAAQ;EAC7C;EACA,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,YAAY,CAAC;GAAC;GAAK;GAAM;GAAM;GAAK;GAAM;GAAK;EAAI,CAAC,CAAC,SAAS,MAAM,IAAI,GACvF,MAAM,KAAK,OAAO,iDAAiD;EAEvE,KAAK,UAAU;EAEf,OAAO;GAAE,MAAM;GAAc;GAAQ,UADnB,MAAM,SAAS,OAAO,OAAO,MAAM;GACN,OAAO,KAAK,OAAO;EAAE;CACxE;CAEA,UAAU,QAAoC;EAC1C,MAAM,QAAQ,KAAK,OAAO;EAC1B,IACI,MAAM,SAAS,cACd,OAAO,MAAM,UAAU,YAAY,CAAC,OAAO,cAAc,MAAM,KAAK,KAAK,MAAM,QAAQ,IAExF,MAAM,KAAK,OAAO,GAAG,OAAO,kDAAkD;EAElF,OAAO;CACX;CAEA,SAA6B;EACzB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,aAAa;GAC5B,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAa,OAAO,KAAK;GAAkB;EAC9D;EACA,IAAI,MAAM,SAAS,UAAU;GACzB,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAW,OAAO,MAAM;GAAK;EAChD;EACA,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAK;EAE1C,IAAI,KAAK,eAAe,MAAM,GAC1B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAK;EAE1C,IAAI,KAAK,eAAe,OAAO,GAC3B,OAAO;GAAE,MAAM;GAAW,OAAO;EAAM;EAE3C,MAAM,OAAO,KAAK,cAAc,GAAG,IAAI,MAAM,KAAK,cAAc,GAAG,IAAI,MAAM;EAC7E,MAAM,SAAS,KAAK,SAAS;EAC7B,IAAI,OAAO,SAAS,UAAU;GAC1B,KAAK,UAAU;GACf,OAAO;IAAE,MAAM;IAAW,OAAO,YAAY,OAAO,OAAO,MAAM,MAAM,QAAQ;GAAE;EACrF;EACA,MAAM,KAAK,OAAO,qDAAqD;CAC3E;CAEA,kBAA4B;EACxB,MAAM,wBAAQ,IAAI,IAAY;EAC9B,MAAM,UAAoB,CAAC;EAC3B,GAAG;GACC,MAAM,OAAO,KAAK,YAAY;GAC9B,KAAK,cAAc,OAAO,MAAM,QAAQ;GACxC,QAAQ,KAAK,IAAI;EACrB,SAAS,KAAK,cAAc,GAAG;EAC/B,OAAO;CACX;CAEA,cAAsB;EAClB,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,iBAAiB,MAAM,SAAS,UAAU,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC,IAC9F,MAAM,KAAK,OAAO,wDAAwD;EAE9E,IACI,MAAM,KAAK,WAAW,KACtB,MAAM,KAAK,SAAS,yBACpB,qBAAqB,MAAM,IAAI,KAC/B,sBAAsB,IAAI,MAAM,KAAK,YAAY,CAAC,KAClD,CAAC,gBAAgB,MAAM,IAAI,GAE3B,MAAM,KAAK,OAAO,gCAAgC;EAEtD,KAAK,UAAU;EACf,OAAO,MAAM;CACjB;CAEA,cAAc,OAAoB,MAAc,OAAqB;EACjE,IAAI,MAAM,IAAI,IAAI,GACd,MAAM,KAAK,OAAO,aAAa,MAAM,IAAI,MAAM;EAEnD,MAAM,IAAI,IAAI;CAClB;CAEA,WAAkB;EACd,OAAO,KAAK,QAAQ,KAAK;CAC7B;CAEA,eAAe,SAA0B;EACrC,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,UAAU,MAAM,KAAK,YAAY,MAAM,SACtD,OAAO;EAEX,KAAK,UAAU;EACf,OAAO;CACX;CAEA,eAAe,SAAuB;EAClC,IAAI,CAAC,KAAK,eAAe,OAAO,GAC5B,MAAM,KAAK,OAAO,YAAY,SAAS;CAE/C;CAEA,cAAc,QAAyB;EACnC,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,MAAM,SAAS,YAAY,MAAM,SAAS,QAC1C,OAAO;EAEX,KAAK,UAAU;EACf,OAAO;CACX;CAEA,cAAc,QAAsB;EAChC,IAAI,CAAC,KAAK,cAAc,MAAM,GAC1B,MAAM,KAAK,OAAO,YAAY,QAAQ;CAE9C;CAEA,OAAO,SAAiC;EACpC,OAAO,IAAI,eAAe,SAAS,KAAK,SAAS,CAAC,CAAC,QAAQ;CAC/D;AACJ;AAEA,SAAS,SAAS,KAAsB;CACpC,MAAM,SAAkB,CAAC;CACzB,IAAI,QAAQ;CACZ,OAAO,QAAQ,IAAI,QAAQ;EACvB,MAAM,YAAY,IAAI;EACtB,IAAI,MAAM,KAAK,SAAS,GAAG;GACvB,SAAS;GACT;EACJ;EACA,IAAI,IAAI,WAAW,MAAM,KAAK,GAAG;GAC7B,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,IAAI,WAAW,QAAQ,IAAI,WAAW,MAC/D,SAAS;GAEb;EACJ;EACA,IAAI,IAAI,WAAW,MAAM,KAAK,GAAG;GAC7B,MAAM,MAAM,IAAI,QAAQ,MAAM,QAAQ,CAAC;GACvC,IAAI,MAAM,GACN,MAAM,IAAI,eAAe,8BAA8B,KAAK;GAEhE,QAAQ,MAAM;GACd;EACJ;EACA,IAAI,OAAO,UAAU,YACjB,MAAM,IAAI,eAAe,2BAA2B,cAAc,KAAK;EAE3E,MAAM,WAAW;EACjB,IAAI,cAAc,OAAO,cAAc,MAAK;GACxC,MAAM,QAAQ;GACd,IAAI,OAAO;GACX,IAAI,SAAS;GACb,SAAS;GACT,OAAO,QAAQ,IAAI,QACf,IAAI,IAAI,WAAW,OAAO;IACtB,IAAI,IAAI,QAAQ,OAAO,OAAO;KAC1B,QAAQ;KACR,SAAS;IACb,OAAO;KACH,SAAS;KACT,SAAS;KACT;IACJ;GACJ,OACI,QAAQ,IAAI;GAGpB,IAAI,CAAC,QACD,MAAM,IAAI,eAAe,6BAA6B,QAAQ;GAElE,IAAI,CAAC,gBAAgB,IAAI,GACrB,MAAM,IAAI,eAAe,yDAAyD,QAAQ;GAE9F,OAAO,KAAK;IAAE,MAAM,UAAU,MAAM,WAAW;IAAc;IAAM;GAAS,CAAC;EACjF,OAAO,IAAI,aAAa,KAAK,SAAS,GAAG;GACrC,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEb,OAAO,KAAK;IAAE,MAAM;IAAQ,MAAM,IAAI,MAAM,UAAU,KAAK;IAAG;GAAS,CAAC;EAC5E,OAAO,IAAI,MAAM,KAAK,SAAS,KAAM,cAAc,OAAO,MAAM,KAAK,IAAI,QAAQ,MAAM,EAAE,GAAI;GACzF,SAAS;GACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEb,IAAI,cAAc,OAAO,IAAI,WAAW,KAAK;IACzC,SAAS;IACT,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;GAEjB;GACA,IAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;IAC1C,SAAS;IACT,IAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KACrC,SAAS;IAEb,MAAM,gBAAgB;IACtB,OAAO,QAAQ,IAAI,UAAU,MAAM,KAAK,IAAI,MAAM,GAC9C,SAAS;IAEb,IAAI,UAAU,eACV,MAAM,IAAI,eAAe,4BAA4B,QAAQ;GAErE;GACA,MAAM,OAAO,IAAI,MAAM,UAAU,KAAK;GACtC,IAAI,KAAK,SAAS,mBACd,MAAM,IAAI,eAAe,2BAA2B,kBAAkB,cAAc,QAAQ;GAEhG,OAAO,KAAK;IAAE,MAAM;IAAU;IAAM;GAAS,CAAC;EAClD,OAAO,IAAI,cAAc,KAAK;GAC1B,SAAS;GACT,OAAO,KAAK;IAAE,MAAM;IAAa,MAAM;IAAW;GAAS,CAAC;EAChE,OAAO;GACH,MAAM,OAAO,IAAI,MAAM,OAAO,QAAQ,CAAC;GACvC,IAAI;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,CAAC,SAAS,IAAI,GAAG;IACzC,SAAS;IACT,OAAO,KAAK;KAAE,MAAM;KAAU,MAAM;KAAM;IAAS,CAAC;GACxD,OAAO,IAAI,aAAa,SAAS,SAAS,GAAG;IACzC,SAAS;IACT,OAAO,KAAK;KAAE,MAAM;KAAU,MAAM;KAAW;IAAS,CAAC;GAC7D,OACI,MAAM,IAAI,eAAe,8BAA8B,aAAa,QAAQ;EAEpF;CACJ;CACA,OAAO,KAAK;EAAE,MAAM;EAAO,MAAM;EAAI,UAAU,IAAI;CAAO,CAAC;CAC3D,OAAO;AACX;AAEA,SAAS,aAAa,OAAwB;CAC1C,IAAI,CAAC,OAAO,UAAU,KAAK,GACvB,OAAO;CAEX,MAAM,UAAU,OAAO,KAAK;CAC5B,OAAO,WAAW,mBAAmB,WAAW;AACpD;AAEA,SAAS,YAAY,MAAc,UAAmC;CAClE,IAAI,cAAc,KAAK,IAAI,GAAG;EAC1B,MAAM,UAAU,OAAO,IAAI;EAC3B,IAAI,UAAU,mBAAmB,UAAU,iBACvC,MAAM,IAAI,eAAe,mDAAmD,QAAQ;EAExF,OAAO,WAAW,OAAO,OAAO,gBAAgB,KAAK,WAAW,OAAO,OAAO,gBAAgB,IACxF,OAAO,OAAO,IACd;CACV;CACA,MAAM,QAAQ,OAAO,IAAI;CAEzB,IAAI,CAAC,OAAO,SAAS,KAAK,KAAM,OAAO,UAAU,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,aAAa,KAAK,GACzG,MAAM,IAAI,eAAe,wEAAwE,QAAQ;CAE7G,MAAM,CAAC,UAAU,eAAe,OAAO,KAAK,YAAY,CAAC,CAAC,MAAM,GAAG;CACnE,MAAM,SAAS,SAAS,QAAQ,WAAW,EAAE;CAC7C,MAAM,UAAU,SAAS,KAAK,MAAM;CACpC,IAAI,UAAU,KAAK,SACf,MAAM,IAAI,eAAe,mCAAmC,QAAQ;CAExE,IAAI,OAAO,UAAU,KAAK,KAAK,SAAS;EACpC,MAAM,iBAAiB,SAAS,SAAS,GAAG,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG,IAAI,IAAI;EAC9F,MAAM,gBAAgB,OAAO,SAAS,OAAO,QAAQ,QAAQ,EAAE,CAAC,CAAC;EACjE,IAAI,OAAO,YAAY,IAAI,iBAAiB,gBAAgB,GACxD,MAAM,IAAI,eAAe,0CAA0C,QAAQ;CAEnF;CACA,OAAO;AACX;AAEA,SAAS,gBAAgB,OAAwB;CAC7C,KAAK,MAAM,aAAa,OAAO;EAC3B,MAAM,YAAY,UAAU,YAAY,CAAC;EACzC,IAAI,aAAa,SAAU,aAAa,OACpC,OAAO;CAEf;CACA,OAAO;AACX;AAEA,SAAS,qBAAqB,OAAwB;CAClD,KAAK,MAAM,aAAa,OAAO;EAC3B,MAAM,YAAY,UAAU,YAAY,CAAC;EACzC,IAAI,YAAY,MAAQ,cAAc,KAClC,OAAO;CAEf;CACA,OAAO;AACX;;;AC1pBA,IAAM,UAAU;AAChB,IAAM,YAAY,WAAW,GAAG,CAAC;AACjC,IAAM,QAAQ;CAAE,QAAQ;CAAc,SAAS;AAAE;AACjD,IAAM,kBAAkB,WAAW,GAAG,GAAG;AACzC,IAAM,oBAAoB;AAC1B,IAAM,cAAc,EAAE,MAAM;AAC5B,IAAM,eAAe,MAAM,OAAO;AAClC,IAAM,cAAc,MAAM,OAAO;AACjC,IAAM,+BAAe,IAAI,IAAI;CAAC;CAAW;CAAQ;CAAQ;CAAW;AAAM,CAAC;AAwB3E,IAAa,iBAAb,cAAoC,MAAM;CACtC,YAAY,SAAiB,SAAwB;EACjD,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO;CAChB;AACJ;AACA,IAAa,eAAb,cAAkC,UAAU;CACxC,YAAY,SAAiB;EACzB,MAAM,OAAO;EACb,KAAK,OAAO;CAChB;AACJ;AAoBA,SAAgB,gBAAgB,IAAQ,UAA4B,CAAC,GAAc;CAC/E,MAAM,kBAAkB,QAAQ,YAAY,KAAA,IAAY,OAAO,0BAA0B,QAAQ,OAAO;CACxG,MAAM,MAAM,OAAO,KAAa,YAAgC,YAAyC;EACrG,MAAM,SAAS,SAAS,GAAG;EAC3B,MAAM,QAAQ,kBAAkB,QAAQ,UAAU;EAClD,MAAM,YAAY,OAAO;EACzB,IAAI,WAAW,CAAC,eAAe,SAAS,GACpC,MAAM,IAAI,eAAe,4CAA4C;EAEzE,MAAM,KAAK,MAAM,GAAG,MAAM,UAAU,SAAS,YAAY,UAAU,aAAa,WAAW;EAC3F,IAAI,WAAW;EACf,IAAI;GACA,MAAM,UAAU,0BAA2B,MAAM,GAAG,cAAc,KAAM,CAAC,CAAC;GAC1E,IACI,mBACA,oCAAoC,eAAe,MAAM,oCAAoC,OAAO,GAEpG,MAAM,IAAI,eAAe,4DAA4D;GAEzF,MAAM,SAAS,MAAM,iBAAiB,IAAI,WAAW,OAAO,SAAS,OAAO;GAE5E,WAAW;GACX,IAAI,GAAG,SAAS,aACZ,MAAM,GAAG,OAAO;QAEhB,MAAM,GAAG,SAAS;GAEtB,OAAO;EACX,SAAS,OAAO;GACZ,IAAI,CAAC,UACD,IAAI;IACA,MAAM,GAAG,SAAS;GACtB,SAAS,eAAe;IACpB,MAAM,IAAI,eAAe,CAAC,OAAO,aAAa,GAAG,qCAAqC,EAClF,OAAO,cACX,CAAC;GACL;GAEJ,MAAM;EACV;CACJ;CACA,OAAO;EACH,UAAU,KAAK,aAAa,CAAC,MAAM,IAAI,KAAK,YAAY,KAAK;EAC7D,MAAM,MAAM,KAAK,aAAa,CAAC,GAAG;GAC9B,IAAI,SAAS,GAAG,CAAC,CAAC,UAAU,SAAS,UACjC,MAAM,IAAI,eAAe,yBAAyB;GAEtD,QAAQ,MAAM,IAAI,KAAK,YAAY,KAAK,EAAA,CAAG;EAC/C;EACA,MAAM,QAAQ,KAAK,aAAa,CAAC,GAAG;GAChC,MAAM,SAAS,MAAM,IAAI,KAAK,YAAY,IAAI;GAC9C,IAAI,CAAC,OAAO,MACR,MAAM,IAAI,eAAe,6BAA6B;GAE1D,OAAO,OAAO;EAClB;CACJ;AACJ;AAEA,eAAe,iBACX,IACA,WACA,YACA,SACA,SACkB;CAClB,gBAAgB,UAAU,KAAK;CAC/B,MAAM,gBAAgB,MAAM,YAAY,EAAE;CAC1C,MAAM,SAAS,gBAAgB,MAAM,WAAW,IAAI,UAAU,KAAK,IAAI;CACvE,IAAI,QAAQ,MAAM,qBAAqB,IAAI,MAAM;CACjD,IAAI,UAAU,SAAS,eAAe;EAClC,IAAI,QAAQ;GACR,IAAI,UAAU,aAAa,OAAO;IAAE,MAAM,CAAC;IAAG,cAAc;GAAE;GAC9D,MAAM,IAAI,eAAe,yBAAyB,UAAU,OAAO;EACvE;EACA,MAAM,UAAuB;GACzB,SAAS;GACT,OAAO,UAAU;GACjB,SAAS,UAAU;GACnB,WAAW;EACf;EACA,eAAe,SAAS,UAAU,KAAK;EACvC,IAAI,CAAC,eAAe;GAChB,MAAM,GAAG,YAAY,OAAO;GAC5B,MAAM,GAAG,IAAI,SAAS,WAAW,WAAW,KAAK,CAAC;EACtD;EACA,MAAM,GAAG,YAAY,UAAU,KAAK;EACpC,MAAM,GAAG,IAAI,UAAU,OAAO,iBAAiB,gBAAgB,OAAO,CAAC;EACvE,MAAM,GAAG,IAAI,SAAS,UAAU,UAAU,KAAK,GAAG,WAAW,OAAO,CAAC;EACrE,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;CACvC;CACA,IAAI,CAAC,QAAQ;EACT,IAAI,UAAU,SAAS,eAAe,UAAU,UAAU,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;EAC7F,MAAM,IAAI,eAAe,yBAAyB,UAAU,OAAO;CACvE;CACA,IAAI,UAAU,SAAS,aAAa;EAChC,MAAM,GAAG,UAAU,UAAU,KAAK;EAClC,MAAM,GAAG,OAAO,SAAS,UAAU,UAAU,KAAK,CAAC;EACnD,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc;EAAE;CACvC;CACA,IAAI,UAAU,SAAS,UACnB,OAAO,WAAW,IAAI,QAAQ,WAAW,UAAU;CAEvD,cAAc,QAAQ,UAAU,OAAO,UAAU;CACjD,IAAI,UAAU,SAAS,UAAU;EAC7B,mBAAmB,QAAQ,UAAU,OAAO;EAC5C,KAAK,MAAM,SAAS,UAAU,SAAS,UAAU,QAAQ,MAAM,MAAM;CACzE;CACA,IAAI,UAAU,SAAS,UAAU;EAC7B,mBACI,QACA,UAAU,YAAY,KAAK,eAAe,WAAW,MAAM,CAC/D;EACA,KAAK,MAAM,cAAc,UAAU,aAC/B,eAAe,UAAU,QAAQ,WAAW,MAAM,GAAG,gBAAgB,WAAW,OAAO,UAAU,CAAC;CAE1G;CACA,MAAM,UAAU,UAAU,SAAS,WAAW,UAAU,UAAU,CAAC;CACnE,MAAM,OAAO,WAAW,QAAQ,UAAU,OAAO,SAAS,YAAY,OAAO;CAC7E,MAAM,QAAQ,UAAU,SAAS,WAAW,aAAa,UAAU,OAAO,YAAY,OAAO,IAAI;CACjG,MAAM,SAAS,UAAU,SAAS,WAAY,aAAa,UAAU,QAAQ,YAAY,QAAQ,KAAK,IAAK;CAC3G,IAAI,SAAS,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc;EAAG,MAAM,KAAK;CAAO;CACnE,MAAM,aACF,UAAU,SAAS,YAAY,KAAK,OAAO,SAAS,UAAU,UAAU,OAClE,KAAK,IAAI,OAAO,kBAAkB,SAAS,KAAK,IAChD,KAAA;CACV,MAAM,OAAO,UAAU,IAAI,CAAC,IAAI,MAAM,SAAS,IAAI,QAAQ,MAAM,UAAU,OAAO,YAAY,UAAU;CACxG,IAAI,UAAU,SAAS,UAAU;EAC7B,IAAI,KAAK,OAAO,SAAS,UAAU,KAAK,MAAM,MAAM,UAAU,YAAY,MAAM,OAAO,OAAO,CAAC;EAE/F,OAAO;GACH,MAFa,KAAK,MAAM,QAAQ,UAAU,OAAO,KAAA,IAAY,SAAS,KAEhE,CAAA,CAAS,KAAK,EAAE,UAClB,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI,CAAC,CACpF;GACA,cAAc;GACd,MAAM,KAAK;EACf;CACJ;CACA,IAAI,UAAU,SAAS,UAAU;EAC7B,MAAM,GAAG,WACL,OAAO,OACP,KAAK,KAAK,EAAE,UAAU,GAAG,CAC7B;EACA,OAAO;GAAE,MAAM,CAAC;GAAG,cAAc,KAAK;GAAQ,MAAM,KAAK;EAAO;CACpE;CACA,MAAM,UAAU,KAAK,KAAK,EAAE,KAAK,UAAU;EACvC,MAAM,UAAU,EAAE,GAAG,IAAI;EACzB,KAAK,MAAM,cAAc,UAAU,aAC/B,QAAQ,WAAW,UAAU,eACzB,UAAU,QAAQ,WAAW,MAAM,GACnC,gBAAgB,WAAW,OAAO,UAAU,CAChD;EAEJ,MAAM,UAAU,cAAc,MAAM;EACpC,OAAO;GAAE,QAAQ;GAAK,KAAK,UAAU,WAAW,SAAS,QAAQ,QAAQ,KAAK,IAAI;GAAK,KAAK;EAAQ;CACxG,CAAC;CACD,MAAM,+BAAe,IAAI,IAAY;CACrC,MAAM,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE,UAAU,cAAc,GAAG,CAAC,CAAC;CACjE,KAAK,MAAM,UAAU,SAAS;EAC1B,MAAM,WAAW,cAAc,OAAO,GAAG;EACzC,IAAI,aAAa,IAAI,QAAQ,GAAG,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;EACpG,aAAa,IAAI,QAAQ;EACzB,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAM,MAAM,GAAG,IAAI,OAAO,OAAO,OAAO,GAAG,GAChE,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;CAE5E;CACA,MAAM,GAAG,WACL,OAAO,OACP,QAAQ,KAAK,EAAE,aAAa,MAAM,CACtC;CACA,KAAK,MAAM,UAAU,SAAS,MAAM,GAAG,IAAI,OAAO,OAAO,OAAO,KAAK,UAAU,QAAQ,OAAO,GAAG,CAAC;CAClG,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc,QAAQ;EAAQ,MAAM,KAAK;CAAO;AACvE;AAEA,eAAe,YAAY,IAAmC;CAC1D,IAAI;CACJ,IAAI;EACA,QAAQ,MAAM,GAAG,IAAI,SAAS,SAAS;CAC3C,SAAS,OAAO;EACZ,IAAI,iBAAiB,sBAAuB,iBAAiB,SAAS,MAAM,SAAS,sBACjF,OAAO;EACX,MAAM;CACV;CACA,IAAI,CAAC,OAAO,MAAM,IAAI,eAAe,0CAA0C,SAAS;CACxF,MAAM,QAAiB,WAAW,KAAK;CACvC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,WAAW,MAAM,UAAU,MAAM,YAAY,MAAM,SAC7E,MAAM,IAAI,eAAe,8BAA8B;CAE3D,OAAO;AACX;AAEA,eAAe,WAAW,IAAiB,OAA4C;CACnF,MAAM,QAAQ,MAAM,GAAG,IAAI,SAAS,UAAU,KAAK,CAAC;CACpD,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,SAAkB,WAAW,KAAK;CACxC,eAAe,QAAQ,KAAK;CAC5B,OAAO;AACX;AAEA,eAAe,qBAAqB,IAAiB,QAAoC;CACrF,IAAI;CACJ,IAAI;EACA,QAAQ,MAAM,GAAG,IAAI,OAAO,OAAO,eAAe;CACtD,SAAS,OAAO;EACZ,IAAI,iBAAiB,sBAAuB,iBAAiB,SAAS,MAAM,SAAS,sBACjF,MAAM,IAAI,eAAe,+BAA+B,OAAO,SAAS,EAAE,OAAO,MAAM,CAAC;EAE5F,MAAM;CACV;CACA,IAAI,CAAC,SAAS,aAAa,OAAO,gBAAgB,MAAM,CAAC,MAAM,GAC3D,MAAM,IAAI,eAAe,mDAAmD,OAAO,OAAO;AAElG;AAEA,SAAS,gBAAgB,QAAiC;CACtD,OAAO,WAAW,GACb,oBAAoB,KAAK,UAAU;EAChC,QAAQ;EACR,SAAS,OAAO;EAChB,OAAO,OAAO;EACd,SAAS,OAAO;CACpB,CAAC,EACL,CAAC;AACL;AAEA,SAAS,eAAe,OAAgB,OAA6C;CACjF,IACI,CAAC,SAAS,KAAK,KACf,MAAM,YAAY,KAClB,MAAM,UAAU,SAChB,CAAC,MAAM,QAAQ,MAAM,OAAO,KAC5B,CAAC,MAAM,QAAQ,UACf,OAAO,MAAM,cAAc,YAC3B,MAAM,UAAU,SAAS,MACzB,CAAC,cAAc,KAAK,MAAM,SAAS,KACnC,OAAO,MAAM,SAAS,IAAI,aAAa,IAEvC,MAAM,IAAI,eAAe,+BAA+B,OAAO;CAEnE,MAAM,wBAAQ,IAAI,IAAY;CAC9B,IAAI,YAAY;CAChB,KAAK,MAAM,aAAa,MAAM,SAAsB;EAChD,IACI,CAAC,SAAS,SAAS,KACnB,OAAO,UAAU,SAAS,YAC1B,CAAC,UAAU,KAAK,UAChB,OAAO,UAAU,SAAS,YAC1B,CAAC,aAAa,IAAI,UAAU,IAAI,KAChC,OAAO,UAAU,eAAe,aAChC,OAAO,UAAU,aAAa,aAC9B,MAAM,IAAI,UAAU,IAAI,KACvB,UAAU,cAAc,UAAU,UAEnC,MAAM,IAAI,eAAe,+BAA+B,OAAO;EAEnE,MAAM,IAAI,UAAU,IAAI;EACxB,IAAI,UAAU,YAAY,aAAa;CAC3C;CACA,IAAI,YAAY,GAAG,MAAM,IAAI,eAAe,4BAA4B,OAAO;AACnF;AAEA,eAAe,WACX,IACA,QACA,WACA,YACkB;CAClB,MAAM,UAAU,UAAU,WAAW,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI;CAC/E,mBAAmB,QAAQ,OAAO;CAClC,MAAM,UAAU,cAAc,MAAM;CACpC,IAAI,YAAY,OAAO,OAAO,SAAS;CACvC,MAAM,UAA2C,CAAC;CAClD,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,UAAU,UAAU,MAAM;EACjC,IAAI,OAAO,WAAW,QAAQ,QAAQ,MAAM,IAAI,eAAe,2CAA2C;EAC1G,MAAM,MAAM,OAAO,OAAO,IAAI;EAC9B,KAAK,MAAM,UAAU,OAAO,SAAS,IAAI,OAAO,QAAQ;EACxD,OAAO,SAAS,YAAY,UAAU;GAClC,IAAI,QAAQ,UAAU,gBAAgB,YAAY,UAAU;EAChE,CAAC;EACD,KAAK,MAAM,UAAU,OAAO,SAAS,IAAI,OAAO,QAAQ,eAAe,QAAQ,IAAI,OAAO,KAAK;EAC/F,IAAI,CAAC,WAAW,YAAY,YACxB,MAAM,IAAI,gBAAgB,qCAAqC,OAAO,OAAO;EACjF,MAAM,MAAM,UAAU,WAAW,SAAS,IAAI,QAAQ,KAAK,IAAI,OAAO,WAAW;EACjF,MAAM,WAAW,cAAc,GAAG;EAClC,IAAI,KAAK,IAAI,QAAQ,KAAM,MAAM,GAAG,IAAI,OAAO,OAAO,GAAG,GACrD,MAAM,IAAI,gBAAgB,4BAA4B,OAAO,OAAO;EACxE,KAAK,IAAI,QAAQ;EACjB,QAAQ,KAAK,CAAC,KAAK,UAAU,QAAQ,GAAG,CAAC,CAAC;CAC9C;CACA,MAAM,GAAG,QAAQ,OAAO,OAAO,OAAO;CACtC,IAAI,CAAC,SAAS;EACV,OAAO,YAAY,UAAU,SAAS;EACtC,MAAM,GAAG,IAAI,SAAS,UAAU,OAAO,KAAK,GAAG,WAAW,MAAM,CAAC;CACrE;CACA,OAAO;EAAE,MAAM,CAAC;EAAG,cAAc,QAAQ;CAAO;AACpD;AAEA,SAAS,eAAe,QAA6B,OAA2B;CAC5E,IAAI,UAAU,MAAM;EAChB,IAAI,CAAC,OAAO,UAAU,MAAM,IAAI,gBAAgB,UAAU,OAAO,KAAK,gBAAgB;EACtF,OAAO;CACX;CACA,QAAQ,OAAO,MAAf;EACI,KAAK,WAAW;GACZ,IAAI,OAAO,UAAU,aAAa,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,IAAI;GAC9F,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;GAChE,IAAI,UAAU,eAAe,UAAU,aAAa;GACpD,OAAO,WAAW,OAAO,OAAO,gBAAgB,KAAK,WAAW,OAAO,OAAO,gBAAgB,IACxF,OAAO,OAAO,IACd;EACV;EACA,KAAK;GACD,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,GAAG,OAAO,EAAE,IAAI,IAAI;GAC3F,IAAI,OAAO,UAAU,UAAU;IAC3B,MAAM,WAAW,OAAO,KAAK;IAE7B,IAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO,OAAO;GACxE;GACA;EACJ,KAAK;GACD,IAAI,OAAO,UAAU,UAAU;IAC3B,SAAS,KAAK;IACd,OAAO;GACX;GACA;EACJ,KAAK;GACD,IAAI,OAAO,UAAU,WAAW,OAAO;GACvC;EACJ,KAAK,QACD,IAAI,iBAAiB,YAAY,OAAO,MAAM,MAAM;CAE5D;CACA,MAAM,IAAI,aAAa,UAAU,OAAO,KAAK,YAAY,OAAO,MAAM;AAC1E;AAEA,SAAS,WAAW,QAA6B,OAA6B;CAC1E,IAAI,UAAU,MAAM,MAAM,IAAI,gBAAgB,eAAe,OAAO,KAAK,gBAAgB;CACzF,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,OAAO,KAAwB,IAAI,WAAW;CAC3F,IAAI,OAAO,UAAU,UAAU,MAAM,IAAI,aAAa,uBAAuB,OAAO,MAAM;CAC1F,OAAO,SAAS,KAAK;AACzB;AAEA,SAAS,UAAU,QAAqB,KAAyB;CAC7D,MAAM,SAAS,OAAO,OAAO,IAAI;CACjC,KAAK,MAAM,UAAU,OAAO,SAAS,OAAO,OAAO,QAAQ,YAAY,IAAI,OAAO,KAAK;CACvF,OAAO,WAAW,MAAM;AAC5B;AAEA,SAAS,YAAY,OAAmD;CAEpE,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS;CACrD,IAAI,iBAAiB,YAAY,OAAO,cAAc,KAAK;CAC3D,OAAO;AACX;AAEA,SAAS,UAAU,QAAqB,MAA2B;CAC/D,MAAM,SAAkB,WAAW,KAAK,KAAK;CAC7C,IAAI,CAAC,SAAS,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC,WAAW,OAAO,QAAQ,QACnE,MAAM,IAAI,mBAAmB,sBAAsB,OAAO,OAAO;CACrE,MAAM,MAAM,OAAO,OAAO,IAAI;CAC9B,IAAI;EACA,KAAK,MAAM,UAAU,OAAO,SAAS;GACjC,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,IAAI,GAAG,MAAM,IAAI,MAAM,oBAAoB;GAC7E,IAAI,QAAQ,OAAO,OAAO;GAC1B,IAAI,OAAO,SAAS,aAAa,OAAO,UAAU,UAAU;IACxD,IAAI,MAAM,SAAS,MAAM,CAAC,sBAAsB,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,wBAAwB;IACrG,QAAQ,OAAO,KAAK;GACxB,OAAO,IAAI,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU;IAC5D,IAAI,MAAM,SAAS,KAAK,CAAC,eAAe,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,qBAAqB;IAC1F,QAAQ,WAAW,KAAK,MAAM,MAAM,QAAQ,KAAK,CAAC,IAAI,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;GAC5F;GACA,IACI,UAAU,QACV,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,EAAE,iBAAiB,aAEnB,MAAM,IAAI,MAAM,sBAAsB;GAC1C,IAAI,OAAO,QAAQ,eAAe,QAAQ,KAAK;EACnD;EACA,MAAM,UAAU,cAAc,MAAM;EACpC,IAAI,WAAW,aAAa,WAAW,SAAS,IAAI,QAAQ,KAAK,GAAG,KAAK,GAAG,MAAM,GAC9E,MAAM,IAAI,MAAM,8CAA8C;CACtE,SAAS,OAAO;EACZ,MAAM,IAAI,mBACN,sBAAsB,OAAO,MAAM,IAAI,iBAAiB,QAAQ,MAAM,UAAU,iBACpF;CACJ;CACA,OAAO;EAAE,KAAK,KAAK;EAAK;CAAI;AAChC;AAEA,SAAS,cAAc,QAAqB,YAAkC,YAA8B;CACxG,IAAI,CAAC,YAAY;CACjB,IAAI,UAAU,YAAY;EACtB,cAAc,QAAQ,WAAW,MAAM,UAAU;EACjD,cAAc,QAAQ,WAAW,OAAO,UAAU;EAClD;CACJ;CACA,MAAM,SAAS,UAAU,QAAQ,WAAW,MAAM;CAClD,IAAI,WAAW,SAAS,cAAc;EAClC,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;EAC1D,IAAI,UAAU,MAAM;EACpB,IAAI,OAAO,SAAS,aAAa,OAAO,SAAS,QAAQ;GACrD,IAAI,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAI;GACxF,MAAM,IAAI,aAAa,kBAAkB,OAAO,KAAK,0BAA0B;EACnF;EACA,eAAe;GAAE,GAAG;GAAQ,UAAU;EAAK,GAAG,KAAK;CACvD;AACJ;AAEA,SAAS,cAAc,KAAa,YAA2B,YAA+B;CAC1F,IAAI,UAAU,YAAY;EACtB,MAAM,OAAO,cAAc,KAAK,WAAW,MAAM,UAAU;EAC3D,MAAM,QAAQ,cAAc,KAAK,WAAW,OAAO,UAAU;EAC7D,IAAI,WAAW,SAAS,OACpB,OAAO,SAAS,SAAS,UAAU,QAAQ,QAAQ,SAAS,QAAQ,UAAU,OAAO,OAAO;EAChG,OAAO,SAAS,QAAQ,UAAU,OAAO,OAAO,SAAS,QAAQ,UAAU,OAAO,OAAO;CAC7F;CACA,MAAM,OAAO,IAAI,WAAW;CAC5B,IAAI,WAAW,SAAS,UAAU,OAAO,WAAW,UAAU,SAAS,OAAO,SAAS;CACvF,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;CAC1D,IAAI,SAAS,QAAQ,UAAU,MAAM,OAAO;CAC5C,MAAM,WAAW,cAAc,MAAM,KAAK;CAC1C,QAAQ,WAAW,UAAnB;EACI,KAAK,KACD,OAAO,aAAa;EACxB,KAAK,MACD,OAAO,aAAa;EACxB,KAAK,KACD,OAAO,WAAW;EACtB,KAAK,MACD,OAAO,YAAY;EACvB,KAAK,KACD,OAAO,WAAW;EACtB,KAAK,MACD,OAAO,YAAY;CAC3B;AACJ;AAEA,SAAS,WACL,QACA,OACA,SACA,YACA,SACU;CACV,MAAM,cAAc,uBAAuB,KAAK;CAChD,MAAM,UAAU,cAAc,MAAM;CACpC,MAAM,aAAiF,CAAC;CACxF,IAAI,SAAS,WAAW,KAAK,EAAE,QAAQ,QAAQ,CAAC;CAChD,KAAK,MAAM,SAAS,SAEhB,IACI,MAAM,UAAU,OAAO,SACvB,CAAC,MAAM,YACP,MAAM,QAAQ,WAAW,KACzB,CAAC,MAAM,QAAQ,EAAE,CAAC,SAAS,GAAG,GAChC;EACE,MAAM,SAAS,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM,QAAQ,EAAE;EAC7E,IAAI,QAAQ,WAAW,KAAK;GAAE;GAAQ;EAAM,CAAC;CACjD;CAEJ,KAAK,MAAM,gBAAgB,CAAC,MAAM,KAAK,GACnC,KAAK,MAAM,aAAa,YAAY;EAChC,MAAM,WAAW,YAAY,QACxB,UACG,MAAM,WAAW,UAAU,OAAO,SACjC,eAAe,MAAM,aAAa,MAAM;GAAC;GAAK;GAAM;GAAK;EAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC/F;EACA,IAAI;EACJ,MAAM,QAAe,CAAC;EACtB,KAAK,MAAM,cAAc,UAAU;GAC/B,MAAM,QAAQ,gBAAgB,WAAW,OAAO,UAAU;GAC1D,MAAM,UAAU,QAAQ,UAAU,QAAQ,OAAO,QAAQ,UAAU,KAAK,GAAG,YAAY;GACvF,IAAI,CAAC,SAAS;GACd,IAAI,cAAc;IACd,MAAM;IACN;GACJ;GACA,cAAc,OAAO,WAAW,UAAU,OAAO;EACrD;EACA,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ;EACxC,MAAM,SAAiC,UAAU,QAC3C,eACI,iBACA,gBACJ,eACE,uBACA;EACR,MAAM,UAAU,eAAe,QAAQ,UAAU,QAAQ,UAAU,OAAO,SAAS,GAAG;EACtF,IAAI,WAAW,QAAQ,EAAE,EAAE,cAAc,QAAQ,MAAM,UAAU;EACjE,OAAO;GACH,QAAQ;IACJ,OAAO,OAAO;IACd;IACA,QAAQ,UAAU,OAAO;IACzB,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,IAAI,CAAC;IACzD,MAAM,UAAU,SAAS;IACzB,QAAQ,OAAO,UAAU,QAAQ,SAAS,UAAU,MAAM,SAAS,cAAc,OAAO,eAAe,aAAa,QAAQ;GAChI;GACA;GACA;GACA,OAAO,CAAC,OAAO,WAAW,KAAK;EACnC;CACJ;CAEJ,IAAI,QAAQ,QACR,KAAK,MAAM,aAAa,YAAY;EAChC,IAAI,CAAC,eAAe,QAAQ,UAAU,QAAQ,UAAU,OAAO,OAAO,GAAG;EACzE,OAAO;GACH,QAAQ;IACJ,OAAO,OAAO;IACd,QAAQ,UAAU,QAAQ,gBAAgB;IAC1C,QAAQ,UAAU,OAAO;IACzB,GAAI,UAAU,QAAQ,EAAE,OAAO,UAAU,MAAM,KAAK,IAAI,CAAC;IACzD,MAAM;IACN,QAAQ,OAAO,UAAU,QAAQ,SAAS,UAAU,MAAM,SAAS,cAAc;GACrF;GACA,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC,cAAc,OAAO;EACtD;CACJ;CAEJ,OAAO,EACH,QAAQ;EACJ,OAAO,OAAO;EACd,QAAQ;EACR,MAAM,QAAQ,SAAS,WAAW;EAClC,QAAQ;CACZ,EACJ;AACJ;AAEA,SAAS,eACL,QACA,QACA,OACA,QACA,KACO;CACP,IAAI,CAAC,OAAO,UAAW,OAAO,CAAC,OAAQ,OAAO;CAC9C,IAAI,OAAO,EAAE,CAAC,WAAW,OAAO,MAAM,OAAO;CAC7C,IAAI,CAAC,OAAO,OAAO,OAAO,WAAW;CAErC,IAAI,OAAO,SAAS,aAAa,CAAC,KAAK,OAAO;CAE9C,IAAI,OAAO,WAAW,GAAG,OAAO,OAAO,EAAE,CAAC,cAAc,SAAU,MAAM,UAAU,CAAC,OAAO;CAC1F,MAAM,UAAU,cAAc,MAAM;CACpC,OAAO,OAAO,WAAW,KAAK,OAAO,EAAE,CAAC,WAAW,SAAS,QAAQ,OAAO,EAAE,CAAC,cAAc,OAAO,EAAE,CAAC;AAC1G;AAEA,SAAS,QACL,QACA,OACA,WACA,UACiB;CACjB,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,OAAO,SAAS,WAAW;EAC3B,IAAI,OAAO,UAAU,aAAa,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,IAAI,OAAO;EACrG,IAAI,aAAa,CAAC,UAAU,OAAO;EACnC,MAAM,aAAa,eAAe;GAAE,GAAG;GAAQ,UAAU;EAAK,GAAG,KAAK;EACtE,OAAO,YAAY,SAAS,YAAY,UAAU,CAAC,IAAI,WAAW,QAAQ,UAAU;CACxF;CACA,IACI,OAAO,SAAS,UAChB,OAAO,UAAU,aAChB,QAAQ,OAAO,OAAO,gBAAgB,KAAK,QAAQ,OAAO,OAAO,gBAAgB,IAElF,OAAO;CACX,MAAM,aAAa,eAAe;EAAE,GAAG;EAAQ,UAAU;CAAK,GAAG,KAAK;CACtE,OAAO,YAAY,SAAS,YAAY,UAAU,CAAC,IAAI,WAAW,QAAQ,UAAU;AACxF;AAEA,SAAS,uBAAuB,OAA2C;CACvE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,MAAM,SAAS,cAAc,OAAO,CAAC,KAAK;CAC9C,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,GAAG,uBAAuB,MAAM,IAAI,GAAG,GAAG,uBAAuB,MAAM,KAAK,CAAC;CAC/G,OAAO,CAAC;AACZ;AAEA,SAAS,cAAc,OAAc,UAAkC,KAAuB;CAC1F,IAAI,aAAa,OAAO,aAAa,MAAM;EACvC,MAAM,UAAU,MAAM,MAAM,MAAM;EAClC,MAAM,WAAW,UAAU,aAAa,KAAK,OAAO,IAAI;EACxD,IAAI,WAAW,KAAM,aAAa,KAAK,aAAa,KAAM;GACtD,OAAO,MAAM;GACb,OAAO,MAAM;GACb,IAAI,aAAa,KAAK,MAAM,KAAK;QAC5B,MAAM,MAAM;EACrB;CACJ,OAAO,IAAI,aAAa,OAAO,aAAa,MAAM;EAC9C,MAAM,UAAU,MAAM,MAAM,MAAM;EAClC,MAAM,WAAW,UAAU,aAAa,KAAK,OAAO,IAAI;EACxD,IAAI,WAAW,KAAM,aAAa,KAAK,aAAa,KAAM;GACtD,OAAO,MAAM;GACb,OAAO,MAAM;GACb,IAAI,aAAa,KAAK,MAAM,KAAK;QAC5B,MAAM,MAAM;EACrB;CACJ;AACJ;AAEA,SAAS,WAAW,OAAuB;CACvC,MAAM,QAAQ,MAAM,MAAM,MAAM;CAChC,MAAM,QAAQ,MAAM,MAAM,MAAM;CAChC,IAAI,CAAC,SAAS,CAAC,OAAO,OAAO;CAC7B,MAAM,WAAW,aAAa,OAAO,KAAK;CAC1C,OAAO,WAAW,KAAM,aAAa,MAAM,QAAQ,MAAM,EAAE,KAAK,QAAQ,MAAM,EAAE;AACpF;AAEA,eAAe,SACX,IACA,QACA,MACA,OACA,YACA,YACoB;CACpB,IAAI,KAAK,OAAO,OAAO,CAAC;CACxB,MAAM,OAAoB,CAAC;CAC3B,MAAM,UAAU,SAA4B;EACxC,IAAI,KAAK,IAAI,WAAW,KAAK,KAAK,IAAI,OAAO,gBAAgB,IAAI,OAAO;EACxE,MAAM,MAAM,UAAU,QAAQ,IAAI;EAClC,IAAI,CAAC,SAAS,cAAc,IAAI,KAAK,OAAO,UAAU,MAAM,MAAM,KAAK,KAAK,GAAG;EAC/E,OAAO,eAAe,KAAA,KAAa,KAAK,UAAU;CACtD;CACA,IAAI,KAAK,OAAO,OAAO;EACnB,MAAM,QAAQ,KAAK,MAAM;GAAE,GAAG,KAAK;GAAO,KAAK,KAAK;GAAK,KAAK,KAAK;EAAI,IAAI,KAAK;EAChF,WAAW,MAAM,CAAC,KAAK,UAAU,GAAG,YAAY,OAAO,OAAO,KAAK,OAAO,OAAO,OAAO,EACpF,SAAS,KAAK,IAAI,KAAK,cAAc,GAAG,EAC5C,CAAC,GACG,IAAI,OAAO;GAAE;GAAK;EAAM,CAAC,GAAG;CAEpC,OAAO,IAAI,KAAK,KAAK;EACjB,MAAM,QAAQ,MAAM,GAAG,IAAI,OAAO,OAAO,KAAK,GAAG;EACjD,IAAI,OAAO,OAAO;GAAE,KAAK,KAAK;GAAK;EAAM,CAAC;CAC9C,OAAO,IAAI,OAAO,GAAG,aAAa,cAAc,OAAO,GAAG,oBAAoB,YAAY;EACtF,IAAI;EACJ,IAAI;GACA,SAAS;IACL,MAAM,OAAO,MAAM,GAAG,SAAS,OAAO,OAAO,KAAK,OAAO;KACrD;KACA,SAAS,KAAK,IAAI,KAAK,eAAe,KAAA,IAAY,MAAM,aAAa,KAAK,MAAM;IACpF,CAAC;IACD,SAAS,KAAK;IACd,KAAK,MAAM,QAAQ,KAAK,MACpB,IAAI,OAAO,IAAI,GAAG,OAAO;IAE7B,IAAI,KAAK,MAAM;GACnB;EACJ,UAAU;GACN,IAAI,WAAW,KAAA,GAAW,MAAM,GAAG,gBAAgB,MAAM;EAC7D;CACJ,OAEI,KAAK,MAAM,QAAQ,MAAM,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,GACrD,IAAI,OAAO,IAAI,GAAG;CAG1B,OAAO;AACX;AAEA,SAAS,YAAY,MAAiB,OAAkB,QAA8B;CAClF,KAAK,MAAM,SAAS,QAAQ;EACxB,MAAM,WAAW,cAAc,KAAK,IAAI,MAAM,SAAS,MAAM,IAAI,MAAM,OAAO;EAC9E,IAAI,UAAU,OAAO,MAAM,cAAc,SAAS,CAAC,WAAW;CAClE;CACA,OAAO,aAAa,KAAK,KAAK,MAAM,GAAG;AAC3C;AAEA,SAAS,cAAc,MAAgB,OAAyB;CAC5D,IAAI,SAAS,MAAM,OAAO,UAAU,OAAO,IAAI;CAC/C,IAAI,UAAU,MAAM,OAAO;CAC3B,KACK,OAAO,SAAS,YAAY,OAAO,SAAS,cAC5C,OAAO,UAAU,YAAY,OAAO,UAAU,WAE/C,OAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;CAClD,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAAU,OAAO,aAAa,SAAS,IAAI,GAAG,SAAS,KAAK,CAAC;CAC9G,IAAI,OAAO,SAAS,aAAa,OAAO,UAAU,WAAW,OAAO,OAAO,IAAI,IAAI,OAAO,KAAK;CAC/F,IAAI,gBAAgB,cAAc,iBAAiB,YAAY,OAAO,aAAa,MAAM,KAAK;CAC9F,MAAM,IAAI,aAAa,4CAA4C;AACvE;AAEA,SAAS,aAAa,YAAuC,YAAwB,QAA+B;CAChH,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,QAAQ,gBAAgB,YAAY,UAAU;CACpD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,IAAI,aAAa,GAAG,OAAO,sCAAsC;CAC3E,OAAO;AACX;AAEA,SAAS,WAAW,KAAa,SAA2B;CACxD,MAAM,SAAiB,CAAC;CACxB,KAAK,MAAM,UAAU,SACjB,OAAO,eAAe,QAAQ,QAAQ;EAClC,OAAO,IAAI,mBAAmB,aAAa,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;EACrE,YAAY;EACZ,cAAc;EACd,UAAU;CACd,CAAC;CACL,OAAO;AACX;AAEA,SAAS,mBAAmB,QAAqB,SAAgC;CAC7E,IAAI,CAAC,SAAS;CACd,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,QAAQ,SAAS;EACxB,UAAU,QAAQ,IAAI;EACtB,IAAI,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,eAAe,qBAAqB,MAAM;EACxE,KAAK,IAAI,IAAI;CACjB;AACJ;AAEA,SAAS,UAAU,QAAqB,MAAmC;CACvE,MAAM,SAAS,OAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,IAAI;CACjE,IAAI,CAAC,QAAQ,MAAM,IAAI,eAAe,mBAAmB,MAAM;CAC/D,OAAO;AACX;AAEA,SAAS,cAAc,QAAsD;CACzE,OAAO,OAAO,QAAQ,MAAM,WAAW,OAAO,UAAU;AAC5D;AACA,SAAS,UAAU,OAA2B;CAC1C,OAAO,WAAW,SAAS,OAAO;AACtC;AACA,SAAS,gBAAgB,OAAqB;CAC1C,IAAI,UAAU,WAAW,MAAM,WAAW,cAAc,GACpD,MAAM,IAAI,eAAe,4BAA4B,OAAO;AACpE;AACA,SAAS,eAAe,WAAkC;CACtD,OAAO,UAAU,SAAS,YAAY,UAAU,SAAS,YAAY,UAAU,SAAS;AAC5F;AACA,SAAS,SAAS,OAAkD;CAChE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC9E;AACA,SAAS,WAAW,OAA4B;CAC5C,IAAI;EACA,OAAO,WAAoB,KAAK;CACpC,QAAQ;EACJ,MAAM,IAAI,mBAAmB,uBAAuB;CACxD;AACJ;AACA,SAAS,cAAc,OAA2B;CAC9C,OAAO,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;AAClF;AACA,SAAS,aAAa,MAAkB,OAA2B;CAC/D,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM,GAAG,SAAS,GACtE,IAAI,KAAK,WAAW,MAAM,QAAQ,OAAO,KAAK,SAAS,MAAM;CACjE,OAAO,KAAK,SAAS,MAAM;AAC/B;;;ACnwBA,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;;AAExB,IAAM,cAAqB,OAAO,OAAO,CAAC,CAAC;AAC3C,IAAM,oBAAgC,OAAO,OAAO,CAAC,CAAC;AAEtD,eAAe,UAAa,IAAkC;CAC1D,IAAI;EACA,OAAO,MAAM,GAAG;CACpB,SAAS,OAAO;EACZ,MAAM,eAAe,KAAK;CAC9B;AACJ;AAEA,IAAM,kBAAN,MAA6C;CACzC;CACA;CACA;CACA,UAAU;CACV,+BAAe,IAAI,IAAgB;CACnC;CACA,YAAY,OAAsB,MAAc,MAAc,SAAqB;EAC/E,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,KAAK,OAAO;EACZ,KAAK,WAAW;CACpB;CACA,MAAM,cAAmC;EACrC,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,KAAK,CAAC;CACnE;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;CACxE;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,IAAI,CAAC;CAC7E;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,GAAG,CAAC;CACxE;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,SAAqC;EAC9F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,IAAI,KAAK,OAAO,OAAO,KAAK,OAAO,oBAAoB,OAAO,CAAC,CAAC;CAC7G;CACA,MAAM,QAAQ,OAAe,SAA0C,SAAqC;EACxG,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,SAAS,oBAAoB,OAAO,CAAC,CAAC;CAC9G;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,GAAG,CAAC;CAC3E;CACA,MAAM,WAAW,OAAe,MAAwC;EACpE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,IAAI,CAAC;CAChF;CACA,MAAM,WAAW,OAAe,KAAoC;EAChE,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,GAAG,CAAC;CAC/E;CACA,MAAM,KAAK,OAAe,OAAoC;EAC1D,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,SAAS,SAAS;EACxB,qBAAqB,MAAM;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,MAAM,CAAC;CAC5E;CACA,MAAM,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EAC/F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,aAAa,yBAAyB,OAAO;EACnD,IAAI,WAAW,WAAW,KAAA,KAAa,CAAC,KAAK,aAAa,IAAI,WAAW,MAAM,GAC3E,MAAM,IAAI,UAAU,iDAAiD;EAEzE,MAAM,OAAO,MAAM,gBACf,KAAK,OAAO,MAAM,SAAS;GACvB,MAAM,KAAK;GACX;GACA;GACA,UAAU,WAAW;GACrB,SAAS,WAAW;GACpB,UAAU,WAAW;EACzB,CAAC,CACL;EACA,KAAK,YAAY;EACjB,IAAI,WAAW,WAAW,KAAA,GAAW,KAAK,aAAa,OAAO,WAAW,MAAM;EAC/E,IAAI,KAAK,aAAa,KAAA,KAAa,CAAC,KAAK,SAAS,KAAK,aAAa,IAAI,KAAK,QAAQ;EACrF,OAAO,eAAe,IAAI;CAC9B;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,iBAAiB,MAAM,OAAO,OAAO,OAAO;CACvD;CACA,MAAM,gBAAgB,QAAmC;EACrD,oBAAoB,MAAM;EAC1B,IAAI,CAAC,KAAK,aAAa,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;EAClE,MAAM,gBAAgB,KAAK,OAAO,MAAM,YAAY,MAAM,CAAC;CAC/D;CACA,MAAM,WAAW,OAAe,WAAmB,KAA6C;EAC5F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,OAAO,WAAW,GAAG,CAAC;CAC1F;CACA,OAAO,YACH,OACA,WACA,QAAe,aACf,UAA4B,CAAC,GACU;EACvC,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,EAAE,SAAS,UAAU,aAAa,yBAAyB,OAAO;EACxE,MAAM,SAAS;EACf,qBAAqB,MAAM;EAC3B,IAAI,YAAY,MAAM,SAAS,OAAO;EACtC,IAAI,SAA4B;EAChC,MAAM,QAAQ,KAAK,OAAO;EAC1B,MAAM,OAAO,KAAK;EAClB,OAAO,YAAY,GAAG;GAClB,KAAK,YAAY;GACjB,MAAM,YAAY,KAAK,IAAI,WAAW,UAAU,oBAAoB;GACpE,IAAI;GACJ,IAAI;IACA,OAAO,MAAM,MAAM,gBAAgB,MAAM,OAAO,WAAW,QAAQ,QAAQ,WAAW,QAAQ;GAClG,SAAS,OAAO;IACZ,MAAM,eAAe,KAAK;GAC9B;GACA,MAAM,OAAO,KAAK;GAClB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;IACjD,MAAM,MAAM,KAAK;IACjB,MAAM,CAAC,IAAI,KAAK,IAAI,KAAK;GAC7B;GACA,aAAa,KAAK;GAClB,IAAI,KAAK,WAAW,MAChB;GAEJ,SAAS,KAAK;EAClB;CACJ;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,YAAY,KAAK,OAAO,MAAM,4BAA4B,OAAO,CAAC,CAAC;CAChH;CACA,MAAM,UAAU,MAA6B;EACzC,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;CACxE;CACA,MAAM,WAAW,MAA6B;EAC1C,KAAK,YAAY;EACjB,sBAAsB,IAAI;EAC1B,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,KAAK,OAAO,IAAI,CAAC;CACzE;CACA,MAAM,SAAwB;EAC1B,KAAK,YAAY;EACjB,IAAI;GACA,MAAM,gBAAgB,KAAK,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC;EAC9D,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,MAAM,WAA0B;EAC5B,KAAK,YAAY;EACjB,IAAI;GACA,MAAM,gBAAgB,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK,CAAC;EAChE,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,MAAM,iBAAgC;EAClC,IAAI,KAAK,SACL;EAEJ,IAAI,KAAK,OAAO,aAAa;GACzB,KAAK,YAAY;GACjB;EACJ;EACA,IAAI;GACA,MAAM,KAAK,OAAO,MAAM,SAAS,KAAK,KAAK;EAC/C,SAAS,OAAO;GACZ,MAAM,aAAa,eAAe,KAAK;GACvC,IAAI,EAAE,sBAAsB,yBACxB,MAAM;EAEd,UAAU;GACN,KAAK,YAAY;EACrB;CACJ;CACA,aAAmB;EACf,KAAK,YAAY;CACrB;CACA,aAAqB;EACjB,OAAO,KAAK;CAChB;CACA,cAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,aAC5B,MAAM,IAAI,uBAAuB;CAEzC;CACA,cAAc;EACV,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,aAAa,MAAM;EACxB,KAAK,SAAS;CAClB;AACJ;AACA,IAAM,SAAN,MAA2B;CACvB;CACA,UAAU;CACV,gBAAsC;CACtC,gCAAgB,IAAI,IAAqB;CACzC,iCAAiB,IAAI,IAA8B;CACnD,+BAAe,IAAI,IAAgB;CACnC,oCAAoB,IAAI,IAA6B;CACrD,yBAAyB;CACzB;CACA,4BAAiD;CACjD,gCAAqD;CACrD,YAAY,OAAsB;EAC9B,KAAK,SAAS;EACd,KAAK,iBAAiB,IAAI,gBAAgB,MAAM,QAAQ,MAAM,WAAW;EACzE,KAAK,4BAA4B,iCAAiC,aAAa;GAC3E,KAAK,wBAAwB;EACjC,CAAC;EACD,KAAK,gCAAgC,2BAA2B,aAAa;GACzE,KAAK,iBAAiB;EAC1B,CAAC;CACL;CACA,MAAM,MAAM,OAAe,YAAkC;EACzD,OAAO,KAAK,WAAW,IAAI;CAC/B;CACA,MAAM,mBACF,YACA,YACA,SACA,eACa;EACb,KAAK,YAAY;EACjB,MAAM,KAAK,MAAM,KAAK,WAAW,WAAW;EAC5C,MAAM,UAAU,IAAI,wBAAwB;EAC5C,MAAM,uBAAuB,IAAI,yBAAyB,IAAI,OAAO;EACrE,MAAM,cAAc,IAAI,gBAAgB,MAAM,sBAAsB,OAAO;EAC3E,IAAI;GACA,MAAM,KAAK,OAAO,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa;GACvE,MAAM,QAAQ;IACV,IAAI;IACJ;IACA;IACA,aAAa;GACjB,CAAC;GACD,MAAM,KAAK,OAAO,MAAM,iBAAiB,GAAG,WAAW,GAAG,UAAU;GACpE,MAAM,GAAG,OAAO;EACpB,SAAS,OAAO;GACZ,IAAI;IACA,MAAM,GAAG,eAAe;GAC5B,QAAQ,CAAC;GACT,MAAM;EACV;CACJ;CACA,MAAM,aAAgC;EAClC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,WAAW,CAAC;CAC1D;CACA,MAAM,cAAmC;EACrC,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,CAAC;CACzD;CACA,MAAM,aAA8B;EAChC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,WAAW,CAAC;CAC1D;CACA,MAAM,aAAa,MAAY,UAA6B,CAAC,GAAwB;EACjF,OAAO,KAAK,YACR,KAAK,OAAO,MAAM,aAAa,cAAc,IAAI,GAAG,2BAA2B,OAAO,CAAC,CAC3F;CACJ;CACA,MAAM,WAAW,MAAwC;EACrD,KAAK,YAAY;EACjB,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,UAAU,YAAY;GAClC,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,MAAM,IAAI;GAC/C,MAAM,KAAK,IAAI,gBAAgB,KAAK,QAAQ,MAAM,YAAY;IAC1D,KAAK,cAAc,OAAO,EAAE;GAChC,CAAC;GACD,KAAK,cAAc,IAAI,EAAE;GACzB,IAAI,KAAK,WAAW,KAAK,OAAO,aAAa;IACzC,IAAI,KAAK,OAAO,aACZ,GAAG,WAAW;IAElB,MAAM,IAAI,oBAAoB;GAClC;GACA,IAAI,eAAe,KAAK,wBAAwB;IAC5C,MAAM,GAAG,eAAe;IACxB,MAAM,IAAI,uBAAuB;GACrC;GACA,OAAO;EACX,CAAC;EACD,KAAK,eAAe,IAAI,OAAO;EAC/B,IAAI;GACA,OAAO,MAAM;EACjB,UAAU;GACN,KAAK,eAAe,OAAO,OAAO;EACtC;CACJ;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,eAAe,CAAC,MAAM,4BAA4B,OAAO,CAAC,CAAC;CACnG;CACA,MAAM,UAAU,MAA6B;EACzC,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,aAAa,CAAC,IAAI,CAAC;CAC3D;CACA,MAAM,WAAW,MAA6B;EAC1C,sBAAsB,IAAI;EAC1B,MAAM,KAAK,YAAY,aAAa,cAAc,CAAC,IAAI,CAAC;CAC5D;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,OAAO,CAAC,OAAO,GAAG,CAAC;CAC3D;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,WAAW,CAAC,OAAO,IAAI,CAAC;CAChE;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,OAAO,CAAC,OAAO,GAAG,CAAC;CAC3D;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,SAAqC;EAC9F,sBAAsB,KAAK;EAC3B,MAAM,KAAK,YAAY,aAAa,OAAO;GAAC;GAAO;GAAK;GAAO,oBAAoB,OAAO;EAAC,CAAC;CAChG;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,aAAa,UAAU,CAAC,OAAO,GAAG,CAAC;CAC/D;CACA,MAAM,KAAK,OAAe,OAAoC;EAC1D,sBAAsB,KAAK;EAC3B,OAAO,KAAK,YAAY,YAAY,QAAQ,CAAC,OAAO,SAAS,WAAW,CAAC;CAC7E;CACA,MAAM,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EAC/F,KAAK,YAAY;EACjB,sBAAsB,KAAK;EAC3B,MAAM,aAAa,yBAAyB,OAAO;EACnD,IAAI,WAAW,WAAW,KAAA,KAAa,CAAC,KAAK,aAAa,IAAI,WAAW,MAAM,GAC3E,MAAM,IAAI,UAAU,qDAAqD;EAE7E,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,gBACZ,KAAK,OAAO,MAAM,SAAS;GACvB;GACA;GACA,UAAU,WAAW;GACrB,SAAS,WAAW;GACpB,UAAU,WAAW;EACzB,CAAC,CACL;EACA,KAAK,kBAAkB,IAAI,OAAO;EAClC,IAAI;GACA,MAAM,OAAO,MAAM;GACnB,IAAI,WAAW,WAAW,KAAA,GAAW,KAAK,aAAa,OAAO,WAAW,MAAM;GAC/E,IAAI,KAAK,aAAa,KAAA,GAAW,KAAK,aAAa,IAAI,KAAK,QAAQ;GACpE,KAAK,YAAY;GACjB,IAAI,eAAe,KAAK,wBAAwB;IAC5C,IAAI,KAAK,aAAa,KAAA,GAAW,MAAM,KAAK,gBAAgB,KAAK,QAAQ;IACzE,MAAM,IAAI,uBAAuB;GACrC;GACA,OAAO,eAAe,IAAI;EAC9B,UAAU;GACN,KAAK,kBAAkB,OAAO,OAAO;EACzC;CACJ;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,iBAAiB,MAAM,OAAO,OAAO,OAAO;CACvD;CACA,MAAM,gBAAgB,QAAmC;EACrD,oBAAoB,MAAM;EAC1B,IAAI,CAAC,KAAK,aAAa,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;EAClE,MAAM,gBAAgB,KAAK,OAAO,MAAM,YAAY,MAAM,CAAC;CAC/D;;CAEA,MAAM,YACF,MACA,SACA,MAC+B;EAC/B,KAAK,YAAY;EACjB,OAAO,gBAAgB,KAAK,OAAO,MAAM,WAAW,MAAM,SAAS,IAAI,CAAC;CAC5E;CACA,MAAM,eAAe,UAAiC,CAAC,GAAwB;EAC3E,OAAO,KAAK,MAAM,YAAY;GAC1B,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,eAAe,+BAA+B,OAAO,CAAC;GAC5F,OAAO,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK;EACrE,CAAC;CACL;CACA,MAAM,eAAe,MAAiC;EAClD,OAAO,KAAK,+BAA+B;GACvC,MAAM,QAAQ,gBAAgB,aAAa,OAAO,IAAI,WAAW,IAAI;GACrE,OAAO,KAAK,OAAO,MAAM,eAAe,KAAK;EACjD,CAAC;CACL;CACA,MAAM,QAAuB;EACzB,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,MAAM,CAAC;CACxE;CACA,MAAM,UAAqC;EACvC,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,QAAQ,CAAC;CAC1E;CACA,MAAM,UAAqC;EACvC,OAAO,KAAK,+BAA+B,KAAK,OAAO,MAAM,QAAQ,CAAC;CAC1E;CACA,MAAM,QAAQ;EACV,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,MAAM,CAAC;CACrD;CACA,MAAM,cAAoC;EACtC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,YAAY,CAAC;CAC3D;CACA,MAAM,qBAAuC;EACzC,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,mBAAmB,CAAC;CAClE;CACA,MAAM,UAAyB;EAC3B,OAAO,KAAK,YAAY,KAAK,OAAO,UAAU,KAAK,gBAAgB,KAAK,MAAM,CAAC;CACnF;CACA,MAAM,aAAa,WAA0C;EACzD,OAAO,KAAK,YAAY,KAAK,OAAO,MAAM,aAAa,SAAS,CAAC;CACrE;CAIA,UACI,MACA,MACA,MACW;EACX,KAAK,YAAY;EACjB,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,eAAe,UAAU,IAAI;EAE7C,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,eAAe,UAAU,MAAM,IAAI;EAEnD,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO,KAAK,eAAe,UAAU,MAAM,MAAM,IAAI;EAEzD,MAAM,IAAI,UACN,iGACJ;CACJ;CAIA,MACI,MACA,MACA,MACW;EACX,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,IAAI;EAE9B,IAAI,OAAO,SAAS,YAChB,OAAO,KAAK,UAAU,MAAM,IAAI;EAEpC,IAAI,gBAAgB,cAAc,OAAO,SAAS,YAC9C,OAAO,KAAK,UAAU,MAAM,MAAM,IAAI;EAE1C,MAAM,IAAI,UACN,6FACJ;CACJ;CACA,QAAuB;EACnB,IAAI,KAAK,kBAAkB,MACvB,OAAO,KAAK;EAEhB,IAAI,KAAK,SACL,OAAO,QAAQ,QAAQ;EAE3B,KAAK,UAAU;EACf,KAAK,8BAA8B;EACnC,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,KAAK,aAAa;EACvC,OAAO,KAAK;CAChB;CACA,MAAM,eAA8B;EAChC,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,cAAc,CAAC;EACxD,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,iBAAiB,CAAC;EAC3D,IAAI,gBAA8B;EAClC,MAAM,gBAAgB,MAAM,QAAQ,WAChC,MAAM,KAAK,KAAK,eAAe,WAAW,KAAK,gBAAgB,MAAM,CAAC,CAC1E;EACA,KAAK,MAAM,UAAU,eACjB,IAAI,OAAO,WAAW,cAAc,kBAAkB,MAAM,gBAAgB,eAAe,OAAO,MAAM;EAE5G,MAAM,MAAM,MAAM,KAAK,KAAK,aAAa;EACzC,IAAI,IAAI,SAAS,GAAG;GAChB,MAAM,UAAU,MAAM,QAAQ,WAAW,IAAI,KAAK,OAAO,GAAG,eAAe,CAAC,CAAC;GAC7E,KAAK,MAAM,UAAU,SACjB,IAAI,OAAO,WAAW,cAAc,kBAAkB,MAClD,gBAAgB,eAAe,OAAO,MAAM;EAGxD;EACA,IAAI;GACA,OAAO,KAAK,OAAO,UAAU,KAAK,gBAAgB,KAAK,MAAM;EACjE,SAAS,OAAO;GACZ,MAAM,eAAe,KAAK;EAC9B;EACA,IAAI,eACA,MAAM;CAEd;CACA,gCAAgC;EAC5B,KAAK,4BAA4B;EACjC,KAAK,4BAA4B;EACjC,KAAK,gCAAgC;EACrC,KAAK,gCAAgC;CACzC;CACA,0BAA0B;EACtB,KAAK,0BAA0B;EAC/B,KAAK,aAAa,MAAM;EACxB,KAAK,MAAM,MAAM,MAAM,KAAK,KAAK,aAAa,GAC1C,GAAG,WAAW;CAEtB;CACA,mBAAmB;EACf,IAAI,KAAK,SACL;EAEJ,KAAK,UAAU;EACf,KAAK,8BAA8B;EACnC,KAAK,wBAAwB;EAC7B,KAAK,eAAe,MAAM;CAC9B;CACA,MAAS,KAAmC;EACxC,KAAK,YAAY;EACjB,OAAO,UAAU,GAAG;CACxB;CACA,yBAA4B,KAAmC;EAC3D,KAAK,YAAY;EACjB,uBAAuB,KAAK,MAAM;EAClC,OAAO,UAAU,GAAG;CACxB;CACA,cAAc;EACV,IAAI,KAAK,WAAW,KAAK,OAAO,aAC5B,MAAM,IAAI,oBAAoB;CAEtC;AACJ;AACA,IAAM,0BAAN,MAA8B;CAC1B,2BAAW,IAAI,IAAY;CAC3B,2BAAW,IAAI,IAAY;CAC3B,aAAa,MAAoB;EAC7B,KAAK,SAAS,OAAO,IAAI;EACzB,KAAK,SAAS,IAAI,IAAI;CAC1B;CACA,WAAW,MAAoB;EAC3B,IAAI,KAAK,SAAS,OAAO,IAAI,GACzB;EAEJ,KAAK,SAAS,IAAI,IAAI;CAC1B;CACA,MAAM,QAA4B;EAC9B,MAAM,UAAU,IAAI,IAAI,MAAM;EAC9B,KAAK,MAAM,QAAQ,KAAK,UACpB,QAAQ,IAAI,IAAI;EAEpB,KAAK,MAAM,QAAQ,KAAK,UACpB,QAAQ,OAAO,IAAI;EAEvB,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,KAAK,wBAAwB;CAC5D;AACJ;AACA,IAAM,2BAAN,MAAsD;CAClD;CACA;CACA,YAAY,OAAwB,SAAkC;EAClE,KAAK,SAAS;EACd,KAAK,WAAW;CACpB;CACA,IAAI,OAAe;EACf,OAAO,KAAK,OAAO;CACvB;CACA,MAAM,cAAmC;EACrC,OAAO,KAAK,OAAO,YAAY;CACnC;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG;CACrC;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI;CAC1C;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,OAAO,KAAK,OAAO,IAAI,OAAO,GAAG;CACrC;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,SAAqC;EAC9F,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,OAAO;CACpD;CACA,MAAM,QAAQ,OAAe,SAA0C,SAAqC;EACxG,MAAM,KAAK,OAAO,QAAQ,OAAO,SAAS,OAAO;CACrD;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,OAAO,KAAK,OAAO,OAAO,OAAO,GAAG;CACxC;CACA,MAAM,WAAW,OAAe,MAAwC;EACpE,MAAM,KAAK,OAAO,WAAW,OAAO,IAAI;CAC5C;CACA,MAAM,WAAW,OAAe,KAAoC;EAChE,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG;CAC3C;CACA,MAAM,KAAK,OAAe,OAAoC;EAC1D,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK;CACxC;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EACzF,OAAO,KAAK,OAAO,SAAS,OAAO,OAAO,OAAO;CACrD;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,KAAK,OAAO,SAAS,OAAO,OAAO,OAAO;CACrD;CACA,gBAAgB,QAAmC;EAC/C,OAAO,KAAK,OAAO,gBAAgB,MAAM;CAC7C;CACA,MAAM,WAAW,OAAe,WAAmB,KAA6C;EAC5F,OAAO,KAAK,OAAO,WAAW,OAAO,WAAW,GAAG;CACvD;CACA,YACI,OACA,WACA,QAAe,CAAC,GAChB,UAA4B,CAAC,GACU;EACvC,OAAO,KAAK,OAAO,YAAY,OAAO,WAAW,OAAO,OAAO;CACnE;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,MAAM,KAAK,OAAO,YAAY,MAAM,OAAO;EAC3C,KAAK,SAAS,aAAa,IAAI;CACnC;CACA,MAAM,UAAU,MAA6B;EACzC,MAAM,KAAK,OAAO,UAAU,IAAI;EAChC,KAAK,SAAS,WAAW,IAAI;CACjC;CACA,MAAM,WAAW,MAA6B;EAC1C,MAAM,KAAK,OAAO,WAAW,IAAI;CACrC;CACA,SAAwB;EACpB,OAAO,QAAQ,OAAO,2BAA2B,oBAAoB,CAAC;CAC1E;CACA,WAA0B;EACtB,OAAO,QAAQ,OAAO,2BAA2B,sBAAsB,CAAC;CAC5E;AACJ;AACA,IAAM,kBAAN,MAAoC;CAChC;CACA;CACA;CACA,YAAY,IAAY,aAAuC,SAAkC;EAC7F,KAAK,MAAM;EACX,KAAK,eAAe;EACpB,KAAK,WAAW;CACpB;CACA,MAAM,QAAgB,YAAkC;EACpD,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,MAAM,YAAY,MAAc,UAA8B,CAAC,GAAkB;EAC7E,MAAM,KAAK,aAAa,YAAY,MAAM,OAAO;CACrD;CACA,MAAM,UAAU,MAA6B;EACzC,MAAM,KAAK,aAAa,UAAU,IAAI;CAC1C;CACA,MAAM,WAAW,MAA6B;EAC1C,MAAM,KAAK,aAAa,WAAW,IAAI;CAC3C;CACA,MAAM,aAAgC;EAClC,OAAO,KAAK,SAAS,MAAM,MAAM,KAAK,IAAI,WAAW,CAAC;CAC1D;CACA,MAAM,cAAmC;EACrC,OAAO,KAAK,aAAa,YAAY;CACzC;CACA,MAAM,aAA8B;EAChC,OAAO,KAAK,IAAI,WAAW;CAC/B;CACA,aAAa,OAAa,WAA8B,CAAC,GAAwB;EAC7E,OAAO,QAAQ,OAAO,2BAA2B,iBAAiB,CAAC;CACvE;CACA,MAAM,IAAI,OAAe,KAA6C;EAClE,OAAO,KAAK,aAAa,IAAI,OAAO,GAAG;CAC3C;CACA,MAAM,QAAQ,OAAe,MAA4D;EACrF,OAAO,KAAK,aAAa,QAAQ,OAAO,IAAI;CAChD;CACA,MAAM,IAAI,OAAe,KAAmC;EACxD,OAAO,KAAK,aAAa,IAAI,OAAO,GAAG;CAC3C;CACA,MAAM,IAAI,OAAe,KAAiB,OAAmB,SAAqC;EAC9F,MAAM,KAAK,aAAa,IAAI,OAAO,KAAK,OAAO,OAAO;CAC1D;CACA,MAAM,OAAO,OAAe,KAAmC;EAC3D,OAAO,KAAK,aAAa,OAAO,OAAO,GAAG;CAC9C;CACA,MAAM,KAAK,OAAe,OAAoC;EAC1D,OAAO,KAAK,aAAa,KAAK,OAAO,KAAK;CAC9C;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2B,CAAC,GAAsB;EACzF,OAAO,KAAK,aAAa,SAAS,OAAO,OAAO,OAAO;CAC3D;CACA,SAAS,OAAe,QAAe,CAAC,GAAG,UAA2C,CAAC,GAA4B;EAC/G,OAAO,KAAK,aAAa,SAAS,OAAO,OAAO,OAAO;CAC3D;CACA,gBAAgB,QAAmC;EAC/C,OAAO,KAAK,aAAa,gBAAgB,MAAM;CACnD;CACA,eAAe,WAAkC,CAAC,GAAwB;EACtE,OAAO,QAAQ,OAAO,2BAA2B,mBAAmB,CAAC;CACzE;CACA,eAAe,OAAkC;EAC7C,OAAO,QAAQ,OAAO,2BAA2B,mBAAmB,CAAC;CACzE;CACA,QAAuB;EACnB,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,UAAqC;EACjC,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,UAAqC;EACjC,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,MAAM,QAAQ;EACV,OAAO,KAAK,IAAI,MAAM;CAC1B;CACA,MAAM,cAAoC;EACtC,OAAO,KAAK,IAAI,YAAY;CAChC;CACA,MAAM,qBAAuC;EACzC,OAAO,KAAK,IAAI,mBAAmB;CACvC;CACA,QAAuB;EACnB,OAAO,QAAQ,OAAO,2BAA2B,UAAU,CAAC;CAChE;CACA,UAAyB;EACrB,OAAO,QAAQ,OAAO,2BAA2B,YAAY,CAAC;CAClE;CACA,aAAa,YAA2C;EACpD,OAAO,QAAQ,OAAO,2BAA2B,iBAAiB,CAAC;CACvE;CAIA,UACI,OACA,OACA,OACW;EACX,MAAM,2BAA2B,cAAc;CACnD;CAIA,MACI,OACA,OACA,OACW;EACX,MAAM,2BAA2B,UAAU;CAC/C;AACJ;AACA,SAAS,2BAA2B,QAAuB;CACvD,MAAM,wBAAQ,IAAI,MACd,GAAG,OAAO,wHACd;CACA,MAAM,OAAO;CACb,OAAO;AACX;AACA,SAAS,eAAe,MAAgC;CACpD,OAAO;EAAE,MAAM,KAAK;EAAM,QAAQ,KAAK;EAAU,MAAM,KAAK;EAAM,OAAO,KAAK;CAAM;AACxF;AACA,SAAS,oBAAoB,OAA4B;CACrD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GACtE,MAAM,IAAI,UAAU,6CAA6C;CAErE,OAAO;AACX;AACA,SAAS,yBACL,SAC2E;CAC3E,MAAM,QAAQ,uBAAwC,SAAS,qCAAqC;CACpG,MAAM,UAAU,MAAM,WAAW;CACjC,MAAM,WAAW,MAAM,YAAY;CACnC,IAAI,CAAC,OAAO,cAAc,OAAO,KAAK,WAAW,KAAK,UAAU,YAC5D,MAAM,IAAI,UAAU,qDAAqD;CAE7E,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,KAAK,WAAW,YAC9D,MAAM,IAAI,UAAU,2DAA2D;CAEnF,OAAO;EAAE;EAAS;EAAU,QAAQ,MAAM,WAAW,KAAA,IAAY,KAAA,IAAY,oBAAoB,MAAM,MAAM;CAAE;AACnH;AACA,gBAAgB,iBACZ,QACA,OACA,OACA,SACuB;CACvB,MAAM,SAAS,EAAE,GAAG,MAAM;CAC1B,KAAK,MAAM,SAAS;EAAC;EAAM;EAAO;EAAM;CAAK,GAAY;EACrD,MAAM,QAAQ,OAAO;EACrB,IAAI,iBAAiB,YAAY,OAAO,SAAS,MAAM,MAAM;CACjE;CACA,MAAM,cAAc,yBAAyB,OAAO;CACpD,IAAI;CACJ,IAAI;EACA,SAAS;GACL,MAAM,OAAO,MAAM,OAAO,SAAS,OAAO,QAAQ;IAAE,GAAG;IAAa;GAAO,CAAC;GAC5E,SAAS,KAAK;GACd,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM;GACnC,IAAI,KAAK,MAAM;EACnB;CACJ,UAAU;EACN,IAAI,WAAW,KAAA,GAAW,MAAM,OAAO,gBAAgB,MAAM;CACjE;AACJ;AACA,SAAS,sBAAsB,OAAgB,QAAkE;CAC7G,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAC9C,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,mBAAmB,KAAK,KAAK,GAC7B,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,SAAS,KACzC,MAAM,IAAI,UAAU,GAAG,OAAO,sDAAsD;CAExF,OAAO;AACX;AAGA,IAAM,aAA2B,YAAY,IAAI,UAAU,OAAO;AAClE,IAAM,2BAAyC,YAAY,IAAI,wBAAwB,OAAO;AAE9F,SAAS,uBAA0B,SAAkB,SAAiB,cAA4B,WAAc;CAC5G,IAAI,YAAY,KAAA,GACZ,OAAO,CAAC;CAEZ,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,YAAY,OAAO;CAE7B,OAAO;AACX;AAEA,SAAS,gCACL,OACA,SACA,cAA4B,WACtB;CACN,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GACrE,MAAM,YAAY,OAAO;CAE7B,OAAO;AACX;AAEA,SAAS,wCACL,OACA,SACA,aACkB;CAClB,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,gCAAgC,OAAO,SAAS,WAAW;AACxG;AAEA,SAAS,0BAA0B,SAA+B;CAC9D,OAAO,uBAAuB,SAAS,kCAAkC,uBAAuB;AACpG;AACA,SAAS,uBAAuB,OAAoC;CAChE,OAAO,wCACH,OACA,+CACA,uBACJ;AACJ;AACA,SAAS,oBAAoB,SAA8B;CACvD,IAAI,YAAY,KAAA,GACZ,OAAO;CAEX,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,IAAI,UAAU,+BAA+B;CAEvD,MAAM,MAAO,QAA8B;CAC3C,IAAI,QAAQ,KAAA,GACR,OAAO;CAEX,IAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,cAAc,GAAG,KAAK,MAAM,GAC/D,MAAM,IAAI,UAAU,yCAAyC;CAEjE,OAAO,EAAE,IAAI;AACjB;AACA,SAAS,4BACL,SACA,SACA,aACC;CACD,MAAM,EAAE,gBAAgB,uBAErB,SAAS,OAAO;CACnB,IAAI,gBAAgB,KAAA,GAChB,OAAO,CAAC;CAEZ,IACI,gBAAgB,SAChB,gBAAgB,UAChB,gBAAgB,aAChB,EAAE,eAAe,gBAAgB,WAEjC,MAAM,IAAI,UACN,cACM,oEACA,qDACV;CAEJ,OAAO,EAAE,YAAY;AACzB;AAEA,SAAS,4BAA4B,SAAsC;CACvE,OAAO,4BAA4B,SAAS,yCAAyC,IAAI;AAC7F;AAEA,SAAS,+BAA+B,SAAyC;CAC7E,OAAO,4BAA4B,SAAS,4CAA4C,KAAK;AACjG;AACA,SAAS,cAAc,OAAsB;CACzC,OAAO,gCAAgC,OAAO,0CAA0C;AAC5F;AACA,SAAS,2BAA2B,SAAqC;CACrE,MAAM,EAAE,QAAQ,UAAU,uBAGvB,SAAS,uCAAuC;CACnD,MAAM,aAAgC,CAAC;CACvC,IAAI,WAAW,KAAA,GAAW;EACtB,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,OAAO,UAA2B,OAAO,UAAU,QAAQ,GAC7F,MAAM,IAAI,UAAU,oCAAoC;EAE5D,KAAK,MAAM,SAAS,QAChB,sBAAsB,KAAK;EAE/B,WAAW,SAAS,CAAC,GAAG,MAAM;CAClC;CACA,MAAM,kBAAkB,wCAAwC,OAAO,2CAA2C;CAClH,IAAI,oBAAoB,KAAA,GACpB,WAAW,QAAQ;CAEvB,OAAO;AACX;AACA,SAAS,qBAAqB,OAAyC;CACnE,IAAI,UAAU,KAAA,GACV;CAEJ,IAAI,OAAO,UAAU,YACjB,MAAM,IAAI,wBAAwB,4BAA4B;CAElE,OAAO;AACX;AACA,SAAS,0BAA0B,OAAkD;CACjF,IAAI,UAAU,KAAA,GACV;CAEJ,OAAO,0BAA0B,KAAK;AAC1C;AACA,SAAS,sBACL,MACA,OACO;CACP,OAAO,oCAAoC,IAAI,MAAM,oCAAoC,KAAK;AAClG;AACA,eAAe,sBAAsB,OAAqD;CACtF,OAAO,0BAA0B,MAAM,MAAM,MAAM,WAAW,CAAC;AACnE;AA6BA,eAAsB,iBAClB,MACA,SACA,SACW;CACX,MAAM,SAAS,sBAAsB,MAAM,QAAQ;CACnD,MAAM,oBAAoB,0BAA0B,OAAO;CAC3D,MAAM,mBAAmB,uBAAuB,kBAAkB,OAAO;CACzE,MAAM,UAAU,qBAAqB,kBAAkB,OAAO;CAC9D,MAAM,mBAAmB,0BAA0B,kBAAkB,OAAO;CAC5E,IAAI,qBAAqB,KAAA,KAAa,YAAY,KAAA,GAC9C,MAAM,IAAI,wBAAwB,0BAA0B;CAEhE,IAAI,qBAAqB,KAAA,KAAa,qBAAqB,KAAA,GACvD,MAAM,IAAI,wBAAwB,0BAA0B;CAEhE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,iBAAiB;CACrD,MAAM,KAAK,IAAI,OAAO,KAAK;CAC3B,IAAI;EACA,MAAM,MAAM,MAAM,mBAAmB;EACrC,IAAI;GACA,IAAI,qBAAqB,KAAA,GACrB,OAAO;GAEX,MAAM,CAAC,gBAAgB,kBAAkB,MAAM,QAAQ,IAAI,CAAC,GAAG,WAAW,GAAG,sBAAsB,KAAK,CAAC,CAAC;GAC1G,IAAI,mBAAmB,gBACnB,MAAM,IAAI,aACN,wBAAwB,OAAO,qBAAqB,iBAAiB,8BAA8B,gBACvG;GAEJ,IAAI,qBAAqB,gBAAgB;IACrC,IAAI,qBAAqB,KAAA,KAAa,CAAC,sBAAsB,kBAAkB,cAAc,GACzF,MAAM,IAAI,aACN,YAAY,OAAO,gCAAgC,eAAe,sEACtE;IAEJ,OAAO;GACX;GACA,IAAI,MAAM,OAAO,GACb,MAAM,IAAI,kBACN,YAAY,OAAO,qFAAqF,eAAe,MAAM,kBACjI;GAEJ,IAAI,CAAC,SACD,MAAM,IAAI,aACN,YAAY,OAAO,mCAAmC,eAAe,MAAM,iBAAiB,mCAChG;GAEJ,MAAM,gBAAgB,oBAAoB;GAC1C,MAAM,4BAA4B;GAClC,IAAI;IACA,MAAM,GAAG,mBACL,gBACA,kBACA,SACA,yBAAyB,aAAa,CAC1C;GACJ,UAAU;IACN,MAAM,4BAA4B;GACtC;GACA,OAAO;EACX,UAAU;GACN,MAAM,MAAM,MAAM,mBAAmB;EACzC;CACJ,SAAS,OAAO;EACZ,IAAI;GACA,MAAM,GAAG,MAAM;EACnB,QAAQ,CAAC;EACT,MAAM,eAAe,KAAK;CAC9B;AACJ;;;ACpmCA,IAAa,sBAAb,MAAiC;CAC7B;CACA;CACA,6BAAsB,IAAI,IAAqD;CAC/E;CACA;CACA;CACA,eAAe;CACf,kBAAkB;CAElB,YAAY,MAAsB,cAA0B;EACxD,KAAK,UAAU,IAAI,SAAS,SAAS,WAAW;GAC5C,KAAK,eAAe;GACpB,KAAK,cAAc;EACvB,CAAC;EACD,KAAU,QAAQ,YAAY,CAAC,CAAC;EAChC,KAAK,UAAU,IAAI,SAAO,IAAI,IAAI,qBAAqB,YAAY,GAAG,GAAG,EAAE,YAAY,KAAK,CAAC;EAC7F,KAAK,QAAQ,GAAG,YAAY,SAAkB;GAC1C,KAAK,MAAM,WAAW,EAAE,KAAK,CAAC;EAClC,CAAC;EACD,KAAK,QAAQ,GAAG,sBAAsB;GAClC,KAAK,MAAM,gBAAgB,CAAC,CAAC;EACjC,CAAC;EACD,KAAK,QAAQ,GAAG,UAAU,UAAiB;GACvC,KAAK,kBAAkB;GACvB,KAAK,MAAM,SAAS;IAAE;IAAO,SAAS,MAAM;GAAQ,CAAC;EACzD,CAAC;EACD,KAAK,QAAQ,KAAK,SAAS,SAAiB;GACxC,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,iBAAiB;IAC7C,MAAM,QAAQ,oBAAoB,yBAAyB,gCAAgC,MAAM;IACjG,KAAK,MAAM,SAAS;KAAE;KAAO,SAAS,MAAM;IAAQ,CAAC;GACzD;GACA,IAAI;IACA,aAAa;IACb,KAAK,aAAa,IAAI;GAC1B,SAAS,OAAO;IACZ,KAAK,YAAY,KAAK;GAC1B;EACJ,CAAC;EACD,KAAK,QAAQ,IAAI,qBAAqB,MAAM,EACxC,gBAAgB,KAAK,IAAI,YAAe,MAAS,KAAK,WAAW,EACrE,CAAC;CACL;CAEA,YAAY,SAAkB,WAA2B,CAAC,GAAS;EAC/D,KAAK,QAAQ,YAAY,SAAS,QAA8B;CACpE;CAEA,iBAAiB,MAAc,UAAoD;EAC/E,IAAI,YAAY,KAAK,WAAW,IAAI,IAAI;EACxC,IAAI,CAAC,WAAW;GACZ,4BAAY,IAAI,IAAI;GACpB,KAAK,WAAW,IAAI,MAAM,SAAS;EACvC;EACA,UAAU,IAAI,QAAQ;CAC1B;CAEA,oBAAoB,MAAc,UAAoD;EAClF,KAAK,WAAW,IAAI,IAAI,CAAC,EAAE,OAAO,QAAQ;CAC9C;CAEA,YAA6B;EACzB,IAAI,CAAC,KAAK,cAAc;GACpB,KAAK,eAAe;GACpB,KAAU,QAAQ,UAAU,CAAC,CAAC,MAAM,KAAK,WAAW;EACxD;EACA,OAAO,KAAK;CAChB;CAEA,MAAM,MAAc,OAAsB;EACtC,KAAK,MAAM,YAAY,MAAM,KAAK,KAAK,WAAW,IAAI,IAAI,KAAK,CAAC,CAAC,GAC7D,IAAI,OAAO,aAAa,YAAY,SAAS,KAAc;OACtD,SAAS,YAAY,KAAc;CAEhD;AACJ;;;ACpFA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAEtB,IAAM,yBAAyB;AAC/B,IAAM,gBAAgB;AACtB,IAAa,2BAA2B;AAGxC,SAAS,WAAW,MAAM,SAAS,OAAO;CACtC,MAAM,QAAQ,IAAI,MAAM,SAAS,UAAU,KAAA,IAAY,KAAA,IAAY,EAAE,MAAM,CAAC;CAC5E,MAAM,OAAO;CACb,MAAM,OAAO,OAAO,QAAQ;CAC5B,OAAO;AACX;AAEA,SAAS,aAAa,OAAO;CACzB,IACI;EAAC;EAAiB;EAAqB;EAAiB;EAAqB;CAAc,CAAC,CAAC,SACzF,OAAO,IACX,GAEA,OAAO;CAEX,IAAI,OAAO,SAAS,UAAU,OAAO,WAAW,iBAAiB,MAAM,SAAS,KAAK;CACrF,OAAO,WAAW,gBAAgB,OAAO,WAAW,OAAO,KAAK,GAAG,KAAK;AAC5E;AAEA,SAAS,kBAAkB,WAAW;CAClC,IAAI,OAAO,cAAc,YAAY,UAAU,WAAW,KAAK,UAAU,SAAS,IAAI,GAClF,MAAM,IAAI,UAAU,8CAA8C;CAEtE,OAAO,QAAQ,SAAS;AAC5B;AAEA,SAAS,cAAc,OAAO;CAC1B,IAAI,OAAO,UAAU,YAAY,CAAC,cAAc,KAAK,KAAK,GAAG,MAAM,IAAI,UAAU,4BAA4B;CAC7G,OAAO;AACX;AAoBA,SAAS,UAAU,MAAM,MAAM;CAC3B,MAAM,OAAO,GAAG,UAAU,IAAI;CAC9B,IAAI,KAAK,eAAe,KAAM,KAAK,OAAO,KAAK,KAAK,UAAU,GAC1D,MAAM,WAAW,iBAAiB,mCAAmC;CAEzE,IAAK,SAAS,eAAe,CAAC,KAAK,YAAY,KAAO,SAAS,UAAU,CAAC,KAAK,OAAO,GAClF,MAAM,WAAW,qBAAqB,0BAA0B,MAAM;CAE1E,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,KAAK,OAAO,GAAG,MAAM,WAAW,iBAAiB,gCAAgC;CAC7G,OAAO;AACX;AAEA,SAAS,cAAc,MAAM;CAEzB,IAAI,QAAQ,aAAa,SAAS;CAClC,MAAM,KAAK,GAAG,SAAS,MAAM,GAAG,UAAU,YAAY,GAAG,UAAU,eAAe,EAAE;CACpF,IAAI;EACA,GAAG,UAAU,EAAE;CACnB,UAAU;EACN,GAAG,UAAU,EAAE;CACnB;AACJ;AAEA,SAAS,UAAU,WAAW,OAAO;CACjC,MAAM,gBAAgB,KAAK,WAAW,cAAc;CACpD,UAAU,eAAe,WAAW;CACpC,MAAM,aAAa,KAAK,eAAe,GAAG,cAAc,KAAK,EAAE,MAAM;CAErE,IADa,UAAU,YAAY,MAC5B,CAAC,CAAC,OAAO,wBACZ,MAAM,WAAW,qBAAqB,uCAAuC;CAEjF,MAAM,QAAQ,KAAK,MAAM,GAAG,aAAa,YAAY,MAAM,CAAC;CAC5D,IAAI,MAAM,UAAU,SAAS,CAAC,OAAO,cAAc,MAAM,GAAG,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM,eAC3F,MAAM,WAAW,qBAAqB,uCAAuC;CAEjF,OAAO;EAAE;EAAe;EAAY;CAAM;AAC9C;AAEA,SAAS,YAAY,OAAO;CAExB,GAAG,WAAW,MAAM,UAAU;CAC9B,IAAI;EACA,GAAG,UAAU,MAAM,aAAa;CACpC,SAAS,OAAO;EACZ,IAAI,CAAC;GAAC;GAAU;GAAa;EAAQ,CAAC,CAAC,SAAS,OAAO,IAAI,GAAG,MAAM;CACxE;CACA,cAAc,QAAQ,MAAM,aAAa,CAAC;AAC9C;AAEA,SAAS,kBAAkB,WAAW;CAClC,MAAM,OAAO,KAAK,WAAW,cAAc;CAC3C,IAAI;EACA,UAAU,MAAM,WAAW;EAC3B,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO;EAC9C,GAAG,UAAU,IAAI;EACjB,cAAc,SAAS;EACvB,OAAO;CACX,SAAS,OAAO;EACZ,IAAI;GAAC;GAAU;GAAa;EAAQ,CAAC,CAAC,SAAS,OAAO,IAAI,GAAG,OAAO;EACpE,MAAM;CACV;AACJ;AA+CA,SAAS,mBAAmB,WAAW,OAAO;CAC1C,MAAM,UAAU,KAAK,WAAW,GAAG,iBAAiB,QAAQ,IAAI,GAAG,OAAO;CAC1E,IAAI;EACA,UAAU,SAAS,WAAW;CAClC,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,MAAM;CACV;CACA,MAAM,UAAU,GAAG,YAAY,OAAO;CACtC,IAAI,QAAQ,WAAW,KAAK,QAAQ,OAAO,GAAG,MAAM,QAAQ;EACxD,MAAM,aAAa,KAAK,SAAS,QAAQ,EAAE;EAC3C,UAAU,YAAY,MAAM;EAC5B,GAAG,WAAW,UAAU;CAC5B,OAAO,IAAI,QAAQ,WAAW,GAC1B,MAAM,WAAW,iBAAiB,+CAA+C;CAErF,GAAG,UAAU,OAAO;CACpB,OAAO;AACX;AAsCA,SAAgB,wBAAwB,WAAW,WAAW;CAC1D,MAAM,OAAO,kBAAkB,SAAS;CACxC,cAAc,SAAS;CACvB,IAAI;CACJ,IAAI;CACJ,IAAI;EACA,YAAY,GAAG,aAAa,IAAI;EAChC,QAAQ,UAAU,WAAW,SAAS;CAC1C,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,WAAW,OAAO;EACtC,IAAI,OAAO,SAAS,UAAU;GAC1B,IAAI,CAAC,WAAW,OAAO;GACvB,MAAM,iBAAiB,mBAAmB,WAAW,SAAS;GAC9D,OAAO,kBAAkB,SAAS,KAAK;EAC3C;EACA,MAAM,aAAa,KAAK;CAC5B;CACA,IAAI,MAAM,MAAM,QAAQ,QAAQ,KAAK,OAAO;CAC5C,IAAI;EACA,YAAY,KAAK;EACjB,mBAAmB,WAAW,SAAS;EACvC,OAAO;CACX,SAAS,OAAO;EACZ,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,MAAM,aAAa,KAAK;CAC5B;AACJ;AAwTA,SAAgB,kBAAkB,WAAW,kBAAkB,MAAM;CACjE,MAAM,OAAO,kBAAkB,SAAS;CACxC,IAAI,CAAC,iBAAiB;EAClB,IAAI;GACA,UAAU,MAAM,WAAW;EAC/B,SAAS,OAAO;GACZ,IAAI,OAAO,SAAS,UAAU,MAAM,WAAW,gBAAgB,wBAAwB;GACvF,IAAI,OAAO,SAAS,uBAAuB,OAAO,SAAS,iBAAiB,MAAM;GAClF,MAAM,aAAa,KAAK;EAC5B;EACA,OAAO;CACX;CACA,GAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;CACtC,OAAO;AACX;;;ACviBA,IAAM,2BAAW,IAAI,IAA+B;AACpD,IAAM,sCAAsB,IAAI,IAA2B;AAE3D,SAAS,wBAA2B,KAAa,WAAyC;CAEtF,MAAM,UADW,oBAAoB,IAAI,GAAG,KAAK,QAAQ,QAAQ,EAAA,CACzC,KAAK,SAAS;CACtC,MAAM,UAAU,OAAO,WACb,KAAA,SACA,KAAA,CACV;CACA,oBAAoB,IAAI,KAAK,OAAO;CACpC,QAAa,WAAW;EACpB,IAAI,oBAAoB,IAAI,GAAG,MAAM,SAAS,oBAAoB,OAAO,GAAG;CAChF,CAAC;CACD,OAAO;AACX;AAEA,SAAS,aAAa,MAAe,QAAwC;CACzE,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAC5C,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,mBAAmB,KAAK,IAAI,GAC5B,MAAM,IAAI,UAAU,GAAG,OAAO,4CAA4C;CAE9E,IAAI,OAAO,WAAW,MAAM,MAAM,IAAI,KAClC,MAAM,IAAI,UAAU,GAAG,OAAO,sDAAsD;AAE5F;AAEA,SAAS,yBAAyB,SAAwD;CACtF,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GACxE,MAAM,IAAI,wBAAwB,qCAAqC;CAE3E,MAAM,YAAa,QAA8B;CACjD,IAAI,OAAO,cAAc,YAAY,UAAU,WAAW,KAAK,UAAU,SAAS,IAAI,GAClF,MAAM,IAAI,wBAAwB,+CAA+C;AAEzF;AAEA,eAAe,iBACX,MACA,SAID;CACC,IAAI;EACA,kBAAkB,QAAQ,WAAW,QAAQ,oBAAoB,KAAK;CAC1E,SAAS,OAAO;EACZ,IAAI,iBAAiB,SAAS,MAAM,SAAS,gBACzC,MAAM,IAAI,aAAa,MAAM,WAAA,8CAAmC;EAEpE,MAAM;CACV;CACA,MAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;CAC7C,MAAM,YAAY,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC;CAEjF,OAAO;EAAE;EAAW,aADA,QAAQ,aAAa,UAAU,UAAU,YAAY,IAAI;CAC7C;AACpC;AAEA,SAAS,gBAAgB,OAAgC;CACrD,IAAI,MAAM,aAAa;CACvB,MAAM,cAAc;CACpB,MAAM,OAAO;CACb,uBAAuB,KAAK;CAC5B,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,2BAA2B,GAAG,SAAS;AACnF;AAEA,SAAS,cAAc,OAA0B,QAA8B;CAC3E,IAAI,MAAM,UAAU,OAAO,MAAM;CACjC,MAAM,MAAM,QAAQ,MAAM;CAC1B,MAAM,WAAW,QAAQ,QAAQ,MAAM,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,KAAA,CAAS;CAC/E,OAAO,MAAM;AACjB;AAEA,SAAS,YAAY,QAAgB,WAAmB,aAAqB,SAAyC;CAClH,MAAM,aAAa,iBAAiB;EAAE,GAAG;EAAS,YAAY;CAAY,CAAC;CAC3E,MAAM,YAAY,WAAW;CAC7B,MAAM,cAAc,QAAQ,WAAW,QAAQ,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,KAAK;CACjF,MAAM,SAAS,IAAI,oBACf;EACI;EACA;EACA;EACA;EACA,aAAa,WAAW;EACxB,eAAe,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,SAAS,KAAK;EACzD,iBAAiB,WAAW;CAChC,SACM;EACF,wBAAwB,WAAW,SAAS;CAChD,CACJ;CACA,MAAM,QAA2B;EAC7B;EACA;EACA;EACA;EACA,OAAO,OAAO;EACd,mBAAmB,EAAE,QAAQ,CAAC,EAAE;EAChC,SAAS;EACT,MAAM;EACN,aAAa;EACb,2BAA2B;EAC3B,yCAAyB,IAAI,IAAI;EACjC,6CAA6B,IAAI,IAAI;EACrC;EACA,UAAU;EACV,eAAe,aAAa,KAAK;EACjC,eAAe,wBAAwB,mBAAmB,aAAa,KAAK,CAAC;CACjF;CACA,OAAO,MAAM,iBAAiB,UAAU;EACpC,IAAI,SAAS,IAAI,WAAW,MAAM,OAAO,SAAS,OAAO,WAAW;EACpE,gBAAgB,KAAK;EACrB,wBAA6B,mBAAmB,cAAc,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAC/F,CAAC;CACD,OAAO;AACX;AAEA,eAAe,aACX,QACA,WACA,aACA,SACsB;CACtB,MAAM,aAAa,iBAAiB;EAAE,GAAG;EAAS,YAAY;CAAY,CAAC;CAC3E,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,WAAW,SAAS,IAAI,WAAW;EACzC,IAAI,YAAY,CAAC,SAAS,aAAa;GACnC,IAAI,SAAS,2BACT,MAAM,IAAI,kBAAkB,YAAY,OAAO,gDAAgD;GAEnG,wBAAwB,QAAQ,SAAS,SAAS,UAAU;GAC5D,IAAI,WAAW,mBAAmB,MAAM,MAAM,SAAS,MAAM,aAAa,WAAW,cAAc;GACnG,SAAS,QAAQ;GACjB,OAAO;EACX;EACA,MAAM,QAAQ,YAAY,QAAQ,WAAW,aAAa,OAAO;EACjE,IAAI;GACA,MAAM,MAAM,MAAM,KAAK;IAAE;IAAQ,SAAS;GAAW,CAAC;GACtD,IAAI,MAAM,aAAa,MAAM,IAAI,oBAAoB;GACrD,SAAS,IAAI,aAAa,KAAK;GAC/B,OAAO;EACX,SAAS,OAAO;GACZ,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,yBAAyB,CAAC;GAClG,MAAM,eAAe,KAAK;EAC9B;CACJ,CAAC;AACL;AAEA,eAAe,aAAa,OAAyC;CACjE,OAAO,wBAAwB,MAAM,aAAa,YAAY;EAC1D,IAAI,MAAM,eAAe,SAAS,IAAI,MAAM,WAAW,MAAM,OAAO;GAChE,IAAI,MAAM,UAAU,MAAM,MAAM;GAChC;EACJ;EACA,MAAM,QAAQ;EACd,IAAI,MAAM,OAAO,GAAG;EACpB,SAAS,OAAO,MAAM,WAAW;EACjC,IAAI;GACA,MAAM,MAAM,MAAM,MAAM;EAC5B,UAAU;GACN,gBAAgB,KAAK;GACrB,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,0BAA0B,CAAC;EACvG;CACJ,CAAC;AACL;AAEA,eAAe,aAAa,OAAyC;CACjE,IAAI,MAAM,eAAe,SAAS,IAAI,MAAM,WAAW,MAAM,OAAO,MAAM,IAAI,oBAAoB;CAClG,SAAS,OAAO,MAAM,WAAW;CACjC,gBAAgB,KAAK;CACrB,IAAI;EACA,MAAM,MAAM,MAAM,QAAQ;CAC9B,UAAU;EACN,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,6BAA6B,CAAC;CAC1G;AACJ;AAEA,eAAsB,WAAW,MAAc,SAAuC;CAClF,aAAa,MAAM,YAAY;CAC/B,yBAAyB,OAAO;CAChC,MAAM,EAAE,WAAW,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CACvE,OAAO,iBAAiB,MAAM,UAAU,QAAQ,gBAC5C,aAAa,QAAQ,WAAW,aAAa,WAAW,CAC5D;AACJ;AAEA,eAAsB,aAAa,MAAc,SAA2C;CACxF,aAAa,MAAM,cAAc;CACjC,yBAAyB,OAAO;CAChC,MAAM,EAAE,WAAW,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CACvE,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,WAAW,SAAS,IAAI,WAAW;EACzC,IAAI,UAAU,OAAO,aAAa,QAAQ;EAC1C,MAAM,QAAQ,YAAY,MAAM,WAAW,aAAa,CAAC,CAAC;EAC1D,IAAI;GACA,MAAM,MAAM,MAAM,SAAS,IAAI;EACnC,UAAU;GACN,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,iCAAiC,CAAC;EAC9G;CACJ,CAAC;AACL;AAEA,eAAsB,2BAA2B,MAAc,SAA8C;CACzG,aAAa,MAAM,4BAA4B;CAC/C,yBAAyB,OAAO;CAChC,MAAM,EAAE,gBAAgB,MAAM,iBAAiB,MAAM,OAAO;CAC5D,OAAO,wBAAwB,aAAa,YAAY;EACpD,MAAM,QAAQ,SAAS,IAAI,WAAW;EACtC,IAAI,CAAC,OAAO,OAAO;EACnB,SAAS,OAAO,WAAW;EAC3B,gBAAgB,KAAK;EACrB,MAAM,cAAc,OAAO,oBAAoB,yBAAyB,4BAA4B,CAAC;EACrG,OAAO;CACX,CAAC;AACL"}