{"version":3,"file":"OvertureMapsControl-BB2TTDzD.cjs","names":["x","F"],"sources":["../src/lib/core/maplibre.ts","../src/lib/core/themes.ts","../src/lib/core/releases.ts","../node_modules/fflate/esm/browser.js","../node_modules/pmtiles/dist/esm/index.js","../src/lib/core/pmtilesProtocol.ts","../src/lib/core/OvertureMapsControl.ts"],"sourcesContent":["// Namespace import, not a default one: MapLibre v6 is ESM-only and dropped\n// its default export. This module deliberately wants the whole namespace so\n// it can fall back to a host-provided global; callers only read from it\n// (Popup, addProtocol), never mutate it, which v6's namespace would forbid.\nimport * as maplibregl from 'maplibre-gl';\n\n/**\n * Returns the MapLibre GL namespace to use at runtime.\n *\n * Prefers a host-provided global `maplibregl` (e.g. when the plugin is\n * bundled separately from the application, as in GeoLibre) so protocol\n * registration and popups operate on the same MapLibre instance as the\n * host map. Falls back to the imported module.\n *\n * @returns The MapLibre GL namespace\n */\nexport function getMapLibre(): typeof maplibregl {\n  // Two-step cast: the ambient `maplibregl` global and this module's namespace\n  // type do not overlap enough for a direct assertion (the namespace carries\n  // internals the global's declaration omits).\n  const globalNs = (globalThis as unknown as { maplibregl?: typeof maplibregl })\n    .maplibregl;\n  return globalNs ?? maplibregl;\n}\n","import type { LayerSpecification } from \"maplibre-gl\";\n\n/**\n * The Overture Maps data themes distributed as PMTiles archives.\n *\n * @see https://docs.overturemaps.org/examples/overture-tiles/\n */\nexport type OvertureTheme =\n  | \"addresses\"\n  | \"base\"\n  | \"buildings\"\n  | \"divisions\"\n  | \"places\"\n  | \"transportation\";\n\n/**\n * Geometry rendered for a source layer within a theme tileset.\n */\nexport type OvertureGeometry = \"point\" | \"line\" | \"polygon\";\n\n/**\n * A source layer contained in an Overture theme PMTiles archive.\n */\nexport interface OvertureLayerDef {\n  /** The MVT source-layer name (matches the Overture feature type) */\n  sourceLayer: string;\n  /** The geometry type used to render the layer */\n  geometry: OvertureGeometry;\n}\n\n/**\n * Metadata describing an Overture theme tileset.\n */\nexport interface ThemeDefinition {\n  /** Theme identifier (also the PMTiles file name) */\n  id: OvertureTheme;\n  /** Human-readable label shown in the control panel */\n  label: string;\n  /** Default x-ray color for the theme */\n  color: string;\n  /** Source layers contained in the theme tileset */\n  layers: OvertureLayerDef[];\n  /** Minimum zoom at which features appear (informational) */\n  minzoom?: number;\n}\n\n/**\n * All Overture themes with their source layers and default x-ray colors.\n *\n * Source layers verified against the OvertureMaps/overture-tiles\n * planetiler profiles.\n */\nexport const THEMES: Record<OvertureTheme, ThemeDefinition> = {\n  addresses: {\n    id: \"addresses\",\n    label: \"Addresses\",\n    color: \"#e6194b\",\n    layers: [{ sourceLayer: \"address\", geometry: \"point\" }],\n    minzoom: 14,\n  },\n  base: {\n    id: \"base\",\n    label: \"Base\",\n    color: \"#3cb44b\",\n    layers: [\n      { sourceLayer: \"land\", geometry: \"polygon\" },\n      { sourceLayer: \"land_cover\", geometry: \"polygon\" },\n      { sourceLayer: \"land_use\", geometry: \"polygon\" },\n      { sourceLayer: \"water\", geometry: \"polygon\" },\n      { sourceLayer: \"bathymetry\", geometry: \"polygon\" },\n      { sourceLayer: \"infrastructure\", geometry: \"line\" },\n    ],\n  },\n  buildings: {\n    id: \"buildings\",\n    label: \"Buildings\",\n    color: \"#f58231\",\n    layers: [\n      { sourceLayer: \"building\", geometry: \"polygon\" },\n      { sourceLayer: \"building_part\", geometry: \"polygon\" },\n    ],\n  },\n  divisions: {\n    id: \"divisions\",\n    label: \"Divisions\",\n    color: \"#911eb4\",\n    layers: [\n      { sourceLayer: \"division_area\", geometry: \"polygon\" },\n      { sourceLayer: \"division_boundary\", geometry: \"line\" },\n      { sourceLayer: \"division\", geometry: \"point\" },\n    ],\n  },\n  places: {\n    id: \"places\",\n    label: \"Places\",\n    color: \"#4363d8\",\n    layers: [{ sourceLayer: \"place\", geometry: \"point\" }],\n    minzoom: 14,\n  },\n  transportation: {\n    id: \"transportation\",\n    label: \"Transportation\",\n    color: \"#f032e6\",\n    layers: [\n      { sourceLayer: \"segment\", geometry: \"line\" },\n      { sourceLayer: \"connector\", geometry: \"point\" },\n    ],\n  },\n};\n\n/**\n * Ordered list of all Overture theme identifiers.\n *\n * This is the panel display order (top to bottom). The control draws the\n * first theme on top of the map and the last theme at the bottom, so the\n * detail themes (addresses, places) sit above the background (base).\n */\nexport const THEME_IDS: OvertureTheme[] = [\n  \"addresses\",\n  \"places\",\n  \"transportation\",\n  \"buildings\",\n  \"divisions\",\n  \"base\",\n];\n\n/**\n * Returns the map source id used for a theme.\n *\n * @param theme - The Overture theme identifier\n * @returns The MapLibre source id, e.g. `overture-buildings`\n */\nexport function sourceIdForTheme(theme: OvertureTheme): string {\n  return `overture-${theme}`;\n}\n\n/**\n * Returns the PMTiles URL for a theme at a given release.\n *\n * @param baseUrl - Base tiles URL (no trailing slash)\n * @param release - Overture release, e.g. `2026-05-20.0`\n * @param theme - The Overture theme identifier\n * @param nativePmtiles - When true, return the plain archive URL for a map\n *   engine that reads `.pmtiles` natively (see\n *   {@link OvertureMapsControlOptions.nativePmtiles}); otherwise prefix it\n *   with MapLibre's `pmtiles://` protocol\n * @returns The `pmtiles://`-prefixed source URL, or the plain archive URL\n */\nexport function tileUrlForTheme(\n  baseUrl: string,\n  release: string,\n  theme: OvertureTheme,\n  nativePmtiles = false,\n): string {\n  const trimmed = baseUrl.replace(/\\/+$/, \"\");\n  const archiveUrl = `${trimmed}/${release}/${theme}.pmtiles`;\n  return nativePmtiles ? archiveUrl : `pmtiles://${archiveUrl}`;\n}\n\n/**\n * Returns all MapLibre layer ids used to render a theme.\n *\n * @param theme - The Overture theme identifier\n * @returns Layer ids in the order they are added to the map\n */\nexport function layerIdsForTheme(theme: OvertureTheme): string[] {\n  return buildLayerSpecs(theme, 1).map((spec) => spec.id);\n}\n\n/**\n * Returns the opacity paint property name for a layer type.\n *\n * @param layerType - The MapLibre layer type\n * @returns The matching paint property, e.g. `fill-opacity`\n */\nexport function opacityPropertyForLayerType(\n  layerType: \"fill\" | \"line\" | \"circle\",\n): \"fill-opacity\" | \"line-opacity\" | \"circle-opacity\" {\n  return `${layerType}-opacity` as\n    | \"fill-opacity\"\n    | \"line-opacity\"\n    | \"circle-opacity\";\n}\n\n/**\n * Returns the color paint property name for a layer type.\n *\n * @param layerType - The MapLibre layer type\n * @returns The matching paint property, e.g. `fill-color`\n */\nexport function colorPropertyForLayerType(\n  layerType: \"fill\" | \"line\" | \"circle\",\n): \"fill-color\" | \"line-color\" | \"circle-color\" {\n  return `${layerType}-color` as \"fill-color\" | \"line-color\" | \"circle-color\";\n}\n\n/**\n * Returns the size paint property name for a layer type.\n *\n * Fill layers have no size dimension and return null.\n *\n * @param layerType - The MapLibre layer type\n * @returns The matching paint property, or null for fills\n */\nexport function sizePropertyForLayerType(\n  layerType: \"fill\" | \"line\" | \"circle\",\n): \"circle-radius\" | \"line-width\" | null {\n  if (layerType === \"circle\") return \"circle-radius\";\n  if (layerType === \"line\") return \"line-width\";\n  return null;\n}\n\n/**\n * Returns the default size (circle radius or line width) for a geometry.\n *\n * @param geometry - The source-layer geometry\n * @returns The default size in pixels\n */\nexport function defaultSizeForGeometry(geometry: OvertureGeometry): number {\n  if (geometry === \"point\") return 3;\n  if (geometry === \"line\") return 1;\n  return 0.8;\n}\n\n/**\n * Finds the source-layer definition for a theme.\n *\n * @param theme - The Overture theme identifier\n * @param sourceLayer - The source-layer name\n * @returns The layer definition, or undefined when not part of the theme\n */\nexport function findLayerDef(\n  theme: OvertureTheme,\n  sourceLayer: string,\n): OvertureLayerDef | undefined {\n  return THEMES[theme].layers.find(\n    (layer) => layer.sourceLayer === sourceLayer,\n  );\n}\n\n/** Fill layers are kept translucent relative to the theme opacity for an x-ray look. */\nexport const FILL_OPACITY_RATIO = 0.3;\n\n/**\n * Computes the effective opacity for a rendered layer type.\n *\n * @param layerType - The MapLibre layer type\n * @param opacity - The theme opacity (0..1)\n * @returns The opacity value to apply to the layer's paint property\n */\nexport function effectiveOpacity(\n  layerType: \"fill\" | \"line\" | \"circle\",\n  opacity: number,\n): number {\n  return layerType === \"fill\" ? opacity * FILL_OPACITY_RATIO : opacity;\n}\n\n/**\n * Builds the MapLibre layer specifications used to render a theme.\n *\n * Polygons produce a translucent fill plus an outline line layer; lines\n * produce a line layer; points produce a circle layer.\n *\n * @param theme - The Overture theme identifier\n * @param opacity - The theme opacity (0..1)\n * @param color - Optional color override (defaults to the theme x-ray color)\n * @returns Layer specifications ready for `map.addLayer`\n */\nexport function buildLayerSpecs(\n  theme: OvertureTheme,\n  opacity: number,\n  color?: string,\n): LayerSpecification[] {\n  const def = THEMES[theme];\n  const themeColor = color ?? def.color;\n  const sourceId = sourceIdForTheme(theme);\n  return def.layers.flatMap((layer) =>\n    specsForLayer(sourceId, layer, opacity, themeColor),\n  );\n}\n\n/**\n * Builds the MapLibre layer specifications for a single source layer of a\n * theme. Use this to render and restyle layers independently.\n *\n * @param theme - The Overture theme identifier\n * @param sourceLayer - The source-layer name (e.g. `water`)\n * @param opacity - The layer opacity (0..1)\n * @param color - Optional color override (defaults to the theme x-ray color)\n * @param size - Optional size override (circle radius / line width); defaults\n *   to the geometry's default size\n * @returns Layer specifications ready for `map.addLayer`\n */\nexport function buildSourceLayerSpecs(\n  theme: OvertureTheme,\n  sourceLayer: string,\n  opacity: number,\n  color?: string,\n  size?: number,\n): LayerSpecification[] {\n  const layer = findLayerDef(theme, sourceLayer);\n  if (!layer) {\n    return [];\n  }\n  return specsForLayer(\n    sourceIdForTheme(theme),\n    layer,\n    opacity,\n    color ?? THEMES[theme].color,\n    size,\n  );\n}\n\n/**\n * Returns the MapLibre layer ids used to render a single source layer.\n *\n * @param theme - The Overture theme identifier\n * @param sourceLayer - The source-layer name\n * @returns Layer ids in the order they are added to the map\n */\nexport function layerIdsForSourceLayer(\n  theme: OvertureTheme,\n  sourceLayer: string,\n): string[] {\n  return buildSourceLayerSpecs(theme, sourceLayer, 1).map((spec) => spec.id);\n}\n\n/**\n * Builds the MapLibre layer specs for one source-layer definition.\n *\n * @param sourceId - The map source id\n * @param layer - The source-layer definition\n * @param opacity - The layer opacity (0..1)\n * @param color - The layer color\n * @returns Layer specifications for the source layer\n */\nfunction specsForLayer(\n  sourceId: string,\n  layer: OvertureLayerDef,\n  opacity: number,\n  color: string,\n  size?: number,\n): LayerSpecification[] {\n  const idBase = `${sourceId}-${layer.sourceLayer}`;\n  const px = size ?? defaultSizeForGeometry(layer.geometry);\n\n  if (layer.geometry === \"polygon\") {\n    return [\n      {\n        id: `${idBase}-fill`,\n        type: \"fill\",\n        source: sourceId,\n        \"source-layer\": layer.sourceLayer,\n        paint: {\n          \"fill-color\": color,\n          \"fill-opacity\": effectiveOpacity(\"fill\", opacity),\n        },\n      },\n      {\n        id: `${idBase}-line`,\n        type: \"line\",\n        source: sourceId,\n        \"source-layer\": layer.sourceLayer,\n        paint: {\n          \"line-color\": color,\n          \"line-width\": px,\n          \"line-opacity\": effectiveOpacity(\"line\", opacity),\n        },\n      },\n    ];\n  }\n\n  if (layer.geometry === \"line\") {\n    return [\n      {\n        id: `${idBase}-line`,\n        type: \"line\",\n        source: sourceId,\n        \"source-layer\": layer.sourceLayer,\n        paint: {\n          \"line-color\": color,\n          \"line-width\": px,\n          \"line-opacity\": effectiveOpacity(\"line\", opacity),\n        },\n      },\n    ];\n  }\n\n  return [\n    {\n      id: `${idBase}-circle`,\n      type: \"circle\",\n      source: sourceId,\n      \"source-layer\": layer.sourceLayer,\n      paint: {\n        \"circle-color\": color,\n        \"circle-radius\": px,\n        \"circle-opacity\": effectiveOpacity(\"circle\", opacity),\n        \"circle-stroke-width\": 0.5,\n        \"circle-stroke-color\": \"#ffffff\",\n        \"circle-stroke-opacity\": effectiveOpacity(\"circle\", opacity),\n      },\n    },\n  ];\n}\n","/**\n * Legacy endpoint listing available Overture Maps releases.\n *\n * @deprecated Overture froze this file at `2026-07-22.0` and no longer updates\n * it, and the tiles for the release it names have since been removed from the\n * distribution bucket — so following it leaves every theme URL a 404 (issue\n * #12). It is still honoured when passed explicitly as `releasesUrl`, for a\n * self-hosted mirror that keeps the same shape, but it is no longer consulted\n * by default. See {@link resolveReleases}.\n */\nexport const DEFAULT_RELEASES_URL = 'https://labs.overturemaps.org/data/releases.json';\n\n/**\n * Overture's STAC catalog, the documented replacement for the frozen\n * releases.json. Its root names the latest release but not the older ones.\n */\nexport const DEFAULT_STAC_CATALOG_URL = 'https://stac.overturemaps.org/catalog.json';\n\n/**\n * Default base URL for the Overture Maps PMTiles distribution.\n */\nexport const DEFAULT_TILES_BASE_URL =\n  'https://overturemaps-extras-us-west-2.s3.us-west-2.amazonaws.com/tiles';\n\n/**\n * Release used when no release source can be reached.\n */\nexport const FALLBACK_RELEASE = '2026-08-19.0';\n\n/** An Overture release id: a date plus a revision, e.g. `2026-08-19.0`. */\nconst RELEASE_ID = /^\\d{4}-\\d{2}-\\d{2}\\.\\d+$/;\n\n/**\n * Shape of the releases.json document.\n */\nexport interface ReleasesResponse {\n  /** The latest available release, e.g. `2026-08-19.0` */\n  latest: string;\n  /** All available releases, newest first */\n  releases: string[];\n}\n\n/**\n * Sources {@link resolveReleases} may consult.\n */\nexport interface ResolveReleasesOptions {\n  /**\n   * A releases.json endpoint. When set, it is the only source consulted — this\n   * is the escape hatch for a self-hosted mirror.\n   */\n  releasesUrl?: string;\n  /** Base URL of the PMTiles distribution to list (defaults to Overture's) */\n  tilesBaseUrl?: string;\n  /** STAC catalog consulted when the distribution cannot be listed */\n  stacCatalogUrl?: string;\n}\n\n/**\n * Resolves the releases the plugin can actually render.\n *\n * The distribution bucket is the authority: a release is usable only if its\n * PMTiles are still there, and Overture prunes older ones. So the default path\n * lists the bucket, falls back to the STAC catalog's `latest` when the listing\n * is unavailable, and only reads a releases.json when the caller names one.\n *\n * @param options - Sources to consult; see {@link ResolveReleasesOptions}\n * @returns The usable releases, newest first\n * @throws Error if every source consulted fails\n */\nexport async function resolveReleases(\n  options: ResolveReleasesOptions = {}\n): Promise<ReleasesResponse> {\n  if (options.releasesUrl) {\n    return fetchReleases(options.releasesUrl);\n  }\n\n  try {\n    return await listTileReleases(options.tilesBaseUrl);\n  } catch (listError) {\n    try {\n      return await fetchStacLatest(options.stacCatalogUrl);\n    } catch (stacError) {\n      // `cause` would need the ES2022 lib and this package compiles against\n      // ES2020, so both underlying failures are named in the message instead.\n      // eslint-disable-next-line preserve-caught-error\n      throw new Error(\n        `Could not list the Overture tile distribution (${messageOf(listError)}) ` +\n          `and the STAC catalog was unreachable (${messageOf(stacError)})`\n      );\n    }\n  }\n}\n\n/**\n * Lists the releases present in the PMTiles distribution bucket.\n *\n * The bucket is a public S3 bucket, so its ListObjectsV2 endpoint answers\n * unauthenticated cross-origin GETs. Asking for the release prefixes with a\n * delimiter returns one `CommonPrefixes` entry per release directory.\n *\n * @param tilesBaseUrl - Base URL of the distribution (defaults to Overture's)\n * @returns The releases found, newest first\n * @throws Error if the request fails or the bucket holds no release\n */\nexport async function listTileReleases(\n  tilesBaseUrl: string = DEFAULT_TILES_BASE_URL\n): Promise<ReleasesResponse> {\n  const base = new URL(tilesBaseUrl);\n  // `tiles/`: the key prefix every release directory sits under, as S3 wants\n  // it — no leading slash, one trailing slash.\n  const prefix = `${base.pathname.replace(/^\\/+/, '').replace(/\\/+$/, '')}/`;\n  const listUrl = `${base.origin}/?list-type=2&delimiter=%2F&prefix=${encodeURIComponent(prefix)}`;\n\n  const response = await fetch(listUrl);\n  if (!response.ok) {\n    throw new Error(`Failed to list Overture releases: HTTP ${response.status}`);\n  }\n\n  // The response echoes the request prefix in its own `<Prefix>` element\n  // alongside the `<CommonPrefixes>` ones, so keep only what parses as a\n  // release id rather than trusting the element's position.\n  const releases = [...(await response.text()).matchAll(/<Prefix>([^<]*)<\\/Prefix>/g)]\n    .map(([, value]) => value.slice(prefix.length).replace(/\\/+$/, ''))\n    .filter((release) => RELEASE_ID.test(release))\n    .sort(byReleaseDescending);\n\n  if (releases.length === 0) {\n    throw new Error(`No Overture releases found under ${tilesBaseUrl}`);\n  }\n\n  return { latest: releases[0], releases };\n}\n\n/**\n * Reads the latest release from Overture's STAC catalog.\n *\n * The catalog root carries only the current release, so this returns a\n * single-entry list — enough to render, not enough to populate a history.\n *\n * @param catalogUrl - The STAC catalog root (defaults to Overture's)\n * @returns The latest release as a one-entry {@link ReleasesResponse}\n * @throws Error if the request fails or the catalog names no release\n */\nexport async function fetchStacLatest(\n  catalogUrl: string = DEFAULT_STAC_CATALOG_URL\n): Promise<ReleasesResponse> {\n  const response = await fetch(catalogUrl);\n  if (!response.ok) {\n    throw new Error(`Failed to fetch the Overture STAC catalog: HTTP ${response.status}`);\n  }\n\n  const data: unknown = await response.json();\n  const latest = (data as { latest?: unknown } | null)?.latest;\n  if (typeof latest !== 'string' || !RELEASE_ID.test(latest)) {\n    throw new Error('Invalid STAC catalog payload: expected a `latest` release id');\n  }\n\n  return { latest, releases: [latest] };\n}\n\n/**\n * Fetches and validates a releases.json document.\n *\n * @param url - The releases endpoint (defaults to the frozen Overture labs URL)\n * @returns The parsed releases document\n * @throws Error if the request fails or the payload is malformed\n * @see resolveReleases for the release source the control uses by default\n */\nexport async function fetchReleases(url: string = DEFAULT_RELEASES_URL): Promise<ReleasesResponse> {\n  const response = await fetch(url);\n  if (!response.ok) {\n    throw new Error(`Failed to fetch Overture releases: HTTP ${response.status}`);\n  }\n\n  const data: unknown = await response.json();\n  if (!isReleasesResponse(data)) {\n    throw new Error('Invalid releases.json payload: expected { latest: string, releases: string[] }');\n  }\n\n  return { latest: data.latest, releases: [...data.releases] };\n}\n\n/**\n * Orders release ids newest first.\n *\n * Plain string comparison would put `2026-08-19.10` before `2026-08-19.2`, so\n * the revision after the dot is compared as a number.\n *\n * @param a - A release id\n * @param b - Another release id\n * @returns A comparator result placing the newer release first\n */\nfunction byReleaseDescending(a: string, b: string): number {\n  const [dateA, revisionA] = a.split('.');\n  const [dateB, revisionB] = b.split('.');\n  if (dateA !== dateB) {\n    return dateA < dateB ? 1 : -1;\n  }\n  return Number(revisionB) - Number(revisionA);\n}\n\n/**\n * Extracts a message from a thrown value.\n *\n * @param error - The caught value\n * @returns Its message, or a placeholder for a non-Error throw\n */\nfunction messageOf(error: unknown): string {\n  return error instanceof Error ? error.message : 'unknown error';\n}\n\n/**\n * Type guard validating the releases.json payload shape.\n *\n * @param value - The parsed JSON value\n * @returns True when the value matches {@link ReleasesResponse}\n */\nfunction isReleasesResponse(value: unknown): value is ReleasesResponse {\n  if (!value || typeof value !== 'object' || Array.isArray(value)) {\n    return false;\n  }\n  const candidate = value as Record<string, unknown>;\n  return (\n    typeof candidate.latest === 'string' &&\n    candidate.latest.length > 0 &&\n    Array.isArray(candidate.releases) &&\n    candidate.releases.length > 0 &&\n    candidate.releases.every((release) => typeof release === 'string')\n  );\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    ,\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\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};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data.length) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush();\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function () { w.postMessage([]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     */\n    Deflate.prototype.flush = function () {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     */\n    Gzip.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l && !final) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     */\n    Zlib.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (val instanceof u8)\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = o == 4294967295 || c == 65535;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295 || c == 65535;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n","var z=Object.defineProperty;var B=Math.pow;var d=(i,t)=>z(i,\"name\",{value:t,configurable:!0});var m=(i,t,e)=>new Promise((r,n)=>{var s=c=>{try{a(e.next(c))}catch(u){n(u)}},o=c=>{try{a(e.throw(c))}catch(u){n(u)}},a=c=>c.done?r(c.value):Promise.resolve(c.value).then(s,o);a((e=e.apply(i,t)).next())});import{decompressSync as F}from\"fflate\";var re=d((i,t)=>{let e=!1,r=\"\",n=L.GridLayer.extend({createTile:d((s,o)=>{let a=document.createElement(\"img\"),c=new AbortController,u=c.signal;return a.cancel=()=>{c.abort()},e||(i.getHeader().then(l=>{l.tileType===1||l.tileType===6?console.error(\"Error: archive contains vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details.\"):l.tileType===2?r=\"image/png\":l.tileType===3?r=\"image/jpeg\":l.tileType===4?r=\"image/webp\":l.tileType===5&&(r=\"image/avif\")}),e=!0),i.getZxy(s.z,s.x,s.y,u).then(l=>{if(l){let f=new Blob([l.data],{type:r}),y=window.URL.createObjectURL(f);a.src=y}else a.style.display=\"none\";a.cancel=void 0,o(void 0,a)}).catch(l=>{if(l.name!==\"AbortError\")throw l}),a},\"createTile\"),_removeTile:d(function(s){let o=this._tiles[s];o&&(o.el.cancel&&o.el.cancel(),o.el.src&&window.URL.revokeObjectURL(o.el.src),o.el.width=0,o.el.height=0,o.el.deleted=!0,L.DomUtil.remove(o.el),delete this._tiles[s],this.fire(\"tileunload\",{tile:o.el,coords:this._keyToTileCoords(s)}))},\"_removeTile\")});return new n(t)},\"leafletRasterLayer\"),W=d(i=>(t,e)=>{if(e instanceof AbortController)return i(t,e);let r=new AbortController;return i(t,r).then(n=>e(void 0,n.data,n.cacheControl||\"\",n.expires||\"\"),n=>e(n)).catch(n=>e(n)),{cancel:d(()=>r.abort(),\"cancel\")}},\"v3compat\"),E=class E{constructor(t){this.tilev4=d((t,e)=>m(this,null,function*(){if(t.type===\"json\"){let y=t.url.substr(10),p=this.tiles.get(y);if(p||(p=new w(y),this.tiles.set(y,p)),this.metadata){let j=yield p.getTileJson(t.url);return e.signal.throwIfAborted(),{data:j}}let h=yield p.getHeader();return e.signal.throwIfAborted(),(h.minLon>=h.maxLon||h.minLat>=h.maxLat)&&console.error(`Bounds of PMTiles archive ${h.minLon},${h.minLat},${h.maxLon},${h.maxLat} are not valid.`),{data:{tiles:[`${t.url}/{z}/{x}/{y}`],minzoom:h.minZoom,maxzoom:h.maxZoom,bounds:[h.minLon,h.minLat,h.maxLon,h.maxLat]}}}let r=new RegExp(/pmtiles:\\/\\/(.+)\\/(\\d+)\\/(\\d+)\\/(\\d+)/),n=t.url.match(r);if(!n)throw new Error(\"Invalid PMTiles protocol URL\");let s=n[1],o=this.tiles.get(s);o||(o=new w(s),this.tiles.set(s,o));let a=n[2],c=n[3],u=n[4],l=yield o==null?void 0:o.getZxy(+a,+c,+u,e.signal);if(e.signal.throwIfAborted(),l)return{data:new Uint8Array(l.data),cacheControl:l.cacheControl,expires:l.expires};let f=yield o.getHeader();if(f.tileType===1||f.tileType===6){if(this.errorOnMissingTile)throw new Error(\"Tile not found.\");return{data:new Uint8Array}}return{data:null}}),\"tilev4\");this.tile=W(this.tilev4);this.tiles=new Map,this.metadata=(t==null?void 0:t.metadata)||!1,this.errorOnMissingTile=(t==null?void 0:t.errorOnMissingTile)||!1}add(t){this.tiles.set(t.source.getKey(),t)}get(t){return this.tiles.get(t)}};d(E,\"Protocol\");var S=E;function b(i,t){return(t>>>0)*4294967296+(i>>>0)}d(b,\"toNum\");function N(i,t){let e=t.buf,r=e[t.pos++],n=(r&112)>>4;if(r<128||(r=e[t.pos++],n|=(r&127)<<3,r<128)||(r=e[t.pos++],n|=(r&127)<<10,r<128)||(r=e[t.pos++],n|=(r&127)<<17,r<128)||(r=e[t.pos++],n|=(r&127)<<24,r<128)||(r=e[t.pos++],n|=(r&1)<<31,r<128))return b(i,n);throw new Error(\"Expected varint not more than 10 bytes\")}d(N,\"readVarintRemainder\");function x(i){let t=i.buf,e=t[i.pos++],r=e&127;return e<128||(e=t[i.pos++],r|=(e&127)<<7,e<128)||(e=t[i.pos++],r|=(e&127)<<14,e<128)||(e=t[i.pos++],r|=(e&127)<<21,e<128)?r:(e=t[i.pos],r|=(e&15)<<28,N(r,i))}d(x,\"readVarint\");function Z(i,t,e,r,n){return n===0?r!==0?[i-1-e,i-1-t]:[e,t]:[t,e]}d(Z,\"rotate\");function q(i,t,e){if(i>26)throw new Error(\"Tile zoom level exceeds max safe number limit (26)\");if(t>=1<<i||e>=1<<i)throw new Error(\"tile x/y outside zoom level bounds\");let r=((1<<i)*(1<<i)-1)/3,n=i-1,[s,o]=[t,e];for(let a=1<<n;a>0;a>>=1){let c=s&a,u=o&a;r+=(3*c^u)*(1<<n),[s,o]=Z(a,s,o,c,u),n--}return r}d(q,\"zxyToTileId\");function G(i){let t=3*i+1;return t<4294967296?31-Math.clz32(t):63-Math.clz32(t/4294967296)}d(G,\"tileIdToZ\");function oe(i){let t=G(i)>>1;if(t>26)throw new Error(\"Tile zoom level exceeds max safe number limit (26)\");let e=((1<<t)*(1<<t)-1)/3,r=i-e,n=0,s=0,o=1<<t;for(let a=1;a<o;a<<=1){let c=a&r/2,u=a&(r^c);[n,s]=Z(a,n,s,c,u),r=r/2,n+=c,s+=u}return[t,n,s]}d(oe,\"tileIdToZxy\");var J=(s=>(s[s.Unknown=0]=\"Unknown\",s[s.None=1]=\"None\",s[s.Gzip=2]=\"Gzip\",s[s.Brotli=3]=\"Brotli\",s[s.Zstd=4]=\"Zstd\",s))(J||{});function D(i,t){return m(this,null,function*(){if(t===1||t===0)return i;if(t===2){if(typeof globalThis.DecompressionStream==\"undefined\")return F(new Uint8Array(i));let e=new Response(i).body;if(!e)throw new Error(\"Failed to read response stream\");let r=e.pipeThrough(new globalThis.DecompressionStream(\"gzip\"));return new Response(r).arrayBuffer()}throw new Error(\"Compression method not supported\")})}d(D,\"defaultDecompress\");var O=(a=>(a[a.Unknown=0]=\"Unknown\",a[a.Mvt=1]=\"Mvt\",a[a.Png=2]=\"Png\",a[a.Jpeg=3]=\"Jpeg\",a[a.Webp=4]=\"Webp\",a[a.Avif=5]=\"Avif\",a[a.Mlt=6]=\"Mlt\",a))(O||{});function _(i){return i===1?\".mvt\":i===2?\".png\":i===3?\".jpg\":i===4?\".webp\":i===5?\".avif\":i===6?\".mlt\":\"\"}d(_,\"tileTypeExt\");var Y=127;function Q(i,t){let e=0,r=i.length-1;for(;e<=r;){let n=r+e>>1,s=t-i[n].tileId;if(s>0)e=n+1;else if(s<0)r=n-1;else return i[n]}return r>=0&&(i[r].runLength===0||t-i[r].tileId<i[r].runLength)?i[r]:null}d(Q,\"findTile\");var A=class A{constructor(t){this.file=t}getKey(){return this.file.name}getBytes(t,e){return m(this,null,function*(){return{data:yield this.file.slice(t,t+e).arrayBuffer()}})}};d(A,\"FileSource\");var $=A,P=class P{constructor(t,e=new Headers,r=void 0){var a,c;this.url=t,this.customHeaders=e,this.credentials=r,this.mustReload=!1;let n=\"\";\"navigator\"in globalThis&&(n=(c=(a=globalThis.navigator)==null?void 0:a.userAgent)!=null?c:\"\");let s=n.indexOf(\"Windows\")>-1,o=/Chrome|Chromium|Edg|OPR|Brave/.test(n);this.chromeWindowsNoCache=!1,s&&o&&(this.chromeWindowsNoCache=!0)}getKey(){return this.url}setHeaders(t){this.customHeaders=t}getBytes(t,e,r,n){return m(this,null,function*(){let s,o;r?o=r:(s=new AbortController,o=s.signal);let a=new Headers(this.customHeaders);a.set(\"range\",`bytes=${t}-${t+e-1}`);let c;this.mustReload?c=\"reload\":this.chromeWindowsNoCache&&(c=\"no-store\");let u=yield fetch(this.url,{signal:o,cache:c,headers:a,credentials:this.credentials});if(t===0&&u.status===416){let p=u.headers.get(\"Content-Range\");if(!p||!p.startsWith(\"bytes */\"))throw new Error(\"Missing content-length on 416 response\");let h=+p.substr(8);a.set(\"range\",`bytes=0-${h-1}`),u=yield fetch(this.url,{signal:o,cache:\"reload\",headers:a,credentials:this.credentials})}let l=u.headers.get(\"Etag\");if(l!=null&&l.startsWith(\"W/\")&&(l=null),u.status===416||n&&l&&l!==n)throw this.mustReload=!0,new v(`Server returned non-matching ETag ${n} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`);if(u.status>=300)throw new Error(`Bad response code: ${u.status}`);let f=u.headers.get(\"Content-Length\");if(u.status===200&&(!f||+f>e))throw s&&s.abort(),new Error(\"Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving.\");return{data:yield u.arrayBuffer(),etag:l||void 0,cacheControl:u.headers.get(\"Cache-Control\")||void 0,expires:u.headers.get(\"Expires\")||void 0}})}};d(P,\"FetchSource\");var T=P;function g(i,t){let e=i.getUint32(t+4,!0),r=i.getUint32(t+0,!0);return e*B(2,32)+r}d(g,\"getUint64\");function X(i,t){let e=new DataView(i),r=e.getUint8(7);if(r>3)throw new Error(`Archive is spec version ${r} but this library supports up to spec version 3`);return{specVersion:r,rootDirectoryOffset:g(e,8),rootDirectoryLength:g(e,16),jsonMetadataOffset:g(e,24),jsonMetadataLength:g(e,32),leafDirectoryOffset:g(e,40),leafDirectoryLength:g(e,48),tileDataOffset:g(e,56),tileDataLength:g(e,64),numAddressedTiles:g(e,72),numTileEntries:g(e,80),numTileContents:g(e,88),clustered:e.getUint8(96)===1,internalCompression:e.getUint8(97),tileCompression:e.getUint8(98),tileType:e.getUint8(99),minZoom:e.getUint8(100),maxZoom:e.getUint8(101),minLon:e.getInt32(102,!0)/1e7,minLat:e.getInt32(106,!0)/1e7,maxLon:e.getInt32(110,!0)/1e7,maxLat:e.getInt32(114,!0)/1e7,centerZoom:e.getUint8(118),centerLon:e.getInt32(119,!0)/1e7,centerLat:e.getInt32(123,!0)/1e7,etag:t}}d(X,\"bytesToHeader\");function I(i){let t={buf:new Uint8Array(i),pos:0},e=x(t),r=[],n=0;for(let s=0;s<e;s++){let o=x(t);r.push({tileId:n+o,offset:0,length:0,runLength:1}),n+=o}for(let s=0;s<e;s++)r[s].runLength=x(t);for(let s=0;s<e;s++)r[s].length=x(t);for(let s=0;s<e;s++){let o=x(t);o===0&&s>0?r[s].offset=r[s-1].offset+r[s-1].length:r[s].offset=o-1}return r}d(I,\"deserializeIndex\");var R=class R extends Error{};d(R,\"EtagMismatch\");var v=R;function V(i,t){return m(this,null,function*(){let e=yield i.getBytes(0,16384);if(new DataView(e.data).getUint16(0,!0)!==19792)throw new Error(\"Wrong magic number for PMTiles archive\");let n=e.data.slice(0,Y),s=X(n,e.etag),o=e.data.slice(s.rootDirectoryOffset,s.rootDirectoryOffset+s.rootDirectoryLength),a=`${i.getKey()}|${s.etag||\"\"}|${s.rootDirectoryOffset}|${s.rootDirectoryLength}`,c=I(yield t(o,s.internalCompression));return[s,[a,c.length,c]]})}d(V,\"getHeaderAndRoot\");function K(i,t,e,r,n){return m(this,null,function*(){let s=yield i.getBytes(e,r,void 0,n.etag),o=yield t(s.data,n.internalCompression),a=I(o);if(a.length===0)throw new Error(\"Empty directory is invalid\");return a})}d(K,\"getDirectory\");var U=class U{constructor(t=100,e=!0,r=D){this.cache=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return m(this,null,function*(){let e=t.getKey(),r=this.cache.get(e);if(r)return r.lastUsed=this.counter++,r.data;let n=yield V(t,this.decompress);return n[1]&&this.cache.set(n[1][0],{lastUsed:this.counter++,data:n[1][2]}),this.cache.set(e,{lastUsed:this.counter++,data:n[0]}),this.prune(),n[0]})}getDirectory(t,e,r,n){return m(this,null,function*(){let s=`${t.getKey()}|${n.etag||\"\"}|${e}|${r}`,o=this.cache.get(s);if(o)return o.lastUsed=this.counter++,o.data;let a=yield K(t,this.decompress,e,r,n);return this.cache.set(s,{lastUsed:this.counter++,data:a}),this.prune(),a})}prune(){if(this.cache.size>this.maxCacheEntries){let t=1/0,e;this.cache.forEach((r,n)=>{r.lastUsed<t&&(t=r.lastUsed,e=n)}),e&&this.cache.delete(e)}}invalidate(t){return m(this,null,function*(){this.cache.delete(t.getKey())})}};d(U,\"ResolvedValueCache\");var k=U,M=class M{constructor(t=100,e=!0,r=D){this.cache=new Map,this.invalidations=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return m(this,null,function*(){let e=t.getKey(),r=this.cache.get(e);if(r)return r.lastUsed=this.counter++,yield r.data;let n=new Promise((s,o)=>{V(t,this.decompress).then(a=>{a[1]&&this.cache.set(a[1][0],{lastUsed:this.counter++,data:Promise.resolve(a[1][2])}),s(a[0]),this.prune()}).catch(a=>{o(a)})});return this.cache.set(e,{lastUsed:this.counter++,data:n}),n})}getDirectory(t,e,r,n){return m(this,null,function*(){let s=`${t.getKey()}|${n.etag||\"\"}|${e}|${r}`,o=this.cache.get(s);if(o)return o.lastUsed=this.counter++,yield o.data;let a=new Promise((c,u)=>{K(t,this.decompress,e,r,n).then(l=>{c(l),this.prune()}).catch(l=>{u(l)})});return this.cache.set(s,{lastUsed:this.counter++,data:a}),a})}prune(){if(this.cache.size>=this.maxCacheEntries){let t=1/0,e;this.cache.forEach((r,n)=>{r.lastUsed<t&&(t=r.lastUsed,e=n)}),e&&this.cache.delete(e)}}invalidate(t){return m(this,null,function*(){let e=t.getKey();if(this.invalidations.get(e))return yield this.invalidations.get(e);this.cache.delete(t.getKey());let r=new Promise((n,s)=>{this.getHeader(t).then(o=>{n(),this.invalidations.delete(e)}).catch(o=>{s(o)})});this.invalidations.set(e,r)})}};d(M,\"SharedPromiseCache\");var C=M,H=class H{constructor(t,e,r){typeof t==\"string\"?this.source=new T(t):this.source=t,r?this.decompress=r:this.decompress=D,e?this.cache=e:this.cache=new C}getHeader(){return m(this,null,function*(){return yield this.cache.getHeader(this.source)})}getZxyAttempt(t,e,r,n){return m(this,null,function*(){let s=q(t,e,r),o=yield this.cache.getHeader(this.source);if(t<o.minZoom||t>o.maxZoom)return;let a=o.rootDirectoryOffset,c=o.rootDirectoryLength;for(let u=0;u<=3;u++){let l=yield this.cache.getDirectory(this.source,a,c,o),f=Q(l,s);if(f){if(f.runLength>0){let y=yield this.source.getBytes(o.tileDataOffset+f.offset,f.length,n,o.etag);return{data:yield this.decompress(y.data,o.tileCompression),cacheControl:y.cacheControl,expires:y.expires}}a=o.leafDirectoryOffset+f.offset,c=f.length}else return}throw new Error(\"Maximum directory depth exceeded\")})}getZxy(t,e,r,n){return m(this,null,function*(){try{return yield this.getZxyAttempt(t,e,r,n)}catch(s){if(s instanceof v)return this.cache.invalidate(this.source),yield this.getZxyAttempt(t,e,r,n);throw s}})}getMetadataAttempt(){return m(this,null,function*(){let t=yield this.cache.getHeader(this.source),e=yield this.source.getBytes(t.jsonMetadataOffset,t.jsonMetadataLength,void 0,t.etag),r=yield this.decompress(e.data,t.internalCompression),n=new TextDecoder(\"utf-8\");return JSON.parse(n.decode(r))})}getMetadata(){return m(this,null,function*(){try{return yield this.getMetadataAttempt()}catch(t){if(t instanceof v)return this.cache.invalidate(this.source),yield this.getMetadataAttempt();throw t}})}getTileJson(t){return m(this,null,function*(){let e=yield this.getHeader(),r=yield this.getMetadata(),n=_(e.tileType);return{tilejson:\"3.0.0\",scheme:\"xyz\",tiles:[`${t}/{z}/{x}/{y}${n}`],vector_layers:r.vector_layers,attribution:r.attribution,description:r.description,name:r.name,version:r.version,bounds:[e.minLon,e.minLat,e.maxLon,e.maxLat],center:[e.centerLon,e.centerLat,e.centerZoom],minzoom:e.minZoom,maxzoom:e.maxZoom}})}};d(H,\"PMTiles\");var w=H;export{J as Compression,v as EtagMismatch,T as FetchSource,$ as FileSource,w as PMTiles,S as Protocol,k as ResolvedValueCache,C as SharedPromiseCache,O as TileType,X as bytesToHeader,Q as findTile,g as getUint64,re as leafletRasterLayer,x as readVarint,oe as tileIdToZxy,_ as tileTypeExt,q as zxyToTileId};\n//# sourceMappingURL=index.js.map","import { Protocol } from 'pmtiles';\nimport { getMapLibre } from './maplibre';\n\nlet registered = false;\n\n/**\n * Registers the `pmtiles://` protocol with MapLibre GL once.\n *\n * Safe to call multiple times; subsequent calls are no-ops. Note that this\n * cannot detect a `pmtiles` protocol registered by the host application\n * before the plugin loads, in which case the existing handler is replaced.\n */\nexport function ensurePmtilesProtocol(): void {\n  if (registered) {\n    return;\n  }\n  const protocol = new Protocol();\n  getMapLibre().addProtocol('pmtiles', protocol.tile);\n  registered = true;\n}\n","import type { IControl, Map as MapLibreMap, MapMouseEvent } from \"maplibre-gl\";\nimport type { FeatureCollection } from \"geojson\";\nimport { getMapLibre } from \"./maplibre\";\nimport type {\n  OvertureMapsControlOptions,\n  OvertureMapsState,\n  OvertureMapsEvent,\n  OvertureMapsEventHandler,\n  OvertureThemeState,\n  OvertureLayerState,\n  OverturePopup,\n} from \"./types\";\nimport {\n  THEMES,\n  THEME_IDS,\n  layerIdsForTheme,\n  layerIdsForSourceLayer,\n  buildSourceLayerSpecs,\n  opacityPropertyForLayerType,\n  colorPropertyForLayerType,\n  sizePropertyForLayerType,\n  defaultSizeForGeometry,\n  findLayerDef,\n  effectiveOpacity,\n  sourceIdForTheme,\n  tileUrlForTheme,\n} from \"./themes\";\nimport type { OvertureTheme } from \"./themes\";\nimport { DEFAULT_TILES_BASE_URL, FALLBACK_RELEASE, resolveReleases } from \"./releases\";\nimport { ensurePmtilesProtocol } from \"./pmtilesProtocol\";\n\n/**\n * Default options for the OvertureMapsControl\n */\nconst DEFAULT_OPTIONS: Required<\n  Omit<\n    OvertureMapsControlOptions,\n    \"release\" | \"releasesUrl\" | \"themeColors\" | \"themeOpacity\" | \"onExport\" | \"createPopup\"\n  >\n> &\n  Pick<\n    OvertureMapsControlOptions,\n    \"release\" | \"releasesUrl\" | \"themeColors\" | \"themeOpacity\" | \"onExport\" | \"createPopup\"\n  > = {\n  collapsed: true,\n  position: \"top-right\",\n  title: \"Overture Maps\",\n  panelWidth: 300,\n  className: \"\",\n  theme: \"auto\",\n  release: undefined,\n  // Left unset on purpose: the releases.json Overture published is frozen and\n  // names a release whose tiles are gone, so the control discovers releases\n  // from the distribution itself (issue #12). Setting this opts back into a\n  // releases.json, for a self-hosted mirror.\n  releasesUrl: undefined,\n  tilesBaseUrl: DEFAULT_TILES_BASE_URL,\n  inspect: true,\n  exportMinZoom: 12,\n  visibleThemes: [\"buildings\", \"transportation\", \"places\"],\n  themeColors: undefined,\n  themeOpacity: undefined,\n  onExport: undefined,\n  nativePmtiles: false,\n  createPopup: undefined,\n};\n\nconst DEFAULT_OPACITY = 0.8;\n\n/** Minimum panel width when resizing, matches the CSS min-width */\nconst MIN_PANEL_WIDTH = 240;\n\n/** Maximum panel width when resizing */\nconst MAX_PANEL_WIDTH = 600;\n\n/**\n * Event handlers map type\n */\ntype EventHandlersMap = globalThis.Map<\n  OvertureMapsEvent,\n  Set<OvertureMapsEventHandler>\n>;\n\n/**\n * A MapLibre GL control for visualizing Overture Maps PMTiles themes.\n *\n * Adds a collapsible panel with a release selector and per-theme visibility\n * and opacity controls. Tiles are loaded from the official Overture Maps\n * PMTiles distribution using the `pmtiles://` protocol.\n *\n * @example\n * ```typescript\n * const control = new OvertureMapsControl({\n *   collapsed: false,\n *   visibleThemes: ['buildings', 'places'],\n * });\n * map.addControl(control, 'top-right');\n * ```\n */\nexport class OvertureMapsControl implements IControl {\n  private _map?: MapLibreMap;\n  private _mapContainer?: HTMLElement;\n  private _container?: HTMLElement;\n  private _panel?: HTMLElement;\n  private _options: typeof DEFAULT_OPTIONS;\n  private _state: OvertureMapsState;\n  private _eventHandlers: EventHandlersMap = new globalThis.Map();\n  private _popup?: OverturePopup;\n  private _releaseSelect?: HTMLSelectElement;\n  private _errorEl?: HTMLElement;\n  private _noticeEl?: HTMLElement;\n  private _noticeTimer: ReturnType<typeof setTimeout> | null = null;\n  private _inspectCheckbox?: HTMLInputElement;\n  // Zoom hint paragraph; its text and styling track the live map zoom.\n  private _hintEl?: HTMLElement;\n\n  // System color-scheme adaptation (only used when theme: 'auto')\n  private _schemeMedia: MediaQueryList | null = null;\n  private _schemeListener: (() => void) | null = null;\n\n  // Panel positioning handlers\n  private _resizeHandler: (() => void) | null = null;\n  private _mapResizeHandler: (() => void) | null = null;\n  private _clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n  // Set while expanding so the click that triggered a programmatic\n  // expand (e.g. an external button) is not treated as a click-outside\n  private _suppressClickOutside = false;\n\n  // Panel width drag-resize handlers (added to the document during a drag)\n  private _resizePointerMove: ((e: PointerEvent) => void) | null = null;\n  private _resizePointerUp: ((e: PointerEvent) => void) | null = null;\n\n  // Map interaction handlers\n  private _clickHandler: ((e: MapMouseEvent) => void) | null = null;\n  private _moveHandler: ((e: MapMouseEvent) => void) | null = null;\n\n  // Re-applies the Overture sources and layers after a basemap/style reload,\n  // which drops every non-base layer from the map.\n  private _styleLoadHandler: (() => void) | null = null;\n\n  // Keeps the zoom hint in sync with the live map zoom so the heads-up about\n  // detail themes turns into a positive confirmation once the threshold is met.\n  private _zoomHandler: (() => void) | null = null;\n\n  /**\n   * Creates a new OvertureMapsControl instance.\n   *\n   * @param options - Configuration options for the control\n   */\n  constructor(options?: Partial<OvertureMapsControlOptions>) {\n    this._options = { ...DEFAULT_OPTIONS, ...options };\n\n    const themes = {} as Record<OvertureTheme, OvertureThemeState>;\n    for (const theme of THEME_IDS) {\n      const def = THEMES[theme];\n      const visible = this._options.visibleThemes.includes(theme);\n      const opacity = this._options.themeOpacity?.[theme] ?? DEFAULT_OPACITY;\n      const color = this._options.themeColors?.[theme] ?? def.color;\n      const layers = {} as Record<string, OvertureLayerState>;\n      for (const layer of def.layers) {\n        layers[layer.sourceLayer] = {\n          visible,\n          opacity,\n          color,\n          size: defaultSizeForGeometry(layer.geometry),\n        };\n      }\n      themes[theme] = { expanded: false, layers };\n    }\n\n    this._state = {\n      collapsed: this._options.collapsed,\n      panelWidth: this._options.panelWidth,\n      release: this._options.release ?? \"\",\n      releases: this._options.release ? [this._options.release] : [],\n      themes,\n      inspect: this._options.inspect,\n      error: null,\n    };\n  }\n\n  /**\n   * Called when the control is added to the map.\n   * Implements the IControl interface.\n   *\n   * @param map - The MapLibre GL map instance\n   * @returns The control's container element\n   */\n  onAdd(map: MapLibreMap): HTMLElement {\n    this._map = map;\n    this._mapContainer = map.getContainer();\n    // A host whose engine reads `.pmtiles` archives itself (mapbox-gl 3.30+)\n    // gets plain https URLs instead, and MapLibre's protocol is never touched.\n    if (!this._options.nativePmtiles) {\n      ensurePmtilesProtocol();\n    }\n\n    this._container = this._createContainer();\n    this._panel = this._createPanel();\n\n    // Append panel to map container for independent positioning (avoids overlap with other controls)\n    this._mapContainer.appendChild(this._panel);\n\n    // Setup event listeners for panel positioning and click-outside\n    this._setupEventListeners();\n\n    // Re-add the Overture sources and layers whenever a new basemap style\n    // finishes loading. Switching basemaps calls map.setStyle(), which wipes\n    // every non-base source and layer, so without this the visible themes\n    // would silently disappear after a basemap change. _applyRelease() is a\n    // no-op until a release has resolved, so the initial load is unaffected.\n    this._styleLoadHandler = () => this._applyRelease();\n    this._map.on(\"style.load\", this._styleLoadHandler);\n\n    // Update the zoom hint as the map zoom crosses the detail-theme threshold,\n    // so a satisfied heads-up does not linger as an outdated warning.\n    this._zoomHandler = () => this._updateHint();\n    this._map.on(\"zoom\", this._zoomHandler);\n\n    // Follow the system color scheme live when theme is 'auto'\n    this._setupSchemeListener();\n\n    // Setup feature inspection\n    if (this._state.inspect) {\n      this._setupInspect();\n    }\n\n    // Set initial panel state\n    if (!this._state.collapsed) {\n      this._panel.classList.add(\"expanded\");\n      // Update position after control is added to DOM\n      requestAnimationFrame(() => {\n        this._updatePanelPosition();\n      });\n    }\n\n    // Resolve the release list, then render the Overture sources/layers\n    void this._initializeReleases();\n\n    return this._container;\n  }\n\n  /**\n   * Called when the control is removed from the map.\n   * Implements the IControl interface.\n   */\n  onRemove(): void {\n    // Remove map interaction handlers\n    this._teardownInspect();\n\n    // Clear any pending notice timer\n    if (this._noticeTimer != null) {\n      clearTimeout(this._noticeTimer);\n      this._noticeTimer = null;\n    }\n\n    // Remove the system color-scheme listener\n    if (this._schemeMedia && this._schemeListener) {\n      this._schemeMedia.removeEventListener(\"change\", this._schemeListener);\n    }\n    this._schemeMedia = null;\n    this._schemeListener = null;\n\n    // Remove Overture layers and sources\n    this._removeAllThemes();\n\n    // Remove any in-progress panel resize listeners\n    if (this._resizePointerMove) {\n      document.removeEventListener(\"pointermove\", this._resizePointerMove);\n      this._resizePointerMove = null;\n    }\n    if (this._resizePointerUp) {\n      document.removeEventListener(\"pointerup\", this._resizePointerUp);\n      this._resizePointerUp = null;\n    }\n\n    // Remove event listeners\n    if (this._resizeHandler) {\n      window.removeEventListener(\"resize\", this._resizeHandler);\n      this._resizeHandler = null;\n    }\n    if (this._mapResizeHandler && this._map) {\n      this._map.off(\"resize\", this._mapResizeHandler);\n      this._mapResizeHandler = null;\n    }\n    if (this._styleLoadHandler && this._map) {\n      this._map.off(\"style.load\", this._styleLoadHandler);\n      this._styleLoadHandler = null;\n    }\n    if (this._zoomHandler && this._map) {\n      this._map.off(\"zoom\", this._zoomHandler);\n      this._zoomHandler = null;\n    }\n    if (this._clickOutsideHandler) {\n      document.removeEventListener(\"click\", this._clickOutsideHandler);\n      this._clickOutsideHandler = null;\n    }\n\n    // Remove panel from map container\n    this._panel?.parentNode?.removeChild(this._panel);\n\n    // Remove button container from control stack\n    this._container?.parentNode?.removeChild(this._container);\n\n    this._map = undefined;\n    this._mapContainer = undefined;\n    this._container = undefined;\n    this._panel = undefined;\n    this._releaseSelect = undefined;\n    this._errorEl = undefined;\n    this._noticeEl = undefined;\n    this._hintEl = undefined;\n    this._inspectCheckbox = undefined;\n    this._eventHandlers.clear();\n  }\n\n  /**\n   * Gets the current state of the control.\n   *\n   * @returns The current control state\n   */\n  getState(): OvertureMapsState {\n    return {\n      ...this._state,\n      releases: [...this._state.releases],\n      themes: this._cloneThemes(),\n    };\n  }\n\n  /**\n   * Updates the control state.\n   *\n   * @param newState - Partial state to merge with current state\n   */\n  setState(newState: Partial<OvertureMapsState>): void {\n    this._state = { ...this._state, ...newState };\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Toggles the collapsed state of the control panel.\n   */\n  toggle(): void {\n    this._state.collapsed = !this._state.collapsed;\n\n    if (this._panel) {\n      if (this._state.collapsed) {\n        this._panel.classList.remove(\"expanded\");\n        this._emit(\"collapse\");\n      } else {\n        this._panel.classList.add(\"expanded\");\n        this._updatePanelPosition();\n        // Ignore the click event currently being dispatched (if any) so\n        // a programmatic expand isn't undone by the click-outside handler\n        this._suppressClickOutside = true;\n        setTimeout(() => {\n          this._suppressClickOutside = false;\n        }, 0);\n        this._emit(\"expand\");\n      }\n    }\n\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Expands the control panel.\n   */\n  expand(): void {\n    if (this._state.collapsed) {\n      this.toggle();\n    }\n  }\n\n  /**\n   * Collapses the control panel.\n   */\n  collapse(): void {\n    if (!this._state.collapsed) {\n      this.toggle();\n    }\n  }\n\n  /**\n   * Registers an event handler.\n   *\n   * @param event - The event type to listen for\n   * @param handler - The callback function\n   */\n  on(event: OvertureMapsEvent, handler: OvertureMapsEventHandler): void {\n    if (!this._eventHandlers.has(event)) {\n      this._eventHandlers.set(event, new Set());\n    }\n    this._eventHandlers.get(event)!.add(handler);\n  }\n\n  /**\n   * Removes an event handler.\n   *\n   * @param event - The event type\n   * @param handler - The callback function to remove\n   */\n  off(event: OvertureMapsEvent, handler: OvertureMapsEventHandler): void {\n    this._eventHandlers.get(event)?.delete(handler);\n  }\n\n  /**\n   * Gets the map instance.\n   *\n   * @returns The MapLibre GL map instance or undefined if not added to a map\n   */\n  getMap(): MapLibreMap | undefined {\n    return this._map;\n  }\n\n  /**\n   * Gets the control container element.\n   *\n   * @returns The container element or undefined if not added to a map\n   */\n  getContainer(): HTMLElement | undefined {\n    return this._container;\n  }\n\n  /**\n   * Switches the active Overture release and reloads visible themes.\n   *\n   * @param release - The release to activate, e.g. `'2026-05-20.0'`\n   */\n  setRelease(release: string): void {\n    if (!release || release === this._state.release) {\n      return;\n    }\n    this._state.release = release;\n    if (!this._state.releases.includes(release)) {\n      this._state.releases = [release, ...this._state.releases];\n      this._renderReleaseOptions();\n    }\n    if (this._releaseSelect) {\n      this._releaseSelect.value = release;\n    }\n    this._applyRelease();\n    this._emit(\"releasechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Shows or hides every source layer of an Overture theme.\n   *\n   * @param theme - The theme to update\n   * @param visible - Whether the theme's layers should be rendered\n   */\n  setThemeVisible(theme: OvertureTheme, visible: boolean): void {\n    const themeState = this._state.themes[theme];\n    if (!themeState) {\n      return;\n    }\n    let changed = false;\n    for (const sourceLayer of Object.keys(themeState.layers)) {\n      const layerState = themeState.layers[sourceLayer];\n      if (layerState.visible === visible) {\n        continue;\n      }\n      layerState.visible = visible;\n      if (visible) {\n        this._addLayer(theme, sourceLayer);\n      } else {\n        this._removeLayer(theme, sourceLayer);\n      }\n      changed = true;\n    }\n    if (!changed) {\n      return;\n    }\n    this._syncThemeGroup(theme);\n    this._emit(\"themechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Sets the opacity of every source layer of an Overture theme.\n   *\n   * @param theme - The theme to update\n   * @param opacity - Opacity value between 0 and 1\n   */\n  setThemeOpacity(theme: OvertureTheme, opacity: number): void {\n    const themeState = this._state.themes[theme];\n    if (!themeState) {\n      return;\n    }\n    for (const sourceLayer of Object.keys(themeState.layers)) {\n      this.setLayerOpacity(theme, sourceLayer, opacity);\n    }\n  }\n\n  /**\n   * Shows or hides a single source layer of a theme.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @param visible - Whether the layer should be rendered\n   */\n  setLayerVisible(\n    theme: OvertureTheme,\n    sourceLayer: string,\n    visible: boolean,\n  ): void {\n    const layerState = this._state.themes[theme]?.layers[sourceLayer];\n    if (!layerState || layerState.visible === visible) {\n      return;\n    }\n    layerState.visible = visible;\n    if (visible) {\n      this._addLayer(theme, sourceLayer);\n    } else {\n      this._removeLayer(theme, sourceLayer);\n    }\n    this._syncThemeGroup(theme);\n    this._emit(\"themechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Sets the opacity of a single source layer.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @param opacity - Opacity value between 0 and 1\n   */\n  setLayerOpacity(\n    theme: OvertureTheme,\n    sourceLayer: string,\n    opacity: number,\n  ): void {\n    const layerState = this._state.themes[theme]?.layers[sourceLayer];\n    if (!layerState) {\n      return;\n    }\n    const clamped = Math.min(1, Math.max(0, opacity));\n    layerState.opacity = clamped;\n\n    if (this._map && layerState.visible) {\n      for (const spec of buildSourceLayerSpecs(\n        theme,\n        sourceLayer,\n        clamped,\n        layerState.color,\n      )) {\n        if (this._map.getLayer(spec.id)) {\n          const layerType = spec.type as \"fill\" | \"line\" | \"circle\";\n          this._map.setPaintProperty(\n            spec.id,\n            opacityPropertyForLayerType(layerType),\n            effectiveOpacity(layerType, clamped),\n          );\n        }\n      }\n    }\n\n    this._syncLayerRow(theme, sourceLayer);\n    this._emit(\"themechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Sets the color of a single source layer.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @param color - A CSS color string (hex)\n   */\n  setLayerColor(\n    theme: OvertureTheme,\n    sourceLayer: string,\n    color: string,\n  ): void {\n    const layerState = this._state.themes[theme]?.layers[sourceLayer];\n    if (!layerState) {\n      return;\n    }\n    layerState.color = color;\n\n    if (this._map && layerState.visible) {\n      for (const spec of buildSourceLayerSpecs(\n        theme,\n        sourceLayer,\n        layerState.opacity,\n        color,\n      )) {\n        if (this._map.getLayer(spec.id)) {\n          const layerType = spec.type as \"fill\" | \"line\" | \"circle\";\n          this._map.setPaintProperty(\n            spec.id,\n            colorPropertyForLayerType(layerType),\n            color,\n          );\n        }\n      }\n    }\n\n    this._syncLayerRow(theme, sourceLayer);\n    this._emit(\"themechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Sets the size of a single source layer (circle radius for points, line\n   * width for lines and polygon outlines).\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @param size - The size in pixels\n   */\n  setLayerSize(theme: OvertureTheme, sourceLayer: string, size: number): void {\n    const layerState = this._state.themes[theme]?.layers[sourceLayer];\n    if (!layerState) {\n      return;\n    }\n    const clamped = Math.max(0, size);\n    layerState.size = clamped;\n\n    if (this._map && layerState.visible) {\n      for (const spec of buildSourceLayerSpecs(\n        theme,\n        sourceLayer,\n        layerState.opacity,\n        layerState.color,\n        clamped,\n      )) {\n        if (this._map.getLayer(spec.id)) {\n          const layerType = spec.type as \"fill\" | \"line\" | \"circle\";\n          const property = sizePropertyForLayerType(layerType);\n          if (property) {\n            this._map.setPaintProperty(spec.id, property, clamped);\n          }\n        }\n      }\n    }\n\n    this._syncLayerRow(theme, sourceLayer);\n    this._emit(\"themechange\");\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Expands or collapses a theme's layer list in the panel.\n   *\n   * @param theme - The theme to update\n   * @param expanded - Whether the layer list should be shown\n   */\n  setThemeExpanded(theme: OvertureTheme, expanded: boolean): void {\n    const themeState = this._state.themes[theme];\n    if (!themeState || themeState.expanded === expanded) {\n      return;\n    }\n    themeState.expanded = expanded;\n    this._syncThemeGroup(theme);\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Enables or disables the feature inspection picker.\n   *\n   * @param enabled - Whether clicking a feature opens a properties popup\n   */\n  setInspect(enabled: boolean): void {\n    if (this._state.inspect === enabled) {\n      return;\n    }\n    this._state.inspect = enabled;\n    if (enabled) {\n      this._setupInspect();\n    } else {\n      this._teardownInspect();\n    }\n    if (this._inspectCheckbox) {\n      this._inspectCheckbox.checked = enabled;\n    }\n    this._emit(\"statechange\");\n  }\n\n  /**\n   * Collects the features of a layer rendered in the current map view as a\n   * GeoJSON FeatureCollection.\n   *\n   * Only features painted in the current viewport are returned, deduplicated\n   * across tile boundaries. Combine with a high zoom level to keep the\n   * result limited to a small area.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @returns A GeoJSON FeatureCollection (possibly empty)\n   */\n  getRenderedLayerGeoJSON(\n    theme: OvertureTheme,\n    sourceLayer: string,\n  ): FeatureCollection {\n    const collection: FeatureCollection = {\n      type: \"FeatureCollection\",\n      features: [],\n    };\n    if (!this._map) {\n      return collection;\n    }\n    const layerIds = layerIdsForSourceLayer(theme, sourceLayer).filter((id) =>\n      this._map!.getLayer(id),\n    );\n    if (!layerIds.length) {\n      return collection;\n    }\n\n    const seen = new Set<string>();\n    for (const feature of this._map.queryRenderedFeatures({\n      layers: layerIds,\n    })) {\n      const key =\n        feature.id != null\n          ? `${feature.sourceLayer ?? \"\"}:${feature.id}`\n          : JSON.stringify([feature.geometry, feature.properties]);\n      if (seen.has(key)) {\n        continue;\n      }\n      seen.add(key);\n      collection.features.push({\n        type: \"Feature\",\n        geometry: feature.geometry,\n        properties: feature.properties ?? {},\n      });\n    }\n    return collection;\n  }\n\n  /**\n   * Exports a layer's features in the current view to a downloaded GeoJSON\n   * file. The export is gated by `exportMinZoom` so it only ever covers a\n   * small area.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @returns The exported FeatureCollection, or null when nothing was exported\n   */\n  exportLayer(\n    theme: OvertureTheme,\n    sourceLayer: string,\n  ): FeatureCollection | null {\n    if (!this._map) {\n      return null;\n    }\n    const label = this._humanizeLayer(sourceLayer);\n    const layerState = this._state.themes[theme]?.layers[sourceLayer];\n    if (!layerState?.visible) {\n      this._notify(`Enable ${label} before exporting.`);\n      return null;\n    }\n    // Coalesce in case a caller passed `exportMinZoom: undefined`, which the\n    // options merge would otherwise leave undefined and bypass the gate.\n    const minZoom =\n      this._options.exportMinZoom ?? DEFAULT_OPTIONS.exportMinZoom;\n    if (this._map.getZoom() < minZoom) {\n      this._notify(`Zoom in (level ${minZoom}+) to export ${label}.`);\n      return null;\n    }\n\n    const collection = this.getRenderedLayerGeoJSON(theme, sourceLayer);\n    if (!collection.features.length) {\n      this._notify(`No ${label} features in the current view.`);\n      return null;\n    }\n\n    const filename = `overture-${theme}-${sourceLayer}.geojson`;\n    if (this._options.onExport) {\n      // Let the host save the file (e.g. a native dialog in a desktop webview\n      // where anchor-based downloads do not work). Guard against a host\n      // handler throwing so the click path stays consistent.\n      try {\n        this._options.onExport(filename, collection);\n      } catch (error) {\n        this._notify(`Failed to export ${label}.`);\n        this._setError(\n          `Export failed (${error instanceof Error ? error.message : \"unknown error\"}).`,\n        );\n        return null;\n      }\n    } else {\n      this._downloadGeoJSON(filename, collection);\n    }\n    const count = collection.features.length;\n    this._notify(\n      `Exported ${count} ${label} feature${count === 1 ? \"\" : \"s\"}.`,\n    );\n    return collection;\n  }\n\n  /**\n   * Triggers a browser download of a GeoJSON object.\n   *\n   * @param filename - The download file name\n   * @param data - The GeoJSON object to serialize\n   */\n  private _downloadGeoJSON(filename: string, data: FeatureCollection): void {\n    const blob = new Blob([JSON.stringify(data)], {\n      type: \"application/geo+json\",\n    });\n    const url = URL.createObjectURL(blob);\n    const anchor = document.createElement(\"a\");\n    anchor.href = url;\n    anchor.download = filename;\n    document.body.appendChild(anchor);\n    anchor.click();\n    document.body.removeChild(anchor);\n    URL.revokeObjectURL(url);\n  }\n\n  /**\n   * Shows a transient notice message in the panel.\n   *\n   * @param message - The message to display\n   */\n  private _notify(message: string): void {\n    if (!this._noticeEl) {\n      return;\n    }\n    // The element stays in the DOM as an aria-live region; the CSS :empty\n    // rule hides it visually when there is no message.\n    this._noticeEl.textContent = message;\n    if (this._noticeTimer != null) {\n      clearTimeout(this._noticeTimer);\n      this._noticeTimer = null;\n    }\n    if (message) {\n      this._noticeTimer = setTimeout(() => {\n        if (this._noticeEl) {\n          this._noticeEl.textContent = \"\";\n        }\n        this._noticeTimer = null;\n      }, 5000);\n    }\n  }\n\n  /**\n   * Re-fetches the list of available Overture releases.\n   *\n   * @returns The available releases, newest first\n   */\n  async refreshReleases(): Promise<string[]> {\n    const { latest, releases } = await resolveReleases({\n      releasesUrl: this._options.releasesUrl,\n      tilesBaseUrl: this._options.tilesBaseUrl,\n    });\n    this._state.releases = releases;\n    if (!this._state.release) {\n      this._state.release = latest;\n    }\n    this._renderReleaseOptions();\n    this._emit(\"statechange\");\n    return releases;\n  }\n\n  /**\n   * Emits an event to all registered handlers.\n   *\n   * @param event - The event type to emit\n   */\n  private _emit(event: OvertureMapsEvent): void {\n    const handlers = this._eventHandlers.get(event);\n    if (handlers) {\n      const eventData = { type: event, state: this.getState() };\n      handlers.forEach((handler) => handler(eventData));\n    }\n  }\n\n  /**\n   * Returns a deep copy of the per-theme state.\n   */\n  private _cloneThemes(): Record<OvertureTheme, OvertureThemeState> {\n    const themes = {} as Record<OvertureTheme, OvertureThemeState>;\n    for (const theme of THEME_IDS) {\n      const source = this._state.themes[theme];\n      const layers = {} as Record<string, OvertureLayerState>;\n      for (const sourceLayer of Object.keys(source.layers)) {\n        layers[sourceLayer] = { ...source.layers[sourceLayer] };\n      }\n      themes[theme] = { expanded: source.expanded, layers };\n    }\n    return themes;\n  }\n\n  /**\n   * Fetches the release list, falling back gracefully when unavailable,\n   * then renders the visible themes.\n   */\n  private async _initializeReleases(): Promise<void> {\n    try {\n      await this.refreshReleases();\n      this._setError(null);\n    } catch (error) {\n      if (!this._state.release) {\n        this._state.release = FALLBACK_RELEASE;\n        this._state.releases = [FALLBACK_RELEASE];\n        this._renderReleaseOptions();\n      }\n      this._setError(\n        `Could not load the Overture release list (${\n          error instanceof Error ? error.message : \"unknown error\"\n        }). Using ${this._state.release}.`,\n      );\n    }\n    this._applyRelease();\n  }\n\n  /**\n   * Records an error message and emits an `error` event when set.\n   *\n   * @param message - The error message, or null to clear\n   */\n  private _setError(message: string | null): void {\n    this._state.error = message;\n    if (this._errorEl) {\n      this._errorEl.textContent = message ?? \"\";\n      this._errorEl.style.display = message ? \"block\" : \"none\";\n    }\n    if (message) {\n      this._emit(\"error\");\n    }\n  }\n\n  /**\n   * Rebuilds the sources and layers for all visible layers using the\n   * active release.\n   */\n  private _applyRelease(): void {\n    if (!this._map || !this._state.release) {\n      return;\n    }\n    this._removeAllThemes();\n    for (const theme of THEME_IDS) {\n      const themeState = this._state.themes[theme];\n      for (const sourceLayer of Object.keys(themeState.layers)) {\n        if (themeState.layers[sourceLayer].visible) {\n          this._addLayer(theme, sourceLayer);\n        }\n      }\n    }\n  }\n\n  /**\n   * Ensures a theme's vector source exists on the map.\n   *\n   * @param theme - The theme whose source to add\n   */\n  private _ensureSource(theme: OvertureTheme): void {\n    if (!this._map || !this._state.release) {\n      return;\n    }\n    const sourceId = sourceIdForTheme(theme);\n    if (!this._map.getSource(sourceId)) {\n      this._map.addSource(sourceId, {\n        type: \"vector\",\n        url: tileUrlForTheme(\n          this._options.tilesBaseUrl,\n          this._state.release,\n          theme,\n          this._options.nativePmtiles,\n        ),\n      });\n    }\n  }\n\n  /**\n   * Adds the layers for a single source layer to the map.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   */\n  private _addLayer(theme: OvertureTheme, sourceLayer: string): void {\n    if (!this._map || !this._state.release) {\n      return;\n    }\n    this._ensureSource(theme);\n    const layerState = this._state.themes[theme].layers[sourceLayer];\n    for (const spec of buildSourceLayerSpecs(\n      theme,\n      sourceLayer,\n      layerState.opacity,\n      layerState.color,\n      layerState.size,\n    )) {\n      if (!this._map.getLayer(spec.id)) {\n        // Insert at the position that keeps the THEME_IDS draw order\n        // (first theme on top), regardless of the order layers are toggled.\n        this._map.addLayer(spec, this._beforeIdFor(spec.id));\n      }\n    }\n  }\n\n  /**\n   * The canonical back-to-front order of every Overture layer id.\n   *\n   * Themes are drawn back to front in reverse of {@link THEME_IDS}, so the\n   * first panel theme (e.g. addresses) ends up on top of the map.\n   *\n   * @returns Layer ids from bottom-most to top-most\n   */\n  private _orderedLayerIds(): string[] {\n    const ids: string[] = [];\n    for (let i = THEME_IDS.length - 1; i >= 0; i--) {\n      ids.push(...layerIdsForTheme(THEME_IDS[i]));\n    }\n    return ids;\n  }\n\n  /**\n   * Finds the layer a new layer should be inserted before to preserve the\n   * canonical draw order.\n   *\n   * @param layerId - The id of the layer being added\n   * @returns The id of the next existing layer above it, or undefined to\n   *   append on top\n   */\n  private _beforeIdFor(layerId: string): string | undefined {\n    const order = this._orderedLayerIds();\n    const index = order.indexOf(layerId);\n    if (index < 0) {\n      return undefined;\n    }\n    for (let i = index + 1; i < order.length; i++) {\n      if (this._map?.getLayer(order[i])) {\n        return order[i];\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Removes the layers for a single source layer, dropping the theme source\n   * once none of its layers remain on the map.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   */\n  private _removeLayer(theme: OvertureTheme, sourceLayer: string): void {\n    if (!this._map) {\n      return;\n    }\n    for (const layerId of layerIdsForSourceLayer(theme, sourceLayer)) {\n      if (this._map.getLayer(layerId)) {\n        this._map.removeLayer(layerId);\n      }\n    }\n    const sourceId = sourceIdForTheme(theme);\n    const stillUsed = layerIdsForTheme(theme).some((id) =>\n      this._map?.getLayer(id),\n    );\n    if (!stillUsed && this._map.getSource(sourceId)) {\n      this._map.removeSource(sourceId);\n    }\n  }\n\n  /**\n   * Removes the layers and source for a theme from the map.\n   *\n   * @param theme - The theme to remove\n   */\n  private _removeTheme(theme: OvertureTheme): void {\n    if (!this._map) {\n      return;\n    }\n    for (const layerId of layerIdsForTheme(theme)) {\n      if (this._map.getLayer(layerId)) {\n        this._map.removeLayer(layerId);\n      }\n    }\n    const sourceId = sourceIdForTheme(theme);\n    if (this._map.getSource(sourceId)) {\n      this._map.removeSource(sourceId);\n    }\n  }\n\n  /**\n   * Removes all Overture layers and sources from the map.\n   */\n  private _removeAllThemes(): void {\n    for (const theme of THEME_IDS) {\n      this._removeTheme(theme);\n    }\n  }\n\n  /**\n   * Returns the ids of all Overture layers currently on the map.\n   */\n  private _renderedLayerIds(): string[] {\n    if (!this._map) {\n      return [];\n    }\n    const ids: string[] = [];\n    for (const theme of THEME_IDS) {\n      for (const layerId of layerIdsForTheme(theme)) {\n        if (this._map.getLayer(layerId)) {\n          ids.push(layerId);\n        }\n      }\n    }\n    return ids;\n  }\n\n  /**\n   * Wires click and hover handlers for feature inspection.\n   */\n  private _setupInspect(): void {\n    if (!this._map || this._clickHandler) {\n      return;\n    }\n\n    this._clickHandler = (e: MapMouseEvent) => {\n      if (!this._map) return;\n      const layers = this._renderedLayerIds();\n      if (!layers.length) return;\n      const features = this._map.queryRenderedFeatures(e.point, { layers });\n      if (!features.length) return;\n\n      const feature = features[0];\n      this._popup?.remove();\n      this._popup = this._createPopup()\n        .setLngLat(e.lngLat)\n        .setDOMContent(\n          this._buildPopupContent(\n            feature.sourceLayer ?? \"\",\n            feature.properties ?? {},\n          ),\n        )\n        .addTo(this._map);\n    };\n    this._map.on(\"click\", this._clickHandler);\n\n    this._moveHandler = (e: MapMouseEvent) => {\n      if (!this._map) return;\n      const layers = this._renderedLayerIds();\n      if (!layers.length) return;\n      const features = this._map.queryRenderedFeatures(e.point, { layers });\n      this._map.getCanvas().style.cursor = features.length ? \"pointer\" : \"\";\n    };\n    this._map.on(\"mousemove\", this._moveHandler);\n  }\n\n  /**\n   * Builds the inspection popup: the host's `createPopup` factory when one is\n   * configured (a map engine with its own popup class), else MapLibre's.\n   *\n   * @returns An unattached popup\n   */\n  private _createPopup(): OverturePopup {\n    const options = { maxWidth: \"320px\", className: \"overture-popup\" };\n    if (this._options.createPopup) {\n      return this._options.createPopup(options);\n    }\n    return new (getMapLibre().Popup)(options) as unknown as OverturePopup;\n  }\n\n  /**\n   * Removes the feature inspection handlers and any open popup.\n   */\n  private _teardownInspect(): void {\n    if (this._clickHandler && this._map) {\n      this._map.off(\"click\", this._clickHandler);\n    }\n    this._clickHandler = null;\n    if (this._moveHandler && this._map) {\n      this._map.off(\"mousemove\", this._moveHandler);\n    }\n    this._moveHandler = null;\n    this._popup?.remove();\n    this._popup = undefined;\n    if (this._map) {\n      this._map.getCanvas().style.cursor = \"\";\n    }\n  }\n\n  /**\n   * Sanitizes a feature-sourced value for display in the popup.\n   *\n   * Strips control characters and truncates long values so malformed\n   * tile properties cannot break the UI.\n   *\n   * @param value - The raw property key or value\n   * @param maxLength - Maximum displayed length\n   * @returns A safe display string\n   */\n  private _sanitizeDisplayString(value: unknown, maxLength = 200): string {\n    const text =\n      typeof value === \"object\" && value !== null\n        ? JSON.stringify(value)\n        : String(value);\n    // eslint-disable-next-line no-control-regex\n    const cleaned = text.replace(/[\\u0000-\\u001f\\u007f]/g, \"\");\n    return cleaned.length > maxLength\n      ? `${cleaned.slice(0, maxLength)}…`\n      : cleaned;\n  }\n\n  /**\n   * Builds the popup DOM showing a feature's properties.\n   *\n   * @param sourceLayer - The feature's source layer name\n   * @param properties - The feature properties\n   * @returns The popup content element\n   */\n  private _buildPopupContent(\n    sourceLayer: string,\n    properties: Record<string, unknown>,\n  ): HTMLElement {\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = `overture-popup-content${this._schemeClass()}`;\n\n    const heading = document.createElement(\"div\");\n    heading.className = \"overture-popup-heading\";\n    heading.textContent = this._sanitizeDisplayString(\n      sourceLayer || \"feature\",\n      80,\n    );\n    wrapper.appendChild(heading);\n\n    const table = document.createElement(\"table\");\n    table.className = \"overture-popup-table\";\n    const entries = Object.entries(properties);\n    if (!entries.length) {\n      const empty = document.createElement(\"div\");\n      empty.className = \"overture-popup-empty\";\n      empty.textContent = \"No properties\";\n      wrapper.appendChild(empty);\n      return wrapper;\n    }\n    for (const [key, value] of entries) {\n      const row = document.createElement(\"tr\");\n      const keyCell = document.createElement(\"td\");\n      keyCell.className = \"overture-popup-key\";\n      keyCell.textContent = this._sanitizeDisplayString(key, 80);\n      const valueCell = document.createElement(\"td\");\n      valueCell.className = \"overture-popup-value\";\n      valueCell.textContent = this._sanitizeDisplayString(value);\n      row.appendChild(keyCell);\n      row.appendChild(valueCell);\n      table.appendChild(row);\n    }\n    wrapper.appendChild(table);\n    return wrapper;\n  }\n\n  /**\n   * Returns whether the system currently prefers a dark color scheme.\n   */\n  private _prefersDark(): boolean {\n    return (\n      typeof window !== \"undefined\" &&\n      typeof window.matchMedia === \"function\" &&\n      window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n    );\n  }\n\n  /**\n   * Resolves the active color scheme. In `auto` mode this follows the\n   * system `prefers-color-scheme`.\n   *\n   * @returns The resolved scheme\n   */\n  private _resolvedScheme(): \"light\" | \"dark\" {\n    if (this._options.theme === \"light\") return \"light\";\n    if (this._options.theme === \"dark\") return \"dark\";\n    return this._prefersDark() ? \"dark\" : \"light\";\n  }\n\n  /**\n   * Returns the color-scheme class suffix for the resolved scheme.\n   */\n  private _schemeClass(): string {\n    return ` ovt-theme-${this._resolvedScheme()}`;\n  }\n\n  /**\n   * Applies the resolved color-scheme class to the container and panel.\n   * Called on creation and whenever the system theme changes in `auto` mode.\n   */\n  private _applyScheme(): void {\n    const cls = `ovt-theme-${this._resolvedScheme()}`;\n    for (const el of [this._container, this._panel]) {\n      el?.classList.remove(\"ovt-theme-light\", \"ovt-theme-dark\");\n      el?.classList.add(cls);\n    }\n  }\n\n  /**\n   * Subscribes to system color-scheme changes so the control adapts live\n   * when `theme` is `auto`.\n   */\n  private _setupSchemeListener(): void {\n    if (\n      this._options.theme !== \"auto\" ||\n      typeof window === \"undefined\" ||\n      typeof window.matchMedia !== \"function\"\n    ) {\n      return;\n    }\n    this._schemeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    this._schemeListener = () => this._applyScheme();\n    this._schemeMedia.addEventListener(\"change\", this._schemeListener);\n  }\n\n  /**\n   * Creates the main container element for the control.\n   * Contains a toggle button (29x29) matching navigation control size.\n   *\n   * @returns The container element\n   */\n  private _createContainer(): HTMLElement {\n    const container = document.createElement(\"div\");\n    // Both engines' control classes: MapLibre's and mapbox-gl's stylesheets\n    // each only know their own, and a class the loaded stylesheet does not\n    // define is inert.\n    container.className = `maplibregl-ctrl maplibregl-ctrl-group mapboxgl-ctrl mapboxgl-ctrl-group overture-control${this._schemeClass()}${\n      this._options.className ? ` ${this._options.className}` : \"\"\n    }`;\n\n    // Create toggle button (29x29 to match navigation control)\n    const toggleBtn = document.createElement(\"button\");\n    toggleBtn.className = \"overture-control-toggle\";\n    toggleBtn.type = \"button\";\n    toggleBtn.setAttribute(\"aria-label\", this._options.title);\n    toggleBtn.innerHTML = `\n      <span class=\"overture-control-icon\">\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n          <circle cx=\"9\" cy=\"9\" r=\"6\"/>\n          <circle cx=\"15\" cy=\"9\" r=\"6\"/>\n          <circle cx=\"12\" cy=\"15\" r=\"6\"/>\n        </svg>\n      </span>\n    `;\n    toggleBtn.addEventListener(\"click\", () => this.toggle());\n\n    container.appendChild(toggleBtn);\n\n    return container;\n  }\n\n  /**\n   * Creates the panel element with header and content areas.\n   * Panel is positioned as a dropdown below the toggle button.\n   *\n   * @returns The panel element\n   */\n  private _createPanel(): HTMLElement {\n    const panel = document.createElement(\"div\");\n    panel.className = `overture-control-panel${this._schemeClass()}`;\n    panel.style.width = `${this._options.panelWidth}px`;\n\n    // Create header with title and close button\n    const header = document.createElement(\"div\");\n    header.className = \"overture-control-header\";\n\n    const title = document.createElement(\"span\");\n    title.className = \"overture-control-title\";\n    title.textContent = this._options.title;\n\n    const closeBtn = document.createElement(\"button\");\n    closeBtn.className = \"overture-control-close\";\n    closeBtn.type = \"button\";\n    closeBtn.setAttribute(\"aria-label\", \"Close panel\");\n    closeBtn.innerHTML = \"&times;\";\n    closeBtn.addEventListener(\"click\", () => this.collapse());\n\n    header.appendChild(title);\n    header.appendChild(closeBtn);\n\n    // Create content area\n    const content = document.createElement(\"div\");\n    content.className = \"overture-control-content\";\n\n    content.appendChild(this._createReleaseRow());\n    content.appendChild(this._createInspectRow());\n\n    this._errorEl = document.createElement(\"div\");\n    this._errorEl.className = \"overture-control-error\";\n    this._errorEl.style.display = \"none\";\n    content.appendChild(this._errorEl);\n\n    this._noticeEl = document.createElement(\"div\");\n    this._noticeEl.className = \"overture-control-notice\";\n    this._noticeEl.setAttribute(\"role\", \"status\");\n    this._noticeEl.setAttribute(\"aria-live\", \"polite\");\n    this._noticeEl.setAttribute(\"aria-atomic\", \"true\");\n    content.appendChild(this._noticeEl);\n\n    const themeList = document.createElement(\"div\");\n    themeList.className = \"overture-control-themes\";\n    for (const theme of THEME_IDS) {\n      themeList.appendChild(this._createThemeGroup(theme));\n    }\n    content.appendChild(themeList);\n\n    const hint = document.createElement(\"p\");\n    hint.className = \"overture-control-hint\";\n    this._hintEl = hint;\n    this._updateHint();\n    content.appendChild(hint);\n\n    panel.appendChild(header);\n    panel.appendChild(content);\n\n    // Drag handle for resizing the panel width (positioned per corner)\n    panel.appendChild(this._createResizeHandle());\n\n    return panel;\n  }\n\n  /**\n   * The lowest zoom at which both detail themes (addresses and places) render.\n   *\n   * Derived from the theme definitions so the hint stays in sync with the\n   * tileset minzoom rather than hardcoding the value in the message.\n   *\n   * @returns The detail-theme minimum zoom (defaults to 14)\n   */\n  private get _detailMinZoom(): number {\n    return Math.max(\n      THEMES.addresses.minzoom ?? 14,\n      THEMES.places.minzoom ?? 14,\n    );\n  }\n\n  /**\n   * Updates the zoom hint to reflect the live map zoom.\n   *\n   * Below the detail-theme threshold the hint reads as a heads-up that\n   * addresses and places only appear once zoomed in. At or above the threshold\n   * it switches to a positive confirmation (with the `--active` modifier for a\n   * success style) so a satisfied warning does not linger as stale guidance.\n   */\n  private _updateHint(): void {\n    if (!this._hintEl) {\n      return;\n    }\n    const threshold = this._detailMinZoom;\n    const active = this._map ? this._map.getZoom() >= threshold : false;\n    this._hintEl.classList.toggle(\"overture-control-hint--active\", active);\n    this._hintEl.textContent = active\n      ? \"Addresses and places active.\"\n      : `Addresses and places appear at zoom ${threshold}+.`;\n  }\n\n  /**\n   * Creates the feature inspection toggle row.\n   *\n   * @returns The inspect row element\n   */\n  private _createInspectRow(): HTMLElement {\n    const row = document.createElement(\"div\");\n    row.className = \"overture-inspect-row\";\n\n    const label = document.createElement(\"label\");\n    label.className = \"overture-inspect-toggle\";\n\n    this._inspectCheckbox = document.createElement(\"input\");\n    this._inspectCheckbox.type = \"checkbox\";\n    this._inspectCheckbox.className = \"overture-inspect-checkbox\";\n    this._inspectCheckbox.checked = this._state.inspect;\n    this._inspectCheckbox.addEventListener(\"change\", () => {\n      this.setInspect(this._inspectCheckbox!.checked);\n    });\n\n    const text = document.createElement(\"span\");\n    text.textContent = \"Inspect features on click\";\n\n    label.appendChild(this._inspectCheckbox);\n    label.appendChild(text);\n    row.appendChild(label);\n    return row;\n  }\n\n  /**\n   * Creates the panel drag handle used to resize the panel width.\n   *\n   * @returns The resize handle element\n   */\n  private _createResizeHandle(): HTMLElement {\n    const handle = document.createElement(\"div\");\n    handle.className = \"overture-resize-handle\";\n    handle.setAttribute(\"aria-hidden\", \"true\");\n    handle.addEventListener(\"pointerdown\", (e) => this._startResize(e));\n    return handle;\n  }\n\n  /**\n   * Creates the release selector row.\n   *\n   * @returns The release row element\n   */\n  private _createReleaseRow(): HTMLElement {\n    const row = document.createElement(\"div\");\n    row.className = \"overture-release-row\";\n\n    const label = document.createElement(\"label\");\n    label.className = \"overture-control-label\";\n    label.textContent = \"Release\";\n\n    this._releaseSelect = document.createElement(\"select\");\n    this._releaseSelect.className = \"overture-release-select\";\n    this._releaseSelect.setAttribute(\"aria-label\", \"Overture release\");\n    this._releaseSelect.addEventListener(\"change\", () => {\n      if (this._releaseSelect) {\n        this.setRelease(this._releaseSelect.value);\n      }\n    });\n    label.appendChild(this._releaseSelect);\n    row.appendChild(label);\n\n    this._renderReleaseOptions();\n    return row;\n  }\n\n  /**\n   * Re-populates the release selector options from state.\n   */\n  private _renderReleaseOptions(): void {\n    if (!this._releaseSelect) {\n      return;\n    }\n    this._releaseSelect.innerHTML = \"\";\n    for (const release of this._state.releases) {\n      const option = document.createElement(\"option\");\n      option.value = release;\n      option.textContent = release;\n      this._releaseSelect.appendChild(option);\n    }\n    if (this._state.release) {\n      this._releaseSelect.value = this._state.release;\n    }\n    this._releaseSelect.disabled = this._state.releases.length === 0;\n  }\n\n  /**\n   * Creates a collapsible panel group for one theme: a header with a master\n   * checkbox and an expand toggle, plus a row per source layer.\n   *\n   * @param theme - The theme to render\n   * @returns The theme group element\n   */\n  private _createThemeGroup(theme: OvertureTheme): HTMLElement {\n    const def = THEMES[theme];\n    const themeState = this._state.themes[theme];\n\n    const group = document.createElement(\"div\");\n    group.className = \"overture-theme-group\";\n    group.dataset.theme = theme;\n\n    const header = document.createElement(\"div\");\n    header.className = \"overture-theme-header\";\n\n    const caret = document.createElement(\"button\");\n    caret.type = \"button\";\n    caret.className = \"overture-theme-caret\";\n    caret.setAttribute(\"aria-label\", `Toggle ${def.label} layers`);\n    caret.setAttribute(\"aria-expanded\", String(themeState.expanded));\n    caret.innerHTML = \"&rsaquo;\";\n    caret.addEventListener(\"click\", () => {\n      this.setThemeExpanded(theme, !this._state.themes[theme].expanded);\n    });\n\n    const label = document.createElement(\"label\");\n    label.className = \"overture-theme-toggle\";\n\n    const checkbox = document.createElement(\"input\");\n    checkbox.type = \"checkbox\";\n    checkbox.className = \"overture-theme-checkbox\";\n    checkbox.addEventListener(\"change\", () => {\n      this.setThemeVisible(theme, checkbox.checked);\n    });\n\n    const name = document.createElement(\"span\");\n    name.className = \"overture-theme-name\";\n    name.textContent = def.label;\n\n    label.appendChild(checkbox);\n    label.appendChild(name);\n\n    header.appendChild(caret);\n    header.appendChild(label);\n\n    const layers = document.createElement(\"div\");\n    layers.className = \"overture-theme-layers\";\n    for (const layer of def.layers) {\n      layers.appendChild(this._createLayerRow(theme, layer.sourceLayer));\n    }\n\n    group.appendChild(header);\n    group.appendChild(layers);\n\n    this._applyThemeGroupState(group, theme);\n    return group;\n  }\n\n  /**\n   * Creates a panel row for one source layer: a checkbox, color swatch,\n   * label, and a style button that reveals an inline editor for color,\n   * size, and opacity.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @returns The layer row element\n   */\n  private _createLayerRow(\n    theme: OvertureTheme,\n    sourceLayer: string,\n  ): HTMLElement {\n    const layerState = this._state.themes[theme].layers[sourceLayer];\n    const label = this._humanizeLayer(sourceLayer);\n\n    const row = document.createElement(\"div\");\n    row.className = \"overture-layer-row\";\n    row.dataset.layer = sourceLayer;\n\n    const head = document.createElement(\"div\");\n    head.className = \"overture-layer-head\";\n\n    const toggle = document.createElement(\"label\");\n    toggle.className = \"overture-layer-toggle\";\n\n    const checkbox = document.createElement(\"input\");\n    checkbox.type = \"checkbox\";\n    checkbox.className = \"overture-layer-checkbox\";\n    checkbox.checked = layerState.visible;\n    checkbox.addEventListener(\"change\", () => {\n      this.setLayerVisible(theme, sourceLayer, checkbox.checked);\n    });\n\n    const swatch = document.createElement(\"span\");\n    swatch.className = \"overture-layer-swatch\";\n    swatch.style.backgroundColor = layerState.color;\n\n    const name = document.createElement(\"span\");\n    name.className = \"overture-layer-name\";\n    name.textContent = label;\n\n    toggle.appendChild(checkbox);\n    toggle.appendChild(swatch);\n    toggle.appendChild(name);\n\n    const styleBtn = document.createElement(\"button\");\n    styleBtn.type = \"button\";\n    styleBtn.className = \"overture-layer-style-btn\";\n    styleBtn.setAttribute(\"aria-label\", `Edit ${label} style`);\n    styleBtn.setAttribute(\"aria-expanded\", \"false\");\n    styleBtn.innerHTML = `\n      <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <line x1=\"4\" y1=\"8\" x2=\"20\" y2=\"8\"/>\n        <circle cx=\"9\" cy=\"8\" r=\"2\"/>\n        <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\"/>\n        <circle cx=\"15\" cy=\"16\" r=\"2\"/>\n      </svg>\n    `;\n    styleBtn.addEventListener(\"click\", () => {\n      const open = row.classList.toggle(\"editing\");\n      styleBtn.setAttribute(\"aria-expanded\", String(open));\n    });\n\n    const exportBtn = document.createElement(\"button\");\n    exportBtn.type = \"button\";\n    exportBtn.className = \"overture-layer-export-btn\";\n    exportBtn.setAttribute(\"aria-label\", `Export ${label} in view to GeoJSON`);\n    exportBtn.title = \"Export features in view to GeoJSON\";\n    exportBtn.disabled = !layerState.visible;\n    exportBtn.innerHTML = `\n      <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n        <polyline points=\"7 10 12 15 17 10\"/>\n        <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/>\n      </svg>\n    `;\n    exportBtn.addEventListener(\"click\", () => {\n      this.exportLayer(theme, sourceLayer);\n    });\n\n    head.appendChild(toggle);\n    head.appendChild(styleBtn);\n    head.appendChild(exportBtn);\n\n    row.appendChild(head);\n    row.appendChild(this._createLayerEditor(theme, sourceLayer));\n    return row;\n  }\n\n  /**\n   * Creates the inline style editor for a layer (color, size, opacity).\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   * @returns The editor element\n   */\n  private _createLayerEditor(\n    theme: OvertureTheme,\n    sourceLayer: string,\n  ): HTMLElement {\n    const layerState = this._state.themes[theme].layers[sourceLayer];\n    const label = this._humanizeLayer(sourceLayer);\n    const geometry = findLayerDef(theme, sourceLayer)?.geometry ?? \"point\";\n    const isPoint = geometry === \"point\";\n\n    const editor = document.createElement(\"div\");\n    editor.className = \"overture-layer-editor\";\n\n    // Color\n    const colorRow = document.createElement(\"label\");\n    colorRow.className = \"overture-style-field\";\n    const colorName = document.createElement(\"span\");\n    colorName.textContent = \"Color\";\n    const colorInput = document.createElement(\"input\");\n    colorInput.type = \"color\";\n    colorInput.className = \"overture-layer-color\";\n    colorInput.value = layerState.color;\n    colorInput.setAttribute(\"aria-label\", `${label} color`);\n    colorInput.addEventListener(\"input\", () => {\n      this.setLayerColor(theme, sourceLayer, colorInput.value);\n    });\n    colorRow.appendChild(colorName);\n    colorRow.appendChild(colorInput);\n\n    // Size (circle radius for points, line width otherwise)\n    const sizeRow = document.createElement(\"label\");\n    sizeRow.className = \"overture-style-field\";\n    const sizeName = document.createElement(\"span\");\n    sizeName.textContent = isPoint ? \"Radius\" : \"Width\";\n    const sizeInput = document.createElement(\"input\");\n    sizeInput.type = \"range\";\n    sizeInput.className = \"overture-layer-size\";\n    sizeInput.min = isPoint ? \"1\" : \"0.5\";\n    sizeInput.max = isPoint ? \"12\" : \"6\";\n    sizeInput.step = \"0.5\";\n    sizeInput.value = String(layerState.size);\n    sizeInput.disabled = !layerState.visible;\n    sizeInput.setAttribute(\n      \"aria-label\",\n      `${label} ${isPoint ? \"radius\" : \"width\"}`,\n    );\n    sizeInput.addEventListener(\"input\", () => {\n      this.setLayerSize(theme, sourceLayer, Number(sizeInput.value));\n    });\n    sizeRow.appendChild(sizeName);\n    sizeRow.appendChild(sizeInput);\n\n    // Opacity\n    const opacityRow = document.createElement(\"label\");\n    opacityRow.className = \"overture-style-field\";\n    const opacityName = document.createElement(\"span\");\n    opacityName.textContent = \"Opacity\";\n    const opacityInput = document.createElement(\"input\");\n    opacityInput.type = \"range\";\n    opacityInput.className = \"overture-layer-opacity\";\n    opacityInput.min = \"0\";\n    opacityInput.max = \"1\";\n    opacityInput.step = \"0.05\";\n    opacityInput.value = String(layerState.opacity);\n    opacityInput.disabled = !layerState.visible;\n    opacityInput.setAttribute(\"aria-label\", `${label} opacity`);\n    opacityInput.addEventListener(\"input\", () => {\n      this.setLayerOpacity(theme, sourceLayer, Number(opacityInput.value));\n    });\n    opacityRow.appendChild(opacityName);\n    opacityRow.appendChild(opacityInput);\n\n    editor.appendChild(colorRow);\n    editor.appendChild(sizeRow);\n    editor.appendChild(opacityRow);\n    return editor;\n  }\n\n  /**\n   * Turns a source-layer name into a human-readable label.\n   *\n   * @param sourceLayer - The source-layer name (e.g. `land_cover`)\n   * @returns A display label (e.g. `Land cover`)\n   */\n  private _humanizeLayer(sourceLayer: string): string {\n    const spaced = sourceLayer.replace(/_/g, \" \");\n    return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n  }\n\n  /**\n   * Applies expanded state and master-checkbox state to a theme group.\n   *\n   * @param group - The theme group element\n   * @param theme - The theme the group represents\n   */\n  private _applyThemeGroupState(\n    group: HTMLElement,\n    theme: OvertureTheme,\n  ): void {\n    const themeState = this._state.themes[theme];\n    group.classList.toggle(\"expanded\", themeState.expanded);\n\n    const caret = group.querySelector<HTMLElement>(\".overture-theme-caret\");\n    caret?.setAttribute(\"aria-expanded\", String(themeState.expanded));\n\n    const layerStates = Object.values(themeState.layers);\n    const visibleCount = layerStates.filter((l) => l.visible).length;\n    const checkbox = group.querySelector<HTMLInputElement>(\n      \".overture-theme-checkbox\",\n    );\n    if (checkbox) {\n      checkbox.checked = visibleCount === layerStates.length;\n      checkbox.indeterminate =\n        visibleCount > 0 && visibleCount < layerStates.length;\n    }\n  }\n\n  /**\n   * Syncs a theme group's header and every layer row with the current state.\n   *\n   * @param theme - The theme to update\n   */\n  private _syncThemeGroup(theme: OvertureTheme): void {\n    const group = this._panel?.querySelector<HTMLElement>(\n      `.overture-theme-group[data-theme=\"${theme}\"]`,\n    );\n    if (!group) {\n      return;\n    }\n    this._applyThemeGroupState(group, theme);\n    for (const sourceLayer of Object.keys(this._state.themes[theme].layers)) {\n      this._syncLayerRow(theme, sourceLayer);\n    }\n  }\n\n  /**\n   * Syncs a single layer row's inputs with the current state.\n   *\n   * @param theme - The theme the layer belongs to\n   * @param sourceLayer - The source-layer name\n   */\n  private _syncLayerRow(theme: OvertureTheme, sourceLayer: string): void {\n    const row = this._panel?.querySelector<HTMLElement>(\n      `.overture-theme-group[data-theme=\"${theme}\"] .overture-layer-row[data-layer=\"${sourceLayer}\"]`,\n    );\n    if (!row) {\n      return;\n    }\n    const layerState = this._state.themes[theme].layers[sourceLayer];\n    const checkbox = row.querySelector<HTMLInputElement>(\n      \".overture-layer-checkbox\",\n    );\n    const swatch = row.querySelector<HTMLElement>(\".overture-layer-swatch\");\n    const colorInput = row.querySelector<HTMLInputElement>(\n      \".overture-layer-color\",\n    );\n    const sizeInput = row.querySelector<HTMLInputElement>(\n      \".overture-layer-size\",\n    );\n    const opacityInput = row.querySelector<HTMLInputElement>(\n      \".overture-layer-opacity\",\n    );\n    const exportBtn = row.querySelector<HTMLButtonElement>(\n      \".overture-layer-export-btn\",\n    );\n    if (checkbox) {\n      checkbox.checked = layerState.visible;\n    }\n    if (exportBtn) {\n      exportBtn.disabled = !layerState.visible;\n    }\n    if (swatch) {\n      swatch.style.backgroundColor = layerState.color;\n    }\n    if (colorInput) {\n      colorInput.value = layerState.color;\n    }\n    if (sizeInput) {\n      sizeInput.value = String(layerState.size);\n      sizeInput.disabled = !layerState.visible;\n    }\n    if (opacityInput) {\n      opacityInput.value = String(layerState.opacity);\n      opacityInput.disabled = !layerState.visible;\n    }\n  }\n\n  /**\n   * Starts a panel-width drag-resize from the handle.\n   *\n   * @param event - The initiating pointer event\n   */\n  private _startResize(event: PointerEvent): void {\n    if (!this._panel) {\n      return;\n    }\n    event.preventDefault();\n    const startX = event.clientX;\n    const startWidth = this._panel.getBoundingClientRect().width;\n    const position = this._getControlPosition();\n    const anchorLeft = position === \"top-left\" || position === \"bottom-left\";\n    this._panel.classList.add(\"resizing\");\n\n    const maxWidth = Math.min(\n      MAX_PANEL_WIDTH,\n      (this._mapContainer?.clientWidth ?? window.innerWidth) - 20,\n    );\n\n    this._resizePointerMove = (e: PointerEvent) => {\n      if (!this._panel) {\n        return;\n      }\n      const delta = e.clientX - startX;\n      // Left-anchored panels grow rightward; right-anchored grow leftward\n      const raw = anchorLeft ? startWidth + delta : startWidth - delta;\n      const width = Math.min(maxWidth, Math.max(MIN_PANEL_WIDTH, raw));\n      this._panel.style.width = `${width}px`;\n      this._state.panelWidth = Math.round(width);\n      this._updatePanelPosition();\n    };\n\n    this._resizePointerUp = () => {\n      if (this._resizePointerMove) {\n        document.removeEventListener(\"pointermove\", this._resizePointerMove);\n        this._resizePointerMove = null;\n      }\n      if (this._resizePointerUp) {\n        document.removeEventListener(\"pointerup\", this._resizePointerUp);\n        this._resizePointerUp = null;\n      }\n      this._panel?.classList.remove(\"resizing\");\n      this._emit(\"statechange\");\n    };\n\n    document.addEventListener(\"pointermove\", this._resizePointerMove);\n    document.addEventListener(\"pointerup\", this._resizePointerUp);\n  }\n\n  /**\n   * Setup event listeners for panel positioning and click-outside behavior.\n   */\n  private _setupEventListeners(): void {\n    // Click outside to close (check both container and panel since they're now separate)\n    this._clickOutsideHandler = (e: MouseEvent) => {\n      if (this._suppressClickOutside) {\n        return;\n      }\n      const target = e.target as Node;\n      if (\n        this._container &&\n        this._panel &&\n        !this._container.contains(target) &&\n        !this._panel.contains(target)\n      ) {\n        this.collapse();\n      }\n    };\n    document.addEventListener(\"click\", this._clickOutsideHandler);\n\n    // Update panel position on window resize\n    this._resizeHandler = () => {\n      if (!this._state.collapsed) {\n        this._updatePanelPosition();\n      }\n    };\n    window.addEventListener(\"resize\", this._resizeHandler);\n\n    // Update panel position on map resize (e.g., sidebar toggle)\n    this._mapResizeHandler = () => {\n      if (!this._state.collapsed) {\n        this._updatePanelPosition();\n      }\n    };\n    this._map?.on(\"resize\", this._mapResizeHandler);\n  }\n\n  /**\n   * Detect which corner the control is positioned in.\n   *\n   * @returns The position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n   */\n  private _getControlPosition():\n    | \"top-left\"\n    | \"top-right\"\n    | \"bottom-left\"\n    | \"bottom-right\" {\n    const parent = this._container?.parentElement;\n    if (!parent) return \"top-right\"; // Default\n\n    // The corner containers carry engine-specific class names\n    // (`maplibregl-ctrl-top-left` / `mapboxgl-ctrl-top-left`, ...).\n    for (const prefix of [\"maplibregl\", \"mapboxgl\"]) {\n      if (parent.classList.contains(`${prefix}-ctrl-top-left`))\n        return \"top-left\";\n      if (parent.classList.contains(`${prefix}-ctrl-top-right`))\n        return \"top-right\";\n      if (parent.classList.contains(`${prefix}-ctrl-bottom-left`))\n        return \"bottom-left\";\n      if (parent.classList.contains(`${prefix}-ctrl-bottom-right`))\n        return \"bottom-right\";\n    }\n\n    return \"top-right\"; // Default\n  }\n\n  /**\n   * Update the panel position based on button location and control corner.\n   * Positions the panel next to the button, expanding in the appropriate direction.\n   */\n  private _updatePanelPosition(): void {\n    if (!this._container || !this._panel || !this._mapContainer) return;\n\n    // Get the toggle button (first child of container)\n    const button = this._container.querySelector(\".overture-control-toggle\");\n    if (!button) return;\n\n    const buttonRect = button.getBoundingClientRect();\n    const mapRect = this._mapContainer.getBoundingClientRect();\n    const position = this._getControlPosition();\n\n    // Mark the anchored edge so the resize handle sits on the free side\n    const anchorLeft = position === \"top-left\" || position === \"bottom-left\";\n    this._panel.classList.toggle(\"ovt-anchor-left\", anchorLeft);\n    this._panel.classList.toggle(\"ovt-anchor-right\", !anchorLeft);\n\n    // Calculate button position relative to map container\n    const buttonTop = buttonRect.top - mapRect.top;\n    const buttonBottom = mapRect.bottom - buttonRect.bottom;\n    const buttonLeft = buttonRect.left - mapRect.left;\n    const buttonRight = mapRect.right - buttonRect.right;\n\n    const panelGap = 5; // Gap between button and panel\n    const edgeMargin = 10; // Keep the panel off the opposite map edge\n\n    // Reset all positioning\n    this._panel.style.top = \"\";\n    this._panel.style.bottom = \"\";\n    this._panel.style.left = \"\";\n    this._panel.style.right = \"\";\n\n    // Cap the panel height to the space between the button and the\n    // opposite map edge so the content area scrolls instead of the\n    // panel overflowing the viewport (important on small screens).\n    const offset =\n      position === \"top-left\" || position === \"top-right\"\n        ? buttonTop + buttonRect.height + panelGap\n        : buttonBottom + buttonRect.height + panelGap;\n    const available = Math.max(120, mapRect.height - offset - edgeMargin);\n    this._panel.style.maxHeight = `${Math.min(500, available)}px`;\n\n    // Let the panel max-height drive content scrolling\n    const content = this._panel.querySelector<HTMLElement>(\n      \".overture-control-content\",\n    );\n    if (content) {\n      content.style.maxHeight = \"none\";\n    }\n\n    switch (position) {\n      case \"top-left\":\n        // Panel expands down and to the right\n        this._panel.style.top = `${buttonTop + buttonRect.height + panelGap}px`;\n        this._panel.style.left = `${buttonLeft}px`;\n        break;\n\n      case \"top-right\":\n        // Panel expands down and to the left\n        this._panel.style.top = `${buttonTop + buttonRect.height + panelGap}px`;\n        this._panel.style.right = `${buttonRight}px`;\n        break;\n\n      case \"bottom-left\":\n        // Panel expands up and to the right\n        this._panel.style.bottom = `${buttonBottom + buttonRect.height + panelGap}px`;\n        this._panel.style.left = `${buttonLeft}px`;\n        break;\n\n      case \"bottom-right\":\n        // Panel expands up and to the left\n        this._panel.style.bottom = `${buttonBottom + buttonRect.height + panelGap}px`;\n        this._panel.style.right = `${buttonRight}px`;\n        break;\n    }\n  }\n}\n"],"x_google_ignoreList":[3,4],"mappings":"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"}