@secondlayer/sdk 15.0.1 → 15.0.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.
@@ -12,7 +12,7 @@
12
12
  "import { createHash } from \"node:crypto\";\nimport { verifyStreamsBulkManifestSignature } from \"@secondlayer/shared/streams-bulk-manifest\";\nimport { defaultSleep, fetchPageWithRetry } from \"./consumer.ts\";\nimport { StreamsServerError, StreamsSignatureError } from \"./errors.ts\";\nimport type {\n\tFetchLike,\n\tStreamsDumpFile,\n\tStreamsDumps,\n\tStreamsDumpsManifest,\n} from \"./types.ts\";\n\n/**\n * Bulk parquet dumps: the cold backfill path for \"download all the raw data\".\n *\n * The manifest lives at `<dumpsBaseUrl>/manifest/latest.json` and each file's\n * `path` is the object key under the same base. Downloads are verified against\n * the manifest sha256 so a truncated or tampered file is rejected.\n *\n * When `verifyManifest` is set (the default), the manifest's own ed25519\n * signature is checked (against the published Streams key) BEFORE any file sha256\n * is trusted — a sha256 is only as trustworthy as the manifest it came from.\n */\nexport function createStreamsDumps(opts: {\n\tbaseUrl?: string;\n\tfetchImpl: FetchLike;\n\tverifyManifest?: boolean;\n\tloadPublicKeyPem?: () => Promise<string>;\n}): StreamsDumps {\n\tconst baseUrl = opts.baseUrl?.replace(/\\/+$/, \"\");\n\n\tfunction requireBaseUrl(): string {\n\t\tif (!baseUrl) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t\"Streams dumps require `dumpsBaseUrl` on createStreamsClient.\",\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\treturn baseUrl;\n\t}\n\n\tfunction fileUrl(file: StreamsDumpFile): string {\n\t\tconst base = requireBaseUrl();\n\t\tconst path = file.path.replace(/^\\/+/, \"\");\n\t\t// Manifest file paths are bucket-root-absolute (they embed the dataset\n\t\t// prefix), while `baseUrl` already ends with that prefix — strip the\n\t\t// overlap so both the manifest and its files resolve from one base URL.\n\t\ttry {\n\t\t\tconst basePath = new URL(base).pathname.replace(/^\\/+|\\/+$/g, \"\");\n\t\t\tif (basePath && path.startsWith(`${basePath}/`)) {\n\t\t\t\treturn `${base}/${path.slice(basePath.length + 1)}`;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Non-URL base (tests, relative proxies): fall through to plain join.\n\t\t}\n\t\treturn `${base}/${path}`;\n\t}\n\n\tasync function list(): Promise<StreamsDumpsManifest> {\n\t\tconst url = `${requireBaseUrl()}/manifest/latest.json`;\n\t\tconst res = await opts.fetchImpl(url);\n\t\tif (!res.ok) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Could not fetch dumps manifest (${res.status}).`,\n\t\t\t\tres.status,\n\t\t\t);\n\t\t}\n\t\tconst manifest = (await res.json()) as StreamsDumpsManifest;\n\t\tif (opts.verifyManifest) {\n\t\t\tif (!opts.loadPublicKeyPem) {\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\"Manifest verification is on but no signing key source is configured.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst publicKeyPem = await opts.loadPublicKeyPem();\n\t\t\tif (!verifyStreamsBulkManifestSignature(manifest, publicKeyPem)) {\n\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\"Dumps manifest signature is missing or invalid.\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn manifest;\n\t}\n\n\t/** Fetch one file and hash it as it arrives. Each chunk goes through the\n\t * digest once and is kept once, so a multi-hundred-MB parquet costs its\n\t * own size in memory rather than double. A dropped socket or 5xx retries\n\t * the whole file under the same policy `consume()` uses for pages. */\n\tasync function download(file: StreamsDumpFile): Promise<Uint8Array> {\n\t\treturn fetchPageWithRetry(() => downloadOnce(file), {\n\t\t\tsleep: defaultSleep,\n\t\t});\n\t}\n\n\tasync function downloadOnce(file: StreamsDumpFile): Promise<Uint8Array> {\n\t\tconst res = await opts.fetchImpl(fileUrl(file));\n\t\tif (!res.ok) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Could not download dump ${file.path} (${res.status}).`,\n\t\t\t\tres.status,\n\t\t\t);\n\t\t}\n\t\tif (!res.body) {\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Dump ${file.path} response has no body.`,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tconst hash = createHash(\"sha256\");\n\t\tconst chunks: Uint8Array[] = [];\n\t\tlet total = 0;\n\t\tconst reader = res.body.getReader();\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\thash.update(value);\n\t\t\t\tchunks.push(value);\n\t\t\t\ttotal += value.byteLength;\n\t\t\t}\n\t\t} catch {\n\t\t\t// A body that dies mid-transfer is the same transient as a socket\n\t\t\t// that never answered: let the retry policy take it.\n\t\t\tthrow new StreamsServerError(\n\t\t\t\t`Download of dump ${file.path} was interrupted after ${total} bytes.`,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\t\tconst digest = hash.digest(\"hex\");\n\t\tif (digest !== file.sha256) {\n\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t`Dump ${file.path} sha256 mismatch (expected ${file.sha256}, got ${digest}).`,\n\t\t\t);\n\t\t}\n\t\tif (chunks.length === 1 && chunks[0]) return chunks[0];\n\t\tconst bytes = new Uint8Array(total);\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tbytes.set(chunk, offset);\n\t\t\toffset += chunk.byteLength;\n\t\t}\n\t\treturn bytes;\n\t}\n\n\treturn { list, fileUrl, download };\n}\n",
13
13
  "import { ed25519 } from \"@secondlayer/shared\";\nimport { buildQuery } from \"../base.ts\";\nimport {\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tmapStreamsError,\n} from \"./errors.ts\";\nimport type {\n\tFetchLike,\n\tStreamsEvent,\n\tStreamsFilterMap,\n\tStreamsFilterValue,\n\tStreamsSubscription,\n} from \"./types.ts\";\n\n/**\n * The wire-level shape this loop actually reads off `params`: every field\n * from both the Stacks and Bitcoin `StreamsEventsSubscribeParams` branches,\n * flattened into one type so the loop needs no chain narrowing. The public\n * `StreamsClient.events.subscribe` overloads are the real (narrower,\n * discriminated) surface; `client.ts` bridges the two with a boundary cast,\n * the same pattern `listEvents` uses for `events.list`.\n */\nexport type StreamsEventsSubscribeWireParams = {\n\tchain?: \"stacks\" | \"bitcoin\";\n\tfromCursor?: string | null;\n\ttypes?: readonly string[];\n\tnotTypes?: readonly string[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\trune?: string;\n\taddress?: string;\n\tfilters?: StreamsFilterMap;\n\tsignal?: AbortSignal;\n\tonEvent: (event: StreamsEvent) => void | Promise<void>;\n\tonError?: (err: unknown) => void;\n\treconnectDelayMs?: number;\n\tstaleAfterMs?: number;\n};\n\ntype VerificationKey = {\n\tkeyId: string;\n\tpublicKey: ReturnType<typeof ed25519.loadEd25519PublicKey>;\n};\n\n/** Backoff ceiling: a subscriber that keeps failing asks once per half\n * minute, which a restarting instance can absorb from every worker at once. */\nexport const SUBSCRIBE_MAX_RECONNECT_DELAY_MS = 30_000;\n/** Three server heartbeats (20 s each) with no frame means the socket is\n * half-open, not idle. */\nexport const SUBSCRIBE_DEFAULT_STALE_AFTER_MS = 60_000;\n\n/**\n * Pause before reconnect attempt `attempt` (0 = first retry): `base * 2^attempt`\n * capped at 30 s, scaled by a jitter in [0.5, 1] so a fleet that dropped\n * together does not reconnect together. Never shorter than a `Retry-After`\n * the server sent, since that is the one number it is sure about.\n */\nexport function reconnectDelay(\n\tattempt: number,\n\tbaseMs: number,\n\tretryAfterSeconds?: number,\n\trandom: () => number = Math.random,\n): number {\n\tconst capped = Math.min(\n\t\tbaseMs * 2 ** Math.max(0, attempt),\n\t\tSUBSCRIBE_MAX_RECONNECT_DELAY_MS,\n\t);\n\tconst jittered = capped * (0.5 + random() * 0.5);\n\tconst floor = (retryAfterSeconds ?? 0) * 1000;\n\treturn Math.max(jittered, floor);\n}\n\n/** An error the loop stops on: a retry cannot change the answer. */\nfunction isTerminal(err: unknown): boolean {\n\tif (err instanceof StreamsSignatureError) return true;\n\treturn (err as { retryable?: boolean } | null)?.retryable === false;\n}\n\n/**\n * Subscribe to the Streams SSE push surface (`GET /v1/streams/events/stream`).\n *\n * A fetch-based reader (not `EventSource`) so it can send `Authorization` when\n * a key is present, which `EventSource` cannot. Works in browsers and Node 18+.\n * Reconnects from the last handled cursor after a dropped connection, a clean\n * server close, or a stale socket, with exponential backoff; stops on an error\n * a retry cannot fix and rejects the handle's `done`.\n */\nexport function subscribeStreamsEvents(opts: {\n\tbaseUrl: string;\n\t/** Request headers for every connection (bearer token, `x-sl-origin`). */\n\theaders?: Record<string, string>;\n\tfetchImpl: FetchLike;\n\t/**\n\t * `off` skips verification; `lenient` (default) verifies a frame when it\n\t * carries a `sig` and delivers it unverified when it doesn't (unsigned\n\t * self-host); `strict` requires every frame to be signed. An invalid `sig`\n\t * always throws regardless of mode.\n\t */\n\tverify: \"off\" | \"lenient\" | \"strict\";\n\t/** Resolve the key a frame names by `key_id` (a fetched key refreshes once\n\t * on an unknown id; a pinned key fails closed), or the cached key when\n\t * the frame carries none. */\n\tloadKey: (keyId?: string | null) => Promise<VerificationKey>;\n\t/** First reconnect pause; see {@link StreamsEventsSubscribeWireParams.reconnectDelayMs}. */\n\treconnectDelayMs?: number;\n\t/** Idle limit before the socket is treated as dead; see\n\t * {@link StreamsEventsSubscribeWireParams.staleAfterMs}. */\n\tstaleAfterMs?: number;\n\t/** Jitter source, injectable for tests. */\n\trandom?: () => number;\n\tparams: StreamsEventsSubscribeWireParams;\n}): StreamsSubscription {\n\tconst { params } = opts;\n\tconst controller = new AbortController();\n\tconst external = params.signal;\n\tif (external) {\n\t\tif (external.aborted) controller.abort();\n\t\telse\n\t\t\texternal.addEventListener(\"abort\", () => controller.abort(), {\n\t\t\t\tonce: true,\n\t\t\t});\n\t}\n\tlet cursor = params.fromCursor ?? null;\n\tconst baseDelayMs = opts.reconnectDelayMs ?? params.reconnectDelayMs ?? 1000;\n\tconst staleAfterMs =\n\t\topts.staleAfterMs ??\n\t\tparams.staleAfterMs ??\n\t\tSUBSCRIBE_DEFAULT_STALE_AFTER_MS;\n\t// Consecutive failures since the last frame; drives the backoff exponent.\n\tlet attempt = 0;\n\n\tconst run = async (): Promise<void> => {\n\t\twhile (!controller.signal.aborted) {\n\t\t\ttry {\n\t\t\t\tconst url = `${opts.baseUrl}/v1/streams/events/stream${buildQuery({\n\t\t\t\t\tchain: params.chain === \"bitcoin\" ? \"bitcoin\" : undefined,\n\t\t\t\t\tfrom_cursor: cursor ?? undefined,\n\t\t\t\t\ttypes: params.types,\n\t\t\t\t\tnot_types: params.notTypes,\n\t\t\t\t\tcontract_id: params.contractId,\n\t\t\t\t\tsender: params.sender,\n\t\t\t\t\trecipient: params.recipient,\n\t\t\t\t\tasset_identifier: params.assetIdentifier,\n\t\t\t\t\t// `chain: \"bitcoin\"` only — missing here meant a\n\t\t\t\t\t// bitcoin subscribe silently ignored these filters.\n\t\t\t\t\trune: params.rune,\n\t\t\t\t\taddress: params.address,\n\t\t\t\t\t// JSON in a query param, so SSE keeps plain GET semantics:\n\t\t\t\t\t// no POST-and-stream variant of this route.\n\t\t\t\t\tfilters: params.filters ? JSON.stringify(params.filters) : undefined,\n\t\t\t\t})}`;\n\t\t\t\tawait readSse({\n\t\t\t\t\turl,\n\t\t\t\t\theaders: opts.headers ?? {},\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t\tfetchImpl: opts.fetchImpl,\n\t\t\t\t\tstaleAfterMs,\n\t\t\t\t\tmapError: mapStreamsError,\n\t\t\t\t\tonFrame: async (frame) => {\n\t\t\t\t\t\t// Any frame, ping included, proves the socket is live.\n\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\tif (frame.event === \"ping\" || !frame.data) return;\n\t\t\t\t\t\tlet parsed: { event?: StreamsEvent; sig?: string; key_id?: string };\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tparsed = JSON.parse(frame.data);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn; // ignore non-JSON frames\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!parsed.event) return;\n\t\t\t\t\t\tif (opts.verify !== \"off\") {\n\t\t\t\t\t\t\tif (!parsed.sig) {\n\t\t\t\t\t\t\t\t// Strict requires a signed frame; lenient (default) delivers an\n\t\t\t\t\t\t\t\t// unsigned frame (e.g. self-host with no signing key).\n\t\t\t\t\t\t\t\tif (opts.verify === \"strict\") {\n\t\t\t\t\t\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\t\t\t\t\t\"Streams SSE frame signature is missing.\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// The frame names its key, so a rotation mid-stream is a\n\t\t\t\t\t\t\t\t// one-time refresh instead of a reconnect loop that fails\n\t\t\t\t\t\t\t\t// every frame forever.\n\t\t\t\t\t\t\t\tconst key = await opts.loadKey(parsed.key_id);\n\t\t\t\t\t\t\t\t// A signature is present, so verify it in either mode; an\n\t\t\t\t\t\t\t\t// invalid signature always fails closed.\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!ed25519.verifyEd25519(\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(parsed.event),\n\t\t\t\t\t\t\t\t\t\tparsed.sig,\n\t\t\t\t\t\t\t\t\t\tkey.publicKey,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tthrow new StreamsSignatureError(\n\t\t\t\t\t\t\t\t\t\t\"Streams SSE frame signature is invalid.\",\n\t\t\t\t\t\t\t\t\t);\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\t// The cursor moves only once the handler has taken the event.\n\t\t\t\t\t\t// A throw here reconnects from the previous cursor, so this\n\t\t\t\t\t\t// event is delivered again rather than skipped.\n\t\t\t\t\t\tawait params.onEvent(parsed.event);\n\t\t\t\t\t\tcursor = (parsed.event as { cursor?: string }).cursor ?? cursor;\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\t// Clean end (server closed the stream): reconnect from `cursor`\n\t\t\t\t// after the same pause as an error, so a proxy that answers 200 and\n\t\t\t\t// closes at once cannot spin a hot loop.\n\t\t\t\tawait sleep(\n\t\t\t\t\treconnectDelay(attempt, baseDelayMs, undefined, opts.random),\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t);\n\t\t\t\tattempt += 1;\n\t\t\t} catch (err) {\n\t\t\t\tif (controller.signal.aborted) return;\n\t\t\t\tparams.onError?.(err);\n\t\t\t\tif (isTerminal(err)) throw err;\n\t\t\t\tconst retryAfterSeconds = (err as { retryAfterSeconds?: number })\n\t\t\t\t\t.retryAfterSeconds;\n\t\t\t\tawait sleep(\n\t\t\t\t\treconnectDelay(attempt, baseDelayMs, retryAfterSeconds, opts.random),\n\t\t\t\t\tcontroller.signal,\n\t\t\t\t);\n\t\t\t\tattempt += 1;\n\t\t\t}\n\t\t}\n\t};\n\tconst done = run();\n\t// The caller may never look at `done`; a terminal error already reached\n\t// `onError`, so an unobserved rejection must not crash the process.\n\tdone.catch(() => {});\n\tconst unsubscribe = () => controller.abort();\n\treturn Object.assign(unsubscribe, { done });\n}\n\n/** One parsed `text/event-stream` frame. */\nexport type SseFrame = { event?: string; data?: string };\n\n/**\n * Open one SSE connection and hand every frame to `onFrame` until the server\n * closes the stream or `signal` aborts. Fetch-based rather than `EventSource`\n * so the request can carry `Authorization`. A non-OK response throws through\n * `mapError` (default: a retryable `StreamsServerError`); a thrown `onFrame`\n * propagates and cancels the body. With `staleAfterMs`, a read that sees no\n * frame for that long cancels the body and throws a retryable\n * `StreamsServerError` (`STREAM_STALE`). Reconnecting is the caller's job, so\n * each surface keeps its own cursor rule.\n */\nexport async function readSse(opts: {\n\turl: string;\n\theaders?: Record<string, string>;\n\tsignal: AbortSignal;\n\tfetchImpl: FetchLike;\n\tonFrame: (frame: SseFrame) => void | Promise<void>;\n\tstaleAfterMs?: number;\n\tmapError?: (res: Response) => Promise<never>;\n}): Promise<void> {\n\tconst res = await opts.fetchImpl(opts.url, {\n\t\theaders: { ...(opts.headers ?? {}), Accept: \"text/event-stream\" },\n\t\tsignal: opts.signal,\n\t});\n\tif (!res.ok) {\n\t\tif (opts.mapError) await opts.mapError(res);\n\t\tthrow new StreamsServerError(\n\t\t\t`Streams SSE returned ${res.status}.`,\n\t\t\tres.status,\n\t\t);\n\t}\n\tif (!res.body) {\n\t\tthrow new StreamsServerError(\"Streams SSE response has no body.\", 0);\n\t}\n\tfor await (const frame of parseSseFrames(\n\t\tres.body,\n\t\topts.signal,\n\t\topts.staleAfterMs,\n\t)) {\n\t\tawait opts.onFrame(frame);\n\t}\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tif (signal.aborted) return resolve();\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tresolve();\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/** `reader.read()` raced against an idle timer; a timeout throws a retryable\n * error so the caller's reconnect path takes over. */\nasync function readWithStaleTimer<R extends { read(): Promise<unknown> }>(\n\treader: R,\n\tstaleAfterMs: number | undefined,\n): Promise<Awaited<ReturnType<R[\"read\"]>>> {\n\tif (staleAfterMs === undefined || !Number.isFinite(staleAfterMs)) {\n\t\treturn reader.read() as Promise<Awaited<ReturnType<R[\"read\"]>>>;\n\t}\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst stale = new Promise<never>((_, reject) => {\n\t\ttimer = setTimeout(\n\t\t\t() =>\n\t\t\t\treject(\n\t\t\t\t\tnew StreamsServerError(\n\t\t\t\t\t\t`Streams SSE went quiet for ${staleAfterMs} ms; reconnecting.`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"STREAM_STALE\",\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\tstaleAfterMs,\n\t\t);\n\t});\n\ttry {\n\t\treturn (await Promise.race([reader.read(), stale])) as Awaited<\n\t\t\tReturnType<R[\"read\"]>\n\t\t>;\n\t} finally {\n\t\tclearTimeout(timer);\n\t}\n}\n\nasync function* parseSseFrames(\n\tbody: ReadableStream<Uint8Array>,\n\tsignal: AbortSignal,\n\tstaleAfterMs?: number,\n): AsyncGenerator<SseFrame> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\ttry {\n\t\twhile (!signal.aborted) {\n\t\t\tconst { value, done } = await readWithStaleTimer(reader, staleAfterMs);\n\t\t\tif (done) break;\n\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\tlet sep = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (sep !== -1) {\n\t\t\t\tyield parseFrame(buffer.slice(0, sep));\n\t\t\t\tbuffer = buffer.slice(sep + 2);\n\t\t\t\tsep = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t} finally {\n\t\ttry {\n\t\t\tawait reader.cancel();\n\t\t} catch {\n\t\t\t// best-effort\n\t\t}\n\t}\n}\n\nfunction parseFrame(raw: string): SseFrame {\n\tlet event: string | undefined;\n\tconst data: string[] = [];\n\tfor (const line of raw.split(\"\\n\")) {\n\t\tif (line.startsWith(\"data:\")) {\n\t\t\tdata.push(line.slice(line.startsWith(\"data: \") ? 6 : 5));\n\t\t} else if (line.startsWith(\"event:\")) {\n\t\t\tevent = line.slice(line.startsWith(\"event: \") ? 7 : 6).trim();\n\t\t}\n\t}\n\treturn { event, data: data.length > 0 ? data.join(\"\\n\") : undefined };\n}\n",
