@query-farm/vgi-rpc 0.6.4 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/access-log.d.ts +55 -0
  2. package/dist/access-log.d.ts.map +1 -0
  3. package/dist/arrow/impl-arrowjs/index.d.ts +96 -0
  4. package/dist/arrow/impl-arrowjs/index.d.ts.map +1 -0
  5. package/dist/arrow/impl-flechette/index.d.ts +102 -0
  6. package/dist/arrow/impl-flechette/index.d.ts.map +1 -0
  7. package/dist/arrow/impl-flechette/message-meta.d.ts +11 -0
  8. package/dist/arrow/impl-flechette/message-meta.d.ts.map +1 -0
  9. package/dist/arrow/index.d.ts +4 -0
  10. package/dist/arrow/index.d.ts.map +1 -0
  11. package/dist/arrow/predicates.d.ts +44 -0
  12. package/dist/arrow/predicates.d.ts.map +1 -0
  13. package/dist/arrow/types.d.ts +62 -0
  14. package/dist/arrow/types.d.ts.map +1 -0
  15. package/dist/auth.d.ts +5 -0
  16. package/dist/auth.d.ts.map +1 -1
  17. package/dist/client/capabilities.d.ts +25 -0
  18. package/dist/client/capabilities.d.ts.map +1 -0
  19. package/dist/client/connect.d.ts +10 -0
  20. package/dist/client/connect.d.ts.map +1 -1
  21. package/dist/client/introspect.d.ts +21 -0
  22. package/dist/client/introspect.d.ts.map +1 -1
  23. package/dist/client/ipc.d.ts +8 -2
  24. package/dist/client/ipc.d.ts.map +1 -1
  25. package/dist/client/oauth.d.ts +9 -0
  26. package/dist/client/oauth.d.ts.map +1 -1
  27. package/dist/client/pipe.d.ts +24 -0
  28. package/dist/client/pipe.d.ts.map +1 -1
  29. package/dist/client/stream.d.ts +19 -2
  30. package/dist/client/stream.d.ts.map +1 -1
  31. package/dist/client/types.d.ts +23 -0
  32. package/dist/client/types.d.ts.map +1 -1
  33. package/dist/client/uploadUrl.d.ts +25 -0
  34. package/dist/client/uploadUrl.d.ts.map +1 -0
  35. package/dist/constants.d.ts +30 -2
  36. package/dist/constants.d.ts.map +1 -1
  37. package/dist/crypto.d.ts +22 -0
  38. package/dist/crypto.d.ts.map +1 -0
  39. package/dist/dispatch/describe.d.ts +10 -6
  40. package/dist/dispatch/describe.d.ts.map +1 -1
  41. package/dist/dispatch/stream.d.ts +2 -2
  42. package/dist/dispatch/stream.d.ts.map +1 -1
  43. package/dist/dispatch/unary.d.ts +2 -2
  44. package/dist/dispatch/unary.d.ts.map +1 -1
  45. package/dist/errors.d.ts +64 -1
  46. package/dist/errors.d.ts.map +1 -1
  47. package/dist/external.d.ts +27 -5
  48. package/dist/external.d.ts.map +1 -1
  49. package/dist/http/auth.d.ts +13 -0
  50. package/dist/http/auth.d.ts.map +1 -1
  51. package/dist/http/bearer.d.ts.map +1 -1
  52. package/dist/http/common.d.ts +43 -7
  53. package/dist/http/common.d.ts.map +1 -1
  54. package/dist/http/dispatch.d.ts +20 -2
  55. package/dist/http/dispatch.d.ts.map +1 -1
  56. package/dist/http/handler.d.ts.map +1 -1
  57. package/dist/http/index.d.ts +1 -0
  58. package/dist/http/index.d.ts.map +1 -1
  59. package/dist/http/jwt.d.ts +1 -0
  60. package/dist/http/jwt.d.ts.map +1 -1
  61. package/dist/http/mtls.d.ts +9 -1
  62. package/dist/http/mtls.d.ts.map +1 -1
  63. package/dist/http/oauth-pkce.d.ts +141 -0
  64. package/dist/http/oauth-pkce.d.ts.map +1 -0
  65. package/dist/http/pages.d.ts +3 -0
  66. package/dist/http/pages.d.ts.map +1 -1
  67. package/dist/http/sticky.d.ts +124 -0
  68. package/dist/http/sticky.d.ts.map +1 -0
  69. package/dist/http/token.d.ts +43 -12
  70. package/dist/http/token.d.ts.map +1 -1
  71. package/dist/http/types.d.ts +68 -5
  72. package/dist/http/types.d.ts.map +1 -1
  73. package/dist/index.d.ts +6 -4
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +1275 -3511
  76. package/dist/index.js.map +20 -38
  77. package/dist/launcher/hash.d.ts +22 -0
  78. package/dist/launcher/hash.d.ts.map +1 -0
  79. package/dist/launcher/index.d.ts +23 -0
  80. package/dist/launcher/index.d.ts.map +1 -0
  81. package/dist/launcher/launch.d.ts +27 -0
  82. package/dist/launcher/launch.d.ts.map +1 -0
  83. package/dist/launcher/lock.d.ts +19 -0
  84. package/dist/launcher/lock.d.ts.map +1 -0
  85. package/dist/launcher/serve-unix.d.ts +55 -0
  86. package/dist/launcher/serve-unix.d.ts.map +1 -0
  87. package/dist/launcher/state.d.ts +71 -0
  88. package/dist/launcher/state.d.ts.map +1 -0
  89. package/dist/otel.d.ts.map +1 -1
  90. package/dist/protocol.d.ts +19 -2
  91. package/dist/protocol.d.ts.map +1 -1
  92. package/dist/schema.d.ts +45 -18
  93. package/dist/schema.d.ts.map +1 -1
  94. package/dist/server.d.ts +23 -2
  95. package/dist/server.d.ts.map +1 -1
  96. package/dist/types.d.ts +270 -12
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/util/gzip.d.ts +10 -0
  99. package/dist/util/gzip.d.ts.map +1 -0
  100. package/dist/util/schema.d.ts +3 -15
  101. package/dist/util/schema.d.ts.map +1 -1
  102. package/dist/util/web-crypto.d.ts +22 -0
  103. package/dist/util/web-crypto.d.ts.map +1 -0
  104. package/dist/util/zstd.d.ts +26 -3
  105. package/dist/util/zstd.d.ts.map +1 -1
  106. package/dist/wire/opaque.d.ts +11 -0
  107. package/dist/wire/opaque.d.ts.map +1 -0
  108. package/dist/wire/reader.d.ts +5 -5
  109. package/dist/wire/reader.d.ts.map +1 -1
  110. package/dist/wire/request.d.ts +11 -3
  111. package/dist/wire/request.d.ts.map +1 -1
  112. package/dist/wire/response.d.ts +6 -6
  113. package/dist/wire/response.d.ts.map +1 -1
  114. package/dist/wire/writer.d.ts +49 -39
  115. package/dist/wire/writer.d.ts.map +1 -1
  116. package/package.json +35 -21
  117. package/src/access-log.ts +200 -0
  118. package/src/arrow/impl-arrowjs/index.ts +433 -0
  119. package/src/arrow/impl-flechette/index.ts +414 -0
  120. package/src/arrow/impl-flechette/message-meta.ts +174 -0
  121. package/src/arrow/index.ts +89 -0
  122. package/src/arrow/predicates.ts +56 -0
  123. package/src/arrow/types.ts +73 -0
  124. package/src/auth.ts +5 -0
  125. package/src/client/capabilities.ts +84 -0
  126. package/src/client/connect.ts +113 -26
  127. package/src/client/introspect.ts +74 -38
  128. package/src/client/ipc.ts +37 -27
  129. package/src/client/oauth.ts +9 -0
  130. package/src/client/pipe.ts +36 -9
  131. package/src/client/stream.ts +43 -20
  132. package/src/client/types.ts +23 -0
  133. package/src/client/uploadUrl.ts +169 -0
  134. package/src/constants.ts +34 -2
  135. package/src/crypto.ts +95 -0
  136. package/src/dispatch/describe.ts +146 -107
  137. package/src/dispatch/stream.ts +53 -24
  138. package/src/dispatch/unary.ts +5 -4
  139. package/src/errors.ts +87 -0
  140. package/src/external.ts +49 -30
  141. package/src/http/auth.ts +13 -0
  142. package/src/http/bearer.ts +2 -5
  143. package/src/http/common.ts +91 -23
  144. package/src/http/dispatch.ts +373 -46
  145. package/src/http/handler.ts +790 -68
  146. package/src/http/index.ts +1 -0
  147. package/src/http/jwt.ts +1 -0
  148. package/src/http/mtls.ts +25 -3
  149. package/src/http/oauth-pkce.ts +1035 -0
  150. package/src/http/pages.ts +30 -15
  151. package/src/http/sticky.ts +429 -0
  152. package/src/http/token.ts +170 -75
  153. package/src/http/types.ts +69 -5
  154. package/src/index.ts +40 -1
  155. package/src/launcher/hash.ts +104 -0
  156. package/src/launcher/index.ts +35 -0
  157. package/src/launcher/launch.ts +284 -0
  158. package/src/launcher/lock.ts +171 -0
  159. package/src/launcher/serve-unix.ts +386 -0
  160. package/src/launcher/state.ts +257 -0
  161. package/src/otel.ts +39 -33
  162. package/src/protocol.ts +30 -3
  163. package/src/schema.ts +107 -56
  164. package/src/server.ts +196 -20
  165. package/src/types.ts +376 -18
  166. package/src/util/gzip.ts +63 -0
  167. package/src/util/schema.ts +4 -22
  168. package/src/util/web-crypto.ts +98 -0
  169. package/src/util/zstd.ts +133 -14
  170. package/src/wire/opaque.ts +37 -0
  171. package/src/wire/reader.ts +5 -4
  172. package/src/wire/request.ts +67 -8
  173. package/src/wire/response.ts +51 -85
  174. package/src/wire/writer.ts +165 -69
  175. package/dist/util/conform.d.ts +0 -18
  176. package/dist/util/conform.d.ts.map +0 -1
  177. package/src/util/conform.ts +0 -94
package/dist/index.js.map CHANGED
@@ -1,44 +1,26 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/util/zstd.ts", "../src/errors.ts", "../src/auth.ts", "../src/constants.ts", "../src/external.ts", "../src/wire/response.ts", "../src/http/common.ts", "../src/util/conform.ts", "../src/client/introspect.ts", "../src/client/ipc.ts", "../src/wire/reader.ts", "../src/client/stream.ts", "../src/client/connect.ts", "../src/client/oauth.ts", "../src/client/pipe.ts", "../src/http/auth.ts", "../src/http/bearer.ts", "../src/http/handler.ts", "../src/types.ts", "../src/http/dispatch.ts", "../src/dispatch/describe.ts", "../src/util/schema.ts", "../src/wire/request.ts", "../src/http/token.ts", "../src/http/pages.ts", "../src/http/types.ts", "../node_modules/oauth4webapi/build/index.js", "../src/http/jwt.ts", "../src/http/mtls.ts", "../src/protocol.ts", "../src/schema.ts", "../src/server.ts", "../src/dispatch/stream.ts", "../src/dispatch/unary.ts", "../src/wire/writer.ts"],
3
+ "sources": ["../node_modules/fzstd/esm/index.mjs", "../src/util/zstd.ts", "../src/constants.ts", "../src/errors.ts", "../src/arrow/impl-arrowjs/index.ts", "../src/external.ts", "../src/wire/response.ts", "../src/http/common.ts", "../src/client/capabilities.ts", "../src/client/introspect.ts", "../src/client/ipc.ts", "../src/wire/reader.ts", "../src/client/stream.ts", "../src/client/uploadUrl.ts", "../src/client/connect.ts", "../src/client/oauth.ts", "../src/client/pipe.ts"],
4
4
  "sourcesContent": [
5
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Cross-runtime zstd compression/decompression.\n *\n * Uses Bun.zstd* when running on Bun, otherwise falls back to node:zlib\n * (available on Node.js 22.15+ and Deno 2.6.9+).\n */\n\nimport * as zlib from \"node:zlib\";\n\nconst isBun = typeof globalThis.Bun !== \"undefined\";\n\n/** Compress data with zstd at the given level (1-22). */\nexport function zstdCompress(data: Uint8Array, level: number): Uint8Array<ArrayBuffer> {\n if (isBun) {\n return new Uint8Array(Bun.zstdCompressSync(data, { level }));\n }\n const fn = (zlib as any).zstdCompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\"zstd is not available in this runtime. \" + \"Requires Bun, Node.js >= 22.15, or Deno >= 2.6.9.\");\n }\n return new Uint8Array(\n fn(data, {\n params: {\n [(zlib.constants as any).ZSTD_c_compressionLevel]: level,\n },\n }),\n );\n}\n\n/** Decompress zstd-compressed data. */\nexport function zstdDecompress(data: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isBun) {\n return new Uint8Array(Bun.zstdDecompressSync(data));\n }\n const fn = (zlib as any).zstdDecompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\"zstd is not available in this runtime. \" + \"Requires Bun, Node.js >= 22.15, or Deno >= 2.6.9.\");\n }\n return new Uint8Array(fn(data));\n}\n",
6
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Error thrown when the server encounters an RPC protocol error. */\nexport class RpcError extends Error {\n constructor(\n public readonly errorType: string,\n public readonly errorMessage: string,\n public readonly remoteTraceback: string,\n ) {\n super(`${errorType}: ${errorMessage}`);\n this.name = \"RpcError\";\n }\n}\n\n/** Error thrown when the client sends an unsupported request version. */\nexport class VersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionError\";\n }\n}\n",
7
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RpcError } from \"./errors.js\";\n\n/** Authentication context available to RPC handlers. */\nexport class AuthContext {\n readonly domain: string;\n readonly authenticated: boolean;\n readonly principal: string | null;\n readonly claims: Record<string, any>;\n\n constructor(domain: string, authenticated: boolean, principal: string | null, claims: Record<string, any> = {}) {\n this.domain = domain;\n this.authenticated = authenticated;\n this.principal = principal;\n this.claims = claims;\n }\n\n /** Create an unauthenticated (anonymous) context. */\n static anonymous(): AuthContext {\n return new AuthContext(\"\", false, null);\n }\n\n /** Throw an RpcError if this context is not authenticated. */\n requireAuthenticated(): void {\n if (!this.authenticated) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n }\n}\n",
8
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Well-known metadata keys matching Python's metadata.py */\n\nexport const RPC_METHOD_KEY = \"vgi_rpc.method\";\nexport const LOG_LEVEL_KEY = \"vgi_rpc.log_level\";\nexport const LOG_MESSAGE_KEY = \"vgi_rpc.log_message\";\nexport const LOG_EXTRA_KEY = \"vgi_rpc.log_extra\";\nexport const REQUEST_VERSION_KEY = \"vgi_rpc.request_version\";\nexport const REQUEST_VERSION = \"1\";\n\nexport const SERVER_ID_KEY = \"vgi_rpc.server_id\";\nexport const REQUEST_ID_KEY = \"vgi_rpc.request_id\";\n\nexport const PROTOCOL_NAME_KEY = \"vgi_rpc.protocol_name\";\nexport const DESCRIBE_VERSION_KEY = \"vgi_rpc.describe_version\";\nexport const DESCRIBE_VERSION = \"3\";\n\nexport const DESCRIBE_METHOD_NAME = \"__describe__\";\n\nexport const STATE_KEY = \"vgi_rpc.stream_state#b64\";\n\nexport const LOCATION_KEY = \"vgi_rpc.location\";\nexport const LOCATION_SHA256_KEY = \"vgi_rpc.location.sha256\";\n",
9
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * External storage support for large Arrow IPC batches.\n *\n * When a batch exceeds a configurable threshold, it is serialized to IPC,\n * optionally compressed with zstd, and uploaded to pluggable storage.\n * The batch is replaced with a zero-row \"pointer batch\" containing the\n * download URL and SHA-256 checksum in metadata.\n */\n\nimport { type RecordBatch, RecordBatchReader, RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\nimport { LOCATION_KEY, LOCATION_SHA256_KEY, LOG_LEVEL_KEY } from \"./constants.js\";\nimport { zstdCompress, zstdDecompress } from \"./util/zstd.js\";\nimport { buildEmptyBatch } from \"./wire/response.js\";\n\n// ---------------------------------------------------------------------------\n// Interfaces and configuration\n// ---------------------------------------------------------------------------\n\n/** Pluggable storage backend for uploading large batches. */\nexport interface ExternalStorage {\n /** Upload IPC data and return a URL for retrieval. */\n upload(data: Uint8Array, contentEncoding: string): Promise<string>;\n}\n\n/** Configuration for external storage of large batches. */\nexport interface ExternalLocationConfig {\n /** Storage backend for uploading. */\n storage: ExternalStorage;\n /** Minimum batch byte size to trigger externalization. Default: 1MB. */\n externalizeThresholdBytes?: number;\n /** Optional zstd compression for uploaded data. */\n compression?: { algorithm: \"zstd\"; level?: number };\n /** URL validator called before fetching. Throw to reject. Default: HTTPS-only. */\n urlValidator?: ((url: string) => void) | null;\n}\n\nconst DEFAULT_THRESHOLD = 1_048_576; // 1 MB\n\n// ---------------------------------------------------------------------------\n// URL validation\n// ---------------------------------------------------------------------------\n\n/** Default validator that rejects non-HTTPS URLs. */\nexport function httpsOnlyValidator(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(`External location URL must use HTTPS, got \"${parsed.protocol}\"`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 helpers\n// ---------------------------------------------------------------------------\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n // Copy to a plain ArrayBuffer to satisfy Web Crypto API type requirements\n const buf = new ArrayBuffer(data.byteLength);\n new Uint8Array(buf).set(data);\n const hash = await crypto.subtle.digest(\"SHA-256\", buf);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\n/** Returns true if the batch is a zero-row pointer to external data. */\nexport function isExternalLocationBatch(batch: RecordBatch): boolean {\n if (batch.numRows !== 0) return false;\n const meta = batch.metadata;\n if (!meta) return false;\n return meta.has(LOCATION_KEY) && !meta.has(LOG_LEVEL_KEY);\n}\n\n// ---------------------------------------------------------------------------\n// Pointer batch creation\n// ---------------------------------------------------------------------------\n\n/** Create a zero-row pointer batch with location URL and optional SHA-256. */\nexport function makeExternalLocationBatch(schema: Schema, url: string, sha256?: string): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOCATION_KEY, url);\n if (sha256) {\n metadata.set(LOCATION_SHA256_KEY, sha256);\n }\n return buildEmptyBatch(schema, metadata);\n}\n\n// ---------------------------------------------------------------------------\n// IPC serialization helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeBatchToIpc(batch: RecordBatch): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, batch.schema);\n writer.write(batch);\n writer.close();\n return writer.toUint8Array(true);\n}\n\nfunction batchByteSize(batch: RecordBatch): number {\n // Arrow TS data.byteLength doesn't reflect actual data size.\n // Estimate from IPC serialization size for threshold check.\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, batch.schema);\n writer.write(batch);\n writer.close();\n return writer.toUint8Array(true).byteLength;\n}\n\n// ---------------------------------------------------------------------------\n// Write path: externalization\n// ---------------------------------------------------------------------------\n\n/**\n * Maybe externalize a batch if it exceeds the threshold.\n * Returns the original batch unchanged if below threshold or no config.\n */\nexport async function maybeExternalizeBatch(\n batch: RecordBatch,\n config?: ExternalLocationConfig | null,\n): Promise<RecordBatch> {\n if (!config?.storage) return batch;\n if (batch.numRows === 0) return batch;\n\n const threshold = config.externalizeThresholdBytes ?? DEFAULT_THRESHOLD;\n if (batchByteSize(batch) < threshold) return batch;\n\n // Serialize to IPC\n let ipcData = serializeBatchToIpc(batch);\n\n // Compute SHA-256 of raw IPC bytes (pre-compression)\n const checksum = await sha256Hex(ipcData);\n\n // Optionally compress\n let contentEncoding = \"\";\n if (config.compression?.algorithm === \"zstd\") {\n ipcData = zstdCompress(ipcData, config.compression.level ?? 3) as Uint8Array;\n contentEncoding = \"zstd\";\n }\n\n // Upload\n const url = await config.storage.upload(ipcData, contentEncoding);\n\n // Return pointer batch\n return makeExternalLocationBatch(batch.schema, url, checksum);\n}\n\n// ---------------------------------------------------------------------------\n// Read path: resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an external pointer batch by fetching the data from the URL.\n * Returns the original batch unchanged if not a pointer or no config.\n */\nexport async function resolveExternalLocation(\n batch: RecordBatch,\n config?: ExternalLocationConfig | null,\n): Promise<RecordBatch> {\n if (!config) return batch;\n if (!isExternalLocationBatch(batch)) return batch;\n\n const url = batch.metadata?.get(LOCATION_KEY);\n if (!url) return batch;\n\n // Validate URL\n const validator = config.urlValidator === null ? undefined : (config.urlValidator ?? httpsOnlyValidator);\n if (validator) {\n validator(url);\n }\n\n // Fetch\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`External location fetch failed: ${response.status} ${response.statusText} [url: ${url}]`);\n }\n let data = new Uint8Array(await response.arrayBuffer());\n\n // Decompress if needed\n const contentEncoding = response.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n data = new Uint8Array(zstdDecompress(data));\n }\n\n // Verify SHA-256 if present\n const expectedSha256 = batch.metadata?.get(LOCATION_SHA256_KEY);\n if (expectedSha256) {\n const actualSha256 = await sha256Hex(data);\n if (actualSha256 !== expectedSha256) {\n throw new Error(`SHA-256 checksum mismatch for ${url}: expected ${expectedSha256}, got ${actualSha256}`);\n }\n }\n\n // Parse IPC stream\n const reader = await RecordBatchReader.from(data);\n await reader.open();\n const resolved = reader.next();\n if (!resolved || resolved.done || !resolved.value) {\n throw new Error(`No data batch found in external IPC stream from ${url}`);\n }\n\n return resolved.value;\n}\n",
10
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Data,\n DataType,\n type Field,\n makeData,\n RecordBatch,\n type Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { LOG_EXTRA_KEY, LOG_LEVEL_KEY, LOG_MESSAGE_KEY, REQUEST_ID_KEY, SERVER_ID_KEY } from \"../constants.js\";\n\n/**\n * Coerce values for Int64 schema fields from Number to BigInt.\n * Handles both single values and arrays. Returns a new record with coerced values.\n */\nexport function coerceInt64(schema: Schema, values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = { ...values };\n for (const field of schema.fields) {\n const val = result[field.name];\n if (val === undefined) continue;\n if (!DataType.isInt(field.type) || (field.type as any).bitWidth !== 64) continue;\n\n if (Array.isArray(val)) {\n result[field.name] = val.map((v: any) => (typeof v === \"number\" ? BigInt(v) : v));\n } else if (typeof val === \"number\") {\n result[field.name] = BigInt(val);\n }\n }\n return result;\n}\n\n/**\n * Build a 1-row result batch with optional metadata.\n * For unary methods, `values` maps field names to single values.\n */\nexport function buildResultBatch(\n schema: Schema,\n values: Record<string, any>,\n serverId: string,\n requestId: string | null,\n): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n if (schema.fields.length === 0) {\n return buildEmptyBatch(schema, metadata);\n }\n\n // Validate required fields\n for (const field of schema.fields) {\n if (values[field.name] === undefined && !field.nullable) {\n const got = Object.keys(values);\n throw new TypeError(`Handler result missing required field '${field.name}'. Got keys: [${got.join(\", \")}]`);\n }\n }\n\n const coerced = coerceInt64(schema, values);\n\n const children = schema.fields.map((f: Field) => {\n const val = coerced[f.name];\n // Raw Data passthrough for Map_ types (whose .get() is broken in arrow-js)\n if (val instanceof Data) {\n return val;\n }\n const arr = vectorFromArray([val], f.type);\n return arr.data[0];\n });\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children,\n nullCount: 0,\n });\n\n return new RecordBatch(schema, data, metadata);\n}\n\n/**\n * Build a 0-row error batch with EXCEPTION metadata matching Python's Message.from_exception().\n */\nexport function buildErrorBatch(schema: Schema, error: Error, serverId: string, requestId: string | null): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, \"EXCEPTION\");\n metadata.set(LOG_MESSAGE_KEY, `${error.constructor.name}: ${error.message}`);\n\n const extra: Record<string, any> = {\n exception_type: error.constructor.name,\n exception_message: error.message,\n traceback: error.stack ?? \"\",\n };\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row log batch.\n */\nexport function buildLogBatch(\n schema: Schema,\n level: string,\n message: string,\n extra?: Record<string, any>,\n serverId?: string,\n requestId?: string | null,\n): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, level);\n metadata.set(LOG_MESSAGE_KEY, message);\n if (extra) {\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n }\n if (serverId != null) {\n metadata.set(SERVER_ID_KEY, serverId);\n }\n if (requestId != null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Recursively create empty (0-row) Data for any Arrow type,\n * including complex types (Struct, List, FixedSizeList, Map).\n */\nfunction makeEmptyData(type: DataType): Data {\n if (DataType.isStruct(type)) {\n const children = type.children.map((f: Field) => makeEmptyData(f.type));\n return makeData({ type, length: 0, children, nullCount: 0 });\n }\n if (DataType.isList(type)) {\n const childData = makeEmptyData(type.children[0].type);\n return makeData({ type, length: 0, children: [childData], nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n if (DataType.isFixedSizeList(type)) {\n const childData = makeEmptyData(type.children[0].type);\n return makeData({ type, length: 0, child: childData, nullCount: 0 } as any);\n }\n if (DataType.isMap(type)) {\n const entryType = type.children[0]?.type;\n const entryData = entryType\n ? makeEmptyData(entryType)\n : makeData({ type: new Struct([]), length: 0, children: [], nullCount: 0 });\n return makeData({ type, length: 0, children: [entryData], nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n return makeData({ type, length: 0, nullCount: 0 });\n}\n\n/**\n * Build a 0-row batch from a schema with metadata.\n * Used for error/log batches.\n */\nexport function buildEmptyBatch(schema: Schema, metadata?: Map<string, string>): RecordBatch {\n const children = schema.fields.map((f: Field) => makeEmptyData(f.type));\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n\n return new RecordBatch(schema, data, metadata);\n}\n",
11
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type RecordBatch, RecordBatchReader, RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\nimport { conformBatchToSchema } from \"../util/conform.js\";\n\nexport const ARROW_CONTENT_TYPE = \"application/vnd.apache.arrow.stream\";\n\nexport class HttpRpcError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = \"HttpRpcError\";\n }\n}\n\n/** Serialize a schema + batches into a complete IPC stream as Uint8Array. */\nexport function serializeIpcStream(schema: Schema, batches: RecordBatch[]): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n for (const batch of batches) {\n writer.write(conformBatchToSchema(batch, schema));\n }\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/** Create a Response with Arrow IPC content type. Casts Uint8Array for TS lib compat. */\nexport function arrowResponse(body: Uint8Array, status = 200, extraHeaders?: Headers): Response {\n const headers = extraHeaders ?? new Headers();\n headers.set(\"Content-Type\", ARROW_CONTENT_TYPE);\n return new Response(body as unknown as BodyInit, { status, headers });\n}\n\n/** Read schema + first batch from an IPC stream body. */\nexport async function readRequestFromBody(body: Uint8Array): Promise<{ schema: Schema; batch: RecordBatch }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new HttpRpcError(\"Empty IPC stream: no schema\", 400);\n }\n const batches = reader.readAll();\n if (batches.length === 0) {\n throw new HttpRpcError(\"IPC stream contains no batches\", 400);\n }\n return { schema, batch: batches[0] };\n}\n",
12
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n type DataType,\n makeData,\n RecordBatch,\n type Schema,\n Struct,\n Type,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\n\n/** Return true when the source type's values can be losslessly read and\n * re-encoded into the target type (e.g., int32 float64). */\nfunction needsValueCast(src: DataType, dst: DataType): boolean {\n if (src.typeId === dst.typeId) return false;\n // Same broad family (e.g. Float Float64) clone is sufficient.\n if (src.constructor === dst.constructor) return false;\n return true;\n}\n\n/** Check if a type is a numeric type we can cast between.\n * Uses typeId instead of instanceof because IPC-deserialized types\n * may be generic (e.g., Int_ instead of Int64). */\nfunction isNumeric(t: DataType): boolean {\n return t.typeId === Type.Int || t.typeId === Type.Float;\n}\n\n/**\n * Rebuild a batch's data to match the given schema's field types.\n *\n * Batches deserialized from IPC streams (e.g., from PyArrow) may use generic\n * types (Float) instead of specific ones (Float64). Arrow-JS's\n * RecordBatchStreamWriter silently drops batches whose child Data types don't\n * match the writer's schema. Cloning each child Data with the schema's field\n * type fixes the type metadata while preserving the underlying buffers.\n *\n * This is also used to cast compatible input types (e.g., int32→float64,\n * float32→float64) when the input batch schema doesn't exactly match the\n * method's declared input schema. When the underlying buffer layout differs\n * (e.g., 4-byte int32 vs 8-byte float64), we read the values and build a\n * new vector with the target type.\n */\nexport function conformBatchToSchema(batch: RecordBatch, schema: Schema): RecordBatch {\n if (batch.numRows === 0) return batch;\n\n // Validate field count and names match before attempting any cast.\n if (batch.schema.fields.length !== schema.fields.length) {\n throw new TypeError(`Field count mismatch: expected ${schema.fields.length}, got ${batch.schema.fields.length}`);\n }\n for (let i = 0; i < schema.fields.length; i++) {\n if (batch.schema.fields[i].name !== schema.fields[i].name) {\n throw new TypeError(\n `Field name mismatch at index ${i}: expected '${schema.fields[i].name}', got '${batch.schema.fields[i].name}'`,\n );\n }\n }\n\n const children = schema.fields.map((f, i) => {\n const srcChild = batch.data.children[i];\n const srcType = srcChild.type;\n const dstType = f.type;\n\n if (!needsValueCast(srcType, dstType)) {\n return srcChild.clone(dstType);\n }\n\n // Numeric numeric: read values and rebuild with target type.\n if (isNumeric(srcType) && isNumeric(dstType)) {\n // Read source values via the batch's column vector.\n const col = batch.getChildAt(i)!;\n const values: number[] = [];\n for (let r = 0; r < batch.numRows; r++) {\n const v = col.get(r);\n values.push(typeof v === \"bigint\" ? Number(v) : (v as number));\n }\n return vectorFromArray(values, dstType).data[0];\n }\n\n // Fallback: clone type metadata (works for same-layout types).\n return srcChild.clone(dstType);\n });\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: batch.numRows,\n children,\n nullCount: batch.data.nullCount,\n nullBitmap: batch.data.nullBitmap,\n });\n return new RecordBatch(schema, data, batch.metadata);\n}\n",
13
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema as ArrowSchema, type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME, PROTOCOL_NAME_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { buildRequestIpc, dispatchLogOrError, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage } from \"./types.js\";\n\nexport interface MethodInfo {\n name: string;\n type: \"unary\" | \"stream\";\n paramsSchema: Schema;\n resultSchema: Schema;\n inputSchema?: Schema;\n outputSchema?: Schema;\n headerSchema?: Schema;\n doc?: string;\n paramTypes?: Record<string, string>;\n defaults?: Record<string, any>;\n}\n\nexport interface ServiceDescription {\n protocolName: string;\n methods: MethodInfo[];\n}\n\n/** Deserialize a schema from IPC bytes (schema message + EOS). */\nasync function deserializeSchema(bytes: Uint8Array): Promise<Schema> {\n const reader = await RecordBatchReader.from(bytes);\n await reader.open();\n return reader.schema!;\n}\n\n/**\n * Parse a __describe__ response from batches into a ServiceDescription.\n * Reusable across transports (HTTP, pipe, subprocess).\n */\nexport async function parseDescribeResponse(\n batches: RecordBatch[],\n onLog?: (msg: LogMessage) => void,\n): Promise<ServiceDescription> {\n // Find the data batch (skip log/error batches)\n let dataBatch = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n dataBatch = batch;\n }\n\n if (!dataBatch) {\n throw new Error(\"Empty __describe__ response\");\n }\n\n // Extract metadata from batch\n const meta = dataBatch.metadata;\n const protocolName = meta?.get(PROTOCOL_NAME_KEY) ?? \"\";\n\n const methods: MethodInfo[] = [];\n for (let i = 0; i < dataBatch.numRows; i++) {\n const name = dataBatch.getChildAt(0)!.get(i) as string; // name\n const methodType = dataBatch.getChildAt(1)!.get(i) as string; // method_type\n const doc = dataBatch.getChildAt(2)?.get(i) as string | null; // doc\n const _hasReturn = dataBatch.getChildAt(3)!.get(i) as boolean; // has_return\n const paramsIpc = dataBatch.getChildAt(4)!.get(i) as Uint8Array; // params_schema_ipc\n const resultIpc = dataBatch.getChildAt(5)!.get(i) as Uint8Array; // result_schema_ipc\n const paramTypesJson = dataBatch.getChildAt(6)?.get(i) as string | null; // param_types_json\n const paramDefaultsJson = dataBatch.getChildAt(7)?.get(i) as string | null; // param_defaults_json\n const hasHeader = dataBatch.getChildAt(8)!.get(i) as boolean; // has_header\n const headerIpc = dataBatch.getChildAt(9)?.get(i) as Uint8Array | null; // header_schema_ipc\n\n const paramsSchema = await deserializeSchema(paramsIpc);\n const resultSchema = await deserializeSchema(resultIpc);\n\n let paramTypes: Record<string, string> | undefined;\n if (paramTypesJson) {\n try {\n paramTypes = JSON.parse(paramTypesJson);\n } catch {}\n }\n\n let defaults: Record<string, any> | undefined;\n if (paramDefaultsJson) {\n try {\n defaults = JSON.parse(paramDefaultsJson);\n } catch {}\n }\n\n const info: MethodInfo = {\n name,\n type: methodType as \"unary\" | \"stream\",\n paramsSchema,\n resultSchema,\n doc: doc ?? undefined,\n paramTypes,\n defaults,\n };\n\n // For stream methods, result_schema_ipc actually holds the output schema\n if (methodType === \"stream\") {\n info.outputSchema = resultSchema;\n }\n\n if (hasHeader && headerIpc) {\n info.headerSchema = await deserializeSchema(headerIpc);\n }\n\n methods.push(info);\n }\n\n return { protocolName, methods };\n}\n\n/**\n * Send a __describe__ request and return a ServiceDescription.\n */\nexport async function httpIntrospect(\n baseUrl: string,\n options?: { prefix?: string; authorization?: string },\n): Promise<ServiceDescription> {\n const prefix = options?.prefix ?? \"\";\n const emptySchema = new ArrowSchema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n\n const response = await fetch(`${baseUrl}${prefix}/${DESCRIBE_METHOD_NAME}`, {\n method: \"POST\",\n headers,\n body: body as unknown as BodyInit,\n });\n if (response.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n const responseBody = new Uint8Array(await response.arrayBuffer());\n const { batches } = await readResponseBatches(responseBody);\n\n return parseDescribeResponse(batches);\n}\n",
14
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Float64,\n Int64,\n makeData,\n RecordBatch,\n RecordBatchReader,\n type Schema,\n Struct,\n Utf8,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport {\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n RPC_METHOD_KEY,\n} from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Infer an Arrow DataType from a JS value. */\nexport function inferArrowType(value: any): DataType {\n if (typeof value === \"string\") return new Utf8();\n if (typeof value === \"boolean\") return new Bool();\n if (typeof value === \"bigint\") return new Int64();\n if (typeof value === \"number\") return new Float64();\n if (value instanceof Uint8Array) return new Binary();\n return new Utf8(); // fallback\n}\n\n/**\n * Recursively coerce JS values to match Arrow type expectations.\n * Converts numbers to BigInt for Int64 fields, and recurses into Map/List types.\n */\nfunction coerceForArrow(type: DataType, value: any): any {\n if (value == null) return value;\n\n // Int64: convert number BigInt\n if (DataType.isInt(type) && (type as any).bitWidth === 64) {\n if (typeof value === \"number\") return BigInt(value);\n return value;\n }\n\n // Map_: coerce map values recursively\n if (DataType.isMap(type)) {\n if (value instanceof Map) {\n const entriesField = (type as any).children[0];\n const valueType = entriesField.type.children[1].type;\n const coerced = new Map();\n for (const [k, v] of value) {\n coerced.set(k, coerceForArrow(valueType, v));\n }\n return coerced;\n }\n return value;\n }\n\n // List: coerce elements recursively\n if (DataType.isList(type)) {\n if (Array.isArray(value)) {\n const elemType = (type as any).children[0].type;\n return value.map((v: any) => coerceForArrow(elemType, v));\n }\n return value;\n }\n\n return value;\n}\n\n/**\n * Build a 1-row Arrow IPC request batch with method metadata.\n */\nexport function buildRequestIpc(schema: Schema, params: Record<string, any>, method: string): Uint8Array {\n const metadata = new Map<string, string>();\n metadata.set(RPC_METHOD_KEY, method);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n\n if (schema.fields.length === 0) {\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(schema, data, metadata);\n return serializeIpcStream(schema, [batch]);\n }\n\n const children = schema.fields.map((f) => {\n const val = coerceForArrow(f.type, params[f.name]);\n return vectorFromArray([val], f.type).data[0];\n });\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children,\n nullCount: 0,\n });\n\n const batch = new RecordBatch(schema, data, metadata);\n return serializeIpcStream(schema, [batch]);\n}\n\n/**\n * Read schema + all batches from an IPC stream body.\n */\nexport async function readResponseBatches(body: Uint8Array): Promise<{ schema: Schema; batches: RecordBatch[] }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Empty IPC stream: no schema\", \"\");\n }\n const batches = reader.readAll();\n return { schema, batches };\n}\n\n/**\n * Check if a zero-row batch carries log/error metadata.\n * If EXCEPTION → throw RpcError.\n * If other level call onLog.\n * Returns true if the batch was consumed as a log/error.\n */\nexport function dispatchLogOrError(batch: RecordBatch, onLog?: (msg: LogMessage) => void): boolean {\n const meta = batch.metadata;\n if (!meta) return false;\n\n const level = meta.get(LOG_LEVEL_KEY);\n if (!level) return false;\n\n const message = meta.get(LOG_MESSAGE_KEY) ?? \"\";\n\n if (level === \"EXCEPTION\") {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let errorType = \"RpcError\";\n let errorMessage = message;\n let traceback = \"\";\n if (extraStr) {\n try {\n const extra = JSON.parse(extraStr);\n errorType = extra.exception_type ?? \"RpcError\";\n errorMessage = extra.exception_message ?? message;\n traceback = extra.traceback ?? \"\";\n } catch {}\n }\n throw new RpcError(errorType, errorMessage, traceback);\n }\n\n if (onLog) {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let extra: Record<string, any> | undefined;\n if (extraStr) {\n try {\n extra = JSON.parse(extraStr);\n } catch {}\n }\n onLog({ level, message, extra });\n }\n\n return true;\n}\n\n/**\n * Extract all rows from a batch as Record<string, any>[].\n * Converts BigInt to Number when safe.\n */\nexport function extractBatchRows(batch: RecordBatch): Record<string, any>[] {\n const rows: Record<string, any>[] = [];\n for (let r = 0; r < batch.numRows; r++) {\n const row: Record<string, any> = {};\n for (let i = 0; i < batch.schema.fields.length; i++) {\n const field = batch.schema.fields[i];\n let value = batch.getChildAt(i)?.get(r);\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n row[field.name] = value;\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Read sequential IPC streams from a response body.\n * Returns an IpcStreamReader for reading header + data streams.\n */\nexport async function readSequentialStreams(body: Uint8Array): Promise<IpcStreamReader> {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(body);\n controller.close();\n },\n });\n return IpcStreamReader.create(stream);\n}\n",
15
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\n\nexport interface StreamMessage {\n schema: Schema;\n batches: RecordBatch[];\n}\n\n/**\n * Reads sequential IPC streams from a byte source (e.g., process.stdin).\n * Uses autoDestroy: false + reset/open pattern to read multiple streams\n * from the same underlying byte source.\n */\nexport class IpcStreamReader {\n private reader: RecordBatchReader;\n private initialized = false;\n /** True once readNextBatch() returns null (EOS reached for current stream). */\n private streamEnded = false;\n\n private constructor(reader: RecordBatchReader) {\n this.reader = reader;\n }\n\n static async create(input: ReadableStream<Uint8Array> | NodeJS.ReadableStream): Promise<IpcStreamReader> {\n const reader = await RecordBatchReader.from(input as any);\n await reader.open({ autoDestroy: false });\n if (reader.closed) {\n throw new Error(\"Input stream closed before first IPC message\");\n }\n return new IpcStreamReader(reader);\n }\n\n /**\n * Read one complete IPC stream (schema + all batches).\n * Returns null on EOF (no more streams).\n */\n async readStream(): Promise<StreamMessage | null> {\n if (this.initialized) {\n // Advance to next stream\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n\n const schema = this.reader.schema;\n if (!schema) {\n return null;\n }\n\n const batches: RecordBatch[] = [];\n while (true) {\n const result = await this.reader.next();\n if (result.done) break;\n // Skip Arrow-JS synthetic placeholder for empty streams\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") break;\n batches.push(result.value);\n }\n\n return { schema, batches };\n }\n\n /**\n * Open the next IPC stream and return its schema.\n * Use readNextBatch() to read batches one at a time.\n * Returns null on EOF.\n */\n async openNextStream(): Promise<Schema | null> {\n if (this.initialized) {\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n this.streamEnded = false;\n return this.reader.schema ?? null;\n }\n\n /**\n * Read the next batch from the currently open IPC stream.\n * Returns null when the stream ends (EOS).\n *\n * Once EOS is reached, subsequent calls return null immediately without\n * reading from the underlying byte source. This prevents the Arrow-JS\n * reader from consuming bytes that belong to the next IPC stream.\n */\n async readNextBatch(): Promise<RecordBatch | null> {\n if (this.streamEnded) return null;\n const result = await this.reader.next();\n if (result.done) {\n this.streamEnded = true;\n return null;\n }\n // Arrow-JS synthesizes a placeholder batch for streams with a schema but\n // zero real batches. Treat it as EOS so callers don't block trying to\n // read more bytes from a stream that has already ended.\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") {\n this.streamEnded = true;\n return null;\n }\n return result.value;\n }\n\n async cancel(): Promise<void> {\n await this.reader.cancel();\n }\n}\n",
16
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Field, makeData, RecordBatch, Schema, Struct, vectorFromArray } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { dispatchLogOrError, extractBatchRows, inferArrowType, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Uint8Array;\ntype DecompressFn = (data: Uint8Array) => Uint8Array;\n\nexport class HttpStreamSession implements StreamSession {\n private _baseUrl: string;\n private _prefix: string;\n private _method: string;\n private _stateToken: string | null;\n private _outputSchema: Schema;\n private _inputSchema?: Schema;\n private _onLog?: (msg: LogMessage) => void;\n private _pendingBatches: RecordBatch[];\n private _finished: boolean;\n private _header: Record<string, any> | null;\n private _compressionLevel?: number;\n private _compressFn?: CompressFn;\n private _decompressFn?: DecompressFn;\n private _authorization?: string;\n private _externalConfig?: ExternalLocationConfig;\n\n constructor(opts: {\n baseUrl: string;\n prefix: string;\n method: string;\n stateToken: string | null;\n outputSchema: Schema;\n inputSchema?: Schema;\n onLog?: (msg: LogMessage) => void;\n pendingBatches: RecordBatch[];\n finished: boolean;\n header: Record<string, any> | null;\n compressionLevel?: number;\n compressFn?: CompressFn;\n decompressFn?: DecompressFn;\n authorization?: string;\n externalConfig?: ExternalLocationConfig;\n }) {\n this._baseUrl = opts.baseUrl;\n this._prefix = opts.prefix;\n this._method = opts.method;\n this._stateToken = opts.stateToken;\n this._outputSchema = opts.outputSchema;\n this._inputSchema = opts.inputSchema;\n this._onLog = opts.onLog;\n this._pendingBatches = opts.pendingBatches;\n this._finished = opts.finished;\n this._header = opts.header;\n this._compressionLevel = opts.compressionLevel;\n this._compressFn = opts.compressFn;\n this._decompressFn = opts.decompressFn;\n this._authorization = opts.authorization;\n this._externalConfig = opts.externalConfig;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n private _buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (this._compressionLevel != null) {\n headers[\"Content-Encoding\"] = \"zstd\";\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (this._authorization) {\n headers.Authorization = this._authorization;\n }\n return headers;\n }\n\n private _prepareBody(content: Uint8Array): Uint8Array {\n if (this._compressionLevel != null && this._compressFn) {\n return this._compressFn(content, this._compressionLevel);\n }\n return content;\n }\n\n private async _readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && this._decompressFn) {\n body = new Uint8Array(this._decompressFn(body));\n }\n return body;\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._stateToken === null) {\n throw new RpcError(\"ProtocolError\", \"Stream has finished \\u2014 no state token available\", \"\");\n }\n\n // We need to determine the input schema from the data.\n // Build a batch from the input rows using the output schema's field types.\n // For exchange, the input schema matches what the server expects.\n // We'll use the keys from input[0] to figure out columns.\n if (input.length === 0) {\n // Zero-row exchange: build an empty batch with state token.\n // Use inputSchema from __describe__ if available; fall back to\n // outputSchema so the server sees the correct column names.\n const zeroSchema = this._inputSchema ?? this._outputSchema;\n const emptyBatch = this._buildEmptyBatch(zeroSchema);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batchWithMeta = new RecordBatch(zeroSchema, emptyBatch.data, metadata);\n return this._doExchange(zeroSchema, [batchWithMeta]);\n }\n\n // Infer schema from first row values (input schema may differ from output).\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n // Find first non-null value to infer type\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n const nullable = input.some((row) => row[key] == null);\n return new Field(key, arrowType, nullable);\n });\n\n const inputSchema = new Schema(fields);\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batch = new RecordBatch(inputSchema, data, metadata);\n\n return this._doExchange(inputSchema, [batch]);\n }\n\n private async _doExchange(schema: Schema, batches: RecordBatch[]): Promise<Record<string, any>[]> {\n const body = serializeIpcStream(schema, batches);\n const resp = await fetch(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: this._prepareBody(body) as unknown as BodyInit,\n });\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n const responseBody = await this._readResponse(resp);\n const { batches: responseBatches } = await readResponseBatches(responseBody);\n\n let resultRows: Record<string, any>[] = [];\n for (const batch of responseBatches) {\n if (batch.numRows === 0) {\n // Could be log/error or state token\n dispatchLogOrError(batch, this._onLog);\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n continue;\n }\n\n // Data batch — extract state token from metadata\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n\n resultRows = extractBatchRows(batch);\n }\n\n return resultRows;\n }\n\n private _buildEmptyBatch(schema: Schema): RecordBatch {\n const children = schema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n return new RecordBatch(schema, data);\n }\n\n /**\n * Iterate over producer stream batches.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n // Yield pre-loaded batches from init\n for (let batch of this._pendingBatches) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, this._externalConfig);\n } else {\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n yield extractBatchRows(batch);\n }\n this._pendingBatches = [];\n\n if (this._finished) return;\n if (this._stateToken === null) return;\n\n // Follow continuation tokens\n while (true) {\n const responseBody = await this._sendContinuation(this._stateToken);\n const { batches } = await readResponseBatches(responseBody);\n\n let gotContinuation = false;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for continuation token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n gotContinuation = true;\n continue;\n }\n // Check for external location pointer\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, this._externalConfig);\n } else {\n // Log/error batch\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n\n yield extractBatchRows(batch);\n }\n\n if (!gotContinuation) break;\n }\n }\n\n private async _sendContinuation(token: string): Promise<Uint8Array> {\n const emptySchema = new Schema([]);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, token);\n\n const structType = new Struct(emptySchema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(emptySchema, data, metadata);\n const body = serializeIpcStream(emptySchema, [batch]);\n\n const resp = await fetch(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: this._prepareBody(body) as unknown as BodyInit,\n });\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n return this._readResponse(resp);\n }\n\n close(): void {\n // No-op for HTTP (stateless)\n }\n}\n",
17
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RecordBatch, Schema } from \"@query-farm/apache-arrow\";\nimport { LOG_LEVEL_KEY, STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport {\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n readResponseBatches,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Uint8Array;\ntype DecompressFn = (data: Uint8Array) => Uint8Array;\n\nexport interface RpcClient {\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n describe(): Promise<ServiceDescription>;\n close(): void;\n}\n\nexport function httpConnect(baseUrl: string, options?: HttpConnectOptions): RpcClient {\n const prefix = (options?.prefix ?? \"\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n const authorization = options?.authorization;\n const externalConfig = options?.externalLocation;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n compressionLoaded = true;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null) {\n headers[\"Content-Encoding\"] = \"zstd\";\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (authorization) {\n headers.Authorization = authorization;\n }\n return headers;\n }\n\n function prepareBody(content: Uint8Array): Uint8Array {\n if (compressionLevel != null && compressFn) {\n return compressFn(content, compressionLevel);\n }\n return content;\n }\n\n function checkAuth(resp: Response): void {\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n const desc = await httpIntrospect(baseUrl, { prefix, authorization });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, externalConfig);\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}/init`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null) ??\n (pendingBatches.length > 0 ? pendingBatches[0].schema : null) ??\n info.outputSchema ??\n info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n authorization,\n externalConfig,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n return httpIntrospect(baseUrl, { prefix });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
18
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** RFC 9728 OAuth Protected Resource Metadata (client-side response). */\nexport interface OAuthResourceMetadataResponse {\n resource: string;\n authorizationServers: string[];\n scopesSupported?: string[];\n bearerMethodsSupported?: string[];\n resourceSigningAlgValuesSupported?: string[];\n resourceName?: string;\n resourceDocumentation?: string;\n resourcePolicyUri?: string;\n resourceTosUri?: string;\n /** OAuth client_id advertised by the server. */\n clientId?: string;\n /** OAuth client_secret advertised by the server. */\n clientSecret?: string;\n /** When true, use the OIDC id_token as the Bearer token instead of access_token. */\n useIdTokenAsBearer?: boolean;\n /** OAuth client_id for device code flow. */\n deviceCodeClientId?: string;\n /** OAuth client_secret for device code flow. */\n deviceCodeClientSecret?: string;\n}\n\nfunction parseMetadataJson(json: Record<string, any>): OAuthResourceMetadataResponse {\n const result: OAuthResourceMetadataResponse = {\n resource: json.resource,\n authorizationServers: json.authorization_servers,\n };\n if (json.scopes_supported) result.scopesSupported = json.scopes_supported;\n if (json.bearer_methods_supported) result.bearerMethodsSupported = json.bearer_methods_supported;\n if (json.resource_signing_alg_values_supported)\n result.resourceSigningAlgValuesSupported = json.resource_signing_alg_values_supported;\n if (json.resource_name) result.resourceName = json.resource_name;\n if (json.resource_documentation) result.resourceDocumentation = json.resource_documentation;\n if (json.resource_policy_uri) result.resourcePolicyUri = json.resource_policy_uri;\n if (json.resource_tos_uri) result.resourceTosUri = json.resource_tos_uri;\n if (json.client_id) result.clientId = json.client_id;\n if (json.client_secret) result.clientSecret = json.client_secret;\n if (json.use_id_token_as_bearer) result.useIdTokenAsBearer = json.use_id_token_as_bearer;\n if (json.device_code_client_id) result.deviceCodeClientId = json.device_code_client_id;\n if (json.device_code_client_secret) result.deviceCodeClientSecret = json.device_code_client_secret;\n return result;\n}\n\n/**\n * Discover OAuth Protected Resource Metadata (RFC 9728) from a vgi-rpc server.\n * Returns `null` if the server does not serve the well-known endpoint.\n */\nexport async function httpOAuthMetadata(\n baseUrl: string,\n prefix?: string,\n): Promise<OAuthResourceMetadataResponse | null> {\n const effectivePrefix = (prefix ?? \"\").replace(/\\/+$/, \"\");\n const metadataUrl = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-protected-resource${effectivePrefix}`;\n\n try {\n return await fetchOAuthMetadata(metadataUrl);\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch OAuth Protected Resource Metadata from an explicit metadata URL.\n */\nexport async function fetchOAuthMetadata(metadataUrl: string): Promise<OAuthResourceMetadataResponse> {\n const response = await fetch(metadataUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${metadataUrl}: ${response.status}`);\n }\n const json = await response.json();\n return parseMetadataJson(json);\n}\n\n/**\n * Extract the `resource_metadata` URL from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no resource_metadata parameter is found.\n */\nexport function parseResourceMetadataUrl(wwwAuthenticate: string): string | null {\n // Parse Bearer challenge parameters per RFC 6750\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const metadataMatch = params.match(/resource_metadata=\"([^\"]+)\"/);\n if (!metadataMatch) return null;\n\n return metadataMatch[1];\n}\n\n/**\n * Extract the `client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_id parameter is found.\n */\nexport function parseClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const clientIdMatch = params.match(/client_id=\"([^\"]+)\"/);\n if (!clientIdMatch) return null;\n\n return clientIdMatch[1];\n}\n\n/**\n * Extract the `client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_secret parameter is found.\n */\nexport function parseClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `use_id_token_as_bearer` flag from a WWW-Authenticate Bearer challenge.\n * Returns `true` if the parameter is present and set to \"true\", `false` otherwise.\n */\nexport function parseUseIdTokenAsBearer(wwwAuthenticate: string): boolean {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return false;\n\n const params = bearerMatch[1];\n const match = params.match(/use_id_token_as_bearer=\"([^\"]+)\"/);\n if (!match) return false;\n\n return match[1] === \"true\";\n}\n\n/**\n * Extract the `device_code_client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_id parameter is found.\n */\nexport function parseDeviceCodeClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_id=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `device_code_client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_secret parameter is found.\n */\nexport function parseDeviceCodeClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n",
19
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Field,\n makeData,\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { type MethodInfo, parseDescribeResponse, type ServiceDescription } from \"./introspect.js\";\nimport { buildRequestIpc, dispatchLogOrError, extractBatchRows, inferArrowType } from \"./ipc.js\";\nimport type { LogMessage, PipeConnectOptions, StreamSession, SubprocessConnectOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n private _externalConfig?: ExternalLocationConfig;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n externalConfig?: ExternalLocationConfig;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n this._externalConfig = opts.externalConfig;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch)) {\n return await resolveExternalLocation(batch, this._externalConfig);\n }\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch, this._onLog)) {\n continue;\n }\n }\n\n return batch;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n const externalConfig = options?.externalLocation;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches, onLog);\n protocolName = desc.protocolName;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of response.batches) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, externalConfig);\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n externalConfig,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\nexport function subprocessConnect(cmd: string[], options?: SubprocessConnectOptions): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n externalLocation: options?.externalLocation,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n",
20
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { AuthContext } from \"../auth.js\";\n\n/** Async function that authenticates an incoming HTTP request. */\nexport type AuthenticateFn = (request: Request) => AuthContext | Promise<AuthContext>;\n\n/** RFC 9728 OAuth Protected Resource Metadata. */\nexport interface OAuthResourceMetadata {\n resource: string;\n authorizationServers: string[];\n scopesSupported?: string[];\n bearerMethodsSupported?: string[];\n resourceSigningAlgValuesSupported?: string[];\n resourceName?: string;\n resourceDocumentation?: string;\n resourcePolicyUri?: string;\n resourceTosUri?: string;\n /** OAuth client_id that clients should use with the authorization server. */\n clientId?: string;\n /** OAuth client_secret that clients should use with the authorization server. */\n clientSecret?: string;\n /** OAuth client_id for device code flow. */\n deviceCodeClientId?: string;\n /** OAuth client_secret for device code flow. */\n deviceCodeClientSecret?: string;\n /** When true, clients should use the OIDC id_token as the Bearer token instead of access_token. */\n useIdTokenAsBearer?: boolean;\n}\n\n/** Convert OAuthResourceMetadata to RFC 9728 snake_case JSON object. */\nexport function oauthResourceMetadataToJson(metadata: OAuthResourceMetadata): Record<string, any> {\n const json: Record<string, any> = {\n resource: metadata.resource,\n authorization_servers: metadata.authorizationServers,\n };\n if (metadata.scopesSupported) json.scopes_supported = metadata.scopesSupported;\n if (metadata.bearerMethodsSupported) json.bearer_methods_supported = metadata.bearerMethodsSupported;\n if (metadata.resourceSigningAlgValuesSupported)\n json.resource_signing_alg_values_supported = metadata.resourceSigningAlgValuesSupported;\n if (metadata.resourceName) json.resource_name = metadata.resourceName;\n if (metadata.resourceDocumentation) json.resource_documentation = metadata.resourceDocumentation;\n if (metadata.resourcePolicyUri) json.resource_policy_uri = metadata.resourcePolicyUri;\n if (metadata.resourceTosUri) json.resource_tos_uri = metadata.resourceTosUri;\n if (metadata.clientId) {\n if (!/^[A-Za-z0-9\\-._~]+$/.test(metadata.clientId)) {\n throw new Error(`Invalid client_id: must contain only URL-safe characters [A-Za-z0-9\\\\-._~]`);\n }\n json.client_id = metadata.clientId;\n }\n if (metadata.clientSecret) {\n if (!/^[A-Za-z0-9\\-._~]+$/.test(metadata.clientSecret)) {\n throw new Error(`Invalid client_secret: must contain only URL-safe characters [A-Za-z0-9\\\\-._~]`);\n }\n json.client_secret = metadata.clientSecret;\n }\n if (metadata.deviceCodeClientId) {\n if (!/^[A-Za-z0-9\\-._~]+$/.test(metadata.deviceCodeClientId)) {\n throw new Error(`Invalid device_code_client_id: must contain only URL-safe characters [A-Za-z0-9\\\\-._~]`);\n }\n json.device_code_client_id = metadata.deviceCodeClientId;\n }\n if (metadata.deviceCodeClientSecret) {\n if (!/^[A-Za-z0-9\\-._~]+$/.test(metadata.deviceCodeClientSecret)) {\n throw new Error(`Invalid device_code_client_secret: must contain only URL-safe characters [A-Za-z0-9\\\\-._~]`);\n }\n json.device_code_client_secret = metadata.deviceCodeClientSecret;\n }\n if (metadata.useIdTokenAsBearer) {\n json.use_id_token_as_bearer = true;\n }\n return json;\n}\n\n/** Compute the well-known path for OAuth Protected Resource Metadata. */\nexport function wellKnownPath(prefix: string): string {\n return `/.well-known/oauth-protected-resource${prefix}`;\n}\n\n/** Build a WWW-Authenticate header value with optional resource_metadata URL, client_id, client_secret, device_code_client_id, device_code_client_secret, and use_id_token_as_bearer. */\nexport function buildWwwAuthenticateHeader(\n metadataUrl?: string,\n clientId?: string,\n clientSecret?: string,\n useIdTokenAsBearer?: boolean,\n deviceCodeClientId?: string,\n deviceCodeClientSecret?: string,\n): string {\n let header = \"Bearer\";\n if (metadataUrl) {\n header += ` resource_metadata=\"${metadataUrl}\"`;\n }\n if (clientId) {\n header += `, client_id=\"${clientId}\"`;\n }\n if (clientSecret) {\n header += `, client_secret=\"${clientSecret}\"`;\n }\n if (deviceCodeClientId) {\n header += `, device_code_client_id=\"${deviceCodeClientId}\"`;\n }\n if (deviceCodeClientSecret) {\n header += `, device_code_client_secret=\"${deviceCodeClientSecret}\"`;\n }\n if (useIdTokenAsBearer) {\n header += `, use_id_token_as_bearer=\"true\"`;\n }\n return header;\n}\n",
21
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { timingSafeEqual } from \"node:crypto\";\nimport type { AuthContext } from \"../auth.js\";\nimport type { AuthenticateFn } from \"./auth.js\";\n\n/** Receives the raw bearer token string, returns an AuthContext on success. Must throw on failure. */\nexport type BearerValidateFn = (token: string) => AuthContext | Promise<AuthContext>;\n\n/**\n * Create a bearer-token authenticate callback.\n *\n * Extracts the `Authorization: Bearer <token>` header and delegates\n * validation to the user-supplied `validate` callback.\n */\nexport function bearerAuthenticate(options: { validate: BearerValidateFn }): AuthenticateFn {\n const { validate } = options;\n\n return async function authenticate(request: Request): Promise<AuthContext> {\n const authHeader = request.headers.get(\"Authorization\") ?? \"\";\n if (!authHeader.startsWith(\"Bearer \")) {\n throw new Error(\"Missing or invalid Authorization header\");\n }\n const token = authHeader.slice(7);\n return validate(token);\n };\n}\n\n/** Constant-time string comparison to prevent timing attacks on token lookup. */\nfunction safeEqual(a: string, b: string): boolean {\n const enc = new TextEncoder();\n const bufA = enc.encode(a);\n const bufB = enc.encode(b);\n if (bufA.byteLength !== bufB.byteLength) return false;\n return timingSafeEqual(bufA, bufB);\n}\n\n/**\n * Create a bearer-token authenticate callback from a static token map.\n *\n * Convenience wrapper around `bearerAuthenticate` that looks up the\n * token in a pre-built mapping using constant-time comparison.\n */\nexport function bearerAuthenticateStatic(options: {\n tokens: ReadonlyMap<string, AuthContext> | Record<string, AuthContext>;\n}): AuthenticateFn {\n const entries: [string, AuthContext][] =\n options.tokens instanceof Map ? [...options.tokens.entries()] : Object.entries(options.tokens);\n\n function validate(token: string): AuthContext {\n for (const [key, ctx] of entries) {\n if (safeEqual(token, key)) return ctx;\n }\n throw new Error(\"Unknown bearer token\");\n }\n\n return bearerAuthenticate({ validate });\n}\n\n/**\n * Check whether an error represents a credential rejection (should be\n * caught by the chain) vs a bug or authorization failure (should propagate).\n *\n * Mirrors Python's semantics where only `ValueError` is caught:\n * - Plain `Error` (constructor === Error) without `PermissionError` name → credential rejection\n * - `TypeError`, `RangeError`, etc. (Error subclasses) → bug, propagate\n * - `PermissionError` name → authorization failure, propagate\n * - Non-Error throws → propagate\n */\nfunction isCredentialError(err: unknown): err is Error {\n return err instanceof Error && err.constructor === Error && err.name !== \"PermissionError\";\n}\n\n/**\n * Chain multiple authenticate callbacks, trying each in order.\n *\n * Each authenticator is called in sequence. Plain `Error` (credential\n * rejection) causes the next authenticator to be tried. Error subclasses\n * (`TypeError`, `RangeError`, etc.), `PermissionError`-named errors, and\n * non-Error throws propagate immediately.\n *\n * @throws Error if no authenticators are provided.\n */\nexport function chainAuthenticate(...authenticators: AuthenticateFn[]): AuthenticateFn {\n if (authenticators.length === 0) {\n throw new Error(\"chainAuthenticate requires at least one authenticator\");\n }\n\n return async function authenticate(request: Request): Promise<AuthContext> {\n let lastError: Error | null = null;\n for (const authFn of authenticators) {\n try {\n return await authFn(request);\n } catch (err) {\n if (isCredentialError(err)) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n const error = new Error(\"No authenticator accepted the request\");\n if (lastError) error.cause = lastError;\n throw error;\n };\n}\n",
22
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { randomBytes } from \"node:crypto\";\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport type { AuthContext } from \"../auth.js\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport type { Protocol } from \"../protocol.js\";\nimport { type CallStatistics, type DispatchInfo, MethodType } from \"../types.js\";\nimport { zstdCompress, zstdDecompress } from \"../util/zstd.js\";\nimport { buildErrorBatch } from \"../wire/response.js\";\nimport { buildWwwAuthenticateHeader, oauthResourceMetadataToJson, wellKnownPath } from \"./auth.js\";\nimport { ARROW_CONTENT_TYPE, arrowResponse, HttpRpcError, serializeIpcStream } from \"./common.js\";\nimport {\n httpDispatchDescribe,\n httpDispatchStreamExchange,\n httpDispatchStreamInit,\n httpDispatchUnary,\n} from \"./dispatch.js\";\nimport { buildDescribePage, buildLandingPage, buildNotFoundPage } from \"./pages.js\";\nimport { type HttpHandlerOptions, jsonStateSerializer } from \"./types.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Create a fetch-compatible HTTP handler for a vgi-rpc Protocol.\n *\n * Compatible with Bun.serve(), Deno.serve(), Cloudflare Workers, and any\n * Web API runtime that uses the standard Request/Response types.\n *\n * @example\n * ```typescript\n * const handler = createHttpHandler(protocol);\n * Bun.serve({ port: 8080, fetch: handler });\n * ```\n */\nexport function createHttpHandler(\n protocol: Protocol,\n options?: HttpHandlerOptions,\n): (request: Request) => Response | Promise<Response> {\n const prefix = (options?.prefix ?? \"\").replace(/\\/+$/, \"\");\n const signingKey = options?.signingKey ?? randomBytes(32);\n const tokenTtl = options?.tokenTtl ?? 3600;\n const corsOrigins = options?.corsOrigins;\n const corsMaxAge = options?.corsMaxAge === undefined ? 7200 : options.corsMaxAge;\n const maxRequestBytes = options?.maxRequestBytes;\n const maxStreamResponseBytes = options?.maxStreamResponseBytes;\n const serverId = options?.serverId ?? crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n\n const authenticate = options?.authenticate;\n const oauthMetadata = options?.oauthResourceMetadata;\n\n const methods = protocol.getMethods();\n\n const compressionLevel = options?.compressionLevel;\n const stateSerializer = options?.stateSerializer ?? jsonStateSerializer;\n const dispatchHook = options?.dispatchHook;\n\n // HTML page configuration\n const enableLandingPage = options?.enableLandingPage ?? true;\n const enableDescribePage = options?.enableDescribePage ?? true;\n const enableNotFoundPage = options?.enableNotFoundPage ?? true;\n const displayName = options?.protocolName ?? protocol.name;\n const repoUrl = options?.repositoryUrl ?? null;\n\n // Pre-render HTML pages for zero per-request overhead\n const landingHtml = enableLandingPage\n ? buildLandingPage(displayName, serverId, enableDescribePage ? `${prefix}/describe` : null, repoUrl)\n : null;\n const describeHtml = enableDescribePage ? buildDescribePage(displayName, serverId, methods, repoUrl) : null;\n const notFoundHtml = enableNotFoundPage ? buildNotFoundPage(prefix, displayName) : null;\n\n const externalLocation = options?.externalLocation;\n\n // ctx is built per-request to include authContext; base fields set here\n const baseCtx = {\n signingKey,\n tokenTtl,\n serverId,\n maxStreamResponseBytes,\n stateSerializer,\n externalLocation,\n };\n\n function addCorsHeaders(headers: Headers, isOptions = false): void {\n if (corsOrigins) {\n headers.set(\"Access-Control-Allow-Origin\", corsOrigins);\n headers.set(\"Access-Control-Allow-Methods\", \"POST, OPTIONS\");\n headers.set(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n headers.set(\"Access-Control-Expose-Headers\", \"WWW-Authenticate, X-Request-ID, X-VGI-Content-Encoding\");\n if (isOptions && corsMaxAge != null) {\n headers.set(\"Access-Control-Max-Age\", String(corsMaxAge));\n }\n }\n }\n\n async function compressIfAccepted(response: Response, clientAcceptsZstd: boolean): Promise<Response> {\n if (compressionLevel == null || !clientAcceptsZstd) return response;\n const responseBody = new Uint8Array(await response.arrayBuffer());\n const compressed = zstdCompress(responseBody, compressionLevel);\n const headers = new Headers(response.headers);\n headers.set(\"Content-Encoding\", \"zstd\");\n return new Response(compressed as unknown as BodyInit, {\n status: response.status,\n headers,\n });\n }\n\n function makeErrorResponse(error: Error, statusCode: number, schema: Schema = EMPTY_SCHEMA): Response {\n const errBatch = buildErrorBatch(schema, error, serverId, null);\n const body = serializeIpcStream(schema, [errBatch]);\n const resp = arrowResponse(body, statusCode);\n addCorsHeaders(resp.headers);\n return resp;\n }\n\n return async function handler(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const path = url.pathname;\n\n // Well-known endpoint: RFC 9728 OAuth Protected Resource Metadata\n if (oauthMetadata && path === wellKnownPath(prefix)) {\n if (request.method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n const body = JSON.stringify(oauthResourceMetadataToJson(oauthMetadata));\n const headers = new Headers({\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"public, max-age=60\",\n });\n addCorsHeaders(headers);\n return new Response(body, { status: 200, headers });\n }\n\n // CORS preflight\n if (request.method === \"OPTIONS\") {\n if (path === `${prefix}/__capabilities__`) {\n const headers = new Headers();\n addCorsHeaders(headers, true);\n if (maxRequestBytes != null) {\n headers.set(\"VGI-Max-Request-Bytes\", String(maxRequestBytes));\n }\n return new Response(null, { status: 204, headers });\n }\n\n if (corsOrigins) {\n const headers = new Headers();\n addCorsHeaders(headers, true);\n return new Response(null, { status: 204, headers });\n }\n\n return new Response(null, { status: 405 });\n }\n\n // HTML pages for GET requests\n if (request.method === \"GET\") {\n // Landing page: GET {prefix}/ or GET {prefix}\n if (landingHtml && (path === prefix || path === `${prefix}/`)) {\n const headers = new Headers({ \"Content-Type\": \"text/html; charset=utf-8\" });\n addCorsHeaders(headers);\n return new Response(landingHtml, { status: 200, headers });\n }\n\n // Describe page: GET {prefix}/describe\n if (describeHtml && path === `${prefix}/describe`) {\n const headers = new Headers({ \"Content-Type\": \"text/html; charset=utf-8\" });\n addCorsHeaders(headers);\n return new Response(describeHtml, { status: 200, headers });\n }\n\n // 404 page for any other GET\n if (notFoundHtml) {\n const headers = new Headers({ \"Content-Type\": \"text/html; charset=utf-8\" });\n addCorsHeaders(headers);\n return new Response(notFoundHtml, { status: 404, headers });\n }\n\n return new Response(\"Not Found\", { status: 404 });\n }\n\n if (request.method !== \"POST\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Validate Content-Type\n const contentType = request.headers.get(\"Content-Type\");\n if (!contentType || !contentType.includes(ARROW_CONTENT_TYPE)) {\n return new Response(`Unsupported Media Type: expected ${ARROW_CONTENT_TYPE}`, { status: 415 });\n }\n\n // Check request body size\n if (maxRequestBytes != null) {\n const contentLength = request.headers.get(\"Content-Length\");\n if (contentLength && parseInt(contentLength, 10) > maxRequestBytes) {\n return new Response(\"Request body too large\", { status: 413 });\n }\n }\n\n const clientAcceptsZstd = (request.headers.get(\"Accept-Encoding\") ?? \"\").includes(\"zstd\");\n\n // Read body, decompressing if needed\n let body = new Uint8Array(await request.arrayBuffer());\n const contentEncoding = request.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n body = zstdDecompress(body);\n }\n\n // Build per-request dispatch context\n const ctx = { ...baseCtx } as typeof baseCtx & { authContext?: AuthContext };\n\n // Authentication\n if (authenticate) {\n try {\n ctx.authContext = await authenticate(request);\n } catch (error: any) {\n const headers = new Headers({ \"Content-Type\": \"text/plain\" });\n addCorsHeaders(headers);\n if (oauthMetadata) {\n const metadataUrl = new URL(request.url);\n metadataUrl.pathname = wellKnownPath(prefix);\n metadataUrl.search = \"\";\n headers.set(\n \"WWW-Authenticate\",\n buildWwwAuthenticateHeader(\n metadataUrl.toString(),\n oauthMetadata.clientId,\n oauthMetadata.clientSecret,\n oauthMetadata.useIdTokenAsBearer,\n oauthMetadata.deviceCodeClientId,\n oauthMetadata.deviceCodeClientSecret,\n ),\n );\n }\n return new Response(error.message || \"Unauthorized\", { status: 401, headers });\n }\n }\n\n // Route: {prefix}/__describe__\n if (path === `${prefix}/${DESCRIBE_METHOD_NAME}`) {\n try {\n const response = httpDispatchDescribe(protocol.name, methods, serverId);\n addCorsHeaders(response.headers);\n return compressIfAccepted(response, clientAcceptsZstd);\n } catch (error: any) {\n return compressIfAccepted(makeErrorResponse(error, 500), clientAcceptsZstd);\n }\n }\n\n // Parse method name and sub-path from URL\n if (!path.startsWith(`${prefix}/`)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const subPath = path.slice(prefix.length + 1);\n let methodName: string;\n let action: \"call\" | \"init\" | \"exchange\";\n\n if (subPath.endsWith(\"/init\")) {\n methodName = subPath.slice(0, -5);\n action = \"init\";\n } else if (subPath.endsWith(\"/exchange\")) {\n methodName = subPath.slice(0, -9);\n action = \"exchange\";\n } else {\n methodName = subPath;\n action = \"call\";\n }\n\n // Look up method\n const method = methods.get(methodName);\n if (!method) {\n const available = [...methods.keys()].sort();\n const err = new Error(`Unknown method: '${methodName}'. Available methods: [${available.join(\", \")}]`);\n return compressIfAccepted(makeErrorResponse(err, 404), clientAcceptsZstd);\n }\n\n const methodType = method.type === MethodType.UNARY ? \"unary\" : \"stream\";\n const info: DispatchInfo = { method: methodName, methodType, serverId, requestId: null };\n const stats: CallStatistics = {\n inputBatches: 0,\n outputBatches: 0,\n inputRows: 0,\n outputRows: 0,\n inputBytes: 0,\n outputBytes: 0,\n };\n\n const hookToken = dispatchHook?.onDispatchStart(info);\n let dispatchError: Error | undefined;\n\n try {\n let response: Response;\n\n if (action === \"call\") {\n if (method.type !== MethodType.UNARY) {\n throw new HttpRpcError(`Method '${methodName}' is a stream method. Use /init and /exchange endpoints.`, 400);\n }\n response = await httpDispatchUnary(method, body, ctx);\n } else if (action === \"init\") {\n if (method.type !== MethodType.STREAM) {\n throw new HttpRpcError(\n `Method '${methodName}' is a unary method. Use POST ${prefix}/${methodName} instead.`,\n 400,\n );\n }\n response = await httpDispatchStreamInit(method, body, ctx);\n } else {\n if (method.type !== MethodType.STREAM) {\n throw new HttpRpcError(\n `Method '${methodName}' is a unary method. Use POST ${prefix}/${methodName} instead.`,\n 400,\n );\n }\n response = await httpDispatchStreamExchange(method, body, ctx);\n }\n\n // Check if the dispatch function caught an error internally\n const internalError = (response as any).__dispatchError;\n if (internalError) {\n dispatchError = internalError instanceof Error ? internalError : new Error(String(internalError));\n }\n addCorsHeaders(response.headers);\n return compressIfAccepted(response, clientAcceptsZstd);\n } catch (error: any) {\n dispatchError = error instanceof Error ? error : new Error(String(error));\n if (error instanceof HttpRpcError) {\n return compressIfAccepted(makeErrorResponse(error, error.statusCode), clientAcceptsZstd);\n }\n return compressIfAccepted(makeErrorResponse(error, 500), clientAcceptsZstd);\n } finally {\n dispatchHook?.onDispatchEnd(hookToken, info, stats, dispatchError);\n }\n };\n}\n",
23
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatch, recordBatchFromArrays, type Schema } from \"@query-farm/apache-arrow\";\nimport { AuthContext } from \"./auth.js\";\nimport { buildLogBatch, coerceInt64 } from \"./wire/response.js\";\n\nexport enum MethodType {\n UNARY = \"unary\",\n STREAM = \"stream\",\n}\n\n/** Logging interface available to handlers. */\nexport interface LogContext {\n clientLog(level: string, message: string, extra?: Record<string, string>): void;\n}\n\n/** Extended context with authentication info, available to handlers. */\nexport interface CallContext extends LogContext {\n readonly auth: AuthContext;\n}\n\n/** Handler for unary (request-response) RPC methods. */\nexport type UnaryHandler = (\n params: Record<string, any>,\n ctx: LogContext,\n) => Promise<Record<string, any>> | Record<string, any>;\n\n/** Initialization function for producer streams. Returns the initial state object. */\nexport type ProducerInit<S = any> = (params: Record<string, any>) => Promise<S> | S;\n/** Called repeatedly to produce output batches. Call `out.finish()` to end the stream. */\nexport type ProducerFn<S = any> = (state: S, out: OutputCollector) => Promise<void> | void;\n\n/** Initialization function for exchange streams. Returns the initial state object. */\nexport type ExchangeInit<S = any> = (params: Record<string, any>) => Promise<S> | S;\n/** Called once per input batch. Must emit exactly one output batch per call. */\nexport type ExchangeFn<S = any> = (state: S, input: RecordBatch, out: OutputCollector) => Promise<void> | void;\n\n/** Produces a header batch sent before the first output batch in a stream. */\nexport type HeaderInit = (params: Record<string, any>, state: any, ctx: LogContext) => Record<string, any>;\n\nexport interface MethodDefinition {\n name: string;\n type: MethodType;\n paramsSchema: Schema;\n resultSchema: Schema;\n outputSchema?: Schema;\n inputSchema?: Schema;\n handler?: UnaryHandler;\n producerInit?: ProducerInit;\n producerFn?: ProducerFn;\n exchangeInit?: ExchangeInit;\n exchangeFn?: ExchangeFn;\n headerSchema?: Schema;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n}\n\n/** Metadata passed to dispatch hooks before and after RPC method execution. */\nexport interface DispatchInfo {\n /** RPC method name. */\n method: string;\n /** \"unary\" or \"stream\". */\n methodType: string;\n /** Server identifier. */\n serverId: string;\n /** Client-supplied request identifier, or null. */\n requestId: string | null;\n}\n\n/** Per-call I/O counters, matching Python's CallStatistics. */\nexport interface CallStatistics {\n inputBatches: number;\n outputBatches: number;\n inputRows: number;\n outputRows: number;\n inputBytes: number;\n outputBytes: number;\n}\n\n/** Opaque token returned by onDispatchStart, passed back to onDispatchEnd. */\nexport type HookToken = unknown;\n\n/**\n * Observability hook called around RPC dispatch.\n * Implementations must be safe for concurrent use (HTTP transport is concurrent).\n */\nexport interface DispatchHook {\n onDispatchStart(info: DispatchInfo): HookToken;\n onDispatchEnd(token: HookToken, info: DispatchInfo, stats: CallStatistics, error?: Error): void;\n}\n\nexport interface EmittedBatch {\n batch: RecordBatch;\n metadata?: Map<string, string>;\n}\n\n/**\n * Accumulates output batches during a produce/exchange call.\n * Enforces that exactly one data batch is emitted per call (plus any number of log batches).\n */\nexport class OutputCollector implements CallContext {\n private _batches: EmittedBatch[] = [];\n private _dataBatchIdx: number | null = null;\n private _finished = false;\n private _producerMode: boolean;\n private _outputSchema: Schema;\n private _serverId: string;\n private _requestId: string | null;\n readonly auth: AuthContext;\n\n constructor(\n outputSchema: Schema,\n producerMode = true,\n serverId = \"\",\n requestId: string | null = null,\n authContext?: AuthContext,\n ) {\n this._outputSchema = outputSchema;\n this._producerMode = producerMode;\n this._serverId = serverId;\n this._requestId = requestId;\n this.auth = authContext ?? AuthContext.anonymous();\n }\n\n get outputSchema(): Schema {\n return this._outputSchema;\n }\n\n get finished(): boolean {\n return this._finished;\n }\n\n get batches(): EmittedBatch[] {\n return this._batches;\n }\n\n /** Emit a pre-built RecordBatch as the data batch for this call. */\n emit(batch: RecordBatch, metadata?: Map<string, string>): void;\n /** Emit a data batch from column arrays keyed by field name. Int64 Number values are coerced to BigInt. */\n emit(columns: Record<string, any[]>): void;\n emit(batchOrColumns: RecordBatch | Record<string, any[]>, metadata?: Map<string, string>): void {\n let batch: RecordBatch;\n if (batchOrColumns instanceof RecordBatch) {\n batch = batchOrColumns;\n } else {\n const coerced = coerceInt64(this._outputSchema, batchOrColumns);\n batch = recordBatchFromArrays(coerced, this._outputSchema);\n }\n if (this._dataBatchIdx !== null) {\n throw new Error(\"Only one data batch may be emitted per call\");\n }\n this._dataBatchIdx = this._batches.length;\n this._batches.push({ batch, metadata });\n }\n\n /** Single-row convenience. Wraps each value in `[value]` then calls `emit()`. */\n emitRow(values: Record<string, any>): void {\n const columns: Record<string, any[]> = {};\n for (const [key, value] of Object.entries(values)) {\n columns[key] = [value];\n }\n this.emit(columns);\n }\n\n /** Signal stream completion for producer streams. Throws if called on exchange streams. */\n finish(): void {\n if (!this._producerMode) {\n throw new Error(\n \"finish() is not allowed on exchange streams; \" + \"exchange streams must emit exactly one data batch per call\",\n );\n }\n this._finished = true;\n }\n\n /** Emit a zero-row client-directed log batch. */\n clientLog(level: string, message: string, extra?: Record<string, string>): void {\n const batch = buildLogBatch(this._outputSchema, level, message, extra, this._serverId, this._requestId);\n this._batches.push({ batch });\n }\n}\n",
24
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatch, RecordBatchReader, Schema } from \"@query-farm/apache-arrow\";\nimport type { AuthContext } from \"../auth.js\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { buildDescribeBatch, DESCRIBE_SCHEMA } from \"../dispatch/describe.js\";\nimport { type ExternalLocationConfig, maybeExternalizeBatch } from \"../external.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { conformBatchToSchema } from \"../util/conform.js\";\nimport { serializeSchema } from \"../util/schema.js\";\nimport { parseRequest } from \"../wire/request.js\";\nimport { buildEmptyBatch, buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport { arrowResponse, HttpRpcError, readRequestFromBody, serializeIpcStream } from \"./common.js\";\nimport { packStateToken, unpackStateToken } from \"./token.js\";\nimport type { StateSerializer } from \"./types.js\";\n\nasync function deserializeSchema(bytes: Uint8Array): Promise<Schema> {\n const reader = await RecordBatchReader.from(bytes);\n await reader.open();\n return reader.schema!;\n}\n\nconst EMPTY_SCHEMA = new Schema([]);\n\nexport interface DispatchContext {\n signingKey: Uint8Array;\n tokenTtl: number;\n serverId: string;\n maxStreamResponseBytes?: number;\n stateSerializer: StateSerializer;\n authContext?: AuthContext;\n externalLocation?: ExternalLocationConfig;\n}\n\n/** Dispatch a __describe__ request. */\nexport function httpDispatchDescribe(\n protocolName: string,\n methods: Map<string, MethodDefinition>,\n serverId: string,\n): Response {\n const { batch } = buildDescribeBatch(protocolName, methods, serverId);\n const body = serializeIpcStream(DESCRIBE_SCHEMA, [batch]);\n return arrowResponse(body);\n}\n\n/** Dispatch a unary HTTP request. */\nexport async function httpDispatchUnary(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const schema = method.resultSchema;\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(`Method name in request '${parsed.methodName}' does not match URL '${method.name}'`, 400);\n }\n\n const out = new OutputCollector(schema, true, ctx.serverId, parsed.requestId, ctx.authContext);\n\n try {\n const result = await method.handler!(parsed.params, out);\n let resultBatch = buildResultBatch(schema, result, ctx.serverId, parsed.requestId);\n if (ctx.externalLocation) {\n resultBatch = await maybeExternalizeBatch(resultBatch, ctx.externalLocation);\n }\n const batches = [...out.batches.map((b) => b.batch), resultBatch];\n return arrowResponse(serializeIpcStream(schema, batches));\n } catch (error: any) {\n const errBatch = buildErrorBatch(schema, error, ctx.serverId, parsed.requestId);\n const response = arrowResponse(serializeIpcStream(schema, [errBatch]), 500);\n // Attach the error so the dispatch hook can see it\n (response as any).__dispatchError = error;\n return response;\n }\n}\n\n/** Dispatch a stream init HTTP request (producer or exchange). */\nexport async function httpDispatchStreamInit(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer = !!method.producerFn;\n const outputSchema = method.outputSchema!;\n const inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(`Method name in request '${parsed.methodName}' does not match URL '${method.name}'`, 400);\n }\n\n // Init state\n let state: any;\n try {\n if (isProducer) {\n state = await method.producerInit!(parsed.params);\n } else {\n state = await method.exchangeInit!(parsed.params);\n }\n } catch (error: any) {\n const errSchema = method.headerSchema ?? EMPTY_SCHEMA;\n const errBatch = buildErrorBatch(errSchema, error, ctx.serverId, parsed.requestId);\n const response = arrowResponse(serializeIpcStream(errSchema, [errBatch]), 500);\n (response as any).__dispatchError = error;\n return response;\n }\n\n // Support dynamic output schemas (same as pipe transport)\n const resolvedOutputSchema = state?.__outputSchema ?? outputSchema;\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n // Build header IPC stream if method has a header schema\n let headerBytes: Uint8Array | null = null;\n if (method.headerSchema && method.headerInit) {\n try {\n const headerOut = new OutputCollector(method.headerSchema, true, ctx.serverId, parsed.requestId, ctx.authContext);\n const headerValues = method.headerInit(parsed.params, state, headerOut);\n const headerBatch = buildResultBatch(method.headerSchema, headerValues, ctx.serverId, parsed.requestId);\n const headerBatches = [...headerOut.batches.map((b) => b.batch), headerBatch];\n headerBytes = serializeIpcStream(method.headerSchema, headerBatches);\n } catch (error: any) {\n const errBatch = buildErrorBatch(method.headerSchema, error, ctx.serverId, parsed.requestId);\n const response = arrowResponse(serializeIpcStream(method.headerSchema, [errBatch]), 500);\n (response as any).__dispatchError = error;\n return response;\n }\n }\n\n if (effectiveProducer) {\n // Producer method — produce data inline in the init response.\n // For exchange-registered methods acting as producers (__isProducer),\n // produceStreamResponse falls back to exchangeFn with tick batches.\n return produceStreamResponse(method, state, resolvedOutputSchema, inputSchema, ctx, parsed.requestId, headerBytes);\n } else {\n // Exchange: serialize state into signed token, return zero-row batch with token\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(resolvedOutputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n const tokenBatch = buildEmptyBatch(resolvedOutputSchema, tokenMeta);\n const tokenStreamBytes = serializeIpcStream(resolvedOutputSchema, [tokenBatch]);\n\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, tokenStreamBytes);\n } else {\n responseBody = tokenStreamBytes;\n }\n\n return arrowResponse(responseBody);\n }\n}\n\n/** Dispatch a stream exchange HTTP request (producer continuation or exchange round). */\nexport async function httpDispatchStreamExchange(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer = !!method.producerFn;\n\n const { batch: reqBatch } = await readRequestFromBody(body);\n\n // Get state token from batch metadata\n const tokenBase64 = reqBatch.metadata?.get(STATE_KEY);\n if (!tokenBase64) {\n throw new HttpRpcError(\"Missing state token in exchange request\", 400);\n }\n\n let unpacked: import(\"./token.js\").UnpackedToken;\n try {\n unpacked = unpackStateToken(tokenBase64, ctx.signingKey, ctx.tokenTtl);\n } catch (error: any) {\n throw new HttpRpcError(`Invalid state token: ${error.message}`, 400);\n }\n\n let state: any;\n try {\n state = ctx.stateSerializer.deserialize(unpacked.stateBytes);\n } catch (error: any) {\n console.error(`[httpDispatchStreamExchange] state deserialize error:`, error.message);\n throw new HttpRpcError(`State deserialization failed: ${error.message}`, 500);\n }\n\n // Recover schemas from the token (the state itself may not contain\n // Schema objects after JSON round-trip — always prefer the token).\n let outputSchema: Schema;\n if (unpacked.schemaBytes.length > 0) {\n outputSchema = await deserializeSchema(unpacked.schemaBytes);\n } else {\n outputSchema = state?.__outputSchema ?? method.outputSchema!;\n }\n let inputSchema: Schema;\n if (unpacked.inputSchemaBytes.length > 0) {\n inputSchema = await deserializeSchema(unpacked.inputSchemaBytes);\n } else {\n inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n }\n const effectiveProducer = state?.__isProducer ?? isProducer;\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(\n `[httpDispatchStreamExchange] method=${method.name} effectiveProducer=${effectiveProducer} stateKeys=${Object.keys(state || {})}`,\n );\n\n if (effectiveProducer) {\n // Producer continuation — produce more data inline.\n // For exchange-registered methods, falls back to exchangeFn with tick batches.\n return produceStreamResponse(method, state, outputSchema, inputSchema, ctx, null, null);\n } else {\n // Exchange path — also handles exchange-registered methods acting as\n // producers (__isProducer=true). Use producer mode on the OutputCollector\n // when effectiveProducer so finish() is allowed.\n const out = new OutputCollector(outputSchema, effectiveProducer, ctx.serverId, null, ctx.authContext);\n\n // Cast compatible input types (e.g., decimal→double, int32→int64)\n const conformedBatch = conformBatchToSchema(reqBatch, inputSchema);\n\n try {\n if (method.exchangeFn) {\n await method.exchangeFn(state, conformedBatch, out);\n } else {\n await method.producerFn!(state, out);\n }\n } catch (error: any) {\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(\n `[httpDispatchStreamExchange] exchange handler error:`,\n error.message,\n error.stack?.split(\"\\n\").slice(0, 5).join(\"\\n\"),\n );\n const errBatch = buildErrorBatch(outputSchema, error, ctx.serverId, null);\n const response = arrowResponse(serializeIpcStream(outputSchema, [errBatch]), 500);\n (response as any).__dispatchError = error;\n return response;\n }\n\n // Collect emitted batches\n const batches: RecordBatch[] = [];\n\n if (out.finished) {\n // Stream is done — return data WITHOUT state token.\n // The absence of a token tells the client there's no more data.\n for (const emitted of out.batches) {\n batches.push(emitted.batch);\n }\n } else {\n // More data may follow — repack state into token for next exchange.\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n\n for (const emitted of out.batches) {\n const batch = emitted.batch;\n if (batch.numRows > 0) {\n const mergedMeta = new Map<string, string>(batch.metadata ?? []);\n mergedMeta.set(STATE_KEY, token);\n batches.push(new RecordBatch(batch.schema, batch.data, mergedMeta));\n } else {\n batches.push(batch);\n }\n }\n\n // Safety net: if no batch carries a state token (e.g. all rows were\n // filtered out by pushdown filters), emit an empty batch with the\n // token so the client knows to continue exchanging.\n if (!batches.some((b) => b.metadata?.get(STATE_KEY))) {\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n batches.push(buildEmptyBatch(outputSchema, tokenMeta));\n }\n }\n\n return arrowResponse(serializeIpcStream(outputSchema, batches));\n }\n}\n\n/** Run the producer loop and build the response. */\nasync function produceStreamResponse(\n method: MethodDefinition,\n state: any,\n outputSchema: Schema,\n inputSchema: Schema,\n ctx: DispatchContext,\n requestId: string | null,\n headerBytes: Uint8Array | null,\n): Promise<Response> {\n const allBatches: RecordBatch[] = [];\n const maxBytes = ctx.maxStreamResponseBytes;\n let estimatedBytes = 0;\n let producerError: Error | undefined;\n\n while (true) {\n const out = new OutputCollector(outputSchema, true, ctx.serverId, requestId, ctx.authContext);\n\n try {\n if (method.producerFn) {\n await method.producerFn(state, out);\n } else {\n // Exchange-registered method acting as producer (e.g. VGI's \"init\"\n // method which is registered as exchange but may produce based on\n // the __isProducer state flag). Call exchangeFn with an empty tick\n // batch, matching how the subprocess transport dispatches these.\n const tickBatch = buildEmptyBatch(inputSchema);\n await method.exchangeFn!(state, tickBatch, out);\n }\n } catch (error: any) {\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(`[produceStreamResponse] error:`, error.message, error.stack?.split(\"\\n\").slice(0, 3).join(\"\\n\"));\n allBatches.push(buildErrorBatch(outputSchema, error, ctx.serverId, requestId));\n producerError = error instanceof Error ? error : new Error(String(error));\n break;\n }\n\n for (const emitted of out.batches) {\n allBatches.push(emitted.batch);\n if (maxBytes != null) {\n estimatedBytes += emitted.batch.data.byteLength;\n }\n }\n\n if (out.finished) {\n break;\n }\n\n // Check byte budget — if exceeded, emit continuation token\n if (maxBytes != null && estimatedBytes >= maxBytes) {\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n allBatches.push(buildEmptyBatch(outputSchema, tokenMeta));\n break;\n }\n }\n\n const dataBytes = serializeIpcStream(outputSchema, allBatches);\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, dataBytes);\n } else {\n responseBody = dataBytes;\n }\n const response = arrowResponse(responseBody);\n if (producerError) {\n (response as any).__dispatchError = producerError;\n }\n return response;\n}\n\nfunction concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLen = arrays.reduce((sum, a) => sum + a.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n",
25
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n Field,\n makeData,\n RecordBatch,\n Schema,\n Struct,\n Utf8,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport {\n DESCRIBE_VERSION,\n DESCRIBE_VERSION_KEY,\n PROTOCOL_NAME_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n SERVER_ID_KEY,\n} from \"../constants.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { serializeSchema } from \"../util/schema.js\";\n\n/**\n * The schema for the __describe__ response, matching Python's _DESCRIBE_SCHEMA.\n */\nexport const DESCRIBE_SCHEMA = new Schema([\n new Field(\"name\", new Utf8(), false),\n new Field(\"method_type\", new Utf8(), false),\n new Field(\"doc\", new Utf8(), true),\n new Field(\"has_return\", new Bool(), false),\n new Field(\"params_schema_ipc\", new Binary(), false),\n new Field(\"result_schema_ipc\", new Binary(), false),\n new Field(\"param_types_json\", new Utf8(), true),\n new Field(\"param_defaults_json\", new Utf8(), true),\n new Field(\"has_header\", new Bool(), false),\n new Field(\"header_schema_ipc\", new Binary(), true),\n new Field(\"is_exchange\", new Bool(), true),\n new Field(\"param_docs_json\", new Utf8(), true),\n]);\n\n/**\n * Build the __describe__ response batch and metadata.\n */\nexport function buildDescribeBatch(\n protocolName: string,\n methods: Map<string, MethodDefinition>,\n serverId: string,\n): { batch: RecordBatch; metadata: Map<string, string> } {\n // Sort methods by name for consistent ordering\n const sortedEntries = [...methods.entries()].sort(([a], [b]) => a.localeCompare(b));\n\n const names: (string | null)[] = [];\n const methodTypes: (string | null)[] = [];\n const docs: (string | null)[] = [];\n const hasReturns: boolean[] = [];\n const paramsSchemas: (Uint8Array | null)[] = [];\n const resultSchemas: (Uint8Array | null)[] = [];\n const paramTypesJsons: (string | null)[] = [];\n const paramDefaultsJsons: (string | null)[] = [];\n const hasHeaders: boolean[] = [];\n const headerSchemas: (Uint8Array | null)[] = [];\n const isExchanges: (boolean | null)[] = [];\n const paramDocsJsons: (string | null)[] = [];\n\n for (const [name, method] of sortedEntries) {\n names.push(name);\n methodTypes.push(method.type);\n docs.push(method.doc ?? null);\n\n // Unary methods with non-empty result schema have a return value\n const hasReturn = method.type === \"unary\" && method.resultSchema.fields.length > 0;\n hasReturns.push(hasReturn);\n\n paramsSchemas.push(serializeSchema(method.paramsSchema));\n resultSchemas.push(serializeSchema(method.resultSchema));\n\n // Build param_types_json\n if (method.paramTypes && Object.keys(method.paramTypes).length > 0) {\n paramTypesJsons.push(JSON.stringify(method.paramTypes));\n } else {\n paramTypesJsons.push(null);\n }\n\n // Build param_defaults_json\n if (method.defaults && Object.keys(method.defaults).length > 0) {\n const safe: Record<string, any> = {};\n for (const [k, v] of Object.entries(method.defaults)) {\n if (v === null || typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n safe[k] = v;\n }\n }\n paramDefaultsJsons.push(Object.keys(safe).length > 0 ? JSON.stringify(safe) : null);\n } else {\n paramDefaultsJsons.push(null);\n }\n\n hasHeaders.push(!!method.headerSchema);\n headerSchemas.push(method.headerSchema ? serializeSchema(method.headerSchema) : null);\n\n // is_exchange: true for exchange, false for producer, null for unary\n if (method.exchangeFn) {\n isExchanges.push(true);\n } else if (method.producerFn) {\n isExchanges.push(false);\n } else {\n isExchanges.push(null);\n }\n\n // param_docs_json: no docstring source in TypeScript, always null\n paramDocsJsons.push(null);\n }\n\n // Build the batch using vectorFromArray for each column\n const nameArr = vectorFromArray(names, new Utf8());\n const methodTypeArr = vectorFromArray(methodTypes, new Utf8());\n const docArr = vectorFromArray(docs, new Utf8());\n const hasReturnArr = vectorFromArray(hasReturns, new Bool());\n const paramsSchemaArr = vectorFromArray(paramsSchemas, new Binary());\n const resultSchemaArr = vectorFromArray(resultSchemas, new Binary());\n const paramTypesArr = vectorFromArray(paramTypesJsons, new Utf8());\n const paramDefaultsArr = vectorFromArray(paramDefaultsJsons, new Utf8());\n const hasHeaderArr = vectorFromArray(hasHeaders, new Bool());\n const headerSchemaArr = vectorFromArray(headerSchemas, new Binary());\n const isExchangeArr = vectorFromArray(isExchanges, new Bool());\n const paramDocsArr = vectorFromArray(paramDocsJsons, new Utf8());\n\n const children = [\n nameArr.data[0],\n methodTypeArr.data[0],\n docArr.data[0],\n hasReturnArr.data[0],\n paramsSchemaArr.data[0],\n resultSchemaArr.data[0],\n paramTypesArr.data[0],\n paramDefaultsArr.data[0],\n hasHeaderArr.data[0],\n headerSchemaArr.data[0],\n isExchangeArr.data[0],\n paramDocsArr.data[0],\n ];\n\n const structType = new Struct(DESCRIBE_SCHEMA.fields);\n const data = makeData({\n type: structType,\n length: sortedEntries.length,\n children,\n nullCount: 0,\n });\n\n // Build metadata for the batch\n const metadata = new Map<string, string>();\n metadata.set(PROTOCOL_NAME_KEY, protocolName);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n metadata.set(DESCRIBE_VERSION_KEY, DESCRIBE_VERSION);\n metadata.set(SERVER_ID_KEY, serverId);\n\n const batch = new RecordBatch(DESCRIBE_SCHEMA, data, metadata);\n\n return { batch, metadata };\n}\n",
26
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\n\n/**\n * Serialize a Schema to the Arrow IPC Schema message format.\n * This produces bytes compatible with Python's `pa.ipc.read_schema()`.\n *\n * We serialize by writing an empty-batch IPC stream and extracting\n * the bytes, which includes the schema message. Python's read_schema()\n * uses `pa.ipc.read_schema(pa.py_buffer(bytes))` which expects\n * the schema flatbuffer message bytes directly — but the Python side\n * actually uses `schema.serialize()` which produces Schema message bytes.\n *\n * In arrow-js, we can get the equivalent by using Message.from(schema)\n * and encoding it, or by serializing a zero-batch stream.\n *\n * The Python `schema.serialize()` produces the Schema flatbuffer message bytes,\n * and `pa.ipc.read_schema()` expects an IPC stream containing a schema message.\n * The actual format is: continuation marker (0xFFFFFFFF) + length + flatbuffer bytes.\n */\nexport function serializeSchema(schema: Schema): Uint8Array {\n // Write a complete IPC stream with no batches.\n // This writes: Schema message + EOS marker.\n // Python's pa.ipc.read_schema() can read this format.\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n writer.close();\n return writer.toUint8Array(true);\n}\n",
27
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { DataType, type RecordBatch, type Schema } from \"@query-farm/apache-arrow\";\nimport { REQUEST_ID_KEY, REQUEST_VERSION, REQUEST_VERSION_KEY, RPC_METHOD_KEY } from \"../constants.js\";\nimport { RpcError, VersionError } from \"../errors.js\";\n\nexport interface ParsedRequest {\n methodName: string;\n requestVersion: string;\n requestId: string | null;\n schema: Schema;\n params: Record<string, any>;\n rawMetadata: Map<string, string>;\n}\n\n/**\n * Parse a request from a RecordBatch with metadata.\n * Extracts method name, version, and params from the batch.\n */\nexport function parseRequest(schema: Schema, batch: RecordBatch): ParsedRequest {\n const metadata: Map<string, string> = batch.metadata ?? new Map();\n\n const methodName = metadata.get(RPC_METHOD_KEY);\n if (methodName === undefined) {\n throw new RpcError(\n \"ProtocolError\",\n \"Missing 'vgi_rpc.method' in request batch custom_metadata. \" +\n \"Each request batch must carry a 'vgi_rpc.method' key in its Arrow IPC custom_metadata \" +\n \"with the method name as a UTF-8 string.\",\n \"\",\n );\n }\n\n const version = metadata.get(REQUEST_VERSION_KEY);\n if (version === undefined) {\n throw new VersionError(\n \"Missing 'vgi_rpc.request_version' in request batch custom_metadata. \" +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n if (version !== REQUEST_VERSION) {\n throw new VersionError(\n `Unsupported request version '${version}', expected '${REQUEST_VERSION}'. ` +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n\n const requestId = metadata.get(REQUEST_ID_KEY) ?? null;\n\n // Extract params from single-row batch\n const params: Record<string, any> = {};\n if (schema.fields.length > 0 && batch.numRows !== 1) {\n throw new RpcError(\n \"ProtocolError\",\n `Expected 1 row in request batch, got ${batch.numRows}. ` +\n \"Each parameter is a column (not a row). The batch should have exactly 1 row.\",\n \"\",\n );\n }\n\n for (let i = 0; i < schema.fields.length; i++) {\n const field = schema.fields[i];\n // Map_ columns have a broken .get() in arrow-js — pass through raw Data\n if (DataType.isMap(field.type)) {\n params[field.name] = batch.getChildAt(i)!.data[0];\n continue;\n }\n let value = batch.getChildAt(i)?.get(0);\n // Convert BigInt to Number when safe\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n params[field.name] = value;\n }\n\n return {\n methodName,\n requestVersion: version,\n requestId,\n schema,\n params,\n rawMetadata: metadata,\n };\n}\n",
28
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nconst TOKEN_VERSION = 2;\nconst HMAC_LEN = 32;\n// 1 (version) + 8 (created_at) + 4*3 (three length prefixes) + 32 (hmac)\nconst MIN_TOKEN_LEN = 1 + 8 + 12 + HMAC_LEN;\n\n/**\n * Pack a state token matching the Python v2 wire format.\n *\n * Layout:\n * [1B version=2]\n * [8B created_at uint64 LE (seconds since epoch)]\n * [4B state_len uint32 LE] [state_len bytes]\n * [4B schema_len uint32 LE] [schema_len bytes]\n * [4B input_schema_len uint32 LE] [input_schema_len bytes]\n * [32B HMAC-SHA256(signing_key, all above bytes)]\n */\nexport function packStateToken(\n stateBytes: Uint8Array,\n schemaBytes: Uint8Array,\n inputSchemaBytes: Uint8Array,\n signingKey: Uint8Array,\n createdAt?: number,\n): string {\n const now = createdAt ?? Math.floor(Date.now() / 1000);\n\n const payloadLen = 1 + 8 + 4 + stateBytes.length + 4 + schemaBytes.length + 4 + inputSchemaBytes.length;\n const buf = Buffer.alloc(payloadLen);\n let offset = 0;\n\n // version\n buf.writeUInt8(TOKEN_VERSION, offset);\n offset += 1;\n\n // created_at as uint64 LE\n buf.writeBigUInt64LE(BigInt(now), offset);\n offset += 8;\n\n // state\n buf.writeUInt32LE(stateBytes.length, offset);\n offset += 4;\n buf.set(stateBytes, offset);\n offset += stateBytes.length;\n\n // output schema\n buf.writeUInt32LE(schemaBytes.length, offset);\n offset += 4;\n buf.set(schemaBytes, offset);\n offset += schemaBytes.length;\n\n // input schema\n buf.writeUInt32LE(inputSchemaBytes.length, offset);\n offset += 4;\n buf.set(inputSchemaBytes, offset);\n offset += inputSchemaBytes.length;\n\n // HMAC\n const mac = createHmac(\"sha256\", signingKey).update(buf).digest();\n const token = Buffer.concat([buf, mac]);\n\n return token.toString(\"base64\");\n}\n\nexport interface UnpackedToken {\n stateBytes: Uint8Array;\n schemaBytes: Uint8Array;\n inputSchemaBytes: Uint8Array;\n createdAt: number;\n}\n\n/**\n * Unpack and verify a state token.\n * Throws on tampered, expired, or malformed tokens.\n */\nexport function unpackStateToken(tokenBase64: string, signingKey: Uint8Array, tokenTtl: number): UnpackedToken {\n const token = Buffer.from(tokenBase64, \"base64\");\n\n if (token.length < MIN_TOKEN_LEN) {\n throw new Error(\"State token too short\");\n }\n\n // Split payload and mac\n const payload = token.subarray(0, token.length - HMAC_LEN);\n const receivedMac = token.subarray(token.length - HMAC_LEN);\n\n // Verify HMAC first (before inspecting any fields)\n const expectedMac = createHmac(\"sha256\", signingKey).update(payload).digest();\n if (!timingSafeEqual(receivedMac, expectedMac)) {\n throw new Error(\"State token HMAC verification failed\");\n }\n\n let offset = 0;\n\n // Version\n const version = payload.readUInt8(offset);\n offset += 1;\n if (version !== TOKEN_VERSION) {\n throw new Error(`Unsupported state token version: ${version}`);\n }\n\n // created_at\n const createdAt = Number(payload.readBigUInt64LE(offset));\n offset += 8;\n\n // TTL check\n if (tokenTtl > 0) {\n const now = Math.floor(Date.now() / 1000);\n if (now - createdAt > tokenTtl) {\n throw new Error(\"State token expired\");\n }\n }\n\n // state bytes\n const stateLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + stateLen > payload.length) {\n throw new Error(\"State token truncated (state)\");\n }\n const stateBytes = payload.slice(offset, offset + stateLen);\n offset += stateLen;\n\n // output schema bytes\n const schemaLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + schemaLen > payload.length) {\n throw new Error(\"State token truncated (schema)\");\n }\n const schemaBytes = payload.slice(offset, offset + schemaLen);\n offset += schemaLen;\n\n // input schema bytes\n const inputSchemaLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + inputSchemaLen > payload.length) {\n throw new Error(\"State token truncated (input schema)\");\n }\n const inputSchemaBytes = payload.slice(offset, offset + inputSchemaLen);\n\n return { stateBytes, schemaBytes, inputSchemaBytes, createdAt };\n}\n",
29
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Pre-rendered HTML pages for the vgi-rpc HTTP server.\n * Matches the styling of the Python and Go implementations.\n */\n\nimport type { MethodDefinition } from \"../types.js\";\n\nconst LOGO_URL = \"https://vgi-rpc-python.query.farm/assets/logo-hero.png\";\n\nconst FONTS = `<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=JetBrains+Mono:wght@400;600&display=swap\" rel=\"stylesheet\">`;\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction arrowTypeToString(type: import(\"@query-farm/apache-arrow\").DataType): string {\n const id = type.typeId;\n // Match the human-friendly type names used by the Python reference implementation\n if (id === 5) return \"str\"; // Utf8\n if (id === 4) return \"bytes\"; // Binary\n if (id === 2) return \"int\"; // Int32/Int64\n if (id === 3) return \"float\"; // Float32/Float64\n if (id === 6) return \"bool\"; // Bool\n if (id === 12) return \"list\"; // List\n if (id === 17) return \"map\"; // Map\n if (id === 24) return \"enum\"; // Dictionary\n return type.toString();\n}\n\n// ---------------------------------------------------------------------------\n// Landing page\n// ---------------------------------------------------------------------------\n\nexport function buildLandingPage(\n protocolName: string,\n serverId: string,\n describePath: string | null,\n repoUrl: string | null,\n): string {\n const links: string[] = [];\n if (describePath) {\n links.push(`<a class=\"primary\" href=\"${escapeHtml(describePath)}\">View service API</a>`);\n }\n if (repoUrl) {\n links.push(`<a href=\"${escapeHtml(repoUrl)}\">Source repository</a>`);\n }\n links.push(`<a href=\"https://vgi-rpc.query.farm\">Learn more about <code>vgi-rpc</code></a>`);\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHtml(protocolName)} \\u2014 vgi-rpc</title>\n${FONTS}\n<style>\nbody { font-family: 'Inter', system-ui, -apple-system, sans-serif; max-width: 600px;\n margin: 0 auto; padding: 60px 20px 0; color: #2c2c1e; text-align: center;\n background: #faf8f0; }\n.logo { margin-bottom: 24px; }\n.logo img { width: 140px; height: 140px; border-radius: 50%;\n box-shadow: 0 4px 24px rgba(0,0,0,0.12); }\nh1 { color: #2d5016; margin-bottom: 8px; font-weight: 700; }\ncode { font-family: 'JetBrains Mono', monospace; background: #f0ece0;\n padding: 2px 6px; border-radius: 3px; font-size: 0.9em; color: #2c2c1e; }\na { color: #2d5016; text-decoration: none; }\na:hover { color: #4a7c23; }\np { line-height: 1.7; color: #6b6b5a; }\n.meta { font-size: 0.9em; color: #6b6b5a; }\n.links { margin-top: 28px; display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }\n.links a { display: inline-block; padding: 8px 18px; border-radius: 6px;\n border: 1px solid #4a7c23; color: #2d5016; font-weight: 600;\n font-size: 0.9em; transition: all 0.2s ease; }\n.links a:hover { background: #4a7c23; color: #fff; }\n.links a.primary { background: #2d5016; color: #fff; border-color: #2d5016; }\n.links a.primary:hover { background: #4a7c23; border-color: #4a7c23; }\nfooter { margin-top: 48px; padding: 20px 0; border-top: 1px solid #f0ece0;\n color: #6b6b5a; font-size: 0.85em; }\nfooter a { color: #2d5016; font-weight: 600; }\nfooter a:hover { color: #4a7c23; }\n</style>\n</head>\n<body>\n<div class=\"logo\">\n <img src=\"${LOGO_URL}\" alt=\"vgi-rpc logo\">\n</div>\n<h1>${escapeHtml(protocolName)}</h1>\n<p class=\"meta\">Powered by <code>vgi-rpc</code> (TypeScript) &middot; server <code>${escapeHtml(serverId)}</code></p>\n<p>This is a <code>vgi-rpc</code> service endpoint.</p>\n<div class=\"links\">\n${links.join(\"\\n\")}\n</div>\n<footer>\n &copy; 2026 &#x1F69C; <a href=\"https://query.farm\">Query.Farm LLC</a>\n</footer>\n</body>\n</html>`;\n}\n\n// ---------------------------------------------------------------------------\n// 404 page\n// ---------------------------------------------------------------------------\n\nexport function buildNotFoundPage(prefix: string, protocolName: string): string {\n const nameFragment = protocolName ? ` (<strong>${escapeHtml(protocolName)}</strong>)` : \"\";\n const prefixDisplay = prefix || \"/\";\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>404 \\u2014 vgi-rpc endpoint</title>\n<style>\nbody { font-family: system-ui, -apple-system, sans-serif; max-width: 600px;\n margin: 60px auto; padding: 0 20px; color: #333; text-align: center; }\n.logo { margin-bottom: 24px; }\n.logo img { width: 120px; height: 120px; }\nh1 { color: #555; }\ncode { background: #f4f4f4; padding: 2px 6px; border-radius: 3px; font-size: 0.95em; }\na { color: #0066cc; }\np { line-height: 1.6; }\n</style>\n</head>\n<body>\n<div class=\"logo\">\n <img src=\"${LOGO_URL}\" alt=\"vgi-rpc logo\">\n</div>\n<h1>404 \\u2014 Not Found</h1>\n<p>This is a <code>vgi-rpc</code> service endpoint${nameFragment}.</p>\n<p>RPC methods are available under <code>${escapeHtml(prefixDisplay)}/&lt;method&gt;</code>.</p>\n<p>Learn more at <a href=\"https://vgi-rpc.query.farm\">vgi-rpc.query.farm</a>.</p>\n</body>\n</html>`;\n}\n\n// ---------------------------------------------------------------------------\n// Describe / API reference page\n// ---------------------------------------------------------------------------\n\nfunction buildMethodCard(method: MethodDefinition): string {\n const name = escapeHtml(method.name);\n const isUnary = method.type === \"unary\";\n const hasHeader = !!method.headerSchema;\n\n // Badges — match Python reference (unary/stream/header only)\n const badges: string[] = [];\n badges.push(\n isUnary ? `<span class=\"badge badge-unary\">unary</span>` : `<span class=\"badge badge-stream\">stream</span>`,\n );\n if (hasHeader) badges.push(`<span class=\"badge badge-header\">header</span>`);\n\n // Parameters table\n let paramsHtml = \"\";\n const paramsSchema = method.paramsSchema;\n if (paramsSchema.fields.length > 0) {\n const rows = paramsSchema.fields.map((f) => {\n const paramName = escapeHtml(f.name);\n const paramType = escapeHtml(arrowTypeToString(f.type));\n const defaultVal =\n method.defaults && f.name in method.defaults ? escapeHtml(JSON.stringify(method.defaults[f.name])) : \"&mdash;\";\n return `<tr><td><code>${paramName}</code></td><td><code>${paramType}</code></td><td>${defaultVal}</td><td>&mdash;</td></tr>`;\n });\n paramsHtml = `<div class=\"section-label\">Parameters</div>\n<table><tr><th>Name</th><th>Type</th><th>Default</th><th>Description</th></tr>\n${rows.join(\"\\n\")}\n</table>`;\n } else {\n paramsHtml = `<p class=\"no-params\">No parameters</p>`;\n }\n\n // Returns table (unary only)\n let returnsHtml = \"\";\n if (isUnary && method.resultSchema.fields.length > 0) {\n const rows = method.resultSchema.fields.map((f) => {\n return `<tr><td><code>${escapeHtml(f.name)}</code></td><td><code>${escapeHtml(arrowTypeToString(f.type))}</code></td></tr>`;\n });\n returnsHtml = `<div class=\"section-label\">Returns</div>\n<table><tr><th>Name</th><th>Type</th></tr>\n${rows.join(\"\\n\")}\n</table>`;\n }\n\n // Header table (streams with headers)\n let headerHtml = \"\";\n if (hasHeader && method.headerSchema && method.headerSchema.fields.length > 0) {\n const rows = method.headerSchema.fields.map((f) => {\n return `<tr><td><code>${escapeHtml(f.name)}</code></td><td><code>${escapeHtml(arrowTypeToString(f.type))}</code></td></tr>`;\n });\n headerHtml = `<div class=\"section-label\">Stream Header</div>\n<table><tr><th>Name</th><th>Type</th></tr>\n${rows.join(\"\\n\")}\n</table>`;\n }\n\n // Docstring\n const docHtml = method.doc ? `<p class=\"docstring\">${escapeHtml(method.doc)}</p>` : \"\";\n\n return `<div class=\"card\">\n<div class=\"card-header\">\n<span class=\"method-name\">${name}</span>\n${badges.join(\"\\n\")}\n</div>\n${docHtml}\n${paramsHtml}\n${returnsHtml}\n${headerHtml}\n</div>`;\n}\n\nexport function buildDescribePage(\n protocolName: string,\n serverId: string,\n methods: Map<string, MethodDefinition>,\n repoUrl: string | null,\n): string {\n const sortedMethods = [...methods.entries()]\n .filter(([name]) => name !== \"__describe__\")\n .sort(([a], [b]) => a.localeCompare(b));\n\n const cards = sortedMethods.map(([, method]) => buildMethodCard(method)).join(\"\\n\");\n\n const repoLink = repoUrl ? ` &middot; <a href=\"${escapeHtml(repoUrl)}\">Source</a>` : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHtml(protocolName)} API Reference \\u2014 vgi-rpc</title>\n${FONTS}\n<style>\nbody { font-family: 'Inter', system-ui, -apple-system, sans-serif; max-width: 900px;\n margin: 0 auto; padding: 40px 20px 0; color: #2c2c1e; background: #faf8f0; }\n.header { text-align: center; margin-bottom: 40px; }\n.header .logo img { width: 80px; height: 80px; border-radius: 50%;\n box-shadow: 0 3px 16px rgba(0,0,0,0.10); }\n.header h1 { margin-bottom: 4px; color: #2d5016; font-weight: 700; }\n.header .subtitle { color: #6b6b5a; font-size: 1.1em; margin-top: 0; }\n.header .meta { color: #6b6b5a; font-size: 0.9em; }\n.header .meta a { color: #2d5016; font-weight: 600; }\n.header .meta a:hover { color: #4a7c23; }\ncode { font-family: 'JetBrains Mono', monospace; background: #f0ece0;\n padding: 2px 6px; border-radius: 3px; font-size: 0.85em; color: #2c2c1e; }\na { color: #2d5016; text-decoration: none; }\na:hover { color: #4a7c23; }\n.card { border: 1px solid #f0ece0; border-radius: 8px; padding: 20px;\n margin-bottom: 16px; background: #fff; }\n.card:hover { border-color: #c8a43a; }\n.card-header { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }\n.method-name { font-family: 'JetBrains Mono', monospace; font-size: 1.1em; font-weight: 600;\n color: #2d5016; }\n.badge { display: inline-block; padding: 2px 8px; border-radius: 4px;\n font-size: 0.75em; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.03em; }\n.badge-unary { background: #e8f5e0; color: #2d5016; }\n.badge-stream { background: #e0ecf5; color: #1a4a6b; }\n.badge-exchange { background: #f5e6f0; color: #6b234a; }\n.badge-producer { background: #e0f0f5; color: #1a5a6b; }\n.badge-header { background: #f5eee0; color: #6b4423; }\n.docstring { color: #6b6b5a; font-size: 0.9em; margin-top: 0; }\ntable { width: 100%; border-collapse: collapse; font-size: 0.9em; }\nth { text-align: left; padding: 8px 10px; background: #f0ece0; color: #2c2c1e;\n font-weight: 600; border-bottom: 2px solid #e0dcd0; }\ntd { padding: 8px 10px; border-bottom: 1px solid #f0ece0; }\ntd code { font-size: 0.85em; }\n.no-params { color: #6b6b5a; font-style: italic; font-size: 0.9em; }\n.section-label { font-size: 0.8em; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6b6b5a; margin-top: 14px;\n margin-bottom: 6px; }\nfooter { text-align: center; margin-top: 48px; padding: 20px 0;\n border-top: 1px solid #f0ece0; color: #6b6b5a; font-size: 0.85em; }\nfooter a { color: #2d5016; font-weight: 600; }\nfooter a:hover { color: #4a7c23; }\n</style>\n</head>\n<body>\n<div class=\"header\">\n <div class=\"logo\">\n <img src=\"${LOGO_URL}\" alt=\"vgi-rpc logo\">\n </div>\n <h1>${escapeHtml(protocolName)}</h1>\n <p class=\"subtitle\">API Reference</p>\n <p class=\"meta\">Powered by <code>vgi-rpc</code> (TypeScript) &middot; server <code>${escapeHtml(serverId)}</code>${repoLink}</p>\n</div>\n${cards}\n<footer>\n <a href=\"https://vgi-rpc.query.farm\">Learn more about <code>vgi-rpc</code></a>\n &middot;\n &copy; 2026 &#x1F69C; <a href=\"https://query.farm\">Query.Farm LLC</a>\n</footer>\n</body>\n</html>`;\n}\n",
30
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ExternalLocationConfig } from \"../external.js\";\nimport type { DispatchHook } from \"../types.js\";\nimport type { AuthenticateFn, OAuthResourceMetadata } from \"./auth.js\";\n\n/** Configuration options for createHttpHandler(). */\nexport interface HttpHandlerOptions {\n /** URL path prefix for all endpoints. Default: \"\" (root). */\n prefix?: string;\n /** HMAC-SHA256 signing key for state tokens. Random 32 bytes if omitted. */\n signingKey?: Uint8Array;\n /** State token time-to-live in seconds. Default: 3600 (1 hour). 0 disables TTL checks. */\n tokenTtl?: number;\n /** CORS allowed origins. If set, CORS headers are added to all responses. */\n corsOrigins?: string;\n /** Access-Control-Max-Age value in seconds for preflight OPTIONS responses. Default: 7200 (2 hours). null omits the header. */\n corsMaxAge?: number | null;\n /** Maximum request body size in bytes. Advertised via VGI-Max-Request-Bytes header. */\n maxRequestBytes?: number;\n /** Maximum bytes before a producer stream emits a continuation token. */\n maxStreamResponseBytes?: number;\n /** Server ID included in response metadata. Random if omitted. */\n serverId?: string;\n /** Custom state serializer for stream state objects. Default: JSON with BigInt support. */\n stateSerializer?: StateSerializer;\n /** zstd compression level for responses (1-22). If set, responses are\n * compressed when the client sends Accept-Encoding: zstd. */\n compressionLevel?: number;\n /** Optional authentication callback. Called for each request before dispatch. */\n authenticate?: AuthenticateFn;\n /** Optional RFC 9728 OAuth Protected Resource Metadata. Served at well-known endpoint. */\n oauthResourceMetadata?: OAuthResourceMetadata;\n /** Optional dispatch hook for observability (tracing, metrics). */\n dispatchHook?: DispatchHook;\n /** Enable HTML landing page at GET {prefix}/. Default: true. */\n enableLandingPage?: boolean;\n /** Enable HTML describe/API reference page at GET {prefix}/describe. Default: true. */\n enableDescribePage?: boolean;\n /** Enable HTML 404 page for unmatched GET routes. Default: true. */\n enableNotFoundPage?: boolean;\n /** Protocol name shown in HTML pages. Defaults to the Protocol's name. */\n protocolName?: string;\n /** URL to service's source repository, shown in landing/describe pages. */\n repositoryUrl?: string;\n /** External storage config for externalizing large response batches. */\n externalLocation?: ExternalLocationConfig;\n}\n\n/** Serializer for stream state objects stored in state tokens. */\nexport interface StateSerializer {\n serialize(state: any): Uint8Array;\n deserialize(bytes: Uint8Array): any;\n}\n\n/** Default state serializer using JSON (with BigInt support). */\nexport const jsonStateSerializer: StateSerializer = {\n serialize(state: any): Uint8Array {\n return new TextEncoder().encode(\n JSON.stringify(state, (_key, value) => (typeof value === \"bigint\" ? `__bigint__:${value}` : value)),\n );\n },\n deserialize(bytes: Uint8Array): any {\n return JSON.parse(new TextDecoder().decode(bytes), (_key, value) =>\n typeof value === \"string\" && value.startsWith(\"__bigint__:\") ? BigInt(value.slice(11)) : value,\n );\n },\n};\n",
31
- "let USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'oauth4webapi';\n const VERSION = 'v3.8.5';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nfunction looseInstanceOf(input, expected) {\n if (input == null) {\n return false;\n }\n try {\n return (input instanceof expected ||\n Object.getPrototypeOf(input)[Symbol.toStringTag] === expected.prototype[Symbol.toStringTag]);\n }\n catch {\n return false;\n }\n}\nconst ERR_INVALID_ARG_VALUE = 'ERR_INVALID_ARG_VALUE';\nconst ERR_INVALID_ARG_TYPE = 'ERR_INVALID_ARG_TYPE';\nfunction CodedTypeError(message, code, cause) {\n const err = new TypeError(message, { cause });\n Object.assign(err, { code });\n return err;\n}\nexport const allowInsecureRequests = Symbol();\nexport const clockSkew = Symbol();\nexport const clockTolerance = Symbol();\nexport const customFetch = Symbol();\nexport const modifyAssertion = Symbol();\nexport const jweDecrypt = Symbol();\nexport const jwksCache = Symbol();\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nfunction buf(input) {\n if (typeof input === 'string') {\n return encoder.encode(input);\n }\n return decoder.decode(input);\n}\nlet encodeBase64Url;\nif (Uint8Array.prototype.toBase64) {\n encodeBase64Url = (input) => {\n if (input instanceof ArrayBuffer) {\n input = new Uint8Array(input);\n }\n return input.toBase64({ alphabet: 'base64url', omitPadding: true });\n };\n}\nelse {\n const CHUNK_SIZE = 0x8000;\n encodeBase64Url = (input) => {\n if (input instanceof ArrayBuffer) {\n input = new Uint8Array(input);\n }\n const arr = [];\n for (let i = 0; i < input.byteLength; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join('')).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n };\n}\nlet decodeBase64Url;\nif (Uint8Array.fromBase64) {\n decodeBase64Url = (input) => {\n try {\n return Uint8Array.fromBase64(input, { alphabet: 'base64url' });\n }\n catch (cause) {\n throw CodedTypeError('The input to be decoded is not correctly encoded.', ERR_INVALID_ARG_VALUE, cause);\n }\n };\n}\nelse {\n decodeBase64Url = (input) => {\n try {\n const binary = atob(input.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, ''));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n catch (cause) {\n throw CodedTypeError('The input to be decoded is not correctly encoded.', ERR_INVALID_ARG_VALUE, cause);\n }\n };\n}\nfunction b64u(input) {\n if (typeof input === 'string') {\n return decodeBase64Url(input);\n }\n return encodeBase64Url(input);\n}\nexport class UnsupportedOperationError extends Error {\n code;\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = UNSUPPORTED_OPERATION;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class OperationProcessingError extends Error {\n code;\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n if (options?.code) {\n this.code = options?.code;\n }\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nfunction OPE(message, code, cause) {\n return new OperationProcessingError(message, { code, cause });\n}\nasync function calculateJwkThumbprint(jwk) {\n let components;\n switch (jwk.kty) {\n case 'EC':\n components = {\n crv: jwk.crv,\n kty: jwk.kty,\n x: jwk.x,\n y: jwk.y,\n };\n break;\n case 'OKP':\n components = {\n crv: jwk.crv,\n kty: jwk.kty,\n x: jwk.x,\n };\n break;\n case 'AKP':\n components = {\n alg: jwk.alg,\n kty: jwk.kty,\n pub: jwk.pub,\n };\n break;\n case 'RSA':\n components = {\n e: jwk.e,\n kty: jwk.kty,\n n: jwk.n,\n };\n break;\n default:\n throw new UnsupportedOperationError('unsupported JWK key type', { cause: jwk });\n }\n return b64u(await crypto.subtle.digest('SHA-256', buf(JSON.stringify(components))));\n}\nfunction assertCryptoKey(key, it) {\n if (!(key instanceof CryptoKey)) {\n throw CodedTypeError(`${it} must be a CryptoKey`, ERR_INVALID_ARG_TYPE);\n }\n}\nfunction assertPrivateKey(key, it) {\n assertCryptoKey(key, it);\n if (key.type !== 'private') {\n throw CodedTypeError(`${it} must be a private CryptoKey`, ERR_INVALID_ARG_VALUE);\n }\n}\nfunction assertPublicKey(key, it) {\n assertCryptoKey(key, it);\n if (key.type !== 'public') {\n throw CodedTypeError(`${it} must be a public CryptoKey`, ERR_INVALID_ARG_VALUE);\n }\n}\nfunction normalizeTyp(value) {\n return value.toLowerCase().replace(/^application\\//, '');\n}\nfunction isJsonObject(input) {\n if (input === null || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return true;\n}\nfunction prepareHeaders(input) {\n if (looseInstanceOf(input, Headers)) {\n input = Object.fromEntries(input.entries());\n }\n const headers = new Headers(input ?? {});\n if (USER_AGENT && !headers.has('user-agent')) {\n headers.set('user-agent', USER_AGENT);\n }\n if (headers.has('authorization')) {\n throw CodedTypeError('\"options.headers\" must not include the \"authorization\" header name', ERR_INVALID_ARG_VALUE);\n }\n return headers;\n}\nfunction signal(url, value) {\n if (value !== undefined) {\n if (typeof value === 'function') {\n value = value(url.href);\n }\n if (!(value instanceof AbortSignal)) {\n throw CodedTypeError('\"options.signal\" must return or be an instance of AbortSignal', ERR_INVALID_ARG_TYPE);\n }\n return value;\n }\n return undefined;\n}\nfunction replaceDoubleSlash(pathname) {\n if (pathname.includes('//')) {\n return pathname.replace('//', '/');\n }\n return pathname;\n}\nfunction prependWellKnown(url, wellKnown, allowTerminatingSlash = false) {\n if (url.pathname === '/') {\n url.pathname = wellKnown;\n }\n else {\n url.pathname = replaceDoubleSlash(`${wellKnown}/${allowTerminatingSlash ? url.pathname : url.pathname.replace(/(\\/)$/, '')}`);\n }\n return url;\n}\nfunction appendWellKnown(url, wellKnown) {\n url.pathname = replaceDoubleSlash(`${url.pathname}/${wellKnown}`);\n return url;\n}\nasync function performDiscovery(input, urlName, transform, options) {\n if (!(input instanceof URL)) {\n throw CodedTypeError(`\"${urlName}\" must be an instance of URL`, ERR_INVALID_ARG_TYPE);\n }\n checkProtocol(input, options?.[allowInsecureRequests] !== true);\n const url = transform(new URL(input.href));\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n return (options?.[customFetch] || fetch)(url.href, {\n body: undefined,\n headers: Object.fromEntries(headers.entries()),\n method: 'GET',\n redirect: 'manual',\n signal: signal(url, options?.signal),\n });\n}\nexport async function discoveryRequest(issuerIdentifier, options) {\n return performDiscovery(issuerIdentifier, 'issuerIdentifier', (url) => {\n switch (options?.algorithm) {\n case undefined:\n case 'oidc':\n appendWellKnown(url, '.well-known/openid-configuration');\n break;\n case 'oauth2':\n prependWellKnown(url, '.well-known/oauth-authorization-server');\n break;\n default:\n throw CodedTypeError('\"options.algorithm\" must be \"oidc\" (default), or \"oauth2\"', ERR_INVALID_ARG_VALUE);\n }\n return url;\n }, options);\n}\nfunction assertNumber(input, allow0, it, code, cause) {\n try {\n if (typeof input !== 'number' || !Number.isFinite(input)) {\n throw CodedTypeError(`${it} must be a number`, ERR_INVALID_ARG_TYPE, cause);\n }\n if (input > 0)\n return;\n if (allow0) {\n if (input !== 0) {\n throw CodedTypeError(`${it} must be a non-negative number`, ERR_INVALID_ARG_VALUE, cause);\n }\n return;\n }\n throw CodedTypeError(`${it} must be a positive number`, ERR_INVALID_ARG_VALUE, cause);\n }\n catch (err) {\n if (code) {\n throw OPE(err.message, code, cause);\n }\n throw err;\n }\n}\nfunction assertString(input, it, code, cause) {\n try {\n if (typeof input !== 'string') {\n throw CodedTypeError(`${it} must be a string`, ERR_INVALID_ARG_TYPE, cause);\n }\n if (input.length === 0) {\n throw CodedTypeError(`${it} must not be empty`, ERR_INVALID_ARG_VALUE, cause);\n }\n }\n catch (err) {\n if (code) {\n throw OPE(err.message, code, cause);\n }\n throw err;\n }\n}\nexport async function processDiscoveryResponse(expectedIssuerIdentifier, response) {\n const expected = expectedIssuerIdentifier;\n if (!(expected instanceof URL) && expected !== _nodiscoverycheck) {\n throw CodedTypeError('\"expectedIssuerIdentifier\" must be an instance of URL', ERR_INVALID_ARG_TYPE);\n }\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n if (response.status !== 200) {\n throw OPE('\"response\" is not a conform Authorization Server Metadata response (unexpected HTTP status code)', RESPONSE_IS_NOT_CONFORM, response);\n }\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.issuer, '\"response\" body \"issuer\" property', INVALID_RESPONSE, { body: json });\n if (expected !== _nodiscoverycheck && new URL(json.issuer).href !== expected.href) {\n throw OPE('\"response\" body \"issuer\" property does not match the expected value', JSON_ATTRIBUTE_COMPARISON, { expected: expected.href, body: json, attribute: 'issuer' });\n }\n return json;\n}\nfunction assertApplicationJson(response) {\n assertContentType(response, 'application/json');\n}\nfunction notJson(response, ...types) {\n let msg = '\"response\" content-type must be ';\n if (types.length > 2) {\n const last = types.pop();\n msg += `${types.join(', ')}, or ${last}`;\n }\n else if (types.length === 2) {\n msg += `${types[0]} or ${types[1]}`;\n }\n else {\n msg += types[0];\n }\n return OPE(msg, RESPONSE_IS_NOT_JSON, response);\n}\nfunction assertContentTypes(response, ...types) {\n if (!types.includes(getContentType(response))) {\n throw notJson(response, ...types);\n }\n}\nfunction assertContentType(response, contentType) {\n if (getContentType(response) !== contentType) {\n throw notJson(response, contentType);\n }\n}\nfunction randomBytes() {\n return b64u(crypto.getRandomValues(new Uint8Array(32)));\n}\nexport function generateRandomCodeVerifier() {\n return randomBytes();\n}\nexport function generateRandomState() {\n return randomBytes();\n}\nexport function generateRandomNonce() {\n return randomBytes();\n}\nexport async function calculatePKCECodeChallenge(codeVerifier) {\n assertString(codeVerifier, 'codeVerifier');\n return b64u(await crypto.subtle.digest('SHA-256', buf(codeVerifier)));\n}\nfunction getKeyAndKid(input) {\n if (input instanceof CryptoKey) {\n return { key: input };\n }\n if (!(input?.key instanceof CryptoKey)) {\n return {};\n }\n if (input.kid !== undefined) {\n assertString(input.kid, '\"kid\"');\n }\n return {\n key: input.key,\n kid: input.kid,\n };\n}\nfunction psAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'PS256';\n case 'SHA-384':\n return 'PS384';\n case 'SHA-512':\n return 'PS512';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name', {\n cause: key,\n });\n }\n}\nfunction rsAlg(key) {\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n return 'RS256';\n case 'SHA-384':\n return 'RS384';\n case 'SHA-512':\n return 'RS512';\n default:\n throw new UnsupportedOperationError('unsupported RsaHashedKeyAlgorithm hash name', {\n cause: key,\n });\n }\n}\nfunction esAlg(key) {\n switch (key.algorithm.namedCurve) {\n case 'P-256':\n return 'ES256';\n case 'P-384':\n return 'ES384';\n case 'P-521':\n return 'ES512';\n default:\n throw new UnsupportedOperationError('unsupported EcKeyAlgorithm namedCurve', { cause: key });\n }\n}\nfunction keyToJws(key) {\n switch (key.algorithm.name) {\n case 'RSA-PSS':\n return psAlg(key);\n case 'RSASSA-PKCS1-v1_5':\n return rsAlg(key);\n case 'ECDSA':\n return esAlg(key);\n case 'Ed25519':\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return key.algorithm.name;\n case 'EdDSA':\n return 'Ed25519';\n default:\n throw new UnsupportedOperationError('unsupported CryptoKey algorithm name', { cause: key });\n }\n}\nfunction getClockSkew(client) {\n const skew = client?.[clockSkew];\n return typeof skew === 'number' && Number.isFinite(skew) ? skew : 0;\n}\nfunction getClockTolerance(client) {\n const tolerance = client?.[clockTolerance];\n return typeof tolerance === 'number' && Number.isFinite(tolerance) && Math.sign(tolerance) !== -1\n ? tolerance\n : 30;\n}\nfunction epochTime() {\n return Math.floor(Date.now() / 1000);\n}\nfunction assertAs(as) {\n if (typeof as !== 'object' || as === null) {\n throw CodedTypeError('\"as\" must be an object', ERR_INVALID_ARG_TYPE);\n }\n assertString(as.issuer, '\"as.issuer\"');\n}\nfunction assertClient(client) {\n if (typeof client !== 'object' || client === null) {\n throw CodedTypeError('\"client\" must be an object', ERR_INVALID_ARG_TYPE);\n }\n assertString(client.client_id, '\"client.client_id\"');\n}\nfunction formUrlEncode(token) {\n return encodeURIComponent(token).replace(/(?:[-_.!~*'()]|%20)/g, (substring) => {\n switch (substring) {\n case '-':\n case '_':\n case '.':\n case '!':\n case '~':\n case '*':\n case \"'\":\n case '(':\n case ')':\n return `%${substring.charCodeAt(0).toString(16).toUpperCase()}`;\n case '%20':\n return '+';\n default:\n throw new Error();\n }\n });\n}\nexport function ClientSecretPost(clientSecret) {\n assertString(clientSecret, '\"clientSecret\"');\n return (_as, client, body, _headers) => {\n body.set('client_id', client.client_id);\n body.set('client_secret', clientSecret);\n };\n}\nexport function ClientSecretBasic(clientSecret) {\n assertString(clientSecret, '\"clientSecret\"');\n return (_as, client, _body, headers) => {\n const username = formUrlEncode(client.client_id);\n const password = formUrlEncode(clientSecret);\n const credentials = btoa(`${username}:${password}`);\n headers.set('authorization', `Basic ${credentials}`);\n };\n}\nfunction clientAssertionPayload(as, client) {\n const now = epochTime() + getClockSkew(client);\n return {\n jti: randomBytes(),\n aud: as.issuer,\n exp: now + 60,\n iat: now,\n nbf: now,\n iss: client.client_id,\n sub: client.client_id,\n };\n}\nexport function PrivateKeyJwt(clientPrivateKey, options) {\n const { key, kid } = getKeyAndKid(clientPrivateKey);\n assertPrivateKey(key, '\"clientPrivateKey.key\"');\n return async (as, client, body, _headers) => {\n const header = { alg: keyToJws(key), kid };\n const payload = clientAssertionPayload(as, client);\n options?.[modifyAssertion]?.(header, payload);\n body.set('client_id', client.client_id);\n body.set('client_assertion_type', 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer');\n body.set('client_assertion', await signJwt(header, payload, key));\n };\n}\nexport function ClientSecretJwt(clientSecret, options) {\n assertString(clientSecret, '\"clientSecret\"');\n const modify = options?.[modifyAssertion];\n let key;\n return async (as, client, body, _headers) => {\n key ||= await crypto.subtle.importKey('raw', buf(clientSecret), { hash: 'SHA-256', name: 'HMAC' }, false, ['sign']);\n const header = { alg: 'HS256' };\n const payload = clientAssertionPayload(as, client);\n modify?.(header, payload);\n const data = `${b64u(buf(JSON.stringify(header)))}.${b64u(buf(JSON.stringify(payload)))}`;\n const hmac = await crypto.subtle.sign(key.algorithm, key, buf(data));\n body.set('client_id', client.client_id);\n body.set('client_assertion_type', 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer');\n body.set('client_assertion', `${data}.${b64u(new Uint8Array(hmac))}`);\n };\n}\nexport function None() {\n return (_as, client, body, _headers) => {\n body.set('client_id', client.client_id);\n };\n}\nexport function TlsClientAuth() {\n return None();\n}\nasync function signJwt(header, payload, key) {\n if (!key.usages.includes('sign')) {\n throw CodedTypeError('CryptoKey instances used for signing assertions must include \"sign\" in their \"usages\"', ERR_INVALID_ARG_VALUE);\n }\n const input = `${b64u(buf(JSON.stringify(header)))}.${b64u(buf(JSON.stringify(payload)))}`;\n const signature = b64u(await crypto.subtle.sign(keyToSubtle(key), key, buf(input)));\n return `${input}.${signature}`;\n}\nexport async function issueRequestObject(as, client, parameters, privateKey, options) {\n assertAs(as);\n assertClient(client);\n parameters = new URLSearchParams(parameters);\n const { key, kid } = getKeyAndKid(privateKey);\n assertPrivateKey(key, '\"privateKey.key\"');\n parameters.set('client_id', client.client_id);\n const now = epochTime() + getClockSkew(client);\n const claims = {\n ...Object.fromEntries(parameters.entries()),\n jti: randomBytes(),\n aud: as.issuer,\n exp: now + 60,\n iat: now,\n nbf: now,\n iss: client.client_id,\n };\n let resource;\n if (parameters.has('resource') &&\n (resource = parameters.getAll('resource')) &&\n resource.length > 1) {\n claims.resource = resource;\n }\n {\n let value = parameters.get('max_age');\n if (value !== null) {\n claims.max_age = parseInt(value, 10);\n assertNumber(claims.max_age, true, '\"max_age\" parameter');\n }\n }\n {\n let value = parameters.get('claims');\n if (value !== null) {\n try {\n claims.claims = JSON.parse(value);\n }\n catch (cause) {\n throw OPE('failed to parse the \"claims\" parameter as JSON', PARSE_ERROR, cause);\n }\n if (!isJsonObject(claims.claims)) {\n throw CodedTypeError('\"claims\" parameter must be a JSON with a top level object', ERR_INVALID_ARG_VALUE);\n }\n }\n }\n {\n let value = parameters.get('authorization_details');\n if (value !== null) {\n try {\n claims.authorization_details = JSON.parse(value);\n }\n catch (cause) {\n throw OPE('failed to parse the \"authorization_details\" parameter as JSON', PARSE_ERROR, cause);\n }\n if (!Array.isArray(claims.authorization_details)) {\n throw CodedTypeError('\"authorization_details\" parameter must be a JSON with a top level array', ERR_INVALID_ARG_VALUE);\n }\n }\n }\n const header = {\n alg: keyToJws(key),\n typ: 'oauth-authz-req+jwt',\n kid,\n };\n options?.[modifyAssertion]?.(header, claims);\n return signJwt(header, claims, key);\n}\nlet jwkCache;\nasync function getSetPublicJwkCache(key, alg) {\n const { kty, e, n, x, y, crv, pub } = await crypto.subtle.exportKey('jwk', key);\n const jwk = { kty, e, n, x, y, crv, pub };\n if (kty === 'AKP')\n jwk.alg = alg;\n jwkCache.set(key, jwk);\n return jwk;\n}\nasync function publicJwk(key, alg) {\n jwkCache ||= new WeakMap();\n return jwkCache.get(key) || getSetPublicJwkCache(key, alg);\n}\nconst URLParse = URL.parse\n ?\n (url, base) => URL.parse(url, base)\n : (url, base) => {\n try {\n return new URL(url, base);\n }\n catch {\n return null;\n }\n };\nexport function checkProtocol(url, enforceHttps) {\n if (enforceHttps && url.protocol !== 'https:') {\n throw OPE('only requests to HTTPS are allowed', HTTP_REQUEST_FORBIDDEN, url);\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw OPE('only HTTP and HTTPS requests are allowed', REQUEST_PROTOCOL_FORBIDDEN, url);\n }\n}\nfunction validateEndpoint(value, endpoint, useMtlsAlias, enforceHttps) {\n let url;\n if (typeof value !== 'string' || !(url = URLParse(value))) {\n throw OPE(`authorization server metadata does not contain a valid ${useMtlsAlias ? `\"as.mtls_endpoint_aliases.${endpoint}\"` : `\"as.${endpoint}\"`}`, value === undefined ? MISSING_SERVER_METADATA : INVALID_SERVER_METADATA, { attribute: useMtlsAlias ? `mtls_endpoint_aliases.${endpoint}` : endpoint });\n }\n checkProtocol(url, enforceHttps);\n return url;\n}\nexport function resolveEndpoint(as, endpoint, useMtlsAlias, enforceHttps) {\n if (useMtlsAlias && as.mtls_endpoint_aliases && endpoint in as.mtls_endpoint_aliases) {\n return validateEndpoint(as.mtls_endpoint_aliases[endpoint], endpoint, useMtlsAlias, enforceHttps);\n }\n return validateEndpoint(as[endpoint], endpoint, useMtlsAlias, enforceHttps);\n}\nexport async function pushedAuthorizationRequest(as, client, clientAuthentication, parameters, options) {\n assertAs(as);\n assertClient(client);\n const url = resolveEndpoint(as, 'pushed_authorization_request_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const body = new URLSearchParams(parameters);\n body.set('client_id', client.client_id);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n if (options?.DPoP !== undefined) {\n assertDPoP(options.DPoP);\n await options.DPoP.addProof(url, headers, 'POST');\n }\n const response = await authenticatedRequest(as, client, clientAuthentication, url, body, headers, options);\n options?.DPoP?.cacheNonce(response, url);\n return response;\n}\nclass DPoPHandler {\n #header;\n #privateKey;\n #publicKey;\n #clockSkew;\n #modifyAssertion;\n #map;\n #jkt;\n constructor(client, keyPair, options) {\n assertPrivateKey(keyPair?.privateKey, '\"DPoP.privateKey\"');\n assertPublicKey(keyPair?.publicKey, '\"DPoP.publicKey\"');\n if (!keyPair.publicKey.extractable) {\n throw CodedTypeError('\"DPoP.publicKey.extractable\" must be true', ERR_INVALID_ARG_VALUE);\n }\n this.#modifyAssertion = options?.[modifyAssertion];\n this.#clockSkew = getClockSkew(client);\n this.#privateKey = keyPair.privateKey;\n this.#publicKey = keyPair.publicKey;\n branded.add(this);\n }\n #get(key) {\n this.#map ||= new Map();\n let item = this.#map.get(key);\n if (item) {\n this.#map.delete(key);\n this.#map.set(key, item);\n }\n return item;\n }\n #set(key, val) {\n this.#map ||= new Map();\n this.#map.delete(key);\n if (this.#map.size === 100) {\n this.#map.delete(this.#map.keys().next().value);\n }\n this.#map.set(key, val);\n }\n async calculateThumbprint() {\n if (!this.#jkt) {\n const jwk = await crypto.subtle.exportKey('jwk', this.#publicKey);\n this.#jkt ||= await calculateJwkThumbprint(jwk);\n }\n return this.#jkt;\n }\n async addProof(url, headers, htm, accessToken) {\n const alg = keyToJws(this.#privateKey);\n this.#header ||= {\n alg,\n typ: 'dpop+jwt',\n jwk: await publicJwk(this.#publicKey, alg),\n };\n const nonce = this.#get(url.origin);\n const now = epochTime() + this.#clockSkew;\n const payload = {\n iat: now,\n jti: randomBytes(),\n htm,\n nonce,\n htu: `${url.origin}${url.pathname}`,\n ath: accessToken\n ? b64u(await crypto.subtle.digest('SHA-256', buf(accessToken)))\n : undefined,\n };\n this.#modifyAssertion?.(this.#header, payload);\n headers.set('dpop', await signJwt(this.#header, payload, this.#privateKey));\n }\n cacheNonce(response, url) {\n try {\n const nonce = response.headers.get('dpop-nonce');\n if (nonce) {\n this.#set(url.origin, nonce);\n }\n }\n catch { }\n }\n}\nexport function isDPoPNonceError(err) {\n if (err instanceof WWWAuthenticateChallengeError) {\n const { 0: challenge, length } = err.cause;\n return (length === 1 && challenge.scheme === 'dpop' && challenge.parameters.error === 'use_dpop_nonce');\n }\n if (err instanceof ResponseBodyError) {\n return err.error === 'use_dpop_nonce';\n }\n return false;\n}\nexport function DPoP(client, keyPair, options) {\n return new DPoPHandler(client, keyPair, options);\n}\nexport class ResponseBodyError extends Error {\n cause;\n code;\n error;\n status;\n error_description;\n response;\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = RESPONSE_BODY_ERROR;\n this.cause = options.cause;\n this.error = options.cause.error;\n this.status = options.response.status;\n this.error_description = options.cause.error_description;\n Object.defineProperty(this, 'response', { enumerable: false, value: options.response });\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class AuthorizationResponseError extends Error {\n cause;\n code;\n error;\n error_description;\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = AUTHORIZATION_RESPONSE_ERROR;\n this.cause = options.cause;\n this.error = options.cause.get('error');\n this.error_description = options.cause.get('error_description') ?? undefined;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class WWWAuthenticateChallengeError extends Error {\n cause;\n code;\n response;\n status;\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = WWW_AUTHENTICATE_CHALLENGE;\n this.cause = options.cause;\n this.status = options.response.status;\n this.response = options.response;\n Object.defineProperty(this, 'response', { enumerable: false });\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nconst tokenMatch = \"[a-zA-Z0-9!#$%&\\\\'\\\\*\\\\+\\\\-\\\\.\\\\^_`\\\\|~]+\";\nconst token68Match = '[a-zA-Z0-9\\\\-\\\\._\\\\~\\\\+\\\\/]+={0,2}';\nconst quotedMatch = '\"((?:[^\"\\\\\\\\]|\\\\\\\\[\\\\s\\\\S])*)\"';\nconst quotedParamMatcher = '(' + tokenMatch + ')\\\\s*=\\\\s*' + quotedMatch;\nconst paramMatcher = '(' + tokenMatch + ')\\\\s*=\\\\s*(' + tokenMatch + ')';\nconst schemeRE = new RegExp('^[,\\\\s]*(' + tokenMatch + ')');\nconst quotedParamRE = new RegExp('^[,\\\\s]*' + quotedParamMatcher + '[,\\\\s]*(.*)');\nconst unquotedParamRE = new RegExp('^[,\\\\s]*' + paramMatcher + '[,\\\\s]*(.*)');\nconst token68ParamRE = new RegExp('^(' + token68Match + ')(?:$|[,\\\\s])(.*)');\nfunction parseWwwAuthenticateChallenges(response) {\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n const header = response.headers.get('www-authenticate');\n if (header === null) {\n return undefined;\n }\n const challenges = [];\n let rest = header;\n while (rest) {\n let match = rest.match(schemeRE);\n const scheme = match?.['1'].toLowerCase();\n if (!scheme) {\n return undefined;\n }\n const afterScheme = rest.substring(match[0].length);\n if (afterScheme && !afterScheme.match(/^[\\s,]/)) {\n return undefined;\n }\n const spaceMatch = afterScheme.match(/^\\s+(.*)$/);\n const hasParameters = !!spaceMatch;\n rest = spaceMatch ? spaceMatch[1] : undefined;\n const parameters = {};\n let token68;\n if (hasParameters) {\n while (rest) {\n let key;\n let value;\n if ((match = rest.match(quotedParamRE))) {\n ;\n [, key, value, rest] = match;\n if (value.includes('\\\\')) {\n try {\n value = JSON.parse(`\"${value}\"`);\n }\n catch { }\n }\n parameters[key.toLowerCase()] = value;\n continue;\n }\n if ((match = rest.match(unquotedParamRE))) {\n ;\n [, key, value, rest] = match;\n parameters[key.toLowerCase()] = value;\n continue;\n }\n if ((match = rest.match(token68ParamRE))) {\n if (Object.keys(parameters).length) {\n break;\n }\n ;\n [, token68, rest] = match;\n break;\n }\n return undefined;\n }\n }\n else {\n rest = afterScheme || undefined;\n }\n const challenge = { scheme, parameters };\n if (token68) {\n challenge.token68 = token68;\n }\n challenges.push(challenge);\n }\n if (!challenges.length) {\n return undefined;\n }\n return challenges;\n}\nexport async function processPushedAuthorizationResponse(as, client, response) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 201, 'Pushed Authorization Request Endpoint');\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.request_uri, '\"response\" body \"request_uri\" property', INVALID_RESPONSE, {\n body: json,\n });\n let expiresIn = typeof json.expires_in !== 'number' ? parseFloat(json.expires_in) : json.expires_in;\n assertNumber(expiresIn, true, '\"response\" body \"expires_in\" property', INVALID_RESPONSE, {\n body: json,\n });\n json.expires_in = expiresIn;\n return json;\n}\nasync function parseOAuthResponseErrorBody(response) {\n if (response.status > 399 && response.status < 500) {\n assertReadableResponse(response);\n assertApplicationJson(response);\n try {\n const json = await response.clone().json();\n if (isJsonObject(json) && typeof json.error === 'string' && json.error.length) {\n return json;\n }\n }\n catch { }\n }\n return undefined;\n}\nasync function checkOAuthBodyError(response, expected, label) {\n if (response.status !== expected) {\n checkAuthenticationChallenges(response);\n let err;\n if ((err = await parseOAuthResponseErrorBody(response))) {\n await response.body?.cancel();\n throw new ResponseBodyError('server responded with an error in the response body', {\n cause: err,\n response,\n });\n }\n throw OPE(`\"response\" is not a conform ${label} response (unexpected HTTP status code)`, RESPONSE_IS_NOT_CONFORM, response);\n }\n}\nfunction assertDPoP(option) {\n if (!branded.has(option)) {\n throw CodedTypeError('\"options.DPoP\" is not a valid DPoPHandle', ERR_INVALID_ARG_VALUE);\n }\n}\nasync function resourceRequest(accessToken, method, url, headers, body, options) {\n assertString(accessToken, '\"accessToken\"');\n if (!(url instanceof URL)) {\n throw CodedTypeError('\"url\" must be an instance of URL', ERR_INVALID_ARG_TYPE);\n }\n checkProtocol(url, options?.[allowInsecureRequests] !== true);\n headers = prepareHeaders(headers);\n if (options?.DPoP) {\n assertDPoP(options.DPoP);\n await options.DPoP.addProof(url, headers, method.toUpperCase(), accessToken);\n }\n headers.set('authorization', `${headers.has('dpop') ? 'DPoP' : 'Bearer'} ${accessToken}`);\n const response = await (options?.[customFetch] || fetch)(url.href, {\n duplex: looseInstanceOf(body, ReadableStream) ? 'half' : undefined,\n body,\n headers: Object.fromEntries(headers.entries()),\n method,\n redirect: 'manual',\n signal: signal(url, options?.signal),\n });\n options?.DPoP?.cacheNonce(response, url);\n return response;\n}\nexport async function protectedResourceRequest(accessToken, method, url, headers, body, options) {\n const response = await resourceRequest(accessToken, method, url, headers, body, options);\n checkAuthenticationChallenges(response);\n return response;\n}\nexport async function userInfoRequest(as, client, accessToken, options) {\n assertAs(as);\n assertClient(client);\n const url = resolveEndpoint(as, 'userinfo_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const headers = prepareHeaders(options?.headers);\n if (client.userinfo_signed_response_alg) {\n headers.set('accept', 'application/jwt');\n }\n else {\n headers.set('accept', 'application/json');\n headers.append('accept', 'application/jwt');\n }\n return resourceRequest(accessToken, 'GET', url, headers, null, {\n ...options,\n [clockSkew]: getClockSkew(client),\n });\n}\nlet jwksMap;\nfunction setJwksCache(as, jwks, uat, cache) {\n jwksMap ||= new WeakMap();\n jwksMap.set(as, {\n jwks,\n uat,\n get age() {\n return epochTime() - this.uat;\n },\n });\n if (cache) {\n Object.assign(cache, { jwks: structuredClone(jwks), uat });\n }\n}\nfunction isFreshJwksCache(input) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || epochTime() - input.uat >= 300) {\n return false;\n }\n if (!('jwks' in input) ||\n !isJsonObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isJsonObject)) {\n return false;\n }\n return true;\n}\nfunction clearJwksCache(as, cache) {\n jwksMap?.delete(as);\n delete cache?.jwks;\n delete cache?.uat;\n}\nasync function getPublicSigKeyFromIssuerJwksUri(as, options, header) {\n const { alg, kid } = header;\n checkSupportedJwsAlg(header);\n if (!jwksMap?.has(as) && isFreshJwksCache(options?.[jwksCache])) {\n setJwksCache(as, options?.[jwksCache].jwks, options?.[jwksCache].uat);\n }\n let jwks;\n let age;\n if (jwksMap?.has(as)) {\n ;\n ({ jwks, age } = jwksMap.get(as));\n if (age >= 300) {\n clearJwksCache(as, options?.[jwksCache]);\n return getPublicSigKeyFromIssuerJwksUri(as, options, header);\n }\n }\n else {\n jwks = await jwksRequest(as, options).then(processJwksResponse);\n age = 0;\n setJwksCache(as, jwks, epochTime(), options?.[jwksCache]);\n }\n let kty;\n switch (alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n kty = 'RSA';\n break;\n case 'ES':\n kty = 'EC';\n break;\n case 'Ed':\n kty = 'OKP';\n break;\n case 'ML':\n kty = 'AKP';\n break;\n default:\n throw new UnsupportedOperationError('unsupported JWS algorithm', { cause: { alg } });\n }\n const candidates = jwks.keys.filter((jwk) => {\n if (jwk.kty !== kty) {\n return false;\n }\n if (kid !== undefined && kid !== jwk.kid) {\n return false;\n }\n if (jwk.alg !== undefined && alg !== jwk.alg) {\n return false;\n }\n if (jwk.use !== undefined && jwk.use !== 'sig') {\n return false;\n }\n if (jwk.key_ops?.includes('verify') === false) {\n return false;\n }\n switch (true) {\n case alg === 'ES256' && jwk.crv !== 'P-256':\n case alg === 'ES384' && jwk.crv !== 'P-384':\n case alg === 'ES512' && jwk.crv !== 'P-521':\n case alg === 'Ed25519' && jwk.crv !== 'Ed25519':\n case alg === 'EdDSA' && jwk.crv !== 'Ed25519':\n return false;\n }\n return true;\n });\n const { 0: jwk, length } = candidates;\n if (!length) {\n if (age >= 60) {\n clearJwksCache(as, options?.[jwksCache]);\n return getPublicSigKeyFromIssuerJwksUri(as, options, header);\n }\n throw OPE('error when selecting a JWT verification key, no applicable keys found', KEY_SELECTION, { header, candidates, jwks_uri: new URL(as.jwks_uri) });\n }\n if (length !== 1) {\n throw OPE('error when selecting a JWT verification key, multiple applicable keys found, a \"kid\" JWT Header Parameter is required', KEY_SELECTION, { header, candidates, jwks_uri: new URL(as.jwks_uri) });\n }\n return importJwk(alg, jwk);\n}\nexport const skipSubjectCheck = Symbol();\nexport function getContentType(input) {\n return input.headers.get('content-type')?.split(';')[0];\n}\nexport async function processUserInfoResponse(as, client, expectedSubject, response, options) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n checkAuthenticationChallenges(response);\n if (response.status !== 200) {\n throw OPE('\"response\" is not a conform UserInfo Endpoint response (unexpected HTTP status code)', RESPONSE_IS_NOT_CONFORM, response);\n }\n assertReadableResponse(response);\n let json;\n if (getContentType(response) === 'application/jwt') {\n const { claims, jwt } = await validateJwt(await response.text(), checkSigningAlgorithm.bind(undefined, client.userinfo_signed_response_alg, as.userinfo_signing_alg_values_supported, undefined), getClockSkew(client), getClockTolerance(client), options?.[jweDecrypt])\n .then(validateOptionalAudience.bind(undefined, client.client_id))\n .then(validateOptionalIssuer.bind(undefined, as));\n jwtRefs.set(response, jwt);\n json = claims;\n }\n else {\n if (client.userinfo_signed_response_alg) {\n throw OPE('JWT UserInfo Response expected', JWT_USERINFO_EXPECTED, response);\n }\n json = await getResponseJsonBody(response);\n }\n assertString(json.sub, '\"response\" body \"sub\" property', INVALID_RESPONSE, { body: json });\n switch (expectedSubject) {\n case skipSubjectCheck:\n break;\n default:\n assertString(expectedSubject, '\"expectedSubject\"');\n if (json.sub !== expectedSubject) {\n throw OPE('unexpected \"response\" body \"sub\" property value', JSON_ATTRIBUTE_COMPARISON, {\n expected: expectedSubject,\n body: json,\n attribute: 'sub',\n });\n }\n }\n return json;\n}\nasync function authenticatedRequest(as, client, clientAuthentication, url, body, headers, options) {\n await clientAuthentication(as, client, body, headers);\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n return (options?.[customFetch] || fetch)(url.href, {\n body,\n headers: Object.fromEntries(headers.entries()),\n method: 'POST',\n redirect: 'manual',\n signal: signal(url, options?.signal),\n });\n}\nasync function tokenEndpointRequest(as, client, clientAuthentication, grantType, parameters, options) {\n const url = resolveEndpoint(as, 'token_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n parameters.set('grant_type', grantType);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n if (options?.DPoP !== undefined) {\n assertDPoP(options.DPoP);\n await options.DPoP.addProof(url, headers, 'POST');\n }\n const response = await authenticatedRequest(as, client, clientAuthentication, url, parameters, headers, options);\n options?.DPoP?.cacheNonce(response, url);\n return response;\n}\nexport async function refreshTokenGrantRequest(as, client, clientAuthentication, refreshToken, options) {\n assertAs(as);\n assertClient(client);\n assertString(refreshToken, '\"refreshToken\"');\n const parameters = new URLSearchParams(options?.additionalParameters);\n parameters.set('refresh_token', refreshToken);\n return tokenEndpointRequest(as, client, clientAuthentication, 'refresh_token', parameters, options);\n}\nconst idTokenClaims = new WeakMap();\nconst jwtRefs = new WeakMap();\nexport function getValidatedIdTokenClaims(ref) {\n if (!ref.id_token) {\n return undefined;\n }\n const claims = idTokenClaims.get(ref);\n if (!claims) {\n throw CodedTypeError('\"ref\" was already garbage collected or did not resolve from the proper sources', ERR_INVALID_ARG_VALUE);\n }\n return claims;\n}\nexport async function validateApplicationLevelSignature(as, ref, options) {\n assertAs(as);\n if (!jwtRefs.has(ref)) {\n throw CodedTypeError('\"ref\" does not contain a processed JWT Response to verify the signature of', ERR_INVALID_ARG_VALUE);\n }\n const { 0: protectedHeader, 1: payload, 2: encodedSignature } = jwtRefs.get(ref).split('.');\n const header = JSON.parse(buf(b64u(protectedHeader)));\n if (header.alg.startsWith('HS')) {\n throw new UnsupportedOperationError('unsupported JWS algorithm', { cause: { alg: header.alg } });\n }\n let key;\n key = await getPublicSigKeyFromIssuerJwksUri(as, options, header);\n await validateJwsSignature(protectedHeader, payload, key, b64u(encodedSignature));\n}\nasync function processGenericAccessTokenResponse(as, client, response, additionalRequiredIdTokenClaims, decryptFn, recognizedTokenTypes) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 200, 'Token Endpoint');\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.access_token, '\"response\" body \"access_token\" property', INVALID_RESPONSE, {\n body: json,\n });\n assertString(json.token_type, '\"response\" body \"token_type\" property', INVALID_RESPONSE, {\n body: json,\n });\n json.token_type = json.token_type.toLowerCase();\n if (json.expires_in !== undefined) {\n let expiresIn = typeof json.expires_in !== 'number' ? parseFloat(json.expires_in) : json.expires_in;\n assertNumber(expiresIn, true, '\"response\" body \"expires_in\" property', INVALID_RESPONSE, {\n body: json,\n });\n json.expires_in = expiresIn;\n }\n if (json.refresh_token !== undefined) {\n assertString(json.refresh_token, '\"response\" body \"refresh_token\" property', INVALID_RESPONSE, {\n body: json,\n });\n }\n if (json.scope !== undefined && typeof json.scope !== 'string') {\n throw OPE('\"response\" body \"scope\" property must be a string', INVALID_RESPONSE, { body: json });\n }\n if (json.id_token !== undefined) {\n assertString(json.id_token, '\"response\" body \"id_token\" property', INVALID_RESPONSE, {\n body: json,\n });\n const requiredClaims = ['aud', 'exp', 'iat', 'iss', 'sub'];\n if (client.require_auth_time === true) {\n requiredClaims.push('auth_time');\n }\n if (client.default_max_age !== undefined) {\n assertNumber(client.default_max_age, true, '\"client.default_max_age\"');\n requiredClaims.push('auth_time');\n }\n if (additionalRequiredIdTokenClaims?.length) {\n requiredClaims.push(...additionalRequiredIdTokenClaims);\n }\n const { claims, jwt } = await validateJwt(json.id_token, checkSigningAlgorithm.bind(undefined, client.id_token_signed_response_alg, as.id_token_signing_alg_values_supported, 'RS256'), getClockSkew(client), getClockTolerance(client), decryptFn)\n .then(validatePresence.bind(undefined, requiredClaims))\n .then(validateIssuer.bind(undefined, as))\n .then(validateAudience.bind(undefined, client.client_id));\n if (Array.isArray(claims.aud) && claims.aud.length !== 1) {\n if (claims.azp === undefined) {\n throw OPE('ID Token \"aud\" (audience) claim includes additional untrusted audiences', JWT_CLAIM_COMPARISON, { claims, claim: 'aud' });\n }\n if (claims.azp !== client.client_id) {\n throw OPE('unexpected ID Token \"azp\" (authorized party) claim value', JWT_CLAIM_COMPARISON, { expected: client.client_id, claims, claim: 'azp' });\n }\n }\n if (claims.auth_time !== undefined) {\n assertNumber(claims.auth_time, true, 'ID Token \"auth_time\" (authentication time)', INVALID_RESPONSE, { claims });\n }\n jwtRefs.set(response, jwt);\n idTokenClaims.set(json, claims);\n }\n if (recognizedTokenTypes?.[json.token_type] !== undefined) {\n recognizedTokenTypes[json.token_type](response, json);\n }\n else if (json.token_type !== 'dpop' && json.token_type !== 'bearer') {\n throw new UnsupportedOperationError('unsupported `token_type` value', { cause: { body: json } });\n }\n return json;\n}\nfunction checkAuthenticationChallenges(response) {\n let challenges;\n if ((challenges = parseWwwAuthenticateChallenges(response))) {\n throw new WWWAuthenticateChallengeError('server responded with a challenge in the WWW-Authenticate HTTP Header', { cause: challenges, response });\n }\n}\nexport async function processRefreshTokenResponse(as, client, response, options) {\n return processGenericAccessTokenResponse(as, client, response, undefined, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nfunction validateOptionalAudience(expected, result) {\n if (result.claims.aud !== undefined) {\n return validateAudience(expected, result);\n }\n return result;\n}\nfunction validateAudience(expected, result) {\n if (Array.isArray(result.claims.aud)) {\n if (!result.claims.aud.includes(expected)) {\n throw OPE('unexpected JWT \"aud\" (audience) claim value', JWT_CLAIM_COMPARISON, {\n expected,\n claims: result.claims,\n claim: 'aud',\n });\n }\n }\n else if (result.claims.aud !== expected) {\n throw OPE('unexpected JWT \"aud\" (audience) claim value', JWT_CLAIM_COMPARISON, {\n expected,\n claims: result.claims,\n claim: 'aud',\n });\n }\n return result;\n}\nfunction validateOptionalIssuer(as, result) {\n if (result.claims.iss !== undefined) {\n return validateIssuer(as, result);\n }\n return result;\n}\nfunction validateIssuer(as, result) {\n const expected = as[_expectedIssuer]?.(result) ?? as.issuer;\n if (result.claims.iss !== expected) {\n throw OPE('unexpected JWT \"iss\" (issuer) claim value', JWT_CLAIM_COMPARISON, {\n expected,\n claims: result.claims,\n claim: 'iss',\n });\n }\n return result;\n}\nconst branded = new WeakSet();\nfunction brand(searchParams) {\n branded.add(searchParams);\n return searchParams;\n}\nexport const nopkce = Symbol();\nexport async function authorizationCodeGrantRequest(as, client, clientAuthentication, callbackParameters, redirectUri, codeVerifier, options) {\n assertAs(as);\n assertClient(client);\n if (!branded.has(callbackParameters)) {\n throw CodedTypeError('\"callbackParameters\" must be an instance of URLSearchParams obtained from \"validateAuthResponse()\", or \"validateJwtAuthResponse()', ERR_INVALID_ARG_VALUE);\n }\n assertString(redirectUri, '\"redirectUri\"');\n const code = getURLSearchParameter(callbackParameters, 'code');\n if (!code) {\n throw OPE('no authorization code in \"callbackParameters\"', INVALID_RESPONSE);\n }\n const parameters = new URLSearchParams(options?.additionalParameters);\n parameters.set('redirect_uri', redirectUri);\n parameters.set('code', code);\n if (codeVerifier !== nopkce) {\n assertString(codeVerifier, '\"codeVerifier\"');\n parameters.set('code_verifier', codeVerifier);\n }\n return tokenEndpointRequest(as, client, clientAuthentication, 'authorization_code', parameters, options);\n}\nconst jwtClaimNames = {\n aud: 'audience',\n c_hash: 'code hash',\n client_id: 'client id',\n exp: 'expiration time',\n iat: 'issued at',\n iss: 'issuer',\n jti: 'jwt id',\n nonce: 'nonce',\n s_hash: 'state hash',\n sub: 'subject',\n ath: 'access token hash',\n htm: 'http method',\n htu: 'http uri',\n cnf: 'confirmation',\n auth_time: 'authentication time',\n};\nfunction validatePresence(required, result) {\n for (const claim of required) {\n if (result.claims[claim] === undefined) {\n throw OPE(`JWT \"${claim}\" (${jwtClaimNames[claim]}) claim missing`, INVALID_RESPONSE, {\n claims: result.claims,\n });\n }\n }\n return result;\n}\nexport const expectNoNonce = Symbol();\nexport const skipAuthTimeCheck = Symbol();\nexport async function processAuthorizationCodeResponse(as, client, response, options) {\n if (typeof options?.expectedNonce === 'string' ||\n typeof options?.maxAge === 'number' ||\n options?.requireIdToken) {\n return processAuthorizationCodeOpenIDResponse(as, client, response, options.expectedNonce, options.maxAge, options[jweDecrypt], options.recognizedTokenTypes);\n }\n return processAuthorizationCodeOAuth2Response(as, client, response, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nasync function processAuthorizationCodeOpenIDResponse(as, client, response, expectedNonce, maxAge, decryptFn, recognizedTokenTypes) {\n const additionalRequiredClaims = [];\n switch (expectedNonce) {\n case undefined:\n expectedNonce = expectNoNonce;\n break;\n case expectNoNonce:\n break;\n default:\n assertString(expectedNonce, '\"expectedNonce\" argument');\n additionalRequiredClaims.push('nonce');\n }\n maxAge ??= client.default_max_age;\n switch (maxAge) {\n case undefined:\n maxAge = skipAuthTimeCheck;\n break;\n case skipAuthTimeCheck:\n break;\n default:\n assertNumber(maxAge, true, '\"maxAge\" argument');\n additionalRequiredClaims.push('auth_time');\n }\n const result = await processGenericAccessTokenResponse(as, client, response, additionalRequiredClaims, decryptFn, recognizedTokenTypes);\n assertString(result.id_token, '\"response\" body \"id_token\" property', INVALID_RESPONSE, {\n body: result,\n });\n const claims = getValidatedIdTokenClaims(result);\n if (maxAge !== skipAuthTimeCheck) {\n const now = epochTime() + getClockSkew(client);\n const tolerance = getClockTolerance(client);\n if (claims.auth_time + maxAge < now - tolerance) {\n throw OPE('too much time has elapsed since the last End-User authentication', JWT_TIMESTAMP_CHECK, { claims, now, tolerance, claim: 'auth_time' });\n }\n }\n if (expectedNonce === expectNoNonce) {\n if (claims.nonce !== undefined) {\n throw OPE('unexpected ID Token \"nonce\" claim value', JWT_CLAIM_COMPARISON, {\n expected: undefined,\n claims,\n claim: 'nonce',\n });\n }\n }\n else if (claims.nonce !== expectedNonce) {\n throw OPE('unexpected ID Token \"nonce\" claim value', JWT_CLAIM_COMPARISON, {\n expected: expectedNonce,\n claims,\n claim: 'nonce',\n });\n }\n return result;\n}\nasync function processAuthorizationCodeOAuth2Response(as, client, response, decryptFn, recognizedTokenTypes) {\n const result = await processGenericAccessTokenResponse(as, client, response, undefined, decryptFn, recognizedTokenTypes);\n const claims = getValidatedIdTokenClaims(result);\n if (claims) {\n if (client.default_max_age !== undefined) {\n assertNumber(client.default_max_age, true, '\"client.default_max_age\"');\n const now = epochTime() + getClockSkew(client);\n const tolerance = getClockTolerance(client);\n if (claims.auth_time + client.default_max_age < now - tolerance) {\n throw OPE('too much time has elapsed since the last End-User authentication', JWT_TIMESTAMP_CHECK, { claims, now, tolerance, claim: 'auth_time' });\n }\n }\n if (claims.nonce !== undefined) {\n throw OPE('unexpected ID Token \"nonce\" claim value', JWT_CLAIM_COMPARISON, {\n expected: undefined,\n claims,\n claim: 'nonce',\n });\n }\n }\n return result;\n}\nexport const WWW_AUTHENTICATE_CHALLENGE = 'OAUTH_WWW_AUTHENTICATE_CHALLENGE';\nexport const RESPONSE_BODY_ERROR = 'OAUTH_RESPONSE_BODY_ERROR';\nexport const UNSUPPORTED_OPERATION = 'OAUTH_UNSUPPORTED_OPERATION';\nexport const AUTHORIZATION_RESPONSE_ERROR = 'OAUTH_AUTHORIZATION_RESPONSE_ERROR';\nexport const JWT_USERINFO_EXPECTED = 'OAUTH_JWT_USERINFO_EXPECTED';\nexport const PARSE_ERROR = 'OAUTH_PARSE_ERROR';\nexport const INVALID_RESPONSE = 'OAUTH_INVALID_RESPONSE';\nexport const INVALID_REQUEST = 'OAUTH_INVALID_REQUEST';\nexport const RESPONSE_IS_NOT_JSON = 'OAUTH_RESPONSE_IS_NOT_JSON';\nexport const RESPONSE_IS_NOT_CONFORM = 'OAUTH_RESPONSE_IS_NOT_CONFORM';\nexport const HTTP_REQUEST_FORBIDDEN = 'OAUTH_HTTP_REQUEST_FORBIDDEN';\nexport const REQUEST_PROTOCOL_FORBIDDEN = 'OAUTH_REQUEST_PROTOCOL_FORBIDDEN';\nexport const JWT_TIMESTAMP_CHECK = 'OAUTH_JWT_TIMESTAMP_CHECK_FAILED';\nexport const JWT_CLAIM_COMPARISON = 'OAUTH_JWT_CLAIM_COMPARISON_FAILED';\nexport const JSON_ATTRIBUTE_COMPARISON = 'OAUTH_JSON_ATTRIBUTE_COMPARISON_FAILED';\nexport const KEY_SELECTION = 'OAUTH_KEY_SELECTION_FAILED';\nexport const MISSING_SERVER_METADATA = 'OAUTH_MISSING_SERVER_METADATA';\nexport const INVALID_SERVER_METADATA = 'OAUTH_INVALID_SERVER_METADATA';\nfunction checkJwtType(expected, result) {\n if (typeof result.header.typ !== 'string' || normalizeTyp(result.header.typ) !== expected) {\n throw OPE('unexpected JWT \"typ\" header parameter value', INVALID_RESPONSE, {\n header: result.header,\n });\n }\n return result;\n}\nexport async function clientCredentialsGrantRequest(as, client, clientAuthentication, parameters, options) {\n assertAs(as);\n assertClient(client);\n return tokenEndpointRequest(as, client, clientAuthentication, 'client_credentials', new URLSearchParams(parameters), options);\n}\nexport async function genericTokenEndpointRequest(as, client, clientAuthentication, grantType, parameters, options) {\n assertAs(as);\n assertClient(client);\n assertString(grantType, '\"grantType\"');\n return tokenEndpointRequest(as, client, clientAuthentication, grantType, new URLSearchParams(parameters), options);\n}\nexport async function processGenericTokenEndpointResponse(as, client, response, options) {\n return processGenericAccessTokenResponse(as, client, response, undefined, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nexport async function processClientCredentialsResponse(as, client, response, options) {\n return processGenericAccessTokenResponse(as, client, response, undefined, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nexport async function revocationRequest(as, client, clientAuthentication, token, options) {\n assertAs(as);\n assertClient(client);\n assertString(token, '\"token\"');\n const url = resolveEndpoint(as, 'revocation_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const body = new URLSearchParams(options?.additionalParameters);\n body.set('token', token);\n const headers = prepareHeaders(options?.headers);\n headers.delete('accept');\n return authenticatedRequest(as, client, clientAuthentication, url, body, headers, options);\n}\nexport async function processRevocationResponse(response) {\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 200, 'Revocation Endpoint');\n return undefined;\n}\nfunction assertReadableResponse(response) {\n if (response.bodyUsed) {\n throw CodedTypeError('\"response\" body has been used already', ERR_INVALID_ARG_VALUE);\n }\n}\nexport async function introspectionRequest(as, client, clientAuthentication, token, options) {\n assertAs(as);\n assertClient(client);\n assertString(token, '\"token\"');\n const url = resolveEndpoint(as, 'introspection_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const body = new URLSearchParams(options?.additionalParameters);\n body.set('token', token);\n const headers = prepareHeaders(options?.headers);\n if (options?.requestJwtResponse ?? client.introspection_signed_response_alg) {\n headers.set('accept', 'application/token-introspection+jwt');\n }\n else {\n headers.set('accept', 'application/json');\n }\n return authenticatedRequest(as, client, clientAuthentication, url, body, headers, options);\n}\nexport async function processIntrospectionResponse(as, client, response, options) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 200, 'Introspection Endpoint');\n let json;\n if (getContentType(response) === 'application/token-introspection+jwt') {\n assertReadableResponse(response);\n const { claims, jwt } = await validateJwt(await response.text(), checkSigningAlgorithm.bind(undefined, client.introspection_signed_response_alg, as.introspection_signing_alg_values_supported, 'RS256'), getClockSkew(client), getClockTolerance(client), options?.[jweDecrypt])\n .then(checkJwtType.bind(undefined, 'token-introspection+jwt'))\n .then(validatePresence.bind(undefined, ['aud', 'iat', 'iss']))\n .then(validateIssuer.bind(undefined, as))\n .then(validateAudience.bind(undefined, client.client_id));\n jwtRefs.set(response, jwt);\n if (!isJsonObject(claims.token_introspection)) {\n throw OPE('JWT \"token_introspection\" claim must be a JSON object', INVALID_RESPONSE, {\n claims,\n });\n }\n json = claims.token_introspection;\n }\n else {\n assertReadableResponse(response);\n json = await getResponseJsonBody(response);\n }\n if (typeof json.active !== 'boolean') {\n throw OPE('\"response\" body \"active\" property must be a boolean', INVALID_RESPONSE, {\n body: json,\n });\n }\n return json;\n}\nasync function jwksRequest(as, options) {\n assertAs(as);\n const url = resolveEndpoint(as, 'jwks_uri', false, options?.[allowInsecureRequests] !== true);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n headers.append('accept', 'application/jwk-set+json');\n return (options?.[customFetch] || fetch)(url.href, {\n body: undefined,\n headers: Object.fromEntries(headers.entries()),\n method: 'GET',\n redirect: 'manual',\n signal: signal(url, options?.signal),\n });\n}\nasync function processJwksResponse(response) {\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n if (response.status !== 200) {\n throw OPE('\"response\" is not a conform JSON Web Key Set response (unexpected HTTP status code)', RESPONSE_IS_NOT_CONFORM, response);\n }\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response, (response) => assertContentTypes(response, 'application/json', 'application/jwk-set+json'));\n if (!Array.isArray(json.keys)) {\n throw OPE('\"response\" body \"keys\" property must be an array', INVALID_RESPONSE, { body: json });\n }\n if (!Array.prototype.every.call(json.keys, isJsonObject)) {\n throw OPE('\"response\" body \"keys\" property members must be JWK formatted objects', INVALID_RESPONSE, { body: json });\n }\n return json;\n}\nfunction supported(alg) {\n switch (alg) {\n case 'PS256':\n case 'ES256':\n case 'RS256':\n case 'PS384':\n case 'ES384':\n case 'RS384':\n case 'PS512':\n case 'ES512':\n case 'RS512':\n case 'Ed25519':\n case 'EdDSA':\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return true;\n default:\n return false;\n }\n}\nfunction checkSupportedJwsAlg(header) {\n if (!supported(header.alg)) {\n throw new UnsupportedOperationError('unsupported JWS \"alg\" identifier', {\n cause: { alg: header.alg },\n });\n }\n}\nfunction checkRsaKeyAlgorithm(key) {\n const { algorithm } = key;\n if (typeof algorithm.modulusLength !== 'number' || algorithm.modulusLength < 2048) {\n throw new UnsupportedOperationError(`unsupported ${algorithm.name} modulusLength`, {\n cause: key,\n });\n }\n}\nfunction ecdsaHashName(key) {\n const { algorithm } = key;\n switch (algorithm.namedCurve) {\n case 'P-256':\n return 'SHA-256';\n case 'P-384':\n return 'SHA-384';\n case 'P-521':\n return 'SHA-512';\n default:\n throw new UnsupportedOperationError('unsupported ECDSA namedCurve', { cause: key });\n }\n}\nfunction keyToSubtle(key) {\n switch (key.algorithm.name) {\n case 'ECDSA':\n return {\n name: key.algorithm.name,\n hash: ecdsaHashName(key),\n };\n case 'RSA-PSS': {\n checkRsaKeyAlgorithm(key);\n switch (key.algorithm.hash.name) {\n case 'SHA-256':\n case 'SHA-384':\n case 'SHA-512':\n return {\n name: key.algorithm.name,\n saltLength: parseInt(key.algorithm.hash.name.slice(-3), 10) >> 3,\n };\n default:\n throw new UnsupportedOperationError('unsupported RSA-PSS hash name', { cause: key });\n }\n }\n case 'RSASSA-PKCS1-v1_5':\n checkRsaKeyAlgorithm(key);\n return key.algorithm.name;\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n case 'Ed25519':\n return key.algorithm.name;\n }\n throw new UnsupportedOperationError('unsupported CryptoKey algorithm name', { cause: key });\n}\nasync function validateJwsSignature(protectedHeader, payload, key, signature) {\n const data = buf(`${protectedHeader}.${payload}`);\n const algorithm = keyToSubtle(key);\n const verified = await crypto.subtle.verify(algorithm, key, signature, data);\n if (!verified) {\n throw OPE('JWT signature verification failed', INVALID_RESPONSE, {\n key,\n data,\n signature,\n algorithm,\n });\n }\n}\nasync function validateJwt(jws, checkAlg, clockSkew, clockTolerance, decryptJwt) {\n let { 0: protectedHeader, 1: payload, length } = jws.split('.');\n if (length === 5) {\n if (decryptJwt !== undefined) {\n jws = await decryptJwt(jws);\n ({ 0: protectedHeader, 1: payload, length } = jws.split('.'));\n }\n else {\n throw new UnsupportedOperationError('JWE decryption is not configured', { cause: jws });\n }\n }\n if (length !== 3) {\n throw OPE('Invalid JWT', INVALID_RESPONSE, jws);\n }\n let header;\n try {\n header = JSON.parse(buf(b64u(protectedHeader)));\n }\n catch (cause) {\n throw OPE('failed to parse JWT Header body as base64url encoded JSON', PARSE_ERROR, cause);\n }\n if (!isJsonObject(header)) {\n throw OPE('JWT Header must be a top level object', INVALID_RESPONSE, jws);\n }\n checkAlg(header);\n if (header.crit !== undefined) {\n throw new UnsupportedOperationError('no JWT \"crit\" header parameter extensions are supported', {\n cause: { header },\n });\n }\n let claims;\n try {\n claims = JSON.parse(buf(b64u(payload)));\n }\n catch (cause) {\n throw OPE('failed to parse JWT Payload body as base64url encoded JSON', PARSE_ERROR, cause);\n }\n if (!isJsonObject(claims)) {\n throw OPE('JWT Payload must be a top level object', INVALID_RESPONSE, jws);\n }\n const now = epochTime() + clockSkew;\n if (claims.exp !== undefined) {\n if (typeof claims.exp !== 'number') {\n throw OPE('unexpected JWT \"exp\" (expiration time) claim type', INVALID_RESPONSE, { claims });\n }\n if (claims.exp <= now - clockTolerance) {\n throw OPE('unexpected JWT \"exp\" (expiration time) claim value, expiration is past current timestamp', JWT_TIMESTAMP_CHECK, { claims, now, tolerance: clockTolerance, claim: 'exp' });\n }\n }\n if (claims.iat !== undefined) {\n if (typeof claims.iat !== 'number') {\n throw OPE('unexpected JWT \"iat\" (issued at) claim type', INVALID_RESPONSE, { claims });\n }\n }\n if (claims.iss !== undefined) {\n if (typeof claims.iss !== 'string') {\n throw OPE('unexpected JWT \"iss\" (issuer) claim type', INVALID_RESPONSE, { claims });\n }\n }\n if (claims.nbf !== undefined) {\n if (typeof claims.nbf !== 'number') {\n throw OPE('unexpected JWT \"nbf\" (not before) claim type', INVALID_RESPONSE, { claims });\n }\n if (claims.nbf > now + clockTolerance) {\n throw OPE('unexpected JWT \"nbf\" (not before) claim value', JWT_TIMESTAMP_CHECK, {\n claims,\n now,\n tolerance: clockTolerance,\n claim: 'nbf',\n });\n }\n }\n if (claims.aud !== undefined) {\n if (typeof claims.aud !== 'string' && !Array.isArray(claims.aud)) {\n throw OPE('unexpected JWT \"aud\" (audience) claim type', INVALID_RESPONSE, { claims });\n }\n }\n return { header, claims, jwt: jws };\n}\nexport async function validateJwtAuthResponse(as, client, parameters, expectedState, options) {\n assertAs(as);\n assertClient(client);\n if (parameters instanceof URL) {\n parameters = parameters.searchParams;\n }\n if (!(parameters instanceof URLSearchParams)) {\n throw CodedTypeError('\"parameters\" must be an instance of URLSearchParams, or URL', ERR_INVALID_ARG_TYPE);\n }\n const response = getURLSearchParameter(parameters, 'response');\n if (!response) {\n throw OPE('\"parameters\" does not contain a JARM response', INVALID_RESPONSE);\n }\n const { claims, header, jwt } = await validateJwt(response, checkSigningAlgorithm.bind(undefined, client.authorization_signed_response_alg, as.authorization_signing_alg_values_supported, 'RS256'), getClockSkew(client), getClockTolerance(client), options?.[jweDecrypt])\n .then(validatePresence.bind(undefined, ['aud', 'exp', 'iss']))\n .then(validateIssuer.bind(undefined, as))\n .then(validateAudience.bind(undefined, client.client_id));\n const { 0: protectedHeader, 1: payload, 2: encodedSignature } = jwt.split('.');\n const signature = b64u(encodedSignature);\n const key = await getPublicSigKeyFromIssuerJwksUri(as, options, header);\n await validateJwsSignature(protectedHeader, payload, key, signature);\n const result = new URLSearchParams();\n for (const [key, value] of Object.entries(claims)) {\n if (typeof value === 'string' && key !== 'aud') {\n result.set(key, value);\n }\n }\n return validateAuthResponse(as, client, result, expectedState);\n}\nasync function idTokenHash(data, header, claimName) {\n let algorithm;\n switch (header.alg) {\n case 'RS256':\n case 'PS256':\n case 'ES256':\n algorithm = 'SHA-256';\n break;\n case 'RS384':\n case 'PS384':\n case 'ES384':\n algorithm = 'SHA-384';\n break;\n case 'RS512':\n case 'PS512':\n case 'ES512':\n case 'Ed25519':\n case 'EdDSA':\n algorithm = 'SHA-512';\n break;\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: 'cSHAKE256', length: 512, outputLength: 512 };\n break;\n default:\n throw new UnsupportedOperationError(`unsupported JWS algorithm for ${claimName} calculation`, { cause: { alg: header.alg } });\n }\n const digest = await crypto.subtle.digest(algorithm, buf(data));\n return b64u(digest.slice(0, digest.byteLength / 2));\n}\nasync function idTokenHashMatches(data, actual, header, claimName) {\n const expected = await idTokenHash(data, header, claimName);\n return actual === expected;\n}\nexport async function validateDetachedSignatureResponse(as, client, parameters, expectedNonce, expectedState, maxAge, options) {\n return validateHybridResponse(as, client, parameters, expectedNonce, expectedState, maxAge, options, true);\n}\nexport async function validateCodeIdTokenResponse(as, client, parameters, expectedNonce, expectedState, maxAge, options) {\n return validateHybridResponse(as, client, parameters, expectedNonce, expectedState, maxAge, options, false);\n}\nasync function consumeStream(request) {\n if (request.bodyUsed) {\n throw CodedTypeError('form_post Request instances must contain a readable body', ERR_INVALID_ARG_VALUE, { cause: request });\n }\n return request.text();\n}\nexport async function formPostResponse(request) {\n if (request.method !== 'POST') {\n throw CodedTypeError('form_post responses are expected to use the POST method', ERR_INVALID_ARG_VALUE, { cause: request });\n }\n if (getContentType(request) !== 'application/x-www-form-urlencoded') {\n throw CodedTypeError('form_post responses are expected to use the application/x-www-form-urlencoded content-type', ERR_INVALID_ARG_VALUE, { cause: request });\n }\n return consumeStream(request);\n}\nasync function validateHybridResponse(as, client, parameters, expectedNonce, expectedState, maxAge, options, fapi) {\n assertAs(as);\n assertClient(client);\n if (parameters instanceof URL) {\n if (!parameters.hash.length) {\n throw CodedTypeError('\"parameters\" as an instance of URL must contain a hash (fragment) with the Authorization Response parameters', ERR_INVALID_ARG_VALUE);\n }\n parameters = new URLSearchParams(parameters.hash.slice(1));\n }\n else if (looseInstanceOf(parameters, Request)) {\n parameters = new URLSearchParams(await formPostResponse(parameters));\n }\n else if (parameters instanceof URLSearchParams) {\n parameters = new URLSearchParams(parameters);\n }\n else {\n throw CodedTypeError('\"parameters\" must be an instance of URLSearchParams, URL, or Response', ERR_INVALID_ARG_TYPE);\n }\n const id_token = getURLSearchParameter(parameters, 'id_token');\n parameters.delete('id_token');\n switch (expectedState) {\n case undefined:\n case expectNoState:\n break;\n default:\n assertString(expectedState, '\"expectedState\" argument');\n }\n const result = validateAuthResponse({\n ...as,\n authorization_response_iss_parameter_supported: false,\n }, client, parameters, expectedState);\n if (!id_token) {\n throw OPE('\"parameters\" does not contain an ID Token', INVALID_RESPONSE);\n }\n const code = getURLSearchParameter(parameters, 'code');\n if (!code) {\n throw OPE('\"parameters\" does not contain an Authorization Code', INVALID_RESPONSE);\n }\n const requiredClaims = [\n 'aud',\n 'exp',\n 'iat',\n 'iss',\n 'sub',\n 'nonce',\n 'c_hash',\n ];\n const state = parameters.get('state');\n if (fapi && (typeof expectedState === 'string' || state !== null)) {\n requiredClaims.push('s_hash');\n }\n if (maxAge !== undefined) {\n assertNumber(maxAge, true, '\"maxAge\" argument');\n }\n else if (client.default_max_age !== undefined) {\n assertNumber(client.default_max_age, true, '\"client.default_max_age\"');\n }\n maxAge ??= client.default_max_age ?? skipAuthTimeCheck;\n if (client.require_auth_time || maxAge !== skipAuthTimeCheck) {\n requiredClaims.push('auth_time');\n }\n const { claims, header, jwt } = await validateJwt(id_token, checkSigningAlgorithm.bind(undefined, client.id_token_signed_response_alg, as.id_token_signing_alg_values_supported, 'RS256'), getClockSkew(client), getClockTolerance(client), options?.[jweDecrypt])\n .then(validatePresence.bind(undefined, requiredClaims))\n .then(validateIssuer.bind(undefined, as))\n .then(validateAudience.bind(undefined, client.client_id));\n const clockSkew = getClockSkew(client);\n const now = epochTime() + clockSkew;\n if (claims.iat < now - 3600) {\n throw OPE('unexpected JWT \"iat\" (issued at) claim value, it is too far in the past', JWT_TIMESTAMP_CHECK, { now, claims, claim: 'iat' });\n }\n assertString(claims.c_hash, 'ID Token \"c_hash\" (code hash) claim value', INVALID_RESPONSE, {\n claims,\n });\n if (claims.auth_time !== undefined) {\n assertNumber(claims.auth_time, true, 'ID Token \"auth_time\" (authentication time)', INVALID_RESPONSE, { claims });\n }\n if (maxAge !== skipAuthTimeCheck) {\n const now = epochTime() + getClockSkew(client);\n const tolerance = getClockTolerance(client);\n if (claims.auth_time + maxAge < now - tolerance) {\n throw OPE('too much time has elapsed since the last End-User authentication', JWT_TIMESTAMP_CHECK, { claims, now, tolerance, claim: 'auth_time' });\n }\n }\n assertString(expectedNonce, '\"expectedNonce\" argument');\n if (claims.nonce !== expectedNonce) {\n throw OPE('unexpected ID Token \"nonce\" claim value', JWT_CLAIM_COMPARISON, {\n expected: expectedNonce,\n claims,\n claim: 'nonce',\n });\n }\n if (Array.isArray(claims.aud) && claims.aud.length !== 1) {\n if (claims.azp === undefined) {\n throw OPE('ID Token \"aud\" (audience) claim includes additional untrusted audiences', JWT_CLAIM_COMPARISON, { claims, claim: 'aud' });\n }\n if (claims.azp !== client.client_id) {\n throw OPE('unexpected ID Token \"azp\" (authorized party) claim value', JWT_CLAIM_COMPARISON, {\n expected: client.client_id,\n claims,\n claim: 'azp',\n });\n }\n }\n const { 0: protectedHeader, 1: payload, 2: encodedSignature } = jwt.split('.');\n const signature = b64u(encodedSignature);\n const key = await getPublicSigKeyFromIssuerJwksUri(as, options, header);\n await validateJwsSignature(protectedHeader, payload, key, signature);\n if ((await idTokenHashMatches(code, claims.c_hash, header, 'c_hash')) !== true) {\n throw OPE('invalid ID Token \"c_hash\" (code hash) claim value', JWT_CLAIM_COMPARISON, {\n code,\n alg: header.alg,\n claim: 'c_hash',\n claims,\n });\n }\n if ((fapi && state !== null) || claims.s_hash !== undefined) {\n assertString(claims.s_hash, 'ID Token \"s_hash\" (state hash) claim value', INVALID_RESPONSE, {\n claims,\n });\n assertString(state, '\"state\" response parameter', INVALID_RESPONSE, { parameters });\n if ((await idTokenHashMatches(state, claims.s_hash, header, 's_hash')) !== true) {\n throw OPE('invalid ID Token \"s_hash\" (state hash) claim value', JWT_CLAIM_COMPARISON, {\n state,\n alg: header.alg,\n claim: 's_hash',\n claims,\n });\n }\n }\n return result;\n}\nfunction checkSigningAlgorithm(client, issuer, fallback, header) {\n if (client !== undefined) {\n if (typeof client === 'string' ? header.alg !== client : !client.includes(header.alg)) {\n throw OPE('unexpected JWT \"alg\" header parameter', INVALID_RESPONSE, {\n header,\n expected: client,\n reason: 'client configuration',\n });\n }\n return;\n }\n if (Array.isArray(issuer)) {\n if (!issuer.includes(header.alg)) {\n throw OPE('unexpected JWT \"alg\" header parameter', INVALID_RESPONSE, {\n header,\n expected: issuer,\n reason: 'authorization server metadata',\n });\n }\n return;\n }\n if (fallback !== undefined) {\n if (typeof fallback === 'string'\n ? header.alg !== fallback\n : typeof fallback === 'function'\n ? !fallback(header.alg)\n : !fallback.includes(header.alg)) {\n throw OPE('unexpected JWT \"alg\" header parameter', INVALID_RESPONSE, {\n header,\n expected: fallback,\n reason: 'default value',\n });\n }\n return;\n }\n throw OPE('missing client or server configuration to verify used JWT \"alg\" header parameter', undefined, { client, issuer, fallback });\n}\nfunction getURLSearchParameter(parameters, name) {\n const { 0: value, length } = parameters.getAll(name);\n if (length > 1) {\n throw OPE(`\"${name}\" parameter must be provided only once`, INVALID_RESPONSE);\n }\n return value;\n}\nexport const skipStateCheck = Symbol();\nexport const expectNoState = Symbol();\nexport function validateAuthResponse(as, client, parameters, expectedState) {\n assertAs(as);\n assertClient(client);\n if (parameters instanceof URL) {\n parameters = parameters.searchParams;\n }\n if (!(parameters instanceof URLSearchParams)) {\n throw CodedTypeError('\"parameters\" must be an instance of URLSearchParams, or URL', ERR_INVALID_ARG_TYPE);\n }\n if (getURLSearchParameter(parameters, 'response')) {\n throw OPE('\"parameters\" contains a JARM response, use validateJwtAuthResponse() instead of validateAuthResponse()', INVALID_RESPONSE, { parameters });\n }\n const iss = getURLSearchParameter(parameters, 'iss');\n const state = getURLSearchParameter(parameters, 'state');\n if (!iss && as.authorization_response_iss_parameter_supported) {\n throw OPE('response parameter \"iss\" (issuer) missing', INVALID_RESPONSE, { parameters });\n }\n if (iss && iss !== as.issuer) {\n throw OPE('unexpected \"iss\" (issuer) response parameter value', INVALID_RESPONSE, {\n expected: as.issuer,\n parameters,\n });\n }\n switch (expectedState) {\n case undefined:\n case expectNoState:\n if (state !== undefined) {\n throw OPE('unexpected \"state\" response parameter encountered', INVALID_RESPONSE, {\n expected: undefined,\n parameters,\n });\n }\n break;\n case skipStateCheck:\n break;\n default:\n assertString(expectedState, '\"expectedState\" argument');\n if (state !== expectedState) {\n throw OPE(state === undefined\n ? 'response parameter \"state\" missing'\n : 'unexpected \"state\" response parameter value', INVALID_RESPONSE, { expected: expectedState, parameters });\n }\n }\n const error = getURLSearchParameter(parameters, 'error');\n if (error) {\n throw new AuthorizationResponseError('authorization response from the server is an error', {\n cause: parameters,\n });\n }\n const id_token = getURLSearchParameter(parameters, 'id_token');\n const token = getURLSearchParameter(parameters, 'token');\n if (id_token !== undefined || token !== undefined) {\n throw new UnsupportedOperationError('implicit and hybrid flows are not supported');\n }\n return brand(new URLSearchParams(parameters));\n}\nfunction algToSubtle(alg) {\n switch (alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { name: 'RSA-PSS', hash: `SHA-${alg.slice(-3)}` };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${alg.slice(-3)}` };\n case 'ES256':\n case 'ES384':\n return { name: 'ECDSA', namedCurve: `P-${alg.slice(-3)}` };\n case 'ES512':\n return { name: 'ECDSA', namedCurve: 'P-521' };\n case 'EdDSA':\n return 'Ed25519';\n case 'Ed25519':\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return alg;\n default:\n throw new UnsupportedOperationError('unsupported JWS algorithm', { cause: { alg } });\n }\n}\nasync function importJwk(alg, jwk) {\n const { ext, key_ops, use, ...key } = jwk;\n return crypto.subtle.importKey('jwk', key, algToSubtle(alg), true, ['verify']);\n}\nexport async function deviceAuthorizationRequest(as, client, clientAuthentication, parameters, options) {\n assertAs(as);\n assertClient(client);\n const url = resolveEndpoint(as, 'device_authorization_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const body = new URLSearchParams(parameters);\n body.set('client_id', client.client_id);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n return authenticatedRequest(as, client, clientAuthentication, url, body, headers, options);\n}\nexport async function processDeviceAuthorizationResponse(as, client, response) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 200, 'Device Authorization Endpoint');\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.device_code, '\"response\" body \"device_code\" property', INVALID_RESPONSE, {\n body: json,\n });\n assertString(json.user_code, '\"response\" body \"user_code\" property', INVALID_RESPONSE, {\n body: json,\n });\n assertString(json.verification_uri, '\"response\" body \"verification_uri\" property', INVALID_RESPONSE, { body: json });\n let expiresIn = typeof json.expires_in !== 'number' ? parseFloat(json.expires_in) : json.expires_in;\n assertNumber(expiresIn, true, '\"response\" body \"expires_in\" property', INVALID_RESPONSE, {\n body: json,\n });\n json.expires_in = expiresIn;\n if (json.verification_uri_complete !== undefined) {\n assertString(json.verification_uri_complete, '\"response\" body \"verification_uri_complete\" property', INVALID_RESPONSE, { body: json });\n }\n if (json.interval !== undefined) {\n assertNumber(json.interval, false, '\"response\" body \"interval\" property', INVALID_RESPONSE, {\n body: json,\n });\n }\n return json;\n}\nexport async function deviceCodeGrantRequest(as, client, clientAuthentication, deviceCode, options) {\n assertAs(as);\n assertClient(client);\n assertString(deviceCode, '\"deviceCode\"');\n const parameters = new URLSearchParams(options?.additionalParameters);\n parameters.set('device_code', deviceCode);\n return tokenEndpointRequest(as, client, clientAuthentication, 'urn:ietf:params:oauth:grant-type:device_code', parameters, options);\n}\nexport async function processDeviceCodeResponse(as, client, response, options) {\n return processGenericAccessTokenResponse(as, client, response, undefined, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nexport async function generateKeyPair(alg, options) {\n assertString(alg, '\"alg\"');\n const algorithm = algToSubtle(alg);\n if (alg.startsWith('PS') || alg.startsWith('RS')) {\n Object.assign(algorithm, {\n modulusLength: options?.modulusLength ?? 2048,\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n });\n }\n return crypto.subtle.generateKey(algorithm, options?.extractable ?? false, [\n 'sign',\n 'verify',\n ]);\n}\nfunction normalizeHtu(htu) {\n const url = new URL(htu);\n url.search = '';\n url.hash = '';\n return url.href;\n}\nasync function validateDPoP(request, accessToken, accessTokenClaims, options) {\n const headerValue = request.headers.get('dpop');\n if (headerValue === null) {\n throw OPE('operation indicated DPoP use but the request has no DPoP HTTP Header', INVALID_REQUEST, { headers: request.headers });\n }\n if (request.headers.get('authorization')?.toLowerCase().startsWith('dpop ') === false) {\n throw OPE(`operation indicated DPoP use but the request's Authorization HTTP Header scheme is not DPoP`, INVALID_REQUEST, { headers: request.headers });\n }\n if (typeof accessTokenClaims.cnf?.jkt !== 'string') {\n throw OPE('operation indicated DPoP use but the JWT Access Token has no jkt confirmation claim', INVALID_REQUEST, { claims: accessTokenClaims });\n }\n const clockSkew = getClockSkew(options);\n const proof = await validateJwt(headerValue, checkSigningAlgorithm.bind(undefined, options?.signingAlgorithms, undefined, supported), clockSkew, getClockTolerance(options), undefined)\n .then(checkJwtType.bind(undefined, 'dpop+jwt'))\n .then(validatePresence.bind(undefined, ['iat', 'jti', 'ath', 'htm', 'htu']));\n const now = epochTime() + clockSkew;\n const diff = Math.abs(now - proof.claims.iat);\n if (diff > 300) {\n throw OPE('DPoP Proof iat is not recent enough', JWT_TIMESTAMP_CHECK, {\n now,\n claims: proof.claims,\n claim: 'iat',\n });\n }\n if (proof.claims.htm !== request.method) {\n throw OPE('DPoP Proof htm mismatch', JWT_CLAIM_COMPARISON, {\n expected: request.method,\n claims: proof.claims,\n claim: 'htm',\n });\n }\n if (typeof proof.claims.htu !== 'string' ||\n normalizeHtu(proof.claims.htu) !== normalizeHtu(request.url)) {\n throw OPE('DPoP Proof htu mismatch', JWT_CLAIM_COMPARISON, {\n expected: normalizeHtu(request.url),\n claims: proof.claims,\n claim: 'htu',\n });\n }\n {\n const expected = b64u(await crypto.subtle.digest('SHA-256', buf(accessToken)));\n if (proof.claims.ath !== expected) {\n throw OPE('DPoP Proof ath mismatch', JWT_CLAIM_COMPARISON, {\n expected,\n claims: proof.claims,\n claim: 'ath',\n });\n }\n }\n {\n const expected = await calculateJwkThumbprint(proof.header.jwk);\n if (accessTokenClaims.cnf.jkt !== expected) {\n throw OPE('JWT Access Token confirmation mismatch', JWT_CLAIM_COMPARISON, {\n expected,\n claims: accessTokenClaims,\n claim: 'cnf.jkt',\n });\n }\n }\n const { 0: protectedHeader, 1: payload, 2: encodedSignature } = headerValue.split('.');\n const signature = b64u(encodedSignature);\n const { jwk, alg } = proof.header;\n if (!jwk) {\n throw OPE('DPoP Proof is missing the jwk header parameter', INVALID_REQUEST, {\n header: proof.header,\n });\n }\n const key = await importJwk(alg, jwk);\n if (key.type !== 'public') {\n throw OPE('DPoP Proof jwk header parameter must contain a public key', INVALID_REQUEST, {\n header: proof.header,\n });\n }\n await validateJwsSignature(protectedHeader, payload, key, signature);\n}\nexport async function validateJwtAccessToken(as, request, expectedAudience, options) {\n assertAs(as);\n if (!looseInstanceOf(request, Request)) {\n throw CodedTypeError('\"request\" must be an instance of Request', ERR_INVALID_ARG_TYPE);\n }\n assertString(expectedAudience, '\"expectedAudience\"');\n const authorization = request.headers.get('authorization');\n if (authorization === null) {\n throw OPE('\"request\" is missing an Authorization HTTP Header', INVALID_REQUEST, {\n headers: request.headers,\n });\n }\n let { 0: scheme, 1: accessToken, length } = authorization.split(' ');\n scheme = scheme.toLowerCase();\n switch (scheme) {\n case 'dpop':\n case 'bearer':\n break;\n default:\n throw new UnsupportedOperationError('unsupported Authorization HTTP Header scheme', {\n cause: { headers: request.headers },\n });\n }\n if (length !== 2) {\n throw OPE('invalid Authorization HTTP Header format', INVALID_REQUEST, {\n headers: request.headers,\n });\n }\n const requiredClaims = [\n 'iss',\n 'exp',\n 'aud',\n 'sub',\n 'iat',\n 'jti',\n 'client_id',\n ];\n if (options?.requireDPoP || scheme === 'dpop' || request.headers.has('dpop')) {\n requiredClaims.push('cnf');\n }\n const { claims, header } = await validateJwt(accessToken, checkSigningAlgorithm.bind(undefined, options?.signingAlgorithms, undefined, supported), getClockSkew(options), getClockTolerance(options), undefined)\n .then(checkJwtType.bind(undefined, 'at+jwt'))\n .then(validatePresence.bind(undefined, requiredClaims))\n .then(validateIssuer.bind(undefined, as))\n .then(validateAudience.bind(undefined, expectedAudience))\n .catch(reassignRSCode);\n for (const claim of ['client_id', 'jti', 'sub']) {\n if (typeof claims[claim] !== 'string') {\n throw OPE(`unexpected JWT \"${claim}\" claim type`, INVALID_REQUEST, { claims });\n }\n }\n if ('cnf' in claims) {\n if (!isJsonObject(claims.cnf)) {\n throw OPE('unexpected JWT \"cnf\" (confirmation) claim value', INVALID_REQUEST, { claims });\n }\n const { 0: cnf, length } = Object.keys(claims.cnf);\n if (length) {\n if (length !== 1) {\n throw new UnsupportedOperationError('multiple confirmation claims are not supported', {\n cause: { claims },\n });\n }\n if (cnf !== 'jkt') {\n throw new UnsupportedOperationError('unsupported JWT Confirmation method', {\n cause: { claims },\n });\n }\n }\n }\n const { 0: protectedHeader, 1: payload, 2: encodedSignature } = accessToken.split('.');\n const signature = b64u(encodedSignature);\n const key = await getPublicSigKeyFromIssuerJwksUri(as, options, header);\n await validateJwsSignature(protectedHeader, payload, key, signature);\n if (options?.requireDPoP ||\n scheme === 'dpop' ||\n claims.cnf?.jkt !== undefined ||\n request.headers.has('dpop')) {\n await validateDPoP(request, accessToken, claims, options).catch(reassignRSCode);\n }\n return claims;\n}\nfunction reassignRSCode(err) {\n if (err instanceof OperationProcessingError && err?.code === INVALID_REQUEST) {\n err.code = INVALID_RESPONSE;\n }\n throw err;\n}\nexport async function backchannelAuthenticationRequest(as, client, clientAuthentication, parameters, options) {\n assertAs(as);\n assertClient(client);\n const url = resolveEndpoint(as, 'backchannel_authentication_endpoint', client.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const body = new URLSearchParams(parameters);\n body.set('client_id', client.client_id);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n return authenticatedRequest(as, client, clientAuthentication, url, body, headers, options);\n}\nexport async function processBackchannelAuthenticationResponse(as, client, response) {\n assertAs(as);\n assertClient(client);\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 200, 'Backchannel Authentication Endpoint');\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.auth_req_id, '\"response\" body \"auth_req_id\" property', INVALID_RESPONSE, {\n body: json,\n });\n let expiresIn = typeof json.expires_in !== 'number' ? parseFloat(json.expires_in) : json.expires_in;\n assertNumber(expiresIn, true, '\"response\" body \"expires_in\" property', INVALID_RESPONSE, {\n body: json,\n });\n json.expires_in = expiresIn;\n if (json.interval !== undefined) {\n assertNumber(json.interval, false, '\"response\" body \"interval\" property', INVALID_RESPONSE, {\n body: json,\n });\n }\n return json;\n}\nexport async function backchannelAuthenticationGrantRequest(as, client, clientAuthentication, authReqId, options) {\n assertAs(as);\n assertClient(client);\n assertString(authReqId, '\"authReqId\"');\n const parameters = new URLSearchParams(options?.additionalParameters);\n parameters.set('auth_req_id', authReqId);\n return tokenEndpointRequest(as, client, clientAuthentication, 'urn:openid:params:grant-type:ciba', parameters, options);\n}\nexport async function processBackchannelAuthenticationGrantResponse(as, client, response, options) {\n return processGenericAccessTokenResponse(as, client, response, undefined, options?.[jweDecrypt], options?.recognizedTokenTypes);\n}\nexport async function dynamicClientRegistrationRequest(as, metadata, options) {\n assertAs(as);\n const url = resolveEndpoint(as, 'registration_endpoint', metadata.use_mtls_endpoint_aliases, options?.[allowInsecureRequests] !== true);\n const headers = prepareHeaders(options?.headers);\n headers.set('accept', 'application/json');\n headers.set('content-type', 'application/json');\n const method = 'POST';\n if (options?.DPoP) {\n assertDPoP(options.DPoP);\n await options.DPoP.addProof(url, headers, method, options.initialAccessToken);\n }\n if (options?.initialAccessToken) {\n headers.set('authorization', `${headers.has('dpop') ? 'DPoP' : 'Bearer'} ${options.initialAccessToken}`);\n }\n const response = await (options?.[customFetch] || fetch)(url.href, {\n body: JSON.stringify(metadata),\n headers: Object.fromEntries(headers.entries()),\n method,\n redirect: 'manual',\n signal: signal(url, options?.signal),\n });\n options?.DPoP?.cacheNonce(response, url);\n return response;\n}\nexport async function processDynamicClientRegistrationResponse(response) {\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n await checkOAuthBodyError(response, 201, 'Dynamic Client Registration Endpoint');\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.client_id, '\"response\" body \"client_id\" property', INVALID_RESPONSE, {\n body: json,\n });\n if (json.client_secret !== undefined) {\n assertString(json.client_secret, '\"response\" body \"client_secret\" property', INVALID_RESPONSE, {\n body: json,\n });\n }\n if (json.client_secret) {\n assertNumber(json.client_secret_expires_at, true, '\"response\" body \"client_secret_expires_at\" property', INVALID_RESPONSE, {\n body: json,\n });\n }\n return json;\n}\nexport async function resourceDiscoveryRequest(resourceIdentifier, options) {\n return performDiscovery(resourceIdentifier, 'resourceIdentifier', (url) => {\n prependWellKnown(url, '.well-known/oauth-protected-resource', true);\n return url;\n }, options);\n}\nexport async function processResourceDiscoveryResponse(expectedResourceIdentifier, response) {\n const expected = expectedResourceIdentifier;\n if (!(expected instanceof URL) && expected !== _nodiscoverycheck) {\n throw CodedTypeError('\"expectedResourceIdentifier\" must be an instance of URL', ERR_INVALID_ARG_TYPE);\n }\n if (!looseInstanceOf(response, Response)) {\n throw CodedTypeError('\"response\" must be an instance of Response', ERR_INVALID_ARG_TYPE);\n }\n if (response.status !== 200) {\n throw OPE('\"response\" is not a conform Resource Server Metadata response (unexpected HTTP status code)', RESPONSE_IS_NOT_CONFORM, response);\n }\n assertReadableResponse(response);\n const json = await getResponseJsonBody(response);\n assertString(json.resource, '\"response\" body \"resource\" property', INVALID_RESPONSE, {\n body: json,\n });\n if (expected !== _nodiscoverycheck && new URL(json.resource).href !== expected.href) {\n throw OPE('\"response\" body \"resource\" property does not match the expected value', JSON_ATTRIBUTE_COMPARISON, { expected: expected.href, body: json, attribute: 'resource' });\n }\n return json;\n}\nasync function getResponseJsonBody(response, check = assertApplicationJson) {\n let json;\n try {\n json = await response.json();\n }\n catch (cause) {\n check(response);\n throw OPE('failed to parse \"response\" body as JSON', PARSE_ERROR, cause);\n }\n if (!isJsonObject(json)) {\n throw OPE('\"response\" body must be a top level object', INVALID_RESPONSE, { body: json });\n }\n return json;\n}\nexport const _nopkce = nopkce;\nexport const _nodiscoverycheck = Symbol();\nexport const _expectedIssuer = Symbol();\n//# sourceMappingURL=index.js.map",
32
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as oauth from \"oauth4webapi\";\nimport { AuthContext } from \"../auth.js\";\nimport type { AuthenticateFn } from \"./auth.js\";\n\nexport interface JwtAuthenticateOptions {\n /** The expected `iss` claim (also used to discover AS metadata). */\n issuer: string;\n /** The expected `aud` claim. If an array, tries each audience in order. */\n audience: string | string[];\n /** Explicit JWKS URI. If omitted, discovered from issuer metadata. */\n jwksUri?: string;\n /** JWT claim to use as the principal. Default: \"sub\". */\n principalClaim?: string;\n /** AuthContext domain. Default: \"jwt\". */\n domain?: string;\n}\n\n/**\n * Create an AuthenticateFn that validates JWT Bearer tokens using oauth4webapi.\n *\n * On first call, discovers the Authorization Server metadata from the issuer\n * to obtain the JWKS URI (unless `jwksUri` is provided directly).\n */\nexport function jwtAuthenticate(options: JwtAuthenticateOptions): AuthenticateFn {\n const principalClaim = options.principalClaim ?? \"sub\";\n const domain = options.domain ?? \"jwt\";\n const audience = options.audience;\n\n let asPromise: Promise<oauth.AuthorizationServer> | null = null;\n\n async function getAuthorizationServer(): Promise<oauth.AuthorizationServer> {\n if (options.jwksUri) {\n return {\n issuer: options.issuer as `https://${string}`,\n jwks_uri: options.jwksUri,\n };\n }\n const issuerUrl = new URL(options.issuer);\n const response = await oauth.discoveryRequest(issuerUrl);\n return oauth.processDiscoveryResponse(issuerUrl, response);\n }\n\n return async function authenticate(request: Request): Promise<AuthContext> {\n if (!asPromise) {\n asPromise = getAuthorizationServer();\n }\n\n let as: oauth.AuthorizationServer;\n try {\n as = await asPromise;\n } catch (error) {\n // Reset so next request retries discovery\n asPromise = null;\n throw error;\n }\n\n // validateJwtAccessToken throws on failure, returns claims on success\n // oauth4webapi only accepts a single string, so iterate if multiple audiences\n const audiences = Array.isArray(audience) ? audience : [audience];\n let claims: oauth.JWTAccessTokenClaims | undefined;\n let lastError: unknown;\n for (const aud of audiences) {\n try {\n claims = await oauth.validateJwtAccessToken(as, request, aud);\n break;\n } catch (error) {\n lastError = error;\n }\n }\n if (!claims) {\n throw lastError;\n }\n const principal = (claims[principalClaim] as string | undefined) ?? null;\n\n return new AuthContext(domain, true, principal, claims as unknown as Record<string, any>);\n };\n}\n",
33
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createHash, X509Certificate } from \"node:crypto\";\nimport { AuthContext } from \"../auth.js\";\nimport type { AuthenticateFn } from \"./auth.js\";\n\n// ---------------------------------------------------------------------------\n// XFCC types and parser (no crypto needed)\n// ---------------------------------------------------------------------------\n\n/** A single element from an `x-forwarded-client-cert` header. */\nexport interface XfccElement {\n hash: string | null;\n cert: string | null;\n subject: string | null;\n uri: string | null;\n dns: readonly string[];\n by: string | null;\n}\n\n/** Receives a parsed XFCC element, returns an AuthContext on success. Must throw on failure. */\nexport type XfccValidateFn = (element: XfccElement) => AuthContext | Promise<AuthContext>;\n\n/** Receives a parsed X509Certificate, returns an AuthContext on success. Must throw on failure. */\nexport type CertValidateFn = (cert: X509Certificate) => AuthContext | Promise<AuthContext>;\n\nfunction splitRespectingQuotes(text: string, delimiter: string): string[] {\n const parts: string[] = [];\n let current: string[] = [];\n let inQuotes = false;\n let i = 0;\n while (i < text.length) {\n const ch = text[i];\n if (ch === '\"') {\n inQuotes = !inQuotes;\n current.push(ch);\n } else if (ch === \"\\\\\" && inQuotes && i + 1 < text.length) {\n current.push(ch);\n current.push(text[i + 1]);\n i++;\n } else if (ch === delimiter && !inQuotes) {\n parts.push(current.join(\"\"));\n current = [];\n } else {\n current.push(ch);\n }\n i++;\n }\n parts.push(current.join(\"\"));\n return parts;\n}\n\nfunction unescapeQuoted(text: string): string {\n return text.replace(/\\\\(.)/g, \"$1\");\n}\n\n/** Extract the CN value from an RFC 4514 or similar DN string. */\nfunction extractCn(subject: string): string {\n for (const part of subject.split(/(?<!\\\\),/)) {\n const trimmed = part.trim();\n if (trimmed.toUpperCase().startsWith(\"CN=\")) {\n return trimmed.slice(3);\n }\n }\n return \"\";\n}\n\n/**\n * Parse an `x-forwarded-client-cert` header value.\n *\n * Handles comma-separated elements (respecting quoted values),\n * semicolon-separated key=value pairs within each element, and\n * URL-encoded Cert/URI/By fields.\n */\nexport function parseXfcc(headerValue: string): XfccElement[] {\n const elements: XfccElement[] = [];\n for (const rawElement of splitRespectingQuotes(headerValue, \",\")) {\n const trimmed = rawElement.trim();\n if (!trimmed) continue;\n const pairs = splitRespectingQuotes(trimmed, \";\");\n const fields: Record<string, string | string[]> = {};\n for (const pair of pairs) {\n const p = pair.trim();\n if (!p) continue;\n const eqIdx = p.indexOf(\"=\");\n if (eqIdx < 0) continue;\n const key = p.slice(0, eqIdx).trim().toLowerCase();\n let value = p.slice(eqIdx + 1).trim();\n if (value.length >= 2 && value[0] === '\"' && value[value.length - 1] === '\"') {\n value = unescapeQuoted(value.slice(1, -1));\n }\n if (key === \"cert\" || key === \"uri\" || key === \"by\") {\n value = decodeURIComponent(value);\n }\n if (key === \"dns\") {\n const existing = fields.dns;\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n fields.dns = [value];\n }\n } else {\n fields[key] = value;\n }\n }\n const dns = Array.isArray(fields.dns) ? fields.dns : [];\n elements.push({\n hash: typeof fields.hash === \"string\" ? fields.hash : null,\n cert: typeof fields.cert === \"string\" ? fields.cert : null,\n subject: typeof fields.subject === \"string\" ? fields.subject : null,\n uri: typeof fields.uri === \"string\" ? fields.uri : null,\n dns,\n by: typeof fields.by === \"string\" ? fields.by : null,\n });\n }\n return elements;\n}\n\n/**\n * Create an authenticate callback from Envoy `x-forwarded-client-cert`.\n *\n * Parses the `x-forwarded-client-cert` header and extracts client identity.\n * Does not require any crypto dependencies.\n *\n * **Warning:** The reverse proxy MUST strip client-supplied\n * `x-forwarded-client-cert` headers before forwarding.\n */\nexport function mtlsAuthenticateXfcc(options?: {\n validate?: XfccValidateFn;\n domain?: string;\n selectElement?: \"first\" | \"last\";\n}): AuthenticateFn {\n const validate = options?.validate;\n const domain = options?.domain ?? \"mtls\";\n const selectElement = options?.selectElement ?? \"first\";\n\n return async function authenticate(request: Request): Promise<AuthContext> {\n const headerValue = request.headers.get(\"x-forwarded-client-cert\");\n if (!headerValue) {\n throw new Error(\"Missing x-forwarded-client-cert header\");\n }\n const elements = parseXfcc(headerValue);\n if (elements.length === 0) {\n throw new Error(\"Empty x-forwarded-client-cert header\");\n }\n const element = selectElement === \"first\" ? elements[0] : elements[elements.length - 1];\n if (validate) {\n return validate(element);\n }\n const principal = element.subject ? extractCn(element.subject) : \"\";\n const claims: Record<string, any> = {};\n if (element.hash) claims.hash = element.hash;\n if (element.subject) claims.subject = element.subject;\n if (element.uri) claims.uri = element.uri;\n if (element.dns.length > 0) claims.dns = [...element.dns];\n if (element.by) claims.by = element.by;\n return new AuthContext(domain, true, principal, claims);\n };\n}\n\n// ---------------------------------------------------------------------------\n// PEM-based factories (uses node:crypto X509Certificate)\n// ---------------------------------------------------------------------------\n\nfunction parseCertFromHeader(request: Request, header: string): X509Certificate {\n const raw = request.headers.get(header);\n if (!raw) {\n throw new Error(`Missing ${header} header`);\n }\n const pemStr = decodeURIComponent(raw);\n if (!pemStr.startsWith(\"-----BEGIN CERTIFICATE-----\")) {\n throw new Error(\"Header value is not a PEM certificate\");\n }\n try {\n return new X509Certificate(pemStr);\n } catch (exc) {\n throw new Error(`Failed to parse PEM certificate: ${exc}`);\n }\n}\n\nfunction checkCertExpiry(cert: X509Certificate): void {\n const now = new Date();\n const notBefore = new Date(cert.validFrom);\n const notAfter = new Date(cert.validTo);\n if (now < notBefore) {\n throw new Error(\"Certificate is not yet valid\");\n }\n if (now > notAfter) {\n throw new Error(\"Certificate has expired\");\n }\n}\n\n/**\n * Create an mTLS authenticate callback with custom certificate validation.\n *\n * Generic factory that parses the client certificate from a proxy header\n * and delegates identity extraction to a user-supplied `validate` callback.\n *\n * **Warning:** The reverse proxy MUST strip client-supplied certificate\n * headers before forwarding.\n */\nexport function mtlsAuthenticate(options: {\n validate: CertValidateFn;\n header?: string;\n checkExpiry?: boolean;\n}): AuthenticateFn {\n const { validate, header = \"X-SSL-Client-Cert\", checkExpiry = false } = options;\n\n return async function authenticate(request: Request): Promise<AuthContext> {\n const cert = parseCertFromHeader(request, header);\n if (checkExpiry) {\n checkCertExpiry(cert);\n }\n return validate(cert);\n };\n}\n\nconst SUPPORTED_ALGORITHMS = new Set([\"sha256\", \"sha1\", \"sha384\", \"sha512\"]);\n\n/**\n * Create an mTLS authenticate callback using certificate fingerprint lookup.\n *\n * Computes the certificate fingerprint and looks it up in the provided\n * mapping. Fingerprints must be lowercase hex without colons.\n */\nexport function mtlsAuthenticateFingerprint(options: {\n fingerprints: ReadonlyMap<string, AuthContext> | Record<string, AuthContext>;\n header?: string;\n algorithm?: string;\n domain?: string;\n checkExpiry?: boolean;\n}): AuthenticateFn {\n const { fingerprints, header, algorithm = \"sha256\", checkExpiry } = options;\n if (!SUPPORTED_ALGORITHMS.has(algorithm)) {\n throw new Error(`Unsupported hash algorithm: ${algorithm}`);\n }\n const entries: ReadonlyMap<string, AuthContext> =\n fingerprints instanceof Map ? fingerprints : new Map(Object.entries(fingerprints));\n\n function validate(cert: X509Certificate): AuthContext {\n const fp = createHash(algorithm).update(cert.raw).digest(\"hex\");\n const ctx = entries.get(fp);\n if (!ctx) {\n throw new Error(`Unknown certificate fingerprint: ${fp}`);\n }\n return ctx;\n }\n\n return mtlsAuthenticate({ validate, header, checkExpiry });\n}\n\n/**\n * Create an mTLS authenticate callback using certificate subject CN.\n *\n * Extracts the Subject Common Name as `principal` and populates\n * `claims` with the full DN, serial number (hex), and `not_valid_after`.\n */\nexport function mtlsAuthenticateSubject(options?: {\n header?: string;\n domain?: string;\n allowedSubjects?: ReadonlySet<string> | null;\n checkExpiry?: boolean;\n}): AuthenticateFn {\n const { header, domain = \"mtls\", allowedSubjects = null, checkExpiry } = options ?? {};\n\n function validate(cert: X509Certificate): AuthContext {\n // Node's cert.subject is \\n-separated \"KEY=value\" lines\n const subjectParts = cert.subject\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter(Boolean);\n const subjectDn = subjectParts.join(\", \");\n\n let cn = \"\";\n for (const part of subjectParts) {\n if (part.toUpperCase().startsWith(\"CN=\")) {\n cn = part.slice(3);\n break;\n }\n }\n\n if (allowedSubjects !== null && !allowedSubjects.has(cn)) {\n throw new Error(`Subject CN '${cn}' not in allowed subjects`);\n }\n\n const serialHex = BigInt(`0x${cert.serialNumber}`).toString(16);\n const notValidAfter = new Date(cert.validTo).toISOString();\n\n return new AuthContext(domain, true, cn, {\n subject_dn: subjectDn,\n serial: serialHex,\n not_valid_after: notValidAfter,\n });\n }\n\n return mtlsAuthenticate({ validate, header, checkExpiry });\n}\n",
34
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { inferParamTypes, type SchemaLike, toSchema } from \"./schema.js\";\nimport {\n type ExchangeFn,\n type ExchangeInit,\n type HeaderInit,\n type MethodDefinition,\n MethodType,\n type ProducerFn,\n type ProducerInit,\n type UnaryHandler,\n} from \"./types.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Fluent builder for defining RPC methods.\n * Register unary, producer, and exchange methods, then pass to `VgiRpcServer`.\n */\nexport class Protocol {\n readonly name: string;\n private _methods: Map<string, MethodDefinition> = new Map();\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Register a unary (request-response) method.\n * @param name - Method name exposed to clients\n * @param config.params - Parameter schema (SchemaLike)\n * @param config.result - Result schema (SchemaLike)\n * @param config.handler - Async function receiving params and returning result values\n * @param config.doc - Optional documentation string\n * @param config.defaults - Optional default parameter values\n * @param config.paramTypes - Optional parameter type hints (inferred from params if omitted)\n */\n unary(\n name: string,\n config: {\n params: SchemaLike;\n result: SchemaLike;\n handler: UnaryHandler;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.UNARY,\n paramsSchema: params,\n resultSchema: toSchema(config.result),\n handler: config.handler,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n /**\n * Register a producer (server-streaming) method.\n * The generic `S` is inferred from the `init` return type and threaded to `produce`.\n */\n producer<S>(\n name: string,\n config: {\n params: SchemaLike;\n outputSchema: SchemaLike;\n init: ProducerInit<S>;\n produce: ProducerFn<S>;\n headerSchema?: SchemaLike;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.STREAM,\n paramsSchema: params,\n resultSchema: EMPTY_SCHEMA,\n outputSchema: toSchema(config.outputSchema),\n inputSchema: EMPTY_SCHEMA,\n producerInit: config.init as ProducerInit,\n producerFn: config.produce as ProducerFn,\n headerSchema: config.headerSchema ? toSchema(config.headerSchema) : undefined,\n headerInit: config.headerInit,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n /**\n * Register an exchange (bidirectional-streaming) method.\n * The generic `S` is inferred from the `init` return type and threaded to `exchange`.\n */\n exchange<S>(\n name: string,\n config: {\n params: SchemaLike;\n inputSchema: SchemaLike;\n outputSchema: SchemaLike;\n init: ExchangeInit<S>;\n exchange: ExchangeFn<S>;\n headerSchema?: SchemaLike;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.STREAM,\n paramsSchema: params,\n resultSchema: EMPTY_SCHEMA,\n inputSchema: toSchema(config.inputSchema),\n outputSchema: toSchema(config.outputSchema),\n exchangeInit: config.init as ExchangeInit,\n exchangeFn: config.exchange as ExchangeFn,\n headerSchema: config.headerSchema ? toSchema(config.headerSchema) : undefined,\n headerInit: config.headerInit,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n getMethods(): Map<string, MethodDefinition> {\n return new Map(this._methods);\n }\n}\n",
35
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Field,\n Float32,\n Float64,\n Int16,\n Int32,\n Int64,\n Schema,\n Utf8,\n} from \"@query-farm/apache-arrow\";\n\n// ---------------------------------------------------------------------------\n// Convenient DataType singletons — re-export so users avoid arrow imports\n// ---------------------------------------------------------------------------\n\n/** Apache Arrow Utf8 type. Use as schema shorthand: `{ name: str }` */\nexport const str = new Utf8();\n/** Apache Arrow Binary type. Use as schema shorthand: `{ data: bytes }` */\nexport const bytes = new Binary();\n/** Apache Arrow Int64 type. Use as schema shorthand: `{ count: int }` */\nexport const int = new Int64();\n/** Apache Arrow Int32 type. Use as schema shorthand: `{ count: int32 }` */\nexport const int32 = new Int32();\n/** Apache Arrow Float64 type. Use as schema shorthand: `{ value: float }` */\nexport const float = new Float64();\n/** Apache Arrow Float32 type. Use as schema shorthand: `{ value: float32 }` */\nexport const float32 = new Float32();\n/** Apache Arrow Bool type. Use as schema shorthand: `{ flag: bool }` */\nexport const bool = new Bool();\n\n// ---------------------------------------------------------------------------\n// SchemaLike — shorthand for declaring schemas\n// ---------------------------------------------------------------------------\n\n/**\n * A schema specification that accepts:\n * - A real `Schema` (passed through)\n * - A record mapping field names to `DataType` instances or `Field` instances\n * - An empty `{}` for an empty schema\n */\nexport type SchemaLike = Schema | Record<string, DataType | Field>;\n\n/**\n * Convert a SchemaLike spec into a real `Schema`.\n *\n * - `Schema` → returned as-is\n * - `Record<string, DataType>` → each entry becomes `new Field(name, type, false)`\n * - `Record<string, Field>` → each entry is passed through\n * - `{}` → `new Schema([])`\n */\nexport function toSchema(spec: SchemaLike): Schema {\n if (spec instanceof Schema) return spec;\n\n const fields: Field[] = [];\n for (const [name, value] of Object.entries(spec)) {\n if (value instanceof Field) {\n fields.push(value);\n } else if (value instanceof DataType) {\n fields.push(new Field(name, value, false));\n } else {\n throw new TypeError(`Invalid schema value for \"${name}\": expected DataType or Field, got ${typeof value}`);\n }\n }\n return new Schema(fields);\n}\n\n// ---------------------------------------------------------------------------\n// inferParamTypes — derive paramTypes from a schema spec\n// ---------------------------------------------------------------------------\n\nconst TYPE_MAP: [new (...args: any[]) => DataType, string][] = [\n [Utf8, \"str\"],\n [Binary, \"bytes\"],\n [Bool, \"bool\"],\n [Float64, \"float\"],\n [Float32, \"float\"],\n [Int64, \"int\"],\n [Int32, \"int\"],\n [Int16, \"int\"],\n];\n\n/**\n * Derive a `paramTypes` record from a SchemaLike spec.\n * Maps common Arrow scalar types to Python-style type strings.\n * Returns `undefined` if any field has a complex type (List, Map_, Dictionary, etc.).\n */\nexport function inferParamTypes(spec: SchemaLike): Record<string, string> | undefined {\n const schema = toSchema(spec);\n if (schema.fields.length === 0) return undefined;\n\n const result: Record<string, string> = {};\n for (const field of schema.fields) {\n let mapped: string | undefined;\n for (const [ctor, name] of TYPE_MAP) {\n if (field.type instanceof ctor) {\n mapped = name;\n break;\n }\n }\n if (!mapped) return undefined;\n result[field.name] = mapped;\n }\n return result;\n}\n",
36
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"./constants.js\";\nimport { buildDescribeBatch } from \"./dispatch/describe.js\";\nimport { dispatchStream } from \"./dispatch/stream.js\";\nimport { dispatchUnary } from \"./dispatch/unary.js\";\nimport { RpcError, VersionError } from \"./errors.js\";\nimport type { ExternalLocationConfig } from \"./external.js\";\nimport type { Protocol } from \"./protocol.js\";\nimport { type CallStatistics, type DispatchHook, type DispatchInfo, MethodType } from \"./types.js\";\nimport { IpcStreamReader } from \"./wire/reader.js\";\nimport { parseRequest } from \"./wire/request.js\";\nimport { buildErrorBatch } from \"./wire/response.js\";\nimport { IpcStreamWriter } from \"./wire/writer.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * RPC server that reads Arrow IPC requests from stdin and writes responses to stdout.\n * Supports unary and streaming (producer/exchange) methods.\n */\nexport class VgiRpcServer {\n private protocol: Protocol;\n private enableDescribe: boolean;\n private serverId: string;\n private describeBatch: import(\"@query-farm/apache-arrow\").RecordBatch | null = null;\n private dispatchHook: DispatchHook | null = null;\n private externalConfig: ExternalLocationConfig | undefined;\n\n constructor(\n protocol: Protocol,\n options?: {\n enableDescribe?: boolean;\n serverId?: string;\n dispatchHook?: DispatchHook;\n externalLocation?: ExternalLocationConfig;\n },\n ) {\n this.protocol = protocol;\n this.enableDescribe = options?.enableDescribe ?? true;\n this.serverId = options?.serverId ?? crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n this.dispatchHook = options?.dispatchHook ?? null;\n this.externalConfig = options?.externalLocation;\n\n if (this.enableDescribe) {\n const { batch } = buildDescribeBatch(protocol.name, protocol.getMethods(), this.serverId);\n this.describeBatch = batch;\n }\n }\n\n /** Start the server loop. Reads requests until stdin closes. */\n async run(): Promise<void> {\n const stdin = process.stdin as unknown as ReadableStream<Uint8Array>;\n\n // Warn if running interactively\n if (process.stdin.isTTY || process.stdout.isTTY) {\n process.stderr.write(\n \"WARNING: This process communicates via Arrow IPC on stdin/stdout \" +\n \"and is not intended to be run interactively.\\n\" +\n \"It should be launched as a subprocess by an RPC client \" +\n \"(e.g. vgi_rpc.connect()).\\n\",\n );\n }\n\n const reader = await IpcStreamReader.create(stdin);\n const writer = new IpcStreamWriter();\n\n try {\n while (true) {\n await this.serveOne(reader, writer);\n }\n } catch (e: any) {\n // EOF or broken pipe → clean exit\n if (\n e.message?.includes(\"closed\") ||\n e.message?.includes(\"Expected Schema Message\") ||\n e.message?.includes(\"null or length 0\") ||\n e.code === \"EPIPE\" ||\n e.code === \"ERR_STREAM_PREMATURE_CLOSE\" ||\n e.code === \"ERR_STREAM_DESTROYED\" ||\n (e instanceof Error && e.message.includes(\"EOF\"))\n ) {\n return;\n }\n // ArrowInvalid or unexpected error\n throw e;\n } finally {\n await reader.cancel();\n }\n }\n\n private async serveOne(reader: IpcStreamReader, writer: IpcStreamWriter): Promise<void> {\n const stream = await reader.readStream();\n if (!stream) {\n throw new Error(\"EOF\");\n }\n\n const { schema, batches } = stream;\n if (batches.length === 0) {\n const err = new RpcError(\"ProtocolError\", \"Request stream contains no batches\", \"\");\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n const batch = batches[0];\n let methodName: string;\n let params: Record<string, any>;\n let requestId: string | null;\n\n try {\n const parsed = parseRequest(schema, batch);\n methodName = parsed.methodName;\n params = parsed.params;\n requestId = parsed.requestId;\n } catch (e: any) {\n // Write error response for protocol/version errors\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, e, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n if (e instanceof VersionError || e instanceof RpcError) {\n return; // Continue serving\n }\n throw e;\n }\n\n // Handle __describe__\n if (methodName === DESCRIBE_METHOD_NAME && this.describeBatch) {\n writer.writeStream(this.describeBatch.schema, [this.describeBatch]);\n return;\n }\n\n // Look up method\n const methods = this.protocol.getMethods();\n const method = methods.get(methodName);\n if (!method) {\n const available = [...methods.keys()].sort();\n const err = new Error(`Unknown method: '${methodName}'. Available methods: [${available.join(\", \")}]`);\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, requestId);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n // Dispatch based on method type, with optional hook\n const methodType = method.type === MethodType.UNARY ? \"unary\" : \"stream\";\n const info: DispatchInfo = { method: methodName, methodType, serverId: this.serverId, requestId };\n const stats: CallStatistics = {\n inputBatches: 0,\n outputBatches: 0,\n inputRows: 0,\n outputRows: 0,\n inputBytes: 0,\n outputBytes: 0,\n };\n\n const token = this.dispatchHook?.onDispatchStart(info);\n let dispatchError: Error | undefined;\n\n try {\n if (method.type === MethodType.UNARY) {\n await dispatchUnary(method, params, writer, this.serverId, requestId, this.externalConfig);\n } else {\n await dispatchStream(method, params, writer, reader, this.serverId, requestId, this.externalConfig);\n }\n } catch (e) {\n dispatchError = e instanceof Error ? e : new Error(String(e));\n throw e;\n } finally {\n this.dispatchHook?.onDispatchEnd(token, info, stats, dispatchError);\n }\n }\n}\n",
37
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { type ExternalLocationConfig, maybeExternalizeBatch } from \"../external.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { conformBatchToSchema } from \"../util/conform.js\";\nimport type { IpcStreamReader } from \"../wire/reader.js\";\nimport { buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport type { IpcStreamWriter } from \"../wire/writer.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Dispatch a stream RPC call (producer or exchange).\n *\n * Producer streams (empty input schema):\n * - Client sends tick batches (empty schema, 0 rows)\n * - Server reads each tick, calls produce(state, out)\n * - Server writes output batch(es) for each tick\n * - When produce() calls out.finish(), server closes output stream\n *\n * Exchange streams (real input schema):\n * - Client sends data batches\n * - Server reads each batch, calls exchange(state, input, out)\n * - Server writes output batch(es) for each input\n * - Stream ends when client closes input (EOS)\n */\nexport async function dispatchStream(\n method: MethodDefinition,\n params: Record<string, any>,\n writer: IpcStreamWriter,\n reader: IpcStreamReader,\n serverId: string,\n requestId: string | null,\n externalConfig?: ExternalLocationConfig,\n): Promise<void> {\n const isProducer = !!method.producerFn;\n\n let state: any;\n try {\n if (isProducer) {\n state = await method.producerInit!(params);\n } else {\n state = await method.exchangeInit!(params);\n }\n } catch (error: any) {\n const errSchema = method.headerSchema ?? EMPTY_SCHEMA;\n const errBatch = buildErrorBatch(errSchema, error, serverId, requestId);\n writer.writeStream(errSchema, [errBatch]);\n // Still need to consume the input stream from the client\n const inputSchema = await reader.openNextStream();\n if (inputSchema) {\n while ((await reader.readNextBatch()) !== null) {\n // drain\n }\n }\n return;\n }\n\n // Support dynamic output schemas: init may return state with __outputSchema\n // to override the method's registered output schema (needed for methods\n // like VGI's \"init\" that produce different schemas per invocation).\n const outputSchema = state?.__outputSchema ?? method.outputSchema!;\n\n // Effective producer mode: check state override (VGI \"init\" is registered as\n // exchange but may act as producer depending on the function type).\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n // Write header IPC stream if method has a header schema\n if (method.headerSchema && method.headerInit) {\n try {\n const headerOut = new OutputCollector(method.headerSchema, true, serverId, requestId);\n const headerValues = method.headerInit(params, state, headerOut);\n const headerBatch = buildResultBatch(method.headerSchema, headerValues, serverId, requestId);\n const headerBatches = [...headerOut.batches.map((b) => b.batch), headerBatch];\n writer.writeStream(method.headerSchema, headerBatches);\n } catch (error: any) {\n const errBatch = buildErrorBatch(method.headerSchema, error, serverId, requestId);\n writer.writeStream(method.headerSchema, [errBatch]);\n // Drain input stream so client doesn't hang\n const inputSchema = await reader.openNextStream();\n if (inputSchema) {\n while ((await reader.readNextBatch()) !== null) {}\n }\n return;\n }\n }\n\n // Open the input IPC stream (ticks or data from client)\n const inputSchema = await reader.openNextStream();\n if (!inputSchema) {\n const errBatch = buildErrorBatch(outputSchema, new Error(\"Expected input stream but got EOF\"), serverId, requestId);\n writer.writeStream(outputSchema, [errBatch]);\n return;\n }\n\n // Use a single continuous IPC stream for all output (matching Python vgi-rpc).\n // DuckDB exchanges are ping-pong: one input batch → one output batch on the\n // same stream. We use IncrementalStream which writes bytes synchronously.\n const stream = writer.openStream(outputSchema);\n\n // Expected input schema for casting compatible types (e.g., decimal→double)\n const expectedInputSchema = method.inputSchema;\n\n try {\n while (true) {\n let inputBatch = await reader.readNextBatch();\n if (!inputBatch) break;\n\n // Cast compatible input types when schema doesn't match exactly.\n // If conformance fails (e.g., completely different schemas like a dummy\n // registration schema vs actual data), pass the original batch through —\n // the exchange handler may handle dynamic schemas internally.\n if (expectedInputSchema && !isProducer && inputBatch.schema !== expectedInputSchema) {\n try {\n inputBatch = conformBatchToSchema(inputBatch, expectedInputSchema);\n } catch (e) {\n if (e instanceof TypeError) {\n // Field name/count mismatch — propagate as error (matches Python behavior).\n throw e;\n }\n // Other conformance failures: pass through for dynamic schema handlers.\n console.debug?.(`Schema conformance skipped: ${e instanceof Error ? e.message : e}`);\n }\n }\n\n const out = new OutputCollector(outputSchema, effectiveProducer, serverId, requestId);\n\n if (isProducer) {\n await method.producerFn!(state, out);\n } else {\n await method.exchangeFn!(state, inputBatch, out);\n }\n\n for (const emitted of out.batches) {\n let batch = emitted.batch;\n if (externalConfig) {\n batch = await maybeExternalizeBatch(batch, externalConfig);\n }\n stream.write(batch);\n }\n\n if (out.finished) {\n break;\n }\n }\n } catch (error: any) {\n stream.write(buildErrorBatch(outputSchema, error, serverId, requestId));\n }\n\n stream.close();\n\n // Drain remaining input so transport stays synchronized for next request.\n // Matches Python's _drain_stream() called after every streaming method.\n // Needed when the loop exits early (out.finished, error) while client\n // is still sending batches.\n try {\n while ((await reader.readNextBatch()) !== null) {}\n } catch {\n // Suppress errors during drain (broken pipe, etc.)\n }\n}\n",
38
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type ExternalLocationConfig, maybeExternalizeBatch } from \"../external.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport type { IpcStreamWriter } from \"../wire/writer.js\";\n\n/**\n * Dispatch a unary RPC call.\n * Calls the handler with parsed params, writes result or error batch.\n * Supports client-directed logging via ctx.clientLog().\n */\nexport async function dispatchUnary(\n method: MethodDefinition,\n params: Record<string, any>,\n writer: IpcStreamWriter,\n serverId: string,\n requestId: string | null,\n externalConfig?: ExternalLocationConfig,\n): Promise<void> {\n const schema = method.resultSchema;\n const out = new OutputCollector(schema, true, serverId, requestId);\n\n try {\n const result = await method.handler!(params, out);\n let resultBatch = buildResultBatch(schema, result, serverId, requestId);\n if (externalConfig) {\n resultBatch = await maybeExternalizeBatch(resultBatch, externalConfig);\n }\n // Collect log batches (from clientLog) + result batch\n const batches = [...out.batches.map((b) => b.batch), resultBatch];\n writer.writeStream(schema, batches);\n } catch (error: any) {\n const batch = buildErrorBatch(schema, error, serverId, requestId);\n writer.writeStream(schema, [batch]);\n }\n}\n",
39
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { writeSync } from \"node:fs\";\nimport { type RecordBatch, RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\n\nconst STDOUT_FD = 1;\n\n/**\n * Write all bytes to a file descriptor, looping on partial writes.\n * Handles EAGAIN (pipe buffer full) by busy-waiting with Atomics.wait().\n * writeSync() can return fewer bytes than requested when the pipe buffer\n * is full (e.g., 64KB limit), and throws EAGAIN on non-blocking fds.\n */\nfunction writeAll(fd: number, data: Uint8Array): void {\n let offset = 0;\n while (offset < data.length) {\n try {\n const written = writeSync(fd, data, offset, data.length - offset);\n if (written <= 0) throw new Error(`writeSync returned ${written}`);\n offset += written;\n } catch (e: any) {\n if (e.code === \"EAGAIN\") {\n // Pipe buffer full — busy-wait briefly then retry\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1);\n continue;\n }\n throw e;\n }\n }\n}\n\n/**\n * Writes sequential IPC streams to a file descriptor (e.g., stdout).\n * Each call to writeStream() writes a complete IPC stream: schema + batches + EOS.\n *\n * All writes use synchronous I/O (writeSync) to avoid deadlocks when\n * interleaving stdout writes with blocking stdin reads.\n */\nexport class IpcStreamWriter {\n private readonly fd: number;\n\n constructor(fd: number = STDOUT_FD) {\n this.fd = fd;\n }\n\n /**\n * Write a complete IPC stream with the given schema and batches.\n * Creates schema message, writes all batches (with their metadata), writes EOS.\n */\n writeStream(schema: Schema, batches: RecordBatch[]): void {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n for (const batch of batches) {\n // Use _writeRecordBatch to bypass schema comparison (see IncrementalStream.write)\n (writer as any)._writeRecordBatch(batch);\n }\n writer.close();\n const bytes = writer.toUint8Array(true);\n writeAll(this.fd, bytes);\n }\n\n /**\n * Open an incremental IPC stream for writing batches one at a time.\n * Used for streaming methods where output batches are produced incrementally.\n * Bytes are written synchronously after each batch.\n */\n openStream(schema: Schema): IncrementalStream {\n return new IncrementalStream(this.fd, schema);\n }\n}\n\n/**\n * An open IPC stream that supports incremental batch writes.\n *\n * Uses RecordBatchStreamWriter with internal buffering (no pipe to stdout).\n * After each operation, drains the writer's internal AsyncByteQueue buffer\n * and writes bytes synchronously via writeAll(). This avoids deadlocks\n * caused by Node.js async stream piping when stdin reads block before\n * stdout writes flush through the event loop.\n */\nexport class IncrementalStream {\n private writer: RecordBatchStreamWriter;\n private readonly fd: number;\n private closed = false;\n\n constructor(fd: number, schema: Schema) {\n this.fd = fd;\n this.writer = new RecordBatchStreamWriter();\n // Buffer internally (no sink) — we drain manually via writeAll\n this.writer.reset(undefined, schema);\n this.drain();\n }\n\n /**\n * Write a single batch to the stream. Bytes are flushed synchronously.\n *\n * Uses _writeRecordBatch() directly to bypass the Arrow writer's schema\n * comparison in write(). The public write() method calls compareSchemas()\n * and auto-closes the writer if the batch's schema differs (e.g., in\n * nullability), silently dropping the batch. Since our output schema is\n * set at stream open time and all batches are structurally compatible,\n * we skip the comparison.\n */\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"Stream already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n /**\n * Close the stream (writes EOS marker synchronously).\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n writeAll(this.fd, eos);\n }\n\n /**\n * Drain buffered bytes from the Arrow writer's internal queue\n * and write them synchronously to the output fd.\n */\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n writeAll(this.fd, chunk);\n }\n values.length = 0;\n }\n}\n"
5
+ "// Some numerical data is initialized as -1 even when it doesn't need initialization to help the JIT infer types\n// aliases for shorter compressed code (most minifers don't do this)\nvar ab = ArrayBuffer, u8 = Uint8Array, u16 = Uint16Array, i16 = Int16Array, u32 = Uint32Array, i32 = Int32Array;\nvar slc = function (v, s, e) {\n if (u8.prototype.slice)\n return u8.prototype.slice.call(v, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n var n = new u8(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar fill = function (v, n, s, e) {\n if (u8.prototype.fill)\n return u8.prototype.fill.call(v, n, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n for (; s < e; ++s)\n v[s] = n;\n return v;\n};\nvar cpw = function (v, t, s, e) {\n if (u8.prototype.copyWithin)\n return u8.prototype.copyWithin.call(v, t, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n while (s < e) {\n v[t++] = v[s++];\n }\n};\n/**\n * Codes for errors generated within this library\n */\nexport var ZstdErrorCode = {\n InvalidData: 0,\n WindowSizeTooLarge: 1,\n InvalidBlockType: 2,\n FSEAccuracyTooHigh: 3,\n DistanceTooFarBack: 4,\n UnexpectedEOF: 5\n};\n// error codes\nvar ec = [\n 'invalid zstd data',\n 'window size too large (>2046MB)',\n 'invalid block type',\n 'FSE accuracy too high',\n 'match distance too far back',\n 'unexpected EOF'\n];\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\nvar rb = function (d, b, n) {\n var i = 0, o = 0;\n for (; i < n; ++i)\n o |= d[b++] << (i << 3);\n return o;\n};\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read Zstandard frame header\nvar rzfh = function (dat, w) {\n var n3 = dat[0] | (dat[1] << 8) | (dat[2] << 16);\n if (n3 == 0x2FB528 && dat[3] == 253) {\n // Zstandard\n var flg = dat[4];\n // single segment checksum dict flag frame content flag\n var ss = (flg >> 5) & 1, cc = (flg >> 2) & 1, df = flg & 3, fcf = flg >> 6;\n if (flg & 8)\n err(0);\n // byte\n var bt = 6 - ss;\n // dict bytes\n var db = df == 3 ? 4 : df;\n // dictionary id\n var di = rb(dat, bt, db);\n bt += db;\n // frame size bytes\n var fsb = fcf ? (1 << fcf) : ss;\n // frame source size\n var fss = rb(dat, bt, fsb) + ((fcf == 1) && 256);\n // window size\n var ws = fss;\n if (!ss) {\n // window descriptor\n var wb = 1 << (10 + (dat[5] >> 3));\n ws = wb + (wb >> 3) * (dat[5] & 7);\n }\n if (ws > 2145386496)\n err(1);\n var buf = new u8((w == 1 ? (fss || ws) : w ? 0 : ws) + 12);\n buf[0] = 1, buf[4] = 4, buf[8] = 8;\n return {\n b: bt + fsb,\n y: 0,\n l: 0,\n d: di,\n w: (w && w != 1) ? w : buf.subarray(12),\n e: ws,\n o: new i32(buf.buffer, 0, 3),\n u: fss,\n c: cc,\n m: Math.min(131072, ws)\n };\n }\n else if (((n3 >> 4) | (dat[3] << 20)) == 0x184D2A5) {\n // skippable\n return b4(dat, 4) + 8;\n }\n err(0);\n};\n// most significant bit for nonzero\nvar msb = function (val) {\n var bits = 0;\n for (; (1 << bits) <= val; ++bits)\n ;\n return bits - 1;\n};\n// read finite state entropy\nvar rfse = function (dat, bt, mal) {\n // table pos\n var tpos = (bt << 3) + 4;\n // accuracy log\n var al = (dat[bt] & 15) + 5;\n if (al > mal)\n err(3);\n // size\n var sz = 1 << al;\n // probabilities symbols repeat index high threshold\n var probs = sz, sym = -1, re = -1, i = -1, ht = sz;\n // optimization: single allocation is much faster\n var buf = new ab(512 + (sz << 2));\n var freq = new i16(buf, 0, 256);\n // same view as freq\n var dstate = new u16(buf, 0, 256);\n var nstate = new u16(buf, 512, sz);\n var bb1 = 512 + (sz << 1);\n var syms = new u8(buf, bb1, sz);\n var nbits = new u8(buf, bb1 + sz);\n while (sym < 255 && probs > 0) {\n var bits = msb(probs + 1);\n var cbt = tpos >> 3;\n // mask\n var msk = (1 << (bits + 1)) - 1;\n var val = ((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (tpos & 7)) & msk;\n // mask (1 fewer bit)\n var msk1fb = (1 << bits) - 1;\n // max small value\n var msv = msk - probs - 1;\n // small value\n var sval = val & msk1fb;\n if (sval < msv)\n tpos += bits, val = sval;\n else {\n tpos += bits + 1;\n if (val > msk1fb)\n val -= msv;\n }\n freq[++sym] = --val;\n if (val == -1) {\n probs += val;\n syms[--ht] = sym;\n }\n else\n probs -= val;\n if (!val) {\n do {\n // repeat byte\n var rbt = tpos >> 3;\n re = ((dat[rbt] | (dat[rbt + 1] << 8)) >> (tpos & 7)) & 3;\n tpos += 2;\n sym += re;\n } while (re == 3);\n }\n }\n if (sym > 255 || probs)\n err(0);\n var sympos = 0;\n // sym step (coprime with sz - formula from zstd source)\n var sstep = (sz >> 1) + (sz >> 3) + 3;\n // sym mask\n var smask = sz - 1;\n for (var s = 0; s <= sym; ++s) {\n var sf = freq[s];\n if (sf < 1) {\n dstate[s] = -sf;\n continue;\n }\n // This is split into two loops in zstd to avoid branching, but as JS is higher-level that is unnecessary\n for (i = 0; i < sf; ++i) {\n syms[sympos] = s;\n do {\n sympos = (sympos + sstep) & smask;\n } while (sympos >= ht);\n }\n }\n // After spreading symbols, should be zero again\n if (sympos)\n err(0);\n for (i = 0; i < sz; ++i) {\n // next state\n var ns = dstate[syms[i]]++;\n // num bits\n var nb = nbits[i] = al - msb(ns);\n nstate[i] = (ns << nb) - sz;\n }\n return [(tpos + 7) >> 3, {\n b: al,\n s: syms,\n n: nbits,\n t: nstate\n }];\n};\n// read huffman\nvar rhu = function (dat, bt) {\n // index weight count\n var i = 0, wc = -1;\n // buffer header byte\n var buf = new u8(292), hb = dat[bt];\n // huffman weights\n var hw = buf.subarray(0, 256);\n // rank count\n var rc = buf.subarray(256, 268);\n // rank index\n var ri = new u16(buf.buffer, 268);\n // NOTE: at this point bt is 1 less than expected\n if (hb < 128) {\n // end byte, fse decode table\n var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];\n bt += hb;\n var epos = ebt << 3;\n // last byte\n var lb = dat[bt];\n if (!lb)\n err(0);\n // state1 state2 state1 bits state2 bits\n var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;\n // fse pos\n // pre-increment to account for original deficit of 1\n var fpos = (++bt << 3) - 8 + msb(lb);\n for (;;) {\n fpos -= btr1;\n if (fpos < epos)\n break;\n var cbt = fpos >> 3;\n st1 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr1) - 1);\n hw[++wc] = fdt.s[st1];\n fpos -= btr2;\n if (fpos < epos)\n break;\n cbt = fpos >> 3;\n st2 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr2) - 1);\n hw[++wc] = fdt.s[st2];\n btr1 = fdt.n[st1];\n st1 = fdt.t[st1];\n btr2 = fdt.n[st2];\n st2 = fdt.t[st2];\n }\n if (++wc > 255)\n err(0);\n }\n else {\n wc = hb - 127;\n for (; i < wc; i += 2) {\n var byte = dat[++bt];\n hw[i] = byte >> 4;\n hw[i + 1] = byte & 15;\n }\n ++bt;\n }\n // weight exponential sum\n var wes = 0;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n // bits must be at most 11, same as weight\n if (wt > 11)\n err(0);\n wes += wt && (1 << (wt - 1));\n }\n // max bits\n var mb = msb(wes) + 1;\n // table size\n var ts = 1 << mb;\n // remaining sum\n var rem = ts - wes;\n // must be power of 2\n if (rem & (rem - 1))\n err(0);\n hw[wc++] = msb(rem) + 1;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n ++rc[hw[i] = wt && (mb + 1 - wt)];\n }\n // huf buf\n var hbuf = new u8(ts << 1);\n // symbols num bits\n var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);\n ri[mb] = 0;\n for (i = mb; i > 0; --i) {\n var pv = ri[i];\n fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << (mb - i)));\n }\n if (ri[0] != ts)\n err(0);\n for (i = 0; i < wc; ++i) {\n var bits = hw[i];\n if (bits) {\n var code = ri[bits];\n fill(syms, i, code, ri[bits] = code + (1 << (mb - bits)));\n }\n }\n return [bt, {\n n: nb,\n b: mb,\n s: syms\n }];\n};\n// Tables generated using this:\n// https://gist.github.com/101arrowz/a979452d4355992cbf8f257cbffc9edd\n// default literal length table\nvar dllt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 81, 16, 99, 140, 49, 198, 24, 99, 12, 33, 196, 24, 99, 102, 102, 134, 70, 146, 4\n]), 0, 6)[1];\n// default match length table\nvar dmlt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 33, 20, 196, 24, 99, 140, 33, 132, 16, 66, 8, 33, 132, 16, 66, 8, 33, 68, 68, 68, 68, 68, 68, 68, 68, 36, 9\n]), 0, 6)[1];\n// default offset code table\nvar doct = /*#__PURE__ */ rfse(/*#__PURE__*/ new u8([\n 32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2\n]), 0, 5)[1];\n// bits to baseline\nvar b2bl = function (b, s) {\n var len = b.length, bl = new i32(len);\n for (var i = 0; i < len; ++i) {\n bl[i] = s;\n s += 1 << b[i];\n }\n return bl;\n};\n// literal length bits\nvar llb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 16843009, 50528770, 134678020, 202050057, 269422093\n])).buffer, 0, 36);\n// literal length baseline\nvar llbl = /*#__PURE__ */ b2bl(llb, 0);\n// match length bits\nvar mlb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 0, 0, 0, 0, 16843009, 50528770, 117769220, 185207048, 252579084, 16\n])).buffer, 0, 53);\n// match length baseline\nvar mlbl = /*#__PURE__ */ b2bl(mlb, 3);\n// decode huffman stream\nvar dhu = function (dat, out, hu) {\n var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;\n if (!lb)\n err(0);\n var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;\n for (; pos > eb && i < ss;) {\n var cbt = pos >> 3;\n var val = (dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (pos & 7);\n st = ((st << btr) | val) & msk;\n out[++i] = hu.s[st];\n pos -= (btr = hu.n[st]);\n }\n if (pos != eb || i + 1 != ss)\n err(0);\n};\n// decode huffman stream 4x\n// TODO: use workers to parallelize\nvar dhu4 = function (dat, out, hu) {\n var bt = 6;\n var ss = out.length, sz1 = (ss + 3) >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;\n dhu(dat.subarray(bt, bt += dat[0] | (dat[1] << 8)), out.subarray(0, sz1), hu);\n dhu(dat.subarray(bt, bt += dat[2] | (dat[3] << 8)), out.subarray(sz1, sz2), hu);\n dhu(dat.subarray(bt, bt += dat[4] | (dat[5] << 8)), out.subarray(sz2, sz3), hu);\n dhu(dat.subarray(bt), out.subarray(sz3), hu);\n};\n// read Zstandard block\nvar rzb = function (dat, st, out) {\n var _a;\n var bt = st.b;\n // byte 0 block type\n var b0 = dat[bt], btype = (b0 >> 1) & 3;\n st.l = b0 & 1;\n var sz = (b0 >> 3) | (dat[bt + 1] << 5) | (dat[bt + 2] << 13);\n // end byte for block\n var ebt = (bt += 3) + sz;\n if (btype == 1) {\n if (bt >= dat.length)\n return;\n st.b = bt + 1;\n if (out) {\n fill(out, dat[bt], st.y, st.y += sz);\n return out;\n }\n return fill(new u8(sz), dat[bt]);\n }\n if (ebt > dat.length)\n return;\n if (btype == 0) {\n st.b = ebt;\n if (out) {\n out.set(dat.subarray(bt, ebt), st.y);\n st.y += sz;\n return out;\n }\n return slc(dat, bt, ebt);\n }\n if (btype == 2) {\n // byte 3 lit btype size format\n var b3 = dat[bt], lbt = b3 & 3, sf = (b3 >> 2) & 3;\n // lit src size lit cmp sz 4 streams\n var lss = b3 >> 4, lcs = 0, s4 = 0;\n if (lbt < 2) {\n if (sf & 1)\n lss |= (dat[++bt] << 4) | ((sf & 2) && (dat[++bt] << 12));\n else\n lss = b3 >> 3;\n }\n else {\n s4 = sf;\n if (sf < 2)\n lss |= ((dat[++bt] & 63) << 4), lcs = (dat[bt] >> 6) | (dat[++bt] << 2);\n else if (sf == 2)\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 3) << 12), lcs = (dat[bt] >> 2) | (dat[++bt] << 6);\n else\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 63) << 12), lcs = (dat[bt] >> 6) | (dat[++bt] << 2) | (dat[++bt] << 10);\n }\n ++bt;\n // add literals to end - can never overlap with backreferences because unused literals always appended\n var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);\n // starting point for literals\n var spl = buf.length - lss;\n if (lbt == 0)\n buf.set(dat.subarray(bt, bt += lss), spl);\n else if (lbt == 1)\n fill(buf, dat[bt++], spl);\n else {\n // huffman table\n var hu = st.h;\n if (lbt == 2) {\n var hud = rhu(dat, bt);\n // subtract description length\n lcs += bt - (bt = hud[0]);\n st.h = hu = hud[1];\n }\n else if (!hu)\n err(0);\n (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);\n }\n // num sequences\n var ns = dat[bt++];\n if (ns) {\n if (ns == 255)\n ns = (dat[bt++] | (dat[bt++] << 8)) + 0x7F00;\n else if (ns > 127)\n ns = ((ns - 128) << 8) | dat[bt++];\n // symbol compression modes\n var scm = dat[bt++];\n if (scm & 3)\n err(0);\n var dts = [dmlt, doct, dllt];\n for (var i = 2; i > -1; --i) {\n var md = (scm >> ((i << 1) + 2)) & 3;\n if (md == 1) {\n // rle buf\n var rbuf = new u8([0, 0, dat[bt++]]);\n dts[i] = {\n s: rbuf.subarray(2, 3),\n n: rbuf.subarray(0, 1),\n t: new u16(rbuf.buffer, 0, 1),\n b: 0\n };\n }\n else if (md == 2) {\n // accuracy log 8 for offsets, 9 for others\n _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];\n }\n else if (md == 3) {\n if (!st.t)\n err(0);\n dts[i] = st.t[i];\n }\n }\n var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];\n var lb = dat[ebt - 1];\n if (!lb)\n err(0);\n var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;\n var lst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << llt.b) - 1);\n cbt = (spos -= oct.b) >> 3;\n var ost = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << oct.b) - 1);\n cbt = (spos -= mlt.b) >> 3;\n var mst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mlt.b) - 1);\n for (++ns; --ns;) {\n var llc = llt.s[lst];\n var lbtr = llt.n[lst];\n var mlc = mlt.s[mst];\n var mbtr = mlt.n[mst];\n var ofc = oct.s[ost];\n var obtr = oct.n[ost];\n cbt = (spos -= ofc) >> 3;\n var ofp = 1 << ofc;\n var off = ofp + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16) | (dat[cbt + 3] << 24)) >>> (spos & 7)) & (ofp - 1));\n cbt = (spos -= mlb[mlc]) >> 3;\n var ml = mlbl[mlc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << mlb[mlc]) - 1));\n cbt = (spos -= llb[llc]) >> 3;\n var ll = llbl[llc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << llb[llc]) - 1));\n cbt = (spos -= lbtr) >> 3;\n lst = llt.t[lst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << lbtr) - 1));\n cbt = (spos -= mbtr) >> 3;\n mst = mlt.t[mst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mbtr) - 1));\n cbt = (spos -= obtr) >> 3;\n ost = oct.t[ost] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << obtr) - 1));\n if (off > 3) {\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off -= 3;\n }\n else {\n var idx = off - (ll != 0);\n if (idx) {\n off = idx == 3 ? st.o[0] - 1 : st.o[idx];\n if (idx > 1)\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off;\n }\n else\n off = st.o[0];\n }\n for (var i = 0; i < ll; ++i) {\n buf[oubt + i] = buf[spl + i];\n }\n oubt += ll, spl += ll;\n var stin = oubt - off;\n if (stin < 0) {\n var len = -stin;\n var bs = st.e + stin;\n if (len > ml)\n len = ml;\n for (var i = 0; i < len; ++i) {\n buf[oubt + i] = st.w[bs + i];\n }\n oubt += len, ml -= len, stin = 0;\n }\n for (var i = 0; i < ml; ++i) {\n buf[oubt + i] = buf[stin + i];\n }\n oubt += ml;\n }\n if (oubt != spl) {\n while (spl < buf.length) {\n buf[oubt++] = buf[spl++];\n }\n }\n else\n oubt = buf.length;\n if (out)\n st.y += oubt;\n else\n buf = slc(buf, 0, oubt);\n }\n else if (out) {\n st.y += lss;\n if (spl) {\n for (var i = 0; i < lss; ++i) {\n buf[i] = buf[spl + i];\n }\n }\n }\n else if (spl)\n buf = slc(buf, spl);\n st.b = ebt;\n return buf;\n }\n err(2);\n};\n// concat\nvar cct = function (bufs, ol) {\n if (bufs.length == 1)\n return bufs[0];\n var buf = new u8(ol);\n for (var i = 0, b = 0; i < bufs.length; ++i) {\n var chk = bufs[i];\n buf.set(chk, b);\n b += chk.length;\n }\n return buf;\n};\n/**\n * Decompresses Zstandard data\n * @param dat The input data\n * @param buf The output buffer. If unspecified, the function will allocate\n * exactly enough memory to fit the decompressed data. If your\n * data has multiple frames and you know the output size, specifying\n * it will yield better performance.\n * @returns The decompressed data\n */\nexport function decompress(dat, buf) {\n var bufs = [], nb = +!buf;\n var bt = 0, ol = 0;\n for (; dat.length;) {\n var st = rzfh(dat, nb || buf);\n if (typeof st == 'object') {\n if (nb) {\n buf = null;\n if (st.w.length == st.u) {\n bufs.push(buf = st.w);\n ol += st.u;\n }\n }\n else {\n bufs.push(buf);\n st.e = 0;\n }\n for (; !st.l;) {\n var blk = rzb(dat, st, buf);\n if (!blk)\n err(5);\n if (buf)\n st.e = st.y;\n else {\n bufs.push(blk);\n ol += blk.length;\n cpw(st.w, 0, blk.length);\n st.w.set(blk, st.w.length - blk.length);\n }\n }\n bt = st.b + (st.c * 4);\n }\n else\n bt = st;\n dat = dat.subarray(bt);\n }\n return cct(bufs, ol);\n}\n/**\n * Decompressor for Zstandard streamed data\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a Zstandard decompressor\n * @param ondata The handler for stream data\n */\n function Decompress(ondata) {\n this.ondata = ondata;\n this.c = [];\n this.l = 0;\n this.z = 0;\n }\n /**\n * Pushes data to be decompressed\n * @param chunk The chunk of data to push\n * @param final Whether or not this is the last chunk in the stream\n */\n Decompress.prototype.push = function (chunk, final) {\n if (typeof this.s == 'number') {\n var sub = Math.min(chunk.length, this.s);\n chunk = chunk.subarray(sub);\n this.s -= sub;\n }\n var sl = chunk.length;\n var ncs = sl + this.l;\n if (!this.s) {\n if (final) {\n if (!ncs) {\n this.ondata(new u8(0), true);\n return;\n }\n // min for frame + one block\n if (ncs < 5)\n err(5);\n }\n else if (ncs < 18) {\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (typeof (this.s = rzfh(chunk)) == 'number')\n return this.push(chunk, final);\n }\n if (typeof this.s != 'number') {\n if (ncs < (this.z || 3)) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (!this.z && ncs < (this.z = (chunk[this.s.b] & 2) ? 4 : 3 + ((chunk[this.s.b] >> 3) | (chunk[this.s.b + 1] << 5) | (chunk[this.s.b + 2] << 13)))) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n else\n this.z = 0;\n for (;;) {\n var blk = rzb(chunk, this.s);\n if (!blk) {\n if (final)\n err(5);\n var adc = chunk.subarray(this.s.b);\n this.s.b = 0;\n this.c.push(adc), this.l += adc.length;\n return;\n }\n else {\n this.ondata(blk, false);\n cpw(this.s.w, 0, blk.length);\n this.s.w.set(blk, this.s.w.length - blk.length);\n }\n if (this.s.l) {\n var rest = chunk.subarray(this.s.b);\n this.s = this.s.c * 4;\n this.push(rest, final);\n return;\n }\n }\n }\n else if (final)\n err(5);\n };\n return Decompress;\n}());\nexport { Decompress };\n",
6
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Cross-runtime zstd compression/decompression.\n *\n * Decompression order of preference: Bun.zstd → node:zlib zstd (Node 22.15+,\n * Deno 2.6.9+) → fzstd pure-JS fallback. The fzstd fallback exists so\n * Cloudflare workerd — which has no native zstd — can still decode\n * `Content-Encoding: zstd` request bodies (the DuckDB VGI extension always\n * sends them). fzstd is decompression-only, so compression on workerd still\n * throws.\n */\n\nimport { decompress as fzstdDecompress } from \"fzstd\";\n\n// Resolve node:zlib via indirect-string require so esbuild/wrangler can't\n// trace it statically. On workerd we want the fzstd path, not a node:zlib\n// import that wouldn't have zstd anyway.\nconst _NODE_ZLIB_MOD = \"node:zlib\";\nconst isBun = typeof globalThis.Bun !== \"undefined\";\nfunction _loadZlibOrNull(): any | null {\n const req: any = (import.meta as any).require ?? (globalThis as any).require ?? null;\n if (!req) return null;\n try {\n return req(_NODE_ZLIB_MOD);\n } catch {\n return null;\n }\n}\n\n/** Return true when the current runtime can produce zstd-compressed output.\n *\n * Bun has `Bun.zstdCompressSync`; Node ≥22.15 / Deno ≥2.6.9 expose it via\n * `node:zlib`. Other runtimes (workerd, older Node) have no encoder. The\n * fzstd fallback is decompress-only so it doesn't count.\n */\nexport function isZstdCompressAvailable(): boolean {\n if (isBun) return true;\n const zlib = _loadZlibOrNull();\n return typeof zlib?.zstdCompressSync === \"function\";\n}\n\n/** Compress data with zstd at the given level (1-22). */\nexport async function zstdCompress(data: Uint8Array, level: number): Promise<Uint8Array<ArrayBuffer>> {\n if (isBun) {\n return new Uint8Array(Bun.zstdCompressSync(data, { level }));\n }\n const zlib = _loadZlibOrNull();\n const fn = zlib?.zstdCompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\n \"zstd compression is not available in this runtime. \" +\n \"Requires Bun or Node.js >= 22.15 / Deno >= 2.6.9. \" +\n \"(workerd has no native zstd encoder; fzstd is decompress-only.)\",\n );\n }\n return new Uint8Array(\n fn(data, {\n params: {\n [zlib.constants.ZSTD_c_compressionLevel]: level,\n },\n }),\n );\n}\n\n/**\n * Decompress zstd-compressed data, optionally bounding the output size.\n *\n * Zstd frames carry the decompressed size in the header and decompressors\n * trust it eagerly: a ~3 KB compressed body claiming 100 MB output would\n * allocate 100 MB. When `maxOutputSize` is supplied, this helper:\n *\n * 1. Reads `Frame_Content_Size` from the frame header. If declared and\n * above the cap, refuses *before* allocation with a clear error.\n * 2. Decompresses, then asserts the actual output size is also under the\n * cap (covers frames whose size is not in the header — a streaming\n * cap would be tighter, but neither Bun.zstdDecompressSync nor\n * node:zlib's sync API exposes one, so we use the post-check).\n *\n * Mirrors the Python server-side fix in `_decompress_body` and the\n * client-side fix in `external_fetch.fetch_url`.\n */\nexport async function zstdDecompress(data: Uint8Array, maxOutputSize?: number): Promise<Uint8Array<ArrayBuffer>> {\n if (maxOutputSize != null) {\n const declared = readZstdFrameContentSize(data);\n if (declared !== null && declared > maxOutputSize) {\n throw new Error(`zstd decompressed size (${declared}) would exceed cap (${maxOutputSize})`);\n }\n }\n\n let out: Uint8Array<ArrayBuffer>;\n if (isBun) {\n out = new Uint8Array(Bun.zstdDecompressSync(data));\n } else {\n const zlib = _loadZlibOrNull();\n const fn = zlib?.zstdDecompressSync;\n if (typeof fn === \"function\") {\n out = new Uint8Array(fn(data));\n } else {\n // workerd path: no native zstd, fall back to the pure-JS decoder.\n // fzstd is decompress-only and synchronous; cap-checking already ran\n // above against the frame header, but pure-JS decode of large inputs\n // is slow — keep the upstream maxOutputSize tight.\n //\n // CRITICAL: copy into a freshly-allocated ArrayBuffer so byteOffset is\n // 0. fzstd internally returns subarray views with arbitrary byteOffset\n // (often not 8-aligned), and downstream Arrow IPC readers create\n // BigInt64Array views relative to the buffer's byteOffset — those\n // throw `start offset of BigInt64Array should be a multiple of 8` if\n // the underlying offset isn't 8-aligned.\n const decoded = fzstdDecompress(data);\n out = new Uint8Array(decoded.byteLength);\n out.set(decoded);\n }\n }\n\n if (maxOutputSize != null && out.byteLength > maxOutputSize) {\n throw new Error(`zstd decompressed size (${out.byteLength}) exceeds cap (${maxOutputSize})`);\n }\n return out;\n}\n\n/**\n * Parse `Frame_Content_Size` from a zstd frame header.\n *\n * Returns the declared decompressed size, or `null` if the frame header\n * does not include it (frames may omit it for streaming compression) or\n * the input is too short / not a valid zstd frame magic.\n *\n * Frame format (RFC 8478): magic(4) | FHD(1) | window_desc(0|1) |\n * dict_id(0|1|2|4) | frame_content_size(0|1|2|4|8). FCS_size depends on\n * FCS_field_size (FHD bits 6-7) and Single_Segment_flag (FHD bit 5).\n */\nfunction readZstdFrameContentSize(data: Uint8Array): number | null {\n if (data.length < 6) return null;\n // Magic: 0xFD2FB528 little-endian.\n if (data[0] !== 0x28 || data[1] !== 0xb5 || data[2] !== 0x2f || data[3] !== 0xfd) {\n return null;\n }\n const fhd = data[4];\n const fcsFieldSize = (fhd >> 6) & 0x3;\n const singleSegment = ((fhd >> 5) & 0x1) === 1;\n const dictIdFlag = fhd & 0x3;\n // Per spec: FCS_size = 0 → 0 unless Single_Segment_flag is set, then 1.\n const fcsSize = fcsFieldSize === 0 ? (singleSegment ? 1 : 0) : fcsFieldSize === 1 ? 2 : fcsFieldSize === 2 ? 4 : 8;\n if (fcsSize === 0) return null;\n\n const windowDescSize = singleSegment ? 0 : 1;\n const dictIdSize = dictIdFlag === 0 ? 0 : dictIdFlag === 1 ? 1 : dictIdFlag === 2 ? 2 : 4;\n const fcsOffset = 5 + windowDescSize + dictIdSize;\n if (data.length < fcsOffset + fcsSize) return null;\n\n let fcs = 0n;\n for (let i = 0; i < fcsSize; i++) {\n fcs |= BigInt(data[fcsOffset + i]) << BigInt(i * 8);\n }\n // FCS_field_size == 1 (size 2) carries an offset of 256.\n if (fcsSize === 2) fcs += 256n;\n if (fcs > BigInt(Number.MAX_SAFE_INTEGER)) return Number.MAX_SAFE_INTEGER;\n return Number(fcs);\n}\n",
7
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n// Well-known metadata keys matching Python's metadata.py.\n\n/** Batch-metadata key carrying the invoked RPC method name. */\nexport const RPC_METHOD_KEY = \"vgi_rpc.method\";\n/** Batch-metadata key carrying a log batch's severity level. */\nexport const LOG_LEVEL_KEY = \"vgi_rpc.log_level\";\n/** Batch-metadata key carrying a log batch's message text. */\nexport const LOG_MESSAGE_KEY = \"vgi_rpc.log_message\";\n/** Batch-metadata key carrying a log batch's structured extra fields. */\nexport const LOG_EXTRA_KEY = \"vgi_rpc.log_extra\";\n/** Batch-metadata key carrying the wire request-framing version. */\nexport const REQUEST_VERSION_KEY = \"vgi_rpc.request_version\";\n/** Current wire request-framing version. Distinct from the application-level\n * {@link PROTOCOL_VERSION_KEY protocol version}. */\nexport const REQUEST_VERSION = \"1\";\n\n/** Batch-metadata key identifying the server instance that produced a batch. */\nexport const SERVER_ID_KEY = \"vgi_rpc.server_id\";\n/** Batch-metadata key carrying the client-supplied request id. */\nexport const REQUEST_ID_KEY = \"vgi_rpc.request_id\";\n\n/** Batch-metadata key carrying the service / protocol name. */\nexport const PROTOCOL_NAME_KEY = \"vgi_rpc.protocol_name\";\n/** Batch-metadata key carrying the `__describe__` response schema version. */\nexport const DESCRIBE_VERSION_KEY = \"vgi_rpc.describe_version\";\nexport const PROTOCOL_HASH_KEY = \"vgi_rpc.protocol_hash\";\n/** Current `__describe__` response schema version (the slim 8-column schema). */\nexport const DESCRIBE_VERSION = \"4\";\n\n/** Application protocol surface version. Carried on every request batch from\n * a client bound to a Protocol that declares `protocolVersion`; also emitted\n * in the __describe__ response metadata. Format: canonical semver\n * MAJOR.MINOR.PATCH. Enforced at the dispatch boundary on the server: exact\n * major+minor match required, patch ignored. Distinct from `REQUEST_VERSION`\n * (wire framing). Mirrors Python's `PROTOCOL_VERSION_KEY`. */\nexport const PROTOCOL_VERSION_KEY = \"vgi_rpc.protocol_version\";\n\n/** Reserved method name for the introspection (`__describe__`) call. */\nexport const DESCRIBE_METHOD_NAME = \"__describe__\";\n\n/** Batch-metadata key carrying the base64-encoded stream continuation/state token. */\nexport const STATE_KEY = \"vgi_rpc.stream_state#b64\";\nexport const CANCEL_KEY = \"vgi_rpc.cancel\";\n\nexport const LOCATION_KEY = \"vgi_rpc.location\";\nexport const LOCATION_SHA256_KEY = \"vgi_rpc.location.sha256\";\n\n/** HTTP response header set when an RPC error is returned over the HTTP transport. */\nexport const RPC_ERROR_HEADER = \"X-VGI-RPC-Error\";\n\n/** Top-level metadata key on an EXCEPTION batch identifying the error category.\n * Hoisted by `buildErrorBatch` when the thrown error has a static or instance\n * `errorKind` property. Mirrors Python's `vgi_rpc.metadata.ERROR_KIND_KEY`. */\nexport const ERROR_KIND_KEY = \"vgi_rpc.error_kind\";\n",
8
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Error thrown when the server encounters an RPC protocol error. */\nexport class RpcError extends Error {\n constructor(\n /** Remote error class name (e.g. `\"ValueError\"`). */\n public readonly errorType: string,\n /** Human-readable message from the remote error. */\n public readonly errorMessage: string,\n /** Remote stack-trace text, or an empty string when unavailable. */\n public readonly remoteTraceback: string,\n ) {\n super(`${errorType}: ${errorMessage}`);\n this.name = \"RpcError\";\n }\n}\n\n/** Error thrown when the client sends an unsupported request version. */\nexport class VersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionError\";\n }\n}\n\n/** `vgi_rpc.error_kind` batch-metadata value for {@link MethodNotImplementedError}.\n * Mirrors Python's `vgi_rpc.metadata.ERROR_KIND_*` constants. */\nexport const ERROR_KIND_METHOD_NOT_IMPLEMENTED = \"method_not_implemented\";\n/** `vgi_rpc.error_kind` batch-metadata value for {@link SessionLostError}. */\nexport const ERROR_KIND_SESSION_LOST = \"session_lost\";\n/** `vgi_rpc.error_kind` batch-metadata value for {@link ServerDrainingError}. */\nexport const ERROR_KIND_SERVER_DRAINING = \"server_draining\";\nexport const ERROR_KIND_PROTOCOL_VERSION_MISMATCH = \"protocol_version_mismatch\";\n\n/** Raised when the client's declared `vgi_rpc.protocol_version` is\n * incompatible with the server's. Subclass of `VersionError` so existing\n * catch sites continue to write a typed error stream and keep serving.\n * Carries a directional message that tells the reader which side to\n * upgrade. Mirrors Python's `vgi_rpc.rpc.ProtocolVersionError`. */\nexport class ProtocolVersionError extends VersionError {\n static readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n constructor(message: string) {\n super(message);\n this.name = \"ProtocolVersionError\";\n }\n}\n\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\n/** Parse a canonical semver string into `[major, minor, patch]`. Throws on\n * any input that isn't `MAJOR.MINOR.PATCH` with non-negative integers and\n * no leading zeros (except literal `0`). No prereleases, no build metadata.\n * Mirrors Python's `vgi_rpc.metadata.parse_version`. */\nexport function parseProtocolVersion(value: string): [number, number, number] {\n const m = SEMVER_REGEX.exec(value);\n if (!m) {\n throw new Error(\n `Invalid protocol version '${value}': expected canonical semver ` +\n \"MAJOR.MINOR.PATCH with non-negative integers and no leading zeros \" +\n \"(no prereleases or build metadata).\",\n );\n }\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\n/** Raised when a client invokes a method the server does not implement.\n *\n * Mirrors Python's `vgi_rpc.rpc.MethodNotImplementedError`. The static\n * `errorKind` is hoisted onto the error batch metadata as\n * `vgi_rpc.error_kind` so clients can branch on the typed marker without\n * string-matching the message.\n */\nexport class MethodNotImplementedError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n constructor(message: string) {\n super(message);\n this.name = \"MethodNotImplementedError\";\n }\n}\n\n/** Raised when a sticky session token is malformed, expired, evicted, or\n * bound to a different worker / principal. HTTP-only. */\nexport class SessionLostError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_SESSION_LOST;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_SESSION_LOST;\n constructor(message: string) {\n super(message);\n this.name = \"SessionLostError\";\n }\n}\n\n/** Raised when `ctx.openSession` is called while the server is draining. */\nexport class ServerDrainingError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n constructor(message: string) {\n super(message);\n this.name = \"ServerDrainingError\";\n }\n}\n",
9
+ "// arrow-js backend for vgi-rpc-typescript's Arrow facade.\n\nimport {\n Binary as A_Binary,\n Bool as A_Bool,\n Data as A_Data,\n type DataType as A_DataType,\n DataType as A_DataTypeNS,\n DateDay as A_DateDay,\n Decimal as A_Decimal,\n Dictionary as A_Dictionary,\n DurationMicrosecond as A_DurationMicrosecond,\n Field as A_Field,\n FixedSizeBinary as A_FixedSizeBinary,\n Float32 as A_Float32,\n Float64 as A_Float64,\n Int8 as A_Int8,\n Int16 as A_Int16,\n Int32 as A_Int32,\n Int64 as A_Int64,\n LargeBinary as A_LargeBinary,\n LargeUtf8 as A_LargeUtf8,\n List as A_List,\n Map_ as A_Map,\n Null as A_Null,\n RecordBatch as A_RecordBatch,\n Schema as A_Schema,\n Struct as A_Struct,\n TimeMicrosecond as A_TimeMicrosecond,\n Timestamp as A_Timestamp,\n TimeUnit as A_TimeUnit,\n Type as A_Type,\n Uint8 as A_Uint8,\n Uint16 as A_Uint16,\n Uint32 as A_Uint32,\n Uint64 as A_Uint64,\n Utf8 as A_Utf8,\n makeData as a_makeData,\n vectorFromArray as a_vectorFromArray,\n RecordBatchReader,\n RecordBatchStreamWriter,\n} from \"@query-farm/apache-arrow\";\n\n// Local type-only helpers used by conformBatchToSchema.\ntype _NeedsCast = (src: A_DataType, dst: A_DataType) => boolean;\n\nimport type {\n IncrementalEncoder,\n VgiBackendInfo,\n VgiBatch,\n VgiColumnData,\n VgiDataType,\n VgiField,\n VgiSchema,\n} from \"../types.js\";\n\nexport const backend: VgiBackendInfo = { name: \"arrow-js\", opaquePassthrough: true };\n\n// ----- Type factories ------------------------------------------------------\n\nexport const nullType = (): VgiDataType => new A_Null() as unknown as VgiDataType;\nexport const bool = (): VgiDataType => new A_Bool() as unknown as VgiDataType;\nexport const int8 = (): VgiDataType => new A_Int8() as unknown as VgiDataType;\nexport const int16 = (): VgiDataType => new A_Int16() as unknown as VgiDataType;\nexport const int32 = (): VgiDataType => new A_Int32() as unknown as VgiDataType;\nexport const int64 = (): VgiDataType => new A_Int64() as unknown as VgiDataType;\nexport const uint8 = (): VgiDataType => new A_Uint8() as unknown as VgiDataType;\nexport const uint16 = (): VgiDataType => new A_Uint16() as unknown as VgiDataType;\nexport const uint32 = (): VgiDataType => new A_Uint32() as unknown as VgiDataType;\nexport const uint64 = (): VgiDataType => new A_Uint64() as unknown as VgiDataType;\nexport const float32 = (): VgiDataType => new A_Float32() as unknown as VgiDataType;\nexport const float64 = (): VgiDataType => new A_Float64() as unknown as VgiDataType;\nexport const utf8 = (): VgiDataType => new A_Utf8() as unknown as VgiDataType;\nexport const binary = (): VgiDataType => new A_Binary() as unknown as VgiDataType;\n\n/** Microsecond Timestamp with optional timezone. */\nexport const timestampMicro = (timezone: string | null = null): VgiDataType =>\n new A_Timestamp(A_TimeUnit.MICROSECOND, timezone) as unknown as VgiDataType;\n\n/** Date32 with day resolution. */\nexport const dateDay = (): VgiDataType => new A_DateDay() as unknown as VgiDataType;\n/** Time64 with microsecond resolution. */\nexport const timeMicro = (): VgiDataType => new A_TimeMicrosecond() as unknown as VgiDataType;\n/** Duration with microsecond resolution. */\nexport const durationMicro = (): VgiDataType => new A_DurationMicrosecond() as unknown as VgiDataType;\n/** Decimal128 by default; pass bitWidth=256 for Decimal256. */\nexport const decimal = (precision: number, scale: number, bitWidth: 128 | 256 = 128): VgiDataType =>\n new A_Decimal(scale, precision, bitWidth) as unknown as VgiDataType;\n/** FixedSizeBinary with the given byte width. */\nexport const fixedSizeBinary = (byteWidth: number): VgiDataType =>\n new A_FixedSizeBinary(byteWidth) as unknown as VgiDataType;\n/** LargeUtf8 — 64-bit-offset UTF-8 string. */\nexport const largeUtf8 = (): VgiDataType => new A_LargeUtf8() as unknown as VgiDataType;\n/** LargeBinary — 64-bit-offset binary blob. */\nexport const largeBinary = (): VgiDataType => new A_LargeBinary() as unknown as VgiDataType;\n/** List of `child` items. The child field carries name + nullability + type. */\nexport const list = (child: VgiField): VgiDataType => new A_List(child as unknown as A_Field) as unknown as VgiDataType;\n/** Struct of `fields`. */\nexport const struct = (fields: readonly VgiField[]): VgiDataType =>\n new A_Struct(fields as unknown as A_Field[]) as unknown as VgiDataType;\n/** Map (key → value) carried as a List<Struct<key,value>>. arrow-js's Map_\n * constructor takes a child Field whose type is a Struct of [key, value]. */\nexport const map = (keyField: VgiField, valueField: VgiField, keysSorted = false): VgiDataType => {\n const k = keyField as unknown as A_Field;\n const v = valueField as unknown as A_Field;\n const entriesField = new A_Field(\"entries\", new A_Struct([k, v]), /* nullable */ false);\n return new A_Map(entriesField, keysSorted) as unknown as VgiDataType;\n};\n/** Dictionary-encoded type. `indices` must be an integer type.\n *\n * `id` is left undefined by default so arrow-js's internal `getId()`\n * counter assigns a fresh unique id per Dictionary instance. Passing\n * `-1` (or any concrete number) here would short-circuit that counter\n * and produce id collisions when multiple Dictionary types are used. */\nexport const dictionary = (indices: VgiDataType, values: VgiDataType, id?: number, ordered = false): VgiDataType =>\n new A_Dictionary(values as A_DataType, indices as any, id, ordered) as unknown as VgiDataType;\n\nexport function field(name: string, type: VgiDataType, nullable = true, metadata?: Map<string, string>): VgiField {\n return new A_Field(name, type as A_DataType, nullable, metadata ?? new Map()) as unknown as VgiField;\n}\n\nexport function schema(fields: readonly VgiField[], metadata?: Map<string, string>): VgiSchema {\n return new A_Schema(fields as A_Field[], metadata ?? new Map()) as unknown as VgiSchema;\n}\n\n// ----- IPC -----------------------------------------------------------------\n\nexport function serializeSchema(s: VgiSchema): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, s as unknown as A_Schema);\n writer.close();\n return writer.toUint8Array(true);\n}\n\nexport function deserializeSchema(bytes: Uint8Array): VgiSchema {\n const reader = RecordBatchReader.from(bytes);\n const batches = [...reader];\n if (batches.length > 0) return batches[0].schema as unknown as VgiSchema;\n if (reader.schema) return reader.schema as unknown as VgiSchema;\n throw new Error(\"Cannot deserialize schema from empty IPC stream\");\n}\n\nexport function serializeBatch(batch: VgiBatch): Uint8Array {\n const a = batch as unknown as A_RecordBatch;\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, a.schema);\n (writer as any)._writeRecordBatch(a);\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/**\n * Incremental IPC encoder over arrow-js's `RecordBatchStreamWriter`. Each\n * call drains the writer's internal sink queue and returns the new bytes,\n * so the caller can flush them synchronously between lockstep turns.\n *\n * `_writeRecordBatch` is called directly (rather than the public `write`)\n * to bypass arrow-js's schema comparison, which would auto-close the\n * writer and silently drop a batch whose schema differs only in\n * nullability — our output schema is fixed at open time and all batches\n * are structurally compatible.\n */\nexport function createIncrementalEncoder(s: VgiSchema): IncrementalEncoder {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, s as unknown as A_Schema);\n const drain = (): Uint8Array => {\n const values = (writer as any)._sink._values as Uint8Array[];\n const total = values.reduce((n, c) => n + c.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const c of values) {\n out.set(c, off);\n off += c.length;\n }\n values.length = 0;\n return out;\n };\n return {\n start: () => drain(),\n writeBatch(batch: VgiBatch): Uint8Array {\n (writer as any)._writeRecordBatch(batch as unknown as A_RecordBatch);\n return drain();\n },\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000).\n finish: () => new Uint8Array(new Int32Array([-1, 0]).buffer),\n };\n}\n\nexport function deserializeBatch(bytes: Uint8Array): VgiBatch {\n const reader = RecordBatchReader.from(bytes);\n const batches = [...reader];\n if (batches.length === 0) {\n const sch = reader.schema ?? new A_Schema([]);\n // Build an empty batch matching the schema. arrow-js quirk: empty IPC\n // streams may not give us a Schema; default to no fields.\n const structType = new A_Struct(sch.fields);\n const data = a_makeData({ type: structType, length: 0, children: [], nullCount: 0 });\n return new A_RecordBatch(sch, data) as unknown as VgiBatch;\n }\n return batches[0] as unknown as VgiBatch;\n}\n\n// ----- Construction --------------------------------------------------------\n\nexport function columnFromArray(values: any[], type: VgiDataType): VgiColumnData {\n return a_vectorFromArray(values, type as A_DataType).data[0] as VgiColumnData;\n}\n\n/** Build a 1-row batch from {colName: value} dict (Int64 numbers auto-coerced). */\nexport function singleRowBatch(s: VgiSchema, values: Record<string, any>): VgiBatch {\n const a = s as unknown as A_Schema;\n const children = a.fields.map((f) => {\n let val = values[f.name];\n if (f.type.typeId === A_Type.Int && (f.type as any).bitWidth === 64) {\n if (typeof val === \"number\") val = BigInt(val);\n }\n return a_vectorFromArray([val], f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 1, children, nullCount: 0 });\n return new A_RecordBatch(a, data) as unknown as VgiBatch;\n}\n\n/** Build an N-row batch from columnar arrays. */\nexport function batchFromColumns(s: VgiSchema, columns: Record<string, any[]>): VgiBatch {\n const a = s as unknown as A_Schema;\n const numRows = a.fields.length > 0 ? (columns[a.fields[0].name]?.length ?? 0) : 0;\n const children = a.fields.map((f) => {\n const vals = columns[f.name];\n if (!vals) return a_makeData({ type: f.type, length: numRows, nullCount: numRows });\n return a_vectorFromArray(vals, f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: numRows, children, nullCount: 0 });\n return new A_RecordBatch(a, data) as unknown as VgiBatch;\n}\n\n/** Build a batch from pre-built column-data handles + schema. */\nexport function batchFromColumnData(\n s: VgiSchema,\n numRows: number,\n columnData: VgiColumnData[],\n metadata?: Map<string, string>,\n): VgiBatch {\n const a = s as unknown as A_Schema;\n const structType = new A_Struct(a.fields);\n const data = a_makeData({\n type: structType,\n length: numRows,\n children: columnData as any[],\n nullCount: 0,\n });\n // arrow-js Schema doesn't carry batch-level metadata; attach it when present\n // by cloning with a fresh metadata map.\n const finalSchema = metadata && metadata.size > 0 ? new A_Schema(a.fields, metadata) : a;\n return new A_RecordBatch(finalSchema, data) as unknown as VgiBatch;\n}\n\n/** Empty-Data builder used when assembling batches with pre-built children. */\nexport function emptyColumnData(type: VgiDataType): VgiColumnData {\n return makeEmptyDataRecursive(type as A_DataType) as VgiColumnData;\n}\n\n/**\n * 0-row batch with optional batch-level metadata (used for log/error/empty\n * tombstone batches by the wire layer).\n */\nexport function emptyBatchWithMetadata(s: VgiSchema, metadata?: Map<string, string>): VgiBatch {\n const a = s as unknown as A_Schema;\n const children = a.fields.map((f) => makeEmptyDataRecursive(f.type));\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 0, children, nullCount: 0 });\n return new A_RecordBatch(a, data, metadata) as unknown as VgiBatch;\n}\n\n/** Recursive empty-Data builder — needed for nested types so arrow-js's\n * IPC writer doesn't crash on List/Map/Struct/Union with absent children. */\nfunction makeEmptyDataRecursive(type: A_DataType): any {\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n if (M.DataType.isStruct(type)) {\n const children = (type as any).children.map((f: any) => makeEmptyDataRecursive(f.type));\n return a_makeData({ type, length: 0, children, nullCount: 0 } as any);\n }\n if (M.DataType.isList(type)) {\n const childData = makeEmptyDataRecursive((type as any).children[0].type);\n return a_makeData({ type, length: 0, child: childData, nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n if (M.DataType.isFixedSizeList(type)) {\n const childData = makeEmptyDataRecursive((type as any).children[0].type);\n return a_makeData({ type, length: 0, child: childData, nullCount: 0 } as any);\n }\n if (M.DataType.isMap(type)) {\n const entryType = (type as any).children[0]?.type;\n const entryData = entryType\n ? makeEmptyDataRecursive(entryType)\n : a_makeData({ type: new A_Struct([]), length: 0, children: [], nullCount: 0 });\n return a_makeData({ type, length: 0, child: entryData, nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n if (M.DataType.isUnion(type)) {\n const children = (type as any).children.map((f: any) => makeEmptyDataRecursive(f.type));\n if (M.DataType.isDenseUnion(type)) {\n return a_makeData({\n type,\n length: 0,\n typeIds: new Int8Array(0),\n valueOffsets: new Int32Array(0),\n children,\n nullCount: 0,\n } as any);\n }\n return a_makeData({\n type,\n length: 0,\n typeIds: new Int8Array(0),\n children,\n nullCount: 0,\n } as any);\n }\n return a_makeData({ type, length: 0, nullCount: 0 });\n}\n\n/** 1-row result batch: vectorFromArray each value, support raw Data\n * passthrough (for Map/opaque types whose .get(0) is unreliable). */\nexport function singleRowBatchWithMetadata(\n s: VgiSchema,\n values: Record<string, any>,\n metadata?: Map<string, string>,\n): VgiBatch {\n const a = s as unknown as A_Schema;\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n const children = a.fields.map((f) => {\n const val = values[f.name];\n if (val instanceof M.Data) return val;\n return a_vectorFromArray([val], f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 1, children, nullCount: 0 });\n return new A_RecordBatch(a, data, metadata) as unknown as VgiBatch;\n}\n\n/** Tag a value as a raw Data passthrough. arrow-js: returns true if the\n * value is an arrow-js Data instance. flechette: always false (the\n * flechette backend doesn't surface this opaque-type quirk). */\nexport function isOpaqueData(val: unknown): boolean {\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n return val instanceof M.Data;\n}\n\n/** Re-emit a batch with a different metadata map (same schema + data). */\nexport function withBatchMetadata(batch: VgiBatch, metadata: Map<string, string>): VgiBatch {\n const a = batch as unknown as A_RecordBatch;\n return new A_RecordBatch(a.schema, a.data, metadata) as unknown as VgiBatch;\n}\n\n/**\n * Serialize a sequence of batches into a single multi-batch IPC stream.\n * arrow-js's `RecordBatchStreamWriter` writes schema + N batches + EOS\n * incrementally — exactly what consumers expect for a producer/exchange\n * response that emits more than one batch.\n */\nexport function serializeBatches(schema: VgiSchema, batches: VgiBatch[]): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema as unknown as A_Schema);\n for (const batch of batches) {\n (writer as any)._writeRecordBatch(batch as unknown as A_RecordBatch);\n }\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/**\n * Rebuild a batch's data to match a target schema's field types.\n *\n * Lives on the backend because every line touches arrow-js internals\n * (Data.children, Data.clone, vectorFromArray, makeData with nullBitmap\n * passthrough). flechette's IPC reader produces specific types upfront, so\n * its `conformBatchToSchema` is a no-op — keeping this code out of the\n * shared util/ tree is what lets the worker-cf bundle drop arrow-js.\n */\nconst _needsValueCast: _NeedsCast = (src, dst) => {\n if (src.typeId === dst.typeId) return false;\n if (src.constructor === dst.constructor) return false;\n return true;\n};\n\nconst _isNumeric = (t: A_DataType): boolean => t.typeId === A_Type.Int || t.typeId === A_Type.Float;\n\nexport function conformBatchToSchema(batch: VgiBatch, schema: VgiSchema): VgiBatch {\n const a = batch as unknown as A_RecordBatch;\n if (a.numRows === 0) return batch;\n const s = schema as unknown as A_Schema;\n\n if (a.schema.fields.length !== s.fields.length) {\n throw new TypeError(`Field count mismatch: expected ${s.fields.length}, got ${a.schema.fields.length}`);\n }\n for (let i = 0; i < s.fields.length; i++) {\n if (a.schema.fields[i].name !== s.fields[i].name) {\n throw new TypeError(\n `Field name mismatch at index ${i}: expected '${s.fields[i].name}', got '${a.schema.fields[i].name}'`,\n );\n }\n }\n\n const children = s.fields.map((f, i) => {\n const srcChild = a.data.children[i];\n const srcType = srcChild.type;\n const dstType = f.type;\n\n if (!_needsValueCast(srcType, dstType)) {\n return srcChild.clone(dstType);\n }\n if (_isNumeric(srcType) && _isNumeric(dstType)) {\n const col = a.getChildAt(i)!;\n const values: number[] = [];\n for (let r = 0; r < a.numRows; r++) {\n const v = col.get(r);\n values.push(typeof v === \"bigint\" ? Number(v) : (v as number));\n }\n return a_vectorFromArray(values, dstType).data[0];\n }\n return srcChild.clone(dstType);\n });\n\n const structType = new A_Struct(s.fields);\n const data = a_makeData({\n type: structType,\n length: a.numRows,\n children,\n nullCount: a.data.nullCount,\n nullBitmap: a.data.nullBitmap,\n });\n return new A_RecordBatch(s, data, a.metadata) as unknown as VgiBatch;\n}\n",
10
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * External storage support for large Arrow IPC batches.\n *\n * When a batch exceeds a configurable threshold, it is serialized to IPC,\n * optionally compressed with zstd, and uploaded to pluggable storage.\n * The batch is replaced with a zero-row \"pointer batch\" containing the\n * download URL and SHA-256 checksum in metadata.\n */\n\nimport { deserializeBatch, serializeBatch, type VgiBatch, type VgiSchema } from \"./arrow/index.js\";\nimport { LOCATION_KEY, LOCATION_SHA256_KEY, LOG_LEVEL_KEY } from \"./constants.js\";\nimport { zstdCompress, zstdDecompress } from \"./util/zstd.js\";\nimport { buildEmptyBatch } from \"./wire/response.js\";\n\n// ---------------------------------------------------------------------------\n// Interfaces and configuration\n// ---------------------------------------------------------------------------\n\n/** Pluggable storage backend for uploading large batches. */\nexport interface ExternalStorage {\n /** Upload IPC data and return a URL for retrieval. */\n upload(data: Uint8Array, contentEncoding: string): Promise<string>;\n}\n\n/** A pre-signed PUT/GET URL pair for client-side data upload. */\nexport interface UploadUrl {\n /** Pre-signed PUT URL the client uploads to. */\n uploadUrl: string;\n /** Pre-signed GET URL the server fetches from. */\n downloadUrl: string;\n /** Expiration time (UTC) for the URL pair. */\n expiresAt: Date;\n}\n\n/**\n * Generates pre-signed upload URL pairs for client-vended externalization.\n *\n * Implementations must be safe to call from multiple concurrent requests.\n * Object lifecycle is the operator's responsibility — uploaded objects are\n * not automatically deleted by vgi-rpc.\n */\nexport interface UploadUrlProvider {\n /** Allocate one upload/download URL pair. */\n generateUploadUrl(): Promise<UploadUrl> | UploadUrl;\n}\n\n/** Configuration for external storage of large batches. */\nexport interface ExternalLocationConfig {\n /** Storage backend for uploading. */\n storage: ExternalStorage;\n /** Minimum batch byte size to trigger externalization. Default: 1MB. */\n externalizeThresholdBytes?: number;\n /** Optional zstd compression for uploaded data. */\n compression?: {\n /** Compression algorithm; only `\"zstd\"` is currently supported. */\n algorithm: \"zstd\";\n /** zstd compression level. Default: 3. */\n level?: number;\n };\n /** URL validator called before fetching. Throw to reject. Default: HTTPS-only. */\n urlValidator?: ((url: string) => void) | null;\n}\n\nconst DEFAULT_THRESHOLD = 1_048_576; // 1 MB\n\n// ---------------------------------------------------------------------------\n// URL validation\n// ---------------------------------------------------------------------------\n\n/** Default validator that rejects non-HTTPS URLs. */\nexport function httpsOnlyValidator(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(`External location URL must use HTTPS, got \"${parsed.protocol}\"`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 helpers\n// ---------------------------------------------------------------------------\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n // Copy to a plain ArrayBuffer to satisfy Web Crypto API type requirements\n const buf = new ArrayBuffer(data.byteLength);\n new Uint8Array(buf).set(data);\n const hash = await crypto.subtle.digest(\"SHA-256\", buf);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\n/** Returns true if the batch is a zero-row pointer to external data. */\nexport function isExternalLocationBatch(batch: VgiBatch): boolean {\n if (batch.numRows !== 0) return false;\n const meta = batch.metadata;\n if (!meta) return false;\n return meta.has(LOCATION_KEY) && !meta.has(LOG_LEVEL_KEY);\n}\n\n// ---------------------------------------------------------------------------\n// Pointer batch creation\n// ---------------------------------------------------------------------------\n\n/** Create a zero-row pointer batch with location URL and optional SHA-256. */\nexport function makeExternalLocationBatch(schema: VgiSchema, url: string, sha256?: string): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOCATION_KEY, url);\n if (sha256) {\n metadata.set(LOCATION_SHA256_KEY, sha256);\n }\n return buildEmptyBatch(schema, metadata);\n}\n\n// ---------------------------------------------------------------------------\n// IPC serialization helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeBatchToIpc(batch: VgiBatch): Uint8Array {\n return serializeBatch(batch);\n}\n\nfunction batchByteSize(batch: VgiBatch): number {\n // Estimate from IPC serialization size for threshold check.\n return serializeBatch(batch).byteLength;\n}\n\n// ---------------------------------------------------------------------------\n// Write path: externalization\n// ---------------------------------------------------------------------------\n\n/**\n * Maybe externalize a batch if it exceeds the threshold.\n * Returns the original batch unchanged if below threshold or no config.\n */\nexport async function maybeExternalizeBatch(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config?.storage) return batch;\n if (batch.numRows === 0) return batch;\n\n const threshold = config.externalizeThresholdBytes ?? DEFAULT_THRESHOLD;\n if (batchByteSize(batch) < threshold) return batch;\n\n // Serialize to IPC\n let ipcData = serializeBatchToIpc(batch);\n\n // Compute SHA-256 of raw IPC bytes (pre-compression)\n const checksum = await sha256Hex(ipcData);\n\n // Optionally compress\n let contentEncoding = \"\";\n if (config.compression?.algorithm === \"zstd\") {\n ipcData = (await zstdCompress(ipcData, config.compression.level ?? 3)) as Uint8Array;\n contentEncoding = \"zstd\";\n }\n\n // Upload\n const url = await config.storage.upload(ipcData, contentEncoding);\n\n // Return pointer batch\n return makeExternalLocationBatch(batch.schema, url, checksum);\n}\n\n// ---------------------------------------------------------------------------\n// Read path: resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an external pointer batch by fetching the data from the URL.\n * Returns the original batch unchanged if not a pointer or no config.\n */\nexport async function resolveExternalLocation(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config) return batch;\n if (!isExternalLocationBatch(batch)) return batch;\n\n const url = batch.metadata?.get(LOCATION_KEY);\n if (!url) return batch;\n\n // Validate URL\n const validator = config.urlValidator === null ? undefined : (config.urlValidator ?? httpsOnlyValidator);\n if (validator) {\n validator(url);\n }\n\n // Fetch\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`External location fetch failed: ${response.status} ${response.statusText} [url: ${url}]`);\n }\n let data = new Uint8Array(await response.arrayBuffer());\n\n // Decompress if needed. Cap the decompressed size at 16x the\n // compressed body generous for typical Arrow IPC zstd ratios but\n // tight enough that a tiny response cannot inflate to multi-GB.\n // Mirrors Python's external_fetch.fetch_url.\n const contentEncoding = response.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n const cap = data.byteLength * 16;\n data = new Uint8Array(await zstdDecompress(data, cap));\n }\n\n // Verify SHA-256 if present\n const expectedSha256 = batch.metadata?.get(LOCATION_SHA256_KEY);\n if (expectedSha256) {\n const actualSha256 = await sha256Hex(data);\n if (actualSha256 !== expectedSha256) {\n throw new Error(`SHA-256 checksum mismatch for ${url}: expected ${expectedSha256}, got ${actualSha256}`);\n }\n }\n\n // Parse IPC stream\n const resolved = deserializeBatch(data);\n if (resolved.numRows === 0 && resolved.schema.fields.length === 0) {\n throw new Error(`No data batch found in external IPC stream from ${url}`);\n }\n return resolved;\n}\n",
11
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n emptyBatchWithMetadata,\n isInt,\n singleRowBatchWithMetadata,\n type VgiBatch,\n type VgiSchema,\n} from \"../arrow/index.js\";\nimport {\n ERROR_KIND_KEY,\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n REQUEST_ID_KEY,\n SERVER_ID_KEY,\n} from \"../constants.js\";\n\n/**\n * Coerce values for Int64 schema fields from Number to BigInt.\n * Handles both single values and arrays. Returns a new record with coerced values.\n */\nexport function coerceInt64(schema: VgiSchema, values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = { ...values };\n for (const f of schema.fields) {\n const val = result[f.name];\n if (val === undefined) continue;\n if (!isInt(f.type) || (f.type as any).bitWidth !== 64) continue;\n\n if (Array.isArray(val)) {\n result[f.name] = val.map((v: any) => (typeof v === \"number\" ? BigInt(v) : v));\n } else if (typeof val === \"number\") {\n result[f.name] = BigInt(val);\n }\n }\n return result;\n}\n\n/**\n * Build a 1-row result batch with optional metadata.\n * For unary methods, `values` maps field names to single values.\n */\nexport function buildResultBatch(\n schema: VgiSchema,\n values: Record<string, any>,\n serverId: string,\n requestId: string | null,\n): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n if (schema.fields.length === 0) {\n return buildEmptyBatch(schema, metadata);\n }\n\n // Validate required fields\n for (const f of schema.fields) {\n if (values[f.name] === undefined && !f.nullable) {\n const got = Object.keys(values);\n throw new TypeError(`Handler result missing required field '${f.name}'. Got keys: [${got.join(\", \")}]`);\n }\n }\n\n const coerced = coerceInt64(schema, values);\n return singleRowBatchWithMetadata(schema, coerced, metadata);\n}\n\n/**\n * Build a 0-row error batch with EXCEPTION metadata matching Python's Message.from_exception().\n */\nexport function buildErrorBatch(schema: VgiSchema, error: Error, serverId: string, requestId: string | null): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, \"EXCEPTION\");\n // Prefer the standard `error.name` property (which user classes can set\n // via `this.name = \"Foo\"` even after a bundler renames the class) over\n // `constructor.name`, which is fragile under minification.\n const exceptionType = typeof error.name === \"string\" && error.name !== \"Error\" ? error.name : error.constructor.name;\n metadata.set(LOG_MESSAGE_KEY, `${exceptionType}: ${error.message}`);\n\n // Hoist `errorKind` (typed-exception marker) into the EXCEPTION batch\n // metadata as a top-level `vgi_rpc.error_kind` field so clients can\n // branch on the kind without parsing the log_extra JSON blob. Mirrors\n // Python's `Message.from_exception()` + `add_to_metadata()` hoisting.\n const errorKind =\n (error as { errorKind?: unknown }).errorKind ??\n ((error.constructor as { errorKind?: unknown }).errorKind as unknown);\n if (typeof errorKind === \"string\" && errorKind.length > 0) {\n metadata.set(ERROR_KIND_KEY, errorKind);\n }\n\n const extra: Record<string, any> = {\n exception_type: exceptionType,\n exception_message: error.message,\n traceback: error.stack ?? \"\",\n };\n if (typeof errorKind === \"string\" && errorKind.length > 0) {\n extra.error_kind = errorKind;\n }\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row log batch.\n */\nexport function buildLogBatch(\n schema: VgiSchema,\n level: string,\n message: string,\n extra?: Record<string, any>,\n serverId?: string,\n requestId?: string | null,\n): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, level);\n metadata.set(LOG_MESSAGE_KEY, message);\n if (extra) {\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n }\n if (serverId != null) {\n metadata.set(SERVER_ID_KEY, serverId);\n }\n if (requestId != null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row batch from a schema with metadata.\n * Used for error/log batches.\n */\nexport function buildEmptyBatch(schema: VgiSchema, metadata?: Map<string, string>): VgiBatch {\n return emptyBatchWithMetadata(schema, metadata);\n}\n",
12
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n conformBatchToSchema,\n deserializeBatch,\n serializeBatches,\n type VgiBatch,\n type VgiSchema,\n} from \"../arrow/index.js\";\nimport { RPC_ERROR_HEADER } from \"../constants.js\";\nimport type { CookieSpec } from \"../types.js\";\n\n/** MIME type for Arrow IPC stream request and response bodies. */\nexport const ARROW_CONTENT_TYPE = \"application/vnd.apache.arrow.stream\";\n\n// Sticky session header conventions (HTTP-only). Mirrors Python's\n// `vgi_rpc.http._common`. Headers not cookies — so multiple concurrent\n// sessions to one host from a single client multiplex correctly.\nexport const SESSION_HEADER = \"VGI-Session\";\nexport const SESSION_ACCEPT_HEADER = \"VGI-Session-Accept\";\nexport const SESSION_CLOSE_HEADER = \"VGI-Session-Close\";\nexport const STICKY_ENABLED_HEADER = \"VGI-Sticky-Enabled\";\nexport const STICKY_DEFAULT_TTL_HEADER = \"VGI-Sticky-Default-TTL\";\nexport const STICKY_ECHO_HEADERS_HEADER = \"VGI-Sticky-Echo-Headers\";\n\n/** Prefix the server uses to tell the client \"echo this header on subsequent\n * requests in this session\". Clients capture and replay\n * `VGI-Echo-<name>: <value>` as plain `<name>: <value>` for the session\n * lifetime used for client-driven routing (e.g. `fly-force-instance-id`). */\nexport const ECHO_HEADER_PREFIX = \"VGI-Echo-\";\n\n/** Framework-managed sticky session teardown endpoint path component.\n * `DELETE {prefix}/__session__` idempotently closes the session referenced\n * by the request's `VGI-Session` header. */\nexport const SESSION_ENDPOINT = \"__session__\";\n\n/** Serialize a CookieSpec into a Set-Cookie header value. */\nexport function formatSetCookieHeader(c: CookieSpec): string {\n const parts: string[] = [];\n if (c.delete) {\n parts.push(`${c.name}=`);\n parts.push(\"Max-Age=0\");\n } else {\n parts.push(`${c.name}=${c.value}`);\n if (c.maxAge !== undefined) parts.push(`Max-Age=${c.maxAge}`);\n if (c.expires) parts.push(`Expires=${c.expires.toUTCString()}`);\n }\n if (c.path) parts.push(`Path=${c.path}`);\n if (c.domain) parts.push(`Domain=${c.domain}`);\n if (c.secure) parts.push(\"Secure\");\n if (c.httpOnly) parts.push(\"HttpOnly\");\n if (c.sameSite) parts.push(`SameSite=${c.sameSite}`);\n if (c.partitioned) parts.push(\"Partitioned\");\n return parts.join(\"; \");\n}\n\n/** Append Set-Cookie headers for each queued CookieSpec onto an existing Headers object. */\nexport function appendCookieHeaders(headers: Headers, cookies: readonly CookieSpec[]): void {\n for (const c of cookies) {\n headers.append(\"Set-Cookie\", formatSetCookieHeader(c));\n }\n}\n\nexport class HttpRpcError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = \"HttpRpcError\";\n }\n}\n\n/**\n * Serialize a schema + batches into a complete IPC stream as Uint8Array.\n *\n * A single IPC stream is `[schema_msg, batch_msg, batch_msg, ..., EOS]`.\n * Each backend implements `serializeBatches` to write that atomically —\n * arrow-js via `RecordBatchStreamWriter`, flechette via `tablesToIPC`\n * (added in our flechette fork). Naive concatenation of per-batch streams\n * produces multiple EOS markers and breaks readers.\n */\nexport function serializeIpcStream(schema: VgiSchema, batches: VgiBatch[]): Uint8Array {\n const conformed = batches.map((b) => conformBatchToSchema(b, schema));\n return serializeBatches(schema, conformed);\n}\n\n/**\n * Create a Response with Arrow IPC content type.\n *\n * Server errors (status 500) are translated to HTTP 200 with an\n * ``X-VGI-RPC-Error: true`` header so that clients which discard\n * response bodies on 5xx still receive the Arrow IPC error metadata.\n * Client errors (400, 401, 404, 415) are passed through unchanged.\n */\nexport function arrowResponse(body: Uint8Array, status = 200, extraHeaders?: Headers): Response {\n const headers = extraHeaders ?? new Headers();\n headers.set(\"Content-Type\", ARROW_CONTENT_TYPE);\n if (status === 500) {\n headers.set(RPC_ERROR_HEADER, \"true\");\n return new Response(body as unknown as BodyInit, { status: 200, headers });\n }\n return new Response(body as unknown as BodyInit, { status, headers });\n}\n\n/** Read schema + first batch from an IPC stream body via the facade. */\nexport async function readRequestFromBody(body: Uint8Array): Promise<{ schema: VgiSchema; batch: VgiBatch }> {\n const batch = deserializeBatch(body);\n // Reject only truly empty bodies. A zero-field, zero-row batch with batch\n // metadata is a legal exchange/cancel/continuation signal — the state\n // token rides on `batch.metadata` and downstream code (cancel detection,\n // schema conformance gating) is built to handle it.\n if (batch.schema.fields.length === 0 && batch.numRows === 0 && (batch.metadata?.size ?? 0) === 0) {\n throw new HttpRpcError(\"Empty IPC stream: no schema\", 400);\n }\n return { schema: batch.schema, batch };\n}\n",
13
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * HTTP server capability discovery.\n *\n * Mirrors Python's `http_capabilities()`: probes `OPTIONS {prefix}/health`\n * and reads three response headers:\n * - `VGI-Max-Request-Bytes` — server-enforced inline request cap\n * - `VGI-Upload-URL-Support` \"true\" when the server vends upload URLs\n * - `VGI-Max-Upload-Bytes` — cap on out-of-band upload size\n *\n * Honours `Cache-Control: max-age=N` for refresh scheduling.\n */\n\nexport interface HttpServerCapabilities {\n /** Server's advertised max inline request body size (bytes). */\n maxRequestBytes: number | null;\n /** Whether the server vends upload URLs via `__upload_url__/init`. */\n uploadUrlSupport: boolean;\n /** Cap on the size of an externalized upload (bytes). */\n maxUploadBytes: number | null;\n /** Monotonic-time-ish epoch (ms) at which this snapshot should be re-probed. */\n cacheExpiresAt: number | null;\n}\n\nconst MAX_REQUEST_BYTES_HEADER = \"VGI-Max-Request-Bytes\";\nconst UPLOAD_URL_HEADER = \"VGI-Upload-URL-Support\";\nconst MAX_UPLOAD_BYTES_HEADER = \"VGI-Max-Upload-Bytes\";\n\nfunction parseHeaderInt(headers: Headers, name: string): number | null {\n const raw = headers.get(name) ?? headers.get(name.toLowerCase());\n if (raw == null) return null;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function parseCapabilitiesFromHeaders(headers: Headers): HttpServerCapabilities {\n const uploadRaw = headers.get(UPLOAD_URL_HEADER) ?? headers.get(UPLOAD_URL_HEADER.toLowerCase());\n const uploadUrlSupport = uploadRaw === \"true\";\n\n let cacheExpiresAt: number | null = null;\n const cc = headers.get(\"Cache-Control\") ?? headers.get(\"cache-control\");\n if (cc) {\n for (const token of cc.split(\",\")) {\n const t = token.trim().toLowerCase();\n if (t.startsWith(\"max-age=\")) {\n const seconds = Number.parseFloat(t.slice(\"max-age=\".length));\n if (Number.isFinite(seconds)) {\n cacheExpiresAt = Date.now() + seconds * 1000;\n }\n break;\n }\n }\n }\n\n return {\n maxRequestBytes: parseHeaderInt(headers, MAX_REQUEST_BYTES_HEADER),\n uploadUrlSupport,\n maxUploadBytes: parseHeaderInt(headers, MAX_UPLOAD_BYTES_HEADER),\n cacheExpiresAt,\n };\n}\n\nexport async function discoverHttpCapabilities(\n baseUrl: string,\n prefix: string,\n authorization?: string,\n): Promise<HttpServerCapabilities> {\n const headers: Record<string, string> = {};\n if (authorization) headers.Authorization = authorization;\n const resp = await fetch(`${baseUrl}${prefix}/health`, {\n method: \"OPTIONS\",\n headers,\n });\n // Capability headers are advertised on every response; we don't require 200.\n return parseCapabilitiesFromHeaders(resp.headers);\n}\n\nexport function isCapabilitySnapshotFresh(snapshot: HttpServerCapabilities | null): boolean {\n if (!snapshot) return false;\n if (snapshot.cacheExpiresAt == null) return true;\n return Date.now() < snapshot.cacheExpiresAt;\n}\n",
14
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema as ArrowSchema, type RecordBatch, type Schema } from \"@query-farm/apache-arrow\";\nimport { deserializeSchema as deserializeSchemaImpl } from \"#vgi-rpc-arrow\";\nimport { DESCRIBE_METHOD_NAME, PROTOCOL_NAME_KEY, PROTOCOL_VERSION_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { buildRequestIpc, dispatchLogOrError, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Describes a single RPC method as reported by the server's `__describe__` response. */\nexport interface MethodInfo {\n /** The method name as invoked by {@link RpcClient.call} / {@link RpcClient.stream}. */\n name: string;\n /** Whether the method is a single request/response (`unary`) or a streaming method (`stream`). */\n type: \"unary\" | \"stream\";\n /** Arrow schema of the call parameters. */\n paramsSchema: Schema;\n /** Arrow schema of a unary result; for stream methods this holds the per-batch output schema. */\n resultSchema: Schema;\n /** Arrow schema of the per-batch input rows for exchange streams, when available. */\n inputSchema?: Schema;\n /** Arrow schema of the per-batch output rows for stream methods, when available. */\n outputSchema?: Schema;\n /** Arrow schema of the stream's one-time header row, when the method declares one. */\n headerSchema?: Schema;\n /** Human-readable documentation for the method, if the server provides it. */\n doc?: string;\n /** Per-parameter human-readable type names, if the server provides them. */\n paramTypes?: Record<string, string>;\n /** Default values applied to omitted parameters before a call is sent. */\n defaults?: Record<string, any>;\n}\n\n/** The full set of methods and protocol metadata reported by a server's `__describe__`. */\nexport interface ServiceDescription {\n /** The server's declared protocol/service name. */\n protocolName: string;\n /** Application protocol surface version surfaced by the server's\n * __describe__ response. Empty string when the server did not declare\n * a `protocolVersion`. */\n protocolVersion: string;\n /** Every method the server exposes (excluding the built-in `__describe__`). */\n methods: MethodInfo[];\n}\n\n/**\n * Deserialize a schema from IPC bytes (schema message + EOS).\n *\n * Must dispatch via `#vgi-rpc-arrow` so the resulting type instances are\n * the same impl (apache-arrow / flechette) as the rest of the active\n * backend. Using apache-arrow's `RecordBatchReader` directly here used to\n * silently mix impls: in browser builds the backend is flechette, and a\n * flechette builder receiving an apache-arrow `Binary` type defaults to\n * the wrong offsets buffer (Uint8Array instead of Int32Array) and emits\n * a 0-byte value where a populated binary column was expected. The\n * downstream symptom is \"Tried reading schema message, was null or\n * length 0\" from the server when it tries to open the (empty) binary\n * column as a nested IPC stream. See test/client/ipc-cross-impl.test.ts.\n */\nfunction deserializeSchema(bytes: Uint8Array): Schema {\n return deserializeSchemaImpl(bytes) as unknown as Schema;\n}\n\n/**\n * Parse a __describe__ response from batches into a ServiceDescription.\n * Reusable across transports (HTTP, pipe, subprocess).\n */\nexport async function parseDescribeResponse(\n batches: RecordBatch[],\n onLog?: (msg: LogMessage) => void,\n): Promise<ServiceDescription> {\n // Find the data batch (skip log/error batches)\n let dataBatch = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n dataBatch = batch;\n }\n\n if (!dataBatch) {\n throw new Error(\"Empty __describe__ response\");\n }\n\n // Extract metadata from batch\n const meta = dataBatch.metadata;\n const protocolName = meta?.get(PROTOCOL_NAME_KEY) ?? \"\";\n const protocolVersion = meta?.get(PROTOCOL_VERSION_KEY) ?? \"\";\n\n // Slim DESCRIBE_VERSION 4 wire format (see dispatch/describe.ts):\n // 0:name 1:method_type 2:has_return 3:params_schema_ipc\n // 4:result_schema_ipc 5:has_header 6:header_schema_ipc 7:is_exchange\n const methods: MethodInfo[] = [];\n for (let i = 0; i < dataBatch.numRows; i++) {\n const name = dataBatch.getChildAt(0)!.get(i) as string;\n const methodType = dataBatch.getChildAt(1)!.get(i) as string;\n const _hasReturn = dataBatch.getChildAt(2)!.get(i) as boolean;\n const paramsIpc = dataBatch.getChildAt(3)!.get(i) as Uint8Array;\n const resultIpc = dataBatch.getChildAt(4)!.get(i) as Uint8Array;\n const hasHeader = dataBatch.getChildAt(5)!.get(i) as boolean;\n const headerIpc = dataBatch.getChildAt(6)?.get(i) as Uint8Array | null;\n // is_exchange (index 7) currently unused on the client side.\n\n const paramsSchema = await deserializeSchema(paramsIpc);\n const resultSchema = await deserializeSchema(resultIpc);\n\n const info: MethodInfo = {\n name,\n type: methodType as \"unary\" | \"stream\",\n paramsSchema,\n resultSchema,\n };\n\n // For stream methods, result_schema_ipc actually holds the output schema\n if (methodType === \"stream\") {\n info.outputSchema = resultSchema;\n }\n\n if (hasHeader && headerIpc) {\n info.headerSchema = await deserializeSchema(headerIpc);\n }\n\n methods.push(info);\n }\n\n return { protocolName, protocolVersion, methods };\n}\n\n/**\n * Send a __describe__ request and return a ServiceDescription.\n */\nexport async function httpIntrospect(\n baseUrl: string,\n options?: {\n prefix?: string;\n authorization?: string;\n compressionLevel?: number;\n compressFn?: (data: Uint8Array, level: number) => Promise<Uint8Array>;\n decompressFn?: (data: Uint8Array) => Promise<Uint8Array>;\n },\n): Promise<ServiceDescription> {\n const prefix = options?.prefix ?? \"\";\n const emptySchema = new ArrowSchema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n\n const level = options?.compressionLevel;\n const compressFn = options?.compressFn;\n const decompressFn = options?.decompressFn;\n let sendBody: Uint8Array = body;\n if (level != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n sendBody = await compressFn(body, level);\n }\n if (level != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n\n const response = await fetch(`${baseUrl}${prefix}/${DESCRIBE_METHOD_NAME}`, {\n method: \"POST\",\n headers,\n body: sendBody as unknown as BodyInit,\n });\n if (response.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n let responseBody = new Uint8Array(await response.arrayBuffer());\n if (response.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n responseBody = new Uint8Array(await decompressFn(responseBody));\n }\n const { batches } = await readResponseBatches(responseBody);\n\n return parseDescribeResponse(batches);\n}\n",
15
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Float64,\n Int64,\n type RecordBatch,\n RecordBatchReader,\n type Schema,\n Utf8,\n} from \"@query-farm/apache-arrow\";\nimport { emptyBatchWithMetadata, singleRowBatchWithMetadata } from \"#vgi-rpc-arrow\";\nimport {\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n PROTOCOL_VERSION_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n RPC_METHOD_KEY,\n} from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Infer an Arrow DataType from a JS value. */\nexport function inferArrowType(value: any): DataType {\n if (typeof value === \"string\") return new Utf8();\n if (typeof value === \"boolean\") return new Bool();\n if (typeof value === \"bigint\") return new Int64();\n if (typeof value === \"number\") return new Float64();\n if (value instanceof Uint8Array) return new Binary();\n return new Utf8(); // fallback\n}\n\n/**\n * Recursively coerce JS values to match Arrow type expectations.\n * Converts numbers to BigInt for Int64 fields, and recurses into Map/List types.\n */\nfunction coerceForArrow(type: DataType, value: any): any {\n if (value == null) return value;\n\n // Int64: convert number → BigInt\n if (DataType.isInt(type) && (type as any).bitWidth === 64) {\n if (typeof value === \"number\") return BigInt(value);\n return value;\n }\n\n // Map_: coerce map values recursively\n if (DataType.isMap(type)) {\n if (value instanceof Map) {\n const entriesField = (type as any).children[0];\n const valueType = entriesField.type.children[1].type;\n const coerced = new Map();\n for (const [k, v] of value) {\n coerced.set(k, coerceForArrow(valueType, v));\n }\n return coerced;\n }\n return value;\n }\n\n // List: coerce elements recursively\n if (DataType.isList(type)) {\n if (Array.isArray(value)) {\n const elemType = (type as any).children[0].type;\n return value.map((v: any) => coerceForArrow(elemType, v));\n }\n return value;\n }\n\n return value;\n}\n\n/**\n * Build a 1-row Arrow IPC request batch with method metadata.\n *\n * When `options.protocolVersion` is non-empty, the value is emitted as\n * `vgi_rpc.protocol_version` so servers that declare a Protocol-level\n * version validate the request at the dispatch boundary.\n */\nexport function buildRequestIpc(\n schema: Schema,\n params: Record<string, any>,\n method: string,\n options?: { protocolVersion?: string },\n): Uint8Array {\n const metadata = new Map<string, string>();\n metadata.set(RPC_METHOD_KEY, method);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n if (options?.protocolVersion) {\n metadata.set(PROTOCOL_VERSION_KEY, options.protocolVersion);\n }\n\n // Build the batch through the impl-agnostic #vgi-rpc-arrow layer so this\n // works under both backends. `buildRequestIpc` previously constructed an\n // apache-arrow RecordBatch directly and handed it to `serializeIpcStream`,\n // which then dispatched to the backend's `serializeBatches`. Under the\n // browser/worker condition that backend is flechette, and flechette's\n // `tablesToIPC` cannot read apache-arrow's RecordBatch shape — the cross-\n // impl mixing was silently broken (no browser tests cover this path; see\n // test/client/ipc-cross-impl.test.ts). The abstract helpers produce a\n // 0-row metadata-bearing batch for the empty-schema case (which servers\n // accept identically to a 1-row × 0-col batch) and a 1-row batch with\n // coerced field values otherwise.\n if (schema.fields.length === 0) {\n const batch = emptyBatchWithMetadata(schema, metadata);\n return serializeIpcStream(schema, [batch]);\n }\n\n const coerced: Record<string, any> = {};\n for (const f of schema.fields) {\n const raw = params[f.name];\n // Missing values must be sent as null. arrow-js's typed-array builders\n // throw \"Invalid argument type in ToBigInt\" when handed `undefined` for\n // an Int64 column; null builds a proper validity bitmap entry instead.\n coerced[f.name] = raw === undefined ? null : coerceForArrow(f.type, raw);\n }\n const batch = singleRowBatchWithMetadata(schema, coerced, metadata);\n return serializeIpcStream(schema, [batch]);\n}\n\n/**\n * Read schema + all batches from an IPC stream body.\n */\nexport async function readResponseBatches(body: Uint8Array): Promise<{ schema: Schema; batches: RecordBatch[] }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Empty IPC stream: no schema\", \"\");\n }\n const batches = reader.readAll();\n return { schema, batches };\n}\n\n/**\n * Check if a zero-row batch carries log/error metadata.\n * If EXCEPTION → throw RpcError.\n * If other level → call onLog.\n * Returns true if the batch was consumed as a log/error.\n */\nexport function dispatchLogOrError(batch: RecordBatch, onLog?: (msg: LogMessage) => void): boolean {\n const meta = batch.metadata;\n if (!meta) return false;\n\n const level = meta.get(LOG_LEVEL_KEY);\n if (!level) return false;\n\n const message = meta.get(LOG_MESSAGE_KEY) ?? \"\";\n\n if (level === \"EXCEPTION\") {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let errorType = \"RpcError\";\n let errorMessage = message;\n let traceback = \"\";\n if (extraStr) {\n try {\n const extra = JSON.parse(extraStr);\n errorType = extra.exception_type ?? \"RpcError\";\n errorMessage = extra.exception_message ?? message;\n traceback = extra.traceback ?? \"\";\n } catch {}\n }\n throw new RpcError(errorType, errorMessage, traceback);\n }\n\n if (onLog) {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let extra: Record<string, any> | undefined;\n if (extraStr) {\n try {\n extra = JSON.parse(extraStr);\n } catch {}\n }\n onLog({ level, message, extra });\n }\n\n return true;\n}\n\n/**\n * Extract all rows from a batch as Record<string, any>[].\n * Converts BigInt to Number when safe.\n */\nexport function extractBatchRows(batch: RecordBatch): Record<string, any>[] {\n const rows: Record<string, any>[] = [];\n for (let r = 0; r < batch.numRows; r++) {\n const row: Record<string, any> = {};\n for (let i = 0; i < batch.schema.fields.length; i++) {\n const field = batch.schema.fields[i];\n let value = batch.getChildAt(i)?.get(r);\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n row[field.name] = value;\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Read sequential IPC streams from a response body.\n * Returns an IpcStreamReader for reading header + data streams.\n */\nexport async function readSequentialStreams(body: Uint8Array): Promise<IpcStreamReader> {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(body);\n controller.close();\n },\n });\n return IpcStreamReader.create(stream);\n}\n",
16
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\nimport type { VgiBatch, VgiSchema } from \"../arrow/index.js\";\n\nexport interface StreamMessage {\n schema: VgiSchema;\n batches: VgiBatch[];\n}\n\n/**\n * Reads sequential IPC streams from a byte source (e.g., process.stdin).\n * Uses autoDestroy: false + reset/open pattern to read multiple streams\n * from the same underlying byte source.\n */\nexport class IpcStreamReader {\n private reader: RecordBatchReader;\n private initialized = false;\n /** True once readNextBatch() returns null (EOS reached for current stream). */\n private streamEnded = false;\n\n private constructor(reader: RecordBatchReader) {\n this.reader = reader;\n }\n\n static async create(input: ReadableStream<Uint8Array> | NodeJS.ReadableStream): Promise<IpcStreamReader> {\n const reader = await RecordBatchReader.from(input as any);\n await reader.open({ autoDestroy: false });\n if (reader.closed) {\n throw new Error(\"Input stream closed before first IPC message\");\n }\n return new IpcStreamReader(reader);\n }\n\n /**\n * Read one complete IPC stream (schema + all batches).\n * Returns null on EOF (no more streams).\n */\n async readStream(): Promise<StreamMessage | null> {\n if (this.initialized) {\n // Advance to next stream\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n\n const schema = this.reader.schema;\n if (!schema) {\n return null;\n }\n\n const batches: RecordBatch[] = [];\n while (true) {\n const result = await this.reader.next();\n if (result.done) break;\n // Skip Arrow-JS synthetic placeholder for empty streams\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") break;\n batches.push(result.value);\n }\n\n return { schema, batches };\n }\n\n /**\n * Open the next IPC stream and return its schema.\n * Use readNextBatch() to read batches one at a time.\n * Returns null on EOF.\n */\n async openNextStream(): Promise<VgiSchema | null> {\n if (this.initialized) {\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n this.streamEnded = false;\n return this.reader.schema ?? null;\n }\n\n /**\n * Read the next batch from the currently open IPC stream.\n * Returns null when the stream ends (EOS).\n *\n * Once EOS is reached, subsequent calls return null immediately without\n * reading from the underlying byte source. This prevents the Arrow-JS\n * reader from consuming bytes that belong to the next IPC stream.\n */\n async readNextBatch(): Promise<VgiBatch | null> {\n if (this.streamEnded) return null;\n const result = await this.reader.next();\n if (result.done) {\n this.streamEnded = true;\n return null;\n }\n // Arrow-JS synthesizes a placeholder batch for streams with a schema but\n // zero real batches. Treat it as EOS so callers don't block trying to\n // read more bytes from a stream that has already ended.\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") {\n this.streamEnded = true;\n return null;\n }\n return result.value;\n }\n\n async cancel(): Promise<void> {\n await this.reader.cancel();\n }\n}\n",
17
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Field, makeData, RecordBatch, Schema, Struct, vectorFromArray } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { dispatchLogOrError, extractBatchRows, inferArrowType, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Posts an Arrow IPC request body to *url*, transparently handling\n * client-vended request externalization. Provided by the parent connection\n * so a single capability cache can drive both unary and stream call paths.\n */\nexport type PostFn = (url: string, body: Uint8Array) => Promise<Response>;\n\n/**\n * {@link StreamSession} implementation for the HTTP transport. Stream state is\n * carried statelessly across requests via an HMAC state token: each\n * {@link HttpStreamSession.exchange} or producer-continuation POST sends the\n * current token and receives the next one in the response metadata.\n */\nexport class HttpStreamSession implements StreamSession {\n private _baseUrl: string;\n private _prefix: string;\n private _method: string;\n private _stateToken: string | null;\n private _outputSchema: Schema;\n private _inputSchema?: Schema;\n private _onLog?: (msg: LogMessage) => void;\n private _pendingBatches: RecordBatch[];\n private _finished: boolean;\n private _header: Record<string, any> | null;\n private _compressionLevel?: number;\n private _compressFn?: CompressFn;\n private _decompressFn?: DecompressFn;\n private _authorization?: string;\n private _externalConfig?: ExternalLocationConfig;\n private _postFn?: PostFn;\n\n constructor(opts: {\n baseUrl: string;\n prefix: string;\n method: string;\n stateToken: string | null;\n outputSchema: Schema;\n inputSchema?: Schema;\n onLog?: (msg: LogMessage) => void;\n pendingBatches: RecordBatch[];\n finished: boolean;\n header: Record<string, any> | null;\n compressionLevel?: number;\n compressFn?: CompressFn;\n decompressFn?: DecompressFn;\n authorization?: string;\n externalConfig?: ExternalLocationConfig;\n postFn?: PostFn;\n }) {\n this._baseUrl = opts.baseUrl;\n this._prefix = opts.prefix;\n this._method = opts.method;\n this._stateToken = opts.stateToken;\n this._outputSchema = opts.outputSchema;\n this._inputSchema = opts.inputSchema;\n this._onLog = opts.onLog;\n this._pendingBatches = opts.pendingBatches;\n this._finished = opts.finished;\n this._header = opts.header;\n this._compressionLevel = opts.compressionLevel;\n this._compressFn = opts.compressFn;\n this._decompressFn = opts.decompressFn;\n this._authorization = opts.authorization;\n this._externalConfig = opts.externalConfig;\n this._postFn = opts.postFn;\n }\n\n private async _post(url: string, body: Uint8Array): Promise<Response> {\n if (this._postFn) return this._postFn(url, body);\n return fetch(url, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: (await this._prepareBody(body)) as unknown as BodyInit,\n });\n }\n\n /** The stream's one-time header row, or `null` if the method declares no header. */\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n private _buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (this._compressionLevel != null && this._compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (this._compressionLevel != null && this._decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (this._authorization) {\n headers.Authorization = this._authorization;\n }\n return headers;\n }\n\n private async _prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (this._compressionLevel != null && this._compressFn) {\n return await this._compressFn(content, this._compressionLevel);\n }\n return content;\n }\n\n private async _readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && this._decompressFn) {\n body = new Uint8Array(await this._decompressFn(body));\n }\n return body;\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._stateToken === null) {\n throw new RpcError(\"ProtocolError\", \"Stream has finished \\u2014 no state token available\", \"\");\n }\n\n // We need to determine the input schema from the data.\n // Build a batch from the input rows using the output schema's field types.\n // For exchange, the input schema matches what the server expects.\n // We'll use the keys from input[0] to figure out columns.\n if (input.length === 0) {\n // Zero-row exchange: build an empty batch with state token.\n // Use inputSchema from __describe__ if available; fall back to\n // outputSchema so the server sees the correct column names.\n const zeroSchema = this._inputSchema ?? this._outputSchema;\n const emptyBatch = this._buildEmptyBatch(zeroSchema);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batchWithMeta = new RecordBatch(zeroSchema, emptyBatch.data, metadata);\n return this._doExchange(zeroSchema, [batchWithMeta]);\n }\n\n // Infer schema from first row values (input schema may differ from output).\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n // Find first non-null value to infer type\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n const nullable = input.some((row) => row[key] == null);\n return new Field(key, arrowType, nullable);\n });\n\n const inputSchema = new Schema(fields);\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batch = new RecordBatch(inputSchema, data, metadata);\n\n return this._doExchange(inputSchema, [batch]);\n }\n\n private async _doExchange(schema: Schema, batches: RecordBatch[]): Promise<Record<string, any>[]> {\n const body = serializeIpcStream(schema, batches);\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n const responseBody = await this._readResponse(resp);\n const { batches: responseBatches } = await readResponseBatches(responseBody);\n\n let resultRows: Record<string, any>[] = [];\n for (const batch of responseBatches) {\n if (batch.numRows === 0) {\n // Could be log/error or state token\n dispatchLogOrError(batch, this._onLog);\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n continue;\n }\n\n // Data batch — extract state token from metadata\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n\n resultRows = extractBatchRows(batch);\n }\n\n return resultRows;\n }\n\n private _buildEmptyBatch(schema: Schema): RecordBatch {\n const children = schema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n return new RecordBatch(schema, data);\n }\n\n /**\n * Iterate over producer stream batches.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n // Yield pre-loaded batches from init\n for (let batch of this._pendingBatches) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n yield extractBatchRows(batch);\n }\n this._pendingBatches = [];\n\n if (this._finished) return;\n if (this._stateToken === null) return;\n\n // Follow continuation tokens\n while (true) {\n const stateToken = this._stateToken;\n if (stateToken === null) return;\n const responseBody = await this._sendContinuation(stateToken);\n const { batches } = await readResponseBatches(responseBody);\n\n let gotContinuation = false;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for continuation token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n gotContinuation = true;\n continue;\n }\n // Check for external location pointer\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n // Log/error batch\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n\n yield extractBatchRows(batch);\n }\n\n if (!gotContinuation) break;\n }\n }\n\n private async _sendContinuation(token: string): Promise<Uint8Array> {\n const emptySchema = new Schema([]);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, token);\n\n const structType = new Struct(emptySchema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(emptySchema, data, metadata);\n const body = serializeIpcStream(emptySchema, [batch]);\n\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n return this._readResponse(resp);\n }\n\n /** No-op: the HTTP transport is stateless, so there is nothing to tear down. */\n close(): void {\n // No-op for HTTP (stateless)\n }\n}\n",
18
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Client-side request-body externalization.\n *\n * When a request body would exceed the server-advertised `maxRequestBytes`,\n * we (1) call `{prefix}/__upload_url__/init` to get a pre-signed upload URL,\n * (2) PUT the body to that URL, and (3) replace the inline body with a\n * zero-row \"pointer\" IPC stream that carries the original RPC dispatch\n * metadata plus `vgi_rpc.location: <download-url>`. The server then resolves\n * the pointer and dispatches normally.\n *\n * Mirrors Python's `_externalize_via_upload_url()` and `request_upload_urls()`.\n */\n\nimport { Field, Int64, RecordBatchReader, Schema } from \"@query-farm/apache-arrow\";\nimport { REQUEST_VERSION, REQUEST_VERSION_KEY, RPC_METHOD_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { makeExternalLocationBatch } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { buildRequestIpc } from \"./ipc.js\";\n\nconst UPLOAD_URL_METHOD = \"__upload_url__\";\nconst UPLOAD_URL_PARAMS_SCHEMA = new Schema([new Field(\"count\", new Int64(), false)]);\n\nexport interface UploadUrlPair {\n uploadUrl: string;\n downloadUrl: string;\n expiresAt: Date;\n}\n\n/**\n * POST `__upload_url__/init` and return the requested number of pre-signed\n * URL pairs. Server must have an `uploadUrlProvider` configured; otherwise\n * the route returns 404 and we surface that as `RpcError(\"NotSupported\")`.\n */\nexport async function requestUploadUrls(\n baseUrl: string,\n prefix: string,\n count: number,\n authorization?: string,\n): Promise<UploadUrlPair[]> {\n const body = buildRequestIpc(UPLOAD_URL_PARAMS_SCHEMA, { count: BigInt(count) }, UPLOAD_URL_METHOD);\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (authorization) headers.Authorization = authorization;\n\n const resp = await fetch(`${baseUrl}${prefix}/${UPLOAD_URL_METHOD}/init`, {\n method: \"POST\",\n headers,\n body: body as unknown as BodyInit,\n });\n if (resp.status === 404) {\n throw new RpcError(\"NotSupported\", \"Server does not support upload URLs\", \"\");\n }\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n if (!resp.ok) {\n throw new RpcError(\"HttpError\", `__upload_url__/init failed: HTTP ${resp.status}`, \"\");\n }\n\n const respBody = new Uint8Array(await resp.arrayBuffer());\n const reader = await RecordBatchReader.from(respBody);\n await reader.open();\n\n const pairs: UploadUrlPair[] = [];\n for (const batch of reader.readAll()) {\n if (batch.numRows === 0) continue;\n for (let r = 0; r < batch.numRows; r++) {\n const uploadUrl = batch.getChildAt(0)?.get(r) as string;\n const downloadUrl = batch.getChildAt(1)?.get(r) as string;\n const expiresRaw = batch.getChildAt(2)?.get(r);\n // Timestamp(us) either a Date, a number (ms), or a bigint (us)\n let expiresAt: Date;\n if (expiresRaw instanceof Date) {\n expiresAt = expiresRaw;\n } else if (typeof expiresRaw === \"bigint\") {\n expiresAt = new Date(Number(expiresRaw / 1000n));\n } else if (typeof expiresRaw === \"number\") {\n expiresAt = new Date(expiresRaw);\n } else {\n expiresAt = new Date();\n }\n pairs.push({ uploadUrl, downloadUrl, expiresAt });\n }\n }\n\n if (pairs.length === 0) {\n throw new RpcError(\"ProtocolError\", \"Server returned no upload URLs\", \"\");\n }\n return pairs;\n}\n\n/**\n * Build the externalized pointer body to send in place of *originalBody*.\n *\n * The pointer is a zero-row IPC stream whose first batch carries:\n * - same schema as the original request batch\n * - merged custom_metadata: original RPC dispatch keys + `vgi_rpc.location`\n *\n * The server's request reader honours the dispatch keys for routing, then\n * resolves the pointer to fetch the inline batch for parameter extraction.\n */\nasync function buildPointerRequestBody(originalBody: Uint8Array, downloadUrl: string): Promise<Uint8Array> {\n const reader = await RecordBatchReader.from(originalBody);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Original request body has no schema\", \"\");\n }\n const batches = reader.readAll();\n if (batches.length === 0) {\n throw new RpcError(\"ProtocolError\", \"Original request body has no batches\", \"\");\n }\n const original = batches[0];\n const originalMeta = original.metadata ?? new Map<string, string>();\n\n const pointer = makeExternalLocationBatch(schema, downloadUrl);\n const merged = new Map<string, string>(pointer.metadata ?? new Map());\n // Preserve the original RPC dispatch metadata so the server can route.\n const method = originalMeta.get(RPC_METHOD_KEY);\n const version = originalMeta.get(REQUEST_VERSION_KEY) ?? REQUEST_VERSION;\n if (method) merged.set(RPC_METHOD_KEY, method);\n merged.set(REQUEST_VERSION_KEY, version);\n // Carry over any other keys (request id, state token for exchange, etc).\n for (const [k, v] of originalMeta) {\n if (!merged.has(k)) merged.set(k, v);\n }\n\n // Re-emit the pointer batch with merged metadata.\n const { RecordBatch } = await import(\"@query-farm/apache-arrow\");\n const pointerWithMeta = new RecordBatch(schema as any, (pointer as any).data, merged);\n return serializeIpcStream(schema, [pointerWithMeta]);\n}\n\nexport interface ExternalizeOptions {\n baseUrl: string;\n prefix: string;\n authorization?: string;\n /** Optional per-URL validator; throw to reject. */\n urlValidator?: ((url: string) => void) | null;\n}\n\n/**\n * Upload *body* via a server-vended URL and return the pointer-batch body\n * that should be sent in place of the original. Throws if the server does\n * not advertise upload-URL support or the upload fails.\n */\nexport async function externalizeRequestBody(body: Uint8Array, opts: ExternalizeOptions): Promise<Uint8Array> {\n const pairs = await requestUploadUrls(opts.baseUrl, opts.prefix, 1, opts.authorization);\n const pair = pairs[0];\n\n if (opts.urlValidator) {\n opts.urlValidator(pair.uploadUrl);\n opts.urlValidator(pair.downloadUrl);\n }\n\n const putResp = await fetch(pair.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": ARROW_CONTENT_TYPE },\n body: body as unknown as BodyInit,\n });\n if (!putResp.ok) {\n throw new RpcError(\"ExternalUploadFailed\", `PUT to upload URL failed: HTTP ${putResp.status}`, \"\");\n }\n\n return buildPointerRequestBody(body, pair.downloadUrl);\n}\n",
19
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RecordBatch, Schema } from \"@query-farm/apache-arrow\";\nimport { LOG_LEVEL_KEY, STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport {\n type HttpServerCapabilities,\n isCapabilitySnapshotFresh,\n parseCapabilitiesFromHeaders,\n} from \"./capabilities.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport {\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n readResponseBatches,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, StreamSession } from \"./types.js\";\nimport { externalizeRequestBody } from \"./uploadUrl.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\n/** A connected RPC client, returned by {@link httpConnect}, {@link pipeConnect}, and {@link subprocessConnect}. */\nexport interface RpcClient {\n /** Invoke a unary method. Returns the single result row, or `null` for void methods. Parameter defaults from `__describe__` are applied automatically. */\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n /** Open a streaming method, returning a {@link StreamSession} for exchange or producer iteration. */\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n /** Fetch the server's method/protocol description (cached after the first call). */\n describe(): Promise<ServiceDescription>;\n /** Release transport resources; for subprocess clients this also terminates the child process. */\n close(): void;\n}\n\n/**\n * Connect to a vgi-rpc server over HTTP. The returned client lazily introspects\n * the server (caching `__describe__`) on the first call and transparently handles\n * zstd compression, authorization, and 413 request externalization.\n */\nexport function httpConnect(baseUrl: string, options?: HttpConnectOptions): RpcClient {\n const prefix = (options?.prefix ?? \"\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n const authorization = options?.authorization;\n const externalConfig = options?.externalLocation;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n /** Application protocol surface version discovered via __describe__. When\n * non-empty, the client emits it on every request as\n * `vgi_rpc.protocol_version` so a versioned server can validate at the\n * dispatch boundary. */\n let serverProtocolVersion = \"\";\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n let capabilities: HttpServerCapabilities | null = null;\n\n function updateCapabilitiesFromResponse(resp: Response): void {\n const next = parseCapabilitiesFromHeaders(resp.headers);\n // Only treat the snapshot as authoritative when the server actually\n // emitted capability hints. Otherwise leave any prior cache in place.\n if (next.maxRequestBytes != null || next.uploadUrlSupport) {\n capabilities = next;\n }\n }\n\n async function maybeExternalize(body: Uint8Array): Promise<Uint8Array> {\n const caps = isCapabilitySnapshotFresh(capabilities) ? capabilities : null;\n if (!caps) return body;\n if (!caps.uploadUrlSupport) return body;\n if (caps.maxRequestBytes == null || body.byteLength <= caps.maxRequestBytes) return body;\n return externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n }\n\n /**\n * Send a POST request, transparently retrying with externalization if\n * the server returns 413 (Payload Too Large) and advertises upload-URL\n * support. Mirrors Python's 413 fallback in `_HttpProxy._post_with_externalization`.\n */\n async function postWithExternalization(url: string, body: Uint8Array): Promise<Response> {\n const sendBody = await maybeExternalize(body);\n let resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(sendBody)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n\n if (resp.status === 413 && capabilities?.uploadUrlSupport && body.byteLength > 0) {\n // Refresh-and-retry: caps tell us we can externalize.\n const externalized = await externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(externalized)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n }\n\n return resp;\n }\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n compressionLoaded = true;\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (compressionLevel != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (authorization) {\n headers.Authorization = authorization;\n }\n return headers;\n }\n\n async function prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (compressionLevel != null && compressFn) {\n return await compressFn(content, compressionLevel);\n }\n return content;\n }\n\n function checkAuth(resp: Response): void {\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(await decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n await ensureCompression();\n const desc = await httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n serverProtocolVersion = desc.protocolVersion;\n return methodCache;\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n batch = (await resolveExternalLocation(batch as any, externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}/init`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema as any;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches as any[]) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null) ??\n (pendingBatches.length > 0 ? pendingBatches[0].schema : null) ??\n info.outputSchema ??\n info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n authorization,\n externalConfig,\n postFn: postWithExternalization,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n await ensureCompression();\n return httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
20
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** RFC 9728 OAuth Protected Resource Metadata (client-side response). */\nexport interface OAuthResourceMetadataResponse {\n /** The protected resource's canonical URL (`resource`). */\n resource: string;\n /** Authorization-server issuer URLs; the first is used for OIDC discovery (`authorization_servers`). */\n authorizationServers: string[];\n /** Scopes the resource advertises (`scopes_supported`). */\n scopesSupported?: string[];\n /** Advertised bearer methods, e.g. `[\"header\"]` (`bearer_methods_supported`). */\n bearerMethodsSupported?: string[];\n /** JWS algorithms the resource accepts (`resource_signing_alg_values_supported`). */\n resourceSigningAlgValuesSupported?: string[];\n /** Human-readable resource name (`resource_name`). */\n resourceName?: string;\n /** Documentation URL for the resource (`resource_documentation`). */\n resourceDocumentation?: string;\n /** Policy URL for the resource (`resource_policy_uri`). */\n resourcePolicyUri?: string;\n /** Terms-of-service URL for the resource (`resource_tos_uri`). */\n resourceTosUri?: string;\n /** OAuth client_id advertised by the server. */\n clientId?: string;\n /** OAuth client_secret advertised by the server. */\n clientSecret?: string;\n /** When true, use the OIDC id_token as the Bearer token instead of access_token. */\n useIdTokenAsBearer?: boolean;\n /** OAuth client_id for device code flow. */\n deviceCodeClientId?: string;\n /** OAuth client_secret for device code flow. */\n deviceCodeClientSecret?: string;\n}\n\nfunction parseMetadataJson(json: Record<string, any>): OAuthResourceMetadataResponse {\n const result: OAuthResourceMetadataResponse = {\n resource: json.resource,\n authorizationServers: json.authorization_servers,\n };\n if (json.scopes_supported) result.scopesSupported = json.scopes_supported;\n if (json.bearer_methods_supported) result.bearerMethodsSupported = json.bearer_methods_supported;\n if (json.resource_signing_alg_values_supported)\n result.resourceSigningAlgValuesSupported = json.resource_signing_alg_values_supported;\n if (json.resource_name) result.resourceName = json.resource_name;\n if (json.resource_documentation) result.resourceDocumentation = json.resource_documentation;\n if (json.resource_policy_uri) result.resourcePolicyUri = json.resource_policy_uri;\n if (json.resource_tos_uri) result.resourceTosUri = json.resource_tos_uri;\n if (json.client_id) result.clientId = json.client_id;\n if (json.client_secret) result.clientSecret = json.client_secret;\n if (json.use_id_token_as_bearer) result.useIdTokenAsBearer = json.use_id_token_as_bearer;\n if (json.device_code_client_id) result.deviceCodeClientId = json.device_code_client_id;\n if (json.device_code_client_secret) result.deviceCodeClientSecret = json.device_code_client_secret;\n return result;\n}\n\n/**\n * Discover OAuth Protected Resource Metadata (RFC 9728) from a vgi-rpc server.\n * Returns `null` if the server does not serve the well-known endpoint.\n */\nexport async function httpOAuthMetadata(\n baseUrl: string,\n prefix?: string,\n): Promise<OAuthResourceMetadataResponse | null> {\n const effectivePrefix = (prefix ?? \"\").replace(/\\/+$/, \"\");\n const metadataUrl = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-protected-resource${effectivePrefix}`;\n\n try {\n return await fetchOAuthMetadata(metadataUrl);\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch OAuth Protected Resource Metadata from an explicit metadata URL.\n */\nexport async function fetchOAuthMetadata(metadataUrl: string): Promise<OAuthResourceMetadataResponse> {\n const response = await fetch(metadataUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${metadataUrl}: ${response.status}`);\n }\n const json = await response.json();\n return parseMetadataJson(json);\n}\n\n/**\n * Extract the `resource_metadata` URL from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no resource_metadata parameter is found.\n */\nexport function parseResourceMetadataUrl(wwwAuthenticate: string): string | null {\n // Parse Bearer challenge parameters per RFC 6750\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const metadataMatch = params.match(/resource_metadata=\"([^\"]+)\"/);\n if (!metadataMatch) return null;\n\n return metadataMatch[1];\n}\n\n/**\n * Extract the `client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_id parameter is found.\n */\nexport function parseClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const clientIdMatch = params.match(/client_id=\"([^\"]+)\"/);\n if (!clientIdMatch) return null;\n\n return clientIdMatch[1];\n}\n\n/**\n * Extract the `client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_secret parameter is found.\n */\nexport function parseClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `use_id_token_as_bearer` flag from a WWW-Authenticate Bearer challenge.\n * Returns `true` if the parameter is present and set to \"true\", `false` otherwise.\n */\nexport function parseUseIdTokenAsBearer(wwwAuthenticate: string): boolean {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return false;\n\n const params = bearerMatch[1];\n const match = params.match(/use_id_token_as_bearer=\"([^\"]+)\"/);\n if (!match) return false;\n\n return match[1] === \"true\";\n}\n\n/**\n * Extract the `device_code_client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_id parameter is found.\n */\nexport function parseDeviceCodeClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_id=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `device_code_client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_secret parameter is found.\n */\nexport function parseDeviceCodeClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n",
21
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Field,\n makeData,\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { type MethodInfo, parseDescribeResponse, type ServiceDescription } from \"./introspect.js\";\nimport { buildRequestIpc, dispatchLogOrError, extractBatchRows, inferArrowType } from \"./ipc.js\";\nimport type { LogMessage, PipeConnectOptions, StreamSession, SubprocessConnectOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\n/**\n * {@link StreamSession} implementation for the pipe/subprocess transport.\n * Drives lockstep streaming over a single bidirectional pipe: each\n * {@link PipeStreamSession.exchange} or iteration step writes one input batch\n * and reads one output batch. Holds the connection's single-threaded busy lock\n * until closed.\n */\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n private _externalConfig?: ExternalLocationConfig;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n externalConfig?: ExternalLocationConfig;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n this._externalConfig = opts.externalConfig;\n }\n\n /** The stream's one-time header row, or `null` if the method declares no header. */\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n return (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n }\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch as any, this._onLog)) {\n continue;\n }\n }\n\n return batch as any;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n /**\n * End the stream: close the input side (or send an empty stream if nothing\n * was sent yet) and drain the server's remaining output in the background,\n * releasing the connection's busy lock once the drain completes.\n */\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\n/**\n * Connect to a vgi-rpc server over a raw bidirectional pipe (a readable stream\n * of server output plus a writable for client input). The connection is\n * single-threaded: only one call or stream may be in flight at a time. The\n * `__describe__` handshake is sent before the reader is opened to avoid deadlock.\n */\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n const externalConfig = options?.externalLocation;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let serverProtocolVersion = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches as any, onLog);\n protocolName = desc.protocolName;\n serverProtocolVersion = desc.protocolVersion;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of response.batches as any[]) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, externalConfig);\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n externalConfig,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n protocolVersion: serverProtocolVersion,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\n/**\n * Spawn a server process (via `Bun.spawn`) and connect to it over its\n * stdin/stdout using {@link pipeConnect}. The returned client's\n * {@link RpcClient.close} also kills the subprocess.\n */\nexport function subprocessConnect(cmd: string[], options?: SubprocessConnectOptions): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n externalLocation: options?.externalLocation,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n"
40
22
  ],
41
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAUA;AAKO,SAAS,YAAY,CAAC,MAAkB,OAAwC;AAAA,EACrF,IAAI,OAAO;AAAA,IACT,OAAO,IAAI,WAAW,IAAI,iBAAiB,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EAC7D;AAAA,EACA,MAAM,KAAmB;AAAA,EACzB,IAAI,OAAO,OAAO,YAAY;AAAA,IAC5B,MAAM,IAAI,MAAM,4CAA4C,mDAAmD;AAAA,EACjH;AAAA,EACA,OAAO,IAAI,WACT,GAAG,MAAM;AAAA,IACP,QAAQ;AAAA,OACC,eAAkB,0BAA0B;AAAA,IACrD;AAAA,EACF,CAAC,CACH;AAAA;AAIK,SAAS,cAAc,CAAC,MAA2C;AAAA,EACxE,IAAI,OAAO;AAAA,IACT,OAAO,IAAI,WAAW,IAAI,mBAAmB,IAAI,CAAC;AAAA,EACpD;AAAA,EACA,MAAM,KAAmB;AAAA,EACzB,IAAI,OAAO,OAAO,YAAY;AAAA,IAC5B,MAAM,IAAI,MAAM,4CAA4C,mDAAmD;AAAA,EACjH;AAAA,EACA,OAAO,IAAI,WAAW,GAAG,IAAI,CAAC;AAAA;AAAA,IA7B1B;AAAA;AAAA,UAAQ,OAAO,WAAW,QAAQ;AAAA;;;ACRjC,MAAM,iBAAiB,MAAM;AAAA,EAEhB;AAAA,EACA;AAAA,EACA;AAAA,EAHlB,WAAW,CACO,WACA,cACA,iBAChB;AAAA,IACA,MAAM,GAAG,cAAc,cAAc;AAAA,IAJrB;AAAA,IACA;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AAAA;AAGO,MAAM,qBAAqB,MAAM;AAAA,EACtC,WAAW,CAAC,SAAiB;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA;AAEhB;;;ACfO,MAAM,YAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CAAC,QAAgB,eAAwB,WAA0B,SAA8B,CAAC,GAAG;AAAA,IAC9G,KAAK,SAAS;AAAA,IACd,KAAK,gBAAgB;AAAA,IACrB,KAAK,YAAY;AAAA,IACjB,KAAK,SAAS;AAAA;AAAA,SAIT,SAAS,GAAgB;AAAA,IAC9B,OAAO,IAAI,YAAY,IAAI,OAAO,IAAI;AAAA;AAAA,EAIxC,oBAAoB,GAAS;AAAA,IAC3B,IAAI,CAAC,KAAK,eAAe;AAAA,MACvB,MAAM,IAAI,SAAS,uBAAuB,2BAA2B,EAAE;AAAA,IACzE;AAAA;AAEJ;;ACzBO,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AAExB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAEvB,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,mBAAmB;AAEzB,IAAM,uBAAuB;AAE7B,IAAM,YAAY;AAElB,IAAM,eAAe;AACrB,IAAM,sBAAsB;;;ACZnC;AAEA;;;ACXA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,SAAS,WAAW,CAAC,QAAgB,QAAkD;AAAA,EAC5F,MAAM,SAA8B,KAAK,OAAO;AAAA,EAChD,WAAW,SAAS,OAAO,QAAQ;AAAA,IACjC,MAAM,MAAM,OAAO,MAAM;AAAA,IACzB,IAAI,QAAQ;AAAA,MAAW;AAAA,IACvB,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,KAAM,MAAM,KAAa,aAAa;AAAA,MAAI;AAAA,IAExE,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,MACtB,OAAO,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAY,OAAO,MAAM,WAAW,OAAO,CAAC,IAAI,CAAE;AAAA,IAClF,EAAO,SAAI,OAAO,QAAQ,UAAU;AAAA,MAClC,OAAO,MAAM,QAAQ,OAAO,GAAG;AAAA,IACjC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAOF,SAAS,gBAAgB,CAC9B,QACA,QACA,UACA,WACa;AAAA,EACb,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,eAAe,QAAQ;AAAA,EACpC,IAAI,cAAc,MAAM;AAAA,IACtB,SAAS,IAAI,gBAAgB,SAAS;AAAA,EACxC;AAAA,EAEA,IAAI,OAAO,OAAO,WAAW,GAAG;AAAA,IAC9B,OAAO,gBAAgB,QAAQ,QAAQ;AAAA,EACzC;AAAA,EAGA,WAAW,SAAS,OAAO,QAAQ;AAAA,IACjC,IAAI,OAAO,MAAM,UAAU,aAAa,CAAC,MAAM,UAAU;AAAA,MACvD,MAAM,MAAM,OAAO,KAAK,MAAM;AAAA,MAC9B,MAAM,IAAI,UAAU,0CAA0C,MAAM,qBAAqB,IAAI,KAAK,IAAI,IAAI;AAAA,IAC5G;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAY,QAAQ,MAAM;AAAA,EAE1C,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAa;AAAA,IAC/C,MAAM,MAAM,QAAQ,EAAE;AAAA,IAEtB,IAAI,eAAe,MAAM;AAAA,MACvB,OAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAM,gBAAgB,CAAC,GAAG,GAAG,EAAE,IAAI;AAAA,IACzC,OAAO,IAAI,KAAK;AAAA,GACjB;AAAA,EAED,MAAM,aAAa,IAAI,OAAO,OAAO,MAAM;AAAA,EAC3C,MAAM,OAAO,SAAS;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,IAAI,YAAY,QAAQ,MAAM,QAAQ;AAAA;AAMxC,SAAS,eAAe,CAAC,QAAgB,OAAc,UAAkB,WAAuC;AAAA,EACrH,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,eAAe,WAAW;AAAA,EACvC,SAAS,IAAI,iBAAiB,GAAG,MAAM,YAAY,SAAS,MAAM,SAAS;AAAA,EAE3E,MAAM,QAA6B;AAAA,IACjC,gBAAgB,MAAM,YAAY;AAAA,IAClC,mBAAmB,MAAM;AAAA,IACzB,WAAW,MAAM,SAAS;AAAA,EAC5B;AAAA,EACA,SAAS,IAAI,eAAe,KAAK,UAAU,KAAK,CAAC;AAAA,EACjD,SAAS,IAAI,eAAe,QAAQ;AAAA,EACpC,IAAI,cAAc,MAAM;AAAA,IACtB,SAAS,IAAI,gBAAgB,SAAS;AAAA,EACxC;AAAA,EAEA,OAAO,gBAAgB,QAAQ,QAAQ;AAAA;AAMlC,SAAS,aAAa,CAC3B,QACA,OACA,SACA,OACA,UACA,WACa;AAAA,EACb,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,eAAe,KAAK;AAAA,EACjC,SAAS,IAAI,iBAAiB,OAAO;AAAA,EACrC,IAAI,OAAO;AAAA,IACT,SAAS,IAAI,eAAe,KAAK,UAAU,KAAK,CAAC;AAAA,EACnD;AAAA,EACA,IAAI,YAAY,MAAM;AAAA,IACpB,SAAS,IAAI,eAAe,QAAQ;AAAA,EACtC;AAAA,EACA,IAAI,aAAa,MAAM;AAAA,IACrB,SAAS,IAAI,gBAAgB,SAAS;AAAA,EACxC;AAAA,EAEA,OAAO,gBAAgB,QAAQ,QAAQ;AAAA;AAOzC,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC3C,IAAI,SAAS,SAAS,IAAI,GAAG;AAAA,IAC3B,MAAM,WAAW,KAAK,SAAS,IAAI,CAAC,MAAa,cAAc,EAAE,IAAI,CAAC;AAAA,IACtE,OAAO,SAAS,EAAE,MAAM,QAAQ,GAAG,UAAU,WAAW,EAAE,CAAC;AAAA,EAC7D;AAAA,EACA,IAAI,SAAS,OAAO,IAAI,GAAG;AAAA,IACzB,MAAM,YAAY,cAAc,KAAK,SAAS,GAAG,IAAI;AAAA,IACrD,OAAO,SAAS,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,GAAG,WAAW,GAAG,cAAc,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAQ;AAAA,EACpH;AAAA,EACA,IAAI,SAAS,gBAAgB,IAAI,GAAG;AAAA,IAClC,MAAM,YAAY,cAAc,KAAK,SAAS,GAAG,IAAI;AAAA,IACrD,OAAO,SAAS,EAAE,MAAM,QAAQ,GAAG,OAAO,WAAW,WAAW,EAAE,CAAQ;AAAA,EAC5E;AAAA,EACA,IAAI,SAAS,MAAM,IAAI,GAAG;AAAA,IACxB,MAAM,YAAY,KAAK,SAAS,IAAI;AAAA,IACpC,MAAM,YAAY,YACd,cAAc,SAAS,IACvB,SAAS,EAAE,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,QAAQ,GAAG,UAAU,CAAC,GAAG,WAAW,EAAE,CAAC;AAAA,IAC5E,OAAO,SAAS,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,GAAG,WAAW,GAAG,cAAc,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAQ;AAAA,EACpH;AAAA,EACA,OAAO,SAAS,EAAE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAAA;AAO5C,SAAS,eAAe,CAAC,QAAgB,UAA6C;AAAA,EAC3F,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAa,cAAc,EAAE,IAAI,CAAC;AAAA,EAEtE,MAAM,aAAa,IAAI,OAAO,OAAO,MAAM;AAAA,EAC3C,MAAM,OAAO,SAAS;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EAED,OAAO,IAAI,YAAY,QAAQ,MAAM,QAAQ;AAAA;;;AD1I/C,IAAM,oBAAoB;AAOnB,SAAS,kBAAkB,CAAC,KAAmB;AAAA,EACpD,MAAM,SAAS,IAAI,IAAI,GAAG;AAAA,EAC1B,IAAI,OAAO,aAAa,UAAU;AAAA,IAChC,MAAM,IAAI,MAAM,8CAA8C,OAAO,WAAW;AAAA,EAClF;AAAA;AAOF,eAAe,SAAS,CAAC,MAAmC;AAAA,EAE1D,MAAM,MAAM,IAAI,YAAY,KAAK,UAAU;AAAA,EAC3C,IAAI,WAAW,GAAG,EAAE,IAAI,IAAI;AAAA,EAC5B,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,GAAG;AAAA,EACtD,OAAO,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AAAA;AAQL,SAAS,uBAAuB,CAAC,OAA6B;AAAA,EACnE,IAAI,MAAM,YAAY;AAAA,IAAG,OAAO;AAAA,EAChC,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,OAAO,KAAK,IAAI,YAAY,KAAK,CAAC,KAAK,IAAI,aAAa;AAAA;AAQnD,SAAS,yBAAyB,CAAC,QAAgB,KAAa,QAA8B;AAAA,EACnG,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,cAAc,GAAG;AAAA,EAC9B,IAAI,QAAQ;AAAA,IACV,SAAS,IAAI,qBAAqB,MAAM;AAAA,EAC1C;AAAA,EACA,OAAO,gBAAgB,QAAQ,QAAQ;AAAA;AAOzC,SAAS,mBAAmB,CAAC,OAAgC;AAAA,EAC3D,MAAM,SAAS,IAAI;AAAA,EACnB,OAAO,MAAM,WAAW,MAAM,MAAM;AAAA,EACpC,OAAO,MAAM,KAAK;AAAA,EAClB,OAAO,MAAM;AAAA,EACb,OAAO,OAAO,aAAa,IAAI;AAAA;AAGjC,SAAS,aAAa,CAAC,OAA4B;AAAA,EAGjD,MAAM,SAAS,IAAI;AAAA,EACnB,OAAO,MAAM,WAAW,MAAM,MAAM;AAAA,EACpC,OAAO,MAAM,KAAK;AAAA,EAClB,OAAO,MAAM;AAAA,EACb,OAAO,OAAO,aAAa,IAAI,EAAE;AAAA;AAWnC,eAAsB,qBAAqB,CACzC,OACA,QACsB;AAAA,EACtB,IAAI,CAAC,QAAQ;AAAA,IAAS,OAAO;AAAA,EAC7B,IAAI,MAAM,YAAY;AAAA,IAAG,OAAO;AAAA,EAEhC,MAAM,YAAY,OAAO,6BAA6B;AAAA,EACtD,IAAI,cAAc,KAAK,IAAI;AAAA,IAAW,OAAO;AAAA,EAG7C,IAAI,UAAU,oBAAoB,KAAK;AAAA,EAGvC,MAAM,WAAW,MAAM,UAAU,OAAO;AAAA,EAGxC,IAAI,kBAAkB;AAAA,EACtB,IAAI,OAAO,aAAa,cAAc,QAAQ;AAAA,IAC5C,UAAU,aAAa,SAAS,OAAO,YAAY,SAAS,CAAC;AAAA,IAC7D,kBAAkB;AAAA,EACpB;AAAA,EAGA,MAAM,MAAM,MAAM,OAAO,QAAQ,OAAO,SAAS,eAAe;AAAA,EAGhE,OAAO,0BAA0B,MAAM,QAAQ,KAAK,QAAQ;AAAA;AAW9D,eAAsB,uBAAuB,CAC3C,OACA,QACsB;AAAA,EACtB,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EACpB,IAAI,CAAC,wBAAwB,KAAK;AAAA,IAAG,OAAO;AAAA,EAE5C,MAAM,MAAM,MAAM,UAAU,IAAI,YAAY;AAAA,EAC5C,IAAI,CAAC;AAAA,IAAK,OAAO;AAAA,EAGjB,MAAM,YAAY,OAAO,iBAAiB,OAAO,YAAa,OAAO,gBAAgB;AAAA,EACrF,IAAI,WAAW;AAAA,IACb,UAAU,GAAG;AAAA,EACf;AAAA,EAGA,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,EAChC,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,IAAI,MAAM,mCAAmC,SAAS,UAAU,SAAS,oBAAoB,MAAM;AAAA,EAC3G;AAAA,EACA,IAAI,OAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,EAGtD,MAAM,kBAAkB,SAAS,QAAQ,IAAI,kBAAkB;AAAA,EAC/D,IAAI,oBAAoB,QAAQ;AAAA,IAC9B,OAAO,IAAI,WAAW,eAAe,IAAI,CAAC;AAAA,EAC5C;AAAA,EAGA,MAAM,iBAAiB,MAAM,UAAU,IAAI,mBAAmB;AAAA,EAC9D,IAAI,gBAAgB;AAAA,IAClB,MAAM,eAAe,MAAM,UAAU,IAAI;AAAA,IACzC,IAAI,iBAAiB,gBAAgB;AAAA,MACnC,MAAM,IAAI,MAAM,iCAAiC,iBAAiB,uBAAuB,cAAc;AAAA,IACzG;AAAA,EACF;AAAA,EAGA,MAAM,SAAS,MAAM,kBAAkB,KAAK,IAAI;AAAA,EAChD,MAAM,OAAO,KAAK;AAAA,EAClB,MAAM,WAAW,OAAO,KAAK;AAAA,EAC7B,IAAI,CAAC,YAAY,SAAS,QAAQ,CAAC,SAAS,OAAO;AAAA,IACjD,MAAM,IAAI,MAAM,mDAAmD,KAAK;AAAA,EAC1E;AAAA,EAEA,OAAO,SAAS;AAAA;;;AE5MlB,8BAA2B,+CAAmB;;;ACA9C;AAAA,cAEE;AAAA,iBACA;AAAA,YAEA;AAAA;AAAA,qBAEA;AAAA;AAKF,SAAS,cAAc,CAAC,KAAe,KAAwB;AAAA,EAC7D,IAAI,IAAI,WAAW,IAAI;AAAA,IAAQ,OAAO;AAAA,EAEtC,IAAI,IAAI,gBAAgB,IAAI;AAAA,IAAa,OAAO;AAAA,EAChD,OAAO;AAAA;AAMT,SAAS,SAAS,CAAC,GAAsB;AAAA,EACvC,OAAO,EAAE,WAAW,KAAK,OAAO,EAAE,WAAW,KAAK;AAAA;AAkB7C,SAAS,oBAAoB,CAAC,OAAoB,QAA6B;AAAA,EACpF,IAAI,MAAM,YAAY;AAAA,IAAG,OAAO;AAAA,EAGhC,IAAI,MAAM,OAAO,OAAO,WAAW,OAAO,OAAO,QAAQ;AAAA,IACvD,MAAM,IAAI,UAAU,kCAAkC,OAAO,OAAO,eAAe,MAAM,OAAO,OAAO,QAAQ;AAAA,EACjH;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAAA,IAC7C,IAAI,MAAM,OAAO,OAAO,GAAG,SAAS,OAAO,OAAO,GAAG,MAAM;AAAA,MACzD,MAAM,IAAI,UACR,gCAAgC,gBAAgB,OAAO,OAAO,GAAG,eAAe,MAAM,OAAO,OAAO,GAAG,OACzG;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,GAAG,MAAM;AAAA,IAC3C,MAAM,WAAW,MAAM,KAAK,SAAS;AAAA,IACrC,MAAM,UAAU,SAAS;AAAA,IACzB,MAAM,UAAU,EAAE;AAAA,IAElB,IAAI,CAAC,eAAe,SAAS,OAAO,GAAG;AAAA,MACrC,OAAO,SAAS,MAAM,OAAO;AAAA,IAC/B;AAAA,IAGA,IAAI,UAAU,OAAO,KAAK,UAAU,OAAO,GAAG;AAAA,MAE5C,MAAM,MAAM,MAAM,WAAW,CAAC;AAAA,MAC9B,MAAM,SAAmB,CAAC;AAAA,MAC1B,SAAS,IAAI,EAAG,IAAI,MAAM,SAAS,KAAK;AAAA,QACtC,MAAM,IAAI,IAAI,IAAI,CAAC;AAAA,QACnB,OAAO,KAAK,OAAO,MAAM,WAAW,OAAO,CAAC,IAAK,CAAY;AAAA,MAC/D;AAAA,MACA,OAAO,iBAAgB,QAAQ,OAAO,EAAE,KAAK;AAAA,IAC/C;AAAA,IAGA,OAAO,SAAS,MAAM,OAAO;AAAA,GAC9B;AAAA,EAED,MAAM,aAAa,IAAI,QAAO,OAAO,MAAM;AAAA,EAC3C,MAAM,OAAO,UAAS;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ,MAAM;AAAA,IACd;AAAA,IACA,WAAW,MAAM,KAAK;AAAA,IACtB,YAAY,MAAM,KAAK;AAAA,EACzB,CAAC;AAAA,EACD,OAAO,IAAI,aAAY,QAAQ,MAAM,MAAM,QAAQ;AAAA;;;ADtF9C,IAAM,qBAAqB;AAAA;AAE3B,MAAM,qBAAqB,MAAM;AAAA,EAGpB;AAAA,EAFlB,WAAW,CACT,SACgB,YAChB;AAAA,IACA,MAAM,OAAO;AAAA,IAFG;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AAGO,SAAS,kBAAkB,CAAC,QAAgB,SAAoC;AAAA,EACrF,MAAM,SAAS,IAAI;AAAA,EACnB,OAAO,MAAM,WAAW,MAAM;AAAA,EAC9B,WAAW,SAAS,SAAS;AAAA,IAC3B,OAAO,MAAM,qBAAqB,OAAO,MAAM,CAAC;AAAA,EAClD;AAAA,EACA,OAAO,MAAM;AAAA,EACb,OAAO,OAAO,aAAa,IAAI;AAAA;AAI1B,SAAS,aAAa,CAAC,MAAkB,SAAS,KAAK,cAAkC;AAAA,EAC9F,MAAM,UAAU,gBAAgB,IAAI;AAAA,EACpC,QAAQ,IAAI,gBAAgB,kBAAkB;AAAA,EAC9C,OAAO,IAAI,SAAS,MAA6B,EAAE,QAAQ,QAAQ,CAAC;AAAA;AAItE,eAAsB,mBAAmB,CAAC,MAAmE;AAAA,EAC3G,MAAM,SAAS,MAAM,mBAAkB,KAAK,IAAI;AAAA,EAChD,MAAM,OAAO,KAAK;AAAA,EAClB,MAAM,SAAS,OAAO;AAAA,EACtB,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,aAAa,+BAA+B,GAAG;AAAA,EAC3D;AAAA,EACA,MAAM,UAAU,OAAO,QAAQ;AAAA,EAC/B,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,MAAM,IAAI,aAAa,kCAAkC,GAAG;AAAA,EAC9D;AAAA,EACA,OAAO,EAAE,QAAQ,OAAO,QAAQ,GAAG;AAAA;;;AE7CrC,mBAAS,kCAAyC;;;ACAlD;AAAA;AAAA;AAAA,cAGE;AAAA;AAAA;AAAA,cAGA;AAAA,iBACA;AAAA,uBACA;AAAA,YAEA;AAAA;AAAA,qBAEA;AAAA;;;ACZF,8BAA2B;AAAA;AAYpB,MAAM,gBAAgB;AAAA,EACnB;AAAA,EACA,cAAc;AAAA,EAEd,cAAc;AAAA,EAEd,WAAW,CAAC,QAA2B;AAAA,IAC7C,KAAK,SAAS;AAAA;AAAA,cAGH,OAAM,CAAC,OAAqF;AAAA,IACvG,MAAM,SAAS,MAAM,mBAAkB,KAAK,KAAY;AAAA,IACxD,MAAM,OAAO,KAAK,EAAE,aAAa,MAAM,CAAC;AAAA,IACxC,IAAI,OAAO,QAAQ;AAAA,MACjB,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,OAAO,IAAI,gBAAgB,MAAM;AAAA;AAAA,OAO7B,WAAU,GAAkC;AAAA,IAChD,IAAI,KAAK,aAAa;AAAA,MAEpB,MAAM,KAAK,OAAO,MAAM,EAAE,KAAK;AAAA,MAC/B,IAAI,KAAK,OAAO,QAAQ;AAAA,QACtB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AAAA,IAEnB,MAAM,SAAS,KAAK,OAAO;AAAA,IAC3B,IAAI,CAAC,QAAQ;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAyB,CAAC;AAAA,IAChC,OAAO,MAAM;AAAA,MACX,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK;AAAA,MACtC,IAAI,OAAO;AAAA,QAAM;AAAA,MAEjB,IAAI,OAAO,MAAM,YAAY,SAAS;AAAA,QAAwC;AAAA,MAC9E,QAAQ,KAAK,OAAO,KAAK;AAAA,IAC3B;AAAA,IAEA,OAAO,EAAE,QAAQ,QAAQ;AAAA;AAAA,OAQrB,eAAc,GAA2B;AAAA,IAC7C,IAAI,KAAK,aAAa;AAAA,MACpB,MAAM,KAAK,OAAO,MAAM,EAAE,KAAK;AAAA,MAC/B,IAAI,KAAK,OAAO,QAAQ;AAAA,QACtB,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AAAA,IACnB,OAAO,KAAK,OAAO,UAAU;AAAA;AAAA,OAWzB,cAAa,GAAgC;AAAA,IACjD,IAAI,KAAK;AAAA,MAAa,OAAO;AAAA,IAC7B,MAAM,SAAS,MAAM,KAAK,OAAO,KAAK;AAAA,IACtC,IAAI,OAAO,MAAM;AAAA,MACf,KAAK,cAAc;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IAIA,IAAI,OAAO,MAAM,YAAY,SAAS,wCAAwC;AAAA,MAC5E,KAAK,cAAc;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAO;AAAA;AAAA,OAGV,OAAM,GAAkB;AAAA,IAC5B,MAAM,KAAK,OAAO,OAAO;AAAA;AAE7B;;;AD/EO,SAAS,cAAc,CAAC,OAAsB;AAAA,EACnD,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,IAAI;AAAA,EAC1C,IAAI,OAAO,UAAU;AAAA,IAAW,OAAO,IAAI;AAAA,EAC3C,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,IAAI;AAAA,EAC1C,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,IAAI;AAAA,EAC1C,IAAI,iBAAiB;AAAA,IAAY,OAAO,IAAI;AAAA,EAC5C,OAAO,IAAI;AAAA;AAOb,SAAS,cAAc,CAAC,MAAgB,OAAiB;AAAA,EACvD,IAAI,SAAS;AAAA,IAAM,OAAO;AAAA,EAG1B,IAAI,UAAS,MAAM,IAAI,KAAM,KAAa,aAAa,IAAI;AAAA,IACzD,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,OAAO,KAAK;AAAA,IAClD,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,UAAS,MAAM,IAAI,GAAG;AAAA,IACxB,IAAI,iBAAiB,KAAK;AAAA,MACxB,MAAM,eAAgB,KAAa,SAAS;AAAA,MAC5C,MAAM,YAAY,aAAa,KAAK,SAAS,GAAG;AAAA,MAChD,MAAM,UAAU,IAAI;AAAA,MACpB,YAAY,GAAG,MAAM,OAAO;AAAA,QAC1B,QAAQ,IAAI,GAAG,eAAe,WAAW,CAAC,CAAC;AAAA,MAC7C;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,UAAS,OAAO,IAAI,GAAG;AAAA,IACzB,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MACxB,MAAM,WAAY,KAAa,SAAS,GAAG;AAAA,MAC3C,OAAO,MAAM,IAAI,CAAC,MAAW,eAAe,UAAU,CAAC,CAAC;AAAA,IAC1D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,eAAe,CAAC,QAAgB,QAA6B,QAA4B;AAAA,EACvG,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,gBAAgB,MAAM;AAAA,EACnC,SAAS,IAAI,qBAAqB,eAAe;AAAA,EAEjD,IAAI,OAAO,OAAO,WAAW,GAAG;AAAA,IAC9B,MAAM,cAAa,IAAI,QAAO,OAAO,MAAM;AAAA,IAC3C,MAAM,QAAO,UAAS;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,WAAW;AAAA,IACb,CAAC;AAAA,IACD,MAAM,SAAQ,IAAI,aAAY,QAAQ,OAAM,QAAQ;AAAA,IACpD,OAAO,mBAAmB,QAAQ,CAAC,MAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAM;AAAA,IACxC,MAAM,MAAM,eAAe,EAAE,MAAM,OAAO,EAAE,KAAK;AAAA,IACjD,OAAO,iBAAgB,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK;AAAA,GAC5C;AAAA,EAED,MAAM,aAAa,IAAI,QAAO,OAAO,MAAM;AAAA,EAC3C,MAAM,OAAO,UAAS;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EAED,MAAM,QAAQ,IAAI,aAAY,QAAQ,MAAM,QAAQ;AAAA,EACpD,OAAO,mBAAmB,QAAQ,CAAC,KAAK,CAAC;AAAA;AAM3C,eAAsB,mBAAmB,CAAC,MAAuE;AAAA,EAC/G,MAAM,SAAS,MAAM,mBAAkB,KAAK,IAAI;AAAA,EAChD,MAAM,OAAO,KAAK;AAAA,EAClB,MAAM,SAAS,OAAO;AAAA,EACtB,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,SAAS,iBAAiB,+BAA+B,EAAE;AAAA,EACvE;AAAA,EACA,MAAM,UAAU,OAAO,QAAQ;AAAA,EAC/B,OAAO,EAAE,QAAQ,QAAQ;AAAA;AASpB,SAAS,kBAAkB,CAAC,OAAoB,OAA4C;AAAA,EACjG,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,QAAQ,KAAK,IAAI,aAAa;AAAA,EACpC,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,MAAM,UAAU,KAAK,IAAI,eAAe,KAAK;AAAA,EAE7C,IAAI,UAAU,aAAa;AAAA,IACzB,MAAM,WAAW,KAAK,IAAI,aAAa;AAAA,IACvC,IAAI,YAAY;AAAA,IAChB,IAAI,eAAe;AAAA,IACnB,IAAI,YAAY;AAAA,IAChB,IAAI,UAAU;AAAA,MACZ,IAAI;AAAA,QACF,MAAM,QAAQ,KAAK,MAAM,QAAQ;AAAA,QACjC,YAAY,MAAM,kBAAkB;AAAA,QACpC,eAAe,MAAM,qBAAqB;AAAA,QAC1C,YAAY,MAAM,aAAa;AAAA,QAC/B,MAAM;AAAA,IACV;AAAA,IACA,MAAM,IAAI,SAAS,WAAW,cAAc,SAAS;AAAA,EACvD;AAAA,EAEA,IAAI,OAAO;AAAA,IACT,MAAM,WAAW,KAAK,IAAI,aAAa;AAAA,IACvC,IAAI;AAAA,IACJ,IAAI,UAAU;AAAA,MACZ,IAAI;AAAA,QACF,QAAQ,KAAK,MAAM,QAAQ;AAAA,QAC3B,MAAM;AAAA,IACV;AAAA,IACA,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,EACjC;AAAA,EAEA,OAAO;AAAA;AAOF,SAAS,gBAAgB,CAAC,OAA2C;AAAA,EAC1E,MAAM,OAA8B,CAAC;AAAA,EACrC,SAAS,IAAI,EAAG,IAAI,MAAM,SAAS,KAAK;AAAA,IACtC,MAAM,MAA2B,CAAC;AAAA,IAClC,SAAS,IAAI,EAAG,IAAI,MAAM,OAAO,OAAO,QAAQ,KAAK;AAAA,MACnD,MAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,MAClC,IAAI,QAAQ,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,MACtC,IAAI,OAAO,UAAU,UAAU;AAAA,QAC7B,IAAI,SAAS,OAAO,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,gBAAgB,GAAG;AAAA,UACxF,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,MACA,IAAI,MAAM,QAAQ;AAAA,IACpB;AAAA,IACA,KAAK,KAAK,GAAG;AAAA,EACf;AAAA,EACA,OAAO;AAAA;AAOT,eAAsB,qBAAqB,CAAC,MAA4C;AAAA,EACtF,MAAM,SAAS,IAAI,eAA2B;AAAA,IAC5C,KAAK,CAAC,YAAY;AAAA,MAChB,WAAW,QAAQ,IAAI;AAAA,MACvB,WAAW,MAAM;AAAA;AAAA,EAErB,CAAC;AAAA,EACD,OAAO,gBAAgB,OAAO,MAAM;AAAA;;;ADpLtC,eAAe,iBAAiB,CAAC,OAAoC;AAAA,EACnE,MAAM,SAAS,MAAM,mBAAkB,KAAK,KAAK;AAAA,EACjD,MAAM,OAAO,KAAK;AAAA,EAClB,OAAO,OAAO;AAAA;AAOhB,eAAsB,qBAAqB,CACzC,SACA,OAC6B;AAAA,EAE7B,IAAI,YAAY;AAAA,EAChB,WAAW,SAAS,SAAS;AAAA,IAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,MACvB,mBAAmB,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AAAA,EAEA,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAAA,EAGA,MAAM,OAAO,UAAU;AAAA,EACvB,MAAM,eAAe,MAAM,IAAI,iBAAiB,KAAK;AAAA,EAErD,MAAM,UAAwB,CAAC;AAAA,EAC/B,SAAS,IAAI,EAAG,IAAI,UAAU,SAAS,KAAK;AAAA,IAC1C,MAAM,OAAO,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IAC3C,MAAM,aAAa,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IACjD,MAAM,MAAM,UAAU,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IAC1C,MAAM,aAAa,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IACjD,MAAM,YAAY,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IAChD,MAAM,YAAY,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IAChD,MAAM,iBAAiB,UAAU,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IACrD,MAAM,oBAAoB,UAAU,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IACxD,MAAM,YAAY,UAAU,WAAW,CAAC,EAAG,IAAI,CAAC;AAAA,IAChD,MAAM,YAAY,UAAU,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IAEhD,MAAM,eAAe,MAAM,kBAAkB,SAAS;AAAA,IACtD,MAAM,eAAe,MAAM,kBAAkB,SAAS;AAAA,IAEtD,IAAI;AAAA,IACJ,IAAI,gBAAgB;AAAA,MAClB,IAAI;AAAA,QACF,aAAa,KAAK,MAAM,cAAc;AAAA,QACtC,MAAM;AAAA,IACV;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI,mBAAmB;AAAA,MACrB,IAAI;AAAA,QACF,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACvC,MAAM;AAAA,IACV;AAAA,IAEA,MAAM,OAAmB;AAAA,MACvB;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,IAGA,IAAI,eAAe,UAAU;AAAA,MAC3B,KAAK,eAAe;AAAA,IACtB;AAAA,IAEA,IAAI,aAAa,WAAW;AAAA,MAC1B,KAAK,eAAe,MAAM,kBAAkB,SAAS;AAAA,IACvD;AAAA,IAEA,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA,EAEA,OAAO,EAAE,cAAc,QAAQ;AAAA;AAMjC,eAAsB,cAAc,CAClC,SACA,SAC6B;AAAA,EAC7B,MAAM,SAAS,SAAS,UAAU;AAAA,EAClC,MAAM,cAAc,IAAI,YAAY,CAAC,CAAC;AAAA,EACtC,MAAM,OAAO,gBAAgB,aAAa,CAAC,GAAG,oBAAoB;AAAA,EAElE,MAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAAA,EAC7E,IAAI,SAAS,eAAe;AAAA,IAC1B,QAAQ,gBAAgB,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,WAAW,MAAM,MAAM,GAAG,UAAU,UAAU,wBAAwB;AAAA,IAC1E,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,IAAI,SAAS,WAAW,KAAK;AAAA,IAC3B,MAAM,IAAI,SAAS,uBAAuB,2BAA2B,EAAE;AAAA,EACzE;AAAA,EAEA,MAAM,eAAe,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,EAChE,QAAQ,YAAY,MAAM,oBAAoB,YAAY;AAAA,EAE1D,OAAO,sBAAsB,OAAO;AAAA;;;AG7ItC,4BAAgB,0BAAU,gCAAqB,4BAAQ;AAWhD,MAAM,kBAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAW,CAAC,MAgBT;AAAA,IACD,KAAK,WAAW,KAAK;AAAA,IACrB,KAAK,UAAU,KAAK;AAAA,IACpB,KAAK,UAAU,KAAK;AAAA,IACpB,KAAK,cAAc,KAAK;AAAA,IACxB,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,eAAe,KAAK;AAAA,IACzB,KAAK,SAAS,KAAK;AAAA,IACnB,KAAK,kBAAkB,KAAK;AAAA,IAC5B,KAAK,YAAY,KAAK;AAAA,IACtB,KAAK,UAAU,KAAK;AAAA,IACpB,KAAK,oBAAoB,KAAK;AAAA,IAC9B,KAAK,cAAc,KAAK;AAAA,IACxB,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,iBAAiB,KAAK;AAAA,IAC3B,KAAK,kBAAkB,KAAK;AAAA;AAAA,MAG1B,MAAM,GAA+B;AAAA,IACvC,OAAO,KAAK;AAAA;AAAA,EAGN,aAAa,GAA2B;AAAA,IAC9C,MAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,KAAK,qBAAqB,MAAM;AAAA,MAClC,QAAQ,sBAAsB;AAAA,MAC9B,QAAQ,qBAAqB;AAAA,IAC/B;AAAA,IACA,IAAI,KAAK,gBAAgB;AAAA,MACvB,QAAQ,gBAAgB,KAAK;AAAA,IAC/B;AAAA,IACA,OAAO;AAAA;AAAA,EAGD,YAAY,CAAC,SAAiC;AAAA,IACpD,IAAI,KAAK,qBAAqB,QAAQ,KAAK,aAAa;AAAA,MACtD,OAAO,KAAK,YAAY,SAAS,KAAK,iBAAiB;AAAA,IACzD;AAAA,IACA,OAAO;AAAA;AAAA,OAGK,cAAa,CAAC,MAAkD;AAAA,IAC5E,IAAI,OAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AAAA,IAClD,IAAI,KAAK,QAAQ,IAAI,kBAAkB,MAAM,UAAU,KAAK,eAAe;AAAA,MACzE,OAAO,IAAI,WAAW,KAAK,cAAc,IAAI,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA;AAAA,OAMH,SAAQ,CAAC,OAA8D;AAAA,IAC3E,IAAI,KAAK,gBAAgB,MAAM;AAAA,MAC7B,MAAM,IAAI,SAAS,iBAAiB,kDAAuD,EAAE;AAAA,IAC/F;AAAA,IAMA,IAAI,MAAM,WAAW,GAAG;AAAA,MAItB,MAAM,aAAa,KAAK,gBAAgB,KAAK;AAAA,MAC7C,MAAM,aAAa,KAAK,iBAAiB,UAAU;AAAA,MACnD,MAAM,YAAW,IAAI;AAAA,MACrB,UAAS,IAAI,WAAW,KAAK,WAAW;AAAA,MACxC,MAAM,gBAAgB,IAAI,aAAY,YAAY,WAAW,MAAM,SAAQ;AAAA,MAC3E,OAAO,KAAK,YAAY,YAAY,CAAC,aAAa,CAAC;AAAA,IACrD;AAAA,IAGA,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,IACjC,MAAM,SAAS,KAAK,IAAI,CAAC,QAAQ;AAAA,MAE/B,IAAI;AAAA,MACJ,WAAW,OAAO,OAAO;AAAA,QACvB,IAAI,IAAI,QAAQ,MAAM;AAAA,UACpB,SAAS,IAAI;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,YAAY,eAAe,MAAM;AAAA,MACvC,MAAM,WAAW,MAAM,KAAK,CAAC,QAAQ,IAAI,QAAQ,IAAI;AAAA,MACrD,OAAO,IAAI,MAAM,KAAK,WAAW,QAAQ;AAAA,KAC1C;AAAA,IAED,MAAM,cAAc,IAAI,OAAO,MAAM;AAAA,IACrC,MAAM,WAAW,YAAY,OAAO,IAAI,CAAC,MAAM;AAAA,MAC7C,MAAM,SAAS,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,KAAK;AAAA,MAC7C,OAAO,iBAAgB,QAAQ,EAAE,IAAI,EAAE,KAAK;AAAA,KAC7C;AAAA,IAED,MAAM,aAAa,IAAI,QAAO,YAAY,MAAM;AAAA,IAChD,MAAM,OAAO,UAAS;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,IAED,MAAM,WAAW,IAAI;AAAA,IACrB,SAAS,IAAI,WAAW,KAAK,WAAW;AAAA,IACxC,MAAM,QAAQ,IAAI,aAAY,aAAa,MAAM,QAAQ;AAAA,IAEzD,OAAO,KAAK,YAAY,aAAa,CAAC,KAAK,CAAC;AAAA;AAAA,OAGhC,YAAW,CAAC,QAAgB,SAAwD;AAAA,IAChG,MAAM,OAAO,mBAAmB,QAAQ,OAAO;AAAA,IAC/C,MAAM,OAAO,MAAM,MAAM,GAAG,KAAK,WAAW,KAAK,WAAW,KAAK,oBAAoB;AAAA,MACnF,QAAQ;AAAA,MACR,SAAS,KAAK,cAAc;AAAA,MAC5B,MAAM,KAAK,aAAa,IAAI;AAAA,IAC9B,CAAC;AAAA,IACD,IAAI,KAAK,WAAW,KAAK;AAAA,MACvB,MAAM,IAAI,SAAS,uBAAuB,2BAA2B,EAAE;AAAA,IACzE;AAAA,IAEA,MAAM,eAAe,MAAM,KAAK,cAAc,IAAI;AAAA,IAClD,QAAQ,SAAS,oBAAoB,MAAM,oBAAoB,YAAY;AAAA,IAE3E,IAAI,aAAoC,CAAC;AAAA,IACzC,WAAW,SAAS,iBAAiB;AAAA,MACnC,IAAI,MAAM,YAAY,GAAG;AAAA,QAEvB,mBAAmB,OAAO,KAAK,MAAM;AAAA,QAErC,MAAM,SAAQ,MAAM,UAAU,IAAI,SAAS;AAAA,QAC3C,IAAI,QAAO;AAAA,UACT,KAAK,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,MAGA,MAAM,QAAQ,MAAM,UAAU,IAAI,SAAS;AAAA,MAC3C,IAAI,OAAO;AAAA,QACT,KAAK,cAAc;AAAA,MACrB;AAAA,MAEA,aAAa,iBAAiB,KAAK;AAAA,IACrC;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,gBAAgB,CAAC,QAA6B;AAAA,IACpD,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,MAAM;AAAA,MACxC,OAAO,UAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAAA,KAC1D;AAAA,IACD,MAAM,aAAa,IAAI,QAAO,OAAO,MAAM;AAAA,IAC3C,MAAM,OAAO,UAAS;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,IACD,OAAO,IAAI,aAAY,QAAQ,IAAI;AAAA;AAAA,UAM7B,OAAO,cAAc,GAAiD;AAAA,IAE5E,SAAS,SAAS,KAAK,iBAAiB;AAAA,MACtC,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,IAAI,wBAAwB,KAAK,GAAG;AAAA,UAClC,QAAQ,MAAM,wBAAwB,OAAO,KAAK,eAAe;AAAA,QACnE,EAAO;AAAA,UACL,mBAAmB,OAAO,KAAK,MAAM;AAAA,UACrC;AAAA;AAAA,MAEJ;AAAA,MACA,MAAM,iBAAiB,KAAK;AAAA,IAC9B;AAAA,IACA,KAAK,kBAAkB,CAAC;AAAA,IAExB,IAAI,KAAK;AAAA,MAAW;AAAA,IACpB,IAAI,KAAK,gBAAgB;AAAA,MAAM;AAAA,IAG/B,OAAO,MAAM;AAAA,MACX,MAAM,eAAe,MAAM,KAAK,kBAAkB,KAAK,WAAW;AAAA,MAClE,QAAQ,YAAY,MAAM,oBAAoB,YAAY;AAAA,MAE1D,IAAI,kBAAkB;AAAA,MACtB,SAAS,SAAS,SAAS;AAAA,QACzB,IAAI,MAAM,YAAY,GAAG;AAAA,UAEvB,MAAM,QAAQ,MAAM,UAAU,IAAI,SAAS;AAAA,UAC3C,IAAI,OAAO;AAAA,YACT,KAAK,cAAc;AAAA,YACnB,kBAAkB;AAAA,YAClB;AAAA,UACF;AAAA,UAEA,IAAI,wBAAwB,KAAK,GAAG;AAAA,YAClC,QAAQ,MAAM,wBAAwB,OAAO,KAAK,eAAe;AAAA,UACnE,EAAO;AAAA,YAEL,mBAAmB,OAAO,KAAK,MAAM;AAAA,YACrC;AAAA;AAAA,QAEJ;AAAA,QAEA,MAAM,iBAAiB,KAAK;AAAA,MAC9B;AAAA,MAEA,IAAI,CAAC;AAAA,QAAiB;AAAA,IACxB;AAAA;AAAA,OAGY,kBAAiB,CAAC,OAAoC;AAAA,IAClE,MAAM,cAAc,IAAI,OAAO,CAAC,CAAC;AAAA,IACjC,MAAM,WAAW,IAAI;AAAA,IACrB,SAAS,IAAI,WAAW,KAAK;AAAA,IAE7B,MAAM,aAAa,IAAI,QAAO,YAAY,MAAM;AAAA,IAChD,MAAM,OAAO,UAAS;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,WAAW;AAAA,IACb,CAAC;AAAA,IACD,MAAM,QAAQ,IAAI,aAAY,aAAa,MAAM,QAAQ;AAAA,IACzD,MAAM,OAAO,mBAAmB,aAAa,CAAC,KAAK,CAAC;AAAA,IAEpD,MAAM,OAAO,MAAM,MAAM,GAAG,KAAK,WAAW,KAAK,WAAW,KAAK,oBAAoB;AAAA,MACnF,QAAQ;AAAA,MACR,SAAS,KAAK,cAAc;AAAA,MAC5B,MAAM,KAAK,aAAa,IAAI;AAAA,IAC9B,CAAC;AAAA,IACD,IAAI,KAAK,WAAW,KAAK;AAAA,MACvB,MAAM,IAAI,SAAS,uBAAuB,2BAA2B,EAAE;AAAA,IACzE;AAAA,IAEA,OAAO,KAAK,cAAc,IAAI;AAAA;AAAA,EAGhC,KAAK,GAAS;AAGhB;;;AC1QO,SAAS,WAAW,CAAC,SAAiB,SAAyC;AAAA,EACpF,MAAM,UAAU,SAAS,UAAU,IAAI,QAAQ,QAAQ,EAAE;AAAA,EACzD,MAAM,QAAQ,SAAS;AAAA,EACvB,MAAM,mBAAmB,SAAS;AAAA,EAClC,MAAM,gBAAgB,SAAS;AAAA,EAC/B,MAAM,iBAAiB,SAAS;AAAA,EAEhC,IAAI,cAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,oBAAoB;AAAA,EAExB,eAAe,iBAAiB,GAAkB;AAAA,IAChD,IAAI,qBAAqB,oBAAoB;AAAA,MAAM;AAAA,IACnD,oBAAoB;AAAA,IACpB,IAAI;AAAA,MACF,MAAM,MAAM;AAAA,MACZ,aAAa,IAAI;AAAA,MACjB,eAAe,IAAI;AAAA,MACnB,MAAM;AAAA;AAAA,EAKV,SAAS,YAAY,GAA2B;AAAA,IAC9C,MAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,oBAAoB,MAAM;AAAA,MAC5B,QAAQ,sBAAsB;AAAA,MAC9B,QAAQ,qBAAqB;AAAA,IAC/B;AAAA,IACA,IAAI,eAAe;AAAA,MACjB,QAAQ,gBAAgB;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,WAAW,CAAC,SAAiC;AAAA,IACpD,IAAI,oBAAoB,QAAQ,YAAY;AAAA,MAC1C,OAAO,WAAW,SAAS,gBAAgB;AAAA,IAC7C;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,SAAS,CAAC,MAAsB;AAAA,IACvC,IAAI,KAAK,WAAW,KAAK;AAAA,MACvB,MAAM,IAAI,SAAS,uBAAuB,2BAA2B,EAAE;AAAA,IACzE;AAAA;AAAA,EAGF,eAAe,YAAY,CAAC,MAAkD;AAAA,IAC5E,IAAI,OAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AAAA,IAClD,IAAI,KAAK,QAAQ,IAAI,kBAAkB,MAAM,UAAU,cAAc;AAAA,MACnE,OAAO,IAAI,WAAW,aAAa,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,eAAe,iBAAiB,GAAqC;AAAA,IACnE,IAAI;AAAA,MAAa,OAAO;AAAA,IACxB,MAAM,OAAO,MAAM,eAAe,SAAS,EAAE,QAAQ,cAAc,CAAC;AAAA,IACpE,cAAc,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IAC1D,OAAO;AAAA;AAAA,EAGT,OAAO;AAAA,SACC,KAAI,CAAC,QAAgB,QAAmE;AAAA,MAC5F,MAAM,kBAAkB;AAAA,MACxB,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,MAAM,OAAO,QAAQ,IAAI,MAAM;AAAA,MAC/B,IAAI,CAAC,MAAM;AAAA,QACT,MAAM,IAAI,MAAM,oBAAoB,SAAS;AAAA,MAC/C;AAAA,MAGA,MAAM,aAAa,KAAM,KAAK,YAAY,CAAC,MAAQ,UAAU,CAAC,EAAG;AAAA,MAEjE,MAAM,OAAO,gBAAgB,KAAK,cAAc,YAAY,MAAM;AAAA,MAClE,MAAM,OAAO,MAAM,MAAM,GAAG,UAAU,UAAU,UAAU;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,aAAa;AAAA,QACtB,MAAM,YAAY,IAAI;AAAA,MACxB,CAAC;AAAA,MACD,UAAU,IAAI;AAAA,MAEd,MAAM,eAAe,MAAM,aAAa,IAAI;AAAA,MAC5C,QAAQ,YAAY,MAAM,oBAAoB,YAAY;AAAA,MAG1D,IAAI,cAAkC;AAAA,MACtC,SAAS,SAAS,SAAS;AAAA,QACzB,IAAI,MAAM,YAAY,GAAG;AAAA,UAEvB,IAAI,wBAAwB,KAAK,GAAG;AAAA,YAClC,QAAQ,MAAM,wBAAwB,OAAO,cAAc;AAAA,UAC7D,EAAO;AAAA,YACL,mBAAmB,OAAO,KAAK;AAAA,YAC/B;AAAA;AAAA,QAEJ;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,MAEA,IAAI,CAAC,aAAa;AAAA,QAEhB,OAAO;AAAA,MACT;AAAA,MAGA,MAAM,OAAO,iBAAiB,WAAW;AAAA,MACzC,IAAI,KAAK,WAAW;AAAA,QAAG,OAAO;AAAA,MAE9B,MAAM,SAAS,KAAK;AAAA,MAEpB,IAAI,KAAK,aAAa,OAAO,WAAW;AAAA,QAAG,OAAO;AAAA,MAGlD,OAAO;AAAA;AAAA,SAGH,OAAM,CAAC,QAAgB,QAA0D;AAAA,MACrF,MAAM,kBAAkB;AAAA,MACxB,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,MAAM,OAAO,QAAQ,IAAI,MAAM;AAAA,MAC/B,IAAI,CAAC,MAAM;AAAA,QACT,MAAM,IAAI,MAAM,oBAAoB,SAAS;AAAA,MAC/C;AAAA,MAGA,MAAM,aAAa,KAAM,KAAK,YAAY,CAAC,MAAQ,UAAU,CAAC,EAAG;AAAA,MAEjE,MAAM,OAAO,gBAAgB,KAAK,cAAc,YAAY,MAAM;AAAA,MAClE,MAAM,OAAO,MAAM,MAAM,GAAG,UAAU,UAAU,eAAe;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS,aAAa;AAAA,QACtB,MAAM,YAAY,IAAI;AAAA,MACxB,CAAC;AAAA,MACD,UAAU,IAAI;AAAA,MAEd,MAAM,eAAe,MAAM,aAAa,IAAI;AAAA,MAG5C,IAAI,SAAqC;AAAA,MACzC,IAAI,aAA4B;AAAA,MAChC,MAAM,iBAAgC,CAAC;AAAA,MACvC,IAAI,WAAW;AAAA,MACf,IAAI,eAA8B;AAAA,MAElC,IAAI,KAAK,cAAc;AAAA,QAIrB,MAAM,SAAS,MAAM,sBAAsB,YAAY;AAAA,QAGvD,MAAM,eAAe,MAAM,OAAO,WAAW;AAAA,QAC7C,IAAI,cAAc;AAAA,UAChB,WAAW,SAAS,aAAa,SAAS;AAAA,YACxC,IAAI,MAAM,YAAY,GAAG;AAAA,cACvB,mBAAmB,OAAO,KAAK;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,MAAM,OAAO,iBAAiB,KAAK;AAAA,YACnC,IAAI,KAAK,SAAS,GAAG;AAAA,cACnB,SAAS,KAAK;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,QAGA,MAAM,aAAa,MAAM,OAAO,WAAW;AAAA,QAC3C,IAAI,YAAY;AAAA,UACd,eAAe,WAAW;AAAA,QAC5B;AAAA,QACA,MAAM,qBAAoC,CAAC;AAAA,QAC3C,IAAI,YAAY;AAAA,UACd,WAAW,SAAS,WAAW,SAAS;AAAA,YACtC,IAAI,MAAM,YAAY,GAAG;AAAA,cAEvB,MAAM,QAAQ,MAAM,UAAU,IAAI,SAAS;AAAA,cAC3C,IAAI,OAAO;AAAA,gBACT,aAAa;AAAA,gBACb;AAAA,cACF;AAAA,cACA,MAAM,QAAQ,MAAM,UAAU,IAAI,aAAa;AAAA,cAC/C,IAAI,UAAU,aAAa;AAAA,gBACzB,mBAAmB,KAAK,KAAK;AAAA,gBAC7B;AAAA,cACF;AAAA,cACA,mBAAmB,OAAO,KAAK;AAAA,cAC/B;AAAA,YACF;AAAA,YACA,eAAe,KAAK,KAAK;AAAA,UAC3B;AAAA,QACF;AAAA,QAEA,IAAI,mBAAmB,SAAS,GAAG;AAAA,UACjC,IAAI,eAAe,SAAS,KAAK,eAAe,MAAM;AAAA,YACpD,eAAe,KAAK,GAAG,kBAAkB;AAAA,UAC3C,EAAO;AAAA,YACL,WAAW,SAAS,oBAAoB;AAAA,cACtC,mBAAmB,OAAO,KAAK;AAAA,YACjC;AAAA;AAAA,QAEJ;AAAA,QAEA,IAAI,CAAC,cAAc,CAAC,YAAY;AAAA,UAC9B,WAAW;AAAA,QACb;AAAA,MACF,EAAO;AAAA,QAEL,QAAQ,QAAQ,gBAAgB,YAAY,MAAM,oBAAoB,YAAY;AAAA,QAClF,eAAe;AAAA,QAKf,MAAM,eAA8B,CAAC;AAAA,QAErC,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,YAEvB,MAAM,QAAQ,MAAM,UAAU,IAAI,SAAS;AAAA,YAC3C,IAAI,OAAO;AAAA,cACT,aAAa;AAAA,cACb;AAAA,YACF;AAAA,YAEA,MAAM,QAAQ,MAAM,UAAU,IAAI,aAAa;AAAA,YAC/C,IAAI,UAAU,aAAa;AAAA,cACzB,aAAa,KAAK,KAAK;AAAA,cACvB;AAAA,YACF;AAAA,YACA,mBAAmB,OAAO,KAAK;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,eAAe,KAAK,KAAK;AAAA,QAC3B;AAAA,QAIA,IAAI,aAAa,SAAS,GAAG;AAAA,UAC3B,IAAI,eAAe,SAAS,KAAK,eAAe,MAAM;AAAA,YACpD,eAAe,KAAK,GAAG,YAAY;AAAA,UACrC,EAAO;AAAA,YAEL,WAAW,SAAS,cAAc;AAAA,cAChC,mBAAmB,OAAO,KAAK;AAAA,YACjC;AAAA;AAAA,QAEJ;AAAA;AAAA,MAGF,IAAI,eAAe,WAAW,KAAK,eAAe,MAAM;AAAA,QACtD,WAAW;AAAA,MACb;AAAA,MAKA,MAAM,gBACH,gBAAgB,aAAa,OAAO,SAAS,IAAI,eAAe,UAChE,eAAe,SAAS,IAAI,eAAe,GAAG,SAAS,SACxD,KAAK,gBACL,KAAK;AAAA,MAEP,OAAO,IAAI,kBAAkB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,SAGG,SAAQ,GAAgC;AAAA,MAC5C,OAAO,eAAe,SAAS,EAAE,OAAO,CAAC;AAAA;AAAA,IAG3C,KAAK,GAAS;AAAA,EAGhB;AAAA;;ACxSF,SAAS,iBAAiB,CAAC,MAA0D;AAAA,EACnF,MAAM,SAAwC;AAAA,IAC5C,UAAU,KAAK;AAAA,IACf,sBAAsB,KAAK;AAAA,EAC7B;AAAA,EACA,IAAI,KAAK;AAAA,IAAkB,OAAO,kBAAkB,KAAK;AAAA,EACzD,IAAI,KAAK;AAAA,IAA0B,OAAO,yBAAyB,KAAK;AAAA,EACxE,IAAI,KAAK;AAAA,IACP,OAAO,oCAAoC,KAAK;AAAA,EAClD,IAAI,KAAK;AAAA,IAAe,OAAO,eAAe,KAAK;AAAA,EACnD,IAAI,KAAK;AAAA,IAAwB,OAAO,wBAAwB,KAAK;AAAA,EACrE,IAAI,KAAK;AAAA,IAAqB,OAAO,oBAAoB,KAAK;AAAA,EAC9D,IAAI,KAAK;AAAA,IAAkB,OAAO,iBAAiB,KAAK;AAAA,EACxD,IAAI,KAAK;AAAA,IAAW,OAAO,WAAW,KAAK;AAAA,EAC3C,IAAI,KAAK;AAAA,IAAe,OAAO,eAAe,KAAK;AAAA,EACnD,IAAI,KAAK;AAAA,IAAwB,OAAO,qBAAqB,KAAK;AAAA,EAClE,IAAI,KAAK;AAAA,IAAuB,OAAO,qBAAqB,KAAK;AAAA,EACjE,IAAI,KAAK;AAAA,IAA2B,OAAO,yBAAyB,KAAK;AAAA,EACzE,OAAO;AAAA;AAOT,eAAsB,iBAAiB,CACrC,SACA,QAC+C;AAAA,EAC/C,MAAM,mBAAmB,UAAU,IAAI,QAAQ,QAAQ,EAAE;AAAA,EACzD,MAAM,cAAc,GAAG,QAAQ,QAAQ,QAAQ,EAAE,yCAAyC;AAAA,EAE1F,IAAI;AAAA,IACF,OAAO,MAAM,mBAAmB,WAAW;AAAA,IAC3C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,eAAsB,kBAAkB,CAAC,aAA6D;AAAA,EACpG,MAAM,WAAW,MAAM,MAAM,WAAW;AAAA,EACxC,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,IAAI,MAAM,uCAAuC,gBAAgB,SAAS,QAAQ;AAAA,EAC1F;AAAA,EACA,MAAM,OAAO,MAAM,SAAS,KAAK;AAAA,EACjC,OAAO,kBAAkB,IAAI;AAAA;AAOxB,SAAS,wBAAwB,CAAC,iBAAwC;AAAA,EAE/E,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,gBAAgB,OAAO,MAAM,6BAA6B;AAAA,EAChE,IAAI,CAAC;AAAA,IAAe,OAAO;AAAA,EAE3B,OAAO,cAAc;AAAA;AAOhB,SAAS,aAAa,CAAC,iBAAwC;AAAA,EACpE,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,gBAAgB,OAAO,MAAM,qBAAqB;AAAA,EACxD,IAAI,CAAC;AAAA,IAAe,OAAO;AAAA,EAE3B,OAAO,cAAc;AAAA;AAOhB,SAAS,iBAAiB,CAAC,iBAAwC;AAAA,EACxE,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,QAAQ,OAAO,MAAM,yBAAyB;AAAA,EACpD,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,OAAO,MAAM;AAAA;AAOR,SAAS,uBAAuB,CAAC,iBAAkC;AAAA,EACxE,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,QAAQ,OAAO,MAAM,kCAAkC;AAAA,EAC7D,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,OAAO,MAAM,OAAO;AAAA;AAOf,SAAS,uBAAuB,CAAC,iBAAwC;AAAA,EAC9E,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,QAAQ,OAAO,MAAM,iCAAiC;AAAA,EAC5D,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,OAAO,MAAM;AAAA;AAOR,SAAS,2BAA2B,CAAC,iBAAwC;AAAA,EAClF,MAAM,cAAc,gBAAgB,MAAM,iBAAiB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAa,OAAO;AAAA,EAEzB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,QAAQ,OAAO,MAAM,qCAAqC;AAAA,EAChE,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,OAAO,MAAM;AAAA;;AClKf;AAAA,WACE;AAAA,cACA;AAAA,iBACA;AAAA,6BACA;AAAA,YACA;AAAA,YACA;AAAA,qBACA;AAAA;AA4BF,MAAM,sBAAsB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EAEjB,WAAW,CAAC,SAAkB,QAAgB;AAAA,IAC5C,KAAK,UAAU;AAAA,IACf,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,OAAO,MAAM,WAAW,MAAM;AAAA,IACnC,KAAK,MAAM;AAAA;AAAA,EAGb,KAAK,CAAC,OAA0B;AAAA,IAC9B,IAAI,KAAK;AAAA,MAAQ,MAAM,IAAI,MAAM,sCAAsC;AAAA,IACtE,KAAK,OAAe,kBAAkB,KAAK;AAAA,IAC5C,KAAK,MAAM;AAAA;AAAA,EAGb,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,KAAK,SAAS;AAAA,IAEd,MAAM,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM;AAAA,IACzD,KAAK,QAAQ,GAAG;AAAA;AAAA,EAGV,KAAK,GAAS;AAAA,IACpB,MAAM,SAAU,KAAK,OAAe,MAAM;AAAA,IAC1C,WAAW,SAAS,QAAQ;AAAA,MAC1B,KAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,IACA,OAAO,SAAS;AAAA;AAEpB;AAAA;AAMO,MAAM,kBAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAA6C;AAAA,EAC7C,eAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAW,CAAC,MAST;AAAA,IACD,KAAK,UAAU,KAAK;AAAA,IACpB,KAAK,WAAW,KAAK;AAAA,IACrB,KAAK,SAAS,KAAK;AAAA,IACnB,KAAK,UAAU,KAAK;AAAA,IACpB,KAAK,gBAAgB,KAAK;AAAA,IAC1B,KAAK,eAAe,KAAK;AAAA,IACzB,KAAK,mBAAmB,KAAK;AAAA,IAC7B,KAAK,kBAAkB,KAAK;AAAA;AAAA,MAG1B,MAAM,GAA+B;AAAA,IACvC,OAAO,KAAK;AAAA;AAAA,OAQA,iBAAgB,GAAgC;AAAA,IAC5D,OAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM,KAAK,QAAQ,cAAc;AAAA,MAC/C,IAAI,UAAU;AAAA,QAAM,OAAO;AAAA,MAE3B,IAAI,MAAM,YAAY,GAAG;AAAA,QAEvB,IAAI,wBAAwB,KAAK,GAAG;AAAA,UAClC,OAAO,MAAM,wBAAwB,OAAO,KAAK,eAAe;AAAA,QAClE;AAAA,QAGA,IAAI,mBAAmB,OAAO,KAAK,MAAM,GAAG;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,IACT;AAAA;AAAA,OASY,oBAAmB,GAAkB;AAAA,IACjD,IAAI,KAAK;AAAA,MAAqB;AAAA,IAC9B,KAAK,sBAAsB;AAAA,IAC3B,MAAM,SAAS,MAAM,KAAK,QAAQ,eAAe;AAAA,IACjD,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,SAAS,iBAAiB,sCAAsC,EAAE;AAAA,IAC9E;AAAA;AAAA,OAMI,SAAQ,CAAC,OAA8D;AAAA,IAC3E,IAAI,KAAK,SAAS;AAAA,MAChB,MAAM,IAAI,SAAS,iBAAiB,4BAA4B,EAAE;AAAA,IACpE;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,MAAM,WAAW,GAAG;AAAA,MAKtB,cAAc,KAAK,gBAAgB,KAAK;AAAA,MACxC,MAAM,WAAW,YAAY,OAAO,IAAI,CAAC,MAAM;AAAA,QAC7C,OAAO,UAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AAAA,OAC1D;AAAA,MACD,MAAM,aAAa,IAAI,QAAO,YAAY,MAAM;AAAA,MAChD,MAAM,OAAO,UAAS;AAAA,QACpB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,MACD,QAAQ,IAAI,aAAY,aAAa,IAAI;AAAA,IAC3C,EAAO;AAAA,MAIL,MAAM,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,MACjC,MAAM,SAAS,KAAK,IAAI,CAAC,QAAQ;AAAA,QAC/B,IAAI;AAAA,QACJ,WAAW,OAAO,OAAO;AAAA,UACvB,IAAI,IAAI,QAAQ,MAAM;AAAA,YACpB,SAAS,IAAI;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM,YAAY,eAAe,MAAM;AAAA,QACvC,OAAO,IAAI,OAAM,KAAK,WAA0B,IAAI;AAAA,OACrD;AAAA,MACD,cAAc,IAAI,QAAO,MAAM;AAAA,MAI/B,IAAI,KAAK,cAAc;AAAA,QACrB,MAAM,SAAS,KAAK;AAAA,QACpB,IACE,OAAO,OAAO,WAAW,YAAY,OAAO,UAC5C,OAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,YAAY,OAAO,GAAG,IAAI,GAClE;AAAA,UACA,MAAM,IAAI,SACR,iBACA,4CAA4C,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,QACpF,YAAY,YAAY,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,MAC7D,EACF;AAAA,QACF;AAAA,MACF,EAAO;AAAA,QACL,KAAK,eAAe;AAAA;AAAA,MAGtB,MAAM,WAAW,YAAY,OAAO,IAAI,CAAC,MAAM;AAAA,QAC7C,MAAM,SAAS,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,KAAK;AAAA,QAC7C,OAAO,iBAAgB,QAAQ,EAAE,IAAI,EAAE,KAAK;AAAA,OAC7C;AAAA,MACD,MAAM,aAAa,IAAI,QAAO,YAAY,MAAM;AAAA,MAChD,MAAM,OAAO,UAAS;AAAA,QACpB,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,MACD,QAAQ,IAAI,aAAY,aAAa,IAAI;AAAA;AAAA,IAI3C,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB,KAAK,eAAe,IAAI,sBAAsB,KAAK,UAAU,WAAW;AAAA,IAC1E;AAAA,IAKA,KAAK,aAAa,MAAM,KAAK;AAAA,IAC7B,MAAM,KAAK,oBAAoB;AAAA,IAG/B,IAAI;AAAA,MACF,MAAM,cAAc,MAAM,KAAK,iBAAiB;AAAA,MAChD,IAAI,gBAAgB,MAAM;AAAA,QACxB,OAAO,CAAC;AAAA,MACV;AAAA,MACA,OAAO,iBAAiB,WAAW;AAAA,MACnC,OAAO,GAAG;AAAA,MAEV,MAAM,KAAK,SAAS;AAAA,MACpB,MAAM;AAAA;AAAA;AAAA,OAOI,SAAQ,GAAkB;AAAA,IACtC,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,UAAU;AAAA,IACf,IAAI,KAAK,cAAc;AAAA,MACrB,KAAK,aAAa,MAAM;AAAA,MACxB,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,IAAI;AAAA,MACF,IAAI,KAAK,qBAAqB;AAAA,QAC5B,OAAQ,MAAM,KAAK,QAAQ,cAAc,MAAO,MAAM,CAAC;AAAA,MACzD;AAAA,MACA,MAAM;AAAA,IAGR,KAAK,aAAa;AAAA;AAAA,UAMZ,OAAO,cAAc,GAAiD;AAAA,IAC5E,IAAI,KAAK;AAAA,MAAS;AAAA,IAElB,IAAI;AAAA,MAEF,MAAM,aAAa,IAAI,QAAO,CAAC,CAAC;AAAA,MAChC,KAAK,eAAe,IAAI,sBAAsB,KAAK,UAAU,UAAU;AAAA,MAGvE,MAAM,aAAa,IAAI,QAAO,WAAW,MAAM;AAAA,MAC/C,MAAM,WAAW,UAAS;AAAA,QACxB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AAAA,MACD,MAAM,YAAY,IAAI,aAAY,YAAY,QAAQ;AAAA,MAEtD,OAAO,MAAM;AAAA,QAIX,KAAK,aAAa,MAAM,SAAS;AAAA,QACjC,MAAM,KAAK,oBAAoB;AAAA,QAG/B,MAAM,cAAc,MAAM,KAAK,iBAAiB;AAAA,QAChD,IAAI,gBAAgB,MAAM;AAAA,UAExB;AAAA,QACF;AAAA,QAEA,MAAM,iBAAiB,WAAW;AAAA,MACpC;AAAA,cACA;AAAA,MAEA,IAAI,KAAK,cAAc;AAAA,QACrB,KAAK,aAAa,MAAM;AAAA,QACxB,KAAK,eAAe;AAAA,MACtB;AAAA,MAEA,IAAI;AAAA,QACF,IAAI,KAAK,qBAAqB;AAAA,UAC5B,OAAQ,MAAM,KAAK,QAAQ,cAAc,MAAO,MAAM,CAAC;AAAA,QACzD;AAAA,QACA,MAAM;AAAA,MAGR,KAAK,UAAU;AAAA,MACf,KAAK,aAAa;AAAA;AAAA;AAAA,EAItB,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAS;AAAA,IAClB,KAAK,UAAU;AAAA,IAEf,IAAI,KAAK,cAAc;AAAA,MAErB,KAAK,aAAa,MAAM;AAAA,MACxB,KAAK,eAAe;AAAA,IACtB,EAAO;AAAA,MAGL,MAAM,cAAc,IAAI,QAAO,CAAC,CAAC;AAAA,MACjC,MAAM,MAAM,mBAAmB,aAAa,CAAC,CAAC;AAAA,MAC9C,KAAK,SAAS,GAAG;AAAA;AAAA,IAKnB,MAAM,gBAAgB,YAAY;AAAA,MAChC,IAAI;AAAA,QACF,IAAI,CAAC,KAAK,qBAAqB;AAAA,UAC7B,MAAM,SAAS,MAAM,KAAK,QAAQ,eAAe;AAAA,UACjD,IAAI,QAAQ;AAAA,YACV,OAAQ,MAAM,KAAK,QAAQ,cAAc,MAAO,MAAM,CAAC;AAAA,UACzD;AAAA,QACF,EAAO;AAAA,UACL,OAAQ,MAAM,KAAK,QAAQ,cAAc,MAAO,MAAM,CAAC;AAAA;AAAA,QAEzD,MAAM,WAEN;AAAA,QACA,KAAK,aAAa;AAAA;AAAA,OAEnB;AAAA,IACH,KAAK,iBAAiB,YAAY;AAAA;AAEtC;AAMO,SAAS,WAAW,CACzB,UACA,UACA,SACW;AAAA,EACX,MAAM,QAAQ,SAAS;AAAA,EACvB,MAAM,iBAAiB,SAAS;AAAA,EAEhC,IAAI,SAAiC;AAAA,EACrC,IAAI,gBAAiD;AAAA,EACrD,IAAI,cAA8C;AAAA,EAClD,IAAI,eAAe;AAAA,EACnB,IAAI,QAAQ;AAAA,EACZ,IAAI,gBAAsC;AAAA,EAC1C,IAAI,SAAS;AAAA,EAEb,MAAM,UAAmB,CAAC,UAAsB;AAAA,IAC9C,SAAS,MAAM,KAAK;AAAA,IACpB,SAAS,QAAQ;AAAA;AAAA,EAOnB,eAAe,YAAY,GAA6B;AAAA,IACtD,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,IAAI,CAAC,eAAe;AAAA,MAClB,gBAAgB,gBAAgB,OAAO,QAAQ;AAAA,IACjD;AAAA,IACA,SAAS,MAAM;AAAA,IACf,OAAO;AAAA;AAAA,EAGT,eAAe,WAAW,GAAkB;AAAA,IAE1C,IAAI,eAAe;AAAA,MACjB,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,IACA,IAAI,OAAO;AAAA,MACT,MAAM,IAAI,MACR,qEACE,mFACJ;AAAA,IACF;AAAA,IACA,QAAQ;AAAA;AAAA,EAGV,SAAS,WAAW,GAAS;AAAA,IAC3B,QAAQ;AAAA;AAAA,EAGV,SAAS,eAAe,CAAC,GAAwB;AAAA,IAC/C,gBAAgB;AAAA;AAAA,EAGlB,eAAe,iBAAiB,GAAqC;AAAA,IACnE,IAAI;AAAA,MAAa,OAAO;AAAA,IAExB,MAAM,YAAY;AAAA,IAClB,IAAI;AAAA,MAKF,MAAM,cAAc,IAAI,QAAO,CAAC,CAAC;AAAA,MACjC,MAAM,OAAO,gBAAgB,aAAa,CAAC,GAAG,oBAAoB;AAAA,MAClE,QAAQ,IAAI;AAAA,MAEZ,MAAM,IAAI,MAAM,aAAa;AAAA,MAM7B,MAAM,WAAW,MAAM,EAAE,WAAW;AAAA,MACpC,IAAI,CAAC,UAAU;AAAA,QACb,MAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAAA,MAEA,MAAM,OAAO,MAAM,sBAAsB,SAAS,SAAS,KAAK;AAAA,MAChE,eAAe,KAAK;AAAA,MACpB,cAAc,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,MAC1D,OAAO;AAAA,cACP;AAAA,MACA,YAAY;AAAA;AAAA;AAAA,EAIhB,OAAO;AAAA,SACC,KAAI,CAAC,QAAgB,QAAmE;AAAA,MAC5F,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,MAAM,YAAY;AAAA,MAClB,IAAI;AAAA,QACF,MAAM,OAAO,QAAQ,IAAI,MAAM;AAAA,QAC/B,IAAI,CAAC,MAAM;AAAA,UACT,MAAM,IAAI,MAAM,oBAAoB,SAAS;AAAA,QAC/C;AAAA,QAEA,MAAM,IAAI,MAAM,aAAa;AAAA,QAG7B,MAAM,aAAa,KAAM,KAAK,YAAY,CAAC,MAAQ,UAAU,CAAC,EAAG;AAAA,QAGjE,MAAM,OAAO,gBAAgB,KAAK,cAAc,YAAY,MAAM;AAAA,QAClE,QAAQ,IAAI;AAAA,QAGZ,MAAM,WAAW,MAAM,EAAE,WAAW;AAAA,QACpC,IAAI,CAAC,UAAU;AAAA,UACb,MAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AAAA,QAGA,IAAI,cAAkC;AAAA,QACtC,SAAS,SAAS,SAAS,SAAS;AAAA,UAClC,IAAI,MAAM,YAAY,GAAG;AAAA,YACvB,IAAI,wBAAwB,KAAK,GAAG;AAAA,cAClC,QAAQ,MAAM,wBAAwB,OAAO,cAAc;AAAA,YAC7D,EAAO;AAAA,cACL,mBAAmB,OAAO,KAAK;AAAA,cAC/B;AAAA;AAAA,UAEJ;AAAA,UACA,cAAc;AAAA,QAChB;AAAA,QAEA,IAAI,CAAC,aAAa;AAAA,UAChB,OAAO;AAAA,QACT;AAAA,QAEA,MAAM,OAAO,iBAAiB,WAAW;AAAA,QACzC,IAAI,KAAK,WAAW;AAAA,UAAG,OAAO;AAAA,QAE9B,IAAI,KAAK,aAAa,OAAO,WAAW;AAAA,UAAG,OAAO;AAAA,QAElD,OAAO,KAAK;AAAA,gBACZ;AAAA,QACA,YAAY;AAAA;AAAA;AAAA,SAIV,OAAM,CAAC,QAAgB,QAAsD;AAAA,MACjF,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,MAAM,YAAY;AAAA,MAElB,IAAI;AAAA,QACF,MAAM,OAAO,QAAQ,IAAI,MAAM;AAAA,QAC/B,IAAI,CAAC,MAAM;AAAA,UACT,MAAM,IAAI,MAAM,oBAAoB,SAAS;AAAA,QAC/C;AAAA,QAEA,MAAM,IAAI,MAAM,aAAa;AAAA,QAG7B,MAAM,aAAa,KAAM,KAAK,YAAY,CAAC,MAAQ,UAAU,CAAC,EAAG;AAAA,QAGjE,MAAM,OAAO,gBAAgB,KAAK,cAAc,YAAY,MAAM;AAAA,QAClE,QAAQ,IAAI;AAAA,QAGZ,IAAI,SAAqC;AAAA,QACzC,IAAI,KAAK,cAAc;AAAA,UACrB,MAAM,eAAe,MAAM,EAAE,WAAW;AAAA,UACxC,IAAI,cAAc;AAAA,YAChB,WAAW,SAAS,aAAa,SAAS;AAAA,cACxC,IAAI,MAAM,YAAY,GAAG;AAAA,gBACvB,mBAAmB,OAAO,KAAK;AAAA,gBAC/B;AAAA,cACF;AAAA,cACA,MAAM,OAAO,iBAAiB,KAAK;AAAA,cACnC,IAAI,KAAK,SAAS,GAAG;AAAA,gBACnB,SAAS,KAAK;AAAA,cAChB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,MAAM,eAAe,KAAK,gBAAgB,KAAK;AAAA,QAI/C,OAAO,IAAI,kBAAkB;AAAA,UAC3B,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,OAAO,GAAG;AAAA,QAIV,IAAI;AAAA,UACF,MAAM,IAAI,MAAM,aAAa;AAAA,UAC7B,MAAM,cAAc,IAAI,QAAO,CAAC,CAAC;AAAA,UACjC,MAAM,MAAM,mBAAmB,aAAa,CAAC,CAAC;AAAA,UAC9C,QAAQ,GAAG;AAAA,UAEX,MAAM,YAAY,MAAM,EAAE,WAAW;AAAA,UAGrC,MAAM;AAAA,QAGR,YAAY;AAAA,QACZ,MAAM;AAAA;AAAA;AAAA,SAIJ,SAAQ,GAAgC;AAAA,MAC5C,MAAM,UAAU,MAAM,kBAAkB;AAAA,MACxC,OAAO;AAAA,QACL;AAAA,QACA,SAAS,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA,MAC/B;AAAA;AAAA,IAGF,KAAK,GAAS;AAAA,MACZ,IAAI;AAAA,QAAQ;AAAA,MACZ,SAAS;AAAA,MACT,SAAS,IAAI;AAAA;AAAA,EAEjB;AAAA;AAOK,SAAS,iBAAiB,CAAC,KAAe,SAA+C;AAAA,EAC9F,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IAC1B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,SAAS,UAAU;AAAA,IAC3B,KAAK,SAAS;AAAA,IACd,KAAK,SAAS,MAAM,KAAK,QAAQ,QAAQ,QAAQ,IAAI,IAAI;AAAA,EAC3D,CAAC;AAAA,EAED,MAAM,SAAS,KAAK;AAAA,EAEpB,MAAM,WAAyB;AAAA,IAC7B,KAAK,CAAC,MAAkB;AAAA,MACrB,KAAK,MAAc,MAAM,IAAI;AAAA;AAAA,IAEhC,KAAK,GAAG;AAAA,MACL,KAAK,MAAc,MAAM;AAAA;AAAA,IAE5B,GAAG,GAAG;AAAA,MACH,KAAK,MAAc,IAAI;AAAA;AAAA,EAE5B;AAAA,EAEA,MAAM,SAAS,YAAY,QAAQ,UAAU;AAAA,IAC3C,OAAO,SAAS;AAAA,IAChB,kBAAkB,SAAS;AAAA,EAC7B,CAAC;AAAA,EAGD,MAAM,gBAAgB,OAAO;AAAA,EAC7B,OAAO,QAAQ,MAAM;AAAA,IACnB,cAAc,KAAK,MAAM;AAAA,IACzB,IAAI;AAAA,MACF,KAAK,KAAK;AAAA,MACV,MAAM;AAAA;AAAA,EAKV,OAAO;AAAA;;AC9mBF,SAAS,2BAA2B,CAAC,UAAsD;AAAA,EAChG,MAAM,OAA4B;AAAA,IAChC,UAAU,SAAS;AAAA,IACnB,uBAAuB,SAAS;AAAA,EAClC;AAAA,EACA,IAAI,SAAS;AAAA,IAAiB,KAAK,mBAAmB,SAAS;AAAA,EAC/D,IAAI,SAAS;AAAA,IAAwB,KAAK,2BAA2B,SAAS;AAAA,EAC9E,IAAI,SAAS;AAAA,IACX,KAAK,wCAAwC,SAAS;AAAA,EACxD,IAAI,SAAS;AAAA,IAAc,KAAK,gBAAgB,SAAS;AAAA,EACzD,IAAI,SAAS;AAAA,IAAuB,KAAK,yBAAyB,SAAS;AAAA,EAC3E,IAAI,SAAS;AAAA,IAAmB,KAAK,sBAAsB,SAAS;AAAA,EACpE,IAAI,SAAS;AAAA,IAAgB,KAAK,mBAAmB,SAAS;AAAA,EAC9D,IAAI,SAAS,UAAU;AAAA,IACrB,IAAI,CAAC,sBAAsB,KAAK,SAAS,QAAQ,GAAG;AAAA,MAClD,MAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AAAA,IACA,KAAK,YAAY,SAAS;AAAA,EAC5B;AAAA,EACA,IAAI,SAAS,cAAc;AAAA,IACzB,IAAI,CAAC,sBAAsB,KAAK,SAAS,YAAY,GAAG;AAAA,MACtD,MAAM,IAAI,MAAM,gFAAgF;AAAA,IAClG;AAAA,IACA,KAAK,gBAAgB,SAAS;AAAA,EAChC;AAAA,EACA,IAAI,SAAS,oBAAoB;AAAA,IAC/B,IAAI,CAAC,sBAAsB,KAAK,SAAS,kBAAkB,GAAG;AAAA,MAC5D,MAAM,IAAI,MAAM,wFAAwF;AAAA,IAC1G;AAAA,IACA,KAAK,wBAAwB,SAAS;AAAA,EACxC;AAAA,EACA,IAAI,SAAS,wBAAwB;AAAA,IACnC,IAAI,CAAC,sBAAsB,KAAK,SAAS,sBAAsB,GAAG;AAAA,MAChE,MAAM,IAAI,MAAM,4FAA4F;AAAA,IAC9G;AAAA,IACA,KAAK,4BAA4B,SAAS;AAAA,EAC5C;AAAA,EACA,IAAI,SAAS,oBAAoB;AAAA,IAC/B,KAAK,yBAAyB;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,aAAa,CAAC,QAAwB;AAAA,EACpD,OAAO,wCAAwC;AAAA;AAI1C,SAAS,0BAA0B,CACxC,aACA,UACA,cACA,oBACA,oBACA,wBACQ;AAAA,EACR,IAAI,SAAS;AAAA,EACb,IAAI,aAAa;AAAA,IACf,UAAU,uBAAuB;AAAA,EACnC;AAAA,EACA,IAAI,UAAU;AAAA,IACZ,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,IAAI,cAAc;AAAA,IAChB,UAAU,oBAAoB;AAAA,EAChC;AAAA,EACA,IAAI,oBAAoB;AAAA,IACtB,UAAU,4BAA4B;AAAA,EACxC;AAAA,EACA,IAAI,wBAAwB;AAAA,IAC1B,UAAU,gCAAgC;AAAA,EAC5C;AAAA,EACA,IAAI,oBAAoB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;;ACzGT;AAaO,SAAS,kBAAkB,CAAC,SAAyD;AAAA,EAC1F,QAAQ,aAAa;AAAA,EAErB,OAAO,eAAe,YAAY,CAAC,SAAwC;AAAA,IACzE,MAAM,aAAa,QAAQ,QAAQ,IAAI,eAAe,KAAK;AAAA,IAC3D,IAAI,CAAC,WAAW,WAAW,SAAS,GAAG;AAAA,MACrC,MAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,IACA,MAAM,QAAQ,WAAW,MAAM,CAAC;AAAA,IAChC,OAAO,SAAS,KAAK;AAAA;AAAA;AAKzB,SAAS,SAAS,CAAC,GAAW,GAAoB;AAAA,EAChD,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,OAAO,IAAI,OAAO,CAAC;AAAA,EACzB,MAAM,OAAO,IAAI,OAAO,CAAC;AAAA,EACzB,IAAI,KAAK,eAAe,KAAK;AAAA,IAAY,OAAO;AAAA,EAChD,OAAO,gBAAgB,MAAM,IAAI;AAAA;AAS5B,SAAS,wBAAwB,CAAC,SAEtB;AAAA,EACjB,MAAM,UACJ,QAAQ,kBAAkB,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,CAAC,IAAI,OAAO,QAAQ,QAAQ,MAAM;AAAA,EAE/F,SAAS,QAAQ,CAAC,OAA4B;AAAA,IAC5C,YAAY,KAAK,QAAQ,SAAS;AAAA,MAChC,IAAI,UAAU,OAAO,GAAG;AAAA,QAAG,OAAO;AAAA,IACpC;AAAA,IACA,MAAM,IAAI,MAAM,sBAAsB;AAAA;AAAA,EAGxC,OAAO,mBAAmB,EAAE,SAAS,CAAC;AAAA;AAaxC,SAAS,iBAAiB,CAAC,KAA4B;AAAA,EACrD,OAAO,eAAe,SAAS,IAAI,gBAAgB,SAAS,IAAI,SAAS;AAAA;AAapE,SAAS,iBAAiB,IAAI,gBAAkD;AAAA,EACrF,IAAI,eAAe,WAAW,GAAG;AAAA,IAC/B,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EAEA,OAAO,eAAe,YAAY,CAAC,SAAwC;AAAA,IACzE,IAAI,YAA0B;AAAA,IAC9B,WAAW,UAAU,gBAAgB;AAAA,MACnC,IAAI;AAAA,QACF,OAAO,MAAM,OAAO,OAAO;AAAA,QAC3B,OAAO,KAAK;AAAA,QACZ,IAAI,kBAAkB,GAAG,GAAG;AAAA,UAC1B,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,IAEV;AAAA,IACA,MAAM,QAAQ,IAAI,MAAM,uCAAuC;AAAA,IAC/D,IAAI;AAAA,MAAW,MAAM,QAAQ;AAAA,IAC7B,MAAM;AAAA;AAAA;;ACrGV;AACA,mBAAS;;;ACDT,wBAAS;AAIF,IAAK;AAAA,CAAL,CAAK,gBAAL;AAAA,EACL,uBAAQ;AAAA,EACR,wBAAS;AAAA,GAFC;AAAA;AAgGL,MAAM,gBAAuC;AAAA,EAC1C,WAA2B,CAAC;AAAA,EAC5B,gBAA+B;AAAA,EAC/B,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EAET,WAAW,CACT,cACA,eAAe,MACf,WAAW,IACX,YAA2B,MAC3B,aACA;AAAA,IACA,KAAK,gBAAgB;AAAA,IACrB,KAAK,gBAAgB;AAAA,IACrB,KAAK,YAAY;AAAA,IACjB,KAAK,aAAa;AAAA,IAClB,KAAK,OAAO,eAAe,YAAY,UAAU;AAAA;AAAA,MAG/C,YAAY,GAAW;AAAA,IACzB,OAAO,KAAK;AAAA;AAAA,MAGV,QAAQ,GAAY;AAAA,IACtB,OAAO,KAAK;AAAA;AAAA,MAGV,OAAO,GAAmB;AAAA,IAC5B,OAAO,KAAK;AAAA;AAAA,EAOd,IAAI,CAAC,gBAAqD,UAAsC;AAAA,IAC9F,IAAI;AAAA,IACJ,IAAI,0BAA0B,cAAa;AAAA,MACzC,QAAQ;AAAA,IACV,EAAO;AAAA,MACL,MAAM,UAAU,YAAY,KAAK,eAAe,cAAc;AAAA,MAC9D,QAAQ,sBAAsB,SAAS,KAAK,aAAa;AAAA;AAAA,IAE3D,IAAI,KAAK,kBAAkB,MAAM;AAAA,MAC/B,MAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAAA,IACA,KAAK,gBAAgB,KAAK,SAAS;AAAA,IACnC,KAAK,SAAS,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA;AAAA,EAIxC,OAAO,CAAC,QAAmC;AAAA,IACzC,MAAM,UAAiC,CAAC;AAAA,IACxC,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,MACjD,QAAQ,OAAO,CAAC,KAAK;AAAA,IACvB;AAAA,IACA,KAAK,KAAK,OAAO;AAAA;AAAA,EAInB,MAAM,GAAS;AAAA,IACb,IAAI,CAAC,KAAK,eAAe;AAAA,MACvB,MAAM,IAAI,MACR,kDAAkD,4DACpD;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AAAA;AAAA,EAInB,SAAS,CAAC,OAAe,SAAiB,OAAsC;AAAA,IAC9E,MAAM,QAAQ,cAAc,KAAK,eAAe,OAAO,SAAS,OAAO,KAAK,WAAW,KAAK,UAAU;AAAA,IACtG,KAAK,SAAS,KAAK,EAAE,MAAM,CAAC;AAAA;AAEhC;;;AD7KA;;;AENA,wBAAS,mCAAa,8BAAmB;;;ACAzC;AAAA,YACE;AAAA,UACA;AAAA,WACA;AAAA,cACA;AAAA,iBACA;AAAA,YACA;AAAA,YACA;AAAA,UACA;AAAA,qBACA;AAAA;;;ACTF,oCAAS;AAmBF,SAAS,eAAe,CAAC,QAA4B;AAAA,EAI1D,MAAM,SAAS,IAAI;AAAA,EACnB,OAAO,MAAM,WAAW,MAAM;AAAA,EAC9B,OAAO,MAAM;AAAA,EACb,OAAO,OAAO,aAAa,IAAI;AAAA;;;ADD1B,IAAM,kBAAkB,IAAI,QAAO;AAAA,EACxC,IAAI,OAAM,QAAQ,IAAI,OAAQ,KAAK;AAAA,EACnC,IAAI,OAAM,eAAe,IAAI,OAAQ,KAAK;AAAA,EAC1C,IAAI,OAAM,OAAO,IAAI,OAAQ,IAAI;AAAA,EACjC,IAAI,OAAM,cAAc,IAAI,OAAQ,KAAK;AAAA,EACzC,IAAI,OAAM,qBAAqB,IAAI,SAAU,KAAK;AAAA,EAClD,IAAI,OAAM,qBAAqB,IAAI,SAAU,KAAK;AAAA,EAClD,IAAI,OAAM,oBAAoB,IAAI,OAAQ,IAAI;AAAA,EAC9C,IAAI,OAAM,uBAAuB,IAAI,OAAQ,IAAI;AAAA,EACjD,IAAI,OAAM,cAAc,IAAI,OAAQ,KAAK;AAAA,EACzC,IAAI,OAAM,qBAAqB,IAAI,SAAU,IAAI;AAAA,EACjD,IAAI,OAAM,eAAe,IAAI,OAAQ,IAAI;AAAA,EACzC,IAAI,OAAM,mBAAmB,IAAI,OAAQ,IAAI;AAC/C,CAAC;AAKM,SAAS,kBAAkB,CAChC,cACA,SACA,UACuD;AAAA,EAEvD,MAAM,gBAAgB,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,cAAc,CAAC,CAAC;AAAA,EAElF,MAAM,QAA2B,CAAC;AAAA,EAClC,MAAM,cAAiC,CAAC;AAAA,EACxC,MAAM,OAA0B,CAAC;AAAA,EACjC,MAAM,aAAwB,CAAC;AAAA,EAC/B,MAAM,gBAAuC,CAAC;AAAA,EAC9C,MAAM,gBAAuC,CAAC;AAAA,EAC9C,MAAM,kBAAqC,CAAC;AAAA,EAC5C,MAAM,qBAAwC,CAAC;AAAA,EAC/C,MAAM,aAAwB,CAAC;AAAA,EAC/B,MAAM,gBAAuC,CAAC;AAAA,EAC9C,MAAM,cAAkC,CAAC;AAAA,EACzC,MAAM,iBAAoC,CAAC;AAAA,EAE3C,YAAY,MAAM,WAAW,eAAe;AAAA,IAC1C,MAAM,KAAK,IAAI;AAAA,IACf,YAAY,KAAK,OAAO,IAAI;AAAA,IAC5B,KAAK,KAAK,OAAO,OAAO,IAAI;AAAA,IAG5B,MAAM,YAAY,OAAO,SAAS,WAAW,OAAO,aAAa,OAAO,SAAS;AAAA,IACjF,WAAW,KAAK,SAAS;AAAA,IAEzB,cAAc,KAAK,gBAAgB,OAAO,YAAY,CAAC;AAAA,IACvD,cAAc,KAAK,gBAAgB,OAAO,YAAY,CAAC;AAAA,IAGvD,IAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAAA,MAClE,gBAAgB,KAAK,KAAK,UAAU,OAAO,UAAU,CAAC;AAAA,IACxD,EAAO;AAAA,MACL,gBAAgB,KAAK,IAAI;AAAA;AAAA,IAI3B,IAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AAAA,MAC9D,MAAM,OAA4B,CAAC;AAAA,MACnC,YAAY,GAAG,MAAM,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAAA,QACpD,IAAI,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW;AAAA,UAC1F,KAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,MACA,mBAAmB,KAAK,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,IACpF,EAAO;AAAA,MACL,mBAAmB,KAAK,IAAI;AAAA;AAAA,IAG9B,WAAW,KAAK,CAAC,CAAC,OAAO,YAAY;AAAA,IACrC,cAAc,KAAK,OAAO,eAAe,gBAAgB,OAAO,YAAY,IAAI,IAAI;AAAA,IAGpF,IAAI,OAAO,YAAY;AAAA,MACrB,YAAY,KAAK,IAAI;AAAA,IACvB,EAAO,SAAI,OAAO,YAAY;AAAA,MAC5B,YAAY,KAAK,KAAK;AAAA,IACxB,EAAO;AAAA,MACL,YAAY,KAAK,IAAI;AAAA;AAAA,IAIvB,eAAe,KAAK,IAAI;AAAA,EAC1B;AAAA,EAGA,MAAM,UAAU,iBAAgB,OAAO,IAAI,KAAM;AAAA,EACjD,MAAM,gBAAgB,iBAAgB,aAAa,IAAI,KAAM;AAAA,EAC7D,MAAM,SAAS,iBAAgB,MAAM,IAAI,KAAM;AAAA,EAC/C,MAAM,eAAe,iBAAgB,YAAY,IAAI,KAAM;AAAA,EAC3D,MAAM,kBAAkB,iBAAgB,eAAe,IAAI,OAAQ;AAAA,EACnE,MAAM,kBAAkB,iBAAgB,eAAe,IAAI,OAAQ;AAAA,EACnE,MAAM,gBAAgB,iBAAgB,iBAAiB,IAAI,KAAM;AAAA,EACjE,MAAM,mBAAmB,iBAAgB,oBAAoB,IAAI,KAAM;AAAA,EACvE,MAAM,eAAe,iBAAgB,YAAY,IAAI,KAAM;AAAA,EAC3D,MAAM,kBAAkB,iBAAgB,eAAe,IAAI,OAAQ;AAAA,EACnE,MAAM,gBAAgB,iBAAgB,aAAa,IAAI,KAAM;AAAA,EAC7D,MAAM,eAAe,iBAAgB,gBAAgB,IAAI,KAAM;AAAA,EAE/D,MAAM,WAAW;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,gBAAgB,KAAK;AAAA,IACrB,gBAAgB,KAAK;AAAA,IACrB,cAAc,KAAK;AAAA,IACnB,iBAAiB,KAAK;AAAA,IACtB,aAAa,KAAK;AAAA,IAClB,gBAAgB,KAAK;AAAA,IACrB,cAAc,KAAK;AAAA,IACnB,aAAa,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,aAAa,IAAI,QAAO,gBAAgB,MAAM;AAAA,EACpD,MAAM,OAAO,UAAS;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ,cAAc;AAAA,IACtB;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EAGD,MAAM,WAAW,IAAI;AAAA,EACrB,SAAS,IAAI,mBAAmB,YAAY;AAAA,EAC5C,SAAS,IAAI,qBAAqB,eAAe;AAAA,EACjD,SAAS,IAAI,sBAAsB,gBAAgB;AAAA,EACnD,SAAS,IAAI,eAAe,QAAQ;AAAA,EAEpC,MAAM,QAAQ,IAAI,aAAY,iBAAiB,MAAM,QAAQ;AAAA,EAE7D,OAAO,EAAE,OAAO,SAAS;AAAA;;;AE9J3B,qBAAS;AAiBF,SAAS,YAAY,CAAC,QAAgB,OAAmC;AAAA,EAC9E,MAAM,WAAgC,MAAM,YAAY,IAAI;AAAA,EAE5D,MAAM,aAAa,SAAS,IAAI,cAAc;AAAA,EAC9C,IAAI,eAAe,WAAW;AAAA,IAC5B,MAAM,IAAI,SACR,iBACA,gEACE,2FACA,2CACF,EACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,SAAS,IAAI,mBAAmB;AAAA,EAChD,IAAI,YAAY,WAAW;AAAA,IACzB,MAAM,IAAI,aACR,yEACE,+DAA+D,mBACnE;AAAA,EACF;AAAA,EACA,IAAI,YAAY,iBAAiB;AAAA,IAC/B,MAAM,IAAI,aACR,gCAAgC,uBAAuB,uBACrD,+DAA+D,mBACnE;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAS,IAAI,cAAc,KAAK;AAAA,EAGlD,MAAM,SAA8B,CAAC;AAAA,EACrC,IAAI,OAAO,OAAO,SAAS,KAAK,MAAM,YAAY,GAAG;AAAA,IACnD,MAAM,IAAI,SACR,iBACA,wCAAwC,MAAM,cAC5C,gFACF,EACF;AAAA,EACF;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAAA,IAC7C,MAAM,QAAQ,OAAO,OAAO;AAAA,IAE5B,IAAI,UAAS,MAAM,MAAM,IAAI,GAAG;AAAA,MAC9B,OAAO,MAAM,QAAQ,MAAM,WAAW,CAAC,EAAG,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC;AAAA,IAEtC,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,IAAI,SAAS,OAAO,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,gBAAgB,GAAG;AAAA,QACxF,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,OAAO,MAAM,QAAQ;AAAA,EACvB;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf;AAAA;;;AClFF,wCAAqB;AAErB,IAAM,gBAAgB;AACtB,IAAM,WAAW;AAEjB,IAAM,gBAAgB,IAAI,IAAI,KAAK;AAa5B,SAAS,cAAc,CAC5B,YACA,aACA,kBACA,YACA,WACQ;AAAA,EACR,MAAM,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,EAErD,MAAM,aAAa,IAAI,IAAI,IAAI,WAAW,SAAS,IAAI,YAAY,SAAS,IAAI,iBAAiB;AAAA,EACjG,MAAM,MAAM,OAAO,MAAM,UAAU;AAAA,EACnC,IAAI,SAAS;AAAA,EAGb,IAAI,WAAW,eAAe,MAAM;AAAA,EACpC,UAAU;AAAA,EAGV,IAAI,iBAAiB,OAAO,GAAG,GAAG,MAAM;AAAA,EACxC,UAAU;AAAA,EAGV,IAAI,cAAc,WAAW,QAAQ,MAAM;AAAA,EAC3C,UAAU;AAAA,EACV,IAAI,IAAI,YAAY,MAAM;AAAA,EAC1B,UAAU,WAAW;AAAA,EAGrB,IAAI,cAAc,YAAY,QAAQ,MAAM;AAAA,EAC5C,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAGtB,IAAI,cAAc,iBAAiB,QAAQ,MAAM;AAAA,EACjD,UAAU;AAAA,EACV,IAAI,IAAI,kBAAkB,MAAM;AAAA,EAChC,UAAU,iBAAiB;AAAA,EAG3B,MAAM,MAAM,WAAW,UAAU,UAAU,EAAE,OAAO,GAAG,EAAE,OAAO;AAAA,EAChE,MAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,GAAG,CAAC;AAAA,EAEtC,OAAO,MAAM,SAAS,QAAQ;AAAA;AAczB,SAAS,gBAAgB,CAAC,aAAqB,YAAwB,UAAiC;AAAA,EAC7G,MAAM,QAAQ,OAAO,KAAK,aAAa,QAAQ;AAAA,EAE/C,IAAI,MAAM,SAAS,eAAe;AAAA,IAChC,MAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAAA,EAGA,MAAM,UAAU,MAAM,SAAS,GAAG,MAAM,SAAS,QAAQ;AAAA,EACzD,MAAM,cAAc,MAAM,SAAS,MAAM,SAAS,QAAQ;AAAA,EAG1D,MAAM,cAAc,WAAW,UAAU,UAAU,EAAE,OAAO,OAAO,EAAE,OAAO;AAAA,EAC5E,IAAI,CAAC,iBAAgB,aAAa,WAAW,GAAG;AAAA,IAC9C,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EAEA,IAAI,SAAS;AAAA,EAGb,MAAM,UAAU,QAAQ,UAAU,MAAM;AAAA,EACxC,UAAU;AAAA,EACV,IAAI,YAAY,eAAe;AAAA,IAC7B,MAAM,IAAI,MAAM,oCAAoC,SAAS;AAAA,EAC/D;AAAA,EAGA,MAAM,YAAY,OAAO,QAAQ,gBAAgB,MAAM,CAAC;AAAA,EACxD,UAAU;AAAA,EAGV,IAAI,WAAW,GAAG;AAAA,IAChB,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA,IACxC,IAAI,MAAM,YAAY,UAAU;AAAA,MAC9B,MAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AAAA,EACF;AAAA,EAGA,MAAM,WAAW,QAAQ,aAAa,MAAM;AAAA,EAC5C,UAAU;AAAA,EACV,IAAI,SAAS,WAAW,QAAQ,QAAQ;AAAA,IACtC,MAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAAA,EACA,MAAM,aAAa,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AAAA,EAC1D,UAAU;AAAA,EAGV,MAAM,YAAY,QAAQ,aAAa,MAAM;AAAA,EAC7C,UAAU;AAAA,EACV,IAAI,SAAS,YAAY,QAAQ,QAAQ;AAAA,IACvC,MAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAAA,EACA,MAAM,cAAc,QAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA,EAC5D,UAAU;AAAA,EAGV,MAAM,iBAAiB,QAAQ,aAAa,MAAM;AAAA,EAClD,UAAU;AAAA,EACV,IAAI,SAAS,iBAAiB,QAAQ,QAAQ;AAAA,IAC5C,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,MAAM,mBAAmB,QAAQ,MAAM,QAAQ,SAAS,cAAc;AAAA,EAEtE,OAAO,EAAE,YAAY,aAAa,kBAAkB,UAAU;AAAA;;;AJ5HhE,eAAe,kBAAiB,CAAC,OAAoC;AAAA,EACnE,MAAM,SAAS,MAAM,mBAAkB,KAAK,KAAK;AAAA,EACjD,MAAM,OAAO,KAAK;AAAA,EAClB,OAAO,OAAO;AAAA;AAGhB,IAAM,eAAe,IAAI,QAAO,CAAC,CAAC;AAa3B,SAAS,oBAAoB,CAClC,cACA,SACA,UACU;AAAA,EACV,QAAQ,UAAU,mBAAmB,cAAc,SAAS,QAAQ;AAAA,EACpE,MAAM,OAAO,mBAAmB,iBAAiB,CAAC,KAAK,CAAC;AAAA,EACxD,OAAO,cAAc,IAAI;AAAA;AAI3B,eAAsB,iBAAiB,CACrC,QACA,MACA,KACmB;AAAA,EACnB,MAAM,SAAS,OAAO;AAAA,EACtB,QAAQ,QAAQ,WAAW,OAAO,aAAa,MAAM,oBAAoB,IAAI;AAAA,EAC7E,MAAM,SAAS,aAAa,WAAW,QAAQ;AAAA,EAE/C,IAAI,OAAO,eAAe,OAAO,MAAM;AAAA,IACrC,MAAM,IAAI,aAAa,2BAA2B,OAAO,mCAAmC,OAAO,SAAS,GAAG;AAAA,EACjH;AAAA,EAEA,MAAM,MAAM,IAAI,gBAAgB,QAAQ,MAAM,IAAI,UAAU,OAAO,WAAW,IAAI,WAAW;AAAA,EAE7F,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,OAAO,QAAS,OAAO,QAAQ,GAAG;AAAA,IACvD,IAAI,cAAc,iBAAiB,QAAQ,QAAQ,IAAI,UAAU,OAAO,SAAS;AAAA,IACjF,IAAI,IAAI,kBAAkB;AAAA,MACxB,cAAc,MAAM,sBAAsB,aAAa,IAAI,gBAAgB;AAAA,IAC7E;AAAA,IACA,MAAM,UAAU,CAAC,GAAG,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,WAAW;AAAA,IAChE,OAAO,cAAc,mBAAmB,QAAQ,OAAO,CAAC;AAAA,IACxD,OAAO,OAAY;AAAA,IACnB,MAAM,WAAW,gBAAgB,QAAQ,OAAO,IAAI,UAAU,OAAO,SAAS;AAAA,IAC9E,MAAM,WAAW,cAAc,mBAAmB,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG;AAAA,IAEzE,SAAiB,kBAAkB;AAAA,IACpC,OAAO;AAAA;AAAA;AAKX,eAAsB,sBAAsB,CAC1C,QACA,MACA,KACmB;AAAA,EACnB,MAAM,aAAa,CAAC,CAAC,OAAO;AAAA,EAC5B,MAAM,eAAe,OAAO;AAAA,EAC5B,MAAM,cAAc,OAAO,eAAe;AAAA,EAE1C,QAAQ,QAAQ,WAAW,OAAO,aAAa,MAAM,oBAAoB,IAAI;AAAA,EAC7E,MAAM,SAAS,aAAa,WAAW,QAAQ;AAAA,EAE/C,IAAI,OAAO,eAAe,OAAO,MAAM;AAAA,IACrC,MAAM,IAAI,aAAa,2BAA2B,OAAO,mCAAmC,OAAO,SAAS,GAAG;AAAA,EACjH;AAAA,EAGA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,IAAI,YAAY;AAAA,MACd,QAAQ,MAAM,OAAO,aAAc,OAAO,MAAM;AAAA,IAClD,EAAO;AAAA,MACL,QAAQ,MAAM,OAAO,aAAc,OAAO,MAAM;AAAA;AAAA,IAElD,OAAO,OAAY;AAAA,IACnB,MAAM,YAAY,OAAO,gBAAgB;AAAA,IACzC,MAAM,WAAW,gBAAgB,WAAW,OAAO,IAAI,UAAU,OAAO,SAAS;AAAA,IACjF,MAAM,WAAW,cAAc,mBAAmB,WAAW,CAAC,QAAQ,CAAC,GAAG,GAAG;AAAA,IAC5E,SAAiB,kBAAkB;AAAA,IACpC,OAAO;AAAA;AAAA,EAIT,MAAM,uBAAuB,OAAO,kBAAkB;AAAA,EACtD,MAAM,oBAAoB,OAAO,gBAAgB;AAAA,EAGjD,IAAI,cAAiC;AAAA,EACrC,IAAI,OAAO,gBAAgB,OAAO,YAAY;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,YAAY,IAAI,gBAAgB,OAAO,cAAc,MAAM,IAAI,UAAU,OAAO,WAAW,IAAI,WAAW;AAAA,MAChH,MAAM,eAAe,OAAO,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,MACtE,MAAM,cAAc,iBAAiB,OAAO,cAAc,cAAc,IAAI,UAAU,OAAO,SAAS;AAAA,MACtG,MAAM,gBAAgB,CAAC,GAAG,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,WAAW;AAAA,MAC5E,cAAc,mBAAmB,OAAO,cAAc,aAAa;AAAA,MACnE,OAAO,OAAY;AAAA,MACnB,MAAM,WAAW,gBAAgB,OAAO,cAAc,OAAO,IAAI,UAAU,OAAO,SAAS;AAAA,MAC3F,MAAM,WAAW,cAAc,mBAAmB,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,GAAG;AAAA,MACtF,SAAiB,kBAAkB;AAAA,MACpC,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,IAAI,mBAAmB;AAAA,IAIrB,OAAO,sBAAsB,QAAQ,OAAO,sBAAsB,aAAa,KAAK,OAAO,WAAW,WAAW;AAAA,EACnH,EAAO;AAAA,IAEL,MAAM,aAAa,IAAI,gBAAgB,UAAU,KAAK;AAAA,IACtD,MAAM,cAAc,gBAAgB,oBAAoB;AAAA,IACxD,MAAM,mBAAmB,gBAAgB,WAAW;AAAA,IACpD,MAAM,QAAQ,eAAe,YAAY,aAAa,kBAAkB,IAAI,UAAU;AAAA,IAEtF,MAAM,YAAY,IAAI;AAAA,IACtB,UAAU,IAAI,WAAW,KAAK;AAAA,IAC9B,MAAM,aAAa,gBAAgB,sBAAsB,SAAS;AAAA,IAClE,MAAM,mBAAmB,mBAAmB,sBAAsB,CAAC,UAAU,CAAC;AAAA,IAE9E,IAAI;AAAA,IACJ,IAAI,aAAa;AAAA,MACf,eAAe,YAAY,aAAa,gBAAgB;AAAA,IAC1D,EAAO;AAAA,MACL,eAAe;AAAA;AAAA,IAGjB,OAAO,cAAc,YAAY;AAAA;AAAA;AAKrC,eAAsB,0BAA0B,CAC9C,QACA,MACA,KACmB;AAAA,EACnB,MAAM,aAAa,CAAC,CAAC,OAAO;AAAA,EAE5B,QAAQ,OAAO,aAAa,MAAM,oBAAoB,IAAI;AAAA,EAG1D,MAAM,cAAc,SAAS,UAAU,IAAI,SAAS;AAAA,EACpD,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,IAAI,aAAa,2CAA2C,GAAG;AAAA,EACvE;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,iBAAiB,aAAa,IAAI,YAAY,IAAI,QAAQ;AAAA,IACrE,OAAO,OAAY;AAAA,IACnB,MAAM,IAAI,aAAa,wBAAwB,MAAM,WAAW,GAAG;AAAA;AAAA,EAGrE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,IAAI,gBAAgB,YAAY,SAAS,UAAU;AAAA,IAC3D,OAAO,OAAY;AAAA,IACnB,QAAQ,MAAM,yDAAyD,MAAM,OAAO;AAAA,IACpF,MAAM,IAAI,aAAa,iCAAiC,MAAM,WAAW,GAAG;AAAA;AAAA,EAK9E,IAAI;AAAA,EACJ,IAAI,SAAS,YAAY,SAAS,GAAG;AAAA,IACnC,eAAe,MAAM,mBAAkB,SAAS,WAAW;AAAA,EAC7D,EAAO;AAAA,IACL,eAAe,OAAO,kBAAkB,OAAO;AAAA;AAAA,EAEjD,IAAI;AAAA,EACJ,IAAI,SAAS,iBAAiB,SAAS,GAAG;AAAA,IACxC,cAAc,MAAM,mBAAkB,SAAS,gBAAgB;AAAA,EACjE,EAAO;AAAA,IACL,cAAc,OAAO,eAAe;AAAA;AAAA,EAEtC,MAAM,oBAAoB,OAAO,gBAAgB;AAAA,EACjD,IAAI,QAAQ,IAAI;AAAA,IACd,QAAQ,MACN,uCAAuC,OAAO,0BAA0B,+BAA+B,OAAO,KAAK,SAAS,CAAC,CAAC,GAChI;AAAA,EAEF,IAAI,mBAAmB;AAAA,IAGrB,OAAO,sBAAsB,QAAQ,OAAO,cAAc,aAAa,KAAK,MAAM,IAAI;AAAA,EACxF,EAAO;AAAA,IAIL,MAAM,MAAM,IAAI,gBAAgB,cAAc,mBAAmB,IAAI,UAAU,MAAM,IAAI,WAAW;AAAA,IAGpG,MAAM,iBAAiB,qBAAqB,UAAU,WAAW;AAAA,IAEjE,IAAI;AAAA,MACF,IAAI,OAAO,YAAY;AAAA,QACrB,MAAM,OAAO,WAAW,OAAO,gBAAgB,GAAG;AAAA,MACpD,EAAO;AAAA,QACL,MAAM,OAAO,WAAY,OAAO,GAAG;AAAA;AAAA,MAErC,OAAO,OAAY;AAAA,MACnB,IAAI,QAAQ,IAAI;AAAA,QACd,QAAQ,MACN,wDACA,MAAM,SACN,MAAM,OAAO,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK;AAAA,CAAI,CAChD;AAAA,MACF,MAAM,WAAW,gBAAgB,cAAc,OAAO,IAAI,UAAU,IAAI;AAAA,MACxE,MAAM,WAAW,cAAc,mBAAmB,cAAc,CAAC,QAAQ,CAAC,GAAG,GAAG;AAAA,MAC/E,SAAiB,kBAAkB;AAAA,MACpC,OAAO;AAAA;AAAA,IAIT,MAAM,UAAyB,CAAC;AAAA,IAEhC,IAAI,IAAI,UAAU;AAAA,MAGhB,WAAW,WAAW,IAAI,SAAS;AAAA,QACjC,QAAQ,KAAK,QAAQ,KAAK;AAAA,MAC5B;AAAA,IACF,EAAO;AAAA,MAEL,MAAM,aAAa,IAAI,gBAAgB,UAAU,KAAK;AAAA,MACtD,MAAM,cAAc,gBAAgB,YAAY;AAAA,MAChD,MAAM,mBAAmB,gBAAgB,WAAW;AAAA,MACpD,MAAM,QAAQ,eAAe,YAAY,aAAa,kBAAkB,IAAI,UAAU;AAAA,MAEtF,WAAW,WAAW,IAAI,SAAS;AAAA,QACjC,MAAM,QAAQ,QAAQ;AAAA,QACtB,IAAI,MAAM,UAAU,GAAG;AAAA,UACrB,MAAM,aAAa,IAAI,IAAoB,MAAM,YAAY,CAAC,CAAC;AAAA,UAC/D,WAAW,IAAI,WAAW,KAAK;AAAA,UAC/B,QAAQ,KAAK,IAAI,aAAY,MAAM,QAAQ,MAAM,MAAM,UAAU,CAAC;AAAA,QACpE,EAAO;AAAA,UACL,QAAQ,KAAK,KAAK;AAAA;AAAA,MAEtB;AAAA,MAKA,IAAI,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,SAAS,CAAC,GAAG;AAAA,QACpD,MAAM,YAAY,IAAI;AAAA,QACtB,UAAU,IAAI,WAAW,KAAK;AAAA,QAC9B,QAAQ,KAAK,gBAAgB,cAAc,SAAS,CAAC;AAAA,MACvD;AAAA;AAAA,IAGF,OAAO,cAAc,mBAAmB,cAAc,OAAO,CAAC;AAAA;AAAA;AAKlE,eAAe,qBAAqB,CAClC,QACA,OACA,cACA,aACA,KACA,WACA,aACmB;AAAA,EACnB,MAAM,aAA4B,CAAC;AAAA,EACnC,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,iBAAiB;AAAA,EACrB,IAAI;AAAA,EAEJ,OAAO,MAAM;AAAA,IACX,MAAM,MAAM,IAAI,gBAAgB,cAAc,MAAM,IAAI,UAAU,WAAW,IAAI,WAAW;AAAA,IAE5F,IAAI;AAAA,MACF,IAAI,OAAO,YAAY;AAAA,QACrB,MAAM,OAAO,WAAW,OAAO,GAAG;AAAA,MACpC,EAAO;AAAA,QAKL,MAAM,YAAY,gBAAgB,WAAW;AAAA,QAC7C,MAAM,OAAO,WAAY,OAAO,WAAW,GAAG;AAAA;AAAA,MAEhD,OAAO,OAAY;AAAA,MACnB,IAAI,QAAQ,IAAI;AAAA,QACd,QAAQ,MAAM,kCAAkC,MAAM,SAAS,MAAM,OAAO,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK;AAAA,CAAI,CAAC;AAAA,MAChH,WAAW,KAAK,gBAAgB,cAAc,OAAO,IAAI,UAAU,SAAS,CAAC;AAAA,MAC7E,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACxE;AAAA;AAAA,IAGF,WAAW,WAAW,IAAI,SAAS;AAAA,MACjC,WAAW,KAAK,QAAQ,KAAK;AAAA,MAC7B,IAAI,YAAY,MAAM;AAAA,QACpB,kBAAkB,QAAQ,MAAM,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,IAAI,IAAI,UAAU;AAAA,MAChB;AAAA,IACF;AAAA,IAGA,IAAI,YAAY,QAAQ,kBAAkB,UAAU;AAAA,MAClD,MAAM,aAAa,IAAI,gBAAgB,UAAU,KAAK;AAAA,MACtD,MAAM,cAAc,gBAAgB,YAAY;AAAA,MAChD,MAAM,mBAAmB,gBAAgB,WAAW;AAAA,MACpD,MAAM,QAAQ,eAAe,YAAY,aAAa,kBAAkB,IAAI,UAAU;AAAA,MACtF,MAAM,YAAY,IAAI;AAAA,MACtB,UAAU,IAAI,WAAW,KAAK;AAAA,MAC9B,WAAW,KAAK,gBAAgB,cAAc,SAAS,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,mBAAmB,cAAc,UAAU;AAAA,EAC7D,IAAI;AAAA,EACJ,IAAI,aAAa;AAAA,IACf,eAAe,YAAY,aAAa,SAAS;AAAA,EACnD,EAAO;AAAA,IACL,eAAe;AAAA;AAAA,EAEjB,MAAM,WAAW,cAAc,YAAY;AAAA,EAC3C,IAAI,eAAe;AAAA,IAChB,SAAiB,kBAAkB;AAAA,EACtC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,IAAI,QAAkC;AAAA,EACxD,MAAM,WAAW,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAAA,EAC5D,MAAM,SAAS,IAAI,WAAW,QAAQ;AAAA,EACtC,IAAI,SAAS;AAAA,EACb,WAAW,OAAO,QAAQ;AAAA,IACxB,OAAO,IAAI,KAAK,MAAM;AAAA,IACtB,UAAU,IAAI;AAAA,EAChB;AAAA,EACA,OAAO;AAAA;;;AKvWT,IAAM,WAAW;AAEjB,IAAM,QAAQ;AAAA;AAAA;AAId,SAAS,UAAU,CAAC,GAAmB;AAAA,EACrC,OAAO,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AAAA;AAGpG,SAAS,iBAAiB,CAAC,MAA2D;AAAA,EACpF,MAAM,KAAK,KAAK;AAAA,EAEhB,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EACrB,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA,EACtB,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA,EACtB,IAAI,OAAO;AAAA,IAAI,OAAO;AAAA,EACtB,OAAO,KAAK,SAAS;AAAA;AAOhB,SAAS,gBAAgB,CAC9B,cACA,UACA,cACA,SACQ;AAAA,EACR,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,cAAc;AAAA,IAChB,MAAM,KAAK,4BAA4B,WAAW,YAAY,yBAAyB;AAAA,EACzF;AAAA,EACA,IAAI,SAAS;AAAA,IACX,MAAM,KAAK,YAAY,WAAW,OAAO,0BAA0B;AAAA,EACrE;AAAA,EACA,MAAM,KAAK,gFAAgF;AAAA,EAE3F,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKA,WAAW,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cA8BY;AAAA;AAAA,MAER,WAAW,YAAY;AAAA,qFACwD,WAAW,QAAQ;AAAA;AAAA;AAAA,EAGtG,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaV,SAAS,iBAAiB,CAAC,QAAgB,cAA8B;AAAA,EAC9E,MAAM,eAAe,eAAe,aAAa,WAAW,YAAY,gBAAgB;AAAA,EACxF,MAAM,gBAAgB,UAAU;AAAA,EAChC,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAmBK;AAAA;AAAA;AAAA,oDAGsC;AAAA,2CACT,WAAW,aAAa;AAAA;AAAA;AAAA;AAAA;AAUnE,SAAS,eAAe,CAAC,QAAkC;AAAA,EACzD,MAAM,OAAO,WAAW,OAAO,IAAI;AAAA,EACnC,MAAM,UAAU,OAAO,SAAS;AAAA,EAChC,MAAM,YAAY,CAAC,CAAC,OAAO;AAAA,EAG3B,MAAM,SAAmB,CAAC;AAAA,EAC1B,OAAO,KACL,UAAU,iDAAiD,gDAC7D;AAAA,EACA,IAAI;AAAA,IAAW,OAAO,KAAK,gDAAgD;AAAA,EAG3E,IAAI,aAAa;AAAA,EACjB,MAAM,eAAe,OAAO;AAAA,EAC5B,IAAI,aAAa,OAAO,SAAS,GAAG;AAAA,IAClC,MAAM,OAAO,aAAa,OAAO,IAAI,CAAC,MAAM;AAAA,MAC1C,MAAM,YAAY,WAAW,EAAE,IAAI;AAAA,MACnC,MAAM,YAAY,WAAW,kBAAkB,EAAE,IAAI,CAAC;AAAA,MACtD,MAAM,aACJ,OAAO,YAAY,EAAE,QAAQ,OAAO,WAAW,WAAW,KAAK,UAAU,OAAO,SAAS,EAAE,KAAK,CAAC,IAAI;AAAA,MACvG,OAAO,iBAAiB,kCAAkC,4BAA4B;AAAA,KACvF;AAAA,IACD,aAAa;AAAA;AAAA,EAEf,KAAK,KAAK;AAAA,CAAI;AAAA;AAAA,EAEd,EAAO;AAAA,IACL,aAAa;AAAA;AAAA,EAIf,IAAI,cAAc;AAAA,EAClB,IAAI,WAAW,OAAO,aAAa,OAAO,SAAS,GAAG;AAAA,IACpD,MAAM,OAAO,OAAO,aAAa,OAAO,IAAI,CAAC,MAAM;AAAA,MACjD,OAAO,iBAAiB,WAAW,EAAE,IAAI,0BAA0B,WAAW,kBAAkB,EAAE,IAAI,CAAC;AAAA,KACxG;AAAA,IACD,cAAc;AAAA;AAAA,EAEhB,KAAK,KAAK;AAAA,CAAI;AAAA;AAAA,EAEd;AAAA,EAGA,IAAI,aAAa;AAAA,EACjB,IAAI,aAAa,OAAO,gBAAgB,OAAO,aAAa,OAAO,SAAS,GAAG;AAAA,IAC7E,MAAM,OAAO,OAAO,aAAa,OAAO,IAAI,CAAC,MAAM;AAAA,MACjD,OAAO,iBAAiB,WAAW,EAAE,IAAI,0BAA0B,WAAW,kBAAkB,EAAE,IAAI,CAAC;AAAA,KACxG;AAAA,IACD,aAAa;AAAA;AAAA,EAEf,KAAK,KAAK;AAAA,CAAI;AAAA;AAAA,EAEd;AAAA,EAGA,MAAM,UAAU,OAAO,MAAM,wBAAwB,WAAW,OAAO,GAAG,UAAU;AAAA,EAEpF,OAAO;AAAA;AAAA,4BAEmB;AAAA,EAC1B,OAAO,KAAK;AAAA,CAAI;AAAA;AAAA,EAEhB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAIK,SAAS,iBAAiB,CAC/B,cACA,UACA,SACA,SACQ;AAAA,EACR,MAAM,gBAAgB,CAAC,GAAG,QAAQ,QAAQ,CAAC,EACxC,OAAO,EAAE,UAAU,SAAS,cAAc,EAC1C,KAAK,EAAE,KAAK,OAAO,EAAE,cAAc,CAAC,CAAC;AAAA,EAExC,MAAM,QAAQ,cAAc,IAAI,IAAI,YAAY,gBAAgB,MAAM,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,EAElF,MAAM,WAAW,UAAU,sBAAsB,WAAW,OAAO,kBAAkB;AAAA,EAErF,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKA,WAAW,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAiDc;AAAA;AAAA,QAER,WAAW,YAAY;AAAA;AAAA,uFAEwD,WAAW,QAAQ,WAAW;AAAA;AAAA,EAEnH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACxOK,IAAM,sBAAuC;AAAA,EAClD,SAAS,CAAC,OAAwB;AAAA,IAChC,OAAO,IAAI,YAAY,EAAE,OACvB,KAAK,UAAU,OAAO,CAAC,MAAM,UAAW,OAAO,UAAU,WAAW,cAAc,UAAU,KAAM,CACpG;AAAA;AAAA,EAEF,WAAW,CAAC,OAAwB;AAAA,IAClC,OAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK,GAAG,CAAC,MAAM,UACxD,OAAO,UAAU,YAAY,MAAM,WAAW,aAAa,IAAI,OAAO,MAAM,MAAM,EAAE,CAAC,IAAI,KAC3F;AAAA;AAEJ;;;AR9CA,IAAM,gBAAe,IAAI,QAAO,CAAC,CAAC;AAc3B,SAAS,iBAAiB,CAC/B,UACA,SACoD;AAAA,EACpD,MAAM,UAAU,SAAS,UAAU,IAAI,QAAQ,QAAQ,EAAE;AAAA,EACzD,MAAM,aAAa,SAAS,cAAc,YAAY,EAAE;AAAA,EACxD,MAAM,WAAW,SAAS,YAAY;AAAA,EACtC,MAAM,cAAc,SAAS;AAAA,EAC7B,MAAM,aAAa,SAAS,eAAe,YAAY,OAAO,QAAQ;AAAA,EACtE,MAAM,kBAAkB,SAAS;AAAA,EACjC,MAAM,yBAAyB,SAAS;AAAA,EACxC,MAAM,WAAW,SAAS,YAAY,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,EAEvF,MAAM,eAAe,SAAS;AAAA,EAC9B,MAAM,gBAAgB,SAAS;AAAA,EAE/B,MAAM,UAAU,SAAS,WAAW;AAAA,EAEpC,MAAM,mBAAmB,SAAS;AAAA,EAClC,MAAM,kBAAkB,SAAS,mBAAmB;AAAA,EACpD,MAAM,eAAe,SAAS;AAAA,EAG9B,MAAM,oBAAoB,SAAS,qBAAqB;AAAA,EACxD,MAAM,qBAAqB,SAAS,sBAAsB;AAAA,EAC1D,MAAM,qBAAqB,SAAS,sBAAsB;AAAA,EAC1D,MAAM,cAAc,SAAS,gBAAgB,SAAS;AAAA,EACtD,MAAM,UAAU,SAAS,iBAAiB;AAAA,EAG1C,MAAM,cAAc,oBAChB,iBAAiB,aAAa,UAAU,qBAAqB,GAAG,oBAAoB,MAAM,OAAO,IACjG;AAAA,EACJ,MAAM,eAAe,qBAAqB,kBAAkB,aAAa,UAAU,SAAS,OAAO,IAAI;AAAA,EACvG,MAAM,eAAe,qBAAqB,kBAAkB,QAAQ,WAAW,IAAI;AAAA,EAEnF,MAAM,mBAAmB,SAAS;AAAA,EAGlC,MAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,SAAS,cAAc,CAAC,SAAkB,YAAY,OAAa;AAAA,IACjE,IAAI,aAAa;AAAA,MACf,QAAQ,IAAI,+BAA+B,WAAW;AAAA,MACtD,QAAQ,IAAI,gCAAgC,eAAe;AAAA,MAC3D,QAAQ,IAAI,gCAAgC,6BAA6B;AAAA,MACzE,QAAQ,IAAI,iCAAiC,wDAAwD;AAAA,MACrG,IAAI,aAAa,cAAc,MAAM;AAAA,QACnC,QAAQ,IAAI,0BAA0B,OAAO,UAAU,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA;AAAA,EAGF,eAAe,kBAAkB,CAAC,UAAoB,mBAA+C;AAAA,IACnG,IAAI,oBAAoB,QAAQ,CAAC;AAAA,MAAmB,OAAO;AAAA,IAC3D,MAAM,eAAe,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,IAChE,MAAM,aAAa,aAAa,cAAc,gBAAgB;AAAA,IAC9D,MAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAAA,IAC5C,QAAQ,IAAI,oBAAoB,MAAM;AAAA,IACtC,OAAO,IAAI,SAAS,YAAmC;AAAA,MACrD,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,SAAS,iBAAiB,CAAC,OAAc,YAAoB,SAAiB,eAAwB;AAAA,IACpG,MAAM,WAAW,gBAAgB,QAAQ,OAAO,UAAU,IAAI;AAAA,IAC9D,MAAM,OAAO,mBAAmB,QAAQ,CAAC,QAAQ,CAAC;AAAA,IAClD,MAAM,OAAO,cAAc,MAAM,UAAU;AAAA,IAC3C,eAAe,KAAK,OAAO;AAAA,IAC3B,OAAO;AAAA;AAAA,EAGT,OAAO,eAAe,OAAO,CAAC,SAAqC;AAAA,IACjE,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC/B,MAAM,OAAO,IAAI;AAAA,IAGjB,IAAI,iBAAiB,SAAS,cAAc,MAAM,GAAG;AAAA,MACnD,IAAI,QAAQ,WAAW,OAAO;AAAA,QAC5B,OAAO,IAAI,SAAS,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC3D;AAAA,MACA,MAAM,QAAO,KAAK,UAAU,4BAA4B,aAAa,CAAC;AAAA,MACtE,MAAM,UAAU,IAAI,QAAQ;AAAA,QAC1B,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB,CAAC;AAAA,MACD,eAAe,OAAO;AAAA,MACtB,OAAO,IAAI,SAAS,OAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,IACpD;AAAA,IAGA,IAAI,QAAQ,WAAW,WAAW;AAAA,MAChC,IAAI,SAAS,GAAG,2BAA2B;AAAA,QACzC,MAAM,UAAU,IAAI;AAAA,QACpB,eAAe,SAAS,IAAI;AAAA,QAC5B,IAAI,mBAAmB,MAAM;AAAA,UAC3B,QAAQ,IAAI,yBAAyB,OAAO,eAAe,CAAC;AAAA,QAC9D;AAAA,QACA,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,MACpD;AAAA,MAEA,IAAI,aAAa;AAAA,QACf,MAAM,UAAU,IAAI;AAAA,QACpB,eAAe,SAAS,IAAI;AAAA,QAC5B,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,MACpD;AAAA,MAEA,OAAO,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C;AAAA,IAGA,IAAI,QAAQ,WAAW,OAAO;AAAA,MAE5B,IAAI,gBAAgB,SAAS,UAAU,SAAS,GAAG,YAAY;AAAA,QAC7D,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,2BAA2B,CAAC;AAAA,QAC1E,eAAe,OAAO;AAAA,QACtB,OAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAC3D;AAAA,MAGA,IAAI,gBAAgB,SAAS,GAAG,mBAAmB;AAAA,QACjD,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,2BAA2B,CAAC;AAAA,QAC1E,eAAe,OAAO;AAAA,QACtB,OAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAC5D;AAAA,MAGA,IAAI,cAAc;AAAA,QAChB,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,2BAA2B,CAAC;AAAA,QAC1E,eAAe,OAAO;AAAA,QACtB,OAAO,IAAI,SAAS,cAAc,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAC5D;AAAA,MAEA,OAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClD;AAAA,IAEA,IAAI,QAAQ,WAAW,QAAQ;AAAA,MAC7B,OAAO,IAAI,SAAS,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3D;AAAA,IAGA,MAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc;AAAA,IACtD,IAAI,CAAC,eAAe,CAAC,YAAY,SAAS,kBAAkB,GAAG;AAAA,MAC7D,OAAO,IAAI,SAAS,oCAAoC,sBAAsB,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC/F;AAAA,IAGA,IAAI,mBAAmB,MAAM;AAAA,MAC3B,MAAM,gBAAgB,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,MAC1D,IAAI,iBAAiB,SAAS,eAAe,EAAE,IAAI,iBAAiB;AAAA,QAClE,OAAO,IAAI,SAAS,0BAA0B,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,IAEA,MAAM,qBAAqB,QAAQ,QAAQ,IAAI,iBAAiB,KAAK,IAAI,SAAS,MAAM;AAAA,IAGxF,IAAI,OAAO,IAAI,WAAW,MAAM,QAAQ,YAAY,CAAC;AAAA,IACrD,MAAM,kBAAkB,QAAQ,QAAQ,IAAI,kBAAkB;AAAA,IAC9D,IAAI,oBAAoB,QAAQ;AAAA,MAC9B,OAAO,eAAe,IAAI;AAAA,IAC5B;AAAA,IAGA,MAAM,MAAM,KAAK,QAAQ;AAAA,IAGzB,IAAI,cAAc;AAAA,MAChB,IAAI;AAAA,QACF,IAAI,cAAc,MAAM,aAAa,OAAO;AAAA,QAC5C,OAAO,OAAY;AAAA,QACnB,MAAM,UAAU,IAAI,QAAQ,EAAE,gBAAgB,aAAa,CAAC;AAAA,QAC5D,eAAe,OAAO;AAAA,QACtB,IAAI,eAAe;AAAA,UACjB,MAAM,cAAc,IAAI,IAAI,QAAQ,GAAG;AAAA,UACvC,YAAY,WAAW,cAAc,MAAM;AAAA,UAC3C,YAAY,SAAS;AAAA,UACrB,QAAQ,IACN,oBACA,2BACE,YAAY,SAAS,GACrB,cAAc,UACd,cAAc,cACd,cAAc,oBACd,cAAc,oBACd,cAAc,sBAChB,CACF;AAAA,QACF;AAAA,QACA,OAAO,IAAI,SAAS,MAAM,WAAW,gBAAgB,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAAA;AAAA,IAEjF;AAAA,IAGA,IAAI,SAAS,GAAG,UAAU,wBAAwB;AAAA,MAChD,IAAI;AAAA,QACF,MAAM,WAAW,qBAAqB,SAAS,MAAM,SAAS,QAAQ;AAAA,QACtE,eAAe,SAAS,OAAO;AAAA,QAC/B,OAAO,mBAAmB,UAAU,iBAAiB;AAAA,QACrD,OAAO,OAAY;AAAA,QACnB,OAAO,mBAAmB,kBAAkB,OAAO,GAAG,GAAG,iBAAiB;AAAA;AAAA,IAE9E;AAAA,IAGA,IAAI,CAAC,KAAK,WAAW,GAAG,SAAS,GAAG;AAAA,MAClC,OAAO,IAAI,SAAS,aAAa,EAAE,QAAQ,IAAI,CAAC;AAAA,IAClD;AAAA,IAEA,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,CAAC;AAAA,IAC5C,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI,QAAQ,SAAS,OAAO,GAAG;AAAA,MAC7B,aAAa,QAAQ,MAAM,GAAG,EAAE;AAAA,MAChC,SAAS;AAAA,IACX,EAAO,SAAI,QAAQ,SAAS,WAAW,GAAG;AAAA,MACxC,aAAa,QAAQ,MAAM,GAAG,EAAE;AAAA,MAChC,SAAS;AAAA,IACX,EAAO;AAAA,MACL,aAAa;AAAA,MACb,SAAS;AAAA;AAAA,IAIX,MAAM,SAAS,QAAQ,IAAI,UAAU;AAAA,IACrC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK;AAAA,MAC3C,MAAM,MAAM,IAAI,MAAM,oBAAoB,oCAAoC,UAAU,KAAK,IAAI,IAAI;AAAA,MACrG,OAAO,mBAAmB,kBAAkB,KAAK,GAAG,GAAG,iBAAiB;AAAA,IAC1E;AAAA,IAEA,MAAM,aAAa,OAAO,+BAA4B,UAAU;AAAA,IAChE,MAAM,OAAqB,EAAE,QAAQ,YAAY,YAAY,UAAU,WAAW,KAAK;AAAA,IACvF,MAAM,QAAwB;AAAA,MAC5B,cAAc;AAAA,MACd,eAAe;AAAA,MACf,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IAEA,MAAM,YAAY,cAAc,gBAAgB,IAAI;AAAA,IACpD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,IAAI;AAAA,MAEJ,IAAI,WAAW,QAAQ;AAAA,QACrB,IAAI,OAAO,8BAA2B;AAAA,UACpC,MAAM,IAAI,aAAa,WAAW,sEAAsE,GAAG;AAAA,QAC7G;AAAA,QACA,WAAW,MAAM,kBAAkB,QAAQ,MAAM,GAAG;AAAA,MACtD,EAAO,SAAI,WAAW,QAAQ;AAAA,QAC5B,IAAI,OAAO,gCAA4B;AAAA,UACrC,MAAM,IAAI,aACR,WAAW,2CAA2C,UAAU,uBAChE,GACF;AAAA,QACF;AAAA,QACA,WAAW,MAAM,uBAAuB,QAAQ,MAAM,GAAG;AAAA,MAC3D,EAAO;AAAA,QACL,IAAI,OAAO,gCAA4B;AAAA,UACrC,MAAM,IAAI,aACR,WAAW,2CAA2C,UAAU,uBAChE,GACF;AAAA,QACF;AAAA,QACA,WAAW,MAAM,2BAA2B,QAAQ,MAAM,GAAG;AAAA;AAAA,MAI/D,MAAM,gBAAiB,SAAiB;AAAA,MACxC,IAAI,eAAe;AAAA,QACjB,gBAAgB,yBAAyB,QAAQ,gBAAgB,IAAI,MAAM,OAAO,aAAa,CAAC;AAAA,MAClG;AAAA,MACA,eAAe,SAAS,OAAO;AAAA,MAC/B,OAAO,mBAAmB,UAAU,iBAAiB;AAAA,MACrD,OAAO,OAAY;AAAA,MACnB,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACxE,IAAI,iBAAiB,cAAc;AAAA,QACjC,OAAO,mBAAmB,kBAAkB,OAAO,MAAM,UAAU,GAAG,iBAAiB;AAAA,MACzF;AAAA,MACA,OAAO,mBAAmB,kBAAkB,OAAO,GAAG,GAAG,iBAAiB;AAAA,cAC1E;AAAA,MACA,cAAc,cAAc,WAAW,MAAM,OAAO,aAAa;AAAA;AAAA;AAAA;;AS1UvE,IAAI;AACJ,IAAI,OAAO,cAAc,eAAe,CAAC,UAAU,WAAW,aAAa,cAAc,GAAG;AAAA,EACxF,MAAM,OAAO;AAAA,EACb,MAAM,UAAU;AAAA,EAChB,aAAa,GAAG,QAAQ;AAC5B;AACA,SAAS,eAAe,CAAC,OAAO,UAAU;AAAA,EACtC,IAAI,SAAS,MAAM;AAAA,IACf,OAAO;AAAA,EACX;AAAA,EACA,IAAI;AAAA,IACA,OAAQ,iBAAiB,YACrB,OAAO,eAAe,KAAK,EAAE,OAAO,iBAAiB,SAAS,UAAU,OAAO;AAAA,IAEvF,MAAM;AAAA,IACF,OAAO;AAAA;AAAA;AAGf,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAC7B,SAAS,cAAc,CAAC,SAAS,MAAM,OAAO;AAAA,EAC1C,MAAM,MAAM,IAAI,UAAU,SAAS,EAAE,MAAM,CAAC;AAAA,EAC5C,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EAC3B,OAAO;AAAA;AAEJ,IAAM,wBAAwB,OAAO;AACrC,IAAM,YAAY,OAAO;AACzB,IAAM,iBAAiB,OAAO;AAC9B,IAAM,cAAc,OAAO;AAC3B,IAAM,kBAAkB,OAAO;AAC/B,IAAM,aAAa,OAAO;AAC1B,IAAM,YAAY,OAAO;AAChC,IAAM,UAAU,IAAI;AACpB,IAAM,UAAU,IAAI;AACpB,SAAS,GAAG,CAAC,OAAO;AAAA,EAChB,IAAI,OAAO,UAAU,UAAU;AAAA,IAC3B,OAAO,QAAQ,OAAO,KAAK;AAAA,EAC/B;AAAA,EACA,OAAO,QAAQ,OAAO,KAAK;AAAA;AAE/B,IAAI;AACJ,IAAI,WAAW,UAAU,UAAU;AAAA,EAC/B,kBAAkB,CAAC,UAAU;AAAA,IACzB,IAAI,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,IAAI,WAAW,KAAK;AAAA,IAChC;AAAA,IACA,OAAO,MAAM,SAAS,EAAE,UAAU,aAAa,aAAa,KAAK,CAAC;AAAA;AAE1E,EACK;AAAA,EACD,MAAM,aAAa;AAAA,EACnB,kBAAkB,CAAC,UAAU;AAAA,IACzB,IAAI,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,IAAI,WAAW,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,MAAM,CAAC;AAAA,IACb,SAAS,IAAI,EAAG,IAAI,MAAM,YAAY,KAAK,YAAY;AAAA,MACnD,IAAI,KAAK,OAAO,aAAa,MAAM,MAAM,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC;AAAA,IAC/E;AAAA,IACA,OAAO,KAAK,IAAI,KAAK,EAAE,CAAC,EAAE,QAAQ,MAAM,EAAE,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA;AAAA;AAG1F,IAAI;AACJ,IAAI,WAAW,YAAY;AAAA,EACvB,kBAAkB,CAAC,UAAU;AAAA,IACzB,IAAI;AAAA,MACA,OAAO,WAAW,WAAW,OAAO,EAAE,UAAU,YAAY,CAAC;AAAA,MAEjE,OAAO,OAAO;AAAA,MACV,MAAM,eAAe,qDAAqD,uBAAuB,KAAK;AAAA;AAAA;AAGlH,EACK;AAAA,EACD,kBAAkB,CAAC,UAAU;AAAA,IACzB,IAAI;AAAA,MACA,MAAM,SAAS,KAAK,MAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MAClF,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,MAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACpC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,MAClC;AAAA,MACA,OAAO;AAAA,MAEX,OAAO,OAAO;AAAA,MACV,MAAM,eAAe,qDAAqD,uBAAuB,KAAK;AAAA;AAAA;AAAA;AAIlH,SAAS,IAAI,CAAC,OAAO;AAAA,EACjB,IAAI,OAAO,UAAU,UAAU;AAAA,IAC3B,OAAO,gBAAgB,KAAK;AAAA,EAChC;AAAA,EACA,OAAO,gBAAgB,KAAK;AAAA;AAAA;AAEzB,MAAM,kCAAkC,MAAM;AAAA,EACjD;AAAA,EACA,WAAW,CAAC,SAAS,SAAS;AAAA,IAC1B,MAAM,SAAS,OAAO;AAAA,IACtB,KAAK,OAAO,KAAK,YAAY;AAAA,IAC7B,KAAK,OAAO;AAAA,IACZ,MAAM,oBAAoB,MAAM,KAAK,WAAW;AAAA;AAExD;AAAA;AACO,MAAM,iCAAiC,MAAM;AAAA,EAChD;AAAA,EACA,WAAW,CAAC,SAAS,SAAS;AAAA,IAC1B,MAAM,SAAS,OAAO;AAAA,IACtB,KAAK,OAAO,KAAK,YAAY;AAAA,IAC7B,IAAI,SAAS,MAAM;AAAA,MACf,KAAK,OAAO,SAAS;AAAA,IACzB;AAAA,IACA,MAAM,oBAAoB,MAAM,KAAK,WAAW;AAAA;AAExD;AACA,SAAS,GAAG,CAAC,SAAS,MAAM,OAAO;AAAA,EAC/B,OAAO,IAAI,yBAAyB,SAAS,EAAE,MAAM,MAAM,CAAC;AAAA;AAEhE,eAAe,sBAAsB,CAAC,KAAK;AAAA,EACvC,IAAI;AAAA,EACJ,QAAQ,IAAI;AAAA,SACH;AAAA,MACD,aAAa;AAAA,QACT,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,QACT,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,MACX;AAAA,MACA;AAAA,SACC;AAAA,MACD,aAAa;AAAA,QACT,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,QACT,GAAG,IAAI;AAAA,MACX;AAAA,MACA;AAAA,SACC;AAAA,MACD,aAAa;AAAA,QACT,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,QACT,KAAK,IAAI;AAAA,MACb;AAAA,MACA;AAAA,SACC;AAAA,MACD,aAAa;AAAA,QACT,GAAG,IAAI;AAAA,QACP,KAAK,IAAI;AAAA,QACT,GAAG,IAAI;AAAA,MACX;AAAA,MACA;AAAA;AAAA,MAEA,MAAM,IAAI,0BAA0B,4BAA4B,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,EAEtF,OAAO,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC;AAAA;AAEtF,SAAS,eAAe,CAAC,KAAK,IAAI;AAAA,EAC9B,IAAI,EAAE,eAAe,YAAY;AAAA,IAC7B,MAAM,eAAe,GAAG,0BAA0B,oBAAoB;AAAA,EAC1E;AAAA;AAEJ,SAAS,gBAAgB,CAAC,KAAK,IAAI;AAAA,EAC/B,gBAAgB,KAAK,EAAE;AAAA,EACvB,IAAI,IAAI,SAAS,WAAW;AAAA,IACxB,MAAM,eAAe,GAAG,kCAAkC,qBAAqB;AAAA,EACnF;AAAA;AAEJ,SAAS,eAAe,CAAC,KAAK,IAAI;AAAA,EAC9B,gBAAgB,KAAK,EAAE;AAAA,EACvB,IAAI,IAAI,SAAS,UAAU;AAAA,IACvB,MAAM,eAAe,GAAG,iCAAiC,qBAAqB;AAAA,EAClF;AAAA;AAEJ,SAAS,YAAY,CAAC,OAAO;AAAA,EACzB,OAAO,MAAM,YAAY,EAAE,QAAQ,kBAAkB,EAAE;AAAA;AAE3D,SAAS,YAAY,CAAC,OAAO;AAAA,EACzB,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IACrE,OAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,cAAc,CAAC,OAAO;AAAA,EAC3B,IAAI,gBAAgB,OAAO,OAAO,GAAG;AAAA,IACjC,QAAQ,OAAO,YAAY,MAAM,QAAQ,CAAC;AAAA,EAC9C;AAAA,EACA,MAAM,UAAU,IAAI,QAAQ,SAAS,CAAC,CAAC;AAAA,EACvC,IAAI,cAAc,CAAC,QAAQ,IAAI,YAAY,GAAG;AAAA,IAC1C,QAAQ,IAAI,cAAc,UAAU;AAAA,EACxC;AAAA,EACA,IAAI,QAAQ,IAAI,eAAe,GAAG;AAAA,IAC9B,MAAM,eAAe,sEAAsE,qBAAqB;AAAA,EACpH;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,MAAM,CAAC,KAAK,OAAO;AAAA,EACxB,IAAI,UAAU,WAAW;AAAA,IACrB,IAAI,OAAO,UAAU,YAAY;AAAA,MAC7B,QAAQ,MAAM,IAAI,IAAI;AAAA,IAC1B;AAAA,IACA,IAAI,EAAE,iBAAiB,cAAc;AAAA,MACjC,MAAM,eAAe,iEAAiE,oBAAoB;AAAA,IAC9G;AAAA,IACA,OAAO;AAAA,EACX;AAAA,EACA;AAAA;AAEJ,SAAS,kBAAkB,CAAC,UAAU;AAAA,EAClC,IAAI,SAAS,SAAS,IAAI,GAAG;AAAA,IACzB,OAAO,SAAS,QAAQ,MAAM,GAAG;AAAA,EACrC;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,gBAAgB,CAAC,KAAK,WAAW,wBAAwB,OAAO;AAAA,EACrE,IAAI,IAAI,aAAa,KAAK;AAAA,IACtB,IAAI,WAAW;AAAA,EACnB,EACK;AAAA,IACD,IAAI,WAAW,mBAAmB,GAAG,aAAa,wBAAwB,IAAI,WAAW,IAAI,SAAS,QAAQ,SAAS,EAAE,GAAG;AAAA;AAAA,EAEhI,OAAO;AAAA;AAEX,SAAS,eAAe,CAAC,KAAK,WAAW;AAAA,EACrC,IAAI,WAAW,mBAAmB,GAAG,IAAI,YAAY,WAAW;AAAA,EAChE,OAAO;AAAA;AAEX,eAAe,gBAAgB,CAAC,OAAO,SAAS,WAAW,SAAS;AAAA,EAChE,IAAI,EAAE,iBAAiB,MAAM;AAAA,IACzB,MAAM,eAAe,IAAI,uCAAuC,oBAAoB;AAAA,EACxF;AAAA,EACA,cAAc,OAAO,UAAU,2BAA2B,IAAI;AAAA,EAC9D,MAAM,MAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC;AAAA,EACzC,MAAM,UAAU,eAAe,SAAS,OAAO;AAAA,EAC/C,QAAQ,IAAI,UAAU,kBAAkB;AAAA,EACxC,QAAQ,UAAU,gBAAgB,OAAO,IAAI,MAAM;AAAA,IAC/C,MAAM;AAAA,IACN,SAAS,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,IAC7C,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,OAAO,KAAK,SAAS,MAAM;AAAA,EACvC,CAAC;AAAA;AAEL,eAAsB,gBAAgB,CAAC,kBAAkB,SAAS;AAAA,EAC9D,OAAO,iBAAiB,kBAAkB,oBAAoB,CAAC,QAAQ;AAAA,IACnE,QAAQ,SAAS;AAAA,WACR;AAAA,WACA;AAAA,QACD,gBAAgB,KAAK,kCAAkC;AAAA,QACvD;AAAA,WACC;AAAA,QACD,iBAAiB,KAAK,wCAAwC;AAAA,QAC9D;AAAA;AAAA,QAEA,MAAM,eAAe,6DAA6D,qBAAqB;AAAA;AAAA,IAE/G,OAAO;AAAA,KACR,OAAO;AAAA;AAwBd,SAAS,YAAY,CAAC,OAAO,IAAI,MAAM,OAAO;AAAA,EAC1C,IAAI;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC3B,MAAM,eAAe,GAAG,uBAAuB,sBAAsB,KAAK;AAAA,IAC9E;AAAA,IACA,IAAI,MAAM,WAAW,GAAG;AAAA,MACpB,MAAM,eAAe,GAAG,wBAAwB,uBAAuB,KAAK;AAAA,IAChF;AAAA,IAEJ,OAAO,KAAK;AAAA,IACR,IAAI,MAAM;AAAA,MACN,MAAM,IAAI,IAAI,SAAS,MAAM,KAAK;AAAA,IACtC;AAAA,IACA,MAAM;AAAA;AAAA;AAGd,eAAsB,wBAAwB,CAAC,0BAA0B,UAAU;AAAA,EAC/E,MAAM,WAAW;AAAA,EACjB,IAAI,EAAE,oBAAoB,QAAQ,aAAa,mBAAmB;AAAA,IAC9D,MAAM,eAAe,yDAAyD,oBAAoB;AAAA,EACtG;AAAA,EACA,IAAI,CAAC,gBAAgB,UAAU,QAAQ,GAAG;AAAA,IACtC,MAAM,eAAe,8CAA8C,oBAAoB;AAAA,EAC3F;AAAA,EACA,IAAI,SAAS,WAAW,KAAK;AAAA,IACzB,MAAM,IAAI,oGAAoG,yBAAyB,QAAQ;AAAA,EACnJ;AAAA,EACA,uBAAuB,QAAQ;AAAA,EAC/B,MAAM,OAAO,MAAM,oBAAoB,QAAQ;AAAA,EAC/C,aAAa,KAAK,QAAQ,qCAAqC,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAAA,EAC/F,IAAI,aAAa,qBAAqB,IAAI,IAAI,KAAK,MAAM,EAAE,SAAS,SAAS,MAAM;AAAA,IAC/E,MAAM,IAAI,uEAAuE,2BAA2B,EAAE,UAAU,SAAS,MAAM,MAAM,MAAM,WAAW,SAAS,CAAC;AAAA,EAC5K;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,qBAAqB,CAAC,UAAU;AAAA,EACrC,kBAAkB,UAAU,kBAAkB;AAAA;AAElD,SAAS,OAAO,CAAC,aAAa,OAAO;AAAA,EACjC,IAAI,MAAM;AAAA,EACV,IAAI,MAAM,SAAS,GAAG;AAAA,IAClB,MAAM,OAAO,MAAM,IAAI;AAAA,IACvB,OAAO,GAAG,MAAM,KAAK,IAAI,SAAS;AAAA,EACtC,EACK,SAAI,MAAM,WAAW,GAAG;AAAA,IACzB,OAAO,GAAG,MAAM,SAAS,MAAM;AAAA,EACnC,EACK;AAAA,IACD,OAAO,MAAM;AAAA;AAAA,EAEjB,OAAO,IAAI,KAAK,sBAAsB,QAAQ;AAAA;AAElD,SAAS,kBAAkB,CAAC,aAAa,OAAO;AAAA,EAC5C,IAAI,CAAC,MAAM,SAAS,eAAe,QAAQ,CAAC,GAAG;AAAA,IAC3C,MAAM,QAAQ,UAAU,GAAG,KAAK;AAAA,EACpC;AAAA;AAEJ,SAAS,iBAAiB,CAAC,UAAU,aAAa;AAAA,EAC9C,IAAI,eAAe,QAAQ,MAAM,aAAa;AAAA,IAC1C,MAAM,QAAQ,UAAU,WAAW;AAAA,EACvC;AAAA;AAEJ,SAAS,YAAW,GAAG;AAAA,EACnB,OAAO,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC;AAAA;AA8B1D,SAAS,KAAK,CAAC,KAAK;AAAA,EAChB,QAAQ,IAAI,UAAU,KAAK;AAAA,SAClB;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,+CAA+C;AAAA,QAC/E,OAAO;AAAA,MACX,CAAC;AAAA;AAAA;AAGb,SAAS,KAAK,CAAC,KAAK;AAAA,EAChB,QAAQ,IAAI,UAAU,KAAK;AAAA,SAClB;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,+CAA+C;AAAA,QAC/E,OAAO;AAAA,MACX,CAAC;AAAA;AAAA;AAGb,SAAS,KAAK,CAAC,KAAK;AAAA,EAChB,QAAQ,IAAI,UAAU;AAAA,SACb;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,yCAAyC,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA;AAGvG,SAAS,QAAQ,CAAC,KAAK;AAAA,EACnB,QAAQ,IAAI,UAAU;AAAA,SACb;AAAA,MACD,OAAO,MAAM,GAAG;AAAA,SACf;AAAA,MACD,OAAO,MAAM,GAAG;AAAA,SACf;AAAA,MACD,OAAO,MAAM,GAAG;AAAA,SACf;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO,IAAI,UAAU;AAAA,SACpB;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,wCAAwC,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA;AAGtG,SAAS,YAAY,CAAC,QAAQ;AAAA,EAC1B,MAAM,OAAO,SAAS;AAAA,EACtB,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO;AAAA;AAEtE,SAAS,iBAAiB,CAAC,QAAQ;AAAA,EAC/B,MAAM,YAAY,SAAS;AAAA,EAC3B,OAAO,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,KACzF,YACA;AAAA;AAEV,SAAS,SAAS,GAAG;AAAA,EACjB,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI;AAAA;AAEvC,SAAS,QAAQ,CAAC,IAAI;AAAA,EAClB,IAAI,OAAO,OAAO,YAAY,OAAO,MAAM;AAAA,IACvC,MAAM,eAAe,0BAA0B,oBAAoB;AAAA,EACvE;AAAA,EACA,aAAa,GAAG,QAAQ,aAAa;AAAA;AA4FzC,eAAe,OAAO,CAAC,QAAQ,SAAS,KAAK;AAAA,EACzC,IAAI,CAAC,IAAI,OAAO,SAAS,MAAM,GAAG;AAAA,IAC9B,MAAM,eAAe,yFAAyF,qBAAqB;AAAA,EACvI;AAAA,EACA,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,UAAU,OAAO,CAAC,CAAC;AAAA,EACvF,MAAM,YAAY,KAAK,MAAM,OAAO,OAAO,KAAK,YAAY,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC;AAAA,EAClF,OAAO,GAAG,SAAS;AAAA;AAoEvB,IAAI;AACJ,eAAe,oBAAoB,CAAC,KAAK,KAAK;AAAA,EAC1C,QAAQ,KAAK,GAAG,GAAG,GAAG,GAAG,KAAK,QAAQ,MAAM,OAAO,OAAO,UAAU,OAAO,GAAG;AAAA,EAC9E,MAAM,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI;AAAA,EACxC,IAAI,QAAQ;AAAA,IACR,IAAI,MAAM;AAAA,EACd,SAAS,IAAI,KAAK,GAAG;AAAA,EACrB,OAAO;AAAA;AAEX,eAAe,SAAS,CAAC,KAAK,KAAK;AAAA,EAC/B,aAAa,IAAI;AAAA,EACjB,OAAO,SAAS,IAAI,GAAG,KAAK,qBAAqB,KAAK,GAAG;AAAA;AAE7D,IAAM,WAAW,IAAI,QAEb,CAAC,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IACpC,CAAC,KAAK,SAAS;AAAA,EACb,IAAI;AAAA,IACA,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,IAE5B,MAAM;AAAA,IACF,OAAO;AAAA;AAAA;AAGZ,SAAS,aAAa,CAAC,KAAK,cAAc;AAAA,EAC7C,IAAI,gBAAgB,IAAI,aAAa,UAAU;AAAA,IAC3C,MAAM,IAAI,sCAAsC,wBAAwB,GAAG;AAAA,EAC/E;AAAA,EACA,IAAI,IAAI,aAAa,YAAY,IAAI,aAAa,SAAS;AAAA,IACvD,MAAM,IAAI,4CAA4C,4BAA4B,GAAG;AAAA,EACzF;AAAA;AAEJ,SAAS,gBAAgB,CAAC,OAAO,UAAU,cAAc,cAAc;AAAA,EACnE,IAAI;AAAA,EACJ,IAAI,OAAO,UAAU,YAAY,EAAE,MAAM,SAAS,KAAK,IAAI;AAAA,IACvD,MAAM,IAAI,0DAA0D,eAAe,6BAA6B,cAAc,OAAO,eAAe,UAAU,YAAY,0BAA0B,yBAAyB,EAAE,WAAW,eAAe,yBAAyB,aAAa,SAAS,CAAC;AAAA,EAC7S;AAAA,EACA,cAAc,KAAK,YAAY;AAAA,EAC/B,OAAO;AAAA;AAEJ,SAAS,eAAe,CAAC,IAAI,UAAU,cAAc,cAAc;AAAA,EACtE,IAAI,gBAAgB,GAAG,yBAAyB,YAAY,GAAG,uBAAuB;AAAA,IAClF,OAAO,iBAAiB,GAAG,sBAAsB,WAAW,UAAU,cAAc,YAAY;AAAA,EACpG;AAAA,EACA,OAAO,iBAAiB,GAAG,WAAW,UAAU,cAAc,YAAY;AAAA;AAkB9E,MAAM,YAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,CAAC,QAAQ,SAAS,SAAS;AAAA,IAClC,iBAAiB,SAAS,YAAY,mBAAmB;AAAA,IACzD,gBAAgB,SAAS,WAAW,kBAAkB;AAAA,IACtD,IAAI,CAAC,QAAQ,UAAU,aAAa;AAAA,MAChC,MAAM,eAAe,6CAA6C,qBAAqB;AAAA,IAC3F;AAAA,IACA,KAAK,mBAAmB,UAAU;AAAA,IAClC,KAAK,aAAa,aAAa,MAAM;AAAA,IACrC,KAAK,cAAc,QAAQ;AAAA,IAC3B,KAAK,aAAa,QAAQ;AAAA,IAC1B,QAAQ,IAAI,IAAI;AAAA;AAAA,EAEpB,IAAI,CAAC,KAAK;AAAA,IACN,KAAK,SAAS,IAAI;AAAA,IAClB,IAAI,OAAO,KAAK,KAAK,IAAI,GAAG;AAAA,IAC5B,IAAI,MAAM;AAAA,MACN,KAAK,KAAK,OAAO,GAAG;AAAA,MACpB,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA;AAAA,EAEX,IAAI,CAAC,KAAK,KAAK;AAAA,IACX,KAAK,SAAS,IAAI;AAAA,IAClB,KAAK,KAAK,OAAO,GAAG;AAAA,IACpB,IAAI,KAAK,KAAK,SAAS,KAAK;AAAA,MACxB,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK;AAAA,IAClD;AAAA,IACA,KAAK,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,OAEpB,oBAAmB,GAAG;AAAA,IACxB,IAAI,CAAC,KAAK,MAAM;AAAA,MACZ,MAAM,MAAM,MAAM,OAAO,OAAO,UAAU,OAAO,KAAK,UAAU;AAAA,MAChE,KAAK,SAAS,MAAM,uBAAuB,GAAG;AAAA,IAClD;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,OAEV,SAAQ,CAAC,KAAK,SAAS,KAAK,aAAa;AAAA,IAC3C,MAAM,MAAM,SAAS,KAAK,WAAW;AAAA,IACrC,KAAK,YAAY;AAAA,MACb;AAAA,MACA,KAAK;AAAA,MACL,KAAK,MAAM,UAAU,KAAK,YAAY,GAAG;AAAA,IAC7C;AAAA,IACA,MAAM,QAAQ,KAAK,KAAK,IAAI,MAAM;AAAA,IAClC,MAAM,MAAM,UAAU,IAAI,KAAK;AAAA,IAC/B,MAAM,UAAU;AAAA,MACZ,KAAK;AAAA,MACL,KAAK,aAAY;AAAA,MACjB;AAAA,MACA;AAAA,MACA,KAAK,GAAG,IAAI,SAAS,IAAI;AAAA,MACzB,KAAK,cACC,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,WAAW,CAAC,CAAC,IAC5D;AAAA,IACV;AAAA,IACA,KAAK,mBAAmB,KAAK,SAAS,OAAO;AAAA,IAC7C,QAAQ,IAAI,QAAQ,MAAM,QAAQ,KAAK,SAAS,SAAS,KAAK,WAAW,CAAC;AAAA;AAAA,EAE9E,UAAU,CAAC,UAAU,KAAK;AAAA,IACtB,IAAI;AAAA,MACA,MAAM,QAAQ,SAAS,QAAQ,IAAI,YAAY;AAAA,MAC/C,IAAI,OAAO;AAAA,QACP,KAAK,KAAK,IAAI,QAAQ,KAAK;AAAA,MAC/B;AAAA,MAEJ,MAAM;AAAA;AAEd;AAgEA,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,qBAAqB,MAAM,aAAa,eAAe;AAC7D,IAAM,eAAe,MAAM,aAAa,gBAAgB,aAAa;AACrE,IAAM,WAAW,IAAI,OAAO,cAAc,aAAa,GAAG;AAC1D,IAAM,gBAAgB,IAAI,OAAO,aAAa,qBAAqB,aAAa;AAChF,IAAM,kBAAkB,IAAI,OAAO,aAAa,eAAe,aAAa;AAC5E,IAAM,iBAAiB,IAAI,OAAO,OAAO,eAAe,mBAAmB;AA0K3E,IAAI;AACJ,SAAS,YAAY,CAAC,IAAI,MAAM,KAAK,OAAO;AAAA,EACxC,YAAY,IAAI;AAAA,EAChB,QAAQ,IAAI,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,QACI,GAAG,GAAG;AAAA,MACN,OAAO,UAAU,IAAI,KAAK;AAAA;AAAA,EAElC,CAAC;AAAA,EACD,IAAI,OAAO;AAAA,IACP,OAAO,OAAO,OAAO,EAAE,MAAM,gBAAgB,IAAI,GAAG,IAAI,CAAC;AAAA,EAC7D;AAAA;AAEJ,SAAS,gBAAgB,CAAC,OAAO;AAAA,EAC7B,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAC7C,OAAO;AAAA,EACX;AAAA,EACA,IAAI,EAAE,SAAS,UAAU,OAAO,MAAM,QAAQ,YAAY,UAAU,IAAI,MAAM,OAAO,KAAK;AAAA,IACtF,OAAO;AAAA,EACX;AAAA,EACA,IAAI,EAAE,UAAU,UACZ,CAAC,aAAa,MAAM,IAAI,KACxB,CAAC,MAAM,QAAQ,MAAM,KAAK,IAAI,KAC9B,CAAC,MAAM,UAAU,MAAM,KAAK,MAAM,KAAK,MAAM,YAAY,GAAG;AAAA,IAC5D,OAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,cAAc,CAAC,IAAI,OAAO;AAAA,EAC/B,SAAS,OAAO,EAAE;AAAA,EAClB,OAAO,OAAO;AAAA,EACd,OAAO,OAAO;AAAA;AAElB,eAAe,gCAAgC,CAAC,IAAI,SAAS,QAAQ;AAAA,EACjE,QAAQ,KAAK,QAAQ;AAAA,EACrB,qBAAqB,MAAM;AAAA,EAC3B,IAAI,CAAC,SAAS,IAAI,EAAE,KAAK,iBAAiB,UAAU,UAAU,GAAG;AAAA,IAC7D,aAAa,IAAI,UAAU,WAAW,MAAM,UAAU,WAAW,GAAG;AAAA,EACxE;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,SAAS,IAAI,EAAE,GAAG;AAAA,KAEjB,EAAE,MAAM,IAAI,IAAI,QAAQ,IAAI,EAAE;AAAA,IAC/B,IAAI,OAAO,KAAK;AAAA,MACZ,eAAe,IAAI,UAAU,UAAU;AAAA,MACvC,OAAO,iCAAiC,IAAI,SAAS,MAAM;AAAA,IAC/D;AAAA,EACJ,EACK;AAAA,IACD,OAAO,MAAM,YAAY,IAAI,OAAO,EAAE,KAAK,mBAAmB;AAAA,IAC9D,MAAM;AAAA,IACN,aAAa,IAAI,MAAM,UAAU,GAAG,UAAU,UAAU;AAAA;AAAA,EAE5D,IAAI;AAAA,EACJ,QAAQ,IAAI,MAAM,GAAG,CAAC;AAAA,SACb;AAAA,SACA;AAAA,MACD,MAAM;AAAA,MACN;AAAA,SACC;AAAA,MACD,MAAM;AAAA,MACN;AAAA,SACC;AAAA,MACD,MAAM;AAAA,MACN;AAAA,SACC;AAAA,MACD,MAAM;AAAA,MACN;AAAA;AAAA,MAEA,MAAM,IAAI,0BAA0B,6BAA6B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAAA;AAAA,EAE3F,MAAM,aAAa,KAAK,KAAK,OAAO,CAAC,SAAQ;AAAA,IACzC,IAAI,KAAI,QAAQ,KAAK;AAAA,MACjB,OAAO;AAAA,IACX;AAAA,IACA,IAAI,QAAQ,aAAa,QAAQ,KAAI,KAAK;AAAA,MACtC,OAAO;AAAA,IACX;AAAA,IACA,IAAI,KAAI,QAAQ,aAAa,QAAQ,KAAI,KAAK;AAAA,MAC1C,OAAO;AAAA,IACX;AAAA,IACA,IAAI,KAAI,QAAQ,aAAa,KAAI,QAAQ,OAAO;AAAA,MAC5C,OAAO;AAAA,IACX;AAAA,IACA,IAAI,KAAI,SAAS,SAAS,QAAQ,MAAM,OAAO;AAAA,MAC3C,OAAO;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,YACC,QAAQ,WAAW,KAAI,QAAQ;AAAA,YAC/B,QAAQ,WAAW,KAAI,QAAQ;AAAA,YAC/B,QAAQ,WAAW,KAAI,QAAQ;AAAA,YAC/B,QAAQ,aAAa,KAAI,QAAQ;AAAA,YACjC,QAAQ,WAAW,KAAI,QAAQ;AAAA,QAChC,OAAO;AAAA;AAAA,IAEf,OAAO;AAAA,GACV;AAAA,EACD,QAAQ,GAAG,KAAK,WAAW;AAAA,EAC3B,IAAI,CAAC,QAAQ;AAAA,IACT,IAAI,OAAO,IAAI;AAAA,MACX,eAAe,IAAI,UAAU,UAAU;AAAA,MACvC,OAAO,iCAAiC,IAAI,SAAS,MAAM;AAAA,IAC/D;AAAA,IACA,MAAM,IAAI,yEAAyE,eAAe,EAAE,QAAQ,YAAY,UAAU,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;AAAA,EAC5J;AAAA,EACA,IAAI,WAAW,GAAG;AAAA,IACd,MAAM,IAAI,yHAAyH,eAAe,EAAE,QAAQ,YAAY,UAAU,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;AAAA,EAC5M;AAAA,EACA,OAAO,UAAU,KAAK,GAAG;AAAA;AAEtB,IAAM,mBAAmB,OAAO;AAChC,SAAS,cAAc,CAAC,OAAO;AAAA,EAClC,OAAO,MAAM,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE;AAAA;AA2EzD,IAAM,gBAAgB,IAAI;AAC1B,IAAM,UAAU,IAAI;AAgHpB,SAAS,gBAAgB,CAAC,UAAU,QAAQ;AAAA,EACxC,IAAI,MAAM,QAAQ,OAAO,OAAO,GAAG,GAAG;AAAA,IAClC,IAAI,CAAC,OAAO,OAAO,IAAI,SAAS,QAAQ,GAAG;AAAA,MACvC,MAAM,IAAI,+CAA+C,sBAAsB;AAAA,QAC3E;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ,EACK,SAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,IACrC,MAAM,IAAI,+CAA+C,sBAAsB;AAAA,MAC3E;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,OAAO;AAAA;AAQX,SAAS,cAAc,CAAC,IAAI,QAAQ;AAAA,EAChC,MAAM,WAAW,GAAG,mBAAmB,MAAM,KAAK,GAAG;AAAA,EACrD,IAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,IAChC,MAAM,IAAI,6CAA6C,sBAAsB;AAAA,MACzE;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,OAAO;AAAA;AAEX,IAAM,UAAU,IAAI;AAKb,IAAM,SAAS,OAAO;AAqB7B,IAAM,gBAAgB;AAAA,EAClB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,WAAW;AACf;AACA,SAAS,gBAAgB,CAAC,UAAU,QAAQ;AAAA,EACxC,WAAW,SAAS,UAAU;AAAA,IAC1B,IAAI,OAAO,OAAO,WAAW,WAAW;AAAA,MACpC,MAAM,IAAI,QAAQ,WAAW,cAAc,yBAAyB,kBAAkB;AAAA,QAClF,QAAQ,OAAO;AAAA,MACnB,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,OAAO;AAAA;AAEJ,IAAM,gBAAgB,OAAO;AAC7B,IAAM,oBAAoB,OAAO;AAsFjC,IAAM,wBAAwB;AAG9B,IAAM,cAAc;AACpB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB;AAC7B,IAAM,0BAA0B;AAChC,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AACnC,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAM,4BAA4B;AAClC,IAAM,gBAAgB;AACtB,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AACvC,SAAS,YAAY,CAAC,UAAU,QAAQ;AAAA,EACpC,IAAI,OAAO,OAAO,OAAO,QAAQ,YAAY,aAAa,OAAO,OAAO,GAAG,MAAM,UAAU;AAAA,IACvF,MAAM,IAAI,+CAA+C,kBAAkB;AAAA,MACvE,QAAQ,OAAO;AAAA,IACnB,CAAC;AAAA,EACL;AAAA,EACA,OAAO;AAAA;AAqCX,SAAS,sBAAsB,CAAC,UAAU;AAAA,EACtC,IAAI,SAAS,UAAU;AAAA,IACnB,MAAM,eAAe,yCAAyC,qBAAqB;AAAA,EACvF;AAAA;AAoDJ,eAAe,WAAW,CAAC,IAAI,SAAS;AAAA,EACpC,SAAS,EAAE;AAAA,EACX,MAAM,MAAM,gBAAgB,IAAI,YAAY,OAAO,UAAU,2BAA2B,IAAI;AAAA,EAC5F,MAAM,UAAU,eAAe,SAAS,OAAO;AAAA,EAC/C,QAAQ,IAAI,UAAU,kBAAkB;AAAA,EACxC,QAAQ,OAAO,UAAU,0BAA0B;AAAA,EACnD,QAAQ,UAAU,gBAAgB,OAAO,IAAI,MAAM;AAAA,IAC/C,MAAM;AAAA,IACN,SAAS,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,IAC7C,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,OAAO,KAAK,SAAS,MAAM;AAAA,EACvC,CAAC;AAAA;AAEL,eAAe,mBAAmB,CAAC,UAAU;AAAA,EACzC,IAAI,CAAC,gBAAgB,UAAU,QAAQ,GAAG;AAAA,IACtC,MAAM,eAAe,8CAA8C,oBAAoB;AAAA,EAC3F;AAAA,EACA,IAAI,SAAS,WAAW,KAAK;AAAA,IACzB,MAAM,IAAI,uFAAuF,yBAAyB,QAAQ;AAAA,EACtI;AAAA,EACA,uBAAuB,QAAQ;AAAA,EAC/B,MAAM,OAAO,MAAM,oBAAoB,UAAU,CAAC,cAAa,mBAAmB,WAAU,oBAAoB,0BAA0B,CAAC;AAAA,EAC3I,IAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AAAA,IAC3B,MAAM,IAAI,oDAAoD,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAAA,EAClG;AAAA,EACA,IAAI,CAAC,MAAM,UAAU,MAAM,KAAK,KAAK,MAAM,YAAY,GAAG;AAAA,IACtD,MAAM,IAAI,yEAAyE,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAAA,EACvH;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,SAAS,CAAC,KAAK;AAAA,EACpB,QAAQ;AAAA,SACC;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAGnB,SAAS,oBAAoB,CAAC,QAAQ;AAAA,EAClC,IAAI,CAAC,UAAU,OAAO,GAAG,GAAG;AAAA,IACxB,MAAM,IAAI,0BAA0B,oCAAoC;AAAA,MACpE,OAAO,EAAE,KAAK,OAAO,IAAI;AAAA,IAC7B,CAAC;AAAA,EACL;AAAA;AAEJ,SAAS,oBAAoB,CAAC,KAAK;AAAA,EAC/B,QAAQ,cAAc;AAAA,EACtB,IAAI,OAAO,UAAU,kBAAkB,YAAY,UAAU,gBAAgB,MAAM;AAAA,IAC/E,MAAM,IAAI,0BAA0B,eAAe,UAAU,sBAAsB;AAAA,MAC/E,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA;AAEJ,SAAS,aAAa,CAAC,KAAK;AAAA,EACxB,QAAQ,cAAc;AAAA,EACtB,QAAQ,UAAU;AAAA,SACT;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA,SACN;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,gCAAgC,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA;AAG9F,SAAS,WAAW,CAAC,KAAK;AAAA,EACtB,QAAQ,IAAI,UAAU;AAAA,SACb;AAAA,MACD,OAAO;AAAA,QACH,MAAM,IAAI,UAAU;AAAA,QACpB,MAAM,cAAc,GAAG;AAAA,MAC3B;AAAA,SACC,WAAW;AAAA,MACZ,qBAAqB,GAAG;AAAA,MACxB,QAAQ,IAAI,UAAU,KAAK;AAAA,aAClB;AAAA,aACA;AAAA,aACA;AAAA,UACD,OAAO;AAAA,YACH,MAAM,IAAI,UAAU;AAAA,YACpB,YAAY,SAAS,IAAI,UAAU,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK;AAAA,UACnE;AAAA;AAAA,UAEA,MAAM,IAAI,0BAA0B,iCAAiC,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,IAE/F;AAAA,SACK;AAAA,MACD,qBAAqB,GAAG;AAAA,MACxB,OAAO,IAAI,UAAU;AAAA,SACpB;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO,IAAI,UAAU;AAAA;AAAA,EAE7B,MAAM,IAAI,0BAA0B,wCAAwC,EAAE,OAAO,IAAI,CAAC;AAAA;AAE9F,eAAe,oBAAoB,CAAC,iBAAiB,SAAS,KAAK,WAAW;AAAA,EAC1E,MAAM,OAAO,IAAI,GAAG,mBAAmB,SAAS;AAAA,EAChD,MAAM,YAAY,YAAY,GAAG;AAAA,EACjC,MAAM,WAAW,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK,WAAW,IAAI;AAAA,EAC3E,IAAI,CAAC,UAAU;AAAA,IACX,MAAM,IAAI,qCAAqC,kBAAkB;AAAA,MAC7D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAEJ,eAAe,WAAW,CAAC,KAAK,UAAU,YAAW,iBAAgB,YAAY;AAAA,EAC7E,MAAM,GAAG,iBAAiB,GAAG,SAAS,WAAW,IAAI,MAAM,GAAG;AAAA,EAC9D,IAAI,WAAW,GAAG;AAAA,IACd,IAAI,eAAe,WAAW;AAAA,MAC1B,MAAM,MAAM,WAAW,GAAG;AAAA,OACzB,EAAE,GAAG,iBAAiB,GAAG,SAAS,OAAO,IAAI,IAAI,MAAM,GAAG;AAAA,IAC/D,EACK;AAAA,MACD,MAAM,IAAI,0BAA0B,oCAAoC,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,EAE9F;AAAA,EACA,IAAI,WAAW,GAAG;AAAA,IACd,MAAM,IAAI,eAAe,kBAAkB,GAAG;AAAA,EAClD;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACA,SAAS,KAAK,MAAM,IAAI,KAAK,eAAe,CAAC,CAAC;AAAA,IAElD,OAAO,OAAO;AAAA,IACV,MAAM,IAAI,6DAA6D,aAAa,KAAK;AAAA;AAAA,EAE7F,IAAI,CAAC,aAAa,MAAM,GAAG;AAAA,IACvB,MAAM,IAAI,yCAAyC,kBAAkB,GAAG;AAAA,EAC5E;AAAA,EACA,SAAS,MAAM;AAAA,EACf,IAAI,OAAO,SAAS,WAAW;AAAA,IAC3B,MAAM,IAAI,0BAA0B,2DAA2D;AAAA,MAC3F,OAAO,EAAE,OAAO;AAAA,IACpB,CAAC;AAAA,EACL;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACA,SAAS,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC,CAAC;AAAA,IAE1C,OAAO,OAAO;AAAA,IACV,MAAM,IAAI,8DAA8D,aAAa,KAAK;AAAA;AAAA,EAE9F,IAAI,CAAC,aAAa,MAAM,GAAG;AAAA,IACvB,MAAM,IAAI,0CAA0C,kBAAkB,GAAG;AAAA,EAC7E;AAAA,EACA,MAAM,MAAM,UAAU,IAAI;AAAA,EAC1B,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC1B,IAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,MAChC,MAAM,IAAI,qDAAqD,kBAAkB,EAAE,OAAO,CAAC;AAAA,IAC/F;AAAA,IACA,IAAI,OAAO,OAAO,MAAM,iBAAgB;AAAA,MACpC,MAAM,IAAI,4FAA4F,qBAAqB,EAAE,QAAQ,KAAK,WAAW,iBAAgB,OAAO,MAAM,CAAC;AAAA,IACvL;AAAA,EACJ;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC1B,IAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,MAChC,MAAM,IAAI,+CAA+C,kBAAkB,EAAE,OAAO,CAAC;AAAA,IACzF;AAAA,EACJ;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC1B,IAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,MAChC,MAAM,IAAI,4CAA4C,kBAAkB,EAAE,OAAO,CAAC;AAAA,IACtF;AAAA,EACJ;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC1B,IAAI,OAAO,OAAO,QAAQ,UAAU;AAAA,MAChC,MAAM,IAAI,gDAAgD,kBAAkB,EAAE,OAAO,CAAC;AAAA,IAC1F;AAAA,IACA,IAAI,OAAO,MAAM,MAAM,iBAAgB;AAAA,MACnC,MAAM,IAAI,iDAAiD,qBAAqB;AAAA,QAC5E;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC1B,IAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,GAAG;AAAA,MAC9D,MAAM,IAAI,8CAA8C,kBAAkB,EAAE,OAAO,CAAC;AAAA,IACxF;AAAA,EACJ;AAAA,EACA,OAAO,EAAE,QAAQ,QAAQ,KAAK,IAAI;AAAA;AA0NtC,SAAS,qBAAqB,CAAC,QAAQ,QAAQ,UAAU,QAAQ;AAAA,EAC7D,IAAI,WAAW,WAAW;AAAA,IACtB,IAAI,OAAO,WAAW,WAAW,OAAO,QAAQ,SAAS,CAAC,OAAO,SAAS,OAAO,GAAG,GAAG;AAAA,MACnF,MAAM,IAAI,yCAAyC,kBAAkB;AAAA,QACjE;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AAAA,EACA,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACvB,IAAI,CAAC,OAAO,SAAS,OAAO,GAAG,GAAG;AAAA,MAC9B,MAAM,IAAI,yCAAyC,kBAAkB;AAAA,QACjE;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AAAA,EACA,IAAI,aAAa,WAAW;AAAA,IACxB,IAAI,OAAO,aAAa,WAClB,OAAO,QAAQ,WACf,OAAO,aAAa,aAChB,CAAC,SAAS,OAAO,GAAG,IACpB,CAAC,SAAS,SAAS,OAAO,GAAG,GAAG;AAAA,MACtC,MAAM,IAAI,yCAAyC,kBAAkB;AAAA,QACjE;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AAAA,EACA,MAAM,IAAI,oFAAoF,WAAW,EAAE,QAAQ,QAAQ,SAAS,CAAC;AAAA;AASlI,IAAM,iBAAiB,OAAO;AAC9B,IAAM,gBAAgB,OAAO;AAyDpC,SAAS,WAAW,CAAC,KAAK;AAAA,EACtB,QAAQ;AAAA,SACC;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO,EAAE,MAAM,WAAW,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI;AAAA,SACtD;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO,EAAE,MAAM,qBAAqB,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI;AAAA,SAChE;AAAA,SACA;AAAA,MACD,OAAO,EAAE,MAAM,SAAS,YAAY,KAAK,IAAI,MAAM,EAAE,IAAI;AAAA,SACxD;AAAA,MACD,OAAO,EAAE,MAAM,SAAS,YAAY,QAAQ;AAAA,SAC3C;AAAA,MACD,OAAO;AAAA,SACN;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACD,OAAO;AAAA;AAAA,MAEP,MAAM,IAAI,0BAA0B,6BAA6B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAAA;AAAA;AAG/F,eAAe,SAAS,CAAC,KAAK,KAAK;AAAA,EAC/B,QAAQ,KAAK,SAAS,QAAQ,QAAQ;AAAA,EACtC,OAAO,OAAO,OAAO,UAAU,OAAO,KAAK,YAAY,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAAA;AAoEjF,SAAS,YAAY,CAAC,KAAK;AAAA,EACvB,MAAM,MAAM,IAAI,IAAI,GAAG;AAAA,EACvB,IAAI,SAAS;AAAA,EACb,IAAI,OAAO;AAAA,EACX,OAAO,IAAI;AAAA;AAEf,eAAe,YAAY,CAAC,SAAS,aAAa,mBAAmB,SAAS;AAAA,EAC1E,MAAM,cAAc,QAAQ,QAAQ,IAAI,MAAM;AAAA,EAC9C,IAAI,gBAAgB,MAAM;AAAA,IACtB,MAAM,IAAI,wEAAwE,iBAAiB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,EACnI;AAAA,EACA,IAAI,QAAQ,QAAQ,IAAI,eAAe,GAAG,YAAY,EAAE,WAAW,OAAO,MAAM,OAAO;AAAA,IACnF,MAAM,IAAI,+FAA+F,iBAAiB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,EAC1J;AAAA,EACA,IAAI,OAAO,kBAAkB,KAAK,QAAQ,UAAU;AAAA,IAChD,MAAM,IAAI,uFAAuF,iBAAiB,EAAE,QAAQ,kBAAkB,CAAC;AAAA,EACnJ;AAAA,EACA,MAAM,aAAY,aAAa,OAAO;AAAA,EACtC,MAAM,QAAQ,MAAM,YAAY,aAAa,sBAAsB,KAAK,WAAW,SAAS,mBAAmB,WAAW,SAAS,GAAG,YAAW,kBAAkB,OAAO,GAAG,SAAS,EACjL,KAAK,aAAa,KAAK,WAAW,UAAU,CAAC,EAC7C,KAAK,iBAAiB,KAAK,WAAW,CAAC,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,EAC/E,MAAM,MAAM,UAAU,IAAI;AAAA,EAC1B,MAAM,OAAO,KAAK,IAAI,MAAM,MAAM,OAAO,GAAG;AAAA,EAC5C,IAAI,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,uCAAuC,qBAAqB;AAAA,MAClE;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,IAAI,MAAM,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IACrC,MAAM,IAAI,2BAA2B,sBAAsB;AAAA,MACvD,UAAU,QAAQ;AAAA,MAClB,QAAQ,MAAM;AAAA,MACd,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,IAAI,OAAO,MAAM,OAAO,QAAQ,YAC5B,aAAa,MAAM,OAAO,GAAG,MAAM,aAAa,QAAQ,GAAG,GAAG;AAAA,IAC9D,MAAM,IAAI,2BAA2B,sBAAsB;AAAA,MACvD,UAAU,aAAa,QAAQ,GAAG;AAAA,MAClC,QAAQ,MAAM;AAAA,MACd,OAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA;AAAA,IACI,MAAM,WAAW,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI,WAAW,CAAC,CAAC;AAAA,IAC7E,IAAI,MAAM,OAAO,QAAQ,UAAU;AAAA,MAC/B,MAAM,IAAI,2BAA2B,sBAAsB;AAAA,QACvD;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA;AAAA,IACI,MAAM,WAAW,MAAM,uBAAuB,MAAM,OAAO,GAAG;AAAA,IAC9D,IAAI,kBAAkB,IAAI,QAAQ,UAAU;AAAA,MACxC,MAAM,IAAI,0CAA0C,sBAAsB;AAAA,QACtE;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG,iBAAiB,GAAG,SAAS,GAAG,qBAAqB,YAAY,MAAM,GAAG;AAAA,EACrF,MAAM,YAAY,KAAK,gBAAgB;AAAA,EACvC,QAAQ,KAAK,QAAQ,MAAM;AAAA,EAC3B,IAAI,CAAC,KAAK;AAAA,IACN,MAAM,IAAI,kDAAkD,iBAAiB;AAAA,MACzE,QAAQ,MAAM;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EACA,MAAM,MAAM,MAAM,UAAU,KAAK,GAAG;AAAA,EACpC,IAAI,IAAI,SAAS,UAAU;AAAA,IACvB,MAAM,IAAI,6DAA6D,iBAAiB;AAAA,MACpF,QAAQ,MAAM;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EACA,MAAM,qBAAqB,iBAAiB,SAAS,KAAK,SAAS;AAAA;AAEvE,eAAsB,sBAAsB,CAAC,IAAI,SAAS,kBAAkB,SAAS;AAAA,EACjF,SAAS,EAAE;AAAA,EACX,IAAI,CAAC,gBAAgB,SAAS,OAAO,GAAG;AAAA,IACpC,MAAM,eAAe,4CAA4C,oBAAoB;AAAA,EACzF;AAAA,EACA,aAAa,kBAAkB,oBAAoB;AAAA,EACnD,MAAM,gBAAgB,QAAQ,QAAQ,IAAI,eAAe;AAAA,EACzD,IAAI,kBAAkB,MAAM;AAAA,IACxB,MAAM,IAAI,qDAAqD,iBAAiB;AAAA,MAC5E,SAAS,QAAQ;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EACA,MAAM,GAAG,QAAQ,GAAG,aAAa,WAAW,cAAc,MAAM,GAAG;AAAA,EACnE,SAAS,OAAO,YAAY;AAAA,EAC5B,QAAQ;AAAA,SACC;AAAA,SACA;AAAA,MACD;AAAA;AAAA,MAEA,MAAM,IAAI,0BAA0B,gDAAgD;AAAA,QAChF,OAAO,EAAE,SAAS,QAAQ,QAAQ;AAAA,MACtC,CAAC;AAAA;AAAA,EAET,IAAI,WAAW,GAAG;AAAA,IACd,MAAM,IAAI,4CAA4C,iBAAiB;AAAA,MACnE,SAAS,QAAQ;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EACA,MAAM,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,IAAI,SAAS,eAAe,WAAW,UAAU,QAAQ,QAAQ,IAAI,MAAM,GAAG;AAAA,IAC1E,eAAe,KAAK,KAAK;AAAA,EAC7B;AAAA,EACA,QAAQ,QAAQ,WAAW,MAAM,YAAY,aAAa,sBAAsB,KAAK,WAAW,SAAS,mBAAmB,WAAW,SAAS,GAAG,aAAa,OAAO,GAAG,kBAAkB,OAAO,GAAG,SAAS,EAC1M,KAAK,aAAa,KAAK,WAAW,QAAQ,CAAC,EAC3C,KAAK,iBAAiB,KAAK,WAAW,cAAc,CAAC,EACrD,KAAK,eAAe,KAAK,WAAW,EAAE,CAAC,EACvC,KAAK,iBAAiB,KAAK,WAAW,gBAAgB,CAAC,EACvD,MAAM,cAAc;AAAA,EACzB,WAAW,SAAS,CAAC,aAAa,OAAO,KAAK,GAAG;AAAA,IAC7C,IAAI,OAAO,OAAO,WAAW,UAAU;AAAA,MACnC,MAAM,IAAI,mBAAmB,qBAAqB,iBAAiB,EAAE,OAAO,CAAC;AAAA,IACjF;AAAA,EACJ;AAAA,EACA,IAAI,SAAS,QAAQ;AAAA,IACjB,IAAI,CAAC,aAAa,OAAO,GAAG,GAAG;AAAA,MAC3B,MAAM,IAAI,mDAAmD,iBAAiB,EAAE,OAAO,CAAC;AAAA,IAC5F;AAAA,IACA,QAAQ,GAAG,KAAK,oBAAW,OAAO,KAAK,OAAO,GAAG;AAAA,IACjD,IAAI,SAAQ;AAAA,MACR,IAAI,YAAW,GAAG;AAAA,QACd,MAAM,IAAI,0BAA0B,kDAAkD;AAAA,UAClF,OAAO,EAAE,OAAO;AAAA,QACpB,CAAC;AAAA,MACL;AAAA,MACA,IAAI,QAAQ,OAAO;AAAA,QACf,MAAM,IAAI,0BAA0B,uCAAuC;AAAA,UACvE,OAAO,EAAE,OAAO;AAAA,QACpB,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG,iBAAiB,GAAG,SAAS,GAAG,qBAAqB,YAAY,MAAM,GAAG;AAAA,EACrF,MAAM,YAAY,KAAK,gBAAgB;AAAA,EACvC,MAAM,MAAM,MAAM,iCAAiC,IAAI,SAAS,MAAM;AAAA,EACtE,MAAM,qBAAqB,iBAAiB,SAAS,KAAK,SAAS;AAAA,EACnE,IAAI,SAAS,eACT,WAAW,UACX,OAAO,KAAK,QAAQ,aACpB,QAAQ,QAAQ,IAAI,MAAM,GAAG;AAAA,IAC7B,MAAM,aAAa,SAAS,aAAa,QAAQ,OAAO,EAAE,MAAM,cAAc;AAAA,EAClF;AAAA,EACA,OAAO;AAAA;AAEX,SAAS,cAAc,CAAC,KAAK;AAAA,EACzB,IAAI,eAAe,4BAA4B,KAAK,SAAS,iBAAiB;AAAA,IAC1E,IAAI,OAAO;AAAA,EACf;AAAA,EACA,MAAM;AAAA;AAwHV,eAAe,mBAAmB,CAAC,UAAU,QAAQ,uBAAuB;AAAA,EACxE,IAAI;AAAA,EACJ,IAAI;AAAA,IACA,OAAO,MAAM,SAAS,KAAK;AAAA,IAE/B,OAAO,OAAO;AAAA,IACV,MAAM,QAAQ;AAAA,IACd,MAAM,IAAI,2CAA2C,aAAa,KAAK;AAAA;AAAA,EAE3E,IAAI,CAAC,aAAa,IAAI,GAAG;AAAA,IACrB,MAAM,IAAI,8CAA8C,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAAA,EAC5F;AAAA,EACA,OAAO;AAAA;AAGJ,IAAM,oBAAoB,OAAO;AACjC,IAAM,kBAAkB,OAAO;;;AC96E/B,SAAS,eAAe,CAAC,SAAiD;AAAA,EAC/E,MAAM,iBAAiB,QAAQ,kBAAkB;AAAA,EACjD,MAAM,SAAS,QAAQ,UAAU;AAAA,EACjC,MAAM,WAAW,QAAQ;AAAA,EAEzB,IAAI,YAAuD;AAAA,EAE3D,eAAe,sBAAsB,GAAuC;AAAA,IAC1E,IAAI,QAAQ,SAAS;AAAA,MACnB,OAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,MAAM,YAAY,IAAI,IAAI,QAAQ,MAAM;AAAA,IACxC,MAAM,WAAW,MAAY,iBAAiB,SAAS;AAAA,IACvD,OAAa,yBAAyB,WAAW,QAAQ;AAAA;AAAA,EAG3D,OAAO,eAAe,YAAY,CAAC,SAAwC;AAAA,IACzE,IAAI,CAAC,WAAW;AAAA,MACd,YAAY,uBAAuB;AAAA,IACrC;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,KAAK,MAAM;AAAA,MACX,OAAO,OAAO;AAAA,MAEd,YAAY;AAAA,MACZ,MAAM;AAAA;AAAA,IAKR,MAAM,YAAY,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,IAChE,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,WAAW,OAAO,WAAW;AAAA,MAC3B,IAAI;AAAA,QACF,SAAS,MAAY,uBAAuB,IAAI,SAAS,GAAG;AAAA,QAC5D;AAAA,QACA,OAAO,OAAO;AAAA,QACd,YAAY;AAAA;AAAA,IAEhB;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM;AAAA,IACR;AAAA,IACA,MAAM,YAAa,OAAO,mBAA0C;AAAA,IAEpE,OAAO,IAAI,YAAY,QAAQ,MAAM,WAAW,MAAwC;AAAA;AAAA;;AC1E5F;AAwBA,SAAS,qBAAqB,CAAC,MAAc,WAA6B;AAAA,EACxE,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,UAAoB,CAAC;AAAA,EACzB,IAAI,WAAW;AAAA,EACf,IAAI,IAAI;AAAA,EACR,OAAO,IAAI,KAAK,QAAQ;AAAA,IACtB,MAAM,KAAK,KAAK;AAAA,IAChB,IAAI,OAAO,KAAK;AAAA,MACd,WAAW,CAAC;AAAA,MACZ,QAAQ,KAAK,EAAE;AAAA,IACjB,EAAO,SAAI,OAAO,QAAQ,YAAY,IAAI,IAAI,KAAK,QAAQ;AAAA,MACzD,QAAQ,KAAK,EAAE;AAAA,MACf,QAAQ,KAAK,KAAK,IAAI,EAAE;AAAA,MACxB;AAAA,IACF,EAAO,SAAI,OAAO,aAAa,CAAC,UAAU;AAAA,MACxC,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC3B,UAAU,CAAC;AAAA,IACb,EAAO;AAAA,MACL,QAAQ,KAAK,EAAE;AAAA;AAAA,IAEjB;AAAA,EACF;AAAA,EACA,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,EAC3B,OAAO;AAAA;AAGT,SAAS,cAAc,CAAC,MAAsB;AAAA,EAC5C,OAAO,KAAK,QAAQ,UAAU,IAAI;AAAA;AAIpC,SAAS,SAAS,CAAC,SAAyB;AAAA,EAC1C,WAAW,QAAQ,QAAQ,MAAM,UAAU,GAAG;AAAA,IAC5C,MAAM,UAAU,KAAK,KAAK;AAAA,IAC1B,IAAI,QAAQ,YAAY,EAAE,WAAW,KAAK,GAAG;AAAA,MAC3C,OAAO,QAAQ,MAAM,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAUF,SAAS,SAAS,CAAC,aAAoC;AAAA,EAC5D,MAAM,WAA0B,CAAC;AAAA,EACjC,WAAW,cAAc,sBAAsB,aAAa,GAAG,GAAG;AAAA,IAChE,MAAM,UAAU,WAAW,KAAK;AAAA,IAChC,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,MAAM,QAAQ,sBAAsB,SAAS,GAAG;AAAA,IAChD,MAAM,SAA4C,CAAC;AAAA,IACnD,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,IAAI,KAAK,KAAK;AAAA,MACpB,IAAI,CAAC;AAAA,QAAG;AAAA,MACR,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAAA,MAC3B,IAAI,QAAQ;AAAA,QAAG;AAAA,MACf,MAAM,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,YAAY;AAAA,MACjD,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAC,EAAE,KAAK;AAAA,MACpC,IAAI,MAAM,UAAU,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;AAAA,QAC5E,QAAQ,eAAe,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,MAC3C;AAAA,MACA,IAAI,QAAQ,UAAU,QAAQ,SAAS,QAAQ,MAAM;AAAA,QACnD,QAAQ,mBAAmB,KAAK;AAAA,MAClC;AAAA,MACA,IAAI,QAAQ,OAAO;AAAA,QACjB,MAAM,WAAW,OAAO;AAAA,QACxB,IAAI,MAAM,QAAQ,QAAQ,GAAG;AAAA,UAC3B,SAAS,KAAK,KAAK;AAAA,QACrB,EAAO;AAAA,UACL,OAAO,MAAM,CAAC,KAAK;AAAA;AAAA,MAEvB,EAAO;AAAA,QACL,OAAO,OAAO;AAAA;AAAA,IAElB;AAAA,IACA,MAAM,MAAM,MAAM,QAAQ,OAAO,GAAG,IAAI,OAAO,MAAM,CAAC;AAAA,IACtD,SAAS,KAAK;AAAA,MACZ,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,MAC/D,KAAK,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAM;AAAA,MACnD;AAAA,MACA,IAAI,OAAO,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAYF,SAAS,oBAAoB,CAAC,SAIlB;AAAA,EACjB,MAAM,WAAW,SAAS;AAAA,EAC1B,MAAM,SAAS,SAAS,UAAU;AAAA,EAClC,MAAM,gBAAgB,SAAS,iBAAiB;AAAA,EAEhD,OAAO,eAAe,YAAY,CAAC,SAAwC;AAAA,IACzE,MAAM,cAAc,QAAQ,QAAQ,IAAI,yBAAyB;AAAA,IACjE,IAAI,CAAC,aAAa;AAAA,MAChB,MAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAAA,IACA,MAAM,WAAW,UAAU,WAAW;AAAA,IACtC,IAAI,SAAS,WAAW,GAAG;AAAA,MACzB,MAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,IACA,MAAM,UAAU,kBAAkB,UAAU,SAAS,KAAK,SAAS,SAAS,SAAS;AAAA,IACrF,IAAI,UAAU;AAAA,MACZ,OAAO,SAAS,OAAO;AAAA,IACzB;AAAA,IACA,MAAM,YAAY,QAAQ,UAAU,UAAU,QAAQ,OAAO,IAAI;AAAA,IACjE,MAAM,SAA8B,CAAC;AAAA,IACrC,IAAI,QAAQ;AAAA,MAAM,OAAO,OAAO,QAAQ;AAAA,IACxC,IAAI,QAAQ;AAAA,MAAS,OAAO,UAAU,QAAQ;AAAA,IAC9C,IAAI,QAAQ;AAAA,MAAK,OAAO,MAAM,QAAQ;AAAA,IACtC,IAAI,QAAQ,IAAI,SAAS;AAAA,MAAG,OAAO,MAAM,CAAC,GAAG,QAAQ,GAAG;AAAA,IACxD,IAAI,QAAQ;AAAA,MAAI,OAAO,KAAK,QAAQ;AAAA,IACpC,OAAO,IAAI,YAAY,QAAQ,MAAM,WAAW,MAAM;AAAA;AAAA;AAQ1D,SAAS,mBAAmB,CAAC,SAAkB,QAAiC;AAAA,EAC9E,MAAM,MAAM,QAAQ,QAAQ,IAAI,MAAM;AAAA,EACtC,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI,MAAM,WAAW,eAAe;AAAA,EAC5C;AAAA,EACA,MAAM,SAAS,mBAAmB,GAAG;AAAA,EACrC,IAAI,CAAC,OAAO,WAAW,6BAA6B,GAAG;AAAA,IACrD,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAAA,EACA,IAAI;AAAA,IACF,OAAO,IAAI,gBAAgB,MAAM;AAAA,IACjC,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,MAAM,oCAAoC,KAAK;AAAA;AAAA;AAI7D,SAAS,eAAe,CAAC,MAA6B;AAAA,EACpD,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,YAAY,IAAI,KAAK,KAAK,SAAS;AAAA,EACzC,MAAM,WAAW,IAAI,KAAK,KAAK,OAAO;AAAA,EACtC,IAAI,MAAM,WAAW;AAAA,IACnB,MAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAAA,EACA,IAAI,MAAM,UAAU;AAAA,IAClB,MAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAAA;AAYK,SAAS,gBAAgB,CAAC,SAId;AAAA,EACjB,QAAQ,UAAU,SAAS,qBAAqB,cAAc,UAAU;AAAA,EAExE,OAAO,eAAe,YAAY,CAAC,SAAwC;AAAA,IACzE,MAAM,OAAO,oBAAoB,SAAS,MAAM;AAAA,IAChD,IAAI,aAAa;AAAA,MACf,gBAAgB,IAAI;AAAA,IACtB;AAAA,IACA,OAAO,SAAS,IAAI;AAAA;AAAA;AAIxB,IAAM,uBAAuB,IAAI,IAAI,CAAC,UAAU,QAAQ,UAAU,QAAQ,CAAC;AAQpE,SAAS,2BAA2B,CAAC,SAMzB;AAAA,EACjB,QAAQ,cAAc,QAAQ,YAAY,UAAU,gBAAgB;AAAA,EACpE,IAAI,CAAC,qBAAqB,IAAI,SAAS,GAAG;AAAA,IACxC,MAAM,IAAI,MAAM,+BAA+B,WAAW;AAAA,EAC5D;AAAA,EACA,MAAM,UACJ,wBAAwB,MAAM,eAAe,IAAI,IAAI,OAAO,QAAQ,YAAY,CAAC;AAAA,EAEnF,SAAS,QAAQ,CAAC,MAAoC;AAAA,IACpD,MAAM,KAAK,WAAW,SAAS,EAAE,OAAO,KAAK,GAAG,EAAE,OAAO,KAAK;AAAA,IAC9D,MAAM,MAAM,QAAQ,IAAI,EAAE;AAAA,IAC1B,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,MAAM,oCAAoC,IAAI;AAAA,IAC1D;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,OAAO,iBAAiB,EAAE,UAAU,QAAQ,YAAY,CAAC;AAAA;AASpD,SAAS,uBAAuB,CAAC,SAKrB;AAAA,EACjB,QAAQ,QAAQ,SAAS,QAAQ,kBAAkB,MAAM,gBAAgB,WAAW,CAAC;AAAA,EAErF,SAAS,QAAQ,CAAC,MAAoC;AAAA,IAEpD,MAAM,eAAe,KAAK,QACvB,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,IACjB,MAAM,YAAY,aAAa,KAAK,IAAI;AAAA,IAExC,IAAI,KAAK;AAAA,IACT,WAAW,QAAQ,cAAc;AAAA,MAC/B,IAAI,KAAK,YAAY,EAAE,WAAW,KAAK,GAAG;AAAA,QACxC,KAAK,KAAK,MAAM,CAAC;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,oBAAoB,QAAQ,CAAC,gBAAgB,IAAI,EAAE,GAAG;AAAA,MACxD,MAAM,IAAI,MAAM,eAAe,6BAA6B;AAAA,IAC9D;AAAA,IAEA,MAAM,YAAY,OAAO,KAAK,KAAK,cAAc,EAAE,SAAS,EAAE;AAAA,IAC9D,MAAM,gBAAgB,IAAI,KAAK,KAAK,OAAO,EAAE,YAAY;AAAA,IAEzD,OAAO,IAAI,YAAY,QAAQ,MAAM,IAAI;AAAA,MACvC,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,iBAAiB;AAAA,IACnB,CAAC;AAAA;AAAA,EAGH,OAAO,iBAAiB,EAAE,UAAU,QAAQ,YAAY,CAAC;AAAA;;ACrS3D,mBAAS;;;ACAT;AAAA,YACE;AAAA,UACA;AAAA,cACA;AAAA,WACA;AAAA;AAAA,aAEA;AAAA;AAAA;AAAA,WAGA;AAAA,YACA;AAAA,UACA;AAAA;AAQK,IAAM,MAAM,IAAI;AAEhB,IAAM,QAAQ,IAAI;AAElB,IAAM,MAAM,IAAI;AAEhB,IAAM,QAAQ,IAAI;AAElB,IAAM,QAAQ,IAAI;AAElB,IAAM,UAAU,IAAI;AAEpB,IAAM,OAAO,IAAI;AAsBjB,SAAS,QAAQ,CAAC,MAA0B;AAAA,EACjD,IAAI,gBAAgB;AAAA,IAAQ,OAAO;AAAA,EAEnC,MAAM,SAAkB,CAAC;AAAA,EACzB,YAAY,MAAM,UAAU,OAAO,QAAQ,IAAI,GAAG;AAAA,IAChD,IAAI,iBAAiB,QAAO;AAAA,MAC1B,OAAO,KAAK,KAAK;AAAA,IACnB,EAAO,SAAI,iBAAiB,WAAU;AAAA,MACpC,OAAO,KAAK,IAAI,OAAM,MAAM,OAAO,KAAK,CAAC;AAAA,IAC3C,EAAO;AAAA,MACL,MAAM,IAAI,UAAU,6BAA6B,0CAA0C,OAAO,OAAO;AAAA;AAAA,EAE7G;AAAA,EACA,OAAO,IAAI,QAAO,MAAM;AAAA;AAO1B,IAAM,WAAyD;AAAA,EAC7D,CAAC,OAAM,KAAK;AAAA,EACZ,CAAC,SAAQ,OAAO;AAAA,EAChB,CAAC,OAAM,MAAM;AAAA,EACb,CAAC,UAAS,OAAO;AAAA,EACjB,CAAC,SAAS,OAAO;AAAA,EACjB,CAAC,QAAO,KAAK;AAAA,EACb,CAAC,OAAO,KAAK;AAAA,EACb,CAAC,OAAO,KAAK;AACf;AAOO,SAAS,eAAe,CAAC,MAAsD;AAAA,EACpF,MAAM,SAAS,SAAS,IAAI;AAAA,EAC5B,IAAI,OAAO,OAAO,WAAW;AAAA,IAAG;AAAA,EAEhC,MAAM,SAAiC,CAAC;AAAA,EACxC,WAAW,SAAS,OAAO,QAAQ;AAAA,IACjC,IAAI;AAAA,IACJ,YAAY,MAAM,SAAS,UAAU;AAAA,MACnC,IAAI,MAAM,gBAAgB,MAAM;AAAA,QAC9B,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,OAAO,MAAM,QAAQ;AAAA,EACvB;AAAA,EACA,OAAO;AAAA;;;AD5FT,IAAM,gBAAe,IAAI,QAAO,CAAC,CAAC;AAAA;AAM3B,MAAM,SAAS;AAAA,EACX;AAAA,EACD,WAA0C,IAAI;AAAA,EAEtD,WAAW,CAAC,MAAc;AAAA,IACxB,KAAK,OAAO;AAAA;AAAA,EAad,KAAK,CACH,MACA,QAQM;AAAA,IACN,MAAM,SAAS,SAAS,OAAO,MAAM;AAAA,IACrC,KAAK,SAAS,IAAI,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,cAAc,SAAS,OAAO,MAAM;AAAA,MACpC,SAAS,OAAO;AAAA,MAChB,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO,cAAc,gBAAgB,MAAM;AAAA,IACzD,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,EAOT,QAAW,CACT,MACA,QAWM;AAAA,IACN,MAAM,SAAS,SAAS,OAAO,MAAM;AAAA,IACrC,KAAK,SAAS,IAAI,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc,SAAS,OAAO,YAAY;AAAA,MAC1C,aAAa;AAAA,MACb,cAAc,OAAO;AAAA,MACrB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO,eAAe,SAAS,OAAO,YAAY,IAAI;AAAA,MACpE,YAAY,OAAO;AAAA,MACnB,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO,cAAc,gBAAgB,MAAM;AAAA,IACzD,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,EAOT,QAAW,CACT,MACA,QAYM;AAAA,IACN,MAAM,SAAS,SAAS,OAAO,MAAM;AAAA,IACrC,KAAK,SAAS,IAAI,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAa,SAAS,OAAO,WAAW;AAAA,MACxC,cAAc,SAAS,OAAO,YAAY;AAAA,MAC1C,cAAc,OAAO;AAAA,MACrB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO,eAAe,SAAS,OAAO,YAAY,IAAI;AAAA,MACpE,YAAY,OAAO;AAAA,MACnB,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO,cAAc,gBAAgB,MAAM;AAAA,IACzD,CAAC;AAAA,IACD,OAAO;AAAA;AAAA,EAGT,UAAU,GAAkC;AAAA,IAC1C,OAAO,IAAI,IAAI,KAAK,QAAQ;AAAA;AAEhC;;AE5IA,mBAAS;;;ACAT,mBAAS;AAST,IAAM,gBAAe,IAAI,QAAO,CAAC,CAAC;AAiBlC,eAAsB,cAAc,CAClC,QACA,QACA,QACA,QACA,UACA,WACA,gBACe;AAAA,EACf,MAAM,aAAa,CAAC,CAAC,OAAO;AAAA,EAE5B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,IAAI,YAAY;AAAA,MACd,QAAQ,MAAM,OAAO,aAAc,MAAM;AAAA,IAC3C,EAAO;AAAA,MACL,QAAQ,MAAM,OAAO,aAAc,MAAM;AAAA;AAAA,IAE3C,OAAO,OAAY;AAAA,IACnB,MAAM,YAAY,OAAO,gBAAgB;AAAA,IACzC,MAAM,WAAW,gBAAgB,WAAW,OAAO,UAAU,SAAS;AAAA,IACtE,OAAO,YAAY,WAAW,CAAC,QAAQ,CAAC;AAAA,IAExC,MAAM,eAAc,MAAM,OAAO,eAAe;AAAA,IAChD,IAAI,cAAa;AAAA,MACf,OAAQ,MAAM,OAAO,cAAc,MAAO,MAAM,CAEhD;AAAA,IACF;AAAA,IACA;AAAA;AAAA,EAMF,MAAM,eAAe,OAAO,kBAAkB,OAAO;AAAA,EAIrD,MAAM,oBAAoB,OAAO,gBAAgB;AAAA,EAGjD,IAAI,OAAO,gBAAgB,OAAO,YAAY;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,YAAY,IAAI,gBAAgB,OAAO,cAAc,MAAM,UAAU,SAAS;AAAA,MACpF,MAAM,eAAe,OAAO,WAAW,QAAQ,OAAO,SAAS;AAAA,MAC/D,MAAM,cAAc,iBAAiB,OAAO,cAAc,cAAc,UAAU,SAAS;AAAA,MAC3F,MAAM,gBAAgB,CAAC,GAAG,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,WAAW;AAAA,MAC5E,OAAO,YAAY,OAAO,cAAc,aAAa;AAAA,MACrD,OAAO,OAAY;AAAA,MACnB,MAAM,WAAW,gBAAgB,OAAO,cAAc,OAAO,UAAU,SAAS;AAAA,MAChF,OAAO,YAAY,OAAO,cAAc,CAAC,QAAQ,CAAC;AAAA,MAElD,MAAM,eAAc,MAAM,OAAO,eAAe;AAAA,MAChD,IAAI,cAAa;AAAA,QACf,OAAQ,MAAM,OAAO,cAAc,MAAO,MAAM,CAAC;AAAA,MACnD;AAAA,MACA;AAAA;AAAA,EAEJ;AAAA,EAGA,MAAM,cAAc,MAAM,OAAO,eAAe;AAAA,EAChD,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,WAAW,gBAAgB,cAAc,IAAI,MAAM,mCAAmC,GAAG,UAAU,SAAS;AAAA,IAClH,OAAO,YAAY,cAAc,CAAC,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EAKA,MAAM,SAAS,OAAO,WAAW,YAAY;AAAA,EAG7C,MAAM,sBAAsB,OAAO;AAAA,EAEnC,IAAI;AAAA,IACF,OAAO,MAAM;AAAA,MACX,IAAI,aAAa,MAAM,OAAO,cAAc;AAAA,MAC5C,IAAI,CAAC;AAAA,QAAY;AAAA,MAMjB,IAAI,uBAAuB,CAAC,cAAc,WAAW,WAAW,qBAAqB;AAAA,QACnF,IAAI;AAAA,UACF,aAAa,qBAAqB,YAAY,mBAAmB;AAAA,UACjE,OAAO,GAAG;AAAA,UACV,IAAI,aAAa,WAAW;AAAA,YAE1B,MAAM;AAAA,UACR;AAAA,UAEA,QAAQ,QAAQ,+BAA+B,aAAa,QAAQ,EAAE,UAAU,GAAG;AAAA;AAAA,MAEvF;AAAA,MAEA,MAAM,MAAM,IAAI,gBAAgB,cAAc,mBAAmB,UAAU,SAAS;AAAA,MAEpF,IAAI,YAAY;AAAA,QACd,MAAM,OAAO,WAAY,OAAO,GAAG;AAAA,MACrC,EAAO;AAAA,QACL,MAAM,OAAO,WAAY,OAAO,YAAY,GAAG;AAAA;AAAA,MAGjD,WAAW,WAAW,IAAI,SAAS;AAAA,QACjC,IAAI,QAAQ,QAAQ;AAAA,QACpB,IAAI,gBAAgB;AAAA,UAClB,QAAQ,MAAM,sBAAsB,OAAO,cAAc;AAAA,QAC3D;AAAA,QACA,OAAO,MAAM,KAAK;AAAA,MACpB;AAAA,MAEA,IAAI,IAAI,UAAU;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,OAAY;AAAA,IACnB,OAAO,MAAM,gBAAgB,cAAc,OAAO,UAAU,SAAS,CAAC;AAAA;AAAA,EAGxE,OAAO,MAAM;AAAA,EAMb,IAAI;AAAA,IACF,OAAQ,MAAM,OAAO,cAAc,MAAO,MAAM,CAAC;AAAA,IACjD,MAAM;AAAA;;;AClJV,eAAsB,aAAa,CACjC,QACA,QACA,QACA,UACA,WACA,gBACe;AAAA,EACf,MAAM,SAAS,OAAO;AAAA,EACtB,MAAM,MAAM,IAAI,gBAAgB,QAAQ,MAAM,UAAU,SAAS;AAAA,EAEjE,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,OAAO,QAAS,QAAQ,GAAG;AAAA,IAChD,IAAI,cAAc,iBAAiB,QAAQ,QAAQ,UAAU,SAAS;AAAA,IACtE,IAAI,gBAAgB;AAAA,MAClB,cAAc,MAAM,sBAAsB,aAAa,cAAc;AAAA,IACvE;AAAA,IAEA,MAAM,UAAU,CAAC,GAAG,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,WAAW;AAAA,IAChE,OAAO,YAAY,QAAQ,OAAO;AAAA,IAClC,OAAO,OAAY;AAAA,IACnB,MAAM,QAAQ,gBAAgB,QAAQ,OAAO,UAAU,SAAS;AAAA,IAChE,OAAO,YAAY,QAAQ,CAAC,KAAK,CAAC;AAAA;AAAA;;;ACjCtC;AACA,oCAA2B;AAE3B,IAAM,YAAY;AAQlB,SAAS,QAAQ,CAAC,IAAY,MAAwB;AAAA,EACpD,IAAI,SAAS;AAAA,EACb,OAAO,SAAS,KAAK,QAAQ;AAAA,IAC3B,IAAI;AAAA,MACF,MAAM,UAAU,UAAU,IAAI,MAAM,QAAQ,KAAK,SAAS,MAAM;AAAA,MAChE,IAAI,WAAW;AAAA,QAAG,MAAM,IAAI,MAAM,sBAAsB,SAAS;AAAA,MACjE,UAAU;AAAA,MACV,OAAO,GAAQ;AAAA,MACf,IAAI,EAAE,SAAS,UAAU;AAAA,QAEvB,QAAQ,KAAK,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,EAEV;AAAA;AAAA;AAUK,MAAM,gBAAgB;AAAA,EACV;AAAA,EAEjB,WAAW,CAAC,KAAa,WAAW;AAAA,IAClC,KAAK,KAAK;AAAA;AAAA,EAOZ,WAAW,CAAC,QAAgB,SAA8B;AAAA,IACxD,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,MAAM,WAAW,MAAM;AAAA,IAC9B,WAAW,SAAS,SAAS;AAAA,MAE1B,OAAe,kBAAkB,KAAK;AAAA,IACzC;AAAA,IACA,OAAO,MAAM;AAAA,IACb,MAAM,SAAQ,OAAO,aAAa,IAAI;AAAA,IACtC,SAAS,KAAK,IAAI,MAAK;AAAA;AAAA,EAQzB,UAAU,CAAC,QAAmC;AAAA,IAC5C,OAAO,IAAI,kBAAkB,KAAK,IAAI,MAAM;AAAA;AAEhD;AAAA;AAWO,MAAM,kBAAkB;AAAA,EACrB;AAAA,EACS;AAAA,EACT,SAAS;AAAA,EAEjB,WAAW,CAAC,IAAY,QAAgB;AAAA,IACtC,KAAK,KAAK;AAAA,IACV,KAAK,SAAS,IAAI;AAAA,IAElB,KAAK,OAAO,MAAM,WAAW,MAAM;AAAA,IACnC,KAAK,MAAM;AAAA;AAAA,EAab,KAAK,CAAC,OAA0B;AAAA,IAC9B,IAAI,KAAK;AAAA,MAAQ,MAAM,IAAI,MAAM,uBAAuB;AAAA,IACvD,KAAK,OAAe,kBAAkB,KAAK;AAAA,IAC5C,KAAK,MAAM;AAAA;AAAA,EAMb,KAAK,GAAS;AAAA,IACZ,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,KAAK,SAAS;AAAA,IAEd,MAAM,MAAM,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM;AAAA,IACzD,SAAS,KAAK,IAAI,GAAG;AAAA;AAAA,EAOf,KAAK,GAAS;AAAA,IACpB,MAAM,SAAU,KAAK,OAAe,MAAM;AAAA,IAC1C,WAAW,SAAS,QAAQ;AAAA,MAC1B,SAAS,KAAK,IAAI,KAAK;AAAA,IACzB;AAAA,IACA,OAAO,SAAS;AAAA;AAEpB;;;AHnHA,IAAM,gBAAe,IAAI,QAAO,CAAC,CAAC;AAAA;AAM3B,MAAM,aAAa;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAuE;AAAA,EACvE,eAAoC;AAAA,EACpC;AAAA,EAER,WAAW,CACT,UACA,SAMA;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,KAAK,iBAAiB,SAAS,kBAAkB;AAAA,IACjD,KAAK,WAAW,SAAS,YAAY,OAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IACtF,KAAK,eAAe,SAAS,gBAAgB;AAAA,IAC7C,KAAK,iBAAiB,SAAS;AAAA,IAE/B,IAAI,KAAK,gBAAgB;AAAA,MACvB,QAAQ,UAAU,mBAAmB,SAAS,MAAM,SAAS,WAAW,GAAG,KAAK,QAAQ;AAAA,MACxF,KAAK,gBAAgB;AAAA,IACvB;AAAA;AAAA,OAII,IAAG,GAAkB;AAAA,IACzB,MAAM,QAAQ,QAAQ;AAAA,IAGtB,IAAI,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO;AAAA,MAC/C,QAAQ,OAAO,MACb,sEACE;AAAA,IACA,4DACA;AAAA,CACJ;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,MAAM,gBAAgB,OAAO,KAAK;AAAA,IACjD,MAAM,SAAS,IAAI;AAAA,IAEnB,IAAI;AAAA,MACF,OAAO,MAAM;AAAA,QACX,MAAM,KAAK,SAAS,QAAQ,MAAM;AAAA,MACpC;AAAA,MACA,OAAO,GAAQ;AAAA,MAEf,IACE,EAAE,SAAS,SAAS,QAAQ,KAC5B,EAAE,SAAS,SAAS,yBAAyB,KAC7C,EAAE,SAAS,SAAS,kBAAkB,KACtC,EAAE,SAAS,WACX,EAAE,SAAS,gCACX,EAAE,SAAS,0BACV,aAAa,SAAS,EAAE,QAAQ,SAAS,KAAK,GAC/C;AAAA,QACA;AAAA,MACF;AAAA,MAEA,MAAM;AAAA,cACN;AAAA,MACA,MAAM,OAAO,OAAO;AAAA;AAAA;AAAA,OAIV,SAAQ,CAAC,QAAyB,QAAwC;AAAA,IACtF,MAAM,SAAS,MAAM,OAAO,WAAW;AAAA,IACvC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,KAAK;AAAA,IACvB;AAAA,IAEA,QAAQ,QAAQ,YAAY;AAAA,IAC5B,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,MAAM,MAAM,IAAI,SAAS,iBAAiB,sCAAsC,EAAE;AAAA,MAClF,MAAM,WAAW,gBAAgB,eAAc,KAAK,KAAK,UAAU,IAAI;AAAA,MACvE,OAAO,YAAY,eAAc,CAAC,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,QAAQ;AAAA,IACtB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,SAAS,aAAa,QAAQ,KAAK;AAAA,MACzC,aAAa,OAAO;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,MACnB,OAAO,GAAQ;AAAA,MAEf,MAAM,WAAW,gBAAgB,eAAc,GAAG,KAAK,UAAU,IAAI;AAAA,MACrE,OAAO,YAAY,eAAc,CAAC,QAAQ,CAAC;AAAA,MAC3C,IAAI,aAAa,gBAAgB,aAAa,UAAU;AAAA,QACtD;AAAA,MACF;AAAA,MACA,MAAM;AAAA;AAAA,IAIR,IAAI,eAAe,wBAAwB,KAAK,eAAe;AAAA,MAC7D,OAAO,YAAY,KAAK,cAAc,QAAQ,CAAC,KAAK,aAAa,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,IAGA,MAAM,UAAU,KAAK,SAAS,WAAW;AAAA,IACzC,MAAM,SAAS,QAAQ,IAAI,UAAU;AAAA,IACrC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK;AAAA,MAC3C,MAAM,MAAM,IAAI,MAAM,oBAAoB,oCAAoC,UAAU,KAAK,IAAI,IAAI;AAAA,MACrG,MAAM,WAAW,gBAAgB,eAAc,KAAK,KAAK,UAAU,SAAS;AAAA,MAC5E,OAAO,YAAY,eAAc,CAAC,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,OAAO,+BAA4B,UAAU;AAAA,IAChE,MAAM,OAAqB,EAAE,QAAQ,YAAY,YAAY,UAAU,KAAK,UAAU,UAAU;AAAA,IAChG,MAAM,QAAwB;AAAA,MAC5B,cAAc;AAAA,MACd,eAAe;AAAA,MACf,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AAAA,IAEA,MAAM,QAAQ,KAAK,cAAc,gBAAgB,IAAI;AAAA,IACrD,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,IAAI,OAAO,8BAA2B;AAAA,QACpC,MAAM,cAAc,QAAQ,QAAQ,QAAQ,KAAK,UAAU,WAAW,KAAK,cAAc;AAAA,MAC3F,EAAO;AAAA,QACL,MAAM,eAAe,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,UAAU,WAAW,KAAK,cAAc;AAAA;AAAA,MAEpG,OAAO,GAAG;AAAA,MACV,gBAAgB,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,MAC5D,MAAM;AAAA,cACN;AAAA,MACA,KAAK,cAAc,cAAc,OAAO,MAAM,OAAO,aAAa;AAAA;AAAA;AAGxE;",
42
- "debugId": "3B7AFF468BF99FC764756E2164756E21",
23
+ "mappings": "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",
24
+ "debugId": "BE194B50857FDC5664756E2164756E21",
43
25
  "names": []
44
26
  }