{"version":3,"sources":["jsdelivr-header.js","/npm/@vractal/leaflet.offline@2.0.3/dist/bundle.js"],"names":[],"mappings":"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","file":"/npm/@vractal/leaflet.offline@2.0.3/dist/bundle.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@vractal/leaflet.offline@2.0.3/dist/bundle.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('leaflet'), require('idb')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'leaflet', 'idb'], factory) :\n  (global = global || self, factory(global.LeafletOffline = {}, global.L, global.idb));\n}(this, (function (exports, L, idb) { 'use strict';\n\n  L = L && Object.prototype.hasOwnProperty.call(L, 'default') ? L['default'] : L;\n\n  /**\n   * Api methods used in control and layer\n   * For advanced usage\n   *\n   * @module TileManager\n   *\n   */\n\n  var tileStoreName = 'tileStore';\n  var urlTemplateIndex = 'urlTemplate';\n\n  var dbPromise = idb.openDB('leaflet.offline', 2, {\n    upgrade: function upgrade(db, oldVersion) {\n      idb.deleteDB('leaflet_offline');\n      idb.deleteDB('leaflet_offline_areas');\n\n      if (oldVersion < 1) {\n        var tileStore = db.createObjectStore(tileStoreName, {\n          keyPath: 'key',\n        });\n        tileStore.createIndex(urlTemplateIndex, 'urlTemplate');\n        tileStore.createIndex('z', 'z');\n      }\n    },\n  });\n\n  /**\n   *\n   * @example\n   * ```js\n   * import { getStorageLength } from 'leaflet.offline'\n   * getStorageLength().then(i => console.log(i + 'tiles in storage'))\n   * ```\n   * @typedef {Object} tileInfo\n   * @property {string} key storage key\n   * @property {string} url resolved url\n   * @property {string} urlTemplate orig url, used to find tiles per layer\n   * @property {string} x left point of tile\n   * @property {string} y top point coord of tile\n   * @property {string} z tile zoomlevel\n   * @return {Promise<Number>} get number of store tiles\n   */\n  async function getStorageLength() {\n    return (await dbPromise).count(tileStoreName);\n  }\n\n  /**\n   * @example\n   * ```js\n   * import { getStorageInfo } from 'leaflet.offline'\n   * getStorageInfo('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png')\n   * ```\n   * @param {string} urlTemplate\n   *\n   * @return {Promise<tileInfo[]>}\n   */\n  async function getStorageInfo(urlTemplate) {\n    var range = IDBKeyRange.only(urlTemplate);\n    return (await dbPromise).getAllFromIndex(\n      tileStoreName,\n      urlTemplateIndex,\n      range\n    );\n  }\n\n  /**\n   * @example\n   * ```js\n   * import { downloadTile } from 'leaflet.offline'\n   * downloadTile(tileInfo.url).then(blob => saveTile(tileInfo, blob))\n   * ```\n   * @param {string} tileUrl\n   * @return {Promise<blob>}\n   */\n  async function downloadTile(tileUrl) {\n    return fetch(tileUrl).then(function (response) {\n      if (!response.ok) {\n        throw new Error((\"Request failed with status \" + (response.statusText)));\n      }\n      return response.blob();\n    });\n  }\n  /**\n   * TODO validate tileinfo props?\n   *\n   * @example\n   * ```js\n   * saveTile(tileInfo, blob).then(() => console.log(`saved tile from ${tileInfo.url}`))\n   * ```\n   *\n   * @param {tileInfo} tileInfo\n   * @param {Blob} blob\n   *\n   * @return {Promise}\n   */\n  async function saveTile(tileInfo, blob) {\n    // console.log('Saving Tile'); // eslint-disable-line no-console\n    // console.log(tileInfo); // eslint-disable-line no-console\n    return (await dbPromise).put(tileStoreName, Object.assign({}, {blob: blob},\n      tileInfo));\n  }\n\n  /**\n   *\n   * @param {string} urlTemplate\n   * @param {object} data  x, y, z, s\n   * @param {string} data.s subdomain\n   *\n   * @returns {string}\n   */\n  function getTileUrl(urlTemplate, data) {\n    return L.Util.template(urlTemplate, Object.assign({}, data,\n      {r: L.Browser.retina ? '@2x' : ''}));\n  }\n  /**\n   * @example\n   * const p1 = L.point(10, 10)\n   * const p2 = L.point(40, 60)\n   * getTileUrls(layer, L.bounds(p1,p2), 12)\n   *\n   * @param {object} layer leaflet tilelayer\n   * @param {object} bounds L.bounds\n   * @param {number} zoom zoomlevel 0-19\n   *\n   * @return {Array.<tileInfo>}\n   */\n  function getTileUrls(layer, bounds, zoom) {\n    var tiles = [];\n    var tileBounds = L.bounds(\n      bounds.min.divideBy(layer.getTileSize().x).floor(),\n      bounds.max.divideBy(layer.getTileSize().x).floor()\n    );\n    for (var j = tileBounds.min.y; j <= tileBounds.max.y; j += 1) {\n      for (var i = tileBounds.min.x; i <= tileBounds.max.x; i += 1) {\n        var tilePoint = new L.Point(i, j);\n        var data = Object.assign({}, layer.options, {x: i, y: j, z: zoom});\n        tiles.push({\n          key: getTileUrl(layer._url, Object.assign({}, data,\n            {s: layer.options.subdomains['0']})),\n          url: getTileUrl(layer._url, Object.assign({}, data,\n            {s: layer._getSubdomain(tilePoint)})),\n          z: zoom,\n          x: i,\n          y: j,\n          urlTemplate: layer._url,\n        });\n      }\n    }\n\n    return tiles;\n  }\n  /**\n   * Get a geojson of tiles from one resource\n   *\n   * @example\n   * const urlTemplate = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n   * const getGeoJsonData = () => LeafletOffline.getStorageInfo(urlTemplate)\n   *  .then((data) => LeafletOffline.getStoredTilesAsJson(baseLayer, data));\n   *\n   * getGeoJsonData().then((geojson) => {\n   *   storageLayer = L.geoJSON(geojson).bindPopup(\n   *     (clickedLayer) => clickedLayer.feature.properties.key,\n   *   );\n   * });\n   *\n   * @param {object} layer\n   * @param {tileInfo[]} tiles\n   *\n   * @return {object} geojson\n   */\n  function getStoredTilesAsJson(layer, tiles) {\n    var featureCollection = {\n      type: 'FeatureCollection',\n      features: [],\n    };\n    for (var i = 0; i < tiles.length; i += 1) {\n      var topLeftPoint = new L.Point(\n        tiles[i].x * layer.getTileSize().x,\n        tiles[i].y * layer.getTileSize().y\n      );\n      var bottomRightPoint = new L.Point(\n        topLeftPoint.x + layer.getTileSize().x,\n        topLeftPoint.y + layer.getTileSize().y\n      );\n\n      var topLeftlatlng = L.CRS.EPSG3857.pointToLatLng(\n        topLeftPoint,\n        tiles[i].z\n      );\n      var botRightlatlng = L.CRS.EPSG3857.pointToLatLng(\n        bottomRightPoint,\n        tiles[i].z\n      );\n      featureCollection.features.push({\n        type: 'Feature',\n        properties: tiles[i],\n        geometry: {\n          type: 'Polygon',\n          coordinates: [\n            [\n              [topLeftlatlng.lng, topLeftlatlng.lat],\n              [botRightlatlng.lng, topLeftlatlng.lat],\n              [botRightlatlng.lng, botRightlatlng.lat],\n              [topLeftlatlng.lng, botRightlatlng.lat],\n              [topLeftlatlng.lng, topLeftlatlng.lat] ] ],\n        },\n      });\n    }\n\n    return featureCollection;\n  }\n\n  /**\n   * Remove tile by key\n   * @param {string} key\n   *\n   * @returns {Promise}\n   */\n  async function removeTile(key) {\n    return (await dbPromise).delete(tileStoreName, key);\n  }\n\n  /**\n   * Get single tile blob\n   *\n   * @param {string} key\n   *\n   * @returns {Promise<Blob>}\n   */\n  async function getTile(key) {\n    return (await dbPromise)\n      .get(tileStoreName, key)\n      .then(function (result) { return (result === undefined ? undefined : result.blob); });\n  }\n\n  /**\n   * Remove everything\n   *\n   * @return {Promise}\n   */\n  async function truncate() {\n    return (await dbPromise).clear(tileStoreName);\n  }\n\n  /**\n   * A layer that uses stored tiles when available. Falls back to online.\n   *\n   * @class TileLayerOffline\n   * @hideconstructor\n   * @example\n   * const tileLayerOffline = L.tileLayer\n   * .offline('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n   *   attribution: 'Map data {attribution.OpenStreetMap}',\n   *   subdomains: 'abc',\n   *   minZoom: 13,\n   *   saveOnLoad: true,\n   *   downsample: true\n   * })\n   * .addTo(map);\n   */\n  var TileLayerOffline = L.TileLayer.extend(\n    /** @lends  TileLayerOffline */ {\n      /**\n       * Create tile HTMLElement\n       * @private\n       * @param  {object}   coords x,y,z\n       * @param  {Function} done\n       * @return {HTMLElement}  img\n       */\n      createTile: function createTile(coords, done) {\n        var this$1 = this;\n\n        var error;\n        var tile = L.TileLayer.prototype.createTile.call(this, coords, function () {});\n        // console.log('offline createTile');\n        // console.log(tile);\n        var url = tile.src;\n        this.setDataUrl(coords, false)\n          .then(function (res) {\n          // console.log(`loaded specific tile {res.dataUrl}`);\n            tile.src = res.dataUrl;\n            done(error, tile);\n          })\n          .catch(function () {\n          // console.log(\"failed to load specific tile from offline\");\n            tile.src = url;\n            // L.DomEvent.on(tile,'error', async (e) => {\n            L.DomEvent.on(tile, 'error', async function () {\n            // console.log(\"failed to load specific tile from online\")\n              this$1.setDataUrl(coords, true)\n                .then(function (res) {\n                  // code borrows from Leaflet.TileLayer.FallBack plugin\n                  var ref = res.coords;\n                  var scale = ref.scale;\n                  var currentCoords = res.coords;\n                  var ref$1 = res.coords;\n                  var originalCoords = ref$1.originalCoords;\n                  // console.log(`Set src to ${res.dataUrl} scale ${scale} origx${originalCoords.x}`);\n                  tile.src = res.dataUrl;\n                  var tileSize = this$1.getTileSize();\n                  var style = tile.style;\n                  style.width = (tileSize.x * scale) + \"px\";\n                  style.height = (tileSize.y * scale) + \"px\";\n                  // Compute margins to adjust position.\n                  var top = (originalCoords.y - currentCoords.y * scale) * tileSize.y;\n                  style.marginTop = (-top) + \"px\";\n                  var left = (originalCoords.x - currentCoords.x * scale) * tileSize.x;\n                  style.marginLeft = (-left) + \"px\";\n\n                  done(error, tile);\n                })\n                .catch(function () {\n                  // console.log(`Caught setdataurl error on url ${url} `);\n                  // console.log(err);\n                  // tile.src = url;\n\n                  // L.DomEvent.on(tile, 'load', L.Util.bind(this._tileOnLoad, this, done, tile));\n                  L.DomEvent.on(tile, 'error', L.Util.bind(this$1._tileOnError, this$1, done, tile));\n                });\n            });\n\n            L.DomEvent.on(tile, 'load', L.Util.bind(this$1._tileOnLoad, this$1, done, tile));\n            //   L.DomEvent.on(tile, 'error', L.Util.bind(this._tileOnError, this, done, tile));\n          });\n        return tile;\n      },\n      /**\n       * dataurl from localstorage\n       * @private\n       * @param {object} coords x,y,z\n       * @return {Promise<string>} objecturl\n       */\n      setDataUrl: function setDataUrl(coords, trydownSample) {\n        var this$1 = this;\n\n        var key = this._getStorageKey(coords);\n        if (key === undefined) {\n          throw new Error('_getStorageKey returned undefined');\n        }\n        // eslint-disable-next-line no-console\n        // else { console.log(`_getStorageKey returned ${key}`); }\n        return getTile(key)\n          .then(function (data) {\n            if (data && typeof data === 'object') {\n              return { dataUrl: URL.createObjectURL(data), coords: coords };\n            }\n            var newz = coords.z - 1;\n            if (newz <= 1\n                || newz < this$1.options.minZoom\n                || trydownSample === false) {\n              throw new Error((\"tile not found in storage: \" + key));\n            } else {\n              // eslint-disable-next-line no-console\n              // console.log(`no offline tile at ${key}. trying coords`);\n              var newcoords = Object.assign({}, coords,\n                {z: newz,\n                x: Math.floor(coords.x / 2),\n                y: Math.floor(coords.y / 2),\n                originalCoords: coords.originalCoords !== undefined ? coords.originalCoords : coords,\n                scale: (coords.scale || 1) * 2});\n              // console.log(newcoords); // eslint-disable-line no-console\n              return this$1.setDataUrl(newcoords);\n            }\n          });\n      },\n      /**\n       * get key to use for storage\n       * @private\n       * @param  {string} url url used to load tile\n       * @return {string} unique identifier.\n       */\n      _getStorageKey: function _getStorageKey(coords) {\n        return getTileUrl(this._url, Object.assign({}, coords,\n          this.options,\n          {s: this.options.subdomains['0']}));\n      },\n      /**\n       * getTileUrls for single zoomlevel\n       * @private\n       * @param  {object} L.latLngBounds\n       * @param  {number} zoom\n       * @return {object[]} the tile urls, key, url, x, y, z\n       */\n      getTileUrls: function getTileUrls$1(bounds, zoom) {\n        return getTileUrls(this, bounds, zoom);\n      },\n    }\n  );\n\n  /**\n   * Control finished calculating storage size\n   * @event storagesize\n   * @memberof TileLayerOffline\n   * @type {ControlStatus}\n   */\n\n  /**\n   * Start saving tiles\n   * @event savestart\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * Tile fetched\n   * @event loadtileend\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * All tiles fetched\n   * @event loadend\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * Tile saved\n   * @event savetileend\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * All tiles saved\n   * @event saveend\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * Tile removed\n   * @event tilesremoved\n   * @memberof TileLayerOffline\n   * @type {object}\n   */\n\n  /**\n   * Leaflet tilelayer\n   * @external \"L.tileLayer\"\n   * @see {@link https://leafletjs.com/reference-1.6.0.html#tilelayer|TileLayer}\n   */\n\n  /**\n   * @function external:\"L.tileLayer\".offline\n   * @param  {string} url     [description]\n   * @param  {object} options {@link http://leafletjs.com/reference-1.2.0.html#tilelayer}\n   * @return {TileLayerOffline}      an instance of TileLayerOffline\n   */\n  L.tileLayer.offline = function (url, options) { return new TileLayerOffline(url, options)\n    .on('tileload', async function (e) {\n    // console.log(e);\n      if (options.saveOnLoad !== undefined && options.saveOnLoad === true) {\n        var tileurl = e.tile.src;\n        // console.log(tileurl); // eslint-disable-line no-console\n        if (tileurl.startsWith('blob:')) ; else {\n        // debugger;\n        // key for blob is url with first subdomain\n          var newkey = tileurl.replace(/^https:\\/\\/.?/i, (\"https://\" + (options.subdomains['0'])));\n          var tile = {\n            key: newkey,\n            url: tileurl,\n            z: e.coords.z,\n            x: e.coords.x,\n            y: e.coords.y,\n            urlTemplate: url,\n          };\n\n          // console.log(`downloading tile ${tileurl}`);\n          await downloadTile(tileurl).then(function (blob) {\n            saveTile(tile, blob);\n            // console.log('saved tile'); // eslint-disable-line no-console\n          });\n        }\n      }\n    }); };\n\n  /**\n   * Status of ControlSaveTiles, keeps info about process during downloading\n   * ans saving tiles. Used internal and as object for events.\n   * @typedef {Object} ControlStatus\n   * @property {number} storagesize total number of saved tiles.\n   * @property {number} lengthToBeSaved number of tiles that will be saved in db\n   * during current process\n   * @property {number} lengthSaved number of tiles saved during current process\n   * @property {number} lengthLoaded number of tiles loaded during current process\n   * @property {array} _tilesforSave tiles waiting for processing\n   */\n\n  /**\n   * Shows control on map to save tiles\n   * @class ControlSaveTiles\n   *\n   *\n   * @property {ControlStatus} status\n   *\n   * @example\n   * const controlSaveTiles = L.control.savetiles(baseLayer, {\n   * zoomlevels: [13, 16], // optional zoomlevels to save, default current zoomlevel\n   * confirm(layer, successCallback) {\n   *   if (window.confirm(`Save ${layer._tilesforSave.length}`)) {\n   *     successCallback();\n   *   }\n   * },\n   * confirmRemoval(layer, successCallback) {\n   *   if (window.confirm('Remove all the tiles?')) {\n   *     successCallback();\n   *   }\n   * },\n   * saveText: '<i class=\"fa fa-download\" aria-hidden=\"true\" title=\"Save tiles\"></i>',\n   * rmText: '<i class=\"fa fa-trash\" aria-hidden=\"true\"  title=\"Remove tiles\"></i>',\n   * });\n   */\n  var ControlSaveTiles = L.Control.extend(\n    /** @lends ControlSaveTiles */ {\n      options: {\n        position: 'topleft',\n        saveText: '+',\n        rmText: '-',\n        maxZoom: 19,\n        saveWhatYouSee: false,\n        bounds: null,\n        confirm: null,\n        confirmRemoval: null,\n        parallel: 50,\n      },\n      status: {\n        storagesize: null,\n        lengthToBeSaved: null,\n        lengthSaved: null,\n        lengthLoaded: null,\n        _tilesforSave: null,\n      },\n      /**\n       * @private\n       * @param  {Object} baseLayer\n       * @param  {Object} options\n       * @return {void}\n       */\n      initialize: function initialize(baseLayer, options) {\n        this._baseLayer = baseLayer;\n        this.setStorageSize();\n        L.setOptions(this, options);\n      },\n      /**\n       * Set storagesize prop on object init\n       * @return {Promise<Number>}\n       * @private\n       */\n      setStorageSize: function setStorageSize() {\n        var this$1 = this;\n\n        if (this.status.storagesize) {\n          return Promise.resolve(this.status.storagesize);\n        }\n        return getStorageLength()\n          .then(function (numberOfKeys) {\n            this$1.status.storagesize = numberOfKeys;\n            this$1._baseLayer.fire('storagesize', this$1.status);\n            return numberOfKeys;\n          })\n          .catch(function () { return 0; });\n      },\n      /**\n       * get number of saved files\n       * @param  {Function} callback [description]\n       * @private\n       */\n      getStorageSize: function getStorageSize(callback) {\n        this.setStorageSize().then(function (result) {\n          if (callback) {\n            callback(result);\n          }\n        });\n      },\n      /**\n       * Change baseLayer\n       * @param {TileLayerOffline} layer\n       */\n      setLayer: function setLayer(layer) {\n        this._baseLayer = layer;\n      },\n      /**\n       * Update a config option\n       * @param {string} name\n       * @param {mixed} value\n       */\n      setOption: function setOption(name, value) {\n        if (this.options[name] === undefined) {\n          throw new Error((\"Option \" + name + \" doe not exist\"));\n        }\n        this.options[name] = value;\n      },\n      onAdd: function onAdd() {\n        var container = L.DomUtil.create('div', 'savetiles leaflet-bar');\n        var ref = this;\n        var options = ref.options;\n        this._createButton(options.saveText, 'savetiles', container, this._saveTiles);\n        this._createButton(options.rmText, 'rmtiles', container, this._rmTiles);\n        return container;\n      },\n      _createButton: function _createButton(html, className, container, fn) {\n        var link = L.DomUtil.create('a', className, container);\n        link.innerHTML = html;\n        link.href = '#';\n\n        L.DomEvent.on(link, 'mousedown dblclick', L.DomEvent.stopPropagation)\n          .on(link, 'click', L.DomEvent.stop)\n          .on(link, 'click', fn, this)\n          .on(link, 'click', this._refocusOnMap, this);\n\n        return link;\n      },\n      /**\n       * starts processing tiles\n       * @private\n       * @return {void}\n       */\n      _saveTiles: function _saveTiles() {\n        var this$1 = this;\n\n        var bounds;\n        var tiles = [];\n        // minimum zoom to prevent the user from saving the whole world\n\n        var ref = this.options;\n        var minZoom = ref.minZoom; if ( minZoom === void 0 ) minZoom = 5;\n        var maxZoom = ref.maxZoom;\n        var zoomInterval = ref.zoomInterval; if ( zoomInterval === void 0 ) zoomInterval = 1;\n        var saveWhatYouSee = ref.saveWhatYouSee;\n\n        // current zoom or zoom options\n        var zoomlevels = [];\n\n        if (saveWhatYouSee) {\n          var currentZoom = this._map.getZoom();\n          if (currentZoom < minZoom) {\n            throw new Error((\"It's not possible save with zoom below level \" + minZoom + \".\"));\n          }\n\n          for (var zoom = currentZoom; zoom <= maxZoom; zoom += zoomInterval) {\n            zoomlevels.push(zoom);\n          }\n        } else {\n          zoomlevels = this.options.zoomlevels || [this._map.getZoom()];\n        }\n\n        var latlngBounds = this.options.bounds || this._map.getBounds();\n\n        for (var i = 0; i < zoomlevels.length; i += 1) {\n          bounds = L.bounds(\n            this._map.project(latlngBounds.getNorthWest(), zoomlevels[i]),\n            this._map.project(latlngBounds.getSouthEast(), zoomlevels[i])\n          );\n          tiles = tiles.concat(this._baseLayer.getTileUrls(bounds, zoomlevels[i]));\n        }\n        this._resetStatus(tiles);\n        var successCallback = async function () {\n          this$1._baseLayer.fire('savestart', this$1.status);\n          var loader = function () {\n            if (tiles.length === 0) {\n              return Promise.resolve();\n            }\n            var tile = tiles.shift();\n            return this$1._loadTile(tile).then(loader);\n          };\n          var parallel = Math.min(tiles.length, this$1.options.parallel);\n          for (var i = 0; i < parallel; i += 1) {\n            loader();\n          }\n        };\n        if (this.options.confirm) {\n          this.options.confirm(this.status, successCallback);\n        } else {\n          successCallback();\n        }\n      },\n      /**\n       * set status prop on save init\n       * @param {string[]} tiles [description]\n       * @private\n       */\n      _resetStatus: function _resetStatus(tiles) {\n        this.status = {\n          lengthLoaded: 0,\n          lengthToBeSaved: tiles.length,\n          lengthSaved: 0,\n          _tilesforSave: tiles,\n        };\n      },\n      /**\n       * Loop over status._tilesforSave prop till all tiles are downloaded\n       * Calls _saveTile for each download\n       * @private\n       * @return {void}\n       */\n      _loadTile: async function _loadTile(jtile) {\n        var self = this;\n        var tile = jtile;\n        await downloadTile(tile.url).then(function (blob) {\n          self.status.lengthLoaded += 1;\n          self._saveTile(tile, blob);\n          self._baseLayer.fire('loadtileend', self.status);\n          if (self.status.lengthLoaded === self.status.lengthToBeSaved) {\n            self._baseLayer.fire('loadend', self.status);\n          }\n        });\n      },\n\n      /**\n       * @private\n       * @param  {object} tileInfo save key\n       * @param {string} tileInfo.key\n       * @param {string} tileInfo.url\n       * @param {string} tileInfo.x\n       * @param {string} tileInfo.y\n       * @param {string} tileInfo.z\n       * @param  {blob} blob    [description]\n       * @return {void}         [description]\n       */\n      _saveTile: function _saveTile(tileInfo, blob) { // original is synchronous\n        var self = this;\n        saveTile(tileInfo, blob)\n          .then(function () {\n            self.status.lengthSaved += 1;\n            self._baseLayer.fire('savetileend', self.status);\n            if (self.status.lengthSaved === self.status.lengthToBeSaved) {\n              self._baseLayer.fire('saveend', self.status);\n              self.setStorageSize();\n            }\n          })\n          .catch(function (err) {\n            throw new Error(err);\n          });\n      },\n      _rmTiles: function _rmTiles() {\n        var self = this;\n        var successCallback = function () {\n          truncate().then(function () {\n            self.status.storagesize = 0;\n            self._baseLayer.fire('tilesremoved');\n            self._baseLayer.fire('storagesize', self.status);\n          });\n        };\n        if (this.options.confirmRemoval) {\n          this.options.confirmRemoval(this.status, successCallback);\n        } else {\n          successCallback();\n        }\n      },\n    }\n  );\n\n  /**\n   * Leaflet control\n   * @external \"L.control\"\n   * @see {@link https://leafletjs.com/reference-1.6.0.html#control|Control}\n   */\n\n  /**\n   * @function external:\"L.control\".savetiles\n   * @param  {object} baseLayer     {@link http://leafletjs.com/reference-1.2.0.html#tilelayer}\n   * @property {Object} options\n   * @property {string} [options.position] default topleft\n   * @property {string} [options.saveText] html for save button, default +\n   * @property {string} [options.rmText] html for remove button, deflault -\n   * @property {number} [options.maxZoom] maximum zoom level that will be reached\n   * when saving tiles with saveWhatYouSee. Default 19\n   *  @property {number} [options.minZoom] minimum zoom level required for saving tiles\n   * with saveWhatYouSee\n   *  @property {number} [options.zoomInterval] minimum zoom level required for saving tiles\n   * with saveWhatYouSee\n   * @property {number} [options.parallel] parallel downloads (default 50)\n   * @property {boolean} [options.saveWhatYouSee] save the tiles that you see\n   * on screen plus deeper zooms, ignores zoomLevels options. Default false\n   * @property {function} [options.confirm] function called before confirm, default null.\n   * Args of function are ControlStatus and callback.\n   * @property {function} [options.confirmRemoval] function called before confirm, default null\n   * @return {ControlSaveTiles}\n   */\n  L.control.savetiles = function (baseLayer, options) { return new ControlSaveTiles(baseLayer, options); };\n\n  exports.downloadTile = downloadTile;\n  exports.getStorageInfo = getStorageInfo;\n  exports.getStorageLength = getStorageLength;\n  exports.getStoredTilesAsJson = getStoredTilesAsJson;\n  exports.getTileUrl = getTileUrl;\n  exports.getTileUrls = getTileUrls;\n  exports.removeTile = removeTile;\n  exports.saveTile = saveTile;\n  exports.truncate = truncate;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"]}