14
14
  "export { createStreamsClient } from \"./client.ts\";\nexport { decode } from \"./decode.ts\";\nexport {\n\tAuthError,\n\tRateLimitError,\n\tStreamsServerError,\n\tStreamsSignatureError,\n\tValidationError,\n} from \"./errors.ts\";\n// ── Per-type guard+decode pairs ─────────────────────────────────────────\n// @deprecated (whole block): these 22 helpers return DB-row shapes\n// (`decoded_payload` nested, `source_cursor`) and force an 11-branch\n// guard+decode dispatch, which is the wrong default for a consumer. Use\n// `decode(event)` — one call, the same flat `event_type`-discriminated row\n// Index serves — or `decoded: true` on `streams.events.consume`.\n//\n// They are NOT going away: building a `decoded_events`-shaped projection is a\n// real use, and it is what our own decoder does. They move to the explicit\n// `@secondlayer/sdk/streams/rows` subpath at the next major, so reaching for\n// the storage shape is a deliberate act rather than the first thing autocomplete\n// offers. Import from there today.\nexport {\n\tdecodeFtTransfer,\n\tisFtTransfer,\n\tdecodeNftTransfer,\n\tisNftTransfer,\n\tdecodeStxBurn,\n\tdecodeStxLock,\n\tdecodeStxMint,\n\tdecodeStxTransfer,\n\tisStxBurn,\n\tisStxLock,\n\tisStxMint,\n\tisStxTransfer,\n\tdecodeFtBurn,\n\tdecodeFtMint,\n\tdecodeNftBurn,\n\tdecodeNftMint,\n\tisFtBurn,\n\tisFtMint,\n\tisNftBurn,\n\tisNftMint,\n\tdecodePrint,\n\tisPrint,\n} from \"@secondlayer/shared/streams-rows\";\nexport type {\n\tDecodedEventColumns,\n\tDecodedEventRow,\n\tDecodedFtBurn,\n\tDecodedFtBurnPayload,\n\tDecodedFtMint,\n\tDecodedFtMintPayload,\n\tDecodedFtTransfer,\n\tDecodedFtTransferPayload,\n\tDecodedNftBurn,\n\tDecodedNftBurnPayload,\n\tDecodedNftMint,\n\tDecodedNftMintPayload,\n\tDecodedNftTransfer,\n\tDecodedNftTransferPayload,\n\tDecodedPrint,\n\tDecodedPrintPayload,\n\tDecodedPrintValue,\n\tDecodedStxBurn,\n\tDecodedStxBurnPayload,\n\tDecodedStxLock,\n\tDecodedStxLockPayload,\n\tDecodedStxMint,\n\tDecodedStxMintPayload,\n\tDecodedStxTransfer,\n\tDecodedStxTransferPayload,\n\tFtTransferEvent,\n\tFtTransferPayload,\n\tNftTransferEvent,\n\tNftTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\nexport { STREAMS_EVENT_TYPES } from \"./types.ts\";\nexport { Cursor } from \"./cursor.ts\";\nexport type {\n\tConsumerBatchContext,\n\tFetchLike,\n\tRuneEtchEntry,\n\tRuneEventPayload,\n\tRuneEventType,\n\tRuneStreamsEvent,\n\tStreamsBatch,\n\tStreamsBatchContext,\n\tStreamsBitcoinCanonicalBlock,\n\tStreamsBitcoinTip,\n\tStreamsClient,\n\tStreamsConsumeBitcoinParams,\n\tStreamsConsumeParams,\n\tStreamsConsumeStacksParams,\n\tStreamsCanonicalBlock,\n\tStreamsDumpFile,\n\tStreamsDumps,\n\tStreamsDumpsManifest,\n\tStreamsEvent,\n\tStreamsEventPayload,\n\tStreamsWireEvent,\n\tVmStreamsEvent,\n\tStreamsEventsBitcoinListParams,\n\tStreamsEventsConsumeBitcoinParams,\n\tStreamsEventsConsumeParams,\n\tStreamsEventsConsumeResult,\n\tStreamsEventsEnvelope,\n\tStreamsEventsListEnvelope,\n\tStreamsEventsListParams,\n\tStreamsEventsStacksListParams,\n\tStreamsEventsStreamBitcoinParams,\n\tStreamsEventsStreamParams,\n\tStreamsEventsStreamStacksParams,\n\tStreamsEventsSubscribeBitcoinParams,\n\tStreamsEventsSubscribeParams,\n\tStreamsEventsSubscribeStacksParams,\n\tStreamsSubscription,\n\tStreamsEventType,\n\tStreamsReorg,\n\tStreamsReorgContext,\n\tStreamsReorgsListEnvelope,\n\tStreamsReorgsListParams,\n\tStreamsTip,\n} from \"./types.ts\";\n",
