{"version":3,"file":"src-somSF6cl.mjs","names":[],"sources":["../src/storage-utils.ts","../src/s3-presign.ts","../src/storage.ts","../src/cache.ts","../src/index.ts"],"sourcesContent":["export const DEFAULT_STORAGE_URL_EXPIRES_SECONDS = 3600;\nexport const MAX_STORAGE_URL_EXPIRES_SECONDS = 7 * 24 * 60 * 60;\n\nexport function encodeObjectKey(key: string): string {\n  if (key.trim() === \"\" || key.startsWith(\"/\")) {\n    throw new TypeError(\"storage key must be a non-empty relative object key\");\n  }\n  const segments = key.split(\"/\");\n  // `.`/`..` segments survive percent-encoding and get normalized away by\n  // URL parsers, letting a key escape the configured base prefix.\n  if (segments.some((segment) => segment === \".\" || segment === \"..\")) {\n    throw new TypeError(\"storage key must not contain '.' or '..' path segments\");\n  }\n  return segments.map(rfc3986Encode).join(\"/\");\n}\n\nexport function joinUrlPath(...parts: string[]): string {\n  const joined = parts\n    .map((part) => part.replace(/^\\/+|\\/+$/g, \"\"))\n    .filter(Boolean)\n    .join(\"/\");\n  return `/${joined}`;\n}\n\nexport function validateStorageUrlExpires(value: number): number {\n  if (!Number.isInteger(value) || value < 1 || value > MAX_STORAGE_URL_EXPIRES_SECONDS) {\n    throw new TypeError(\"storage URL expiration must be an integer from 1 to 604800 seconds\");\n  }\n  return value;\n}\n\nexport function rfc3986Encode(value: string): string {\n  return encodeURIComponent(value).replace(\n    /[!'()*]/g,\n    (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n  );\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n  return bytesToHex(await subtle().digest(\"SHA-256\", utf8(value)));\n}\n\nexport async function hmacBytes(key: BufferSource, value: string): Promise<ArrayBuffer> {\n  const cryptoKey = await subtle().importKey(\"raw\", key, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n    \"sign\",\n  ]);\n  return subtle().sign(\"HMAC\", cryptoKey, utf8(value));\n}\n\nexport async function hmacHex(key: BufferSource, value: string): Promise<string> {\n  return bytesToHex(await hmacBytes(key, value));\n}\n\nexport function utf8(value: string): ArrayBuffer {\n  return new TextEncoder().encode(value).slice().buffer as ArrayBuffer;\n}\n\nexport function bytesToHex(value: ArrayBuffer): string {\n  return Array.from(new Uint8Array(value))\n    .map((byte) => byte.toString(16).padStart(2, \"0\"))\n    .join(\"\");\n}\n\nfunction subtle(): SubtleCrypto {\n  const crypto = globalThis.crypto;\n  if (!crypto?.subtle) {\n    throw new Error(\"Web Crypto is required to sign storage URLs\");\n  }\n  return crypto.subtle;\n}\n","import type { TakoStorageBinding } from \"./storage\";\nimport {\n  DEFAULT_STORAGE_URL_EXPIRES_SECONDS,\n  encodeObjectKey,\n  hmacBytes,\n  hmacHex,\n  joinUrlPath,\n  rfc3986Encode,\n  sha256Hex,\n  utf8,\n  validateStorageUrlExpires,\n} from \"./storage-utils\";\n\nconst SERVICE = \"s3\";\nconst SIGNING_ALGORITHM = \"AWS4-HMAC-SHA256\";\nconst UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\n\nexport async function presignS3Url(input: {\n  binding: TakoStorageBinding;\n  key: string;\n  method: \"GET\" | \"PUT\";\n  expiresInSeconds: number | undefined;\n  query: Record<string, string>;\n  headers: Record<string, string>;\n  now: () => Date;\n}): Promise<string> {\n  assertS3Binding(input.binding);\n  const url = objectUrl(input.binding, input.key);\n  for (const [key, value] of Object.entries(input.query)) {\n    url.searchParams.set(key, value);\n  }\n\n  const expires = validateStorageUrlExpires(\n    input.expiresInSeconds ?? DEFAULT_STORAGE_URL_EXPIRES_SECONDS,\n  );\n  const date = input.now();\n  const amzDate = formatAmzDate(date);\n  const dateStamp = amzDate.slice(0, 8);\n  const scope = `${dateStamp}/${input.binding.region}/${SERVICE}/aws4_request`;\n  const headers = normalizeHeaders({ host: url.host, ...input.headers });\n  const signedHeaders = Object.keys(headers).sort().join(\";\");\n\n  url.searchParams.set(\"X-Amz-Algorithm\", SIGNING_ALGORITHM);\n  url.searchParams.set(\"X-Amz-Credential\", `${input.binding.access_key_id}/${scope}`);\n  url.searchParams.set(\"X-Amz-Date\", amzDate);\n  url.searchParams.set(\"X-Amz-Expires\", String(expires));\n  url.searchParams.set(\"X-Amz-SignedHeaders\", signedHeaders);\n\n  const canonicalRequest = [\n    input.method,\n    canonicalUri(url),\n    canonicalQuery(url.searchParams),\n    canonicalHeaders(headers),\n    signedHeaders,\n    UNSIGNED_PAYLOAD,\n  ].join(\"\\n\");\n\n  const stringToSign = [SIGNING_ALGORITHM, amzDate, scope, await sha256Hex(canonicalRequest)].join(\n    \"\\n\",\n  );\n  const signingKey = await deriveSigningKey(\n    input.binding.secret_access_key,\n    dateStamp,\n    input.binding.region,\n  );\n  const signature = await hmacHex(signingKey, stringToSign);\n  url.searchParams.set(\"X-Amz-Signature\", signature);\n  return url.toString();\n}\n\nfunction objectUrl(binding: TakoStorageBinding, key: string): URL {\n  assertS3Binding(binding);\n  const encodedKey = encodeObjectKey(key);\n  const endpoint = new URL(binding.endpoint);\n  if (endpoint.protocol !== \"https:\") {\n    throw new TypeError(\"storage endpoint must use https\");\n  }\n\n  if (binding.force_path_style) {\n    endpoint.pathname = joinUrlPath(endpoint.pathname, binding.bucket, encodedKey);\n    return endpoint;\n  }\n\n  endpoint.hostname = `${binding.bucket}.${endpoint.hostname}`;\n  endpoint.pathname = joinUrlPath(endpoint.pathname, encodedKey);\n  return endpoint;\n}\n\nfunction assertS3Binding(binding: TakoStorageBinding): asserts binding is TakoStorageBinding & {\n  provider: \"s3\";\n  bucket: string;\n  endpoint: string;\n  region: string;\n  access_key_id: string;\n  secret_access_key: string;\n} {\n  if (\n    binding.provider !== \"s3\" ||\n    !binding.bucket ||\n    !binding.endpoint ||\n    !binding.region ||\n    !binding.access_key_id ||\n    !binding.secret_access_key\n  ) {\n    throw new TypeError(\"storage binding is not configured for s3\");\n  }\n}\n\nfunction normalizeHeaders(headers: Record<string, string>): Record<string, string> {\n  return Object.fromEntries(\n    Object.entries(headers)\n      .map(([key, value]) => [key.toLowerCase(), value.trim()] as const)\n      .sort(([a], [b]) => a.localeCompare(b)),\n  );\n}\n\nfunction canonicalHeaders(headers: Record<string, string>): string {\n  return Object.entries(headers)\n    .map(([key, value]) => `${key}:${value.replace(/\\s+/g, \" \")}\\n`)\n    .join(\"\");\n}\n\nfunction canonicalUri(url: URL): string {\n  return url.pathname\n    .split(\"/\")\n    .map((segment) => rfc3986Encode(decodeURIComponent(segment)))\n    .join(\"/\");\n}\n\nfunction canonicalQuery(params: URLSearchParams): string {\n  return Array.from(params.entries())\n    .sort(([aKey, aValue], [bKey, bValue]) =>\n      aKey === bKey ? compareAscii(aValue, bValue) : compareAscii(aKey, bKey),\n    )\n    .map(([key, value]) => `${rfc3986Encode(key)}=${rfc3986Encode(value)}`)\n    .join(\"&\");\n}\n\nfunction compareAscii(a: string, b: string): number {\n  return a < b ? -1 : a > b ? 1 : 0;\n}\n\nasync function deriveSigningKey(\n  secret: string,\n  dateStamp: string,\n  region: string,\n): Promise<ArrayBuffer> {\n  const kDate = await hmacBytes(utf8(`AWS4${secret}`), dateStamp);\n  const kRegion = await hmacBytes(kDate, region);\n  const kService = await hmacBytes(kRegion, SERVICE);\n  return hmacBytes(kService, \"aws4_request\");\n}\n\nfunction formatAmzDate(date: Date): string {\n  return date.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n}\n","import {\n  imageSrcSet,\n  imageUrl,\n  type ImageSrcSet,\n  type ImageSrcSetOptions,\n  type ImageUrlOptions,\n} from \"./images\";\nimport { presignS3Url } from \"./s3-presign\";\nimport {\n  DEFAULT_STORAGE_URL_EXPIRES_SECONDS,\n  encodeObjectKey,\n  hmacHex,\n  joinUrlPath,\n  utf8,\n  validateStorageUrlExpires,\n} from \"./storage-utils\";\nimport { getStorageBindings } from \"./tako/secrets\";\n\n/** Project-specific storage bindings. Augmented by generated `tako.d.ts`. */\nexport interface TakoStorages {}\n\n/** Runtime storage binding metadata delivered by Tako at process startup. */\nexport interface TakoStorageBinding {\n  /** Storage provider kind. */\n  provider: \"local\" | \"s3\";\n  /** S3-compatible bucket name. */\n  bucket?: string | undefined;\n  /** S3-compatible endpoint URL. */\n  endpoint?: string | undefined;\n  /** S3-compatible region. */\n  region?: string | undefined;\n  /** S3-compatible access key id. */\n  access_key_id?: string | undefined;\n  /** S3-compatible secret access key. */\n  secret_access_key?: string | undefined;\n  /** Use path-style S3 URLs instead of virtual-hosted URLs. */\n  force_path_style?: boolean | undefined;\n  /** Public object base URL used when `public: true` is requested. */\n  public_base_url?: string | undefined;\n  /** Local storage root path. */\n  path?: string | undefined;\n  /** Local storage URL signing key. */\n  signing_key?: string | undefined;\n}\n\n/** Options for {@link TakoStorage.createDownloadUrl}. */\nexport interface CreateDownloadUrlOptions {\n  /**\n   * Link lifetime. S3-compatible services cap this at seven days.\n   * @defaultValue 3600\n   */\n  expiresInSeconds?: number;\n  /**\n   * Use `public_base_url` instead of signing when the storage has one configured.\n   * @defaultValue false\n   */\n  public?: boolean;\n  /** Optional S3 response content type override. */\n  responseContentType?: string;\n  /** Optional S3 response content disposition override. */\n  responseContentDisposition?: string;\n}\n\n/** Options for {@link TakoStorage.createUploadUrl}. */\nexport interface CreateUploadUrlOptions {\n  /**\n   * Link lifetime. S3-compatible services cap this at seven days.\n   * @defaultValue 3600\n   */\n  expiresInSeconds?: number;\n  /** Content-Type the uploader must send with the PUT request. */\n  contentType?: string;\n}\n\n/** Options for {@link TakoStorage.createImageUrl}. */\nexport type CreateImageUrlOptions = ImageUrlOptions & {\n  /**\n   * Link lifetime for private direct object URLs.\n   * @defaultValue 3600\n   */\n  expiresInSeconds?: number;\n  /**\n   * Use `public_base_url` and the public image optimizer.\n   * @defaultValue false\n   */\n  public?: boolean;\n};\n\n/** Options for {@link TakoStorage.createImageSrcSet}. */\nexport type CreateImageSrcSetOptions = ImageSrcSetOptions & {\n  /**\n   * Use `public_base_url` and the public image optimizer. Required until\n   * private image transforms are supported.\n   * @defaultValue false\n   */\n  public?: boolean;\n};\n\n/** Handle for one configured object storage binding. */\nexport interface TakoStorage {\n  /** Create a signed or public URL for downloading an object. */\n  createDownloadUrl(key: string, options?: CreateDownloadUrlOptions): Promise<string>;\n  /** Create a signed URL for uploading an object with PUT. */\n  createUploadUrl(key: string, options?: CreateUploadUrlOptions): Promise<string>;\n  /** Create an image URL for a stored object. */\n  createImageUrl(key: string, options?: CreateImageUrlOptions): Promise<string>;\n  /** Create responsive image attributes for a stored object. */\n  createImageSrcSet(key: string, options: CreateImageSrcSetOptions): Promise<ImageSrcSet>;\n}\n\n/** Typed storage bag exposed as `tako.storages`. */\nexport type TakoStorageBag<T = TakoStorages> = Readonly<{\n  [K in keyof T]: TakoStorage;\n}> &\n  Readonly<Record<string, TakoStorage | undefined>>;\n\ninterface StorageBagOptions {\n  now?: () => Date;\n}\n\n/** Load storage bindings delivered by the Tako runtime. */\nexport function loadStorages<T = TakoStorages>(): TakoStorageBag<T> {\n  return createStorageBag<T>(getStorageBindings());\n}\n\n/**\n * Create a typed storage bag from raw binding metadata.\n *\n * @internal\n */\nexport function createStorageBag<T = TakoStorages>(\n  bindings: Record<string, unknown>,\n  options: StorageBagOptions = {},\n): TakoStorageBag<T> {\n  const storages = new Map<string, TakoStorage>();\n  const now = options.now ?? (() => new Date());\n\n  for (const [name, raw] of Object.entries(bindings)) {\n    const binding = parseBinding(name, raw);\n    storages.set(name, createStorage(name, binding, now));\n  }\n\n  return new Proxy(Object.create(null) as Record<string, TakoStorage>, {\n    get(_target, prop: string | symbol): unknown {\n      if (typeof prop !== \"string\") return undefined;\n      return storages.get(prop);\n    },\n    ownKeys(): string[] {\n      return Array.from(storages.keys());\n    },\n    getOwnPropertyDescriptor(_target, prop: string | symbol) {\n      if (typeof prop === \"string\") {\n        const storage = storages.get(prop);\n        if (storage) {\n          return { configurable: true, enumerable: false, value: storage };\n        }\n      }\n      return undefined;\n    },\n    has(_target, prop: string | symbol): boolean {\n      return typeof prop === \"string\" && storages.has(prop);\n    },\n  }) as TakoStorageBag<T>;\n}\n\nfunction createStorage(name: string, binding: TakoStorageBinding, now: () => Date): TakoStorage {\n  return Object.freeze({\n    createDownloadUrl(key: string, options: CreateDownloadUrlOptions = {}) {\n      if (binding.provider === \"local\") {\n        return localStorageUrl(name, binding, \"GET\", key, options.expiresInSeconds, now);\n      }\n      const publicUrl = publicObjectUrl(binding, key, options.public ?? false);\n      if (publicUrl) return Promise.resolve(publicUrl);\n\n      return presignS3Url({\n        binding,\n        key,\n        method: \"GET\",\n        expiresInSeconds: options.expiresInSeconds,\n        query: responseOverrideQuery(options),\n        headers: {},\n        now,\n      });\n    },\n\n    createUploadUrl(key: string, options: CreateUploadUrlOptions = {}) {\n      if (binding.provider === \"local\") {\n        return localStorageUrl(name, binding, \"PUT\", key, options.expiresInSeconds, now);\n      }\n      return presignS3Url({\n        binding,\n        key,\n        method: \"PUT\",\n        expiresInSeconds: options.expiresInSeconds,\n        query: {},\n        headers: options.contentType ? { \"content-type\": options.contentType } : {},\n        now,\n      });\n    },\n\n    async createImageUrl(key: string, options: CreateImageUrlOptions = {}) {\n      const { expiresInSeconds, public: usePublic, ...imageOptions } = options;\n      if (binding.provider === \"local\") {\n        if (hasImageTransformOptions(imageOptions)) {\n          throw new TypeError(\"local storage image transforms require public storage for now\");\n        }\n        return localStorageUrl(name, binding, \"GET\", key, expiresInSeconds, now);\n      }\n      const publicUrl = publicObjectUrl(binding, key, usePublic ?? false);\n      if (publicUrl) {\n        return imageUrl(publicUrl, imageOptions);\n      }\n\n      if (hasImageTransformOptions(imageOptions)) {\n        throw new TypeError(\n          \"private storage image transforms require a public_base_url for now; use createDownloadUrl for a signed object URL\",\n        );\n      }\n\n      return presignS3Url({\n        binding,\n        key,\n        method: \"GET\",\n        expiresInSeconds,\n        query: {},\n        headers: {},\n        now,\n      });\n    },\n\n    async createImageSrcSet(key: string, options: CreateImageSrcSetOptions) {\n      const { public: usePublic, ...imageOptions } = options;\n      const publicUrl = publicObjectUrl(binding, key, usePublic ?? false);\n      if (publicUrl) {\n        return imageSrcSet(publicUrl, imageOptions);\n      }\n\n      throw new TypeError(\n        \"private storage image srcsets require a public_base_url for now; use createDownloadUrl for a signed object URL\",\n      );\n    },\n  });\n}\n\nfunction parseBinding(name: string, raw: unknown): TakoStorageBinding {\n  if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n    throw new TypeError(`invalid storage binding ${name}: expected object`);\n  }\n  const binding = raw as Partial<TakoStorageBinding>;\n  if (binding.provider !== \"local\" && binding.provider !== \"s3\") {\n    throw new TypeError(`invalid storage binding ${name}: provider must be local or s3`);\n  }\n\n  if (binding.provider === \"local\") {\n    for (const field of [\"path\", \"signing_key\"] as const) {\n      if (typeof binding[field] !== \"string\" || binding[field]?.trim() === \"\") {\n        throw new TypeError(`invalid storage binding ${name}: missing ${field}`);\n      }\n    }\n    return {\n      provider: \"local\",\n      path: binding.path as string,\n      signing_key: binding.signing_key as string,\n    };\n  }\n\n  for (const field of [\n    \"bucket\",\n    \"endpoint\",\n    \"region\",\n    \"access_key_id\",\n    \"secret_access_key\",\n  ] as const) {\n    if (typeof binding[field] !== \"string\" || binding[field]?.trim() === \"\") {\n      throw new TypeError(`invalid storage binding ${name}: missing ${field}`);\n    }\n  }\n  return {\n    provider: \"s3\",\n    bucket: binding.bucket as string,\n    endpoint: (binding.endpoint as string).replace(/\\/+$/, \"\"),\n    region: binding.region as string,\n    access_key_id: binding.access_key_id as string,\n    secret_access_key: binding.secret_access_key as string,\n    force_path_style: binding.force_path_style === true,\n    public_base_url: binding.public_base_url?.replace(/\\/+$/, \"\"),\n  };\n}\n\nfunction publicObjectUrl(\n  binding: TakoStorageBinding,\n  key: string,\n  requested: boolean,\n): string | null {\n  if (binding.provider !== \"s3\") return null;\n  if (!requested) return null;\n  if (!binding.public_base_url) {\n    throw new TypeError(\"storage does not have public_base_url configured\");\n  }\n  const url = new URL(binding.public_base_url);\n  url.pathname = joinUrlPath(url.pathname, encodeObjectKey(key));\n  return url.toString();\n}\n\nfunction localStorageUrl(\n  name: string,\n  binding: TakoStorageBinding,\n  method: \"GET\" | \"PUT\",\n  key: string,\n  expiresInSeconds: number | undefined,\n  now: () => Date,\n): Promise<string> {\n  if (binding.provider !== \"local\" || !binding.path || !binding.signing_key) {\n    throw new TypeError(\"storage binding is not configured for local storage\");\n  }\n  const expires =\n    Math.floor(now().getTime() / 1000) +\n    validateStorageUrlExpires(expiresInSeconds ?? DEFAULT_STORAGE_URL_EXPIRES_SECONDS);\n  const encodedKey = encodeObjectKey(key);\n  const signingKey = binding.signing_key;\n  const payload = `${method}\\n${name}\\n${encodedKey}\\n${expires}`;\n  return hmacHex(utf8(signingKey), payload).then((token) => {\n    return `/_tako/storages/${encodeURIComponent(name)}/${encodedKey}?expires=${expires}&token=${token}`;\n  });\n}\n\nfunction responseOverrideQuery(options: CreateDownloadUrlOptions): Record<string, string> {\n  const query: Record<string, string> = {};\n  if (options.responseContentType) query[\"response-content-type\"] = options.responseContentType;\n  if (options.responseContentDisposition) {\n    query[\"response-content-disposition\"] = options.responseContentDisposition;\n  }\n  return query;\n}\n\nfunction hasImageTransformOptions(options: ImageUrlOptions): boolean {\n  return (\n    options.width !== undefined || options.quality !== undefined || options.format !== undefined\n  );\n}\n","interface CachePutOptions {\n  /** Time to live in milliseconds. */\n  ttl: number;\n}\n\ninterface CacheRow {\n  value: string;\n  expires_at: number;\n}\n\ninterface SqliteStatement<T = unknown> {\n  get?: (...params: unknown[]) => T | undefined;\n  run: (...params: unknown[]) => unknown;\n}\n\ninterface SqliteDatabase {\n  exec(sql: string): unknown;\n  prepare<T = unknown>(sql: string): SqliteStatement<T>;\n}\n\ntype SqliteDatabaseConstructor = new (path: string) => SqliteDatabase;\n\nconst databasePromises = new Map<string, Promise<SqliteDatabase>>();\n\nconst runtimeImport = new Function(\"specifier\", \"return import(specifier)\") as <T>(\n  specifier: string,\n) => Promise<T>;\n\nasync function getCachedValue<T>(key: string): Promise<T | undefined> {\n  validateCacheKey(key);\n\n  const db = await openCacheDatabase();\n  const now = Date.now();\n  const row = db\n    .prepare<CacheRow>(\"SELECT value, expires_at FROM cache_entries WHERE key = ?\")\n    .get?.(key);\n\n  if (!row) {\n    return undefined;\n  }\n  if (row.expires_at <= now) {\n    db.prepare(\"DELETE FROM cache_entries WHERE key = ?\").run(key);\n    return undefined;\n  }\n  return JSON.parse(row.value) as T;\n}\n\nasync function putCachedValue<T>(key: string, value: T, options: CachePutOptions): Promise<void> {\n  validateCacheKey(key);\n  validateTtl(options.ttl);\n\n  const encoded = JSON.stringify(value);\n  if (encoded === undefined) {\n    throw new Error(\"Cache value must be JSON-serializable.\");\n  }\n\n  const db = await openCacheDatabase();\n  const now = Date.now();\n  const expiresAt = now + options.ttl;\n  db.prepare(\n    `INSERT INTO cache_entries (key, value, expires_at, updated_at)\n     VALUES (?, ?, ?, ?)\n     ON CONFLICT(key) DO UPDATE SET\n       value = excluded.value,\n       expires_at = excluded.expires_at,\n       updated_at = excluded.updated_at`,\n  ).run(key, encoded, expiresAt, now);\n}\n\nasync function deleteCachedValue(key: string): Promise<void> {\n  validateCacheKey(key);\n  const db = await openCacheDatabase();\n  db.prepare(\"DELETE FROM cache_entries WHERE key = ?\").run(key);\n}\n\n/**\n * Server-side JSON cache backed by Tako-managed SQLite storage.\n *\n * Available only inside a Tako-managed runtime with `TAKO_DATA_DIR` set.\n */\nexport const cache = Object.freeze({\n  /**\n   * Read a cache entry.\n   *\n   * @param key - Cache key.\n   * @returns The stored value, or `undefined` when missing or expired.\n   */\n  get<T>(key: string): Promise<T | undefined> {\n    return getCachedValue<T>(key);\n  },\n  /**\n   * Store a JSON-serializable cache entry.\n   *\n   * @param key - Cache key.\n   * @param value - JSON-serializable value.\n   * @param options - Cache options.\n   */\n  put<T>(key: string, value: T, options: { ttl: number }): Promise<void> {\n    return putCachedValue(key, value, options);\n  },\n  /**\n   * Delete one cache entry.\n   *\n   * @param key - Cache key.\n   */\n  delete(key: string): Promise<void> {\n    return deleteCachedValue(key);\n  },\n});\n\nasync function openCacheDatabase(): Promise<SqliteDatabase> {\n  const path = await cacheDatabasePath();\n  let databasePromise = databasePromises.get(path);\n  if (!databasePromise) {\n    databasePromise = (async () => {\n      const Database = await loadSqliteDatabase();\n      const db = new Database(path);\n      db.exec(\"PRAGMA journal_mode = WAL\");\n      db.exec(\"PRAGMA busy_timeout = 5000\");\n      db.exec(`\n        CREATE TABLE IF NOT EXISTS cache_entries (\n          key TEXT PRIMARY KEY,\n          value TEXT NOT NULL,\n          expires_at INTEGER NOT NULL,\n          updated_at INTEGER NOT NULL\n        ) STRICT\n      `);\n      db.exec(\n        \"CREATE INDEX IF NOT EXISTS cache_entries_expires_at_idx ON cache_entries (expires_at)\",\n      );\n      db.prepare(\"DELETE FROM cache_entries WHERE expires_at <= ?\").run(Date.now());\n      return db;\n    })();\n    databasePromises.set(path, databasePromise);\n  }\n  return databasePromise;\n}\n\nasync function cacheDatabasePath(): Promise<string> {\n  const dataDir = typeof process !== \"undefined\" ? process.env[\"TAKO_DATA_DIR\"] : undefined;\n  if (!dataDir) {\n    throw new Error(\"TAKO_DATA_DIR is not set. Run this cache helper inside Tako.\");\n  }\n\n  const [{ dirname, join }, { mkdir }] = await Promise.all([\n    runtimeImport<typeof import(\"node:path\")>(\"node:path\"),\n    runtimeImport<typeof import(\"node:fs/promises\")>(\"node:fs/promises\"),\n  ]);\n  const takoDataDir = join(dirname(dataDir), \"tako\");\n  await mkdir(takoDataDir, { recursive: true });\n  return join(takoDataDir, \"cache.sqlite\");\n}\n\nasync function loadSqliteDatabase(): Promise<SqliteDatabaseConstructor> {\n  if (typeof Bun !== \"undefined\") {\n    const sqlite = await runtimeImport<{ Database: SqliteDatabaseConstructor }>(\"bun:sqlite\");\n    return sqlite.Database;\n  }\n\n  try {\n    const sqlite = await runtimeImport<{ DatabaseSync: SqliteDatabaseConstructor }>(\"node:sqlite\");\n    return sqlite.DatabaseSync;\n  } catch (error) {\n    throw new Error(\"Tako cache requires Bun or a Node.js runtime with node:sqlite.\", {\n      cause: error,\n    });\n  }\n}\n\nfunction validateCacheKey(key: string): void {\n  if (key.trim() === \"\") {\n    throw new Error(\"Cache key cannot be empty.\");\n  }\n}\n\nfunction validateTtl(ttl: number): void {\n  if (!Number.isFinite(ttl) || ttl <= 0) {\n    throw new Error(\"Cache ttl must be a positive number of milliseconds.\");\n  }\n}\n","/**\n * tako.sh — authoring helpers for channels, workflows, and typed errors.\n *\n * ```ts\n * import { tako } from \"tako.sh\";\n * import sendEmail from \"../workflows/send-email\";\n * import missionLog from \"../channels/mission-log\";\n *\n * tako.logger.info(\"boot\", { env: tako.env });\n * const dbUrl = tako.secrets.DATABASE_URL;\n * await sendEmail.enqueue({ to: \"u@e.co\" });\n * await missionLog({ base }).publish({ type: \"event\", data });\n * ```\n *\n * There is no `Tako` global — Tako v0 uses plain ES modules for everything.\n */\n\nimport { createLogger } from \"./logger\";\nimport { loadStorages } from \"./storage\";\nimport { loadSecrets } from \"./tako/secrets\";\nimport { cache } from \"./cache\";\n\n/**\n * Project-specific secret keys. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoSecrets {}\n\n/**\n * Project-specific type registry. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoTypeRegistry {}\n\n/**\n * Channel metadata discovered from `<app_root>/channels/`. Augmented by the\n * generated `tako.d.ts` file.\n */\nexport interface TakoChannels {}\n\n/**\n * Project-specific storage bindings. Augmented by the generated `tako.d.ts` file.\n */\nexport interface TakoStorages {}\n\n/** Environments declared in `tako.toml`, plus `development` and `production`. */\nexport type Env = TakoTypeRegistry extends { Env: infer T extends string }\n  ? T\n  : \"development\" | \"production\";\n\n/** Tako-managed secret bag with project-specific keys from `tako.d.ts`. */\nexport type TakoSecretBag = Readonly<TakoSecrets>;\n\nconst __takoEnv: Record<string, string> =\n  typeof process !== \"undefined\" && process.env\n    ? (process.env as Record<string, string>)\n    : ({} as Record<string, string>);\n\n/** Current Tako environment. */\nexport const env = (__takoEnv[\"ENV\"] ?? \"\") as Env;\n\n/** `true` when the app is running under `tako dev`. */\nexport const isDev = env === \"development\";\n\n/** `true` when the app is running under `tako deploy` in a production env. */\nexport const isProd = env === \"production\";\n\n/** Port Tako assigned to this app instance. */\nexport const port = Number(__takoEnv[\"PORT\"] ?? 0);\n\n/** Host/address Tako bound this app instance to. */\nexport const host = __takoEnv[\"HOST\"] ?? \"\";\n\n/** Build identifier injected by Tako. `\"dev\"` under `tako dev`. */\nexport const build = __takoEnv[\"TAKO_BUILD\"] ?? \"\";\n\n/** Persistent app-owned data directory. */\nexport const dataDir = __takoEnv[\"TAKO_DATA_DIR\"] ?? \"\";\n\n/** Directory the app is running from (`process.cwd()`). */\nexport const appDir =\n  typeof process !== \"undefined\" && typeof process.cwd === \"function\" ? process.cwd() : \"\";\n\n/** Structured JSON logger bound to `source: \"app\"`. */\nexport const logger = createLogger(\"app\");\n\n/** Tako-managed secrets, typed by project-specific `tako.d.ts` declarations. */\nexport const secrets = loadSecrets<TakoSecretBag>();\n\n/** Tako-managed object storages, typed by project-specific `tako.d.ts` declarations. */\nexport const storages = loadStorages<TakoStorages>();\n\n/** Primary app runtime surface. */\nexport const tako = Object.freeze({\n  env,\n  isDev,\n  isProd,\n  port,\n  host,\n  build,\n  dataDir,\n  appDir,\n  logger,\n  secrets,\n  storages,\n  cache,\n} as const);\n\n/** Type of the exported {@link tako} runtime object. */\nexport type TakoRuntime = typeof tako;\n\nexport { defineChannel } from \"./channels/define\";\nexport { defineWorkflow, signal } from \"./workflows/define\";\nexport type {\n  EnqueueOptions,\n  WorkflowContext,\n  WorkflowOpts,\n  WorkflowStepContext,\n} from \"./workflows\";\nexport { TakoError, type TakoErrorCode } from \"./tako/error\";\nexport {\n  imageSrcSet,\n  imageUrl,\n  type ImageSrcSet,\n  type ImageSrcSetLayout,\n  type ImageSrcSetOptions,\n  type ImageUrlOptions,\n} from \"./images\";\nexport type {\n  CreateDownloadUrlOptions,\n  CreateImageSrcSetOptions,\n  CreateImageUrlOptions,\n  CreateUploadUrlOptions,\n  TakoStorage,\n  TakoStorageBag,\n  TakoStorageBinding,\n} from \"./storage\";\n\n/**\n * Extract the payload type from a workflow definition.\n * Rarely needed directly — `defineWorkflow<P>(...)` already constrains\n * `.enqueue(payload)`. Useful when wrapping enqueue in generic helpers.\n *\n * @example\n * ```ts\n * type P = InferWorkflowPayload<typeof import(\"./workflows/send-email\").default>;\n * ```\n */\nexport type InferWorkflowPayload<T> = T extends import(\"./workflows\").WorkflowExport<infer P>\n  ? P\n  : T extends import(\"./workflows\").WorkflowDefinition<infer P>\n    ? P\n    : unknown;\n\ntype BoundChannel<T> = T extends (params: never) => infer Handle ? Handle : T;\n\n/** Extract the params type from a channel definition export. */\ntype InferChannelParams<T> =\n  BoundChannel<T> extends { readonly __params?: infer P } ? P : Record<string, never>;\n\n/** Extract the message map from a channel definition export. */\ntype InferChannelMessages<T> =\n  BoundChannel<T> extends { readonly __messages?: infer M } ? M : Record<string, unknown>;\n\n/** Extract the client transport from a channel definition export. */\ntype InferChannelTransport<T> =\n  BoundChannel<T> extends {\n    connect(options?: import(\"./types\").ChannelConnectOptions): import(\"./types\").ChannelSocket;\n  }\n    ? \"ws\"\n    : \"sse\";\n\n/**\n * Infer the typed registry entry for a channel definition export.\n *\n * Used by generated `tako.d.ts` channel metadata; also useful when writing\n * wrappers around project-local channel modules.\n */\nexport type InferChannel<T> = {\n  params: InferChannelParams<T>;\n  messages: InferChannelMessages<T>;\n  transport: InferChannelTransport<T>;\n};\n"],"mappings":";;;;AAAA,MAAa,sCAAsC;AACnD,MAAa,kCAAkC,QAAc;AAE7D,SAAgB,gBAAgB,KAAqB;CACnD,IAAI,IAAI,KAAK,MAAM,MAAM,IAAI,WAAW,GAAG,GACzC,MAAM,IAAI,UAAU,qDAAqD;CAE3E,MAAM,WAAW,IAAI,MAAM,GAAG;CAG9B,IAAI,SAAS,MAAM,YAAY,YAAY,OAAO,YAAY,IAAI,GAChE,MAAM,IAAI,UAAU,wDAAwD;CAE9E,OAAO,SAAS,IAAI,aAAa,CAAC,CAAC,KAAK,GAAG;AAC7C;AAEA,SAAgB,YAAY,GAAG,OAAyB;CAKtD,OAAO,IAJQ,MACZ,KAAK,SAAS,KAAK,QAAQ,cAAc,EAAE,CAAC,CAAC,CAC7C,OAAO,OAAO,CAAC,CACf,KAAK,GACQ;AAClB;AAEA,SAAgB,0BAA0B,OAAuB;CAC/D,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,gBAC3C,MAAM,IAAI,UAAU,oEAAoE;CAE1F,OAAO;AACT;AAEA,SAAgB,cAAc,OAAuB;CACnD,OAAO,mBAAmB,KAAK,CAAC,CAAC,QAC/B,aACC,SAAS,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,GAC5D;AACF;AAEA,eAAsB,UAAU,OAAgC;CAC9D,OAAO,WAAW,MAAM,OAAO,CAAC,CAAC,OAAO,WAAW,KAAK,KAAK,CAAC,CAAC;AACjE;AAEA,eAAsB,UAAU,KAAmB,OAAqC;CACtF,MAAM,YAAY,MAAM,OAAO,CAAC,CAAC,UAAU,OAAO,KAAK;EAAE,MAAM;EAAQ,MAAM;CAAU,GAAG,OAAO,CAC/F,MACF,CAAC;CACD,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,WAAW,KAAK,KAAK,CAAC;AACrD;AAEA,eAAsB,QAAQ,KAAmB,OAAgC;CAC/E,OAAO,WAAW,MAAM,UAAU,KAAK,KAAK,CAAC;AAC/C;AAEA,SAAgB,KAAK,OAA4B;CAC/C,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD;AAEA,SAAgB,WAAW,OAA4B;CACrD,OAAO,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC,CAAC,CACrC,KAAK,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CACjD,KAAK,EAAE;AACZ;AAEA,SAAS,SAAuB;CAC9B,MAAM,SAAS,WAAW;CAC1B,IAAI,CAAC,QAAQ,QACX,MAAM,IAAI,MAAM,6CAA6C;CAE/D,OAAO,OAAO;AAChB;;;;ACxDA,MAAM,UAAU;AAChB,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AAEzB,eAAsB,aAAa,OAQf;CAClB,gBAAgB,MAAM,OAAO;CAC7B,MAAM,MAAM,UAAU,MAAM,SAAS,MAAM,GAAG;CAC9C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,KAAK,GACnD,IAAI,aAAa,IAAI,KAAK,KAAK;CAGjC,MAAM,UAAU,0BACd,MAAM,wBACR;CAEA,MAAM,UAAU,cADH,MAAM,IACc,CAAC;CAClC,MAAM,YAAY,QAAQ,MAAM,GAAG,CAAC;CACpC,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,QAAQ,OAAO,GAAG,QAAQ;CAC9D,MAAM,UAAU,iBAAiB;EAAE,MAAM,IAAI;EAAM,GAAG,MAAM;CAAQ,CAAC;CACrE,MAAM,gBAAgB,OAAO,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;CAE1D,IAAI,aAAa,IAAI,mBAAmB,iBAAiB;CACzD,IAAI,aAAa,IAAI,oBAAoB,GAAG,MAAM,QAAQ,cAAc,GAAG,OAAO;CAClF,IAAI,aAAa,IAAI,cAAc,OAAO;CAC1C,IAAI,aAAa,IAAI,iBAAiB,OAAO,OAAO,CAAC;CACrD,IAAI,aAAa,IAAI,uBAAuB,aAAa;CAWzD,MAAM,eAAe;EAAC;EAAmB;EAAS;EAAO,MAAM,UATtC;GACvB,MAAM;GACN,aAAa,GAAG;GAChB,eAAe,IAAI,YAAY;GAC/B,iBAAiB,OAAO;GACxB;GACA;EACF,CAAC,CAAC,KAAK,IAEiF,CAAC;CAAC,CAAC,CAAC,KAC1F,IACF;CAMA,MAAM,YAAY,MAAM,QAAQ,MALP,iBACvB,MAAM,QAAQ,mBACd,WACA,MAAM,QAAQ,MAChB,GAC4C,YAAY;CACxD,IAAI,aAAa,IAAI,mBAAmB,SAAS;CACjD,OAAO,IAAI,SAAS;AACtB;AAEA,SAAS,UAAU,SAA6B,KAAkB;CAChE,gBAAgB,OAAO;CACvB,MAAM,aAAa,gBAAgB,GAAG;CACtC,MAAM,WAAW,IAAI,IAAI,QAAQ,QAAQ;CACzC,IAAI,SAAS,aAAa,UACxB,MAAM,IAAI,UAAU,iCAAiC;CAGvD,IAAI,QAAQ,kBAAkB;EAC5B,SAAS,WAAW,YAAY,SAAS,UAAU,QAAQ,QAAQ,UAAU;EAC7E,OAAO;CACT;CAEA,SAAS,WAAW,GAAG,QAAQ,OAAO,GAAG,SAAS;CAClD,SAAS,WAAW,YAAY,SAAS,UAAU,UAAU;CAC7D,OAAO;AACT;AAEA,SAAS,gBAAgB,SAOvB;CACA,IACE,QAAQ,aAAa,QACrB,CAAC,QAAQ,UACT,CAAC,QAAQ,YACT,CAAC,QAAQ,UACT,CAAC,QAAQ,iBACT,CAAC,QAAQ,mBAET,MAAM,IAAI,UAAU,0CAA0C;AAElE;AAEA,SAAS,iBAAiB,SAAyD;CACjF,OAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,CAAC,CACpB,KAAK,CAAC,KAAK,WAAW,CAAC,IAAI,YAAY,GAAG,MAAM,KAAK,CAAC,CAAU,CAAC,CACjE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAC1C;AACF;AAEA,SAAS,iBAAiB,SAAyC;CACjE,OAAO,OAAO,QAAQ,OAAO,CAAC,CAC3B,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,QAAQ,QAAQ,GAAG,EAAE,GAAG,CAAC,CAC/D,KAAK,EAAE;AACZ;AAEA,SAAS,aAAa,KAAkB;CACtC,OAAO,IAAI,SACR,MAAM,GAAG,CAAC,CACV,KAAK,YAAY,cAAc,mBAAmB,OAAO,CAAC,CAAC,CAAC,CAC5D,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,QAAiC;CACvD,OAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,CAChC,MAAM,CAAC,MAAM,SAAS,CAAC,MAAM,YAC5B,SAAS,OAAO,aAAa,QAAQ,MAAM,IAAI,aAAa,MAAM,IAAI,CACxE,CAAC,CACA,KAAK,CAAC,KAAK,WAAW,GAAG,cAAc,GAAG,EAAE,GAAG,cAAc,KAAK,GAAG,CAAC,CACtE,KAAK,GAAG;AACb;AAEA,SAAS,aAAa,GAAW,GAAmB;CAClD,OAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,eAAe,iBACb,QACA,WACA,QACsB;CAItB,OAAO,UAAU,MADM,UAAU,MADX,UAAU,MADZ,UAAU,KAAK,OAAO,QAAQ,GAAG,SAAS,GACvB,MAAM,GACH,OAAO,GACtB,cAAc;AAC3C;AAEA,SAAS,cAAc,MAAoB;CACzC,OAAO,KAAK,YAAY,CAAC,CAAC,QAAQ,iBAAiB,EAAE;AACvD;;;;;AClCA,SAAgB,eAAoD;CAClE,OAAO,iBAAoB,mBAAmB,CAAC;AACjD;;;;;;AAOA,SAAgB,iBACd,UACA,UAA6B,CAAC,GACX;CACnB,MAAM,2BAAW,IAAI,IAAyB;CAC9C,MAAM,MAAM,QAAQ,8BAAc,IAAI,KAAK;CAE3C,KAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,QAAQ,GAAG;EAClD,MAAM,UAAU,aAAa,MAAM,GAAG;EACtC,SAAS,IAAI,MAAM,cAAc,MAAM,SAAS,GAAG,CAAC;CACtD;CAEA,OAAO,IAAI,MAAM,OAAO,OAAO,IAAI,GAAkC;EACnE,IAAI,SAAS,MAAgC;GAC3C,IAAI,OAAO,SAAS,UAAU,OAAO;GACrC,OAAO,SAAS,IAAI,IAAI;EAC1B;EACA,UAAoB;GAClB,OAAO,MAAM,KAAK,SAAS,KAAK,CAAC;EACnC;EACA,yBAAyB,SAAS,MAAuB;GACvD,IAAI,OAAO,SAAS,UAAU;IAC5B,MAAM,UAAU,SAAS,IAAI,IAAI;IACjC,IAAI,SACF,OAAO;KAAE,cAAc;KAAM,YAAY;KAAO,OAAO;IAAQ;GAEnE;EAEF;EACA,IAAI,SAAS,MAAgC;GAC3C,OAAO,OAAO,SAAS,YAAY,SAAS,IAAI,IAAI;EACtD;CACF,CAAC;AACH;AAEA,SAAS,cAAc,MAAc,SAA6B,KAA8B;CAC9F,OAAO,OAAO,OAAO;EACnB,kBAAkB,KAAa,UAAoC,CAAC,GAAG;GACrE,IAAI,QAAQ,aAAa,SACvB,OAAO,gBAAgB,MAAM,SAAS,OAAO,KAAK,QAAQ,kBAAkB,GAAG;GAEjF,MAAM,YAAY,gBAAgB,SAAS,KAAK,QAAQ,UAAU,KAAK;GACvE,IAAI,WAAW,OAAO,QAAQ,QAAQ,SAAS;GAE/C,OAAO,aAAa;IAClB;IACA;IACA,QAAQ;IACR,kBAAkB,QAAQ;IAC1B,OAAO,sBAAsB,OAAO;IACpC,SAAS,CAAC;IACV;GACF,CAAC;EACH;EAEA,gBAAgB,KAAa,UAAkC,CAAC,GAAG;GACjE,IAAI,QAAQ,aAAa,SACvB,OAAO,gBAAgB,MAAM,SAAS,OAAO,KAAK,QAAQ,kBAAkB,GAAG;GAEjF,OAAO,aAAa;IAClB;IACA;IACA,QAAQ;IACR,kBAAkB,QAAQ;IAC1B,OAAO,CAAC;IACR,SAAS,QAAQ,cAAc,EAAE,gBAAgB,QAAQ,YAAY,IAAI,CAAC;IAC1E;GACF,CAAC;EACH;EAEA,MAAM,eAAe,KAAa,UAAiC,CAAC,GAAG;GACrE,MAAM,EAAE,kBAAkB,QAAQ,WAAW,GAAG,iBAAiB;GACjE,IAAI,QAAQ,aAAa,SAAS;IAChC,IAAI,yBAAyB,YAAY,GACvC,MAAM,IAAI,UAAU,+DAA+D;IAErF,OAAO,gBAAgB,MAAM,SAAS,OAAO,KAAK,kBAAkB,GAAG;GACzE;GACA,MAAM,YAAY,gBAAgB,SAAS,KAAK,aAAa,KAAK;GAClE,IAAI,WACF,OAAO,SAAS,WAAW,YAAY;GAGzC,IAAI,yBAAyB,YAAY,GACvC,MAAM,IAAI,UACR,mHACF;GAGF,OAAO,aAAa;IAClB;IACA;IACA,QAAQ;IACR;IACA,OAAO,CAAC;IACR,SAAS,CAAC;IACV;GACF,CAAC;EACH;EAEA,MAAM,kBAAkB,KAAa,SAAmC;GACtE,MAAM,EAAE,QAAQ,WAAW,GAAG,iBAAiB;GAC/C,MAAM,YAAY,gBAAgB,SAAS,KAAK,aAAa,KAAK;GAClE,IAAI,WACF,OAAO,YAAY,WAAW,YAAY;GAG5C,MAAM,IAAI,UACR,gHACF;EACF;CACF,CAAC;AACH;AAEA,SAAS,aAAa,MAAc,KAAkC;CACpE,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,MAAM,QAAQ,GAAG,GAC9D,MAAM,IAAI,UAAU,2BAA2B,KAAK,kBAAkB;CAExE,MAAM,UAAU;CAChB,IAAI,QAAQ,aAAa,WAAW,QAAQ,aAAa,MACvD,MAAM,IAAI,UAAU,2BAA2B,KAAK,+BAA+B;CAGrF,IAAI,QAAQ,aAAa,SAAS;EAChC,KAAK,MAAM,SAAS,CAAC,QAAQ,aAAa,GACxC,IAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,MAAM,EAAE,KAAK,MAAM,IACnE,MAAM,IAAI,UAAU,2BAA2B,KAAK,YAAY,OAAO;EAG3E,OAAO;GACL,UAAU;GACV,MAAM,QAAQ;GACd,aAAa,QAAQ;EACvB;CACF;CAEA,KAAK,MAAM,SAAS;EAClB;EACA;EACA;EACA;EACA;CACF,GACE,IAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,MAAM,EAAE,KAAK,MAAM,IACnE,MAAM,IAAI,UAAU,2BAA2B,KAAK,YAAY,OAAO;CAG3E,OAAO;EACL,UAAU;EACV,QAAQ,QAAQ;EAChB,UAAW,QAAQ,SAAoB,QAAQ,QAAQ,EAAE;EACzD,QAAQ,QAAQ;EAChB,eAAe,QAAQ;EACvB,mBAAmB,QAAQ;EAC3B,kBAAkB,QAAQ,qBAAqB;EAC/C,iBAAiB,QAAQ,iBAAiB,QAAQ,QAAQ,EAAE;CAC9D;AACF;AAEA,SAAS,gBACP,SACA,KACA,WACe;CACf,IAAI,QAAQ,aAAa,MAAM,OAAO;CACtC,IAAI,CAAC,WAAW,OAAO;CACvB,IAAI,CAAC,QAAQ,iBACX,MAAM,IAAI,UAAU,kDAAkD;CAExE,MAAM,MAAM,IAAI,IAAI,QAAQ,eAAe;CAC3C,IAAI,WAAW,YAAY,IAAI,UAAU,gBAAgB,GAAG,CAAC;CAC7D,OAAO,IAAI,SAAS;AACtB;AAEA,SAAS,gBACP,MACA,SACA,QACA,KACA,kBACA,KACiB;CACjB,IAAI,QAAQ,aAAa,WAAW,CAAC,QAAQ,QAAQ,CAAC,QAAQ,aAC5D,MAAM,IAAI,UAAU,qDAAqD;CAE3E,MAAM,UACJ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAI,IACjC,0BAA0B,wBAAuD;CACnF,MAAM,aAAa,gBAAgB,GAAG;CACtC,MAAM,aAAa,QAAQ;CAC3B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,IAAI,WAAW,IAAI;CACtD,OAAO,QAAQ,KAAK,UAAU,GAAG,OAAO,CAAC,CAAC,MAAM,UAAU;EACxD,OAAO,mBAAmB,mBAAmB,IAAI,EAAE,GAAG,WAAW,WAAW,QAAQ,SAAS;CAC/F,CAAC;AACH;AAEA,SAAS,sBAAsB,SAA2D;CACxF,MAAM,QAAgC,CAAC;CACvC,IAAI,QAAQ,qBAAqB,MAAM,2BAA2B,QAAQ;CAC1E,IAAI,QAAQ,4BACV,MAAM,kCAAkC,QAAQ;CAElD,OAAO;AACT;AAEA,SAAS,yBAAyB,SAAmC;CACnE,OACE,QAAQ,UAAU,UAAa,QAAQ,YAAY,UAAa,QAAQ,WAAW;AAEvF;;;;AC7TA,MAAM,mCAAmB,IAAI,IAAqC;AAElE,MAAM,gBAAgB,IAAI,SAAS,aAAa,0BAA0B;AAI1E,eAAe,eAAkB,KAAqC;CACpE,iBAAiB,GAAG;CAEpB,MAAM,KAAK,MAAM,kBAAkB;CACnC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,MAAM,GACT,QAAkB,2DAA2D,CAAC,CAC9E,MAAM,GAAG;CAEZ,IAAI,CAAC,KACH;CAEF,IAAI,IAAI,cAAc,KAAK;EACzB,GAAG,QAAQ,yCAAyC,CAAC,CAAC,IAAI,GAAG;EAC7D;CACF;CACA,OAAO,KAAK,MAAM,IAAI,KAAK;AAC7B;AAEA,eAAe,eAAkB,KAAa,OAAU,SAAyC;CAC/F,iBAAiB,GAAG;CACpB,YAAY,QAAQ,GAAG;CAEvB,MAAM,UAAU,KAAK,UAAU,KAAK;CACpC,IAAI,YAAY,QACd,MAAM,IAAI,MAAM,wCAAwC;CAG1D,MAAM,KAAK,MAAM,kBAAkB;CACnC,MAAM,MAAM,KAAK,IAAI;CACrB,MAAM,YAAY,MAAM,QAAQ;CAChC,GAAG,QACD;;;;;wCAMF,CAAC,CAAC,IAAI,KAAK,SAAS,WAAW,GAAG;AACpC;AAEA,eAAe,kBAAkB,KAA4B;CAC3D,iBAAiB,GAAG;CAEpB,OADiB,kBAAkB,EACjC,CAAC,QAAQ,yCAAyC,CAAC,CAAC,IAAI,GAAG;AAC/D;;;;;;AAOA,MAAa,QAAQ,OAAO,OAAO;;;;;;;CAOjC,IAAO,KAAqC;EAC1C,OAAO,eAAkB,GAAG;CAC9B;;;;;;;;CAQA,IAAO,KAAa,OAAU,SAAyC;EACrE,OAAO,eAAe,KAAK,OAAO,OAAO;CAC3C;;;;;;CAMA,OAAO,KAA4B;EACjC,OAAO,kBAAkB,GAAG;CAC9B;AACF,CAAC;AAED,eAAe,oBAA6C;CAC1D,MAAM,OAAO,MAAM,kBAAkB;CACrC,IAAI,kBAAkB,iBAAiB,IAAI,IAAI;CAC/C,IAAI,CAAC,iBAAiB;EACpB,mBAAmB,YAAY;GAE7B,MAAM,KAAK,KAAI,OADQ,mBAAmB,IAClB,IAAI;GAC5B,GAAG,KAAK,2BAA2B;GACnC,GAAG,KAAK,4BAA4B;GACpC,GAAG,KAAK;;;;;;;OAOP;GACD,GAAG,KACD,uFACF;GACA,GAAG,QAAQ,iDAAiD,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;GAC5E,OAAO;EACT,EAAC,CAAE;EACH,iBAAiB,IAAI,MAAM,eAAe;CAC5C;CACA,OAAO;AACT;AAEA,eAAe,oBAAqC;CAClD,MAAM,UAAU,OAAO,YAAY,cAAc,QAAQ,IAAI,mBAAmB;CAChF,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,8DAA8D;CAGhF,MAAM,CAAC,EAAE,SAAS,QAAQ,EAAE,WAAW,MAAM,QAAQ,IAAI,CACvD,cAA0C,WAAW,GACrD,cAAiD,kBAAkB,CACrE,CAAC;CACD,MAAM,cAAc,KAAK,QAAQ,OAAO,GAAG,MAAM;CACjD,MAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;CAC5C,OAAO,KAAK,aAAa,cAAc;AACzC;AAEA,eAAe,qBAAyD;CACtE,IAAI,OAAO,QAAQ,aAEjB,QAAO,MADc,cAAuD,YAAY,EAC3E,CAAC;CAGhB,IAAI;EAEF,QAAO,MADc,cAA2D,aAAa,EAChF,CAAC;CAChB,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,kEAAkE,EAChF,OAAO,MACT,CAAC;CACH;AACF;AAEA,SAAS,iBAAiB,KAAmB;CAC3C,IAAI,IAAI,KAAK,MAAM,IACjB,MAAM,IAAI,MAAM,4BAA4B;AAEhD;AAEA,SAAS,YAAY,KAAmB;CACtC,IAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,GAClC,MAAM,IAAI,MAAM,sDAAsD;AAE1E;;;;;;;;;;;;;;;;;;;;AChIA,MAAM,YACJ,OAAO,YAAY,eAAe,QAAQ,MACrC,QAAQ,MACR,CAAC;;AAGR,MAAa,MAAO,UAAU,UAAU;;AAGxC,MAAa,QAAQ,QAAQ;;AAG7B,MAAa,SAAS,QAAQ;;AAG9B,MAAa,OAAO,OAAO,UAAU,WAAW,CAAC;;AAGjD,MAAa,OAAO,UAAU,WAAW;;AAGzC,MAAa,QAAQ,UAAU,iBAAiB;;AAGhD,MAAa,UAAU,UAAU,oBAAoB;;AAGrD,MAAa,SACX,OAAO,YAAY,eAAe,OAAO,QAAQ,QAAQ,aAAa,QAAQ,IAAI,IAAI;;AAGxF,MAAa,SAAS,aAAa,KAAK;;AAGxC,MAAa,UAAU,YAA2B;;AAGlD,MAAa,WAAW,aAA2B;;AAGnD,MAAa,OAAO,OAAO,OAAO;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAU"}