{"version":3,"sources":["../src/index.js","../../../node_modules/fflate/esm/browser.js","../../../node_modules/pmtiles/src/index.ts","../../../node_modules/pmtiles/src/adapters.ts","../../../node_modules/@mapbox/point-geometry/index.js","../../../node_modules/@mapbox/vector-tile/index.js","../../../node_modules/pbf/index.js","../src/corrections.js","../../layer-configs/src/configs.json","../../layer-configs/src/layerconfig.js","../../layer-configs/src/index.js"],"sourcesContent":["import { CorrectionsSource } from './corrections.js';\nimport { INFINITY } from '@india-boundary-corrector/layer-configs';\n\n/**\n * Error thrown when tile fetch fails.\n * Includes the HTTP status code and response body for proper error handling.\n */\nexport class TileFetchError extends Error {\n  /**\n   * @param {number} status - HTTP status code\n   * @param {string} [url] - The URL that failed\n   * @param {string} [body] - Response body text\n   */\n  constructor(status, url, body) {\n    super(`Tile fetch failed: ${status}`);\n    this.name = 'TileFetchError';\n    this.status = status;\n    this.url = url;\n    this.body = body;\n  }\n\n  /**\n   * Create a TileFetchError from a failed Response.\n   * @param {Response} response - The failed fetch response\n   * @returns {Promise<TileFetchError>}\n   */\n  static async fromResponse(response) {\n    let body;\n    try {\n      body = await response.text();\n    } catch {\n      // Ignore body read errors\n    }\n    return new TileFetchError(response.status, response.url, body);\n  }\n}\n\n/**\n * Default vector tile extent (coordinate space size).\n */\nconst DEFAULT_TILE_EXTENT = 4096;\n\n/**\n * Build fetch options from HTML image element attributes.\n * Maps crossorigin and referrerpolicy attribute values to fetch() options.\n * \n * Note: Unlike native <img> elements which can load cross-origin images without CORS,\n * fetch() requires CORS mode to read cross-origin responses. Therefore, we default\n * to 'cors' mode with 'same-origin' credentials when crossOrigin is not specified.\n * \n * @param {string|boolean|null|undefined} crossOrigin - The crossOrigin attribute value\n * @param {string} [referrerPolicy] - The referrerPolicy attribute value\n * @returns {{mode: RequestMode, credentials: RequestCredentials, referrerPolicy?: ReferrerPolicy}}\n */\nexport function buildFetchOptions(crossOrigin, referrerPolicy) {\n  const options = {};\n  \n  if (crossOrigin === 'use-credentials') {\n    options.mode = 'cors';\n    options.credentials = 'include';\n  } else if (crossOrigin === 'anonymous' || crossOrigin === '' || crossOrigin === true) {\n    options.mode = 'cors';\n    options.credentials = 'omit';\n  } else {\n    // No crossOrigin specified - default to cors mode since fetch() requires it\n    // to read cross-origin responses. Use same-origin credentials for same-origin\n    // requests (browser will automatically omit credentials for cross-origin).\n    options.mode = 'cors';\n    options.credentials = 'same-origin';\n  }\n  \n  if (referrerPolicy) {\n    options.referrerPolicy = referrerPolicy;\n  }\n  \n  return options;\n}\n\n/**\n * Calculate the bounding box of features in pixel coordinates.\n * @param {Array} features - Array of features with geometry\n * @param {number} tileSize - Size of the tile in pixels\n * @param {number} padding - Padding to add around the bounding box\n * @returns {{minX: number, minY: number, maxX: number, maxY: number}}\n */\nfunction getFeaturesBoundingBox(features, tileSize, padding = 0) {\n  let minX = Infinity, minY = Infinity;\n  let maxX = -Infinity, maxY = -Infinity;\n  \n  for (const feature of features) {\n    const scale = tileSize / feature.extent;\n    for (const ring of feature.geometry) {\n      for (const point of ring) {\n        const px = point.x * scale;\n        const py = point.y * scale;\n        if (px < minX) minX = px;\n        if (py < minY) minY = py;\n        if (px > maxX) maxX = px;\n        if (py > maxY) maxY = py;\n      }\n    }\n  }\n  \n  // Apply padding and clamp to tile bounds\n  return {\n    minX: Math.max(0, Math.floor(minX - padding)),\n    minY: Math.max(0, Math.floor(minY - padding)),\n    maxX: Math.min(tileSize, Math.ceil(maxX + padding)),\n    maxY: Math.min(tileSize, Math.ceil(maxY + padding))\n  };\n}\n\n/**\n * Compute median of 8-bit values using histogram bucket sort (O(N) vs O(N log N)).\n * @param {Uint16Array} histogram - Pre-allocated 256-element histogram to reuse\n * @param {number[]} values - Array of 8-bit values (0-255)\n * @returns {number}\n */\nfunction medianFromHistogram(histogram, values) {\n  const count = values.length;\n  if (count === 0) return 0;\n  \n  // Clear and populate histogram\n  histogram.fill(0);\n  for (let i = 0; i < count; i++) {\n    histogram[values[i]]++;\n  }\n  \n  // Find median by walking histogram\n  const medianPos = count >> 1; // Math.floor(count / 2)\n  let cumulative = 0;\n  for (let v = 0; v < 256; v++) {\n    cumulative += histogram[v];\n    if (cumulative > medianPos) {\n      return v;\n    }\n  }\n  return 0;\n}\n\n/**\n * Apply median blur along deletion paths to erase boundary lines.\n * @param {CanvasRenderingContext2D} ctx - Canvas context with the image\n * @param {Array} features - Array of deletion features\n * @param {number} lineWidth - Width of the blur path\n * @param {number} tileSize - Size of the tile in pixels\n * @param {OffscreenCanvas} [maskCanvas] - Optional reusable mask canvas\n */\nfunction applyMedianBlurAlongPath(ctx, features, lineWidth, tileSize, maskCanvas) {\n  if (features.length === 0) return;\n\n  // Get the image data\n  const imageData = ctx.getImageData(0, 0, tileSize, tileSize);\n  const data = imageData.data;\n  const width = tileSize;\n  const height = tileSize;\n\n  // Use provided canvas or create new one\n  if (!maskCanvas || maskCanvas.width !== tileSize || maskCanvas.height !== tileSize) {\n    maskCanvas = new OffscreenCanvas(tileSize, tileSize);\n  }\n  const maskCtx = maskCanvas.getContext('2d', { willReadFrequently: true });\n  maskCtx.fillStyle = 'black';\n  maskCtx.fillRect(0, 0, tileSize, tileSize);\n  \n  // Draw the deletion paths on the mask\n  maskCtx.strokeStyle = 'white';\n  maskCtx.lineWidth = lineWidth;\n  maskCtx.lineCap = 'round';\n  maskCtx.lineJoin = 'round';\n  \n  for (const feature of features) {\n    const scale = tileSize / feature.extent;\n    for (const ring of feature.geometry) {\n      if (ring.length === 0) continue;\n      maskCtx.beginPath();\n      maskCtx.moveTo(ring[0].x * scale, ring[0].y * scale);\n      for (let i = 1; i < ring.length; i++) {\n        maskCtx.lineTo(ring[i].x * scale, ring[i].y * scale);\n      }\n      maskCtx.stroke();\n    }\n  }\n  \n  const maskData = maskCtx.getImageData(0, 0, tileSize, tileSize).data;\n  \n  // Blur radius based on line width\n  const radius = Math.max(2, Math.ceil(lineWidth / 2) + 1);\n  \n  // Create output buffer\n  const output = new Uint8ClampedArray(data);\n  \n  // Calculate bounding box of features to limit iteration\n  const bbox = getFeaturesBoundingBox(features, tileSize, radius);\n  \n  // Pre-allocate reusable arrays for histogram median calculation\n  const histogram = new Uint16Array(256);\n  const rValues = [];\n  const gValues = [];\n  const bValues = [];\n  \n  // Apply median filter to masked pixels within bounding box\n  for (let y = bbox.minY; y < bbox.maxY; y++) {\n    for (let x = bbox.minX; x < bbox.maxX; x++) {\n      const maskIdx = (y * width + x) * 4;\n      \n      // Only process pixels on the deletion path (white in mask)\n      if (maskData[maskIdx] < 128) continue;\n      \n      // Clear arrays for reuse\n      rValues.length = 0;\n      gValues.length = 0;\n      bValues.length = 0;\n      \n      // Collect neighbor pixels (excluding masked pixels)\n      for (let dy = -radius; dy <= radius; dy++) {\n        for (let dx = -radius; dx <= radius; dx++) {\n          const nx = x + dx;\n          const ny = y + dy;\n          \n          if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue;\n          \n          const nMaskIdx = (ny * width + nx) * 4;\n          // Only use pixels that are NOT on the deletion path\n          if (maskData[nMaskIdx] >= 128) continue;\n          \n          const nIdx = nMaskIdx;\n          rValues.push(data[nIdx]);\n          gValues.push(data[nIdx + 1]);\n          bValues.push(data[nIdx + 2]);\n        }\n      }\n      \n      // Apply median if we have enough samples\n      if (rValues.length >= 3) {\n        const idx = maskIdx;\n        output[idx] = medianFromHistogram(histogram, rValues);\n        output[idx + 1] = medianFromHistogram(histogram, gValues);\n        output[idx + 2] = medianFromHistogram(histogram, bValues);\n        // Keep alpha unchanged\n      }\n    }\n  }\n  \n  // Write back the result\n  ctx.putImageData(new ImageData(output, width, height), 0, 0);\n}\n\n/**\n * Check if a point is at the edge of the tile extent (within tolerance).\n * @param {number} coord - Coordinate value in extent units\n * @param {number} extent - Tile extent\n * @param {number} tolerance - Edge tolerance as fraction of extent (default 0.01)\n * @returns {boolean}\n */\nfunction isAtExtentEdge(coord, extent, tolerance = 0.01) {\n  const tol = extent * tolerance;\n  return coord <= tol || coord >= extent - tol;\n}\n\n/**\n * Extend features that end inside the tile (not at edges) by a given length.\n * @param {Array} features - Array of features with geometry\n * @param {number} extensionLength - Extension length in extent units\n * @returns {Array} New array of features with extended geometry\n */\nfunction extendFeaturesEnds(features, extensionLength) {\n  return features.map(feature => {\n    const extent = feature.extent;\n    const newGeometry = feature.geometry.map(ring => {\n      if (ring.length < 2) return ring;\n      \n      const newRing = [...ring];\n      \n      // Check and extend start point\n      const start = ring[0];\n      const second = ring[1];\n      if (!isAtExtentEdge(start.x, extent) && !isAtExtentEdge(start.y, extent)) {\n        const dx = start.x - second.x;\n        const dy = start.y - second.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        if (len > 0) {\n          const ux = dx / len;\n          const uy = dy / len;\n          newRing[0] = {\n            x: start.x + ux * extensionLength,\n            y: start.y + uy * extensionLength,\n          };\n        }\n      }\n      \n      // Check and extend end point\n      const lastIdx = ring.length - 1;\n      const end = ring[lastIdx];\n      const prev = ring[lastIdx - 1];\n      if (!isAtExtentEdge(end.x, extent) && !isAtExtentEdge(end.y, extent)) {\n        const dx = end.x - prev.x;\n        const dy = end.y - prev.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        if (len > 0) {\n          const ux = dx / len;\n          const uy = dy / len;\n          newRing[lastIdx] = {\n            x: end.x + ux * extensionLength,\n            y: end.y + uy * extensionLength,\n          };\n        }\n      }\n      \n      return newRing;\n    });\n    \n    return { ...feature, geometry: newGeometry };\n  });\n}\n\n/**\n * Extend features by a factor of the deletion line width.\n * @param {Array} features - Array of features with geometry\n * @param {number} extensionFactor - Factor to multiply by deletion line width\n * @param {number} delLineWidth - Deletion line width in pixels\n * @param {number} tileSize - Size of the tile in pixels\n * @returns {Array} New array of features with extended geometry, or original if no extension needed\n */\nfunction extendFeaturesByFactor(features, extensionFactor, delLineWidth, tileSize) {\n  if (!features || features.length === 0 || extensionFactor <= 0) {\n    return features;\n  }\n  const extent = features[0]?.extent || DEFAULT_TILE_EXTENT;\n  const extensionLength = (delLineWidth * extensionFactor / tileSize) * extent;\n  return extendFeaturesEnds(features, extensionLength);\n}\n\n/**\n * Draw features on a canvas context.\n * @param {CanvasRenderingContext2D} ctx - Canvas context\n * @param {Array} features - Array of features to draw\n * @param {string} color - Line color\n * @param {number} lineWidth - Line width\n * @param {number} tileSize - Size of the tile in pixels\n * @param {number[]} [dashArray] - Dash array pattern (omit for solid line)\n * @param {number} [alpha] - Opacity/alpha value from 0 to 1\n */\nfunction drawFeatures(ctx, features, color, lineWidth, tileSize, dashArray, alpha) {\n  const prevAlpha = ctx.globalAlpha;\n  if (alpha !== undefined) {\n    ctx.globalAlpha = alpha;\n  }\n  ctx.strokeStyle = color;\n  ctx.lineWidth = lineWidth;\n  ctx.lineJoin = 'round';\n\n  if (dashArray && dashArray.length > 0) {\n    ctx.setLineDash(dashArray);\n    ctx.lineCap = 'butt'; // Use butt cap for dashed lines to show gaps clearly\n  } else {\n    ctx.setLineDash([]);\n    ctx.lineCap = 'round';\n  }\n\n  for (const feature of features) {\n    const scale = tileSize / feature.extent;\n    for (const ring of feature.geometry) {\n      if (ring.length === 0) continue;\n      ctx.beginPath();\n      ctx.moveTo(ring[0].x * scale, ring[0].y * scale);\n      for (let i = 1; i < ring.length; i++) {\n        ctx.lineTo(ring[i].x * scale, ring[i].y * scale);\n      }\n      ctx.stroke();\n    }\n  }\n  if (alpha !== undefined) {\n    ctx.globalAlpha = prevAlpha;\n  }\n}\n\n/**\n * Boundary corrector that applies corrections to raster tiles.\n */\nexport class TileFixer {\n  /** @type {Map<string, TileFixer>} */\n  static _instances = new Map();\n  \n  /** @type {number} */\n  static _defaultCacheMaxFeatures = 25000;\n\n  /**\n   * Set the default maximum features to cache for new TileFixer instances.\n   * @param {number} maxFeatures - Maximum features to cache\n   */\n  static setDefaultCacheMaxFeatures(maxFeatures) {\n    TileFixer._defaultCacheMaxFeatures = maxFeatures;\n  }\n\n  /**\n   * Get or create a TileFixer instance for a given PMTiles URL.\n   * Reuses existing instances for the same URL.\n   * @param {string} pmtilesUrl - URL to the PMTiles file\n   * @returns {TileFixer}\n   */\n  static getOrCreate(pmtilesUrl) {\n    let instance = TileFixer._instances.get(pmtilesUrl);\n    if (!instance) {\n      instance = new TileFixer(pmtilesUrl, {\n        cacheMaxFeatures: TileFixer._defaultCacheMaxFeatures,\n      });\n      TileFixer._instances.set(pmtilesUrl, instance);\n    }\n    return instance;\n  }\n\n  /**\n   * @param {string} pmtilesUrl - URL to the PMTiles file\n   * @param {Object} [options] - Options\n   * @param {number} [options.cacheMaxFeatures] - Maximum number of features to cache\n   * @param {number} [options.maxDataZoom] - Maximum zoom level in PMTiles (auto-detected if not provided)\n   */\n  constructor(pmtilesUrl, options = {}) {\n    this.correctionsSource = new CorrectionsSource(pmtilesUrl, options);\n    /** @type {OffscreenCanvas|null} Reusable scratch canvas for tile operations */\n    this._canvas = null;\n    /** @type {OffscreenCanvas|null} Reusable scratch canvas for mask operations */\n    this._maskCanvas = null;\n  }\n\n  /**\n   * Get the PMTiles source object.\n   * @returns {PMTiles}\n   */\n  getSource() {\n    return this.correctionsSource.getSource();\n  }\n\n  /**\n   * Clear the tile cache.\n   */\n  clearCache() {\n    this.correctionsSource.clearCache();\n  }\n\n  /**\n   * Get corrections for a tile as a dict of layer name to features.\n   * Supports overzoom beyond maxDataZoom by scaling parent tile data.\n   * @param {number} z - Zoom level\n   * @param {number} x - Tile X coordinate\n   * @param {number} y - Tile Y coordinate\n   * @param {AbortSignal} [signal] - Optional abort signal\n   * @returns {Promise<Object<string, Array>>} Map of layer name to array of features\n   */\n  async getCorrections(z, x, y, signal) {\n    return await this.correctionsSource.get(z, x, y, signal);\n  }\n\n  /**\n   * Apply corrections to a raster tile.\n   * @param {Object<string, Array>} corrections - Feature map from getCorrections\n   * @param {ArrayBuffer} rasterTile - The original raster tile as ArrayBuffer\n   * @param {Object} layerConfig - Layer configuration with colors and styles\n   * @param {number} zoom - Current zoom level\n   * @returns {Promise<ArrayBuffer>} The corrected tile as ArrayBuffer (PNG)\n   */\n  async fixTile(corrections, rasterTile, layerConfig, zoom) {\n    // Get line styles active at this zoom level\n    let activeLineStyles;\n    if (layerConfig.getLineStylesForZoom) {\n      activeLineStyles = layerConfig.getLineStylesForZoom(zoom);\n    } else {\n      // Fallback for plain objects: filter by startZoom/endZoom\n      const allStyles = layerConfig.lineStyles || [];\n      activeLineStyles = allStyles.filter(style => {\n        const styleStart = style.startZoom ?? 0;\n        const styleEnd = style.endZoom ?? INFINITY;\n        return zoom >= styleStart && (styleEnd === INFINITY || zoom <= styleEnd);\n      });\n    }\n\n    // No active styles at this zoom - return original tile\n    if (activeLineStyles.length === 0) {\n      return rasterTile;\n    }\n\n    // Get unique layer suffixes from active styles\n    const layerSuffixes = [...new Set(activeLineStyles.map(s => s.layerSuffix))];\n\n    // Decode the raster tile to get dimensions\n    const blob = new Blob([rasterTile]);\n    const imageBitmap = await createImageBitmap(blob);\n    const tileSize = imageBitmap.width;\n\n    // Get or create reusable main canvas\n    if (!this._canvas || this._canvas.width !== tileSize) {\n      this._canvas = new OffscreenCanvas(tileSize, tileSize);\n    }\n    const canvas = this._canvas;\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\n\n    // Draw original raster tile\n    ctx.drawImage(imageBitmap, 0, 0, tileSize, tileSize);\n\n    // Calculate deletion width per layer suffix based on styles using that suffix\n    // For each suffix, use the maximum (baseLineWidth * widthFraction * delWidthFactor) among styles using it\n    const delLineWidthBySuffix = {};\n    for (const suffix of layerSuffixes) {\n      const stylesForSuffix = activeLineStyles.filter(s => s.layerSuffix === suffix);\n      const maxDelWidth = Math.max(...stylesForSuffix.map(s => \n        s.getLineWidth(zoom) * s.widthFraction * s.delWidthFactor\n      ));\n      delLineWidthBySuffix[suffix] = maxDelWidth;\n    }\n\n    // PHASE 1: Apply all deletions first (median blur)\n    for (const suffix of layerSuffixes) {\n      const delLineWidth = delLineWidthBySuffix[suffix];\n      // Skip deletion if width is 0 (all styles have delWidthFactor=0)\n      if (delLineWidth === 0) continue;\n      \n      const delLayerName = `to-del-${suffix}`;\n      const delFeatures = corrections[delLayerName] || [];\n      if (delFeatures.length > 0) {\n        if (!this._maskCanvas || this._maskCanvas.width !== tileSize) {\n          this._maskCanvas = new OffscreenCanvas(tileSize, tileSize);\n        }\n        applyMedianBlurAlongPath(ctx, delFeatures, delLineWidth, tileSize, this._maskCanvas);\n      }\n    }\n\n    // PHASE 2: Draw all additions (in lineStyles array order)\n    for (const style of activeLineStyles) {\n      const { color, widthFraction, dashArray, alpha, lineExtensionFactor, layerSuffix } = style;\n      const addLayerName = `to-add-${layerSuffix}`;\n      let addFeatures = corrections[addLayerName] || [];\n      \n      if (addFeatures.length > 0) {\n        // Extend features if lineExtensionFactor > 0\n        const delLineWidth = delLineWidthBySuffix[layerSuffix];\n        if (lineExtensionFactor > 0) {\n          addFeatures = extendFeaturesByFactor(addFeatures, lineExtensionFactor, delLineWidth, tileSize);\n        }\n        \n        const lineWidth = style.getLineWidth(zoom) * widthFraction;\n        drawFeatures(ctx, addFeatures, color, lineWidth, tileSize, dashArray, alpha);\n      }\n    }\n\n    // Convert canvas to ArrayBuffer (PNG)\n    const outputBlob = await canvas.convertToBlob({ type: 'image/png' });\n    return outputBlob.arrayBuffer();\n  }\n\n  /**\n   * Fetch a tile, apply corrections, and return the result.\n   * @param {string} tileUrl - URL of the raster tile\n   * @param {number} z - Zoom level\n   * @param {number} x - Tile X coordinate\n   * @param {number} y - Tile Y coordinate\n   * @param {Object} layerConfig - Layer configuration with colors and styles\n   * @param {Object} [fetchOptions] - Fetch options passed to fetch()\n   * @param {AbortSignal} [fetchOptions.signal] - Abort signal for fetch\n   * @param {RequestMode} [fetchOptions.mode] - Fetch mode (e.g., 'cors')\n   * @param {RequestCredentials} [fetchOptions.credentials] - Fetch credentials (e.g., 'omit', 'include')\n   * @param {string} [fetchOptions.referrer] - Referrer URL or empty string for none\n   * @param {ReferrerPolicy} [fetchOptions.referrerPolicy] - Referrer policy (e.g., 'no-referrer', 'origin')\n   * @param {boolean} [fallbackOnCorrectionFailure=true] - Return original tile if corrections fail\n   * @returns {Promise<{data: ArrayBuffer, wasFixed: boolean}>}\n   */\n  async fetchAndFixTile(tileUrl, z, x, y, layerConfig, fetchOptions = {}, fallbackOnCorrectionFailure = true) {\n    const { signal } = fetchOptions;\n\n    // No layerConfig means no corrections needed\n    if (!layerConfig) {\n      const response = await fetch(tileUrl, fetchOptions);\n      if (!response.ok) throw await TileFetchError.fromResponse(response);\n      return { data: await response.arrayBuffer(), wasFixed: false };\n    }\n\n    // Fetch tile and corrections in parallel (both support abort signals)\n    const [tileResult, correctionsResult] = await Promise.allSettled([\n      fetch(tileUrl, fetchOptions).then(async r => {\n        if (!r.ok) throw await TileFetchError.fromResponse(r);\n        return r.arrayBuffer();\n      }),\n      this.getCorrections(z, x, y, signal)\n    ]);\n\n    // Check if aborted before proceeding with CPU-intensive work\n    signal?.throwIfAborted();\n\n    // Handle fetch failure\n    if (tileResult.status === 'rejected') {\n      throw tileResult.reason;\n    }\n\n    const tileData = tileResult.value;\n    \n    // Check if corrections fetch failed\n    const correctionsFailed = correctionsResult.status === 'rejected';\n    const correctionsError = correctionsFailed ? correctionsResult.reason : null;\n    \n    // If corrections failed and fallback is disabled, throw the error\n    if (correctionsFailed && !fallbackOnCorrectionFailure) {\n      throw correctionsError;\n    }\n    \n    const corrections = correctionsResult.status === 'fulfilled' ? correctionsResult.value : {};\n\n    // Check if there are any corrections to apply\n    const hasCorrections = Object.values(corrections).some(arr => arr && arr.length > 0);\n\n    if (!hasCorrections) {\n      return { data: tileData, wasFixed: false, correctionsFailed, correctionsError };\n    }\n\n    // Apply corrections (tileSize is derived from the image)\n    const fixedData = await this.fixTile(corrections, tileData, layerConfig, z);\n    return { data: fixedData, wasFixed: true, correctionsFailed: false, correctionsError: null };\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","import { decompressSync } from \"fflate\";\nexport * from \"./adapters\";\n\n/** @hidden */\nexport interface BufferPosition {\n  buf: Uint8Array;\n  pos: number;\n}\n\nfunction toNum(low: number, high: number): number {\n  return (high >>> 0) * 0x100000000 + (low >>> 0);\n}\n\nfunction readVarintRemainder(l: number, p: BufferPosition): number {\n  const buf = p.buf;\n  let b = buf[p.pos++];\n  let h = (b & 0x70) >> 4;\n  if (b < 0x80) return toNum(l, h);\n  b = buf[p.pos++];\n  h |= (b & 0x7f) << 3;\n  if (b < 0x80) return toNum(l, h);\n  b = buf[p.pos++];\n  h |= (b & 0x7f) << 10;\n  if (b < 0x80) return toNum(l, h);\n  b = buf[p.pos++];\n  h |= (b & 0x7f) << 17;\n  if (b < 0x80) return toNum(l, h);\n  b = buf[p.pos++];\n  h |= (b & 0x7f) << 24;\n  if (b < 0x80) return toNum(l, h);\n  b = buf[p.pos++];\n  h |= (b & 0x01) << 31;\n  if (b < 0x80) return toNum(l, h);\n  throw new Error(\"Expected varint not more than 10 bytes\");\n}\n\n/** @hidden */\nexport function readVarint(p: BufferPosition): number {\n  const buf = p.buf;\n  let b = buf[p.pos++];\n  let val = b & 0x7f;\n  if (b < 0x80) return val;\n  b = buf[p.pos++];\n  val |= (b & 0x7f) << 7;\n  if (b < 0x80) return val;\n  b = buf[p.pos++];\n  val |= (b & 0x7f) << 14;\n  if (b < 0x80) return val;\n  b = buf[p.pos++];\n  val |= (b & 0x7f) << 21;\n  if (b < 0x80) return val;\n  b = buf[p.pos];\n  val |= (b & 0x0f) << 28;\n\n  return readVarintRemainder(val, p);\n}\n\nfunction rotate(n: number, xy: number[], rx: number, ry: number): void {\n  if (ry === 0) {\n    if (rx === 1) {\n      xy[0] = n - 1 - xy[0];\n      xy[1] = n - 1 - xy[1];\n    }\n    const t = xy[0];\n    xy[0] = xy[1];\n    xy[1] = t;\n  }\n}\n\nfunction idOnLevel(z: number, pos: number): [number, number, number] {\n  const n = 2 ** z;\n  let rx = pos;\n  let ry = pos;\n  let t = pos;\n  const xy = [0, 0];\n  let s = 1;\n  while (s < n) {\n    rx = 1 & (t / 2);\n    ry = 1 & (t ^ rx);\n    rotate(s, xy, rx, ry);\n    xy[0] += s * rx;\n    xy[1] += s * ry;\n    t = t / 4;\n    s *= 2;\n  }\n  return [z, xy[0], xy[1]];\n}\n\nconst tzValues: number[] = [\n  0, 1, 5, 21, 85, 341, 1365, 5461, 21845, 87381, 349525, 1398101, 5592405,\n  22369621, 89478485, 357913941, 1431655765, 5726623061, 22906492245,\n  91625968981, 366503875925, 1466015503701, 5864062014805, 23456248059221,\n  93824992236885, 375299968947541, 1501199875790165,\n];\n\n/**\n * Convert Z,X,Y to a Hilbert TileID.\n */\nexport function zxyToTileId(z: number, x: number, y: number): number {\n  if (z > 26) {\n    throw new Error(\"Tile zoom level exceeds max safe number limit (26)\");\n  }\n  if (x > 2 ** z - 1 || y > 2 ** z - 1) {\n    throw new Error(\"tile x/y outside zoom level bounds\");\n  }\n\n  const acc = tzValues[z];\n  const n = 2 ** z;\n  let rx = 0;\n  let ry = 0;\n  let d = 0;\n  const xy = [x, y];\n  let s = n / 2;\n  while (s > 0) {\n    rx = (xy[0] & s) > 0 ? 1 : 0;\n    ry = (xy[1] & s) > 0 ? 1 : 0;\n    d += s * s * ((3 * rx) ^ ry);\n    rotate(s, xy, rx, ry);\n    s = s / 2;\n  }\n  return acc + d;\n}\n\n/**\n * Convert a Hilbert TileID to Z,X,Y.\n */\nexport function tileIdToZxy(i: number): [number, number, number] {\n  let acc = 0;\n  const z = 0;\n\n  for (let z = 0; z < 27; z++) {\n    const numTiles = (0x1 << z) * (0x1 << z);\n    if (acc + numTiles > i) {\n      return idOnLevel(z, i - acc);\n    }\n    acc += numTiles;\n  }\n\n  throw new Error(\"Tile zoom level exceeds max safe number limit (26)\");\n}\n\n/**\n * PMTiles v3 directory entry.\n */\nexport interface Entry {\n  tileId: number;\n  offset: number;\n  length: number;\n  runLength: number;\n}\n\ninterface MetadataLike {\n  attribution?: string;\n  name?: string;\n  version?: string;\n  // biome-ignore lint: TileJSON spec\n  vector_layers?: string;\n  description?: string;\n}\n\n/**\n * Enum representing a compression algorithm used.\n * 0 = unknown compression, for if you must use a different or unspecified algorithm.\n * 1 = no compression.\n */\nexport enum Compression {\n  Unknown = 0,\n  None = 1,\n  Gzip = 2,\n  Brotli = 3,\n  Zstd = 4,\n}\n\n/**\n * Provide a decompression implementation that acts on `buf` and returns decompressed data.\n *\n * Should use the native DecompressionStream on browsers, zlib on node.\n * Should throw if the compression algorithm is not supported.\n */\nexport type DecompressFunc = (\n  buf: ArrayBuffer,\n  compression: Compression\n) => Promise<ArrayBuffer>;\n\nasync function defaultDecompress(\n  buf: ArrayBuffer,\n  compression: Compression\n): Promise<ArrayBuffer> {\n  if (compression === Compression.None || compression === Compression.Unknown) {\n    return buf;\n  }\n  if (compression === Compression.Gzip) {\n    // biome-ignore lint: needed to detect DecompressionStream in browser+node+cloudflare workers\n    if (typeof (globalThis as any).DecompressionStream === \"undefined\") {\n      return decompressSync(new Uint8Array(buf));\n    }\n    const stream = new Response(buf).body;\n    if (!stream) {\n      throw new Error(\"Failed to read response stream\");\n    }\n    const result: ReadableStream<Uint8Array> = stream.pipeThrough(\n      // biome-ignore lint: needed to detect DecompressionStream in browser+node+cloudflare workers\n      new (globalThis as any).DecompressionStream(\"gzip\")\n    );\n    return new Response(result).arrayBuffer();\n  }\n  throw new Error(\"Compression method not supported\");\n}\n\n/**\n * Describe the type of tiles stored in the archive.\n * 0 is unknown/other, 1 is \"MVT\" vector tiles.\n */\nexport enum TileType {\n  Unknown = 0,\n  Mvt = 1,\n  Png = 2,\n  Jpeg = 3,\n  Webp = 4,\n  Avif = 5,\n}\n\nexport function tileTypeExt(t: TileType): string {\n  if (t === TileType.Mvt) return \".mvt\";\n  if (t === TileType.Png) return \".png\";\n  if (t === TileType.Jpeg) return \".jpg\";\n  if (t === TileType.Webp) return \".webp\";\n  if (t === TileType.Avif) return \".avif\";\n  return \"\";\n}\n\nconst HEADER_SIZE_BYTES = 127;\n\n/**\n * PMTiles v3 header storing basic archive-level information.\n */\nexport interface Header {\n  specVersion: number;\n  rootDirectoryOffset: number;\n  rootDirectoryLength: number;\n  jsonMetadataOffset: number;\n  jsonMetadataLength: number;\n  leafDirectoryOffset: number;\n  leafDirectoryLength?: number;\n  tileDataOffset: number;\n  tileDataLength?: number;\n  numAddressedTiles: number;\n  numTileEntries: number;\n  numTileContents: number;\n  clustered: boolean;\n  internalCompression: Compression;\n  tileCompression: Compression;\n  tileType: TileType;\n  minZoom: number;\n  maxZoom: number;\n  minLon: number;\n  minLat: number;\n  maxLon: number;\n  maxLat: number;\n  centerZoom: number;\n  centerLon: number;\n  centerLat: number;\n  etag?: string;\n}\n\n/**\n * Low-level function for looking up a TileID or leaf directory inside a directory.\n */\nexport function findTile(entries: Entry[], tileId: number): Entry | null {\n  let m = 0;\n  let n = entries.length - 1;\n  while (m <= n) {\n    const k = (n + m) >> 1;\n    const cmp = tileId - entries[k].tileId;\n    if (cmp > 0) {\n      m = k + 1;\n    } else if (cmp < 0) {\n      n = k - 1;\n    } else {\n      return entries[k];\n    }\n  }\n\n  // at this point, m > n\n  if (n >= 0) {\n    if (entries[n].runLength === 0) {\n      return entries[n];\n    }\n    if (tileId - entries[n].tileId < entries[n].runLength) {\n      return entries[n];\n    }\n  }\n  return null;\n}\n\nexport interface RangeResponse {\n  data: ArrayBuffer;\n  etag?: string;\n  expires?: string;\n  cacheControl?: string;\n}\n\n/**\n * Interface for retrieving an archive from remote or local storage.\n */\nexport interface Source {\n  getBytes: (\n    offset: number,\n    length: number,\n    signal?: AbortSignal,\n    etag?: string\n  ) => Promise<RangeResponse>;\n\n  /**\n   * Return a unique string key for the archive e.g. a URL.\n   */\n  getKey: () => string;\n}\n\n/**\n * Use the Browser's File API, which is different from the NodeJS file API.\n * see https://developer.mozilla.org/en-US/docs/Web/API/File_API\n */\nexport class FileSource implements Source {\n  file: File;\n\n  constructor(file: File) {\n    this.file = file;\n  }\n\n  getKey() {\n    return this.file.name;\n  }\n\n  async getBytes(offset: number, length: number): Promise<RangeResponse> {\n    const blob = this.file.slice(offset, offset + length);\n    const a = await blob.arrayBuffer();\n    return { data: a };\n  }\n}\n\n/**\n * Uses the browser Fetch API to make tile requests via HTTP.\n *\n * This method does not send conditional request headers If-Match because of CORS.\n * Instead, it detects ETag mismatches via the response ETag or the 416 response code.\n *\n * This also works around browser and storage-specific edge cases.\n */\nexport class FetchSource implements Source {\n  url: string;\n\n  /**\n   * A [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) object, specfying custom [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) set for all requests to the remote archive.\n   *\n   * This should be used instead of maplibre's [transformRequest](https://maplibre.org/maplibre-gl-js/docs/API/classes/Map/#example) for PMTiles archives.\n   */\n  customHeaders: Headers;\n  /** @hidden */\n  mustReload: boolean;\n  /** @hidden */\n  chromeWindowsNoCache: boolean;\n\n  constructor(url: string, customHeaders: Headers = new Headers()) {\n    this.url = url;\n    this.customHeaders = customHeaders;\n    this.mustReload = false;\n    let userAgent = \"\";\n    if (\"navigator\" in globalThis) {\n      //biome-ignore lint: cf workers\n      userAgent = (globalThis as any).navigator.userAgent || \"\";\n    }\n    const isWindows = userAgent.indexOf(\"Windows\") > -1;\n    const isChromiumBased = /Chrome|Chromium|Edg|OPR|Brave/.test(userAgent);\n    this.chromeWindowsNoCache = false;\n    if (isWindows && isChromiumBased) {\n      this.chromeWindowsNoCache = true;\n    }\n  }\n\n  getKey() {\n    return this.url;\n  }\n\n  /**\n   * Mutate the custom [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) set for all requests to the remote archive.\n   */\n  setHeaders(customHeaders: Headers) {\n    this.customHeaders = customHeaders;\n  }\n\n  async getBytes(\n    offset: number,\n    length: number,\n    passedSignal?: AbortSignal,\n    etag?: string\n  ): Promise<RangeResponse> {\n    let controller: AbortController | undefined;\n    let signal: AbortSignal | undefined;\n    if (passedSignal) {\n      signal = passedSignal;\n    } else {\n      controller = new AbortController();\n      signal = controller.signal;\n    }\n\n    const requestHeaders = new Headers(this.customHeaders);\n    requestHeaders.set(\"range\", `bytes=${offset}-${offset + length - 1}`);\n\n    // we don't send if match because:\n    // * it disables browser caching completely (Chromium)\n    // * it requires a preflight request for every tile request\n    // * it requires CORS configuration becasue If-Match is not a CORs-safelisted header\n    // CORs configuration should expose ETag.\n    // if any etag mismatch is detected, we need to ignore the browser cache\n    let cache: string | undefined;\n    if (this.mustReload) {\n      cache = \"reload\";\n    } else if (this.chromeWindowsNoCache) {\n      cache = \"no-store\";\n    }\n\n    let resp = await fetch(this.url, {\n      signal: signal,\n      cache: cache,\n      headers: requestHeaders,\n      //biome-ignore lint: \"cache\" is incompatible between cloudflare workers and browser\n    } as any);\n\n    // handle edge case where the archive is < 16384 kb total.\n    if (offset === 0 && resp.status === 416) {\n      const contentRange = resp.headers.get(\"Content-Range\");\n      if (!contentRange || !contentRange.startsWith(\"bytes */\")) {\n        throw new Error(\"Missing content-length on 416 response\");\n      }\n      const actualLength = +contentRange.substr(8);\n      resp = await fetch(this.url, {\n        signal: signal,\n        cache: \"reload\",\n        headers: { range: `bytes=0-${actualLength - 1}` },\n        //biome-ignore lint: \"cache\" is incompatible between cloudflare workers and browser\n      } as any);\n    }\n\n    // if it's a weak etag, it's not useful for us, so ignore it.\n    let newEtag = resp.headers.get(\"Etag\");\n    if (newEtag?.startsWith(\"W/\")) {\n      newEtag = null;\n    }\n\n    // some storage systems are misbehaved (Cloudflare R2)\n    if (resp.status === 416 || (etag && newEtag && newEtag !== etag)) {\n      this.mustReload = true;\n      throw new EtagMismatch(\n        `Server returned non-matching ETag ${etag} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`\n      );\n    }\n\n    if (resp.status >= 300) {\n      throw new Error(`Bad response code: ${resp.status}`);\n    }\n\n    // some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206\n    // but we also need to detect no support for Byte Serving which is returning the whole file\n    const contentLength = resp.headers.get(\"Content-Length\");\n    if (resp.status === 200 && (!contentLength || +contentLength > length)) {\n      if (controller) controller.abort();\n      throw new Error(\n        \"Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving.\"\n      );\n    }\n\n    const a = await resp.arrayBuffer();\n    return {\n      data: a,\n      etag: newEtag || undefined,\n      cacheControl: resp.headers.get(\"Cache-Control\") || undefined,\n      expires: resp.headers.get(\"Expires\") || undefined,\n    };\n  }\n}\n\n/** @hidden */\nexport function getUint64(v: DataView, offset: number): number {\n  const wh = v.getUint32(offset + 4, true);\n  const wl = v.getUint32(offset + 0, true);\n  return wh * 2 ** 32 + wl;\n}\n\n/**\n * Parse raw header bytes into a Header object.\n */\nexport function bytesToHeader(bytes: ArrayBuffer, etag?: string): Header {\n  const v = new DataView(bytes);\n  const specVersion = v.getUint8(7);\n  if (specVersion > 3) {\n    throw new Error(\n      `Archive is spec version ${specVersion} but this library supports up to spec version 3`\n    );\n  }\n\n  return {\n    specVersion: specVersion,\n    rootDirectoryOffset: getUint64(v, 8),\n    rootDirectoryLength: getUint64(v, 16),\n    jsonMetadataOffset: getUint64(v, 24),\n    jsonMetadataLength: getUint64(v, 32),\n    leafDirectoryOffset: getUint64(v, 40),\n    leafDirectoryLength: getUint64(v, 48),\n    tileDataOffset: getUint64(v, 56),\n    tileDataLength: getUint64(v, 64),\n    numAddressedTiles: getUint64(v, 72),\n    numTileEntries: getUint64(v, 80),\n    numTileContents: getUint64(v, 88),\n    clustered: v.getUint8(96) === 1,\n    internalCompression: v.getUint8(97),\n    tileCompression: v.getUint8(98),\n    tileType: v.getUint8(99),\n    minZoom: v.getUint8(100),\n    maxZoom: v.getUint8(101),\n    minLon: v.getInt32(102, true) / 10000000,\n    minLat: v.getInt32(106, true) / 10000000,\n    maxLon: v.getInt32(110, true) / 10000000,\n    maxLat: v.getInt32(114, true) / 10000000,\n    centerZoom: v.getUint8(118),\n    centerLon: v.getInt32(119, true) / 10000000,\n    centerLat: v.getInt32(123, true) / 10000000,\n    etag: etag,\n  };\n}\n\nfunction deserializeIndex(buffer: ArrayBuffer): Entry[] {\n  const p = { buf: new Uint8Array(buffer), pos: 0 };\n  const numEntries = readVarint(p);\n\n  const entries: Entry[] = [];\n\n  let lastId = 0;\n  for (let i = 0; i < numEntries; i++) {\n    const v = readVarint(p);\n    entries.push({ tileId: lastId + v, offset: 0, length: 0, runLength: 1 });\n    lastId += v;\n  }\n\n  for (let i = 0; i < numEntries; i++) {\n    entries[i].runLength = readVarint(p);\n  }\n\n  for (let i = 0; i < numEntries; i++) {\n    entries[i].length = readVarint(p);\n  }\n\n  for (let i = 0; i < numEntries; i++) {\n    const v = readVarint(p);\n    if (v === 0 && i > 0) {\n      entries[i].offset = entries[i - 1].offset + entries[i - 1].length;\n    } else {\n      entries[i].offset = v - 1;\n    }\n  }\n\n  return entries;\n}\n\nfunction detectVersion(a: ArrayBuffer): number {\n  const v = new DataView(a);\n  if (v.getUint16(2, true) === 2) {\n    console.error(\n      \"PMTiles spec version 2 is not supported; please see github.com/protomaps/PMTiles for tools to upgrade\"\n    );\n    return 2;\n  }\n  if (v.getUint16(2, true) === 1) {\n    console.error(\n      \"PMTiles spec version 1 is not supported; please see github.com/protomaps/PMTiles for tools to upgrade\"\n    );\n    return 1;\n  }\n  return 3;\n}\n\n/**\n * Error thrown when a response for PMTiles over HTTP does not match previous, cached parts of the archive.\n * The default PMTiles implementation will catch this error once internally and retry a request.\n */\nexport class EtagMismatch extends Error {}\n\n/**\n * Interface for caches of parts (headers, directories) of a PMTiles archive.\n */\nexport interface Cache {\n  getHeader: (source: Source) => Promise<Header>;\n  getDirectory: (\n    source: Source,\n    offset: number,\n    length: number,\n    header: Header\n  ) => Promise<Entry[]>;\n  invalidate: (source: Source) => Promise<void>;\n}\n\nasync function getHeaderAndRoot(\n  source: Source,\n  decompress: DecompressFunc\n): Promise<[Header, [string, number, Entry[] | ArrayBuffer]?]> {\n  const resp = await source.getBytes(0, 16384);\n\n  const v = new DataView(resp.data);\n  if (v.getUint16(0, true) !== 0x4d50) {\n    throw new Error(\"Wrong magic number for PMTiles archive\");\n  }\n\n  const headerData = resp.data.slice(0, HEADER_SIZE_BYTES);\n\n  const header = bytesToHeader(headerData, resp.etag);\n\n  // optimistically set the root directory\n  // TODO check root bounds\n  const rootDirData = resp.data.slice(\n    header.rootDirectoryOffset,\n    header.rootDirectoryOffset + header.rootDirectoryLength\n  );\n  const dirKey = `${source.getKey()}|${header.etag || \"\"}|${\n    header.rootDirectoryOffset\n  }|${header.rootDirectoryLength}`;\n\n  const rootDir = deserializeIndex(\n    await decompress(rootDirData, header.internalCompression)\n  );\n  return [header, [dirKey, rootDir.length, rootDir]];\n}\n\nasync function getDirectory(\n  source: Source,\n  decompress: DecompressFunc,\n  offset: number,\n  length: number,\n  header: Header\n): Promise<Entry[]> {\n  const resp = await source.getBytes(offset, length, undefined, header.etag);\n  const data = await decompress(resp.data, header.internalCompression);\n  const directory = deserializeIndex(data);\n  if (directory.length === 0) {\n    throw new Error(\"Empty directory is invalid\");\n  }\n\n  return directory;\n}\n\ninterface ResolvedValue {\n  lastUsed: number;\n  data: Header | Entry[] | ArrayBuffer;\n}\n\n/**\n * A cache for parts of a PMTiles archive where promises are never shared between requests.\n *\n * Runtimes such as Cloudflare Workers cannot share promises between different requests.\n *\n * Only caches headers and directories, not individual tile contents.\n */\nexport class ResolvedValueCache {\n  cache: Map<string, ResolvedValue>;\n  maxCacheEntries: number;\n  counter: number;\n  decompress: DecompressFunc;\n\n  constructor(\n    maxCacheEntries = 100,\n    prefetch = true, // deprecated\n    decompress: DecompressFunc = defaultDecompress\n  ) {\n    this.cache = new Map<string, ResolvedValue>();\n    this.maxCacheEntries = maxCacheEntries;\n    this.counter = 1;\n    this.decompress = decompress;\n  }\n\n  async getHeader(source: Source): Promise<Header> {\n    const cacheKey = source.getKey();\n    const cacheValue = this.cache.get(cacheKey);\n    if (cacheValue) {\n      cacheValue.lastUsed = this.counter++;\n      const data = cacheValue.data;\n      return data as Header;\n    }\n\n    const res = await getHeaderAndRoot(source, this.decompress);\n    if (res[1]) {\n      this.cache.set(res[1][0], {\n        lastUsed: this.counter++,\n        data: res[1][2],\n      });\n    }\n\n    this.cache.set(cacheKey, {\n      lastUsed: this.counter++,\n      data: res[0],\n    });\n    this.prune();\n    return res[0];\n  }\n\n  async getDirectory(\n    source: Source,\n    offset: number,\n    length: number,\n    header: Header\n  ): Promise<Entry[]> {\n    const cacheKey = `${source.getKey()}|${\n      header.etag || \"\"\n    }|${offset}|${length}`;\n    const cacheValue = this.cache.get(cacheKey);\n    if (cacheValue) {\n      cacheValue.lastUsed = this.counter++;\n      const data = cacheValue.data;\n      return data as Entry[];\n    }\n\n    const directory = await getDirectory(\n      source,\n      this.decompress,\n      offset,\n      length,\n      header\n    );\n    this.cache.set(cacheKey, {\n      lastUsed: this.counter++,\n      data: directory,\n    });\n    this.prune();\n    return directory;\n  }\n\n  prune() {\n    if (this.cache.size > this.maxCacheEntries) {\n      let minUsed = Infinity;\n      let minKey = undefined;\n      this.cache.forEach((cacheValue: ResolvedValue, key: string) => {\n        if (cacheValue.lastUsed < minUsed) {\n          minUsed = cacheValue.lastUsed;\n          minKey = key;\n        }\n      });\n      if (minKey) {\n        this.cache.delete(minKey);\n      }\n    }\n  }\n\n  async invalidate(source: Source) {\n    this.cache.delete(source.getKey());\n  }\n}\n\ninterface SharedPromiseCacheValue {\n  lastUsed: number;\n  data: Promise<Header | Entry[] | ArrayBuffer>;\n}\n\n/**\n * A cache for parts of a PMTiles archive where promises can be shared between requests.\n *\n * Only caches headers and directories, not individual tile contents.\n */\nexport class SharedPromiseCache {\n  cache: Map<string, SharedPromiseCacheValue>;\n  invalidations: Map<string, Promise<void>>;\n  maxCacheEntries: number;\n  counter: number;\n  decompress: DecompressFunc;\n\n  constructor(\n    maxCacheEntries = 100,\n    prefetch = true, // deprecated\n    decompress: DecompressFunc = defaultDecompress\n  ) {\n    this.cache = new Map<string, SharedPromiseCacheValue>();\n    this.invalidations = new Map<string, Promise<void>>();\n    this.maxCacheEntries = maxCacheEntries;\n    this.counter = 1;\n    this.decompress = decompress;\n  }\n\n  async getHeader(source: Source): Promise<Header> {\n    const cacheKey = source.getKey();\n    const cacheValue = this.cache.get(cacheKey);\n    if (cacheValue) {\n      cacheValue.lastUsed = this.counter++;\n      const data = await cacheValue.data;\n      return data as Header;\n    }\n\n    const p = new Promise<Header>((resolve, reject) => {\n      getHeaderAndRoot(source, this.decompress)\n        .then((res) => {\n          if (res[1]) {\n            this.cache.set(res[1][0], {\n              lastUsed: this.counter++,\n              data: Promise.resolve(res[1][2]),\n            });\n          }\n          resolve(res[0]);\n          this.prune();\n        })\n        .catch((e) => {\n          reject(e);\n        });\n    });\n    this.cache.set(cacheKey, { lastUsed: this.counter++, data: p });\n    return p;\n  }\n\n  async getDirectory(\n    source: Source,\n    offset: number,\n    length: number,\n    header: Header\n  ): Promise<Entry[]> {\n    const cacheKey = `${source.getKey()}|${\n      header.etag || \"\"\n    }|${offset}|${length}`;\n    const cacheValue = this.cache.get(cacheKey);\n    if (cacheValue) {\n      cacheValue.lastUsed = this.counter++;\n      const data = await cacheValue.data;\n      return data as Entry[];\n    }\n\n    const p = new Promise<Entry[]>((resolve, reject) => {\n      getDirectory(source, this.decompress, offset, length, header)\n        .then((directory) => {\n          resolve(directory);\n          this.prune();\n        })\n        .catch((e) => {\n          reject(e);\n        });\n    });\n    this.cache.set(cacheKey, { lastUsed: this.counter++, data: p });\n    return p;\n  }\n\n  prune() {\n    if (this.cache.size >= this.maxCacheEntries) {\n      let minUsed = Infinity;\n      let minKey = undefined;\n      this.cache.forEach((cacheValue: SharedPromiseCacheValue, key: string) => {\n        if (cacheValue.lastUsed < minUsed) {\n          minUsed = cacheValue.lastUsed;\n          minKey = key;\n        }\n      });\n      if (minKey) {\n        this.cache.delete(minKey);\n      }\n    }\n  }\n\n  async invalidate(source: Source) {\n    const key = source.getKey();\n    if (this.invalidations.get(key)) {\n      return await this.invalidations.get(key);\n    }\n    this.cache.delete(source.getKey());\n    const p = new Promise<void>((resolve, reject) => {\n      this.getHeader(source)\n        .then((h) => {\n          resolve();\n          this.invalidations.delete(key);\n        })\n        .catch((e) => {\n          reject(e);\n        });\n    });\n    this.invalidations.set(key, p);\n  }\n}\n\n/**\n * Main class encapsulating PMTiles decoding logic.\n *\n * if `source` is a string, creates a FetchSource using that string as the URL to a remote PMTiles.\n * if no `cache` is passed, use a SharedPromiseCache.\n * if no `decompress` is passed, default to the browser DecompressionStream API with a fallback to `fflate`.\n */\n// biome-ignore lint: that's just how its capitalized\nexport class PMTiles {\n  source: Source;\n  cache: Cache;\n  decompress: DecompressFunc;\n\n  constructor(\n    source: Source | string,\n    cache?: Cache,\n    decompress?: DecompressFunc\n  ) {\n    if (typeof source === \"string\") {\n      this.source = new FetchSource(source);\n    } else {\n      this.source = source;\n    }\n    if (decompress) {\n      this.decompress = decompress;\n    } else {\n      this.decompress = defaultDecompress;\n    }\n    if (cache) {\n      this.cache = cache;\n    } else {\n      this.cache = new SharedPromiseCache();\n    }\n  }\n\n  /**\n   * Return the header of the archive,\n   * including information such as tile type, min/max zoom, bounds, and summary statistics.\n   */\n  async getHeader() {\n    return await this.cache.getHeader(this.source);\n  }\n\n  /** @hidden */\n  async getZxyAttempt(\n    z: number,\n    x: number,\n    y: number,\n    signal?: AbortSignal\n  ): Promise<RangeResponse | undefined> {\n    const tileId = zxyToTileId(z, x, y);\n    const header = await this.cache.getHeader(this.source);\n\n    if (z < header.minZoom || z > header.maxZoom) {\n      return undefined;\n    }\n\n    let dO = header.rootDirectoryOffset;\n    let dL = header.rootDirectoryLength;\n    for (let depth = 0; depth <= 3; depth++) {\n      const directory = await this.cache.getDirectory(\n        this.source,\n        dO,\n        dL,\n        header\n      );\n      const entry = findTile(directory, tileId);\n      if (entry) {\n        if (entry.runLength > 0) {\n          const resp = await this.source.getBytes(\n            header.tileDataOffset + entry.offset,\n            entry.length,\n            signal,\n            header.etag\n          );\n          return {\n            data: await this.decompress(resp.data, header.tileCompression),\n            cacheControl: resp.cacheControl,\n            expires: resp.expires,\n          };\n        }\n        dO = header.leafDirectoryOffset + entry.offset;\n        dL = entry.length;\n      } else {\n        // TODO: We should in fact return a valid RangeResponse\n        // with empty data, but filled in cache control / expires headers\n        return undefined;\n      }\n    }\n    throw new Error(\"Maximum directory depth exceeded\");\n  }\n\n  /**\n   * Primary method to get a single tile's bytes from an archive.\n   *\n   * Returns undefined if the tile does not exist in the archive.\n   */\n  async getZxy(\n    z: number,\n    x: number,\n    y: number,\n    signal?: AbortSignal\n  ): Promise<RangeResponse | undefined> {\n    try {\n      return await this.getZxyAttempt(z, x, y, signal);\n    } catch (e) {\n      if (e instanceof EtagMismatch) {\n        this.cache.invalidate(this.source);\n        return await this.getZxyAttempt(z, x, y, signal);\n      }\n      throw e;\n    }\n  }\n\n  /** @hidden */\n  async getMetadataAttempt(): Promise<unknown> {\n    const header = await this.cache.getHeader(this.source);\n\n    const resp = await this.source.getBytes(\n      header.jsonMetadataOffset,\n      header.jsonMetadataLength,\n      undefined,\n      header.etag\n    );\n    const decompressed = await this.decompress(\n      resp.data,\n      header.internalCompression\n    );\n    const dec = new TextDecoder(\"utf-8\");\n    return JSON.parse(dec.decode(decompressed));\n  }\n\n  /**\n   * Return the arbitrary JSON metadata of the archive.\n   */\n  async getMetadata(): Promise<unknown> {\n    try {\n      return await this.getMetadataAttempt();\n    } catch (e) {\n      if (e instanceof EtagMismatch) {\n        this.cache.invalidate(this.source);\n        return await this.getMetadataAttempt();\n      }\n      throw e;\n    }\n  }\n\n  /**\n   * Construct a [TileJSON](https://github.com/mapbox/tilejson-spec) object.\n   *\n   * baseTilesUrl is the desired tiles URL, excluding the suffix `/{z}/{x}/{y}.{ext}`.\n   * For example, if the desired URL is `http://example.com/tileset/{z}/{x}/{y}.mvt`,\n   * the baseTilesUrl should be `https://example.com/tileset`.\n   */\n  async getTileJson(baseTilesUrl: string): Promise<unknown> {\n    const header = await this.getHeader();\n    const metadata = (await this.getMetadata()) as MetadataLike;\n    const ext = tileTypeExt(header.tileType);\n\n    return {\n      tilejson: \"3.0.0\",\n      scheme: \"xyz\",\n      tiles: [`${baseTilesUrl}/{z}/{x}/{y}${ext}`],\n      // biome-ignore lint: TileJSON spec\n      vector_layers: metadata.vector_layers,\n      attribution: metadata.attribution,\n      description: metadata.description,\n      name: metadata.name,\n      version: metadata.version,\n      bounds: [header.minLon, header.minLat, header.maxLon, header.maxLat],\n      center: [header.centerLon, header.centerLat, header.centerZoom],\n      minzoom: header.minZoom,\n      maxzoom: header.maxZoom,\n    };\n  }\n}\n","// biome-ignore lint: needed for Leaflet + IIFE to work\ndeclare const L: any;\n// biome-ignore lint: needed for window.URL to disambiguate from cloudflare workers\ndeclare const window: any;\ndeclare const document: DocumentLike;\n\nimport type { Coords } from \"leaflet\";\nimport { PMTiles, TileType } from \"./index\";\n\ninterface DocumentLike {\n  // biome-ignore lint: we don't want to bring in the entire document type\n  createElement: (s: string) => any;\n}\n\n// biome-ignore lint: we don't want to bring in the entire document type\ntype DoneCallback = (error?: Error, tile?: any) => void;\n\n/**\n * Add a raster PMTiles as a layer to a Leaflet map.\n *\n * For vector tiles see https://github.com/protomaps/protomaps-leaflet\n */\nexport const leafletRasterLayer = (source: PMTiles, options: unknown) => {\n  let loaded = false;\n  let mimeType = \"\";\n  const cls = L.GridLayer.extend({\n    createTile: (coord: Coords, done: DoneCallback) => {\n      const el = document.createElement(\"img\");\n      const controller = new AbortController();\n      const signal = controller.signal;\n      el.cancel = () => {\n        controller.abort();\n      };\n      if (!loaded) {\n        source.getHeader().then((header) => {\n          if (header.tileType === TileType.Mvt) {\n            console.error(\n              \"Error: archive contains MVT vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details.\"\n            );\n          } else if (header.tileType === 2) {\n            mimeType = \"image/png\";\n          } else if (header.tileType === 3) {\n            mimeType = \"image/jpeg\";\n          } else if (header.tileType === 4) {\n            mimeType = \"image/webp\";\n          } else if (header.tileType === 5) {\n            mimeType = \"image/avif\";\n          }\n        });\n        loaded = true;\n      }\n      source\n        .getZxy(coord.z, coord.x, coord.y, signal)\n        .then((arr) => {\n          if (arr) {\n            const blob = new Blob([arr.data], { type: mimeType });\n            const imageUrl = window.URL.createObjectURL(blob);\n            el.src = imageUrl;\n            el.cancel = undefined;\n            done(undefined, el);\n          }\n        })\n        .catch((e) => {\n          if (e.name !== \"AbortError\") {\n            throw e;\n          }\n        });\n      return el;\n    },\n\n    _removeTile: function (key: string) {\n      const tile = this._tiles[key];\n      if (!tile) {\n        return;\n      }\n\n      if (tile.el.cancel) tile.el.cancel();\n\n      tile.el.width = 0;\n      tile.el.height = 0;\n      tile.el.deleted = true;\n      L.DomUtil.remove(tile.el);\n      delete this._tiles[key];\n      this.fire(\"tileunload\", {\n        tile: tile.el,\n        coords: this._keyToTileCoords(key),\n      });\n    },\n  });\n  return new cls(options);\n};\n\ntype GetResourceResponse<T> = ExpiryData & {\n  data: T;\n};\ntype AddProtocolAction = (\n  requestParameters: RequestParameters,\n  abortController: AbortController\n) => Promise<GetResourceResponse<unknown>>;\n\ntype ExpiryData = {\n  cacheControl?: string | null;\n  expires?: string | null; // MapLibre can be a Date object\n};\n\n// copied from MapLibre /util/ajax.ts\ntype RequestParameters = {\n  url: string;\n  headers?: unknown;\n  method?: \"GET\" | \"POST\" | \"PUT\";\n  body?: string;\n  type?: \"string\" | \"json\" | \"arrayBuffer\" | \"image\";\n  credentials?: \"same-origin\" | \"include\";\n  collectResourceTiming?: boolean;\n};\n\n// for legacy maplibre-3 interop\ntype ResponseCallbackV3 = (\n  error?: Error | undefined,\n  data?: unknown | undefined,\n  cacheControl?: string | undefined,\n  expires?: string | undefined\n) => void;\n\ntype V3OrV4Protocol = <\n  T extends AbortController | ResponseCallbackV3,\n  R = T extends AbortController\n    ? Promise<GetResourceResponse<unknown>>\n    : { cancel: () => void },\n>(\n  requestParameters: RequestParameters,\n  arg2: T\n) => R;\n\nconst v3compat =\n  (v4: AddProtocolAction): V3OrV4Protocol =>\n  (requestParameters, arg2) => {\n    if (arg2 instanceof AbortController) {\n      // biome-ignore lint: overloading return type not handled by compiler\n      return v4(requestParameters, arg2) as any;\n    }\n    const abortController = new AbortController();\n    v4(requestParameters, abortController)\n      .then(\n        (result) => {\n          return arg2(\n            undefined,\n            result.data,\n            result.cacheControl || \"\",\n            result.expires || \"\"\n          );\n        },\n        (err) => {\n          return arg2(err);\n        }\n      )\n      .catch((e) => {\n        return arg2(e);\n      });\n    return { cancel: () => abortController.abort() };\n  };\n\n/**\n * MapLibre GL JS protocol. Must be added once globally.\n */\nexport class Protocol {\n  /** @hidden */\n  tiles: Map<string, PMTiles>;\n  metadata: boolean;\n  errorOnMissingTile: boolean;\n\n  /**\n   * Initialize the MapLibre PMTiles protocol.\n   *\n   * * metadata: also load the metadata section of the PMTiles. required for some \"inspect\" functionality\n   * and to automatically populate the map attribution. Requires an extra HTTP request.\n   * * errorOnMissingTile: When a vector MVT tile is missing from the archive, raise an error instead of\n   * returning the empty array. Not recommended. This is only to reproduce the behavior of ZXY tile APIs\n   * which some applications depend on when overzooming.\n   */\n  constructor(options?: { metadata?: boolean; errorOnMissingTile?: boolean }) {\n    this.tiles = new Map<string, PMTiles>();\n    this.metadata = options?.metadata || false;\n    this.errorOnMissingTile = options?.errorOnMissingTile || false;\n  }\n\n  /**\n   * Add a {@link PMTiles} instance to the global protocol instance.\n   *\n   * For remote fetch sources, references in MapLibre styles like pmtiles://http://...\n   * will resolve to the same instance if the URLs match.\n   */\n  add(p: PMTiles) {\n    this.tiles.set(p.source.getKey(), p);\n  }\n\n  /**\n   * Fetch a {@link PMTiles} instance by URL, for remote PMTiles instances.\n   */\n  get(url: string) {\n    return this.tiles.get(url);\n  }\n\n  /** @hidden */\n  tilev4 = async (\n    params: RequestParameters,\n    abortController: AbortController\n  ) => {\n    if (params.type === \"json\") {\n      const pmtilesUrl = params.url.substr(10);\n      let instance = this.tiles.get(pmtilesUrl);\n      if (!instance) {\n        instance = new PMTiles(pmtilesUrl);\n        this.tiles.set(pmtilesUrl, instance);\n      }\n\n      if (this.metadata) {\n        return {\n          data: await instance.getTileJson(params.url),\n        };\n      }\n\n      const h = await instance.getHeader();\n\n      if (h.minLon >= h.maxLon || h.minLat >= h.maxLat) {\n        console.error(\n          `Bounds of PMTiles archive ${h.minLon},${h.minLat},${h.maxLon},${h.maxLat} are not valid.`\n        );\n      }\n\n      return {\n        data: {\n          tiles: [`${params.url}/{z}/{x}/{y}`],\n          minzoom: h.minZoom,\n          maxzoom: h.maxZoom,\n          bounds: [h.minLon, h.minLat, h.maxLon, h.maxLat],\n        },\n      };\n    }\n    const re = new RegExp(/pmtiles:\\/\\/(.+)\\/(\\d+)\\/(\\d+)\\/(\\d+)/);\n    const result = params.url.match(re);\n    if (!result) {\n      throw new Error(\"Invalid PMTiles protocol URL\");\n    }\n    const pmtilesUrl = result[1];\n\n    let instance = this.tiles.get(pmtilesUrl);\n    if (!instance) {\n      instance = new PMTiles(pmtilesUrl);\n      this.tiles.set(pmtilesUrl, instance);\n    }\n    const z = result[2];\n    const x = result[3];\n    const y = result[4];\n\n    const header = await instance.getHeader();\n    const resp = await instance?.getZxy(+z, +x, +y, abortController.signal);\n    if (resp) {\n      return {\n        data: new Uint8Array(resp.data),\n        cacheControl: resp.cacheControl,\n        expires: resp.expires,\n      };\n    }\n    if (header.tileType === TileType.Mvt) {\n      if (this.errorOnMissingTile) {\n        throw new Error(\"Tile not found.\");\n      }\n      return { data: new Uint8Array() };\n    }\n    return { data: null };\n  };\n\n  tile = v3compat(this.tilev4);\n}\n","/**\n * A standalone point geometry with useful accessor, comparison, and\n * modification methods.\n *\n * @class\n * @param {number} x the x-coordinate. This could be longitude or screen pixels, or any other sort of unit.\n * @param {number} y the y-coordinate. This could be latitude or screen pixels, or any other sort of unit.\n *\n * @example\n * const point = new Point(-77, 38);\n */\nexport default function Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n    /**\n     * Clone this point, returning a new point that can be modified\n     * without affecting the old one.\n     * @return {Point} the clone\n     */\n    clone() { return new Point(this.x, this.y); },\n\n    /**\n     * Add this point's x & y coordinates to another point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    add(p) { return this.clone()._add(p); },\n\n    /**\n     * Subtract this point's x & y coordinates to from point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    sub(p) { return this.clone()._sub(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    multByPoint(p) { return this.clone()._multByPoint(p); },\n\n    /**\n     * Divide this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    divByPoint(p) { return this.clone()._divByPoint(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {number} k factor\n     * @return {Point} output point\n     */\n    mult(k) { return this.clone()._mult(k); },\n\n    /**\n     * Divide this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {number} k factor\n     * @return {Point} output point\n     */\n    div(k) { return this.clone()._div(k); },\n\n    /**\n     * Rotate this point around the 0, 0 origin by an angle a,\n     * given in radians\n     * @param {number} a angle to rotate around, in radians\n     * @return {Point} output point\n     */\n    rotate(a) { return this.clone()._rotate(a); },\n\n    /**\n     * Rotate this point around p point by an angle a,\n     * given in radians\n     * @param {number} a angle to rotate around, in radians\n     * @param {Point} p Point to rotate around\n     * @return {Point} output point\n     */\n    rotateAround(a, p) { return this.clone()._rotateAround(a, p); },\n\n    /**\n     * Multiply this point by a 4x1 transformation matrix\n     * @param {[number, number, number, number]} m transformation matrix\n     * @return {Point} output point\n     */\n    matMult(m) { return this.clone()._matMult(m); },\n\n    /**\n     * Calculate this point but as a unit vector from 0, 0, meaning\n     * that the distance from the resulting point to the 0, 0\n     * coordinate will be equal to 1 and the angle from the resulting\n     * point to the 0, 0 coordinate will be the same as before.\n     * @return {Point} unit vector point\n     */\n    unit() { return this.clone()._unit(); },\n\n    /**\n     * Compute a perpendicular point, where the new y coordinate\n     * is the old x coordinate and the new x coordinate is the old y\n     * coordinate multiplied by -1\n     * @return {Point} perpendicular point\n     */\n    perp() { return this.clone()._perp(); },\n\n    /**\n     * Return a version of this point with the x & y coordinates\n     * rounded to integers.\n     * @return {Point} rounded point\n     */\n    round() { return this.clone()._round(); },\n\n    /**\n     * Return the magnitude of this point: this is the Euclidean\n     * distance from the 0, 0 coordinate to this point's x and y\n     * coordinates.\n     * @return {number} magnitude\n     */\n    mag() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    /**\n     * Judge whether this point is equal to another point, returning\n     * true or false.\n     * @param {Point} other the other point\n     * @return {boolean} whether the points are equal\n     */\n    equals(other) {\n        return this.x === other.x &&\n               this.y === other.y;\n    },\n\n    /**\n     * Calculate the distance from this point to another point\n     * @param {Point} p the other point\n     * @return {number} distance\n     */\n    dist(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    /**\n     * Calculate the distance from this point to another point,\n     * without the square root step. Useful if you're comparing\n     * relative distances.\n     * @param {Point} p the other point\n     * @return {number} distance\n     */\n    distSqr(p) {\n        const dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    /**\n     * Get the angle from the 0, 0 coordinate to this point, in radians\n     * coordinates.\n     * @return {number} angle\n     */\n    angle() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    /**\n     * Get the angle from this point to another point, in radians\n     * @param {Point} b the other point\n     * @return {number} angle\n     */\n    angleTo(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    /**\n     * Get the angle between this point and another point, in radians\n     * @param {Point} b the other point\n     * @return {number} angle\n     */\n    angleWith(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    /**\n     * Find the angle of the two vectors, solving the formula for\n     * the cross product a x b = |a||b|sin(θ) for θ.\n     * @param {number} x the x-coordinate\n     * @param {number} y the y-coordinate\n     * @return {number} the angle in radians\n     */\n    angleWithSep(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    /** @param {[number, number, number, number]} m */\n    _matMult(m) {\n        const x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    /** @param {Point} p */\n    _add(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    /** @param {Point} p */\n    _sub(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    /** @param {number} k */\n    _mult(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    /** @param {number} k */\n    _div(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    /** @param {Point} p */\n    _multByPoint(p) {\n        this.x *= p.x;\n        this.y *= p.y;\n        return this;\n    },\n\n    /** @param {Point} p */\n    _divByPoint(p) {\n        this.x /= p.x;\n        this.y /= p.y;\n        return this;\n    },\n\n    _unit() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp() {\n        const y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    /** @param {number} angle */\n    _rotate(angle) {\n        const cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    /**\n     * @param {number} angle\n     * @param {Point} p\n     */\n    _rotateAround(angle, p) {\n        const cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),\n            y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    },\n\n    constructor: Point\n};\n\n/**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, return it unchanged.\n * @param {Point | [number, number] | {x: number, y: number}} p input value\n * @return {Point} constructed point.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\nPoint.convert = function (p) {\n    if (p instanceof Point) {\n        return /** @type {Point} */ (p);\n    }\n    if (Array.isArray(p)) {\n        return new Point(+p[0], +p[1]);\n    }\n    if (p.x !== undefined && p.y !== undefined) {\n        return new Point(+p.x, +p.y);\n    }\n    throw new Error('Expected [x, y] or {x, y} point format');\n};\n","\nimport Point from '@mapbox/point-geometry';\n\n/** @import Pbf from 'pbf' */\n/** @import {Feature} from 'geojson' */\n\nexport class VectorTileFeature {\n    /**\n     * @param {Pbf} pbf\n     * @param {number} end\n     * @param {number} extent\n     * @param {string[]} keys\n     * @param {(number | string | boolean)[]} values\n     */\n    constructor(pbf, end, extent, keys, values) {\n        // Public\n\n        /** @type {Record<string, number | string | boolean>} */\n        this.properties = {};\n\n        this.extent = extent;\n        /** @type {0 | 1 | 2 | 3} */\n        this.type = 0;\n\n        /** @type {number | undefined} */\n        this.id = undefined;\n\n        /** @private */\n        this._pbf = pbf;\n        /** @private */\n        this._geometry = -1;\n        /** @private */\n        this._keys = keys;\n        /** @private */\n        this._values = values;\n\n        pbf.readFields(readFeature, this, end);\n    }\n\n    loadGeometry() {\n        const pbf = this._pbf;\n        pbf.pos = this._geometry;\n\n        const end = pbf.readVarint() + pbf.pos;\n\n        /** @type Point[][] */\n        const lines = [];\n\n        /** @type Point[] | undefined */\n        let line;\n\n        let cmd = 1;\n        let length = 0;\n        let x = 0;\n        let y = 0;\n\n        while (pbf.pos < end) {\n            if (length <= 0) {\n                const cmdLen = pbf.readVarint();\n                cmd = cmdLen & 0x7;\n                length = cmdLen >> 3;\n            }\n\n            length--;\n\n            if (cmd === 1 || cmd === 2) {\n                x += pbf.readSVarint();\n                y += pbf.readSVarint();\n\n                if (cmd === 1) { // moveTo\n                    if (line) lines.push(line);\n                    line = [];\n                }\n\n                if (line) line.push(new Point(x, y));\n\n            } else if (cmd === 7) {\n\n                // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n                if (line) {\n                    line.push(line[0].clone()); // closePolygon\n                }\n\n            } else {\n                throw new Error(`unknown command ${cmd}`);\n            }\n        }\n\n        if (line) lines.push(line);\n\n        return lines;\n    }\n\n    bbox() {\n        const pbf = this._pbf;\n        pbf.pos = this._geometry;\n\n        const end = pbf.readVarint() + pbf.pos;\n        let cmd = 1,\n            length = 0,\n            x = 0,\n            y = 0,\n            x1 = Infinity,\n            x2 = -Infinity,\n            y1 = Infinity,\n            y2 = -Infinity;\n\n        while (pbf.pos < end) {\n            if (length <= 0) {\n                const cmdLen = pbf.readVarint();\n                cmd = cmdLen & 0x7;\n                length = cmdLen >> 3;\n            }\n\n            length--;\n\n            if (cmd === 1 || cmd === 2) {\n                x += pbf.readSVarint();\n                y += pbf.readSVarint();\n                if (x < x1) x1 = x;\n                if (x > x2) x2 = x;\n                if (y < y1) y1 = y;\n                if (y > y2) y2 = y;\n\n            } else if (cmd !== 7) {\n                throw new Error(`unknown command ${cmd}`);\n            }\n        }\n\n        return [x1, y1, x2, y2];\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @param {number} z\n     * @return {Feature}\n     */\n    toGeoJSON(x, y, z) {\n        const size = this.extent * Math.pow(2, z),\n            x0 = this.extent * x,\n            y0 = this.extent * y,\n            vtCoords = this.loadGeometry();\n\n        /** @param {Point} p */\n        function projectPoint(p) {\n            return [\n                (p.x + x0) * 360 / size - 180,\n                360 / Math.PI * Math.atan(Math.exp((1 - (p.y + y0) * 2 / size) * Math.PI)) - 90\n            ];\n        }\n\n        /** @param {Point[]} line */\n        function projectLine(line) {\n            return line.map(projectPoint);\n        }\n\n        /** @type {Feature[\"geometry\"]} */\n        let geometry;\n\n        if (this.type === 1) {\n            const points = [];\n            for (const line of vtCoords) {\n                points.push(line[0]);\n            }\n            const coordinates = projectLine(points);\n            geometry = points.length === 1 ?\n                {type: 'Point', coordinates: coordinates[0]} :\n                {type: 'MultiPoint', coordinates};\n\n        } else if (this.type === 2) {\n\n            const coordinates = vtCoords.map(projectLine);\n            geometry = coordinates.length === 1 ?\n                {type: 'LineString', coordinates: coordinates[0]} :\n                {type: 'MultiLineString', coordinates};\n\n        } else if (this.type === 3) {\n            const polygons = classifyRings(vtCoords);\n            const coordinates = [];\n            for (const polygon of polygons) {\n                coordinates.push(polygon.map(projectLine));\n            }\n            geometry = coordinates.length === 1 ?\n                {type: 'Polygon', coordinates: coordinates[0]} :\n                {type: 'MultiPolygon', coordinates};\n        } else {\n\n            throw new Error('unknown feature type');\n        }\n\n        /** @type {Feature} */\n        const result = {\n            type: 'Feature',\n            geometry,\n            properties: this.properties\n        };\n\n        if (this.id != null) {\n            result.id = this.id;\n        }\n\n        return result;\n    }\n}\n\n/** @type {['Unknown', 'Point', 'LineString', 'Polygon']} */\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\n/**\n * @param {number} tag\n * @param {VectorTileFeature} feature\n * @param {Pbf} pbf\n */\nfunction readFeature(tag, feature, pbf) {\n    if (tag === 1) feature.id = pbf.readVarint();\n    else if (tag === 2) readTag(pbf, feature);\n    else if (tag === 3) feature.type = /** @type {0 | 1 | 2 | 3} */ (pbf.readVarint());\n    // @ts-expect-error TS2341 deliberately accessing a private property\n    else if (tag === 4) feature._geometry = pbf.pos;\n}\n\n/**\n * @param {Pbf} pbf\n * @param {VectorTileFeature} feature\n */\nfunction readTag(pbf, feature) {\n    const end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        // @ts-expect-error TS2341 deliberately accessing a private property\n        const key = feature._keys[pbf.readVarint()];\n        // @ts-expect-error TS2341 deliberately accessing a private property\n        const value = feature._values[pbf.readVarint()];\n        feature.properties[key] = value;\n    }\n}\n\n/** classifies an array of rings into polygons with outer rings and holes\n * @param {Point[][]} rings\n */\nexport function classifyRings(rings) {\n    const len = rings.length;\n\n    if (len <= 1) return [rings];\n\n    const polygons = [];\n    let polygon, ccw;\n\n    for (let i = 0; i < len; i++) {\n        const area = signedArea(rings[i]);\n        if (area === 0) continue;\n\n        if (ccw === undefined) ccw = area < 0;\n\n        if (ccw === area < 0) {\n            if (polygon) polygons.push(polygon);\n            polygon = [rings[i]];\n\n        } else if (polygon) {\n            polygon.push(rings[i]);\n        }\n    }\n    if (polygon) polygons.push(polygon);\n\n    return polygons;\n}\n\n/** @param {Point[]} ring */\nfunction signedArea(ring) {\n    let sum = 0;\n    for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n        p1 = ring[i];\n        p2 = ring[j];\n        sum += (p2.x - p1.x) * (p1.y + p2.y);\n    }\n    return sum;\n}\n\nexport class VectorTileLayer {\n    /**\n     * @param {Pbf} pbf\n     * @param {number} [end]\n     */\n    constructor(pbf, end) {\n        // Public\n        this.version = 1;\n        this.name = '';\n        this.extent = 4096;\n        this.length = 0;\n\n        /** @private */\n        this._pbf = pbf;\n\n        /** @private\n         * @type {string[]} */\n        this._keys = [];\n\n        /** @private\n         * @type {(number | string | boolean)[]} */\n        this._values = [];\n\n        /** @private\n         * @type {number[]} */\n        this._features = [];\n\n        pbf.readFields(readLayer, this, end);\n\n        this.length = this._features.length;\n    }\n\n    /** return feature `i` from this layer as a `VectorTileFeature`\n     * @param {number} i\n     */\n    feature(i) {\n        if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n        this._pbf.pos = this._features[i];\n\n        const end = this._pbf.readVarint() + this._pbf.pos;\n        return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n    }\n}\n\n/**\n * @param {number} tag\n * @param {VectorTileLayer} layer\n * @param {Pbf} pbf\n */\nfunction readLayer(tag, layer, pbf) {\n    if (tag === 15) layer.version = pbf.readVarint();\n    else if (tag === 1) layer.name = pbf.readString();\n    else if (tag === 5) layer.extent = pbf.readVarint();\n    // @ts-expect-error TS2341 deliberately accessing a private property\n    else if (tag === 2) layer._features.push(pbf.pos);\n    // @ts-expect-error TS2341 deliberately accessing a private property\n    else if (tag === 3) layer._keys.push(pbf.readString());\n    // @ts-expect-error TS2341 deliberately accessing a private property\n    else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\n/**\n * @param {Pbf} pbf\n */\nfunction readValueMessage(pbf) {\n    let value = null;\n    const end = pbf.readVarint() + pbf.pos;\n\n    while (pbf.pos < end) {\n        const tag = pbf.readVarint() >> 3;\n\n        value = tag === 1 ? pbf.readString() :\n            tag === 2 ? pbf.readFloat() :\n            tag === 3 ? pbf.readDouble() :\n            tag === 4 ? pbf.readVarint64() :\n            tag === 5 ? pbf.readVarint() :\n            tag === 6 ? pbf.readSVarint() :\n            tag === 7 ? pbf.readBoolean() : null;\n    }\n    if (value == null) {\n        throw new Error('unknown feature value');\n    }\n\n    return value;\n}\n\nexport class VectorTile {\n    /**\n     * @param {Pbf} pbf\n     * @param {number} [end]\n     */\n    constructor(pbf, end) {\n        /** @type {Record<string, VectorTileLayer>} */\n        this.layers = pbf.readFields(readTile, {}, end);\n    }\n}\n\n/**\n * @param {number} tag\n * @param {Record<string, VectorTileLayer>} layers\n * @param {Pbf} pbf\n */\nfunction readTile(tag, layers, pbf) {\n    if (tag === 3) {\n        const layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n        if (layer.length) layers[layer.name] = layer;\n    }\n}\n","\nconst SHIFT_LEFT_32 = (1 << 16) * (1 << 16);\nconst SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;\n\n// Threshold chosen based on both benchmarking and knowledge about browser string\n// data structures (which currently switch structure types at 12 bytes or more)\nconst TEXT_DECODER_MIN_LENGTH = 12;\nconst utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8');\n\nconst PBF_VARINT  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nconst PBF_FIXED64 = 1; // 64-bit: double, fixed64, sfixed64\nconst PBF_BYTES   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nconst PBF_FIXED32 = 5; // 32-bit: float, fixed32, sfixed32\n\nexport default class Pbf {\n    /**\n     * @param {Uint8Array | ArrayBuffer} [buf]\n     */\n    constructor(buf = new Uint8Array(16)) {\n        this.buf = ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf);\n        this.dataView = new DataView(this.buf.buffer);\n        this.pos = 0;\n        this.type = 0;\n        this.length = this.buf.length;\n    }\n\n    // === READING =================================================================\n\n    /**\n     * @template T\n     * @param {(tag: number, result: T, pbf: Pbf) => void} readField\n     * @param {T} result\n     * @param {number} [end]\n     */\n    readFields(readField, result, end = this.length) {\n        while (this.pos < end) {\n            const val = this.readVarint(),\n                tag = val >> 3,\n                startPos = this.pos;\n\n            this.type = val & 0x7;\n            readField(tag, result, this);\n\n            if (this.pos === startPos) this.skip(val);\n        }\n        return result;\n    }\n\n    /**\n     * @template T\n     * @param {(tag: number, result: T, pbf: Pbf) => void} readField\n     * @param {T} result\n     */\n    readMessage(readField, result) {\n        return this.readFields(readField, result, this.readVarint() + this.pos);\n    }\n\n    readFixed32() {\n        const val = this.dataView.getUint32(this.pos, true);\n        this.pos += 4;\n        return val;\n    }\n\n    readSFixed32() {\n        const val = this.dataView.getInt32(this.pos, true);\n        this.pos += 4;\n        return val;\n    }\n\n    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n    readFixed64() {\n        const val = this.dataView.getUint32(this.pos, true) + this.dataView.getUint32(this.pos + 4, true) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    }\n\n    readSFixed64() {\n        const val = this.dataView.getUint32(this.pos, true) + this.dataView.getInt32(this.pos + 4, true) * SHIFT_LEFT_32;\n        this.pos += 8;\n        return val;\n    }\n\n    readFloat() {\n        const val = this.dataView.getFloat32(this.pos, true);\n        this.pos += 4;\n        return val;\n    }\n\n    readDouble() {\n        const val = this.dataView.getFloat64(this.pos, true);\n        this.pos += 8;\n        return val;\n    }\n\n    /**\n     * @param {boolean} [isSigned]\n     */\n    readVarint(isSigned) {\n        const buf = this.buf;\n        let val, b;\n\n        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;\n        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;\n        b = buf[this.pos];   val |= (b & 0x0f) << 28;\n\n        return readVarintRemainder(val, isSigned, this);\n    }\n\n    readVarint64() { // for compatibility with v2.0.1\n        return this.readVarint(true);\n    }\n\n    readSVarint() {\n        const num = this.readVarint();\n        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n    }\n\n    readBoolean() {\n        return Boolean(this.readVarint());\n    }\n\n    readString() {\n        const end = this.readVarint() + this.pos;\n        const pos = this.pos;\n        this.pos = end;\n\n        if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) {\n            // longer strings are fast with the built-in browser TextDecoder API\n            return utf8TextDecoder.decode(this.buf.subarray(pos, end));\n        }\n        // short strings are fast with our custom implementation\n        return readUtf8(this.buf, pos, end);\n    }\n\n    readBytes() {\n        const end = this.readVarint() + this.pos,\n            buffer = this.buf.subarray(this.pos, end);\n        this.pos = end;\n        return buffer;\n    }\n\n    // verbose for performance reasons; doesn't affect gzipped size\n\n    /**\n     * @param {number[]} [arr]\n     * @param {boolean} [isSigned]\n     */\n    readPackedVarint(arr = [], isSigned) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readVarint(isSigned));\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedSVarint(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readSVarint());\n        return arr;\n    }\n    /** @param {boolean[]} [arr] */\n    readPackedBoolean(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readBoolean());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedFloat(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readFloat());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedDouble(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readDouble());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedFixed32(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readFixed32());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedSFixed32(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readSFixed32());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedFixed64(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readFixed64());\n        return arr;\n    }\n    /** @param {number[]} [arr] */\n    readPackedSFixed64(arr = []) {\n        const end = this.readPackedEnd();\n        while (this.pos < end) arr.push(this.readSFixed64());\n        return arr;\n    }\n    readPackedEnd() {\n        return this.type === PBF_BYTES ? this.readVarint() + this.pos : this.pos + 1;\n    }\n\n    /** @param {number} val */\n    skip(val) {\n        const type = val & 0x7;\n        if (type === PBF_VARINT) while (this.buf[this.pos++] > 0x7f) {}\n        else if (type === PBF_BYTES) this.pos = this.readVarint() + this.pos;\n        else if (type === PBF_FIXED32) this.pos += 4;\n        else if (type === PBF_FIXED64) this.pos += 8;\n        else throw new Error(`Unimplemented type: ${type}`);\n    }\n\n    // === WRITING =================================================================\n\n    /**\n     * @param {number} tag\n     * @param {number} type\n     */\n    writeTag(tag, type) {\n        this.writeVarint((tag << 3) | type);\n    }\n\n    /** @param {number} min */\n    realloc(min) {\n        let length = this.length || 16;\n\n        while (length < this.pos + min) length *= 2;\n\n        if (length !== this.length) {\n            const buf = new Uint8Array(length);\n            buf.set(this.buf);\n            this.buf = buf;\n            this.dataView = new DataView(buf.buffer);\n            this.length = length;\n        }\n    }\n\n    finish() {\n        this.length = this.pos;\n        this.pos = 0;\n        return this.buf.subarray(0, this.length);\n    }\n\n    /** @param {number} val */\n    writeFixed32(val) {\n        this.realloc(4);\n        this.dataView.setInt32(this.pos, val, true);\n        this.pos += 4;\n    }\n\n    /** @param {number} val */\n    writeSFixed32(val) {\n        this.realloc(4);\n        this.dataView.setInt32(this.pos, val, true);\n        this.pos += 4;\n    }\n\n    /** @param {number} val */\n    writeFixed64(val) {\n        this.realloc(8);\n        this.dataView.setInt32(this.pos, val & -1, true);\n        this.dataView.setInt32(this.pos + 4, Math.floor(val * SHIFT_RIGHT_32), true);\n        this.pos += 8;\n    }\n\n    /** @param {number} val */\n    writeSFixed64(val) {\n        this.realloc(8);\n        this.dataView.setInt32(this.pos, val & -1, true);\n        this.dataView.setInt32(this.pos + 4, Math.floor(val * SHIFT_RIGHT_32), true);\n        this.pos += 8;\n    }\n\n    /** @param {number} val */\n    writeVarint(val) {\n        val = +val || 0;\n\n        if (val > 0xfffffff || val < 0) {\n            writeBigVarint(val, this);\n            return;\n        }\n\n        this.realloc(4);\n\n        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n        this.buf[this.pos++] =   (val >>> 7) & 0x7f;\n    }\n\n    /** @param {number} val */\n    writeSVarint(val) {\n        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n    }\n\n    /** @param {boolean} val */\n    writeBoolean(val) {\n        this.writeVarint(+val);\n    }\n\n    /** @param {string} str */\n    writeString(str) {\n        str = String(str);\n        this.realloc(str.length * 4);\n\n        this.pos++; // reserve 1 byte for short string length\n\n        const startPos = this.pos;\n        // write the string directly to the buffer and see how much was written\n        this.pos = writeUtf8(this.buf, str, this.pos);\n        const len = this.pos - startPos;\n\n        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    }\n\n    /** @param {number} val */\n    writeFloat(val) {\n        this.realloc(4);\n        this.dataView.setFloat32(this.pos, val, true);\n        this.pos += 4;\n    }\n\n    /** @param {number} val */\n    writeDouble(val) {\n        this.realloc(8);\n        this.dataView.setFloat64(this.pos, val, true);\n        this.pos += 8;\n    }\n\n    /** @param {Uint8Array} buffer */\n    writeBytes(buffer) {\n        const len = buffer.length;\n        this.writeVarint(len);\n        this.realloc(len);\n        for (let i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n    }\n\n    /**\n     * @template T\n     * @param {(obj: T, pbf: Pbf) => void} fn\n     * @param {T} obj\n     */\n    writeRawMessage(fn, obj) {\n        this.pos++; // reserve 1 byte for short message length\n\n        // write the message directly to the buffer and see how much was written\n        const startPos = this.pos;\n        fn(obj, this);\n        const len = this.pos - startPos;\n\n        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);\n\n        // finally, write the message length in the reserved place and restore the position\n        this.pos = startPos - 1;\n        this.writeVarint(len);\n        this.pos += len;\n    }\n\n    /**\n     * @template T\n     * @param {number} tag\n     * @param {(obj: T, pbf: Pbf) => void} fn\n     * @param {T} obj\n     */\n    writeMessage(tag, fn, obj) {\n        this.writeTag(tag, PBF_BYTES);\n        this.writeRawMessage(fn, obj);\n    }\n\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedVarint(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedVarint, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedSVarint(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {boolean[]} arr\n     */\n    writePackedBoolean(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedFloat(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedFloat, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedDouble(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedDouble, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedFixed32(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedSFixed32(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedFixed64(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);\n    }\n    /**\n     * @param {number} tag\n     * @param {number[]} arr\n     */\n    writePackedSFixed64(tag, arr) {\n        if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr);\n    }\n\n    /**\n     * @param {number} tag\n     * @param {Uint8Array} buffer\n     */\n    writeBytesField(tag, buffer) {\n        this.writeTag(tag, PBF_BYTES);\n        this.writeBytes(buffer);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeFixed32Field(tag, val) {\n        this.writeTag(tag, PBF_FIXED32);\n        this.writeFixed32(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeSFixed32Field(tag, val) {\n        this.writeTag(tag, PBF_FIXED32);\n        this.writeSFixed32(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeFixed64Field(tag, val) {\n        this.writeTag(tag, PBF_FIXED64);\n        this.writeFixed64(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeSFixed64Field(tag, val) {\n        this.writeTag(tag, PBF_FIXED64);\n        this.writeSFixed64(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeVarintField(tag, val) {\n        this.writeTag(tag, PBF_VARINT);\n        this.writeVarint(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeSVarintField(tag, val) {\n        this.writeTag(tag, PBF_VARINT);\n        this.writeSVarint(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {string} str\n     */\n    writeStringField(tag, str) {\n        this.writeTag(tag, PBF_BYTES);\n        this.writeString(str);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeFloatField(tag, val) {\n        this.writeTag(tag, PBF_FIXED32);\n        this.writeFloat(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {number} val\n     */\n    writeDoubleField(tag, val) {\n        this.writeTag(tag, PBF_FIXED64);\n        this.writeDouble(val);\n    }\n    /**\n     * @param {number} tag\n     * @param {boolean} val\n     */\n    writeBooleanField(tag, val) {\n        this.writeVarintField(tag, +val);\n    }\n};\n\n/**\n * @param {number} l\n * @param {boolean | undefined} s\n * @param {Pbf} p\n */\nfunction readVarintRemainder(l, s, p) {\n    const buf = p.buf;\n    let h, b;\n\n    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);\n    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);\n\n    throw new Error('Expected varint not more than 10 bytes');\n}\n\n/**\n * @param {number} low\n * @param {number} high\n * @param {boolean} [isSigned]\n */\nfunction toNum(low, high, isSigned) {\n    return isSigned ? high * 0x100000000 + (low >>> 0) : ((high >>> 0) * 0x100000000) + (low >>> 0);\n}\n\n/**\n * @param {number} val\n * @param {Pbf} pbf\n */\nfunction writeBigVarint(val, pbf) {\n    let low, high;\n\n    if (val >= 0) {\n        low  = (val % 0x100000000) | 0;\n        high = (val / 0x100000000) | 0;\n    } else {\n        low  = ~(-val % 0x100000000);\n        high = ~(-val / 0x100000000);\n\n        if (low ^ 0xffffffff) {\n            low = (low + 1) | 0;\n        } else {\n            low = 0;\n            high = (high + 1) | 0;\n        }\n    }\n\n    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {\n        throw new Error('Given varint doesn\\'t fit into 10 bytes');\n    }\n\n    pbf.realloc(10);\n\n    writeBigVarintLow(low, high, pbf);\n    writeBigVarintHigh(high, pbf);\n}\n\n/**\n * @param {number} high\n * @param {number} low\n * @param {Pbf} pbf\n */\nfunction writeBigVarintLow(low, high, pbf) {\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;\n    pbf.buf[pbf.pos]   = low & 0x7f;\n}\n\n/**\n * @param {number} high\n * @param {Pbf} pbf\n */\nfunction writeBigVarintHigh(high, pbf) {\n    const lsb = (high & 0x07) << 4;\n\n    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;\n    pbf.buf[pbf.pos++]  = high & 0x7f;\n}\n\n/**\n * @param {number} startPos\n * @param {number} len\n * @param {Pbf} pbf\n */\nfunction makeRoomForExtraLength(startPos, len, pbf) {\n    const extraLen =\n        len <= 0x3fff ? 1 :\n        len <= 0x1fffff ? 2 :\n        len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));\n\n    // if 1 byte isn't enough for encoding message length, shift the data to the right\n    pbf.realloc(extraLen);\n    for (let i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];\n}\n\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedVarint(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedSVarint(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedFloat(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedDouble(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);\n}\n/**\n * @param {boolean[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedBoolean(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedFixed32(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedSFixed32(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedFixed64(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);\n}\n/**\n * @param {number[]} arr\n * @param {Pbf} pbf\n */\nfunction writePackedSFixed64(arr, pbf) {\n    for (let i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]);\n}\n\n// Buffer code below from https://github.com/feross/buffer, MIT-licensed\n\n/**\n * @param {Uint8Array} buf\n * @param {number} pos\n * @param {number} end\n */\nfunction readUtf8(buf, pos, end) {\n    let str = '';\n    let i = pos;\n\n    while (i < end) {\n        const b0 = buf[i];\n        let c = null; // codepoint\n        let bytesPerSequence =\n            b0 > 0xEF ? 4 :\n            b0 > 0xDF ? 3 :\n            b0 > 0xBF ? 2 : 1;\n\n        if (i + bytesPerSequence > end) break;\n\n        let b1, b2, b3;\n\n        if (bytesPerSequence === 1) {\n            if (b0 < 0x80) {\n                c = b0;\n            }\n        } else if (bytesPerSequence === 2) {\n            b1 = buf[i + 1];\n            if ((b1 & 0xC0) === 0x80) {\n                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);\n                if (c <= 0x7F) {\n                    c = null;\n                }\n            }\n        } else if (bytesPerSequence === 3) {\n            b1 = buf[i + 1];\n            b2 = buf[i + 2];\n            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {\n                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);\n                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {\n                    c = null;\n                }\n            }\n        } else if (bytesPerSequence === 4) {\n            b1 = buf[i + 1];\n            b2 = buf[i + 2];\n            b3 = buf[i + 3];\n            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {\n                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);\n                if (c <= 0xFFFF || c >= 0x110000) {\n                    c = null;\n                }\n            }\n        }\n\n        if (c === null) {\n            c = 0xFFFD;\n            bytesPerSequence = 1;\n\n        } else if (c > 0xFFFF) {\n            c -= 0x10000;\n            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);\n            c = 0xDC00 | c & 0x3FF;\n        }\n\n        str += String.fromCharCode(c);\n        i += bytesPerSequence;\n    }\n\n    return str;\n}\n\n/**\n * @param {Uint8Array} buf\n * @param {string} str\n * @param {number} pos\n */\nfunction writeUtf8(buf, str, pos) {\n    for (let i = 0, c, lead; i < str.length; i++) {\n        c = str.charCodeAt(i); // code point\n\n        if (c > 0xD7FF && c < 0xE000) {\n            if (lead) {\n                if (c < 0xDC00) {\n                    buf[pos++] = 0xEF;\n                    buf[pos++] = 0xBF;\n                    buf[pos++] = 0xBD;\n                    lead = c;\n                    continue;\n                } else {\n                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n                    lead = null;\n                }\n            } else {\n                if (c > 0xDBFF || (i + 1 === str.length)) {\n                    buf[pos++] = 0xEF;\n                    buf[pos++] = 0xBF;\n                    buf[pos++] = 0xBD;\n                } else {\n                    lead = c;\n                }\n                continue;\n            }\n        } else if (lead) {\n            buf[pos++] = 0xEF;\n            buf[pos++] = 0xBF;\n            buf[pos++] = 0xBD;\n            lead = null;\n        }\n\n        if (c < 0x80) {\n            buf[pos++] = c;\n        } else {\n            if (c < 0x800) {\n                buf[pos++] = c >> 0x6 | 0xC0;\n            } else {\n                if (c < 0x10000) {\n                    buf[pos++] = c >> 0xC | 0xE0;\n                } else {\n                    buf[pos++] = c >> 0x12 | 0xF0;\n                    buf[pos++] = c >> 0xC & 0x3F | 0x80;\n                }\n                buf[pos++] = c >> 0x6 & 0x3F | 0x80;\n            }\n            buf[pos++] = c & 0x3F | 0x80;\n        }\n    }\n    return pos;\n}\n","/**\n * PMTiles corrections fetcher with LRU caching and overzoom support\n * \n * This implementation is heavily inspired by and adapts code from:\n * protomaps-leaflet (https://github.com/protomaps/protomaps-leaflet)\n * Copyright (c) 2021 Brandon Liu\n * Licensed under BSD 3-Clause License\n * \n * Protomaps-leaflet concepts and patterns used:\n * - TileCache: In-flight request deduplication, LRU cache with performance.now()\n * - PmtilesSource: PMTiles tile fetching pattern\n * - View.dataTileForDisplayTile(): Overzoom coordinate calculation logic\n * - toIndex(): Tile key generation (x:y:z format)\n * - parseTile(): Vector tile parsing with @mapbox/vector-tile\n * \n * Key adaptations for India boundary corrections:\n * - Modified feature format to include 'extent' field needed for coordinate scaling\n * - Simplified overzoom logic (removed levelDiff complexity)\n * - Configurable cache size (protomaps uses fixed 64)\n * - Plain geometry objects {x, y} instead of Point class\n * - transformForOverzoom() adapted from View's coordinate transform logic\n * \n * Thank you to the protomaps team for the excellent reference implementation!\n */\n\nimport { PMTiles } from 'pmtiles';\nimport { VectorTile } from '@mapbox/vector-tile';\nimport Protobuf from 'pbf';\n\n// Default cache size: enough to cache all tiles in PMTiles\n// 6136 tiles with ~10.7k total features, uses ~0.5MB memory\n// Note: Default is set in TileFixer._defaultCacheMaxFeatures\n\n/**\n * Generate cache key from tile coordinates.\n * Based on protomaps-leaflet toIndex function.\n * @param {number} z\n * @param {number} x\n * @param {number} y\n * @returns {string}\n */\nfunction toIndex(z, x, y) {\n  return `${x}:${y}:${z}`;\n}\n\n/**\n * Count total features in a parsed corrections object.\n * @param {Object<string, Array>} corrections - Parsed corrections\n * @returns {number} Total feature count\n */\nfunction countFeatures(corrections) {\n  let count = 0;\n  for (const features of Object.values(corrections)) {\n    count += features.length;\n  }\n  return count;\n}\n\n/**\n * Check if corrections object is empty.\n * @param {Object<string, Array>} corrections - Parsed corrections\n * @returns {boolean}\n */\nfunction isEmpty(corrections) {\n  return countFeatures(corrections) === 0;\n}\n\n/**\n * Parse a vector tile buffer into a map of layer name to features.\n * Adapted from protomaps-leaflet parseTile function.\n * @param {ArrayBuffer} buffer - The raw tile data\n * @returns {Object<string, Array>} Map of layer name to array of features\n */\nfunction parseTile(buffer) {\n  const tile = new VectorTile(new Protobuf(buffer));\n  const result = {};\n  for (const [layerName, layer] of Object.entries(tile.layers)) {\n    const features = [];\n    for (let i = 0; i < layer.length; i++) {\n      const feature = layer.feature(i);\n      features.push({\n        id: feature.id,\n        type: feature.type,\n        properties: feature.properties,\n        geometry: feature.loadGeometry(),\n        extent: layer.extent,\n      });\n    }\n    result[layerName] = features;\n  }\n  return result;\n}\n\n/**\n * Transform features for overzoom by scaling and translating geometry.\n * When overzooming, we take a parent tile and extract/scale the relevant quadrant.\n * @param {Object<string, Array>} corrections - Original corrections\n * @param {number} scale - Scale factor (2^(zoom - maxDataZoom))\n * @param {number} offsetX - X offset within parent (0 to scale-1)\n * @param {number} offsetY - Y offset within parent (0 to scale-1)\n * @returns {Object<string, Array>} Transformed corrections\n */\nfunction transformForOverzoom(corrections, scale, offsetX, offsetY) {\n  const result = {};\n  for (const [layerName, features] of Object.entries(corrections)) {\n    result[layerName] = features.map(feature => {\n      const extent = feature.extent;\n      // Each child tile covers (extent/scale) units of the parent\n      const childExtent = extent / scale;\n      // The child tile starts at this position in parent coordinates\n      const startX = offsetX * childExtent;\n      const startY = offsetY * childExtent;\n      \n      const newGeometry = feature.geometry.map(ring => {\n        return ring.map(point => {\n          // Translate to child tile origin, then scale up to full extent\n          const x = (point.x - startX) * scale;\n          const y = (point.y - startY) * scale;\n          return { x, y };\n        });\n      });\n      return {\n        ...feature,\n        geometry: newGeometry,\n        // Keep original extent since we scaled coordinates to match\n        extent: extent,\n      };\n    });\n  }\n  return result;\n}\n\n/**\n * PMTiles corrections source with LRU caching and overzoom support.\n * Based on protomaps-leaflet TileCache and PmtilesSource.\n */\nexport class CorrectionsSource {\n  /**\n   * @param {string} pmtilesUrl - URL to the PMTiles file\n   * @param {Object} [options] - Options\n   * @param {number} [options.cacheMaxFeatures=10000] - Maximum number of features to cache\n   * @param {number} [options.maxDataZoom] - Maximum zoom level in PMTiles (auto-detected if not provided)\n   */\n  constructor(pmtilesUrl, options = {}) {\n    this.pmtilesUrl = pmtilesUrl;\n    this.pmtiles = new PMTiles(pmtilesUrl);\n    this.cacheMaxFeatures = options.cacheMaxFeatures;\n    this.maxDataZoom = options.maxDataZoom;\n    \n    // Cache based on protomaps-leaflet TileCache pattern\n    // Maps toIndex(z,x,y) -> {used: timestamp, data: corrections, featureCount: number, empty: boolean}\n    this.cache = new Map();\n    this.inflight = new Map(); // Maps toIndex(z,x,y) -> [{resolve, reject}]\n    this.cachedFeatureCount = 0; // Track total features in cache\n    \n    // Separate tracking for empty vs non-empty entries for efficient eviction\n    // Empty entries are evicted first since they're cheap to re-fetch\n    this.emptyKeys = new Set();\n    this.nonEmptyKeys = new Set();\n  }\n\n  /**\n   * Get the PMTiles source object.\n   * @returns {PMTiles}\n   */\n  getSource() {\n    return this.pmtiles;\n  }\n\n  /**\n   * Clear the tile cache.\n   */\n  clearCache() {\n    this.cache.clear();\n    this.inflight.clear();\n    this.cachedFeatureCount = 0;\n    this.emptyKeys.clear();\n    this.nonEmptyKeys.clear();\n  }\n\n  /**\n   * Evict cache entries to stay under the feature limit.\n   * Empty entries are evicted first (cheap to re-fetch from PMTiles directory cache).\n   * Within each category, evicts LRU (least recently used) entries.\n   * @private\n   */\n  _evictIfNeeded() {\n    while (this.cachedFeatureCount > this.cacheMaxFeatures && this.cache.size > 1) {\n      // Determine which set to evict from: empty first, then non-empty\n      const targetSet = this.emptyKeys.size > 0 ? this.emptyKeys : this.nonEmptyKeys;\n      if (targetSet.size === 0) break;\n      \n      // Find LRU entry within the target set\n      let evictKey = undefined;\n      let minUsed = Infinity;\n      for (const key of targetSet) {\n        const entry = this.cache.get(key);\n        if (entry && entry.used < minUsed) {\n          minUsed = entry.used;\n          evictKey = key;\n        }\n      }\n      \n      if (!evictKey) break;\n      \n      // Evict the entry\n      const evicted = this.cache.get(evictKey);\n      this.cachedFeatureCount -= evicted.featureCount;\n      targetSet.delete(evictKey);\n      this.cache.delete(evictKey);\n    }\n  }\n\n  /**\n   * Auto-detect max zoom from PMTiles metadata.\n   * @returns {Promise<number>}\n   * @private\n   */\n  async _getMaxDataZoom() {\n    if (this.maxDataZoom !== undefined) {\n      return this.maxDataZoom;\n    }\n    \n    const header = await this.pmtiles.getHeader();\n    this.maxDataZoom = header.maxZoom;\n    return this.maxDataZoom;\n  }\n\n  /**\n   * Fetch and parse a tile from PMTiles.\n   * Implements in-flight request deduplication from protomaps-leaflet.\n   * @param {number} z\n   * @param {number} x\n   * @param {number} y\n   * @param {AbortSignal} [signal] - Optional abort signal\n   * @returns {Promise<Object<string, Array>>}\n   * @private\n   */\n  async _fetchTile(z, x, y, signal) {\n    const idx = toIndex(z, x, y);\n    \n    return new Promise((resolve, reject) => {\n      // Check cache first\n      const entry = this.cache.get(idx);\n      if (entry) {\n        // Update LRU timestamp (protomaps pattern)\n        entry.used = performance.now();\n        resolve(entry.data);\n        return;\n      }\n\n      // Check if already in-flight\n      const ifentry = this.inflight.get(idx);\n      if (ifentry) {\n        // Add to waiting list\n        ifentry.push({ resolve, reject });\n        return;\n      }\n\n      // Start new fetch\n      this.inflight.set(idx, []);\n      \n      this.pmtiles.getZxy(z, x, y, signal)\n        .then((result) => {\n          let data;\n          if (result) {\n            data = parseTile(result.data);\n          } else {\n            // Cache empty result to avoid repeated fetches\n            data = {};\n          }\n\n          // Track features and empty status for cache management\n          const featureCount = countFeatures(data);\n          const empty = featureCount === 0;\n\n          // Cache the result and track in appropriate set\n          this.cache.set(idx, { used: performance.now(), data, featureCount, empty });\n          this.cachedFeatureCount += featureCount;\n          (empty ? this.emptyKeys : this.nonEmptyKeys).add(idx);\n\n          // Resolve all waiting promises\n          const ifentry2 = this.inflight.get(idx);\n          if (ifentry2) {\n            for (const waiter of ifentry2) {\n              waiter.resolve(data);\n            }\n          }\n          this.inflight.delete(idx);\n          resolve(data);\n\n          // Evict if over limit\n          this._evictIfNeeded();\n        })\n        .catch((e) => {\n          // Reject all waiting promises\n          const ifentry2 = this.inflight.get(idx);\n          if (ifentry2) {\n            for (const waiter of ifentry2) {\n              waiter.reject(e);\n            }\n          }\n          this.inflight.delete(idx);\n          reject(e);\n        });\n    });\n  }\n\n  /**\n   * Get corrections for a tile as a dict of layer name to features.\n   * Supports overzoom beyond maxDataZoom by scaling parent tile data.\n   * @param {number} z - Zoom level\n   * @param {number} x - Tile X coordinate\n   * @param {number} y - Tile Y coordinate\n   * @param {AbortSignal} [signal] - Optional abort signal\n   * @returns {Promise<Object<string, Array>>} Map of layer name to array of features\n   */\n  async get(z, x, y, signal) {\n    const maxDataZoom = await this._getMaxDataZoom();\n    \n    // Handle overzoom: fetch parent tile and transform\n    if (z > maxDataZoom) {\n      const zoomDiff = z - maxDataZoom;\n      const scale = 1 << zoomDiff; // 2^zoomDiff\n      \n      // Calculate parent tile coordinates\n      const parentX = Math.floor(x / scale);\n      const parentY = Math.floor(y / scale);\n      \n      // Calculate offset within parent tile (0 to scale-1)\n      const offsetX = x % scale;\n      const offsetY = y % scale;\n      \n      const corrections = await this._fetchTile(maxDataZoom, parentX, parentY, signal);\n      if (Object.keys(corrections).length > 0) {\n        return transformForOverzoom(corrections, scale, offsetX, offsetY);\n      }\n      return {};\n    }\n    \n    return await this._fetchTile(z, x, y, signal);\n  }\n}\n","[\n  {\n    \"id\": \"cartodb-dark\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-dark-retina\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n    ],\n    \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-light\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1,  \"startZoom\": 6,  \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5,  \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-light-retina\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n    ],\n    \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5,  \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n    ]\n  },\n  {\n    \"id\": \"open-topo\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n      \"https://tile.opentopomap.org/{z}/{x}/{y}.png\",\n      \"https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png\",\n      \"https://tile.top-o-map.de/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n      { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n      { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n    ]\n  },\n  {\n    \"id\": \"osm-carto\",\n    \"tileUrlTemplates\": [\n      \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n      \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n      { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n      { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n    ]\n  },\n  {\n    \"id\": \"osm-hot\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n      \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n      { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n      { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n    ]\n  }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n  const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n  \n  // Exact match\n  if (lineWidthStops[zoom] !== undefined) {\n    return lineWidthStops[zoom];\n  }\n  \n  // Below lowest zoom - extrapolate\n  if (zoom < zooms[0]) {\n    const z1 = zooms[0];\n    const z2 = zooms[1];\n    const w1 = lineWidthStops[z1];\n    const w2 = lineWidthStops[z2];\n    const slope = (w2 - w1) / (z2 - z1);\n    return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n  }\n  \n  // Above highest zoom - extrapolate\n  if (zoom > zooms[zooms.length - 1]) {\n    const z1 = zooms[zooms.length - 2];\n    const z2 = zooms[zooms.length - 1];\n    const w1 = lineWidthStops[z1];\n    const w2 = lineWidthStops[z2];\n    const slope = (w2 - w1) / (z2 - z1);\n    return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n  }\n  \n  // Interpolate between two stops\n  for (let i = 0; i < zooms.length - 1; i++) {\n    if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n      const z1 = zooms[i];\n      const z2 = zooms[i + 1];\n      const w1 = lineWidthStops[z1];\n      const w2 = lineWidthStops[z2];\n      const t = (zoom - z1) / (z2 - z1);\n      return w1 + t * (w2 - w1);\n    }\n  }\n  \n  return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n  const groups = [];\n  const hasRetina = template.includes('{r}');\n  const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n  \n  // Escape regex special chars, then replace placeholders\n  let pattern = template\n    .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n      // Don't escape our placeholders\n      if (char === '{' || char === '}') return char;\n      return '\\\\' + char;\n    })\n    // Make protocol flexible (http/https)\n    .replace(/^https:\\/\\//, 'https?://')\n    .replace(/^http:\\/\\//, 'https?://')\n    // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n    .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n      groups.push('s');\n      return '([a-z0-9]+)';\n    })\n    .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n      const lowerName = name.toLowerCase();\n      groups.push(lowerName);\n      if (lowerName === 's') {\n        // Subdomain: single letter or short string\n        return '([a-z0-9]+)';\n      }\n      if (lowerName === 'r') {\n        // Retina suffix: required @2x or similar (must be present for retina configs)\n        return '(@\\\\d+x)';\n      }\n      // z, x, y: numeric\n      return '(\\\\d+)';\n    });\n  \n  // If template has no {r} placeholder, ensure we DON'T match retina URLs\n  if (!hasRetina) {\n    if (hasExtension) {\n      // Insert negative lookahead before .png/.jpg/.webp etc\n      pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n    } else {\n      // No extension - add negative lookahead at the end (before query string)\n      pattern = pattern + '(?!@\\\\d+x)';\n    }\n  }\n  \n  // Allow optional query string at end\n  return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n  const hasRetina = template.includes('{r}');\n  const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n  \n  // Escape regex special chars, then replace placeholders with literal match\n  let pattern = template\n    .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n      if (char === '{' || char === '}') return char;\n      return '\\\\' + char;\n    })\n    // Make protocol flexible (http/https)\n    .replace(/^https:\\/\\//, 'https?://')\n    .replace(/^http:\\/\\//, 'https?://')\n    // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n    .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n    .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n      const lowerName = name.toLowerCase();\n      if (lowerName === 's') {\n        // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n        return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n      }\n      if (lowerName === 'r') {\n        // Match {r} placeholder or actual retina suffix (required for retina configs)\n        return '(\\\\{r\\\\}|@\\\\d+x)';\n      }\n      // Match {z}, {x}, {y} placeholders\n      return `\\\\{${lowerName}\\\\}`;\n    });\n  \n  // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n  if (!hasRetina) {\n    if (hasExtension) {\n      // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n      pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n    } else {\n      // No extension - add negative lookahead at the end (before query string)\n      pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n    }\n  }\n  \n  // Allow optional query string at end\n  return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n  if (typeof color !== 'string' || !color.trim()) return false;\n  \n  // Use CSS.supports if available (modern browsers)\n  if (typeof CSS !== 'undefined' && CSS.supports) {\n    return CSS.supports('color', color);\n  }\n  \n  // Fallback: basic validation for common formats\n  const trimmed = color.trim().toLowerCase();\n  // Hex colors\n  if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n  // rgb/rgba/hsl/hsla functions\n  if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n  // Named colors (just check it's alphabetic)\n  if (/^[a-z]+$/.test(trimmed)) return true;\n  return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n  if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n    throw new Error(`${prefix}: lineWidthStops must be an object`);\n  }\n  const stopKeys = Object.keys(lineWidthStops);\n  if (stopKeys.length < 2) {\n    throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n  }\n  for (const key of stopKeys) {\n    const zoom = Number(key);\n    if (!Number.isInteger(zoom) || zoom < 0) {\n      throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n    }\n    if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n      throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n    }\n  }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n  /**\n   * Validate a LineStyle configuration object.\n   * @param {Object} obj - The object to validate\n   * @param {number} [index] - Optional index for error messages (when validating in an array)\n   * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n   * @throws {Error} If validation fails\n   */\n  static validateJSON(obj, index, requireLineWidthStops = false) {\n    const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n    \n    if (!obj || typeof obj !== 'object') {\n      throw new Error(`${prefix}: must be an object`);\n    }\n    \n    if (!obj.color || typeof obj.color !== 'string') {\n      throw new Error(`${prefix}: color must be a non-empty string`);\n    }\n    \n    if (!isValidColor(obj.color)) {\n      throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n    }\n    \n    if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n      throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n    }\n    \n    if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n      throw new Error(`${prefix}: widthFraction must be a positive number`);\n    }\n    \n    if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n      throw new Error(`${prefix}: dashArray must be an array`);\n    }\n    \n    if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n      throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n    }\n    \n    if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n      throw new Error(`${prefix}: startZoom must be a non-negative number`);\n    }\n    \n    if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n      throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n    }\n    \n    if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n      throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n    }\n    \n    if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n      throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n    }\n    \n    if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n      throw new Error(`${prefix}: lineWidthStops is required`);\n    }\n    \n    if (obj.lineWidthStops !== undefined) {\n      validateLineWidthStops(obj.lineWidthStops, prefix);\n    }\n  }\n\n  /**\n   * @param {Object} options\n   * @param {string} options.color - CSS color string\n   * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n   * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n   * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n   * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n   * @param {number} [options.alpha=1.0] - Opacity (0-1)\n   * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n   * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n   * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n   * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n   */\n  constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n    this.color = color;\n    this.layerSuffix = layerSuffix;\n    this.lineWidthStops = lineWidthStops;\n    this.widthFraction = widthFraction;\n    this.dashArray = dashArray;\n    this.alpha = alpha;\n    this.startZoom = startZoom;\n    this.endZoom = endZoom;\n    this.lineExtensionFactor = lineExtensionFactor;\n    this.delWidthFactor = delWidthFactor;\n  }\n\n  /**\n   * Get base line width for this style at a given zoom level.\n   * @param {number} zoom - Zoom level\n   * @returns {number}\n   */\n  getLineWidth(zoom) {\n    return interpolateLineWidth(zoom, this.lineWidthStops);\n  }\n\n  /**\n   * Check if this style is active at the given zoom level.\n   * @param {number} z - Zoom level\n   * @returns {boolean}\n   */\n  isActiveAtZoom(z) {\n    return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n  }\n\n  /**\n   * Serialize to plain object.\n   * @returns {Object}\n   */\n  toJSON() {\n    return {\n      color: this.color,\n      layerSuffix: this.layerSuffix,\n      lineWidthStops: this.lineWidthStops,\n      widthFraction: this.widthFraction,\n      dashArray: this.dashArray,\n      alpha: this.alpha,\n      startZoom: this.startZoom,\n      endZoom: this.endZoom,\n      lineExtensionFactor: this.lineExtensionFactor,\n      delWidthFactor: this.delWidthFactor,\n    };\n  }\n\n  /**\n   * Create from plain object with validation.\n   * @param {Object} obj\n   * @param {number} [index] - Optional index for error messages\n   * @returns {LineStyle}\n   */\n  static fromJSON(obj, index) {\n    LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n    return new LineStyle(obj);\n  }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n  /**\n   * Validate a LayerConfig configuration object.\n   * Also validates all lineStyles within the config.\n   * @param {Object} obj - The object to validate\n   * @throws {Error} If validation fails\n   */\n  static validateJSON(obj) {\n    if (!obj || typeof obj !== 'object') {\n      throw new Error('LayerConfig: must be an object');\n    }\n    \n    // Validate id (required)\n    if (!obj.id || typeof obj.id !== 'string') {\n      throw new Error('LayerConfig: id must be a non-empty string');\n    }\n    if (obj.id.includes('/')) {\n      throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n    }\n    \n    const id = obj.id;\n    \n    // Validate lineWidthStops (optional, but if provided must be valid)\n    if (obj.lineWidthStops !== undefined) {\n      if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n        throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n      }\n      const stopKeys = Object.keys(obj.lineWidthStops);\n      if (stopKeys.length < 2) {\n        throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n      }\n      for (const key of stopKeys) {\n        const zoom = Number(key);\n        if (!Number.isInteger(zoom) || zoom < 0) {\n          throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n        }\n        if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n          throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n        }\n      }\n    }\n    \n    // Validate lineStyles (required)\n    if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n      throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n    }\n    // Validate each lineStyle\n    for (let i = 0; i < obj.lineStyles.length; i++) {\n      LineStyle.validateJSON(obj.lineStyles[i], i);\n    }\n  }\n\n  constructor({\n    id,\n    // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n    tileUrlTemplates = [],\n    // Line width stops: map of zoom level to line width (at least 2 entries)\n    // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n    lineWidthStops = { 1: 0.5, 10: 2.5 },\n    // Line styles array - each element describes a line to draw from a specific layer\n    // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n    //   startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n    // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n    lineStyles,\n  }) {\n    this.id = id;\n\n    // Normalize to array\n    const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n                      (tileUrlTemplates ? [tileUrlTemplates] : []);\n    this.tileUrlTemplates = templates;\n    \n    // Pre-compile regex patterns for matching tile URLs (with actual coords)\n    this._compiledPatterns = templates.map(t => templateToRegex(t));\n    \n    // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n    this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n    this.lineWidthStops = lineWidthStops;\n    \n    // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n    this.lineStyles = lineStyles.map(style => {\n      if (style instanceof LineStyle) {\n        return style;\n      }\n      // If style doesn't have lineWidthStops, use the config's lineWidthStops\n      const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n      return new LineStyle(styleWithStops);\n    });\n  }\n\n  /**\n   * Get line styles active at a given zoom level\n   * @param {number} z - Zoom level\n   * @returns {LineStyle[]}\n   */\n  getLineStylesForZoom(z) {\n    return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n  }\n\n  /**\n   * Get unique layer suffixes from styles active at a given zoom level\n   * @param {number} z - Zoom level\n   * @returns {string[]}\n   */\n  getLayerSuffixesForZoom(z) {\n    const activeStyles = this.getLineStylesForZoom(z);\n    return [...new Set(activeStyles.map(s => s.layerSuffix))];\n  }\n\n  /**\n   * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n   * @param {string | string[]} templates - Single template URL or array of template URLs\n   * @returns {boolean}\n   */\n  matchTemplate(templates) {\n    if (this._templatePatterns.length === 0) return false;\n    \n    const urls = Array.isArray(templates) ? templates : [templates];\n    if (urls.length === 0) return false;\n    \n    return urls.some(url => \n      this._templatePatterns.some(pattern => pattern.test(url))\n    );\n  }\n\n  /**\n   * Check if this config matches the given tile URLs (with actual coordinates)\n   * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n   * @returns {boolean}\n   */\n  matchTileUrl(tiles) {\n    if (this._compiledPatterns.length === 0) return false;\n    \n    const urls = Array.isArray(tiles) ? tiles : [tiles];\n    if (urls.length === 0) return false;\n    \n    return urls.some(url => \n      this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n    );\n  }\n\n  /**\n   * Extract tile coordinates (z, x, y) from a URL using this config's templates\n   * @param {string} url - Tile URL to extract coordinates from\n   * @returns {{ z: number, x: number, y: number } | null}\n   */\n  extractCoords(url) {\n    for (const { pattern, groups } of this._compiledPatterns) {\n      const match = url.match(pattern);\n      if (match) {\n        const result = {};\n        for (let i = 0; i < groups.length; i++) {\n          const name = groups[i];\n          const value = match[i + 1];\n          if (name === 'z' || name === 'x' || name === 'y') {\n            result[name] = parseInt(value, 10);\n          }\n        }\n        if ('z' in result && 'x' in result && 'y' in result) {\n          return { z: result.z, x: result.x, y: result.y };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Serialize the config to a plain object for postMessage\n   * @returns {Object}\n   */\n  toJSON() {\n    return {\n      id: this.id,\n      tileUrlTemplates: this.tileUrlTemplates,\n      lineWidthStops: this.lineWidthStops,\n      lineStyles: this.lineStyles.map(s => s.toJSON()),\n    };\n  }\n\n  /**\n   * Create a LayerConfig from a plain object with validation.\n   * @param {Object} obj\n   * @returns {LayerConfig}\n   * @throws {Error} If validation fails\n   */\n  static fromJSON(obj) {\n    LayerConfig.validateJSON(obj);\n    return new LayerConfig(obj);\n  }\n}\n\nexport default LayerConfig;\n","import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n  constructor() {\n    this.registry = {};\n  }\n\n  /**\n   * Get a layer config by id\n   */\n  get(id) {\n    return this.registry[id];\n  }\n\n  /**\n   * Register a new layer config\n   */\n  register(config) {\n    this.registry[config.id] = config;\n  }\n\n  /**\n   * Remove a layer config by id\n   */\n  remove(id) {\n    if (!this.registry[id]) return false;\n    delete this.registry[id];\n    return true;\n  }\n\n  /**\n   * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n   * @param {string | string[]} templates - Single template URL or array of template URLs\n   */\n  detectFromTemplates(templates) {\n    if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n    \n    for (const config of Object.values(this.registry)) {\n      if (config.matchTemplate(templates)) {\n        return config;\n      }\n    }\n    \n    return undefined;\n  }\n\n  /**\n   * Detect layer config from actual tile URLs (with numeric coordinates)\n   * @param {string | string[]} urls - Single tile URL or array of tile URLs\n   */\n  detectFromTileUrls(urls) {\n    if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n    \n    for (const config of Object.values(this.registry)) {\n      if (config.matchTileUrl(urls)) {\n        return config;\n      }\n    }\n    \n    return undefined;\n  }\n\n  /**\n   * Get all available layer config ids\n   */\n  getAvailableIds() {\n    return Object.keys(this.registry);\n  }\n\n  /**\n   * Create a new registry with all configs from this registry plus extra configs.\n   * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n   * @returns {LayerConfigRegistry} A new registry with merged configs\n   */\n  createMergedRegistry(extraLayerConfigs) {\n    const registry = new LayerConfigRegistry();\n    \n    for (const id of this.getAvailableIds()) {\n      registry.register(this.get(id));\n    }\n    \n    if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n      for (const config of extraLayerConfigs) {\n        registry.register(config);\n      }\n    }\n    \n    return registry;\n  }\n\n  /**\n   * Parse a tile URL into its components: layer config and coordinates\n   * @param {string} url - Tile URL to parse\n   * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n   */\n  parseTileUrl(url) {\n    // Check if URL matches any layer config\n    const layerConfig = this.detectFromTileUrls([url]);\n    if (!layerConfig) return null;\n    \n    // Extract tile coordinates using the matched config\n    const coords = layerConfig.extractCoords(url);\n    if (!coords) return null;\n    \n    return { layerConfig, coords };\n  }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n  layerConfigs.register(new LayerConfig(configData));\n}\n\n"],"mappings":"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","names":["b","j","x","l","v","m","m","v","l","b","l","leafletRasterLayer","__name","source","options","loaded","mimeType","cls","coord","done","el","controller","signal","header","arr","blob","imageUrl","e","key","tile","v3compat","v4","requestParameters","arg2","abortController","result","err","_Protocol","params","__async","pmtilesUrl","instance","PMTiles","h","re","z","x","y","resp","p","url","toNum","low","high","__name","readVarintRemainder","l","p","buf","b","h","readVarint","val","rotate","n","xy","rx","ry","t","idOnLevel","z","pos","__pow","s","tzValues","zxyToTileId","x","y","acc","d","tileIdToZxy","numTiles","Compression","defaultDecompress","compression","__async","decompressSync","stream","result","TileType","tileTypeExt","HEADER_SIZE_BYTES","findTile","entries","tileId","m","k","cmp","_FileSource","file","offset","length","_FetchSource","url","customHeaders","userAgent","isWindows","isChromiumBased","offset","length","passedSignal","etag","__async","controller","signal","requestHeaders","cache","resp","contentRange","actualLength","newEtag","EtagMismatch","contentLength","__name","FetchSource","getUint64","v","wh","wl","__pow","bytesToHeader","bytes","specVersion","deserializeIndex","buffer","p","numEntries","readVarint","entries","lastId","i","_EtagMismatch","getHeaderAndRoot","source","decompress","headerData","HEADER_SIZE_BYTES","header","rootDirData","dirKey","rootDir","getDirectory","data","directory","_ResolvedValueCache","maxCacheEntries","prefetch","defaultDecompress","cacheKey","cacheValue","res","minUsed","minKey","key","_SharedPromiseCache","maxCacheEntries","prefetch","decompress","defaultDecompress","source","__async","cacheKey","cacheValue","p","resolve","reject","getHeaderAndRoot","res","e","offset","length","header","getDirectory","directory","minUsed","minKey","key","h","__name","SharedPromiseCache","_PMTiles","cache","FetchSource","z","x","y","signal","tileId","zxyToTileId","dO","dL","depth","entry","findTile","resp","EtagMismatch","decompressed","dec","baseTilesUrl","metadata","ext","tileTypeExt","PMTiles","x","k","m","b","x","x2","z","j","b","l","b","z","x","x","z","b","_","z","v","x","z"]}