15
- "// Canonical event primitives (StreamsEvent, payload types, event-type vocab)\n// live in @secondlayer/shared/streams-rows; re-exported here so the public\n// Streams surface is unchanged.\nimport type { VmEventType } from \"@secondlayer/shared\";\nimport {\n\tRUNE_EVENT_TYPES,\n\ttype RuneEventType,\n\ttype RuneStreamsEvent,\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype StreamsWireEvent,\n\ttype VmStreamsEvent,\n} from \"@secondlayer/shared/streams-rows\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\n\nexport {\n\tRUNE_EVENT_TYPES,\n\tSTREAMS_EVENT_TYPES,\n\ttype RuneEventType,\n\ttype RuneStreamsEvent,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype VmStreamsEvent,\n};\nexport type {\n\tFtBurnPayload,\n\tFtMintPayload,\n\tFtTransferPayload,\n\tMapDeletePayload,\n\tMapWritePayload,\n\tNestedContractCallPayload,\n\tVarSetPayload,\n\tStreamsWireEvent,\n\tNftBurnPayload,\n\tNftMintPayload,\n\tNftTransferPayload,\n\tPrintPayload,\n\tRuneEtchEntry,\n\tRuneEventPayload,\n\tStreamsClarityValue,\n\tStreamsEventBase,\n\tStreamsEventPayload,\n\tStxBurnPayload,\n\tStxLockPayload,\n\tStxMintPayload,\n\tStxTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\n\nexport type StreamsTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\t/**\n\t * Highest Stacks block past the burn-confirmation finality boundary.\n\t * Optional for back-compat; the API always sets it.\n\t */\n\tfinalized_height?: number;\n\tlag_seconds: number;\n\t/**\n\t * Oldest height still seekable on the live API for the caller's tier\n\t * (`tip - retention`). `null` = unlimited retention. Older reads must use the\n\t * cold dumps lane. Optional for back-compat.\n\t */\n\toldest_seekable_height?: number | null;\n\t/** Oldest seekable cursor (`<oldest_seekable_height>:0`); `null` = unlimited. */\n\toldest_cursor?: string | null;\n};\n\n/** `chain=bitcoin` tip — no `burn_block_height`/retention fields,\n * since Bitcoin has no burn chain of its own and Runes reads have no\n * retention ladder. Returned by `tip({ chain: \"bitcoin\" })`. */\nexport type StreamsBitcoinTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tfinalized_height: number;\n\tlag_seconds: number;\n};\n\nexport type StreamsCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\tis_canonical: true;\n};\n\n/** `chain=bitcoin` canonical block — no burn-chain fields. */\nexport type StreamsBitcoinCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tis_canonical: true;\n};\n\nexport type StreamsReorg = {\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\t/**\n\t * First position of the new canonical chain at the fork, `fork:0`\n\t * (INCLUSIVE). Not an exclusive resume token — resuming directly from it\n\t * skips `fork:0`. The consumer rewinds to the foot of `fork_point_height`\n\t * (`Cursor.atHeight`) to re-read the new run from `fork:0` inclusive.\n\t */\n\tnew_canonical_tip: string;\n};\n\nexport type StreamsEventsEnvelope<TEvent = StreamsEvent, TTip = StreamsTip> = {\n\tevents: TEvent[];\n\tnext_cursor: string | null;\n\ttip: TTip;\n\treorgs: StreamsReorg[];\n};\n\nexport type StreamsEventsListEnvelope<\n\tTEvent = StreamsEvent,\n\tTTip = StreamsTip,\n> = Omit<StreamsEventsEnvelope<TEvent, TTip>, \"next_cursor\">;\n\n/** The StreamsEvent union narrowed to a `types` selection — what a\n * const-generic `types: [\"ft_transfer\"]` buys at the type level. */\nexport type StreamsEventOfTypes<T extends readonly StreamsEventType[]> =\n\tExtract<StreamsEvent, { event_type: T[number] }>;\n\nexport type StreamsReorgsListParams = {\n\tsince: string;\n\tlimit?: number;\n};\n\nexport type StreamsReorgsListEnvelope = {\n\treorgs: StreamsReorg[];\n\tnext_since: string | null;\n};\n\n/** A filter that matches a single value or any value in a list. */\nexport type StreamsFilterValue = string | readonly string[];\n\n/**\n * One labelled filter group. Fields inside a group AND together; groups in a\n * map OR together server-side.\n */\nexport type StreamsLabelledFilter = {\n\ttypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n};\n\n/** A map of label → filter group. Labels are yours; the server echoes them. */\nexport type StreamsFilterMap = Record<string, StreamsLabelledFilter>;\n\n/**\n * The events one label can yield. A group that declares `types` narrows to\n * exactly those variants, so a per-label handler needs no `event_type` guard;\n * a group without `types` keeps the full union.\n */\nexport type StreamsEventForFilter<F, D extends boolean = false> = F extends {\n\ttypes: readonly (infer T extends StreamsEventType)[];\n}\n\t? D extends true\n\t\t? Extract<IndexEvent, { event_type: T }>\n\t\t: Extract<StreamsEvent, { event_type: T }>\n\t: D extends true\n\t\t? IndexEvent\n\t\t: StreamsEvent;\n\ntype StreamsEventsListParamsCommon = {\n\tcursor?: string | null;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\tlimit?: number;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely) — unchanged since before Runes events\n * were added. */\nexport type StreamsEventsStacksListParams = StreamsEventsListParamsCommon & {\n\tchain?: \"stacks\";\n\t/** `vm` reads ordinal. Omit for Streams 1.0. */\n\tclock?: \"classic\" | \"vm\";\n\ttypes?: readonly (StreamsEventType | VmEventType)[];\n\t/** Event types to exclude (applied after `types`). */\n\tnotTypes?: readonly (StreamsEventType | VmEventType)[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in one scan and each\n\t * returned event carries the labels it matched (`event.matched`) — two\n\t * unrelated concerns share one page, one cursor, one checkpoint.\n\t */\n\tfilters?: StreamsFilterMap;\n};\n\n/**\n * `chain: \"bitcoin\"` — Runes events, own cursor space. `types` is\n * restricted to {@link RuneEventType} at the type level, so e.g.\n * `{ chain: \"bitcoin\", types: [\"ft_transfer\"] }` is a compile error rather\n * than a silent 400 at request time. `contractId`/`sender`/`recipient`/\n * `assetIdentifier`/`filters`/`clock` don't exist on this branch — they're\n * Stacks-only (the server 400s on them too).\n */\nexport type StreamsEventsBitcoinListParams = StreamsEventsListParamsCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\nexport type StreamsEventsListParams =\n\t| StreamsEventsStacksListParams\n\t| StreamsEventsBitcoinListParams;\n\ntype StreamsEventsStreamCommon = {\n\tfromCursor?: string | null;\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely) — matches\n * {@link StreamsEventsStacksListParams}. */\nexport type StreamsEventsStreamStacksParams = StreamsEventsStreamCommon & {\n\tchain?: \"stacks\";\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n};\n\n/** `chain: \"bitcoin\"` — Runes events, tailed the same way as\n * the Stacks default. `types` is restricted to {@link RuneEventType} at the\n * type level, matching {@link StreamsEventsBitcoinListParams}.\n * `contractId`/`sender`/`recipient`/`assetIdentifier`/`filters` don't exist\n * on this branch — they're Stacks-only. */\nexport type StreamsEventsStreamBitcoinParams = StreamsEventsStreamCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\nexport type StreamsEventsStreamParams =\n\t| StreamsEventsStreamStacksParams\n\t| StreamsEventsStreamBitcoinParams;\n\ntype StreamsEventsSubscribeCommon = {\n\t/** Resume strictly after this cursor; omit to live-tail from the tip. */\n\tfromCursor?: string | null;\n\t/** Abort to unsubscribe (the returned function does the same). */\n\tsignal?: AbortSignal;\n\t/**\n\t * Called on every failure. Transport errors (dropped socket, 5xx, 429, a\n\t * stale connection, a throwing handler) reconnect from the last handled\n\t * cursor with exponential backoff. Errors that a retry cannot fix (401,\n\t * 4xx, a bad signature) end the subscription and reject its `done`.\n\t */\n\tonError?: (err: unknown) => void;\n\t/**\n\t * First reconnect pause in ms (default 1000). Doubles per consecutive\n\t * failure up to 30 s with jitter, resets once a frame arrives, and never\n\t * undercuts a `Retry-After`.\n\t */\n\treconnectDelayMs?: number;\n\t/**\n\t * Reconnect when no frame (pings included) arrives for this long (default\n\t * 60000, three server heartbeats). Catches a half-open socket that never\n\t * errors; set it above your instance's heartbeat interval.\n\t */\n\tstaleAfterMs?: number;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely). */\nexport type StreamsEventsSubscribeStacksParams =\n\tStreamsEventsSubscribeCommon & {\n\t\tchain?: \"stacks\";\n\t\ttypes?: readonly StreamsEventType[];\n\t\tnotTypes?: readonly StreamsEventType[];\n\t\tcontractId?: StreamsFilterValue;\n\t\tsender?: StreamsFilterValue;\n\t\trecipient?: StreamsFilterValue;\n\t\tassetIdentifier?: string;\n\t\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\t\tfilters?: StreamsFilterMap;\n\t\t/**\n\t\t * Called for each pushed event, in order. The resume cursor advances only\n\t\t * after this resolves, so a handler that throws sees the same event again\n\t\t * on reconnect (at-least-once). Key durable writes by `cursor`.\n\t\t */\n\t\tonEvent: (event: StreamsEvent) => void | Promise<void>;\n\t};\n\n/** `chain: \"bitcoin\"` — Runes events pushed live, on their own\n * cursor space. `contractId`/`sender`/`recipient`/`assetIdentifier`/`filters`\n * don't exist on this branch — they're Stacks-only. */\nexport type StreamsEventsSubscribeBitcoinParams =\n\tStreamsEventsSubscribeCommon & {\n\t\tchain: \"bitcoin\";\n\t\ttypes?: readonly RuneEventType[];\n\t\tnotTypes?: readonly RuneEventType[];\n\t\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\t\trune?: string;\n\t\t/** A mainnet address. */\n\t\taddress?: string;\n\t\tonEvent: (event: RuneStreamsEvent) => void | Promise<void>;\n\t};\n\nexport type StreamsEventsSubscribeParams =\n\t| StreamsEventsSubscribeStacksParams\n\t| StreamsEventsSubscribeBitcoinParams;\n\n/**\n * Handle for a live subscription: call it to unsubscribe. `done` resolves\n * after unsubscribe (or the signal aborting) and rejects with the error that\n * ended the loop when a retry could not fix it, so a worker can `await`\n * it instead of polling for silence.\n */\nexport type StreamsSubscription = {\n\t(): void;\n\tdone: Promise<void>;\n};\n\n/**\n * The checkpoint the SDK computes for a batch. Persist `cursor` inside the same\n * transaction as your projection writes, then resume from it via `fromCursor`.\n * It is the position to advance to: `next_cursor` normally, or the last\n * finalized event when `finalizedOnly` is set.\n */\n/**\n * What the loop knows at the end of a page, handed to `onBatch`.\n *\n * `cursor` is the position to commit. The rest answers \"how far along am I,\n * and am I still moving\" — the question every deployed consumer has to expose\n * for a health check.\n *\n * Progress is reported here rather than left to callers because only the loop\n * can get it right: `height` has to survive empty pages (normal at the tip)\n * and has to roll back to `fork_point_height - 1` after a reorg rewind.\n * Deriving it from `cursor` is wrong — `Cursor.atHeight` encodes the foot of a\n * block as `${height - 1}:<sentinel>`, so a rewound cursor parses to a\n * position that was never reached.\n */\nexport type ConsumerBatchContext<TTip = unknown, TReorg = unknown> = {\n\t/** Checkpoint to commit alongside your rows. */\n\tcursor: string | null;\n\t/** Highest canonical block a row was DELIVERED from. `null` before the\n\t * first row of a fresh consume. With a sparse filter this parks at the\n\t * last matching event — it measures event recency, not progress. */\n\theight: number | null;\n\t/** Highest canonical block the sweep has VERIFIED through: an empty page\n\t * is the server confirming nothing matches between the cursor and the\n\t * tip, so a caught-up tail scans to the tip even when `height` is far\n\t * below it. Rolls back with reorg rewinds. */\n\tscannedHeight: number | null;\n\t/** Chain tip as of this page's read. */\n\ttipHeight: number;\n\t/** `tipHeight - scannedHeight`, floored at 0 — the consumer's actual\n\t * backlog. `null` until a position is known. A caught-up consumer on a\n\t * quiet contract reads ~0 here while `tipHeight - height` grows — that\n\t * difference is event age, not lag. */\n\tblocksBehind: number | null;\n\t/**\n\t * The full tip for this page — `StreamsTip` or `IndexTip` depending on the\n\t * surface. Exposed here so a handler never needs the `envelope` parameter,\n\t * which is the only way to reach it today and is also how the worst\n\t * `finalizedOnly` mistake becomes reachable (`return envelope.next_cursor`\n\t * jumps the cursor past events that were filtered out and never delivered).\n\t */\n\ttip: TTip;\n\t/**\n\t * Reorgs reported alongside this page; empty when none. Rollback still\n\t * belongs in `onReorg` — this is for observability inside a batch.\n\t */\n\treorgs: readonly TReorg[];\n};\n\n/** @deprecated Use {@link ConsumerBatchContext} — the Index and Streams loops\n * share one shape now. Kept as an alias so existing annotations compile. */\nexport type StreamsBatchContext = ConsumerBatchContext;\n\n/**\n * The checkpoint for a reorg rollback. Persist `cursor` (the rewind position)\n * inside the same transaction as your rollback so the two commit atomically.\n */\n/** `cursor` is the rewind position the loop resumes from after `onReorg`:\n * the foot of the fork point, or `null` for a fork at genesis. Persist it\n * in the same transaction as the rollback. */\nexport type StreamsReorgContext = { cursor: string | null };\n\nexport type StreamsEventsConsumeParams<\n\tTTx = never,\n\tD extends boolean = false,\n\tF extends StreamsFilterMap = Record<never, never>,\n> = {\n\t/** `chain: \"stacks\"` (default, omit `chain` entirely) — the bitcoin branch\n\t * is {@link StreamsEventsConsumeBitcoinParams}, a separate overload with\n\t * no `filters`/`on`/`decoded` (Stacks-only concepts). */\n\tchain?: \"stacks\";\n\tfromCursor?: string | null;\n\t/**\n\t * Deliver events pre-decoded as the flat, `event_type`-discriminated rows\n\t * Index serves (`IndexEvent`), so Streams consumption reads identically\n\t * to Index consumption — no guard+decode pairs in your handler.\n\t */\n\tdecoded?: D;\n\t/**\n\t * Destination adapter that owns the checkpoint + rollback transaction\n\t * (e.g. `kyselySink` from `@secondlayer/sdk/sinks/kysely`). With a sink:\n\t * the loop resumes from the sink's committed cursor, `onBatch` receives\n\t * `ctx.tx` and must write ONLY through it (rows and cursor commit in one\n\t * transaction), reorg rollback is automatic, and `onBatch`'s return value\n\t * is ignored. Folds (balances) invert in the sink's `onRollback`, not in\n\t * `onReorg`.\n\t */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and before any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\t/**\n\t * Emit only finalized (immutable) events and never surface reorgs. The SDK\n\t * checkpoints at the last finalized event and re-reads the unfinalized tail\n\t * until it settles. Trades finality lag for zero reorg handling; `onReorg` is\n\t * ignored.\n\t */\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in ONE server-side scan,\n\t * so two unrelated concerns share one page, one cursor, and one checkpoint\n\t * instead of two consume loops. Pair with `on` to handle each label.\n\t */\n\tfilters?: F;\n\t/**\n\t * One handler per label in `filters`. Every label must be handled, so\n\t * adding a label is a compile error until its handler exists.\n\t *\n\t * A label's declared `types` narrows its handler's events, so `payload` is\n\t * typed without an `event_type` guard. Labels are dispatched in declaration\n\t * order: a label's own events stay in cursor order, but events of different\n\t * labels do not interleave within a page — add `onBatch` when you need\n\t * strict global order across labels.\n\t */\n\ton?: {\n\t\t[K in keyof F]: (\n\t\t\tevents: StreamsEventForFilter<F[K], D>[],\n\t\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t\t) => void | Promise<void>;\n\t};\n\tbatchSize?: number;\n\t/**\n\t * Apply a page of canonical events. Persist `ctx.cursor` in the same\n\t * transaction as your writes. Returning a cursor overrides `ctx.cursor` as\n\t * the resume point (advanced manual control); returning nothing uses it.\n\t *\n\t * Optional only when `on` handles the page instead; a consume call with\n\t * neither throws.\n\t */\n\tonBatch?: (\n\t\tevents: D extends true ? IndexEvent[] : StreamsEvent[],\n\t\t/**\n\t\t * @deprecated Read `ctx.tip` / `ctx.reorgs` instead. The envelope is\n\t\t * also how the worst `finalizedOnly` mistake stays reachable —\n\t\t * returning `envelope.next_cursor` jumps the cursor past unfinalized\n\t\t * events that were filtered out and never delivered. Removed in the\n\t\t * next major.\n\t\t */\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\t/**\n\t * Roll your projection back to `reorg.fork_point_height`, persisting\n\t * `ctx.cursor` in the same transaction. Called once per *new* reorg at or\n\t * below the checkpoint (deduped in-memory, fork-ascending) before the SDK\n\t * rewinds and re-reads the now-canonical events. A reorg whose fork sits\n\t * above the checkpoint is not a rollback (nothing past it was written) and\n\t * is skipped. Omit it to ignore reorgs (events stay canonical, but stale\n\t * rows from an orphaned fork are left in place).\n\t *\n\t * With `onReorg` or a `sink` attached, every empty page also polls\n\t * `reorgs.list` (one extra request per idle poll) so a fork that lands\n\t * while the consumer idles at the tip is rolled back too.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint before the loop\n\t * refuses with `ValidationError`. Default 1000 blocks. The fork point is\n\t * server supplied and drives a delete on every declared table, so raise\n\t * this only for a source you trust. */\n\tmaxRollbackDepth?: number;\n\t/** Page-fetch retries after the first failure (429/5xx/network only —\n\t * 4xx and handler throws always propagate). Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base retry delay in ms; the n-th retry waits `retryDelay * n`. A server\n\t * `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/**\n\t * Cuts the empty-poll backoff short: on an empty page, the loop races\n\t * `emptyBackoffMs` against this promise instead of sleeping the full\n\t * amount. Pass a function that resolves once when new data MIGHT be\n\t * available (e.g. a Postgres NOTIFY listener) — it is called fresh on\n\t * every empty page, never awaited more than once concurrently per page.\n\t * The backoff timer still runs underneath, so a wake source that never\n\t * resolves (or a `wake` this call omits) degrades to the same polling\n\t * behavior as before.\n\t */\n\twake?: () => Promise<void>;\n};\n\n/**\n * `chain: \"bitcoin\"` — the checkpointed sweep over Runes\n * events. A separate, simpler type from {@link StreamsEventsConsumeParams}\n * rather than a widened union member: `filters`/`on`/`decoded` are Stacks-only\n * concepts (labelled OR-groups and Index-shaped projection have no Runes\n * equivalent yet), so `onBatch` is the only way in and is required. Reorg\n * rewind still works the same way (bitcoin reorgs carry the same\n * `fork_point_height` + `new_canonical_tip` shape as Stacks ones).\n */\nexport type StreamsEventsConsumeBitcoinParams<TTx = never> = {\n\tchain: \"bitcoin\";\n\tfromCursor?: string | null;\n\tsink?: ConsumerSink<TTx>;\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n\tbatchSize?: number;\n\tonBatch: (\n\t\tevents: RuneStreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope<RuneStreamsEvent, StreamsBitcoinTip>,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmaxRollbackDepth?: number;\n\tretryCount?: number;\n\tretryDelay?: number;\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\twake?: () => Promise<void>;\n};\n\n/**\n * One yielded page from {@link StreamsClient.consume} — the\n * `GET /v1/streams/events` envelope verbatim, with `next_cursor` renamed to\n * `cursor` (the checkpoint to persist and resume from).\n */\nexport type StreamsBatch<TEvent = StreamsEvent, TTip = StreamsTip> = {\n\t/** Canonical events of this page, in cursor order. */\n\tevents: TEvent[];\n\t/** Checkpoint after this page — pass back as `consume({ cursor })` to resume. */\n\tcursor: string | null;\n\ttip: TTip;\n\t/** Chain reorgs reported alongside this page; empty when none. */\n\treorgs: StreamsReorg[];\n};\n\ntype StreamsConsumeCommon = {\n\t/** Resume strictly after this cursor; omit to start from the oldest seekable page. */\n\tcursor?: string | null;\n\t/** Events per page (the `limit` query param). Default 100. */\n\tbatchSize?: number;\n\t/** Poll interval while caught up at the tip, in ms. Default 2000. */\n\tintervalMs?: number;\n\t/** Abort to end the iteration. */\n\tsignal?: AbortSignal;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely). */\nexport type StreamsConsumeStacksParams = StreamsConsumeCommon & {\n\tchain?: \"stacks\";\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled OR-groups — same semantics as `events.consume`; each returned\n\t * event echoes the labels it matched. */\n\tfilters?: StreamsFilterMap;\n};\n\n/** `chain: \"bitcoin\"` — Runes batches, own cursor space.\n * `contractId`/`sender`/`recipient`/`assetIdentifier`/`filters` don't exist\n * on this branch — they're Stacks-only. */\nexport type StreamsConsumeBitcoinParams = StreamsConsumeCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\nexport type StreamsConsumeParams =\n\t| StreamsConsumeStacksParams\n\t| StreamsConsumeBitcoinParams;\n\nexport type StreamsEventsConsumeResult = {\n\tcursor: string | null;\n\tpages: number;\n\temptyPolls: number;\n};\n\nexport type StreamsEventsReplayParams = {\n\t/** Start point: `\"genesis\"` (default) or a `<block>:<index>` cursor. */\n\tfrom?: \"genesis\" | string;\n\t/**\n\t * Called once per finalized dump file, in block order, before live tailing.\n\t * Process the parquet with your own tooling (e.g. DuckDB) — the SDK does not\n\t * decode parquet. Use `client.dumps.download(file)` to fetch + verify bytes.\n\t *\n\t * Delivery is file-granular and at-least-once: a file whose range straddles\n\t * `from` is handed over whole. `ctx.from` is that cursor (`null` from\n\t * genesis); skip rows at or below it, or key rows by `cursor` so a re-run\n\t * is an idempotent no-op. Files ending at or below `from` are not handed\n\t * over at all.\n\t */\n\tonDumpFile: (\n\t\tfile: StreamsDumpFile,\n\t\tctx: { from: string | null },\n\t) => Promise<void> | void;\n\t/** Called per live page after the dump phase, like `consume`. */\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t) => Promise<string | null | undefined> | string | null | undefined;\n\t/**\n\t * Called when the live-tail phase (after the dump backfill) crosses a reorg,\n\t * before the cursor rewinds and re-reads the now-canonical events — same\n\t * contract as `consume`. The dump-backfill phase is finalized and never\n\t * reorgs; omit this to leave stale rows from an orphaned fork in place.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmode?: \"tail\" | \"bounded\";\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/** Narrow the LIVE TAIL after the dump phase. The dump files themselves are\n\t * always all-type (block-partitioned parquet) — filter those in your own\n\t * tooling while processing each file. */\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\t/** Labelled OR-groups for the live tail, like `consume`. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type FetchLike = (\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/** One bulk parquet file in the dumps manifest. `path` is the object key under\n * the dumps base URL. */\nexport type StreamsDumpFile = {\n\tpath: string;\n\tfrom_block: number;\n\tto_block: number;\n\tmin_cursor: string | null;\n\tmax_cursor: string | null;\n\trow_count: number;\n\tbyte_size: number;\n\tsha256: string;\n\tschema_version: number;\n\tcreated_at: string;\n};\n\nexport type StreamsDumpsManifest = {\n\tdataset: string;\n\tnetwork: string;\n\tversion: string;\n\tschema_version: number;\n\tgenerated_at: string;\n\tproducer_version: string;\n\tfinality_lag_blocks: number;\n\t/** Cursor at the end of the finalized bulk coverage — hand to live tailing. */\n\tlatest_finalized_cursor: string | null;\n\tcoverage: { from_block: number; to_block: number };\n\tfiles: StreamsDumpFile[];\n\t/** ed25519 signature over the manifest's canonical bytes. Absent on legacy\n\t * unsigned manifests. Verified by `list()` when `verifyDumpsManifest` is on. */\n\tsignature?: string;\n\t/** Short id of the signing public key. */\n\tkey_id?: string;\n};\n\nexport type StreamsDumps = {\n\t/** Fetch and parse the latest dumps manifest. */\n\tlist(): Promise<StreamsDumpsManifest>;\n\t/** Absolute URL for a manifest file. */\n\tfileUrl(file: StreamsDumpFile): string;\n\t/** Download a parquet file and verify its sha256 against the manifest. */\n\tdownload(file: StreamsDumpFile): Promise<Uint8Array>;\n};\n\nexport type StreamsClient = {\n\t/**\n\t * Read Streams page by page as an async iterator.\n\t *\n\t * Yields one {@link StreamsBatch} per events page, so each yield is exactly\n\t * one API call. Empty pages are skipped; at the tip the iterator polls again\n\t * every `intervalMs` (default 2000) until `signal` aborts.\n\t *\n\t * Reorgs appear on `batch.reorgs`, but the cursor is not rewound for you.\n\t * Use `events.consume` with `onReorg` when you need rollback.\n\t *\n\t * A literal `types` array narrows every batch's event union to those types.\n\t * `chain: \"bitcoin\"` batches carry Runes rows only, on the bitcoin tip shape.\n\t */\n\tconsume(\n\t\tparams: StreamsConsumeBitcoinParams,\n\t): AsyncIterableIterator<StreamsBatch<RuneStreamsEvent, StreamsBitcoinTip>>;\n\tconsume<const T extends readonly StreamsEventType[]>(\n\t\tparams: StreamsConsumeStacksParams & { types: T },\n\t): AsyncIterableIterator<StreamsBatch<StreamsEventOfTypes<T>>>;\n\tconsume(params?: StreamsConsumeParams): AsyncIterableIterator<StreamsBatch>;\n\tevents: {\n\t\t/**\n\t\t * Read one page of chain events and the next cursor.\n\t\t *\n\t\t * Narrow with `types`, `notTypes`, `contractId`, `sender`, `recipient`,\n\t\t * `assetIdentifier`, `fromHeight`/`toHeight`, or labelled `filters`.\n\t\t * Filters match exactly, and an event type without a given field never\n\t\t * matches it. Pass `next_cursor` back as `cursor` to continue. The\n\t\t * envelope also carries the `tip` and any `reorgs`. To write the events\n\t\t * somewhere with a checkpoint, use `events.consume` instead.\n\t\t *\n\t\t * A literal `types` array narrows every row to those event types.\n\t\t * `clock: \"vm\"` pages carry vm rows only (a parallel vocabulary,\n\t\t * `event_index` = `ordinal`), never `StreamsEvent`; it is Stacks only.\n\t\t * `chain: \"bitcoin\"` pages carry Runes rows only, on the bitcoin tip shape,\n\t\t * and filter by `rune` or `address`.\n\t\t */\n\t\tlist(\n\t\t\tparams: StreamsEventsStacksListParams & { clock: \"vm\" },\n\t\t): Promise<StreamsEventsEnvelope<VmStreamsEvent>>;\n\t\tlist<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: Omit<\n\t\t\t\tStreamsEventsStacksListParams,\n\t\t\t\t\"clock\" | \"types\" | \"notTypes\"\n\t\t\t> & {\n\t\t\t\ttypes: T;\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope<StreamsEventOfTypes<T>>>;\n\t\tlist(\n\t\t\tparams?: Omit<\n\t\t\t\tStreamsEventsStacksListParams,\n\t\t\t\t\"clock\" | \"types\" | \"notTypes\"\n\t\t\t> & {\n\t\t\t\ttypes?: readonly StreamsEventType[];\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope>;\n\t\tlist(\n\t\t\tparams: StreamsEventsBitcoinListParams,\n\t\t): Promise<StreamsEventsEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams,\n\t\t): Promise<StreamsEventsEnvelope<StreamsWireEvent>>;\n\t\t/**\n\t\t * Read every event a transaction emitted.\n\t\t *\n\t\t * Returns the events and the `tip`, with no `next_cursor`: one transaction\n\t\t * is one response.\n\t\t *\n\t\t * `chain: \"bitcoin\"` returns the Runes events for one Bitcoin transaction.\n\t\t */\n\t\tbyTxId(\n\t\t\ttxId: string,\n\t\t\topts: { chain: \"bitcoin\" },\n\t\t): Promise<StreamsEventsListEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tbyTxId(txId: string): Promise<StreamsEventsListEnvelope>;\n\t\t/**\n\t\t * Run a checkpointed indexer that rewinds on reorgs.\n\t\t *\n\t\t * Write your rows in `onBatch` and commit `ctx.cursor` in the same\n\t\t * transaction; resume with `fromCursor`. Reorgs at or below your checkpoint\n\t\t * call `onReorg`, then the loop re-reads from the fork point. Delivery is\n\t\t * at-least-once, so keep writes idempotent. With a `sink`, the checkpoint\n\t\t * and rollback are handled for you. `mode: \"tail\"` (default) keeps polling\n\t\t * at the tip; `mode: \"bounded\"` returns on the first empty page. It also\n\t\t * stops on `maxPages`, `maxEmptyPolls`, or `signal`. Pass `finalizedOnly`\n\t\t * to skip reorg handling entirely.\n\t\t *\n\t\t * `chain: \"bitcoin\"` sweeps Runes events; see\n\t\t * {@link StreamsEventsConsumeBitcoinParams}.\n\t\t */\n\t\tconsume<TTx = never>(\n\t\t\tparams: StreamsEventsConsumeBitcoinParams<TTx> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\tconsume<\n\t\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\t\tTTx = never,\n\t\t\tD extends boolean = false,\n\t\t>(\n\t\t\t// The redundant `sink` member gives TS a DIRECT inference site for\n\t\t\t// TTx — inference does not reliably traverse the params alias.\n\t\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Backfill from bulk dumps, then continue live in one call.\n\t\t *\n\t\t * Hands each finalized dump file to `onDumpFile` in block order, then tails\n\t\t * live from the manifest's `latest_finalized_cursor`, with no gap or\n\t\t * duplicate at the seam. A file that straddles `from` is delivered whole,\n\t\t * so skip the rows at or below it. Requires `dumpsBaseUrl`.\n\t\t */\n\t\treplay(\n\t\t\tparams: StreamsEventsReplayParams,\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Read events one at a time as an async iterator.\n\t\t *\n\t\t * For live processors and watch-style apps that keep their own state. It\n\t\t * tails indefinitely and stops when `signal`, `maxPages`, or\n\t\t * `maxEmptyPolls` ends it. There is no checkpoint or reorg handling; use\n\t\t * `events.consume` for that.\n\t\t *\n\t\t * A literal `types` array narrows every event to those types.\n\t\t * `chain: \"bitcoin\"` yields Runes events only.\n\t\t */\n\t\tstream(\n\t\t\tparams: StreamsEventsStreamBitcoinParams,\n\t\t): AsyncIterable<RuneStreamsEvent>;\n\t\tstream<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: StreamsEventsStreamStacksParams & { types: T },\n\t\t): AsyncIterable<StreamsEventOfTypes<T>>;\n\t\tstream(params?: StreamsEventsStreamParams): AsyncIterable<StreamsEvent>;\n\t\t/**\n\t\t * Get each new event pushed to `onEvent` as it lands.\n\t\t *\n\t\t * Reconnects from the last handled cursor after a transport error, and\n\t\t * verifies each frame's ed25519 signature when the client has `verify` on.\n\t\t * Returns an unsubscribe function whose `done` promise settles when the\n\t\t * loop ends. Not reorg-aware: an event delivered and then orphaned is never\n\t\t * retracted. Durable writers use `events.consume`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` delivers Runes rows to `onEvent`.\n\t\t */\n\t\tsubscribe(params: StreamsEventsSubscribeBitcoinParams): StreamsSubscription;\n\t\tsubscribe(params: StreamsEventsSubscribeStacksParams): StreamsSubscription;\n\t};\n\tblocks: {\n\t\t/**\n\t\t * Read every event in one block, by height or hash.\n\t\t *\n\t\t * Returns the events and the `tip`, with no `next_cursor`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` returns the Runes events in one Bitcoin block.\n\t\t */\n\t\tevents(\n\t\t\theightOrHash: number | string,\n\t\t\topts: { chain: \"bitcoin\" },\n\t\t): Promise<StreamsEventsListEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tevents(heightOrHash: number | string): Promise<StreamsEventsListEnvelope>;\n\t};\n\treorgs: {\n\t\t/**\n\t\t * List chain reorgs since a cursor.\n\t\t *\n\t\t * `since` is required. Each reorg gives its `fork_point_height` and the\n\t\t * orphaned range. Page with `next_since`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` lists Bitcoin reorgs, on their own cursor space.\n\t\t */\n\t\tlist(\n\t\t\tparams: StreamsReorgsListParams & { chain: \"bitcoin\" },\n\t\t): Promise<StreamsReorgsListEnvelope>;\n\t\tlist(params: StreamsReorgsListParams): Promise<StreamsReorgsListEnvelope>;\n\t};\n\t/** Bulk parquet dumps. Requires `dumpsBaseUrl` on the client. */\n\tdumps: StreamsDumps;\n\t/**\n\t * Get the canonical block at a height.\n\t *\n\t * Returns the block hash and, on Stacks, the burn block it anchors to.\n\t *\n\t * `chain: \"bitcoin\"` returns the Bitcoin block, without burn-chain fields.\n\t */\n\tcanonical(\n\t\theight: number,\n\t\topts: { chain: \"bitcoin\" },\n\t): Promise<StreamsBitcoinCanonicalBlock>;\n\tcanonical(height: number): Promise<StreamsCanonicalBlock>;\n\t/**\n\t * Get the current chain tip.\n\t *\n\t * Returns the tip height and hash, `finalized_height`, and `lag_seconds`. On\n\t * Stacks it also reports the oldest height your tier can seek; older reads\n\t * come from the bulk dumps.\n\t *\n\t * `chain: \"bitcoin\"` returns the Bitcoin tip, without burn-chain or retention\n\t * fields.\n\t */\n\ttip(opts: { chain: \"bitcoin\" }): Promise<StreamsBitcoinTip>;\n\ttip(): Promise<StreamsTip>;\n};\n"
15
+ "// Canonical event primitives (StreamsEvent, payload types, event-type vocab)\n// live in @secondlayer/shared/streams-rows; re-exported here so the public\n// Streams surface is unchanged.\nimport type { VmEventType } from \"@secondlayer/shared\";\nimport {\n\tRUNE_EVENT_TYPES,\n\ttype RuneEventType,\n\ttype RuneStreamsEvent,\n\tSTREAMS_EVENT_TYPES,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype StreamsWireEvent,\n\ttype VmStreamsEvent,\n} from \"@secondlayer/shared/streams-rows\";\nimport type { IndexEvent } from \"../index-api/client.ts\";\nimport type { ConsumerSink, WithSinkTx } from \"../sinks/types.ts\";\n\nexport {\n\tRUNE_EVENT_TYPES,\n\tSTREAMS_EVENT_TYPES,\n\ttype RuneEventType,\n\ttype RuneStreamsEvent,\n\ttype StreamsEvent,\n\ttype StreamsEventType,\n\ttype VmStreamsEvent,\n};\nexport type {\n\tFtBurnPayload,\n\tFtMintPayload,\n\tFtTransferPayload,\n\tMapDeletePayload,\n\tMapWritePayload,\n\tNestedContractCallPayload,\n\tVarSetPayload,\n\tStreamsWireEvent,\n\tNftBurnPayload,\n\tNftMintPayload,\n\tNftTransferPayload,\n\tPrintPayload,\n\tRuneEtchEntry,\n\tRuneEventPayload,\n\tStreamsClarityValue,\n\tStreamsEventBase,\n\tStreamsEventPayload,\n\tStxBurnPayload,\n\tStxLockPayload,\n\tStxMintPayload,\n\tStxTransferPayload,\n} from \"@secondlayer/shared/streams-rows\";\n\n/** The chain tip: latest block, Bitcoin anchor, and finality boundary. */\nexport type StreamsTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\t/**\n\t * Highest Stacks block past the burn-confirmation finality boundary.\n\t * Optional for back-compat; the API always sets it.\n\t */\n\tfinalized_height?: number;\n\tlag_seconds: number;\n\t/**\n\t * Oldest height still seekable on the live API for the caller's tier\n\t * (`tip - retention`). `null` = unlimited retention. Older reads must use the\n\t * cold dumps lane. Optional for back-compat.\n\t */\n\toldest_seekable_height?: number | null;\n\t/** Oldest seekable cursor (`<oldest_seekable_height>:0`); `null` = unlimited. */\n\toldest_cursor?: string | null;\n};\n\n/**\n * The Bitcoin tip, without burn-chain or retention fields.\n *\n * Bitcoin has no burn chain of its own, and Runes reads have no retention\n * ladder. Returned by `tip({ chain: \"bitcoin\" })`.\n */\nexport type StreamsBitcoinTip = {\n\tblock_height: number;\n\tblock_hash: string;\n\tfinalized_height: number;\n\tlag_seconds: number;\n};\n\n/** A canonical Stacks block with its Bitcoin anchor. */\nexport type StreamsCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tburn_block_height: number;\n\tburn_block_hash: string | null;\n\tis_canonical: true;\n};\n\n/** A Bitcoin canonical block, without burn-chain fields. */\nexport type StreamsBitcoinCanonicalBlock = {\n\tblock_height: number;\n\tblock_hash: string;\n\tis_canonical: true;\n};\n\nexport type StreamsReorg = {\n\tdetected_at: string;\n\tfork_point_height: number;\n\torphaned_range: { from: string; to: string };\n\t/**\n\t * First position of the new canonical chain at the fork, `fork:0`\n\t * (INCLUSIVE). Not an exclusive resume token — resuming directly from it\n\t * skips `fork:0`. The consumer rewinds to the foot of `fork_point_height`\n\t * (`Cursor.atHeight`) to re-read the new run from `fork:0` inclusive.\n\t */\n\tnew_canonical_tip: string;\n};\n\n/** One page of events with the next cursor, tip, and reorgs. */\nexport type StreamsEventsEnvelope<TEvent = StreamsEvent, TTip = StreamsTip> = {\n\tevents: TEvent[];\n\tnext_cursor: string | null;\n\ttip: TTip;\n\treorgs: StreamsReorg[];\n};\n\n/** One page of events with the tip and reorgs, no cursor. */\nexport type StreamsEventsListEnvelope<\n\tTEvent = StreamsEvent,\n\tTTip = StreamsTip,\n> = Omit<StreamsEventsEnvelope<TEvent, TTip>, \"next_cursor\">;\n\n/**\n * The event union narrowed to a `types` selection.\n *\n * A const-generic `types: [\"ft_transfer\"]` narrows the event type.\n */\nexport type StreamsEventOfTypes<T extends readonly StreamsEventType[]> =\n\tExtract<StreamsEvent, { event_type: T[number] }>;\n\n/** A starting point and limit for listing reorgs. */\nexport type StreamsReorgsListParams = {\n\tsince: string;\n\tlimit?: number;\n};\n\n/** A list of reorgs and the cursor to resume from. */\nexport type StreamsReorgsListEnvelope = {\n\treorgs: StreamsReorg[];\n\tnext_since: string | null;\n};\n\n/** A single value or a list of values to match. */\nexport type StreamsFilterValue = string | readonly string[];\n\n/**\n * One labelled filter group. Fields inside a group AND together; groups in a\n * map OR together server-side.\n */\nexport type StreamsLabelledFilter = {\n\ttypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n};\n\n/** A map of label → filter group. Labels are yours; the server echoes them. */\nexport type StreamsFilterMap = Record<string, StreamsLabelledFilter>;\n\n/**\n * The events one label can yield. A group that declares `types` narrows to\n * exactly those variants, so a per-label handler needs no `event_type` guard;\n * a group without `types` keeps the full union.\n */\nexport type StreamsEventForFilter<F, D extends boolean = false> = F extends {\n\ttypes: readonly (infer T extends StreamsEventType)[];\n}\n\t? D extends true\n\t\t? Extract<IndexEvent, { event_type: T }>\n\t\t: Extract<StreamsEvent, { event_type: T }>\n\t: D extends true\n\t\t? IndexEvent\n\t\t: StreamsEvent;\n\n/** Cursor, height range, and limit shared by every list call. */\ntype StreamsEventsListParamsCommon = {\n\tcursor?: string | null;\n\tfromHeight?: number;\n\ttoHeight?: number;\n\tlimit?: number;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely) — unchanged since before Runes events\n * were added. */\nexport type StreamsEventsStacksListParams = StreamsEventsListParamsCommon & {\n\tchain?: \"stacks\";\n\t/** `vm` reads ordinal. Omit for Streams 1.0. */\n\tclock?: \"classic\" | \"vm\";\n\ttypes?: readonly (StreamsEventType | VmEventType)[];\n\t/** Event types to exclude (applied after `types`). */\n\tnotTypes?: readonly (StreamsEventType | VmEventType)[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in one scan and each\n\t * returned event carries the labels it matched (`event.matched`) — two\n\t * unrelated concerns share one page, one cursor, one checkpoint.\n\t */\n\tfilters?: StreamsFilterMap;\n};\n\n/**\n * List options for Runes events, with their own cursor space.\n *\n * `types` is restricted to `RuneEventType` at the type level, so e.g. `{ chain:\n * \"bitcoin\", types: [\"ft_transfer\"] }` is a compile error rather than a silent\n * 400 at request time. `contractId`, `sender`, `recipient`, `assetIdentifier`,\n * `filters`, and `clock` don't exist on this branch; they're Stacks-only (the\n * server 400s on them too).\n */\nexport type StreamsEventsBitcoinListParams = StreamsEventsListParamsCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\n/** Chain, cursor, height range, and filters for listing Streams events. */\nexport type StreamsEventsListParams =\n\t| StreamsEventsStacksListParams\n\t| StreamsEventsBitcoinListParams;\n\n/** Cursor, batching, and stop options shared by every event stream. */\ntype StreamsEventsStreamCommon = {\n\tfromCursor?: string | null;\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n};\n\n/**\n * Stream options for Stacks events, the default chain.\n *\n * `chain: \"stacks\"` is the default, so omit `chain` entirely. Matches\n * `StreamsEventsStacksListParams`.\n */\nexport type StreamsEventsStreamStacksParams = StreamsEventsStreamCommon & {\n\tchain?: \"stacks\";\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\tfilters?: StreamsFilterMap;\n};\n\n/**\n * Stream options for Runes events, tailed like the Stacks default.\n *\n * `types` is restricted to `RuneEventType` at the type level, matching\n * `StreamsEventsBitcoinListParams`. `contractId`, `sender`, `recipient`,\n * `assetIdentifier`, and `filters` don't exist on this branch; they're\n * Stacks-only.\n */\nexport type StreamsEventsStreamBitcoinParams = StreamsEventsStreamCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\nexport type StreamsEventsStreamParams =\n\t| StreamsEventsStreamStacksParams\n\t| StreamsEventsStreamBitcoinParams;\n\ntype StreamsEventsSubscribeCommon = {\n\t/** Resume strictly after this cursor; omit to live-tail from the tip. */\n\tfromCursor?: string | null;\n\t/** Abort to unsubscribe (the returned function does the same). */\n\tsignal?: AbortSignal;\n\t/**\n\t * Called on every failure. Transport errors (dropped socket, 5xx, 429, a\n\t * stale connection, a throwing handler) reconnect from the last handled\n\t * cursor with exponential backoff. Errors that a retry cannot fix (401,\n\t * 4xx, a bad signature) end the subscription and reject its `done`.\n\t */\n\tonError?: (err: unknown) => void;\n\t/**\n\t * First reconnect pause in ms (default 1000). Doubles per consecutive\n\t * failure up to 30 s with jitter, resets once a frame arrives, and never\n\t * undercuts a `Retry-After`.\n\t */\n\treconnectDelayMs?: number;\n\t/**\n\t * Reconnect when no frame (pings included) arrives for this long (default\n\t * 60000, three server heartbeats). Catches a half-open socket that never\n\t * errors; set it above your instance's heartbeat interval.\n\t */\n\tstaleAfterMs?: number;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely). */\nexport type StreamsEventsSubscribeStacksParams =\n\tStreamsEventsSubscribeCommon & {\n\t\tchain?: \"stacks\";\n\t\ttypes?: readonly StreamsEventType[];\n\t\tnotTypes?: readonly StreamsEventType[];\n\t\tcontractId?: StreamsFilterValue;\n\t\tsender?: StreamsFilterValue;\n\t\trecipient?: StreamsFilterValue;\n\t\tassetIdentifier?: string;\n\t\t/** Labelled filter groups; see {@link StreamsEventsListParams.filters}. */\n\t\tfilters?: StreamsFilterMap;\n\t\t/**\n\t\t * Called for each pushed event, in order. The resume cursor advances only\n\t\t * after this resolves, so a handler that throws sees the same event again\n\t\t * on reconnect (at-least-once). Key durable writes by `cursor`.\n\t\t */\n\t\tonEvent: (event: StreamsEvent) => void | Promise<void>;\n\t};\n\n/**\n * Options for pushing Runes events live, on their own cursor space.\n *\n * `contractId`, `sender`, `recipient`, `assetIdentifier`, and `filters` don't\n * exist on this branch; they're Stacks-only.\n */\nexport type StreamsEventsSubscribeBitcoinParams =\n\tStreamsEventsSubscribeCommon & {\n\t\tchain: \"bitcoin\";\n\t\ttypes?: readonly RuneEventType[];\n\t\tnotTypes?: readonly RuneEventType[];\n\t\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\t\trune?: string;\n\t\t/** A mainnet address. */\n\t\taddress?: string;\n\t\tonEvent: (event: RuneStreamsEvent) => void | Promise<void>;\n\t};\n\nexport type StreamsEventsSubscribeParams =\n\t| StreamsEventsSubscribeStacksParams\n\t| StreamsEventsSubscribeBitcoinParams;\n\n/**\n * Handle for a live subscription: call it to unsubscribe. `done` resolves\n * after unsubscribe (or the signal aborting) and rejects with the error that\n * ended the loop when a retry could not fix it, so a worker can `await`\n * it instead of polling for silence.\n */\nexport type StreamsSubscription = {\n\t(): void;\n\tdone: Promise<void>;\n};\n\n/**\n * The checkpoint the SDK computes for a batch. Persist `cursor` inside the same\n * transaction as your projection writes, then resume from it via `fromCursor`.\n * It is the position to advance to: `next_cursor` normally, or the last\n * finalized event when `finalizedOnly` is set.\n */\n/**\n * What the loop knows at the end of a page, handed to `onBatch`.\n *\n * `cursor` is the position to commit. The rest answers \"how far along am I,\n * and am I still moving\" — the question every deployed consumer has to expose\n * for a health check.\n *\n * Progress is reported here rather than left to callers because only the loop\n * can get it right: `height` has to survive empty pages (normal at the tip)\n * and has to roll back to `fork_point_height - 1` after a reorg rewind.\n * Deriving it from `cursor` is wrong — `Cursor.atHeight` encodes the foot of a\n * block as `${height - 1}:<sentinel>`, so a rewound cursor parses to a\n * position that was never reached.\n */\nexport type ConsumerBatchContext<TTip = unknown, TReorg = unknown> = {\n\t/** Checkpoint to commit alongside your rows. */\n\tcursor: string | null;\n\t/** Highest canonical block a row was DELIVERED from. `null` before the\n\t * first row of a fresh consume. With a sparse filter this parks at the\n\t * last matching event — it measures event recency, not progress. */\n\theight: number | null;\n\t/** Highest canonical block the sweep has VERIFIED through: an empty page\n\t * is the server confirming nothing matches between the cursor and the\n\t * tip, so a caught-up tail scans to the tip even when `height` is far\n\t * below it. Rolls back with reorg rewinds. */\n\tscannedHeight: number | null;\n\t/** Chain tip as of this page's read. */\n\ttipHeight: number;\n\t/** `tipHeight - scannedHeight`, floored at 0 — the consumer's actual\n\t * backlog. `null` until a position is known. A caught-up consumer on a\n\t * quiet contract reads ~0 here while `tipHeight - height` grows — that\n\t * difference is event age, not lag. */\n\tblocksBehind: number | null;\n\t/**\n\t * The full tip for this page — `StreamsTip` or `IndexTip` depending on the\n\t * surface. Exposed here so a handler never needs the `envelope` parameter,\n\t * which is the only way to reach it today and is also how the worst\n\t * `finalizedOnly` mistake becomes reachable (`return envelope.next_cursor`\n\t * jumps the cursor past events that were filtered out and never delivered).\n\t */\n\ttip: TTip;\n\t/**\n\t * Reorgs reported alongside this page; empty when none. Rollback still\n\t * belongs in `onReorg` — this is for observability inside a batch.\n\t */\n\treorgs: readonly TReorg[];\n};\n\n/** @deprecated Use {@link ConsumerBatchContext} — the Index and Streams loops\n * share one shape now. Kept as an alias so existing annotations compile. */\nexport type StreamsBatchContext = ConsumerBatchContext;\n\n/**\n * The checkpoint for a reorg rollback. Persist `cursor` (the rewind position)\n * inside the same transaction as your rollback so the two commit atomically.\n */\n/** `cursor` is the rewind position the loop resumes from after `onReorg`:\n * the foot of the fork point, or `null` for a fork at genesis. Persist it\n * in the same transaction as the rollback. */\nexport type StreamsReorgContext = { cursor: string | null };\n\n/** Options for consuming Streams events: cursor, batching, filters, handler. */\nexport type StreamsEventsConsumeParams<\n\tTTx = never,\n\tD extends boolean = false,\n\tF extends StreamsFilterMap = Record<never, never>,\n> = {\n\t/** `chain: \"stacks\"` (default, omit `chain` entirely) — the bitcoin branch\n\t * is {@link StreamsEventsConsumeBitcoinParams}, a separate overload with\n\t * no `filters`/`on`/`decoded` (Stacks-only concepts). */\n\tchain?: \"stacks\";\n\tfromCursor?: string | null;\n\t/**\n\t * Deliver events pre-decoded as the flat, `event_type`-discriminated rows\n\t * Index serves (`IndexEvent`), so Streams consumption reads identically\n\t * to Index consumption — no guard+decode pairs in your handler.\n\t */\n\tdecoded?: D;\n\t/**\n\t * Destination adapter that owns the checkpoint + rollback transaction\n\t * (e.g. `kyselySink` from `@secondlayer/sdk/sinks/kysely`). With a sink:\n\t * the loop resumes from the sink's committed cursor, `onBatch` receives\n\t * `ctx.tx` and must write ONLY through it (rows and cursor commit in one\n\t * transaction), reorg rollback is automatic, and `onBatch`'s return value\n\t * is ignored. Folds (balances) invert in the sink's `onRollback`, not in\n\t * `onReorg`.\n\t */\n\tsink?: ConsumerSink<TTx>;\n\t/** Fires once per page, before `onBatch` and before any early return. */\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\t/**\n\t * Emit only finalized (immutable) events and never surface reorgs. The SDK\n\t * checkpoints at the last finalized event and re-reads the unfinalized tail\n\t * until it settles. Trades finality lag for zero reorg handling; `onReorg` is\n\t * ignored.\n\t */\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/**\n\t * Labelled filter groups. The groups OR together in ONE server-side scan,\n\t * so two unrelated concerns share one page, one cursor, and one checkpoint\n\t * instead of two consume loops. Pair with `on` to handle each label.\n\t */\n\tfilters?: F;\n\t/**\n\t * One handler per label in `filters`. Every label must be handled, so\n\t * adding a label is a compile error until its handler exists.\n\t *\n\t * A label's declared `types` narrows its handler's events, so `payload` is\n\t * typed without an `event_type` guard. Labels are dispatched in declaration\n\t * order: a label's own events stay in cursor order, but events of different\n\t * labels do not interleave within a page — add `onBatch` when you need\n\t * strict global order across labels.\n\t */\n\ton?: {\n\t\t[K in keyof F]: (\n\t\t\tevents: StreamsEventForFilter<F[K], D>[],\n\t\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t\t) => void | Promise<void>;\n\t};\n\tbatchSize?: number;\n\t/**\n\t * Apply a page of canonical events. Persist `ctx.cursor` in the same\n\t * transaction as your writes. Returning a cursor overrides `ctx.cursor` as\n\t * the resume point (advanced manual control); returning nothing uses it.\n\t *\n\t * Optional only when `on` handles the page instead; a consume call with\n\t * neither throws.\n\t */\n\tonBatch?: (\n\t\tevents: D extends true ? IndexEvent[] : StreamsEvent[],\n\t\t/**\n\t\t * @deprecated Read `ctx.tip` / `ctx.reorgs` instead. The envelope is\n\t\t * also how the worst `finalizedOnly` mistake stays reachable —\n\t\t * returning `envelope.next_cursor` jumps the cursor past unfinalized\n\t\t * events that were filtered out and never delivered. Removed in the\n\t\t * next major.\n\t\t */\n\t\tenvelope: StreamsEventsEnvelope,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\t/**\n\t * Roll your projection back to `reorg.fork_point_height`, persisting\n\t * `ctx.cursor` in the same transaction. Called once per *new* reorg at or\n\t * below the checkpoint (deduped in-memory, fork-ascending) before the SDK\n\t * rewinds and re-reads the now-canonical events. A reorg whose fork sits\n\t * above the checkpoint is not a rollback (nothing past it was written) and\n\t * is skipped. Omit it to ignore reorgs (events stay canonical, but stale\n\t * rows from an orphaned fork are left in place).\n\t *\n\t * With `onReorg` or a `sink` attached, every empty page also polls\n\t * `reorgs.list` (one extra request per idle poll) so a fork that lands\n\t * while the consumer idles at the tip is rolled back too.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\t/** Deepest rewind one reorg may make below the checkpoint before the loop\n\t * refuses with `ValidationError`. Default 1000 blocks. The fork point is\n\t * server supplied and drives a delete on every declared table, so raise\n\t * this only for a source you trust. */\n\tmaxRollbackDepth?: number;\n\t/** Page-fetch retries after the first failure (429/5xx/network only —\n\t * 4xx and handler throws always propagate). Default 3; `0` disables. */\n\tretryCount?: number;\n\t/** Base retry delay in ms; the n-th retry waits `retryDelay * n`. A server\n\t * `Retry-After` overrides it. Default 1000. */\n\tretryDelay?: number;\n\t/** Void observer, called before each retry sleep (metrics/logging). */\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/**\n\t * Cuts the empty-poll backoff short: on an empty page, the loop races\n\t * `emptyBackoffMs` against this promise instead of sleeping the full\n\t * amount. Pass a function that resolves once when new data MIGHT be\n\t * available (e.g. a Postgres NOTIFY listener) — it is called fresh on\n\t * every empty page, never awaited more than once concurrently per page.\n\t * The backoff timer still runs underneath, so a wake source that never\n\t * resolves (or a `wake` this call omits) degrades to the same polling\n\t * behavior as before.\n\t */\n\twake?: () => Promise<void>;\n};\n\n/**\n * Options for the checkpointed sweep over Runes events.\n *\n * A separate, simpler type from `StreamsEventsConsumeParams` rather than a\n * widened union member: `filters`, `on`, and `decoded` are Stacks-only concepts\n * (labelled OR-groups and Index-shaped projection have no Runes equivalent\n * yet), so `onBatch` is the only way in and is required. Reorg rewind still\n * works the same way (bitcoin reorgs carry the same `fork_point_height` and\n * `new_canonical_tip` shape as Stacks ones).\n */\nexport type StreamsEventsConsumeBitcoinParams<TTx = never> = {\n\tchain: \"bitcoin\";\n\tfromCursor?: string | null;\n\tsink?: ConsumerSink<TTx>;\n\tonProgress?: (ctx: ConsumerBatchContext) => void;\n\tmode?: \"tail\" | \"bounded\";\n\tfinalizedOnly?: boolean;\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n\tbatchSize?: number;\n\tonBatch: (\n\t\tevents: RuneStreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope<RuneStreamsEvent, StreamsBitcoinTip>,\n\t\tctx: StreamsBatchContext & WithSinkTx<TTx>,\n\t) =>\n\t\t| void\n\t\t| string\n\t\t| null\n\t\t| undefined\n\t\t| Promise<void>\n\t\t| Promise<string | null | undefined>;\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmaxRollbackDepth?: number;\n\tretryCount?: number;\n\tretryDelay?: number;\n\tonError?: (\n\t\terr: unknown,\n\t\tctx: { attempt: number; retriesLeft: number; delayMs: number },\n\t) => void;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\twake?: () => Promise<void>;\n};\n\n/**\n * One page yielded by `consume`, with `cursor` to persist and resume.\n *\n * It is the `GET /v1/streams/events` envelope verbatim, with `next_cursor`\n * renamed to `cursor`.\n */\nexport type StreamsBatch<TEvent = StreamsEvent, TTip = StreamsTip> = {\n\t/** Canonical events of this page, in cursor order. */\n\tevents: TEvent[];\n\t/** Checkpoint after this page — pass back as `consume({ cursor })` to resume. */\n\tcursor: string | null;\n\ttip: TTip;\n\t/** Chain reorgs reported alongside this page; empty when none. */\n\treorgs: StreamsReorg[];\n};\n\n/** Cursor, batch size, and polling options shared by every consume loop. */\ntype StreamsConsumeCommon = {\n\t/** Resume strictly after this cursor; omit to start from the oldest seekable page. */\n\tcursor?: string | null;\n\t/** Events per page (the `limit` query param). Default 100. */\n\tbatchSize?: number;\n\t/** Poll interval while caught up at the tip, in ms. Default 2000. */\n\tintervalMs?: number;\n\t/** Abort to end the iteration. */\n\tsignal?: AbortSignal;\n};\n\n/** `chain: \"stacks\"` (default, omit `chain` entirely). */\nexport type StreamsConsumeStacksParams = StreamsConsumeCommon & {\n\tchain?: \"stacks\";\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\tcontractId?: StreamsFilterValue;\n\tsender?: StreamsFilterValue;\n\trecipient?: StreamsFilterValue;\n\tassetIdentifier?: string;\n\t/** Labelled OR-groups — same semantics as `events.consume`; each returned\n\t * event echoes the labels it matched. */\n\tfilters?: StreamsFilterMap;\n};\n\n/**\n * Consume options for Runes batches, with their own cursor space.\n *\n * `contractId`, `sender`, `recipient`, `assetIdentifier`, and `filters` don't\n * exist on this branch; they're Stacks-only.\n */\nexport type StreamsConsumeBitcoinParams = StreamsConsumeCommon & {\n\tchain: \"bitcoin\";\n\ttypes?: readonly RuneEventType[];\n\tnotTypes?: readonly RuneEventType[];\n\t/** A RuneRef: an id (`840000:3`) or a name (`DOG•GO•TO•THE•MOON`). */\n\trune?: string;\n\t/** A mainnet address. */\n\taddress?: string;\n};\n\nexport type StreamsConsumeParams =\n\t| StreamsConsumeStacksParams\n\t| StreamsConsumeBitcoinParams;\n\n/** Where a consume loop stopped: cursor, pages read, empty polls. */\nexport type StreamsEventsConsumeResult = {\n\tcursor: string | null;\n\tpages: number;\n\temptyPolls: number;\n};\n\n/** Options for replaying history from dump files, then tailing live. */\nexport type StreamsEventsReplayParams = {\n\t/** Start point: `\"genesis\"` (default) or a `<block>:<index>` cursor. */\n\tfrom?: \"genesis\" | string;\n\t/**\n\t * Called once per finalized dump file, in block order, before live tailing.\n\t * Process the parquet with your own tooling (e.g. DuckDB) — the SDK does not\n\t * decode parquet. Use `client.dumps.download(file)` to fetch + verify bytes.\n\t *\n\t * Delivery is file-granular and at-least-once: a file whose range straddles\n\t * `from` is handed over whole. `ctx.from` is that cursor (`null` from\n\t * genesis); skip rows at or below it, or key rows by `cursor` so a re-run\n\t * is an idempotent no-op. Files ending at or below `from` are not handed\n\t * over at all.\n\t */\n\tonDumpFile: (\n\t\tfile: StreamsDumpFile,\n\t\tctx: { from: string | null },\n\t) => Promise<void> | void;\n\t/** Called per live page after the dump phase, like `consume`. */\n\tonBatch: (\n\t\tevents: StreamsEvent[],\n\t\tenvelope: StreamsEventsEnvelope,\n\t) => Promise<string | null | undefined> | string | null | undefined;\n\t/**\n\t * Called when the live-tail phase (after the dump backfill) crosses a reorg,\n\t * before the cursor rewinds and re-reads the now-canonical events — same\n\t * contract as `consume`. The dump-backfill phase is finalized and never\n\t * reorgs; omit this to leave stale rows from an orphaned fork in place.\n\t */\n\tonReorg?: (\n\t\treorg: StreamsReorg,\n\t\tctx: StreamsReorgContext,\n\t) => Promise<void> | void;\n\tmode?: \"tail\" | \"bounded\";\n\tbatchSize?: number;\n\temptyBackoffMs?: number;\n\tmaxPages?: number;\n\tmaxEmptyPolls?: number;\n\tsignal?: AbortSignal;\n\t/** Narrow the LIVE TAIL after the dump phase. The dump files themselves are\n\t * always all-type (block-partitioned parquet) — filter those in your own\n\t * tooling while processing each file. */\n\ttypes?: readonly StreamsEventType[];\n\tnotTypes?: readonly StreamsEventType[];\n\t/** Labelled OR-groups for the live tail, like `consume`. */\n\tfilters?: StreamsFilterMap;\n};\n\nexport type FetchLike = (\n\tinput: string | URL | Request,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/** One bulk parquet file in the dumps manifest. `path` is the object key under\n * the dumps base URL. */\nexport type StreamsDumpFile = {\n\tpath: string;\n\tfrom_block: number;\n\tto_block: number;\n\tmin_cursor: string | null;\n\tmax_cursor: string | null;\n\trow_count: number;\n\tbyte_size: number;\n\tsha256: string;\n\tschema_version: number;\n\tcreated_at: string;\n};\n\n/** The index of finalized Parquet dump files for one dataset. */\nexport type StreamsDumpsManifest = {\n\tdataset: string;\n\tnetwork: string;\n\tversion: string;\n\tschema_version: number;\n\tgenerated_at: string;\n\tproducer_version: string;\n\tfinality_lag_blocks: number;\n\t/** Cursor at the end of the finalized bulk coverage — hand to live tailing. */\n\tlatest_finalized_cursor: string | null;\n\tcoverage: { from_block: number; to_block: number };\n\tfiles: StreamsDumpFile[];\n\t/** ed25519 signature over the manifest's canonical bytes. Absent on legacy\n\t * unsigned manifests. Verified by `list()` when `verifyDumpsManifest` is on. */\n\tsignature?: string;\n\t/** Short id of the signing public key. */\n\tkey_id?: string;\n};\n\nexport type StreamsDumps = {\n\t/** Fetch and parse the latest dumps manifest. */\n\tlist(): Promise<StreamsDumpsManifest>;\n\t/** Absolute URL for a manifest file. */\n\tfileUrl(file: StreamsDumpFile): string;\n\t/** Download a parquet file and verify its sha256 against the manifest. */\n\tdownload(file: StreamsDumpFile): Promise<Uint8Array>;\n};\n\nexport type StreamsClient = {\n\t/**\n\t * Read Streams page by page as an async iterator.\n\t *\n\t * Yields one {@link StreamsBatch} per events page, so each yield is exactly\n\t * one API call. Empty pages are skipped; at the tip the iterator polls again\n\t * every `intervalMs` (default 2000) until `signal` aborts.\n\t *\n\t * Reorgs appear on `batch.reorgs`, but the cursor is not rewound for you.\n\t * Use `events.consume` with `onReorg` when you need rollback.\n\t *\n\t * A literal `types` array narrows every batch's event union to those types.\n\t * `chain: \"bitcoin\"` batches carry Runes rows only, on the bitcoin tip shape.\n\t */\n\tconsume(\n\t\tparams: StreamsConsumeBitcoinParams,\n\t): AsyncIterableIterator<StreamsBatch<RuneStreamsEvent, StreamsBitcoinTip>>;\n\tconsume<const T extends readonly StreamsEventType[]>(\n\t\tparams: StreamsConsumeStacksParams & { types: T },\n\t): AsyncIterableIterator<StreamsBatch<StreamsEventOfTypes<T>>>;\n\tconsume(params?: StreamsConsumeParams): AsyncIterableIterator<StreamsBatch>;\n\tevents: {\n\t\t/**\n\t\t * Read one page of chain events and the next cursor.\n\t\t *\n\t\t * Narrow with `types`, `notTypes`, `contractId`, `sender`, `recipient`,\n\t\t * `assetIdentifier`, `fromHeight`/`toHeight`, or labelled `filters`.\n\t\t * Filters match exactly, and an event type without a given field never\n\t\t * matches it. Pass `next_cursor` back as `cursor` to continue. The\n\t\t * envelope also carries the `tip` and any `reorgs`. To write the events\n\t\t * somewhere with a checkpoint, use `events.consume` instead.\n\t\t *\n\t\t * A literal `types` array narrows every row to those event types.\n\t\t * `clock: \"vm\"` pages carry vm rows only (a parallel vocabulary,\n\t\t * `event_index` = `ordinal`), never `StreamsEvent`; it is Stacks only.\n\t\t * `chain: \"bitcoin\"` pages carry Runes rows only, on the bitcoin tip shape,\n\t\t * and filter by `rune` or `address`.\n\t\t */\n\t\tlist(\n\t\t\tparams: StreamsEventsStacksListParams & { clock: \"vm\" },\n\t\t): Promise<StreamsEventsEnvelope<VmStreamsEvent>>;\n\t\tlist<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: Omit<\n\t\t\t\tStreamsEventsStacksListParams,\n\t\t\t\t\"clock\" | \"types\" | \"notTypes\"\n\t\t\t> & {\n\t\t\t\ttypes: T;\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope<StreamsEventOfTypes<T>>>;\n\t\tlist(\n\t\t\tparams?: Omit<\n\t\t\t\tStreamsEventsStacksListParams,\n\t\t\t\t\"clock\" | \"types\" | \"notTypes\"\n\t\t\t> & {\n\t\t\t\ttypes?: readonly StreamsEventType[];\n\t\t\t\tnotTypes?: readonly StreamsEventType[];\n\t\t\t\tclock?: \"classic\";\n\t\t\t},\n\t\t): Promise<StreamsEventsEnvelope>;\n\t\tlist(\n\t\t\tparams: StreamsEventsBitcoinListParams,\n\t\t): Promise<StreamsEventsEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tlist(\n\t\t\tparams: StreamsEventsListParams,\n\t\t): Promise<StreamsEventsEnvelope<StreamsWireEvent>>;\n\t\t/**\n\t\t * Read every event a transaction emitted.\n\t\t *\n\t\t * Returns the events and the `tip`, with no `next_cursor`: one transaction\n\t\t * is one response.\n\t\t *\n\t\t * `chain: \"bitcoin\"` returns the Runes events for one Bitcoin transaction.\n\t\t */\n\t\tbyTxId(\n\t\t\ttxId: string,\n\t\t\topts: { chain: \"bitcoin\" },\n\t\t): Promise<StreamsEventsListEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tbyTxId(txId: string): Promise<StreamsEventsListEnvelope>;\n\t\t/**\n\t\t * Run a checkpointed indexer that rewinds on reorgs.\n\t\t *\n\t\t * Write your rows in `onBatch` and commit `ctx.cursor` in the same\n\t\t * transaction; resume with `fromCursor`. Reorgs at or below your checkpoint\n\t\t * call `onReorg`, then the loop re-reads from the fork point. Delivery is\n\t\t * at-least-once, so keep writes idempotent. With a `sink`, the checkpoint\n\t\t * and rollback are handled for you. `mode: \"tail\"` (default) keeps polling\n\t\t * at the tip; `mode: \"bounded\"` returns on the first empty page. It also\n\t\t * stops on `maxPages`, `maxEmptyPolls`, or `signal`. Pass `finalizedOnly`\n\t\t * to skip reorg handling entirely.\n\t\t *\n\t\t * `chain: \"bitcoin\"` sweeps Runes events; see\n\t\t * {@link StreamsEventsConsumeBitcoinParams}.\n\t\t */\n\t\tconsume<TTx = never>(\n\t\t\tparams: StreamsEventsConsumeBitcoinParams<TTx> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\tconsume<\n\t\t\tconst F extends StreamsFilterMap = Record<never, never>,\n\t\t\tTTx = never,\n\t\t\tD extends boolean = false,\n\t\t>(\n\t\t\t// The redundant `sink` member gives TS a DIRECT inference site for\n\t\t\t// TTx — inference does not reliably traverse the params alias.\n\t\t\tparams: StreamsEventsConsumeParams<TTx, D, F> & {\n\t\t\t\tsink?: ConsumerSink<TTx>;\n\t\t\t},\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Backfill from bulk dumps, then continue live in one call.\n\t\t *\n\t\t * Hands each finalized dump file to `onDumpFile` in block order, then tails\n\t\t * live from the manifest's `latest_finalized_cursor`, with no gap or\n\t\t * duplicate at the seam. A file that straddles `from` is delivered whole,\n\t\t * so skip the rows at or below it. Requires `dumpsBaseUrl`.\n\t\t */\n\t\treplay(\n\t\t\tparams: StreamsEventsReplayParams,\n\t\t): Promise<StreamsEventsConsumeResult>;\n\t\t/**\n\t\t * Read events one at a time as an async iterator.\n\t\t *\n\t\t * For live processors and watch-style apps that keep their own state. It\n\t\t * tails indefinitely and stops when `signal`, `maxPages`, or\n\t\t * `maxEmptyPolls` ends it. There is no checkpoint or reorg handling; use\n\t\t * `events.consume` for that.\n\t\t *\n\t\t * A literal `types` array narrows every event to those types.\n\t\t * `chain: \"bitcoin\"` yields Runes events only.\n\t\t */\n\t\tstream(\n\t\t\tparams: StreamsEventsStreamBitcoinParams,\n\t\t): AsyncIterable<RuneStreamsEvent>;\n\t\tstream<const T extends readonly StreamsEventType[]>(\n\t\t\tparams: StreamsEventsStreamStacksParams & { types: T },\n\t\t): AsyncIterable<StreamsEventOfTypes<T>>;\n\t\tstream(params?: StreamsEventsStreamParams): AsyncIterable<StreamsEvent>;\n\t\t/**\n\t\t * Get each new event pushed to `onEvent` as it lands.\n\t\t *\n\t\t * Reconnects from the last handled cursor after a transport error, and\n\t\t * verifies each frame's ed25519 signature when the client has `verify` on.\n\t\t * Returns an unsubscribe function whose `done` promise settles when the\n\t\t * loop ends. Not reorg-aware: an event delivered and then orphaned is never\n\t\t * retracted. Durable writers use `events.consume`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` delivers Runes rows to `onEvent`.\n\t\t */\n\t\tsubscribe(params: StreamsEventsSubscribeBitcoinParams): StreamsSubscription;\n\t\tsubscribe(params: StreamsEventsSubscribeStacksParams): StreamsSubscription;\n\t};\n\tblocks: {\n\t\t/**\n\t\t * Read every event in one block, by height or hash.\n\t\t *\n\t\t * Returns the events and the `tip`, with no `next_cursor`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` returns the Runes events in one Bitcoin block.\n\t\t */\n\t\tevents(\n\t\t\theightOrHash: number | string,\n\t\t\topts: { chain: \"bitcoin\" },\n\t\t): Promise<StreamsEventsListEnvelope<RuneStreamsEvent, StreamsBitcoinTip>>;\n\t\tevents(heightOrHash: number | string): Promise<StreamsEventsListEnvelope>;\n\t};\n\treorgs: {\n\t\t/**\n\t\t * List chain reorgs since a cursor.\n\t\t *\n\t\t * `since` is required. Each reorg gives its `fork_point_height` and the\n\t\t * orphaned range. Page with `next_since`.\n\t\t *\n\t\t * `chain: \"bitcoin\"` lists Bitcoin reorgs, on their own cursor space.\n\t\t */\n\t\tlist(\n\t\t\tparams: StreamsReorgsListParams & { chain: \"bitcoin\" },\n\t\t): Promise<StreamsReorgsListEnvelope>;\n\t\tlist(params: StreamsReorgsListParams): Promise<StreamsReorgsListEnvelope>;\n\t};\n\t/** Bulk parquet dumps. Requires `dumpsBaseUrl` on the client. */\n\tdumps: StreamsDumps;\n\t/**\n\t * Get the canonical block at a height.\n\t *\n\t * Returns the block hash and, on Stacks, the burn block it anchors to.\n\t *\n\t * `chain: \"bitcoin\"` returns the Bitcoin block, without burn-chain fields.\n\t */\n\tcanonical(\n\t\theight: number,\n\t\topts: { chain: \"bitcoin\" },\n\t): Promise<StreamsBitcoinCanonicalBlock>;\n\tcanonical(height: number): Promise<StreamsCanonicalBlock>;\n\t/**\n\t * Get the current chain tip.\n\t *\n\t * Returns the tip height and hash, `finalized_height`, and `lag_seconds`. On\n\t * Stacks it also reports the oldest height your tier can seek; older reads\n\t * come from the bulk dumps.\n\t *\n\t * `chain: \"bitcoin\"` returns the Bitcoin tip, without burn-chain or retention\n\t * fields.\n\t */\n\ttip(opts: { chain: \"bitcoin\" }): Promise<StreamsBitcoinTip>;\n\ttip(): Promise<StreamsTip>;\n};\n"
16
16
  ],
