rivetkit 2.1.1 → 2.1.2
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.
- package/dist/browser/client.d.ts +22 -2
- package/dist/browser/client.js +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -1
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/{chunk-65RINRXE.cjs → chunk-772NPMTY.cjs} +98 -98
- package/dist/tsup/{chunk-65RINRXE.cjs.map → chunk-772NPMTY.cjs.map} +1 -1
- package/dist/tsup/{chunk-NAM3D5W5.js → chunk-BFI4LYS2.js} +5 -6
- package/dist/tsup/chunk-BFI4LYS2.js.map +1 -0
- package/dist/tsup/{chunk-OONQLPOH.js → chunk-BSIJG3LG.js} +7 -7
- package/dist/tsup/chunk-BSIJG3LG.js.map +1 -0
- package/dist/tsup/{chunk-WPDQXB7R.cjs → chunk-GVQAVU7R.cjs} +4 -4
- package/dist/tsup/{chunk-WPDQXB7R.cjs.map → chunk-GVQAVU7R.cjs.map} +1 -1
- package/dist/tsup/{chunk-AWJU3AZB.js → chunk-HB4RGGMC.js} +5 -5
- package/dist/tsup/{chunk-LNDVGTPQ.cjs → chunk-HFWRHT5T.cjs} +24 -10
- package/dist/tsup/chunk-HFWRHT5T.cjs.map +1 -0
- package/dist/tsup/{chunk-Q5CW77IT.cjs → chunk-MNS5LY6M.cjs} +81 -75
- package/dist/tsup/chunk-MNS5LY6M.cjs.map +1 -0
- package/dist/tsup/{chunk-ZR76ZGYS.cjs → chunk-NXEHFUDB.cjs} +20 -20
- package/dist/tsup/chunk-NXEHFUDB.cjs.map +1 -0
- package/dist/tsup/{chunk-XQWBEBLD.js → chunk-PSUVV4HM.js} +23 -9
- package/dist/tsup/{chunk-XQWBEBLD.js.map → chunk-PSUVV4HM.js.map} +1 -1
- package/dist/tsup/{chunk-VBU4P2IX.js → chunk-PW3YONDJ.js} +2 -2
- package/dist/tsup/{chunk-AGERRJ32.cjs → chunk-PZAV6PP2.cjs} +152 -152
- package/dist/tsup/{chunk-AGERRJ32.cjs.map → chunk-PZAV6PP2.cjs.map} +1 -1
- package/dist/tsup/{chunk-LPXB254R.cjs → chunk-QABDKI3W.cjs} +236 -237
- package/dist/tsup/chunk-QABDKI3W.cjs.map +1 -0
- package/dist/tsup/{chunk-T4PQK4WA.js → chunk-RHUII57M.js} +7 -8
- package/dist/tsup/chunk-RHUII57M.js.map +1 -0
- package/dist/tsup/{chunk-MMUXNMJF.cjs → chunk-RMJJE43B.cjs} +2 -2
- package/dist/tsup/{chunk-MMUXNMJF.cjs.map → chunk-RMJJE43B.cjs.map} +1 -1
- package/dist/tsup/{chunk-WTRB56DR.js → chunk-TDFDR7AO.js} +2 -2
- package/dist/tsup/{chunk-F5B36GL7.cjs → chunk-UZV7NXC6.cjs} +31 -32
- package/dist/tsup/chunk-UZV7NXC6.cjs.map +1 -0
- package/dist/tsup/{chunk-MICYEINX.js → chunk-VMX4I4MP.js} +10 -4
- package/dist/tsup/{chunk-MICYEINX.js.map → chunk-VMX4I4MP.js.map} +1 -1
- package/dist/tsup/{chunk-IZ4M5TJU.js → chunk-WUXR722E.js} +2 -2
- package/dist/tsup/{chunk-IZ4M5TJU.js.map → chunk-WUXR722E.js.map} +1 -1
- package/dist/tsup/{chunk-74ER4FEE.js → chunk-YQ5P6KMN.js} +4 -4
- package/dist/tsup/chunk-YQ5P6KMN.js.map +1 -0
- package/dist/tsup/{chunk-FUBHHHK5.cjs → chunk-ZHQDRRMY.cjs} +3 -3
- package/dist/tsup/{chunk-FUBHHHK5.cjs.map → chunk-ZHQDRRMY.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- package/dist/tsup/client/mod.js +5 -5
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/{config-BFqid9Gr.d.ts → config-P3XujgRr.d.ts} +23 -3
- package/dist/tsup/{config-CAZphOS1.d.cts → config-_gfywqqI.d.cts} +23 -3
- package/dist/tsup/{context-7X-Dm6_f.d.cts → context-Bxd8Cx4H.d.cts} +5 -5
- package/dist/tsup/{context-x9zKhx5T.d.ts → context-uNA4TRn3.d.ts} +5 -5
- package/dist/tsup/{driver-DYXwJR5D.d.cts → driver-BcLvZcKl.d.cts} +1 -1
- package/dist/tsup/{driver-Bxv62E2p.d.ts → driver-CPGHKXyh.d.ts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +6 -4
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +16 -4
- package/dist/tsup/driver-helpers/mod.d.ts +16 -4
- package/dist/tsup/driver-helpers/mod.js +6 -4
- package/dist/tsup/driver-test-suite/mod.cjs +64 -64
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
- package/dist/tsup/driver-test-suite/mod.js +14 -14
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +3 -3
- package/dist/tsup/inspector/mod.js +2 -2
- package/dist/tsup/mod.cjs +8 -8
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +7 -7
- package/dist/tsup/serve-test-suite/mod.cjs +126 -118
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +37 -29
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +10 -10
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +6 -6
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +5 -5
- package/dist/tsup/workflow/mod.d.cts +3 -3
- package/dist/tsup/workflow/mod.d.ts +3 -3
- package/dist/tsup/workflow/mod.js +4 -4
- package/package.json +5 -5
- package/src/actor/instance/queue.ts +67 -9
- package/src/driver-helpers/mod.ts +1 -1
- package/src/driver-helpers/utils.ts +18 -0
- package/src/driver-test-suite/tests/actor-queue.ts +4 -4
- package/src/drivers/file-system/actor.ts +6 -16
- package/src/engine-process/mod.ts +1 -1
- package/src/workflow/context.ts +5 -4
- package/dist/tsup/chunk-74ER4FEE.js.map +0 -1
- package/dist/tsup/chunk-F5B36GL7.cjs.map +0 -1
- package/dist/tsup/chunk-LNDVGTPQ.cjs.map +0 -1
- package/dist/tsup/chunk-LPXB254R.cjs.map +0 -1
- package/dist/tsup/chunk-NAM3D5W5.js.map +0 -1
- package/dist/tsup/chunk-OONQLPOH.js.map +0 -1
- package/dist/tsup/chunk-Q5CW77IT.cjs.map +0 -1
- package/dist/tsup/chunk-T4PQK4WA.js.map +0 -1
- package/dist/tsup/chunk-ZR76ZGYS.cjs.map +0 -1
- /package/dist/tsup/{chunk-AWJU3AZB.js.map → chunk-HB4RGGMC.js.map} +0 -0
- /package/dist/tsup/{chunk-VBU4P2IX.js.map → chunk-PW3YONDJ.js.map} +0 -0
- /package/dist/tsup/{chunk-WTRB56DR.js.map → chunk-TDFDR7AO.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actor/instance/mod.ts","../../src/inspector/actor-inspector.ts","../../src/actor/conn/persisted.ts","../../src/actor/schedule.ts","../../src/actor/instance/connection-manager.ts","../../src/actor/instance/event-manager.ts","../../src/actor/instance/persisted.ts","../../src/actor/instance/queue-manager.ts","../../src/actor/instance/schedule-manager.ts","../../src/actor/instance/state-manager.ts","../../src/actor/instance/traces-driver.ts","../../src/actor/definition.ts","../../src/actor/router.ts","../../src/common/inline-websocket-adapter.ts","../../src/drivers/file-system/mod.ts","../../src/drivers/file-system/actor.ts","../../src/drivers/file-system/global-state.ts","../../src/schemas/file-system-driver/versioned.ts","../schemas/file-system-driver/v1.ts","../schemas/file-system-driver/v2.ts","../schemas/file-system-driver/v3.ts","../../src/drivers/file-system/log.ts","../../src/drivers/file-system/utils.ts","../../src/drivers/file-system/sqlite-runtime.ts","../../src/drivers/file-system/kv-limits.ts","../../src/drivers/file-system/manager.ts"],"sourcesContent":["import type { OtlpExportTraceServiceRequestJson } from \"@rivetkit/traces\";\nimport {\n\tcreateNoopTraces,\n\tcreateTraces,\n\ttype SpanHandle,\n\ttype SpanStatusInput,\n\ttype Traces,\n} from \"@rivetkit/traces\";\nimport type { SqliteVfs } from \"@rivetkit/sqlite-vfs\";\nimport invariant from \"invariant\";\nimport type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport { getBaseLogger, getIncludeTarget, type Logger } from \"@/common/log\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { ActorInspector } from \"@/inspector/actor-inspector\";\nimport type { Registry } from \"@/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { EXTRA_ERROR_LOG } from \"@/utils\";\nimport { getRivetExperimentalOtel } from \"@/utils/env-vars\";\nimport {\n\ttype ActorConfig,\n\tgetRunFunction,\n} from \"../config\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport { createHttpDriver } from \"../conn/drivers/http\";\nimport {\n\tCONN_DRIVER_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnFromBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport {\n\tActionContext,\n\tActorContext,\n\tRequestContext,\n\tWebSocketContext,\n} from \"../contexts\";\n\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport { serializeActorKey } from \"../keys\";\nimport { processMessage } from \"../protocol/old\";\nimport { Schedule } from \"../schedule\";\nimport {\n\ttype EventSchemaConfig,\n\tgetEventCanSubscribe,\n\tgetQueueCanPublish,\n\ttype QueueSchemaConfig,\n} from \"../schema\";\nimport {\n\tassertUnreachable,\n\tDeadlineError,\n\tdeadline,\n\tgenerateSecureToken,\n} from \"../utils\";\nimport { ConnectionManager } from \"./connection-manager\";\nimport { EventManager } from \"./event-manager\";\nimport { KEYS } from \"./keys\";\nimport {\n\tconvertActorFromBarePersisted,\n\ttype PersistedActor,\n} from \"./persisted\";\nimport { QueueManager } from \"./queue-manager\";\nimport { ScheduleManager } from \"./schedule-manager\";\nimport { type SaveStateOptions, StateManager } from \"./state-manager\";\nimport { ActorTracesDriver } from \"./traces-driver\";\n\nexport type { SaveStateOptions };\n\nenum CanSleep {\n\tYes,\n\tNotReady,\n\tNotStarted,\n\tActiveConns,\n\tActiveDisconnectCallbacks,\n\tActiveHonoHttpRequests,\n\tActiveKeepAwake,\n\tActiveRun,\n}\n\n/** Actor type alias with all `any` types. Used for `extends` in classes referencing this actor. */\nexport type AnyActorInstance = ActorInstance<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type ExtractActorState<A extends AnyActorInstance> =\n\tA extends ActorInstance<infer State, any, any, any, any, any, any, any>\n\t\t? State\n\t\t: never;\n\nexport type ExtractActorConnParams<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, infer ConnParams, any, any, any, any, any, any>\n\t\t? ConnParams\n\t\t: never;\n\nexport type ExtractActorConnState<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, any, infer ConnState, any, any, any, any, any>\n\t\t? ConnState\n\t\t: never;\n\n// MARK: - Main ActorInstance Class\nexport class ActorInstance<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t// MARK: - Core Properties\n\tactorContext: ActorContext<S, CP, CS, V, I, DB, E, Q>;\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\tdriver!: ActorDriver;\n\t#inlineClient!: Client<Registry<any>>;\n\t#actorId!: string;\n\t#name!: string;\n\t#key!: ActorKey;\n\t#actorKeyString!: string;\n\t#region!: string;\n\n\t// MARK: - Managers\n\tconnectionManager!: ConnectionManager<S, CP, CS, V, I, DB, E, Q>;\n\n\tstateManager!: StateManager<S, CP, CS, I, E, Q>;\n\n\teventManager!: EventManager<S, CP, CS, V, I, DB, E, Q>;\n\n\t#scheduleManager!: ScheduleManager<S, CP, CS, V, I, DB, E, Q>;\n\n\tqueueManager!: QueueManager<S, CP, CS, V, I, DB, E, Q>;\n\n\t// MARK: - Logging\n\t#log!: Logger;\n\t#rLog!: Logger;\n\n\t// MARK: - Lifecycle State\n\t/**\n\t * If the core actor initiation has set up.\n\t *\n\t * Almost all actions on this actor will throw an error if false.\n\t **/\n\t#ready = false;\n\t/**\n\t * If the actor has fully started.\n\t *\n\t * The only purpose of this is to prevent sleeping until started.\n\t */\n\t#started = false;\n\t#sleepCalled = false;\n\t#destroyCalled = false;\n\t#stopCalled = false;\n\t#sleepTimeout?: NodeJS.Timeout;\n\t#abortController = new AbortController();\n\n\t// MARK: - Variables & Database\n\t#vars?: V;\n\t#db?: InferDatabaseClient<DB>;\n\t#sqliteVfs?: SqliteVfs;\n\n\t// MARK: - Background Tasks\n\t#backgroundPromises: Promise<void>[] = [];\n\t#runPromise?: Promise<void>;\n\t#runHandlerActive = false;\n\t#activeQueueWaitCount = 0;\n\n\t// MARK: - HTTP/WebSocket Tracking\n\t#activeHonoHttpRequests = 0;\n\t#activeKeepAwakeCount = 0;\n\n\t// MARK: - Deprecated (kept for compatibility)\n\t#schedule!: Schedule;\n\n\t// MARK: - Inspector\n\t#inspectorToken?: string;\n\t#inspector: ActorInspector;\n\n\t// MARK: - Tracing\n\t#traces!: Traces<OtlpExportTraceServiceRequestJson>;\n\n\t// MARK: - Constructor\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#config = config;\n\t\tthis.actorContext = new ActorContext(this);\n\t\tthis.#inspector = new ActorInspector(this);\n\t}\n\n\t// MARK: - Public Getters\n\tget log(): Logger {\n\t\tinvariant(this.#log, \"log not configured\");\n\t\treturn this.#log;\n\t}\n\n\tget rLog(): Logger {\n\t\tinvariant(this.#rLog, \"log not configured\");\n\t\treturn this.#rLog;\n\t}\n\n\tget isStopping(): boolean {\n\t\treturn this.#stopCalled;\n\t}\n\n\tget id(): string {\n\t\treturn this.#actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#name;\n\t}\n\n\tget key(): ActorKey {\n\t\treturn this.#key;\n\t}\n\n\tget region(): string {\n\t\treturn this.#region;\n\t}\n\n\tget inlineClient(): Client<Registry<any>> {\n\t\treturn this.#inlineClient;\n\t}\n\n\tget inspector(): ActorInspector {\n\t\treturn this.#inspector;\n\t}\n\n\tget traces(): Traces<OtlpExportTraceServiceRequestJson> {\n\t\treturn this.#traces;\n\t}\n\n\tget inspectorToken(): string | undefined {\n\t\treturn this.#inspectorToken;\n\t}\n\n\t// MARK: - Tracing\n\tgetCurrentTraceSpan(): SpanHandle | null {\n\t\treturn this.#traces.getCurrentSpan();\n\t}\n\n\tstartTraceSpan(\n\t\tname: string,\n\t\tattributes?: Record<string, unknown>,\n\t): SpanHandle {\n\t\treturn this.#traces.startSpan(name, {\n\t\t\tparent: this.#traces.getCurrentSpan() ?? undefined,\n\t\t\tattributes: this.#traceAttributes(attributes),\n\t\t});\n\t}\n\n\tendTraceSpan(handle: SpanHandle, status?: SpanStatusInput): void {\n\t\tthis.#traces.endSpan(handle, status ? { status } : undefined);\n\t}\n\n\tasync runInTraceSpan<T>(\n\t\tname: string,\n\t\tattributes: Record<string, unknown> | undefined,\n\t\tfn: () => T | Promise<T>,\n\t): Promise<T> {\n\t\tconst span = this.startTraceSpan(name, attributes);\n\t\ttry {\n\t\t\tconst result = this.#traces.withSpan(span, fn);\n\t\t\tconst resolved = result instanceof Promise ? await result : result;\n\t\t\tthis.#traces.endSpan(span, {\n\t\t\t\tstatus: { code: \"OK\" },\n\t\t\t});\n\t\t\treturn resolved;\n\t\t} catch (error) {\n\t\t\tthis.#traces.endSpan(span, {\n\t\t\t\tstatus: {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\temitTraceEvent(\n\t\tname: string,\n\t\tattributes?: Record<string, unknown>,\n\t\thandle?: SpanHandle,\n\t): void {\n\t\tconst span = handle ?? this.#traces.getCurrentSpan();\n\t\tif (!span) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#traces.emitEvent(span, name, {\n\t\t\tattributes: this.#traceAttributes(attributes),\n\t\t\ttimeUnixMs: Date.now(),\n\t\t});\n\t}\n\n\tget conns(): Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\treturn this.connectionManager.connections;\n\t}\n\n\tget schedule(): Schedule {\n\t\treturn this.#schedule;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#abortController.signal;\n\t}\n\n\tget actions(): string[] {\n\t\treturn Object.keys(this.#config.actions ?? {});\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#config;\n\t}\n\n\t// MARK: - State Access\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.stateManager.persist;\n\t}\n\n\tget state(): S {\n\t\treturn this.stateManager.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.stateManager.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.stateManager.stateEnabled;\n\t}\n\n\tget connStateEnabled(): boolean {\n\t\treturn \"createConnState\" in this.#config || \"connState\" in this.#config;\n\t}\n\n\t// MARK: - Variables & Database\n\tget vars(): V {\n\t\tthis.#validateVarsEnabled();\n\t\tinvariant(this.#vars !== undefined, \"vars not enabled\");\n\t\treturn this.#vars;\n\t}\n\n\tget db(): InferDatabaseClient<DB> {\n\t\tif (!this.#db) {\n\t\t\tthrow new errors.DatabaseNotEnabled();\n\t\t}\n\t\treturn this.#db;\n\t}\n\n\t// MARK: - Initialization\n\tasync start(\n\t\tactorDriver: ActorDriver,\n\t\tinlineClient: Client<Registry<any>>,\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tregion: string,\n\t) {\n\t\t// Initialize properties\n\t\tthis.driver = actorDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#actorId = actorId;\n\t\tthis.#name = name;\n\t\tthis.#key = key;\n\t\tthis.#actorKeyString = serializeActorKey(this.#key);\n\t\tthis.#region = region;\n\n\t\t// Initialize tracing\n\t\tthis.#initializeTraces();\n\n\t\t// Initialize logging\n\t\tthis.#initializeLogging();\n\n\t\t// Initialize managers\n\t\tthis.connectionManager = new ConnectionManager(this);\n\t\tthis.stateManager = new StateManager(this, actorDriver, this.#config);\n\t\tthis.eventManager = new EventManager(this);\n\t\tthis.queueManager = new QueueManager(this, actorDriver);\n\t\tthis.#scheduleManager = new ScheduleManager(\n\t\t\tthis,\n\t\t\tactorDriver,\n\t\t\tthis.#config,\n\t\t);\n\n\t\t// Legacy schedule object (for compatibility)\n\t\tthis.#schedule = new Schedule(this);\n\n\t\t// Load state\n\t\tawait this.#loadState();\n\n\t\tawait this.queueManager.initialize();\n\n\t\t// Generate or load inspector token\n\t\tawait this.#initializeInspectorToken();\n\n\t\t// Initialize variables\n\t\tif (this.#varsEnabled) {\n\t\t\tawait this.#initializeVars();\n\t\t}\n\n\t\t// Call onStart lifecycle\n\t\tawait this.#callOnStart();\n\n\t\t// Setup database\n\t\tawait this.#setupDatabase();\n\n\t\t// Initialize alarms\n\t\tawait this.#scheduleManager.initializeAlarms();\n\n\t\t// Mark as ready\n\t\tthis.#ready = true;\n\n\t\t// Finish up any remaining initiation\n\t\t//\n\t\t// Do this after #ready = true since this can call any actor callbacks\n\t\t// (which require #assertReady)\n\t\tawait this.driver.onBeforeActorStart?.(this);\n\n\t\t// Mark as started\n\t\t//\n\t\t// We do this after onBeforeActorStart to prevent the actor from going\n\t\t// to sleep before finishing setup\n\t\tthis.#started = true;\n\t\tthis.#rLog.info({ msg: \"actor started\" });\n\n\t\t// Start sleep timer after setting #started since this affects the\n\t\t// timer\n\t\tthis.resetSleepTimer();\n\n\t\t// Start run handler in background (does not block startup)\n\t\tthis.#startRunHandler();\n\n\t\t// Trigger any pending alarms\n\t\tawait this.onAlarm();\n\t}\n\n\t// MARK: - Ready Check\n\tisReady(): boolean {\n\t\treturn this.#ready;\n\t}\n\n\tassertReady(allowStoppingState: boolean = false) {\n\t\tif (!this.#ready) throw new errors.InternalError(\"Actor not ready\");\n\t\tif (!allowStoppingState && this.#stopCalled)\n\t\t\tthrow new errors.InternalError(\"Actor is stopping\");\n\t}\n\n\tasync cleanupPersistedConnections(reason?: string): Promise<number> {\n\t\tthis.assertReady(true);\n\t\treturn await this.connectionManager.cleanupPersistedHibernatableConnections(\n\t\t\treason,\n\t\t);\n\t}\n\n\t// MARK: - Stop\n\tasync onStop(mode: \"sleep\" | \"destroy\") {\n\t\tif (this.#stopCalled) {\n\t\t\tthis.#rLog.warn({ msg: \"already stopping actor\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#stopCalled = true;\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"setting stopCalled=true\",\n\t\t\tmode,\n\t\t});\n\n\t\ttry {\n\t\t\t// Clear sleep timeout\n\t\t\tif (this.#sleepTimeout) {\n\t\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\t\tthis.#sleepTimeout = undefined;\n\t\t\t}\n\n\t\t\t// Abort listeners\n\t\t\ttry {\n\t\t\t\tthis.#abortController.abort();\n\t\t\t} catch { }\n\n\t\t\t// Wait for run handler to complete\n\t\t\tawait this.#waitForRunHandler(this.#config.options.runStopTimeout);\n\n\t\t\t// Call onStop lifecycle\n\t\t\tif (mode === \"sleep\") {\n\t\t\t\tawait this.#callOnSleep();\n\t\t\t} else if (mode === \"destroy\") {\n\t\t\t\tawait this.#callOnDestroy();\n\t\t\t} else {\n\t\t\t\tassertUnreachable(mode);\n\t\t\t}\n\n\t\t\t// Disconnect non-hibernatable connections\n\t\t\tawait this.#disconnectConnections();\n\n\t\t\t// Wait for background tasks\n\t\t\tawait this.#waitBackgroundPromises(\n\t\t\t\tthis.#config.options.waitUntilTimeout,\n\t\t\t);\n\n\t\t\t// Clear timeouts and save state\n\t\t\tthis.#rLog.info({ msg: \"clearing pending save timeouts\" });\n\t\t\tthis.stateManager.clearPendingSaveTimeout();\n\t\t\tthis.#rLog.info({ msg: \"saving state immediately\" });\n\t\t\tawait this.stateManager.saveState({\n\t\t\t\timmediate: true,\n\t\t\t\tallowStoppingState: true,\n\t\t\t});\n\n\t\t\t// Wait for write queues\n\t\t\tawait this.stateManager.waitForPendingWrites();\n\t\t\tawait this.#scheduleManager.waitForPendingAlarmWrites();\n\t\t} finally {\n\t\t\tawait this.#cleanupDatabase();\n\t\t}\n\t}\n\n\t// MARK: - Sleep\n\tstartSleep() {\n\t\tif (this.#stopCalled || this.#destroyCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startSleep if actor already stopping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#sleepCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startSleep twice, actor already sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#sleepCalled = true;\n\n\t\tconst sleep = this.driver.startSleep?.bind(this.driver, this.#actorId);\n\t\tinvariant(this.#sleepingSupported, \"sleeping not supported\");\n\t\tinvariant(sleep, \"no sleep on driver\");\n\n\t\tthis.#rLog.info({ msg: \"actor sleeping\" });\n\n\t\t// Start sleep on next tick so call site of startSleep can exit\n\t\tsetImmediate(() => {\n\t\t\tsleep();\n\t\t});\n\t}\n\n\t// MARK: - Destroy\n\tstartDestroy() {\n\t\tif (this.#stopCalled || this.#sleepCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startDestroy if actor already stopping or sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#destroyCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startDestroy twice, actor already destroying\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#destroyCalled = true;\n\n\t\tconst destroy = this.driver.startDestroy.bind(\n\t\t\tthis.driver,\n\t\t\tthis.#actorId,\n\t\t);\n\n\t\tthis.#rLog.info({ msg: \"actor destroying\" });\n\n\t\t// Start destroy on next tick so call site of startDestroy can exit\n\t\tsetImmediate(() => {\n\t\t\tdestroy();\n\t\t});\n\t}\n\n\t// MARK: - HTTP Request Tracking\n\tbeginHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests++;\n\t\tthis.resetSleepTimer();\n\t}\n\n\tendHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests--;\n\t\tif (this.#activeHonoHttpRequests < 0) {\n\t\t\tthis.#activeHonoHttpRequests = 0;\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"active hono requests went below 0, this is a RivetKit bug\",\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t});\n\t\t}\n\t\tthis.resetSleepTimer();\n\t}\n\n\t// MARK: - Message Processing\n\tasync processMessage(\n\t\tmessage: {\n\t\t\tbody:\n\t\t\t| {\n\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t}\n\t\t\t| {\n\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t};\n\t\t},\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) {\n\t\tawait processMessage(message, this, conn, {\n\t\t\tonExecuteAction: async (ctx, name, args) => {\n\t\t\t\treturn await this.executeAction(ctx, name, args);\n\t\t\t},\n\t\t\tonSubscribe: async (eventName, conn) => {\n\t\t\t\tthis.eventManager.addSubscription(eventName, conn, false);\n\t\t\t},\n\t\t\tonUnsubscribe: async (eventName, conn) => {\n\t\t\t\tthis.eventManager.removeSubscription(eventName, conn, false);\n\t\t\t},\n\t\t});\n\t}\n\n\tasync assertCanSubscribe(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\teventName: string,\n\t): Promise<void> {\n\t\tconst canSubscribe = getEventCanSubscribe(this.#config.events, eventName);\n\t\tif (!canSubscribe) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = await canSubscribe(ctx);\n\t\tif (typeof result !== \"boolean\") {\n\t\t\tthrow new errors.InvalidCanSubscribeResponse();\n\t\t}\n\t\tif (!result) {\n\t\t\tthrow new errors.Forbidden();\n\t\t}\n\t}\n\n\tasync assertCanPublish(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tqueueName: string,\n\t): Promise<void> {\n\t\tconst canPublish = getQueueCanPublish<\n\t\t\tActionContext<S, CP, CS, V, I, DB, E, Q>\n\t\t>(this.#config.queues, queueName);\n\t\tif (!canPublish) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = await canPublish(ctx);\n\t\tif (typeof result !== \"boolean\") {\n\t\t\tthrow new errors.InvalidCanPublishResponse();\n\t\t}\n\t\tif (!result) {\n\t\t\tthrow new errors.Forbidden();\n\t\t}\n\t}\n\n\t// MARK: - Action Execution\n\tasync executeAction(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tactionName: string,\n\t\targs: unknown[],\n\t): Promise<unknown> {\n\t\tthis.assertReady();\n\n\t\tconst actions = this.#config.actions ?? {};\n\t\tif (!(actionName in actions)) {\n\t\t\tthis.#rLog.warn({ msg: \"action does not exist\", actionName });\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\tconst actionFunction = actions[actionName];\n\t\tif (typeof actionFunction !== \"function\") {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"action is not a function\",\n\t\t\t\tactionName,\n\t\t\t\ttype: typeof actionFunction,\n\t\t\t});\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\tthis.#activeKeepAwakeCount++;\n\t\tthis.resetSleepTimer();\n\t\tconst actionSpan = this.startTraceSpan(`actor.action.${actionName}`, {\n\t\t\t\"rivet.action.name\": actionName,\n\t\t});\n\t\tlet spanEnded = false;\n\n\t\ttry {\n\t\t\treturn await this.#traces.withSpan(actionSpan, async () => {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"executing action\",\n\t\t\t\t\tactionName,\n\t\t\t\t\targs,\n\t\t\t\t});\n\n\t\t\t\tconst outputOrPromise = actionFunction.call(\n\t\t\t\t\tundefined,\n\t\t\t\t\tctx,\n\t\t\t\t\t...args,\n\t\t\t\t);\n\n\t\t\t\tlet output: unknown;\n\t\t\t\tconst maybeThenable = outputOrPromise as {\n\t\t\t\t\tthen?: (\n\t\t\t\t\t\tonfulfilled?: unknown,\n\t\t\t\t\t\tonrejected?: unknown,\n\t\t\t\t\t) => unknown;\n\t\t\t\t};\n\t\t\t\tif (maybeThenable && typeof maybeThenable.then === \"function\") {\n\t\t\t\t\toutput = await deadline(\n\t\t\t\t\t\tPromise.resolve(outputOrPromise),\n\t\t\t\t\t\tthis.#config.options.actionTimeout,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\toutput = outputOrPromise;\n\t\t\t\t}\n\n\t\t\t\t// Process through onBeforeActionResponse if configured\n\t\t\t\tif (this.#config.onBeforeActionResponse) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\toutput = await this.runInTraceSpan(\n\t\t\t\t\t\t\t\"actor.onBeforeActionResponse\",\n\t\t\t\t\t\t\t{ \"rivet.action.name\": actionName },\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\tthis.#config.onBeforeActionResponse!(\n\t\t\t\t\t\t\t\t\tthis.actorContext,\n\t\t\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\t\tmsg: \"error in `onBeforeActionResponse`\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst isTimeout = error instanceof DeadlineError;\n\t\t\tconst message = isTimeout\n\t\t\t\t? \"ActionTimedOut\"\n\t\t\t\t: stringifyError(error);\n\t\t\tthis.#traces.setAttributes(actionSpan, {\n\t\t\t\t\"error.message\": message,\n\t\t\t\t\"error.type\":\n\t\t\t\t\terror instanceof Error ? error.name : typeof error,\n\t\t\t});\n\t\t\tthis.#traces.endSpan(actionSpan, {\n\t\t\t\tstatus: { code: \"ERROR\", message },\n\t\t\t});\n\t\t\tspanEnded = true;\n\t\t\tif (isTimeout) {\n\t\t\t\tthrow new errors.ActionTimedOut();\n\t\t\t}\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"action error\",\n\t\t\t\tactionName,\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (!spanEnded && actionSpan.isActive()) {\n\t\t\t\tthis.#traces.endSpan(actionSpan, {\n\t\t\t\t\tstatus: { code: \"OK\" },\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#activeKeepAwakeCount--;\n\t\t\tif (this.#activeKeepAwakeCount < 0) {\n\t\t\t\tthis.#activeKeepAwakeCount = 0;\n\t\t\t\tthis.#rLog.warn({\n\t\t\t\t\tmsg: \"active keep awake count went below 0, this is a RivetKit bug\",\n\t\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.resetSleepTimer();\n\t\t\tthis.stateManager.savePersistThrottled();\n\t\t}\n\t}\n\n\t// MARK: - HTTP/WebSocket Handlers\n\tasync handleRawRequest(\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\trequest: Request,\n\t): Promise<Response> {\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onRequest) {\n\t\t\tthrow new errors.RequestHandlerNotDefined();\n\t\t}\n\t\tconst onRequest = this.#config.onRequest;\n\n\t\t\treturn await this.runInTraceSpan(\n\t\t\t\t\"actor.onRequest\",\n\t\t\t\t{\n\t\t\t\t\t\"http.method\": request.method,\n\t\t\t\t\t\"http.url\": request.url,\n\t\t\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tconst ctx = new RequestContext(this, conn, request);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst response = await onRequest(ctx, request);\n\t\t\t\t\t\tif (!response) {\n\t\t\t\t\t\t\tthrow new errors.InvalidRequestHandlerResponse();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\t\tmsg: \"onRequest error\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\thandleRawWebSocket(\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\twebsocket: UniversalWebSocket,\n\t\trequest?: Request,\n\t) {\n\t\t// NOTE: All code before `onWebSocket` must be synchronous in order to ensure the order of `open` events happen in the correct order.\n\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onWebSocket) {\n\t\t\tthrow new errors.InternalError(\"onWebSocket handler not defined\");\n\t\t}\n\n\t\tconst span = this.startTraceSpan(\"actor.onWebSocket\", {\n\t\t\t\"http.url\": request?.url,\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t});\n\t\tlet spanEnded = false;\n\n\t\ttry {\n\t\t\t// Reset sleep timer when handling WebSocket\n\t\t\tthis.resetSleepTimer();\n\n\t\t\t// Handle WebSocket\n\t\t\tconst ctx = new WebSocketContext(this, conn, request);\n\n\t\t\t// NOTE: This is async and will run in the background\n\t\t\tconst voidOrPromise = this.#traces.withSpan(span, () =>\n\t\t\t\tthis.#config.onWebSocket!(ctx, websocket),\n\t\t\t);\n\n\t\t\t// Save changes from the WebSocket open\n\t\t\tif (voidOrPromise instanceof Promise) {\n\t\t\t\tvoidOrPromise\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tif (!spanEnded) {\n\t\t\t\t\t\t\tthis.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\t\t\tspanEnded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (!spanEnded) {\n\t\t\t\t\t\t\tthis.endTraceSpan(span, {\n\t\t\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tspanEnded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\t\tmsg: \"onWebSocket error\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (!spanEnded) {\n\t\t\t\t\tthis.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\tspanEnded = true;\n\t\t\t\t}\n\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!spanEnded) {\n\t\t\t\tthis.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tspanEnded = true;\n\t\t\t}\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"onWebSocket error\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// MARK: - Scheduling\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tawait this.#scheduleManager.scheduleEvent(timestamp, action, args);\n\t}\n\n\tasync onAlarm() {\n\t\tthis.resetSleepTimer();\n\t\tawait this.#scheduleManager.onAlarm();\n\t}\n\n\t// MARK: - Background Tasks\n\twaitUntil(promise: Promise<void>) {\n\t\tthis.assertReady();\n\n\t\tconst nonfailablePromise = promise\n\t\t\t.then(() => {\n\t\t\t\tthis.#rLog.debug({ msg: \"wait until promise complete\" });\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"wait until promise failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\tthis.#backgroundPromises.push(nonfailablePromise);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping while the given promise is running.\n\t *\n\t * Use this when performing async operations in the `run` handler or other\n\t * background contexts where you need to ensure the actor stays awake.\n\t *\n\t * Returns the resolved value and resets the sleep timer on completion.\n\t * Errors are propagated to the caller.\n\t */\n\tasync keepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.assertReady();\n\n\t\tthis.#activeKeepAwakeCount++;\n\t\tthis.resetSleepTimer();\n\n\t\ttry {\n\t\t\treturn await promise;\n\t\t} finally {\n\t\t\tthis.#activeKeepAwakeCount--;\n\t\t\tif (this.#activeKeepAwakeCount < 0) {\n\t\t\t\tthis.#activeKeepAwakeCount = 0;\n\t\t\t\tthis.#rLog.warn({\n\t\t\t\t\tmsg: \"active keep awake count went below 0, this is a RivetKit bug\",\n\t\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.resetSleepTimer();\n\t\t}\n\t}\n\n\tbeginQueueWait() {\n\t\tthis.assertReady(true);\n\t\tthis.#activeQueueWaitCount++;\n\t\tthis.resetSleepTimer();\n\t}\n\n\tendQueueWait() {\n\t\tthis.#activeQueueWaitCount--;\n\t\tif (this.#activeQueueWaitCount < 0) {\n\t\t\tthis.#activeQueueWaitCount = 0;\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"active queue wait count went below 0, this is a RivetKit bug\",\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t});\n\t\t}\n\t\tthis.resetSleepTimer();\n\t}\n\n\t// MARK: - Private Helper Methods\n\t#initializeTraces() {\n\t\tif (getRivetExperimentalOtel()) {\n\t\t\t// Experimental mode persists trace data to actor storage so inspector\n\t\t\t// queries can return OTel payloads.\n\t\t\tthis.#traces = createTraces({\n\t\t\t\tdriver: new ActorTracesDriver(this.driver, this.#actorId),\n\t\t\t});\n\t\t} else {\n\t\t\t// Keep the tracing API calls active while disabling trace persistence\n\t\t\t// until the experimental flag is enabled.\n\t\t\tthis.#traces = createNoopTraces();\n\t\t}\n\t}\n\n\t#traceAttributes(\n\t\tattributes?: Record<string, unknown>,\n\t): Record<string, unknown> {\n\t\treturn {\n\t\t\t\"rivet.actor.id\": this.#actorId,\n\t\t\t\"rivet.actor.name\": this.#name,\n\t\t\t\"rivet.actor.key\": this.#actorKeyString,\n\t\t\t\"rivet.actor.region\": this.#region,\n\t\t\t...(attributes ?? {}),\n\t\t};\n\t}\n\n\t#patchLoggerForTraces(logger: Logger) {\n\t\tconst levels: Array<\n\t\t\t\"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\"\n\t\t> = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"];\n\t\tfor (const level of levels) {\n\t\t\tconst original = logger[level].bind(logger) as (\n\t\t\t\t...args: any[]\n\t\t\t) => unknown;\n\t\t\tlogger[level] = ((...args: unknown[]) => {\n\t\t\t\tthis.#emitLogEvent(level, args);\n\t\t\t\treturn original(...(args as any[]));\n\t\t\t}) as Logger[typeof level];\n\t\t}\n\t}\n\n\t#emitLogEvent(level: string, args: unknown[]) {\n\t\tconst span = this.#traces.getCurrentSpan();\n\t\tif (!span || !span.isActive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string | undefined;\n\t\tif (args.length >= 2) {\n\t\t\tmessage = String(args[1]);\n\t\t} else if (args.length === 1) {\n\t\t\tconst [value] = args;\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tmessage = value;\n\t\t\t} else if (\n\t\t\t\ttypeof value === \"number\" ||\n\t\t\t\ttypeof value === \"boolean\"\n\t\t\t) {\n\t\t\t\tmessage = String(value);\n\t\t\t} else if (value && typeof value === \"object\") {\n\t\t\t\tconst maybeMsg = (value as { msg?: unknown }).msg;\n\t\t\t\tif (maybeMsg !== undefined) {\n\t\t\t\t\tmessage = String(maybeMsg);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#traces.emitEvent(span, \"log\", {\n\t\t\tattributes: this.#traceAttributes({\n\t\t\t\t\"log.level\": level,\n\t\t\t\t...(message ? { \"log.message\": message } : {}),\n\t\t\t}),\n\t\t\ttimeUnixMs: Date.now(),\n\t\t});\n\t}\n\n\t#initializeLogging() {\n\t\tconst logParams = {\n\t\t\tactor: this.#name,\n\t\t\tkey: this.#actorKeyString,\n\t\t\tactorId: this.#actorId,\n\t\t};\n\n\t\tconst extraLogParams = this.driver.getExtraActorLogParams?.();\n\t\tif (extraLogParams) Object.assign(logParams, extraLogParams);\n\n\t\tthis.#log = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\t\tthis.#rLog = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor-runtime\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\n\t\tthis.#patchLoggerForTraces(this.#log);\n\t\tthis.#patchLoggerForTraces(this.#rLog);\n\t}\n\n\tasync #loadState() {\n\t\t// Read initial state from KV\n\t\tconst [persistDataBuffer] = await this.driver.kvBatchGet(\n\t\t\tthis.#actorId,\n\t\t\t[KEYS.PERSIST_DATA],\n\t\t);\n\t\tinvariant(\n\t\t\tpersistDataBuffer !== null,\n\t\t\t\"persist data has not been set, it should be set when initialized\",\n\t\t);\n\n\t\tconst bareData =\n\t\t\tACTOR_VERSIONED.deserializeWithEmbeddedVersion(persistDataBuffer);\n\t\tconst persistData = convertActorFromBarePersisted<S, I>(bareData);\n\n\t\tif (persistData.hasInitialized) {\n\t\t\t// Restore existing actor\n\t\t\tawait this.#restoreExistingActor(persistData);\n\t\t} else {\n\t\t\t// Create new actor\n\t\t\tawait this.#createNewActor(persistData);\n\t\t}\n\n\t\t// Pass persist reference to schedule manager\n\t\tthis.#scheduleManager.setPersist(this.stateManager.persist);\n\t}\n\n\tasync #createNewActor(persistData: PersistedActor<S, I>) {\n\t\tthis.#rLog.info({ msg: \"actor creating\" });\n\n\t\t// Initialize state\n\t\tawait this.stateManager.initializeState(persistData);\n\n\t\t// Call onCreate lifecycle\n\t\tif (this.#config.onCreate) {\n\t\t\tconst onCreate = this.#config.onCreate;\n\t\t\tawait this.runInTraceSpan(\"actor.onCreate\", undefined, () =>\n\t\t\t\tonCreate(this.actorContext as any, persistData.input!),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #restoreExistingActor(persistData: PersistedActor<S, I>) {\n\t\t// List all connection keys\n\t\tconst connEntries = await this.driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tKEYS.CONN_PREFIX,\n\t\t);\n\n\t\t// Decode connections\n\t\tconst connections: PersistedConn<CP, CS>[] = [];\n\t\tfor (const [_key, value] of connEntries) {\n\t\t\ttry {\n\t\t\t\tconst bareData = CONN_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(value),\n\t\t\t\t);\n\t\t\t\tconst conn = convertConnFromBarePersistedConn<CP, CS>(bareData);\n\t\t\t\tconnections.push(conn);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"failed to decode connection\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"actor restoring\",\n\t\t\tconnections: connections.length,\n\t\t});\n\n\t\t// Initialize state\n\t\tthis.stateManager.initPersistProxy(persistData);\n\n\t\t// Restore connections\n\t\tthis.connectionManager.restoreConnections(connections);\n\t}\n\n\tasync #initializeInspectorToken() {\n\t\t// Try to load existing token\n\t\tconst [tokenBuffer] = await this.driver.kvBatchGet(this.#actorId, [\n\t\t\tKEYS.INSPECTOR_TOKEN,\n\t\t]);\n\n\t\tif (tokenBuffer !== null) {\n\t\t\t// Token exists, decode it\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tthis.#inspectorToken = decoder.decode(tokenBuffer);\n\t\t\tthis.#rLog.debug({ msg: \"loaded existing inspector token\" });\n\t\t} else {\n\t\t\t// Generate new token\n\t\t\tthis.#inspectorToken = generateSecureToken();\n\t\t\tconst tokenBytes = new TextEncoder().encode(this.#inspectorToken);\n\t\t\tawait this.driver.kvBatchPut(this.#actorId, [\n\t\t\t\t[KEYS.INSPECTOR_TOKEN, tokenBytes],\n\t\t\t]);\n\t\t\tthis.#rLog.debug({ msg: \"generated new inspector token\" });\n\t\t}\n\t}\n\n\tasync #initializeVars() {\n\t\tlet vars: V | undefined;\n\t\tif (\"createVars\" in this.#config) {\n\t\t\tconst createVars = this.#config.createVars;\n\t\t\tvars = await this.runInTraceSpan(\n\t\t\t\t\"actor.createVars\",\n\t\t\t\tundefined,\n\t\t\t\t() => {\n\t\t\t\t\tconst dataOrPromise = createVars!(\n\t\t\t\t\t\tthis.actorContext as any,\n\t\t\t\t\t\tthis.driver.getContext(this.#actorId),\n\t\t\t\t\t);\n\t\t\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\t\t\treturn deadline(\n\t\t\t\t\t\t\tdataOrPromise,\n\t\t\t\t\t\t\tthis.#config.options.createVarsTimeout,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn dataOrPromise;\n\t\t\t\t},\n\t\t\t);\n\t\t} else if (\"vars\" in this.#config) {\n\t\t\tvars = structuredClone(this.#config.vars);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not create variables from 'createVars' or 'vars'\",\n\t\t\t);\n\t\t}\n\t\tthis.#vars = vars;\n\t}\n\n\tasync #callOnStart() {\n\t\tthis.#rLog.info({ msg: \"actor starting\" });\n\t\tif (this.#config.onWake) {\n\t\t\tconst onWake = this.#config.onWake;\n\t\t\tawait this.runInTraceSpan(\"actor.onWake\", undefined, () =>\n\t\t\t\tonWake(this.actorContext),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #callOnSleep() {\n\t\tif (this.#config.onSleep) {\n\t\t\tconst onSleep = this.#config.onSleep;\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onSleep\" });\n\t\t\t\tawait this.runInTraceSpan(\n\t\t\t\t\t\"actor.onSleep\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst result = onSleep(this.actorContext);\n\t\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\t\tawait deadline(\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t\tthis.#config.options.onSleepTimeout,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.#rLog.debug({ msg: \"onSleep completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onSleep timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onSleep\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #callOnDestroy() {\n\t\tif (this.#config.onDestroy) {\n\t\t\tconst onDestroy = this.#config.onDestroy;\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onDestroy\" });\n\t\t\t\tawait this.runInTraceSpan(\n\t\t\t\t\t\"actor.onDestroy\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst result = onDestroy(this.actorContext);\n\t\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\t\tawait deadline(\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t\tthis.#config.options.onDestroyTimeout,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.#rLog.debug({ msg: \"onDestroy completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onDestroy timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onDestroy\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#startRunHandler() {\n\t\tconst runFn = getRunFunction(this.#config.run);\n\t\tif (!runFn) return;\n\n\t\tthis.#rLog.debug({ msg: \"starting run handler\" });\n\t\tthis.#runHandlerActive = true;\n\t\tthis.resetSleepTimer();\n\n\t\tconst runSpan = this.startTraceSpan(\"actor.run\");\n\t\tconst runResult = this.#traces.withSpan(runSpan, () =>\n\t\t\trunFn(this.actorContext),\n\t\t);\n\n\t\tif (runResult instanceof Promise) {\n\t\t\tthis.#runPromise = runResult\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (this.#stopCalled) {\n\t\t\t\t\t\tif (runSpan.isActive()) {\n\t\t\t\t\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\t\t\tmsg: \"run handler exited during actor stop\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Run handler exited normally - this should crash the actor\n\t\t\t\t\tthis.emitTraceEvent(\n\t\t\t\t\t\t\"actor.crash\",\n\t\t\t\t\t\t{ \"rivet.actor.reason\": \"run_exited\" },\n\t\t\t\t\t\trunSpan,\n\t\t\t\t\t);\n\t\t\t\t\tthis.endTraceSpan(runSpan, {\n\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\tmessage: \"run exited unexpectedly\",\n\t\t\t\t\t});\n\t\t\t\t\tthis.#rLog.warn({\n\t\t\t\t\t\tmsg: \"run handler exited unexpectedly, crashing actor to reschedule\",\n\t\t\t\t\t});\n\t\t\t\t\tthis.startDestroy();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (this.#stopCalled) {\n\t\t\t\t\t\tif (runSpan.isActive()) {\n\t\t\t\t\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\t\t\tmsg: \"run handler threw during actor stop\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Run handler threw an error - crash the actor\n\t\t\t\t\tthis.emitTraceEvent(\n\t\t\t\t\t\t\"actor.crash\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"rivet.actor.reason\": \"run_error\",\n\t\t\t\t\t\t\t\"error.message\": stringifyError(error),\n\t\t\t\t\t\t},\n\t\t\t\t\t\trunSpan,\n\t\t\t\t\t);\n\t\t\t\t\tthis.endTraceSpan(runSpan, {\n\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"run handler threw error, crashing actor to reschedule\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\tthis.startDestroy();\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.#runHandlerActive = false;\n\t\t\t\t\tthis.resetSleepTimer();\n\t\t\t\t});\n\t\t} else if (runSpan.isActive()) {\n\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\tthis.#runHandlerActive = false;\n\t\t\tthis.resetSleepTimer();\n\t\t}\n\t}\n\n\tasync #waitForRunHandler(timeoutMs: number) {\n\t\tif (!this.#runPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#rLog.debug({ msg: \"waiting for run handler to complete\" });\n\n\t\tconst timedOut = await Promise.race([\n\t\t\tthis.#runPromise.then(() => false).catch(() => false),\n\t\t\tnew Promise<true>((resolve) =>\n\t\t\t\tsetTimeout(() => resolve(true), timeoutMs),\n\t\t\t),\n\t\t]);\n\n\t\tif (timedOut) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"run handler did not complete in time, it may have leaked - ensure you use c.aborted (or the abort signal c.abortSignal) to exit gracefully\",\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#rLog.debug({ msg: \"run handler completed\" });\n\t\t}\n\t}\n\n\tasync #setupDatabase() {\n\t\tif (!(\"db\" in this.#config) || !this.#config.db) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet client: InferDatabaseClient<DB> | undefined;\n\t\ttry {\n\t\t\t// Every actor gets its own SqliteVfs/@rivetkit/sqlite instance. The async\n\t\t\t// @rivetkit/sqlite build is not re-entrant, and sharing one instance across\n\t\t\t// actors can cause cross-actor contention and runtime corruption.\n\t\t\tif (!this.#sqliteVfs && this.driver.createSqliteVfs) {\n\t\t\t\tthis.#sqliteVfs = await this.driver.createSqliteVfs();\n\t\t\t}\n\n\t\t\tclient = await this.#config.db.createClient({\n\t\t\t\tactorId: this.#actorId,\n\t\t\t\toverrideRawDatabaseClient: this.driver.overrideRawDatabaseClient\n\t\t\t\t\t? () => this.driver.overrideRawDatabaseClient!(this.#actorId)\n\t\t\t\t\t: undefined,\n\t\t\t\toverrideDrizzleDatabaseClient: this.driver.overrideDrizzleDatabaseClient\n\t\t\t\t\t? () => this.driver.overrideDrizzleDatabaseClient!(this.#actorId)\n\t\t\t\t\t: undefined,\n\t\t\t\tkv: {\n\t\t\t\t\tbatchPut: (entries) => this.driver.kvBatchPut(this.#actorId, entries),\n\t\t\t\t\tbatchGet: (keys) => this.driver.kvBatchGet(this.#actorId, keys),\n\t\t\t\t\tbatchDelete: (keys) => this.driver.kvBatchDelete(this.#actorId, keys),\n\t\t\t\t},\n\t\t\t\tsqliteVfs: this.#sqliteVfs,\n\t\t\t});\n\t\t\tthis.#rLog.info({ msg: \"database migration starting\" });\n\t\t\tawait this.#config.db.onMigrate?.(client);\n\t\t\tthis.#rLog.info({ msg: \"database migration complete\" });\n\t\t\tthis.#db = client;\n\t\t} catch (error) {\n\t\t\tif (client) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#config.db.onDestroy?.(client);\n\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"database setup cleanup failed\",\n\t\t\t\t\t\terror: stringifyError(cleanupError),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.#sqliteVfs) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#sqliteVfs.destroy();\n\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"sqlite vfs teardown after setup failure failed\",\n\t\t\t\t\t\terror: stringifyError(cleanupError),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#sqliteVfs = undefined;\n\t\t\tif (error instanceof Error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"database setup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst wrappedError = new Error(`Database setup failed: ${String(error)}`);\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"database setup failed with non-Error object\",\n\t\t\t\terror: String(error),\n\t\t\t\terrorType: typeof error,\n\t\t\t});\n\t\t\tthrow wrappedError;\n\t\t}\n\t}\n\n\tasync #cleanupDatabase() {\n\t\tconst client = this.#db;\n\t\tconst sqliteVfs = this.#sqliteVfs;\n\t\tconst dbConfig = \"db\" in this.#config ? this.#config.db : undefined;\n\t\tthis.#db = undefined;\n\t\tthis.#sqliteVfs = undefined;\n\n\t\tif (client && dbConfig) {\n\t\t\ttry {\n\t\t\t\tawait dbConfig.onDestroy?.(client);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"database cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (sqliteVfs) {\n\t\t\ttry {\n\t\t\t\tawait sqliteVfs.destroy();\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"sqlite vfs cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #disconnectConnections() {\n\t\tconst promises: Promise<unknown>[] = [];\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"disconnecting connections on actor stop\",\n\t\t\ttotalConns: this.connectionManager.connections.size,\n\t\t});\n\t\tfor (const connection of this.connectionManager.connections.values()) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"checking connection for disconnect\",\n\t\t\t\tconnId: connection.id,\n\t\t\t\tisHibernatable: connection.isHibernatable,\n\t\t\t});\n\t\t\tif (!connection.isHibernatable) {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"disconnecting non-hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t\tpromises.push(connection.disconnect());\n\t\t\t} else {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"preserving hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Wait with timeout\n\t\tconst res = await Promise.race([\n\t\t\tPromise.all(promises).then(() => false),\n\t\t\tnew Promise<boolean>((res) =>\n\t\t\t\tglobalThis.setTimeout(() => res(true), 1500),\n\t\t\t),\n\t\t]);\n\n\t\tif (res) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"timed out waiting for connections to close, shutting down anyway\",\n\t\t\t});\n\t\t}\n\t}\n\n\tasync #waitBackgroundPromises(timeoutMs: number) {\n\t\tconst pending = this.#backgroundPromises;\n\t\tif (pending.length === 0) {\n\t\t\tthis.#rLog.debug({ msg: \"no background promises\" });\n\t\t\treturn;\n\t\t}\n\n\t\tconst timedOut = await Promise.race([\n\t\t\tPromise.allSettled(pending).then(() => false),\n\t\t\tnew Promise<true>((resolve) =>\n\t\t\t\tsetTimeout(() => resolve(true), timeoutMs),\n\t\t\t),\n\t\t]);\n\n\t\tif (timedOut) {\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"timed out waiting for background tasks\",\n\t\t\t\tcount: pending.length,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#rLog.debug({ msg: \"background promises finished\" });\n\t\t}\n\t}\n\n\tresetSleepTimer() {\n\t\tif (this.#config.options.noSleep || !this.#sleepingSupported) return;\n\t\tif (this.#stopCalled) return;\n\n\t\tconst canSleep = this.#canSleep();\n\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"resetting sleep timer\",\n\t\t\tcanSleep: CanSleep[canSleep],\n\t\t\texistingTimeout: !!this.#sleepTimeout,\n\t\t\ttimeout: this.#config.options.sleepTimeout,\n\t\t});\n\n\t\tif (this.#sleepTimeout) {\n\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\tthis.#sleepTimeout = undefined;\n\t\t}\n\n\t\tif (this.#sleepCalled) return;\n\n\t\tif (canSleep === CanSleep.Yes) {\n\t\t\tthis.#sleepTimeout = setTimeout(() => {\n\t\t\t\tthis.startSleep();\n\t\t\t}, this.#config.options.sleepTimeout);\n\t\t}\n\t}\n\n\t#canSleep(): CanSleep {\n\t\tif (!this.#ready) return CanSleep.NotReady;\n\t\tif (!this.#started) return CanSleep.NotReady;\n\t\tif (this.#activeHonoHttpRequests > 0)\n\t\t\treturn CanSleep.ActiveHonoHttpRequests;\n\t\tif (this.#activeKeepAwakeCount > 0) return CanSleep.ActiveKeepAwake;\n\t\tif (this.#runHandlerActive && this.#activeQueueWaitCount === 0) {\n\t\t\treturn CanSleep.ActiveRun;\n\t\t}\n\n\t\tfor (const _conn of this.connectionManager.connections.values()) {\n\t\t\t// TODO: Add back\n\t\t\t// if (!_conn.isHibernatable) {\n\t\t\treturn CanSleep.ActiveConns;\n\t\t\t// }\n\t\t}\n\n\t\tif (this.connectionManager.pendingDisconnectCount > 0) {\n\t\t\treturn CanSleep.ActiveDisconnectCallbacks;\n\t\t}\n\n\t\treturn CanSleep.Yes;\n\t}\n\n\tget #sleepingSupported(): boolean {\n\t\treturn this.driver.startSleep !== undefined;\n\t}\n\n\tget #varsEnabled(): boolean {\n\t\treturn \"createVars\" in this.#config || \"vars\" in this.#config;\n\t}\n\n\t#validateVarsEnabled() {\n\t\tif (!this.#varsEnabled) {\n\t\t\tthrow new errors.VarsNotEnabled();\n\t\t}\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { createNanoEvents } from \"nanoevents\";\nimport { createHttpDriver } from \"@/actor/conn/drivers/http\";\nimport {\n\tCONN_DRIVER_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n} from \"@/actor/conn/mod\";\nimport { getRunInspectorConfig } from \"@/actor/config\";\nimport { ActionContext } from \"@/actor/contexts/action\";\nimport * as actorErrors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/mod\";\nimport type * as schema from \"@/schemas/actor-inspector/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\ninterface ActorInspectorEmitterEvents {\n\tstateUpdated: (state: unknown) => void;\n\tconnectionsUpdated: () => void;\n\tqueueUpdated: () => void;\n\tworkflowHistoryUpdated: (history: schema.WorkflowHistory) => void;\n}\n\nexport type Connection = Omit<schema.Connection, \"details\"> & {\n\tdetails: unknown;\n};\n\n\n/**\n * Provides a unified interface for inspecting actor external and internal state.\n */\nexport class ActorInspector {\n\tpublic readonly emitter = createNanoEvents<ActorInspectorEmitterEvents>();\n\n\t#lastQueueSize = 0;\n\t#workflowInspector?: NonNullable<\n\t\tReturnType<typeof getRunInspectorConfig>\n\t>[\"workflow\"];\n\n\tconstructor(private readonly actor: AnyActorInstance) {\n\t\tthis.#lastQueueSize = actor.queueManager?.size ?? 0;\n\t\tconst runInspector = getRunInspectorConfig(actor.config.run);\n\t\tthis.#workflowInspector = runInspector?.workflow;\n\t\tif (this.#workflowInspector?.onHistoryUpdated) {\n\t\t\tthis.#workflowInspector.onHistoryUpdated((history) => {\n\t\t\t\tthis.emitter.emit(\n\t\t\t\t\t\"workflowHistoryUpdated\",\n\t\t\t\t\thistory as schema.WorkflowHistory,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tgetQueueSize() {\n\t\treturn this.#lastQueueSize;\n\t}\n\n\tasync getQueueStatus(limit: number): Promise<schema.QueueStatus> {\n\t\tconst maxSize = this.actor.config.options.maxQueueSize;\n\t\tconst safeLimit = Math.max(0, Math.floor(limit));\n\t\tconst messages = await this.actor.queueManager.getMessages();\n\t\tconst sorted = messages.sort(\n\t\t\t(a, b) => a.createdAt - b.createdAt,\n\t\t);\n\t\tconst limited = safeLimit > 0 ? sorted.slice(0, safeLimit) : [];\n\t\treturn {\n\t\t\tsize: BigInt(this.#lastQueueSize),\n\t\t\tmaxSize: BigInt(maxSize),\n\t\t\ttruncated: sorted.length > limited.length,\n\t\t\tmessages: limited.map((message) => ({\n\t\t\t\tid: message.id,\n\t\t\t\tname: message.name,\n\t\t\t\tcreatedAtMs: BigInt(message.createdAt),\n\t\t\t})),\n\t\t};\n\t}\n\n\tupdateQueueSize(size: number) {\n\t\tif (this.#lastQueueSize === size) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#lastQueueSize = size;\n\t\tthis.emitter.emit(\"queueUpdated\");\n\t}\n\n\tisWorkflowEnabled() {\n\t\treturn this.#workflowInspector !== undefined;\n\t}\n\n\tgetWorkflowHistory(): schema.WorkflowHistory | null {\n\t\tif (!this.#workflowInspector) {\n\t\t\treturn null;\n\t\t}\n\t\tconst history = this.#workflowInspector.getHistory();\n\t\treturn (history ?? null) as schema.WorkflowHistory | null;\n\t}\n\n\t// actor accessor methods\n\n\tisDatabaseEnabled() {\n\t\ttry {\n\t\t\treturn this.actor.db !== undefined;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync getDatabaseSchema(): Promise<ArrayBuffer> {\n\t\tif (!this.isDatabaseEnabled()) {\n\t\t\tthrow new actorErrors.DatabaseNotEnabled();\n\t\t}\n\n\t\tconst db = this.actor.db;\n\n\t\t// Get table list from sqlite_master, excluding internal tables.\n\t\tconst tables = await db.execute(\n\t\t\t\"SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__drizzle_%'\",\n\t\t) as { name: string; type: string }[];\n\n\t\t// Serialize all queries to avoid concurrent @rivetkit/sqlite access\n\t\t// which can cause \"file is not a database\" errors.\n\t\tconst tableInfos = [];\n\t\tfor (const table of tables) {\n\t\t\tconst quoted = `\"${escapeDoubleQuotes(table.name)}\"`;\n\t\t\tconst sample = await db.execute(\n\t\t\t\t`SELECT * FROM ${quoted} LIMIT 1`,\n\t\t\t) as Record<string, unknown>[];\n\t\t\tconst countResult = await db.execute(\n\t\t\t\t`SELECT COUNT(*) as count FROM ${quoted}`,\n\t\t\t) as { count: number }[];\n\n\t\t\tconst columnNames = sample?.[0]\n\t\t\t\t? Object.keys(sample[0])\n\t\t\t\t: [];\n\n\t\t\ttableInfos.push({\n\t\t\t\ttable: { schema: \"main\", name: table.name, type: table.type },\n\t\t\t\tcolumns: columnNames.map((name, cid) => ({\n\t\t\t\t\tcid,\n\t\t\t\t\tname,\n\t\t\t\t\ttype: \"\",\n\t\t\t\t\tnotnull: 0,\n\t\t\t\t\tdflt_value: null,\n\t\t\t\t\tpk: 0,\n\t\t\t\t})),\n\t\t\t\tforeignKeys: [],\n\t\t\t\trecords: countResult?.[0]?.count ?? 0,\n\t\t\t});\n\t\t}\n\n\t\treturn bufferToArrayBuffer(cbor.encode({ tables: tableInfos }));\n\t}\n\n\tasync getDatabaseTableRows(\n\t\ttable: string,\n\t\tlimit: number,\n\t\toffset: number,\n\t): Promise<ArrayBuffer> {\n\t\tif (!this.isDatabaseEnabled()) {\n\t\t\tthrow new actorErrors.DatabaseNotEnabled();\n\t\t}\n\n\t\tconst db = this.actor.db;\n\t\tconst safeLimit = Math.max(0, Math.min(Math.floor(limit), 500));\n\t\tconst safeOffset = Math.max(0, Math.floor(offset));\n\t\tconst quoted = `\"${escapeDoubleQuotes(table)}\"`;\n\t\tconst result = await db.execute(\n\t\t\t`SELECT * FROM ${quoted} LIMIT ? OFFSET ?`,\n\t\t\tsafeLimit,\n\t\t\tsafeOffset,\n\t\t);\n\t\treturn bufferToArrayBuffer(cbor.encode(result));\n\t}\n\n\tisStateEnabled() {\n\t\treturn this.actor.stateEnabled;\n\t}\n\n\tgetState() {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\treturn bufferToArrayBuffer(\n\t\t\tcbor.encode(this.actor.stateManager.persistRaw.state),\n\t\t);\n\t}\n\n\tgetRpcs() {\n\t\treturn this.actor.actions;\n\t}\n\n\tgetConnections() {\n\t\treturn Array.from(\n\t\t\tthis.actor.connectionManager.connections.entries(),\n\t\t).map(([id, conn]) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\treturn {\n\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\tid,\n\t\t\t\tdetails: bufferToArrayBuffer(\n\t\t\t\t\tcbor.encode({\n\t\t\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\t\t\tparams: conn.params as any,\n\t\t\t\t\t\tstateEnabled: connStateManager.stateEnabled,\n\t\t\t\t\t\tstate: connStateManager.stateEnabled\n\t\t\t\t\t\t\t? connStateManager.state\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsubscriptions: conn.subscriptions.size,\n\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t// TODO: Include underlying hibernatable metadata +\n\t\t\t\t\t\t// path + headers\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\tasync setState(state: ArrayBuffer) {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\tthis.actor.stateManager.state = cbor.decode(Buffer.from(state));\n\t\tawait this.actor.stateManager.saveState({ immediate: true });\n\t}\n\n\tasync executeAction(name: string, params: ArrayBuffer) {\n\t\tconst conn = await this.actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateHttpDriver(),\n\t\t\t// TODO: This may cause issues\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t);\n\n\t\ttry {\n\t\t\treturn bufferToArrayBuffer(\n\t\t\t\tcbor.encode(\n\t\t\t\t\tawait this.actor.executeAction(\n\t\t\t\t\t\tnew ActionContext(this.actor, conn),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcbor.decode(Buffer.from(params)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tconn.disconnect();\n\t\t}\n\t}\n\n\t// JSON-native methods for the HTTP inspector API. These return raw JS\n\t// objects suitable for JSON serialization instead of CBOR-encoded buffers.\n\n\tgetStateJson(): unknown {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\treturn this.actor.stateManager.persistRaw.state;\n\t}\n\n\tasync setStateJson(state: unknown): Promise<void> {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\tthis.actor.stateManager.state = state;\n\t\tawait this.actor.stateManager.saveState({ immediate: true });\n\t}\n\n\tgetConnectionsJson(): { id: string; details: unknown }[] {\n\t\treturn Array.from(\n\t\t\tthis.actor.connectionManager.connections.entries(),\n\t\t).map(([id, conn]) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\treturn {\n\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\tid,\n\t\t\t\tdetails: {\n\t\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\t\tparams: conn.params as any,\n\t\t\t\t\tstateEnabled: connStateManager.stateEnabled,\n\t\t\t\t\tstate: connStateManager.stateEnabled\n\t\t\t\t\t\t? connStateManager.state\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tsubscriptions: conn.subscriptions.size,\n\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync executeActionJson(name: string, args: unknown[]): Promise<unknown> {\n\t\tconst conn = await this.actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateHttpDriver(),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t);\n\n\t\ttry {\n\t\t\treturn await this.actor.executeAction(\n\t\t\t\tnew ActionContext(this.actor, conn),\n\t\t\t\tname,\n\t\t\t\targs,\n\t\t\t);\n\t\t} finally {\n\t\t\tconn.disconnect();\n\t\t}\n\t}\n\n\tasync getTracesJson(options: {\n\t\tstartMs: number;\n\t\tendMs: number;\n\t\tlimit: number;\n\t}): Promise<{ otlp: unknown; clamped: boolean }> {\n\t\tconst result = await this.actor.traces.readRange(options);\n\t\treturn result;\n\t}\n\n\tgetWorkflowHistoryJson(): { history: unknown | null; isWorkflowEnabled: boolean } {\n\t\tconst bigIntReplacer = (_key: string, value: unknown) =>\n\t\t\ttypeof value === \"bigint\" ? Number(value) : value;\n\t\tconst history = this.getWorkflowHistory();\n\t\tconst safeHistory = history\n\t\t\t? JSON.parse(JSON.stringify(history, bigIntReplacer))\n\t\t\t: null;\n\t\treturn {\n\t\t\thistory: safeHistory,\n\t\t\tisWorkflowEnabled: this.isWorkflowEnabled(),\n\t\t};\n\t}\n\n\tgetQueueStatusJson(limit: number): Promise<{\n\t\tsize: number;\n\t\tmaxSize: number;\n\t\ttruncated: boolean;\n\t\tmessages: { id: number; name: string; createdAtMs: number }[];\n\t}> {\n\t\treturn this.getQueueStatus(limit).then((status) => ({\n\t\t\tsize: Number(status.size),\n\t\t\tmaxSize: Number(status.maxSize),\n\t\t\ttruncated: status.truncated,\n\t\t\tmessages: status.messages.map((m) => ({\n\t\t\t\tid: Number(m.id),\n\t\t\t\tname: m.name,\n\t\t\t\tcreatedAtMs: Number(m.createdAtMs),\n\t\t\t})),\n\t\t}));\n\t}\n}\n\nfunction escapeDoubleQuotes(value: string): string {\n\treturn value.replace(/\"/g, '\"\"');\n}\n\n","/**\n * Persisted data structures for connections.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type GatewayId = ArrayBuffer;\nexport type RequestId = ArrayBuffer;\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Connection\n/** Event subscription for connection */\nexport interface PersistedSubscription {\n\teventName: string;\n}\n\n/** Connection associated with hibernatable WebSocket that should persist across lifecycles */\nexport interface PersistedConn<CP, CS> {\n\t/** Connection ID generated by RivetKit */\n\tid: string;\n\tparameters: CP;\n\tstate: CS;\n\tsubscriptions: PersistedSubscription[];\n\tgatewayId: GatewayId;\n\trequestId: RequestId;\n\tserverMessageIndex: number;\n\tclientMessageIndex: number;\n\trequestPath: string;\n\trequestHeaders: Record<string, string>;\n}\n\n/**\n * Converts persisted connection data to BARE schema format for serialization.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnToBarePersistedConn<CP, CS>(\n\tpersist: PersistedConn<CP, CS>,\n): persistSchema.Conn {\n\treturn {\n\t\tid: persist.id,\n\t\tparameters: bufferToArrayBuffer(cbor.encode(persist.parameters)),\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tsubscriptions: persist.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: persist.gatewayId,\n\t\trequestId: persist.requestId,\n\t\tserverMessageIndex: persist.serverMessageIndex,\n\t\tclientMessageIndex: persist.clientMessageIndex,\n\t\trequestPath: persist.requestPath,\n\t\trequestHeaders: new Map(Object.entries(persist.requestHeaders)),\n\t};\n}\n\n/**\n * Converts BARE schema format to persisted connection data.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnFromBarePersistedConn<CP, CS>(\n\tbareData: persistSchema.Conn,\n): PersistedConn<CP, CS> {\n\treturn {\n\t\tid: bareData.id,\n\t\tparameters: cbor.decode(new Uint8Array(bareData.parameters)),\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tsubscriptions: bareData.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: bareData.gatewayId,\n\t\trequestId: bareData.requestId,\n\t\tserverMessageIndex: bareData.serverMessageIndex,\n\t\tclientMessageIndex: bareData.clientMessageIndex,\n\t\trequestPath: bareData.requestPath,\n\t\trequestHeaders: Object.fromEntries(bareData.requestHeaders),\n\t};\n}\n","import type { AnyActorInstance } from \"./instance/mod\";\n\nexport class Schedule {\n\t#actor: AnyActorInstance;\n\n\tconstructor(actor: AnyActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync after(duration: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(Date.now() + duration, fn, args);\n\t}\n\n\tasync at(timestamp: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(timestamp, fn, args);\n\t}\n}\n","import { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { CONN_VERSIONED } from \"@/schemas/actor-persist/versioned\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport { ToClientSchema } from \"@/schemas/client-protocol-zod/mod\";\nimport { arrayBuffersEqual, stringifyError } from \"@/utils\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport {\n\tCONN_CONNECTED_SYMBOL,\n\tCONN_DRIVER_SYMBOL,\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\tConn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnToBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport type { ConnDataInput } from \"../conn/state-manager\";\nimport {\n\tBeforeConnectContext,\n\tConnectContext,\n\tCreateConnStateContext,\n} from \"../contexts\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { deadline } from \"../utils\";\nimport { makeConnKey } from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\n/**\n * Manages all connection-related operations for an actor instance.\n * Handles connection creation, tracking, hibernation, and cleanup.\n */\nexport class ConnectionManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#connections = new Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>>();\n\t#pendingDisconnectCount = 0;\n\n\t/** Connections that have had their state changed and need to be persisted. */\n\t#connsWithPersistChanged = new Set<ConnId>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#actor = actor;\n\t}\n\n\tget connections(): Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\treturn this.#connections;\n\t}\n\n\tgetConnForId(id: string): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {\n\t\treturn this.#connections.get(id);\n\t}\n\n\tget connsWithPersistChanged(): Set<ConnId> {\n\t\treturn this.#connsWithPersistChanged;\n\t}\n\n\tget pendingDisconnectCount(): number {\n\t\treturn this.#pendingDisconnectCount;\n\t}\n\n\tclearConnWithPersistChanged() {\n\t\tthis.#connsWithPersistChanged.clear();\n\t}\n\n\tmarkConnWithPersistChanged(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tinvariant(\n\t\t\tconn.isHibernatable,\n\t\t\t\"cannot mark non-hibernatable conn for persist\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"marked connection as changed\",\n\t\t\tconnId: conn.id,\n\t\t\ttotalChanged: this.#connsWithPersistChanged.size,\n\t\t});\n\n\t\tthis.#connsWithPersistChanged.add(conn.id);\n\n\t\tthis.#actor.stateManager.savePersistThrottled();\n\t}\n\n\t// MARK: - Connection Lifecycle\n\t/**\n\t * Handles pre-connection logic (i.e. auth & create state) before actually connecting the connection.\n\t */\n\tasync prepareConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t\tisHibernatable: boolean,\n\t\tisRestoringHibernatable: boolean,\n\t): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\tthis.#actor.assertReady();\n\n\t\t// TODO: Add back\n\t\t// const url = request?.url;\n\t\t// invariant(\n\t\t// \turl?.startsWith(\"http://actor/\") ?? true,\n\t\t// \t`url ${url} must start with 'http://actor/'`,\n\t\t// );\n\n\t\t// Check for hibernatable websocket reconnection\n\t\tif (isRestoringHibernatable) {\n\t\t\treturn this.#reconnectHibernatableConn(driver);\n\t\t}\n\n\t\t// Create new connection\n\t\tif (this.#actor.config.onBeforeConnect) {\n\t\t\tconst ctx = new BeforeConnectContext(this.#actor, request);\n\t\t\tawait this.#actor.runInTraceSpan(\n\t\t\t\t\"actor.onBeforeConnect\",\n\t\t\t\t{\n\t\t\t\t\t\"rivet.conn.type\": driver.type,\n\t\t\t\t},\n\t\t\t\t() => this.#actor.config.onBeforeConnect!(ctx, params),\n\t\t\t);\n\t\t}\n\n\t\t// Create connection state if enabled\n\t\tlet connState: CS | undefined;\n\t\tif (this.#actor.connStateEnabled) {\n\t\t\tconnState = await this.#createConnState(params, request);\n\t\t}\n\n\t\t// Create connection persist data\n\t\tlet connData: ConnDataInput<CP, CS>;\n\t\tif (isHibernatable) {\n\t\t\tconst hibernatable = driver.hibernatable;\n\t\t\tinvariant(hibernatable, \"must have hibernatable\");\n\t\t\tinvariant(requestPath, \"missing requestPath for hibernatable ws\");\n\t\t\tinvariant(\n\t\t\t\trequestHeaders,\n\t\t\t\t\"missing requestHeaders for hibernatable ws\",\n\t\t\t);\n\t\t\tconnData = {\n\t\t\t\thibernatable: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t\tsubscriptions: [],\n\t\t\t\t\tgatewayId: hibernatable.gatewayId,\n\t\t\t\t\trequestId: hibernatable.requestId,\n\t\t\t\t\tclientMessageIndex: 0,\n\t\t\t\t\t// First message index will be 1, so we start at 0\n\t\t\t\t\tserverMessageIndex: 0,\n\t\t\t\t\trequestPath,\n\t\t\t\t\trequestHeaders,\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tconnData = {\n\t\t\t\tephemeral: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Create connection instance\n\t\tconst conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, connData);\n\t\tconn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\treturn conn;\n\t}\n\n\t/**\n\t * Adds a connection form prepareConn to the actor and calls onConnect.\n\t *\n\t * This method is intentionally not async since it needs to be called in\n\t * `onOpen` for WebSockets. If this is async, the order of open events will\n\t * be messed up and cause race conditions that can drop WebSocket messages.\n\t * So all async work in prepareConn.\n\t */\n\tconnectConn(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tinvariant(!this.#connections.has(conn.id), \"conn already connected\");\n\n\t\tthis.#connections.set(conn.id, conn);\n\n\t\t// Notify driver about new connection BEFORE marking as changed\n\t\t//\n\t\t// This ensures the driver can set up any necessary state (like #hwsMessageIndex)\n\t\t// before saveState is triggered by markConnWithPersistChanged\n\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t}\n\n\t\tif (conn.isHibernatable) {\n\t\t\tthis.markConnWithPersistChanged(conn);\n\t\t}\n\n\t\tthis.#callOnConnect(conn);\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\n\t\tthis.#actor.resetSleepTimer();\n\n\t\tconn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\t// Send init message\n\t\tif (conn[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tconst initData = { actorId: this.#actor.id, connectionId: conn.id };\n\t\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\t\tnew CachedSerializer(\n\t\t\t\t\tinitData,\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\tToClientSchema,\n\t\t\t\t\t// JSON: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t// BARE/CBOR: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t#reconnectHibernatableConn(\n\t\tdriver: ConnDriver,\n\t): Conn<S, CP, CS, V, I, DB, E, Q> {\n\t\tinvariant(driver.hibernatable, \"missing requestIdBuf\");\n\t\tconst existingConn = this.findHibernatableConn(\n\t\t\tdriver.hibernatable.gatewayId,\n\t\t\tdriver.hibernatable.requestId,\n\t\t);\n\t\tinvariant(\n\t\t\texistingConn,\n\t\t\t\"cannot find connection for restoring connection\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"reconnecting hibernatable websocket connection\",\n\t\t\tconnectionId: existingConn.id,\n\t\t});\n\n\t\t// Clean up existing driver state if present\n\t\tif (existingConn[CONN_DRIVER_SYMBOL]) {\n\t\t\tthis.#disconnectExistingDriver(existingConn);\n\t\t}\n\n\t\t// Update connection with new socket\n\t\texistingConn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\t// Reset sleep timer since we have an active connection\n\t\tthis.#actor.resetSleepTimer();\n\n\t\t// Mark connection as connected\n\t\texistingConn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\n\t\treturn existingConn;\n\t}\n\n\t#disconnectExistingDriver(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tconst driver = conn[CONN_DRIVER_SYMBOL];\n\t\tif (driver?.disconnect) {\n\t\t\tdriver.disconnect(\n\t\t\t\tthis.#actor,\n\t\t\t\tconn,\n\t\t\t\t\"Reconnecting hibernatable websocket with new driver state\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle connection disconnection.\n\t *\n\t * This is called by `Conn.disconnect`. This should not call `Conn.disconnect.`\n\t */\n\tasync connDisconnected(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\t// Remove from tracking\n\t\tthis.#connections.delete(conn.id);\n\n\t\tthis.#actor.rLog.debug({ msg: \"removed conn\", connId: conn.id });\n\n\t\t// Notify driver about connection removal\n\t\tif (this.#actor.driver.onDestroyConn) {\n\t\t\tthis.#actor.driver.onDestroyConn(conn);\n\t\t}\n\n\t\tfor (const eventName of [...conn.subscriptions.values()]) {\n\t\t\tthis.#actor.eventManager.removeSubscription(eventName, conn, true);\n\t\t}\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\t\tthis.#pendingDisconnectCount += 1;\n\n\t\tconst attributes = {\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t\"rivet.conn.type\": conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\"rivet.conn.hibernatable\": conn.isHibernatable,\n\t\t};\n\t\tconst span = this.#actor.startTraceSpan(\n\t\t\t\"actor.onDisconnect\",\n\t\t\tattributes,\n\t\t);\n\n\t\ttry {\n\t\t\tif (this.#actor.config.onDisconnect) {\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#actor.config.onDisconnect!(\n\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\tconn,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.disconnect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t} else {\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.disconnect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\tcode: \"ERROR\",\n\t\t\t\tmessage: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error in `onDisconnect`\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\t// Remove from connsWithPersistChanged after onDisconnect to handle any\n\t\t\t// state changes made during the disconnect callback. Disconnected connections\n\t\t\t// are removed from KV storage via kvBatchDelete below, not through the\n\t\t\t// normal persist save flow, so they should not trigger persist saves.\n\t\t\tthis.#connsWithPersistChanged.delete(conn.id);\n\n\t\t\t// Remove from KV storage.\n\t\t\tif (conn.isHibernatable) {\n\t\t\t\tconst key = makeConnKey(conn.id);\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [key]);\n\t\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\t\tmsg: \"removed connection from KV\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t});\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"kvBatchDelete failed for conn\",\n\t\t\t\t\t\terr: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#pendingDisconnectCount = Math.max(\n\t\t\t\t0,\n\t\t\t\tthis.#pendingDisconnectCount - 1,\n\t\t\t);\n\t\t\tthis.#actor.resetSleepTimer();\n\t\t}\n\t}\n\n\tasync cleanupPersistedHibernatableConnections(\n\t\treason?: string,\n\t): Promise<number> {\n\t\tconst staleConnections = Array.from(this.#connections.values()).filter(\n\t\t\t(conn) =>\n\t\t\t\tconn.isHibernatable &&\n\t\t\t\tconn[CONN_DRIVER_SYMBOL] === undefined,\n\t\t);\n\t\tif (staleConnections.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tthis.#actor.rLog.info({\n\t\t\tmsg: \"cleaning up persisted hibernatable connections\",\n\t\t\treason: reason ?? \"unknown\",\n\t\t\tcount: staleConnections.length,\n\t\t});\n\n\t\tfor (const conn of staleConnections) {\n\t\t\tawait this.connDisconnected(conn);\n\t\t}\n\n\t\treturn staleConnections.length;\n\t}\n\n\t/**\n\t * Utilify function for call sites that don't need a separate prepare and connect phase.\n\t */\n\tasync prepareAndConnectConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\tconst conn = await this.prepareConn(\n\t\t\tdriver,\n\t\t\tparams,\n\t\t\trequest,\n\t\t\trequestPath,\n\t\t\trequestHeaders,\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t);\n\t\tthis.connectConn(conn);\n\t\treturn conn;\n\t}\n\n\t// MARK: - Persistence\n\n\t/**\n\t * Restores connections from persisted data during actor initialization.\n\t */\n\trestoreConnections(connections: PersistedConn<CP, CS>[]) {\n\t\tfor (const connPersist of connections) {\n\t\t\t// Create connection instance\n\t\t\tconst conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, {\n\t\t\t\thibernatable: connPersist,\n\t\t\t});\n\t\t\tthis.#connections.set(conn.id, conn);\n\n\t\t\t// Notify driver about restored connection\n\t\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t\t}\n\n\t\t\t// Restore subscriptions\n\t\t\tfor (const sub of connPersist.subscriptions) {\n\t\t\t\tthis.#actor.eventManager.addSubscription(\n\t\t\t\t\tsub.eventName,\n\t\t\t\t\tconn,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\tfindHibernatableConn(\n\t\tgatewayIdBuf: ArrayBuffer,\n\t\trequestIdBuf: ArrayBuffer,\n\t): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {\n\t\treturn Array.from(this.#connections.values()).find((conn) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\tconst h = connStateManager.hibernatableDataRaw;\n\t\t\treturn (\n\t\t\t\th &&\n\t\t\t\tarrayBuffersEqual(h.gatewayId, gatewayIdBuf) &&\n\t\t\t\tarrayBuffersEqual(h.requestId, requestIdBuf)\n\t\t\t);\n\t\t});\n\t}\n\n\tasync #createConnState(\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t): Promise<CS | undefined> {\n\t\tif (\"createConnState\" in this.#actor.config) {\n\t\t\tconst createConnState = this.#actor.config.createConnState;\n\t\t\tconst ctx = new CreateConnStateContext(this.#actor, request);\n\t\t\treturn await this.#actor.runInTraceSpan(\n\t\t\t\t\"actor.createConnState\",\n\t\t\t\tundefined,\n\t\t\t\t() => {\n\t\t\t\t\tconst dataOrPromise = createConnState!(ctx, params);\n\t\t\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\t\t\treturn deadline(\n\t\t\t\t\t\t\tdataOrPromise,\n\t\t\t\t\t\t\tthis.#actor.config.options.createConnStateTimeout,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn dataOrPromise;\n\t\t\t\t},\n\t\t\t);\n\t\t} else if (\"connState\" in this.#actor.config) {\n\t\t\treturn structuredClone(this.#actor.config.connState);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"Could not create connection state from 'createConnState' or 'connState'\",\n\t\t);\n\t}\n\n\t#callOnConnect(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tconst attributes = {\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t\"rivet.conn.type\": conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\"rivet.conn.hibernatable\": conn.isHibernatable,\n\t\t};\n\t\tconst span = this.#actor.startTraceSpan(\"actor.onConnect\", attributes);\n\n\t\ttry {\n\t\t\tif (this.#actor.config.onConnect) {\n\t\t\t\tconst ctx = new ConnectContext(this.#actor, conn);\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#actor.config.onConnect!(ctx, conn),\n\t\t\t\t);\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.connect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tdeadline(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tthis.#actor.config.options.onConnectTimeout,\n\t\t\t\t\t)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\t\t\tmsg: \"error in `onConnect`, closing socket\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#actor.emitTraceEvent(\"connection.connect\", attributes, span);\n\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t} catch (error) {\n\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\tcode: \"ERROR\",\n\t\t\t\tmessage: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error in `onConnect`\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t}\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport {\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n} from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport * as errors from \"../errors\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport type { ActorInstance } from \"./mod\";\n\n/**\n * Manages event subscriptions and broadcasting for actor instances.\n * Handles subscription tracking and efficient message distribution to connected clients.\n */\nexport class EventManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#subscriptionIndex = new Map<\n\t\tstring,\n\t\tSet<Conn<S, CP, CS, V, I, DB, E, Q>>\n\t>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#actor = actor;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Adds a subscription for a connection to an event.\n\t *\n\t * @param eventName - The name of the event to subscribe to\n\t * @param connection - The connection subscribing to the event\n\t * @param fromPersist - Whether this subscription is being restored from persistence\n\t */\n\taddSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\tfromPersist: boolean,\n\t) {\n\t\t// Check if already subscribed\n\t\tif (connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"connection already has subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Update connection's subscription list\n\t\tconnection.subscriptions.add(eventName);\n\n\t\t// Update subscription index\n\t\tlet subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (!subscribers) {\n\t\t\tsubscribers = new Set();\n\t\t\tthis.#subscriptionIndex.set(eventName, subscribers);\n\t\t}\n\t\tsubscribers.add(connection);\n\n\t\t// Persist subscription if not restoring from persistence\n\t\tif (!fromPersist) {\n\t\t\tconnection[CONN_STATE_MANAGER_SYMBOL].addSubscription({\n\t\t\t\teventName,\n\t\t\t});\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription added\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\ttotalSubscribers: subscribers.size,\n\t\t});\n\t}\n\n\t/**\n\t * Removes a subscription for a connection from an event.\n\t *\n\t * @param eventName - The name of the event to unsubscribe from\n\t * @param connection - The connection unsubscribing from the event\n\t * @param fromRemoveConn - Whether this is being called as part of connection removal\n\t */\n\tremoveSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\tfromRemoveConn: boolean,\n\t) {\n\t\t// Check if subscription exists\n\t\tif (!connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"connection does not have subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove from connection's subscription list\n\t\tconnection.subscriptions.delete(eventName);\n\n\t\t// Update subscription index\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (subscribers) {\n\t\t\tsubscribers.delete(connection);\n\t\t\tif (subscribers.size === 0) {\n\t\t\t\tthis.#subscriptionIndex.delete(eventName);\n\t\t\t}\n\t\t}\n\n\t\t// Update persistence if not part of connection removal\n\t\tif (!fromRemoveConn) {\n\t\t\t// Remove from persisted subscriptions\n\t\t\tconst removed = connection[\n\t\t\t\tCONN_STATE_MANAGER_SYMBOL\n\t\t\t].removeSubscription({ eventName });\n\t\t\tif (!removed) {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"subscription does not exist in persist\",\n\t\t\t\t\teventName,\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription removed\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\tremainingSubscribers: subscribers?.size || 0,\n\t\t});\n\t}\n\n\t/**\n\t * Broadcasts an event to all subscribed connections.\n\t *\n\t * @param name - The name of the event to broadcast\n\t * @param args - The arguments to send with the event\n\t */\n\tbroadcast<Args extends Array<unknown>>(name: string, ...args: Args) {\n\t\tthis.#actor.assertReady();\n\n\t\t// Get subscribers for this event\n\t\tconst subscribers = this.#subscriptionIndex.get(name);\n\t\tif (!subscribers || subscribers.size === 0) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"no subscribers for event\",\n\t\t\t\teventName: name,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#actor.emitTraceEvent(\"message.broadcast\", {\n\t\t\t\"rivet.event.name\": name,\n\t\t\t\"rivet.broadcast.subscribers\": subscribers.size,\n\t\t});\n\n\t\t// Create serialized message\n\t\tconst eventData = { name, args };\n\t\tconst toClientSerializer = new CachedSerializer(\n\t\t\teventData,\n\t\t\tTO_CLIENT_VERSIONED,\n\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tToClientSchema,\n\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t(value): ToClientJson => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t(value): protocol.ToClient => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Send to all subscribers\n\t\tlet sentCount = 0;\n\t\tfor (const connection of subscribers) {\n\t\t\tif (connection[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\t\ttry {\n\t\t\t\t\tconnection[CONN_SEND_MESSAGE_SYMBOL](toClientSerializer);\n\t\t\t\t\tsentCount++;\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Propagate message size errors to the call site so developers\n\t\t\t\t\t// can handle them\n\t\t\t\t\tif (error instanceof errors.OutgoingMessageTooLong) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\t// Log other errors (e.g., closed connections) and continue\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"failed to send event to connection\",\n\t\t\t\t\t\teventName: name,\n\t\t\t\t\t\tconnId: connection.id,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"event broadcasted\",\n\t\t\teventName: name,\n\t\t\tsubscriberCount: subscribers.size,\n\t\t\tsentCount,\n\t\t});\n\t}\n\n\t/**\n\t * Gets all subscribers for a specific event.\n\t *\n\t * @param eventName - The name of the event\n\t * @returns Set of connections subscribed to the event, or undefined if no subscribers\n\t */\n\tgetSubscribers(\n\t\teventName: string,\n\t): Set<Conn<S, CP, CS, V, I, DB, E, Q>> | undefined {\n\t\treturn this.#subscriptionIndex.get(eventName);\n\t}\n\n\t/**\n\t * Gets all events and their subscriber counts.\n\t *\n\t * @returns Map of event names to subscriber counts\n\t */\n\tgetEventStats(): Map<string, number> {\n\t\tconst stats = new Map<string, number>();\n\t\tfor (const [eventName, subscribers] of this.#subscriptionIndex) {\n\t\t\tstats.set(eventName, subscribers.size);\n\t\t}\n\t\treturn stats;\n\t}\n\n\t/**\n\t * Clears all subscriptions for a connection.\n\t * Used during connection cleanup.\n\t *\n\t * @param connection - The connection to clear subscriptions for\n\t */\n\tclearConnectionSubscriptions(connection: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tfor (const eventName of [...connection.subscriptions.values()]) {\n\t\t\tthis.removeSubscription(eventName, connection, true);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the total number of unique events being subscribed to.\n\t */\n\tget eventCount(): number {\n\t\treturn this.#subscriptionIndex.size;\n\t}\n\n\t/**\n\t * Gets the total number of subscriptions across all events.\n\t */\n\tget totalSubscriptionCount(): number {\n\t\tlet total = 0;\n\t\tfor (const subscribers of this.#subscriptionIndex.values()) {\n\t\t\ttotal += subscribers.size;\n\t\t}\n\t\treturn total;\n\t}\n\n\t/**\n\t * Checks if an event has any subscribers.\n\t *\n\t * @param eventName - The name of the event to check\n\t * @returns True if the event has at least one subscriber\n\t */\n\thasSubscribers(eventName: string): boolean {\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\treturn subscribers !== undefined && subscribers.size > 0;\n\t}\n}\n","/**\n * Persisted data structures for actors.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Schedule Event\n/** Scheduled event to be executed at a specific timestamp */\nexport interface PersistedScheduleEvent {\n\teventId: string;\n\ttimestamp: number;\n\taction: string;\n\targs?: Cbor;\n}\n\n// MARK: Actor\n/** State object that gets automatically persisted to storage */\nexport interface PersistedActor<S, I> {\n\t/** Input data passed to the actor on initialization */\n\tinput?: I;\n\thasInitialized: boolean;\n\tstate: S;\n\tscheduledEvents: PersistedScheduleEvent[];\n}\n\nexport function convertActorToBarePersisted<S, I>(\n\tpersist: PersistedActor<S, I>,\n): persistSchema.Actor {\n\treturn {\n\t\tinput:\n\t\t\tpersist.input !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(persist.input))\n\t\t\t\t: null,\n\t\thasInitialized: persist.hasInitialized,\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tscheduledEvents: persist.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: BigInt(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? null,\n\t\t})),\n\t};\n}\n\nexport function convertActorFromBarePersisted<S, I>(\n\tbareData: persistSchema.Actor,\n): PersistedActor<S, I> {\n\treturn {\n\t\tinput: bareData.input\n\t\t\t? cbor.decode(new Uint8Array(bareData.input))\n\t\t\t: undefined,\n\t\thasInitialized: bareData.hasInitialized,\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tscheduledEvents: bareData.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: Number(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? undefined,\n\t\t})),\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport { isCborSerializable } from \"@/common/utils\";\nimport {\n\tCURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,\n\tQUEUE_MESSAGE_VERSIONED,\n\tQUEUE_METADATA_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { promiseWithResolvers } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport {\n\tdecodeQueueMessageKey,\n\tmakeQueueMessageKey,\n\tqueueMessagesPrefix,\n\tqueueMetadataKey,\n} from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\n\nexport interface QueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n}\n\ninterface QueueMetadata {\n\tnextId: bigint;\n\tsize: number;\n}\n\ninterface QueueWaiter {\n\tid: string;\n\tnameSet?: Set<string>;\n\tcount: number;\n\tcompletable: boolean;\n\tresolve: (messages: QueueMessage[]) => void;\n\treject: (error: Error) => void;\n}\n\ninterface MessageListener {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tactorAbortCleanup?: () => void;\n\tsignal?: AbortSignal;\n\tsignalAbortCleanup?: () => void;\n}\n\nconst DEFAULT_METADATA: QueueMetadata = {\n\tnextId: 1n,\n\tsize: 0,\n};\n\nconst QUEUE_METADATA_KEY = queueMetadataKey();\nconst QUEUE_MESSAGES_PREFIX = queueMessagesPrefix();\n\ninterface PendingCompletion {\n\tresolve: (result: {\n\t\tstatus: \"completed\" | \"timedOut\";\n\t\tresponse?: unknown;\n\t}) => void;\n\ttimeoutHandle?: ReturnType<typeof setTimeout>;\n}\n\nexport class QueueManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#driver: ActorDriver;\n\t#waiters = new Map<string, QueueWaiter>();\n\t#metadata: QueueMetadata = { ...DEFAULT_METADATA };\n\t#messageListeners = new Set<MessageListener>();\n\t#pendingCompletions = new Map<string, PendingCompletion>();\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tdriver: ActorDriver,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#driver = driver;\n\t}\n\n\t/** Returns the current number of messages in the queue. */\n\tget size(): number {\n\t\treturn this.#metadata.size;\n\t}\n\n\t/** Loads queue metadata from storage and initializes internal state. */\n\tasync initialize(): Promise<void> {\n\t\tconst [metadataBuffer] = await this.#driver.kvBatchGet(this.#actor.id, [\n\t\t\tQUEUE_METADATA_KEY,\n\t\t]);\n\t\tif (!metadataBuffer) {\n\t\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t\t]);\n\t\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst decoded =\n\t\t\t\tQUEUE_METADATA_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tmetadataBuffer,\n\t\t\t\t);\n\t\t\tthis.#metadata.nextId = decoded.nextId;\n\t\t\tthis.#metadata.size = Number(decoded.size);\n\t\t} catch (error) {\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"failed to decode queue metadata, rebuilding from messages\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\tawait this.#rebuildMetadata();\n\t\t}\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\t/** Adds a message to the queue with the given name and body. */\n\tasync enqueue(name: string, body: unknown): Promise<QueueMessage> {\n\t\tthis.#actor.assertReady();\n\n\t\tconst sizeLimit = this.#actor.config.options.maxQueueSize;\n\t\tif (this.#metadata.size >= sizeLimit) {\n\t\t\tthrow new errors.QueueFull(sizeLimit);\n\t\t}\n\n\t\tlet invalidPath = \"\";\n\t\tif (\n\t\t\t!isCborSerializable(body, (path) => {\n\t\t\t\tinvalidPath = path;\n\t\t\t})\n\t\t) {\n\t\t\tthrow new errors.QueueMessageInvalid(invalidPath);\n\t\t}\n\n\t\tconst createdAt = Date.now();\n\t\tconst bodyCborBuffer = cbor.encode(body);\n\t\tconst encodedMessage =\n\t\t\tQUEUE_MESSAGE_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t\tbody: new Uint8Array(bodyCborBuffer).buffer as ArrayBuffer,\n\t\t\t\t\tcreatedAt: BigInt(createdAt),\n\t\t\t\t\tfailureCount: null,\n\t\t\t\t\tavailableAt: null,\n\t\t\t\t\tinFlight: null,\n\t\t\t\t\tinFlightAt: null,\n\t\t\t\t},\n\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t);\n\t\tconst encodedSize = encodedMessage.byteLength;\n\t\tif (encodedSize > this.#actor.config.options.maxQueueMessageSize) {\n\t\t\tthrow new errors.QueueMessageTooLarge(\n\t\t\t\tencodedSize,\n\t\t\t\tthis.#actor.config.options.maxQueueMessageSize,\n\t\t\t);\n\t\t}\n\n\t\tconst id = this.#metadata.nextId;\n\t\tconst messageKey = makeQueueMessageKey(id);\n\n\t\t// Update metadata before writing so we can batch both writes\n\t\tthis.#metadata.nextId = id + 1n;\n\t\tthis.#metadata.size += 1;\n\t\tconst encodedMetadata = this.#serializeMetadata();\n\n\t\t// Batch write message and metadata together\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[messageKey, encodedMessage],\n\t\t\t[QUEUE_METADATA_KEY, encodedMetadata],\n\t\t]);\n\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\n\t\tconst message: QueueMessage = {\n\t\t\tid,\n\t\t\tname,\n\t\t\tbody,\n\t\t\tcreatedAt,\n\t\t};\n\n\t\tthis.#actor.resetSleepTimer();\n\t\tawait this.#maybeResolveWaiters();\n\t\tthis.#notifyMessageListeners(name);\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Adds a message and waits for completion.\n\t */\n\tasync enqueueAndWait(\n\t\tname: string,\n\t\tbody: unknown,\n\t\ttimeout?: number,\n\t): Promise<{ status: \"completed\" | \"timedOut\"; response?: unknown }> {\n\t\tif (timeout !== undefined && timeout <= 0) {\n\t\t\treturn { status: \"timedOut\" };\n\t\t}\n\n\t\tconst message = await this.enqueue(name, body);\n\t\tconst messageId = message.id.toString();\n\t\tconst { promise, resolve } = promiseWithResolvers<{\n\t\t\tstatus: \"completed\" | \"timedOut\";\n\t\t\tresponse?: unknown;\n\t\t}>(() => {});\n\n\t\tconst pending: PendingCompletion = { resolve };\n\t\tif (timeout !== undefined) {\n\t\t\tpending.timeoutHandle = setTimeout(() => {\n\t\t\t\tthis.#pendingCompletions.delete(messageId);\n\t\t\t\tresolve({ status: \"timedOut\" });\n\t\t\t}, timeout);\n\t\t}\n\t\tthis.#pendingCompletions.set(messageId, pending);\n\n\t\treturn await promise;\n\t}\n\n\tasync completeMessage(\n\t\tmessage: QueueMessage,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tawait this.completeMessageById(message.id, response);\n\t}\n\n\tasync completeMessageById(\n\t\tmessageId: bigint,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tconst messageIdString = messageId.toString();\n\t\tconst pending = this.#pendingCompletions.get(messageIdString);\n\t\tif (pending) {\n\t\t\tif (pending.timeoutHandle) {\n\t\t\t\tclearTimeout(pending.timeoutHandle);\n\t\t\t}\n\t\t\tthis.#pendingCompletions.delete(messageIdString);\n\t\t\tpending.resolve({ status: \"completed\", response });\n\t\t}\n\n\t\tawait this.deleteMessagesById([messageId]);\n\t}\n\n\t/** Receives messages from the queue matching the given names. Waits until messages are available or timeout is reached. */\n\tasync receive(\n\t\tnames: string[] | undefined,\n\t\tcount: number,\n\t\ttimeout?: number,\n\t\tabortSignal?: AbortSignal,\n\t\tcompletable = false,\n\t): Promise<QueueMessage[]> {\n\t\tthis.#actor.assertReady();\n\t\tconst limitedCount = Math.max(1, count);\n\t\tconst nameSet =\n\t\t\tnames && names.length > 0 ? new Set(names) : undefined;\n\n\t\tconst immediate = await this.#drainMessages(\n\t\t\tnameSet,\n\t\t\tlimitedCount,\n\t\t\tcompletable,\n\t\t);\n\t\tif (immediate.length > 0) {\n\t\t\treturn immediate;\n\t\t}\n\t\tif (timeout === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<\n\t\t\tQueueMessage[]\n\t\t>(() => {});\n\t\tconst waiterId = crypto.randomUUID();\n\t\tlet timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\t\tlet cleanedUp = false;\n\t\tlet actorAbortCleanup: (() => void) | undefined;\n\t\tlet signalAbortCleanup: (() => void) | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tif (cleanedUp) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanedUp = true;\n\t\t\tthis.#waiters.delete(waiterId);\n\t\t\tif (timeoutHandle) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\ttimeoutHandle = undefined;\n\t\t\t}\n\t\t\tactorAbortCleanup?.();\n\t\t\tsignalAbortCleanup?.();\n\t\t\tthis.#actor.endQueueWait();\n\t\t};\n\t\tconst resolveWaiter = (messages: QueueMessage[]) => {\n\t\t\tcleanup();\n\t\t\tresolve(messages);\n\t\t};\n\t\tconst rejectWaiter = (error: Error) => {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\n\t\tconst waiter: QueueWaiter = {\n\t\t\tid: waiterId,\n\t\t\tnameSet,\n\t\t\tcount: limitedCount,\n\t\t\tcompletable,\n\t\t\tresolve: resolveWaiter,\n\t\t\treject: rejectWaiter,\n\t\t};\n\n\t\tthis.#actor.beginQueueWait();\n\n\t\tif (timeout !== undefined) {\n\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\tresolveWaiter([]);\n\t\t\t}, timeout);\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\trejectWaiter(new errors.ActorAborted());\n\t\t};\n\t\tconst onStop = () => {\n\t\t\trejectWaiter(new errors.ActorAborted());\n\t\t};\n\t\tconst actorAbortSignal = this.#actor.abortSignal;\n\t\tif (actorAbortSignal.aborted) {\n\t\t\tonStop();\n\t\t\treturn promise;\n\t\t}\n\t\tactorAbortSignal.addEventListener(\"abort\", onStop, { once: true });\n\t\tactorAbortCleanup = () =>\n\t\t\tactorAbortSignal.removeEventListener(\"abort\", onStop);\n\n\t\tif (abortSignal) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tonAbort();\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t\tabortSignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tsignalAbortCleanup = () =>\n\t\t\t\tabortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\n\t\tthis.#waiters.set(waiterId, waiter);\n\t\treturn promise;\n\t}\n\n\tasync waitForNames(\n\t\tnames: readonly string[] | undefined,\n\t\tabortSignal?: AbortSignal,\n\t): Promise<void> {\n\t\tconst nameSet =\n\t\t\tnames && names.length > 0 ? new Set(names) : undefined;\n\t\tconst existing = await this.#loadQueueMessages();\n\t\tif (nameSet) {\n\t\t\tif (existing.some((message) => nameSet.has(message.name))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (existing.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn await new Promise<void>((resolve, reject) => {\n\t\t\tthis.#actor.beginQueueWait();\n\t\t\tconst listener: MessageListener = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeMessageListener(listener);\n\t\t\t\t\tthis.#actor.endQueueWait();\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeMessageListener(listener);\n\t\t\t\t\tthis.#actor.endQueueWait();\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst actorAbortSignal = this.#actor.abortSignal;\n\t\t\tconst onActorAbort = () =>\n\t\t\t\tlistener.reject(new errors.ActorAborted());\n\t\t\tif (actorAbortSignal.aborted) {\n\t\t\t\tonActorAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactorAbortSignal.addEventListener(\"abort\", onActorAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tlistener.actorAbortCleanup = () =>\n\t\t\t\tactorAbortSignal.removeEventListener(\"abort\", onActorAbort);\n\n\t\t\tif (abortSignal) {\n\t\t\t\tconst onAbort = () =>\n\t\t\t\t\tlistener.reject(new errors.ActorAborted());\n\t\t\t\tif (abortSignal.aborted) {\n\t\t\t\t\tonAbort();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tabortSignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\tlistener.signalAbortCleanup = () =>\n\t\t\t\t\tabortSignal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\n\t\t\tthis.#messageListeners.add(listener);\n\t\t});\n\t}\n\n\t/** Returns all messages currently in the queue without removing them. */\n\tasync getMessages(): Promise<QueueMessage[]> {\n\t\treturn await this.#loadQueueMessages();\n\t}\n\n\t/** Deletes messages matching the provided IDs. Returns the IDs that were removed. */\n\tasync deleteMessagesById(ids: bigint[]): Promise<bigint[]> {\n\t\tif (ids.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst idSet = new Set(ids.map((id) => id.toString()));\n\t\tconst entries = await this.#loadQueueMessages();\n\t\tconst toRemove = entries.filter((entry) =>\n\t\t\tidSet.has(entry.id.toString()),\n\t\t);\n\t\tif (toRemove.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tawait this.#removeMessages(toRemove);\n\t\treturn toRemove.map((entry) => entry.id);\n\t}\n\n\tasync #drainMessages(\n\t\tnameSet: Set<string> | undefined,\n\t\tcount: number,\n\t\tcompletable: boolean,\n\t): Promise<QueueMessage[]> {\n\t\tif (this.#metadata.size === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst entries = await this.#loadQueueMessages();\n\t\tconst matched = nameSet\n\t\t\t? entries.filter((entry) => nameSet.has(entry.name))\n\t\t\t: entries;\n\t\tif (matched.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst selected = matched.slice(0, count);\n\t\tif (!completable) {\n\t\t\tawait this.#removeMessages(selected);\n\t\t}\n\t\tconst now = Date.now();\n\t\tfor (const message of selected) {\n\t\t\tthis.#actor.emitTraceEvent(\"queue.message.receive\", {\n\t\t\t\t\"rivet.queue.name\": message.name,\n\t\t\t\t\"rivet.queue.message_id\": message.id.toString(),\n\t\t\t\t\"rivet.queue.created_at_ms\": message.createdAt,\n\t\t\t\t\"rivet.queue.latency_ms\": now - message.createdAt,\n\t\t\t});\n\t\t}\n\t\treturn selected;\n\t}\n\n\tasync #loadQueueMessages(): Promise<QueueMessage[]> {\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tQUEUE_MESSAGES_PREFIX,\n\t\t);\n\t\tconst decoded: QueueMessage[] = [];\n\t\tfor (const [key, value] of entries) {\n\t\t\ttry {\n\t\t\t\tconst messageId = decodeQueueMessageKey(key);\n\t\t\t\tconst decodedPayload =\n\t\t\t\t\tQUEUE_MESSAGE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t);\n\t\t\t\tconst body = cbor.decode(new Uint8Array(decodedPayload.body));\n\t\t\t\tdecoded.push({\n\t\t\t\t\tid: messageId,\n\t\t\t\t\tname: decodedPayload.name,\n\t\t\t\t\tbody,\n\t\t\t\t\tcreatedAt: Number(decodedPayload.createdAt),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"failed to decode queue message\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tdecoded.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n\t\tif (this.#metadata.size !== decoded.length) {\n\t\t\tthis.#metadata.size = decoded.length;\n\t\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t\t}\n\t\treturn decoded;\n\t}\n\n\t#removeMessageListener(listener: MessageListener): void {\n\t\tif (this.#messageListeners.delete(listener)) {\n\t\t\tlistener.actorAbortCleanup?.();\n\t\t\tlistener.signalAbortCleanup?.();\n\t\t}\n\t}\n\n\t#notifyMessageListeners(name: string): void {\n\t\tif (this.#messageListeners.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const listener of [...this.#messageListeners]) {\n\t\t\tif (listener.nameSet && !listener.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#removeMessageListener(listener);\n\t\t\tlistener.resolve();\n\t\t}\n\t}\n\n\tasync #removeMessages(messages: QueueMessage[]): Promise<void> {\n\t\tif (messages.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst keys = messages.map((message) => makeQueueMessageKey(message.id));\n\n\t\t// Update metadata\n\t\tthis.#metadata.size = Math.max(\n\t\t\t0,\n\t\t\tthis.#metadata.size - messages.length,\n\t\t);\n\n\t\t// Delete messages and update metadata\n\t\t// Note: kvBatchDelete doesn't support mixed operations, so we do two calls\n\t\tawait this.#driver.kvBatchDelete(this.#actor.id, keys);\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t]);\n\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\tasync #maybeResolveWaiters() {\n\t\tif (this.#waiters.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst pending = [...this.#waiters.values()];\n\t\tfor (const waiter of pending) {\n\t\t\tconst messages = await this.#drainMessages(\n\t\t\t\twaiter.nameSet,\n\t\t\t\twaiter.count,\n\t\t\t\twaiter.completable,\n\t\t\t);\n\t\t\tif (messages.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#waiters.delete(waiter.id);\n\t\t\twaiter.resolve(messages);\n\t\t}\n\t}\n\n\t/** Rebuilds metadata by scanning existing queue messages. Used when metadata is corrupted. */\n\tasync #rebuildMetadata(): Promise<void> {\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tQUEUE_MESSAGES_PREFIX,\n\t\t);\n\n\t\tlet maxId = 0n;\n\t\tfor (const [key] of entries) {\n\t\t\ttry {\n\t\t\t\tconst messageId = decodeQueueMessageKey(key);\n\t\t\t\tif (messageId > maxId) {\n\t\t\t\t\tmaxId = messageId;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Skip malformed keys\n\t\t\t}\n\t\t}\n\n\t\tthis.#metadata.nextId = maxId + 1n;\n\t\tthis.#metadata.size = entries.length;\n\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t]);\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\t#serializeMetadata(): Uint8Array {\n\t\treturn QUEUE_METADATA_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t{\n\t\t\t\tnextId: this.#metadata.nextId,\n\t\t\t\tsize: this.#metadata.size,\n\t\t\t},\n\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t);\n\t}\n\n}\n","import * as cbor from \"cbor-x\";\nimport {\n\tbufferToArrayBuffer,\n\tSinglePromiseQueue,\n\tstringifyError,\n} from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport type { ActorInstance } from \"./mod\";\nimport type { PersistedScheduleEvent } from \"./persisted\";\n\n/**\n * Manages scheduled events and alarms for actor instances.\n * Handles event scheduling, alarm triggers, and automatic event execution.\n */\nexport class ScheduleManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#actorDriver: ActorDriver;\n\t#alarmWriteQueue = new SinglePromiseQueue();\n\t#config: any; // ActorConfig type\n\t#persist: any; // Reference to PersistedActor\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Sets the persist object reference.\n\t * Called after StateManager initializes the persist proxy.\n\t */\n\tsetPersist(persist: any) {\n\t\tthis.#persist = persist;\n\t}\n\n\t/**\n\t * Schedules an event to be executed at a specific timestamp.\n\t *\n\t * @param timestamp - Unix timestamp in milliseconds when the event should fire\n\t * @param action - The name of the action to execute\n\t * @param args - Arguments to pass to the action\n\t */\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tconst newEvent: PersistedScheduleEvent = {\n\t\t\teventId: crypto.randomUUID(),\n\t\t\ttimestamp,\n\t\t\taction,\n\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t};\n\n\t\tthis.#actor.emitTraceEvent(\"schedule.created\", {\n\t\t\t\"rivet.schedule.event_id\": newEvent.eventId,\n\t\t\t\"rivet.schedule.action\": newEvent.action,\n\t\t\t\"rivet.schedule.timestamp_ms\": newEvent.timestamp,\n\t\t});\n\n\t\tawait this.#scheduleEventInner(newEvent);\n\t}\n\n\t/**\n\t * Triggers any pending alarms that are due.\n\t * This method is idempotent and safe to call multiple times.\n\t */\n\tasync onAlarm(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"alarm triggered\",\n\t\t\tnow,\n\t\t\tevents: this.#persist?.scheduledEvents?.length || 0,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthis.#actor.rLog.debug({ msg: \"no scheduled events\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Find events that are due\n\t\tconst dueIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp <= now,\n\t\t);\n\n\t\tif (dueIndex === -1) {\n\t\t\t// No events are due yet\n\t\t\tthis.#actor.rLog.debug({ msg: \"no events are due yet\" });\n\n\t\t\t// Reschedule alarm for next event if any exist\n\t\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"alarm fired early, rescheduling for next event\",\n\t\t\t\t\tnow,\n\t\t\t\t\tnextTs,\n\t\t\t\t\tdelta: nextTs - now,\n\t\t\t\t});\n\t\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove and process due events\n\t\tconst dueEvents = this.#persist.scheduledEvents.splice(0, dueIndex + 1);\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"running events\",\n\t\t\tcount: dueEvents.length,\n\t\t});\n\n\t\t// Schedule next alarm if more events remain\n\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting next alarm\",\n\t\t\t\tnextTs,\n\t\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t}\n\n\t\t// Execute due events\n\t\tawait this.#executeDueEvents(dueEvents);\n\t}\n\n\t/**\n\t * Initializes alarms on actor startup.\n\t * Sets the alarm for the next scheduled event if any exist.\n\t */\n\tasync initializeAlarms(): Promise<void> {\n\t\tif (this.#persist?.scheduledEvents?.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending alarm write operations to complete.\n\t */\n\tasync waitForPendingAlarmWrites(): Promise<void> {\n\t\tif (this.#alarmWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#alarmWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t/**\n\t * Gets statistics about scheduled events.\n\t */\n\tgetScheduleStats(): {\n\t\ttotalEvents: number;\n\t\tnextEventTime: number | null;\n\t\toverdueCount: number;\n\t} {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn {\n\t\t\t\ttotalEvents: 0,\n\t\t\t\tnextEventTime: null,\n\t\t\t\toverdueCount: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst events = this.#persist.scheduledEvents;\n\n\t\treturn {\n\t\t\ttotalEvents: events.length,\n\t\t\tnextEventTime: events.length > 0 ? events[0].timestamp : null,\n\t\t\toverdueCount: events.filter(\n\t\t\t\t(e: PersistedScheduleEvent) => e.timestamp <= now,\n\t\t\t).length,\n\t\t};\n\t}\n\n\t/**\n\t * Cancels a scheduled event by its ID.\n\t *\n\t * @param eventId - The ID of the event to cancel\n\t * @returns True if the event was found and cancelled\n\t */\n\tasync cancelEvent(eventId: string): Promise<boolean> {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst index = this.#persist.scheduledEvents.findIndex(\n\t\t\t(e: PersistedScheduleEvent) => e.eventId === eventId,\n\t\t);\n\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove the event\n\t\tconst wasFirst = index === 0;\n\t\tthis.#persist.scheduledEvents.splice(index, 1);\n\n\t\t// If we removed the first event, update the alarm\n\t\tif (wasFirst && this.#persist.scheduledEvents.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"cancelled scheduled event\",\n\t\t\teventId,\n\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t// MARK: - Private Helpers\n\n\tasync #scheduleEventInner(newEvent: PersistedScheduleEvent): Promise<void> {\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"scheduling event\",\n\t\t\teventId: newEvent.eventId,\n\t\t\ttimestamp: newEvent.timestamp,\n\t\t\taction: newEvent.action,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthrow new Error(\"Persist not initialized\");\n\t\t}\n\n\t\t// Find insertion point (events are sorted by timestamp)\n\t\tconst insertIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp > newEvent.timestamp,\n\t\t);\n\n\t\tif (insertIndex === -1) {\n\t\t\t// Add to end\n\t\t\tthis.#persist.scheduledEvents.push(newEvent);\n\t\t} else {\n\t\t\t// Insert at correct position\n\t\t\tthis.#persist.scheduledEvents.splice(insertIndex, 0, newEvent);\n\t\t}\n\n\t\t// Update alarm if this is the newest event\n\t\tif (insertIndex === 0 || this.#persist.scheduledEvents.length === 1) {\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting alarm for new event\",\n\t\t\t\ttimestamp: newEvent.timestamp,\n\t\t\t\teventCount: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(newEvent.timestamp);\n\t\t}\n\t}\n\n\tasync #executeDueEvents(events: PersistedScheduleEvent[]): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tconst span = this.#actor.startTraceSpan(\n\t\t\t\t`actor.action.${event.action}`,\n\t\t\t\t{\n\t\t\t\t\t\"rivet.action.name\": event.action,\n\t\t\t\t\t\"rivet.action.scheduled\": true,\n\t\t\t\t\t\"rivet.schedule.event_id\": event.eventId,\n\t\t\t\t\t\"rivet.schedule.timestamp_ms\": event.timestamp,\n\t\t\t\t},\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"schedule.triggered\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"rivet.schedule.event_id\": event.eventId,\n\t\t\t\t\t\t\"rivet.schedule.action\": event.action,\n\t\t\t\t\t\t\"rivet.schedule.timestamp_ms\": event.timestamp,\n\t\t\t\t\t},\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tthis.#actor.log.info({\n\t\t\t\t\tmsg: \"executing scheduled event\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Look up the action function\n\t\t\t\tconst actions = this.#config.actions ?? {};\n\t\t\t\tconst fn = actions[event.action];\n\n\t\t\t\tif (!fn) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Missing action for scheduled event: ${event.action}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (typeof fn !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Scheduled event action ${event.action} is not a function (got ${typeof fn})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Decode arguments and execute\n\t\t\t\tconst args = event.args\n\t\t\t\t\t? cbor.decode(new Uint8Array(event.args))\n\t\t\t\t\t: [];\n\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tfn.call(undefined, this.#actor.actorContext, ...args),\n\t\t\t\t);\n\n\t\t\t\t// Handle async actions\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"scheduled event completed\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.traces.setAttributes(span, {\n\t\t\t\t\t\"error.message\": stringifyError(error),\n\t\t\t\t\t\"error.type\":\n\t\t\t\t\t\terror instanceof Error ? error.name : typeof error,\n\t\t\t\t});\n\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthis.#actor.log.error({\n\t\t\t\t\tmsg: \"error executing scheduled event\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Continue processing other events even if one fails\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #queueSetAlarm(timestamp: number): Promise<void> {\n\t\tawait this.#alarmWriteQueue.enqueue(async () => {\n\t\t\tawait this.#actorDriver.setAlarm(this.#actor, timestamp);\n\t\t});\n\t}\n\n\t/**\n\t * Gets the next scheduled event, if any.\n\t */\n\tgetNextEvent(): PersistedScheduleEvent | null {\n\t\tif (\n\t\t\t!this.#persist?.scheduledEvents ||\n\t\t\tthis.#persist.scheduledEvents.length === 0\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.#persist.scheduledEvents[0];\n\t}\n\n\t/**\n\t * Gets all scheduled events.\n\t */\n\tgetAllEvents(): PersistedScheduleEvent[] {\n\t\treturn this.#persist?.scheduledEvents || [];\n\t}\n\n\t/**\n\t * Clears all scheduled events.\n\t * Use with caution - this removes all pending scheduled events.\n\t */\n\tclearAllEvents(): void {\n\t\tif (this.#persist?.scheduledEvents) {\n\t\t\tthis.#persist.scheduledEvents = [];\n\t\t\tthis.#actor.log.warn({ msg: \"cleared all scheduled events\" });\n\t\t}\n\t}\n}\n","import { idToStr } from \"@rivetkit/engine-runner\";\nimport onChange from \"@rivetkit/on-change\";\nimport { isCborSerializable, stringifyError } from \"@/common/utils\";\nimport {\n\tCURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { promiseWithResolvers, SinglePromiseQueue } from \"@/utils\";\nimport { loggerWithoutContext } from \"@/actor/log\";\nimport { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from \"../conn/mod\";\nimport { convertConnToBarePersistedConn } from \"../conn/persisted\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { isConnStatePath, isStatePath } from \"../utils\";\nimport { KEYS, makeConnKey } from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\nimport { convertActorToBarePersisted, type PersistedActor } from \"./persisted\";\n\nexport interface SaveStateOptions {\n\t/**\n\t * Forces the state to be saved immediately. This function will return when the state has saved successfully.\n\t */\n\timmediate?: boolean;\n\t/** Bypass ready check for stopping. */\n\tallowStoppingState?: boolean;\n\t/**\n\t * Maximum time in milliseconds to wait before forcing a save.\n\t *\n\t * If a save is already scheduled to occur later than this deadline, it will be rescheduled earlier.\n\t */\n\tmaxWait?: number;\n}\n\n/**\n * Manages actor state persistence, proxying, and synchronization.\n * Handles automatic state change detection and throttled persistence to KV storage.\n */\nexport class StateManager<\n\tS,\n\tCP,\n\tCS,\n\tI,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, any, I, any, E, Q>;\n\t#actorDriver: ActorDriver;\n\n\t// State tracking\n\t#persist!: PersistedActor<S, I>;\n\t#persistRaw!: PersistedActor<S, I>;\n\t#persistChanged = false;\n\t#isInOnStateChange = false;\n\n\t// Save management\n\t#persistWriteQueue = new SinglePromiseQueue();\n\t#lastSaveTime = 0;\n\t#pendingSaveTimeout?: NodeJS.Timeout;\n\t#pendingSaveScheduledTimestamp?: number;\n\t#onPersistSavedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t// Configuration\n\t#config: any; // ActorConfig type\n\t#stateSaveInterval: number;\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, any, I, any, E, Q>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t\tthis.#stateSaveInterval = config.options.stateSaveInterval || 100;\n\t}\n\n\t// MARK: - Public API\n\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.#persist;\n\t}\n\n\tget persistRaw(): PersistedActor<S, I> {\n\t\treturn this.#persistRaw;\n\t}\n\n\tget persistChanged(): boolean {\n\t\treturn this.#persistChanged;\n\t}\n\n\tget state(): S {\n\t\tthis.#validateStateEnabled();\n\t\treturn this.#persist.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.#persist.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn \"createState\" in this.#config || \"state\" in this.#config;\n\t}\n\n\t// MARK: - Initialization\n\n\t/**\n\t * Initializes state from persisted data or creates new state.\n\t */\n\tasync initializeState(persistData: PersistedActor<S, I>): Promise<void> {\n\t\tif (!persistData.hasInitialized) {\n\t\t\t// Create initial state\n\t\t\tlet stateData: unknown;\n\t\t\tif (this.stateEnabled) {\n\t\t\t\tthis.#actor.rLog.info({ msg: \"actor state initializing\" });\n\n\t\t\t\tif (\"createState\" in this.#config) {\n\t\t\t\t\tstateData = await this.#actor.runInTraceSpan(\n\t\t\t\t\t\t\"actor.createState\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tthis.#config.createState!(\n\t\t\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\t\t\tpersistData.input!,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (\"state\" in this.#config) {\n\t\t\t\t\tstateData = structuredClone(this.#config.state);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Both 'createState' or 'state' were not defined\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({ msg: \"state not enabled\" });\n\t\t\t}\n\n\t\t\t// Update persisted data\n\t\t\tpersistData.state = stateData as S;\n\t\t\tpersistData.hasInitialized = true;\n\n\t\t\t// Save initial state\n\t\t\t//\n\t\t\t// We don't use #savePersistInner because the actor is not fully\n\t\t\t// initialized yet\n\t\t\tconst bareData = convertActorToBarePersisted<S, I>(persistData);\n\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[\n\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\tbareData,\n\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t]);\n\t\t}\n\n\t\t// Initialize proxy\n\t\tthis.initPersistProxy(persistData);\n\t}\n\n\t/**\n\t * Creates proxy for persist object that handles automatic state change detection.\n\t */\n\tinitPersistProxy(target: PersistedActor<S, I>) {\n\t\t// Set raw persist object\n\t\tthis.#persistRaw = target;\n\n\t\t// Validate serializability\n\t\tif (target === null || typeof target !== \"object\") {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\ttarget,\n\t\t\t\t\t(path) => {\n\t\t\t\t\t\tinvalidPath = path;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({ path: invalidPath });\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\t// Unsubscribe from old state\n\t\tif (this.#persist) {\n\t\t\tonChange.unsubscribe(this.#persist);\n\t\t}\n\n\t\t// Listen for changes to automatically write state\n\t\tthis.#persist = onChange(\n\t\t\ttarget,\n\t\t\t(\n\t\t\t\tpath: string,\n\t\t\t\tvalue: any,\n\t\t\t\t_previousValue: any,\n\t\t\t\t_applyData: any,\n\t\t\t) => {\n\t\t\t\tthis.#handleStateChange(path, value);\n\t\t\t},\n\t\t\t{ ignoreDetached: true },\n\t\t);\n\t}\n\n\t// MARK: - State Persistence\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\tthis.#actor.assertReady(opts.allowStoppingState);\n\n\t\tif (this.#persistChanged) {\n\t\t\tif (opts.immediate) {\n\t\t\t\tawait this.#savePersistInner();\n\t\t\t} else {\n\t\t\t\t// Create promise for waiting\n\t\t\t\tif (!this.#onPersistSavedPromise) {\n\t\t\t\t\tthis.#onPersistSavedPromise = promiseWithResolvers((reason) => loggerWithoutContext().warn({ msg: \"unhandled persist saved promise rejection\", reason }));\n\t\t\t\t}\n\n\t\t\t\t// Save throttled\n\t\t\t\tthis.savePersistThrottled(opts.maxWait);\n\n\t\t\t\t// Wait for save\n\t\t\t\tawait this.#onPersistSavedPromise?.promise;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Throttled save state method. Used to write to KV at a reasonable cadence.\n\t *\n\t * Passing a maxWait will override the stateSaveInterval with the min\n\t * between that and the maxWait.\n\t */\n\tsavePersistThrottled(maxWait?: number) {\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastSave = now - this.#lastSaveTime;\n\n\t\t// Calculate when the save should happen based on throttle interval\n\t\tlet saveDelay = Math.max(\n\t\t\t0,\n\t\t\tthis.#stateSaveInterval - timeSinceLastSave,\n\t\t);\n\t\tif (maxWait !== undefined) {\n\t\t\tsaveDelay = Math.min(saveDelay, maxWait);\n\t\t}\n\n\t\t// Check if we need to reschedule the same timeout\n\t\tif (\n\t\t\tthis.#pendingSaveTimeout !== undefined &&\n\t\t\tthis.#pendingSaveScheduledTimestamp !== undefined\n\t\t) {\n\t\t\t// Check if we have an earlier save deadline\n\t\t\tconst newScheduledTimestamp = now + saveDelay;\n\t\t\tif (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {\n\t\t\t\t// Cancel existing timeout and reschedule\n\t\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t} else {\n\t\t\t\t// Current schedule is fine, don't reschedule\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (saveDelay > 0) {\n\t\t\t// Schedule save\n\t\t\tthis.#pendingSaveScheduledTimestamp = now + saveDelay;\n\t\t\tthis.#pendingSaveTimeout = setTimeout(() => {\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t\tthis.#savePersistInner().catch((error) => {\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"error saving persist data in scheduled save\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}, saveDelay);\n\t\t} else {\n\t\t\t// Save immediately\n\t\t\tthis.#savePersistInner().catch((error) => {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error saving persist data immediately\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Clears any pending save timeout.\n\t */\n\tclearPendingSaveTimeout() {\n\t\tif (this.#pendingSaveTimeout) {\n\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending write operations to complete.\n\t */\n\tasync waitForPendingWrites(): Promise<void> {\n\t\tif (this.#persistWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#persistWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\t#validateStateEnabled() {\n\t\tif (!this.stateEnabled) {\n\t\t\tthrow new errors.StateNotEnabled();\n\t\t}\n\t}\n\n\t#handleStateChange(path: string, value: any) {\n\t\tconst actorStatePath = isStatePath(path);\n\t\tconst connStatePath = isConnStatePath(path);\n\n\t\t// Validate CBOR serializability\n\t\tif (actorStatePath || connStatePath) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"onChange triggered, setting persistChanged=true\",\n\t\t\tpath,\n\t\t});\n\t\tthis.#persistChanged = true;\n\n\t\t// Inform inspector about state changes\n\t\tif (actorStatePath) {\n\t\t\tthis.#actor.inspector.emitter.emit(\n\t\t\t\t\"stateUpdated\",\n\t\t\t\tthis.#persist.state,\n\t\t\t);\n\t\t}\n\n\t\t// Call onStateChange lifecycle hook\n\t\tif (\n\t\t\tactorStatePath &&\n\t\t\tthis.#config.onStateChange &&\n\t\t\tthis.#actor.isReady() &&\n\t\t\t!this.#isInOnStateChange\n\t\t) {\n\t\t\tconst span = this.#actor.startTraceSpan(\"actor.onStateChange\", {\n\t\t\t\t\"rivet.state.path\": path,\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tthis.#isInOnStateChange = true;\n\t\t\t\tthis.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#config.onStateChange!(\n\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\tthis.#persistRaw.state,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error in `_onStateChange`\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tthis.#isInOnStateChange = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #savePersistInner() {\n\t\tthis.#actor.rLog.info({\n\t\t\tmsg: \"savePersistInner called\",\n\t\t\tpersistChanged: this.#persistChanged,\n\t\t\tconnsWithPersistChangedSize:\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size,\n\t\t\tconnsWithPersistChangedIds: Array.from(\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged,\n\t\t\t),\n\t\t});\n\n\t\ttry {\n\t\t\tthis.#lastSaveTime = Date.now();\n\n\t\t\t// Check if either actor state or connections have changed\n\t\t\tconst hasChanges =\n\t\t\t\tthis.#persistChanged ||\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size > 0;\n\n\t\t\tif (hasChanges) {\n\t\t\t\tawait this.#persistWriteQueue.enqueue(async () => {\n\t\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\t\tmsg: \"saving persist\",\n\t\t\t\t\t\tactorChanged: this.#persistChanged,\n\t\t\t\t\t\tconnectionsChanged:\n\t\t\t\t\t\t\tthis.#actor.connectionManager\n\t\t\t\t\t\t\t\t.connsWithPersistChanged.size,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst entries: Array<[Uint8Array, Uint8Array]> = [];\n\n\t\t\t\t\t// Build actor entries\n\t\t\t\t\tif (this.#persistChanged) {\n\t\t\t\t\t\tthis.#persistChanged = false;\n\t\t\t\t\t\tconst bareData = convertActorToBarePersisted<S, I>(\n\t\t\t\t\t\t\tthis.#persistRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tentries.push([\n\t\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Build connection entries\n\t\t\t\t\tconst connections: Array<AnyConn> = [];\n\t\t\t\t\tfor (const connId of this.#actor.connectionManager\n\t\t\t\t\t\t.connsWithPersistChanged) {\n\t\t\t\t\t\tconst conn = this.#actor.conns.get(connId);\n\t\t\t\t\t\tif (!conn) {\n\t\t\t\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\t\t\t\tmsg: \"connection not found in conns map\",\n\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst connStateManager =\n\t\t\t\t\t\t\tconn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\t\t\tconst hibernatableDataRaw =\n\t\t\t\t\t\t\tconnStateManager.hibernatableDataRaw;\n\t\t\t\t\t\tif (!hibernatableDataRaw) {\n\t\t\t\t\t\t\tthis.#actor.log.warn({\n\t\t\t\t\t\t\t\tmsg: \"missing raw hibernatable data for conn in getChangedConnectionsData\",\n\t\t\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\t\tmsg: \"persisting connection\",\n\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\tgatewayId: idToStr(hibernatableDataRaw.gatewayId),\n\t\t\t\t\t\t\trequestId: idToStr(hibernatableDataRaw.requestId),\n\t\t\t\t\t\t\tserverMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.serverMessageIndex,\n\t\t\t\t\t\t\tclientMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.clientMessageIndex,\n\t\t\t\t\t\t\thasState: hibernatableDataRaw.state !== undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst bareData = convertConnToBarePersistedConn<CP, CS>(\n\t\t\t\t\t\t\thibernatableDataRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst connData =\n\t\t\t\t\t\t\tCONN_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tentries.push([makeConnKey(connId), connData]);\n\t\t\t\t\t\tconnections.push(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"prepared entries for kvBatchPut\",\n\t\t\t\t\t\ttotalEntries: entries.length,\n\t\t\t\t\t\tconnectionEntries: connections.length,\n\t\t\t\t\t\tconnectionIds: connections.map((c) => c.id),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver before persisting connections\n\t\t\t\t\tif (this.#actorDriver.onBeforePersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onBeforePersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clear changed connections\n\t\t\t\t\tthis.#actor.connectionManager.clearConnWithPersistChanged();\n\n\t\t\t\t\t// Write data\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"calling kvBatchPut\",\n\t\t\t\t\t\tactorId: this.#actor.id,\n\t\t\t\t\t\tentriesCount: entries.length,\n\t\t\t\t\t});\n\t\t\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, entries);\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"kvBatchPut completed successfully\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver after persisting connections\n\t\t\t\t\tif (this.#actorDriver.onAfterPersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onAfterPersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.debug({ msg: \"persist saved\" });\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\tmsg: \"savePersistInner skipped - no changes\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.#onPersistSavedPromise?.resolve();\n\t\t} catch (error) {\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error saving persist\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#onPersistSavedPromise?.reject(error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n","import type { TracesDriver } from \"@rivetkit/traces\";\nimport type { ActorDriver } from \"../driver\";\nimport { tracesStoragePrefix } from \"./keys\";\n\nfunction concatPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {\n\tconst merged = new Uint8Array(prefix.length + key.length);\n\tmerged.set(prefix, 0);\n\tmerged.set(key, prefix.length);\n\treturn merged;\n}\n\nfunction stripPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {\n\treturn key.slice(prefix.length);\n}\n\nfunction compareBytes(a: Uint8Array, b: Uint8Array): number {\n\tconst len = Math.min(a.length, b.length);\n\tfor (let i = 0; i < len; i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\treturn a.length - b.length;\n}\n\nexport class ActorTracesDriver implements TracesDriver {\n\t#driver: ActorDriver;\n\t#actorId: string;\n\t#prefix: Uint8Array;\n\n\tconstructor(driver: ActorDriver, actorId: string) {\n\t\tthis.#driver = driver;\n\t\tthis.#actorId = actorId;\n\t\tthis.#prefix = tracesStoragePrefix();\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#driver.kvBatchGet(this.#actorId, [\n\t\t\tconcatPrefix(this.#prefix, key),\n\t\t]);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#driver.kvBatchPut(this.#actorId, [\n\t\t\t[concatPrefix(this.#prefix, key), value],\n\t\t]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#driver.kvBatchDelete(this.#actorId, [\n\t\t\tconcatPrefix(this.#prefix, key),\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst fullPrefix = concatPrefix(this.#prefix, prefix);\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tfullPrefix,\n\t\t);\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#driver.kvBatchDelete(\n\t\t\tthis.#actorId,\n\t\t\tentries.map(([key]) => key),\n\t\t);\n\t}\n\n\tasync list(\n\t\tprefix: Uint8Array,\n\t): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {\n\t\tconst fullPrefix = concatPrefix(this.#prefix, prefix);\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tfullPrefix,\n\t\t);\n\t\treturn entries.map(([key, value]) => ({\n\t\t\tkey: stripPrefix(this.#prefix, key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync listRange(\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t\toptions?: { reverse?: boolean; limit?: number },\n\t): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {\n\t\tconst fullStart = concatPrefix(this.#prefix, start);\n\t\tconst fullEnd = concatPrefix(this.#prefix, end);\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tthis.#prefix,\n\t\t);\n\t\tconst filtered = entries\n\t\t\t.filter(([key]) => {\n\t\t\t\treturn (\n\t\t\t\t\tcompareBytes(key, fullStart) >= 0 &&\n\t\t\t\t\tcompareBytes(key, fullEnd) < 0\n\t\t\t\t);\n\t\t\t})\n\t\t\t.sort(([keyA], [keyB]) => compareBytes(keyA, keyB));\n\t\tif (options?.reverse) {\n\t\t\tfiltered.reverse();\n\t\t}\n\t\tconst limited = options?.limit\n\t\t\t? filtered.slice(0, options.limit)\n\t\t\t: filtered;\n\t\treturn limited.map(([key, value]) => ({\n\t\t\tkey: stripPrefix(this.#prefix, key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(writes: Array<{ key: Uint8Array; value: Uint8Array }>): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#driver.kvBatchPut(\n\t\t\tthis.#actorId,\n\t\t\twrites.map(({ key, value }) => [\n\t\t\t\tconcatPrefix(this.#prefix, key),\n\t\t\t\tvalue,\n\t\t\t]),\n\t\t);\n\t}\n}\n","import type { RegistryConfig } from \"@/registry/config\";\nimport { DeepMutable } from \"@/utils\";\nimport type { Actions, ActorConfig } from \"./config\";\nimport type { ActionContextOf, ActorContext } from \"./contexts\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { ActorInstance } from \"./instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"./schema\";\n\nexport type AnyActorDefinition = ActorDefinition<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport class ActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\tR extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> {\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#config = config;\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#config;\n\t}\n\n\tinstantiate(): ActorInstance<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn new ActorInstance(this.#config);\n\t}\n}\n\nexport function lookupInRegistry(\n\tconfig: RegistryConfig,\n\tname: string,\n): AnyActorDefinition {\n\t// Build actor\n\tconst definition = config.use[name];\n\tif (!definition) throw new Error(`no actor in registry for name ${name}`);\n\treturn definition;\n}\n","import { Hono } from \"hono\";\nimport {\n\ttype ActionOpts,\n\ttype ActionOutput,\n\ttype ConnsMessageOpts,\n\thandleAction,\n\thandleQueueSend,\n\thandleRawRequest,\n} from \"@/actor/router-endpoints\";\n\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nimport {\n\thandleRouteError,\n\thandleRouteNotFound,\n\tloggerMiddleware,\n} from \"@/common/router\";\nimport { noopNext } from \"@/common/utils\";\nimport { inspectorLogger } from \"@/inspector/log\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport { getNodeEnv } from \"@/utils/env-vars\";\n\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { type GetUpgradeWebSocket, VERSION } from \"@/utils\";\nimport { CONN_DRIVER_SYMBOL } from \"./conn/mod\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport {\n\tparseWebSocketProtocols,\n\trouteWebSocket,\n} from \"./router-websocket-endpoints\";\n\nexport type { ActionOpts, ActionOutput, ConnsMessageOpts };\n\ninterface ActorRouterBindings {\n\tactorId: string;\n}\n\nexport type ActorRouter = Hono<{ Bindings: ActorRouterBindings }>;\n\nexport interface MetadataResponse {\n\truntime: string;\n\tversion: string;\n}\n\n/**\n * Creates a router that runs on the partitioned instance.\n *\n * You only need to pass `getUpgradeWebSocket` if this router is exposed\n * directly publicly. Usually WebSockets are routed manually in the\n * ManagerDriver instead of via Hono. The only platform that uses this\n * currently is Cloudflare Workers.\n */\nexport function createActorRouter(\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tisTest: boolean,\n): ActorRouter {\n\tconst router = new Hono<{ Bindings: ActorRouterBindings }>({\n\t\tstrict: false,\n\t});\n\n\trouter.use(\"*\", loggerMiddleware(loggerWithoutContext()));\n\n\t// Track all HTTP requests to prevent actor from sleeping during active requests\n\trouter.use(\"*\", async (c, next) => {\n\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\tactor.beginHonoHttpRequest();\n\t\ttry {\n\t\t\tawait next();\n\t\t} finally {\n\t\t\tactor.endHonoHttpRequest();\n\t\t}\n\t});\n\n\trouter.get(\"/\", (c) => {\n\t\treturn c.text(\n\t\t\t\"This is an RivetKit actor.\\n\\nLearn more at https://rivetkit.org\",\n\t\t);\n\t});\n\n\trouter.get(\"/health\", (c) => {\n\t\treturn c.text(\"ok\");\n\t});\n\n\trouter.get(\"/metadata\", async (c) => {\n\t\treturn c.json({\n\t\t\truntime: \"rivetkit\",\n\t\t\tversion: VERSION,\n\t\t} satisfies MetadataResponse);\n\t});\n\n\tif (isTest) {\n\t\t// Test endpoint to force disconnect a connection non-cleanly\n\t\trouter.post(\"/.test/force-disconnect\", async (c) => {\n\t\t\tconst connId = c.req.query(\"conn\");\n\n\t\t\tif (!connId) {\n\t\t\t\treturn c.text(\"Missing conn query parameter\", 400);\n\t\t\t}\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst conn = actor.connectionManager.getConnForId(connId);\n\n\t\t\tif (!conn) {\n\t\t\t\treturn c.text(`Connection not found: ${connId}`, 404);\n\t\t\t}\n\n\t\t\t// Force close the connection without clean shutdown\n\t\t\tif (conn[CONN_DRIVER_SYMBOL]?.terminate) {\n\t\t\t\tconn[CONN_DRIVER_SYMBOL].terminate(actor, conn);\n\t\t\t}\n\n\t\t\treturn c.json({ success: true });\n\t\t});\n\t}\n\n\t// Route all WebSocket paths using the same handler\n\t//\n\t// All WebSockets use a separate underlying router in routeWebSocket since\n\t// WebSockets also need to be routed from ManagerDriver.proxyWebSocket and\n\t// ManagerDriver.openWebSocket.\n\tif (getUpgradeWebSocket) {\n\t\trouter.on(\n\t\t\t\"GET\",\n\t\t\t[PATH_CONNECT, `${PATH_WEBSOCKET_PREFIX}*`, PATH_INSPECTOR_CONNECT],\n\t\t\tasync (c) => {\n\t\t\t\tconst upgradeWebSocket = getUpgradeWebSocket();\n\t\t\t\tif (upgradeWebSocket) {\n\t\t\t\t\treturn upgradeWebSocket(async (c) => {\n\t\t\t\t\t\tconst protocols = c.req.header(\n\t\t\t\t\t\t\t\"sec-websocket-protocol\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst { encoding, connParams } =\n\t\t\t\t\t\t\tparseWebSocketProtocols(protocols);\n\n\t\t\t\t\t\treturn await routeWebSocket(\n\t\t\t\t\t\t\tc.req.raw,\n\t\t\t\t\t\t\tc.req.path,\n\t\t\t\t\t\t\tc.req.header(),\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\tactorDriver,\n\t\t\t\t\t\t\tc.env.actorId,\n\t\t\t\t\t\t\tencoding,\n\t\t\t\t\t\t\tconnParams,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t})(c, noopNext());\n\t\t\t\t} else {\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\"WebSockets are not enabled for this driver.\",\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t// Inspector HTTP endpoints for agent-based debugging\n\tif (config.inspector.enabled) {\n\t\t// Auth middleware for inspector routes\n\t\tconst inspectorAuth = async (c: any): Promise<Response | undefined> => {\n\t\t\tif (getNodeEnv() === \"development\" && !config.inspector.token()) {\n\t\t\t\tinspectorLogger().warn({\n\t\t\t\t\tmsg: \"RIVET_INSPECTOR_TOKEN is not set, skipping inspector auth in development mode\",\n\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst userToken = c.req.header(\"Authorization\")?.replace(\"Bearer \", \"\");\n\t\t\tif (!userToken) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\tconst inspectorToken = config.inspector.token();\n\t\t\tif (!inspectorToken) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\tif (!timingSafeEqual(userToken, inspectorToken)) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\trouter.get(\"/inspector/state\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst isStateEnabled = actor.inspector.isStateEnabled();\n\t\t\tconst state = isStateEnabled ? actor.inspector.getStateJson() : undefined;\n\t\t\treturn c.json({ state, isStateEnabled });\n\t\t});\n\n\t\trouter.patch(\"/inspector/state\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst body = await c.req.json<{ state: unknown }>();\n\t\t\tawait actor.inspector.setStateJson(body.state);\n\t\t\treturn c.json({ ok: true });\n\t\t});\n\n\t\trouter.get(\"/inspector/connections\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst connections = actor.inspector.getConnectionsJson();\n\t\t\treturn c.json({ connections });\n\t\t});\n\n\t\trouter.get(\"/inspector/rpcs\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst rpcs = actor.inspector.getRpcs();\n\t\t\treturn c.json({ rpcs });\n\t\t});\n\n\t\trouter.post(\"/inspector/action/:name\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst name = c.req.param(\"name\");\n\t\t\tconst body = await c.req.json<{ args: unknown[] }>();\n\t\t\tconst output = await actor.inspector.executeActionJson(\n\t\t\t\tname,\n\t\t\t\tbody.args ?? [],\n\t\t\t);\n\t\t\treturn c.json({ output });\n\t\t});\n\n\t\trouter.get(\"/inspector/queue\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst limit = parseInt(c.req.query(\"limit\") ?? \"50\", 10);\n\t\t\tconst status = await actor.inspector.getQueueStatusJson(limit);\n\t\t\treturn c.json(status);\n\t\t});\n\n\t\trouter.get(\"/inspector/traces\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst startMs = parseInt(c.req.query(\"startMs\") ?? \"0\", 10);\n\t\t\tconst endMs = parseInt(\n\t\t\t\tc.req.query(\"endMs\") ?? String(Date.now()),\n\t\t\t\t10,\n\t\t\t);\n\t\t\tconst limit = parseInt(c.req.query(\"limit\") ?? \"1000\", 10);\n\n\t\t\tawait actor.traces.flush();\n\t\t\tconst result = await actor.inspector.getTracesJson({\n\t\t\t\tstartMs,\n\t\t\t\tendMs,\n\t\t\t\tlimit,\n\t\t\t});\n\t\t\treturn c.json(result);\n\t\t});\n\n\t\trouter.get(\"/inspector/workflow-history\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst result = actor.inspector.getWorkflowHistoryJson();\n\t\t\treturn c.json(result);\n\t\t});\n\n\t\trouter.get(\"/inspector/summary\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\n\t\t\tconst isStateEnabled = actor.inspector.isStateEnabled();\n\t\t\tconst isDatabaseEnabled = actor.inspector.isDatabaseEnabled();\n\t\t\tconst isWorkflowEnabled = actor.inspector.isWorkflowEnabled();\n\n\t\t\tconst state = isStateEnabled\n\t\t\t\t? actor.inspector.getStateJson()\n\t\t\t\t: undefined;\n\t\t\tconst connections = actor.inspector.getConnectionsJson();\n\t\t\tconst rpcs = actor.inspector.getRpcs();\n\t\t\tconst queueSize = actor.inspector.getQueueSize();\n\t\t\tconst workflowHistory = actor.inspector.getWorkflowHistory();\n\n\t\t\t// Convert BigInt values in workflow history to numbers for JSON serialization.\n\t\t\tconst bigIntReplacer = (_key: string, value: unknown) =>\n\t\t\t\ttypeof value === \"bigint\" ? Number(value) : value;\n\t\t\tconst safeWorkflowHistory = workflowHistory\n\t\t\t\t? JSON.parse(JSON.stringify(workflowHistory, bigIntReplacer))\n\t\t\t\t: null;\n\n\t\t\treturn c.json({\n\t\t\t\tstate,\n\t\t\t\tconnections,\n\t\t\t\trpcs,\n\t\t\t\tqueueSize,\n\t\t\t\tisStateEnabled,\n\t\t\t\tisDatabaseEnabled,\n\t\t\t\tisWorkflowEnabled,\n\t\t\t\tworkflowHistory: safeWorkflowHistory,\n\t\t\t});\n\t\t});\n\t}\n\n\trouter.post(\"/action/:action\", async (c) => {\n\t\tconst actionName = c.req.param(\"action\");\n\n\t\treturn handleAction(c, config, actorDriver, actionName, c.env.actorId);\n\t});\n\n\trouter.post(\"/queue\", async (c) => {\n\t\treturn handleQueueSend(c, config, actorDriver, c.env.actorId);\n\t});\n\n\trouter.post(\"/queue/:name\", async (c) => {\n\t\treturn handleQueueSend(\n\t\t\tc,\n\t\t\tconfig,\n\t\t\tactorDriver,\n\t\t\tc.env.actorId,\n\t\t\tc.req.param(\"name\"),\n\t\t);\n\t});\n\n\trouter.all(\"/request/*\", async (c) => {\n\t\t// TODO: This is not a clean way of doing this since `/http/` might exist mid-path\n\t\t// Strip the /http prefix from the URL to get the original path\n\t\tconst url = new URL(c.req.url);\n\t\tconst originalPath = url.pathname.replace(/^\\/request/, \"\") || \"/\";\n\n\t\t// Create a new request with the corrected URL\n\t\tconst correctedUrl = new URL(originalPath + url.search, url.origin);\n\t\tconst correctedRequest = new Request(correctedUrl, {\n\t\t\tmethod: c.req.method,\n\t\t\theaders: c.req.raw.headers,\n\t\t\tbody: c.req.raw.body,\n\t\t\tduplex: \"half\",\n\t\t} as RequestInit);\n\n\t\tloggerWithoutContext().debug({\n\t\t\tmsg: \"rewriting http url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: correctedRequest.url,\n\t\t});\n\n\t\treturn await handleRawRequest(\n\t\t\tc,\n\t\t\tcorrectedRequest,\n\t\t\tactorDriver,\n\t\t\tc.env.actorId,\n\t\t);\n\t});\n\n\trouter.notFound(handleRouteNotFound);\n\trouter.onError(handleRouteError);\n\n\treturn router;\n}\n","import { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport { getLogger } from \"./log\";\n\nfunction logger() {\n\treturn getLogger(\"inline-websocket-adapter\");\n}\n\n/**\n * InlineWebSocketAdapter creates two linked WebSocket objects:\n * - clientWs: for the client/proxy side (returned from openWebSocket)\n * - actorWs: for the actor side (passed via wsContext.raw)\n *\n * Each side's send() triggers the OTHER side's message event.\n */\nexport class InlineWebSocketAdapter {\n\t#handler: UpgradeWebSocketArgs;\n\t#wsContext: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 0;\n\n\t#clientWs: VirtualWebSocket;\n\t#actorWs: VirtualWebSocket;\n\n\tconstructor(handler: UpgradeWebSocketArgs) {\n\t\tthis.#handler = handler;\n\n\t\t// Create linked WebSocket pair\n\t\t// Client's send() -> handler.onMessage (for RPC) + Actor's message event (for raw WS)\n\t\t// Actor's send() -> Client's message event\n\t\tthis.#clientWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Call handler.onMessage for protocol-based connections (RPC)\n\t\t\t\t\tthis.#handler.onMessage({ data }, this.#wsContext);\n\t\t\t\t\t// Also trigger message event on actor's websocket for raw websocket handlers\n\t\t\t\t\tthis.#actorWs.triggerMessage(data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.#handleError(err);\n\t\t\t\t\tthis.#close(1011, \"Internal error processing message\");\n\t\t\t\t}\n\t\t\t},\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\tthis.#actorWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.#clientWs.triggerMessage(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\t// Create WSContext with actorWs as raw\n\t\tthis.#wsContext = new WSContext({\n\t\t\traw: this.#actorWs,\n\t\t\tsend: (data: string | ArrayBuffer | Uint8Array) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.send called\" });\n\t\t\t\tthis.#clientWs.triggerMessage(data);\n\t\t\t},\n\t\t\tclose: (code?: number, reason?: string) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.close called\", code, reason });\n\t\t\t\tthis.#close(code || 1000, reason || \"\");\n\t\t\t},\n\t\t\treadyState: 1,\n\t\t});\n\n\t\t// Defer initialization to allow event listeners to be attached first\n\t\tsetTimeout(() => {\n\t\t\tthis.#initialize();\n\t\t}, 0);\n\t}\n\n\t/** Get the client-side WebSocket (for proxy/client code) */\n\tget clientWebSocket(): UniversalWebSocket {\n\t\treturn this.#clientWs;\n\t}\n\n\t/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */\n\tget actorWebSocket(): UniversalWebSocket {\n\t\treturn this.#actorWs;\n\t}\n\n\tasync #initialize(): Promise<void> {\n\t\ttry {\n\t\t\tlogger().debug({ msg: \"websocket initializing\" });\n\n\t\t\tthis.#readyState = 1; // OPEN\n\n\t\t\tlogger().debug({ msg: \"calling handler.onOpen with WSContext\" });\n\t\t\tthis.#handler.onOpen(undefined, this.#wsContext);\n\n\t\t\t// Fire open event to both sides\n\t\t\tthis.#clientWs.triggerOpen();\n\t\t\tthis.#actorWs.triggerOpen();\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error during initialization\");\n\t\t}\n\t}\n\n\t#handleError(err: unknown): void {\n\t\tlogger().error({\n\t\t\tmsg: \"error in websocket\",\n\t\t\terror: err,\n\t\t\terrorMessage: err instanceof Error ? err.message : String(err),\n\t\t\tstack: err instanceof Error ? err.stack : undefined,\n\t\t});\n\n\t\t// Call handler.onError\n\t\ttry {\n\t\t\tthis.#handler.onError(err, this.#wsContext);\n\t\t} catch (handlerErr) {\n\t\t\tlogger().error({ msg: \"error in onError handler\", error: handlerErr });\n\t\t}\n\n\t\t// Fire error event to both sides\n\t\tthis.#clientWs.triggerError(err);\n\t\tthis.#actorWs.triggerError(err);\n\t}\n\n\t#close(code: number, reason: string): void {\n\t\tif (this.#readyState === 3 || this.#readyState === 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"closing websocket\", code, reason });\n\n\t\tthis.#readyState = 2; // CLOSING\n\n\t\ttry {\n\t\t\tthis.#handler.onClose({ code, reason, wasClean: true }, this.#wsContext);\n\t\t} catch (err) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error: err });\n\t\t} finally {\n\t\t\tthis.#readyState = 3; // CLOSED\n\n\t\t\t// Fire close event to both sides\n\t\t\tthis.#clientWs.triggerClose(code, reason);\n\t\t\tthis.#actorWs.triggerClose(code, reason);\n\t\t}\n\t}\n}\n\n/**\n * Creates an InlineWebSocketAdapter and returns the client-side WebSocket.\n * This is the main entry point for creating inline WebSocket connections.\n */\nexport function createInlineWebSocket(\n\thandler: UpgradeWebSocketArgs,\n): UniversalWebSocket {\n\tconst adapter = new InlineWebSocketAdapter(handler);\n\treturn adapter.clientWebSocket;\n}\n","import { z } from \"zod\";\nimport type { DriverConfig } from \"@/registry/config\";\nimport { importNodeDependencies } from \"@/utils/node\";\nimport { FileSystemActorDriver } from \"./actor\";\nimport {\n\ttype FileSystemDriverOptions,\n\tFileSystemGlobalState,\n} from \"./global-state\";\nimport { FileSystemManagerDriver } from \"./manager\";\n\nexport { FileSystemActorDriver } from \"./actor\";\nexport { FileSystemGlobalState } from \"./global-state\";\nexport { FileSystemManagerDriver } from \"./manager\";\nexport { getStoragePath } from \"./utils\";\n\nconst CreateFileSystemDriverOptionsSchema = z.object({\n\t/** Custom path for storage. */\n\tpath: z.string().optional(),\n\t/** Deprecated: file-system driver KV is now always SQLite-backed. */\n\tuseNativeSqlite: z.boolean().optional(),\n});\n\ntype CreateFileSystemDriverOptionsInput = z.input<\n\ttypeof CreateFileSystemDriverOptionsSchema\n>;\n\nexport function createFileSystemOrMemoryDriver(\n\tpersist: boolean = true,\n\toptions?: CreateFileSystemDriverOptionsInput,\n): DriverConfig {\n\timportNodeDependencies();\n\n\tif (options?.useNativeSqlite === false) {\n\t\tthrow new Error(\n\t\t\t\"File-system driver no longer supports non-SQLite KV storage. Remove useNativeSqlite: false.\",\n\t\t);\n\t}\n\n\tconst stateOptions: FileSystemDriverOptions = {\n\t\tpersist,\n\t\tcustomPath: options?.path,\n\t\tuseNativeSqlite: true,\n\t};\n\tconst state = new FileSystemGlobalState(stateOptions);\n\tconst driverConfig: DriverConfig = {\n\t\tname: persist ? \"file-system\" : \"memory\",\n\t\tdisplayName: persist ? \"File System\" : \"Memory\",\n\t\tmanager: (config) =>\n\t\t\tnew FileSystemManagerDriver(config, state, driverConfig),\n\t\tactor: (config, managerDriver, inlineClient) => {\n\t\t\tconst actorDriver = new FileSystemActorDriver(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t\tstate,\n\t\t\t);\n\n\t\t\tstate.onRunnerStart(config, inlineClient, actorDriver);\n\n\t\t\treturn actorDriver;\n\t\t},\n\t\tautoStartActorDriver: true,\n\t};\n\treturn driverConfig;\n}\n\nexport function createFileSystemDriver(\n\topts?: CreateFileSystemDriverOptionsInput,\n): DriverConfig {\n\tconst validatedOpts = opts\n\t\t? CreateFileSystemDriverOptionsSchema.parse(opts)\n\t\t: undefined;\n\treturn createFileSystemOrMemoryDriver(true, validatedOpts);\n}\n\nexport function createMemoryDriver(): DriverConfig {\n\treturn createFileSystemOrMemoryDriver(false);\n}\n","import type { AnyClient } from \"@/client/client\";\nimport type { RawDatabaseClient } from \"@/db/config\";\nimport type { SqliteVfs } from \"@rivetkit/sqlite-vfs\";\nimport type {\n\tActorDriver,\n\tAnyActorInstance,\n\tManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { FileSystemGlobalState } from \"./global-state\";\nimport { RegistryConfig } from \"@/registry/config\";\n\nexport type ActorDriverContext = Record<never, never>;\n\n/**\n * File System implementation of the Actor Driver\n */\nexport class FileSystemActorDriver implements ActorDriver {\n\t#config: RegistryConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: AnyClient;\n\t#state: FileSystemGlobalState;\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: AnyClient,\n\t\tstate: FileSystemGlobalState,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#state = state;\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\treturn this.#state.startActor(\n\t\t\tthis.#config,\n\t\t\tthis.#inlineClient,\n\t\t\tthis,\n\t\t\tactorId,\n\t\t);\n\t}\n\n\t/**\n\t * Get the current storage directory path\n\t */\n\tget storagePath(): string {\n\t\treturn this.#state.storagePath;\n\t}\n\n\tgetContext(_actorId: string): ActorDriverContext {\n\t\treturn {};\n\t}\n\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.#state.kvBatchPut(actorId, entries);\n\t}\n\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\treturn await this.#state.kvBatchGet(actorId, keys);\n\t}\n\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.#state.kvBatchDelete(actorId, keys);\n\t}\n\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\treturn await this.#state.kvListPrefix(actorId, prefix);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#state.setActorAlarm(actor.id, timestamp);\n\t}\n\n\t/** Creates a SQLite VFS instance for creating KV-backed databases */\n\tasync createSqliteVfs(): Promise<SqliteVfs> {\n\t\t// Dynamic import keeps @rivetkit/sqlite out of the main entrypoint bundle,\n\t\t// preserving tree-shakeability for environments that don't use SQLite.\n\t\t// The async @rivetkit/sqlite build is not re-entrant per module instance.\n\t\t// Returning a fresh SqliteVfs here gives each actor its own module,\n\t\t// allowing actor-level parallelism without cross-actor re-entry.\n\t\t//\n\t\t// The specifier is built via concatenation so that bundlers like\n\t\t// wrangler's esbuild cannot statically analyze and attempt to\n\t\t// bundle the module (it is never used on Cloudflare Workers).\n\t\tconst specifier = \"@rivetkit/\" + \"sqlite-vfs\";\n\t\tconst { SqliteVfs } = await import(specifier);\n\t\treturn new SqliteVfs();\n\t}\n\n\tstartSleep(actorId: string): void {\n\t\t// Spawns the sleepActor promise\n\t\tthis.#state.sleepActor(actorId);\n\t}\n\n\tasync startDestroy(actorId: string): Promise<void> {\n\t\tawait this.#state.destroyActor(actorId);\n\t}\n\n\tasync onBeforeActorStart(actor: AnyActorInstance): Promise<void> {\n\t\tawait actor.cleanupPersistedConnections(\"file-system-driver.start\");\n\t}\n}\n","import invariant from \"invariant\";\nimport { lookupInRegistry } from \"@/actor/definition\";\nimport { ActorDuplicateKey } from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { ActorKey } from \"@/actor/mod\";\nimport type { AnyClient } from \"@/client/client\";\nimport { type ActorDriver, getInitialActorKvState } from \"@/driver-helpers/mod\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport type * as schema from \"@/schemas/file-system-driver/mod\";\nimport {\n\tACTOR_ALARM_VERSIONED,\n\tACTOR_STATE_VERSIONED,\n\tCURRENT_VERSION as FILE_SYSTEM_DRIVER_CURRENT_VERSION,\n} from \"@/schemas/file-system-driver/versioned\";\nimport {\n\ttype LongTimeoutHandle,\n\tpromiseWithResolvers,\n\tsetLongTimeout,\n\tstringifyError,\n} from \"@/utils\";\nimport {\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodePath,\n} from \"@/utils/node\";\nimport { logger } from \"./log\";\nimport {\n\tensureDirectoryExists,\n\tensureDirectoryExistsSync,\n\tgetStoragePath,\n} from \"./utils\";\nimport {\n\tcomputePrefixUpperBound,\n\tensureUint8Array,\n\tloadSqliteRuntime,\n\ttype SqliteRuntime,\n\ttype SqliteRuntimeDatabase,\n} from \"./sqlite-runtime\";\nimport {\n\testimateKvSize,\n\tvalidateKvEntries,\n\tvalidateKvKey,\n\tvalidateKvKeys,\n} from \"./kv-limits\";\n\n// Actor handler to track running instances\n\nenum ActorLifecycleState {\n\tNONEXISTENT, // Entry exists but actor not yet created\n\tAWAKE, // Actor is running normally\n\tSTARTING_SLEEP, // Actor is being put to sleep\n\tSTARTING_DESTROY, // Actor is being destroyed\n\tDESTROYED, // Actor was destroyed, should not be recreated\n}\n\ninterface ActorEntry {\n\tid: string;\n\n\tstate?: schema.ActorState;\n\n\t/** Promise for loading the actor state. */\n\tloadPromise?: Promise<ActorEntry>;\n\n\tactor?: AnyActorInstance;\n\t/** Promise for starting the actor. */\n\tstartPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\t/** Promise for stopping the actor. */\n\tstopPromise?: PromiseWithResolvers<void>;\n\n\talarmTimeout?: LongTimeoutHandle;\n\t/** The timestamp currently scheduled for this actor's alarm (ms since epoch). */\n\talarmTimestamp?: number;\n\n\t/** Resolver for pending write operations that need to be notified when any write completes */\n\tpendingWriteResolver?: PromiseWithResolvers<void>;\n\n\tlifecycleState: ActorLifecycleState;\n\n\t// TODO: This might make sense to move in to actorstate, but we have a\n\t// single reader/writer so it's not an issue\n\t/** Generation of this actor when creating/destroying. */\n\tgeneration: string;\n}\n\nexport interface FileSystemDriverOptions {\n\t/** Whether to persist data to disk */\n\tpersist?: boolean;\n\t/** Custom path for storage */\n\tcustomPath?: string;\n\t/** Deprecated option retained for explicit migration to sqlite-only KV. */\n\tuseNativeSqlite?: boolean;\n}\n\n/**\n * Global state for the file system driver\n */\nexport class FileSystemGlobalState {\n\t#storagePath: string;\n\t#stateDir: string;\n\t#dbsDir: string;\n\t#alarmsDir: string;\n\n\t#persist: boolean;\n\t#sqliteRuntime: SqliteRuntime;\n\t#actorKvDatabases = new Map<string, SqliteRuntimeDatabase>();\n\n\t// IMPORTANT: Never delete from this map. Doing so will result in race\n\t// conditions since the actor generation will cease to be tracked\n\t// correctly. Always increment generation if a new actor is created.\n\t#actors = new Map<string, ActorEntry>();\n\n\t#actorCountOnStartup: number = 0;\n\n\t#runnerParams?: {\n\t\tconfig: RegistryConfig;\n\t\tinlineClient: AnyClient;\n\t\tactorDriver: ActorDriver;\n\t};\n\n\tget persist(): boolean {\n\t\treturn this.#persist;\n\t}\n\n\tget storagePath() {\n\t\treturn this.#storagePath;\n\t}\n\n\tget actorCountOnStartup() {\n\t\treturn this.#actorCountOnStartup;\n\t}\n\n\tconstructor(options: FileSystemDriverOptions = {}) {\n\t\tconst { persist = true, customPath, useNativeSqlite = true } = options;\n\t\tif (!useNativeSqlite) {\n\t\t\tthrow new Error(\n\t\t\t\t\"File-system driver no longer supports non-SQLite KV storage.\",\n\t\t\t);\n\t\t}\n\t\tthis.#persist = persist;\n\t\tthis.#sqliteRuntime = loadSqliteRuntime();\n\t\tthis.#storagePath = persist ? (customPath ?? getStoragePath()) : \"/tmp\";\n\t\tconst path = getNodePath();\n\t\tthis.#stateDir = path.join(this.#storagePath, \"state\");\n\t\tthis.#dbsDir = path.join(this.#storagePath, \"databases\");\n\t\tthis.#alarmsDir = path.join(this.#storagePath, \"alarms\");\n\n\t\tif (this.#persist) {\n\t\t\t// Ensure storage directories exist synchronously during initialization\n\t\t\tensureDirectoryExistsSync(this.#stateDir);\n\t\t\tensureDirectoryExistsSync(this.#dbsDir);\n\t\t\tensureDirectoryExistsSync(this.#alarmsDir);\n\n\t\t\ttry {\n\t\t\t\tconst fsSync = getNodeFsSync();\n\t\t\t\tconst actorIds = fsSync.readdirSync(this.#stateDir);\n\t\t\t\tthis.#actorCountOnStartup = actorIds.length;\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({ msg: \"failed to count actors\", error });\n\t\t\t}\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"file system driver ready\",\n\t\t\t\tdir: this.#storagePath,\n\t\t\t\tactorCount: this.#actorCountOnStartup,\n\t\t\t\tsqliteRuntime: this.#sqliteRuntime.kind,\n\t\t\t});\n\n\t\t\t// Cleanup stale temp files on startup\n\t\t\ttry {\n\t\t\t\tthis.#cleanupTempFilesSync();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to cleanup temp files\",\n\t\t\t\t\terror: err,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.#migrateLegacyKvToSqliteOnStartupSync();\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed legacy kv startup migration\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"memory driver ready\",\n\t\t\t\tsqliteRuntime: this.#sqliteRuntime.kind,\n\t\t\t});\n\t\t}\n\t}\n\n\tgetActorStatePath(actorId: string): string {\n\t\treturn getNodePath().join(this.#stateDir, actorId);\n\t}\n\n\tgetActorDbPath(actorId: string): string {\n\t\treturn getNodePath().join(this.#dbsDir, `${actorId}.db`);\n\t}\n\n\tgetActorAlarmPath(actorId: string): string {\n\t\treturn getNodePath().join(this.#alarmsDir, actorId);\n\t}\n\n\t#getActorKvDatabasePath(actorId: string): string {\n\t\tif (this.#persist) {\n\t\t\treturn this.getActorDbPath(actorId);\n\t\t}\n\t\treturn \":memory:\";\n\t}\n\n\t#ensureActorKvTables(db: SqliteRuntimeDatabase): void {\n\t\tdb.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS kv (\n\t\t\t\tkey BLOB PRIMARY KEY NOT NULL,\n\t\t\t\tvalue BLOB NOT NULL\n\t\t\t)\n\t\t`);\n\t}\n\n\t#getOrCreateActorKvDatabase(actorId: string): SqliteRuntimeDatabase {\n\t\tconst existing = this.#actorKvDatabases.get(actorId);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst dbPath = this.#getActorKvDatabasePath(actorId);\n\t\tif (this.#persist) {\n\t\t\tconst path = getNodePath();\n\t\t\tensureDirectoryExistsSync(path.dirname(dbPath));\n\t\t}\n\n\t\tlet db: SqliteRuntimeDatabase;\n\t\ttry {\n\t\t\tdb = this.#sqliteRuntime.open(dbPath);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`failed to open actor kv database for actor ${actorId} at ${dbPath}: ${error}`,\n\t\t\t);\n\t\t}\n\n\t\tthis.#ensureActorKvTables(db);\n\t\tthis.#actorKvDatabases.set(actorId, db);\n\t\treturn db;\n\t}\n\n\t#closeActorKvDatabase(actorId: string): void {\n\t\tconst db = this.#actorKvDatabases.get(actorId);\n\t\tif (!db) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tdb.close();\n\t\t} finally {\n\t\t\tthis.#actorKvDatabases.delete(actorId);\n\t\t}\n\t}\n\n\t#putKvEntriesInDb(\n\t\tdb: SqliteRuntimeDatabase,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): void {\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tdb.exec(\"BEGIN\");\n\t\ttry {\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tdb.run(\"INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)\", [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue,\n\t\t\t\t]);\n\t\t\t}\n\t\t\tdb.exec(\"COMMIT\");\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t} catch {\n\t\t\t\t// Ignore rollback errors, original error is more actionable.\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t#isKvDbPopulated(db: SqliteRuntimeDatabase): boolean {\n\t\tconst row = db.get<{ count: number | bigint }>(\n\t\t\t\"SELECT COUNT(*) AS count FROM kv\",\n\t\t);\n\t\tconst count = row ? Number(row.count) : 0;\n\t\treturn count > 0;\n\t}\n\n\t#migrateLegacyKvToSqliteOnStartupSync(): void {\n\t\tconst fsSync = getNodeFsSync();\n\t\tif (!fsSync.existsSync(this.#stateDir)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst actorIds = fsSync\n\t\t\t.readdirSync(this.#stateDir)\n\t\t\t.filter((id) => !id.includes(\".tmp.\"));\n\n\t\tfor (const actorId of actorIds) {\n\t\t\tconst statePath = this.getActorStatePath(actorId);\n\t\t\tlet state: schema.ActorState;\n\t\t\ttry {\n\t\t\t\tconst stateBytes = fsSync.readFileSync(statePath);\n\t\t\t\tstate = ACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(stateBytes),\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"failed to parse actor state during startup migration\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!state.kvStorage || state.kvStorage.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dbPath = this.getActorDbPath(actorId);\n\t\t\tconst path = getNodePath();\n\t\t\tensureDirectoryExistsSync(path.dirname(dbPath));\n\t\t\tconst db = this.#sqliteRuntime.open(dbPath);\n\t\t\ttry {\n\t\t\t\tthis.#ensureActorKvTables(db);\n\t\t\t\tif (this.#isKvDbPopulated(db)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst legacyEntries = state.kvStorage.map((entry) => [\n\t\t\t\t\tnew Uint8Array(entry.key),\n\t\t\t\t\tnew Uint8Array(entry.value),\n\t\t\t\t]) as [Uint8Array, Uint8Array][];\n\t\t\t\tthis.#putKvEntriesInDb(db, legacyEntries);\n\n\t\t\t\tlogger().info({\n\t\t\t\t\tmsg: \"migrated legacy actor kv storage to sqlite\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tentryCount: legacyEntries.length,\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tdb.close();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync *getActorsIterator(params: {\n\t\tcursor?: string;\n\t}): AsyncGenerator<schema.ActorState> {\n\t\tlet actorIds = Array.from(this.#actors.keys()).sort();\n\n\t\t// Check if state directory exists first\n\t\tconst fsSync = getNodeFsSync();\n\t\tif (fsSync.existsSync(this.#stateDir)) {\n\t\t\tactorIds = fsSync\n\t\t\t\t.readdirSync(this.#stateDir)\n\t\t\t\t.filter((id) => !id.includes(\".tmp\"))\n\t\t\t\t.sort();\n\t\t}\n\n\t\tconst startIndex = params.cursor\n\t\t\t? actorIds.indexOf(params.cursor) + 1\n\t\t\t: 0;\n\n\t\tfor (let i = startIndex; i < actorIds.length; i++) {\n\t\t\tconst actorId = actorIds[i];\n\t\t\tif (!actorId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst state = await this.loadActorStateOrError(actorId);\n\t\t\t\tyield state;\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to load actor state\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Ensures an entry exists for this actor.\n\t *\n\t * Used for #createActor and #loadActor.\n\t */\n\t#upsertEntry(actorId: string): ActorEntry {\n\t\tlet entry = this.#actors.get(actorId);\n\t\tif (entry) {\n\t\t\treturn entry;\n\t\t}\n\n\t\tentry = {\n\t\t\tid: actorId,\n\t\t\tlifecycleState: ActorLifecycleState.NONEXISTENT,\n\t\t\tgeneration: crypto.randomUUID(),\n\t\t};\n\t\tthis.#actors.set(actorId, entry);\n\t\treturn entry;\n\t}\n\n\t/**\n\t * Creates a new actor and writes to file system.\n\t */\n\tasync createActor(\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tinput: unknown | undefined,\n\t): Promise<ActorEntry> {\n\t\t// TODO: Does not check if actor already exists on fs\n\n\t\tawait this.#waitForActorStop(actorId);\n\t\tlet entry = this.#upsertEntry(actorId);\n\n\t\t// Check if actor already exists (has state or is being stopped)\n\t\tif (entry.state) {\n\t\t\tthrow new ActorDuplicateKey(name, key);\n\t\t}\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\tentry = this.#upsertEntry(actorId);\n\t\t}\n\n\t\t// If actor was destroyed, reset to NONEXISTENT and increment generation\n\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\tentry.lifecycleState = ActorLifecycleState.NONEXISTENT;\n\t\t\tentry.generation = crypto.randomUUID();\n\t\t}\n\n\t\t// Initialize storage (runtime KV is stored in SQLite; state.kvStorage is legacy-only)\n\t\tconst initialKvState = getInitialActorKvState(input);\n\n\t\t// Initialize metadata\n\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\tlockedEntry.state = {\n\t\t\t\tactorId,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tcreatedAt: BigInt(Date.now()),\n\t\t\t\tkvStorage: [],\n\t\t\t\tstartTs: null,\n\t\t\t\tconnectableTs: null,\n\t\t\t\tsleepTs: null,\n\t\t\t\tdestroyTs: null,\n\t\t\t};\n\t\t\tlockedEntry.lifecycleState = ActorLifecycleState.AWAKE;\n\t\t\tif (this.#persist) {\n\t\t\t\tawait this.#performWrite(\n\t\t\t\t\tactorId,\n\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\tlockedEntry.state,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (initialKvState.length > 0) {\n\t\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\t\tthis.#putKvEntriesInDb(db, initialKvState);\n\t\t\t}\n\t\t});\n\n\t\treturn entry;\n\t}\n\n\t/**\n\t * Loads the actor from disk or returns the existing actor entry. This will return an entry even if the actor does not actually exist.\n\t */\n\tasync loadActor(actorId: string): Promise<ActorEntry> {\n\t\tconst entry = this.#upsertEntry(actorId);\n\n\t\t// Check if destroyed - don't load from disk\n\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// Check if already loaded\n\t\tif (entry.state) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// If not persisted, then don't load from FS\n\t\tif (!this.#persist) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// If state is currently being loaded, wait for it\n\t\tif (entry.loadPromise) {\n\t\t\tawait entry.loadPromise;\n\t\t\treturn entry;\n\t\t}\n\n\t\t// Start loading state\n\t\tentry.loadPromise = this.loadActorState(entry);\n\t\treturn entry.loadPromise;\n\t}\n\n\tprivate async loadActorState(entry: ActorEntry) {\n\t\tconst stateFilePath = this.getActorStatePath(entry.id);\n\n\t\t// Read & parse file\n\t\ttry {\n\t\t\tconst fs = getNodeFs();\n\t\t\tconst stateData = await fs.readFile(stateFilePath);\n\n\t\t\tconst loadedState =\n\t\t\t\tACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(stateData),\n\t\t\t\t);\n\n\t\t\t// Runtime reads/writes are SQLite-only; legacy kvStorage is for one-time startup migration.\n\t\t\tentry.state = {\n\t\t\t\t...loadedState,\n\t\t\t\tkvStorage: [],\n\t\t\t};\n\n\t\t\treturn entry;\n\t\t} catch (innerError: any) {\n\t\t\t// File does not exist, meaning the actor does not exist\n\t\t\tif (innerError.code === \"ENOENT\") {\n\t\t\t\tentry.loadPromise = undefined;\n\t\t\t\treturn entry;\n\t\t\t}\n\n\t\t\t// For other errors, throw\n\t\t\tconst error = new Error(\n\t\t\t\t`Failed to load actor state: ${innerError}`,\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync loadOrCreateActor(\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tinput: unknown | undefined,\n\t): Promise<ActorEntry> {\n\t\tawait this.#waitForActorStop(actorId);\n\n\t\t// Attempt to load actor\n\t\tconst entry = await this.loadActor(actorId);\n\n\t\t// If no state for this actor, then create & write state\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\t\treturn await this.loadOrCreateActor(actorId, name, key, input);\n\t\t\t}\n\n\t\t\t// If actor was destroyed, reset to NONEXISTENT and increment generation\n\t\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\t\tentry.lifecycleState = ActorLifecycleState.NONEXISTENT;\n\t\t\t\tentry.generation = crypto.randomUUID();\n\t\t\t}\n\n\t\t\t\t// Initialize storage (runtime KV is stored in SQLite; state.kvStorage is legacy-only)\n\t\t\t\tconst initialKvState = getInitialActorKvState(input);\n\n\t\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey: key as readonly string[],\n\t\t\t\t\t\tcreatedAt: BigInt(Date.now()),\n\t\t\t\t\t\tkvStorage: [],\n\t\t\t\t\t\tstartTs: null,\n\t\t\t\t\t\tconnectableTs: null,\n\t\t\t\t\t\tsleepTs: null,\n\t\t\t\t\t\tdestroyTs: null,\n\t\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (initialKvState.length > 0) {\n\t\t\t\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\t\t\t\tthis.#putKvEntriesInDb(db, initialKvState);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn entry;\n\t\t}\n\n\tasync sleepActor(actorId: string) {\n\t\tinvariant(\n\t\t\tthis.#persist,\n\t\t\t\"cannot sleep actor with memory driver, must use file system driver\",\n\t\t);\n\n\t\t// Get the actor. We upsert it even though we're about to destroy it so we have a lock on flagging `destroying` as true.\n\t\tconst actor = this.#upsertEntry(actorId);\n\t\tinvariant(actor, `tried to sleep ${actorId}, does not exist`);\n\n\t\t// Check if already destroying\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\treturn;\n\t\t}\n\t\tactor.lifecycleState = ActorLifecycleState.STARTING_SLEEP;\n\t\tactor.stopPromise = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled actor sleep stop promise rejection\", reason }));\n\n\t\t// Wait for actor to fully start before stopping it to avoid race conditions\n\t\tif (actor.loadPromise) await actor.loadPromise.catch();\n\t\tif (actor.startPromise?.promise)\n\t\t\tawait actor.startPromise.promise.catch();\n\n\t\ttry {\n\t\t\t// Update state with sleep timestamp\n\t\t\tif (actor.state) {\n\t\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\t\tsleepTs: BigInt(Date.now()),\n\t\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Stop actor\n\t\t\tinvariant(actor.actor, \"actor should be loaded\");\n\t\t\tawait actor.actor.onStop(\"sleep\");\n\t\t\t} finally {\n\t\t\t\t// Ensure any pending KV writes finish before removing the entry.\n\t\t\t\tawait this.#withActorWrite(actorId, async () => {});\n\t\t\t\tthis.#closeActorKvDatabase(actorId);\n\t\t\t\tactor.stopPromise?.resolve();\n\t\t\t\tactor.stopPromise = undefined;\n\n\t\t\t// Remove from map after stop is complete\n\t\t\tthis.#actors.delete(actorId);\n\t\t}\n\t}\n\n\tasync destroyActor(actorId: string) {\n\t\t// Get the actor. We upsert it even though we're about to destroy it so we have a lock on flagging `destroying` as true.\n\t\tconst actor = this.#upsertEntry(actorId);\n\n\t\t// If actor is loaded, stop it first\n\t\t// Check if already destroying\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\treturn;\n\t\t}\n\t\tactor.lifecycleState = ActorLifecycleState.STARTING_DESTROY;\n\t\tactor.stopPromise = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled actor destroy stop promise rejection\", reason }));\n\n\t\t// Wait for actor to fully start before stopping it to avoid race conditions\n\t\tif (actor.loadPromise) await actor.loadPromise.catch();\n\t\tif (actor.startPromise?.promise)\n\t\t\tawait actor.startPromise.promise.catch();\n\n\t\ttry {\n\t\t\t// Update state with destroy timestamp\n\t\t\tif (actor.state) {\n\t\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\t\tdestroyTs: BigInt(Date.now()),\n\t\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Stop actor if it's running\n\t\t\tif (actor.actor) {\n\t\t\t\tawait actor.actor.onStop(\"destroy\");\n\t\t\t}\n\n\t\t\t\t// Ensure any pending KV writes finish before deleting files.\n\t\t\t\tawait this.#withActorWrite(actorId, async () => {});\n\t\t\t\tthis.#closeActorKvDatabase(actorId);\n\n\t\t\t// Clear alarm timeout if exists\n\t\t\tif (actor.alarmTimeout) {\n\t\t\t\tactor.alarmTimeout.abort();\n\t\t\t}\n\n\t\t\t// Delete persisted files if using file system driver\n\t\t\tif (this.#persist) {\n\t\t\t\tconst fs = getNodeFs();\n\n\t\t\t\t// Delete all actor files in parallel\n\t\t\t\tawait Promise.all([\n\t\t\t\t\t// Delete actor state file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorStatePath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor state file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t\t// Delete actor database file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorDbPath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor database file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t\t// Delete actor alarm file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorAlarmPath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor alarm file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t]);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Ensure any pending KV writes finish before clearing the entry.\n\t\t\tawait this.#withActorWrite(actorId, async () => {});\n\t\t\tactor.stopPromise?.resolve();\n\t\t\tactor.stopPromise = undefined;\n\n\t\t\t// Reset the entry\n\t\t\t//\n\t\t\t// Do not remove entry in order to avoid race condition with\n\t\t\t// destroying. Next actor creation will increment the generation.\n\t\t\tactor.state = undefined;\n\t\t\tactor.loadPromise = undefined;\n\t\t\tactor.actor = undefined;\n\t\t\tactor.startPromise = undefined;\n\t\t\tactor.alarmTimeout = undefined;\n\t\t\tactor.alarmTimeout = undefined;\n\t\t\tactor.pendingWriteResolver = undefined;\n\t\t\tactor.lifecycleState = ActorLifecycleState.DESTROYED;\n\t\t}\n\t}\n\n\t/**\n\t * Save actor state to disk.\n\t */\n\tasync writeActor(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t\tstate: schema.ActorState,\n\t): Promise<void> {\n\t\tif (!this.#persist) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#withActorWrite(actorId, async () => {\n\t\t\tawait this.#performWrite(actorId, generation, state);\n\t\t});\n\t}\n\n\tisGenerationCurrentAndNotDestroyed(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t): boolean {\n\t\tconst entry = this.#upsertEntry(actorId);\n\t\tif (!entry) return false;\n\t\treturn (\n\t\t\tentry.generation === generation &&\n\t\t\tentry.lifecycleState !== ActorLifecycleState.STARTING_DESTROY\n\t\t);\n\t}\n\n\tisActorStopping(actorId: string) {\n\t\tconst entry = this.#upsertEntry(actorId);\n\t\tif (!entry) return false;\n\t\treturn (\n\t\t\tentry.lifecycleState === ActorLifecycleState.STARTING_SLEEP ||\n\t\t\tentry.lifecycleState === ActorLifecycleState.STARTING_DESTROY\n\t\t);\n\t}\n\n\tasync #waitForActorStop(actorId: string): Promise<void> {\n\t\twhile (true) {\n\t\t\tconst entry = this.#actors.get(actorId);\n\t\t\tif (!entry?.stopPromise) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait entry.stopPromise.promise;\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #withActorWrite<T>(\n\t\tactorId: string,\n\t\tfn: (entry: ActorEntry) => Promise<T>,\n\t): Promise<T> {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tinvariant(entry, \"actor entry does not exist\");\n\n\t\tconst previousWrite = entry.pendingWriteResolver;\n\t\tconst currentWrite = promiseWithResolvers<void>((reason) => logger().warn({ msg: \"unhandled kv write promise rejection\", reason }));\n\t\tentry.pendingWriteResolver = currentWrite;\n\n\t\tif (previousWrite) {\n\t\t\ttry {\n\t\t\t\tawait previousWrite.promise;\n\t\t\t} catch {\n\t\t\t\t// Ignore failed previous writes so later writes can proceed.\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\treturn await fn(entry);\n\t\t} finally {\n\t\t\tcurrentWrite.resolve();\n\t\t\tif (entry.pendingWriteResolver === currentWrite) {\n\t\t\t\tentry.pendingWriteResolver = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #waitForPendingWrite(actorId: string): Promise<void> {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tif (!entry?.pendingWriteResolver) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (entry.pendingWriteResolver) {\n\t\t\tconst pending = entry.pendingWriteResolver;\n\t\t\ttry {\n\t\t\t\tawait pending.promise;\n\t\t\t} catch {\n\t\t\t\t// Ignore write failures to avoid blocking reads forever.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync setActorAlarm(actorId: string, timestamp: number) {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tinvariant(entry, \"actor entry does not exist\");\n\n\t\t// Track generation of the actor when the write started to detect\n\t\t// destroy/create race condition\n\t\tconst writeGeneration = entry.generation;\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\tlogger().info(\"skipping set alarm since actor stopping\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Persist alarm to disk\n\t\tif (this.#persist) {\n\t\t\tconst alarmPath = this.getActorAlarmPath(actorId);\n\t\t\tconst crypto = getNodeCrypto();\n\t\t\tconst tempPath = `${alarmPath}.tmp.${crypto.randomUUID()}`;\n\t\t\ttry {\n\t\t\t\tconst path = getNodePath();\n\t\t\t\tawait ensureDirectoryExists(path.dirname(alarmPath));\n\t\t\t\tconst alarmData: schema.ActorAlarm = {\n\t\t\t\t\tactorId,\n\t\t\t\t\ttimestamp: BigInt(timestamp),\n\t\t\t\t};\n\t\t\t\tconst data = ACTOR_ALARM_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\talarmData,\n\t\t\t\t\tFILE_SYSTEM_DRIVER_CURRENT_VERSION,\n\t\t\t\t);\n\t\t\t\tconst fs = getNodeFs();\n\t\t\t\tawait fs.writeFile(tempPath, data);\n\n\t\t\t\tif (\n\t\t\t\t\t!this.isGenerationCurrentAndNotDestroyed(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\twriteGeneration,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tlogger().debug(\n\t\t\t\t\t\t\"skipping writing alarm since actor destroying or new generation\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait fs.rename(tempPath, alarmPath);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tconst fs = getNodeFs();\n\t\t\t\t\tawait fs.unlink(tempPath);\n\t\t\t\t} catch {}\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to write alarm\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tthrow new Error(`Failed to write alarm: ${error}`);\n\t\t\t}\n\t\t}\n\n\t\t// Schedule timeout\n\t\tthis.#scheduleAlarmTimeout(actorId, timestamp);\n\t}\n\n\t/**\n\t * Perform the actual write operation with atomic writes\n\t */\n\tasync #performWrite(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t\tstate: schema.ActorState,\n\t): Promise<void> {\n\t\tconst dataPath = this.getActorStatePath(actorId);\n\t\t// Generate unique temp filename to prevent any race conditions\n\t\tconst crypto = getNodeCrypto();\n\t\tconst tempPath = `${dataPath}.tmp.${crypto.randomUUID()}`;\n\n\t\ttry {\n\t\t\t// Create directory if needed\n\t\t\tconst path = getNodePath();\n\t\t\tawait ensureDirectoryExists(path.dirname(dataPath));\n\n\t\t\t// Convert to BARE types for serialization\n\t\t\tconst bareState: schema.ActorState = {\n\t\t\t\tactorId: state.actorId,\n\t\t\t\tname: state.name,\n\t\t\t\tkey: state.key,\n\t\t\t\tcreatedAt: state.createdAt,\n\t\t\t\tkvStorage: state.kvStorage,\n\t\t\t\tstartTs: state.startTs,\n\t\t\t\tconnectableTs: state.connectableTs,\n\t\t\t\tsleepTs: state.sleepTs,\n\t\t\t\tdestroyTs: state.destroyTs,\n\t\t\t};\n\n\t\t\t// Perform atomic write\n\t\t\tconst serializedState =\n\t\t\t\tACTOR_STATE_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\tbareState,\n\t\t\t\t\tFILE_SYSTEM_DRIVER_CURRENT_VERSION,\n\t\t\t\t);\n\t\t\tconst fs = getNodeFs();\n\t\t\tawait fs.writeFile(tempPath, serializedState);\n\n\t\t\tif (!this.isGenerationCurrentAndNotDestroyed(actorId, generation)) {\n\t\t\t\tlogger().debug(\n\t\t\t\t\t\"skipping writing alarm since actor destroying or new generation\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait fs.rename(tempPath, dataPath);\n\t\t} catch (error) {\n\t\t\t// Cleanup temp file on error\n\t\t\ttry {\n\t\t\t\tconst fs = getNodeFs();\n\t\t\t\tawait fs.unlink(tempPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to save actor state\",\n\t\t\t\tactorId,\n\t\t\t\terror,\n\t\t\t});\n\t\t\tthrow new Error(`Failed to save actor state: ${error}`);\n\t\t}\n\t}\n\n\t/**\n\t * Call this method after the actor driver has been initiated.\n\t *\n\t * This will trigger all initial alarms from the file system.\n\t *\n\t * This needs to be sync since DriverConfig.actor is sync\n\t */\n\tonRunnerStart(\n\t\tconfig: RegistryConfig,\n\t\tinlineClient: AnyClient,\n\t\tactorDriver: ActorDriver,\n\t) {\n\t\tif (this.#runnerParams) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Save runner params for future use\n\t\tthis.#runnerParams = {\n\t\t\tconfig: config,\n\t\t\tinlineClient,\n\t\t\tactorDriver,\n\t\t};\n\n\t\t// Load alarms from disk and schedule timeouts\n\t\ttry {\n\t\t\tthis.#loadAlarmsSync();\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to load alarms on startup\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync startActor(\n\t\tconfig: RegistryConfig,\n\t\tinlineClient: AnyClient,\n\t\tactorDriver: ActorDriver,\n\t\tactorId: string,\n\t): Promise<AnyActorInstance> {\n\t\tawait this.#waitForActorStop(actorId);\n\n\t\t// Get the actor metadata\n\t\tlet entry = await this.loadActor(actorId);\n\t\tif (!entry.state) {\n\t\t\tthrow new Error(\n\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t);\n\t\t}\n\n\t\t// Actor already starting\n\t\tif (entry.startPromise) {\n\t\t\tawait entry.startPromise.promise;\n\t\t\tinvariant(entry.actor, \"actor should have loaded\");\n\t\t\treturn entry.actor;\n\t\t}\n\n\t\t// Actor already loaded\n\t\tif (entry.actor) {\n\t\t\tif (entry.actor.isStopping || this.isActorStopping(actorId)) {\n\t\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\t\tentry = await this.loadActor(actorId);\n\t\t\t\tif (!entry.state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn entry.actor;\n\t\t\t}\n\t\t}\n\n\t\t// Create start promise\n\t\tentry.startPromise = promiseWithResolvers((reason) => logger().warn({ msg: \"unhandled actor start promise rejection\", reason }));\n\n\t\ttry {\n\t\t\t// Create actor\n\t\t\tconst definition = lookupInRegistry(config, entry.state.name);\n\t\t\tentry.actor = await definition.instantiate();\n\t\t\tentry.lifecycleState = ActorLifecycleState.AWAKE;\n\n\t\t\t// Start actor\n\t\t\tawait entry.actor.start(\n\t\t\t\tactorDriver,\n\t\t\t\tinlineClient,\n\t\t\t\tactorId,\n\t\t\t\tentry.state.name,\n\t\t\t\tentry.state.key as string[],\n\t\t\t\t\"unknown\",\n\t\t\t);\n\n\t\t\t// Update state with start timestamp\n\t\t\t// NOTE: connectableTs is always in sync with startTs since actors become connectable immediately after starting\n\t\t\tconst now = BigInt(Date.now());\n\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\tstartTs: now,\n\t\t\t\t\tconnectableTs: now,\n\t\t\t\t\tsleepTs: null, // Clear sleep timestamp when actor wakes up\n\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Finish\n\t\t\tentry.startPromise.resolve();\n\t\t\tentry.startPromise = undefined;\n\n\t\t\treturn entry.actor;\n\t\t\t} catch (innerError) {\n\t\t\t\tconst error = new Error(\n\t\t\t\t\t`Failed to start actor ${actorId}: ${innerError}`,\n\t\t\t\t\t{ cause: innerError },\n\t\t\t\t);\n\t\t\tentry.startPromise?.reject(error);\n\t\t\tentry.startPromise = undefined;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync loadActorStateOrError(actorId: string): Promise<schema.ActorState> {\n\t\tconst state = (await this.loadActor(actorId)).state;\n\t\tif (!state) throw new Error(`Actor does not exist: ${actorId}`);\n\t\treturn state;\n\t}\n\n\tgetActorOrError(actorId: string): ActorEntry {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tif (!entry) throw new Error(`No entry for actor: ${actorId}`);\n\t\treturn entry;\n\t}\n\n\tasync createDatabase(actorId: string): Promise<string | undefined> {\n\t\treturn this.getActorDbPath(actorId);\n\t}\n\n\t/**\n\t * Load all persisted alarms from disk and schedule their timers.\n\t */\n\t#loadAlarmsSync(): void {\n\t\ttry {\n\t\t\tconst fsSync = getNodeFsSync();\n\t\t\tconst files = fsSync.existsSync(this.#alarmsDir)\n\t\t\t\t? fsSync.readdirSync(this.#alarmsDir)\n\t\t\t\t: [];\n\t\t\tfor (const file of files) {\n\t\t\t\t// Skip temp files\n\t\t\t\tif (file.includes(\".tmp.\")) continue;\n\t\t\t\tconst path = getNodePath();\n\t\t\t\tconst fullPath = path.join(this.#alarmsDir, file);\n\t\t\t\ttry {\n\t\t\t\t\tconst buf = fsSync.readFileSync(fullPath);\n\t\t\t\t\tconst alarmData =\n\t\t\t\t\t\tACTOR_ALARM_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\t\t\tnew Uint8Array(buf),\n\t\t\t\t\t\t);\n\t\t\t\t\tconst timestamp = Number(alarmData.timestamp);\n\t\t\t\t\tif (Number.isFinite(timestamp)) {\n\t\t\t\t\t\tthis.#scheduleAlarmTimeout(\n\t\t\t\t\t\t\talarmData.actorId,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\tmsg: \"invalid alarm file contents\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"failed to read alarm file\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to list alarms directory\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Schedule an alarm timer for an actor without writing to disk.\n\t */\n\t#scheduleAlarmTimeout(actorId: string, timestamp: number) {\n\t\tconst entry = this.#upsertEntry(actorId);\n\n\t\t// If there's already an earlier alarm scheduled, do not override it.\n\t\tif (\n\t\t\tentry.alarmTimestamp !== undefined &&\n\t\t\ttimestamp >= entry.alarmTimestamp\n\t\t) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"skipping alarm schedule (later than existing)\",\n\t\t\t\tactorId,\n\t\t\t\ttimestamp,\n\t\t\t\tcurrent: entry.alarmTimestamp,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"scheduling alarm\", actorId, timestamp });\n\n\t\t// Cancel existing timeout and update the current scheduled timestamp\n\t\tentry.alarmTimeout?.abort();\n\t\tentry.alarmTimestamp = timestamp;\n\n\t\tconst delay = Math.max(0, timestamp - Date.now());\n\t\tentry.alarmTimeout = setLongTimeout(async () => {\n\t\t\t// Clear currently scheduled timestamp as this alarm is firing now\n\t\t\tentry.alarmTimestamp = undefined;\n\t\t\t// On trigger: remove persisted alarm file\n\t\t\tif (this.#persist) {\n\t\t\t\ttry {\n\t\t\t\t\tconst fs = getNodeFs();\n\t\t\t\t\tawait fs.unlink(this.getActorAlarmPath(actorId));\n\t\t\t\t} catch (err: any) {\n\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\tmsg: \"failed to remove alarm file\",\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tlogger().debug({ msg: \"triggering alarm\", actorId, timestamp });\n\n\t\t\t\t// Ensure actor state exists and start actor if needed\n\t\t\t\tconst loaded = await this.loadActor(actorId);\n\t\t\t\tif (!loaded.state)\n\t\t\t\t\tthrow new Error(`Actor does not exist: ${actorId}`);\n\n\t\t\t\t// Start actor if not already running\n\t\t\t\tconst runnerParams = this.#runnerParams;\n\t\t\t\tinvariant(runnerParams, \"missing runner params\");\n\t\t\t\tif (!loaded.actor) {\n\t\t\t\t\tawait this.startActor(\n\t\t\t\t\t\trunnerParams.config,\n\t\t\t\t\t\trunnerParams.inlineClient,\n\t\t\t\t\t\trunnerParams.actorDriver,\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tinvariant(loaded.actor, \"actor should be loaded after wake\");\n\t\t\t\tawait loaded.actor.onAlarm();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to handle alarm\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}, delay);\n\t}\n\n\t/**\n\t * Cleanup stale temp files on startup (synchronous)\n\t */\n\t#cleanupTempFilesSync(): void {\n\t\ttry {\n\t\t\tconst fsSync = getNodeFsSync();\n\t\t\tconst files = fsSync.readdirSync(this.#stateDir);\n\t\t\tconst tempFiles = files.filter((f) => f.includes(\".tmp.\"));\n\n\t\t\tconst oneHourAgo = Date.now() - 3600000; // 1 hour in ms\n\n\t\t\tfor (const tempFile of tempFiles) {\n\t\t\t\ttry {\n\t\t\t\t\tconst path = getNodePath();\n\t\t\t\t\tconst fullPath = path.join(this.#stateDir, tempFile);\n\t\t\t\t\tconst stat = fsSync.statSync(fullPath);\n\n\t\t\t\t\t// Remove if older than 1 hour\n\t\t\t\t\tif (stat.mtimeMs < oneHourAgo) {\n\t\t\t\t\t\tfsSync.unlinkSync(fullPath);\n\t\t\t\t\t\tlogger().info({\n\t\t\t\t\t\t\tmsg: \"cleaned up stale temp file\",\n\t\t\t\t\t\t\tfile: tempFile,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"failed to cleanup temp file\",\n\t\t\t\t\t\tfile: tempFile,\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to read actors directory for cleanup\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Batch put KV entries for an actor.\n\t */\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.loadActor(actorId);\n\t\tawait this.#withActorWrite(actorId, async (entry) => {\n\t\t\tif (!entry.state) {\n\t\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\n\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\tconst totalSize = estimateKvSize(db);\n\t\t\tvalidateKvEntries(entries, totalSize);\n\t\t\tthis.#putKvEntriesInDb(db, entries);\n\t\t});\n\t}\n\n\t/**\n\t * Batch get KV entries for an actor.\n\t */\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\tconst entry = await this.loadActor(actorId);\n\t\tawait this.#waitForPendingWrite(actorId);\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tthrow new Error(`Actor ${actorId} is stopping`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\t\t}\n\n\t\tvalidateKvKeys(keys);\n\n\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\tconst results: (Uint8Array | null)[] = [];\n\t\tfor (const key of keys) {\n\t\t\tconst row = db.get<{ value: Uint8Array | ArrayBuffer }>(\n\t\t\t\t\"SELECT value FROM kv WHERE key = ?\",\n\t\t\t\t[key],\n\t\t\t);\n\t\t\tif (!row) {\n\t\t\t\tresults.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresults.push(ensureUint8Array(row.value, \"value\"));\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Batch delete KV entries for an actor.\n\t */\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.loadActor(actorId);\n\t\tawait this.#withActorWrite(actorId, async (entry) => {\n\t\t\tif (!entry.state) {\n\t\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\n\t\t\tif (keys.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvalidateKvKeys(keys);\n\n\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\tdb.exec(\"BEGIN\");\n\t\t\ttry {\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tdb.run(\"DELETE FROM kv WHERE key = ?\", [key]);\n\t\t\t\t}\n\t\t\t\tdb.exec(\"COMMIT\");\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore rollback errors, original error is more actionable.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * List KV entries with a given prefix for an actor.\n\t */\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\tconst entry = await this.loadActor(actorId);\n\t\tawait this.#waitForPendingWrite(actorId);\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tthrow new Error(`Actor ${actorId} is destroying`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\t\t}\n\t\tvalidateKvKey(prefix, \"prefix key\");\n\n\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\tconst upperBound = computePrefixUpperBound(prefix);\n\t\tconst rows = upperBound\n\t\t\t? db.all<{ key: Uint8Array | ArrayBuffer; value: Uint8Array | ArrayBuffer }>(\n\t\t\t\t\t\"SELECT key, value FROM kv WHERE key >= ? AND key < ? ORDER BY key ASC\",\n\t\t\t\t\t[prefix, upperBound],\n\t\t\t\t)\n\t\t\t: db.all<{ key: Uint8Array | ArrayBuffer; value: Uint8Array | ArrayBuffer }>(\n\t\t\t\t\t\"SELECT key, value FROM kv WHERE key >= ? ORDER BY key ASC\",\n\t\t\t\t\t[prefix],\n\t\t\t\t);\n\n\t\treturn rows.map((row) => [\n\t\t\tensureUint8Array(row.key, \"key\"),\n\t\t\tensureUint8Array(row.value, \"value\"),\n\t\t]);\n\t}\n}\n","import { createVersionedDataHandler } from \"vbare\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport * as v1 from \"../../../dist/schemas/file-system-driver/v1\";\nimport * as v2 from \"../../../dist/schemas/file-system-driver/v2\";\nimport * as v3 from \"../../../dist/schemas/file-system-driver/v3\";\n\nexport const CURRENT_VERSION = 3;\n\n// Converter from v1 to v2\nconst v1ToV2 = (v1State: v1.ActorState): v2.ActorState => {\n\t// Create a new kvStorage list with the legacy persist data\n\tconst kvStorage: v2.ActorKvEntry[] = [];\n\n\t// Store the legacy persist data under key [1]\n\tif (v1State.persistedData) {\n\t\t// Key [1] as Uint8Array\n\t\tconst key = new Uint8Array([1]);\n\t\tkvStorage.push({\n\t\t\tkey: bufferToArrayBuffer(key),\n\t\t\tvalue: v1State.persistedData,\n\t\t});\n\t}\n\n\treturn {\n\t\tactorId: v1State.actorId,\n\t\tname: v1State.name,\n\t\tkey: v1State.key,\n\t\tkvStorage,\n\t\tcreatedAt: v1State.createdAt,\n\t};\n};\n\n// Converter from v2 to v3\nconst v2ToV3 = (v2State: v2.ActorState): v3.ActorState => {\n\t// Migrate from v2 to v3 by adding the new optional timestamp fields\n\treturn {\n\t\tactorId: v2State.actorId,\n\t\tname: v2State.name,\n\t\tkey: v2State.key,\n\t\tkvStorage: v2State.kvStorage,\n\t\tcreatedAt: v2State.createdAt,\n\t\tstartTs: null,\n\t\tconnectableTs: null,\n\t\tsleepTs: null,\n\t\tdestroyTs: null,\n\t};\n};\n\n// Converter from v3 to v2\nconst v3ToV2 = (v3State: v3.ActorState): v2.ActorState => {\n\t// Downgrade from v3 to v2 by removing the timestamp fields\n\treturn {\n\t\tactorId: v3State.actorId,\n\t\tname: v3State.name,\n\t\tkey: v3State.key,\n\t\tkvStorage: v3State.kvStorage,\n\t\tcreatedAt: v3State.createdAt,\n\t};\n};\n\n// Converter from v2 to v1\nconst v2ToV1 = (v2State: v2.ActorState): v1.ActorState => {\n\t// Downgrade from v2 to v1 by converting kvStorage back to persistedData\n\t// Find the persist data entry (key [1])\n\tconst persistDataEntry = v2State.kvStorage.find((entry) => {\n\t\tconst key = new Uint8Array(entry.key);\n\t\treturn key.length === 1 && key[0] === 1;\n\t});\n\n\treturn {\n\t\tactorId: v2State.actorId,\n\t\tname: v2State.name,\n\t\tkey: v2State.key,\n\t\tpersistedData: persistDataEntry?.value || new ArrayBuffer(0),\n\t\tcreatedAt: v2State.createdAt,\n\t};\n};\n\nexport const ACTOR_STATE_VERSIONED = createVersionedDataHandler<v3.ActorState>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeActorState(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeActorState(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActorState(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeActorState(data as v1.ActorState);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeActorState(data as v2.ActorState);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActorState(data as v3.ActorState);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3],\n\tserializeConverters: () => [v3ToV2, v2ToV1],\n});\n\nexport const ACTOR_ALARM_VERSIONED = createVersionedDataHandler<v3.ActorAlarm>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeActorAlarm(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeActorAlarm(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActorAlarm(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeActorAlarm(data as v1.ActorAlarm);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeActorAlarm(data as v2.ActorAlarm);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActorAlarm(data as v3.ActorAlarm);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [],\n\tserializeConverters: () => [],\n});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly persistedData: ArrayBuffer,\n readonly createdAt: u64,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n persistedData: bare.readData(bc),\n createdAt: bare.readU64(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n bare.writeData(bc, x.persistedData)\n bare.writeU64(bc, x.createdAt)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type ActorKvEntry = {\n readonly key: ArrayBuffer,\n readonly value: ArrayBuffer,\n}\n\nexport function readActorKvEntry(bc: bare.ByteCursor): ActorKvEntry {\n return {\n key: bare.readData(bc),\n value: bare.readData(bc),\n }\n}\n\nexport function writeActorKvEntry(bc: bare.ByteCursor, x: ActorKvEntry): void {\n bare.writeData(bc, x.key)\n bare.writeData(bc, x.value)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): readonly ActorKvEntry[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readActorKvEntry(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readActorKvEntry(bc)\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: readonly ActorKvEntry[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeActorKvEntry(bc, x[i])\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly kvStorage: readonly ActorKvEntry[],\n readonly createdAt: u64,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n kvStorage: read1(bc),\n createdAt: bare.readU64(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n write1(bc, x.kvStorage)\n bare.writeU64(bc, x.createdAt)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type ActorKvEntry = {\n readonly key: ArrayBuffer,\n readonly value: ArrayBuffer,\n}\n\nexport function readActorKvEntry(bc: bare.ByteCursor): ActorKvEntry {\n return {\n key: bare.readData(bc),\n value: bare.readData(bc),\n }\n}\n\nexport function writeActorKvEntry(bc: bare.ByteCursor, x: ActorKvEntry): void {\n bare.writeData(bc, x.key)\n bare.writeData(bc, x.value)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): readonly ActorKvEntry[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readActorKvEntry(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readActorKvEntry(bc)\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: readonly ActorKvEntry[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeActorKvEntry(bc, x[i])\n }\n}\n\nfunction read2(bc: bare.ByteCursor): u64 | null {\n return bare.readBool(bc)\n ? bare.readU64(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: u64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU64(bc, x)\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly kvStorage: readonly ActorKvEntry[],\n readonly createdAt: u64,\n readonly startTs: u64 | null,\n readonly connectableTs: u64 | null,\n readonly sleepTs: u64 | null,\n readonly destroyTs: u64 | null,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n kvStorage: read1(bc),\n createdAt: bare.readU64(bc),\n startTs: read2(bc),\n connectableTs: read2(bc),\n sleepTs: read2(bc),\n destroyTs: read2(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n write1(bc, x.kvStorage)\n bare.writeU64(bc, x.createdAt)\n write2(bc, x.startTs)\n write2(bc, x.connectableTs)\n write2(bc, x.sleepTs)\n write2(bc, x.destroyTs)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-fs\");\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport {\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodeOs,\n\tgetNodePath,\n} from \"@/utils/node\";\n\n/**\n * Generate a deterministic actor ID from name and key\n */\nexport function generateActorId(name: string, key: ActorKey): string {\n\t// Generate deterministic key string\n\tconst jsonString = JSON.stringify([name, key]);\n\n\t// Hash to ensure safe file system names\n\tconst crypto = getNodeCrypto();\n\tconst hash = crypto\n\t\t.createHash(\"sha256\")\n\t\t.update(jsonString)\n\t\t.digest(\"hex\")\n\t\t.substring(0, 16);\n\n\treturn hash;\n}\n\n/**\n * Create a hash for a path, normalizing it first\n */\nfunction createHashForPath(dirPath: string): string {\n\tconst path = getNodePath();\n\t// Normalize the path first\n\tconst normalizedPath = path.normalize(dirPath);\n\n\t// Extract the last path component for readability\n\tconst lastComponent = path.basename(normalizedPath);\n\n\t// Create SHA-256 hash\n\tconst crypto = getNodeCrypto();\n\tconst hash = crypto\n\t\t.createHash(\"sha256\")\n\t\t.update(normalizedPath)\n\t\t.digest(\"hex\")\n\t\t.substring(0, 8); // Take first 8 characters for brevity\n\n\treturn `${lastComponent}-${hash}`;\n}\n\n/**\n * Get the storage path for the current working directory or a specified path\n */\nexport function getStoragePath(): string {\n\tconst dataPath = getDataPath(\"rivetkit\");\n\tconst dirHash = createHashForPath(process.cwd());\n\tconst path = getNodePath();\n\treturn path.join(dataPath, dirHash);\n}\n\n/**\n * Check if a path exists\n */\nexport async function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDirectoryExists(\n\tdirectoryPath: string,\n): Promise<void> {\n\tif (!(await pathExists(directoryPath))) {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.mkdir(directoryPath, { recursive: true });\n\t}\n}\n\n/**\n * Ensure a directory exists synchronously - only used during initialization\n * All other operations use the async version\n */\nexport function ensureDirectoryExistsSync(directoryPath: string): void {\n\tconst fsSync = getNodeFsSync();\n\tif (!fsSync.existsSync(directoryPath)) {\n\t\tfsSync.mkdirSync(directoryPath, { recursive: true });\n\t}\n}\n\n/**\n * Returns platform-specific data directory\n */\nfunction getDataPath(appName: string): string {\n\tconst platform = process.platform;\n\tconst os = getNodeOs();\n\tconst homeDir = os.homedir();\n\tconst path = getNodePath();\n\n\tswitch (platform) {\n\t\tcase \"win32\":\n\t\t\treturn path.join(\n\t\t\t\tprocess.env.APPDATA || path.join(homeDir, \"AppData\", \"Roaming\"),\n\t\t\t\tappName,\n\t\t\t);\n\t\tcase \"darwin\":\n\t\t\treturn path.join(\n\t\t\t\thomeDir,\n\t\t\t\t\"Library\",\n\t\t\t\t\"Application Support\",\n\t\t\t\tappName,\n\t\t\t);\n\t\tdefault: // linux and others\n\t\t\treturn path.join(\n\t\t\t\tprocess.env.XDG_DATA_HOME ||\n\t\t\t\t\tpath.join(homeDir, \".local\", \"share\"),\n\t\t\t\tappName,\n\t\t\t);\n\t}\n}\n","import { getRequireFn } from \"@/utils/node\";\n\ntype SqliteRuntimeKind = \"bun\" | \"node\" | \"better-sqlite3\";\ntype SqliteDatabaseCtor = new (path: string) => SqliteRawDatabase;\n\ninterface SqliteStatement {\n\trun(...params: unknown[]): unknown;\n\tget<T = Record<string, unknown>>(...params: unknown[]): T | undefined;\n\tall<T = Record<string, unknown>>(...params: unknown[]): T[];\n}\n\ninterface SqliteRawDatabase {\n\texec(sql: string): unknown;\n\tclose(): unknown;\n\tprepare?(sql: string): SqliteStatement;\n\tquery?(sql: string): SqliteStatement;\n}\n\nexport interface SqliteRuntimeDatabase {\n\texec(sql: string): void;\n\trun(sql: string, params?: readonly unknown[]): void;\n\tget<T = Record<string, unknown>>(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): T | undefined;\n\tall<T = Record<string, unknown>>(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): T[];\n\tclose(): void;\n}\n\nexport interface SqliteRuntime {\n\tkind: SqliteRuntimeKind;\n\topen(path: string): SqliteRuntimeDatabase;\n}\n\nfunction normalizeParams(params: readonly unknown[] | undefined): unknown[] {\n\tif (!params || params.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn params.map((value) => {\n\t\tif (value instanceof Uint8Array) {\n\t\t\treturn Buffer.from(value);\n\t\t}\n\t\treturn value;\n\t});\n}\n\nfunction createPreparedDatabaseAdapter(\n\trawDb: SqliteRawDatabase,\n\tprepare: (sql: string) => SqliteStatement,\n): SqliteRuntimeDatabase {\n\treturn {\n\t\texec: (sql) => {\n\t\t\trawDb.exec(sql);\n\t\t},\n\t\trun: (sql, params) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\tstmt.run(...normalizeParams(params));\n\t\t},\n\t\tget: <T = Record<string, unknown>>(\n\t\t\tsql: string,\n\t\t\tparams?: readonly unknown[],\n\t\t) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\treturn stmt.get<T>(...normalizeParams(params));\n\t\t},\n\t\tall: <T = Record<string, unknown>>(\n\t\t\tsql: string,\n\t\t\tparams?: readonly unknown[],\n\t\t) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\treturn stmt.all<T>(...normalizeParams(params));\n\t\t},\n\t\tclose: () => {\n\t\t\trawDb.close();\n\t\t},\n\t};\n}\n\nfunction configureSqliteRuntimeDatabase(\n\trawDb: SqliteRawDatabase,\n\tpath: string,\n): void {\n\t// Wait briefly when the database file is still being released by another\n\t// process during restarts to reduce transient \"database is locked\" failures.\n\trawDb.exec(\"PRAGMA busy_timeout = 5000\");\n\n\t// WAL improves concurrent read/write behavior for file-backed databases.\n\tif (path !== \":memory:\") {\n\t\trawDb.exec(\"PRAGMA journal_mode = WAL\");\n\t}\n}\n\nexport function loadSqliteRuntime(): SqliteRuntime {\n\tconst requireFn = getRequireFn();\n\tconst loadErrors: string[] = [];\n\n\ttry {\n\t\tconst bunSqlite = requireFn(/* webpackIgnore: true */ \"bun:sqlite\") as {\n\t\t\tDatabase?: SqliteDatabaseCtor;\n\t\t};\n\t\tconst BunDatabase = bunSqlite.Database;\n\t\tif (BunDatabase) {\n\t\t\treturn {\n\t\t\t\tkind: \"bun\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new BunDatabase(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst query = rawDb.query?.bind(rawDb);\n\t\t\t\t\tif (!query) throw new Error(\"bun:sqlite database missing query method\");\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, query);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`bun:sqlite unavailable: ${String(error)}`);\n\t}\n\n\ttry {\n\t\tconst nodeSqlite = requireFn(/* webpackIgnore: true */ \"node:sqlite\") as {\n\t\t\tDatabaseSync?: SqliteDatabaseCtor;\n\t\t};\n\t\tconst NodeDatabaseSync = nodeSqlite.DatabaseSync;\n\t\tif (NodeDatabaseSync) {\n\t\t\treturn {\n\t\t\t\tkind: \"node\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new NodeDatabaseSync(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst prepare = rawDb.prepare?.bind(rawDb);\n\t\t\t\t\tif (!prepare) {\n\t\t\t\t\t\tthrow new Error(\"node:sqlite DatabaseSync missing prepare method\");\n\t\t\t\t\t}\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, prepare);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`node:sqlite unavailable: ${String(error)}`);\n\t}\n\n\ttry {\n\t\tconst betterSqlite3Module = requireFn(\n\t\t\t/* webpackIgnore: true */ \"better-sqlite3\",\n\t\t) as SqliteDatabaseCtor | { default?: SqliteDatabaseCtor };\n\t\tconst BetterSqlite3 =\n\t\t\ttypeof betterSqlite3Module === \"function\"\n\t\t\t\t? betterSqlite3Module\n\t\t\t\t: betterSqlite3Module.default;\n\t\tif (BetterSqlite3) {\n\t\t\treturn {\n\t\t\t\tkind: \"better-sqlite3\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new BetterSqlite3(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst prepare = rawDb.prepare?.bind(rawDb);\n\t\t\t\t\tif (!prepare) {\n\t\t\t\t\t\tthrow new Error(\"better-sqlite3 database missing prepare method\");\n\t\t\t\t\t}\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, prepare);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`better-sqlite3 unavailable: ${String(error)}`);\n\t\tthrow new Error(\n\t\t\t`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3. Install better-sqlite3 (e.g. \"pnpm add better-sqlite3\") if native runtimes are unavailable.\\n${loadErrors.join(\"\\n\")}`,\n\t\t);\n\t}\n\n\tthrow new Error(\n\t\t`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3.\\n${loadErrors.join(\"\\n\")}`,\n\t);\n}\n\nexport function computePrefixUpperBound(\n\tprefix: Uint8Array,\n): Uint8Array | undefined {\n\tif (prefix.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst upperBound = new Uint8Array(prefix);\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i] += 1;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function ensureUint8Array(\n\tvalue: unknown,\n\tfieldName: string,\n): Uint8Array {\n\tif (value instanceof Uint8Array) {\n\t\treturn value;\n\t}\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\tthrow new Error(`SQLite row field \"${fieldName}\" is not binary data`);\n}\n","import type { SqliteRuntimeDatabase } from \"./sqlite-runtime\";\n\n// Keep these limits in sync with engine/packages/pegboard/src/actor_kv/mod.rs.\nconst KV_MAX_KEY_SIZE = 2 * 1024;\nconst KV_MAX_VALUE_SIZE = 128 * 1024;\nconst KV_MAX_KEYS = 128;\nconst KV_MAX_PUT_PAYLOAD_SIZE = 976 * 1024;\nconst KV_MAX_STORAGE_SIZE = 10 * 1024 * 1024 * 1024;\nconst KV_KEY_WRAPPER_OVERHEAD_SIZE = 2;\n\nexport function estimateKvSize(db: SqliteRuntimeDatabase): number {\n\tconst row = db.get<{ total: number | bigint | null }>(\n\t\t\"SELECT COALESCE(SUM(LENGTH(key) + LENGTH(value)), 0) AS total FROM kv\",\n\t);\n\treturn row ? Number(row.total ?? 0) : 0;\n}\n\nexport function validateKvKey(\n\tkey: Uint8Array,\n\tkeyLabel: \"key\" | \"prefix key\" = \"key\",\n): void {\n\tif (key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE > KV_MAX_KEY_SIZE) {\n\t\tthrow new Error(`${keyLabel} is too long (max 2048 bytes)`);\n\t}\n}\n\nexport function validateKvKeys(keys: Uint8Array[]): void {\n\tif (keys.length > KV_MAX_KEYS) {\n\t\tthrow new Error(\"a maximum of 128 keys is allowed\");\n\t}\n\n\tfor (const key of keys) {\n\t\tvalidateKvKey(key);\n\t}\n}\n\nexport function validateKvEntries(\n\tentries: [Uint8Array, Uint8Array][],\n\ttotalSize: number,\n): void {\n\tif (entries.length > KV_MAX_KEYS) {\n\t\tthrow new Error(\"A maximum of 128 key-value entries is allowed\");\n\t}\n\n\tlet payloadSize = 0;\n\tfor (const [key, value] of entries) {\n\t\tpayloadSize +=\n\t\t\tkey.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE + value.byteLength;\n\t}\n\n\tif (payloadSize > KV_MAX_PUT_PAYLOAD_SIZE) {\n\t\tthrow new Error(\"total payload is too large (max 976 KiB)\");\n\t}\n\n\tconst storageRemaining = Math.max(0, KV_MAX_STORAGE_SIZE - totalSize);\n\tif (payloadSize > storageRemaining) {\n\t\tthrow new Error(\n\t\t\t`not enough space left in storage (${storageRemaining} bytes remaining, current payload is ${payloadSize} bytes)`,\n\t\t);\n\t}\n\n\tfor (const [key, value] of entries) {\n\t\tvalidateKvKey(key);\n\t\tif (value.byteLength > KV_MAX_VALUE_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`value is too large (max ${KV_MAX_VALUE_SIZE / 1024} KiB)`,\n\t\t\t);\n\t\t}\n\t}\n}\n","import type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { ActorStopping } from \"@/actor/errors\";\nimport { type ActorRouter, createActorRouter } from \"@/actor/router\";\nimport { routeWebSocket } from \"@/actor/router-websocket-endpoints\";\nimport { createClientWithDriver } from \"@/client/client\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport { createInlineWebSocket } from \"@/common/inline-websocket-adapter\";\nimport { noopNext } from \"@/common/utils\";\nimport type {\n\tActorDriver,\n\tActorOutput,\n\tCreateInput,\n\tGetForIdInput,\n\tGetOrCreateWithKeyInput,\n\tGetWithKeyInput,\n\tListActorsInput,\n\tManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ManagerDisplayInformation } from \"@/manager/driver\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport type { DriverConfig, RegistryConfig } from \"@/registry/config\";\nimport type * as schema from \"@/schemas/file-system-driver/mod\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport type { FileSystemGlobalState } from \"./global-state\";\nimport { logger } from \"./log\";\nimport { generateActorId } from \"./utils\";\n\nexport class FileSystemManagerDriver implements ManagerDriver {\n\t#config: RegistryConfig;\n\t#state: FileSystemGlobalState;\n\t#driverConfig: DriverConfig;\n\t#getUpgradeWebSocket: GetUpgradeWebSocket | undefined;\n\n\t#actorDriver: ActorDriver;\n\t#actorRouter: ActorRouter;\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tstate: FileSystemGlobalState,\n\t\tdriverConfig: DriverConfig,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#state = state;\n\t\tthis.#driverConfig = driverConfig;\n\n\t\t// Actors run on the same node as the manager, so we create a dummy actor router that we route requests to\n\t\tconst inlineClient = createClientWithDriver(this);\n\n\t\tthis.#actorDriver = this.#driverConfig.actor(\n\t\t\tconfig,\n\t\t\tthis,\n\t\t\tinlineClient,\n\t\t);\n\t\tthis.#actorRouter = createActorRouter(\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tundefined,\n\t\t\tconfig.test.enabled,\n\t\t);\n\t}\n\n\tasync sendRequest(\n\t\tactorId: string,\n\t\tactorRequest: Request,\n\t): Promise<Response> {\n\t\treturn await this.#actorRouter.fetch(actorRequest, {\n\t\t\tactorId,\n\t\t});\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<UniversalWebSocket> {\n\t\t// Normalize the path (add leading slash if needed) but preserve query params\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\n\t\t// Create a fake request with the full URL including query parameters\n\t\tconst fakeUrl = `http://inline-actor${normalizedPath}`;\n\t\tconst fakeRequest = new Request(fakeUrl, {\n\t\t\tmethod: \"GET\",\n\t\t});\n\n\t\t// Extract just the pathname for routing (without query params)\n\t\tconst pathOnly = normalizedPath.split(\"?\")[0];\n\t\tconst { gatewayId, requestId } = createHibernatableRequestMetadata();\n\n\t\tconst wsHandler = await routeWebSocket(\n\t\t\tfakeRequest,\n\t\t\tpathOnly,\n\t\t\t{},\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t\tgatewayId,\n\t\t\trequestId,\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t);\n\t\treturn createInlineWebSocket(wsHandler);\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\treturn await this.#actorRouter.fetch(actorRequest, {\n\t\t\tactorId,\n\t\t});\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tconst upgradeWebSocket = this.#getUpgradeWebSocket?.();\n\t\tinvariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\n\t\t// Handle raw WebSocket paths\n\t\tconst pathOnly = path.split(\"?\")[0];\n\t\tconst normalizedPath = pathOnly.startsWith(\"/\")\n\t\t\t? pathOnly\n\t\t\t: `/${pathOnly}`;\n\t\tconst { gatewayId, requestId } = createHibernatableRequestMetadata();\n\t\tconst wsHandler = await routeWebSocket(\n\t\t\t// TODO: Create new request with new path\n\t\t\tc.req.raw,\n\t\t\tnormalizedPath,\n\t\t\tc.req.header(),\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t\tgatewayId,\n\t\t\trequestId,\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t);\n\t\treturn upgradeWebSocket(() => wsHandler)(c, noopNext());\n\t}\n\n\tasync buildGatewayUrl(actorId: string): Promise<string> {\n\t\tconst port = this.#config.managerPort ?? 6420;\n\t\treturn `http://127.0.0.1:${port}/gateway/${encodeURIComponent(actorId)}`;\n\t}\n\n\tasync getForId({\n\t\tactorId,\n\t}: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t// Validate the actor exists\n\t\tconst actor = await this.#state.loadActor(actorId);\n\t\tif (!actor.state) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.#state.isActorStopping(actorId)) {\n\t\t\tthrow new ActorStopping(actorId);\n\t\t}\n\n\t\treturn actorStateToOutput(actor.state);\n\t}\n\n\tasync getWithKey({\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(name, key);\n\n\t\t// Check if actor exists\n\t\tconst actor = await this.#state.loadActor(actorId);\n\t\tif (actor.state) {\n\t\t\treturn actorStateToOutput(actor.state);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(input.name, input.key);\n\n\t\t// Use the atomic getOrCreateActor method\n\t\tawait this.#state.loadOrCreateActor(\n\t\t\tactorId,\n\t\t\tinput.name,\n\t\t\tinput.key,\n\t\t\tinput.input,\n\t\t);\n\n\t\t// Start the actor immediately so timestamps are set\n\t\tawait this.#actorDriver.loadActor(actorId);\n\n\t\t// Reload state to get updated timestamps\n\t\tconst state = await this.#state.loadActorStateOrError(actorId);\n\t\treturn actorStateToOutput(state);\n\t}\n\n\tasync createActor({ name, key, input }: CreateInput): Promise<ActorOutput> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(name, key);\n\n\t\tawait this.#state.createActor(actorId, name, key, input);\n\n\t\t// Start the actor immediately so timestamps are set\n\t\tawait this.#actorDriver.loadActor(actorId);\n\n\t\t// Reload state to get updated timestamps\n\t\tconst state = await this.#state.loadActorStateOrError(actorId);\n\t\treturn actorStateToOutput(state);\n\t}\n\n\tasync listActors({ name }: ListActorsInput): Promise<ActorOutput[]> {\n\t\tconst actors: ActorOutput[] = [];\n\t\tconst itr = this.#state.getActorsIterator({});\n\n\t\tfor await (const actor of itr) {\n\t\t\tif (actor.name === name) {\n\t\t\t\tactors.push(actorStateToOutput(actor));\n\t\t\t}\n\t\t}\n\n\t\t// Sort by create ts desc (most recent first)\n\t\tactors.sort((a, b) => {\n\t\t\tconst aTs = a.createTs ?? 0;\n\t\t\tconst bTs = b.createTs ?? 0;\n\t\t\treturn bTs - aTs;\n\t\t});\n\n\t\treturn actors;\n\t}\n\n\tasync kvGet(actorId: string, key: Uint8Array): Promise<string | null> {\n\t\tconst response = await this.#state.kvBatchGet(actorId, [key]);\n\t\treturn response[0] !== null\n\t\t\t? new TextDecoder().decode(response[0])\n\t\t\t: null;\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tproperties: {\n\t\t\t\t...(this.#state.persist\n\t\t\t\t\t? { Data: this.#state.storagePath }\n\t\t\t\t\t: {}),\n\t\t\t\tInstances: this.#state.actorCountOnStartup.toString(),\n\t\t\t},\n\t\t};\n\t}\n\n\textraStartupLog() {\n\t\treturn {\n\t\t\tinstances: this.#state.actorCountOnStartup,\n\t\t\tdata: this.#state.storagePath,\n\t\t};\n\t}\n\n\tsetGetUpgradeWebSocket(getUpgradeWebSocket: GetUpgradeWebSocket): void {\n\t\tthis.#getUpgradeWebSocket = getUpgradeWebSocket;\n\t}\n}\n\nfunction actorStateToOutput(state: schema.ActorState): ActorOutput {\n\treturn {\n\t\tactorId: state.actorId,\n\t\tname: state.name,\n\t\tkey: state.key as string[],\n\t\tcreateTs: Number(state.createdAt),\n\t\tstartTs: state.startTs !== null ? Number(state.startTs) : null,\n\t\tconnectableTs:\n\t\t\tstate.connectableTs !== null ? Number(state.connectableTs) : null,\n\t\tsleepTs: state.sleepTs !== null ? Number(state.sleepTs) : null,\n\t\tdestroyTs: state.destroyTs !== null ? Number(state.destroyTs) : null,\n\t};\n}\n\nfunction createHibernatableRequestMetadata(): {\n\tgatewayId: ArrayBuffer;\n\trequestId: ArrayBuffer;\n} {\n\tconst gatewayId = new Uint8Array(4);\n\tconst requestId = new Uint8Array(4);\n\tcrypto.getRandomValues(gatewayId);\n\tcrypto.getRandomValues(requestId);\n\treturn {\n\t\tgatewayId: gatewayId.buffer.slice(0),\n\t\trequestId: requestId.buffer.slice(0),\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAAA,EACC;AAAA,EACA;AAAA,OAIM;AAEP,OAAOA,gBAAe;;;ACTtB,YAAY,UAAU;AACtB,SAAS,wBAAwB;AA4B1B,IAAM,iBAAN,MAAqB;AAAA,EAQ3B,YAA6B,OAAyB;AAAzB;AArC9B;AAsCE,SAAK,mBAAiB,WAAM,iBAAN,mBAAoB,SAAQ;AAClD,UAAM,eAAe,sBAAsB,MAAM,OAAO,GAAG;AAC3D,SAAK,qBAAqB,6CAAc;AACxC,SAAI,UAAK,uBAAL,mBAAyB,kBAAkB;AAC9C,WAAK,mBAAmB,iBAAiB,CAAC,YAAY;AACrD,aAAK,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAnBgB,UAAU,iBAA8C;AAAA,EAExE,iBAAiB;AAAA,EACjB;AAAA,EAkBA,eAAe;AACd,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,eAAe,OAA4C;AAChE,UAAM,UAAU,KAAK,MAAM,OAAO,QAAQ;AAC1C,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AAC/C,UAAM,WAAW,MAAM,KAAK,MAAM,aAAa,YAAY;AAC3D,UAAM,SAAS,SAAS;AAAA,MACvB,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE;AAAA,IAC3B;AACA,UAAM,UAAU,YAAY,IAAI,OAAO,MAAM,GAAG,SAAS,IAAI,CAAC;AAC9D,WAAO;AAAA,MACN,MAAM,OAAO,KAAK,cAAc;AAAA,MAChC,SAAS,OAAO,OAAO;AAAA,MACvB,WAAW,OAAO,SAAS,QAAQ;AAAA,MACnC,UAAU,QAAQ,IAAI,CAAC,aAAa;AAAA,QACnC,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,aAAa,OAAO,QAAQ,SAAS;AAAA,MACtC,EAAE;AAAA,IACH;AAAA,EACD;AAAA,EAEA,gBAAgB,MAAc;AAC7B,QAAI,KAAK,mBAAmB,MAAM;AACjC;AAAA,IACD;AACA,SAAK,iBAAiB;AACtB,SAAK,QAAQ,KAAK,cAAc;AAAA,EACjC;AAAA,EAEA,oBAAoB;AACnB,WAAO,KAAK,uBAAuB;AAAA,EACpC;AAAA,EAEA,qBAAoD;AACnD,QAAI,CAAC,KAAK,oBAAoB;AAC7B,aAAO;AAAA,IACR;AACA,UAAM,UAAU,KAAK,mBAAmB,WAAW;AACnD,WAAQ,WAAW;AAAA,EACpB;AAAA;AAAA,EAIA,oBAAoB;AACnB,QAAI;AACH,aAAO,KAAK,MAAM,OAAO;AAAA,IAC1B,QAAQ;AACP,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,oBAA0C;AAzGjD;AA0GE,QAAI,CAAC,KAAK,kBAAkB,GAAG;AAC9B,YAAM,IAAgB,mBAAmB;AAAA,IAC1C;AAEA,UAAM,KAAK,KAAK,MAAM;AAGtB,UAAM,SAAS,MAAM,GAAG;AAAA,MACvB;AAAA,IACD;AAIA,UAAM,aAAa,CAAC;AACpB,eAAW,SAAS,QAAQ;AAC3B,YAAM,SAAS,IAAI,mBAAmB,MAAM,IAAI,CAAC;AACjD,YAAM,SAAS,MAAM,GAAG;AAAA,QACvB,iBAAiB,MAAM;AAAA,MACxB;AACA,YAAM,cAAc,MAAM,GAAG;AAAA,QAC5B,iCAAiC,MAAM;AAAA,MACxC;AAEA,YAAM,eAAc,iCAAS,MAC1B,OAAO,KAAK,OAAO,CAAC,CAAC,IACrB,CAAC;AAEJ,iBAAW,KAAK;AAAA,QACf,OAAO,EAAE,QAAQ,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC5D,SAAS,YAAY,IAAI,CAAC,MAAM,SAAS;AAAA,UACxC;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,IAAI;AAAA,QACL,EAAE;AAAA,QACF,aAAa,CAAC;AAAA,QACd,WAAS,gDAAc,OAAd,mBAAkB,UAAS;AAAA,MACrC,CAAC;AAAA,IACF;AAEA,WAAO,oBAAyB,YAAO,EAAE,QAAQ,WAAW,CAAC,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,qBACL,OACA,OACA,QACuB;AACvB,QAAI,CAAC,KAAK,kBAAkB,GAAG;AAC9B,YAAM,IAAgB,mBAAmB;AAAA,IAC1C;AAEA,UAAM,KAAK,KAAK,MAAM;AACtB,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,GAAG,CAAC;AAC9D,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACjD,UAAM,SAAS,IAAI,mBAAmB,KAAK,CAAC;AAC5C,UAAM,SAAS,MAAM,GAAG;AAAA,MACvB,iBAAiB,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,IACD;AACA,WAAO,oBAAyB,YAAO,MAAM,CAAC;AAAA,EAC/C;AAAA,EAEA,iBAAiB;AAChB,WAAO,KAAK,MAAM;AAAA,EACnB;AAAA,EAEA,WAAW;AACV,QAAI,CAAC,KAAK,MAAM,cAAc;AAC7B,YAAM,IAAgB,gBAAgB;AAAA,IACvC;AACA,WAAO;AAAA,MACD,YAAO,KAAK,MAAM,aAAa,WAAW,KAAK;AAAA,IACrD;AAAA,EACD;AAAA,EAEA,UAAU;AACT,WAAO,KAAK,MAAM;AAAA,EACnB;AAAA,EAEA,iBAAiB;AAChB,WAAO,MAAM;AAAA,MACZ,KAAK,MAAM,kBAAkB,YAAY,QAAQ;AAAA,IAClD,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM;AAhMxB;AAiMG,YAAM,mBAAmB,KAAK,yBAAyB;AACvD,aAAO;AAAA,QACN,OAAM,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,QAChC;AAAA,QACA,SAAS;AAAA,UACH,YAAO;AAAA,YACX,OAAM,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,YAChC,QAAQ,KAAK;AAAA,YACb,cAAc,iBAAiB;AAAA,YAC/B,OAAO,iBAAiB,eACrB,iBAAiB,QACjB;AAAA,YACH,eAAe,KAAK,cAAc;AAAA,YAClC,gBAAgB,KAAK;AAAA;AAAA;AAAA,UAGtB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EACA,MAAM,SAAS,OAAoB;AAClC,QAAI,CAAC,KAAK,MAAM,cAAc;AAC7B,YAAM,IAAgB,gBAAgB;AAAA,IACvC;AACA,SAAK,MAAM,aAAa,QAAa,YAAO,OAAO,KAAK,KAAK,CAAC;AAC9D,UAAM,KAAK,MAAM,aAAa,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,cAAc,MAAc,QAAqB;AACtD,UAAM,OAAO,MAAM,KAAK,MAAM,kBAAkB;AAAA,MAC/C,iBAAiB;AAAA;AAAA,MAEjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,QAAI;AACH,aAAO;AAAA,QACD;AAAA,UACJ,MAAM,KAAK,MAAM;AAAA,YAChB,IAAI,cAAc,KAAK,OAAO,IAAI;AAAA,YAClC;AAAA,YACK,YAAO,OAAO,KAAK,MAAM,CAAC;AAAA,UAChC;AAAA,QACD;AAAA,MACD;AAAA,IACD,UAAE;AACD,WAAK,WAAW;AAAA,IACjB;AAAA,EACD;AAAA;AAAA;AAAA,EAKA,eAAwB;AACvB,QAAI,CAAC,KAAK,MAAM,cAAc;AAC7B,YAAM,IAAgB,gBAAgB;AAAA,IACvC;AACA,WAAO,KAAK,MAAM,aAAa,WAAW;AAAA,EAC3C;AAAA,EAEA,MAAM,aAAa,OAA+B;AACjD,QAAI,CAAC,KAAK,MAAM,cAAc;AAC7B,YAAM,IAAgB,gBAAgB;AAAA,IACvC;AACA,SAAK,MAAM,aAAa,QAAQ;AAChC,UAAM,KAAK,MAAM,aAAa,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,qBAAyD;AACxD,WAAO,MAAM;AAAA,MACZ,KAAK,MAAM,kBAAkB,YAAY,QAAQ;AAAA,IAClD,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM;AA5QxB;AA6QG,YAAM,mBAAmB,KAAK,yBAAyB;AACvD,aAAO;AAAA,QACN,OAAM,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,QAChC;AAAA,QACA,SAAS;AAAA,UACR,OAAM,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,UAChC,QAAQ,KAAK;AAAA,UACb,cAAc,iBAAiB;AAAA,UAC/B,OAAO,iBAAiB,eACrB,iBAAiB,QACjB;AAAA,UACH,eAAe,KAAK,cAAc;AAAA,UAClC,gBAAgB,KAAK;AAAA,QACtB;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,MAAc,MAAmC;AACxE,UAAM,OAAO,MAAM,KAAK,MAAM,kBAAkB;AAAA,MAC/C,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,QAAI;AACH,aAAO,MAAM,KAAK,MAAM;AAAA,QACvB,IAAI,cAAc,KAAK,OAAO,IAAI;AAAA,QAClC;AAAA,QACA;AAAA,MACD;AAAA,IACD,UAAE;AACD,WAAK,WAAW;AAAA,IACjB;AAAA,EACD;AAAA,EAEA,MAAM,cAAc,SAI6B;AAChD,UAAM,SAAS,MAAM,KAAK,MAAM,OAAO,UAAU,OAAO;AACxD,WAAO;AAAA,EACR;AAAA,EAEA,yBAAkF;AACjF,UAAM,iBAAiB,CAAC,MAAc,UACrC,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC7C,UAAM,UAAU,KAAK,mBAAmB;AACxC,UAAM,cAAc,UACjB,KAAK,MAAM,KAAK,UAAU,SAAS,cAAc,CAAC,IAClD;AACH,WAAO;AAAA,MACN,SAAS;AAAA,MACT,mBAAmB,KAAK,kBAAkB;AAAA,IAC3C;AAAA,EACD;AAAA,EAEA,mBAAmB,OAKhB;AACF,WAAO,KAAK,eAAe,KAAK,EAAE,KAAK,CAAC,YAAY;AAAA,MACnD,MAAM,OAAO,OAAO,IAAI;AAAA,MACxB,SAAS,OAAO,OAAO,OAAO;AAAA,MAC9B,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO,SAAS,IAAI,CAAC,OAAO;AAAA,QACrC,IAAI,OAAO,EAAE,EAAE;AAAA,QACf,MAAM,EAAE;AAAA,QACR,aAAa,OAAO,EAAE,WAAW;AAAA,MAClC,EAAE;AAAA,IACH,EAAE;AAAA,EACH;AACD;AAEA,SAAS,mBAAmB,OAAuB;AAClD,SAAO,MAAM,QAAQ,MAAM,IAAI;AAChC;;;ACxVA,YAAYC,WAAU;AAkCf,SAAS,+BACf,SACqB;AACrB,SAAO;AAAA,IACN,IAAI,QAAQ;AAAA,IACZ,YAAY,oBAAyB,aAAO,QAAQ,UAAU,CAAC;AAAA,IAC/D,OAAO,oBAAyB,aAAO,QAAQ,KAAK,CAAC;AAAA,IACrD,eAAe,QAAQ,cAAc,IAAI,CAAC,SAAS;AAAA,MAClD,WAAW,IAAI;AAAA,IAChB,EAAE;AAAA,IACF,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,oBAAoB,QAAQ;AAAA,IAC5B,oBAAoB,QAAQ;AAAA,IAC5B,aAAa,QAAQ;AAAA,IACrB,gBAAgB,IAAI,IAAI,OAAO,QAAQ,QAAQ,cAAc,CAAC;AAAA,EAC/D;AACD;AAMO,SAAS,iCACf,UACwB;AACxB,SAAO;AAAA,IACN,IAAI,SAAS;AAAA,IACb,YAAiB,aAAO,IAAI,WAAW,SAAS,UAAU,CAAC;AAAA,IAC3D,OAAY,aAAO,IAAI,WAAW,SAAS,KAAK,CAAC;AAAA,IACjD,eAAe,SAAS,cAAc,IAAI,CAAC,SAAS;AAAA,MACnD,WAAW,IAAI;AAAA,IAChB,EAAE;AAAA,IACF,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,oBAAoB,SAAS;AAAA,IAC7B,oBAAoB,SAAS;AAAA,IAC7B,aAAa,SAAS;AAAA,IACtB,gBAAgB,OAAO,YAAY,SAAS,cAAc;AAAA,EAC3D;AACD;;;AC9EO,IAAM,WAAN,MAAe;AAAA,EACrB;AAAA,EAEA,YAAY,OAAyB;AACpC,SAAK,SAAS;AAAA,EACf;AAAA,EAEA,MAAM,MAAM,UAAkB,OAAe,MAAiB;AAC7D,UAAM,KAAK,OAAO,cAAc,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI;AAAA,EAChE;AAAA,EAEA,MAAM,GAAG,WAAmB,OAAe,MAAiB;AAC3D,UAAM,KAAK,OAAO,cAAc,WAAW,IAAI,IAAI;AAAA,EACpD;AACD;;;ACdA,OAAO,eAAe;AAsCf,IAAM,oBAAN,MASL;AAAA,EACD;AAAA,EACA,eAAe,oBAAI,IAA6C;AAAA,EAChE,0BAA0B;AAAA;AAAA,EAG1B,2BAA2B,oBAAI,IAAY;AAAA,EAE3C,YAAY,OAAiD;AAC5D,SAAK,SAAS;AAAA,EACf;AAAA,EAEA,IAAI,cAA4D;AAC/D,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,aAAa,IAAyD;AACrE,WAAO,KAAK,aAAa,IAAI,EAAE;AAAA,EAChC;AAAA,EAEA,IAAI,0BAAuC;AAC1C,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,yBAAiC;AACpC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,8BAA8B;AAC7B,SAAK,yBAAyB,MAAM;AAAA,EACrC;AAAA,EAEA,2BAA2B,MAAuC;AACjE;AAAA,MACC,KAAK;AAAA,MACL;AAAA,IACD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK,yBAAyB;AAAA,IAC7C,CAAC;AAED,SAAK,yBAAyB,IAAI,KAAK,EAAE;AAEzC,SAAK,OAAO,aAAa,qBAAqB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YACL,QACA,QACA,SACA,aACA,gBACA,gBACA,yBAC2C;AAC3C,SAAK,OAAO,YAAY;AAUxB,QAAI,yBAAyB;AAC5B,aAAO,KAAK,2BAA2B,MAAM;AAAA,IAC9C;AAGA,QAAI,KAAK,OAAO,OAAO,iBAAiB;AACvC,YAAM,MAAM,IAAI,qBAAqB,KAAK,QAAQ,OAAO;AACzD,YAAM,KAAK,OAAO;AAAA,QACjB;AAAA,QACA;AAAA,UACC,mBAAmB,OAAO;AAAA,QAC3B;AAAA,QACA,MAAM,KAAK,OAAO,OAAO,gBAAiB,KAAK,MAAM;AAAA,MACtD;AAAA,IACD;AAGA,QAAI;AACJ,QAAI,KAAK,OAAO,kBAAkB;AACjC,kBAAY,MAAM,KAAK,iBAAiB,QAAQ,OAAO;AAAA,IACxD;AAGA,QAAI;AACJ,QAAI,gBAAgB;AACnB,YAAM,eAAe,OAAO;AAC5B,gBAAU,cAAc,wBAAwB;AAChD,gBAAU,aAAa,yCAAyC;AAChE;AAAA,QACC;AAAA,QACA;AAAA,MACD;AACA,iBAAW;AAAA,QACV,cAAc;AAAA,UACb,IAAI,OAAO,WAAW;AAAA,UACtB,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,eAAe,CAAC;AAAA,UAChB,WAAW,aAAa;AAAA,UACxB,WAAW,aAAa;AAAA,UACxB,oBAAoB;AAAA;AAAA,UAEpB,oBAAoB;AAAA,UACpB;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD,OAAO;AACN,iBAAW;AAAA,QACV,WAAW;AAAA,UACV,IAAI,OAAO,WAAW;AAAA,UACtB,YAAY;AAAA,UACZ,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAGA,UAAM,OAAO,IAAI,KAAgC,KAAK,QAAQ,QAAQ;AACtE,SAAK,kBAAkB,IAAI;AAE3B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,MAAuC;AAClD,cAAU,CAAC,KAAK,aAAa,IAAI,KAAK,EAAE,GAAG,wBAAwB;AAEnE,SAAK,aAAa,IAAI,KAAK,IAAI,IAAI;AAMnC,QAAI,KAAK,OAAO,OAAO,cAAc;AACpC,WAAK,OAAO,OAAO,aAAa,IAAI;AAAA,IACrC;AAEA,QAAI,KAAK,gBAAgB;AACxB,WAAK,2BAA2B,IAAI;AAAA,IACrC;AAEA,SAAK,eAAe,IAAI;AAExB,SAAK,OAAO,UAAU,QAAQ,KAAK,oBAAoB;AAEvD,SAAK,OAAO,gBAAgB;AAE5B,SAAK,qBAAqB,IAAI;AAG9B,QAAI,KAAK,2BAA2B,GAAG;AACtC,YAAM,WAAW,EAAE,SAAS,KAAK,OAAO,IAAI,cAAc,KAAK,GAAG;AAClE,WAAK,wBAAwB;AAAA,QAC5B,IAAI;AAAA,UACH;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA,CAAC,WAAW;AAAA,YACX,MAAM;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,YACN;AAAA,UACD;AAAA;AAAA,UAEA,CAAC,WAAW;AAAA,YACX,MAAM;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,YACN;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,2BACC,QACkC;AAClC,cAAU,OAAO,cAAc,sBAAsB;AACrD,UAAM,eAAe,KAAK;AAAA,MACzB,OAAO,aAAa;AAAA,MACpB,OAAO,aAAa;AAAA,IACrB;AACA;AAAA,MACC;AAAA,MACA;AAAA,IACD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL,cAAc,aAAa;AAAA,IAC5B,CAAC;AAGD,QAAI,aAAa,kBAAkB,GAAG;AACrC,WAAK,0BAA0B,YAAY;AAAA,IAC5C;AAGA,iBAAa,kBAAkB,IAAI;AAGnC,SAAK,OAAO,gBAAgB;AAG5B,iBAAa,qBAAqB,IAAI;AAEtC,SAAK,OAAO,UAAU,QAAQ,KAAK,oBAAoB;AAEvD,WAAO;AAAA,EACR;AAAA,EAEA,0BAA0B,MAAuC;AAChE,UAAM,SAAS,KAAK,kBAAkB;AACtC,QAAI,iCAAQ,YAAY;AACvB,aAAO;AAAA,QACN,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,MAAuC;AA3S/D;AA6SE,SAAK,aAAa,OAAO,KAAK,EAAE;AAEhC,SAAK,OAAO,KAAK,MAAM,EAAE,KAAK,gBAAgB,QAAQ,KAAK,GAAG,CAAC;AAG/D,QAAI,KAAK,OAAO,OAAO,eAAe;AACrC,WAAK,OAAO,OAAO,cAAc,IAAI;AAAA,IACtC;AAEA,eAAW,aAAa,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,GAAG;AACzD,WAAK,OAAO,aAAa,mBAAmB,WAAW,MAAM,IAAI;AAAA,IAClE;AAEA,SAAK,OAAO,UAAU,QAAQ,KAAK,oBAAoB;AACvD,SAAK,2BAA2B;AAEhC,UAAM,aAAa;AAAA,MAClB,iBAAiB,KAAK;AAAA,MACtB,oBAAmB,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,MAC7C,2BAA2B,KAAK;AAAA,IACjC;AACA,UAAM,OAAO,KAAK,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,IACD;AAEA,QAAI;AACH,UAAI,KAAK,OAAO,OAAO,cAAc;AACpC,cAAM,SAAS,KAAK,OAAO,OAAO;AAAA,UAAS;AAAA,UAAM,MAChD,KAAK,OAAO,OAAO;AAAA,YAClB,KAAK,OAAO;AAAA,YACZ;AAAA,UACD;AAAA,QACD;AACA,aAAK,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,YAAI,kBAAkB,SAAS;AAC9B,gBAAM;AAAA,QACP;AACA,aAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,MAC9C,OAAO;AACN,aAAK,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,aAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,MAC9C;AAAA,IACD,SAAS,OAAO;AACf,WAAK,OAAO,aAAa,MAAM;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS,eAAe,KAAK;AAAA,MAC9B,CAAC;AACD,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AAAA,IACF,UAAE;AAKD,WAAK,yBAAyB,OAAO,KAAK,EAAE;AAG5C,UAAI,KAAK,gBAAgB;AACxB,cAAM,MAAM,YAAY,KAAK,EAAE;AAC/B,YAAI;AACH,gBAAM,KAAK,OAAO,OAAO,cAAc,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC;AAC5D,eAAK,OAAO,KAAK,MAAM;AAAA,YACtB,KAAK;AAAA,YACL,QAAQ,KAAK;AAAA,UACd,CAAC;AAAA,QACF,SAAS,KAAK;AACb,eAAK,OAAO,KAAK,MAAM;AAAA,YACtB,KAAK;AAAA,YACL,KAAK,eAAe,GAAG;AAAA,UACxB,CAAC;AAAA,QACF;AAAA,MACD;AAEA,WAAK,0BAA0B,KAAK;AAAA,QACnC;AAAA,QACA,KAAK,0BAA0B;AAAA,MAChC;AACA,WAAK,OAAO,gBAAgB;AAAA,IAC7B;AAAA,EACD;AAAA,EAEA,MAAM,wCACL,QACkB;AAClB,UAAM,mBAAmB,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAAE;AAAA,MAC/D,CAAC,SACA,KAAK,kBACL,KAAK,kBAAkB,MAAM;AAAA,IAC/B;AACA,QAAI,iBAAiB,WAAW,GAAG;AAClC,aAAO;AAAA,IACR;AAEA,SAAK,OAAO,KAAK,KAAK;AAAA,MACrB,KAAK;AAAA,MACL,QAAQ,UAAU;AAAA,MAClB,OAAO,iBAAiB;AAAA,IACzB,CAAC;AAED,eAAW,QAAQ,kBAAkB;AACpC,YAAM,KAAK,iBAAiB,IAAI;AAAA,IACjC;AAEA,WAAO,iBAAiB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACL,QACA,QACA,SACA,aACA,gBAC2C;AAC3C,UAAM,OAAO,MAAM,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,SAAK,YAAY,IAAI;AACrB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,aAAsC;AACxD,eAAW,eAAe,aAAa;AAEtC,YAAM,OAAO,IAAI,KAAgC,KAAK,QAAQ;AAAA,QAC7D,cAAc;AAAA,MACf,CAAC;AACD,WAAK,aAAa,IAAI,KAAK,IAAI,IAAI;AAGnC,UAAI,KAAK,OAAO,OAAO,cAAc;AACpC,aAAK,OAAO,OAAO,aAAa,IAAI;AAAA,MACrC;AAGA,iBAAW,OAAO,YAAY,eAAe;AAC5C,aAAK,OAAO,aAAa;AAAA,UACxB,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA,EAIA,qBACC,cACA,cAC8C;AAC9C,WAAO,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS;AAC5D,YAAM,mBAAmB,KAAK,yBAAyB;AACvD,YAAM,IAAI,iBAAiB;AAC3B,aACC,KACA,kBAAkB,EAAE,WAAW,YAAY,KAC3C,kBAAkB,EAAE,WAAW,YAAY;AAAA,IAE7C,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,iBACL,QACA,SAC0B;AAC1B,QAAI,qBAAqB,KAAK,OAAO,QAAQ;AAC5C,YAAM,kBAAkB,KAAK,OAAO,OAAO;AAC3C,YAAM,MAAM,IAAI,uBAAuB,KAAK,QAAQ,OAAO;AAC3D,aAAO,MAAM,KAAK,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA,MAAM;AACL,gBAAM,gBAAgB,gBAAiB,KAAK,MAAM;AAClD,cAAI,yBAAyB,SAAS;AACrC,mBAAO;AAAA,cACN;AAAA,cACA,KAAK,OAAO,OAAO,QAAQ;AAAA,YAC5B;AAAA,UACD;AACA,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD,WAAW,eAAe,KAAK,OAAO,QAAQ;AAC7C,aAAO,gBAAgB,KAAK,OAAO,OAAO,SAAS;AAAA,IACpD;AAEA,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAAA,EAEA,eAAe,MAAuC;AArgBvD;AAsgBE,UAAM,aAAa;AAAA,MAClB,iBAAiB,KAAK;AAAA,MACtB,oBAAmB,UAAK,kBAAkB,MAAvB,mBAA0B;AAAA,MAC7C,2BAA2B,KAAK;AAAA,IACjC;AACA,UAAM,OAAO,KAAK,OAAO,eAAe,mBAAmB,UAAU;AAErE,QAAI;AACH,UAAI,KAAK,OAAO,OAAO,WAAW;AACjC,cAAM,MAAM,IAAI,eAAe,KAAK,QAAQ,IAAI;AAChD,cAAM,SAAS,KAAK,OAAO,OAAO;AAAA,UAAS;AAAA,UAAM,MAChD,KAAK,OAAO,OAAO,UAAW,KAAK,IAAI;AAAA,QACxC;AACA,aAAK,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,YAAI,kBAAkB,SAAS;AAC9B;AAAA,YACC;AAAA,YACA,KAAK,OAAO,OAAO,QAAQ;AAAA,UAC5B,EACE,KAAK,MAAM;AACX,iBAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,UAC9C,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,iBAAK,OAAO,aAAa,MAAM;AAAA,cAC9B,MAAM;AAAA,cACN,SAAS,eAAe,KAAK;AAAA,YAC9B,CAAC;AACD,iBAAK,OAAO,KAAK,MAAM;AAAA,cACtB,KAAK;AAAA,cACL;AAAA,YACD,CAAC;AACD,yCAAM,WAAW;AAAA,UAClB,CAAC;AACF;AAAA,QACD;AAAA,MACD;AAEA,WAAK,OAAO,eAAe,sBAAsB,YAAY,IAAI;AACjE,WAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,IAC9C,SAAS,OAAO;AACf,WAAK,OAAO,aAAa,MAAM;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS,eAAe,KAAK;AAAA,MAC9B,CAAC;AACD,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AACD,mCAAM,WAAW;AAAA,IAClB;AAAA,EACD;AACD;;;AC7jBA,YAAYC,WAAU;AA2Bf,IAAM,eAAN,MASL;AAAA,EACD;AAAA,EACA,qBAAqB,oBAAI,IAGvB;AAAA,EAEF,YAAY,OAAiD;AAC5D,SAAK,SAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,gBACC,WACA,YACA,aACC;AAED,QAAI,WAAW,cAAc,IAAI,SAAS,GAAG;AAC5C,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL;AAAA,QACA,QAAQ,WAAW;AAAA,MACpB,CAAC;AACD;AAAA,IACD;AAGA,eAAW,cAAc,IAAI,SAAS;AAGtC,QAAI,cAAc,KAAK,mBAAmB,IAAI,SAAS;AACvD,QAAI,CAAC,aAAa;AACjB,oBAAc,oBAAI,IAAI;AACtB,WAAK,mBAAmB,IAAI,WAAW,WAAW;AAAA,IACnD;AACA,gBAAY,IAAI,UAAU;AAG1B,QAAI,CAAC,aAAa;AACjB,iBAAW,yBAAyB,EAAE,gBAAgB;AAAA,QACrD;AAAA,MACD,CAAC;AAGD,WAAK,OAAO,aAAa,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,kBAAkB,YAAY;AAAA,IAC/B,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBACC,WACA,YACA,gBACC;AAED,QAAI,CAAC,WAAW,cAAc,IAAI,SAAS,GAAG;AAC7C,WAAK,OAAO,KAAK,KAAK;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,QACA,QAAQ,WAAW;AAAA,MACpB,CAAC;AACD;AAAA,IACD;AAGA,eAAW,cAAc,OAAO,SAAS;AAGzC,UAAM,cAAc,KAAK,mBAAmB,IAAI,SAAS;AACzD,QAAI,aAAa;AAChB,kBAAY,OAAO,UAAU;AAC7B,UAAI,YAAY,SAAS,GAAG;AAC3B,aAAK,mBAAmB,OAAO,SAAS;AAAA,MACzC;AAAA,IACD;AAGA,QAAI,CAAC,gBAAgB;AAEpB,YAAM,UAAU,WACf,yBACD,EAAE,mBAAmB,EAAE,UAAU,CAAC;AAClC,UAAI,CAAC,SAAS;AACb,aAAK,OAAO,KAAK,KAAK;AAAA,UACrB,KAAK;AAAA,UACL;AAAA,UACA,QAAQ,WAAW;AAAA,QACpB,CAAC;AAAA,MACF;AAGA,WAAK,OAAO,aAAa,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IACvD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,uBAAsB,2CAAa,SAAQ;AAAA,IAC5C,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAuC,SAAiB,MAAY;AACnE,SAAK,OAAO,YAAY;AAGxB,UAAM,cAAc,KAAK,mBAAmB,IAAI,IAAI;AACpD,QAAI,CAAC,eAAe,YAAY,SAAS,GAAG;AAC3C,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL,WAAW;AAAA,MACZ,CAAC;AACD;AAAA,IACD;AAEA,SAAK,OAAO,eAAe,qBAAqB;AAAA,MAC/C,oBAAoB;AAAA,MACpB,+BAA+B,YAAY;AAAA,IAC5C,CAAC;AAGD,UAAM,YAAY,EAAE,MAAM,KAAK;AAC/B,UAAM,qBAAqB,IAAI;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,CAAC,WAAyB;AAAA,QACzB,MAAM;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,YACJ,MAAM,MAAM;AAAA,YACZ,MAAM,MAAM;AAAA,UACb;AAAA,QACD;AAAA,MACD;AAAA;AAAA,MAEA,CAAC,WAA8B;AAAA,QAC9B,MAAM;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,YACJ,MAAM,MAAM;AAAA,YACZ,MAAM,oBAAyB,aAAO,MAAM,IAAI,CAAC;AAAA,UAClD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAGA,QAAI,YAAY;AAChB,eAAW,cAAc,aAAa;AACrC,UAAI,WAAW,2BAA2B,GAAG;AAC5C,YAAI;AACH,qBAAW,wBAAwB,EAAE,kBAAkB;AACvD;AAAA,QACD,SAAS,OAAO;AAGf,cAAI,iBAAwB,wBAAwB;AACnD,kBAAM;AAAA,UACP;AAEA,eAAK,OAAO,KAAK,MAAM;AAAA,YACtB,KAAK;AAAA,YACL,WAAW;AAAA,YACX,QAAQ,WAAW;AAAA,YACnB,OACC,iBAAiB,QACd,MAAM,UACN,OAAO,KAAK;AAAA,UACjB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL,WAAW;AAAA,MACX,iBAAiB,YAAY;AAAA,MAC7B;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eACC,WACmD;AACnD,WAAO,KAAK,mBAAmB,IAAI,SAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAqC;AACpC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,CAAC,WAAW,WAAW,KAAK,KAAK,oBAAoB;AAC/D,YAAM,IAAI,WAAW,YAAY,IAAI;AAAA,IACtC;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,6BAA6B,YAA6C;AACzE,eAAW,aAAa,CAAC,GAAG,WAAW,cAAc,OAAO,CAAC,GAAG;AAC/D,WAAK,mBAAmB,WAAW,YAAY,IAAI;AAAA,IACpD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAqB;AACxB,WAAO,KAAK,mBAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,yBAAiC;AACpC,QAAI,QAAQ;AACZ,eAAW,eAAe,KAAK,mBAAmB,OAAO,GAAG;AAC3D,eAAS,YAAY;AAAA,IACtB;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,WAA4B;AAC1C,UAAM,cAAc,KAAK,mBAAmB,IAAI,SAAS;AACzD,WAAO,gBAAgB,UAAa,YAAY,OAAO;AAAA,EACxD;AACD;;;ACnTA,YAAYC,WAAU;AAyBf,SAAS,4BACf,SACsB;AACtB,SAAO;AAAA,IACN,OACC,QAAQ,UAAU,SACf,oBAAyB,aAAO,QAAQ,KAAK,CAAC,IAC9C;AAAA,IACJ,gBAAgB,QAAQ;AAAA,IACxB,OAAO,oBAAyB,aAAO,QAAQ,KAAK,CAAC;AAAA,IACrD,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC,WAAW;AAAA,MACxD,SAAS,MAAM;AAAA,MACf,WAAW,OAAO,MAAM,SAAS;AAAA,MACjC,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ;AAAA,IACrB,EAAE;AAAA,EACH;AACD;AAEO,SAAS,8BACf,UACuB;AACvB,SAAO;AAAA,IACN,OAAO,SAAS,QACR,aAAO,IAAI,WAAW,SAAS,KAAK,CAAC,IAC1C;AAAA,IACH,gBAAgB,SAAS;AAAA,IACzB,OAAY,aAAO,IAAI,WAAW,SAAS,KAAK,CAAC;AAAA,IACjD,iBAAiB,SAAS,gBAAgB,IAAI,CAAC,WAAW;AAAA,MACzD,SAAS,MAAM;AAAA,MACf,WAAW,OAAO,MAAM,SAAS;AAAA,MACjC,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM,QAAQ;AAAA,IACrB,EAAE;AAAA,EACH;AACD;;;AClEA,YAAYC,WAAU;AAkDtB,IAAM,mBAAkC;AAAA,EACvC,QAAQ;AAAA,EACR,MAAM;AACP;AAEA,IAAM,qBAAqB,iBAAiB;AAC5C,IAAM,wBAAwB,oBAAoB;AAU3C,IAAM,eAAN,MASL;AAAA,EACD;AAAA,EACA;AAAA,EACA,WAAW,oBAAI,IAAyB;AAAA,EACxC,YAA2B,EAAE,GAAG,iBAAiB;AAAA,EACjD,oBAAoB,oBAAI,IAAqB;AAAA,EAC7C,sBAAsB,oBAAI,IAA+B;AAAA,EAEzD,YACC,OACA,QACC;AACD,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,OAAe;AAClB,WAAO,KAAK,UAAU;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,aAA4B;AACjC,UAAM,CAAC,cAAc,IAAI,MAAM,KAAK,QAAQ,WAAW,KAAK,OAAO,IAAI;AAAA,MACtE;AAAA,IACD,CAAC;AACD,QAAI,CAAC,gBAAgB;AACpB,YAAM,KAAK,QAAQ,WAAW,KAAK,OAAO,IAAI;AAAA,QAC7C,CAAC,oBAAoB,KAAK,mBAAmB,CAAC;AAAA,MAC/C,CAAC;AACD,WAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AACzD;AAAA,IACD;AACA,QAAI;AACH,YAAM,UACL,yBAAyB;AAAA,QACxB;AAAA,MACD;AACD,WAAK,UAAU,SAAS,QAAQ;AAChC,WAAK,UAAU,OAAO,OAAO,QAAQ,IAAI;AAAA,IAC1C,SAAS,OAAO;AACf,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,YAAM,KAAK,iBAAiB;AAAA,IAC7B;AACA,SAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,QAAQ,MAAc,MAAsC;AACjE,SAAK,OAAO,YAAY;AAExB,UAAM,YAAY,KAAK,OAAO,OAAO,QAAQ;AAC7C,QAAI,KAAK,UAAU,QAAQ,WAAW;AACrC,YAAM,IAAW,UAAU,SAAS;AAAA,IACrC;AAEA,QAAI,cAAc;AAClB,QACC,CAAC,mBAAmB,MAAM,CAAC,SAAS;AACnC,oBAAc;AAAA,IACf,CAAC,GACA;AACD,YAAM,IAAW,oBAAoB,WAAW;AAAA,IACjD;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,iBAAsB,aAAO,IAAI;AACvC,UAAM,iBACL,wBAAwB;AAAA,MACvB;AAAA,QACC;AAAA,QACA,MAAM,IAAI,WAAW,cAAc,EAAE;AAAA,QACrC,WAAW,OAAO,SAAS;AAAA,QAC3B,cAAc;AAAA,QACd,aAAa;AAAA,QACb,UAAU;AAAA,QACV,YAAY;AAAA,MACb;AAAA,MACAC;AAAA,IACD;AACD,UAAM,cAAc,eAAe;AACnC,QAAI,cAAc,KAAK,OAAO,OAAO,QAAQ,qBAAqB;AACjE,YAAM,IAAW;AAAA,QAChB;AAAA,QACA,KAAK,OAAO,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACD;AAEA,UAAM,KAAK,KAAK,UAAU;AAC1B,UAAM,aAAa,oBAAoB,EAAE;AAGzC,SAAK,UAAU,SAAS,KAAK;AAC7B,SAAK,UAAU,QAAQ;AACvB,UAAM,kBAAkB,KAAK,mBAAmB;AAGhD,UAAM,KAAK,QAAQ,WAAW,KAAK,OAAO,IAAI;AAAA,MAC7C,CAAC,YAAY,cAAc;AAAA,MAC3B,CAAC,oBAAoB,eAAe;AAAA,IACrC,CAAC;AAED,SAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AAEzD,UAAM,UAAwB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,SAAK,OAAO,gBAAgB;AAC5B,UAAM,KAAK,qBAAqB;AAChC,SAAK,wBAAwB,IAAI;AAEjC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACL,MACA,MACA,SACoE;AACpE,QAAI,YAAY,UAAa,WAAW,GAAG;AAC1C,aAAO,EAAE,QAAQ,WAAW;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM,KAAK,QAAQ,MAAM,IAAI;AAC7C,UAAM,YAAY,QAAQ,GAAG,SAAS;AACtC,UAAM,EAAE,SAAS,QAAQ,IAAI,qBAG1B,MAAM;AAAA,IAAC,CAAC;AAEX,UAAM,UAA6B,EAAE,QAAQ;AAC7C,QAAI,YAAY,QAAW;AAC1B,cAAQ,gBAAgB,WAAW,MAAM;AACxC,aAAK,oBAAoB,OAAO,SAAS;AACzC,gBAAQ,EAAE,QAAQ,WAAW,CAAC;AAAA,MAC/B,GAAG,OAAO;AAAA,IACX;AACA,SAAK,oBAAoB,IAAI,WAAW,OAAO;AAE/C,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,MAAM,gBACL,SACA,UACgB;AAChB,UAAM,KAAK,oBAAoB,QAAQ,IAAI,QAAQ;AAAA,EACpD;AAAA,EAEA,MAAM,oBACL,WACA,UACgB;AAChB,UAAM,kBAAkB,UAAU,SAAS;AAC3C,UAAM,UAAU,KAAK,oBAAoB,IAAI,eAAe;AAC5D,QAAI,SAAS;AACZ,UAAI,QAAQ,eAAe;AAC1B,qBAAa,QAAQ,aAAa;AAAA,MACnC;AACA,WAAK,oBAAoB,OAAO,eAAe;AAC/C,cAAQ,QAAQ,EAAE,QAAQ,aAAa,SAAS,CAAC;AAAA,IAClD;AAEA,UAAM,KAAK,mBAAmB,CAAC,SAAS,CAAC;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,QACL,OACA,OACA,SACA,aACA,cAAc,OACY;AAC1B,SAAK,OAAO,YAAY;AACxB,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK;AACtC,UAAM,UACL,SAAS,MAAM,SAAS,IAAI,IAAI,IAAI,KAAK,IAAI;AAE9C,UAAM,YAAY,MAAM,KAAK;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,QAAI,UAAU,SAAS,GAAG;AACzB,aAAO;AAAA,IACR;AACA,QAAI,YAAY,GAAG;AAClB,aAAO,CAAC;AAAA,IACT;AAEA,UAAM,EAAE,SAAS,SAAS,OAAO,IAAI,qBAEnC,MAAM;AAAA,IAAC,CAAC;AACV,UAAM,WAAW,OAAO,WAAW;AACnC,QAAI;AACJ,QAAI,YAAY;AAChB,QAAI;AACJ,QAAI;AAEJ,UAAM,UAAU,MAAM;AACrB,UAAI,WAAW;AACd;AAAA,MACD;AACA,kBAAY;AACZ,WAAK,SAAS,OAAO,QAAQ;AAC7B,UAAI,eAAe;AAClB,qBAAa,aAAa;AAC1B,wBAAgB;AAAA,MACjB;AACA;AACA;AACA,WAAK,OAAO,aAAa;AAAA,IAC1B;AACA,UAAM,gBAAgB,CAAC,aAA6B;AACnD,cAAQ;AACR,cAAQ,QAAQ;AAAA,IACjB;AACA,UAAM,eAAe,CAAC,UAAiB;AACtC,cAAQ;AACR,aAAO,KAAK;AAAA,IACb;AAEA,UAAM,SAAsB;AAAA,MAC3B,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACT;AAEA,SAAK,OAAO,eAAe;AAE3B,QAAI,YAAY,QAAW;AAC1B,sBAAgB,WAAW,MAAM;AAChC,sBAAc,CAAC,CAAC;AAAA,MACjB,GAAG,OAAO;AAAA,IACX;AAEA,UAAM,UAAU,MAAM;AACrB,mBAAa,IAAW,aAAa,CAAC;AAAA,IACvC;AACA,UAAM,SAAS,MAAM;AACpB,mBAAa,IAAW,aAAa,CAAC;AAAA,IACvC;AACA,UAAM,mBAAmB,KAAK,OAAO;AACrC,QAAI,iBAAiB,SAAS;AAC7B,aAAO;AACP,aAAO;AAAA,IACR;AACA,qBAAiB,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACjE,wBAAoB,MACnB,iBAAiB,oBAAoB,SAAS,MAAM;AAErD,QAAI,aAAa;AAChB,UAAI,YAAY,SAAS;AACxB,gBAAQ;AACR,eAAO;AAAA,MACR;AACA,kBAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC7D,2BAAqB,MACpB,YAAY,oBAAoB,SAAS,OAAO;AAAA,IAClD;AAEA,SAAK,SAAS,IAAI,UAAU,MAAM;AAClC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,aACL,OACA,aACgB;AAChB,UAAM,UACL,SAAS,MAAM,SAAS,IAAI,IAAI,IAAI,KAAK,IAAI;AAC9C,UAAM,WAAW,MAAM,KAAK,mBAAmB;AAC/C,QAAI,SAAS;AACZ,UAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,IAAI,QAAQ,IAAI,CAAC,GAAG;AAC1D;AAAA,MACD;AAAA,IACD,WAAW,SAAS,SAAS,GAAG;AAC/B;AAAA,IACD;AAEA,WAAO,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACnD,WAAK,OAAO,eAAe;AAC3B,YAAM,WAA4B;AAAA,QACjC;AAAA,QACA,SAAS,MAAM;AACd,eAAK,uBAAuB,QAAQ;AACpC,eAAK,OAAO,aAAa;AACzB,kBAAQ;AAAA,QACT;AAAA,QACA,QAAQ,CAAC,UAAU;AAClB,eAAK,uBAAuB,QAAQ;AACpC,eAAK,OAAO,aAAa;AACzB,iBAAO,KAAK;AAAA,QACb;AAAA,MACD;AAEA,YAAM,mBAAmB,KAAK,OAAO;AACrC,YAAM,eAAe,MACpB,SAAS,OAAO,IAAW,aAAa,CAAC;AAC1C,UAAI,iBAAiB,SAAS;AAC7B,qBAAa;AACb;AAAA,MACD;AACA,uBAAiB,iBAAiB,SAAS,cAAc;AAAA,QACxD,MAAM;AAAA,MACP,CAAC;AACD,eAAS,oBAAoB,MAC5B,iBAAiB,oBAAoB,SAAS,YAAY;AAE3D,UAAI,aAAa;AAChB,cAAM,UAAU,MACf,SAAS,OAAO,IAAW,aAAa,CAAC;AAC1C,YAAI,YAAY,SAAS;AACxB,kBAAQ;AACR;AAAA,QACD;AACA,oBAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC7D,iBAAS,qBAAqB,MAC7B,YAAY,oBAAoB,SAAS,OAAO;AAAA,MAClD;AAEA,WAAK,kBAAkB,IAAI,QAAQ;AAAA,IACpC,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAuC;AAC5C,WAAO,MAAM,KAAK,mBAAmB;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAkC;AAC1D,QAAI,IAAI,WAAW,GAAG;AACrB,aAAO,CAAC;AAAA,IACT;AACA,UAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AACpD,UAAM,UAAU,MAAM,KAAK,mBAAmB;AAC9C,UAAM,WAAW,QAAQ;AAAA,MAAO,CAAC,UAChC,MAAM,IAAI,MAAM,GAAG,SAAS,CAAC;AAAA,IAC9B;AACA,QAAI,SAAS,WAAW,GAAG;AAC1B,aAAO,CAAC;AAAA,IACT;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,WAAO,SAAS,IAAI,CAAC,UAAU,MAAM,EAAE;AAAA,EACxC;AAAA,EAEA,MAAM,eACL,SACA,OACA,aAC0B;AAC1B,QAAI,KAAK,UAAU,SAAS,GAAG;AAC9B,aAAO,CAAC;AAAA,IACT;AACA,UAAM,UAAU,MAAM,KAAK,mBAAmB;AAC9C,UAAM,UAAU,UACb,QAAQ,OAAO,CAAC,UAAU,QAAQ,IAAI,MAAM,IAAI,CAAC,IACjD;AACH,QAAI,QAAQ,WAAW,GAAG;AACzB,aAAO,CAAC;AAAA,IACT;AAEA,UAAM,WAAW,QAAQ,MAAM,GAAG,KAAK;AACvC,QAAI,CAAC,aAAa;AACjB,YAAM,KAAK,gBAAgB,QAAQ;AAAA,IACpC;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,WAAW,UAAU;AAC/B,WAAK,OAAO,eAAe,yBAAyB;AAAA,QACnD,oBAAoB,QAAQ;AAAA,QAC5B,0BAA0B,QAAQ,GAAG,SAAS;AAAA,QAC9C,6BAA6B,QAAQ;AAAA,QACrC,0BAA0B,MAAM,QAAQ;AAAA,MACzC,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,qBAA8C;AACnD,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC,KAAK,OAAO;AAAA,MACZ;AAAA,IACD;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,UAAI;AACH,cAAM,YAAY,sBAAsB,GAAG;AAC3C,cAAM,iBACL,wBAAwB;AAAA,UACvB;AAAA,QACD;AACD,cAAM,OAAY,aAAO,IAAI,WAAW,eAAe,IAAI,CAAC;AAC5D,gBAAQ,KAAK;AAAA,UACZ,IAAI;AAAA,UACJ,MAAM,eAAe;AAAA,UACrB;AAAA,UACA,WAAW,OAAO,eAAe,SAAS;AAAA,QAC3C,CAAC;AAAA,MACF,SAAS,OAAO;AACf,aAAK,OAAO,KAAK,MAAM;AAAA,UACtB,KAAK;AAAA,UACL;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AACA,YAAQ,KAAK,CAAC,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAE;AAC/D,QAAI,KAAK,UAAU,SAAS,QAAQ,QAAQ;AAC3C,WAAK,UAAU,OAAO,QAAQ;AAC9B,WAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AAAA,IAC1D;AACA,WAAO;AAAA,EACR;AAAA,EAEA,uBAAuB,UAAiC;AAvfzD;AAwfE,QAAI,KAAK,kBAAkB,OAAO,QAAQ,GAAG;AAC5C,qBAAS,sBAAT;AACA,qBAAS,uBAAT;AAAA,IACD;AAAA,EACD;AAAA,EAEA,wBAAwB,MAAoB;AAC3C,QAAI,KAAK,kBAAkB,SAAS,GAAG;AACtC;AAAA,IACD;AACA,eAAW,YAAY,CAAC,GAAG,KAAK,iBAAiB,GAAG;AACnD,UAAI,SAAS,WAAW,CAAC,SAAS,QAAQ,IAAI,IAAI,GAAG;AACpD;AAAA,MACD;AACA,WAAK,uBAAuB,QAAQ;AACpC,eAAS,QAAQ;AAAA,IAClB;AAAA,EACD;AAAA,EAEA,MAAM,gBAAgB,UAAyC;AAC9D,QAAI,SAAS,WAAW,GAAG;AAC1B;AAAA,IACD;AACA,UAAM,OAAO,SAAS,IAAI,CAAC,YAAY,oBAAoB,QAAQ,EAAE,CAAC;AAGtE,SAAK,UAAU,OAAO,KAAK;AAAA,MAC1B;AAAA,MACA,KAAK,UAAU,OAAO,SAAS;AAAA,IAChC;AAIA,UAAM,KAAK,QAAQ,cAAc,KAAK,OAAO,IAAI,IAAI;AACrD,UAAM,KAAK,QAAQ,WAAW,KAAK,OAAO,IAAI;AAAA,MAC7C,CAAC,oBAAoB,KAAK,mBAAmB,CAAC;AAAA,IAC/C,CAAC;AAED,SAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AAAA,EAC1D;AAAA,EAEA,MAAM,uBAAuB;AAC5B,QAAI,KAAK,SAAS,SAAS,GAAG;AAC7B;AAAA,IACD;AACA,UAAM,UAAU,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AAC1C,eAAW,UAAU,SAAS;AAC7B,YAAM,WAAW,MAAM,KAAK;AAAA,QAC3B,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACR;AACA,UAAI,SAAS,WAAW,GAAG;AAC1B;AAAA,MACD;AACA,WAAK,SAAS,OAAO,OAAO,EAAE;AAC9B,aAAO,QAAQ,QAAQ;AAAA,IACxB;AAAA,EACD;AAAA;AAAA,EAGA,MAAM,mBAAkC;AACvC,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC,KAAK,OAAO;AAAA,MACZ;AAAA,IACD;AAEA,QAAI,QAAQ;AACZ,eAAW,CAAC,GAAG,KAAK,SAAS;AAC5B,UAAI;AACH,cAAM,YAAY,sBAAsB,GAAG;AAC3C,YAAI,YAAY,OAAO;AACtB,kBAAQ;AAAA,QACT;AAAA,MACD,QAAQ;AAAA,MAER;AAAA,IACD;AAEA,SAAK,UAAU,SAAS,QAAQ;AAChC,SAAK,UAAU,OAAO,QAAQ;AAE9B,UAAM,KAAK,QAAQ,WAAW,KAAK,OAAO,IAAI;AAAA,MAC7C,CAAC,oBAAoB,KAAK,mBAAmB,CAAC;AAAA,IAC/C,CAAC;AACD,SAAK,OAAO,UAAU,gBAAgB,KAAK,UAAU,IAAI;AAAA,EAC1D;AAAA,EAEA,qBAAiC;AAChC,WAAO,yBAAyB;AAAA,MAC/B;AAAA,QACC,QAAQ,KAAK,UAAU;AAAA,QACvB,MAAM,KAAK,UAAU;AAAA,MACtB;AAAA,MACAA;AAAA,IACD;AAAA,EACD;AAED;;;AC1lBA,YAAYC,WAAU;AAgBf,IAAM,kBAAN,MASL;AAAA,EACD;AAAA,EACA;AAAA,EACA,mBAAmB,IAAI,mBAAmB;AAAA,EAC1C;AAAA;AAAA,EACA;AAAA;AAAA,EAEA,YACC,OACA,aACAC,SACC;AACD,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,UAAUA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,SAAc;AACxB,SAAK,WAAW;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACL,WACA,QACA,MACgB;AAChB,UAAM,WAAmC;AAAA,MACxC,SAAS,OAAO,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,MAAM,oBAAyB,aAAO,IAAI,CAAC;AAAA,IAC5C;AAEA,SAAK,OAAO,eAAe,oBAAoB;AAAA,MAC9C,2BAA2B,SAAS;AAAA,MACpC,yBAAyB,SAAS;AAAA,MAClC,+BAA+B,SAAS;AAAA,IACzC,CAAC;AAED,UAAM,KAAK,oBAAoB,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AApFhC;AAqFE,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,OAAO,IAAI,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,UAAQ,gBAAK,aAAL,mBAAe,oBAAf,mBAAgC,WAAU;AAAA,IACnD,CAAC;AAED,QAAI,GAAC,UAAK,aAAL,mBAAe,kBAAiB;AACpC,WAAK,OAAO,KAAK,MAAM,EAAE,KAAK,sBAAsB,CAAC;AACrD;AAAA,IACD;AAGA,UAAM,WAAW,KAAK,SAAS,gBAAgB;AAAA,MAC9C,CAAC,MAA8B,EAAE,aAAa;AAAA,IAC/C;AAEA,QAAI,aAAa,IAAI;AAEpB,WAAK,OAAO,KAAK,MAAM,EAAE,KAAK,wBAAwB,CAAC;AAGvD,UAAI,KAAK,SAAS,gBAAgB,SAAS,GAAG;AAC7C,cAAM,SAAS,KAAK,SAAS,gBAAgB,CAAC,EAAE;AAChD,aAAK,OAAO,IAAI,MAAM;AAAA,UACrB,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,OAAO,SAAS;AAAA,QACjB,CAAC;AACD,cAAM,KAAK,eAAe,MAAM;AAAA,MACjC;AACA;AAAA,IACD;AAGA,UAAM,YAAY,KAAK,SAAS,gBAAgB,OAAO,GAAG,WAAW,CAAC;AACtE,SAAK,OAAO,IAAI,MAAM;AAAA,MACrB,KAAK;AAAA,MACL,OAAO,UAAU;AAAA,IAClB,CAAC;AAGD,QAAI,KAAK,SAAS,gBAAgB,SAAS,GAAG;AAC7C,YAAM,SAAS,KAAK,SAAS,gBAAgB,CAAC,EAAE;AAChD,WAAK,OAAO,IAAI,KAAK;AAAA,QACpB,KAAK;AAAA,QACL;AAAA,QACA,iBAAiB,KAAK,SAAS,gBAAgB;AAAA,MAChD,CAAC;AACD,YAAM,KAAK,eAAe,MAAM;AAAA,IACjC;AAGA,UAAM,KAAK,kBAAkB,SAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAkC;AAlJzC;AAmJE,UAAI,gBAAK,aAAL,mBAAe,oBAAf,mBAAgC,UAAS,GAAG;AAC/C,YAAM,KAAK;AAAA,QACV,KAAK,SAAS,gBAAgB,CAAC,EAAE;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BAA2C;AAChD,QAAI,KAAK,iBAAiB,kBAAkB;AAC3C,YAAM,KAAK,iBAAiB;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAIE;AA1KH;AA2KE,QAAI,GAAC,UAAK,aAAL,mBAAe,kBAAiB;AACpC,aAAO;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,cAAc;AAAA,MACf;AAAA,IACD;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,KAAK,SAAS;AAE7B,WAAO;AAAA,MACN,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO,SAAS,IAAI,OAAO,CAAC,EAAE,YAAY;AAAA,MACzD,cAAc,OAAO;AAAA,QACpB,CAAC,MAA8B,EAAE,aAAa;AAAA,MAC/C,EAAE;AAAA,IACH;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,SAAmC;AArMtD;AAsME,QAAI,GAAC,UAAK,aAAL,mBAAe,kBAAiB;AACpC,aAAO;AAAA,IACR;AAEA,UAAM,QAAQ,KAAK,SAAS,gBAAgB;AAAA,MAC3C,CAAC,MAA8B,EAAE,YAAY;AAAA,IAC9C;AAEA,QAAI,UAAU,IAAI;AACjB,aAAO;AAAA,IACR;AAGA,UAAM,WAAW,UAAU;AAC3B,SAAK,SAAS,gBAAgB,OAAO,OAAO,CAAC;AAG7C,QAAI,YAAY,KAAK,SAAS,gBAAgB,SAAS,GAAG;AACzD,YAAM,KAAK;AAAA,QACV,KAAK,SAAS,gBAAgB,CAAC,EAAE;AAAA,MAClC;AAAA,IACD;AAEA,SAAK,OAAO,IAAI,KAAK;AAAA,MACpB,KAAK;AAAA,MACL;AAAA,MACA,iBAAiB,KAAK,SAAS,gBAAgB;AAAA,IAChD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA,EAIA,MAAM,oBAAoB,UAAiD;AAxO5E;AAyOE,SAAK,OAAO,IAAI,KAAK;AAAA,MACpB,KAAK;AAAA,MACL,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB,QAAQ,SAAS;AAAA,IAClB,CAAC;AAED,QAAI,GAAC,UAAK,aAAL,mBAAe,kBAAiB;AACpC,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC1C;AAGA,UAAM,cAAc,KAAK,SAAS,gBAAgB;AAAA,MACjD,CAAC,MAA8B,EAAE,YAAY,SAAS;AAAA,IACvD;AAEA,QAAI,gBAAgB,IAAI;AAEvB,WAAK,SAAS,gBAAgB,KAAK,QAAQ;AAAA,IAC5C,OAAO;AAEN,WAAK,SAAS,gBAAgB,OAAO,aAAa,GAAG,QAAQ;AAAA,IAC9D;AAGA,QAAI,gBAAgB,KAAK,KAAK,SAAS,gBAAgB,WAAW,GAAG;AACpE,WAAK,OAAO,IAAI,KAAK;AAAA,QACpB,KAAK;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,YAAY,KAAK,SAAS,gBAAgB;AAAA,MAC3C,CAAC;AACD,YAAM,KAAK,eAAe,SAAS,SAAS;AAAA,IAC7C;AAAA,EACD;AAAA,EAEA,MAAM,kBAAkB,QAAiD;AACxE,eAAW,SAAS,QAAQ;AAC3B,YAAM,OAAO,KAAK,OAAO;AAAA,QACxB,gBAAgB,MAAM,MAAM;AAAA,QAC5B;AAAA,UACC,qBAAqB,MAAM;AAAA,UAC3B,0BAA0B;AAAA,UAC1B,2BAA2B,MAAM;AAAA,UACjC,+BAA+B,MAAM;AAAA,QACtC;AAAA,MACD;AACA,UAAI;AACH,aAAK,OAAO;AAAA,UACX;AAAA,UACA;AAAA,YACC,2BAA2B,MAAM;AAAA,YACjC,yBAAyB,MAAM;AAAA,YAC/B,+BAA+B,MAAM;AAAA,UACtC;AAAA,UACA;AAAA,QACD;AACA,aAAK,OAAO,IAAI,KAAK;AAAA,UACpB,KAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,QACf,CAAC;AAGD,cAAM,UAAU,KAAK,QAAQ,WAAW,CAAC;AACzC,cAAM,KAAK,QAAQ,MAAM,MAAM;AAE/B,YAAI,CAAC,IAAI;AACR,gBAAM,IAAI;AAAA,YACT,uCAAuC,MAAM,MAAM;AAAA,UACpD;AAAA,QACD;AAEA,YAAI,OAAO,OAAO,YAAY;AAC7B,gBAAM,IAAI;AAAA,YACT,0BAA0B,MAAM,MAAM,2BAA2B,OAAO,EAAE;AAAA,UAC3E;AAAA,QACD;AAGA,cAAM,OAAO,MAAM,OACX,aAAO,IAAI,WAAW,MAAM,IAAI,CAAC,IACtC,CAAC;AAEJ,cAAM,SAAS,KAAK,OAAO,OAAO;AAAA,UAAS;AAAA,UAAM,MAChD,GAAG,KAAK,QAAW,KAAK,OAAO,cAAc,GAAG,IAAI;AAAA,QACrD;AAGA,YAAI,kBAAkB,SAAS;AAC9B,gBAAM;AAAA,QACP;AAEA,aAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7C,aAAK,OAAO,IAAI,MAAM;AAAA,UACrB,KAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,QACf,CAAC;AAAA,MACF,SAAS,OAAO;AACf,aAAK,OAAO,OAAO,cAAc,MAAM;AAAA,UACtC,iBAAiB,eAAe,KAAK;AAAA,UACrC,cACC,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,QAC/C,CAAC;AACD,aAAK,OAAO,aAAa,MAAM;AAAA,UAC9B,MAAM;AAAA,UACN,SAAS,eAAe,KAAK;AAAA,QAC9B,CAAC;AACD,aAAK,OAAO,IAAI,MAAM;AAAA,UACrB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,UAC3B,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,QACf,CAAC;AAAA,MAGF;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,eAAe,WAAkC;AACtD,UAAM,KAAK,iBAAiB,QAAQ,YAAY;AAC/C,YAAM,KAAK,aAAa,SAAS,KAAK,QAAQ,SAAS;AAAA,IACxD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAA8C;AA5W/C;AA6WE,QACC,GAAC,UAAK,aAAL,mBAAe,oBAChB,KAAK,SAAS,gBAAgB,WAAW,GACxC;AACD,aAAO;AAAA,IACR;AACA,WAAO,KAAK,SAAS,gBAAgB,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAyC;AAzX1C;AA0XE,aAAO,UAAK,aAAL,mBAAe,oBAAmB,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAuB;AAjYxB;AAkYE,SAAI,UAAK,aAAL,mBAAe,iBAAiB;AACnC,WAAK,SAAS,kBAAkB,CAAC;AACjC,WAAK,OAAO,IAAI,KAAK,EAAE,KAAK,+BAA+B,CAAC;AAAA,IAC7D;AAAA,EACD;AACD;;;ACvYA,SAAS,eAAe;AACxB,OAAO,cAAc;AAsCd,IAAM,eAAN,MAOL;AAAA,EACD;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,qBAAqB;AAAA;AAAA,EAGrB,qBAAqB,IAAI,mBAAmB;AAAA,EAC5C,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EACA;AAAA,EAEA,YACC,OACA,aACAC,SACC;AACD,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,UAAUA;AACf,SAAK,qBAAqBA,QAAO,QAAQ,qBAAqB;AAAA,EAC/D;AAAA;AAAA,EAIA,IAAI,UAAgC;AACnC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,aAAmC;AACtC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,iBAA0B;AAC7B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,QAAW;AACd,SAAK,sBAAsB;AAC3B,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEA,IAAI,MAAM,OAAU;AACnB,SAAK,sBAAsB;AAC3B,SAAK,SAAS,QAAQ;AAAA,EACvB;AAAA,EAEA,IAAI,eAAwB;AAC3B,WAAO,iBAAiB,KAAK,WAAW,WAAW,KAAK;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,aAAkD;AACvE,QAAI,CAAC,YAAY,gBAAgB;AAEhC,UAAI;AACJ,UAAI,KAAK,cAAc;AACtB,aAAK,OAAO,KAAK,KAAK,EAAE,KAAK,2BAA2B,CAAC;AAEzD,YAAI,iBAAiB,KAAK,SAAS;AAClC,sBAAY,MAAM,KAAK,OAAO;AAAA,YAC7B;AAAA,YACA;AAAA,YACA,MACC,KAAK,QAAQ;AAAA,cACZ,KAAK,OAAO;AAAA,cACZ,YAAY;AAAA,YACb;AAAA,UACF;AAAA,QACD,WAAW,WAAW,KAAK,SAAS;AACnC,sBAAY,gBAAgB,KAAK,QAAQ,KAAK;AAAA,QAC/C,OAAO;AACN,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAAA,MACD,OAAO;AACN,aAAK,OAAO,KAAK,MAAM,EAAE,KAAK,oBAAoB,CAAC;AAAA,MACpD;AAGA,kBAAY,QAAQ;AACpB,kBAAY,iBAAiB;AAM7B,YAAM,WAAW,4BAAkC,WAAW;AAC9D,YAAM,KAAK,aAAa,WAAW,KAAK,OAAO,IAAI;AAAA,QAClD;AAAA,UACC,KAAK;AAAA,UACL,gBAAgB;AAAA,YACf;AAAA,YACAC;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAGA,SAAK,iBAAiB,WAAW;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAA8B;AAE9C,SAAK,cAAc;AAGnB,QAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AAClD,UAAI,cAAc;AAClB,UACC,CAAC;AAAA,QACA;AAAA,QACA,CAAC,SAAS;AACT,wBAAc;AAAA,QACf;AAAA,QACA;AAAA,MACD,GACC;AACD,cAAM,IAAW,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAAA,MACxD;AACA,aAAO;AAAA,IACR;AAGA,QAAI,KAAK,UAAU;AAClB,eAAS,YAAY,KAAK,QAAQ;AAAA,IACnC;AAGA,SAAK,WAAW;AAAA,MACf;AAAA,MACA,CACC,MACA,OACA,gBACA,eACI;AACJ,aAAK,mBAAmB,MAAM,KAAK;AAAA,MACpC;AAAA,MACA,EAAE,gBAAgB,KAAK;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,MAAuC;AApNxD;AAqNE,SAAK,OAAO,YAAY,KAAK,kBAAkB;AAE/C,QAAI,KAAK,iBAAiB;AACzB,UAAI,KAAK,WAAW;AACnB,cAAM,KAAK,kBAAkB;AAAA,MAC9B,OAAO;AAEN,YAAI,CAAC,KAAK,wBAAwB;AACjC,eAAK,yBAAyB,qBAAqB,CAAC,WAAW,qBAAqB,EAAE,KAAK,EAAE,KAAK,6CAA6C,OAAO,CAAC,CAAC;AAAA,QACzJ;AAGA,aAAK,qBAAqB,KAAK,OAAO;AAGtC,gBAAM,UAAK,2BAAL,mBAA6B;AAAA,MACpC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,SAAkB;AACtC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,oBAAoB,MAAM,KAAK;AAGrC,QAAI,YAAY,KAAK;AAAA,MACpB;AAAA,MACA,KAAK,qBAAqB;AAAA,IAC3B;AACA,QAAI,YAAY,QAAW;AAC1B,kBAAY,KAAK,IAAI,WAAW,OAAO;AAAA,IACxC;AAGA,QACC,KAAK,wBAAwB,UAC7B,KAAK,mCAAmC,QACvC;AAED,YAAM,wBAAwB,MAAM;AACpC,UAAI,wBAAwB,KAAK,gCAAgC;AAEhE,qBAAa,KAAK,mBAAmB;AACrC,aAAK,sBAAsB;AAC3B,aAAK,iCAAiC;AAAA,MACvC,OAAO;AAEN;AAAA,MACD;AAAA,IACD;AAEA,QAAI,YAAY,GAAG;AAElB,WAAK,iCAAiC,MAAM;AAC5C,WAAK,sBAAsB,WAAW,MAAM;AAC3C,aAAK,sBAAsB;AAC3B,aAAK,iCAAiC;AACtC,aAAK,kBAAkB,EAAE,MAAM,CAAC,UAAU;AACzC,eAAK,OAAO,KAAK,MAAM;AAAA,YACtB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AAAA,QACF,CAAC;AAAA,MACF,GAAG,SAAS;AAAA,IACb,OAAO;AAEN,WAAK,kBAAkB,EAAE,MAAM,CAAC,UAAU;AACzC,aAAK,OAAO,KAAK,MAAM;AAAA,UACtB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AAAA,MACF,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B;AACzB,QAAI,KAAK,qBAAqB;AAC7B,mBAAa,KAAK,mBAAmB;AACrC,WAAK,sBAAsB;AAC3B,WAAK,iCAAiC;AAAA,IACvC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAsC;AAC3C,QAAI,KAAK,mBAAmB,kBAAkB;AAC7C,YAAM,KAAK,mBAAmB;AAAA,IAC/B;AAAA,EACD;AAAA;AAAA,EAIA,wBAAwB;AACvB,QAAI,CAAC,KAAK,cAAc;AACvB,YAAM,IAAW,gBAAgB;AAAA,IAClC;AAAA,EACD;AAAA,EAEA,mBAAmB,MAAc,OAAY;AAC5C,UAAM,iBAAiB,YAAY,IAAI;AACvC,UAAM,gBAAgB,gBAAgB,IAAI;AAG1C,QAAI,kBAAkB,eAAe;AACpC,UAAI,cAAc;AAClB,UACC,CAAC;AAAA,QACA;AAAA,QACA,CAAC,oBAAoB;AACpB,wBAAc;AAAA,QACf;AAAA,QACA;AAAA,MACD,GACC;AACD,cAAM,IAAW,iBAAiB;AAAA,UACjC,MAAM,QAAQ,cAAc,IAAI,WAAW,KAAK;AAAA,QACjD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,SAAK,OAAO,KAAK,MAAM;AAAA,MACtB,KAAK;AAAA,MACL;AAAA,IACD,CAAC;AACD,SAAK,kBAAkB;AAGvB,QAAI,gBAAgB;AACnB,WAAK,OAAO,UAAU,QAAQ;AAAA,QAC7B;AAAA,QACA,KAAK,SAAS;AAAA,MACf;AAAA,IACD;AAGA,QACC,kBACA,KAAK,QAAQ,iBACb,KAAK,OAAO,QAAQ,KACpB,CAAC,KAAK,oBACL;AACD,YAAM,OAAO,KAAK,OAAO,eAAe,uBAAuB;AAAA,QAC9D,oBAAoB;AAAA,MACrB,CAAC;AACD,UAAI;AACH,aAAK,qBAAqB;AAC1B,aAAK,OAAO,OAAO;AAAA,UAAS;AAAA,UAAM,MACjC,KAAK,QAAQ;AAAA,YACZ,KAAK,OAAO;AAAA,YACZ,KAAK,YAAY;AAAA,UAClB;AAAA,QACD;AACA,aAAK,OAAO,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,MAC9C,SAAS,OAAO;AACf,aAAK,OAAO,aAAa,MAAM;AAAA,UAC9B,MAAM;AAAA,UACN,SAAS,eAAe,KAAK;AAAA,QAC9B,CAAC;AACD,aAAK,OAAO,KAAK,MAAM;AAAA,UACtB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AAAA,MACF,UAAE;AACD,aAAK,qBAAqB;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,oBAAoB;AAxY3B;AAyYE,SAAK,OAAO,KAAK,KAAK;AAAA,MACrB,KAAK;AAAA,MACL,gBAAgB,KAAK;AAAA,MACrB,6BACC,KAAK,OAAO,kBAAkB,wBAAwB;AAAA,MACvD,4BAA4B,MAAM;AAAA,QACjC,KAAK,OAAO,kBAAkB;AAAA,MAC/B;AAAA,IACD,CAAC;AAED,QAAI;AACH,WAAK,gBAAgB,KAAK,IAAI;AAG9B,YAAM,aACL,KAAK,mBACL,KAAK,OAAO,kBAAkB,wBAAwB,OAAO;AAE9D,UAAI,YAAY;AACf,cAAM,KAAK,mBAAmB,QAAQ,YAAY;AACjD,eAAK,OAAO,KAAK,MAAM;AAAA,YACtB,KAAK;AAAA,YACL,cAAc,KAAK;AAAA,YACnB,oBACC,KAAK,OAAO,kBACV,wBAAwB;AAAA,UAC5B,CAAC;AAED,gBAAM,UAA2C,CAAC;AAGlD,cAAI,KAAK,iBAAiB;AACzB,iBAAK,kBAAkB;AACvB,kBAAM,WAAW;AAAA,cAChB,KAAK;AAAA,YACN;AACA,oBAAQ,KAAK;AAAA,cACZ,KAAK;AAAA,cACL,gBAAgB;AAAA,gBACf;AAAA,gBACAA;AAAA,cACD;AAAA,YACD,CAAC;AAAA,UACF;AAGA,gBAAM,cAA8B,CAAC;AACrC,qBAAW,UAAU,KAAK,OAAO,kBAC/B,yBAAyB;AAC1B,kBAAM,OAAO,KAAK,OAAO,MAAM,IAAI,MAAM;AACzC,gBAAI,CAAC,MAAM;AACV,mBAAK,OAAO,KAAK,KAAK;AAAA,gBACrB,KAAK;AAAA,gBACL;AAAA,cACD,CAAC;AACD;AAAA,YACD;AAEA,kBAAM,mBACL,KAAK,yBAAyB;AAC/B,kBAAM,sBACL,iBAAiB;AAClB,gBAAI,CAAC,qBAAqB;AACzB,mBAAK,OAAO,IAAI,KAAK;AAAA,gBACpB,KAAK;AAAA,gBACL,QAAQ,KAAK;AAAA,cACd,CAAC;AACD;AAAA,YACD;AAEA,iBAAK,OAAO,KAAK,KAAK;AAAA,cACrB,KAAK;AAAA,cACL;AAAA,cACA,WAAW,QAAQ,oBAAoB,SAAS;AAAA,cAChD,WAAW,QAAQ,oBAAoB,SAAS;AAAA,cAChD,oBACC,oBAAoB;AAAA,cACrB,oBACC,oBAAoB;AAAA,cACrB,UAAU,oBAAoB,UAAU;AAAA,YACzC,CAAC;AAED,kBAAM,WAAW;AAAA,cAChB;AAAA,YACD;AACA,kBAAM,WACL,eAAe;AAAA,cACd;AAAA,cACAA;AAAA,YACD;AAED,oBAAQ,KAAK,CAAC,YAAY,MAAM,GAAG,QAAQ,CAAC;AAC5C,wBAAY,KAAK,IAAI;AAAA,UACtB;AAEA,eAAK,OAAO,KAAK,KAAK;AAAA,YACrB,KAAK;AAAA,YACL,cAAc,QAAQ;AAAA,YACtB,mBAAmB,YAAY;AAAA,YAC/B,eAAe,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,UAC3C,CAAC;AAGD,cAAI,KAAK,aAAa,qBAAqB;AAC1C,uBAAW,QAAQ,aAAa;AAC/B,mBAAK,aAAa,oBAAoB,IAAI;AAAA,YAC3C;AAAA,UACD;AAGA,eAAK,OAAO,kBAAkB,4BAA4B;AAG1D,eAAK,OAAO,KAAK,KAAK;AAAA,YACrB,KAAK;AAAA,YACL,SAAS,KAAK,OAAO;AAAA,YACrB,cAAc,QAAQ;AAAA,UACvB,CAAC;AACD,gBAAM,KAAK,aAAa,WAAW,KAAK,OAAO,IAAI,OAAO;AAC1D,eAAK,OAAO,KAAK,KAAK;AAAA,YACrB,KAAK;AAAA,UACN,CAAC;AAGD,cAAI,KAAK,aAAa,oBAAoB;AACzC,uBAAW,QAAQ,aAAa;AAC/B,mBAAK,aAAa,mBAAmB,IAAI;AAAA,YAC1C;AAAA,UACD;AAEA,eAAK,OAAO,KAAK,MAAM,EAAE,KAAK,gBAAgB,CAAC;AAAA,QAChD,CAAC;AAAA,MACF,OAAO;AACN,aAAK,OAAO,KAAK,KAAK;AAAA,UACrB,KAAK;AAAA,QACN,CAAC;AAAA,MACF;AAEA,iBAAK,2BAAL,mBAA6B;AAAA,IAC9B,SAAS,OAAO;AACf,WAAK,OAAO,KAAK,MAAM;AAAA,QACtB,KAAK;AAAA,QACL,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AACD,iBAAK,2BAAL,mBAA6B,OAAO;AACpC,YAAM;AAAA,IACP;AAAA,EACD;AACD;;;ACzhBA,SAAS,aAAa,QAAoB,KAA6B;AACtE,QAAM,SAAS,IAAI,WAAW,OAAO,SAAS,IAAI,MAAM;AACxD,SAAO,IAAI,QAAQ,CAAC;AACpB,SAAO,IAAI,KAAK,OAAO,MAAM;AAC7B,SAAO;AACR;AAEA,SAAS,YAAY,QAAoB,KAA6B;AACrE,SAAO,IAAI,MAAM,OAAO,MAAM;AAC/B;AAEA,SAAS,aAAa,GAAe,GAAuB;AAC3D,QAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AACvC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG;AAClB,aAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IAClB;AAAA,EACD;AACA,SAAO,EAAE,SAAS,EAAE;AACrB;AAEO,IAAM,oBAAN,MAAgD;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAAqB,SAAiB;AACjD,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,UAAU,oBAAoB;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,KAA6C;AACtD,UAAM,CAAC,KAAK,IAAI,MAAM,KAAK,QAAQ,WAAW,KAAK,UAAU;AAAA,MAC5D,aAAa,KAAK,SAAS,GAAG;AAAA,IAC/B,CAAC;AACD,WAAO,SAAS;AAAA,EACjB;AAAA,EAEA,MAAM,IAAI,KAAiB,OAAkC;AAC5D,UAAM,KAAK,QAAQ,WAAW,KAAK,UAAU;AAAA,MAC5C,CAAC,aAAa,KAAK,SAAS,GAAG,GAAG,KAAK;AAAA,IACxC,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAgC;AAC5C,UAAM,KAAK,QAAQ,cAAc,KAAK,UAAU;AAAA,MAC/C,aAAa,KAAK,SAAS,GAAG;AAAA,IAC/B,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,QAAmC;AACrD,UAAM,aAAa,aAAa,KAAK,SAAS,MAAM;AACpD,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC,KAAK;AAAA,MACL;AAAA,IACD;AACA,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AACA,UAAM,KAAK,QAAQ;AAAA,MAClB,KAAK;AAAA,MACL,QAAQ,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AAAA,IAC3B;AAAA,EACD;AAAA,EAEA,MAAM,KACL,QACyD;AACzD,UAAM,aAAa,aAAa,KAAK,SAAS,MAAM;AACpD,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC,KAAK;AAAA,MACL;AAAA,IACD;AACA,WAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,MACrC,KAAK,YAAY,KAAK,SAAS,GAAG;AAAA,MAClC;AAAA,IACD,EAAE;AAAA,EACH;AAAA,EAEA,MAAM,UACL,OACA,KACA,SACyD;AACzD,UAAM,YAAY,aAAa,KAAK,SAAS,KAAK;AAClD,UAAM,UAAU,aAAa,KAAK,SAAS,GAAG;AAC9C,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,UAAM,WAAW,QACf,OAAO,CAAC,CAAC,GAAG,MAAM;AAClB,aACC,aAAa,KAAK,SAAS,KAAK,KAChC,aAAa,KAAK,OAAO,IAAI;AAAA,IAE/B,CAAC,EACA,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,aAAa,MAAM,IAAI,CAAC;AACnD,QAAI,mCAAS,SAAS;AACrB,eAAS,QAAQ;AAAA,IAClB;AACA,UAAM,WAAU,mCAAS,SACtB,SAAS,MAAM,GAAG,QAAQ,KAAK,IAC/B;AACH,WAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,MACrC,KAAK,YAAY,KAAK,SAAS,GAAG;AAAA,MAClC;AAAA,IACD,EAAE;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,QAAsE;AACjF,QAAI,OAAO,WAAW,GAAG;AACxB;AAAA,IACD;AACA,UAAM,KAAK,QAAQ;AAAA,MAClB,KAAK;AAAA,MACL,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM;AAAA,QAC9B,aAAa,KAAK,SAAS,GAAG;AAAA,QAC9B;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;AVjDA,IAAK,WAAL,kBAAKC,cAAL;AACC,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AACA,EAAAA,oBAAA;AARI,SAAAA;AAAA,GAAA;AAuCE,IAAM,gBAAN,MASL;AAAA;AAAA,EAED;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd;AAAA,EACA,mBAAmB,IAAI,gBAAgB;AAAA;AAAA,EAGvC;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA,sBAAuC,CAAC;AAAA,EACxC;AAAA,EACA,oBAAoB;AAAA,EACpB,wBAAwB;AAAA;AAAA,EAGxB,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA;AAAA,EAGxB;AAAA;AAAA,EAGA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA,YAAYC,SAAgD;AAC3D,SAAK,UAAUA;AACf,SAAK,eAAe,IAAI,aAAa,IAAI;AACzC,SAAK,aAAa,IAAI,eAAe,IAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAI,MAAc;AACjB,IAAAC,WAAU,KAAK,MAAM,oBAAoB;AACzC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,OAAe;AAClB,IAAAA,WAAU,KAAK,OAAO,oBAAoB;AAC1C,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,aAAsB;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,KAAa;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,OAAe;AAClB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,MAAgB;AACnB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,SAAiB;AACpB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,eAAsC;AACzC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,YAA4B;AAC/B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,SAAoD;AACvD,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,iBAAqC;AACxC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,sBAAyC;AACxC,WAAO,KAAK,QAAQ,eAAe;AAAA,EACpC;AAAA,EAEA,eACC,MACA,YACa;AACb,WAAO,KAAK,QAAQ,UAAU,MAAM;AAAA,MACnC,QAAQ,KAAK,QAAQ,eAAe,KAAK;AAAA,MACzC,YAAY,KAAK,iBAAiB,UAAU;AAAA,IAC7C,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,QAAoB,QAAgC;AAChE,SAAK,QAAQ,QAAQ,QAAQ,SAAS,EAAE,OAAO,IAAI,MAAS;AAAA,EAC7D;AAAA,EAEA,MAAM,eACL,MACA,YACA,IACa;AACb,UAAM,OAAO,KAAK,eAAe,MAAM,UAAU;AACjD,QAAI;AACH,YAAM,SAAS,KAAK,QAAQ,SAAS,MAAM,EAAE;AAC7C,YAAM,WAAW,kBAAkB,UAAU,MAAM,SAAS;AAC5D,WAAK,QAAQ,QAAQ,MAAM;AAAA,QAC1B,QAAQ,EAAE,MAAM,KAAK;AAAA,MACtB,CAAC;AACD,aAAO;AAAA,IACR,SAAS,OAAO;AACf,WAAK,QAAQ,QAAQ,MAAM;AAAA,QAC1B,QAAQ;AAAA,UACP,MAAM;AAAA,UACN,SAAS,eAAe,KAAK;AAAA,QAC9B;AAAA,MACD,CAAC;AACD,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,eACC,MACA,YACA,QACO;AACP,UAAM,OAAO,UAAU,KAAK,QAAQ,eAAe;AACnD,QAAI,CAAC,MAAM;AACV;AAAA,IACD;AACA,SAAK,QAAQ,UAAU,MAAM,MAAM;AAAA,MAClC,YAAY,KAAK,iBAAiB,UAAU;AAAA,MAC5C,YAAY,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACF;AAAA,EAEA,IAAI,QAAsD;AACzD,WAAO,KAAK,kBAAkB;AAAA,EAC/B;AAAA,EAEA,IAAI,WAAqB;AACxB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,cAA2B;AAC9B,WAAO,KAAK,iBAAiB;AAAA,EAC9B;AAAA,EAEA,IAAI,UAAoB;AACvB,WAAO,OAAO,KAAK,KAAK,QAAQ,WAAW,CAAC,CAAC;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAiD;AACpD,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,UAAgC;AACnC,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA,EAEA,IAAI,QAAW;AACd,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA,EAEA,IAAI,MAAM,OAAU;AACnB,SAAK,aAAa,QAAQ;AAAA,EAC3B;AAAA,EAEA,IAAI,eAAwB;AAC3B,WAAO,KAAK,aAAa;AAAA,EAC1B;AAAA,EAEA,IAAI,mBAA4B;AAC/B,WAAO,qBAAqB,KAAK,WAAW,eAAe,KAAK;AAAA,EACjE;AAAA;AAAA,EAGA,IAAI,OAAU;AACb,SAAK,qBAAqB;AAC1B,IAAAA,WAAU,KAAK,UAAU,QAAW,kBAAkB;AACtD,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,KAA8B;AACjC,QAAI,CAAC,KAAK,KAAK;AACd,YAAM,IAAW,mBAAmB;AAAA,IACrC;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MACL,aACA,cACA,SACA,MACA,KACA,QACC;AApXH;AAsXE,SAAK,SAAS;AACd,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,kBAAkB,kBAAkB,KAAK,IAAI;AAClD,SAAK,UAAU;AAGf,SAAK,kBAAkB;AAGvB,SAAK,mBAAmB;AAGxB,SAAK,oBAAoB,IAAI,kBAAkB,IAAI;AACnD,SAAK,eAAe,IAAI,aAAa,MAAM,aAAa,KAAK,OAAO;AACpE,SAAK,eAAe,IAAI,aAAa,IAAI;AACzC,SAAK,eAAe,IAAI,aAAa,MAAM,WAAW;AACtD,SAAK,mBAAmB,IAAI;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACN;AAGA,SAAK,YAAY,IAAI,SAAS,IAAI;AAGlC,UAAM,KAAK,WAAW;AAEtB,UAAM,KAAK,aAAa,WAAW;AAGnC,UAAM,KAAK,0BAA0B;AAGrC,QAAI,KAAK,cAAc;AACtB,YAAM,KAAK,gBAAgB;AAAA,IAC5B;AAGA,UAAM,KAAK,aAAa;AAGxB,UAAM,KAAK,eAAe;AAG1B,UAAM,KAAK,iBAAiB,iBAAiB;AAG7C,SAAK,SAAS;AAMd,YAAM,gBAAK,QAAO,uBAAZ,4BAAiC;AAMvC,SAAK,WAAW;AAChB,SAAK,MAAM,KAAK,EAAE,KAAK,gBAAgB,CAAC;AAIxC,SAAK,gBAAgB;AAGrB,SAAK,iBAAiB;AAGtB,UAAM,KAAK,QAAQ;AAAA,EACpB;AAAA;AAAA,EAGA,UAAmB;AAClB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAY,qBAA8B,OAAO;AAChD,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAW,cAAc,iBAAiB;AAClE,QAAI,CAAC,sBAAsB,KAAK;AAC/B,YAAM,IAAW,cAAc,mBAAmB;AAAA,EACpD;AAAA,EAEA,MAAM,4BAA4B,QAAkC;AACnE,SAAK,YAAY,IAAI;AACrB,WAAO,MAAM,KAAK,kBAAkB;AAAA,MACnC;AAAA,IACD;AAAA,EACD;AAAA;AAAA,EAGA,MAAM,OAAO,MAA2B;AACvC,QAAI,KAAK,aAAa;AACrB,WAAK,MAAM,KAAK,EAAE,KAAK,yBAAyB,CAAC;AACjD;AAAA,IACD;AACA,SAAK,cAAc;AACnB,SAAK,MAAM,KAAK;AAAA,MACf,KAAK;AAAA,MACL;AAAA,IACD,CAAC;AAED,QAAI;AAEH,UAAI,KAAK,eAAe;AACvB,qBAAa,KAAK,aAAa;AAC/B,aAAK,gBAAgB;AAAA,MACtB;AAGA,UAAI;AACH,aAAK,iBAAiB,MAAM;AAAA,MAC7B,QAAQ;AAAA,MAAE;AAGV,YAAM,KAAK,mBAAmB,KAAK,QAAQ,QAAQ,cAAc;AAGjE,UAAI,SAAS,SAAS;AACrB,cAAM,KAAK,aAAa;AAAA,MACzB,WAAW,SAAS,WAAW;AAC9B,cAAM,KAAK,eAAe;AAAA,MAC3B,OAAO;AACN,0BAAkB,IAAI;AAAA,MACvB;AAGA,YAAM,KAAK,uBAAuB;AAGlC,YAAM,KAAK;AAAA,QACV,KAAK,QAAQ,QAAQ;AAAA,MACtB;AAGA,WAAK,MAAM,KAAK,EAAE,KAAK,iCAAiC,CAAC;AACzD,WAAK,aAAa,wBAAwB;AAC1C,WAAK,MAAM,KAAK,EAAE,KAAK,2BAA2B,CAAC;AACnD,YAAM,KAAK,aAAa,UAAU;AAAA,QACjC,WAAW;AAAA,QACX,oBAAoB;AAAA,MACrB,CAAC;AAGD,YAAM,KAAK,aAAa,qBAAqB;AAC7C,YAAM,KAAK,iBAAiB,0BAA0B;AAAA,IACvD,UAAE;AACD,YAAM,KAAK,iBAAiB;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA,EAGA,aAAa;AAnhBd;AAohBE,QAAI,KAAK,eAAe,KAAK,gBAAgB;AAC5C,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,MACN,CAAC;AACD;AAAA,IACD;AAEA,QAAI,KAAK,cAAc;AACtB,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,MACN,CAAC;AACD;AAAA,IACD;AACA,SAAK,eAAe;AAEpB,UAAM,SAAQ,UAAK,OAAO,eAAZ,mBAAwB,KAAK,KAAK,QAAQ,KAAK;AAC7D,IAAAA,WAAU,KAAK,oBAAoB,wBAAwB;AAC3D,IAAAA,WAAU,OAAO,oBAAoB;AAErC,SAAK,MAAM,KAAK,EAAE,KAAK,iBAAiB,CAAC;AAGzC,iBAAa,MAAM;AAClB,YAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,eAAe;AACd,QAAI,KAAK,eAAe,KAAK,cAAc;AAC1C,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,MACN,CAAC;AACD;AAAA,IACD;AAEA,QAAI,KAAK,gBAAgB;AACxB,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,MACN,CAAC;AACD;AAAA,IACD;AACA,SAAK,iBAAiB;AAEtB,UAAM,UAAU,KAAK,OAAO,aAAa;AAAA,MACxC,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAEA,SAAK,MAAM,KAAK,EAAE,KAAK,mBAAmB,CAAC;AAG3C,iBAAa,MAAM;AAClB,cAAQ;AAAA,IACT,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,uBAAuB;AACtB,SAAK;AACL,SAAK,gBAAgB;AAAA,EACtB;AAAA,EAEA,qBAAqB;AACpB,SAAK;AACL,QAAI,KAAK,0BAA0B,GAAG;AACrC,WAAK,0BAA0B;AAC/B,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,QACL,GAAG;AAAA,MACJ,CAAC;AAAA,IACF;AACA,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,eACL,SAWA,MACC;AACD,UAAM,eAAe,SAAS,MAAM,MAAM;AAAA,MACzC,iBAAiB,OAAO,KAAK,MAAM,SAAS;AAC3C,eAAO,MAAM,KAAK,cAAc,KAAK,MAAM,IAAI;AAAA,MAChD;AAAA,MACA,aAAa,OAAO,WAAWC,UAAS;AACvC,aAAK,aAAa,gBAAgB,WAAWA,OAAM,KAAK;AAAA,MACzD;AAAA,MACA,eAAe,OAAO,WAAWA,UAAS;AACzC,aAAK,aAAa,mBAAmB,WAAWA,OAAM,KAAK;AAAA,MAC5D;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,mBACL,KACA,WACgB;AAChB,UAAM,eAAe,qBAAqB,KAAK,QAAQ,QAAQ,SAAS;AACxE,QAAI,CAAC,cAAc;AAClB;AAAA,IACD;AAEA,UAAM,SAAS,MAAM,aAAa,GAAG;AACrC,QAAI,OAAO,WAAW,WAAW;AAChC,YAAM,IAAW,4BAA4B;AAAA,IAC9C;AACA,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAW,UAAU;AAAA,IAC5B;AAAA,EACD;AAAA,EAEA,MAAM,iBACL,KACA,WACgB;AAChB,UAAM,aAAa,mBAEjB,KAAK,QAAQ,QAAQ,SAAS;AAChC,QAAI,CAAC,YAAY;AAChB;AAAA,IACD;AAEA,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAI,OAAO,WAAW,WAAW;AAChC,YAAM,IAAW,0BAA0B;AAAA,IAC5C;AACA,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAW,UAAU;AAAA,IAC5B;AAAA,EACD;AAAA;AAAA,EAGA,MAAM,cACL,KACA,YACA,MACmB;AACnB,SAAK,YAAY;AAEjB,UAAM,UAAU,KAAK,QAAQ,WAAW,CAAC;AACzC,QAAI,EAAE,cAAc,UAAU;AAC7B,WAAK,MAAM,KAAK,EAAE,KAAK,yBAAyB,WAAW,CAAC;AAC5D,YAAM,IAAW,eAAe,UAAU;AAAA,IAC3C;AAEA,UAAM,iBAAiB,QAAQ,UAAU;AACzC,QAAI,OAAO,mBAAmB,YAAY;AACzC,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,QACL;AAAA,QACA,MAAM,OAAO;AAAA,MACd,CAAC;AACD,YAAM,IAAW,eAAe,UAAU;AAAA,IAC3C;AAEA,SAAK;AACL,SAAK,gBAAgB;AACrB,UAAM,aAAa,KAAK,eAAe,gBAAgB,UAAU,IAAI;AAAA,MACpE,qBAAqB;AAAA,IACtB,CAAC;AACD,QAAI,YAAY;AAEhB,QAAI;AACH,aAAO,MAAM,KAAK,QAAQ,SAAS,YAAY,YAAY;AAC1D,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AAED,cAAM,kBAAkB,eAAe;AAAA,UACtC;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACJ;AAEA,YAAI;AACJ,cAAM,gBAAgB;AAMtB,YAAI,iBAAiB,OAAO,cAAc,SAAS,YAAY;AAC9D,mBAAS,MAAM;AAAA,YACd,QAAQ,QAAQ,eAAe;AAAA,YAC/B,KAAK,QAAQ,QAAQ;AAAA,UACtB;AAAA,QACD,OAAO;AACN,mBAAS;AAAA,QACV;AAGA,YAAI,KAAK,QAAQ,wBAAwB;AACxC,cAAI;AACH,qBAAS,MAAM,KAAK;AAAA,cACnB;AAAA,cACA,EAAE,qBAAqB,WAAW;AAAA,cAClC,MACC,KAAK,QAAQ;AAAA,gBACZ,KAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,cACD;AAAA,YACF;AAAA,UACD,SAAS,OAAO;AACf,iBAAK,MAAM,MAAM;AAAA,cAChB,KAAK;AAAA,cACL,OAAO,eAAe,KAAK;AAAA,YAC5B,CAAC;AAAA,UACF;AAAA,QACD;AAEA,eAAO;AAAA,MACR,CAAC;AAAA,IACF,SAAS,OAAO;AACf,YAAM,YAAY,iBAAiB;AACnC,YAAM,UAAU,YACb,mBACA,eAAe,KAAK;AACvB,WAAK,QAAQ,cAAc,YAAY;AAAA,QACtC,iBAAiB;AAAA,QACjB,cACC,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,MAC/C,CAAC;AACD,WAAK,QAAQ,QAAQ,YAAY;AAAA,QAChC,QAAQ,EAAE,MAAM,SAAS,QAAQ;AAAA,MAClC,CAAC;AACD,kBAAY;AACZ,UAAI,WAAW;AACd,cAAM,IAAW,eAAe;AAAA,MACjC;AACA,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL;AAAA,QACA,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AACD,YAAM;AAAA,IACP,UAAE;AACD,UAAI,CAAC,aAAa,WAAW,SAAS,GAAG;AACxC,aAAK,QAAQ,QAAQ,YAAY;AAAA,UAChC,QAAQ,EAAE,MAAM,KAAK;AAAA,QACtB,CAAC;AAAA,MACF;AACA,WAAK;AACL,UAAI,KAAK,wBAAwB,GAAG;AACnC,aAAK,wBAAwB;AAC7B,aAAK,MAAM,KAAK;AAAA,UACf,KAAK;AAAA,UACL,GAAG;AAAA,QACJ,CAAC;AAAA,MACF;AACA,WAAK,gBAAgB;AACrB,WAAK,aAAa,qBAAqB;AAAA,IACxC;AAAA,EACD;AAAA;AAAA,EAGA,MAAM,iBACL,MACA,SACoB;AACpB,SAAK,YAAY;AAEjB,QAAI,CAAC,KAAK,QAAQ,WAAW;AAC5B,YAAM,IAAW,yBAAyB;AAAA,IAC3C;AACA,UAAM,YAAY,KAAK,QAAQ;AAE9B,WAAO,MAAM,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,QACC,eAAe,QAAQ;AAAA,QACvB,YAAY,QAAQ;AAAA,QACpB,iBAAiB,KAAK;AAAA,MACvB;AAAA,MACA,YAAY;AACX,cAAM,MAAM,IAAI,eAAe,MAAM,MAAM,OAAO;AAClD,YAAI;AACH,gBAAM,WAAW,MAAM,UAAU,KAAK,OAAO;AAC7C,cAAI,CAAC,UAAU;AACd,kBAAM,IAAW,8BAA8B;AAAA,UAChD;AACA,iBAAO;AAAA,QACR,SAAS,OAAO;AACf,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AACD,gBAAM;AAAA,QACP,UAAE;AACD,eAAK,aAAa,qBAAqB;AAAA,QACxC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAED,mBACC,MACA,WACA,SACC;AAGD,SAAK,YAAY;AAEjB,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC9B,YAAM,IAAW,cAAc,iCAAiC;AAAA,IACjE;AAEA,UAAM,OAAO,KAAK,eAAe,qBAAqB;AAAA,MACrD,YAAY,mCAAS;AAAA,MACrB,iBAAiB,KAAK;AAAA,IACvB,CAAC;AACD,QAAI,YAAY;AAEhB,QAAI;AAEH,WAAK,gBAAgB;AAGrB,YAAM,MAAM,IAAI,iBAAiB,MAAM,MAAM,OAAO;AAGpD,YAAM,gBAAgB,KAAK,QAAQ;AAAA,QAAS;AAAA,QAAM,MACjD,KAAK,QAAQ,YAAa,KAAK,SAAS;AAAA,MACzC;AAGA,UAAI,yBAAyB,SAAS;AACrC,sBACE,KAAK,MAAM;AACX,cAAI,CAAC,WAAW;AACf,iBAAK,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AACtC,wBAAY;AAAA,UACb;AAAA,QACD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,cAAI,CAAC,WAAW;AACf,iBAAK,aAAa,MAAM;AAAA,cACvB,MAAM;AAAA,cACN,SAAS,eAAe,KAAK;AAAA,YAC9B,CAAC;AACD,wBAAY;AAAA,UACb;AACA,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AAAA,QACF,CAAC,EACA,QAAQ,MAAM;AACd,eAAK,aAAa,qBAAqB;AAAA,QACxC,CAAC;AAAA,MACH,OAAO;AACN,YAAI,CAAC,WAAW;AACf,eAAK,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AACtC,sBAAY;AAAA,QACb;AACA,aAAK,aAAa,qBAAqB;AAAA,MACxC;AAAA,IACD,SAAS,OAAO;AACf,UAAI,CAAC,WAAW;AACf,aAAK,aAAa,MAAM;AAAA,UACvB,MAAM;AAAA,UACN,SAAS,eAAe,KAAK;AAAA,QAC9B,CAAC;AACD,oBAAY;AAAA,MACb;AACA,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AACD,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA,EAGA,MAAM,cACL,WACA,QACA,MACgB;AAChB,UAAM,KAAK,iBAAiB,cAAc,WAAW,QAAQ,IAAI;AAAA,EAClE;AAAA,EAEA,MAAM,UAAU;AACf,SAAK,gBAAgB;AACrB,UAAM,KAAK,iBAAiB,QAAQ;AAAA,EACrC;AAAA;AAAA,EAGA,UAAU,SAAwB;AACjC,SAAK,YAAY;AAEjB,UAAM,qBAAqB,QACzB,KAAK,MAAM;AACX,WAAK,MAAM,MAAM,EAAE,KAAK,8BAA8B,CAAC;AAAA,IACxD,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL,OAAO,eAAe,KAAK;AAAA,MAC5B,CAAC;AAAA,IACF,CAAC;AACF,SAAK,oBAAoB,KAAK,kBAAkB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAa,SAAiC;AACnD,SAAK,YAAY;AAEjB,SAAK;AACL,SAAK,gBAAgB;AAErB,QAAI;AACH,aAAO,MAAM;AAAA,IACd,UAAE;AACD,WAAK;AACL,UAAI,KAAK,wBAAwB,GAAG;AACnC,aAAK,wBAAwB;AAC7B,aAAK,MAAM,KAAK;AAAA,UACf,KAAK;AAAA,UACL,GAAG;AAAA,QACJ,CAAC;AAAA,MACF;AACA,WAAK,gBAAgB;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,iBAAiB;AAChB,SAAK,YAAY,IAAI;AACrB,SAAK;AACL,SAAK,gBAAgB;AAAA,EACtB;AAAA,EAEA,eAAe;AACd,SAAK;AACL,QAAI,KAAK,wBAAwB,GAAG;AACnC,WAAK,wBAAwB;AAC7B,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,QACL,GAAG;AAAA,MACJ,CAAC;AAAA,IACF;AACA,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA,EAGA,oBAAoB;AACnB,QAAI,yBAAyB,GAAG;AAG/B,WAAK,UAAU,aAAa;AAAA,QAC3B,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,KAAK,QAAQ;AAAA,MACzD,CAAC;AAAA,IACF,OAAO;AAGN,WAAK,UAAU,iBAAiB;AAAA,IACjC;AAAA,EACD;AAAA,EAEA,iBACC,YAC0B;AAC1B,WAAO;AAAA,MACN,kBAAkB,KAAK;AAAA,MACvB,oBAAoB,KAAK;AAAA,MACzB,mBAAmB,KAAK;AAAA,MACxB,sBAAsB,KAAK;AAAA,MAC3B,GAAI,cAAc,CAAC;AAAA,IACpB;AAAA,EACD;AAAA,EAEA,sBAAsBC,SAAgB;AACrC,UAAM,SAEF,CAAC,SAAS,SAAS,QAAQ,QAAQ,SAAS,OAAO;AACvD,eAAW,SAAS,QAAQ;AAC3B,YAAM,WAAWA,QAAO,KAAK,EAAE,KAAKA,OAAM;AAG1C,MAAAA,QAAO,KAAK,KAAK,IAAI,SAAoB;AACxC,aAAK,cAAc,OAAO,IAAI;AAC9B,eAAO,SAAS,GAAI,IAAc;AAAA,MACnC;AAAA,IACD;AAAA,EACD;AAAA,EAEA,cAAc,OAAe,MAAiB;AAC7C,UAAM,OAAO,KAAK,QAAQ,eAAe;AACzC,QAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG;AAC9B;AAAA,IACD;AAEA,QAAI;AACJ,QAAI,KAAK,UAAU,GAAG;AACrB,gBAAU,OAAO,KAAK,CAAC,CAAC;AAAA,IACzB,WAAW,KAAK,WAAW,GAAG;AAC7B,YAAM,CAAC,KAAK,IAAI;AAChB,UAAI,OAAO,UAAU,UAAU;AAC9B,kBAAU;AAAA,MACX,WACC,OAAO,UAAU,YACjB,OAAO,UAAU,WAChB;AACD,kBAAU,OAAO,KAAK;AAAA,MACvB,WAAW,SAAS,OAAO,UAAU,UAAU;AAC9C,cAAM,WAAY,MAA4B;AAC9C,YAAI,aAAa,QAAW;AAC3B,oBAAU,OAAO,QAAQ;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAEA,SAAK,QAAQ,UAAU,MAAM,OAAO;AAAA,MACnC,YAAY,KAAK,iBAAiB;AAAA,QACjC,aAAa;AAAA,QACb,GAAI,UAAU,EAAE,eAAe,QAAQ,IAAI,CAAC;AAAA,MAC7C,CAAC;AAAA,MACD,YAAY,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACF;AAAA,EAEA,qBAAqB;AAnjCtB;AAojCE,UAAM,YAAY;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,IACf;AAEA,UAAM,kBAAiB,gBAAK,QAAO,2BAAZ;AACvB,QAAI,eAAgB,QAAO,OAAO,WAAW,cAAc;AAE3D,SAAK,OAAO,cAAc,EAAE;AAAA,MAC3B,OAAO;AAAA,QACN,iBAAiB,IAAI,EAAE,QAAQ,QAAQ,IAAI,CAAC;AAAA,QAC5C;AAAA,MACD;AAAA,IACD;AACA,SAAK,QAAQ,cAAc,EAAE;AAAA,MAC5B,OAAO;AAAA,QACN,iBAAiB,IAAI,EAAE,QAAQ,gBAAgB,IAAI,CAAC;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AAEA,SAAK,sBAAsB,KAAK,IAAI;AACpC,SAAK,sBAAsB,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,MAAM,aAAa;AAElB,UAAM,CAAC,iBAAiB,IAAI,MAAM,KAAK,OAAO;AAAA,MAC7C,KAAK;AAAA,MACL,CAAC,KAAK,YAAY;AAAA,IACnB;AACA,IAAAF;AAAA,MACC,sBAAsB;AAAA,MACtB;AAAA,IACD;AAEA,UAAM,WACL,gBAAgB,+BAA+B,iBAAiB;AACjE,UAAM,cAAc,8BAAoC,QAAQ;AAEhE,QAAI,YAAY,gBAAgB;AAE/B,YAAM,KAAK,sBAAsB,WAAW;AAAA,IAC7C,OAAO;AAEN,YAAM,KAAK,gBAAgB,WAAW;AAAA,IACvC;AAGA,SAAK,iBAAiB,WAAW,KAAK,aAAa,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,gBAAgB,aAAmC;AACxD,SAAK,MAAM,KAAK,EAAE,KAAK,iBAAiB,CAAC;AAGzC,UAAM,KAAK,aAAa,gBAAgB,WAAW;AAGnD,QAAI,KAAK,QAAQ,UAAU;AAC1B,YAAM,WAAW,KAAK,QAAQ;AAC9B,YAAM,KAAK;AAAA,QAAe;AAAA,QAAkB;AAAA,QAAW,MACtD,SAAS,KAAK,cAAqB,YAAY,KAAM;AAAA,MACtD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,sBAAsB,aAAmC;AAE9D,UAAM,cAAc,MAAM,KAAK,OAAO;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AAGA,UAAM,cAAuC,CAAC;AAC9C,eAAW,CAAC,MAAM,KAAK,KAAK,aAAa;AACxC,UAAI;AACH,cAAM,WAAW,eAAe;AAAA,UAC/B,IAAI,WAAW,KAAK;AAAA,QACrB;AACA,cAAM,OAAO,iCAAyC,QAAQ;AAC9D,oBAAY,KAAK,IAAI;AAAA,MACtB,SAAS,OAAO;AACf,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AAAA,MACF;AAAA,IACD;AAEA,SAAK,MAAM,KAAK;AAAA,MACf,KAAK;AAAA,MACL,aAAa,YAAY;AAAA,IAC1B,CAAC;AAGD,SAAK,aAAa,iBAAiB,WAAW;AAG9C,SAAK,kBAAkB,mBAAmB,WAAW;AAAA,EACtD;AAAA,EAEA,MAAM,4BAA4B;AAEjC,UAAM,CAAC,WAAW,IAAI,MAAM,KAAK,OAAO,WAAW,KAAK,UAAU;AAAA,MACjE,KAAK;AAAA,IACN,CAAC;AAED,QAAI,gBAAgB,MAAM;AAEzB,YAAM,UAAU,IAAI,YAAY;AAChC,WAAK,kBAAkB,QAAQ,OAAO,WAAW;AACjD,WAAK,MAAM,MAAM,EAAE,KAAK,kCAAkC,CAAC;AAAA,IAC5D,OAAO;AAEN,WAAK,kBAAkB,oBAAoB;AAC3C,YAAM,aAAa,IAAI,YAAY,EAAE,OAAO,KAAK,eAAe;AAChE,YAAM,KAAK,OAAO,WAAW,KAAK,UAAU;AAAA,QAC3C,CAAC,KAAK,iBAAiB,UAAU;AAAA,MAClC,CAAC;AACD,WAAK,MAAM,MAAM,EAAE,KAAK,gCAAgC,CAAC;AAAA,IAC1D;AAAA,EACD;AAAA,EAEA,MAAM,kBAAkB;AACvB,QAAI;AACJ,QAAI,gBAAgB,KAAK,SAAS;AACjC,YAAM,aAAa,KAAK,QAAQ;AAChC,aAAO,MAAM,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,MAAM;AACL,gBAAM,gBAAgB;AAAA,YACrB,KAAK;AAAA,YACL,KAAK,OAAO,WAAW,KAAK,QAAQ;AAAA,UACrC;AACA,cAAI,yBAAyB,SAAS;AACrC,mBAAO;AAAA,cACN;AAAA,cACA,KAAK,QAAQ,QAAQ;AAAA,YACtB;AAAA,UACD;AACA,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD,WAAW,UAAU,KAAK,SAAS;AAClC,aAAO,gBAAgB,KAAK,QAAQ,IAAI;AAAA,IACzC,OAAO;AACN,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AACA,SAAK,QAAQ;AAAA,EACd;AAAA,EAEA,MAAM,eAAe;AACpB,SAAK,MAAM,KAAK,EAAE,KAAK,iBAAiB,CAAC;AACzC,QAAI,KAAK,QAAQ,QAAQ;AACxB,YAAM,SAAS,KAAK,QAAQ;AAC5B,YAAM,KAAK;AAAA,QAAe;AAAA,QAAgB;AAAA,QAAW,MACpD,OAAO,KAAK,YAAY;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,eAAe;AACpB,QAAI,KAAK,QAAQ,SAAS;AACzB,YAAM,UAAU,KAAK,QAAQ;AAC7B,UAAI;AACH,aAAK,MAAM,MAAM,EAAE,KAAK,kBAAkB,CAAC;AAC3C,cAAM,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA,YAAY;AACX,kBAAM,SAAS,QAAQ,KAAK,YAAY;AACxC,gBAAI,kBAAkB,SAAS;AAC9B,oBAAM;AAAA,gBACL;AAAA,gBACA,KAAK,QAAQ,QAAQ;AAAA,cACtB;AAAA,YACD;AAAA,UACD;AAAA,QACD;AACA,aAAK,MAAM,MAAM,EAAE,KAAK,oBAAoB,CAAC;AAAA,MAC9C,SAAS,OAAO;AACf,YAAI,iBAAiB,eAAe;AACnC,eAAK,MAAM,MAAM,EAAE,KAAK,oBAAoB,CAAC;AAAA,QAC9C,OAAO;AACN,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,iBAAiB;AACtB,QAAI,KAAK,QAAQ,WAAW;AAC3B,YAAM,YAAY,KAAK,QAAQ;AAC/B,UAAI;AACH,aAAK,MAAM,MAAM,EAAE,KAAK,oBAAoB,CAAC;AAC7C,cAAM,KAAK;AAAA,UACV;AAAA,UACA;AAAA,UACA,YAAY;AACX,kBAAM,SAAS,UAAU,KAAK,YAAY;AAC1C,gBAAI,kBAAkB,SAAS;AAC9B,oBAAM;AAAA,gBACL;AAAA,gBACA,KAAK,QAAQ,QAAQ;AAAA,cACtB;AAAA,YACD;AAAA,UACD;AAAA,QACD;AACA,aAAK,MAAM,MAAM,EAAE,KAAK,sBAAsB,CAAC;AAAA,MAChD,SAAS,OAAO;AACf,YAAI,iBAAiB,eAAe;AACnC,eAAK,MAAM,MAAM,EAAE,KAAK,sBAAsB,CAAC;AAAA,QAChD,OAAO;AACN,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,mBAAmB;AAClB,UAAM,QAAQ,eAAe,KAAK,QAAQ,GAAG;AAC7C,QAAI,CAAC,MAAO;AAEZ,SAAK,MAAM,MAAM,EAAE,KAAK,uBAAuB,CAAC;AAChD,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAErB,UAAM,UAAU,KAAK,eAAe,WAAW;AAC/C,UAAM,YAAY,KAAK,QAAQ;AAAA,MAAS;AAAA,MAAS,MAChD,MAAM,KAAK,YAAY;AAAA,IACxB;AAEA,QAAI,qBAAqB,SAAS;AACjC,WAAK,cAAc,UACjB,KAAK,MAAM;AACX,YAAI,KAAK,aAAa;AACrB,cAAI,QAAQ,SAAS,GAAG;AACvB,iBAAK,aAAa,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,UAC1C;AACA,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,UACN,CAAC;AACD;AAAA,QACD;AAGA,aAAK;AAAA,UACJ;AAAA,UACA,EAAE,sBAAsB,aAAa;AAAA,UACrC;AAAA,QACD;AACA,aAAK,aAAa,SAAS;AAAA,UAC1B,MAAM;AAAA,UACN,SAAS;AAAA,QACV,CAAC;AACD,aAAK,MAAM,KAAK;AAAA,UACf,KAAK;AAAA,QACN,CAAC;AACD,aAAK,aAAa;AAAA,MACnB,CAAC,EACA,MAAM,CAAC,UAAU;AACjB,YAAI,KAAK,aAAa;AACrB,cAAI,QAAQ,SAAS,GAAG;AACvB,iBAAK,aAAa,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,UAC1C;AACA,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,KAAK;AAAA,UAC5B,CAAC;AACD;AAAA,QACD;AAGA,aAAK;AAAA,UACJ;AAAA,UACA;AAAA,YACC,sBAAsB;AAAA,YACtB,iBAAiB,eAAe,KAAK;AAAA,UACtC;AAAA,UACA;AAAA,QACD;AACA,aAAK,aAAa,SAAS;AAAA,UAC1B,MAAM;AAAA,UACN,SAAS,eAAe,KAAK;AAAA,QAC9B,CAAC;AACD,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AACD,aAAK,aAAa;AAAA,MACnB,CAAC,EACA,QAAQ,MAAM;AACd,aAAK,oBAAoB;AACzB,aAAK,gBAAgB;AAAA,MACtB,CAAC;AAAA,IACH,WAAW,QAAQ,SAAS,GAAG;AAC9B,WAAK,aAAa,SAAS,EAAE,MAAM,KAAK,CAAC;AACzC,WAAK,oBAAoB;AACzB,WAAK,gBAAgB;AAAA,IACtB;AAAA,EACD;AAAA,EAEA,MAAM,mBAAmB,WAAmB;AAC3C,QAAI,CAAC,KAAK,aAAa;AACtB;AAAA,IACD;AAEA,SAAK,MAAM,MAAM,EAAE,KAAK,sCAAsC,CAAC;AAE/D,UAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,MACnC,KAAK,YAAY,KAAK,MAAM,KAAK,EAAE,MAAM,MAAM,KAAK;AAAA,MACpD,IAAI;AAAA,QAAc,CAAC,YAClB,WAAW,MAAM,QAAQ,IAAI,GAAG,SAAS;AAAA,MAC1C;AAAA,IACD,CAAC;AAED,QAAI,UAAU;AACb,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AACN,WAAK,MAAM,MAAM,EAAE,KAAK,wBAAwB,CAAC;AAAA,IAClD;AAAA,EACD;AAAA,EAEA,MAAM,iBAAiB;AAt4CxB;AAu4CE,QAAI,EAAE,QAAQ,KAAK,YAAY,CAAC,KAAK,QAAQ,IAAI;AAChD;AAAA,IACD;AAEA,QAAI;AACJ,QAAI;AAIH,UAAI,CAAC,KAAK,cAAc,KAAK,OAAO,iBAAiB;AACpD,aAAK,aAAa,MAAM,KAAK,OAAO,gBAAgB;AAAA,MACrD;AAEA,eAAS,MAAM,KAAK,QAAQ,GAAG,aAAa;AAAA,QAC3C,SAAS,KAAK;AAAA,QACd,2BAA2B,KAAK,OAAO,4BACpC,MAAM,KAAK,OAAO,0BAA2B,KAAK,QAAQ,IAC1D;AAAA,QACH,+BAA+B,KAAK,OAAO,gCACxC,MAAM,KAAK,OAAO,8BAA+B,KAAK,QAAQ,IAC9D;AAAA,QACH,IAAI;AAAA,UACH,UAAU,CAAC,YAAY,KAAK,OAAO,WAAW,KAAK,UAAU,OAAO;AAAA,UACpE,UAAU,CAAC,SAAS,KAAK,OAAO,WAAW,KAAK,UAAU,IAAI;AAAA,UAC9D,aAAa,CAAC,SAAS,KAAK,OAAO,cAAc,KAAK,UAAU,IAAI;AAAA,QACrE;AAAA,QACA,WAAW,KAAK;AAAA,MACjB,CAAC;AACD,WAAK,MAAM,KAAK,EAAE,KAAK,8BAA8B,CAAC;AACtD,cAAM,gBAAK,QAAQ,IAAG,cAAhB,4BAA4B;AAClC,WAAK,MAAM,KAAK,EAAE,KAAK,8BAA8B,CAAC;AACtD,WAAK,MAAM;AAAA,IACZ,SAAS,OAAO;AACf,UAAI,QAAQ;AACX,YAAI;AACH,kBAAM,gBAAK,QAAQ,IAAG,cAAhB,4BAA4B;AAAA,QACnC,SAAS,cAAc;AACtB,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,YAAY;AAAA,UACnC,CAAC;AAAA,QACF;AAAA,MACD;AACA,UAAI,KAAK,YAAY;AACpB,YAAI;AACH,gBAAM,KAAK,WAAW,QAAQ;AAAA,QAC/B,SAAS,cAAc;AACtB,eAAK,MAAM,MAAM;AAAA,YAChB,KAAK;AAAA,YACL,OAAO,eAAe,YAAY;AAAA,UACnC,CAAC;AAAA,QACF;AAAA,MACD;AACA,WAAK,aAAa;AAClB,UAAI,iBAAiB,OAAO;AAC3B,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AACD,cAAM;AAAA,MACP;AACA,YAAM,eAAe,IAAI,MAAM,0BAA0B,OAAO,KAAK,CAAC,EAAE;AACxE,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL,OAAO,OAAO,KAAK;AAAA,QACnB,WAAW,OAAO;AAAA,MACnB,CAAC;AACD,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAM,mBAAmB;AA98C1B;AA+8CE,UAAM,SAAS,KAAK;AACpB,UAAM,YAAY,KAAK;AACvB,UAAM,WAAW,QAAQ,KAAK,UAAU,KAAK,QAAQ,KAAK;AAC1D,SAAK,MAAM;AACX,SAAK,aAAa;AAElB,QAAI,UAAU,UAAU;AACvB,UAAI;AACH,gBAAM,cAAS,cAAT,kCAAqB;AAAA,MAC5B,SAAS,OAAO;AACf,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AAAA,MACF;AAAA,IACD;AAEA,QAAI,WAAW;AACd,UAAI;AACH,cAAM,UAAU,QAAQ;AAAA,MACzB,SAAS,OAAO;AACf,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,eAAe,KAAK;AAAA,QAC5B,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,yBAAyB;AAC9B,UAAM,WAA+B,CAAC;AACtC,SAAK,MAAM,MAAM;AAAA,MAChB,KAAK;AAAA,MACL,YAAY,KAAK,kBAAkB,YAAY;AAAA,IAChD,CAAC;AACD,eAAW,cAAc,KAAK,kBAAkB,YAAY,OAAO,GAAG;AACrE,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL,QAAQ,WAAW;AAAA,QACnB,gBAAgB,WAAW;AAAA,MAC5B,CAAC;AACD,UAAI,CAAC,WAAW,gBAAgB;AAC/B,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,QAAQ,WAAW;AAAA,QACpB,CAAC;AACD,iBAAS,KAAK,WAAW,WAAW,CAAC;AAAA,MACtC,OAAO;AACN,aAAK,MAAM,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,QAAQ,WAAW;AAAA,QACpB,CAAC;AAAA,MACF;AAAA,IACD;AAGA,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC9B,QAAQ,IAAI,QAAQ,EAAE,KAAK,MAAM,KAAK;AAAA,MACtC,IAAI;AAAA,QAAiB,CAACG,SACrB,WAAW,WAAW,MAAMA,KAAI,IAAI,GAAG,IAAI;AAAA,MAC5C;AAAA,IACD,CAAC;AAED,QAAI,KAAK;AACR,WAAK,MAAM,KAAK;AAAA,QACf,KAAK;AAAA,MACN,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAM,wBAAwB,WAAmB;AAChD,UAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,WAAW,GAAG;AACzB,WAAK,MAAM,MAAM,EAAE,KAAK,yBAAyB,CAAC;AAClD;AAAA,IACD;AAEA,UAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,MACnC,QAAQ,WAAW,OAAO,EAAE,KAAK,MAAM,KAAK;AAAA,MAC5C,IAAI;AAAA,QAAc,CAAC,YAClB,WAAW,MAAM,QAAQ,IAAI,GAAG,SAAS;AAAA,MAC1C;AAAA,IACD,CAAC;AAED,QAAI,UAAU;AACb,WAAK,MAAM,MAAM;AAAA,QAChB,KAAK;AAAA,QACL,OAAO,QAAQ;AAAA,QACf;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AACN,WAAK,MAAM,MAAM,EAAE,KAAK,+BAA+B,CAAC;AAAA,IACzD;AAAA,EACD;AAAA,EAEA,kBAAkB;AACjB,QAAI,KAAK,QAAQ,QAAQ,WAAW,CAAC,KAAK,mBAAoB;AAC9D,QAAI,KAAK,YAAa;AAEtB,UAAM,WAAW,KAAK,UAAU;AAEhC,SAAK,MAAM,MAAM;AAAA,MAChB,KAAK;AAAA,MACL,UAAU,SAAS,QAAQ;AAAA,MAC3B,iBAAiB,CAAC,CAAC,KAAK;AAAA,MACxB,SAAS,KAAK,QAAQ,QAAQ;AAAA,IAC/B,CAAC;AAED,QAAI,KAAK,eAAe;AACvB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACtB;AAEA,QAAI,KAAK,aAAc;AAEvB,QAAI,aAAa,aAAc;AAC9B,WAAK,gBAAgB,WAAW,MAAM;AACrC,aAAK,WAAW;AAAA,MACjB,GAAG,KAAK,QAAQ,QAAQ,YAAY;AAAA,IACrC;AAAA,EACD;AAAA,EAEA,YAAsB;AACrB,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,QAAI,KAAK,0BAA0B;AAClC,aAAO;AACR,QAAI,KAAK,wBAAwB,EAAG,QAAO;AAC3C,QAAI,KAAK,qBAAqB,KAAK,0BAA0B,GAAG;AAC/D,aAAO;AAAA,IACR;AAEA,eAAW,SAAS,KAAK,kBAAkB,YAAY,OAAO,GAAG;AAGhE,aAAO;AAAA,IAER;AAEA,QAAI,KAAK,kBAAkB,yBAAyB,GAAG;AACtD,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,qBAA8B;AACjC,WAAO,KAAK,OAAO,eAAe;AAAA,EACnC;AAAA,EAEA,IAAI,eAAwB;AAC3B,WAAO,gBAAgB,KAAK,WAAW,UAAU,KAAK;AAAA,EACvD;AAAA,EAEA,uBAAuB;AACtB,QAAI,CAAC,KAAK,cAAc;AACvB,YAAM,IAAW,eAAe;AAAA,IACjC;AAAA,EACD;AACD;;;AW1lDO,IAAM,kBAAN,MAmBL;AAAA,EACD;AAAA,EAEA,YAAYC,SAAgD;AAC3D,SAAK,UAAUA;AAAA,EAChB;AAAA,EAEA,IAAI,SAAiD;AACpD,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,cAAwD;AACvD,WAAO,IAAI,cAAc,KAAK,OAAO;AAAA,EACtC;AACD;AAEO,SAAS,iBACfA,SACA,MACqB;AAErB,QAAM,aAAaA,QAAO,IAAI,IAAI;AAClC,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AACxE,SAAO;AACR;;;AC/DA,SAAS,YAAY;AAwDd,SAAS,kBACfC,SACA,aACA,qBACA,QACc;AACd,QAAM,SAAS,IAAI,KAAwC;AAAA,IAC1D,QAAQ;AAAA,EACT,CAAC;AAED,SAAO,IAAI,KAAK,iBAAiB,qBAAqB,CAAC,CAAC;AAGxD,SAAO,IAAI,KAAK,OAAO,GAAG,SAAS;AAClC,UAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,UAAM,qBAAqB;AAC3B,QAAI;AACH,YAAM,KAAK;AAAA,IACZ,UAAE;AACD,YAAM,mBAAmB;AAAA,IAC1B;AAAA,EACD,CAAC;AAED,SAAO,IAAI,KAAK,CAAC,MAAM;AACtB,WAAO,EAAE;AAAA,MACR;AAAA,IACD;AAAA,EACD,CAAC;AAED,SAAO,IAAI,WAAW,CAAC,MAAM;AAC5B,WAAO,EAAE,KAAK,IAAI;AAAA,EACnB,CAAC;AAED,SAAO,IAAI,aAAa,OAAO,MAAM;AACpC,WAAO,EAAE,KAAK;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACV,CAA4B;AAAA,EAC7B,CAAC;AAED,MAAI,QAAQ;AAEX,WAAO,KAAK,2BAA2B,OAAO,MAAM;AAlGtD;AAmGG,YAAM,SAAS,EAAE,IAAI,MAAM,MAAM;AAEjC,UAAI,CAAC,QAAQ;AACZ,eAAO,EAAE,KAAK,gCAAgC,GAAG;AAAA,MAClD;AAEA,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,OAAO,MAAM,kBAAkB,aAAa,MAAM;AAExD,UAAI,CAAC,MAAM;AACV,eAAO,EAAE,KAAK,yBAAyB,MAAM,IAAI,GAAG;AAAA,MACrD;AAGA,WAAI,UAAK,kBAAkB,MAAvB,mBAA0B,WAAW;AACxC,aAAK,kBAAkB,EAAE,UAAU,OAAO,IAAI;AAAA,MAC/C;AAEA,aAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IAChC,CAAC;AAAA,EACF;AAOA,MAAI,qBAAqB;AACxB,WAAO;AAAA,MACN;AAAA,MACA,CAAC,cAAc,GAAG,qBAAqB,KAAK,sBAAsB;AAAA,MAClE,OAAO,MAAM;AACZ,cAAM,mBAAmB,oBAAoB;AAC7C,YAAI,kBAAkB;AACrB,iBAAO,iBAAiB,OAAOC,OAAM;AACpC,kBAAM,YAAYA,GAAE,IAAI;AAAA,cACvB;AAAA,YACD;AACA,kBAAM,EAAE,UAAU,WAAW,IAC5B,wBAAwB,SAAS;AAElC,mBAAO,MAAM;AAAA,cACZA,GAAE,IAAI;AAAA,cACNA,GAAE,IAAI;AAAA,cACNA,GAAE,IAAI,OAAO;AAAA,cACbD;AAAA,cACA;AAAA,cACAC,GAAE,IAAI;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACD;AAAA,UACD,CAAC,EAAE,GAAG,SAAS,CAAC;AAAA,QACjB,OAAO;AACN,iBAAO,EAAE;AAAA,YACR;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,MAAID,QAAO,UAAU,SAAS;AAE7B,UAAM,gBAAgB,OAAO,MAA0C;AAxKzE;AAyKG,UAAI,WAAW,MAAM,iBAAiB,CAACA,QAAO,UAAU,MAAM,GAAG;AAChE,wBAAgB,EAAE,KAAK;AAAA,UACtB,KAAK;AAAA,QACN,CAAC;AACD,eAAO;AAAA,MACR;AAEA,YAAM,aAAY,OAAE,IAAI,OAAO,eAAe,MAA5B,mBAA+B,QAAQ,WAAW;AACpE,UAAI,CAAC,WAAW;AACf,eAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,MAClC;AAEA,YAAM,iBAAiBA,QAAO,UAAU,MAAM;AAC9C,UAAI,CAAC,gBAAgB;AACpB,eAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,MAClC;AAEA,UAAI,CAAC,gBAAgB,WAAW,cAAc,GAAG;AAChD,eAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,MAClC;AAEA,aAAO;AAAA,IACR;AAEA,WAAO,IAAI,oBAAoB,OAAO,MAAM;AAC3C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,iBAAiB,MAAM,UAAU,eAAe;AACtD,YAAM,QAAQ,iBAAiB,MAAM,UAAU,aAAa,IAAI;AAChE,aAAO,EAAE,KAAK,EAAE,OAAO,eAAe,CAAC;AAAA,IACxC,CAAC;AAED,WAAO,MAAM,oBAAoB,OAAO,MAAM;AAC7C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,OAAO,MAAM,EAAE,IAAI,KAAyB;AAClD,YAAM,MAAM,UAAU,aAAa,KAAK,KAAK;AAC7C,aAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,IAC3B,CAAC;AAED,WAAO,IAAI,0BAA0B,OAAO,MAAM;AACjD,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,cAAc,MAAM,UAAU,mBAAmB;AACvD,aAAO,EAAE,KAAK,EAAE,YAAY,CAAC;AAAA,IAC9B,CAAC;AAED,WAAO,IAAI,mBAAmB,OAAO,MAAM;AAC1C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,OAAO,MAAM,UAAU,QAAQ;AACrC,aAAO,EAAE,KAAK,EAAE,KAAK,CAAC;AAAA,IACvB,CAAC;AAED,WAAO,KAAK,2BAA2B,OAAO,MAAM;AACnD,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,YAAM,OAAO,MAAM,EAAE,IAAI,KAA0B;AACnD,YAAM,SAAS,MAAM,MAAM,UAAU;AAAA,QACpC;AAAA,QACA,KAAK,QAAQ,CAAC;AAAA,MACf;AACA,aAAO,EAAE,KAAK,EAAE,OAAO,CAAC;AAAA,IACzB,CAAC;AAED,WAAO,IAAI,oBAAoB,OAAO,MAAM;AAC3C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE;AACvD,YAAM,SAAS,MAAM,MAAM,UAAU,mBAAmB,KAAK;AAC7D,aAAO,EAAE,KAAK,MAAM;AAAA,IACrB,CAAC;AAED,WAAO,IAAI,qBAAqB,OAAO,MAAM;AAC5C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,UAAU,SAAS,EAAE,IAAI,MAAM,SAAS,KAAK,KAAK,EAAE;AAC1D,YAAM,QAAQ;AAAA,QACb,EAAE,IAAI,MAAM,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,QACzC;AAAA,MACD;AACA,YAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,OAAO,KAAK,QAAQ,EAAE;AAEzD,YAAM,MAAM,OAAO,MAAM;AACzB,YAAM,SAAS,MAAM,MAAM,UAAU,cAAc;AAAA,QAClD;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AACD,aAAO,EAAE,KAAK,MAAM;AAAA,IACrB,CAAC;AAED,WAAO,IAAI,+BAA+B,OAAO,MAAM;AACtD,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AACvD,YAAM,SAAS,MAAM,UAAU,uBAAuB;AACtD,aAAO,EAAE,KAAK,MAAM;AAAA,IACrB,CAAC;AAED,WAAO,IAAI,sBAAsB,OAAO,MAAM;AAC7C,YAAM,eAAe,MAAM,cAAc,CAAC;AAC1C,UAAI,aAAc,QAAO;AAEzB,YAAM,QAAQ,MAAM,YAAY,UAAU,EAAE,IAAI,OAAO;AAEvD,YAAM,iBAAiB,MAAM,UAAU,eAAe;AACtD,YAAM,oBAAoB,MAAM,UAAU,kBAAkB;AAC5D,YAAM,oBAAoB,MAAM,UAAU,kBAAkB;AAE5D,YAAM,QAAQ,iBACX,MAAM,UAAU,aAAa,IAC7B;AACH,YAAM,cAAc,MAAM,UAAU,mBAAmB;AACvD,YAAM,OAAO,MAAM,UAAU,QAAQ;AACrC,YAAM,YAAY,MAAM,UAAU,aAAa;AAC/C,YAAM,kBAAkB,MAAM,UAAU,mBAAmB;AAG3D,YAAM,iBAAiB,CAAC,MAAc,UACrC,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC7C,YAAM,sBAAsB,kBACzB,KAAK,MAAM,KAAK,UAAU,iBAAiB,cAAc,CAAC,IAC1D;AAEH,aAAO,EAAE,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,MAClB,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAEA,SAAO,KAAK,mBAAmB,OAAO,MAAM;AAC3C,UAAM,aAAa,EAAE,IAAI,MAAM,QAAQ;AAEvC,WAAO,aAAa,GAAGA,SAAQ,aAAa,YAAY,EAAE,IAAI,OAAO;AAAA,EACtE,CAAC;AAED,SAAO,KAAK,UAAU,OAAO,MAAM;AAClC,WAAO,gBAAgB,GAAGA,SAAQ,aAAa,EAAE,IAAI,OAAO;AAAA,EAC7D,CAAC;AAED,SAAO,KAAK,gBAAgB,OAAO,MAAM;AACxC,WAAO;AAAA,MACN;AAAA,MACAA;AAAA,MACA;AAAA,MACA,EAAE,IAAI;AAAA,MACN,EAAE,IAAI,MAAM,MAAM;AAAA,IACnB;AAAA,EACD,CAAC;AAED,SAAO,IAAI,cAAc,OAAO,MAAM;AAGrC,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,eAAe,IAAI,SAAS,QAAQ,cAAc,EAAE,KAAK;AAG/D,UAAM,eAAe,IAAI,IAAI,eAAe,IAAI,QAAQ,IAAI,MAAM;AAClE,UAAM,mBAAmB,IAAI,QAAQ,cAAc;AAAA,MAClD,QAAQ,EAAE,IAAI;AAAA,MACd,SAAS,EAAE,IAAI,IAAI;AAAA,MACnB,MAAM,EAAE,IAAI,IAAI;AAAA,MAChB,QAAQ;AAAA,IACT,CAAgB;AAEhB,yBAAqB,EAAE,MAAM;AAAA,MAC5B,KAAK;AAAA,MACL,MAAM,EAAE,IAAI;AAAA,MACZ,IAAI,iBAAiB;AAAA,IACtB,CAAC;AAED,WAAO,MAAM;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,IAAI;AAAA,IACP;AAAA,EACD,CAAC;AAED,SAAO,SAAS,mBAAmB;AACnC,SAAO,QAAQ,gBAAgB;AAE/B,SAAO;AACR;;;ACxXA,SAAS,iBAAiB;AAG1B,SAAS,wBAAwB;AAGjC,SAAS,SAAS;AACjB,SAAO,UAAU,0BAA0B;AAC5C;AASO,IAAM,yBAAN,MAA6B;AAAA,EACnC;AAAA,EACA;AAAA,EACA,cAA6B;AAAA,EAE7B;AAAA,EACA;AAAA,EAEA,YAAY,SAA+B;AAC1C,SAAK,WAAW;AAKhB,SAAK,YAAY,IAAI,iBAAiB;AAAA,MACrC,eAAe,MAAM,KAAK;AAAA,MAC1B,QAAQ,CAAC,SAAS;AACjB,YAAI;AAEH,eAAK,SAAS,UAAU,EAAE,KAAK,GAAG,KAAK,UAAU;AAEjD,eAAK,SAAS,eAAe,IAAI;AAAA,QAClC,SAAS,KAAK;AACb,eAAK,aAAa,GAAG;AACrB,eAAK,OAAO,MAAM,mCAAmC;AAAA,QACtD;AAAA,MACD;AAAA,MACA,SAAS,CAAC,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM;AAAA,IACpD,CAAC;AAED,SAAK,WAAW,IAAI,iBAAiB;AAAA,MACpC,eAAe,MAAM,KAAK;AAAA,MAC1B,QAAQ,CAAC,SAAS,KAAK,UAAU,eAAe,IAAI;AAAA,MACpD,SAAS,CAAC,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM;AAAA,IACpD,CAAC;AAGD,SAAK,aAAa,IAAI,UAAU;AAAA,MAC/B,KAAK,KAAK;AAAA,MACV,MAAM,CAAC,SAA4C;AAClD,eAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,CAAC;AAC/C,aAAK,UAAU,eAAe,IAAI;AAAA,MACnC;AAAA,MACA,OAAO,CAAC,MAAe,WAAoB;AAC1C,eAAO,EAAE,MAAM,EAAE,KAAK,0BAA0B,MAAM,OAAO,CAAC;AAC9D,aAAK,OAAO,QAAQ,KAAM,UAAU,EAAE;AAAA,MACvC;AAAA,MACA,YAAY;AAAA,IACb,CAAC;AAGD,eAAW,MAAM;AAChB,WAAK,YAAY;AAAA,IAClB,GAAG,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,IAAI,kBAAsC;AACzC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,iBAAqC;AACxC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,cAA6B;AAClC,QAAI;AACH,aAAO,EAAE,MAAM,EAAE,KAAK,yBAAyB,CAAC;AAEhD,WAAK,cAAc;AAEnB,aAAO,EAAE,MAAM,EAAE,KAAK,wCAAwC,CAAC;AAC/D,WAAK,SAAS,OAAO,QAAW,KAAK,UAAU;AAG/C,WAAK,UAAU,YAAY;AAC3B,WAAK,SAAS,YAAY;AAAA,IAC3B,SAAS,KAAK;AACb,WAAK,aAAa,GAAG;AACrB,WAAK,OAAO,MAAM,sCAAsC;AAAA,IACzD;AAAA,EACD;AAAA,EAEA,aAAa,KAAoB;AAChC,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO;AAAA,MACP,cAAc,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC7D,OAAO,eAAe,QAAQ,IAAI,QAAQ;AAAA,IAC3C,CAAC;AAGD,QAAI;AACH,WAAK,SAAS,QAAQ,KAAK,KAAK,UAAU;AAAA,IAC3C,SAAS,YAAY;AACpB,aAAO,EAAE,MAAM,EAAE,KAAK,4BAA4B,OAAO,WAAW,CAAC;AAAA,IACtE;AAGA,SAAK,UAAU,aAAa,GAAG;AAC/B,SAAK,SAAS,aAAa,GAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAc,QAAsB;AAC1C,QAAI,KAAK,gBAAgB,KAAK,KAAK,gBAAgB,GAAG;AACrD;AAAA,IACD;AAEA,WAAO,EAAE,MAAM,EAAE,KAAK,qBAAqB,MAAM,OAAO,CAAC;AAEzD,SAAK,cAAc;AAEnB,QAAI;AACH,WAAK,SAAS,QAAQ,EAAE,MAAM,QAAQ,UAAU,KAAK,GAAG,KAAK,UAAU;AAAA,IACxE,SAAS,KAAK;AACb,aAAO,EAAE,MAAM,EAAE,KAAK,2BAA2B,OAAO,IAAI,CAAC;AAAA,IAC9D,UAAE;AACD,WAAK,cAAc;AAGnB,WAAK,UAAU,aAAa,MAAM,MAAM;AACxC,WAAK,SAAS,aAAa,MAAM,MAAM;AAAA,IACxC;AAAA,EACD;AACD;AAMO,SAAS,sBACf,SACqB;AACrB,QAAM,UAAU,IAAI,uBAAuB,OAAO;AAClD,SAAO,QAAQ;AAChB;;;ACzJA,SAAS,SAAS;;;ACgBX,IAAM,wBAAN,MAAmD;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACCE,SACA,eACA,cACA,OACC;AACD,SAAK,UAAUA;AACf,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,SAAS;AAAA,EACf;AAAA,EAEA,MAAM,UAAU,SAA4C;AAC3D,WAAO,KAAK,OAAO;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACzB,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA,EAEA,WAAW,UAAsC;AAChD,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,MAAM,WACL,SACA,SACgB;AAChB,UAAM,KAAK,OAAO,WAAW,SAAS,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,WACL,SACA,MACiC;AACjC,WAAO,MAAM,KAAK,OAAO,WAAW,SAAS,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,cAAc,SAAiB,MAAmC;AACvE,UAAM,KAAK,OAAO,cAAc,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,aACL,SACA,QACsC;AACtC,WAAO,MAAM,KAAK,OAAO,aAAa,SAAS,MAAM;AAAA,EACtD;AAAA,EAEA,MAAM,SAAS,OAAyB,WAAkC;AACzE,UAAM,KAAK,OAAO,cAAc,MAAM,IAAI,SAAS;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,kBAAsC;AAU3C,UAAM,YAAY;AAClB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO;AACnC,WAAO,IAAI,UAAU;AAAA,EACtB;AAAA,EAEA,WAAW,SAAuB;AAEjC,SAAK,OAAO,WAAW,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,aAAa,SAAgC;AAClD,UAAM,KAAK,OAAO,aAAa,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,mBAAmB,OAAwC;AAChE,UAAM,MAAM,4BAA4B,0BAA0B;AAAA,EACnE;AACD;;;AC/GA,OAAOC,gBAAe;;;ACAtB,SAAS,kCAAkC;;;ACC3C,YAAY,UAAU;AAEtB,IAAM,SAAyB,gBAAK,YAAO,CAAC,CAAC;AAK7C,SAAS,MAAM,IAAwC;AACnD,QAAM,MAAW,kBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,gBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,gBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAAS,OAAO,IAAqB,GAA4B;AAC7D,EAAK,mBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,iBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAUO,SAAS,eAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,gBAAW,EAAE;AAAA,IAC3B,MAAW,gBAAW,EAAE;AAAA,IACxB,KAAK,MAAM,EAAE;AAAA,IACb,eAAoB,cAAS,EAAE;AAAA,IAC/B,WAAgB,aAAQ,EAAE;AAAA,EAC9B;AACJ;AAEO,SAAS,gBAAgB,IAAqB,GAAqB;AACtE,EAAK,iBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,iBAAY,IAAI,EAAE,IAAI;AAC3B,SAAO,IAAI,EAAE,GAAG;AAChB,EAAK,eAAU,IAAI,EAAE,aAAa;AAClC,EAAK,cAAS,IAAI,EAAE,SAAS;AACjC;AAEO,SAAS,iBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAW,OAAO,mBAAmB;AAAA,IACzC;AAAA,EACJ;AACA,kBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAAS,iBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,gBAAW,OAAO,MAAM;AAC5C,QAAM,SAAS,eAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,eAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAAS,eAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,gBAAW,EAAE;AAAA,IAC3B,WAAgB,cAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAAS,gBAAgB,IAAqB,GAAqB;AACtE,EAAK,iBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,eAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAAS,iBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAW,OAAO,mBAAmB;AAAA,IACzC;AAAA,EACJ;AACA,kBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAAS,iBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,gBAAW,OAAO,MAAM;AAC5C,QAAM,SAAS,eAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,eAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;ACrGA,YAAYC,WAAU;AAEtB,IAAMC,UAAyB,gBAAK,aAAO,CAAC,CAAC;AAUtC,SAAS,iBAAiB,IAAmC;AAChE,SAAO;AAAA,IACH,KAAU,eAAS,EAAE;AAAA,IACrB,OAAY,eAAS,EAAE;AAAA,EAC3B;AACJ;AAEO,SAAS,kBAAkB,IAAqB,GAAuB;AAC1E,EAAK,gBAAU,IAAI,EAAE,GAAG;AACxB,EAAK,gBAAU,IAAI,EAAE,KAAK;AAC9B;AAEA,SAASC,OAAM,IAAwC;AACnD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,iBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,iBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAASC,QAAO,IAAqB,GAA4B;AAC7D,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,kBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAEA,SAAS,MAAM,IAA8C;AACzD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAI,iBAAiB,EAAE;AAAA,EACnC;AACA,SAAO;AACX;AAEA,SAAS,OAAO,IAAqB,GAAkC;AACnE,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,sBAAkB,IAAI,EAAE,CAAC,CAAC;AAAA,EAC9B;AACJ;AAUO,SAASC,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,MAAW,iBAAW,EAAE;AAAA,IACxB,KAAKF,OAAM,EAAE;AAAA,IACb,WAAW,MAAM,EAAE;AAAA,IACnB,WAAgB,cAAQ,EAAE;AAAA,EAC9B;AACJ;AAEO,SAASG,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,kBAAY,IAAI,EAAE,IAAI;AAC3B,EAAAF,QAAO,IAAI,EAAE,GAAG;AAChB,SAAO,IAAI,EAAE,SAAS;AACtB,EAAK,eAAS,IAAI,EAAE,SAAS;AACjC;AAEO,SAASG,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWL,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAI,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAON,OAAM;AAC5C,QAAM,SAASG,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAASI,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,WAAgB,eAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAASC,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,gBAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAASC,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWT,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAQ,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOV,OAAM;AAC5C,QAAM,SAASO,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;ACvIA,YAAYI,WAAU;AAEtB,IAAMC,UAAyB,gBAAK,aAAO,CAAC,CAAC;AAUtC,SAASC,kBAAiB,IAAmC;AAChE,SAAO;AAAA,IACH,KAAU,eAAS,EAAE;AAAA,IACrB,OAAY,eAAS,EAAE;AAAA,EAC3B;AACJ;AAEO,SAASC,mBAAkB,IAAqB,GAAuB;AAC1E,EAAK,gBAAU,IAAI,EAAE,GAAG;AACxB,EAAK,gBAAU,IAAI,EAAE,KAAK;AAC9B;AAEA,SAASC,OAAM,IAAwC;AACnD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,iBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,iBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAASC,QAAO,IAAqB,GAA4B;AAC7D,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,kBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAEA,SAASC,OAAM,IAA8C;AACzD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAACJ,kBAAiB,EAAE,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAIA,kBAAiB,EAAE;AAAA,EACnC;AACA,SAAO;AACX;AAEA,SAASK,QAAO,IAAqB,GAAkC;AACnE,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAAJ,mBAAkB,IAAI,EAAE,CAAC,CAAC;AAAA,EAC9B;AACJ;AAEA,SAAS,MAAM,IAAiC;AAC5C,SAAY,eAAS,EAAE,IACZ,cAAQ,EAAE,IACf;AACV;AAEA,SAAS,OAAO,IAAqB,GAAqB;AACtD,EAAK,gBAAU,IAAI,MAAM,IAAI;AAC7B,MAAI,MAAM,MAAM;AACZ,IAAK,eAAS,IAAI,CAAC;AAAA,EACvB;AACJ;AAcO,SAASK,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,MAAW,iBAAW,EAAE;AAAA,IACxB,KAAKJ,OAAM,EAAE;AAAA,IACb,WAAWE,OAAM,EAAE;AAAA,IACnB,WAAgB,cAAQ,EAAE;AAAA,IAC1B,SAAS,MAAM,EAAE;AAAA,IACjB,eAAe,MAAM,EAAE;AAAA,IACvB,SAAS,MAAM,EAAE;AAAA,IACjB,WAAW,MAAM,EAAE;AAAA,EACvB;AACJ;AAEO,SAASG,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,kBAAY,IAAI,EAAE,IAAI;AAC3B,EAAAJ,QAAO,IAAI,EAAE,GAAG;AAChB,EAAAE,QAAO,IAAI,EAAE,SAAS;AACtB,EAAK,eAAS,IAAI,EAAE,SAAS;AAC7B,SAAO,IAAI,EAAE,OAAO;AACpB,SAAO,IAAI,EAAE,aAAa;AAC1B,SAAO,IAAI,EAAE,OAAO;AACpB,SAAO,IAAI,EAAE,SAAS;AAC1B;AAEO,SAASG,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWT,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAQ,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOV,OAAM;AAC5C,QAAM,SAASO,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAASI,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,WAAgB,eAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAASC,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,gBAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAASC,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWb,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAY,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOd,OAAM;AAC5C,QAAM,SAASW,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;AH3JO,IAAMI,mBAAkB;AAG/B,IAAM,SAAS,CAAC,YAA0C;AAEzD,QAAM,YAA+B,CAAC;AAGtC,MAAI,QAAQ,eAAe;AAE1B,UAAM,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;AAC9B,cAAU,KAAK;AAAA,MACd,KAAK,oBAAoB,GAAG;AAAA,MAC5B,OAAO,QAAQ;AAAA,IAChB,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb;AAAA,IACA,WAAW,QAAQ;AAAA,EACpB;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAEzD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,EACZ;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAEzD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,EACpB;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAGzD,QAAM,mBAAmB,QAAQ,UAAU,KAAK,CAAC,UAAU;AAC1D,UAAM,MAAM,IAAI,WAAW,MAAM,GAAG;AACpC,WAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM;AAAA,EACvC,CAAC;AAED,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,gBAAe,qDAAkB,UAAS,IAAI,YAAY,CAAC;AAAA,IAC3D,WAAW,QAAQ;AAAA,EACpB;AACD;AAEO,IAAM,wBAAwB,2BAA0C;AAAA,EAC9E,oBAAoB,CAAC,OAAO,YAAY;AACvC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUC,kBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUA,kBAAiB,KAAK;AAAA,MACjC;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,kBAAkB,CAAC,MAAM,YAAY;AACpC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUC,kBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUA,kBAAiB,IAAqB;AAAA,MACjD;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,uBAAuB,MAAM,CAAC,QAAQ,MAAM;AAAA,EAC5C,qBAAqB,MAAM,CAAC,QAAQ,MAAM;AAC3C,CAAC;AAEM,IAAM,wBAAwB,2BAA0C;AAAA,EAC9E,oBAAoB,CAAC,OAAO,YAAY;AACvC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUC,kBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUA,kBAAiB,KAAK;AAAA,MACjC;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,kBAAkB,CAAC,MAAM,YAAY;AACpC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUC,kBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUA,kBAAiB,IAAqB;AAAA,MACjD;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,uBAAuB,MAAM,CAAC;AAAA,EAC9B,qBAAqB,MAAM,CAAC;AAC7B,CAAC;;;AIpIM,SAASC,UAAS;AACxB,SAAO,UAAU,WAAW;AAC7B;;;ACQO,SAAS,gBAAgB,MAAc,KAAuB;AAEpE,QAAM,aAAa,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;AAG7C,QAAMC,UAAS,cAAc;AAC7B,QAAM,OAAOA,QACX,WAAW,QAAQ,EACnB,OAAO,UAAU,EACjB,OAAO,KAAK,EACZ,UAAU,GAAG,EAAE;AAEjB,SAAO;AACR;AAKA,SAAS,kBAAkB,SAAyB;AACnD,QAAM,OAAO,YAAY;AAEzB,QAAM,iBAAiB,KAAK,UAAU,OAAO;AAG7C,QAAM,gBAAgB,KAAK,SAAS,cAAc;AAGlD,QAAMA,UAAS,cAAc;AAC7B,QAAM,OAAOA,QACX,WAAW,QAAQ,EACnB,OAAO,cAAc,EACrB,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAEhB,SAAO,GAAG,aAAa,IAAI,IAAI;AAChC;AAKO,SAAS,iBAAyB;AACxC,QAAM,WAAW,YAAY,UAAU;AACvC,QAAM,UAAU,kBAAkB,QAAQ,IAAI,CAAC;AAC/C,QAAM,OAAO,YAAY;AACzB,SAAO,KAAK,KAAK,UAAU,OAAO;AACnC;AAKA,eAAsB,WAAW,MAAgC;AAChE,MAAI;AACH,UAAM,KAAK,UAAU;AACrB,UAAM,GAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAKA,eAAsB,sBACrB,eACgB;AAChB,MAAI,CAAE,MAAM,WAAW,aAAa,GAAI;AACvC,UAAM,KAAK,UAAU;AACrB,UAAM,GAAG,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EAClD;AACD;AAMO,SAAS,0BAA0B,eAA6B;AACtE,QAAM,SAAS,cAAc;AAC7B,MAAI,CAAC,OAAO,WAAW,aAAa,GAAG;AACtC,WAAO,UAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACpD;AACD;AAKA,SAAS,YAAY,SAAyB;AAC7C,QAAM,WAAW,QAAQ;AACzB,QAAM,KAAK,UAAU;AACrB,QAAM,UAAU,GAAG,QAAQ;AAC3B,QAAM,OAAO,YAAY;AAEzB,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO,KAAK;AAAA,QACX,QAAQ,IAAI,WAAW,KAAK,KAAK,SAAS,WAAW,SAAS;AAAA,QAC9D;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AACC,aAAO,KAAK;AAAA,QACX,QAAQ,IAAI,iBACX,KAAK,KAAK,SAAS,UAAU,OAAO;AAAA,QACrC;AAAA,MACD;AAAA,EACF;AACD;;;ACvFA,SAAS,gBAAgB,QAAmD;AAC3E,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AACnC,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OAAO,IAAI,CAAC,UAAU;AAC5B,QAAI,iBAAiB,YAAY;AAChC,aAAO,OAAO,KAAK,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACR,CAAC;AACF;AAEA,SAAS,8BACR,OACA,SACwB;AACxB,SAAO;AAAA,IACN,MAAM,CAAC,QAAQ;AACd,YAAM,KAAK,GAAG;AAAA,IACf;AAAA,IACA,KAAK,CAAC,KAAK,WAAW;AACrB,YAAM,OAAO,QAAQ,GAAG;AACxB,WAAK,IAAI,GAAG,gBAAgB,MAAM,CAAC;AAAA,IACpC;AAAA,IACA,KAAK,CACJ,KACA,WACI;AACJ,YAAM,OAAO,QAAQ,GAAG;AACxB,aAAO,KAAK,IAAO,GAAG,gBAAgB,MAAM,CAAC;AAAA,IAC9C;AAAA,IACA,KAAK,CACJ,KACA,WACI;AACJ,YAAM,OAAO,QAAQ,GAAG;AACxB,aAAO,KAAK,IAAO,GAAG,gBAAgB,MAAM,CAAC;AAAA,IAC9C;AAAA,IACA,OAAO,MAAM;AACZ,YAAM,MAAM;AAAA,IACb;AAAA,EACD;AACD;AAEA,SAAS,+BACR,OACA,MACO;AAGP,QAAM,KAAK,4BAA4B;AAGvC,MAAI,SAAS,YAAY;AACxB,UAAM,KAAK,2BAA2B;AAAA,EACvC;AACD;AAEO,SAAS,oBAAmC;AAClD,QAAM,YAAY,aAAa;AAC/B,QAAM,aAAuB,CAAC;AAE9B,MAAI;AACH,UAAM,YAAY;AAAA;AAAA,MAAoC;AAAA,IAAY;AAGlE,UAAM,cAAc,UAAU;AAC9B,QAAI,aAAa;AAChB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AA5GpB;AA6GK,gBAAM,QAAQ,IAAI,YAAY,IAAI;AAClC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,SAAQ,WAAM,UAAN,mBAAa,KAAK;AAChC,cAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0CAA0C;AACtE,iBAAO,8BAA8B,OAAO,KAAK;AAAA,QAClD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,2BAA2B,OAAO,KAAK,CAAC,EAAE;AAAA,EAC3D;AAEA,MAAI;AACH,UAAM,aAAa;AAAA;AAAA,MAAoC;AAAA,IAAa;AAGpE,UAAM,mBAAmB,WAAW;AACpC,QAAI,kBAAkB;AACrB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AAjIpB;AAkIK,gBAAM,QAAQ,IAAI,iBAAiB,IAAI;AACvC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,WAAU,WAAM,YAAN,mBAAe,KAAK;AACpC,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI,MAAM,iDAAiD;AAAA,UAClE;AACA,iBAAO,8BAA8B,OAAO,OAAO;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,4BAA4B,OAAO,KAAK,CAAC,EAAE;AAAA,EAC5D;AAEA,MAAI;AACH,UAAM,sBAAsB;AAAA;AAAA,MACD;AAAA,IAC3B;AACA,UAAM,gBACL,OAAO,wBAAwB,aAC5B,sBACA,oBAAoB;AACxB,QAAI,eAAe;AAClB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AA3JpB;AA4JK,gBAAM,QAAQ,IAAI,cAAc,IAAI;AACpC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,WAAU,WAAM,YAAN,mBAAe,KAAK;AACpC,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UACjE;AACA,iBAAO,8BAA8B,OAAO,OAAO;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,+BAA+B,OAAO,KAAK,CAAC,EAAE;AAC9D,UAAM,IAAI;AAAA,MACT;AAAA,EAAgL,WAAW,KAAK,IAAI,CAAC;AAAA,IACtM;AAAA,EACD;AAEA,QAAM,IAAI;AAAA,IACT;AAAA,EAAoF,WAAW,KAAK,IAAI,CAAC;AAAA,EAC1G;AACD;AAEO,SAAS,wBACf,QACyB;AACzB,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO;AAAA,EACR;AAEA,QAAM,aAAa,IAAI,WAAW,MAAM;AACxC,WAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,QAAI,WAAW,CAAC,MAAM,KAAM;AAC3B,iBAAW,CAAC,KAAK;AACjB,aAAO,WAAW,MAAM,GAAG,IAAI,CAAC;AAAA,IACjC;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,iBACf,OACA,WACa;AACb,MAAI,iBAAiB,YAAY;AAChC,WAAO;AAAA,EACR;AACA,MAAI,iBAAiB,aAAa;AACjC,WAAO,IAAI,WAAW,KAAK;AAAA,EAC5B;AACA,MAAI,YAAY,OAAO,KAAK,GAAG;AAC9B,WAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EACvE;AACA,QAAM,IAAI,MAAM,qBAAqB,SAAS,sBAAsB;AACrE;;;AC9MA,IAAM,kBAAkB,IAAI;AAC5B,IAAM,oBAAoB,MAAM;AAChC,IAAM,cAAc;AACpB,IAAM,0BAA0B,MAAM;AACtC,IAAM,sBAAsB,KAAK,OAAO,OAAO;AAC/C,IAAM,+BAA+B;AAE9B,SAAS,eAAe,IAAmC;AACjE,QAAM,MAAM,GAAG;AAAA,IACd;AAAA,EACD;AACA,SAAO,MAAM,OAAO,IAAI,SAAS,CAAC,IAAI;AACvC;AAEO,SAAS,cACf,KACA,WAAiC,OAC1B;AACP,MAAI,IAAI,aAAa,+BAA+B,iBAAiB;AACpE,UAAM,IAAI,MAAM,GAAG,QAAQ,+BAA+B;AAAA,EAC3D;AACD;AAEO,SAAS,eAAe,MAA0B;AACxD,MAAI,KAAK,SAAS,aAAa;AAC9B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACnD;AAEA,aAAW,OAAO,MAAM;AACvB,kBAAc,GAAG;AAAA,EAClB;AACD;AAEO,SAAS,kBACf,SACA,WACO;AACP,MAAI,QAAQ,SAAS,aAAa;AACjC,UAAM,IAAI,MAAM,+CAA+C;AAAA,EAChE;AAEA,MAAI,cAAc;AAClB,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,mBACC,IAAI,aAAa,+BAA+B,MAAM;AAAA,EACxD;AAEA,MAAI,cAAc,yBAAyB;AAC1C,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC3D;AAEA,QAAM,mBAAmB,KAAK,IAAI,GAAG,sBAAsB,SAAS;AACpE,MAAI,cAAc,kBAAkB;AACnC,UAAM,IAAI;AAAA,MACT,qCAAqC,gBAAgB,wCAAwC,WAAW;AAAA,IACzG;AAAA,EACD;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,kBAAc,GAAG;AACjB,QAAI,MAAM,aAAa,mBAAmB;AACzC,YAAM,IAAI;AAAA,QACT,2BAA2B,oBAAoB,IAAI;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AACD;;;AR4BO,IAAM,wBAAN,MAA4B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA,oBAAoB,oBAAI,IAAmC;AAAA;AAAA;AAAA;AAAA,EAK3D,UAAU,oBAAI,IAAwB;AAAA,EAEtC,uBAA+B;AAAA,EAE/B;AAAA,EAMA,IAAI,UAAmB;AACtB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,cAAc;AACjB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,sBAAsB;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAY,UAAmC,CAAC,GAAG;AAClD,UAAM,EAAE,UAAU,MAAM,YAAY,kBAAkB,KAAK,IAAI;AAC/D,QAAI,CAAC,iBAAiB;AACrB,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AACA,SAAK,WAAW;AAChB,SAAK,iBAAiB,kBAAkB;AACxC,SAAK,eAAe,UAAW,cAAc,eAAe,IAAK;AACjE,UAAM,OAAO,YAAY;AACzB,SAAK,YAAY,KAAK,KAAK,KAAK,cAAc,OAAO;AACrD,SAAK,UAAU,KAAK,KAAK,KAAK,cAAc,WAAW;AACvD,SAAK,aAAa,KAAK,KAAK,KAAK,cAAc,QAAQ;AAEvD,QAAI,KAAK,UAAU;AAElB,gCAA0B,KAAK,SAAS;AACxC,gCAA0B,KAAK,OAAO;AACtC,gCAA0B,KAAK,UAAU;AAEzC,UAAI;AACH,cAAM,SAAS,cAAc;AAC7B,cAAM,WAAW,OAAO,YAAY,KAAK,SAAS;AAClD,aAAK,uBAAuB,SAAS;AAAA,MACtC,SAAS,OAAO;AACf,QAAAC,QAAO,EAAE,MAAM,EAAE,KAAK,0BAA0B,MAAM,CAAC;AAAA,MACxD;AAEA,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK,eAAe;AAAA,MACpC,CAAC;AAGD,UAAI;AACH,aAAK,sBAAsB;AAAA,MAC5B,SAAS,KAAK;AACb,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL,OAAO;AAAA,QACR,CAAC;AAAA,MACF;AAEA,UAAI;AACH,aAAK,sCAAsC;AAAA,MAC5C,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,QACD,CAAC;AACD,cAAM;AAAA,MACP;AAAA,IACD,OAAO;AACN,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,eAAe,KAAK,eAAe;AAAA,MACpC,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,kBAAkB,SAAyB;AAC1C,WAAO,YAAY,EAAE,KAAK,KAAK,WAAW,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,SAAyB;AACvC,WAAO,YAAY,EAAE,KAAK,KAAK,SAAS,GAAG,OAAO,KAAK;AAAA,EACxD;AAAA,EAEA,kBAAkB,SAAyB;AAC1C,WAAO,YAAY,EAAE,KAAK,KAAK,YAAY,OAAO;AAAA,EACnD;AAAA,EAEA,wBAAwB,SAAyB;AAChD,QAAI,KAAK,UAAU;AAClB,aAAO,KAAK,eAAe,OAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACR;AAAA,EAEA,qBAAqB,IAAiC;AACrD,OAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,GAKP;AAAA,EACF;AAAA,EAEA,4BAA4B,SAAwC;AACnE,UAAM,WAAW,KAAK,kBAAkB,IAAI,OAAO;AACnD,QAAI,UAAU;AACb,aAAO;AAAA,IACR;AAEA,UAAM,SAAS,KAAK,wBAAwB,OAAO;AACnD,QAAI,KAAK,UAAU;AAClB,YAAM,OAAO,YAAY;AACzB,gCAA0B,KAAK,QAAQ,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI;AACJ,QAAI;AACH,WAAK,KAAK,eAAe,KAAK,MAAM;AAAA,IACrC,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,8CAA8C,OAAO,OAAO,MAAM,KAAK,KAAK;AAAA,MAC7E;AAAA,IACD;AAEA,SAAK,qBAAqB,EAAE;AAC5B,SAAK,kBAAkB,IAAI,SAAS,EAAE;AACtC,WAAO;AAAA,EACR;AAAA,EAEA,sBAAsB,SAAuB;AAC5C,UAAM,KAAK,KAAK,kBAAkB,IAAI,OAAO;AAC7C,QAAI,CAAC,IAAI;AACR;AAAA,IACD;AAEA,QAAI;AACH,SAAG,MAAM;AAAA,IACV,UAAE;AACD,WAAK,kBAAkB,OAAO,OAAO;AAAA,IACtC;AAAA,EACD;AAAA,EAEA,kBACC,IACA,SACO;AACP,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AAEA,OAAG,KAAK,OAAO;AACf,QAAI;AACH,iBAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,WAAG,IAAI,wDAAwD;AAAA,UAC9D;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AACA,SAAG,KAAK,QAAQ;AAAA,IACjB,SAAS,OAAO;AACf,UAAI;AACH,WAAG,KAAK,UAAU;AAAA,MACnB,QAAQ;AAAA,MAER;AACA,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,iBAAiB,IAAoC;AACpD,UAAM,MAAM,GAAG;AAAA,MACd;AAAA,IACD;AACA,UAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,IAAI;AACxC,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,wCAA8C;AAC7C,UAAM,SAAS,cAAc;AAC7B,QAAI,CAAC,OAAO,WAAW,KAAK,SAAS,GAAG;AACvC;AAAA,IACD;AAEA,UAAM,WAAW,OACf,YAAY,KAAK,SAAS,EAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC;AAEtC,eAAW,WAAW,UAAU;AAC/B,YAAM,YAAY,KAAK,kBAAkB,OAAO;AAChD,UAAI;AACJ,UAAI;AACH,cAAM,aAAa,OAAO,aAAa,SAAS;AAChD,gBAAQ,sBAAsB;AAAA,UAC7B,IAAI,WAAW,UAAU;AAAA,QAC1B;AAAA,MACD,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,KAAK;AAAA,UACb,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAEA,UAAI,CAAC,MAAM,aAAa,MAAM,UAAU,WAAW,GAAG;AACrD;AAAA,MACD;AAEA,YAAM,SAAS,KAAK,eAAe,OAAO;AAC1C,YAAM,OAAO,YAAY;AACzB,gCAA0B,KAAK,QAAQ,MAAM,CAAC;AAC9C,YAAM,KAAK,KAAK,eAAe,KAAK,MAAM;AAC1C,UAAI;AACH,aAAK,qBAAqB,EAAE;AAC5B,YAAI,KAAK,iBAAiB,EAAE,GAAG;AAC9B;AAAA,QACD;AAEA,cAAM,gBAAgB,MAAM,UAAU,IAAI,CAAC,UAAU;AAAA,UACpD,IAAI,WAAW,MAAM,GAAG;AAAA,UACxB,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3B,CAAC;AACD,aAAK,kBAAkB,IAAI,aAAa;AAExC,QAAAA,QAAO,EAAE,KAAK;AAAA,UACb,KAAK;AAAA,UACL;AAAA,UACA,YAAY,cAAc;AAAA,QAC3B,CAAC;AAAA,MACF,UAAE;AACD,WAAG,MAAM;AAAA,MACV;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO,kBAAkB,QAEa;AACrC,QAAI,WAAW,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAGpD,UAAM,SAAS,cAAc;AAC7B,QAAI,OAAO,WAAW,KAAK,SAAS,GAAG;AACtC,iBAAW,OACT,YAAY,KAAK,SAAS,EAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,MAAM,CAAC,EACnC,KAAK;AAAA,IACR;AAEA,UAAM,aAAa,OAAO,SACvB,SAAS,QAAQ,OAAO,MAAM,IAAI,IAClC;AAEH,aAAS,IAAI,YAAY,IAAI,SAAS,QAAQ,KAAK;AAClD,YAAM,UAAU,SAAS,CAAC;AAC1B,UAAI,CAAC,SAAS;AACb;AAAA,MACD;AAEA,UAAI;AACH,cAAM,QAAQ,MAAM,KAAK,sBAAsB,OAAO;AACtD,cAAM;AAAA,MACP,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAA6B;AACzC,QAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACpC,QAAI,OAAO;AACV,aAAO;AAAA,IACR;AAEA,YAAQ;AAAA,MACP,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,YAAY,OAAO,WAAW;AAAA,IAC/B;AACA,SAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACL,SACA,MACA,KACA,OACsB;AAGtB,UAAM,KAAK,kBAAkB,OAAO;AACpC,QAAI,QAAQ,KAAK,aAAa,OAAO;AAGrC,QAAI,MAAM,OAAO;AAChB,YAAM,IAAI,kBAAkB,MAAM,GAAG;AAAA,IACtC;AACA,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,YAAM,KAAK,kBAAkB,OAAO;AACpC,cAAQ,KAAK,aAAa,OAAO;AAAA,IAClC;AAGA,QAAI,MAAM,mBAAmB,mBAA+B;AAC3D,YAAM,iBAAiB;AACvB,YAAM,aAAa,OAAO,WAAW;AAAA,IACtC;AAGA,UAAM,iBAAiB,uBAAuB,KAAK;AAGnD,UAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,kBAAY,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,QAC5B,WAAW,CAAC;AAAA,QACZ,SAAS;AAAA,QACT,eAAe;AAAA,QACf,SAAS;AAAA,QACT,WAAW;AAAA,MACZ;AACA,kBAAY,iBAAiB;AAC7B,UAAI,KAAK,UAAU;AAClB,cAAM,KAAK;AAAA,UACV;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACb;AAAA,MACD;AACA,UAAI,eAAe,SAAS,GAAG;AAC9B,cAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,aAAK,kBAAkB,IAAI,cAAc;AAAA,MAC1C;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAsC;AACrD,UAAM,QAAQ,KAAK,aAAa,OAAO;AAGvC,QAAI,MAAM,mBAAmB,mBAA+B;AAC3D,aAAO;AAAA,IACR;AAGA,QAAI,MAAM,OAAO;AAChB,aAAO;AAAA,IACR;AAGA,QAAI,CAAC,KAAK,UAAU;AACnB,aAAO;AAAA,IACR;AAGA,QAAI,MAAM,aAAa;AACtB,YAAM,MAAM;AACZ,aAAO;AAAA,IACR;AAGA,UAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,MAAc,eAAe,OAAmB;AAC/C,UAAM,gBAAgB,KAAK,kBAAkB,MAAM,EAAE;AAGrD,QAAI;AACH,YAAM,KAAK,UAAU;AACrB,YAAM,YAAY,MAAM,GAAG,SAAS,aAAa;AAEjD,YAAM,cACL,sBAAsB;AAAA,QACrB,IAAI,WAAW,SAAS;AAAA,MACzB;AAGD,YAAM,QAAQ;AAAA,QACb,GAAG;AAAA,QACH,WAAW,CAAC;AAAA,MACb;AAEA,aAAO;AAAA,IACR,SAAS,YAAiB;AAEzB,UAAI,WAAW,SAAS,UAAU;AACjC,cAAM,cAAc;AACpB,eAAO;AAAA,MACR;AAGA,YAAM,QAAQ,IAAI;AAAA,QACjB,+BAA+B,UAAU;AAAA,MAC1C;AACA,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAM,kBACL,SACA,MACA,KACA,OACsB;AACtB,UAAM,KAAK,kBAAkB,OAAO;AAGpC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAG1C,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,KAAK,kBAAkB,OAAO;AACpC,eAAO,MAAM,KAAK,kBAAkB,SAAS,MAAM,KAAK,KAAK;AAAA,MAC9D;AAGA,UAAI,MAAM,mBAAmB,mBAA+B;AAC3D,cAAM,iBAAiB;AACvB,cAAM,aAAa,OAAO,WAAW;AAAA,MACtC;AAGC,YAAM,iBAAiB,uBAAuB,KAAK;AAEnD,YAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,oBAAY,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC5B,WAAW,CAAC;AAAA,UACZ,SAAS;AAAA,UACT,eAAe;AAAA,UACf,SAAS;AAAA,UACT,WAAW;AAAA,QACZ;AACA,YAAI,KAAK,UAAU;AAClB,gBAAM,KAAK;AAAA,YACV;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,UACb;AAAA,QACD;AACA,YAAI,eAAe,SAAS,GAAG;AAC9B,gBAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,eAAK,kBAAkB,IAAI,cAAc;AAAA,QAC1C;AAAA,MACD,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AAAA,EAED,MAAM,WAAW,SAAiB;AAplBnC;AAqlBE,IAAAC;AAAA,MACC,KAAK;AAAA,MACL;AAAA,IACD;AAGA,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,IAAAA,WAAU,OAAO,kBAAkB,OAAO,kBAAkB;AAG5D,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,IACD;AACA,UAAM,iBAAiB;AACvB,UAAM,cAAc,qBAAqB,CAAC,WAAWD,QAAO,EAAE,KAAK,EAAE,KAAK,gDAAgD,OAAO,CAAC,CAAC;AAGnI,QAAI,MAAM,YAAa,OAAM,MAAM,YAAY,MAAM;AACrD,SAAI,WAAM,iBAAN,mBAAoB;AACvB,YAAM,MAAM,aAAa,QAAQ,MAAM;AAExC,QAAI;AAEH,UAAI,MAAM,OAAO;AAChB,cAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,cAAI,CAAC,YAAY,OAAO;AACvB;AAAA,UACD;AACA,sBAAY,QAAQ;AAAA,YACnB,GAAG,YAAY;AAAA,YACf,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,UAC3B;AACA,cAAI,KAAK,UAAU;AAClB,kBAAM,KAAK;AAAA,cACV;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,YACb;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAGA,MAAAC,WAAU,MAAM,OAAO,wBAAwB;AAC/C,YAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAChC,UAAE;AAED,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAC,CAAC;AAClD,WAAK,sBAAsB,OAAO;AAClC,kBAAM,gBAAN,mBAAmB;AACnB,YAAM,cAAc;AAGrB,WAAK,QAAQ,OAAO,OAAO;AAAA,IAC5B;AAAA,EACD;AAAA,EAEA,MAAM,aAAa,SAAiB;AA9oBrC;AAgpBE,UAAM,QAAQ,KAAK,aAAa,OAAO;AAIvC,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,IACD;AACA,UAAM,iBAAiB;AACvB,UAAM,cAAc,qBAAqB,CAAC,WAAWD,QAAO,EAAE,KAAK,EAAE,KAAK,kDAAkD,OAAO,CAAC,CAAC;AAGrI,QAAI,MAAM,YAAa,OAAM,MAAM,YAAY,MAAM;AACrD,SAAI,WAAM,iBAAN,mBAAoB;AACvB,YAAM,MAAM,aAAa,QAAQ,MAAM;AAExC,QAAI;AAEH,UAAI,MAAM,OAAO;AAChB,cAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,cAAI,CAAC,YAAY,OAAO;AACvB;AAAA,UACD;AACA,sBAAY,QAAQ;AAAA,YACnB,GAAG,YAAY;AAAA,YACf,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC7B;AACA,cAAI,KAAK,UAAU;AAClB,kBAAM,KAAK;AAAA,cACV;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,YACb;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAGA,UAAI,MAAM,OAAO;AAChB,cAAM,MAAM,MAAM,OAAO,SAAS;AAAA,MACnC;AAGC,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAC,CAAC;AAClD,WAAK,sBAAsB,OAAO;AAGnC,UAAI,MAAM,cAAc;AACvB,cAAM,aAAa,MAAM;AAAA,MAC1B;AAGA,UAAI,KAAK,UAAU;AAClB,cAAM,KAAK,UAAU;AAGrB,cAAM,QAAQ,IAAI;AAAA;AAAA,WAEhB,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,YAChD,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA;AAAA,WAEF,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,eAAe,OAAO,CAAC;AAAA,YAC7C,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA;AAAA,WAEF,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,YAChD,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA,QACJ,CAAC;AAAA,MACF;AAAA,IACD,UAAE;AAED,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAC,CAAC;AAClD,kBAAM,gBAAN,mBAAmB;AACnB,YAAM,cAAc;AAMpB,YAAM,QAAQ;AACd,YAAM,cAAc;AACpB,YAAM,QAAQ;AACd,YAAM,eAAe;AACrB,YAAM,eAAe;AACrB,YAAM,eAAe;AACrB,YAAM,uBAAuB;AAC7B,YAAM,iBAAiB;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,YACA,OACgB;AAChB,QAAI,CAAC,KAAK,UAAU;AACnB;AAAA,IACD;AAEA,UAAM,KAAK,gBAAgB,SAAS,YAAY;AAC/C,YAAM,KAAK,cAAc,SAAS,YAAY,KAAK;AAAA,IACpD,CAAC;AAAA,EACF;AAAA,EAEA,mCACC,SACA,YACU;AACV,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WACC,MAAM,eAAe,cACrB,MAAM,mBAAmB;AAAA,EAE3B;AAAA,EAEA,gBAAgB,SAAiB;AAChC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WACC,MAAM,mBAAmB,0BACzB,MAAM,mBAAmB;AAAA,EAE3B;AAAA,EAEA,MAAM,kBAAkB,SAAgC;AACvD,WAAO,MAAM;AACZ,YAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,UAAI,EAAC,+BAAO,cAAa;AACxB;AAAA,MACD;AACA,UAAI;AACH,cAAM,MAAM,YAAY;AAAA,MACzB,QAAQ;AACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,gBACL,SACA,IACa;AACb,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,IAAAC,WAAU,OAAO,4BAA4B;AAE7C,UAAM,gBAAgB,MAAM;AAC5B,UAAM,eAAe,qBAA2B,CAAC,WAAWD,QAAO,EAAE,KAAK,EAAE,KAAK,wCAAwC,OAAO,CAAC,CAAC;AAClI,UAAM,uBAAuB;AAE7B,QAAI,eAAe;AAClB,UAAI;AACH,cAAM,cAAc;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACD;AAEA,QAAI;AACH,aAAO,MAAM,GAAG,KAAK;AAAA,IACtB,UAAE;AACD,mBAAa,QAAQ;AACrB,UAAI,MAAM,yBAAyB,cAAc;AAChD,cAAM,uBAAuB;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,qBAAqB,SAAgC;AAC1D,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,QAAI,EAAC,+BAAO,uBAAsB;AACjC;AAAA,IACD;AAEA,WAAO,MAAM,sBAAsB;AAClC,YAAM,UAAU,MAAM;AACtB,UAAI;AACH,cAAM,QAAQ;AAAA,MACf,QAAQ;AAAA,MAER;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,cAAc,SAAiB,WAAmB;AACvD,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,IAAAC,WAAU,OAAO,4BAA4B;AAI7C,UAAM,kBAAkB,MAAM;AAC9B,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,MAAAD,QAAO,EAAE,KAAK,yCAAyC;AACvD;AAAA,IACD;AAGA,QAAI,KAAK,UAAU;AAClB,YAAM,YAAY,KAAK,kBAAkB,OAAO;AAChD,YAAME,UAAS,cAAc;AAC7B,YAAM,WAAW,GAAG,SAAS,QAAQA,QAAO,WAAW,CAAC;AACxD,UAAI;AACH,cAAM,OAAO,YAAY;AACzB,cAAM,sBAAsB,KAAK,QAAQ,SAAS,CAAC;AACnD,cAAM,YAA+B;AAAA,UACpC;AAAA,UACA,WAAW,OAAO,SAAS;AAAA,QAC5B;AACA,cAAM,OAAO,sBAAsB;AAAA,UAClC;AAAA,UACAC;AAAA,QACD;AACA,cAAM,KAAK,UAAU;AACrB,cAAM,GAAG,UAAU,UAAU,IAAI;AAEjC,YACC,CAAC,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,GACC;AACD,UAAAH,QAAO,EAAE;AAAA,YACR;AAAA,UACD;AACA;AAAA,QACD;AAEA,cAAM,GAAG,OAAO,UAAU,SAAS;AAAA,MACpC,SAAS,OAAO;AACf,YAAI;AACH,gBAAM,KAAK,UAAU;AACrB,gBAAM,GAAG,OAAO,QAAQ;AAAA,QACzB,QAAQ;AAAA,QAAC;AACT,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AACD,cAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,MAClD;AAAA,IACD;AAGA,SAAK,sBAAsB,SAAS,SAAS;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACL,SACA,YACA,OACgB;AAChB,UAAM,WAAW,KAAK,kBAAkB,OAAO;AAE/C,UAAME,UAAS,cAAc;AAC7B,UAAM,WAAW,GAAG,QAAQ,QAAQA,QAAO,WAAW,CAAC;AAEvD,QAAI;AAEH,YAAM,OAAO,YAAY;AACzB,YAAM,sBAAsB,KAAK,QAAQ,QAAQ,CAAC;AAGlD,YAAM,YAA+B;AAAA,QACpC,SAAS,MAAM;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,KAAK,MAAM;AAAA,QACX,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,MAClB;AAGA,YAAM,kBACL,sBAAsB;AAAA,QACrB;AAAA,QACAC;AAAA,MACD;AACD,YAAM,KAAK,UAAU;AACrB,YAAM,GAAG,UAAU,UAAU,eAAe;AAE5C,UAAI,CAAC,KAAK,mCAAmC,SAAS,UAAU,GAAG;AAClE,QAAAH,QAAO,EAAE;AAAA,UACR;AAAA,QACD;AACA;AAAA,MACD;AAEA,YAAM,GAAG,OAAO,UAAU,QAAQ;AAAA,IACnC,SAAS,OAAO;AAEf,UAAI;AACH,cAAM,KAAK,UAAU;AACrB,cAAM,GAAG,OAAO,QAAQ;AAAA,MACzB,QAAQ;AAAA,MAER;AACA,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACD,CAAC;AACD,YAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;AAAA,IACvD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cACCI,SACA,cACA,aACC;AACD,QAAI,KAAK,eAAe;AACvB;AAAA,IACD;AAGA,SAAK,gBAAgB;AAAA,MACpB,QAAQA;AAAA,MACR;AAAA,MACA;AAAA,IACD;AAGA,QAAI;AACH,WAAK,gBAAgB;AAAA,IACtB,SAAS,KAAK;AACb,MAAAJ,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAM,WACLI,SACA,cACA,aACA,SAC4B;AAhhC9B;AAihCE,UAAM,KAAK,kBAAkB,OAAO;AAGpC,QAAI,QAAQ,MAAM,KAAK,UAAU,OAAO;AACxC,QAAI,CAAC,MAAM,OAAO;AACjB,YAAM,IAAI;AAAA,QACT,gDAAgD,OAAO;AAAA,MACxD;AAAA,IACD;AAGA,QAAI,MAAM,cAAc;AACvB,YAAM,MAAM,aAAa;AACzB,MAAAH,WAAU,MAAM,OAAO,0BAA0B;AACjD,aAAO,MAAM;AAAA,IACd;AAGA,QAAI,MAAM,OAAO;AAChB,UAAI,MAAM,MAAM,cAAc,KAAK,gBAAgB,OAAO,GAAG;AAC5D,cAAM,KAAK,kBAAkB,OAAO;AACpC,gBAAQ,MAAM,KAAK,UAAU,OAAO;AACpC,YAAI,CAAC,MAAM,OAAO;AACjB,gBAAM,IAAI;AAAA,YACT,gDAAgD,OAAO;AAAA,UACxD;AAAA,QACD;AAAA,MACD,OAAO;AACN,eAAO,MAAM;AAAA,MACd;AAAA,IACD;AAGA,UAAM,eAAe,qBAAqB,CAAC,WAAWD,QAAO,EAAE,KAAK,EAAE,KAAK,2CAA2C,OAAO,CAAC,CAAC;AAE/H,QAAI;AAEH,YAAM,aAAa,iBAAiBI,SAAQ,MAAM,MAAM,IAAI;AAC5D,YAAM,QAAQ,MAAM,WAAW,YAAY;AAC3C,YAAM,iBAAiB;AAGvB,YAAM,MAAM,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ;AAAA,MACD;AAIA,YAAM,MAAM,OAAO,KAAK,IAAI,CAAC;AAC7B,YAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,YAAI,CAAC,YAAY,OAAO;AACvB,gBAAM,IAAI;AAAA,YACT,gDAAgD,OAAO;AAAA,UACxD;AAAA,QACD;AACA,oBAAY,QAAQ;AAAA,UACnB,GAAG,YAAY;AAAA,UACf,SAAS;AAAA,UACT,eAAe;AAAA,UACf,SAAS;AAAA;AAAA,QACV;AACC,YAAI,KAAK,UAAU;AAClB,gBAAM,KAAK;AAAA,YACV;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,UACb;AAAA,QACD;AAAA,MACD,CAAC;AAGF,YAAM,aAAa,QAAQ;AAC3B,YAAM,eAAe;AAErB,aAAO,MAAM;AAAA,IACb,SAAS,YAAY;AACpB,YAAM,QAAQ,IAAI;AAAA,QACjB,yBAAyB,OAAO,KAAK,UAAU;AAAA,QAC/C,EAAE,OAAO,WAAW;AAAA,MACrB;AACD,kBAAM,iBAAN,mBAAoB,OAAO;AAC3B,YAAM,eAAe;AACrB,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAM,sBAAsB,SAA6C;AACxE,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,GAAG;AAC9C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AAC9D,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,SAA6B;AAC5C,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,uBAAuB,OAAO,EAAE;AAC5D,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,eAAe,SAA8C;AAClE,WAAO,KAAK,eAAe,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACvB,QAAI;AACH,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAQ,OAAO,WAAW,KAAK,UAAU,IAC5C,OAAO,YAAY,KAAK,UAAU,IAClC,CAAC;AACJ,iBAAW,QAAQ,OAAO;AAEzB,YAAI,KAAK,SAAS,OAAO,EAAG;AAC5B,cAAM,OAAO,YAAY;AACzB,cAAM,WAAW,KAAK,KAAK,KAAK,YAAY,IAAI;AAChD,YAAI;AACH,gBAAM,MAAM,OAAO,aAAa,QAAQ;AACxC,gBAAM,YACL,sBAAsB;AAAA,YACrB,IAAI,WAAW,GAAG;AAAA,UACnB;AACD,gBAAM,YAAY,OAAO,UAAU,SAAS;AAC5C,cAAI,OAAO,SAAS,SAAS,GAAG;AAC/B,iBAAK;AAAA,cACJ,UAAU;AAAA,cACV;AAAA,YACD;AAAA,UACD,OAAO;AACN,YAAAJ,QAAO,EAAE,MAAM;AAAA,cACd,KAAK;AAAA,cACL;AAAA,YACD,CAAC;AAAA,UACF;AAAA,QACD,SAAS,KAAK;AACb,UAAAA,QAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL;AAAA,YACA,OAAO,eAAe,GAAG;AAAA,UAC1B,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAAiB,WAAmB;AA/qC3D;AAgrCE,UAAM,QAAQ,KAAK,aAAa,OAAO;AAGvC,QACC,MAAM,mBAAmB,UACzB,aAAa,MAAM,gBAClB;AACD,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,MAChB,CAAC;AACD;AAAA,IACD;AAEA,IAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,oBAAoB,SAAS,UAAU,CAAC;AAG9D,gBAAM,iBAAN,mBAAoB;AACpB,UAAM,iBAAiB;AAEvB,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC;AAChD,UAAM,eAAe,eAAe,YAAY;AAE/C,YAAM,iBAAiB;AAEvB,UAAI,KAAK,UAAU;AAClB,YAAI;AACH,gBAAM,KAAK,UAAU;AACrB,gBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,QAChD,SAAS,KAAU;AAClB,eAAI,2BAAK,UAAS,UAAU;AAC3B,YAAAA,QAAO,EAAE,MAAM;AAAA,cACd,KAAK;AAAA,cACL;AAAA,cACA,OAAO,eAAe,GAAG;AAAA,YAC1B,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAEA,UAAI;AACH,QAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,oBAAoB,SAAS,UAAU,CAAC;AAG9D,cAAM,SAAS,MAAM,KAAK,UAAU,OAAO;AAC3C,YAAI,CAAC,OAAO;AACX,gBAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AAGnD,cAAM,eAAe,KAAK;AAC1B,QAAAC,WAAU,cAAc,uBAAuB;AAC/C,YAAI,CAAC,OAAO,OAAO;AAClB,gBAAM,KAAK;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,aAAa;AAAA,YACb;AAAA,UACD;AAAA,QACD;AAEA,QAAAA,WAAU,OAAO,OAAO,mCAAmC;AAC3D,cAAM,OAAO,MAAM,QAAQ;AAAA,MAC5B,SAAS,KAAK;AACb,QAAAD,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA,OAAO,eAAe,GAAG;AAAA,QAC1B,CAAC;AAAA,MACF;AAAA,IACD,GAAG,KAAK;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA8B;AAC7B,QAAI;AACH,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAQ,OAAO,YAAY,KAAK,SAAS;AAC/C,YAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AAEzD,YAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,iBAAW,YAAY,WAAW;AACjC,YAAI;AACH,gBAAM,OAAO,YAAY;AACzB,gBAAM,WAAW,KAAK,KAAK,KAAK,WAAW,QAAQ;AACnD,gBAAM,OAAO,OAAO,SAAS,QAAQ;AAGrC,cAAI,KAAK,UAAU,YAAY;AAC9B,mBAAO,WAAW,QAAQ;AAC1B,YAAAA,QAAO,EAAE,KAAK;AAAA,cACb,KAAK;AAAA,cACL,MAAM;AAAA,YACP,CAAC;AAAA,UACF;AAAA,QACD,SAAS,KAAK;AACb,UAAAA,QAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,UACR,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,SACgB;AAChB,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,gBAAgB,SAAS,OAAO,UAAU;AACpD,UAAI,CAAC,MAAM,OAAO;AACjB,YAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,QACD;AACA,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAEA,YAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,YAAM,YAAY,eAAe,EAAE;AACnC,wBAAkB,SAAS,SAAS;AACpC,WAAK,kBAAkB,IAAI,OAAO;AAAA,IACnC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,MACiC;AACjC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,UAAM,KAAK,qBAAqB,OAAO;AACvC,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,IAAI,MAAM,SAAS,OAAO,cAAc;AAAA,MAC/C,OAAO;AACN,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAAA,IACD;AAEA,mBAAe,IAAI;AAEnB,UAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,UAAM,UAAiC,CAAC;AACxC,eAAW,OAAO,MAAM;AACvB,YAAM,MAAM,GAAG;AAAA,QACd;AAAA,QACA,CAAC,GAAG;AAAA,MACL;AACA,UAAI,CAAC,KAAK;AACT,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACD;AACA,cAAQ,KAAK,iBAAiB,IAAI,OAAO,OAAO,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAiB,MAAmC;AACvE,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,gBAAgB,SAAS,OAAO,UAAU;AACpD,UAAI,CAAC,MAAM,OAAO;AACjB,YAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,QACD;AACA,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAEA,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,qBAAe,IAAI;AAEnB,YAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,SAAG,KAAK,OAAO;AACf,UAAI;AACH,mBAAW,OAAO,MAAM;AACvB,aAAG,IAAI,gCAAgC,CAAC,GAAG,CAAC;AAAA,QAC7C;AACA,WAAG,KAAK,QAAQ;AAAA,MACjB,SAAS,OAAO;AACf,YAAI;AACH,aAAG,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QAER;AACA,cAAM;AAAA,MACP;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACL,SACA,QACsC;AACtC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,UAAM,KAAK,qBAAqB,OAAO;AACvC,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,IAAI,MAAM,SAAS,OAAO,gBAAgB;AAAA,MACjD,OAAO;AACN,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAAA,IACD;AACA,kBAAc,QAAQ,YAAY;AAElC,UAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,UAAM,aAAa,wBAAwB,MAAM;AACjD,UAAM,OAAO,aACV,GAAG;AAAA,MACH;AAAA,MACA,CAAC,QAAQ,UAAU;AAAA,IACpB,IACC,GAAG;AAAA,MACH;AAAA,MACA,CAAC,MAAM;AAAA,IACR;AAEF,WAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,MACxB,iBAAiB,IAAI,KAAK,KAAK;AAAA,MAC/B,iBAAiB,IAAI,OAAO,OAAO;AAAA,IACpC,CAAC;AAAA,EACF;AACD;;;ASn6CA,OAAOK,gBAAe;AA2Bf,IAAM,0BAAN,MAAuD;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,YACCC,SACA,OACA,cACC;AACD,SAAK,UAAUA;AACf,SAAK,SAAS;AACd,SAAK,gBAAgB;AAGrB,UAAM,eAAe,uBAAuB,IAAI;AAEhD,SAAK,eAAe,KAAK,cAAc;AAAA,MACtCA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,SAAK,eAAe;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACAA,QAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA,EAEA,MAAM,YACL,SACA,cACoB;AACpB,WAAO,MAAM,KAAK,aAAa,MAAM,cAAc;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,cACL,MACA,SACA,UACA,QAC8B;AAE9B,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAG7D,UAAM,UAAU,sBAAsB,cAAc;AACpD,UAAM,cAAc,IAAI,QAAQ,SAAS;AAAA,MACxC,QAAQ;AAAA,IACT,CAAC;AAGD,UAAM,WAAW,eAAe,MAAM,GAAG,EAAE,CAAC;AAC5C,UAAM,EAAE,WAAW,UAAU,IAAI,kCAAkC;AAEnE,UAAM,YAAY,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO,sBAAsB,SAAS;AAAA,EACvC;AAAA,EAEA,MAAM,aACL,GACA,cACA,SACoB;AACpB,WAAO,MAAM,KAAK,aAAa,MAAM,cAAc;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,eACL,GACA,MACA,SACA,UACA,QACoB;AA3HtB;AA4HE,UAAM,oBAAmB,UAAK,yBAAL;AACzB,IAAAC,WAAU,kBAAkB,6BAA6B;AAGzD,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,iBAAiB,SAAS,WAAW,GAAG,IAC3C,WACA,IAAI,QAAQ;AACf,UAAM,EAAE,WAAW,UAAU,IAAI,kCAAkC;AACnE,UAAM,YAAY,MAAM;AAAA;AAAA,MAEvB,EAAE,IAAI;AAAA,MACN;AAAA,MACA,EAAE,IAAI,OAAO;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO,iBAAiB,MAAM,SAAS,EAAE,GAAG,SAAS,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,gBAAgB,SAAkC;AACvD,UAAM,OAAO,KAAK,QAAQ,eAAe;AACzC,WAAO,oBAAoB,IAAI,YAAY,mBAAmB,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,SAAS;AAAA,IACd;AAAA,EACD,GAAoD;AAEnD,UAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,OAAO;AACjD,QAAI,CAAC,MAAM,OAAO;AACjB,aAAO;AAAA,IACR;AACA,QAAI,KAAK,OAAO,gBAAgB,OAAO,GAAG;AACzC,YAAM,IAAI,cAAc,OAAO;AAAA,IAChC;AAEA,WAAO,mBAAmB,MAAM,KAAK;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACD,GAAsD;AAErD,UAAM,UAAU,gBAAgB,MAAM,GAAG;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,OAAO;AACjD,QAAI,MAAM,OAAO;AAChB,aAAO,mBAAmB,MAAM,KAAK;AAAA,IACtC;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,mBACL,OACuB;AAEvB,UAAM,UAAU,gBAAgB,MAAM,MAAM,MAAM,GAAG;AAGrD,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACP;AAGA,UAAM,KAAK,aAAa,UAAU,OAAO;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,sBAAsB,OAAO;AAC7D,WAAO,mBAAmB,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,YAAY,EAAE,MAAM,KAAK,MAAM,GAAsC;AAE1E,UAAM,UAAU,gBAAgB,MAAM,GAAG;AAEzC,UAAM,KAAK,OAAO,YAAY,SAAS,MAAM,KAAK,KAAK;AAGvD,UAAM,KAAK,aAAa,UAAU,OAAO;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,sBAAsB,OAAO;AAC7D,WAAO,mBAAmB,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,EAAE,KAAK,GAA4C;AACnE,UAAM,SAAwB,CAAC;AAC/B,UAAM,MAAM,KAAK,OAAO,kBAAkB,CAAC,CAAC;AAE5C,qBAAiB,SAAS,KAAK;AAC9B,UAAI,MAAM,SAAS,MAAM;AACxB,eAAO,KAAK,mBAAmB,KAAK,CAAC;AAAA,MACtC;AAAA,IACD;AAGA,WAAO,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,MAAM,EAAE,YAAY;AAC1B,YAAM,MAAM,EAAE,YAAY;AAC1B,aAAO,MAAM;AAAA,IACd,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,MAAM,SAAiB,KAAyC;AACrE,UAAM,WAAW,MAAM,KAAK,OAAO,WAAW,SAAS,CAAC,GAAG,CAAC;AAC5D,WAAO,SAAS,CAAC,MAAM,OACpB,IAAI,YAAY,EAAE,OAAO,SAAS,CAAC,CAAC,IACpC;AAAA,EACJ;AAAA,EAEA,qBAAgD;AAC/C,WAAO;AAAA,MACN,YAAY;AAAA,QACX,GAAI,KAAK,OAAO,UACb,EAAE,MAAM,KAAK,OAAO,YAAY,IAChC,CAAC;AAAA,QACJ,WAAW,KAAK,OAAO,oBAAoB,SAAS;AAAA,MACrD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,kBAAkB;AACjB,WAAO;AAAA,MACN,WAAW,KAAK,OAAO;AAAA,MACvB,MAAM,KAAK,OAAO;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,uBAAuB,qBAAgD;AACtE,SAAK,uBAAuB;AAAA,EAC7B;AACD;AAEA,SAAS,mBAAmB,OAAuC;AAClE,SAAO;AAAA,IACN,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,UAAU,OAAO,MAAM,SAAS;AAAA,IAChC,SAAS,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,IAC1D,eACC,MAAM,kBAAkB,OAAO,OAAO,MAAM,aAAa,IAAI;AAAA,IAC9D,SAAS,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,IAC1D,WAAW,MAAM,cAAc,OAAO,OAAO,MAAM,SAAS,IAAI;AAAA,EACjE;AACD;AAEA,SAAS,oCAGP;AACD,QAAM,YAAY,IAAI,WAAW,CAAC;AAClC,QAAM,YAAY,IAAI,WAAW,CAAC;AAClC,SAAO,gBAAgB,SAAS;AAChC,SAAO,gBAAgB,SAAS;AAChC,SAAO;AAAA,IACN,WAAW,UAAU,OAAO,MAAM,CAAC;AAAA,IACnC,WAAW,UAAU,OAAO,MAAM,CAAC;AAAA,EACpC;AACD;;;AX5RA,IAAM,sCAAsC,EAAE,OAAO;AAAA;AAAA,EAEpD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAMM,SAAS,+BACf,UAAmB,MACnB,SACe;AACf,yBAAuB;AAEvB,OAAI,mCAAS,qBAAoB,OAAO;AACvC,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,QAAM,eAAwC;AAAA,IAC7C;AAAA,IACA,YAAY,mCAAS;AAAA,IACrB,iBAAiB;AAAA,EAClB;AACA,QAAM,QAAQ,IAAI,sBAAsB,YAAY;AACpD,QAAM,eAA6B;AAAA,IAClC,MAAM,UAAU,gBAAgB;AAAA,IAChC,aAAa,UAAU,gBAAgB;AAAA,IACvC,SAAS,CAACC,YACT,IAAI,wBAAwBA,SAAQ,OAAO,YAAY;AAAA,IACxD,OAAO,CAACA,SAAQ,eAAe,iBAAiB;AAC/C,YAAM,cAAc,IAAI;AAAA,QACvBA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,YAAM,cAAcA,SAAQ,cAAc,WAAW;AAErD,aAAO;AAAA,IACR;AAAA,IACA,sBAAsB;AAAA,EACvB;AACA,SAAO;AACR;AAEO,SAAS,uBACf,MACe;AACf,QAAM,gBAAgB,OACnB,oCAAoC,MAAM,IAAI,IAC9C;AACH,SAAO,+BAA+B,MAAM,aAAa;AAC1D;AAEO,SAAS,qBAAmC;AAClD,SAAO,+BAA+B,KAAK;AAC5C;","names":["invariant","cbor","cbor","cbor","cbor","CURRENT_VERSION","cbor","config","config","CURRENT_VERSION","CanSleep","config","invariant","conn","logger","res","config","config","c","config","invariant","bare","config","read0","write0","readActorState","writeActorState","encodeActorState","decodeActorState","readActorAlarm","writeActorAlarm","encodeActorAlarm","decodeActorAlarm","bare","config","readActorKvEntry","writeActorKvEntry","read0","write0","read1","write1","readActorState","writeActorState","encodeActorState","decodeActorState","readActorAlarm","writeActorAlarm","encodeActorAlarm","decodeActorAlarm","CURRENT_VERSION","decodeActorState","encodeActorState","decodeActorAlarm","encodeActorAlarm","logger","crypto","logger","invariant","crypto","CURRENT_VERSION","config","invariant","config","invariant","config"]}
|