17
17
  "mappings": ";AAAA,oBAAS;;;ACAT,IAAM,YAAY;AAAA;AA6BX,MAAM,yBAAyB,MAAM;AAAA,EAClC,OAAO;AAAA,EAEhB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,WAAW,CAAC,cAAsB,UAAmC,CAAC,GAAG;AAAA,IACxE,MAAM,eAAe;AAAA,MACpB,GAAI,QAAQ,gBAAgB,CAAC;AAAA,MAC7B,GAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,IAAI,CAAC;AAAA,MAC3C,GAAI,QAAQ,UAAU,CAAC,SAAS,QAAQ,SAAS,IAAI,CAAC;AAAA,IACvD;AAAA,IACA,MAAM,UAAU;AAAA,MACf;AAAA,MACA,aAAa,SAAS,IAAI;AAAA,EAAK,aAAa,KAAK;AAAA,CAAI,MAAM;AAAA,IAC5D,EAAE,KAAK,EAAE;AAAA,IACT,MAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,SAAS;AAAA,IACnE,KAAK,eAAe;AAAA,IACpB,KAAK,OAAO,QAAQ;AAAA,IACpB,KAAK,UAAU,QAAQ;AAAA,IACvB,KAAK,eAAe,QAAQ;AAAA,IAC5B,KAAK,YAAY,QAAQ,aAAa;AAAA,IACtC,KAAK,oBAAoB,QAAQ;AAAA;AAAA,EAQlC,IAAI,CAAC,IAAyC;AAAA,IAE7C,IAAI,MAAW;AAAA,IACf,IAAI,OAAgB;AAAA,IACpB,OAAO,OAAO,MAAM;AAAA,MACnB,IAAI,KAAK,GAAG;AAAA,QAAG,OAAO;AAAA,MACtB,OAAO;AAAA,MACP,MAAM,IAAI;AAAA,IACX;AAAA,IACA,OAAO,KAAK,OAAO;AAAA;AAAA,EAGpB,MAAM,GASJ;AAAA,IACD,OAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK,iBAAiB,QAAQ,KAAK,MAAM,UAAU;AAAA,MAC1D,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,mBAAmB,KAAK;AAAA,IACzB;AAAA;AAEF;AAGA,SAAS,eAAe,CAAC,QAAyB;AAAA,EACjD,OAAO,WAAW,OAAO,UAAU;AAAA;AAIpC,SAAS,OAAO,CAAC,QAAgB,MAAmC;AAAA,EACnE,IAAI,SAAS,sBAAsB,WAAW;AAAA,IAC7C,OAAO,GAAG;AAAA,EACX,IAAI,WAAW,OAAO,WAAW;AAAA,IAChC,OAAO,GAAG;AAAA,EACX;AAAA;AAAA;AAkBM,MAAM,iBAAiB,iBAAiB;AAAA,EAGtC;AAAA,EAGA;AAAA,EALR,WAAW,CAEH,QACP,SAEO,MAEP,MACA,UAAmC,CAAC,GACnC;AAAA,IACD,MAAM,SAAS;AAAA,MACd;AAAA,MACA,WAAW,QAAQ,aAAa,gBAAgB,MAAM;AAAA,MACtD,SAAS,QAAQ,WAAW,QAAQ,QAAQ,IAAI;AAAA,SAC5C,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,SAC5C,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,SAClD,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,SACjE,QAAQ,sBAAsB,YAC/B,EAAE,mBAAmB,QAAQ,kBAAkB,IAC/C,CAAC;AAAA,IACL,CAAC;AAAA,IAlBM;AAAA,IAGA;AAAA,IAgBP,KAAK,OAAO;AAAA;AAAA,MAKT,SAAS,GAAuB;AAAA,IACnC,MAAM,IAAI,KAAK;AAAA,IACf,OAAO,KACN,OAAO,MAAM,YACb,OAAQ,EAA+B,eAAe,WACnD,EAA6B,aAC9B;AAAA;AAAA,EAGK,MAAM,GAGb;AAAA,IACD,OAAO;AAAA,SACH,MAAM,OAAO;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,IACjB;AAAA;AAEF;AAAA;AAKO,MAAM,kBAAkB,SAAS;AAAA,EACrB,SAAS;AAAA,EAE3B,WAAW,CACV,UAAU,+BACV,MACA,MACC;AAAA,IACD,MAAM,KAAK,SAAS,MAAM,IAAI;AAAA,IAC9B,KAAK,OAAO;AAAA;AAEd;AAAA;AAIO,MAAM,uBAAuB,SAAS;AAAA,EAMlC;AAAA,EALQ,SAAS;AAAA,EAE3B,WAAW,CACV,UAAU,kCAED,YACT,MACA,MACC;AAAA,IACD,MAAM,KAAK,SAAS,MAAM,MAAM;AAAA,MAC/B,WAAW;AAAA,MACX,mBAAmB,gBAAgB,UAAU;AAAA,IAC9C,CAAC;AAAA,IAPQ;AAAA,IAQT,KAAK,OAAO;AAAA;AAEd;AAAA;AAIO,MAAM,wBAAwB,SAAS;AAAA,EAC7C,WAAW,CAAC,SAAiB,QAAgB,MAAgB,MAAe;AAAA,IAC3E,MAAM,QAAQ,SAAS,MAAM,MAAM,EAAE,WAAW,MAAM,CAAC;AAAA,IACvD,KAAK,OAAO;AAAA;AAEd;AAAA;AAGO,MAAM,8BAA8B,iBAAiB;AAAA,EAC3D,WAAW,CAAC,UAAU,qDAAqD;AAAA,IAC1E,MAAM,SAAS,EAAE,MAAM,qBAAqB,WAAW,MAAM,CAAC;AAAA,IAC9D,KAAK,OAAO;AAAA;AAEd;AAAA;AAGO,MAAM,yBAAyB,iBAAiB;AAAA,EACtD,WAAW,CAAC,UAAU,8CAA8C;AAAA,IACnE,MAAM,SAAS,EAAE,MAAM,gBAAgB,WAAW,MAAM,CAAC;AAAA,IACzD,KAAK,OAAO;AAAA;AAEd;AAAA;AAGO,MAAM,wCAAwC,iBAAiB;AAAA,EACrE;AAAA,EACA,WAAW,CACV,UAAU,iCACV,oBACC;AAAA,IACD,MAAM,SAAS;AAAA,MACd,MAAM;AAAA,MACN,WAAW;AAAA,IACZ,CAAC;AAAA,IACD,KAAK,OAAO;AAAA,IACZ,KAAK,qBAAqB;AAAA;AAE5B;AAAA;AAGO,MAAM,sCAAsC,iBAAiB;AAAA,EACnE,WAAW,CAAC,UAAU,qDAAqD;AAAA,IAC1E,MAAM,SAAS,EAAE,MAAM,+BAA+B,WAAW,MAAM,CAAC;AAAA,IACxE,KAAK,OAAO;AAAA;AAEd;AAGO,SAAS,eAAe,CAAC,OAA2C;AAAA,EAC1E,IAAI,CAAC;AAAA,IAAO;AAAA,EACZ,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,IAAI,OAAO,SAAS,OAAO,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EACrD,MAAM,OAAO,KAAK,MAAM,KAAK;AAAA,EAC7B,IAAI,CAAC,OAAO,MAAM,IAAI;AAAA,IAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EACtE;AAAA;;;ACvMM,MAAM,gBAAqC;AAAA,EAEpB;AAAA,EADrB,UAAU,IAAI;AAAA,EACtB,WAAW,CAAkB,QAAQ,IAAI;AAAA,IAAZ;AAAA;AAAA,EAE7B,GAAG,CAAC,KAAoC;AAAA,IACvC,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAAA,IAClC,IAAI,OAAO;AAAA,MACV,KAAK,QAAQ,OAAO,GAAG;AAAA,MACvB,KAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,GAAG,CAAC,KAAa,OAAwB;AAAA,IACxC,KAAK,QAAQ,OAAO,GAAG;AAAA,IACvB,KAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,IAC3B,IAAI,KAAK,QAAQ,OAAO,KAAK,OAAO;AAAA,MACnC,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,MAC1C,IAAI,WAAW;AAAA,QAAW,KAAK,QAAQ,OAAO,MAAM;AAAA,IACrD;AAAA;AAEF;AAIO,IAAM,6BAA6B;AAUnC,SAAS,UAAU,GAAU;AAAA,EACnC,OAAO,IAAI,aAAa,8BAA8B,YAAY;AAAA;AAKnE,SAAS,SAAY,CAAC,SAAqB,QAAiC;AAAA,EAC3E,IAAI,OAAO;AAAA,IAAS,OAAO,QAAQ,OAAO,OAAO,UAAU,WAAW,CAAC;AAAA,EACvE,OAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAAA,IAC1C,MAAM,UAAU,MAAM,OAAO,OAAO,UAAU,WAAW,CAAC;AAAA,IAC1D,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IACxD,QAAQ,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM;AAAA,MAC3C,OAAO,oBAAoB,SAAS,OAAO;AAAA,KAC3C;AAAA,GACD;AAAA;AAKK,IAAM,gBAAgB;AAGtB,IAAM,qBAAqB;AAG3B,IAAM,kBAAkB;AAExB,SAAS,cAAc,CAAC,UAA2B;AAAA,EACzD,IAAI,YAAY,SAAS,SAAS;AAAA,IAAG,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAAA,EACvE,IAAI,OAAO,YAAY,aAAa;AAAA,IACnC,MAAM,UAAU,QAAQ,KAAK,uBAAuB;AAAA,IACpD,IAAI;AAAA,MAAS,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC/C;AAAA,EACA,OAAO;AAAA;AAID,SAAS,cAAc,CAAC,KAAsB;AAAA,EACpD,IAAI;AAAA,IACH,OAAO,IAAI,IAAI,GAAG,EAAE,aAAa;AAAA,IAChC,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAUF,SAAS,aAAa,CAC5B,QACA,SACqB;AAAA,EACrB,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,IAAI,OAAO,YAAY;AAAA,IAAa;AAAA,EACpC,MAAM,OACL,YAAY,aAAa,eAAe,OAAO,IAC5C,kBACA;AAAA,EACJ,OAAO,QAAQ,MAAM,SAAS;AAAA;AAMxB,SAAS,iBAAiB,CAAC,YAAyC;AAAA,EAC1E,IAAI,eAAe;AAAA,IAAW,OAAO;AAAA,EACrC,IAAI,OAAO,YAAY;AAAA,IAAa;AAAA,EACpC,OAAO,QAAQ,KAAK,uBAAuB;AAAA;AAOrC,SAAS,GAAG,CAAC,OAAgC;AAAA,EACnD,OAAO,mBAAmB,OAAO,KAAK,CAAC;AAAA;AAOjC,SAAS,UAAU,CACzB,QAIS;AAAA,EACT,MAAM,SAAS,IAAI;AAAA,EACnB,YAAY,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACnD,IAAI,UAAU,aAAa,UAAU;AAAA,MAAM;AAAA,IAC3C,MAAM,aAAa,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,IAAI,OAAO,KAAK;AAAA,IACxE,IAAI,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7B,OAAO,IAAI,MAAM,UAAU;AAAA,EAC5B;AAAA,EACA,MAAM,QAAQ,OAAO,SAAS;AAAA,EAC9B,OAAO,QAAQ,IAAI,UAAU;AAAA;AAWvB,SAAS,kBAAkB,CAAC,MAIjC;AAAA,EACD,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO,EAAE,MAAM,UAAU;AAAA,EAChD,IAAI;AAAA,IACH,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,IAC5B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,MACrC,MAAM,MAAM,KAAK,SAAS,KAAK;AAAA,MAC/B,IACC,OAAO,QAAQ,YACf,OAAO,KAAK,YAAY,YACxB,KAAK,QAAQ,SAAS,GACrB;AAAA,QACD,UAAU,KAAK;AAAA,MAChB,EAAO,SAAI,OAAO,QAAQ,YAAY,IAAI,SAAS;AAAA,QAAG,UAAU;AAAA,MAC3D,SAAI,OAAO,OAAO,QAAQ;AAAA,QAAU,UAAU,KAAK,UAAU,GAAG;AAAA,MACrE,IAAI,OAAO,KAAK,SAAS;AAAA,QAAU,OAAO,KAAK;AAAA,IAChD;AAAA,IACA,OAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,IAClC,MAAM;AAAA,IACP,OAAO,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA;AAAA;AAAA;AAI9B,MAAe,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEV,WAAW,CAAC,UAAuC,CAAC,GAAG;AAAA,IACtD,KAAK,UAAU,eAAe,QAAQ,OAAO;AAAA,IAC7C,KAAK,SAAS,cAAc,QAAQ,QAAQ,KAAK,OAAO;AAAA,IACxD,KAAK,SAAS,QAAQ,UAAU;AAAA,IAChC,KAAK,mBACJ,QAAQ,oBAAoB;AAAA,IAG7B,KAAK,YAAY,QAAQ,cAAc,IAAI,SAAS,MAAM,GAAG,IAAI;AAAA,IACjE,KAAK,YACJ,QAAQ,cAAc,QACnB,OACC,QAAQ,aAAa,IAAI;AAAA;AAAA,SAGxB,WAAW,CAAC,QAAyC;AAAA,IAC3D,MAAM,UAAkC;AAAA,MACvC,gBAAgB;AAAA,IACjB;AAAA,IACA,IAAI,QAAQ;AAAA,MACX,QAAQ,gBAAgB,UAAU;AAAA,IACnC;AAAA,IACA,OAAO;AAAA;AAAA,OAGQ,QAAU,CACzB,QACA,MACA,MACA,OAAuB,CAAC,GACX;AAAA,IACb,OAAO,KAAK,kBAAkB,KAAK,QAAQ,OAAO,WAAW;AAAA,MAG5D,MAAM,WACL,WAAW,SAAS,KAAK,YAAY,GAAG,KAAK,UAAU,SAAS;AAAA,MACjE,MAAM,SAAS,WAAW,MAAM,KAAK,WAAW,IAAI,QAAQ,IAAI;AAAA,MAChE,MAAM,WAAW,MAAM,KAAK,cAC3B,QACA,MACA,MACA,QACA,SAAS,EAAE,iBAAiB,OAAO,KAAK,IAAI,SAC7C;AAAA,MACA,IAAI,SAAS,WAAW,KAAK;AAAA,QAC5B;AAAA,MACD;AAAA,MACA,IAAI,SAAS,WAAW,KAAK;AAAA,QAI5B,IAAI,CAAC,QAAQ;AAAA,UACZ,MAAM,IAAI,SAAS,KAAK,oCAAoC;AAAA,QAC7D;AAAA,QACA,OAAO,KAAK,MAAM,OAAO,IAAI;AAAA,MAC9B;AAAA,MACA,MAAM,OAAO,WAAW,SAAS,QAAQ,IAAI,MAAM,IAAI;AAAA,MACvD,IAAI,CAAC,YAAY,CAAC,MAAM;AAAA,QACvB,OAAQ,MAAM,UAAU,SAAS,KAAK,GAAG,MAAM;AAAA,MAChD;AAAA,MACA,MAAM,OAAO,MAAM,UAAU,SAAS,KAAK,GAAG,MAAM;AAAA,MACpD,MAAM,KAAK,WAAW,IAAI,UAAU,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,MACxD,OAAO,KAAK,MAAM,IAAI;AAAA,KACtB;AAAA;AAAA,OAKc,cAAgB,CAC/B,QACA,MACA,MACA,OAAuB,CAAC,GACJ;AAAA,IACpB,IAAI;AAAA,MACH,OAAO,MAAM,KAAK,QAAW,QAAQ,MAAM,MAAM,IAAI;AAAA,MACpD,OAAO,KAAK;AAAA,MACb,IAAI,eAAe,YAAY,IAAI,WAAW;AAAA,QAAK,OAAO;AAAA,MAC1D,MAAM;AAAA;AAAA;AAAA,OAIQ,YAAW,CAC1B,QACA,MACA,MACA,OAAuB,CAAC,GACN;AAAA,IAClB,OAAO,KAAK,kBAAkB,KAAK,QAAQ,OAAO,WAAW;AAAA,MAC5D,MAAM,WAAW,MAAM,KAAK,cAAc,QAAQ,MAAM,MAAM,MAAM;AAAA,MACpE,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AAAA,KACxC;AAAA;AAAA,OAQY,kBAAoB,CACjC,cACA,KACa;AAAA,IACb,MAAM,aAAa,IAAI;AAAA,IACvB,IAAI,WAAW;AAAA,IACf,MAAM,UAAU,MACf,WAAW,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,IACtD,IAAI,cAAc;AAAA,MAAS,QAAQ;AAAA,IAC9B;AAAA,oBAAc,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IACpE,MAAM,QACL,KAAK,mBAAmB,IACrB,WAAW,MAAM;AAAA,MACjB,WAAW;AAAA,MACX,WAAW,MAAM,WAAW,CAAC;AAAA,OAC3B,KAAK,gBAAgB,IACvB;AAAA,IACJ,IAAI;AAAA,MACH,OAAO,MAAM,IAAI,WAAW,MAAM;AAAA,MACjC,OAAO,KAAK;AAAA,MACb,IAAI,YAAY,CAAC,cAAc,SAAS;AAAA,QACvC,MAAM,IAAI,SACT,GACA,oBAAoB,KAAK,kBAAkB,KAAK,kFAChD,WACA,mBACA,EAAE,WAAW,MAAM,OAAO,eAAe,QAAQ,MAAM,UAAU,CAClE;AAAA,MACD;AAAA,MACA,MAAM;AAAA,cACL;AAAA,MACD,IAAI,UAAU;AAAA,QAAW,aAAa,KAAK;AAAA,MAC3C,cAAc,oBAAoB,SAAS,OAAO;AAAA;AAAA;AAAA,OAOpC,cAAa,CAC5B,QACA,MACA,MACA,QACA,cACoB;AAAA,IACpB,MAAM,MAAM,GAAG,KAAK,UAAU;AAAA,IAC9B,MAAM,UAAU;AAAA,SACZ,WAAW,YAAY,KAAK,MAAM;AAAA,SAClC;AAAA,IACJ;AAAA,IACA,QAAQ,iBAAiB,KAAK;AAAA,IAS9B,IAAI;AAAA,IACJ,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,MACxC,IAAI;AAAA,QACH,iBAAiB,KAAK,UAAU,MAAM,CAAC,MAAM,UAC5C,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI,KAChD;AAAA,QACC,OAAO,KAAK;AAAA,QACb,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAE9D,MAAM,IAAI,SACT,GACA,qCAAqC,UACrC,WACA,WACA,EAAE,WAAW,MAAM,CACpB;AAAA;AAAA,IAEF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACH,MAAM,UAAU,KAAK,UAAU,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACD,CAAC;AAAA,MACD,WAAW,SAAS,MAAM,UAAU,SAAS,MAAM,IAAI,MAAM;AAAA,MAC5D,OAAO,KAAK;AAAA,MAGb,IAAI,QAAQ;AAAA,QAAS,MAAM;AAAA,MAC3B,MAAM,IAAI,SACT,GACA,uBAAuB,KAAK,gDAC5B,WACA,WACA,EAAE,WAAW,MAAM,OAAO,eAAe,QAAQ,MAAM,UAAU,CAClE;AAAA;AAAA,IAID,IAAI,SAAS,WAAW;AAAA,MAAK,OAAO;AAAA,IAEpC,IAAI,CAAC,SAAS,IAAI;AAAA,MAIjB,MAAM,YAAY,SACf,MAAM,UAAU,SAAS,KAAK,GAAG,MAAM,IACvC,MAAM,SAAS,KAAK;AAAA,MACvB,MAAM,WAAW,mBAAmB,SAAS;AAAA,MAC7C,MAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAAA,MAE1D,IAAI,SAAS,WAAW,KAAK;AAAA,QAC5B,MAAM,IAAI,UACT,SAAS,WAAW,+BACpB,SAAS,MACT,SAAS,IACV;AAAA,MACD;AAAA,MAEA,IAAI,SAAS,WAAW,KAAK;AAAA,QAG5B,MAAM,WAAW,aACd,sBAAsB,wBACtB;AAAA,QACH,MAAM,IAAI,eACT,SAAS,WAAW,UACpB,YACA,SAAS,MACT,SAAS,IACV;AAAA,MACD;AAAA,MAEA,IAAI,SAAS,UAAU,KAAK;AAAA,QAC3B,MAAM,oBAAoB,gBAAgB,UAAU;AAAA,QACpD,MAAM,IAAI,SACT,SAAS,QACT,SAAS,WACR,8CAA8C,KAAK,kBACpD,SAAS,MACT,SAAS,MACT,sBAAsB,YAAY,EAAE,kBAAkB,IAAI,CAAC,CAC5D;AAAA,MACD;AAAA,MAEA,MAAM,IAAI,SACT,SAAS,QACT,SAAS,WAAW,QAAQ,SAAS,UACrC,SAAS,MACT,SAAS,IACV;AAAA,IACD;AAAA,IAEA,OAAO;AAAA;AAET;;;AC1fA;AAAA;AAAA;AAAA;AAAA;;;ACgBO,MAAM,2BAA2B,SAAS;AAAA,EAChD,WAAW,CAAC,SAAiB,QAAgB,MAAgB,MAAe;AAAA,IAC3E,MAAM,QAAQ,SAAS,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,IACtD,KAAK,OAAO;AAAA;AAEd;AAAA;AAGO,MAAM,8BAA8B,iBAAiB;AAAA,EAC3D,WAAW,CAAC,UAAU,mDAAmD;AAAA,IACxE,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA;AAEd;AAMA,eAAsB,eAAe,CAAC,UAAoC;AAAA,EACzE,QAAQ,SAAS,MAAM,SAAS,mBAAmB,MAAM,SAAS,KAAK,CAAC;AAAA,EAExE,IAAI,SAAS,WAAW,KAAK;AAAA,IAC5B,MAAM,IAAI,UAAU,WAAW,+BAA+B,MAAM,IAAI;AAAA,EACzE;AAAA,EAEA,IAAI,SAAS,WAAW,KAAK;AAAA,IAC5B,MAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAAA,IAC1D,MAAM,IAAI,eACT,WAAW,kCACX,YACA,MACA,IACD;AAAA,EACD;AAAA,EAEA,IAAI,SAAS,UAAU,KAAK;AAAA,IAC3B,MAAM,IAAI,mBACT,WAAW,2BAA2B,SAAS,WAC/C,SAAS,QACT,MACA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,IAAI,gBACT,WAAW,4BAA4B,SAAS,WAChD,SAAS,QACT,MACA,IACD;AAAA;;;ADnDM,IAAM,SAAS;AAAA,EAsBrB,QAAQ,CAAC,QAA+B;AAAA,IACvC,IAAI,UAAU;AAAA,MAAG,OAAO;AAAA,IACxB,OAAO,oBAAoB,eAAe,SAAS,CAAC,CAAC;AAAA;AAAA,EAItD,KAAK,CAAC,QAA6D;AAAA,IAClE,IAAI;AAAA,MACH,MAAM,UAAU,oBAAoB,MAAM;AAAA,MAC1C,OAAO;AAAA,QACN,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MACrB;AAAA,MACC,MAAM;AAAA,MACP,MAAM,IAAI,gBACT,0BAA0B,0DAC1B,GACD;AAAA;AAAA;AAGH;;;AE1CA,SAAS,QAAQ,CAAC,OAA6B;AAAA,EAC9C,OAAO,GAAG,MAAM,eAAe,MAAM,qBAAqB,MAAM;AAAA;AAI1D,IAAM,6BAA6B;AA+B1C,eAAsB,WAErB,CAAC,MAY8B;AAAA,EAC/B,MAAM,QAAQ,KAAK,OAAO,OACzB,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC,CAC/C;AAAA,EACA,IAAI,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EAE/B,WAAW,SAAS,OAAO;AAAA,IAC1B,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI,CAAC,OAAO,cAAc,IAAI,KAAK,OAAO,GAAG;AAAA,MAC5C,MAAM,IAAI,gBACT,2BAA2B,OAAO,IAAI,0KACtC,GACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,WAAW,aAAa,KAAK,MAAM;AAAA,EACzC,MAAM,aAAa,MACjB,OAAO,CAAC,UAAU,aAAa,QAAQ,MAAM,qBAAqB,QAAQ,EAC1E,KAAK,CAAC,GAAG,MAAM,EAAE,oBAAoB,EAAE,iBAAiB;AAAA,EAG1D,WAAW,SAAS,OAAO;AAAA,IAC1B,IAAI,CAAC,WAAW,SAAS,KAAK;AAAA,MAAG,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,EACpE;AAAA,EACA,IAAI,WAAW,WAAW,KAAK,aAAa;AAAA,IAAM,OAAO;AAAA,EAEzD,MAAM,YAAY,WAAW,IAAI,qBAAqB;AAAA,EACtD,MAAM,QAAQ,WAAW;AAAA,EACzB,MAAM,WAAW,KAAK,oBAAoB;AAAA,EAC1C,IAAI,QAAQ,UAAU;AAAA,IACrB,MAAM,IAAI,gBACT,iBAAiB,qBAAqB,+CAA+C,oCAAoC,gKAAgK,gCACzR,GACD;AAAA,EACD;AAAA,EAEA,MAAM,SAAS,OAAO,SAAS,SAAS;AAAA,EACxC,WAAW,SAAS,YAAY;AAAA,IAG/B,MAAM,KAAK,MAAM,SAAS,MAAM,mBAAmB,MAAM;AAAA,IACzD,MAAM,KAAK,UAAU,OAAO,EAAE,QAAQ,OAAO,CAAC;AAAA,IAC9C,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA;AAuC7B,SAAS,yBAAyB,CAExC,UACA,YACO;AAAA,EACP,IAAI,aAAa,QAAQ,aAAa;AAAA,IAAW;AAAA,EACjD,IAAI,aAAa;AAAA,IAAY;AAAA,EAC7B,MAAM,IAAI,OAAO,MAAM,QAAQ;AAAA,EAC/B,MAAM,IAAI,eAAe,OAAO,OAAO,OAAO,MAAM,UAAU;AAAA,EAC9D,MAAM,QACL,MAAM,QACN,EAAE,cAAc,EAAE,eACjB,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE;AAAA,EACtD,IAAI,OAAO;AAAA,IACV,MAAM,WAAW,IAAI,MAAM,iBAAiB;AAAA,IAC5C,MAAM,IAAI,gBACT,4BAA4B,sDAAsD,wNAClF,GACD;AAAA,EACD;AAAA;AAUM,SAAS,wBAAwB,CACvC,MACA,eACO;AAAA,EACP,IAAI,MAAM,cAAc,iBAAiB,CAAC,eAAe;AAAA,IACxD,MAAM,IAAI,gBACT,0OACA,GACD;AAAA,EACD;AAAA;AAUM,SAAS,YAAY,CAAC,QAAsC;AAAA,EAClE,IAAI,WAAW;AAAA,IAAM,OAAO;AAAA,EAC5B,IAAI;AAAA,IACH,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,IAC3B,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAQF,SAAS,YAA2D,CAC1E,QACA,QACA,KACA,SAA4B,CAAC,GAC7B,gBAA+B,MACM;AAAA,EACrC,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,WAAW,iBAAiB;AAAA,EAClC,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,cAAc,aAAa,OAAO,OAAO,KAAK,IAAI,GAAG,YAAY,QAAQ;AAAA,IACzE;AAAA,IACA;AAAA,EACD;AAAA;AAwBD,IAAM,qBAAqB;AAE3B,SAAS,YAAY,CAAC,KAAuB;AAAA,EAG5C,IAAI,OAAO,OAAO,QAAQ,YAAY,eAAe,KAAK;AAAA,IACzD,OAAQ,IAA+B,cAAc;AAAA,EACtD;AAAA,EACA,OAAO,eAAe;AAAA;AAGvB,SAAS,eAAe,CAAC,KAAkC;AAAA,EAC1D,IAAI,OAAO,OAAO,QAAQ,YAAY,uBAAuB,KAAK;AAAA,IACjE,MAAM,UAAW,IAAuC;AAAA,IACxD,IAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,GAAG;AAAA,MAC5D,OAAO,KAAK,IAAI,UAAU,MAAM,kBAAkB;AAAA,IACnD;AAAA,EACD;AAAA,EACA;AAAA;AASD,eAAsB,kBAAqB,CAC1C,WACA,MACa;AAAA,EACb,MAAM,aAAa,KAAK,cAAc;AAAA,EACtC,MAAM,aAAa,KAAK,cAAc;AAAA,EACtC,SAAS,UAAU,IAAK,WAAW;AAAA,IAClC,IAAI;AAAA,MACH,OAAO,MAAM,UAAU;AAAA,MACtB,OAAO,KAAK;AAAA,MACb,MAAM,cAAc,aAAa;AAAA,MACjC,IAAI,eAAe,KAAK,CAAC,aAAa,GAAG,KAAK,KAAK,QAAQ,SAAS;AAAA,QACnE,MAAM;AAAA,MACP;AAAA,MACA,MAAM,UAAU,gBAAgB,GAAG,KAAK,cAAc,UAAU;AAAA,MAChE,KAAK,UAAU,KAAK,EAAE,SAAS,aAAa,QAAQ,CAAC;AAAA,MACrD,MAAM,KAAK,MAAM,SAAS,KAAK,MAAM;AAAA,MAErC,IAAI,KAAK,QAAQ;AAAA,QAAS,MAAM;AAAA;AAAA,EAElC;AAAA;AAGD,eAAsB,YAAY,CACjC,IACA,QACgB;AAAA,EAChB,IAAI,QAAQ;AAAA,IAAS;AAAA,EAErB,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,IACpC,MAAM,UAAU,MAAM;AAAA,MACrB,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA;AAAA,IAKT,MAAM,UAAU,WAAW,MAAM;AAAA,MAChC,QAAQ,oBAAoB,SAAS,OAAO;AAAA,MAC5C,QAAQ;AAAA,OACN,EAAE;AAAA,IACL,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,GACzD;AAAA;AAGF,eAAsB,oBAAiC,CAAC,MAuDkB;AAAA,EACzE,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,MAAM,OAAO,KAAK,QAAQ;AAAA,EAC1B,MAAM,gBAAgB,KAAK,iBAAiB;AAAA,EAC5C,MAAM,iBAAiB,KAAK,kBAAkB;AAAA,EAC9C,MAAM,WAAW,KAAK,YAAY,OAAO;AAAA,EACzC,MAAM,gBAAgB,KAAK,iBAAiB,OAAO;AAAA,EACnD,yBAAyB,KAAK,MAAM,aAAa;AAAA,EAQjD,MAAM,kBAAmB,MAAM,KAAK,MAAM,WAAW,KAAM;AAAA,EAC3D,IAAI,SAAS,KAAK,cAAc;AAAA,EAGhC,MAAM,gBAAgB,IAAI;AAAA,EAG1B,IAAI,aAA4B;AAAA,EAChC,IAAI,QAAQ;AAAA,EACZ,IAAI,aAAa;AAAA,EAKjB,IAAI,SAAwB,aAAa,MAAM;AAAA,EAI/C,IAAI,UAAyB;AAAA,EAE7B,OACC,QAAQ,YACR,aAAa,iBACb,CAAC,KAAK,QAAQ,SACb;AAAA,IAGD,MAAM,WAAW,MAAM,mBACtB,MACC,KAAK,YAAY;AAAA,MAChB;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IACf,CAAC,GACF;AAAA,MACC,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd;AAAA,MACA,QAAQ,KAAK;AAAA,IACd,CACD;AAAA,IACA;AAAA,IAOA,MAAM,WAAW,CAAC,iBAAiB,QAAQ,KAAK,WAAW,KAAK,IAAI;AAAA,IACpE,IAAI,UAAU;AAAA,MACb,MAAM,UAAU,MAAM,YAAY;AAAA,QACjC,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,kBAAkB,KAAK;AAAA,MACxB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QACZ,SAAS,QAAQ;AAAA,QAIjB,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY,IAAI;AAAA,QACzD,UAAU;AAAA,QACV,aAAa;AAAA,QACb;AAAA,MACD;AAAA,IACD;AAAA,IASA,IAAI,YAAY,KAAK,eAAe,SAAS,OAAO,WAAW,GAAG;AAAA,MACjE,eAAe;AAAA,MACf,IAAI,eAAe,MAAM;AAAA,QACxB,MAAM,QAAgB;AAAA,QACtB,MAAM,cAAc,KAAK;AAAA,QACzB,MAAM,SAAoC,MAAM,mBAC/C,MAAM,YAAY,EAAE,MAAM,CAAC,GAC3B;AAAA,UACC,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,UACjB,SAAS,KAAK;AAAA,UACd;AAAA,UACA,QAAQ,KAAK;AAAA,QACd,CACD;AAAA,QACA,IAAI,OAAO,eAAe;AAAA,UAAM,aAAa,OAAO;AAAA,QACpD,MAAM,UAAU,MAAM,YAAY;AAAA,UACjC,QAAQ,OAAO;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,SAAS,KAAK;AAAA,UACd,kBAAkB,KAAK;AAAA,QACxB,CAAC;AAAA,QACD,IAAI,SAAS;AAAA,UACZ,SAAS,QAAQ;AAAA,UACjB,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY,IAAI;AAAA,UACzD,UAAU;AAAA,UACV,aAAa;AAAA,UACb;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IAEA,MAAM,UAAU,gBACb,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,IACjD,SAAS;AAAA,IAGZ,MAAM,aAAa,gBACf,QAAQ,GAAG,EAAE,GAAG,UAAU,SAC3B,SAAS;AAAA,IAGZ,SAAS,QAAQ,GAAG,EAAE,GAAG,gBAAgB;AAAA,IAOzC,IAAI,QAAQ,SAAS,GAAG;AAAA,MACvB,UAAU;AAAA,IACX,EAAO,SAAI,eAAe,QAAQ,eAAe,QAAQ;AAAA,MACxD,UAAU,aAAa,UAAU,KAAK;AAAA,IACvC,EAAO,SAAI,SAAS,OAAO,WAAW,GAAG;AAAA,MACxC,UAAU,SAAS,IAAI;AAAA,IACxB;AAAA,IAIA,MAAM,MAAM,aACX,cAAc,QACd,QACA,SAAS,KACT,SAAS,QACT,OACD;AAAA,IAEA,KAAK,aAAa,GAAG;AAAA,IAErB,IAAI;AAAA,IACJ,IAAI,KAAK,MAAM;AAAA,MACd,MAAM,OAAO,KAAK;AAAA,MAGlB,IACC,eAAe,SACd,eAAe,UAAU,QAAQ,SAAS,IAC1C;AAAA,QACD,MAAM,KAAK,YAAY,YAAY,OAAO,OAAO;AAAA,UAKhD,MAAM,KAAK,QAAQ,SAAS,UAAU;AAAA,eAClC;AAAA,YACH;AAAA,UACD,CAA2C;AAAA,SAC3C;AAAA,MACF;AAAA,MACA,aAAa;AAAA,IACd,EAAO;AAAA,MACN,MAAM,iBAAiB,MAAM,KAAK,QACjC,SACA,UACA,GACD;AAAA,MACA,IAAI;AAAA,QAAe,0BAA0B,gBAAgB,UAAU;AAAA,MACvE,aAAa,kBAAkB;AAAA;AAAA,IAGhC,IAAI,cAAc,eAAe,QAAQ;AAAA,MACxC,SAAS;AAAA,MACT,aAAa;AAAA,MACb;AAAA,IACD;AAAA,IAEA,IAAI,QAAQ,WAAW,GAAG;AAAA,MACzB;AAAA,MACA,IAAI,SAAS,WAAW;AAAA,QACvB,OAAO,EAAE,QAAQ,OAAO,WAAW;AAAA,MACpC;AAAA,MAUA,OAAO,KAAK,OACT,QAAQ,KAAK;AAAA,QACb,MAAM,gBAAgB,KAAK,MAAM;AAAA,QACjC,KAAK,KAAK,EAAE,MAAM,MAAM,IAAI,QAAe,MAAM,EAAE,CAAC;AAAA,MACrD,CAAC,IACA,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACpC;AAAA,IACD;AAAA,IAEA,OAAO,EAAE,QAAQ,OAAO,WAAW;AAAA,EACpC;AAAA,EAEA,OAAO,EAAE,QAAQ,OAAO,WAAW;AAAA;AAUpC,gBAAuB,qBAAqB,CAAC,MAkBZ;AAAA,EAChC,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,IAAI,SAAS,KAAK,cAAc;AAAA,EAEhC,OAAO,CAAC,KAAK,QAAQ,SAAS;AAAA,IAC7B,MAAM,WAAW,MAAM,KAAK,YAAY;AAAA,MACvC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,IAED,MAAM,aAAa,SAAS,eAAe;AAAA,IAC3C,IAAI,SAAS,OAAO,SAAS,KAAK,SAAS,OAAO,SAAS,GAAG;AAAA,MAC7D,MAAM;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,QAAQ;AAAA,QACR,KAAK,SAAS;AAAA,QACd,QAAQ,SAAS;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,MAAM,WAAW,eAAe,QAAQ,eAAe;AAAA,IACvD,SAAS;AAAA,IAET,IAAI,CAAC,YAAY,SAAS,OAAO,WAAW,GAAG;AAAA,MAC9C,IAAI,KAAK,QAAQ;AAAA,QAAS;AAAA,MAC1B,MAAM,MAAM,KAAK,YAAY,KAAK,MAAM;AAAA,IACzC;AAAA,EACD;AAAA;AAGD,gBAAuB,mBAAmB,CAAC,MAoBV;AAAA,EAChC,MAAM,QAAQ,KAAK,SAAS;AAAA,EAC5B,MAAM,iBAAiB,KAAK,kBAAkB;AAAA,EAC9C,MAAM,WAAW,KAAK,YAAY,OAAO;AAAA,EACzC,MAAM,gBAAgB,KAAK,iBAAiB,OAAO;AAAA,EACnD,IAAI,SAAS,KAAK,cAAc;AAAA,EAChC,IAAI,QAAQ;AAAA,EACZ,IAAI,aAAa;AAAA,EAEjB,OACC,QAAQ,YACR,aAAa,iBACb,CAAC,KAAK,QAAQ,SACb;AAAA,IACD,MAAM,WAAW,MAAM,KAAK,YAAY;AAAA,MACvC;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,iBAAiB,KAAK;AAAA,MACtB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IAEA,WAAW,SAAS,SAAS,QAAQ;AAAA,MACpC,IAAI,KAAK,QAAQ;AAAA,QAAS;AAAA,MAC1B,MAAM;AAAA,IACP;AAAA,IAEA,MAAM,aAAa,SAAS;AAAA,IAC5B,IAAI,cAAc,eAAe,QAAQ;AAAA,MACxC,SAAS;AAAA,MACT,aAAa;AAAA,MACb;AAAA,IACD;AAAA,IAEA,IAAI,SAAS,OAAO,WAAW,GAAG;AAAA,MACjC;AAAA,MACA,IAAI,cAAc,iBAAiB,SAAS;AAAA,QAAU;AAAA,MACtD,MAAM,MAAM,gBAAgB,KAAK,MAAM;AAAA,MACvC;AAAA,IACD;AAAA,IAEA;AAAA,EACD;AAAA;;;AClvBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBO,SAAS,MAAM,CAAC,OAAiC;AAAA,EACvD,MAAM,OAAO;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM;AAAA,IACpB,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,EACpB;AAAA,EAGA,MAAM,IAAI,MAAM;AAAA,EAChB,QAAQ,MAAM;AAAA,SACR;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,QACxD,MAAM,eAAe,EAAE,IAAI;AAAA,MAC5B;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,MACzD;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,MACzD;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,QAAQ,cAAc,GAAG,kBAAkB,MAAM,UAAU;AAAA,QAC3D,QAAQ,mBAAmB,GAAG,iBAAiB,MAAM,UAAU;AAAA,QAC/D,SAAS,EAAE,eAAe,eAAe,EAAE,aAAa,EAAE;AAAA,MAC3D;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,MACzD;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,MACzD;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,QAAQ,mBAAmB,GAAG,UAAU,MAAM,UAAU;AAAA,MACzD;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,OAAO,gBAAgB,GAAG,MAAM,UAAU;AAAA,MAC3C;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,WAAW,cAAc,GAAG,aAAa,MAAM,UAAU;AAAA,QACzD,OAAO,gBAAgB,GAAG,MAAM,UAAU;AAAA,MAC3C;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,kBAAkB,cACjB,GACA,oBACA,MAAM,UACP;AAAA,QACA,QAAQ,cAAc,GAAG,UAAU,MAAM,UAAU;AAAA,QACnD,OAAO,gBAAgB,GAAG,MAAM,UAAU;AAAA,MAC3C;AAAA,SACI;AAAA,MACJ,OAAO;AAAA,WACH;AAAA,QACH,YAAY;AAAA,QACZ,SAAS;AAAA,UACR,OAAO,eAAe,EAAE,KAAK;AAAA,UAC7B,OAAO,EAAE;AAAA,UACT,WAAW,eAAe,EAAE,SAAS;AAAA,QACtC;AAAA,MACD;AAAA;AAAA;;;ACxJH;AACA;AAqBO,SAAS,kBAAkB,CAAC,MAKlB;AAAA,EAChB,MAAM,UAAU,KAAK,SAAS,QAAQ,QAAQ,EAAE;AAAA,EAEhD,SAAS,cAAc,GAAW;AAAA,IACjC,IAAI,CAAC,SAAS;AAAA,MACb,MAAM,IAAI,mBACT,gEACA,CACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,SAAS,OAAO,CAAC,MAA+B;AAAA,IAC/C,MAAM,OAAO,eAAe;AAAA,IAC5B,MAAM,OAAO,KAAK,KAAK,QAAQ,QAAQ,EAAE;AAAA,IAIzC,IAAI;AAAA,MACH,MAAM,WAAW,IAAI,IAAI,IAAI,EAAE,SAAS,QAAQ,cAAc,EAAE;AAAA,MAChE,IAAI,YAAY,KAAK,WAAW,GAAG,WAAW,GAAG;AAAA,QAChD,OAAO,GAAG,QAAQ,KAAK,MAAM,SAAS,SAAS,CAAC;AAAA,MACjD;AAAA,MACC,MAAM;AAAA,IAGR,OAAO,GAAG,QAAQ;AAAA;AAAA,EAGnB,eAAe,IAAI,GAAkC;AAAA,IACpD,MAAM,MAAM,GAAG,eAAe;AAAA,IAC9B,MAAM,MAAM,MAAM,KAAK,UAAU,GAAG;AAAA,IACpC,IAAI,CAAC,IAAI,IAAI;AAAA,MACZ,MAAM,IAAI,mBACT,mCAAmC,IAAI,YACvC,IAAI,MACL;AAAA,IACD;AAAA,IACA,MAAM,WAAY,MAAM,IAAI,KAAK;AAAA,IACjC,IAAI,KAAK,gBAAgB;AAAA,MACxB,IAAI,CAAC,KAAK,kBAAkB;AAAA,QAC3B,MAAM,IAAI,sBACT,sEACD;AAAA,MACD;AAAA,MACA,MAAM,eAAe,MAAM,KAAK,iBAAiB;AAAA,MACjD,IAAI,CAAC,mCAAmC,UAAU,YAAY,GAAG;AAAA,QAChE,MAAM,IAAI,sBACT,iDACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAOR,eAAe,QAAQ,CAAC,MAA4C;AAAA,IACnE,OAAO,mBAAmB,MAAM,aAAa,IAAI,GAAG;AAAA,MACnD,OAAO;AAAA,IACR,CAAC;AAAA;AAAA,EAGF,eAAe,YAAY,CAAC,MAA4C;AAAA,IACvE,MAAM,MAAM,MAAM,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC9C,IAAI,CAAC,IAAI,IAAI;AAAA,MACZ,MAAM,IAAI,mBACT,2BAA2B,KAAK,SAAS,IAAI,YAC7C,IAAI,MACL;AAAA,IACD;AAAA,IACA,IAAI,CAAC,IAAI,MAAM;AAAA,MACd,MAAM,IAAI,mBACT,QAAQ,KAAK,8BACb,CACD;AAAA,IACD;AAAA,IACA,MAAM,OAAO,WAAW,QAAQ;AAAA,IAChC,MAAM,SAAuB,CAAC;AAAA,IAC9B,IAAI,QAAQ;AAAA,IACZ,MAAM,SAAS,IAAI,KAAK,UAAU;AAAA,IAClC,IAAI;AAAA,MACH,OAAO,MAAM;AAAA,QACZ,QAAQ,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA,QAC1C,IAAI;AAAA,UAAM;AAAA,QACV,KAAK,OAAO,KAAK;AAAA,QACjB,OAAO,KAAK,KAAK;AAAA,QACjB,SAAS,MAAM;AAAA,MAChB;AAAA,MACC,MAAM;AAAA,MAGP,MAAM,IAAI,mBACT,oBAAoB,KAAK,8BAA8B,gBACvD,CACD;AAAA;AAAA,IAED,MAAM,SAAS,KAAK,OAAO,KAAK;AAAA,IAChC,IAAI,WAAW,KAAK,QAAQ;AAAA,MAC3B,MAAM,IAAI,sBACT,QAAQ,KAAK,kCAAkC,KAAK,eAAe,UACpE;AAAA,IACD;AAAA,IACA,IAAI,OAAO,WAAW,KAAK,OAAO;AAAA,MAAI,OAAO,OAAO;AAAA,IACpD,MAAM,QAAQ,IAAI,WAAW,KAAK;AAAA,IAClC,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,QAAQ;AAAA,MAC3B,MAAM,IAAI,OAAO,MAAM;AAAA,MACvB,UAAU,MAAM;AAAA,IACjB;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,OAAO,EAAE,MAAM,SAAS,SAAS;AAAA;;;AC/IlC;AAiDO,IAAM,mCAAmC;AAGzC,IAAM,mCAAmC;AAQzC,SAAS,cAAc,CAC7B,SACA,QACA,mBACA,SAAuB,KAAK,QACnB;AAAA,EACT,MAAM,SAAS,KAAK,IACnB,SAAS,KAAK,KAAK,IAAI,GAAG,OAAO,GACjC,gCACD;AAAA,EACA,MAAM,WAAW,UAAU,MAAM,OAAO,IAAI;AAAA,EAC5C,MAAM,SAAS,qBAAqB,KAAK;AAAA,EACzC,OAAO,KAAK,IAAI,UAAU,KAAK;AAAA;AAIhC,SAAS,UAAU,CAAC,KAAuB;AAAA,EAC1C,IAAI,eAAe;AAAA,IAAuB,OAAO;AAAA,EACjD,OAAQ,KAAwC,cAAc;AAAA;AAYxD,SAAS,sBAAsB,CAAC,MAwBf;AAAA,EACvB,QAAQ,WAAW;AAAA,EACnB,MAAM,aAAa,IAAI;AAAA,EACvB,MAAM,WAAW,OAAO;AAAA,EACxB,IAAI,UAAU;AAAA,IACb,IAAI,SAAS;AAAA,MAAS,WAAW,MAAM;AAAA,IAEtC;AAAA,eAAS,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG;AAAA,QAC5D,MAAM;AAAA,MACP,CAAC;AAAA,EACH;AAAA,EACA,IAAI,SAAS,OAAO,cAAc;AAAA,EAClC,MAAM,cAAc,KAAK,oBAAoB,OAAO,oBAAoB;AAAA,EACxE,MAAM,eACL,KAAK,gBACL,OAAO,gBACP;AAAA,EAED,IAAI,UAAU;AAAA,EAEd,MAAM,MAAM,YAA2B;AAAA,IACtC,OAAO,CAAC,WAAW,OAAO,SAAS;AAAA,MAClC,IAAI;AAAA,QACH,MAAM,MAAM,GAAG,KAAK,mCAAmC,WAAW;AAAA,UACjE,OAAO,OAAO,UAAU,YAAY,YAAY;AAAA,UAChD,aAAa,UAAU;AAAA,UACvB,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,kBAAkB,OAAO;AAAA,UAGzB,MAAM,OAAO;AAAA,UACb,SAAS,OAAO;AAAA,UAGhB,SAAS,OAAO,UAAU,KAAK,UAAU,OAAO,OAAO,IAAI;AAAA,QAC5D,CAAC;AAAA,QACD,MAAM,QAAQ;AAAA,UACb;AAAA,UACA,SAAS,KAAK,WAAW,CAAC;AAAA,UAC1B,QAAQ,WAAW;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB;AAAA,UACA,UAAU;AAAA,UACV,SAAS,OAAO,UAAU;AAAA,YAEzB,UAAU;AAAA,YACV,IAAI,MAAM,UAAU,UAAU,CAAC,MAAM;AAAA,cAAM;AAAA,YAC3C,IAAI;AAAA,YACJ,IAAI;AAAA,cACH,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,cAC7B,MAAM;AAAA,cACP;AAAA;AAAA,YAED,IAAI,CAAC,OAAO;AAAA,cAAO;AAAA,YACnB,IAAI,KAAK,WAAW,OAAO;AAAA,cAC1B,IAAI,CAAC,OAAO,KAAK;AAAA,gBAGhB,IAAI,KAAK,WAAW,UAAU;AAAA,kBAC7B,MAAM,IAAI,sBACT,yCACD;AAAA,gBACD;AAAA,cACD,EAAO;AAAA,gBAIN,MAAM,MAAM,MAAM,KAAK,QAAQ,OAAO,MAAM;AAAA,gBAG5C,IACC,CAAC,QAAQ,cACR,KAAK,UAAU,OAAO,KAAK,GAC3B,OAAO,KACP,IAAI,SACL,GACC;AAAA,kBACD,MAAM,IAAI,sBACT,yCACD;AAAA,gBACD;AAAA;AAAA,YAEF;AAAA,YAIA,MAAM,OAAO,QAAQ,OAAO,KAAK;AAAA,YACjC,SAAU,OAAO,MAA8B,UAAU;AAAA;AAAA,QAE3D,CAAC;AAAA,QAID,MAAM,MACL,eAAe,SAAS,aAAa,WAAW,KAAK,MAAM,GAC3D,WAAW,MACZ;AAAA,QACA,WAAW;AAAA,QACV,OAAO,KAAK;AAAA,QACb,IAAI,WAAW,OAAO;AAAA,UAAS;AAAA,QAC/B,OAAO,UAAU,GAAG;AAAA,QACpB,IAAI,WAAW,GAAG;AAAA,UAAG,MAAM;AAAA,QAC3B,MAAM,oBAAqB,IACzB;AAAA,QACF,MAAM,MACL,eAAe,SAAS,aAAa,mBAAmB,KAAK,MAAM,GACnE,WAAW,MACZ;AAAA,QACA,WAAW;AAAA;AAAA,IAEb;AAAA;AAAA,EAED,MAAM,OAAO,IAAI;AAAA,EAGjB,KAAK,MAAM,MAAM,EAAE;AAAA,EACnB,MAAM,cAAc,MAAM,WAAW,MAAM;AAAA,EAC3C,OAAO,OAAO,OAAO,aAAa,EAAE,KAAK,CAAC;AAAA;AAgB3C,eAAsB,OAAO,CAAC,MAQZ;AAAA,EACjB,MAAM,MAAM,MAAM,KAAK,UAAU,KAAK,KAAK;AAAA,IAC1C,SAAS,KAAM,KAAK,WAAW,CAAC,GAAI,QAAQ,oBAAoB;AAAA,IAChE,QAAQ,KAAK;AAAA,EACd,CAAC;AAAA,EACD,IAAI,CAAC,IAAI,IAAI;AAAA,IACZ,IAAI,KAAK;AAAA,MAAU,MAAM,KAAK,SAAS,GAAG;AAAA,IAC1C,MAAM,IAAI,mBACT,wBAAwB,IAAI,WAC5B,IAAI,MACL;AAAA,EACD;AAAA,EACA,IAAI,CAAC,IAAI,MAAM;AAAA,IACd,MAAM,IAAI,mBAAmB,qCAAqC,CAAC;AAAA,EACpE;AAAA,EACA,iBAAiB,SAAS,eACzB,IAAI,MACJ,KAAK,QACL,KAAK,YACN,GAAG;AAAA,IACF,MAAM,KAAK,QAAQ,KAAK;AAAA,EACzB;AAAA;AAGD,SAAS,KAAK,CAAC,IAAY,QAAoC;AAAA,EAC9D,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,IAC/B,IAAI,OAAO;AAAA,MAAS,OAAO,QAAQ;AAAA,IACnC,MAAM,UAAU,MAAM;AAAA,MACrB,aAAa,KAAK;AAAA,MAClB,QAAQ;AAAA;AAAA,IAET,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC9B,OAAO,oBAAoB,SAAS,OAAO;AAAA,MAC3C,QAAQ;AAAA,OACN,EAAE;AAAA,IACL,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,GACxD;AAAA;AAKF,eAAe,kBAA0D,CACxE,QACA,cAC0C;AAAA,EAC1C,IAAI,iBAAiB,aAAa,CAAC,OAAO,SAAS,YAAY,GAAG;AAAA,IACjE,OAAO,OAAO,KAAK;AAAA,EACpB;AAAA,EACA,IAAI;AAAA,EACJ,MAAM,QAAQ,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,IAC/C,QAAQ,WACP,MACC,OACC,IAAI,mBACH,8BAA8B,kCAC9B,GACA,WACA,cACD,CACD,GACD,YACD;AAAA,GACA;AAAA,EACD,IAAI;AAAA,IACH,OAAQ,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,KAAK,CAAC;AAAA,YAGhD;AAAA,IACD,aAAa,KAAK;AAAA;AAAA;AAIpB,gBAAgB,cAAc,CAC7B,MACA,QACA,cAC2B;AAAA,EAC3B,MAAM,SAAS,KAAK,UAAU;AAAA,EAC9B,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,SAAS;AAAA,EACb,IAAI;AAAA,IACH,OAAO,CAAC,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,SAAS,MAAM,mBAAmB,QAAQ,YAAY;AAAA,MACrE,IAAI;AAAA,QAAM;AAAA,MACV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,MAChD,IAAI,MAAM,OAAO,QAAQ;AAAA;AAAA,CAAM;AAAA,MAC/B,OAAO,QAAQ,IAAI;AAAA,QAClB,MAAM,WAAW,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,QACrC,SAAS,OAAO,MAAM,MAAM,CAAC;AAAA,QAC7B,MAAM,OAAO,QAAQ;AAAA;AAAA,CAAM;AAAA,MAC5B;AAAA,IACD;AAAA,YACC;AAAA,IACD,IAAI;AAAA,MACH,MAAM,OAAO,OAAO;AAAA,MACnB,MAAM;AAAA;AAAA;AAMV,SAAS,UAAU,CAAC,KAAuB;AAAA,EAC1C,IAAI;AAAA,EACJ,MAAM,OAAiB,CAAC;AAAA,EACxB,WAAW,QAAQ,IAAI,MAAM;AAAA,CAAI,GAAG;AAAA,IACnC,IAAI,KAAK,WAAW,OAAO,GAAG;AAAA,MAC7B,KAAK,KAAK,KAAK,MAAM,KAAK,WAAW,QAAQ,IAAI,IAAI,CAAC,CAAC;AAAA,IACxD,EAAO,SAAI,KAAK,WAAW,QAAQ,GAAG;AAAA,MACrC,QAAQ,KAAK,MAAM,KAAK,WAAW,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK;AAAA,IAC7D;AAAA,EACD;AAAA,EACA,OAAO,EAAE,OAAO,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK;AAAA,CAAI,IAAI,UAAU;AAAA;;;ARlUrE,SAAS,WAAW,CAAC,QAAyC;AAAA,EAC7D,IAAI,CAAC;AAAA,IAAQ,OAAO,CAAC,IAAI,EAAE;AAAA,EAC3B,QAAQ,aAAa,eAAe,OAAO,MAAM,MAAM;AAAA,EACvD,OAAO,CAAC,aAAa,UAAU;AAAA;AAIhC,SAAS,SAAS,CAAC,GAAkB,GAAiC;AAAA,EACrE,OAAO,IAAI,MAAM,YAAY,CAAC;AAAA,EAC9B,OAAO,IAAI,MAAM,YAAY,CAAC;AAAA,EAC9B,OAAO,KAAK,MAAO,OAAO,MAAM,MAAM,KAAM,IAAI;AAAA;AAUjD,SAAS,cAAc,CAAC,QAerB;AAAA,EACF,OAAO;AAAA,IACN,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,EACjB;AAAA;AA0CD,SAAS,gBAAgB,CAAC,SAAyB;AAAA,EAClD,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA;AAMlC,SAAS,aAAa,CAAC,SAA0B;AAAA,EAChD,IAAI;AAAA,IACH,QAAQ,aAAa,IAAI,IAAI,OAAO;AAAA,IACpC,OACC,aAAa,eACb,aAAa,eACb,aAAa,SACb,aAAa,WACb,SAAS,WAAW,MAAM;AAAA,IAE1B,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAIF,SAAS,mBAAmB,CAClC,SACgB;AAAA,EAChB,MAAM,UAAU,iBAAiB,eAAe,QAAQ,OAAO,CAAC;AAAA,EAIhE,MAAM,SAAS,cAAc,QAAQ,QAAQ,OAAO;AAAA,EACpD,MAAM,SAAS,QAAQ,UAAU;AAAA,EACjC,MAAM,cAAc,OAA+B;AAAA,IAClD,eAAe;AAAA,OACX,SAAS,EAAE,eAAe,UAAU,SAAS,IAAI,CAAC;AAAA,EACvD;AAAA,EACA,MAAM,YAAY,QAAQ,cAAc,CAAC,OAAO,SAAS,MAAM,OAAO,IAAI;AAAA,EAC1E,MAAM,SAAS,QAAQ;AAAA,EAOvB,MAAM,aACL,WAAW,QAAQ,QAAQ,WAAW,YAAY,YAAY;AAAA,EAI/D,IACC,WAAW,QACX,QAAQ,WAAW,OAAO,KAC1B,CAAC,cAAc,OAAO,GACrB;AAAA,IACD,MAAM,IAAI,gBACT,mCAAmC,2KACnC,GACD;AAAA,EACD;AAAA,EAYA,IAAI,aAA8C;AAAA,EAClD,SAAS,OAAO,GAA6B;AAAA,IAC5C,IAAI;AAAA,MAAY,OAAO;AAAA,IACvB,MAAM,WAAW,YAAY;AAAA,MAC5B,IAAI,OAAO,WAAW,UAAU;AAAA,QAC/B,OAAO;AAAA,UACN,OAAO,SAAQ,aAAa,OAAO,SAAS;AAAA,UAC5C,cAAc,OAAO;AAAA,UACrB,WAAW,SAAQ,qBAAqB,OAAO,SAAS;AAAA,QACzD;AAAA,MACD;AAAA,MACA,IAAI;AAAA,MACJ,IAAI;AAAA,QACH,MAAM,MAAM,UAAU,GAAG,oCAAoC;AAAA,QAC5D,MAAM;AAAA,QACP,MAAM,IAAI,mBACT,sCAAsC,kDACtC,GACA,WACA,yBACD;AAAA;AAAA,MAED,IAAI,CAAC,IAAI,IAAI;AAAA,QACZ,IAAI,IAAI,UAAU,OAAO,IAAI,WAAW,KAAK;AAAA,UAC5C,MAAM,IAAI,mBACT,gCAAgC,IAAI,uBACpC,IAAI,QACJ,WACA,yBACD;AAAA,QACD;AAAA,QACA,MAAM,IAAI,sBACT,gCAAgC,IAAI,UACrC;AAAA,MACD;AAAA,MACA,MAAM,OAAQ,MAAM,IAAI,KAAK;AAAA,MAI7B,IAAI,CAAC,KAAK,gBAAgB;AAAA,QACzB,MAAM,IAAI,sBAAsB,mCAAmC;AAAA,MACpE;AAAA,MACA,OAAO;AAAA,QACN,OAAO,KAAK,UAAU,SAAQ,aAAa,KAAK,cAAc;AAAA,QAC9D,cAAc,KAAK;AAAA,QACnB,WAAW,SAAQ,qBAAqB,KAAK,cAAc;AAAA,MAC5D;AAAA,OACE;AAAA,IACH,aAAa;AAAA,IACb,QAAQ,MAAM,MAAM;AAAA,MACnB,IAAI,eAAe;AAAA,QAAS,aAAa;AAAA,KACzC;AAAA,IACD,OAAO;AAAA;AAAA,EAKR,eAAe,UAAU,CACxB,eAC2B;AAAA,IAC3B,IAAI,MAAM,MAAM,QAAQ;AAAA,IACxB,IAAI,CAAC,iBAAiB,kBAAkB,IAAI;AAAA,MAAO,OAAO;AAAA,IAC1D,IAAI,OAAO,WAAW,UAAU;AAAA,MAC/B,MAAM,IAAI,sBACT,6BAA6B,wCAAwC,IAAI,SAC1E;AAAA,IACD;AAAA,IAGA,aAAa;AAAA,IACb,MAAM,MAAM,QAAQ;AAAA,IACpB,IAAI,kBAAkB,IAAI,OAAO;AAAA,MAChC,MAAM,IAAI,sBACT,6BAA6B,wDAC9B;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,MAAM,QAAQ,mBAAmB;AAAA,IAChC,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,gBAAgB,QAAQ,uBAAuB;AAAA,IAC/C,kBAAkB,aAAa,MAAM,QAAQ,GAAG;AAAA,EACjD,CAAC;AAAA,EAED,eAAe,OAAU,CAAC,MAA0B;AAAA,IACnD,MAAM,WAAW,MAAM,UAAU,GAAG,UAAU,QAAQ;AAAA,MACrD,SAAS,YAAY;AAAA,IACtB,CAAC;AAAA,IACD,IAAI,CAAC,SAAS;AAAA,MAAI,MAAM,gBAAgB,QAAQ;AAAA,IAChD,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,IACjC,IAAI,eAAe,OAAO;AAAA,MACzB,MAAM,YAAY,SAAS,QAAQ,IAAI,aAAa;AAAA,MACpD,IAAI,CAAC,WAAW;AAAA,QAGf,IAAI,eAAe,UAAU;AAAA,UAC5B,MAAM,IAAI,sBAAsB,kCAAkC;AAAA,QACnE;AAAA,MACD,EAAO;AAAA,QACN,MAAM,MAAM,MAAM,WAAW,SAAS,QAAQ,IAAI,mBAAmB,CAAC;AAAA,QAGtE,IAAI,CAAC,SAAQ,cAAc,MAAM,WAAW,IAAI,SAAS,GAAG;AAAA,UAC3D,MAAM,IAAI;AAAA,QACX;AAAA;AAAA,IAEF;AAAA,IACA,OAAO,KAAK,MAAM,IAAI;AAAA;AAAA,EAQvB,MAAM,cAAoC,CAAC,WAC1C,WAAW,MAAiC;AAAA,EAE7C,SAAS,MAAM,CAAC,MAAc,MAAyC;AAAA,IACtE,OAAO,QACN,sBAAsB,mBAAmB,IAAI,IAAI,WAAW;AAAA,MAC3D,OAAO,MAAM,UAAU,YAAY,YAAY;AAAA,IAChD,CAAC,GACF;AAAA;AAAA,EAGD,SAAS,UAAU,CAClB,QACC;AAAA,IACD,OAAO,QACN,qBAAqB,WAAW;AAAA,MAC/B,OAAO,OAAO,UAAU,YAAY,YAAY;AAAA,MAChD,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IACf,CAAC,GACF;AAAA;AAAA,EAID,MAAM,cAAc,CAAC,WAA8B,WAAW,MAAM;AAAA,EAEpE,SAAS,aAAa,CAAC,SAAuC;AAAA,IAC7D,OAAO,UAAU,KAAK,UAAU,OAAO,IAAI;AAAA;AAAA,EAG5C,eAAe,UAAU,CACxB,SAAkC,CAAC,GACF;AAAA,IACjC,IAAI,OAAO,UAAU,WAAW;AAAA,MAC/B,OAAO,QACN,qBAAqB,WAAW;AAAA,QAC/B,OAAO;AAAA,QACP,QAAQ,OAAO;AAAA,QACf,aAAa,OAAO;AAAA,QACpB,WAAW,OAAO;AAAA,QAClB,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,MACjB,CAAC,GACF;AAAA,IACD;AAAA,IACA,OAAO,QACN,qBAAqB,WAAW;AAAA,MAC/B,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,MAClB,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,kBAAkB,OAAO;AAAA,MACzB,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAElB,OAAO,OAAO,UAAU,OAAO,OAAO;AAAA,MACtC,SAAS,cAAc,OAAO,OAAO;AAAA,IACtC,CAAC,GACF;AAAA;AAAA,EASD,SAAS,aAIR,CAGA,QAGsC;AAAA,IACtC,MAAM,SAAS,OAAO,UAAU,OAAO,KAAK,OAAO,OAAO,IAAI,CAAC;AAAA,IAI/D,IAAI,OAAO,WAAW,KAAK,CAAC,OAAO,SAAS;AAAA,MAC3C,MAAM,IAAI,gBACT,uDACA,GACD;AAAA,IACD;AAAA,IACA,IAAI,OAAO,SAAS,KAAK,CAAC,OAAO,MAAM,CAAC,OAAO,SAAS;AAAA,MACvD,MAAM,IAAI,gBACT,2DACA,GACD;AAAA,IACD;AAAA,IACA,MAAM,WAAW,OAAO;AAAA,IAcxB,MAAM,UAAU,CAAC,WAChB,OAAO,UAAU,OAAO,IAAI,MAAM,IAAI;AAAA,IAEvC,MAAM,UAAsD,OAC3D,QACA,UACA,QACI;AAAA,MAGJ,WAAW,SAAS,QAAQ;AAAA,QAC3B,MAAM,WAAW,OAAO,OAAO,CAAC,UAC/B,MAAM,SAAS,SAAS,KAAK,CAC9B;AAAA,QACA,IAAI,SAAS,WAAW;AAAA,UAAG;AAAA,QAC3B,MAAM,WAAW,SAAS,QAAQ,QAAQ,GAAG,GAAG;AAAA,MACjD;AAAA,MAGA,MAAM,cAAc,OAAO;AAAA,MAM3B,OAAQ,MAAM,cAAc,QAAQ,MAAM,GAAG,UAAU,GAAG;AAAA;AAAA,IAM3D,OAAO,qBAA0B;AAAA,MAChC,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,eAAe,OAAO;AAAA,SACnB,eAAe,MAAM;AAAA,MACxB,WAAW,OAAO,aAAa;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,kBAAkB,OAAO;AAAA,MACzB,gBAAgB,OAAO;AAAA,MACvB,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,IACd,CAAC;AAAA;AAAA,EASF,SAAS,cAAc,CACtB,SAA+B,CAAC,GACD;AAAA,IAC/B,OAAO,sBAAsB;AAAA,MAC5B,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO,aAAa;AAAA,MAC/B,YAAY,OAAO,cAAc;AAAA,SAC9B,eAAe,MAAM;AAAA,MACxB,QAAQ,OAAO;AAAA,MACf;AAAA,IACD,CAAC;AAAA;AAAA,EAGF,SAAS,YAAY,CACpB,SAAoC,CAAC,GACP;AAAA,IAC9B,OAAO,oBAAoB;AAAA,MAC1B,YAAY,OAAO;AAAA,SAGhB,eAAe,MAAM;AAAA,MACxB,WAAW,OAAO,aAAa;AAAA,MAC/B,gBAAgB,OAAO;AAAA,MACvB,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,QAAQ,OAAO;AAAA,MACf;AAAA,IACD,CAAC;AAAA;AAAA,EAGF,SAAS,eAAe,CACvB,QACsB;AAAA,IACtB,OAAO,uBAAuB;AAAA,MAC7B;AAAA,MACA,SAAS,YAAY;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,kBAAkB,OAAO;AAAA,MACzB,cAAc,OAAO;AAAA,MAKrB;AAAA,IACD,CAAC;AAAA;AAAA,EASF,SAAS,oBAAiC,CACzC,QAGsC;AAAA,IACtC,OAAO,qBAA0B;AAAA,MAChC,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,eAAe,OAAO;AAAA,MACtB,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO,aAAa;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,SAAS,OAAO;AAAA,MAGhB,SAAS,OAAO;AAAA,MAChB,kBAAkB,OAAO;AAAA,MACzB,gBAAgB,OAAO;AAAA,MACvB,UAAU,OAAO;AAAA,MACjB,eAAe,OAAO;AAAA,MACtB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,IACd,CAAC;AAAA;AAAA,EAOF,SAAS,qBAAkC,CAC1C,QAKsC;AAAA,IACtC,IAAI,OAAO,UAAU;AAAA,MAAW,OAAO,qBAAqB,MAAM;AAAA,IAClE,OAAO,cAAc,MAAM;AAAA;AAAA,EAG5B,OAAO;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,MAEP,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,WACL,OAAM,CAAC,QAAmC;AAAA,QAC/C,MAAM,aACL,OAAO,SAAS,YAAY,OAAQ,OAAO,QAAQ;AAAA,QACpD,MAAM,YAAY,aAAa,YAAY,UAAU,EAAE,KAAK;AAAA,QAC5D,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAMlC,MAAM,QAAQ,SAAS,MACrB,OAAO,CAAC,SAAS,KAAK,YAAY,SAAS,EAC3C,OACA,CAAC,SACA,eAAe,QACf,KAAK,eAAe,QACpB,UAAU,YAAY,KAAK,UAAU,MAAM,UAC7C,EACC,KACA,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,QACzD;AAAA,QACD,WAAW,QAAQ,OAAO;AAAA,UACzB,IAAI,OAAO,QAAQ;AAAA,YAAS;AAAA,UAC5B,MAAM,OAAO,WAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAAA,QACnD;AAAA,QAIA,MAAM,OAAO,UAAU,YAAY,SAAS,uBAAuB;AAAA,QACnE,OAAO,qBAAqB;AAAA,UAC3B,YAAY;AAAA,UACZ,MAAM,OAAO,QAAQ;AAAA,UACrB,WAAW,OAAO,aAAa;AAAA,UAG/B,OAAO,OAAO;AAAA,UACd,UAAU,OAAO;AAAA,UACjB,SAAS,OAAO;AAAA,UAChB;AAAA,UACA,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO;AAAA,UAChB,gBAAgB,OAAO;AAAA,UACvB,UAAU,OAAO;AAAA,UACjB,eAAe,OAAO;AAAA,UACtB,QAAQ,OAAO;AAAA,QAChB,CAAC;AAAA;AAAA,IAEH;AAAA,IACA,QAAQ;AAAA,MACP,QAAS,CACR,cACA,SAEA,QACC,sBAAsB,mBAAmB,OAAO,YAAY,CAAC,WAAW,WACvE,EAAE,OAAO,MAAM,UAAU,YAAY,YAAY,UAAU,CAC5D,GACD;AAAA,IACF;AAAA,IACA,QAAQ,EAAE,MAAM,WAA8C;AAAA,IAC9D;AAAA,IACA,WAAY,CAAC,QAAgB,SAC5B,QACC,yBAAyB,SAAS,WAAW;AAAA,MAC5C,OAAO,MAAM,UAAU,YAAY,YAAY;AAAA,IAChD,CAAC,GACF;AAAA,IACD,KAAM,CAAC,SACN,QACC,kBAAkB,WAAW;AAAA,MAC5B,OAAO,MAAM,UAAU,YAAY,YAAY;AAAA,IAChD,CAAC,GACF;AAAA,EACF;AAAA;;;ASxpBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACjBA;AAAA;AAAA;AAAA;",
18
18
  "debugId": "BCE700F13CFF926A64756E2164756E21",