{"version":3,"sources":["jsdelivr-header.js","/npm/proj4@2.22.0/dist/proj4-src.js"],"names":[],"mappings":"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","file":"/npm/proj4@2.22.0/dist/proj4-src.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/proj4@2.22.0/dist/proj4-src.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' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.proj4 = factory());\n})(this, (function () { 'use strict';\n\n  function globals (defs) {\n    defs('EPSG:4326', '+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees');\n    defs('EPSG:4269', '+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees');\n    defs('EPSG:3857', '+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');\n    // UTM WGS84\n    for (var i = 1; i <= 60; ++i) {\n      defs('EPSG:' + (32600 + i), '+proj=utm +zone=' + i + ' +datum=WGS84 +units=m');\n      defs('EPSG:' + (32700 + i), '+proj=utm +zone=' + i + ' +south +datum=WGS84 +units=m');\n    }\n    defs('EPSG:5041', '+title=WGS 84 / UPS North (E,N) +proj=stere +lat_0=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m');\n    defs('EPSG:5042', '+title=WGS 84 / UPS South (E,N) +proj=stere +lat_0=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m');\n\n    defs.WGS84 = defs['EPSG:4326'];\n    defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857\n    defs.GOOGLE = defs['EPSG:3857'];\n    defs['EPSG:900913'] = defs['EPSG:3857'];\n    defs['EPSG:102113'] = defs['EPSG:3857'];\n  }\n\n  var PJD_3PARAM = 1;\n  var PJD_7PARAM = 2;\n  var PJD_GRIDSHIFT = 3;\n  var PJD_WGS84 = 4; // WGS84 or equivalent\n  var PJD_NODATUM = 5; // WGS84 or equivalent\n  var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms\n  var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms\n  var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms\n  var SEC_TO_RAD = 4.84813681109535993589914102357e-6;\n  var HALF_PI = Math.PI / 2;\n  // ellipoid pj_set_ell.c\n  var SIXTH = 0.1666666666666666667;\n  /* 1/6 */\n  var RA4 = 0.04722222222222222222;\n  /* 17/360 */\n  var RA6 = 0.02215608465608465608;\n  var EPSLN = 1.0e-10;\n  // you'd think you could use Number.EPSILON above but that makes\n  // Mollweide get into an infinate loop.\n\n  var D2R$1 = 0.01745329251994329577;\n  var R2D = 57.29577951308232088;\n  var FORTPI = Math.PI / 4;\n  var TWO_PI = Math.PI * 2;\n  // SPI is slightly greater than Math.PI, so values that exceed the -180..180\n  // degree range by a tiny amount don't get wrapped. This prevents points that\n  // have drifted from their original location along the 180th meridian (due to\n  // floating point error) from changing their sign.\n  var SPI = 3.14159265359;\n\n  var primeMeridian = {};\n\n  primeMeridian.greenwich = 0.0; // \"0dE\",\n  primeMeridian.lisbon = -9.131906111111; // \"9d07'54.862\\\"W\",\n  primeMeridian.paris = 2.337229166667; // \"2d20'14.025\\\"E\",\n  primeMeridian.bogota = -74.080916666667; // \"74d04'51.3\\\"W\",\n  primeMeridian.madrid = -3.687938888889; // \"3d41'16.58\\\"W\",\n  primeMeridian.rome = 12.452333333333; // \"12d27'8.4\\\"E\",\n  primeMeridian.bern = 7.439583333333; // \"7d26'22.5\\\"E\",\n  primeMeridian.jakarta = 106.807719444444; // \"106d48'27.79\\\"E\",\n  primeMeridian.ferro = -17.666666666667; // \"17d40'W\",\n  primeMeridian.brussels = 4.367975; // \"4d22'4.71\\\"E\",\n  primeMeridian.stockholm = 18.058277777778; // \"18d3'29.8\\\"E\",\n  primeMeridian.athens = 23.7163375; // \"23d42'58.815\\\"E\",\n  primeMeridian.oslo = 10.722916666667; // \"10d43'22.5\\\"E\"\n\n  var units = {\n    mm: { to_meter: 0.001 },\n    cm: { to_meter: 0.01 },\n    ft: { to_meter: 0.3048 },\n    'us-ft': { to_meter: 1200 / 3937 },\n    fath: { to_meter: 1.8288 },\n    kmi: { to_meter: 1852 },\n    'us-ch': { to_meter: 20.1168402336805 },\n    'us-mi': { to_meter: 1609.34721869444 },\n    km: { to_meter: 1000 },\n    'ind-ft': { to_meter: 0.30479841 },\n    'ind-yd': { to_meter: 0.91439523 },\n    mi: { to_meter: 1609.344 },\n    yd: { to_meter: 0.9144 },\n    ch: { to_meter: 20.1168 },\n    link: { to_meter: 0.201168 },\n    dm: { to_meter: 0.1 },\n    in: { to_meter: 0.0254 },\n    'ind-ch': { to_meter: 20.11669506 },\n    'us-in': { to_meter: 0.025400050800101 },\n    'us-yd': { to_meter: 0.914401828803658 }\n  };\n\n  var ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n  function match(obj, key) {\n    if (obj[key]) {\n      return obj[key];\n    }\n    var keys = Object.keys(obj);\n    var lkey = key.toLowerCase().replace(ignoredChar, '');\n    var i = -1;\n    var testkey, processedKey;\n    while (++i < keys.length) {\n      testkey = keys[i];\n      processedKey = testkey.toLowerCase().replace(ignoredChar, '');\n      if (processedKey === lkey) {\n        return obj[testkey];\n      }\n    }\n  }\n\n  /**\n   * @param {string} defData\n   * @returns {import('./defs').ProjectionDefinition}\n   */\n  function projStr (defData) {\n    /** @type {import('./defs').ProjectionDefinition} */\n    var self = {};\n    var paramObj = defData.split('+').map(function (v) {\n      return v.trim();\n    }).filter(function (a) {\n      return a;\n    }).reduce(function (p, a) {\n      /** @type {Array<?>} */\n      var split = a.split('=');\n      split.push(true);\n      p[split[0].toLowerCase()] = split[1];\n      return p;\n    }, {});\n    var paramName, paramVal, paramOutname;\n    var params = {\n      proj: function (v) {\n        // 'lonlat', 'latlon' and 'latlong' are aliases of 'longlat'\n        self.projName = ['lonlat', 'latlon', 'latlong'].includes(v) ? 'longlat' : v;\n      },\n      datum: 'datumCode',\n      rf: function (v) {\n        self.rf = parseFloat(v);\n      },\n      lat_0: function (v) {\n        self.lat0 = v * D2R$1;\n      },\n      lat_1: function (v) {\n        self.lat1 = v * D2R$1;\n      },\n      lat_2: function (v) {\n        self.lat2 = v * D2R$1;\n      },\n      lat_ts: function (v) {\n        self.lat_ts = v * D2R$1;\n      },\n      lon_0: function (v) {\n        self.long0 = v * D2R$1;\n      },\n      lon_wrap: function (v) {\n        self.long_wrap = parseFloat(v) * D2R$1;\n      },\n      lon_1: function (v) {\n        self.long1 = v * D2R$1;\n      },\n      lon_2: function (v) {\n        self.long2 = v * D2R$1;\n      },\n      alpha: function (v) {\n        self.alpha = parseFloat(v) * D2R$1;\n      },\n      gamma: function (v) {\n        self.rectified_grid_angle = parseFloat(v) * D2R$1;\n      },\n      lonc: function (v) {\n        self.longc = v * D2R$1;\n      },\n      x_0: function (v) {\n        self.x0 = parseFloat(v);\n      },\n      y_0: function (v) {\n        self.y0 = parseFloat(v);\n      },\n      k_0: function (v) {\n        self.k0 = parseFloat(v);\n      },\n      k: function (v) {\n        self.k0 = parseFloat(v);\n      },\n      a: function (v) {\n        self.a = parseFloat(v);\n      },\n      b: function (v) {\n        self.b = parseFloat(v);\n      },\n      r: function (v) {\n        self.a = self.b = parseFloat(v);\n      },\n      r_a: function () {\n        self.R_A = true;\n      },\n      zone: function (v) {\n        self.zone = parseInt(v, 10);\n      },\n      south: function () {\n        self.utmSouth = true;\n      },\n      towgs84: function (v) {\n        self.datum_params = v.split(',').map(function (a) {\n          return parseFloat(a);\n        });\n      },\n      to_meter: function (v) {\n        self.to_meter = parseFloat(v);\n      },\n      units: function (v) {\n        self.units = v;\n        var unit = match(units, v);\n        if (unit) {\n          self.to_meter = unit.to_meter;\n        }\n      },\n      from_greenwich: function (v) {\n        self.from_greenwich = v * D2R$1;\n      },\n      pm: function (v) {\n        var pm = match(primeMeridian, v);\n        self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R$1;\n      },\n      nadgrids: function (v) {\n        if (v === '@null') {\n          self.datumCode = 'none';\n        } else {\n          self.nadgrids = v;\n        }\n      },\n      axis: function (v) {\n        var legalAxis = 'ewnsud';\n        if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {\n          self.axis = v;\n        }\n      },\n      approx: function () {\n        self.approx = true;\n      },\n      over: function () {\n        self.over = true;\n      }\n    };\n    for (paramName in paramObj) {\n      paramVal = paramObj[paramName];\n      if (paramName in params) {\n        paramOutname = params[paramName];\n        if (typeof paramOutname === 'function') {\n          paramOutname(paramVal);\n        } else {\n          self[paramOutname] = paramVal;\n        }\n      } else {\n        self[paramName] = paramVal;\n      }\n    }\n    if (typeof self.datumCode === 'string' && self.datumCode !== 'WGS84') {\n      self.datumCode = self.datumCode.toLowerCase();\n    }\n    self['projStr'] = defData;\n    return self;\n  }\n\n  class PROJJSONBuilderBase {\n    static getId(node) {\n      const idNode = node.find((child) => Array.isArray(child) && child[0] === 'ID');\n      if (idNode && idNode.length >= 3) {\n        return {\n          authority: idNode[1],\n          code: parseInt(idNode[2], 10),\n        };\n      }\n      return null;\n    }\n\n    static convertUnit(node, type = 'unit') {\n      if (!node || node.length < 3) {\n        return { type, name: 'unknown', conversion_factor: null };\n      }\n\n      const name = node[1];\n      const conversionFactor = parseFloat(node[2]) || null;\n\n      const idNode = node.find((child) => Array.isArray(child) && child[0] === 'ID');\n      const id = idNode\n        ? {\n          authority: idNode[1],\n          code: parseInt(idNode[2], 10),\n        }\n        : null;\n\n      return {\n        type,\n        name,\n        conversion_factor: conversionFactor,\n        id,\n      };\n    }\n\n    static convertAxis(node) {\n      const name = node[1] || 'Unknown';\n\n      // Determine the direction\n      let direction;\n      const abbreviationMatch = name.match(/^\\((.)\\)$/); // Match abbreviations like \"(E)\" or \"(N)\"\n      if (abbreviationMatch) {\n        // Use the abbreviation to determine the direction\n        const abbreviation = abbreviationMatch[1].toUpperCase();\n        if (abbreviation === 'E') direction = 'east';\n        else if (abbreviation === 'N') direction = 'north';\n        else if (abbreviation === 'U') direction = 'up';\n        else if (node[2]) direction = node[2];\n        else throw new Error(`Unknown axis abbreviation: ${abbreviation}`);\n      } else {\n        // Use the explicit direction provided in the AXIS node\n        direction = node[2] || 'unknown';\n      }\n\n      const orderNode = node.find((child) => Array.isArray(child) && child[0] === 'ORDER');\n      const order = orderNode ? parseInt(orderNode[1], 10) : null;\n\n      const unitNode = node.find(\n        (child) =>\n          Array.isArray(child) &&\n          (child[0] === 'LENGTHUNIT' || child[0] === 'ANGLEUNIT' || child[0] === 'SCALEUNIT')\n      );\n      const unit = this.convertUnit(unitNode);\n\n      return {\n        name,\n        direction, // Use the valid PROJJSON direction value\n        unit,\n        order,\n      };\n    }\n\n    static extractAxes(node) {\n      return node\n        .filter((child) => Array.isArray(child) && child[0] === 'AXIS')\n        .map((axis) => this.convertAxis(axis))\n        .sort((a, b) => (a.order || 0) - (b.order || 0)); // Sort by the \"order\" property\n    }\n\n    static convert(node, result = {}) {\n\n      switch (node[0]) {\n        case 'PROJCRS':\n          result.type = 'ProjectedCRS';\n          result.name = node[1];\n          result.base_crs = node.find((child) => Array.isArray(child) && child[0] === 'BASEGEOGCRS')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'BASEGEOGCRS'))\n            : null;\n          result.conversion = node.find((child) => Array.isArray(child) && child[0] === 'CONVERSION')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'CONVERSION'))\n            : null;\n\n          const csNode = node.find((child) => Array.isArray(child) && child[0] === 'CS');\n          if (csNode) {\n            result.coordinate_system = {\n              type: csNode[1],\n              axis: this.extractAxes(node),\n            };\n          }\n\n          const lengthUnitNode = node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT');\n          if (lengthUnitNode) {\n            const unit = this.convertUnit(lengthUnitNode);\n            result.coordinate_system.unit = unit; // Add unit to coordinate_system\n          }\n\n          result.id = this.getId(node);\n          break;\n\n        case 'BASEGEOGCRS':\n        case 'GEOGCRS':\n        case 'GEODCRS':\n          result.type = node[0] === 'GEODCRS' ? 'GeodeticCRS' : 'GeographicCRS';\n          result.name = node[1];\n        \n          // Handle DATUM or ENSEMBLE\n          const datumOrEnsembleNode = node.find(\n            (child) => Array.isArray(child) && (child[0] === 'DATUM' || child[0] === 'ENSEMBLE')\n          );\n          if (datumOrEnsembleNode) {\n            const datumOrEnsemble = this.convert(datumOrEnsembleNode);\n            if (datumOrEnsembleNode[0] === 'ENSEMBLE') {\n              result.datum_ensemble = datumOrEnsemble;\n            } else {\n              result.datum = datumOrEnsemble;\n            }\n            const primem = node.find((child) => Array.isArray(child) && child[0] === 'PRIMEM');\n            if (primem && primem[1] !== 'Greenwich') {\n              datumOrEnsemble.prime_meridian = {\n                name: primem[1],\n                longitude: parseFloat(primem[2]),\n              };\n            }\n          }\n        \n          result.coordinate_system = {\n            type: 'ellipsoidal',\n            axis: this.extractAxes(node),\n          };\n        \n          result.id = this.getId(node);\n          break;\n\n        case 'DATUM':\n          result.type = 'GeodeticReferenceFrame';\n          result.name = node[1];\n          result.ellipsoid = node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID'))\n            : null;\n          break;\n        \n        case 'ENSEMBLE':\n          result.type = 'DatumEnsemble';\n          result.name = node[1];\n        \n          // Extract ensemble members\n          result.members = node\n            .filter((child) => Array.isArray(child) && child[0] === 'MEMBER')\n            .map((member) => ({\n              type: 'DatumEnsembleMember',\n              name: member[1],\n              id: this.getId(member), // Extract ID as { authority, code }\n            }));\n        \n          // Extract accuracy\n          const accuracyNode = node.find((child) => Array.isArray(child) && child[0] === 'ENSEMBLEACCURACY');\n          if (accuracyNode) {\n            result.accuracy = parseFloat(accuracyNode[1]);\n          }\n        \n          // Extract ellipsoid\n          const ellipsoidNode = node.find((child) => Array.isArray(child) && child[0] === 'ELLIPSOID');\n          if (ellipsoidNode) {\n            result.ellipsoid = this.convert(ellipsoidNode); // Convert the ellipsoid node\n          }\n        \n          // Extract identifier for the ensemble\n          result.id = this.getId(node);\n          break;\n\n        case 'ELLIPSOID':\n          result.type = 'Ellipsoid';\n          result.name = node[1];\n          result.semi_major_axis = parseFloat(node[2]);\n          result.inverse_flattening = parseFloat(node[3]);\n          node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'LENGTHUNIT'), result)\n            : null;\n          break;\n\n        case 'CONVERSION':\n          result.type = 'Conversion';\n          result.name = node[1];\n          result.method = node.find((child) => Array.isArray(child) && child[0] === 'METHOD')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'METHOD'))\n            : null;\n          result.parameters = node\n            .filter((child) => Array.isArray(child) && child[0] === 'PARAMETER')\n            .map((param) => this.convert(param));\n          break;\n\n        case 'METHOD':\n          result.type = 'Method';\n          result.name = node[1];\n          result.id = this.getId(node);\n          break;\n\n        case 'PARAMETER':\n          result.type = 'Parameter';\n          result.name = node[1];\n          result.value = parseFloat(node[2]);\n          result.unit = this.convertUnit(\n            node.find(\n              (child) =>\n                Array.isArray(child) &&\n                (child[0] === 'LENGTHUNIT' || child[0] === 'ANGLEUNIT' || child[0] === 'SCALEUNIT')\n            )\n          );\n          result.id = this.getId(node);\n          break;\n\n        case 'BOUNDCRS':\n          result.type = 'BoundCRS';\n\n          // Process SOURCECRS\n          const sourceCrsNode = node.find((child) => Array.isArray(child) && child[0] === 'SOURCECRS');\n          if (sourceCrsNode) {\n            const sourceCrsContent = sourceCrsNode.find((child) => Array.isArray(child));\n            result.source_crs = sourceCrsContent ? this.convert(sourceCrsContent) : null;\n          }\n\n          // Process TARGETCRS\n          const targetCrsNode = node.find((child) => Array.isArray(child) && child[0] === 'TARGETCRS');\n          if (targetCrsNode) {\n            const targetCrsContent = targetCrsNode.find((child) => Array.isArray(child));\n            result.target_crs = targetCrsContent ? this.convert(targetCrsContent) : null;\n          }\n\n          // Process ABRIDGEDTRANSFORMATION\n          const transformationNode = node.find((child) => Array.isArray(child) && child[0] === 'ABRIDGEDTRANSFORMATION');\n          if (transformationNode) {\n            result.transformation = this.convert(transformationNode);\n          } else {\n            result.transformation = null;\n          }\n          break;\n\n        case 'ABRIDGEDTRANSFORMATION':\n          result.type = 'Transformation';\n          result.name = node[1];\n          result.method = node.find((child) => Array.isArray(child) && child[0] === 'METHOD')\n            ? this.convert(node.find((child) => Array.isArray(child) && child[0] === 'METHOD'))\n            : null;\n\n          result.parameters = node\n            .filter((child) => Array.isArray(child) && (child[0] === 'PARAMETER' || child[0] === 'PARAMETERFILE'))\n            .map((param) => {\n              if (param[0] === 'PARAMETER') {\n                return this.convert(param);\n              } else if (param[0] === 'PARAMETERFILE') {\n                return {\n                  name: param[1],\n                  value: param[2],\n                  id: {\n                    'authority': 'EPSG',\n                    'code': 8656\n                  }\n                };\n              }\n            });\n\n          // Adjust the Scale difference parameter if present\n          if (result.parameters.length === 7) {\n            const scaleDifference = result.parameters[6];\n            if (scaleDifference.name === 'Scale difference') {\n              scaleDifference.value = Math.round((scaleDifference.value - 1) * 1e12) / 1e6;\n            }\n          }\n\n          result.id = this.getId(node);\n          break;\n        \n        case 'AXIS':\n          if (!result.coordinate_system) {\n            result.coordinate_system = { type: 'unspecified', axis: [] };\n          }\n          result.coordinate_system.axis.push(this.convertAxis(node));\n          break;\n        \n        case 'LENGTHUNIT':\n          const unit = this.convertUnit(node, 'LinearUnit');\n          if (result.coordinate_system && result.coordinate_system.axis) {\n            result.coordinate_system.axis.forEach((axis) => {\n              if (!axis.unit) {\n                axis.unit = unit;\n              }\n            });\n          }\n          if (unit.conversion_factor && unit.conversion_factor !== 1) {\n            if (result.semi_major_axis) {\n              result.semi_major_axis = {\n                value: result.semi_major_axis,\n                unit,\n              };\n            }\n          }\n          break;\n\n        default:\n          result.keyword = node[0];\n          break;\n      }\n\n      return result;\n    }\n  }\n\n  class PROJJSONBuilder2015 extends PROJJSONBuilderBase {\n    static convert(node, result = {}) {\n      super.convert(node, result);\n\n      // Skip `CS` and `USAGE` nodes for WKT2-2015\n      if (result.coordinate_system && result.coordinate_system.subtype === 'Cartesian') {\n        delete result.coordinate_system;\n      }\n      if (result.usage) {\n        delete result.usage;\n      }\n\n      return result;\n    }\n  }\n\n  class PROJJSONBuilder2019 extends PROJJSONBuilderBase {\n    static convert(node, result = {}) {\n      super.convert(node, result);\n\n      // Handle `CS` node for WKT2-2019\n      const csNode = node.find((child) => Array.isArray(child) && child[0] === 'CS');\n      if (csNode) {\n        result.coordinate_system = {\n          subtype: csNode[1],\n          axis: this.extractAxes(node),\n        };\n      }\n\n      // Handle `USAGE` node for WKT2-2019\n      const usageNode = node.find((child) => Array.isArray(child) && child[0] === 'USAGE');\n      if (usageNode) {\n        const scope = usageNode.find((child) => Array.isArray(child) && child[0] === 'SCOPE');\n        const area = usageNode.find((child) => Array.isArray(child) && child[0] === 'AREA');\n        const bbox = usageNode.find((child) => Array.isArray(child) && child[0] === 'BBOX');\n        result.usage = {};\n        if (scope) {\n          result.usage.scope = scope[1];\n        }\n        if (area) {\n          result.usage.area = area[1];\n        }\n        if (bbox) {\n          result.usage.bbox = bbox.slice(1);\n        }\n      }\n\n      return result;\n    }\n  }\n\n  /**\n   * Detects the WKT2 version based on the structure of the WKT.\n   * @param {Array} root The root WKT array node.\n   * @returns {string} The detected version (\"2015\" or \"2019\").\n   */\n  function detectWKT2Version(root) {\n    // Check for WKT2-2019-specific nodes\n    if (root.find((child) => Array.isArray(child) && child[0] === 'USAGE')) {\n      return '2019'; // `USAGE` is specific to WKT2-2019\n    }\n\n    // Check for WKT2-2015-specific nodes\n    if (root.find((child) => Array.isArray(child) && child[0] === 'CS')) {\n      return '2015'; // `CS` is valid in both, but default to 2015 unless `USAGE` is present\n    }\n\n    if (root[0] === 'BOUNDCRS' || root[0] === 'PROJCRS' || root[0] === 'GEOGCRS') {\n      return '2015'; // These are valid in both, but default to 2015\n    }\n\n    // Default to WKT2-2015 if no specific indicators are found\n    return '2015';\n  }\n\n  /**\n   * Builds a PROJJSON object from a WKT array structure.\n   * @param {Array} root The root WKT array node.\n   * @returns {Object} The PROJJSON object.\n   */\n  function buildPROJJSON(root) {\n    const version = detectWKT2Version(root);\n    const builder = version === '2019' ? PROJJSONBuilder2019 : PROJJSONBuilder2015;\n    return builder.convert(root);\n  }\n\n  /**\n   * Detects whether the WKT string is WKT1 or WKT2.\n   * @param {string} wkt The WKT string.\n   * @returns {string} The detected version (\"WKT1\" or \"WKT2\").\n   */\n  function detectWKTVersion(wkt) {\n    // Normalize the WKT string for easier keyword matching\n    const normalizedWKT = wkt.toUpperCase();\n\n    // Check for WKT2-specific keywords\n    if (\n      normalizedWKT.includes('PROJCRS') ||\n      normalizedWKT.includes('GEOGCRS') ||\n      normalizedWKT.includes('BOUNDCRS') ||\n      normalizedWKT.includes('VERTCRS') ||\n      normalizedWKT.includes('LENGTHUNIT') ||\n      normalizedWKT.includes('ANGLEUNIT') ||\n      normalizedWKT.includes('SCALEUNIT')\n    ) {\n      return 'WKT2';\n    }\n\n    // Check for WKT1-specific keywords\n    if (\n      normalizedWKT.includes('PROJCS') ||\n      normalizedWKT.includes('GEOGCS') ||\n      normalizedWKT.includes('LOCAL_CS') ||\n      normalizedWKT.includes('VERT_CS') ||\n      normalizedWKT.includes('UNIT')\n    ) {\n      return 'WKT1';\n    }\n\n    // Default to WKT1 if no specific indicators are found\n    return 'WKT1';\n  }\n\n  var NEUTRAL = 1;\n  var KEYWORD = 2;\n  var NUMBER = 3;\n  var QUOTED = 4;\n  var AFTERQUOTE = 5;\n  var ENDED = -1;\n  var whitespace = /\\s/;\n  var latin = /[A-Za-z]/;\n  var keyword = /[A-Za-z84_]/;\n  var endThings = /[,\\]]/;\n  var digets = /[\\d\\.E\\-\\+]/;\n  // const ignoredChar = /[\\s_\\-\\/\\(\\)]/g;\n  function Parser(text) {\n    if (typeof text !== 'string') {\n      throw new Error('not a string');\n    }\n    this.text = text.trim();\n    this.level = 0;\n    this.place = 0;\n    this.root = null;\n    this.stack = [];\n    this.currentObject = null;\n    this.state = NEUTRAL;\n  }\n  Parser.prototype.readCharicter = function() {\n    var char = this.text[this.place++];\n    if (this.state !== QUOTED) {\n      while (whitespace.test(char)) {\n        if (this.place >= this.text.length) {\n          return;\n        }\n        char = this.text[this.place++];\n      }\n    }\n    switch (this.state) {\n      case NEUTRAL:\n        return this.neutral(char);\n      case KEYWORD:\n        return this.keyword(char)\n      case QUOTED:\n        return this.quoted(char);\n      case AFTERQUOTE:\n        return this.afterquote(char);\n      case NUMBER:\n        return this.number(char);\n      case ENDED:\n        return;\n    }\n  };\n  Parser.prototype.afterquote = function(char) {\n    if (char === '\"') {\n      this.word += '\"';\n      this.state = QUOTED;\n      return;\n    }\n    if (endThings.test(char)) {\n      this.word = this.word.trim();\n      this.afterItem(char);\n      return;\n    }\n    throw new Error('havn\\'t handled \"' +char + '\" in afterquote yet, index ' + this.place);\n  };\n  Parser.prototype.afterItem = function(char) {\n    if (char === ',') {\n      if (this.word !== null) {\n        this.currentObject.push(this.word);\n      }\n      this.word = null;\n      this.state = NEUTRAL;\n      return;\n    }\n    if (char === ']') {\n      this.level--;\n      if (this.word !== null) {\n        this.currentObject.push(this.word);\n        this.word = null;\n      }\n      this.state = NEUTRAL;\n      this.currentObject = this.stack.pop();\n      if (!this.currentObject) {\n        this.state = ENDED;\n      }\n\n      return;\n    }\n  };\n  Parser.prototype.number = function(char) {\n    if (digets.test(char)) {\n      this.word += char;\n      return;\n    }\n    if (endThings.test(char)) {\n      this.word = parseFloat(this.word);\n      this.afterItem(char);\n      return;\n    }\n    throw new Error('havn\\'t handled \"' +char + '\" in number yet, index ' + this.place);\n  };\n  Parser.prototype.quoted = function(char) {\n    if (char === '\"') {\n      this.state = AFTERQUOTE;\n      return;\n    }\n    this.word += char;\n    return;\n  };\n  Parser.prototype.keyword = function(char) {\n    if (keyword.test(char)) {\n      this.word += char;\n      return;\n    }\n    if (char === '[') {\n      var newObjects = [];\n      newObjects.push(this.word);\n      this.level++;\n      if (this.root === null) {\n        this.root = newObjects;\n      } else {\n        this.currentObject.push(newObjects);\n      }\n      this.stack.push(this.currentObject);\n      this.currentObject = newObjects;\n      this.state = NEUTRAL;\n      return;\n    }\n    if (endThings.test(char)) {\n      this.afterItem(char);\n      return;\n    }\n    throw new Error('havn\\'t handled \"' +char + '\" in keyword yet, index ' + this.place);\n  };\n  Parser.prototype.neutral = function(char) {\n    if (latin.test(char)) {\n      this.word = char;\n      this.state = KEYWORD;\n      return;\n    }\n    if (char === '\"') {\n      this.word = '';\n      this.state = QUOTED;\n      return;\n    }\n    if (digets.test(char)) {\n      this.word = char;\n      this.state = NUMBER;\n      return;\n    }\n    if (endThings.test(char)) {\n      this.afterItem(char);\n      return;\n    }\n    throw new Error('havn\\'t handled \"' +char + '\" in neutral yet, index ' + this.place);\n  };\n  Parser.prototype.output = function() {\n    while (this.place < this.text.length) {\n      this.readCharicter();\n    }\n    if (this.state === ENDED) {\n      return this.root;\n    }\n    throw new Error('unable to parse string \"' +this.text + '\". State is ' + this.state);\n  };\n\n  function parseString(txt) {\n    var parser = new Parser(txt);\n    return parser.output();\n  }\n\n  function mapit(obj, key, value) {\n    if (Array.isArray(key)) {\n      value.unshift(key);\n      key = null;\n    }\n    var thing = key ? {} : obj;\n\n    var out = value.reduce(function(newObj, item) {\n      sExpr(item, newObj);\n      return newObj\n    }, thing);\n    if (key) {\n      obj[key] = out;\n    }\n  }\n\n  function sExpr(v, obj) {\n    if (!Array.isArray(v)) {\n      obj[v] = true;\n      return;\n    }\n    var key = v.shift();\n    if (key === 'PARAMETER') {\n      key = v.shift();\n    }\n    if (v.length === 1) {\n      if (Array.isArray(v[0])) {\n        obj[key] = {};\n        sExpr(v[0], obj[key]);\n        return;\n      }\n      obj[key] = v[0];\n      return;\n    }\n    if (!v.length) {\n      obj[key] = true;\n      return;\n    }\n    if (key === 'TOWGS84') {\n      obj[key] = v;\n      return;\n    }\n    if (key === 'AXIS') {\n      if (!(key in obj)) {\n        obj[key] = [];\n      }\n      obj[key].push(v);\n      return;\n    }\n    if (!Array.isArray(key)) {\n      obj[key] = {};\n    }\n\n    var i;\n    switch (key) {\n      case 'UNIT':\n      case 'PRIMEM':\n      case 'VERT_DATUM':\n        obj[key] = {\n          name: v[0].toLowerCase(),\n          convert: v[1]\n        };\n        if (v.length === 3) {\n          sExpr(v[2], obj[key]);\n        }\n        return;\n      case 'SPHEROID':\n      case 'ELLIPSOID':\n        obj[key] = {\n          name: v[0],\n          a: v[1],\n          rf: v[2]\n        };\n        if (v.length === 4) {\n          sExpr(v[3], obj[key]);\n        }\n        return;\n      case 'EDATUM':\n      case 'ENGINEERINGDATUM':\n      case 'LOCAL_DATUM':\n      case 'DATUM':\n      case 'VERT_CS':\n      case 'VERTCRS':\n      case 'VERTICALCRS':\n        v[0] = ['name', v[0]];\n        mapit(obj, key, v);\n        return;\n      case 'COMPD_CS':\n      case 'COMPOUNDCRS':\n      case 'FITTED_CS':\n      // the followings are the crs defined in\n      // https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11\n      case 'PROJECTEDCRS':\n      case 'PROJCRS':\n      case 'GEOGCS':\n      case 'GEOCCS':\n      case 'PROJCS':\n      case 'LOCAL_CS':\n      case 'GEODCRS':\n      case 'GEODETICCRS':\n      case 'GEODETICDATUM':\n      case 'ENGCRS':\n      case 'ENGINEERINGCRS':\n        v[0] = ['name', v[0]];\n        mapit(obj, key, v);\n        obj[key].type = key;\n        return;\n      default:\n        i = -1;\n        while (++i < v.length) {\n          if (!Array.isArray(v[i])) {\n            return sExpr(v, obj[key]);\n          }\n        }\n        return mapit(obj, key, v);\n    }\n  }\n\n  var D2R = 0.01745329251994329577;\n\n  function d2r(input) {\n    return input * D2R;\n  }\n\n  function applyProjectionDefaults(wkt) {\n    // Normalize projName for WKT2 compatibility\n    const normalizedProjName = (wkt.projName || '').toLowerCase().replace(/_/g, ' ');\n\n    if (wkt.long0 === undefined && wkt.longc !== undefined) {\n      wkt.long0 = wkt.longc; // keep in the projection's native prime meridian frame\n    }\n    if (!wkt.lat_ts && wkt.lat1 && (normalizedProjName === 'stereographic south pole' || normalizedProjName === 'polar stereographic (variant b)')) {\n      wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);\n      wkt.lat_ts = wkt.lat1;\n      delete wkt.lat1;\n    } else if (!wkt.lat_ts && wkt.lat0 && (normalizedProjName === 'polar stereographic' || normalizedProjName === 'polar stereographic (variant a)')) {\n      wkt.lat_ts = wkt.lat0;\n      wkt.lat0 = d2r(wkt.lat0 > 0 ? 90 : -90);\n      delete wkt.lat1;\n    }\n  }\n\n  // Helper function to process units and to_meter\n  function processUnit(unit) {\n    let result = { units: null, to_meter: undefined };\n\n    if (typeof unit === 'string') {\n      result.units = unit.toLowerCase();\n      if (result.units === 'metre') {\n        result.units = 'meter'; // Normalize 'metre' to 'meter'\n      }\n      if (result.units === 'meter') {\n        result.to_meter = 1; // Only set to_meter if units are 'meter'\n      }\n    } else if (unit && unit.name) {\n      result.units = unit.name.toLowerCase();\n      if (result.units === 'metre') {\n        result.units = 'meter'; // Normalize 'metre' to 'meter'\n      }\n      result.to_meter = unit.conversion_factor;\n    }\n\n    return result;\n  }\n\n  function toValue(valueOrObject) {\n    if (typeof valueOrObject === 'object') {\n      return valueOrObject.value * valueOrObject.unit.conversion_factor;\n    }\n    return valueOrObject;\n  }\n\n  function calculateEllipsoid(value, result) {\n    if (value.ellipsoid.radius) {\n      result.a = value.ellipsoid.radius;\n      result.rf = 0;\n    } else {\n      result.a = toValue(value.ellipsoid.semi_major_axis);\n      if (value.ellipsoid.inverse_flattening !== undefined) {\n        result.rf = value.ellipsoid.inverse_flattening;\n      } else if (value.ellipsoid.semi_major_axis !== undefined && value.ellipsoid.semi_minor_axis !== undefined) {\n        result.rf = result.a / (result.a - toValue(value.ellipsoid.semi_minor_axis));\n      }\n    }\n  }\n\n  function transformPROJJSON(projjson, result = {}) {\n    if (!projjson || typeof projjson !== 'object') {\n      return projjson; // Return primitive values as-is\n    }\n\n    if (projjson.type === 'BoundCRS') {\n      transformPROJJSON(projjson.source_crs, result);\n\n      if (projjson.transformation) {\n        if (projjson.transformation.method && projjson.transformation.method.name === 'NTv2') {\n          // Set nadgrids to the filename from the parameterfile\n          result.nadgrids = projjson.transformation.parameters[0].value;\n        } else {\n          // Populate datum_params if no parameterfile is found\n          result.datum_params = projjson.transformation.parameters.map((param) => param.value);\n        }\n      }\n      return result; // Return early for BoundCRS\n    }\n\n    // Handle specific keys in PROJJSON\n    Object.keys(projjson).forEach((key) => {\n      const value = projjson[key];\n      if (value === null) {\n        return;\n      }\n\n      switch (key) {\n        case 'name':\n          if (result.srsCode) {\n            break;\n          }\n          result.name = value;\n          result.srsCode = value; // Map `name` to `srsCode`\n          break;\n\n        case 'type':\n          if (value === 'GeographicCRS') {\n            result.projName = 'longlat';\n          } else if (value === 'GeodeticCRS') {\n            if (projjson.coordinate_system && projjson.coordinate_system.subtype === 'Cartesian') {\n              result.projName = 'geocent';\n            } else {\n              result.projName = 'longlat';\n            }\n          } else if (value === 'ProjectedCRS' && projjson.conversion && projjson.conversion.method) {\n            result.projName = projjson.conversion.method.name; // Retain original capitalization\n          }\n          break;\n\n        case 'datum':\n        case 'datum_ensemble': // Handle both datum and ensemble\n          if (value.ellipsoid) {\n            // Extract ellipsoid properties\n            result.ellps = value.ellipsoid.name;\n            calculateEllipsoid(value, result);\n          }\n          if (value.prime_meridian) {\n            result.from_greenwich = value.prime_meridian.longitude * Math.PI / 180; // Convert to radians\n          }\n          break;\n\n        case 'ellipsoid':\n          result.ellps = value.name;\n          calculateEllipsoid(value, result);\n          break;\n\n        case 'prime_meridian':\n          result.long0 = (value.longitude || 0) * Math.PI / 180; // Convert to radians\n          break;\n\n        case 'coordinate_system':\n          if (value.axis) {\n            const directionMap = {\n              'east': 'e',\n              'north': 'n',\n              'west': 'w',\n              'south': 's',\n              'up': 'u',\n              'down': 'd',\n              'geocentricx': 'e',\n              'geocentricy': 'n',\n              'geocentricz': 'u',\n            };\n            const mapped = value.axis.map((axis) => directionMap[axis.direction.toLowerCase()]);\n            if (mapped.every(Boolean)) {\n              result.axis = mapped.join('');\n              if (result.axis.length === 2) {\n                result.axis += 'u';\n              }\n            }\n\n            if (value.unit) {\n              const { units, to_meter } = processUnit(value.unit);\n              result.units = units;\n              result.to_meter = to_meter;\n            } else if (value.axis[0] && value.axis[0].unit) {\n              const { units, to_meter } = processUnit(value.axis[0].unit);\n              result.units = units;\n              result.to_meter = to_meter;\n            }\n          }\n          break;\n          \n        case 'id':\n          if (value.authority && value.code) {\n            result.title = value.authority + ':' + value.code;\n          }\n          break;\n\n        case 'conversion':\n          if (value.method && value.method.name) {\n            result.projName = value.method.name; // Retain original capitalization\n          }\n          if (value.parameters) {\n            value.parameters.forEach((param) => {\n              const paramName = param.name.toLowerCase().replace(/\\s+/g, '_');\n              const paramValue = param.value;\n              if (param.unit && param.unit.conversion_factor) {\n                result[paramName] = paramValue * param.unit.conversion_factor; // Convert to radians or meters\n              } else if (param.unit === 'degree') {\n                result[paramName] = paramValue * Math.PI / 180; // Convert to radians\n              } else {\n                result[paramName] = paramValue;\n              }\n            });\n          }\n          break;\n\n        case 'unit':\n          if (value.name) {\n            result.units = value.name.toLowerCase();\n            if (result.units === 'metre') {\n              result.units = 'meter';\n            }\n          }\n          if (value.conversion_factor) {\n            result.to_meter = value.conversion_factor;\n          }\n          break;\n\n        case 'base_crs':\n          transformPROJJSON(value, result); // Pass `result` directly\n          result.datumCode = value.id ? value.id.authority + '_' + value.id.code : value.name; // Set datumCode\n          break;\n      }\n    });\n\n    // Additional calculated properties\n    if (result.latitude_of_false_origin !== undefined) {\n      result.lat0 = result.latitude_of_false_origin; // Already in radians\n    }\n    if (result.longitude_of_false_origin !== undefined) {\n      result.long0 = result.longitude_of_false_origin;\n    }\n    if (result.latitude_of_standard_parallel !== undefined) {\n      result.lat0 = result.latitude_of_standard_parallel;\n      result.lat1 = result.latitude_of_standard_parallel;\n    }\n    if (result.latitude_of_1st_standard_parallel !== undefined) {\n      result.lat1 = result.latitude_of_1st_standard_parallel;\n    }\n    if (result.latitude_of_2nd_standard_parallel !== undefined) {\n      result.lat2 = result.latitude_of_2nd_standard_parallel; \n    }\n    if (result.latitude_of_projection_centre !== undefined) {\n      result.lat0 = result.latitude_of_projection_centre;\n    }\n    if (result.longitude_of_projection_centre !== undefined) {\n      result.longc = result.longitude_of_projection_centre;\n    }\n    if (result.easting_at_false_origin !== undefined) {\n      result.x0 = result.easting_at_false_origin;\n    }\n    if (result.northing_at_false_origin !== undefined) {\n      result.y0 = result.northing_at_false_origin;\n    }\n    if (result.latitude_of_natural_origin !== undefined) {\n      result.lat0 = result.latitude_of_natural_origin;\n    }\n    if (result.longitude_of_natural_origin !== undefined) {\n      result.long0 = result.longitude_of_natural_origin;\n    }\n    if (result.longitude_of_origin !== undefined) {\n      result.long0 = result.longitude_of_origin;\n    }\n    if (result.false_easting !== undefined) {\n      result.x0 = result.false_easting;\n    }\n    if (result.easting_at_projection_centre) {\n      result.x0 = result.easting_at_projection_centre;\n    }\n    if (result.false_northing !== undefined) {\n      result.y0 = result.false_northing;\n    }\n    if (result.northing_at_projection_centre) {\n      result.y0 = result.northing_at_projection_centre;\n    }\n    if (result.standard_parallel_1 !== undefined) {\n      result.lat1 = result.standard_parallel_1;\n    }\n    if (result.standard_parallel_2 !== undefined) {\n      result.lat2 = result.standard_parallel_2;\n    }\n    if (result.scale_factor_at_natural_origin !== undefined) {\n      result.k0 = result.scale_factor_at_natural_origin;\n    }\n    if (result.scale_factor_at_projection_centre !== undefined) {\n      result.k0 = result.scale_factor_at_projection_centre;\n    }\n    if (result.scale_factor_on_pseudo_standard_parallel !== undefined) {  \n      result.k0 = result.scale_factor_on_pseudo_standard_parallel;\n    }\n    if (result.azimuth !== undefined) {\n      result.alpha = result.azimuth;\n    }\n    if (result.azimuth_at_projection_centre !== undefined) {\n      result.alpha = result.azimuth_at_projection_centre;\n    }\n    if (result.angle_from_rectified_to_skew_grid) {\n      result.rectified_grid_angle = result.angle_from_rectified_to_skew_grid;\n    }\n\n    // Apply projection defaults\n    applyProjectionDefaults(result);\n\n    return result;\n  }\n\n  var knownTypes = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS', 'GEOCCS', 'PROJCS', 'LOCAL_CS', 'GEODCRS',\n    'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];\n\n  function rename(obj, params) {\n    var outName = params[0];\n    var inName = params[1];\n    if (!(outName in obj) && (inName in obj)) {\n      obj[outName] = obj[inName];\n      if (params.length === 3) {\n        obj[outName] = params[2](obj[outName]);\n      }\n    }\n  }\n\n  function cleanWKT(wkt) {\n    var keys = Object.keys(wkt);\n    for (var i = 0, ii = keys.length; i <ii; ++i) {\n      var key = keys[i];\n      // the followings are the crs defined in\n      // https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11\n      if (knownTypes.indexOf(key) !== -1) {\n        setPropertiesFromWkt(wkt[key]);\n      }\n      if (typeof wkt[key] === 'object') {\n        cleanWKT(wkt[key]);\n      }\n    }\n  }\n\n  function setPropertiesFromWkt(wkt) {\n    if (wkt.AUTHORITY) {\n      var authority = Object.keys(wkt.AUTHORITY)[0];\n      if (authority && authority in wkt.AUTHORITY) {\n        wkt.title = authority + ':' + wkt.AUTHORITY[authority];\n      }\n    }\n    if (wkt.type === 'GEOGCS') {\n      wkt.projName = 'longlat';\n    } else if (wkt.type === 'LOCAL_CS') {\n      wkt.projName = 'identity';\n      wkt.local = true;\n    } else {\n      if (typeof wkt.PROJECTION === 'object') {\n        wkt.projName = Object.keys(wkt.PROJECTION)[0];\n      } else {\n        wkt.projName = wkt.PROJECTION;\n      }\n    }\n    if (wkt.AXIS) {\n      var axisOrder = '';\n      for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) {\n        var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()];\n        if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) {\n          axisOrder += 'n';\n        } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) {\n          axisOrder += 's';\n        } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) {\n          axisOrder += 'e';\n        } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) {\n          axisOrder += 'w';\n        }\n      }\n      if (axisOrder.length === 2) {\n        axisOrder += 'u';\n      }\n      if (axisOrder.length === 3) {\n        wkt.axis = axisOrder;\n      }\n    }\n    if (wkt.UNIT) {\n      wkt.units = wkt.UNIT.name.toLowerCase();\n      if (wkt.units === 'metre') {\n        wkt.units = 'meter';\n      }\n      if (wkt.UNIT.convert) {\n        if (wkt.type === 'GEOGCS') {\n          if (wkt.DATUM && wkt.DATUM.SPHEROID) {\n            wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;\n          }\n        } else {\n          wkt.to_meter = wkt.UNIT.convert;\n        }\n      }\n    }\n    var geogcs = wkt.GEOGCS;\n    if (wkt.type === 'GEOGCS') {\n      geogcs = wkt;\n    }\n    if (geogcs) {\n      if (geogcs.PRIMEM && geogcs.PRIMEM.convert) {\n        wkt.from_greenwich = d2r(geogcs.PRIMEM.convert);\n      }\n      if (geogcs.DATUM) {\n        wkt.datumCode = geogcs.DATUM.name.toLowerCase();\n      } else {\n        wkt.datumCode = geogcs.name.toLowerCase();\n      }\n      if (wkt.datumCode.slice(0, 2) === 'd_') {\n        wkt.datumCode = wkt.datumCode.slice(2);\n      }\n      if (wkt.datumCode === 'new_zealand_1949') {\n        wkt.datumCode = 'nzgd49';\n      }\n      if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {\n        if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {\n          wkt.sphere = true;\n        }\n        wkt.datumCode = 'wgs84';\n      }\n      if (wkt.datumCode === 'belge_1972') {\n        wkt.datumCode = 'rnb72';\n      }\n      if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {\n        wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\\_18/, 'clrk');\n        if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {\n          wkt.ellps = 'intl';\n        }\n\n        wkt.a = geogcs.DATUM.SPHEROID.a;\n        wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf);\n      }\n\n      if (geogcs.DATUM && geogcs.DATUM.TOWGS84) {\n        wkt.datum_params = geogcs.DATUM.TOWGS84;\n      }\n      if (~wkt.datumCode.indexOf('osgb_1936')) {\n        wkt.datumCode = 'osgb36';\n      }\n      if (~wkt.datumCode.indexOf('osni_1952')) {\n        wkt.datumCode = 'osni52';\n      }\n      if (~wkt.datumCode.indexOf('tm65')\n        || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) {\n        wkt.datumCode = 'ire65';\n      }\n      if (wkt.datumCode === 'ch1903+') {\n        wkt.datumCode = 'ch1903';\n      }\n      if (~wkt.datumCode.indexOf('israel')) {\n        wkt.datumCode = 'isr93';\n      }\n    }\n    if (wkt.b && !isFinite(wkt.b)) {\n      wkt.b = wkt.a;\n    }\n    if (wkt.rectified_grid_angle) {\n      wkt.rectified_grid_angle = d2r(wkt.rectified_grid_angle);\n    }\n\n    function toMeter(input) {\n      var ratio = wkt.to_meter || 1;\n      return input * ratio;\n    }\n    var renamer = function(a) {\n      return rename(wkt, a);\n    };\n    var list = [\n      ['standard_parallel_1', 'Standard_Parallel_1'],\n      ['standard_parallel_1', 'Latitude of 1st standard parallel'],\n      ['standard_parallel_2', 'Standard_Parallel_2'],\n      ['standard_parallel_2', 'Latitude of 2nd standard parallel'],\n      ['false_easting', 'False_Easting'],\n      ['false_easting', 'False easting'],\n      ['false-easting', 'Easting at false origin'],\n      ['false_northing', 'False_Northing'],\n      ['false_northing', 'False northing'],\n      ['false_northing', 'Northing at false origin'],\n      ['central_meridian', 'Central_Meridian'],\n      ['central_meridian', 'Longitude of natural origin'],\n      ['central_meridian', 'Longitude of false origin'],\n      ['latitude_of_origin', 'Latitude_Of_Origin'],\n      ['latitude_of_origin', 'Central_Parallel'],\n      ['latitude_of_origin', 'Latitude of natural origin'],\n      ['latitude_of_origin', 'Latitude of false origin'],\n      ['scale_factor', 'Scale_Factor'],\n      ['k0', 'scale_factor'],\n      ['latitude_of_center', 'Latitude_Of_Center'],\n      ['latitude_of_center', 'Latitude_of_center'],\n      ['lat0', 'latitude_of_center', d2r],\n      ['longitude_of_center', 'Longitude_Of_Center'],\n      ['longitude_of_center', 'Longitude_of_center'],\n      ['longc', 'longitude_of_center', d2r],\n      ['x0', 'false_easting', toMeter],\n      ['y0', 'false_northing', toMeter],\n      ['long0', 'central_meridian', d2r],\n      ['lat0', 'latitude_of_origin', d2r],\n      ['lat0', 'standard_parallel_1', d2r],\n      ['lat1', 'standard_parallel_1', d2r],\n      ['lat2', 'standard_parallel_2', d2r],\n      ['azimuth', 'Azimuth'],\n      ['alpha', 'azimuth', d2r],\n      ['srsCode', 'name']\n    ];\n    list.forEach(renamer);\n    applyProjectionDefaults(wkt);\n  }\n  function wkt(wkt) {\n    if (typeof wkt === 'object') {\n      return transformPROJJSON(wkt);\n    }\n    const version = detectWKTVersion(wkt);\n    var lisp = parseString(wkt);\n    if (version === 'WKT2') {\n      const projjson = buildPROJJSON(lisp);\n      return transformPROJJSON(projjson);\n    }\n    var type = lisp[0];\n    var obj = {};\n    sExpr(lisp, obj);\n    cleanWKT(obj);\n    return obj[type];\n  }\n\n  /**\n   * @typedef {Object} ProjectionDefinition\n   * @property {string} title\n   * @property {string} [projName]\n   * @property {string} [ellps]\n   * @property {import('./Proj.js').DatumDefinition} [datum]\n   * @property {string} [datumName]\n   * @property {number} [rf]\n   * @property {number} [lat0]\n   * @property {number} [lat1]\n   * @property {number} [lat2]\n   * @property {number} [lat_ts]\n   * @property {number} [long0]\n   * @property {number} [long1]\n   * @property {number} [long2]\n   * @property {number} [long_wrap]\n   * @property {number} [alpha]\n   * @property {number} [longc]\n   * @property {number} [x0]\n   * @property {number} [y0]\n   * @property {number} [k0]\n   * @property {number} [a]\n   * @property {number} [b]\n   * @property {true} [R_A]\n   * @property {number} [zone]\n   * @property {true} [utmSouth]\n   * @property {string|Array<number>} [datum_params]\n   * @property {number} [to_meter]\n   * @property {string} [units]\n   * @property {number} [from_greenwich]\n   * @property {string} [datumCode]\n   * @property {string} [nadgrids]\n   * @property {string} [axis]\n   * @property {boolean} [sphere]\n   * @property {number} [rectified_grid_angle]\n   * @property {boolean} [approx]\n   * @property {boolean} [over]\n   * @property {string} [projStr]\n   * @property {<T extends import('./core').TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} inverse\n   * @property {<T extends import('./core').TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} forward\n   */\n\n  /**\n   * @overload\n   * @param {string} name\n   * @param {string|ProjectionDefinition|import('./core.js').PROJJSONDefinition} projection\n   * @returns {void}\n   */\n  /**\n   * @overload\n   * @param {Array<[string, string]>} name\n   * @returns {Array<ProjectionDefinition|undefined>}\n   */\n  /**\n   * @overload\n   * @param {string} name\n   * @returns {ProjectionDefinition}\n   */\n\n  /**\n   * @param {string | Array<Array<string>> | Partial<Record<'EPSG'|'ESRI'|'IAU2000', ProjectionDefinition>>} name\n   * @returns {ProjectionDefinition | Array<ProjectionDefinition|undefined> | void}\n   */\n  function defs(name) {\n    /* global console */\n    var that = this;\n    if (arguments.length === 2) {\n      var def = arguments[1];\n      if (typeof def === 'string') {\n        if (def.charAt(0) === '+') {\n          defs[/** @type {string} */ (name)] = projStr(arguments[1]);\n        } else {\n          defs[/** @type {string} */ (name)] = wkt(arguments[1]);\n        }\n      } else if (def && typeof def === 'object' && !('projName' in def)) {\n        // PROJJSON\n        defs[/** @type {string} */ (name)] = wkt(arguments[1]);\n      } else {\n        defs[/** @type {string} */ (name)] = def;\n        if (!def) {\n          delete defs[/** @type {string} */ (name)];\n        }\n      }\n    } else if (arguments.length === 1) {\n      if (Array.isArray(name)) {\n        return name.map(function (v) {\n          if (Array.isArray(v)) {\n            return defs.apply(that, v);\n          } else {\n            return defs(v);\n          }\n        });\n      } else if (typeof name === 'string') {\n        if (name in defs) {\n          return defs[name];\n        }\n      } else if ('EPSG' in name) {\n        defs['EPSG:' + name.EPSG] = name;\n      } else if ('ESRI' in name) {\n        defs['ESRI:' + name.ESRI] = name;\n      } else if ('IAU2000' in name) {\n        defs['IAU2000:' + name.IAU2000] = name;\n      } else {\n        console.log(name);\n      }\n      return;\n    }\n  }\n  globals(defs);\n\n  function testObj(code) {\n    return typeof code === 'string';\n  }\n  function testDef(code) {\n    return code in defs;\n  }\n  function testWKT(code) {\n    return (code.indexOf('+') !== 0 && code.indexOf('[') !== -1) || (typeof code === 'object' && !('srsCode' in code));\n  }\n  var codes = ['3857', '900913', '3785', '102113'];\n  function checkMercator(item) {\n    if (item.title) {\n      return item.title.toLowerCase().indexOf('epsg:') === 0 && codes.indexOf(item.title.substr(5)) > -1;\n    }\n    var auth = match(item, 'authority');\n    if (!auth) {\n      return;\n    }\n    var code = match(auth, 'epsg');\n    return code && codes.indexOf(code) > -1;\n  }\n  function checkProjStr(item) {\n    var ext = match(item, 'extension');\n    if (!ext) {\n      return;\n    }\n    return match(ext, 'proj4');\n  }\n  function testProj(code) {\n    return code[0] === '+';\n  }\n  /**\n   * @param {string | import('./core').PROJJSONDefinition | import('./defs').ProjectionDefinition} code\n   * @returns {import('./defs').ProjectionDefinition}\n   */\n  function parse(code) {\n    let out;\n    if (testObj(code)) {\n      // check to see if this is a WKT string\n      if (testDef(code)) {\n        out = defs[code];\n      } else if (testWKT(code)) {\n        out = wkt(code);\n        var maybeProjStr = checkProjStr(out);\n        if (maybeProjStr) {\n          out = projStr(maybeProjStr);\n        }\n      } else if (testProj(code)) {\n        out = projStr(code);\n      }\n    } else if (!('projName' in code)) {\n      out = wkt(code);\n    } else {\n      out = code;\n    }\n    // test for special Web Mercator case, due to this being a very common and often malformed\n    return out && checkMercator(out) ? defs['EPSG:3857'] : out;\n  }\n\n  function extend (destination, source) {\n    destination = destination || {};\n    var value, property;\n    if (!source) {\n      return destination;\n    }\n    for (property in source) {\n      value = source[property];\n      if (value !== undefined) {\n        destination[property] = value;\n      }\n    }\n    return destination;\n  }\n\n  function msfnz (eccent, sinphi, cosphi) {\n    var con = eccent * sinphi;\n    return cosphi / (Math.sqrt(1 - con * con));\n  }\n\n  function sign (x) {\n    return x < 0 ? -1 : 1;\n  }\n\n  function adjust_lon (x, skipAdjust) {\n    if (skipAdjust) {\n      return x;\n    }\n    return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI));\n  }\n\n  function tsfnz (eccent, phi, sinphi) {\n    var con = eccent * sinphi;\n    var com = 0.5 * eccent;\n    con = Math.pow(((1 - con) / (1 + con)), com);\n    return (Math.tan(0.5 * (HALF_PI - phi)) / con);\n  }\n\n  function phi2z (eccent, ts) {\n    var eccnth = 0.5 * eccent;\n    var con, dphi;\n    var phi = HALF_PI - 2 * Math.atan(ts);\n    for (var i = 0; i <= 15; i++) {\n      con = eccent * Math.sin(phi);\n      dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi;\n      phi += dphi;\n      if (Math.abs(dphi) <= 0.0000000001) {\n        return phi;\n      }\n    }\n    // console.log(\"phi2z has NoConvergence\");\n    return -9999;\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {number} e\n   * @property {number} k\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$z() {\n    var con = this.b / this.a;\n    this.es = 1 - con * con;\n    if (!('x0' in this)) {\n      this.x0 = 0;\n    }\n    if (!('y0' in this)) {\n      this.y0 = 0;\n    }\n    this.long0 = this.long0 || 0;\n    this.e = Math.sqrt(this.es);\n    if (this.lat_ts) {\n      if (this.sphere) {\n        this.k0 = Math.cos(this.lat_ts);\n      } else {\n        this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n      }\n    } else {\n      if (!this.k0) {\n        if (this.k) {\n          this.k0 = this.k;\n        } else {\n          this.k0 = 1;\n        }\n      }\n    }\n  }\n\n  /* Mercator forward equations--mapping lat,long to x,y\n    -------------------------------------------------- */\n\n  function forward$x(p) {\n    var lon = p.x;\n    var lat = p.y;\n    // convert to radians\n    if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) {\n      return null;\n    }\n\n    var x, y;\n    if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) {\n      return null;\n    } else {\n      if (this.sphere) {\n        x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0, this.over);\n        y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat));\n      } else {\n        var sinphi = Math.sin(lat);\n        var ts = tsfnz(this.e, lat, sinphi);\n        x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0, this.over);\n        y = this.y0 - this.a * this.k0 * Math.log(ts);\n      }\n      p.x = x;\n      p.y = y;\n      return p;\n    }\n  }\n\n  /* Mercator inverse equations--mapping x,y to lat/long\n    -------------------------------------------------- */\n  function inverse$x(p) {\n    var x = p.x - this.x0;\n    var y = p.y - this.y0;\n    var lon, lat;\n\n    if (this.sphere) {\n      lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0)));\n    } else {\n      var ts = Math.exp(-y / (this.a * this.k0));\n      lat = phi2z(this.e, ts);\n      if (lat === -9999) {\n        return null;\n      }\n    }\n    lon = adjust_lon(this.long0 + x / (this.a * this.k0), this.over);\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$z = ['Mercator', 'Popular Visualisation Pseudo Mercator', 'Mercator_1SP', 'Mercator_Auxiliary_Sphere', 'Mercator_Variant_A', 'merc'];\n  var merc = {\n    init: init$z,\n    forward: forward$x,\n    inverse: inverse$x,\n    names: names$z\n  };\n\n  function init$y() {\n    // no-op for longlat\n  }\n\n  function identity(pt) {\n    return pt;\n  }\n  var names$y = ['longlat', 'identity', 'lonlat', 'latlon', 'latlong'];\n  var longlat = {\n    init: init$y,\n    forward: identity,\n    inverse: identity,\n    names: names$y\n  };\n\n  /** @type {Array<Partial<import('./Proj').default>>} */\n  var projs = [merc, longlat];\n  var names$x = {};\n  var projStore = [];\n\n  /**\n   * @param {import('./Proj').default} proj\n   * @param {number} i\n   */\n  function add(proj, i) {\n    var len = projStore.length;\n    if (!proj.names) {\n      console.log(i);\n      return true;\n    }\n    projStore[len] = proj;\n    proj.names.forEach(function (n) {\n      names$x[n.toLowerCase()] = len;\n    });\n    return this;\n  }\n\n  function getNormalizedProjName(n) {\n    return n.replace(/[-\\(\\)\\s]+/g, ' ').trim().replace(/ /g, '_');\n  }\n\n  /**\n   * Get a projection by name.\n   * @param {string} name\n   * @returns {import('./Proj').default|false}\n   */\n  function get(name) {\n    if (!name) {\n      return false;\n    }\n    var n = name.toLowerCase();\n    if (typeof names$x[n] !== 'undefined' && projStore[names$x[n]]) {\n      return projStore[names$x[n]];\n    }\n    n = getNormalizedProjName(n);\n    if (n in names$x && projStore[names$x[n]]) {\n      return projStore[names$x[n]];\n    }\n  }\n\n  function start() {\n    projs.forEach(add);\n  }\n  var projections = {\n    start: start,\n    add: add,\n    get: get\n  };\n\n  var ellipsoids = {\n    MERIT: {\n      a: 6378137,\n      rf: 298.257,\n      ellipseName: 'MERIT 1983'\n    },\n    SGS85: {\n      a: 6378136,\n      rf: 298.257,\n      ellipseName: 'Soviet Geodetic System 85'\n    },\n    GRS80: {\n      a: 6378137,\n      rf: 298.257222101,\n      ellipseName: 'GRS 1980(IUGG, 1980)'\n    },\n    IAU76: {\n      a: 6378140,\n      rf: 298.257,\n      ellipseName: 'IAU 1976'\n    },\n    airy: {\n      a: 6377563.396,\n      b: 6356256.91,\n      ellipseName: 'Airy 1830'\n    },\n    APL4: {\n      a: 6378137,\n      rf: 298.25,\n      ellipseName: 'Appl. Physics. 1965'\n    },\n    NWL9D: {\n      a: 6378145,\n      rf: 298.25,\n      ellipseName: 'Naval Weapons Lab., 1965'\n    },\n    mod_airy: {\n      a: 6377340.189,\n      b: 6356034.446,\n      ellipseName: 'Modified Airy'\n    },\n    andrae: {\n      a: 6377104.43,\n      rf: 300,\n      ellipseName: 'Andrae 1876 (Den., Iclnd.)'\n    },\n    aust_SA: {\n      a: 6378160,\n      rf: 298.25,\n      ellipseName: 'Australian Natl & S. Amer. 1969'\n    },\n    GRS67: {\n      a: 6378160,\n      rf: 298.247167427,\n      ellipseName: 'GRS 67(IUGG 1967)'\n    },\n    bessel: {\n      a: 6377397.155,\n      rf: 299.1528128,\n      ellipseName: 'Bessel 1841'\n    },\n    bess_nam: {\n      a: 6377483.865,\n      rf: 299.1528128,\n      ellipseName: 'Bessel 1841 (Namibia)'\n    },\n    clrk66: {\n      a: 6378206.4,\n      b: 6356583.8,\n      ellipseName: 'Clarke 1866'\n    },\n    clrk80: {\n      a: 6378249.145,\n      rf: 293.4663,\n      ellipseName: 'Clarke 1880 mod.'\n    },\n    clrk80ign: {\n      a: 6378249.2,\n      b: 6356515,\n      rf: 293.4660213,\n      ellipseName: 'Clarke 1880 (IGN)'\n    },\n    clrk58: {\n      a: 6378293.645208759,\n      rf: 294.2606763692654,\n      ellipseName: 'Clarke 1858'\n    },\n    CPM: {\n      a: 6375738.7,\n      rf: 334.29,\n      ellipseName: 'Comm. des Poids et Mesures 1799'\n    },\n    delmbr: {\n      a: 6376428,\n      rf: 311.5,\n      ellipseName: 'Delambre 1810 (Belgium)'\n    },\n    engelis: {\n      a: 6378136.05,\n      rf: 298.2566,\n      ellipseName: 'Engelis 1985'\n    },\n    evrst30: {\n      a: 6377276.345,\n      rf: 300.8017,\n      ellipseName: 'Everest 1830'\n    },\n    evrst48: {\n      a: 6377304.063,\n      rf: 300.8017,\n      ellipseName: 'Everest 1948'\n    },\n    evrst56: {\n      a: 6377301.243,\n      rf: 300.8017,\n      ellipseName: 'Everest 1956'\n    },\n    evrst69: {\n      a: 6377295.664,\n      rf: 300.8017,\n      ellipseName: 'Everest 1969'\n    },\n    evrstSS: {\n      a: 6377298.556,\n      rf: 300.8017,\n      ellipseName: 'Everest (Sabah & Sarawak)'\n    },\n    fschr60: {\n      a: 6378166,\n      rf: 298.3,\n      ellipseName: 'Fischer (Mercury Datum) 1960'\n    },\n    fschr60m: {\n      a: 6378155,\n      rf: 298.3,\n      ellipseName: 'Fischer 1960'\n    },\n    fschr68: {\n      a: 6378150,\n      rf: 298.3,\n      ellipseName: 'Fischer 1968'\n    },\n    helmert: {\n      a: 6378200,\n      rf: 298.3,\n      ellipseName: 'Helmert 1906'\n    },\n    hough: {\n      a: 6378270,\n      rf: 297,\n      ellipseName: 'Hough'\n    },\n    intl: {\n      a: 6378388,\n      rf: 297,\n      ellipseName: 'International 1909 (Hayford)'\n    },\n    kaula: {\n      a: 6378163,\n      rf: 298.24,\n      ellipseName: 'Kaula 1961'\n    },\n    lerch: {\n      a: 6378139,\n      rf: 298.257,\n      ellipseName: 'Lerch 1979'\n    },\n    mprts: {\n      a: 6397300,\n      rf: 191,\n      ellipseName: 'Maupertius 1738'\n    },\n    new_intl: {\n      a: 6378157.5,\n      b: 6356772.2,\n      ellipseName: 'New International 1967'\n    },\n    plessis: {\n      a: 6376523,\n      b: 6355863,\n      ellipseName: 'Plessis 1817 (France)'\n    },\n    krass: {\n      a: 6378245,\n      rf: 298.3,\n      ellipseName: 'Krassovsky, 1942'\n    },\n    SEasia: {\n      a: 6378155,\n      b: 6356773.3205,\n      ellipseName: 'Southeast Asia'\n    },\n    walbeck: {\n      a: 6376896,\n      b: 6355834.8467,\n      ellipseName: 'Walbeck'\n    },\n    WGS60: {\n      a: 6378165,\n      rf: 298.3,\n      ellipseName: 'WGS 60'\n    },\n    WGS66: {\n      a: 6378145,\n      rf: 298.25,\n      ellipseName: 'WGS 66'\n    },\n    WGS7: {\n      a: 6378135,\n      rf: 298.26,\n      ellipseName: 'WGS 72'\n    },\n    WGS84: {\n      a: 6378137,\n      rf: 298.257223563,\n      ellipseName: 'WGS 84'\n    },\n    sphere: {\n      a: 6370997,\n      b: 6370997,\n      ellipseName: 'Normal Sphere (r=6370997)'\n    }\n  };\n\n  const WGS84 = ellipsoids.WGS84; // default ellipsoid\n\n  function eccentricity(a, b, rf, R_A) {\n    var a2 = a * a; // used in geocentric\n    var b2 = b * b; // used in geocentric\n    var es = (a2 - b2) / a2; // e ^ 2\n    var e = 0;\n    if (R_A) {\n      a *= 1 - es * (SIXTH + es * (RA4 + es * RA6));\n      a2 = a * a;\n      es = 0;\n    } else {\n      e = Math.sqrt(es); // eccentricity\n    }\n    var ep2 = (a2 - b2) / b2; // used in geocentric\n    return {\n      es: es,\n      e: e,\n      ep2: ep2\n    };\n  }\n  function sphere(a, b, rf, ellps, sphere) {\n    if (!a) { // do we have an ellipsoid?\n      var ellipse = match(ellipsoids, ellps);\n      if (!ellipse) {\n        ellipse = WGS84;\n      }\n      a = ellipse.a;\n      b = ellipse.b;\n      rf = ellipse.rf;\n    }\n\n    if (rf && !b) {\n      b = (1.0 - 1.0 / rf) * a;\n    }\n    if (rf === 0 || Math.abs(a - b) < EPSLN) {\n      sphere = true;\n      b = a;\n    }\n    return {\n      a: a,\n      b: b,\n      rf: rf,\n      sphere: sphere\n    };\n  }\n\n  var datums = {\n    wgs84: {\n      towgs84: '0,0,0',\n      ellipse: 'WGS84',\n      datumName: 'WGS84'\n    },\n    ch1903: {\n      towgs84: '674.374,15.056,405.346',\n      ellipse: 'bessel',\n      datumName: 'swiss'\n    },\n    ggrs87: {\n      towgs84: '-199.87,74.79,246.62',\n      ellipse: 'GRS80',\n      datumName: 'Greek_Geodetic_Reference_System_1987'\n    },\n    nad83: {\n      towgs84: '0,0,0',\n      ellipse: 'GRS80',\n      datumName: 'North_American_Datum_1983'\n    },\n    nad27: {\n      nadgrids: '@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat',\n      ellipse: 'clrk66',\n      datumName: 'North_American_Datum_1927'\n    },\n    potsdam: {\n      towgs84: '598.1,73.7,418.2,0.202,0.045,-2.455,6.7',\n      ellipse: 'bessel',\n      datumName: 'Potsdam Rauenberg 1950 DHDN'\n    },\n    carthage: {\n      towgs84: '-263.0,6.0,431.0',\n      ellipse: 'clrk80ign',\n      datumName: 'Carthage 1934 Tunisia'\n    },\n    hermannskogel: {\n      towgs84: '577.326,90.129,463.919,5.137,1.474,5.297,2.4232',\n      ellipse: 'bessel',\n      datumName: 'Hermannskogel'\n    },\n    mgi: {\n      towgs84: '577.326,90.129,463.919,5.137,1.474,5.297,2.4232',\n      ellipse: 'bessel',\n      datumName: 'Militar-Geographische Institut'\n    },\n    osni52: {\n      towgs84: '482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15',\n      ellipse: 'airy',\n      datumName: 'Irish National'\n    },\n    ire65: {\n      towgs84: '482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15',\n      ellipse: 'mod_airy',\n      datumName: 'Ireland 1965'\n    },\n    rassadiran: {\n      towgs84: '-133.63,-157.5,-158.62',\n      ellipse: 'intl',\n      datumName: 'Rassadiran'\n    },\n    nzgd49: {\n      towgs84: '59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993',\n      ellipse: 'intl',\n      datumName: 'New Zealand Geodetic Datum 1949'\n    },\n    osgb36: {\n      towgs84: '446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894',\n      ellipse: 'airy',\n      datumName: 'Ordnance Survey of Great Britain 1936'\n    },\n    s_jtsk: {\n      towgs84: '589,76,480',\n      ellipse: 'bessel',\n      datumName: 'S-JTSK (Ferro)'\n    },\n    beduaram: {\n      towgs84: '-106,-87,188',\n      ellipse: 'clrk80',\n      datumName: 'Beduaram'\n    },\n    gunung_segara: {\n      towgs84: '-403,684,41',\n      ellipse: 'bessel',\n      datumName: 'Gunung Segara Jakarta'\n    },\n    rnb72: {\n      towgs84: '106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1',\n      ellipse: 'intl',\n      datumName: 'Reseau National Belge 1972'\n    },\n    EPSG_5451: {\n      towgs84: '6.41,-49.05,-11.28,1.5657,0.5242,6.9718,-5.7649'\n    },\n    IGNF_LURESG: {\n      towgs84: '-192.986,13.673,-39.309,-0.4099,-2.9332,2.6881,0.43'\n    },\n    EPSG_4614: {\n      towgs84: '-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065'\n    },\n    EPSG_4615: {\n      towgs84: '-494.088,-312.129,279.877,-1.423,-1.013,1.59,-0.748'\n    },\n    ESRI_37241: {\n      towgs84: '-76.822,257.457,-12.817,2.136,-0.033,-2.392,-0.031'\n    },\n    ESRI_37249: {\n      towgs84: '-440.296,58.548,296.265,1.128,10.202,4.559,-0.438'\n    },\n    ESRI_37245: {\n      towgs84: '-511.151,-181.269,139.609,1.05,2.703,1.798,3.071'\n    },\n    EPSG_4178: {\n      towgs84: '24.9,-126.4,-93.2,-0.063,-0.247,-0.041,1.01'\n    },\n    EPSG_4622: {\n      towgs84: '-472.29,-5.63,-304.12,0.4362,-0.8374,0.2563,1.8984'\n    },\n    EPSG_4625: {\n      towgs84: '126.93,547.94,130.41,-2.7867,5.1612,-0.8584,13.8227'\n    },\n    EPSG_5252: {\n      towgs84: '0.023,0.036,-0.068,0.00176,0.00912,-0.01136,0.00439'\n    },\n    EPSG_4314: {\n      towgs84: '597.1,71.4,412.1,0.894,0.068,-1.563,7.58'\n    },\n    EPSG_4282: {\n      towgs84: '-178.3,-316.7,-131.5,5.278,6.077,10.979,19.166'\n    },\n    EPSG_4231: {\n      towgs84: '-83.11,-97.38,-117.22,0.005693,-0.044698,0.044285,0.1218'\n    },\n    EPSG_4274: {\n      towgs84: '-230.994,102.591,25.199,0.633,-0.239,0.9,1.95'\n    },\n    EPSG_4134: {\n      towgs84: '-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006'\n    },\n    EPSG_4254: {\n      towgs84: '18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013'\n    },\n    EPSG_4159: {\n      towgs84: '-194.513,-63.978,-25.759,-3.4027,3.756,-3.352,-0.9175'\n    },\n    EPSG_4687: {\n      towgs84: '0.072,-0.507,-0.245,0.0183,-0.0003,0.007,-0.0093'\n    },\n    EPSG_4227: {\n      towgs84: '-83.58,-397.54,458.78,-17.595,-2.847,4.256,3.225'\n    },\n    EPSG_4746: {\n      towgs84: '599.4,72.4,419.2,-0.062,-0.022,-2.723,6.46'\n    },\n    EPSG_4745: {\n      towgs84: '612.4,77,440.2,-0.054,0.057,-2.797,2.55'\n    },\n    EPSG_6311: {\n      towgs84: '8.846,-4.394,-1.122,-0.00237,-0.146528,0.130428,0.783926'\n    },\n    EPSG_4289: {\n      towgs84: '565.7381,50.4018,465.2904,-0.395026,0.330772,-1.876073,4.07244'\n    },\n    EPSG_4230: {\n      towgs84: '-68.863,-134.888,-111.49,-0.53,-0.14,0.57,-3.4'\n    },\n    EPSG_4154: {\n      towgs84: '-123.02,-158.95,-168.47'\n    },\n    EPSG_4156: {\n      towgs84: '570.8,85.7,462.8,4.998,1.587,5.261,3.56'\n    },\n    EPSG_4299: {\n      towgs84: '482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15'\n    },\n    EPSG_4179: {\n      towgs84: '33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84'\n    },\n    EPSG_4313: {\n      towgs84: '-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747'\n    },\n    EPSG_4194: {\n      towgs84: '163.511,127.533,-159.789'\n    },\n    EPSG_4195: {\n      towgs84: '105,326,-102.5'\n    },\n    EPSG_4196: {\n      towgs84: '-45,417,-3.5'\n    },\n    EPSG_4611: {\n      towgs84: '-162.619,-276.959,-161.764,0.067753,-2.243648,-1.158828,-1.094246'\n    },\n    EPSG_4633: {\n      towgs84: '137.092,131.66,91.475,-1.9436,-11.5993,-4.3321,-7.4824'\n    },\n    EPSG_4641: {\n      towgs84: '-408.809,366.856,-412.987,1.8842,-0.5308,2.1655,-121.0993'\n    },\n    EPSG_4643: {\n      towgs84: '-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7002'\n    },\n    EPSG_4300: {\n      towgs84: '482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15'\n    },\n    EPSG_4188: {\n      towgs84: '482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15'\n    },\n    EPSG_4660: {\n      towgs84: '982.6087,552.753,-540.873,6.681627,-31.611492,-19.848161,16.805'\n    },\n    EPSG_4662: {\n      towgs84: '97.295,-263.247,310.882,-1.5999,0.8386,3.1409,13.3259'\n    },\n    EPSG_3906: {\n      towgs84: '577.88891,165.22205,391.18289,4.9145,-0.94729,-13.05098,7.78664'\n    },\n    EPSG_4307: {\n      towgs84: '-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547'\n    },\n    EPSG_6892: {\n      towgs84: '-76.269,-16.683,68.562,-6.275,10.536,-4.286,-13.686'\n    },\n    EPSG_4690: {\n      towgs84: '221.597,152.441,176.523,2.403,1.3893,0.884,11.4648'\n    },\n    EPSG_4691: {\n      towgs84: '218.769,150.75,176.75,3.5231,2.0037,1.288,10.9817'\n    },\n    EPSG_4629: {\n      towgs84: '72.51,345.411,79.241,-1.5862,-0.8826,-0.5495,1.3653'\n    },\n    EPSG_4630: {\n      towgs84: '165.804,216.213,180.26,-0.6251,-0.4515,-0.0721,7.4111'\n    },\n    EPSG_4692: {\n      towgs84: '217.109,86.452,23.711,0.0183,-0.0003,0.007,-0.0093'\n    },\n    EPSG_9333: {\n      towgs84: '0,0,0,-0.008393,0.000749,-0.010276,0'\n    },\n    EPSG_9059: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4312: {\n      towgs84: '601.705,84.263,485.227,4.7354,1.3145,5.393,-2.3887'\n    },\n    EPSG_4123: {\n      towgs84: '-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496'\n    },\n    EPSG_4309: {\n      towgs84: '-124.45,183.74,44.64,-0.4384,0.5446,-0.9706,-2.1365'\n    },\n    ESRI_104106: {\n      towgs84: '-283.088,-70.693,117.445,-1.157,0.059,-0.652,-4.058'\n    },\n    EPSG_4281: {\n      towgs84: '-219.247,-73.802,269.529'\n    },\n    EPSG_4322: {\n      towgs84: '0,0,4.5'\n    },\n    EPSG_4324: {\n      towgs84: '0,0,1.9'\n    },\n    EPSG_4284: {\n      towgs84: '43.822,-108.842,-119.585,1.455,-0.761,0.737,0.549'\n    },\n    EPSG_4277: {\n      towgs84: '446.448,-125.157,542.06,0.15,0.247,0.842,-20.489'\n    },\n    EPSG_4207: {\n      towgs84: '-282.1,-72.2,120,-1.529,0.145,-0.89,-4.46'\n    },\n    EPSG_4688: {\n      towgs84: '347.175,1077.618,2623.677,33.9058,-70.6776,9.4013,186.0647'\n    },\n    EPSG_4689: {\n      towgs84: '410.793,54.542,80.501,-2.5596,-2.3517,-0.6594,17.3218'\n    },\n    EPSG_4720: {\n      towgs84: '0,0,4.5'\n    },\n    EPSG_4273: {\n      towgs84: '278.3,93,474.5,7.889,0.05,-6.61,6.21'\n    },\n    EPSG_4240: {\n      towgs84: '204.64,834.74,293.8'\n    },\n    EPSG_4817: {\n      towgs84: '278.3,93,474.5,7.889,0.05,-6.61,6.21'\n    },\n    ESRI_104131: {\n      towgs84: '426.62,142.62,460.09,4.98,4.49,-12.42,-17.1'\n    },\n    EPSG_4265: {\n      towgs84: '-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68'\n    },\n    EPSG_4263: {\n      towgs84: '-111.92,-87.85,114.5,1.875,0.202,0.219,0.032'\n    },\n    EPSG_4298: {\n      towgs84: '-689.5937,623.84046,-65.93566,-0.02331,1.17094,-0.80054,5.88536'\n    },\n    EPSG_4270: {\n      towgs84: '-253.4392,-148.452,386.5267,0.15605,0.43,-0.1013,-0.0424'\n    },\n    EPSG_4229: {\n      towgs84: '-121.8,98.1,-10.7'\n    },\n    EPSG_4220: {\n      towgs84: '-55.5,-348,-229.2'\n    },\n    EPSG_4214: {\n      towgs84: '12.646,-155.176,-80.863'\n    },\n    EPSG_4232: {\n      towgs84: '-345,3,223'\n    },\n    EPSG_4238: {\n      towgs84: '-1.977,-13.06,-9.993,0.364,0.254,0.689,-1.037'\n    },\n    EPSG_4168: {\n      towgs84: '-170,33,326'\n    },\n    EPSG_4131: {\n      towgs84: '199,931,318.9'\n    },\n    EPSG_4152: {\n      towgs84: '-0.9102,2.0141,0.5602,0.029039,0.010065,0.010101,0'\n    },\n    EPSG_5228: {\n      towgs84: '572.213,85.334,461.94,4.9732,1.529,5.2484,3.5378'\n    },\n    EPSG_8351: {\n      towgs84: '485.021,169.465,483.839,7.786342,4.397554,4.102655,0'\n    },\n    EPSG_4683: {\n      towgs84: '-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06'\n    },\n    EPSG_4133: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7373: {\n      towgs84: '0.819,-0.5762,-1.6446,-0.00378,-0.03317,0.00318,0.0693'\n    },\n    EPSG_9075: {\n      towgs84: '-0.9102,2.0141,0.5602,0.029039,0.010065,0.010101,0'\n    },\n    EPSG_9072: {\n      towgs84: '-0.9102,2.0141,0.5602,0.029039,0.010065,0.010101,0'\n    },\n    EPSG_9294: {\n      towgs84: '1.16835,-1.42001,-2.24431,-0.00822,-0.05508,0.01818,0.23388'\n    },\n    EPSG_4212: {\n      towgs84: '-267.434,173.496,181.814,-13.4704,8.7154,7.3926,14.7492'\n    },\n    EPSG_4191: {\n      towgs84: '-44.183,-0.58,-38.489,2.3867,2.7072,-3.5196,-8.2703'\n    },\n    EPSG_4237: {\n      towgs84: '52.684,-71.194,-13.975,-0.312,-0.1063,-0.3729,1.0191'\n    },\n    EPSG_4740: {\n      towgs84: '-1.08,-0.27,-0.9'\n    },\n    EPSG_4124: {\n      towgs84: '419.3836,99.3335,591.3451,0.850389,1.817277,-7.862238,-0.99496'\n    },\n    EPSG_5681: {\n      towgs84: '584.9636,107.7175,413.8067,1.1155,0.2824,-3.1384,7.9922'\n    },\n    EPSG_4141: {\n      towgs84: '23.772,17.49,17.859,-0.3132,-1.85274,1.67299,-5.4262'\n    },\n    EPSG_4204: {\n      towgs84: '-85.645,-273.077,-79.708,2.289,-1.421,2.532,3.194'\n    },\n    EPSG_4319: {\n      towgs84: '226.702,-193.337,-35.371,-2.229,-4.391,9.238,0.9798'\n    },\n    EPSG_4200: {\n      towgs84: '24.82,-131.21,-82.66'\n    },\n    EPSG_4130: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4127: {\n      towgs84: '-82.875,-57.097,-156.768,-2.158,1.524,-0.982,-0.359'\n    },\n    EPSG_4149: {\n      towgs84: '674.374,15.056,405.346'\n    },\n    EPSG_4617: {\n      towgs84: '-0.991,1.9072,0.5129,0.02579,0.00965,0.01166,0'\n    },\n    EPSG_4663: {\n      towgs84: '-210.502,-66.902,-48.476,2.094,-15.067,-5.817,0.485'\n    },\n    EPSG_4664: {\n      towgs84: '-211.939,137.626,58.3,-0.089,0.251,0.079,0.384'\n    },\n    EPSG_4665: {\n      towgs84: '-105.854,165.589,-38.312,-0.003,-0.026,0.024,-0.048'\n    },\n    EPSG_4666: {\n      towgs84: '631.392,-66.551,481.442,1.09,-4.445,-4.487,-4.43'\n    },\n    EPSG_4756: {\n      towgs84: '-192.873,-39.382,-111.202,-0.00205,-0.0005,0.00335,0.0188'\n    },\n    EPSG_4723: {\n      towgs84: '-179.483,-69.379,-27.584,-7.862,8.163,6.042,-13.925'\n    },\n    EPSG_4726: {\n      towgs84: '8.853,-52.644,180.304,-0.393,-2.323,2.96,-24.081'\n    },\n    EPSG_4267: {\n      towgs84: '-8.0,160.0,176.0'\n    },\n    EPSG_5365: {\n      towgs84: '-0.16959,0.35312,0.51846,0.03385,-0.16325,0.03446,0.03693'\n    },\n    EPSG_4218: {\n      towgs84: '304.5,306.5,-318.1'\n    },\n    EPSG_4242: {\n      towgs84: '-33.722,153.789,94.959,-8.581,-4.478,4.54,8.95'\n    },\n    EPSG_4216: {\n      towgs84: '-292.295,248.758,429.447,4.9971,2.99,6.6906,1.0289'\n    },\n    ESRI_104105: {\n      towgs84: '631.392,-66.551,481.442,1.09,-4.445,-4.487,-4.43'\n    },\n    ESRI_104129: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4673: {\n      towgs84: '174.05,-25.49,112.57'\n    },\n    EPSG_4202: {\n      towgs84: '-124,-60,154'\n    },\n    EPSG_4203: {\n      towgs84: '-117.763,-51.51,139.061,0.292,0.443,0.277,-0.191'\n    },\n    EPSG_3819: {\n      towgs84: '595.48,121.69,515.35,4.115,-2.9383,0.853,-3.408'\n    },\n    EPSG_8694: {\n      towgs84: '-93.799,-132.737,-219.073,-1.844,0.648,-6.37,-0.169'\n    },\n    EPSG_4145: {\n      towgs84: '275.57,676.78,229.6'\n    },\n    EPSG_4283: {\n      towgs84: '0.06155,-0.01087,-0.04019,0.039492,0.032722,0.032898,-0.009994'\n    },\n    EPSG_4317: {\n      towgs84: '2.3287,-147.0425,-92.0802,-0.309248,0.324822,0.497299,5.689063'\n    },\n    EPSG_4272: {\n      towgs84: '59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993'\n    },\n    EPSG_4248: {\n      towgs84: '-307.7,265.3,-363.5'\n    },\n    EPSG_5561: {\n      towgs84: '24,-121,-76'\n    },\n    EPSG_5233: {\n      towgs84: '-0.293,766.95,87.713,0.195704,1.695068,3.473016,-0.039338'\n    },\n    ESRI_104130: {\n      towgs84: '-86,-98,-119'\n    },\n    ESRI_104102: {\n      towgs84: '682,-203,480'\n    },\n    ESRI_37207: {\n      towgs84: '7,-10,-26'\n    },\n    EPSG_4675: {\n      towgs84: '59.935,118.4,-10.871'\n    },\n    ESRI_104109: {\n      towgs84: '-89.121,-348.182,260.871'\n    },\n    ESRI_104112: {\n      towgs84: '-185.583,-230.096,281.361'\n    },\n    ESRI_104113: {\n      towgs84: '25.1,-275.6,222.6'\n    },\n    IGNF_WGS72G: {\n      towgs84: '0,12,6'\n    },\n    IGNF_NTFG: {\n      towgs84: '-168,-60,320'\n    },\n    IGNF_EFATE57G: {\n      towgs84: '-127,-769,472'\n    },\n    IGNF_PGP50G: {\n      towgs84: '324.8,153.6,172.1'\n    },\n    IGNF_REUN47G: {\n      towgs84: '94,-948,-1262'\n    },\n    IGNF_CSG67G: {\n      towgs84: '-186,230,110'\n    },\n    IGNF_GUAD48G: {\n      towgs84: '-467,-16,-300'\n    },\n    IGNF_TAHI51G: {\n      towgs84: '162,117,154'\n    },\n    IGNF_TAHAAG: {\n      towgs84: '65,342,77'\n    },\n    IGNF_NUKU72G: {\n      towgs84: '84,274,65'\n    },\n    IGNF_PETRELS72G: {\n      towgs84: '365,194,166'\n    },\n    IGNF_WALL78G: {\n      towgs84: '253,-133,-127'\n    },\n    IGNF_MAYO50G: {\n      towgs84: '-382,-59,-262'\n    },\n    IGNF_TANNAG: {\n      towgs84: '-139,-967,436'\n    },\n    IGNF_IGN72G: {\n      towgs84: '-13,-348,292'\n    },\n    IGNF_ATIGG: {\n      towgs84: '1118,23,66'\n    },\n    IGNF_FANGA84G: {\n      towgs84: '150.57,158.33,118.32'\n    },\n    IGNF_RUSAT84G: {\n      towgs84: '202.13,174.6,-15.74'\n    },\n    IGNF_KAUE70G: {\n      towgs84: '126.74,300.1,-75.49'\n    },\n    IGNF_MOP90G: {\n      towgs84: '-10.8,-1.8,12.77'\n    },\n    IGNF_MHPF67G: {\n      towgs84: '338.08,212.58,-296.17'\n    },\n    IGNF_TAHI79G: {\n      towgs84: '160.61,116.05,153.69'\n    },\n    IGNF_ANAA92G: {\n      towgs84: '1.5,3.84,4.81'\n    },\n    IGNF_MARQUI72G: {\n      towgs84: '330.91,-13.92,58.56'\n    },\n    IGNF_APAT86G: {\n      towgs84: '143.6,197.82,74.05'\n    },\n    IGNF_TUBU69G: {\n      towgs84: '237.17,171.61,-77.84'\n    },\n    IGNF_STPM50G: {\n      towgs84: '11.363,424.148,373.13'\n    },\n    EPSG_4150: {\n      towgs84: '674.374,15.056,405.346'\n    },\n    EPSG_4754: {\n      towgs84: '-208.4058,-109.8777,-2.5764'\n    },\n    ESRI_104101: {\n      towgs84: '372.87,149.23,585.29'\n    },\n    EPSG_4693: {\n      towgs84: '0,-0.15,0.68'\n    },\n    EPSG_6207: {\n      towgs84: '293.17,726.18,245.36'\n    },\n    EPSG_4153: {\n      towgs84: '-133.63,-157.5,-158.62'\n    },\n    EPSG_4132: {\n      towgs84: '-241.54,-163.64,396.06'\n    },\n    EPSG_4221: {\n      towgs84: '-154.5,150.7,100.4'\n    },\n    EPSG_4266: {\n      towgs84: '-80.7,-132.5,41.1'\n    },\n    EPSG_4193: {\n      towgs84: '-70.9,-151.8,-41.4'\n    },\n    EPSG_5340: {\n      towgs84: '-0.41,0.46,-0.35'\n    },\n    EPSG_4246: {\n      towgs84: '-294.7,-200.1,525.5'\n    },\n    EPSG_4318: {\n      towgs84: '-3.2,-5.7,2.8'\n    },\n    EPSG_4121: {\n      towgs84: '-199.87,74.79,246.62'\n    },\n    EPSG_4223: {\n      towgs84: '-260.1,5.5,432.2'\n    },\n    EPSG_4158: {\n      towgs84: '-0.465,372.095,171.736'\n    },\n    EPSG_4285: {\n      towgs84: '-128.16,-282.42,21.93'\n    },\n    EPSG_4613: {\n      towgs84: '-404.78,685.68,45.47'\n    },\n    EPSG_4607: {\n      towgs84: '195.671,332.517,274.607'\n    },\n    EPSG_4475: {\n      towgs84: '-381.788,-57.501,-256.673'\n    },\n    EPSG_4208: {\n      towgs84: '-157.84,308.54,-146.6'\n    },\n    EPSG_4743: {\n      towgs84: '70.995,-335.916,262.898'\n    },\n    EPSG_4710: {\n      towgs84: '-323.65,551.39,-491.22'\n    },\n    EPSG_7881: {\n      towgs84: '-0.077,0.079,0.086'\n    },\n    EPSG_4682: {\n      towgs84: '283.729,735.942,261.143'\n    },\n    EPSG_4739: {\n      towgs84: '-156,-271,-189'\n    },\n    EPSG_4679: {\n      towgs84: '-80.01,253.26,291.19'\n    },\n    EPSG_4750: {\n      towgs84: '-56.263,16.136,-22.856'\n    },\n    EPSG_4644: {\n      towgs84: '-10.18,-350.43,291.37'\n    },\n    EPSG_4695: {\n      towgs84: '-103.746,-9.614,-255.95'\n    },\n    EPSG_4292: {\n      towgs84: '-355,21,72'\n    },\n    EPSG_4302: {\n      towgs84: '-61.702,284.488,472.052'\n    },\n    EPSG_4143: {\n      towgs84: '-124.76,53,466.79'\n    },\n    EPSG_4606: {\n      towgs84: '-153,153,307'\n    },\n    EPSG_4699: {\n      towgs84: '-770.1,158.4,-498.2'\n    },\n    EPSG_4247: {\n      towgs84: '-273.5,110.6,-357.9'\n    },\n    EPSG_4160: {\n      towgs84: '8.88,184.86,106.69'\n    },\n    EPSG_4161: {\n      towgs84: '-233.43,6.65,173.64'\n    },\n    EPSG_9251: {\n      towgs84: '-9.5,122.9,138.2'\n    },\n    EPSG_9253: {\n      towgs84: '-78.1,101.6,133.3'\n    },\n    EPSG_4297: {\n      towgs84: '-198.383,-240.517,-107.909'\n    },\n    EPSG_4269: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4301: {\n      towgs84: '-147,506,687'\n    },\n    EPSG_4618: {\n      towgs84: '-59,-11,-52'\n    },\n    EPSG_4612: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4678: {\n      towgs84: '44.585,-131.212,-39.544'\n    },\n    EPSG_4250: {\n      towgs84: '-130,29,364'\n    },\n    EPSG_4144: {\n      towgs84: '214,804,268'\n    },\n    EPSG_4147: {\n      towgs84: '-17.51,-108.32,-62.39'\n    },\n    EPSG_4259: {\n      towgs84: '-254.1,-5.36,-100.29'\n    },\n    EPSG_4164: {\n      towgs84: '-76,-138,67'\n    },\n    EPSG_4211: {\n      towgs84: '-378.873,676.002,-46.255'\n    },\n    EPSG_4182: {\n      towgs84: '-422.651,-172.995,84.02'\n    },\n    EPSG_4224: {\n      towgs84: '-143.87,243.37,-33.52'\n    },\n    EPSG_4225: {\n      towgs84: '-205.57,168.77,-4.12'\n    },\n    EPSG_5527: {\n      towgs84: '-67.35,3.88,-38.22'\n    },\n    EPSG_4752: {\n      towgs84: '98,390,-22'\n    },\n    EPSG_4310: {\n      towgs84: '-30,190,89'\n    },\n    EPSG_9248: {\n      towgs84: '-192.26,65.72,132.08'\n    },\n    EPSG_4680: {\n      towgs84: '124.5,-63.5,-281'\n    },\n    EPSG_4701: {\n      towgs84: '-79.9,-158,-168.9'\n    },\n    EPSG_4706: {\n      towgs84: '-146.21,112.63,4.05'\n    },\n    EPSG_4805: {\n      towgs84: '682,-203,480'\n    },\n    EPSG_4201: {\n      towgs84: '-165,-11,206'\n    },\n    EPSG_4210: {\n      towgs84: '-157,-2,-299'\n    },\n    EPSG_4183: {\n      towgs84: '-104,167,-38'\n    },\n    EPSG_4139: {\n      towgs84: '11,72,-101'\n    },\n    EPSG_4668: {\n      towgs84: '-86,-98,-119'\n    },\n    EPSG_4717: {\n      towgs84: '-2,151,181'\n    },\n    EPSG_4732: {\n      towgs84: '102,52,-38'\n    },\n    EPSG_4280: {\n      towgs84: '-377,681,-50'\n    },\n    EPSG_4209: {\n      towgs84: '-138,-105,-289'\n    },\n    EPSG_4261: {\n      towgs84: '31,146,47'\n    },\n    EPSG_4658: {\n      towgs84: '-73,46,-86'\n    },\n    EPSG_4721: {\n      towgs84: '265.025,384.929,-194.046'\n    },\n    EPSG_4222: {\n      towgs84: '-136,-108,-292'\n    },\n    EPSG_4601: {\n      towgs84: '-255,-15,71'\n    },\n    EPSG_4602: {\n      towgs84: '725,685,536'\n    },\n    EPSG_4603: {\n      towgs84: '72,213.7,93'\n    },\n    EPSG_4605: {\n      towgs84: '9,183,236'\n    },\n    EPSG_4621: {\n      towgs84: '137,248,-430'\n    },\n    EPSG_4657: {\n      towgs84: '-28,199,5'\n    },\n    EPSG_4316: {\n      towgs84: '103.25,-100.4,-307.19'\n    },\n    EPSG_4642: {\n      towgs84: '-13,-348,292'\n    },\n    EPSG_4698: {\n      towgs84: '145,-187,103'\n    },\n    EPSG_4192: {\n      towgs84: '-206.1,-174.7,-87.7'\n    },\n    EPSG_4311: {\n      towgs84: '-265,120,-358'\n    },\n    EPSG_4135: {\n      towgs84: '58,-283,-182'\n    },\n    ESRI_104138: {\n      towgs84: '198,-226,-347'\n    },\n    EPSG_4245: {\n      towgs84: '-11,851,5'\n    },\n    EPSG_4142: {\n      towgs84: '-125,53,467'\n    },\n    EPSG_4213: {\n      towgs84: '-106,-87,188'\n    },\n    EPSG_4253: {\n      towgs84: '-133,-77,-51'\n    },\n    EPSG_4129: {\n      towgs84: '-132,-110,-335'\n    },\n    EPSG_4713: {\n      towgs84: '-77,-128,142'\n    },\n    EPSG_4239: {\n      towgs84: '217,823,299'\n    },\n    EPSG_4146: {\n      towgs84: '295,736,257'\n    },\n    EPSG_4155: {\n      towgs84: '-83,37,124'\n    },\n    EPSG_4165: {\n      towgs84: '-173,253,27'\n    },\n    EPSG_4672: {\n      towgs84: '175,-38,113'\n    },\n    EPSG_4236: {\n      towgs84: '-637,-549,-203'\n    },\n    EPSG_4251: {\n      towgs84: '-90,40,88'\n    },\n    EPSG_4271: {\n      towgs84: '-2,374,172'\n    },\n    EPSG_4175: {\n      towgs84: '-88,4,101'\n    },\n    EPSG_4716: {\n      towgs84: '298,-304,-375'\n    },\n    EPSG_4315: {\n      towgs84: '-23,259,-9'\n    },\n    EPSG_4744: {\n      towgs84: '-242.2,-144.9,370.3'\n    },\n    EPSG_4244: {\n      towgs84: '-97,787,86'\n    },\n    EPSG_4293: {\n      towgs84: '616,97,-251'\n    },\n    EPSG_4714: {\n      towgs84: '-127,-769,472'\n    },\n    EPSG_4736: {\n      towgs84: '260,12,-147'\n    },\n    EPSG_6883: {\n      towgs84: '-235,-110,393'\n    },\n    EPSG_6894: {\n      towgs84: '-63,176,185'\n    },\n    EPSG_4205: {\n      towgs84: '-43,-163,45'\n    },\n    EPSG_4256: {\n      towgs84: '41,-220,-134'\n    },\n    EPSG_4262: {\n      towgs84: '639,405,60'\n    },\n    EPSG_4604: {\n      towgs84: '174,359,365'\n    },\n    EPSG_4169: {\n      towgs84: '-115,118,426'\n    },\n    EPSG_4620: {\n      towgs84: '-106,-129,165'\n    },\n    EPSG_4184: {\n      towgs84: '-203,141,53'\n    },\n    EPSG_4616: {\n      towgs84: '-289,-124,60'\n    },\n    EPSG_9403: {\n      towgs84: '-307,-92,127'\n    },\n    EPSG_4684: {\n      towgs84: '-133,-321,50'\n    },\n    EPSG_4708: {\n      towgs84: '-491,-22,435'\n    },\n    EPSG_4707: {\n      towgs84: '114,-116,-333'\n    },\n    EPSG_4709: {\n      towgs84: '145,75,-272'\n    },\n    EPSG_4712: {\n      towgs84: '-205,107,53'\n    },\n    EPSG_4711: {\n      towgs84: '124,-234,-25'\n    },\n    EPSG_4718: {\n      towgs84: '230,-199,-752'\n    },\n    EPSG_4719: {\n      towgs84: '211,147,111'\n    },\n    EPSG_4724: {\n      towgs84: '208,-435,-229'\n    },\n    EPSG_4725: {\n      towgs84: '189,-79,-202'\n    },\n    EPSG_4735: {\n      towgs84: '647,1777,-1124'\n    },\n    EPSG_4722: {\n      towgs84: '-794,119,-298'\n    },\n    EPSG_4728: {\n      towgs84: '-307,-92,127'\n    },\n    EPSG_4734: {\n      towgs84: '-632,438,-609'\n    },\n    EPSG_4727: {\n      towgs84: '912,-58,1227'\n    },\n    EPSG_4729: {\n      towgs84: '185,165,42'\n    },\n    EPSG_4730: {\n      towgs84: '170,42,84'\n    },\n    EPSG_4733: {\n      towgs84: '276,-57,149'\n    },\n    ESRI_37218: {\n      towgs84: '230,-199,-752'\n    },\n    ESRI_37240: {\n      towgs84: '-7,215,225'\n    },\n    ESRI_37221: {\n      towgs84: '252,-209,-751'\n    },\n    ESRI_4305: {\n      towgs84: '-123,-206,219'\n    },\n    ESRI_104139: {\n      towgs84: '-73,-247,227'\n    },\n    EPSG_4748: {\n      towgs84: '51,391,-36'\n    },\n    EPSG_4219: {\n      towgs84: '-384,664,-48'\n    },\n    EPSG_4255: {\n      towgs84: '-333,-222,114'\n    },\n    EPSG_4257: {\n      towgs84: '-587.8,519.75,145.76'\n    },\n    EPSG_4646: {\n      towgs84: '-963,510,-359'\n    },\n    EPSG_6881: {\n      towgs84: '-24,-203,268'\n    },\n    EPSG_6882: {\n      towgs84: '-183,-15,273'\n    },\n    EPSG_4715: {\n      towgs84: '-104,-129,239'\n    },\n    IGNF_RGF93GDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGM04GDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGSPM06GDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGTAAF07GDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGFG95GDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGNCG: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGPFGDD: {\n      towgs84: '0,0,0'\n    },\n    IGNF_ETRS89G: {\n      towgs84: '0,0,0'\n    },\n    IGNF_RGR92GDD: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4173: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4180: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4619: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4667: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4075: {\n      towgs84: '0,0,0'\n    },\n    EPSG_6706: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7798: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4661: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4669: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8685: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4151: {\n      towgs84: '0,0,0'\n    },\n    EPSG_9702: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4758: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4761: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4765: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8997: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4023: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4670: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4694: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4148: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4163: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4167: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4189: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4190: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4176: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4659: {\n      towgs84: '0,0,0'\n    },\n    EPSG_3824: {\n      towgs84: '0,0,0'\n    },\n    EPSG_3889: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4046: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4081: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4558: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4483: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5013: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5264: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5324: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5354: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5371: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5373: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5381: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5393: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5489: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5593: {\n      towgs84: '0,0,0'\n    },\n    EPSG_6135: {\n      towgs84: '0,0,0'\n    },\n    EPSG_6365: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5246: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7886: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8431: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8427: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8699: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8818: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4757: {\n      towgs84: '0,0,0'\n    },\n    EPSG_9140: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8086: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4686: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4737: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4702: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4747: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4749: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4674: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4755: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4759: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4762: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4763: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4764: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4166: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4170: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5546: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7844: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4818: {\n      towgs84: '589,76,480'\n    },\n    EPSG_10328: {\n      towgs84: '0,0,0'\n    },\n    EPSG_9782: {\n      towgs84: '0,0,0'\n    },\n    EPSG_9777: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10690: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10639: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10739: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7686: {\n      towgs84: '0,0,0'\n    },\n    EPSG_8900: {\n      towgs84: '0,0,0'\n    },\n    EPSG_5886: {\n      towgs84: '0,0,0'\n    },\n    EPSG_7683: {\n      towgs84: '0,0,0'\n    },\n    EPSG_6668: {\n      towgs84: '0,0,0'\n    },\n    EPSG_20046: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10299: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10310: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10475: {\n      towgs84: '0,0,0'\n    },\n    EPSG_4742: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10671: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10762: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10725: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10791: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10800: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10305: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10941: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10968: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10875: {\n      towgs84: '0,0,0'\n    },\n    EPSG_6318: {\n      towgs84: '0,0,0'\n    },\n    EPSG_10910: {\n      towgs84: '0,0,0'\n    }\n  };\n\n  for (var key in datums) {\n    var datum$1 = datums[key];\n    if (!datum$1.datumName) {\n      continue;\n    }\n    datums[datum$1.datumName] = datum$1;\n  }\n\n  function datum(datumCode, datum_params, a, b, es, ep2, nadgrids) {\n    var out = {};\n    out.datum_type = PJD_NODATUM;\n\n    if (datum_params) {\n      out.datum_type = PJD_WGS84;\n      out.datum_params = datum_params.map(parseFloat);\n      if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) {\n        out.datum_type = PJD_3PARAM;\n      }\n      if (out.datum_params.length > 3) {\n        if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) {\n          out.datum_type = PJD_7PARAM;\n          out.datum_params[3] *= SEC_TO_RAD;\n          out.datum_params[4] *= SEC_TO_RAD;\n          out.datum_params[5] *= SEC_TO_RAD;\n          out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0;\n        }\n      }\n    }\n\n    if (nadgrids) {\n      out.datum_type = PJD_GRIDSHIFT;\n      out.grids = nadgrids;\n    }\n    out.a = a; // datum object also uses these values\n    out.b = b;\n    out.es = es;\n    out.ep2 = ep2;\n    return out;\n  }\n\n  /**\n   * Resources for details of NTv2 file formats:\n   * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf\n   * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm\n   */\n\n  /**\n   * @typedef {Object} NadgridInfo\n   * @property {string} name The name of the NAD grid or 'null' if not specified.\n   * @property {boolean} mandatory Indicates if the grid is mandatory (true) or optional (false).\n   * @property {*} grid The loaded NAD grid object, or null if not loaded or not applicable.\n   * @property {boolean} isNull True if the grid is explicitly 'null', otherwise false.\n   */\n\n  /**\n   * @typedef {Object} NTV2GridOptions\n   * @property {boolean} [includeErrorFields=true] Whether to include error fields in the subgrids.\n   */\n\n  /**\n   * @typedef {Object} NadgridHeader\n   * @property {number} [nFields] Number of fields in the header.\n   * @property {number} [nSubgridFields] Number of fields in each subgrid header.\n   * @property {number} nSubgrids Number of subgrids in the file.\n   * @property {string} [shiftType] Type of shift (e.g., \"SECONDS\").\n   * @property {number} [fromSemiMajorAxis] Source ellipsoid semi-major axis.\n   * @property {number} [fromSemiMinorAxis] Source ellipsoid semi-minor axis.\n   * @property {number} [toSemiMajorAxis] Target ellipsoid semi-major axis.\n   * @property {number} [toSemiMinorAxis] Target ellipsoid semi-minor axis.\n   */\n\n  /**\n   * @typedef {Object} Subgrid\n   * @property {Array<number>} ll Lower left corner of the grid in radians [longitude, latitude].\n   * @property {Array<number>} del Grid spacing in radians [longitude interval, latitude interval].\n   * @property {Array<number>} lim Number of columns in the grid [longitude columns, latitude columns].\n   * @property {number} [count] Total number of grid nodes.\n   * @property {Array} cvs Mapped node values for the grid.\n   */\n\n  /** @typedef {{header: NadgridHeader, subgrids: Array<Subgrid>}} NADGrid */\n\n  var loadedNadgrids = {};\n\n  /**\n   * @overload\n   * @param {string} key - The key to associate with the loaded grid.\n   * @param {ArrayBuffer} data - The NTv2 grid data as an ArrayBuffer.\n   * @param {NTV2GridOptions} [options] - Optional parameters for loading the grid.\n   * @returns {NADGrid} - The loaded NAD grid information.\n   */\n  /**\n   * @overload\n   * @param {string} key - The key to associate with the loaded grid.\n   * @param {import('geotiff').GeoTIFF} data - The GeoTIFF instance to read the grid from.\n   * @returns {{ready: Promise<NADGrid>}} - A promise that resolves to the loaded grid information.\n   */\n  /**\n   * Load either a NTv2 file (.gsb) or a Geotiff (.tif) to a key that can be used in a proj string like +nadgrids=<key>. Pass the NTv2 file\n   * as an ArrayBuffer. Pass Geotiff as a GeoTIFF instance from the geotiff.js library.\n   * @param {string} key - The key to associate with the loaded grid.\n   * @param {ArrayBuffer|import('geotiff').GeoTIFF} data The data to load, either an ArrayBuffer for NTv2 or a GeoTIFF instance.\n   * @param {NTV2GridOptions} [options] Optional parameters.\n   * @returns {{ready: Promise<NADGrid>}|NADGrid} - A promise that resolves to the loaded grid information.\n   */\n  function nadgrid(key, data, options) {\n    if (data instanceof ArrayBuffer) {\n      return readNTV2Grid(key, data, options);\n    }\n    return { ready: readGeotiffGrid(key, data) };\n  }\n\n  /**\n   * @param {string} key The key to associate with the loaded grid.\n   * @param {ArrayBuffer} data The NTv2 grid data as an ArrayBuffer.\n   * @param {NTV2GridOptions} [options] Optional parameters for loading the grid.\n   * @returns {NADGrid} The loaded NAD grid information.\n   */\n  function readNTV2Grid(key, data, options) {\n    var includeErrorFields = true;\n    if (options !== undefined && options.includeErrorFields === false) {\n      includeErrorFields = false;\n    }\n    var view = new DataView(data);\n    var isLittleEndian = detectLittleEndian(view);\n    var header = readHeader(view, isLittleEndian);\n    var subgrids = readSubgrids(view, header, isLittleEndian, includeErrorFields);\n    var nadgrid = { header: header, subgrids: subgrids };\n    loadedNadgrids[key] = nadgrid;\n    return nadgrid;\n  }\n\n  /**\n   * @param {string} key The key to associate with the loaded grid.\n   * @param {import('geotiff').GeoTIFF} tiff The GeoTIFF instance to read the grid from.\n   * @returns {Promise<NADGrid>} A promise that resolves to the loaded NAD grid information.\n   */\n  async function readGeotiffGrid(key, tiff) {\n    var subgrids = [];\n    var subGridCount = await tiff.getImageCount();\n    // proj produced tiff grid shift files appear to organize lower res subgrids first, higher res/ child subgrids last.\n    for (var subgridIndex = subGridCount - 1; subgridIndex >= 0; subgridIndex--) {\n      var image = await tiff.getImage(subgridIndex);\n\n      var rasters = await image.readRasters();\n      var data = rasters;\n      var lim = [image.getWidth(), image.getHeight()];\n      var imageBBoxRadians = image.getBoundingBox().map(degreesToRadians);\n      var modelPixelScale = typeof image.fileDirectory.getValue === 'function'\n        // geotiff v3\n        ? image.fileDirectory.getValue('ModelPixelScale')\n        // geotiff v2\n        : /** @type {any} */ (image.fileDirectory).ModelPixelScale;\n      var del = [modelPixelScale[0], modelPixelScale[1]].map(degreesToRadians);\n\n      var maxX = imageBBoxRadians[0] + (lim[0] - 1) * del[0];\n      var minY = imageBBoxRadians[3] - (lim[1] - 1) * del[1];\n\n      var latitudeOffsetBand = data[0];\n      var longitudeOffsetBand = data[1];\n      var nodes = [];\n\n      for (let i = lim[1] - 1; i >= 0; i--) {\n        for (let j = lim[0] - 1; j >= 0; j--) {\n          var index = i * lim[0] + j;\n          nodes.push([-secondsToRadians(longitudeOffsetBand[index]), secondsToRadians(latitudeOffsetBand[index])]);\n        }\n      }\n\n      subgrids.push({\n        del: del,\n        lim: lim,\n        ll: [-maxX, minY],\n        cvs: nodes\n      });\n    }\n\n    var tifGrid = {\n      header: {\n        nSubgrids: subGridCount\n      },\n      subgrids: subgrids\n    };\n    loadedNadgrids[key] = tifGrid;\n    return tifGrid;\n  }\n  /**\n   * Given a proj4 value for nadgrids, return an array of loaded grids\n   * @param {string} nadgrids A comma-separated list of grid names, optionally prefixed with '@' to indicate optional grids.\n   * @returns\n   */\n  function getNadgrids(nadgrids) {\n    // Format details: http://proj.maptools.org/gen_parms.html\n    if (nadgrids === undefined) {\n      return null;\n    }\n    var grids = nadgrids.split(',');\n    return grids.map(parseNadgridString);\n  }\n\n  /**\n   * @param {string} value The nadgrid string to get information for.\n   * @returns {NadgridInfo|null} An object with grid information, or null if the input is empty.\n   */\n  function parseNadgridString(value) {\n    if (value.length === 0) {\n      return null;\n    }\n    var optional = value[0] === '@';\n    if (optional) {\n      value = value.slice(1);\n    }\n    if (value === 'null') {\n      return { name: 'null', mandatory: !optional, grid: null, isNull: true };\n    }\n    return {\n      name: value,\n      mandatory: !optional,\n      grid: loadedNadgrids[value] || null,\n      isNull: false\n    };\n  }\n\n  function degreesToRadians(degrees) {\n    return (degrees) * Math.PI / 180;\n  }\n\n  function secondsToRadians(seconds) {\n    return (seconds / 3600) * Math.PI / 180;\n  }\n\n  function detectLittleEndian(view) {\n    var nFields = view.getInt32(8, false);\n    if (nFields === 11) {\n      return false;\n    }\n    nFields = view.getInt32(8, true);\n    if (nFields !== 11) {\n      console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian');\n    }\n    return true;\n  }\n\n  function readHeader(view, isLittleEndian) {\n    return {\n      nFields: view.getInt32(8, isLittleEndian),\n      nSubgridFields: view.getInt32(24, isLittleEndian),\n      nSubgrids: view.getInt32(40, isLittleEndian),\n      shiftType: decodeString(view, 56, 56 + 8).trim(),\n      fromSemiMajorAxis: view.getFloat64(120, isLittleEndian),\n      fromSemiMinorAxis: view.getFloat64(136, isLittleEndian),\n      toSemiMajorAxis: view.getFloat64(152, isLittleEndian),\n      toSemiMinorAxis: view.getFloat64(168, isLittleEndian)\n    };\n  }\n\n  function decodeString(view, start, end) {\n    return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end)));\n  }\n\n  function readSubgrids(view, header, isLittleEndian, includeErrorFields) {\n    var gridOffset = 176;\n    var grids = [];\n    for (var i = 0; i < header.nSubgrids; i++) {\n      var subHeader = readGridHeader(view, gridOffset, isLittleEndian);\n      var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian, includeErrorFields);\n      var lngColumnCount = Math.round(\n        1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval);\n      var latColumnCount = Math.round(\n        1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval);\n      // Proj4 operates on radians whereas the coordinates are in seconds in the grid\n      grids.push({\n        ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)],\n        del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)],\n        lim: [lngColumnCount, latColumnCount],\n        count: subHeader.gridNodeCount,\n        cvs: mapNodes(nodes)\n      });\n      var rowSize = 16;\n      if (includeErrorFields === false) {\n        rowSize = 8;\n      }\n      gridOffset += 176 + subHeader.gridNodeCount * rowSize;\n    }\n    return grids;\n  }\n\n  /**\n   * @param {*} nodes\n   * @returns Array<Array<number>>\n   */\n  function mapNodes(nodes) {\n    return nodes.map(function (r) {\n      return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)];\n    });\n  }\n\n  function readGridHeader(view, offset, isLittleEndian) {\n    return {\n      name: decodeString(view, offset + 8, offset + 16).trim(),\n      parent: decodeString(view, offset + 24, offset + 24 + 8).trim(),\n      lowerLatitude: view.getFloat64(offset + 72, isLittleEndian),\n      upperLatitude: view.getFloat64(offset + 88, isLittleEndian),\n      lowerLongitude: view.getFloat64(offset + 104, isLittleEndian),\n      upperLongitude: view.getFloat64(offset + 120, isLittleEndian),\n      latitudeInterval: view.getFloat64(offset + 136, isLittleEndian),\n      longitudeInterval: view.getFloat64(offset + 152, isLittleEndian),\n      gridNodeCount: view.getInt32(offset + 168, isLittleEndian)\n    };\n  }\n\n  function readGridNodes(view, offset, gridHeader, isLittleEndian, includeErrorFields) {\n    var nodesOffset = offset + 176;\n    var gridRecordLength = 16;\n\n    if (includeErrorFields === false) {\n      gridRecordLength = 8;\n    }\n\n    var gridShiftRecords = [];\n    for (var i = 0; i < gridHeader.gridNodeCount; i++) {\n      var record = {\n        latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian),\n        longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian)\n\n      };\n\n      if (includeErrorFields !== false) {\n        record.latitudeAccuracy = view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian);\n        record.longitudeAccuracy = view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian);\n      }\n\n      gridShiftRecords.push(record);\n    }\n    return gridShiftRecords;\n  }\n\n  /**\n   * @typedef {Object} DatumDefinition\n   * @property {number} datum_type - The type of datum.\n   * @property {number} a - Semi-major axis of the ellipsoid.\n   * @property {number} b - Semi-minor axis of the ellipsoid.\n   * @property {number} es - Eccentricity squared of the ellipsoid.\n   * @property {number} ep2 - Second eccentricity squared of the ellipsoid.\n   */\n\n  /**\n   * @param {string | import('./core').PROJJSONDefinition | import('./defs').ProjectionDefinition} srsCode\n   * @param {(errorMessage?: string, instance?: Projection) => void} [callback]\n   */\n  function Projection(srsCode, callback) {\n    if (!(this instanceof Projection)) {\n      return new Projection(srsCode);\n    }\n    /** @type {<T extends import('./core').TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} */\n    this.forward = null;\n    /** @type {<T extends import('./core').TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} */\n    this.inverse = null;\n    /** @type {function(): void} */\n    this.init = null;\n    /** @type {string} */\n    this.name;\n    /** @type {string} */\n    this.axis;\n    /** @type {Array<string>} */\n    this.names = null;\n    /** @type {string} */\n    this.title;\n    callback = callback || function (error) {\n      if (error) {\n        throw error;\n      }\n    };\n    var json = parse(srsCode);\n    if (typeof json !== 'object') {\n      callback('Could not parse to valid json: ' + srsCode);\n      return;\n    }\n    var ourProj = Projection.projections.get(json.projName);\n    if (!ourProj) {\n      callback('Could not get projection name from: ' + srsCode);\n      return;\n    }\n    if (json.datumCode && json.datumCode !== 'none') {\n      var datumDef = match(datums, json.datumCode);\n      if (datumDef) {\n        json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null);\n        json.ellps = datumDef.ellipse;\n        json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode;\n      }\n    }\n    json.axis = json.axis || 'enu';\n    json.ellps = json.ellps || 'wgs84';\n    json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this\n\n    var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere);\n    var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A);\n    var nadgrids = getNadgrids(json.nadgrids);\n    /** @type {DatumDefinition} */\n    var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2,\n      nadgrids);\n\n    extend(this, json); // transfer everything over from the projection because we don't know what we'll need\n    extend(this, ourProj); // transfer all the methods from the projection\n\n    // copy the 4 things over we calculated in deriveConstants.sphere\n    this.a = sphere_.a;\n    this.b = sphere_.b;\n    this.rf = sphere_.rf;\n    this.sphere = sphere_.sphere;\n\n    // copy the 3 things we calculated in deriveConstants.eccentricity\n    this.es = ecc.es;\n    this.e = ecc.e;\n    this.ep2 = ecc.ep2;\n\n    // add in the datum object\n    this.datum = datumObj;\n\n    // init the projection\n    if ('init' in this && typeof this.init === 'function') {\n      this.init();\n    }\n\n    // only default the scale factor once the projection had a chance to set its own\n    if (!this.k0) {\n      this.k0 = 1.0;\n    }\n\n    // legecy callback from back in the day when it went to spatialreference.org\n    callback(null, this);\n  }\n  Projection.projections = projections;\n  Projection.projections.start();\n\n  function compareDatums(source, dest) {\n    if (source.datum_type !== dest.datum_type) {\n      return false; // false, datums are not equal\n    } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) {\n      // the tolerance for es is to ensure that GRS80 and WGS84\n      // are considered identical\n      return false;\n    } else if (source.datum_type === PJD_3PARAM) {\n      return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]);\n    } else if (source.datum_type === PJD_7PARAM) {\n      return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]);\n    } else {\n      return true; // datums are equal\n    }\n  } // cs_compare_datums()\n\n  /*\n   * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates\n   * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z),\n   * according to the current ellipsoid parameters.\n   *\n   *    Latitude  : Geodetic latitude in radians                     (input)\n   *    Longitude : Geodetic longitude in radians                    (input)\n   *    Height    : Geodetic height, in meters                       (input)\n   *    X         : Calculated Geocentric X coordinate, in meters    (output)\n   *    Y         : Calculated Geocentric Y coordinate, in meters    (output)\n   *    Z         : Calculated Geocentric Z coordinate, in meters    (output)\n   *\n   */\n  function geodeticToGeocentric(p, es, a) {\n    var Longitude = p.x;\n    var Latitude = p.y;\n    var Height = p.z ? p.z : 0; // Z value not always supplied\n\n    var Rn; /*  Earth radius at location  */\n    var Sin_Lat; /*  Math.sin(Latitude)  */\n    var Sin2_Lat; /*  Square of Math.sin(Latitude)  */\n    var Cos_Lat; /*  Math.cos(Latitude)  */\n\n    /*\n     ** Don't blow up if Latitude is just a little out of the value\n     ** range as it may just be a rounding issue.  Also removed longitude\n     ** test, it should be wrapped by Math.cos() and Math.sin().  NFW for PROJ.4, Sep/2001.\n     */\n    if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) {\n      Latitude = -HALF_PI;\n    } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) {\n      Latitude = HALF_PI;\n    } else if (Latitude < -HALF_PI) {\n      /* Latitude out of range */\n      // ..reportError('geocent:lat out of range:' + Latitude);\n      return { x: -Infinity, y: -Infinity, z: p.z };\n    } else if (Latitude > HALF_PI) {\n      /* Latitude out of range */\n      return { x: Infinity, y: Infinity, z: p.z };\n    }\n\n    if (Longitude > Math.PI) {\n      Longitude -= (2 * Math.PI);\n    }\n    Sin_Lat = Math.sin(Latitude);\n    Cos_Lat = Math.cos(Latitude);\n    Sin2_Lat = Sin_Lat * Sin_Lat;\n    Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat));\n    return {\n      x: (Rn + Height) * Cos_Lat * Math.cos(Longitude),\n      y: (Rn + Height) * Cos_Lat * Math.sin(Longitude),\n      z: ((Rn * (1 - es)) + Height) * Sin_Lat\n    };\n  } // cs_geodetic_to_geocentric()\n\n  function geocentricToGeodetic(p, es, a, b) {\n    /* local defintions and variables */\n    /* end-criterium of loop, accuracy of sin(Latitude) */\n    var genau = 1e-12;\n    var genau2 = (genau * genau);\n    var maxiter = 30;\n\n    var P; /* distance between semi-minor axis and location */\n    var RR; /* distance between center and location */\n    var CT; /* sin of geocentric latitude */\n    var ST; /* cos of geocentric latitude */\n    var RX;\n    var RK;\n    var RN; /* Earth radius at location */\n    var CPHI0; /* cos of start or old geodetic latitude in iterations */\n    var SPHI0; /* sin of start or old geodetic latitude in iterations */\n    var CPHI; /* cos of searched geodetic latitude */\n    var SPHI; /* sin of searched geodetic latitude */\n    var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */\n    var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */\n\n    var X = p.x;\n    var Y = p.y;\n    var Z = p.z ? p.z : 0.0; // Z value not always supplied\n    var Longitude;\n    var Latitude;\n    var Height;\n\n    P = Math.sqrt(X * X + Y * Y);\n    RR = Math.sqrt(X * X + Y * Y + Z * Z);\n\n    /*      special cases for latitude and longitude */\n    if (P / a < genau) {\n      /*  special case, if P=0. (X=0., Y=0.) */\n      Longitude = 0.0;\n\n      /*  if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis\n       *  of ellipsoid (=center of mass), Latitude becomes PI/2 */\n      if (RR / a < genau) {\n        Latitude = HALF_PI;\n        Height = -b;\n        return {\n          x: p.x,\n          y: p.y,\n          z: p.z\n        };\n      }\n    } else {\n      /*  ellipsoidal (geodetic) longitude\n       *  interval: -PI < Longitude <= +PI */\n      Longitude = Math.atan2(Y, X);\n    }\n\n    /* --------------------------------------------------------------\n     * Following iterative algorithm was developped by\n     * \"Institut for Erdmessung\", University of Hannover, July 1988.\n     * Internet: www.ife.uni-hannover.de\n     * Iterative computation of CPHI,SPHI and Height.\n     * Iteration of CPHI and SPHI to 10**-12 radian resp.\n     * 2*10**-7 arcsec.\n     * --------------------------------------------------------------\n     */\n    CT = Z / RR;\n    ST = P / RR;\n    RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST);\n    CPHI0 = ST * (1.0 - es) * RX;\n    SPHI0 = CT * RX;\n    iter = 0;\n\n    /* loop to find sin(Latitude) resp. Latitude\n     * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */\n    do {\n      iter++;\n      RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0);\n\n      /*  ellipsoidal (geodetic) height */\n      Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0);\n\n      RK = es * RN / (RN + Height);\n      RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST);\n      CPHI = ST * (1.0 - RK) * RX;\n      SPHI = CT * RX;\n      SDPHI = SPHI * CPHI0 - CPHI * SPHI0;\n      CPHI0 = CPHI;\n      SPHI0 = SPHI;\n    }\n    while (SDPHI * SDPHI > genau2 && iter < maxiter);\n\n    /*      ellipsoidal (geodetic) latitude */\n    Latitude = Math.atan(SPHI / Math.abs(CPHI));\n    return {\n      x: Longitude,\n      y: Latitude,\n      z: Height\n    };\n  } // cs_geocentric_to_geodetic()\n\n  /****************************************************************/\n  // pj_geocentic_to_wgs84( p )\n  //  p = point to transform in geocentric coordinates (x,y,z)\n\n  /** point object, nothing fancy, just allows values to be\n      passed back and forth by reference rather than by value.\n      Other point classes may be used as long as they have\n      x and y properties, which will get modified in the transform method.\n  */\n  function geocentricToWgs84(p, datum_type, datum_params) {\n    if (datum_type === PJD_3PARAM) {\n      // if( x[io] === HUGE_VAL )\n      //    continue;\n      return {\n        x: p.x + datum_params[0],\n        y: p.y + datum_params[1],\n        z: p.z + datum_params[2]\n      };\n    } else if (datum_type === PJD_7PARAM) {\n      var Dx_BF = datum_params[0];\n      var Dy_BF = datum_params[1];\n      var Dz_BF = datum_params[2];\n      var Rx_BF = datum_params[3];\n      var Ry_BF = datum_params[4];\n      var Rz_BF = datum_params[5];\n      var M_BF = datum_params[6];\n      // if( x[io] === HUGE_VAL )\n      //    continue;\n      return {\n        x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF,\n        y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF,\n        z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF\n      };\n    }\n  } // cs_geocentric_to_wgs84\n\n  /****************************************************************/\n  // pj_geocentic_from_wgs84()\n  //  coordinate system definition,\n  //  point to transform in geocentric coordinates (x,y,z)\n  function geocentricFromWgs84(p, datum_type, datum_params) {\n    if (datum_type === PJD_3PARAM) {\n      // if( x[io] === HUGE_VAL )\n      //    continue;\n      return {\n        x: p.x - datum_params[0],\n        y: p.y - datum_params[1],\n        z: p.z - datum_params[2]\n      };\n    } else if (datum_type === PJD_7PARAM) {\n      var Dx_BF = datum_params[0];\n      var Dy_BF = datum_params[1];\n      var Dz_BF = datum_params[2];\n      var Rx_BF = datum_params[3];\n      var Ry_BF = datum_params[4];\n      var Rz_BF = datum_params[5];\n      var M_BF = datum_params[6];\n      var x_tmp = (p.x - Dx_BF) / M_BF;\n      var y_tmp = (p.y - Dy_BF) / M_BF;\n      var z_tmp = (p.z - Dz_BF) / M_BF;\n      // if( x[io] === HUGE_VAL )\n      //    continue;\n\n      return {\n        x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp,\n        y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp,\n        z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp\n      };\n    } // cs_geocentric_from_wgs84()\n  }\n\n  function checkParams(type) {\n    return (type === PJD_3PARAM || type === PJD_7PARAM);\n  }\n\n  function datum_transform (source, dest, point) {\n    // Short cut if the datums are identical.\n    if (compareDatums(source, dest)) {\n      return point; // in this case, zero is sucess,\n      // whereas cs_compare_datums returns 1 to indicate TRUE\n      // confusing, should fix this\n    }\n\n    // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest\n    if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) {\n      return point;\n    }\n\n    // If this datum requires grid shifts, then apply it to geodetic coordinates.\n    var source_a = source.a;\n    var source_es = source.es;\n    if (source.datum_type === PJD_GRIDSHIFT) {\n      var gridShiftCode = applyGridShift(source, false, point);\n      if (gridShiftCode !== 0) {\n        return undefined;\n      }\n      source_a = SRS_WGS84_SEMIMAJOR;\n      source_es = SRS_WGS84_ESQUARED;\n    }\n\n    var dest_a = dest.a;\n    var dest_b = dest.b;\n    var dest_es = dest.es;\n    if (dest.datum_type === PJD_GRIDSHIFT) {\n      dest_a = SRS_WGS84_SEMIMAJOR;\n      dest_b = SRS_WGS84_SEMIMINOR;\n      dest_es = SRS_WGS84_ESQUARED;\n    }\n\n    // Do we need to go through geocentric coordinates?\n    if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) {\n      return point;\n    }\n\n    // Convert to geocentric coordinates.\n    point = geodeticToGeocentric(point, source_es, source_a);\n    // Convert between datums\n    if (checkParams(source.datum_type)) {\n      point = geocentricToWgs84(point, source.datum_type, source.datum_params);\n    }\n    if (checkParams(dest.datum_type)) {\n      point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params);\n    }\n    point = geocentricToGeodetic(point, dest_es, dest_a, dest_b);\n\n    if (dest.datum_type === PJD_GRIDSHIFT) {\n      var destGridShiftResult = applyGridShift(dest, true, point);\n      if (destGridShiftResult !== 0) {\n        return undefined;\n      }\n    }\n\n    return point;\n  }\n\n  function applyGridShift(source, inverse, point) {\n    if (source.grids === null || source.grids.length === 0) {\n      console.log('Grid shift grids not found');\n      return -1;\n    }\n    var input = { x: -point.x, y: point.y };\n    var output = { x: Number.NaN, y: Number.NaN };\n    var attemptedGrids = [];\n    outer:\n    for (var i = 0; i < source.grids.length; i++) {\n      var grid = source.grids[i];\n      attemptedGrids.push(grid.name);\n      if (grid.isNull) {\n        output = input;\n        break;\n      }\n      if (grid.grid === null) {\n        if (grid.mandatory) {\n          console.log('Unable to find mandatory grid \\'' + grid.name + '\\'');\n          return -1;\n        }\n        continue;\n      }\n      var subgrids = grid.grid.subgrids;\n      for (var j = 0, jj = subgrids.length; j < jj; j++) {\n        var subgrid = subgrids[j];\n        // skip tables that don't match our point at all\n        var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0;\n        var minX = subgrid.ll[0] - epsilon;\n        var minY = subgrid.ll[1] - epsilon;\n        var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon;\n        var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon;\n        if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x) {\n          continue;\n        }\n        output = applySubgridShift(input, inverse, subgrid);\n        if (!isNaN(output.x)) {\n          break outer;\n        }\n      }\n    }\n    if (isNaN(output.x)) {\n      console.log('Failed to find a grid shift table for location \\''\n        + -input.x * R2D + ' ' + input.y * R2D + ' tried: \\'' + attemptedGrids + '\\'');\n      return -1;\n    }\n    point.x = -output.x;\n    point.y = output.y;\n    return 0;\n  }\n\n  function applySubgridShift(pin, inverse, ct) {\n    var val = { x: Number.NaN, y: Number.NaN };\n    if (isNaN(pin.x)) {\n      return val;\n    }\n    var tb = { x: pin.x, y: pin.y };\n    tb.x -= ct.ll[0];\n    tb.y -= ct.ll[1];\n    tb.x = adjust_lon(tb.x - Math.PI) + Math.PI;\n    var t = nadInterpolate(tb, ct);\n    if (inverse) {\n      if (isNaN(t.x)) {\n        return val;\n      }\n      t.x = tb.x - t.x;\n      t.y = tb.y - t.y;\n      var i = 9, tol = 1e-12;\n      var dif, del;\n      do {\n        del = nadInterpolate(t, ct);\n        if (isNaN(del.x)) {\n          console.log('Inverse grid shift iteration failed, presumably at grid edge.  Using first approximation.');\n          break;\n        }\n        dif = { x: tb.x - (del.x + t.x), y: tb.y - (del.y + t.y) };\n        t.x += dif.x;\n        t.y += dif.y;\n      } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol);\n      if (i < 0) {\n        console.log('Inverse grid shift iterator failed to converge.');\n        return val;\n      }\n      val.x = adjust_lon(t.x + ct.ll[0]);\n      val.y = t.y + ct.ll[1];\n    } else {\n      if (!isNaN(t.x)) {\n        val.x = pin.x + t.x;\n        val.y = pin.y + t.y;\n      }\n    }\n    return val;\n  }\n\n  function nadInterpolate(pin, ct) {\n    var t = { x: pin.x / ct.del[0], y: pin.y / ct.del[1] };\n    var indx = { x: Math.floor(t.x), y: Math.floor(t.y) };\n    var frct = { x: t.x - 1.0 * indx.x, y: t.y - 1.0 * indx.y };\n    var val = { x: Number.NaN, y: Number.NaN };\n    var inx;\n    if (indx.x < 0 || indx.x >= ct.lim[0]) {\n      return val;\n    }\n    if (indx.y < 0 || indx.y >= ct.lim[1]) {\n      return val;\n    }\n    inx = (indx.y * ct.lim[0]) + indx.x;\n    var f00 = { x: ct.cvs[inx][0], y: ct.cvs[inx][1] };\n    inx++;\n    var f10 = { x: ct.cvs[inx][0], y: ct.cvs[inx][1] };\n    inx += ct.lim[0];\n    var f11 = { x: ct.cvs[inx][0], y: ct.cvs[inx][1] };\n    inx--;\n    var f01 = { x: ct.cvs[inx][0], y: ct.cvs[inx][1] };\n    var m11 = frct.x * frct.y, m10 = frct.x * (1.0 - frct.y),\n      m00 = (1.0 - frct.x) * (1.0 - frct.y), m01 = (1.0 - frct.x) * frct.y;\n    val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x);\n    val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y);\n    return val;\n  }\n\n  var order = ['x', 'y', 'z'];\n\n  /**\n   * Convert a point in a given CRS axis order to ENU (east/north/up) order\n   * @param {import('./defs').ProjectionDefinition} crs\n   * @param {import('./core').InterfaceCoordinates} point\n   * @returns {import('./core').InterfaceCoordinates | null}\n   */\n  function adjustAxisToEnu(crs, point) {\n    /** @type {import(\"./core\").InterfaceCoordinates} */\n    const out = {};\n    for (let i = 0, ii = crs.axis.length; i < ii; i++) {\n      if (i === 2 && point.z === undefined) {\n        continue;\n      }\n      let v = point[order[i]];\n      switch (crs.axis[i]) {\n        case 'e':\n          out.x = v;\n          break;\n        case 'w':\n          out.x = -v;\n          break;\n        case 'n':\n          out.y = v;\n          break;\n        case 's':\n          out.y = -v;\n          break;\n        case 'u':\n          out.z = v;\n          break;\n        case 'd':\n          out.z = -v;\n          break;\n        default:\n          // console.log(\"ERROR: unknown axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n          return null;\n      }\n    }\n    return out;\n  }\n\n  /**\n   * Convert a point in ENU (east/north/up) order to the given CRS axis order.\n   * @param {import('./defs').ProjectionDefinition} crs\n   * @param {import('./core').InterfaceCoordinates} point\n   * @returns {import('./core').InterfaceCoordinates | null}\n   */\n  function adjustAxisFromEnu(crs, point) {\n    const out = /** @type {import(\"./core\").InterfaceCoordinates} */ ({});\n    for (let i = 0, ii = crs.axis.length; i < ii; i++) {\n      if (i === 2 && point.z === undefined) {\n        continue;\n      }\n      switch (crs.axis[i]) {\n        case 'e':\n          out[order[i]] = point.x;\n          break;\n        case 'w':\n          out[order[i]] = -point.x;\n          break;\n        case 'n':\n          out[order[i]] = point.y;\n          break;\n        case 's':\n          out[order[i]] = -point.y;\n          break;\n        case 'u':\n          out[order[i]] = point.z;\n          break;\n        case 'd':\n          out[order[i]] = -point.z;\n          break;\n        default:\n          // console.log(\"ERROR: unknown axis (\"+crs.axis[i]+\") - check definition of \"+crs.projName);\n          return null;\n      }\n    }\n    return out;\n  }\n\n  /**\n   * @param {Array<number>} array\n   * @returns {import(\"../core\").InterfaceCoordinates}\n   */\n  function common (array) {\n    var out = {\n      x: array[0],\n      y: array[1]\n    };\n    if (array.length > 2) {\n      out.z = array[2];\n    }\n    if (array.length > 3) {\n      out.m = array[3];\n    }\n    return out;\n  }\n\n  function checkSanity (point) {\n    checkCoord(point.x);\n    checkCoord(point.y);\n  }\n  function checkCoord(num) {\n    if (typeof Number.isFinite === 'function') {\n      if (Number.isFinite(num)) {\n        return;\n      }\n      throw new TypeError('coordinates must be finite numbers');\n    }\n    if (typeof num !== 'number' || num !== num || !isFinite(num)) {\n      throw new TypeError('coordinates must be finite numbers');\n    }\n  }\n\n  function checkNotWGS(source, dest) {\n    return (\n      (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM || source.datum.datum_type === PJD_GRIDSHIFT) && dest.datumCode !== 'WGS84')\n    || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM || dest.datum.datum_type === PJD_GRIDSHIFT) && source.datumCode !== 'WGS84');\n  }\n\n  /**\n   * Internal transform: accepts an already-cloned point object, returns transformed point object.\n   * @param {import('./defs').ProjectionDefinition} source\n   * @param {import('./defs').ProjectionDefinition} dest\n   * @param {import('./core').InterfaceCoordinates} point\n   * @param {boolean} [enforceAxis]\n   * @returns {import('./core').InterfaceCoordinates | undefined}\n   */\n  function transformInternal(source, dest, point, enforceAxis) {\n    var wgs84;\n    var hasZ = point.z !== undefined;\n    checkSanity(point);\n    // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84\n    if (source.datum && dest.datum && checkNotWGS(source, dest)) {\n      wgs84 = new Projection('WGS84');\n      point = transformInternal(source, wgs84, point, enforceAxis);\n      source = wgs84;\n    }\n    // DGR, 2010/11/12\n    if (enforceAxis && source.axis !== 'enu') {\n      point = adjustAxisToEnu(source, point);\n    }\n    // Transform source points to long/lat, if they aren't already.\n    if (source.projName === 'longlat') {\n      point = {\n        x: point.x * D2R$1,\n        y: point.y * D2R$1,\n        z: point.z || 0\n      };\n    } else {\n      if (source.to_meter) {\n        point = {\n          x: point.x * source.to_meter,\n          y: point.y * source.to_meter,\n          z: point.z || 0\n        };\n      }\n      point = source.inverse(point); // Convert Cartesian to longlat\n      if (!point) {\n        return;\n      }\n    }\n    // Adjust for the prime meridian if necessary\n    if (source.from_greenwich) {\n      point.x += source.from_greenwich;\n    }\n\n    // Convert datums if needed, and if possible.\n    point = datum_transform(source.datum, dest.datum, point);\n    if (!point) {\n      return;\n    }\n\n    point = /** @type {import('./core').InterfaceCoordinates} */ (point);\n\n    // Adjust for the prime meridian if necessary\n    if (dest.from_greenwich) {\n      point = {\n        x: point.x - dest.from_greenwich,\n        y: point.y,\n        z: point.z || 0\n      };\n    }\n\n    if (dest.projName === 'longlat') {\n      // wrap longitude into the range centered on dest.long_wrap, if requested (+lon_wrap)\n      if (dest.long_wrap !== undefined) {\n        point.x = dest.long_wrap + adjust_lon(point.x - dest.long_wrap);\n      }\n      // convert radians to decimal degrees\n      point = {\n        x: point.x * R2D,\n        y: point.y * R2D,\n        z: point.z || 0\n      };\n    } else { // else project\n      point = dest.forward(point);\n      if (dest.to_meter) {\n        point = {\n          x: point.x / dest.to_meter,\n          y: point.y / dest.to_meter,\n          z: point.z || 0\n        };\n      }\n    }\n\n    // DGR, 2010/11/12\n    if (enforceAxis && dest.axis !== 'enu') {\n      return adjustAxisFromEnu(dest, point);\n    }\n\n    if (point && !hasZ && dest.projName !== 'geocent') {\n      delete point.z;\n    }\n    return point;\n  }\n\n  /**\n   * @param {import('./defs').ProjectionDefinition} source\n   * @param {import('./defs').ProjectionDefinition} dest\n   * @param {import('./core').TemplateCoordinates} point\n   * @param {boolean} [enforceAxis]\n   * @returns {import('./core').InterfaceCoordinates | undefined}\n   */\n  function transform(source, dest, point, enforceAxis) {\n    var pt;\n    if (Array.isArray(point)) {\n      pt = common(point);\n    } else {\n      // Clone the point object so inputs don't get modified\n      pt = { x: point.x, y: point.y, z: point.z, m: point.m };\n    }\n    return transformInternal(source, dest, pt, enforceAxis);\n  }\n\n  var wgs84 = Projection('WGS84');\n\n  /**\n   * @typedef {{x: number, y: number, z?: number, m?: number}} InterfaceCoordinates\n   */\n\n  /**\n   * @typedef {Array<number> | InterfaceCoordinates} TemplateCoordinates\n   */\n\n  /**\n   * @typedef {Object} Converter\n   * @property {<T extends TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} forward\n   * @property {<T extends TemplateCoordinates>(coordinates: T, enforceAxis?: boolean) => T} inverse\n   * @property {proj} [oProj]\n   */\n\n  /**\n   * @typedef {Object} PROJJSONDefinition\n   * @property {string} [$schema]\n   * @property {string} type\n   * @property {string} [name]\n   * @property {{authority: string, code: number}} [id]\n   * @property {string} [scope]\n   * @property {string} [area]\n   * @property {{south_latitude: number, west_longitude: number, north_latitude: number, east_longitude: number}} [bbox]\n   * @property {PROJJSONDefinition[]} [components]\n   * @property {{type: string, name: string}} [datum]\n   * @property {{\n   *   name: string,\n   *   members: Array<{\n   *     name: string,\n   *     id?: {authority: string, code: number}\n   *   }>,\n   *   ellipsoid?: {\n   *     name: string,\n   *     semi_major_axis: number,\n   *     inverse_flattening?: number\n   *   },\n   *   accuracy?: string,\n   *   id?: {authority: string, code: number}\n   * }} [datum_ensemble]\n   * @property {{\n   *   subtype: string,\n   *   axis: Array<{\n   *     name: string,\n   *     abbreviation?: string,\n   *     direction: string,\n   *     unit: string\n   *   }>\n   * }} [coordinate_system]\n   * @property {{\n   *   name: string,\n   *   method: {name: string},\n   *   parameters: Array<{\n   *     name: string,\n   *     value: number,\n   *     unit?: string\n   *   }>\n   * }} [conversion]\n   * @property {{\n   *   name: string,\n   *   method: {name: string},\n   *   parameters: Array<{\n   *     name: string,\n   *     value: number,\n   *     unit?: string,\n   *     type?: string,\n   *     file_name?: string\n   *   }>\n   * }} [transformation]\n   */\n\n  /**\n   * @template {TemplateCoordinates} T\n   * @param {proj} from\n   * @param {proj} to\n   * @param {T} coords\n   * @param {boolean} [enforceAxis]\n   * @returns {T}\n   */\n  function transformer(from, to, coords, enforceAxis) {\n    var out, geocent, keys;\n    if (Array.isArray(coords)) {\n      out = transformInternal(from, to, common(coords), enforceAxis) || { x: NaN, y: NaN };\n      if (coords.length > 2) {\n        geocent = (typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent');\n        if (geocent) {\n          if (typeof out.z === 'number') {\n            return /** @type {T} */ ([out.x, out.y, out.z].concat(coords.slice(3)));\n          }\n          return /** @type {T} */ ([out.x, out.y, coords[2]].concat(coords.slice(3)));\n        }\n        if (enforceAxis && typeof out.z === 'number') {\n          return /** @type {T} */ ([out.x, out.y, out.z].concat(coords.slice(3)));\n        }\n        return /** @type {T} */ ([out.x, out.y].concat(coords.slice(2)));\n      }\n      return /** @type {T} */ ([out.x, out.y]);\n    } else {\n      out = transformInternal(from, to, { x: coords.x, y: coords.y, z: coords.z, m: coords.m }, enforceAxis) || { x: NaN, y: NaN };\n      keys = Object.keys(coords);\n      if (keys.length === 2) {\n        return /** @type {T} */ (out);\n      }\n      geocent = (typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent');\n      keys.forEach(function (key) {\n        if (key === 'x' || key === 'y') {\n          return;\n        }\n        if (key === 'z' && (geocent || enforceAxis)) {\n          return;\n        }\n        out[key] = coords[key];\n      });\n      return /** @type {T} */ (out);\n    }\n  }\n\n  /**\n   * @param {proj | string | PROJJSONDefinition | Converter} item\n   * @returns {import('./Proj').default}\n   */\n  function checkProj(item) {\n    if (item instanceof Projection) {\n      return item;\n    }\n    if (typeof item === 'object' && 'oProj' in item) {\n      return item.oProj;\n    }\n    return Projection(/** @type {string | PROJJSONDefinition} */ (item));\n  }\n\n  /**\n   * @overload\n   * @param {string | PROJJSONDefinition | proj} toProj\n   * @returns {Converter}\n   */\n  /**\n   * @overload\n   * @param {string | PROJJSONDefinition | proj} fromProj\n   * @param {string | PROJJSONDefinition | proj} toProj\n   * @returns {Converter}\n   */\n  /**\n   * @template {TemplateCoordinates} T\n   * @overload\n   * @param {string | PROJJSONDefinition | proj} toProj\n   * @param {T} coord\n   * @returns {T}\n   */\n  /**\n   * @template {TemplateCoordinates} T\n   * @overload\n   * @param {string | PROJJSONDefinition | proj} fromProj\n   * @param {string | PROJJSONDefinition | proj} toProj\n   * @param {T} coord\n   * @returns {T}\n   */\n  /**\n   * @template {TemplateCoordinates} T\n   * @param {string | PROJJSONDefinition | proj} fromProjOrToProj\n   * @param {string | PROJJSONDefinition | proj | TemplateCoordinates} [toProjOrCoord]\n   * @param {T} [coord]\n   * @returns {T|Converter}\n   */\n  function proj4$1(fromProjOrToProj, toProjOrCoord, coord) {\n    /** @type {proj} */\n    var fromProj;\n    /** @type {proj} */\n    var toProj;\n    var single = false;\n    /** @type {Converter} */\n    var obj;\n    if (typeof toProjOrCoord === 'undefined') {\n      toProj = checkProj(fromProjOrToProj);\n      fromProj = wgs84;\n      single = true;\n    } else if (typeof /** @type {?} */ (toProjOrCoord).x !== 'undefined' || Array.isArray(toProjOrCoord)) {\n      coord = /** @type {T} */ (/** @type {?} */ (toProjOrCoord));\n      toProj = checkProj(fromProjOrToProj);\n      fromProj = wgs84;\n      single = true;\n    }\n    if (!fromProj) {\n      fromProj = checkProj(fromProjOrToProj);\n    }\n    if (!toProj) {\n      toProj = checkProj(/** @type {string | PROJJSONDefinition | proj } */ (toProjOrCoord));\n    }\n    if (coord) {\n      return transformer(fromProj, toProj, coord);\n    } else {\n      obj = {\n        /**\n         * @template {TemplateCoordinates} T\n         * @param {T} coords\n         * @param {boolean=} enforceAxis\n         * @returns {T}\n         */\n        forward: function (coords, enforceAxis) {\n          return transformer(fromProj, toProj, coords, enforceAxis);\n        },\n        /**\n         * @template {TemplateCoordinates} T\n         * @param {T} coords\n         * @param {boolean=} enforceAxis\n         * @returns {T}\n         */\n        inverse: function (coords, enforceAxis) {\n          return transformer(toProj, fromProj, coords, enforceAxis);\n        }\n      };\n      if (single) {\n        obj.oProj = toProj;\n      }\n      return obj;\n    }\n  }\n\n  /**\n   * UTM zones are grouped, and assigned to one of a group of 6\n   * sets.\n   *\n   * {int} @private\n   */\n  var NUM_100K_SETS = 6;\n\n  /**\n   * The column letters (for easting) of the lower left value, per\n   * set.\n   *\n   * {string} @private\n   */\n  var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS';\n\n  /**\n   * The row letters (for northing) of the lower left value, per\n   * set.\n   *\n   * {string} @private\n   */\n  var SET_ORIGIN_ROW_LETTERS = 'AFAFAF';\n\n  var A = 65; // A\n  var I = 73; // I\n  var O = 79; // O\n  var V = 86; // V\n  var Z = 90; // Z\n  var mgrs = {\n    forward: forward$w,\n    inverse: inverse$w,\n    toPoint: toPoint\n  };\n  /**\n   * Conversion of lat/lon to MGRS.\n   *\n   * @param {object} ll Object literal with lat and lon properties on a\n   *     WGS84 ellipsoid.\n   * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for\n   *      100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5.\n   * @return {string} the MGRS string for the given location and accuracy.\n   */\n  function forward$w(ll, accuracy) {\n    accuracy = accuracy || 5; // default accuracy 1m\n    return encode(LLtoUTM({\n      lat: ll[1],\n      lon: ll[0]\n    }), accuracy);\n  }\n  /**\n   * Conversion of MGRS to lat/lon.\n   *\n   * @param {string} mgrs MGRS string.\n   * @return {array} An array with left (longitude), bottom (latitude), right\n   *     (longitude) and top (latitude) values in WGS84, representing the\n   *     bounding box for the provided MGRS reference.\n   */\n  function inverse$w(mgrs) {\n    var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n    if (bbox.lat && bbox.lon) {\n      return [bbox.lon, bbox.lat, bbox.lon, bbox.lat];\n    }\n    return [bbox.left, bbox.bottom, bbox.right, bbox.top];\n  }\n  function toPoint(mgrs) {\n    var bbox = UTMtoLL(decode(mgrs.toUpperCase()));\n    if (bbox.lat && bbox.lon) {\n      return [bbox.lon, bbox.lat];\n    }\n    return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2];\n  }/**\n   * Conversion from degrees to radians.\n   *\n   * @private\n   * @param {number} deg the angle in degrees.\n   * @return {number} the angle in radians.\n   */\n  function degToRad(deg) {\n    return (deg * (Math.PI / 180.0));\n  }\n\n  /**\n   * Conversion from radians to degrees.\n   *\n   * @private\n   * @param {number} rad the angle in radians.\n   * @return {number} the angle in degrees.\n   */\n  function radToDeg(rad) {\n    return (180.0 * (rad / Math.PI));\n  }\n\n  /**\n   * Converts a set of Longitude and Latitude co-ordinates to UTM\n   * using the WGS84 ellipsoid.\n   *\n   * @private\n   * @param {object} ll Object literal with lat and lon properties\n   *     representing the WGS84 coordinate to be converted.\n   * @return {object} Object literal containing the UTM value with easting,\n   *     northing, zoneNumber and zoneLetter properties, and an optional\n   *     accuracy property in digits. Returns null if the conversion failed.\n   */\n  function LLtoUTM(ll) {\n    var Lat = ll.lat;\n    var Long = ll.lon;\n    var a = 6378137.0; //ellip.radius;\n    var eccSquared = 0.00669438; //ellip.eccsq;\n    var k0 = 0.9996;\n    var LongOrigin;\n    var eccPrimeSquared;\n    var N, T, C, A, M;\n    var LatRad = degToRad(Lat);\n    var LongRad = degToRad(Long);\n    var LongOriginRad;\n    var ZoneNumber;\n    // (int)\n    ZoneNumber = Math.floor((Long + 180) / 6) + 1;\n\n    //Make sure the longitude 180.00 is in Zone 60\n    if (Long === 180) {\n      ZoneNumber = 60;\n    }\n\n    // Special zone for Norway\n    if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {\n      ZoneNumber = 32;\n    }\n\n    // Special zones for Svalbard\n    if (Lat >= 72.0 && Lat < 84.0) {\n      if (Long >= 0.0 && Long < 9.0) {\n        ZoneNumber = 31;\n      }\n      else if (Long >= 9.0 && Long < 21.0) {\n        ZoneNumber = 33;\n      }\n      else if (Long >= 21.0 && Long < 33.0) {\n        ZoneNumber = 35;\n      }\n      else if (Long >= 33.0 && Long < 42.0) {\n        ZoneNumber = 37;\n      }\n    }\n\n    LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin\n    // in middle of\n    // zone\n    LongOriginRad = degToRad(LongOrigin);\n\n    eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n    N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad));\n    T = Math.tan(LatRad) * Math.tan(LatRad);\n    C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);\n    A = Math.cos(LatRad) * (LongRad - LongOriginRad);\n\n    M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad));\n\n    var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);\n\n    var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));\n    if (Lat < 0.0) {\n      UTMNorthing += 10000000.0; //10000000 meter offset for\n      // southern hemisphere\n    }\n\n    return {\n      northing: Math.round(UTMNorthing),\n      easting: Math.round(UTMEasting),\n      zoneNumber: ZoneNumber,\n      zoneLetter: getLetterDesignator(Lat)\n    };\n  }\n\n  /**\n   * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience\n   * class where the Zone can be specified as a single string eg.\"60N\" which\n   * is then broken down into the ZoneNumber and ZoneLetter.\n   *\n   * @private\n   * @param {object} utm An object literal with northing, easting, zoneNumber\n   *     and zoneLetter properties. If an optional accuracy property is\n   *     provided (in meters), a bounding box will be returned instead of\n   *     latitude and longitude.\n   * @return {object} An object literal containing either lat and lon values\n   *     (if no accuracy was provided), or top, right, bottom and left values\n   *     for the bounding box calculated according to the provided accuracy.\n   *     Returns null if the conversion failed.\n   */\n  function UTMtoLL(utm) {\n\n    var UTMNorthing = utm.northing;\n    var UTMEasting = utm.easting;\n    var zoneLetter = utm.zoneLetter;\n    var zoneNumber = utm.zoneNumber;\n    // check the ZoneNummber is valid\n    if (zoneNumber < 0 || zoneNumber > 60) {\n      return null;\n    }\n\n    var k0 = 0.9996;\n    var a = 6378137.0; //ellip.radius;\n    var eccSquared = 0.00669438; //ellip.eccsq;\n    var eccPrimeSquared;\n    var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared));\n    var N1, T1, C1, R1, D, M;\n    var LongOrigin;\n    var mu, phi1Rad;\n\n    // remove 500,000 meter offset for longitude\n    var x = UTMEasting - 500000.0;\n    var y = UTMNorthing;\n\n    // We must know somehow if we are in the Northern or Southern\n    // hemisphere, this is the only time we use the letter So even\n    // if the Zone letter isn't exactly correct it should indicate\n    // the hemisphere correctly\n    if (zoneLetter < 'N') {\n      y -= 10000000.0; // remove 10,000,000 meter offset used\n      // for southern hemisphere\n    }\n\n    // There are 60 zones with zone 1 being at West -180 to -174\n    LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin\n    // in middle of\n    // zone\n\n    eccPrimeSquared = (eccSquared) / (1 - eccSquared);\n\n    M = y / k0;\n    mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));\n\n    phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);\n    // double phi1 = ProjMath.radToDeg(phi1Rad);\n\n    N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad));\n    T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);\n    C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);\n    R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);\n    D = x / (N1 * k0);\n\n    var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);\n    lat = radToDeg(lat);\n\n    var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);\n    lon = LongOrigin + radToDeg(lon);\n\n    var result;\n    if (utm.accuracy) {\n      var topRight = UTMtoLL({\n        northing: utm.northing + utm.accuracy,\n        easting: utm.easting + utm.accuracy,\n        zoneLetter: utm.zoneLetter,\n        zoneNumber: utm.zoneNumber\n      });\n      result = {\n        top: topRight.lat,\n        right: topRight.lon,\n        bottom: lat,\n        left: lon\n      };\n    }\n    else {\n      result = {\n        lat: lat,\n        lon: lon\n      };\n    }\n    return result;\n  }\n\n  /**\n   * Calculates the MGRS letter designator for the given latitude.\n   *\n   * @private\n   * @param {number} lat The latitude in WGS84 to get the letter designator\n   *     for.\n   * @return {char} The letter designator.\n   */\n  function getLetterDesignator(lat) {\n    //This is here as an error flag to show that the Latitude is\n    //outside MGRS limits\n    var LetterDesignator = 'Z';\n\n    if ((84 >= lat) && (lat >= 72)) {\n      LetterDesignator = 'X';\n    }\n    else if ((72 > lat) && (lat >= 64)) {\n      LetterDesignator = 'W';\n    }\n    else if ((64 > lat) && (lat >= 56)) {\n      LetterDesignator = 'V';\n    }\n    else if ((56 > lat) && (lat >= 48)) {\n      LetterDesignator = 'U';\n    }\n    else if ((48 > lat) && (lat >= 40)) {\n      LetterDesignator = 'T';\n    }\n    else if ((40 > lat) && (lat >= 32)) {\n      LetterDesignator = 'S';\n    }\n    else if ((32 > lat) && (lat >= 24)) {\n      LetterDesignator = 'R';\n    }\n    else if ((24 > lat) && (lat >= 16)) {\n      LetterDesignator = 'Q';\n    }\n    else if ((16 > lat) && (lat >= 8)) {\n      LetterDesignator = 'P';\n    }\n    else if ((8 > lat) && (lat >= 0)) {\n      LetterDesignator = 'N';\n    }\n    else if ((0 > lat) && (lat >= -8)) {\n      LetterDesignator = 'M';\n    }\n    else if ((-8 > lat) && (lat >= -16)) {\n      LetterDesignator = 'L';\n    }\n    else if ((-16 > lat) && (lat >= -24)) {\n      LetterDesignator = 'K';\n    }\n    else if ((-24 > lat) && (lat >= -32)) {\n      LetterDesignator = 'J';\n    }\n    else if ((-32 > lat) && (lat >= -40)) {\n      LetterDesignator = 'H';\n    }\n    else if ((-40 > lat) && (lat >= -48)) {\n      LetterDesignator = 'G';\n    }\n    else if ((-48 > lat) && (lat >= -56)) {\n      LetterDesignator = 'F';\n    }\n    else if ((-56 > lat) && (lat >= -64)) {\n      LetterDesignator = 'E';\n    }\n    else if ((-64 > lat) && (lat >= -72)) {\n      LetterDesignator = 'D';\n    }\n    else if ((-72 > lat) && (lat >= -80)) {\n      LetterDesignator = 'C';\n    }\n    return LetterDesignator;\n  }\n\n  /**\n   * Encodes a UTM location as MGRS string.\n   *\n   * @private\n   * @param {object} utm An object literal with easting, northing,\n   *     zoneLetter, zoneNumber\n   * @param {number} accuracy Accuracy in digits (1-5).\n   * @return {string} MGRS string for the given UTM location.\n   */\n  function encode(utm, accuracy) {\n    // prepend with leading zeroes\n    var seasting = \"00000\" + utm.easting,\n      snorthing = \"00000\" + utm.northing;\n\n    return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy);\n  }\n\n  /**\n   * Get the two letter 100k designator for a given UTM easting,\n   * northing and zone number value.\n   *\n   * @private\n   * @param {number} easting\n   * @param {number} northing\n   * @param {number} zoneNumber\n   * @return the two letter 100k designator for the given UTM location.\n   */\n  function get100kID(easting, northing, zoneNumber) {\n    var setParm = get100kSetForZone(zoneNumber);\n    var setColumn = Math.floor(easting / 100000);\n    var setRow = Math.floor(northing / 100000) % 20;\n    return getLetter100kID(setColumn, setRow, setParm);\n  }\n\n  /**\n   * Given a UTM zone number, figure out the MGRS 100K set it is in.\n   *\n   * @private\n   * @param {number} i An UTM zone number.\n   * @return {number} the 100k set the UTM zone is in.\n   */\n  function get100kSetForZone(i) {\n    var setParm = i % NUM_100K_SETS;\n    if (setParm === 0) {\n      setParm = NUM_100K_SETS;\n    }\n\n    return setParm;\n  }\n\n  /**\n   * Get the two-letter MGRS 100k designator given information\n   * translated from the UTM northing, easting and zone number.\n   *\n   * @private\n   * @param {number} column the column index as it relates to the MGRS\n   *        100k set spreadsheet, created from the UTM easting.\n   *        Values are 1-8.\n   * @param {number} row the row index as it relates to the MGRS 100k set\n   *        spreadsheet, created from the UTM northing value. Values\n   *        are from 0-19.\n   * @param {number} parm the set block, as it relates to the MGRS 100k set\n   *        spreadsheet, created from the UTM zone. Values are from\n   *        1-60.\n   * @return two letter MGRS 100k code.\n   */\n  function getLetter100kID(column, row, parm) {\n    // colOrigin and rowOrigin are the letters at the origin of the set\n    var index = parm - 1;\n    var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index);\n    var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index);\n\n    // colInt and rowInt are the letters to build to return\n    var colInt = colOrigin + column - 1;\n    var rowInt = rowOrigin + row;\n    var rollover = false;\n\n    if (colInt > Z) {\n      colInt = colInt - Z + A - 1;\n      rollover = true;\n    }\n\n    if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) {\n      colInt++;\n    }\n\n    if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) {\n      colInt++;\n\n      if (colInt === I) {\n        colInt++;\n      }\n    }\n\n    if (colInt > Z) {\n      colInt = colInt - Z + A - 1;\n    }\n\n    if (rowInt > V) {\n      rowInt = rowInt - V + A - 1;\n      rollover = true;\n    }\n    else {\n      rollover = false;\n    }\n\n    if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) {\n      rowInt++;\n    }\n\n    if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) {\n      rowInt++;\n\n      if (rowInt === I) {\n        rowInt++;\n      }\n    }\n\n    if (rowInt > V) {\n      rowInt = rowInt - V + A - 1;\n    }\n\n    var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt);\n    return twoLetter;\n  }\n\n  /**\n   * Decode the UTM parameters from a MGRS string.\n   *\n   * @private\n   * @param {string} mgrsString an UPPERCASE coordinate string is expected.\n   * @return {object} An object literal with easting, northing, zoneLetter,\n   *     zoneNumber and accuracy (in meters) properties.\n   */\n  function decode(mgrsString) {\n\n    if (mgrsString && mgrsString.length === 0) {\n      throw (\"MGRSPoint coverting from nothing\");\n    }\n\n    var length = mgrsString.length;\n\n    var hunK = null;\n    var sb = \"\";\n    var testChar;\n    var i = 0;\n\n    // get Zone number\n    while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) {\n      if (i >= 2) {\n        throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n      }\n      sb += testChar;\n      i++;\n    }\n\n    var zoneNumber = parseInt(sb, 10);\n\n    if (i === 0 || i + 3 > length) {\n      // A good MGRS string has to be 4-5 digits long,\n      // ##AAA/#AAA at least.\n      throw (\"MGRSPoint bad conversion from: \" + mgrsString);\n    }\n\n    var zoneLetter = mgrsString.charAt(i++);\n\n    // Should we check the zone letter here? Why not.\n    if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') {\n      throw (\"MGRSPoint zone letter \" + zoneLetter + \" not handled: \" + mgrsString);\n    }\n\n    hunK = mgrsString.substring(i, i += 2);\n\n    var set = get100kSetForZone(zoneNumber);\n\n    var east100k = getEastingFromChar(hunK.charAt(0), set);\n    var north100k = getNorthingFromChar(hunK.charAt(1), set);\n\n    // We have a bug where the northing may be 2000000 too low.\n    // How\n    // do we know when to roll over?\n\n    while (north100k < getMinNorthing(zoneLetter)) {\n      north100k += 2000000;\n    }\n\n    // calculate the char index for easting/northing separator\n    var remainder = length - i;\n\n    if (remainder % 2 !== 0) {\n      throw (\"MGRSPoint has to have an even number \\nof digits after the zone letter and two 100km letters - front \\nhalf for easting meters, second half for \\nnorthing meters\" + mgrsString);\n    }\n\n    var sep = remainder / 2;\n\n    var sepEasting = 0.0;\n    var sepNorthing = 0.0;\n    var accuracyBonus, sepEastingString, sepNorthingString, easting, northing;\n    if (sep > 0) {\n      accuracyBonus = 100000.0 / Math.pow(10, sep);\n      sepEastingString = mgrsString.substring(i, i + sep);\n      sepEasting = parseFloat(sepEastingString) * accuracyBonus;\n      sepNorthingString = mgrsString.substring(i + sep);\n      sepNorthing = parseFloat(sepNorthingString) * accuracyBonus;\n    }\n\n    easting = sepEasting + east100k;\n    northing = sepNorthing + north100k;\n\n    return {\n      easting: easting,\n      northing: northing,\n      zoneLetter: zoneLetter,\n      zoneNumber: zoneNumber,\n      accuracy: accuracyBonus\n    };\n  }\n\n  /**\n   * Given the first letter from a two-letter MGRS 100k zone, and given the\n   * MGRS table set for the zone number, figure out the easting value that\n   * should be added to the other, secondary easting value.\n   *\n   * @private\n   * @param {char} e The first letter from a two-letter MGRS 100´k zone.\n   * @param {number} set The MGRS table set for the zone number.\n   * @return {number} The easting value for the given letter and set.\n   */\n  function getEastingFromChar(e, set) {\n    // colOrigin is the letter at the origin of the set for the\n    // column\n    var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1);\n    var eastingValue = 100000.0;\n    var rewindMarker = false;\n\n    while (curCol !== e.charCodeAt(0)) {\n      curCol++;\n      if (curCol === I) {\n        curCol++;\n      }\n      if (curCol === O) {\n        curCol++;\n      }\n      if (curCol > Z) {\n        if (rewindMarker) {\n          throw (\"Bad character: \" + e);\n        }\n        curCol = A;\n        rewindMarker = true;\n      }\n      eastingValue += 100000.0;\n    }\n\n    return eastingValue;\n  }\n\n  /**\n   * Given the second letter from a two-letter MGRS 100k zone, and given the\n   * MGRS table set for the zone number, figure out the northing value that\n   * should be added to the other, secondary northing value. You have to\n   * remember that Northings are determined from the equator, and the vertical\n   * cycle of letters mean a 2000000 additional northing meters. This happens\n   * approx. every 18 degrees of latitude. This method does *NOT* count any\n   * additional northings. You have to figure out how many 2000000 meters need\n   * to be added for the zone letter of the MGRS coordinate.\n   *\n   * @private\n   * @param {char} n Second letter of the MGRS 100k zone\n   * @param {number} set The MGRS table set number, which is dependent on the\n   *     UTM zone number.\n   * @return {number} The northing value for the given letter and set.\n   */\n  function getNorthingFromChar(n, set) {\n\n    if (n > 'V') {\n      throw (\"MGRSPoint given invalid Northing \" + n);\n    }\n\n    // rowOrigin is the letter at the origin of the set for the\n    // column\n    var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1);\n    var northingValue = 0.0;\n    var rewindMarker = false;\n\n    while (curRow !== n.charCodeAt(0)) {\n      curRow++;\n      if (curRow === I) {\n        curRow++;\n      }\n      if (curRow === O) {\n        curRow++;\n      }\n      // fixing a bug making whole application hang in this loop\n      // when 'n' is a wrong character\n      if (curRow > V) {\n        if (rewindMarker) { // making sure that this loop ends\n          throw (\"Bad character: \" + n);\n        }\n        curRow = A;\n        rewindMarker = true;\n      }\n      northingValue += 100000.0;\n    }\n\n    return northingValue;\n  }\n\n  /**\n   * The function getMinNorthing returns the minimum northing value of a MGRS\n   * zone.\n   *\n   * Ported from Geotrans' c Lattitude_Band_Value structure table.\n   *\n   * @private\n   * @param {char} zoneLetter The MGRS zone to get the min northing for.\n   * @return {number}\n   */\n  function getMinNorthing(zoneLetter) {\n    var northing;\n    switch (zoneLetter) {\n    case 'C':\n      northing = 1100000.0;\n      break;\n    case 'D':\n      northing = 2000000.0;\n      break;\n    case 'E':\n      northing = 2800000.0;\n      break;\n    case 'F':\n      northing = 3700000.0;\n      break;\n    case 'G':\n      northing = 4600000.0;\n      break;\n    case 'H':\n      northing = 5500000.0;\n      break;\n    case 'J':\n      northing = 6400000.0;\n      break;\n    case 'K':\n      northing = 7300000.0;\n      break;\n    case 'L':\n      northing = 8200000.0;\n      break;\n    case 'M':\n      northing = 9100000.0;\n      break;\n    case 'N':\n      northing = 0.0;\n      break;\n    case 'P':\n      northing = 800000.0;\n      break;\n    case 'Q':\n      northing = 1700000.0;\n      break;\n    case 'R':\n      northing = 2600000.0;\n      break;\n    case 'S':\n      northing = 3500000.0;\n      break;\n    case 'T':\n      northing = 4400000.0;\n      break;\n    case 'U':\n      northing = 5300000.0;\n      break;\n    case 'V':\n      northing = 6200000.0;\n      break;\n    case 'W':\n      northing = 7000000.0;\n      break;\n    case 'X':\n      northing = 7900000.0;\n      break;\n    default:\n      northing = -1;\n    }\n    if (northing >= 0.0) {\n      return northing;\n    }\n    else {\n      throw (\"Invalid zone letter: \" + zoneLetter);\n    }\n\n  }\n\n  /**\n   * @deprecated v3.0.0 - use proj4.toPoint instead\n   * @param {number | import('./core').TemplateCoordinates | string} x\n   * @param {number} [y]\n   * @param {number} [z]\n   */\n  function Point(x, y, z) {\n    if (!(this instanceof Point)) {\n      return new Point(x, y, z);\n    }\n    if (Array.isArray(x)) {\n      this.x = x[0];\n      this.y = x[1];\n      this.z = x[2] || 0.0;\n    } else if (typeof x === 'object') {\n      this.x = x.x;\n      this.y = x.y;\n      this.z = x.z || 0.0;\n    } else if (typeof x === 'string' && typeof y === 'undefined') {\n      var coords = x.split(',');\n      this.x = parseFloat(coords[0]);\n      this.y = parseFloat(coords[1]);\n      this.z = parseFloat(coords[2]) || 0.0;\n    } else {\n      this.x = x;\n      this.y = y;\n      this.z = z || 0.0;\n    }\n    console.warn('proj4.Point will be removed in version 3, use proj4.toPoint');\n  }\n\n  Point.fromMGRS = function (mgrsStr) {\n    return new Point(toPoint(mgrsStr));\n  };\n  Point.prototype.toMGRS = function (accuracy) {\n    return forward$w([this.x, this.y], accuracy);\n  };\n\n  var C00 = 1;\n  var C02 = 0.25;\n  var C04 = 0.046875;\n  var C06 = 0.01953125;\n  var C08 = 0.01068115234375;\n  var C22 = 0.75;\n  var C44 = 0.46875;\n  var C46 = 0.01302083333333333333;\n  var C48 = 0.00712076822916666666;\n  var C66 = 0.36458333333333333333;\n  var C68 = 0.00569661458333333333;\n  var C88 = 0.3076171875;\n\n  function pj_enfn (es) {\n    var en = [];\n    en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08)));\n    en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08)));\n    var t = es * es;\n    en[2] = t * (C44 - es * (C46 + es * C48));\n    t *= es;\n    en[3] = t * (C66 - es * C68);\n    en[4] = t * es * C88;\n    return en;\n  }\n\n  function pj_mlfn (phi, sphi, cphi, en) {\n    cphi *= sphi;\n    sphi *= sphi;\n    return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))));\n  }\n\n  var MAX_ITER$3 = 20;\n\n  function pj_inv_mlfn (arg, es, en) {\n    var k = 1 / (1 - es);\n    var phi = arg;\n    for (var i = MAX_ITER$3; i; --i) { /* rarely goes over 2 iterations */\n      var s = Math.sin(phi);\n      var t = 1 - es * s * s;\n      // t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg;\n      // phi -= t * (t * Math.sqrt(t)) * k;\n      t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k;\n      phi -= t;\n      if (Math.abs(t) < EPSLN) {\n        return phi;\n      }\n    }\n    // ..reportError(\"cass:pj_inv_mlfn: Convergence error\");\n    return phi;\n  }\n\n  // Heavily based on this tmerc projection implementation\n  // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js\n\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {Array<number>} en\n   * @property {number} ml0\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$x() {\n    this.x0 = this.x0 !== undefined ? this.x0 : 0;\n    this.y0 = this.y0 !== undefined ? this.y0 : 0;\n    this.long0 = this.long0 !== undefined ? this.long0 : 0;\n    this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n\n    if (this.es) {\n      this.en = pj_enfn(this.es);\n      this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en);\n    }\n  }\n\n  /**\n      Transverse Mercator Forward  - long/lat to x/y\n      long/lat in radians\n    */\n  function forward$v(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    var delta_lon = adjust_lon(lon - this.long0, this.over);\n    var con;\n    var x, y;\n    var sin_phi = Math.sin(lat);\n    var cos_phi = Math.cos(lat);\n\n    if (!this.es) {\n      var b = cos_phi * Math.sin(delta_lon);\n\n      if ((Math.abs(Math.abs(b) - 1)) < EPSLN) {\n        return (93);\n      } else {\n        x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0;\n        y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2));\n        b = Math.abs(y);\n\n        if (b >= 1) {\n          if ((b - 1) > EPSLN) {\n            return (93);\n          } else {\n            y = 0;\n          }\n        } else {\n          y = Math.acos(y);\n        }\n\n        if (lat < 0) {\n          y = -y;\n        }\n\n        y = this.a * this.k0 * (y - this.lat0) + this.y0;\n      }\n    } else {\n      var al = cos_phi * delta_lon;\n      var als = Math.pow(al, 2);\n      var c = this.ep2 * Math.pow(cos_phi, 2);\n      var cs = Math.pow(c, 2);\n      var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0;\n      var t = Math.pow(tq, 2);\n      var ts = Math.pow(t, 2);\n      con = 1 - this.es * Math.pow(sin_phi, 2);\n      al = al / Math.sqrt(con);\n      var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en);\n\n      x = this.a * (this.k0 * al * (1\n        + als / 6 * (1 - t + c\n          + als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c\n            + als / 42 * (61 + 179 * ts - ts * t - 479 * t)))))\n          + this.x0;\n\n      y = this.a * (this.k0 * (ml - this.ml0\n        + sin_phi * delta_lon * al / 2 * (1\n          + als / 12 * (5 - t + 9 * c + 4 * cs\n            + als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c\n              + als / 56 * (1385 + 543 * ts - ts * t - 3111 * t))))))\n            + this.y0;\n    }\n\n    p.x = x;\n    p.y = y;\n\n    return p;\n  }\n\n  /**\n      Transverse Mercator Inverse  -  x/y to long/lat\n    */\n  function inverse$v(p) {\n    var con, phi;\n    var lat, lon;\n    var x = (p.x - this.x0) * (1 / this.a);\n    var y = (p.y - this.y0) * (1 / this.a);\n\n    if (!this.es) {\n      var f = Math.exp(x / this.k0);\n      var g = 0.5 * (f - 1 / f);\n      var temp = this.lat0 + y / this.k0;\n      var h = Math.cos(temp);\n      con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2)));\n      lat = Math.asin(con);\n\n      if (y < 0) {\n        lat = -lat;\n      }\n\n      if ((g === 0) && (h === 0)) {\n        lon = 0;\n      } else {\n        lon = adjust_lon(Math.atan2(g, h) + this.long0, this.over);\n      }\n    } else { // ellipsoidal form\n      con = this.ml0 + y / this.k0;\n      phi = pj_inv_mlfn(con, this.es, this.en);\n\n      if (Math.abs(phi) < HALF_PI) {\n        var sin_phi = Math.sin(phi);\n        var cos_phi = Math.cos(phi);\n        var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0;\n        var c = this.ep2 * Math.pow(cos_phi, 2);\n        var cs = Math.pow(c, 2);\n        var t = Math.pow(tan_phi, 2);\n        var ts = Math.pow(t, 2);\n        con = 1 - this.es * Math.pow(sin_phi, 2);\n        var d = x * Math.sqrt(con) / this.k0;\n        var ds = Math.pow(d, 2);\n        con = con * tan_phi;\n\n        lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1\n          - ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs\n            - ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c\n              - ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t))));\n\n        lon = adjust_lon(this.long0 + (d * (1\n          - ds / 6 * (1 + 2 * t + c\n            - ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c\n              - ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi), this.over);\n      } else {\n        lat = HALF_PI * sign(y);\n        lon = 0;\n      }\n    }\n\n    p.x = lon;\n    p.y = lat;\n\n    return p;\n  }\n\n  var names$w = ['Fast_Transverse_Mercator', 'Fast Transverse Mercator'];\n  var tmerc = {\n    init: init$x,\n    forward: forward$v,\n    inverse: inverse$v,\n    names: names$w\n  };\n\n  function sinh (x) {\n    var r = Math.exp(x);\n    r = (r - 1 / r) / 2;\n    return r;\n  }\n\n  function hypot (x, y) {\n    x = Math.abs(x);\n    y = Math.abs(y);\n    var a = Math.max(x, y);\n    var b = Math.min(x, y) / (a ? a : 1);\n\n    return a * Math.sqrt(1 + Math.pow(b, 2));\n  }\n\n  function log1py (x) {\n    var y = 1 + x;\n    var z = y - 1;\n\n    return z === 0 ? x : x * Math.log(y) / z;\n  }\n\n  function asinhy (x) {\n    var y = Math.abs(x);\n    y = log1py(y * (1 + y / (hypot(1, y) + 1)));\n\n    return x < 0 ? -y : y;\n  }\n\n  function gatg (pp, B) {\n    var cos_2B = 2 * Math.cos(2 * B);\n    var i = pp.length - 1;\n    var h1 = pp[i];\n    var h2 = 0;\n    var h;\n\n    while (--i >= 0) {\n      h = -h2 + cos_2B * h1 + pp[i];\n      h2 = h1;\n      h1 = h;\n    }\n\n    return (B + h * Math.sin(2 * B));\n  }\n\n  function clens (pp, arg_r) {\n    var r = 2 * Math.cos(arg_r);\n    var i = pp.length - 1;\n    var hr1 = pp[i];\n    var hr2 = 0;\n    var hr;\n\n    while (--i >= 0) {\n      hr = -hr2 + r * hr1 + pp[i];\n      hr2 = hr1;\n      hr1 = hr;\n    }\n\n    return Math.sin(arg_r) * hr;\n  }\n\n  function cosh (x) {\n    var r = Math.exp(x);\n    r = (r + 1 / r) / 2;\n    return r;\n  }\n\n  function clens_cmplx (pp, arg_r, arg_i) {\n    var sin_arg_r = Math.sin(arg_r);\n    var cos_arg_r = Math.cos(arg_r);\n    var sinh_arg_i = sinh(arg_i);\n    var cosh_arg_i = cosh(arg_i);\n    var r = 2 * cos_arg_r * cosh_arg_i;\n    var i = -2 * sin_arg_r * sinh_arg_i;\n    var j = pp.length - 1;\n    var hr = pp[j];\n    var hi1 = 0;\n    var hr1 = 0;\n    var hi = 0;\n    var hr2;\n    var hi2;\n\n    while (--j >= 0) {\n      hr2 = hr1;\n      hi2 = hi1;\n      hr1 = hr;\n      hi1 = hi;\n      hr = -hr2 + r * hr1 - i * hi1 + pp[j];\n      hi = -hi2 + i * hr1 + r * hi1;\n    }\n\n    r = sin_arg_r * cosh_arg_i;\n    i = cos_arg_r * sinh_arg_i;\n\n    return [r * hr - i * hi, r * hi + i * hr];\n  }\n\n  // Heavily based on this etmerc projection implementation\n  // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js\n\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {Array<number>} cbg\n   * @property {Array<number>} cgb\n   * @property {Array<number>} utg\n   * @property {Array<number>} gtu\n   * @property {number} Qn\n   * @property {number} Zb\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$w() {\n    if (!this.approx && (isNaN(this.es) || this.es <= 0)) {\n      throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION[\"Fast_Transverse_Mercator\"] in the WKT.');\n    }\n    if (this.approx) {\n      // When '+approx' is set, use tmerc instead\n      tmerc.init.apply(this);\n      this.forward = tmerc.forward;\n      this.inverse = tmerc.inverse;\n    }\n\n    this.x0 = this.x0 !== undefined ? this.x0 : 0;\n    this.y0 = this.y0 !== undefined ? this.y0 : 0;\n    this.long0 = this.long0 !== undefined ? this.long0 : 0;\n    this.lat0 = this.lat0 !== undefined ? this.lat0 : 0;\n    this.k0 = this.k0 !== undefined ? this.k0 : 1;\n\n    this.cgb = [];\n    this.cbg = [];\n    this.utg = [];\n    this.gtu = [];\n\n    var f = this.es / (1 + Math.sqrt(1 - this.es));\n    var n = f / (2 - f);\n    var np = n;\n\n    this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675))))));\n    this.cbg[0] = n * (-2 + n * (2 / 3 + n * (4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725))))));\n\n    np = np * n;\n    this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945)))));\n    this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * (-13 / 9 + n * (904 / 315 + n * (-1522 / 945)))));\n\n    np = np * n;\n    this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835))));\n    this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835))));\n\n    np = np * n;\n    this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175)));\n    this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * (-24832 / 14175)));\n\n    np = np * n;\n    this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237));\n    this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185));\n\n    np = np * n;\n    this.cgb[5] = np * (601676 / 22275);\n    this.cbg[5] = np * (444337 / 155925);\n\n    np = Math.pow(n, 2);\n    this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256)));\n\n    this.utg[0] = n * (-0.5 + n * (2 / 3 + n * (-37 / 96 + n * (1 / 360 + n * (81 / 512 + n * (-96199 / 604800))))));\n    this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800))))));\n\n    this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720)))));\n    this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360)))));\n\n    np = np * n;\n    this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720))));\n    this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440))));\n\n    np = np * n;\n    this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600)));\n    this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600)));\n\n    np = np * n;\n    this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680));\n    this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840));\n\n    np = np * n;\n    this.utg[5] = np * (-20648693 / 638668800);\n    this.gtu[5] = np * (212378941 / 319334400);\n\n    var Z = gatg(this.cbg, this.lat0);\n    this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z));\n  }\n\n  function forward$u(p) {\n    var Ce = adjust_lon(p.x - this.long0, this.over);\n    var Cn = p.y;\n\n    Cn = gatg(this.cbg, Cn);\n    var sin_Cn = Math.sin(Cn);\n    var cos_Cn = Math.cos(Cn);\n    var sin_Ce = Math.sin(Ce);\n    var cos_Ce = Math.cos(Ce);\n\n    Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn);\n    Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce));\n    Ce = asinhy(Math.tan(Ce));\n\n    var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce);\n\n    Cn = Cn + tmp[0];\n    Ce = Ce + tmp[1];\n\n    var x;\n    var y;\n\n    if (Math.abs(Ce) <= 2.623395162778) {\n      x = this.a * (this.Qn * Ce) + this.x0;\n      y = this.a * (this.Qn * Cn + this.Zb) + this.y0;\n    } else {\n      x = Infinity;\n      y = Infinity;\n    }\n\n    p.x = x;\n    p.y = y;\n\n    return p;\n  }\n\n  function inverse$u(p) {\n    var Ce = (p.x - this.x0) * (1 / this.a);\n    var Cn = (p.y - this.y0) * (1 / this.a);\n\n    Cn = (Cn - this.Zb) / this.Qn;\n    Ce = Ce / this.Qn;\n\n    var lon;\n    var lat;\n\n    if (Math.abs(Ce) <= 2.623395162778) {\n      var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce);\n\n      Cn = Cn + tmp[0];\n      Ce = Ce + tmp[1];\n      Ce = Math.atan(sinh(Ce));\n\n      var sin_Cn = Math.sin(Cn);\n      var cos_Cn = Math.cos(Cn);\n      var sin_Ce = Math.sin(Ce);\n      var cos_Ce = Math.cos(Ce);\n\n      Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn));\n      Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn);\n\n      lon = adjust_lon(Ce + this.long0, this.over);\n      lat = gatg(this.cgb, Cn);\n    } else {\n      lon = Infinity;\n      lat = Infinity;\n    }\n\n    p.x = lon;\n    p.y = lat;\n\n    return p;\n  }\n\n  var names$v = ['Extended_Transverse_Mercator', 'Extended Transverse Mercator', 'etmerc', 'Transverse_Mercator', 'Transverse Mercator', 'Gauss Kruger', 'Gauss_Kruger', 'tmerc'];\n  var etmerc = {\n    init: init$w,\n    forward: forward$u,\n    inverse: inverse$u,\n    names: names$v\n  };\n\n  function adjust_zone (zone, lon) {\n    if (zone === undefined) {\n      zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1;\n\n      if (zone < 0) {\n        return 0;\n      } else if (zone > 60) {\n        return 60;\n      }\n    }\n    return zone;\n  }\n\n  var dependsOn = 'etmerc';\n\n  /** @this {import('../defs.js').ProjectionDefinition} */\n  function init$v() {\n    var zone = adjust_zone(this.zone, this.long0);\n    if (zone === undefined) {\n      throw new Error('unknown utm zone');\n    }\n    this.lat0 = 0;\n    this.long0 = ((6 * Math.abs(zone)) - 183) * D2R$1;\n    this.x0 = 500000;\n    this.y0 = this.utmSouth ? 10000000 : 0;\n    this.k0 = 0.9996;\n\n    etmerc.init.apply(this);\n    this.forward = etmerc.forward;\n    this.inverse = etmerc.inverse;\n  }\n\n  var names$u = ['Universal Transverse Mercator System', 'utm'];\n  var utm = {\n    init: init$v,\n    names: names$u,\n    dependsOn: dependsOn\n  };\n\n  function srat (esinp, exp) {\n    return (Math.pow((1 - esinp) / (1 + esinp), exp));\n  }\n\n  var MAX_ITER$2 = 20;\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} rc\n   * @property {number} C\n   * @property {number} phic0\n   * @property {number} ratexp\n   * @property {number} K\n   * @property {number} e\n   * @property {number} es\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$u() {\n    var sphi = Math.sin(this.lat0);\n    var cphi = Math.cos(this.lat0);\n    cphi *= cphi;\n    this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi);\n    this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es));\n    this.phic0 = Math.asin(sphi / this.C);\n    this.ratexp = 0.5 * this.C * this.e;\n    this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp));\n  }\n\n  function forward$t(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI;\n    p.x = this.C * lon;\n    return p;\n  }\n\n  function inverse$t(p) {\n    var DEL_TOL = 1e-14;\n    var lon = p.x / this.C;\n    var lat = p.y;\n    var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C);\n    for (var i = MAX_ITER$2; i > 0; --i) {\n      lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), -0.5 * this.e)) - HALF_PI;\n      if (Math.abs(lat - p.y) < DEL_TOL) {\n        break;\n      }\n      p.y = lat;\n    }\n    /* convergence failed */\n    if (!i) {\n      return null;\n    }\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n  var gauss = {\n    init: init$u,\n    forward: forward$t,\n    inverse: inverse$t};\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} sinc0\n   * @property {number} cosc0\n   * @property {number} R2\n   * @property {number} rc\n   * @property {number} phic0\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$t() {\n    gauss.init.apply(this);\n    if (!this.rc) {\n      return;\n    }\n    this.sinc0 = Math.sin(this.phic0);\n    this.cosc0 = Math.cos(this.phic0);\n    this.R2 = 2 * this.rc;\n    if (!this.title) {\n      this.title = 'Oblique Stereographic Alternative';\n    }\n  }\n\n  function forward$s(p) {\n    var sinc, cosc, cosl, k;\n    p.x = adjust_lon(p.x - this.long0, this.over);\n    gauss.forward.apply(this, [p]);\n    sinc = Math.sin(p.y);\n    cosc = Math.cos(p.y);\n    cosl = Math.cos(p.x);\n    k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl);\n    p.x = k * cosc * Math.sin(p.x);\n    p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl);\n    p.x = this.a * p.x + this.x0;\n    p.y = this.a * p.y + this.y0;\n    return p;\n  }\n\n  function inverse$s(p) {\n    var sinc, cosc, lon, lat, rho;\n    p.x = (p.x - this.x0) / this.a;\n    p.y = (p.y - this.y0) / this.a;\n\n    p.x /= this.k0;\n    p.y /= this.k0;\n    if ((rho = hypot(p.x, p.y))) {\n      var c = 2 * Math.atan2(rho, this.R2);\n      sinc = Math.sin(c);\n      cosc = Math.cos(c);\n      lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho);\n      lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc);\n    } else {\n      lat = this.phic0;\n      lon = 0;\n    }\n\n    p.x = lon;\n    p.y = lat;\n    gauss.inverse.apply(this, [p]);\n    p.x = adjust_lon(p.x + this.long0, this.over);\n    return p;\n  }\n\n  var names$t = ['Stereographic_North_Pole', 'Oblique_Stereographic', 'sterea', 'Oblique Stereographic Alternative', 'Double_Stereographic'];\n  var sterea = {\n    init: init$t,\n    forward: forward$s,\n    inverse: inverse$s,\n    names: names$t\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} coslat0\n   * @property {number} sinlat0\n   * @property {number} ms1\n   * @property {number} X0\n   * @property {number} cosX0\n   * @property {number} sinX0\n   * @property {number} con\n   * @property {number} cons\n   * @property {number} e\n   */\n\n  function ssfn_(phit, sinphi, eccen) {\n    sinphi *= eccen;\n    return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen));\n  }\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$s() {\n    // setting default parameters\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.lat0 = this.lat0 || 0;\n    this.long0 = this.long0 || 0;\n\n    this.coslat0 = Math.cos(this.lat0);\n    this.sinlat0 = Math.sin(this.lat0);\n    if (this.sphere) {\n      if (!isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) {\n        this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts));\n      }\n    } else {\n      if (Math.abs(this.coslat0) <= EPSLN) {\n        if (this.lat0 > 0) {\n          // North pole\n          // trace('stere:north pole');\n          this.con = 1;\n        } else {\n          // South pole\n          // trace('stere:south pole');\n          this.con = -1;\n        }\n      }\n      this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e));\n      if (!isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN && Math.abs(Math.cos(this.lat_ts)) > EPSLN) {\n        // Polar Stereographic variant B: k0 is derived from lat_ts (EPSG guidance note 7-2, method 9829)\n        // https://epsg.org/coord-operation-method_9829/Polar-Stereographic-variant-B.html\n        this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts));\n      }\n      this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0);\n      this.X0 = 2 * Math.atan(ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI;\n      this.cosX0 = Math.cos(this.X0);\n      this.sinX0 = Math.sin(this.X0);\n    }\n  }\n\n  // Stereographic forward equations--mapping lat,long to x,y\n  function forward$r(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var sinlat = Math.sin(lat);\n    var coslat = Math.cos(lat);\n    var A, X, sinX, cosX, ts, rh;\n    var dlon = adjust_lon(lon - this.long0, this.over);\n\n    if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) {\n      // case of the origine point\n      // trace('stere:this is the origin point');\n      p.x = NaN;\n      p.y = NaN;\n      return p;\n    }\n    if (this.sphere) {\n      // trace('stere:sphere case');\n      A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon));\n      p.x = this.a * A * coslat * Math.sin(dlon) + this.x0;\n      p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0;\n      return p;\n    } else {\n      X = 2 * Math.atan(ssfn_(lat, sinlat, this.e)) - HALF_PI;\n      cosX = Math.cos(X);\n      sinX = Math.sin(X);\n      if (Math.abs(this.coslat0) <= EPSLN) {\n        ts = tsfnz(this.e, lat * this.con, this.con * sinlat);\n        rh = 2 * this.a * this.k0 * ts / this.cons;\n        p.x = this.x0 + rh * Math.sin(lon - this.long0);\n        p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0);\n        // trace(p.toString());\n        return p;\n      } else if (Math.abs(this.sinlat0) < EPSLN) {\n        // Eq\n        // trace('stere:equateur');\n        A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon));\n        p.y = A * sinX;\n      } else {\n        // other case\n        // trace('stere:normal case');\n        A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon)));\n        p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0;\n      }\n      p.x = A * cosX * Math.sin(dlon) + this.x0;\n    }\n    // trace(p.toString());\n    return p;\n  }\n\n  //* Stereographic inverse equations--mapping x,y to lat/long\n  function inverse$r(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n    var lon, lat, ts, ce, Chi;\n    var rh = Math.sqrt(p.x * p.x + p.y * p.y);\n    if (this.sphere) {\n      var c = 2 * Math.atan(rh / (2 * this.a * this.k0));\n      lon = this.long0;\n      lat = this.lat0;\n      if (rh <= EPSLN) {\n        p.x = lon;\n        p.y = lat;\n        return p;\n      }\n      lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh);\n      if (Math.abs(this.coslat0) < EPSLN) {\n        if (this.lat0 > 0) {\n          lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y), this.over);\n        } else {\n          lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y), this.over);\n        }\n      } else {\n        lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c)), this.over);\n      }\n      p.x = lon;\n      p.y = lat;\n      return p;\n    } else {\n      if (Math.abs(this.coslat0) <= EPSLN) {\n        if (rh <= EPSLN) {\n          lat = this.lat0;\n          lon = this.long0;\n          p.x = lon;\n          p.y = lat;\n          // trace(p.toString());\n          return p;\n        }\n        p.x *= this.con;\n        p.y *= this.con;\n        ts = rh * this.cons / (2 * this.a * this.k0);\n        lat = this.con * phi2z(this.e, ts);\n        lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, -1 * p.y), this.over);\n      } else {\n        ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1));\n        lon = this.long0;\n        if (rh <= EPSLN) {\n          Chi = this.X0;\n        } else {\n          Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh);\n          lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce)), this.over);\n        }\n        lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi)));\n      }\n    }\n    p.x = lon;\n    p.y = lat;\n\n    // trace(p.toString());\n    return p;\n  }\n\n  var names$s = ['stere', 'Stereographic_South_Pole', 'Polar_Stereographic_variant_A', 'Polar_Stereographic_variant_B', 'Polar_Stereographic'];\n  var stere = {\n    init: init$s,\n    forward: forward$r,\n    inverse: inverse$r,\n    names: names$s,\n    ssfn_: ssfn_\n  };\n\n  /*\n    references:\n      Formules et constantes pour le Calcul pour la\n      projection cylindrique conforme à axe oblique et pour la transformation entre\n      des systèmes de référence.\n      http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf\n    */\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} lambda0\n   * @property {number} e\n   * @property {number} R\n   * @property {number} b0\n   * @property {number} K\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$r() {\n    if (!this.k0) {\n      this.k0 = 1;\n    }\n    var phy0 = this.lat0;\n    this.lambda0 = this.long0;\n    var sinPhy0 = Math.sin(phy0);\n    var semiMajorAxis = this.a;\n    var invF = this.rf;\n    var flattening = 1 / invF;\n    var e2 = 2 * flattening - Math.pow(flattening, 2);\n    var e = this.e = Math.sqrt(e2);\n    this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2));\n    this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4));\n    this.b0 = Math.asin(sinPhy0 / this.alpha);\n    var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2));\n    var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2));\n    var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0));\n    this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3;\n  }\n\n  function forward$q(p) {\n    var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2));\n    var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y)));\n    var S = -this.alpha * (Sa1 + Sa2) + this.K;\n\n    // spheric latitude\n    var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4);\n\n    // spheric longitude\n    var I = this.alpha * (p.x - this.lambda0);\n\n    // psoeudo equatorial rotation\n    var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I)));\n\n    var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I));\n\n    p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0;\n    p.x = this.R * rotI + this.x0;\n    return p;\n  }\n\n  function inverse$q(p) {\n    var Y = p.x - this.x0;\n    var X = p.y - this.y0;\n\n    var rotI = Y / this.R;\n    var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4);\n\n    var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI));\n    var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB)));\n\n    var lambda = this.lambda0 + I / this.alpha;\n\n    var S = 0;\n    var phy = b;\n    var prevPhy = -1e3;\n    var iteration = 0;\n    while (Math.abs(phy - prevPhy) > 0.0000001) {\n      if (++iteration > 20) {\n        // ...reportError(\"omercFwdInfinity\");\n        return;\n      }\n      // S = Math.log(Math.tan(Math.PI / 4 + phy / 2));\n      S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2));\n      prevPhy = phy;\n      phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2;\n    }\n\n    p.x = lambda;\n    p.y = phy;\n    return p;\n  }\n\n  var names$r = ['somerc'];\n  var somerc = {\n    init: init$r,\n    forward: forward$q,\n    inverse: inverse$q,\n    names: names$r\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {boolean} no_off\n   * @property {boolean} no_rot\n   * @property {number} rectified_grid_angle\n   * @property {number} es\n   * @property {number} A\n   * @property {number} B\n   * @property {number} E\n   * @property {number} e\n   * @property {number} lam0\n   * @property {number} singam\n   * @property {number} cosgam\n   * @property {number} sinrot\n   * @property {number} cosrot\n   * @property {number} rB\n   * @property {number} ArB\n   * @property {number} BrA\n   * @property {number} u_0\n   * @property {number} v_pole_n\n   * @property {number} v_pole_s\n   */\n\n  var TOL = 1e-7;\n\n  function isTypeA(P) {\n    var typeAProjections = ['Hotine_Oblique_Mercator', 'Hotine_Oblique_Mercator_variant_A', 'Hotine_Oblique_Mercator_Azimuth_Natural_Origin'];\n    var projectionName = typeof P.projName === 'object' ? Object.keys(P.projName)[0] : P.projName;\n\n    return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1 || typeAProjections.indexOf(getNormalizedProjName(projectionName)) !== -1;\n  }\n\n  /**\n   * Initialize the Oblique Mercator  projection\n   * @this {import('../defs.js').ProjectionDefinition & LocalThis}\n   */\n  function init$q() {\n    var con, com, cosph0, D, F, H, L, sinph0, p, J, gamma = 0,\n      gamma0, lamc = 0, lam1 = 0, lam2 = 0, phi1 = 0, phi2 = 0, alpha_c = 0;\n\n    if (!this.k0) {\n      this.k0 = 1;\n    }\n\n    // only Type A uses the no_off or no_uoff property\n    // https://github.com/OSGeo/proj.4/issues/104\n    this.no_off = isTypeA(this);\n    this.no_rot = 'no_rot' in this;\n\n    var alp = false;\n    if ('alpha' in this) {\n      alp = true;\n    }\n\n    var gam = false;\n    if ('rectified_grid_angle' in this) {\n      gam = true;\n    }\n\n    if (alp) {\n      alpha_c = this.alpha;\n    }\n\n    if (gam) {\n      gamma = this.rectified_grid_angle;\n      if (!alp) {\n        alpha_c = 0;\n        alp = true;\n      }\n    }\n\n    if (alp || gam) {\n      lamc = this.longc;\n    } else {\n      lam1 = this.long1;\n      phi1 = this.lat1;\n      lam2 = this.long2;\n      phi2 = this.lat2;\n\n      if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL\n        || Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL\n        || Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) {\n        throw new Error();\n      }\n    }\n\n    var one_es = 1.0 - this.es;\n    com = Math.sqrt(one_es);\n\n    if (Math.abs(this.lat0) > EPSLN) {\n      sinph0 = Math.sin(this.lat0);\n      cosph0 = Math.cos(this.lat0);\n      con = 1 - this.es * sinph0 * sinph0;\n      this.B = cosph0 * cosph0;\n      this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es);\n      this.A = this.B * this.k0 * com / con;\n      D = this.B * com / (cosph0 * Math.sqrt(con));\n      F = D * D - 1;\n\n      if (F <= 0) {\n        F = 0;\n      } else {\n        F = Math.sqrt(F);\n        if (this.lat0 < 0) {\n          F = -F;\n        }\n      }\n\n      this.E = F += D;\n      this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B);\n    } else {\n      this.B = 1 / com;\n      this.A = this.k0;\n      this.E = D = F = 1;\n    }\n\n    if (alp || gam) {\n      if (alp) {\n        gamma0 = Math.asin(Math.sin(alpha_c) / D);\n        if (!gam) {\n          gamma = alpha_c;\n        }\n      } else {\n        gamma0 = gamma;\n        alpha_c = Math.asin(D * Math.sin(gamma0));\n      }\n      this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B;\n    } else {\n      H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B);\n      L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B);\n      F = this.E / H;\n      p = (L - H) / (L + H);\n      J = this.E * this.E;\n      J = (J - L * H) / (J + L * H);\n      con = lam1 - lam2;\n\n      if (con < -Math.PI) {\n        lam2 -= TWO_PI;\n      } else if (con > Math.PI) {\n        lam2 += TWO_PI;\n      }\n\n      this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B, this.over);\n      gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0, this.over)) / (F - 1 / F));\n      gamma = alpha_c = Math.asin(D * Math.sin(gamma0));\n    }\n\n    this.singam = Math.sin(gamma0);\n    this.cosgam = Math.cos(gamma0);\n    this.sinrot = Math.sin(gamma);\n    this.cosrot = Math.cos(gamma);\n\n    this.rB = 1 / this.B;\n    this.ArB = this.A * this.rB;\n    this.BrA = 1 / this.ArB;\n\n    if (this.no_off) {\n      this.u_0 = 0;\n    } else {\n      this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c)));\n\n      if (this.lat0 < 0) {\n        this.u_0 = -this.u_0;\n      }\n    }\n\n    F = 0.5 * gamma0;\n    this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F));\n    this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F));\n  }\n\n  /* Oblique Mercator forward equations--mapping lat,long to x,y\n      ---------------------------------------------------------- */\n  function forward$p(p) {\n    var coords = {};\n    var S, T, U, V, W, temp, u, v;\n    p.x = p.x - this.lam0;\n\n    if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) {\n      W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B);\n\n      temp = 1 / W;\n      S = 0.5 * (W - temp);\n      T = 0.5 * (W + temp);\n      V = Math.sin(this.B * p.x);\n      U = (S * this.singam - V * this.cosgam) / T;\n\n      if (Math.abs(Math.abs(U) - 1.0) < EPSLN) {\n        throw new Error();\n      }\n\n      v = 0.5 * this.ArB * Math.log((1 - U) / (1 + U));\n      temp = Math.cos(this.B * p.x);\n\n      if (Math.abs(temp) < TOL) {\n        u = this.A * p.x;\n      } else {\n        u = this.ArB * Math.atan2((S * this.cosgam + V * this.singam), temp);\n      }\n    } else {\n      v = p.y > 0 ? this.v_pole_n : this.v_pole_s;\n      u = this.ArB * p.y;\n    }\n\n    if (this.no_rot) {\n      coords.x = u;\n      coords.y = v;\n    } else {\n      u -= this.u_0;\n      coords.x = v * this.cosrot + u * this.sinrot;\n      coords.y = u * this.cosrot - v * this.sinrot;\n    }\n\n    coords.x = (this.a * coords.x + this.x0);\n    coords.y = (this.a * coords.y + this.y0);\n\n    if (p.z !== undefined) {\n      coords.z = p.z;\n    }\n    if (p.m !== undefined) {\n      coords.m = p.m;\n    }\n    return coords;\n  }\n\n  function inverse$p(p) {\n    var u, v, Qp, Sp, Tp, Vp, Up;\n    var coords = {};\n\n    p.x = (p.x - this.x0) * (1.0 / this.a);\n    p.y = (p.y - this.y0) * (1.0 / this.a);\n\n    if (this.no_rot) {\n      v = p.y;\n      u = p.x;\n    } else {\n      v = p.x * this.cosrot - p.y * this.sinrot;\n      u = p.y * this.cosrot + p.x * this.sinrot + this.u_0;\n    }\n\n    Qp = Math.exp(-this.BrA * v);\n    Sp = 0.5 * (Qp - 1 / Qp);\n    Tp = 0.5 * (Qp + 1 / Qp);\n    Vp = Math.sin(this.BrA * u);\n    Up = (Vp * this.cosgam + Sp * this.singam) / Tp;\n\n    if (Math.abs(Math.abs(Up) - 1) < EPSLN) {\n      coords.x = 0;\n      coords.y = Up < 0 ? -HALF_PI : HALF_PI;\n    } else {\n      coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up));\n      coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B));\n\n      if (coords.y === Infinity) {\n        throw new Error();\n      }\n\n      coords.x = -this.rB * Math.atan2((Sp * this.cosgam - Vp * this.singam), Math.cos(this.BrA * u));\n    }\n\n    coords.x += this.lam0;\n\n    if (p.z !== undefined) {\n      coords.z = p.z;\n    }\n    if (p.m !== undefined) {\n      coords.m = p.m;\n    }\n    return coords;\n  }\n\n  var names$q = ['Hotine_Oblique_Mercator', 'Hotine Oblique Mercator', 'Hotine_Oblique_Mercator_variant_A', 'Hotine_Oblique_Mercator_Variant_B', 'Hotine_Oblique_Mercator_Azimuth_Natural_Origin', 'Hotine_Oblique_Mercator_Two_Point_Natural_Origin', 'Hotine_Oblique_Mercator_Azimuth_Center', 'Oblique_Mercator', 'omerc'];\n  var omerc = {\n    init: init$q,\n    forward: forward$p,\n    inverse: inverse$p,\n    names: names$q\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} e\n   * @property {number} ns\n   * @property {number} f0\n   * @property {number} rh\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$p() {\n    // double lat0;                    /* the reference latitude               */\n    // double long0;                   /* the reference longitude              */\n    // double lat1;                    /* first standard parallel              */\n    // double lat2;                    /* second standard parallel             */\n    // double r_maj;                   /* major axis                           */\n    // double r_min;                   /* minor axis                           */\n    // double false_east;              /* x offset in meters                   */\n    // double false_north;             /* y offset in meters                   */\n\n    // the above value can be set with proj4.defs\n    // example: proj4.defs(\"EPSG:2154\",\"+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\");\n\n    if (!this.lat2) {\n      this.lat2 = this.lat1;\n    } // if lat2 is not defined\n    if (!this.k0) {\n      this.k0 = 1;\n    }\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.long0 = this.long0 || 0;\n    // Standard Parallels cannot be equal and on opposite sides of the equator\n    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n      return;\n    }\n\n    var temp = this.b / this.a;\n    this.e = Math.sqrt(1 - temp * temp);\n\n    var sin1 = Math.sin(this.lat1);\n    var cos1 = Math.cos(this.lat1);\n    var ms1 = msfnz(this.e, sin1, cos1);\n    var ts1 = tsfnz(this.e, this.lat1, sin1);\n\n    var sin2 = Math.sin(this.lat2);\n    var cos2 = Math.cos(this.lat2);\n    var ms2 = msfnz(this.e, sin2, cos2);\n    var ts2 = tsfnz(this.e, this.lat2, sin2);\n    var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0));\n\n    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n      this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2);\n    } else {\n      this.ns = sin1;\n    }\n    if (isNaN(this.ns)) {\n      this.ns = sin1;\n    }\n    this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns));\n    this.rh = Math.abs(Math.abs(this.lat0) - HALF_PI) < EPSLN\n      ? 0 // Handle poles by setting rh to 0\n      : this.a * this.f0 * Math.pow(ts0, this.ns);\n    if (!this.title) {\n      this.title = 'Lambert Conformal Conic';\n    }\n  }\n\n  // Lambert Conformal conic forward equations--mapping lat,long to x,y\n  // -----------------------------------------------------------------\n  function forward$o(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    // singular cases :\n    if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) {\n      lat = sign(lat) * (HALF_PI - 2 * EPSLN);\n    }\n\n    var con = Math.abs(Math.abs(lat) - HALF_PI);\n    var ts, rh1;\n    if (con > EPSLN) {\n      ts = tsfnz(this.e, lat, Math.sin(lat));\n      rh1 = this.a * this.f0 * Math.pow(ts, this.ns);\n    } else {\n      con = lat * this.ns;\n      if (con <= 0) {\n        return null;\n      }\n      rh1 = 0;\n    }\n    var theta = this.ns * adjust_lon(lon - this.long0, this.over);\n    p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0;\n    p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0;\n\n    return p;\n  }\n\n  // Lambert Conformal Conic inverse equations--mapping x,y to lat/long\n  // -----------------------------------------------------------------\n  function inverse$o(p) {\n    var rh1, con, ts;\n    var lat, lon;\n    var x = (p.x - this.x0) / this.k0;\n    var y = (this.rh - (p.y - this.y0) / this.k0);\n    if (this.ns > 0) {\n      rh1 = Math.sqrt(x * x + y * y);\n      con = 1;\n    } else {\n      rh1 = -Math.sqrt(x * x + y * y);\n      con = -1;\n    }\n    var theta = 0;\n    if (rh1 !== 0) {\n      theta = Math.atan2((con * x), (con * y));\n    }\n    if ((rh1 !== 0) || (this.ns > 0)) {\n      con = 1 / this.ns;\n      ts = Math.pow((rh1 / (this.a * this.f0)), con);\n      lat = phi2z(this.e, ts);\n      if (lat === -9999) {\n        return null;\n      }\n    } else {\n      lat = -HALF_PI;\n    }\n    lon = adjust_lon(theta / this.ns + this.long0, this.over);\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$p = [\n    'Lambert Tangential Conformal Conic Projection',\n    'Lambert_Conformal_Conic',\n    'Lambert_Conformal_Conic_1SP',\n    'Lambert_Conformal_Conic_2SP',\n    'lcc',\n    'Lambert Conic Conformal (1SP)',\n    'Lambert Conic Conformal (2SP)'\n  ];\n\n  var lcc = {\n    init: init$p,\n    forward: forward$o,\n    inverse: inverse$o,\n    names: names$p\n  };\n\n  function init$o() {\n    this.a = 6377397.155;\n    this.es = 0.006674372230614;\n    this.e = Math.sqrt(this.es);\n    if (!this.lat0) {\n      this.lat0 = 0.863937979737193;\n    }\n    if (!this.long0) {\n      this.long0 = 0.7417649320975901 - 0.308341501185665; // 42.5° from Ferro = 24.833° from Greenwich\n    }\n    /* if scale not set default to 0.9999 */\n    if (!this.k0) {\n      this.k0 = 0.9999;\n    }\n    this.s45 = 0.785398163397448; /* 45 */\n    this.s90 = 2 * this.s45;\n    this.fi0 = this.lat0;\n    this.e2 = this.es;\n    this.e = Math.sqrt(this.e2);\n    this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2));\n    this.uq = 1.04216856380474;\n    this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa);\n    this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2);\n    this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g;\n    this.k1 = this.k0;\n    this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2));\n    this.s0 = 1.37008346281555;\n    this.n = Math.sin(this.s0);\n    this.ro0 = this.k1 * this.n0 / Math.tan(this.s0);\n    this.ad = this.s90 - this.uq;\n  }\n\n  /* ellipsoid */\n  /* calculate xy from lat/lon */\n  /* Constants, identical to inverse transform function */\n  function forward$n(p) {\n    var gfi, u, deltav, s, d, eps, ro;\n    var lon = p.x;\n    var lat = p.y;\n    var delta_lon = adjust_lon(lon - this.long0, this.over);\n    /* Transformation */\n    gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2));\n    u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45);\n    deltav = -delta_lon * this.alfa;\n    s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav));\n    d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s));\n    eps = this.n * d;\n    ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n);\n    p.y = ro * Math.cos(eps) / 1;\n    p.x = ro * Math.sin(eps) / 1;\n\n    if (!this.czech) {\n      p.y *= -1;\n      p.x *= -1;\n    }\n    return (p);\n  }\n\n  /* calculate lat/lon from xy */\n  function inverse$n(p) {\n    var u, deltav, s, d, eps, ro, fi1;\n    var ok;\n\n    /* Transformation */\n    /* revert y, x */\n    var tmp = p.x;\n    p.x = p.y;\n    p.y = tmp;\n    if (!this.czech) {\n      p.y *= -1;\n      p.x *= -1;\n    }\n    ro = Math.sqrt(p.x * p.x + p.y * p.y);\n    eps = Math.atan2(p.y, p.x);\n    d = eps / Math.sin(this.s0);\n    s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45);\n    u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d));\n    deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u));\n    p.x = this.long0 - deltav / this.alfa;\n    fi1 = u;\n    ok = 0;\n    var iter = 0;\n    do {\n      p.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45);\n      if (Math.abs(fi1 - p.y) < 0.0000000001) {\n        ok = 1;\n      }\n      fi1 = p.y;\n      iter += 1;\n    } while (ok === 0 && iter < 15);\n    if (iter >= 15) {\n      return null;\n    }\n\n    return (p);\n  }\n\n  var names$o = ['Krovak', 'Krovak Modified', 'Krovak (North Orientated)', 'Krovak Modified (North Orientated)', 'krovak'];\n  var krovak = {\n    init: init$o,\n    forward: forward$n,\n    inverse: inverse$n,\n    names: names$o\n  };\n\n  function mlfn (e0, e1, e2, e3, phi) {\n    return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi));\n  }\n\n  function e0fn (x) {\n    return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x)));\n  }\n\n  function e1fn (x) {\n    return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x)));\n  }\n\n  function e2fn (x) {\n    return (0.05859375 * x * x * (1 + 0.75 * x));\n  }\n\n  function e3fn (x) {\n    return (x * x * x * (35 / 3072));\n  }\n\n  function gN (a, e, sinphi) {\n    var temp = e * sinphi;\n    return a / Math.sqrt(1 - temp * temp);\n  }\n\n  function adjust_lat (x) {\n    return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI));\n  }\n\n  function imlfn (ml, e0, e1, e2, e3) {\n    var phi;\n    var dphi;\n\n    phi = ml / e0;\n    for (var i = 0; i < 15; i++) {\n      dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi));\n      phi += dphi;\n      if (Math.abs(dphi) <= 0.0000000001) {\n        return phi;\n      }\n    }\n\n    // ..reportError(\"IMLFN-CONV:Latitude failed to converge after 15 iterations\");\n    return NaN;\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {number} e0\n   * @property {number} e1\n   * @property {number} e2\n   * @property {number} e3\n   * @property {number} ml0\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$n() {\n    if (!this.sphere) {\n      this.e0 = e0fn(this.es);\n      this.e1 = e1fn(this.es);\n      this.e2 = e2fn(this.es);\n      this.e3 = e3fn(this.es);\n      this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n    }\n  }\n\n  /* Cassini forward equations--mapping lat,long to x,y\n    ----------------------------------------------------------------------- */\n  function forward$m(p) {\n    /* Forward equations\n        ----------------- */\n    var x, y;\n    var lam = p.x;\n    var phi = p.y;\n    lam = adjust_lon(lam - this.long0, this.over);\n\n    if (this.sphere) {\n      x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam));\n      y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0);\n    } else {\n      // ellipsoid\n      var sinphi = Math.sin(phi);\n      var cosphi = Math.cos(phi);\n      var nl = gN(this.a, this.e, sinphi);\n      var tl = Math.tan(phi) * Math.tan(phi);\n      var al = lam * Math.cos(phi);\n      var asq = al * al;\n      var cl = this.es * cosphi * cosphi / (1 - this.es);\n      var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n\n      x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120));\n      y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24);\n    }\n\n    p.x = x + this.x0;\n    p.y = y + this.y0;\n    return p;\n  }\n\n  /* Inverse equations\n    ----------------- */\n  function inverse$m(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n    var x = p.x / this.a;\n    var y = p.y / this.a;\n    var phi, lam;\n\n    if (this.sphere) {\n      var dd = y + this.lat0;\n      phi = Math.asin(Math.sin(dd) * Math.cos(x));\n      lam = Math.atan2(Math.tan(x), Math.cos(dd));\n    } else {\n      /* ellipsoid */\n      var ml1 = this.ml0 / this.a + y;\n      var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3);\n      if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) {\n        p.x = this.long0;\n        p.y = HALF_PI;\n        if (y < 0) {\n          p.y *= -1;\n        }\n        return p;\n      }\n      var nl1 = gN(this.a, this.e, Math.sin(phi1));\n\n      var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es);\n      var tl1 = Math.pow(Math.tan(phi1), 2);\n      var dl = x * this.a / nl1;\n      var dsq = dl * dl;\n      phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24);\n      lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1);\n    }\n\n    p.x = adjust_lon(lam + this.long0, this.over);\n    p.y = adjust_lat(phi);\n    return p;\n  }\n\n  var names$n = ['Cassini', 'Cassini_Soldner', 'cass'];\n  var cass = {\n    init: init$n,\n    forward: forward$m,\n    inverse: inverse$m,\n    names: names$n\n  };\n\n  function qsfnz (eccent, sinphi) {\n    var con;\n    if (eccent > 1.0e-7) {\n      con = eccent * sinphi;\n      return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con))));\n    } else {\n      return (2 * sinphi);\n    }\n  }\n\n  var P00 = 0.33333333333333333333;\n  var P01 = 0.17222222222222222222;\n  var P02 = 0.10257936507936507936;\n  var P10 = 0.06388888888888888888;\n  var P11 = 0.06640211640211640211;\n  var P20 = 0.01641501294219154443;\n\n  function authset(es) {\n    var t;\n    var APA = [];\n    APA[0] = es * P00;\n    t = es * es;\n    APA[0] += t * P01;\n    APA[1] = t * P10;\n    t *= es;\n    APA[0] += t * P02;\n    APA[1] += t * P11;\n    APA[2] = t * P20;\n    return APA;\n  }\n\n  function authlat(beta, APA) {\n    var t = beta + beta;\n    return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t));\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} mode\n   * @property {Array<number>} apa\n   * @property {number} dd\n   * @property {number} e\n   * @property {number} es\n   * @property {number} mmf\n   * @property {number} rq\n   * @property {number} qp\n   * @property {number} sinb1\n   * @property {number} cosb1\n   * @property {number} ymf\n   * @property {number} xmf\n   * @property {number} sinph0\n   * @property {number} cosph0\n   */\n\n  /*\n    reference\n      \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n      The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n    */\n\n  var S_POLE = 1;\n  var N_POLE = 2;\n  var EQUIT = 3;\n  var OBLIQ = 4;\n\n  /**\n   * Initialize the Lambert Azimuthal Equal Area projection\n   * @this {import('../defs.js').ProjectionDefinition & LocalThis}\n   */\n  function init$m() {\n    var t = Math.abs(this.lat0);\n    if (Math.abs(t - HALF_PI) < EPSLN) {\n      this.mode = this.lat0 < 0 ? S_POLE : N_POLE;\n    } else if (Math.abs(t) < EPSLN) {\n      this.mode = EQUIT;\n    } else {\n      this.mode = OBLIQ;\n    }\n    if (this.es > 0) {\n      var sinphi;\n\n      this.qp = qsfnz(this.e, 1);\n      this.mmf = 0.5 / (1 - this.es);\n      this.apa = authset(this.es);\n      switch (this.mode) {\n        case N_POLE:\n          this.dd = 1;\n          break;\n        case S_POLE:\n          this.dd = 1;\n          break;\n        case EQUIT:\n          this.rq = Math.sqrt(0.5 * this.qp);\n          this.dd = 1 / this.rq;\n          this.xmf = 1;\n          this.ymf = 0.5 * this.qp;\n          break;\n        case OBLIQ:\n          this.rq = Math.sqrt(0.5 * this.qp);\n          sinphi = Math.sin(this.lat0);\n          this.sinb1 = qsfnz(this.e, sinphi) / this.qp;\n          this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1);\n          this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1);\n          this.ymf = (this.xmf = this.rq) / this.dd;\n          this.xmf *= this.dd;\n          break;\n      }\n    } else {\n      if (this.mode === OBLIQ) {\n        this.sinph0 = Math.sin(this.lat0);\n        this.cosph0 = Math.cos(this.lat0);\n      }\n    }\n  }\n\n  /* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y\n    ----------------------------------------------------------------------- */\n  function forward$l(p) {\n    /* Forward equations\n        ----------------- */\n    var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi;\n    var lam = p.x;\n    var phi = p.y;\n\n    lam = adjust_lon(lam - this.long0, this.over);\n    if (this.sphere) {\n      sinphi = Math.sin(phi);\n      cosphi = Math.cos(phi);\n      coslam = Math.cos(lam);\n      if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n        y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n        if (y <= EPSLN) {\n          return null;\n        }\n        y = Math.sqrt(2 / y);\n        x = y * cosphi * Math.sin(lam);\n        y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n      } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n        if (this.mode === this.N_POLE) {\n          coslam = -coslam;\n        }\n        if (Math.abs(phi + this.lat0) < EPSLN) {\n          return null;\n        }\n        y = FORTPI - phi * 0.5;\n        y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y));\n        x = y * Math.sin(lam);\n        y *= coslam;\n      }\n    } else {\n      sinb = 0;\n      cosb = 0;\n      b = 0;\n      coslam = Math.cos(lam);\n      sinlam = Math.sin(lam);\n      sinphi = Math.sin(phi);\n      q = qsfnz(this.e, sinphi);\n      if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n        sinb = q / this.qp;\n        cosb = Math.sqrt(1 - sinb * sinb);\n      }\n      switch (this.mode) {\n        case this.OBLIQ:\n          b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam;\n          break;\n        case this.EQUIT:\n          b = 1 + cosb * coslam;\n          break;\n        case this.N_POLE:\n          b = HALF_PI + phi;\n          q = this.qp - q;\n          break;\n        case this.S_POLE:\n          b = phi - HALF_PI;\n          q = this.qp + q;\n          break;\n      }\n      if (Math.abs(b) < EPSLN) {\n        return null;\n      }\n      switch (this.mode) {\n        case this.OBLIQ:\n        case this.EQUIT:\n          b = Math.sqrt(2 / b);\n          if (this.mode === this.OBLIQ) {\n            y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam);\n          } else {\n            y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf;\n          }\n          x = this.xmf * b * cosb * sinlam;\n          break;\n        case this.N_POLE:\n        case this.S_POLE:\n          if (q >= 0) {\n            x = (b = Math.sqrt(q)) * sinlam;\n            y = coslam * ((this.mode === this.S_POLE) ? b : -b);\n          } else {\n            x = y = 0;\n          }\n          break;\n      }\n    }\n\n    p.x = this.a * x + this.x0;\n    p.y = this.a * y + this.y0;\n    return p;\n  }\n\n  /* Inverse equations\n    ----------------- */\n  function inverse$l(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n    var x = p.x / this.a;\n    var y = p.y / this.a;\n    var lam, phi, cCe, sCe, q, rho, ab;\n    if (this.sphere) {\n      var cosz = 0,\n        rh, sinz = 0;\n\n      rh = Math.sqrt(x * x + y * y);\n      phi = rh * 0.5;\n      if (phi > 1) {\n        return null;\n      }\n      phi = 2 * Math.asin(phi);\n      if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n        sinz = Math.sin(phi);\n        cosz = Math.cos(phi);\n      }\n      switch (this.mode) {\n        case this.EQUIT:\n          phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh);\n          x *= sinz;\n          y = cosz * rh;\n          break;\n        case this.OBLIQ:\n          phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh);\n          x *= sinz * this.cosph0;\n          y = (cosz - Math.sin(phi) * this.sinph0) * rh;\n          break;\n        case this.N_POLE:\n          y = -y;\n          phi = HALF_PI - phi;\n          break;\n        case this.S_POLE:\n          phi -= HALF_PI;\n          break;\n      }\n      lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y);\n    } else {\n      ab = 0;\n      if (this.mode === this.OBLIQ || this.mode === this.EQUIT) {\n        x /= this.dd;\n        y *= this.dd;\n        rho = Math.sqrt(x * x + y * y);\n        if (rho < EPSLN) {\n          p.x = this.long0;\n          p.y = this.lat0;\n          return p;\n        }\n        sCe = 2 * Math.asin(0.5 * rho / this.rq);\n        cCe = Math.cos(sCe);\n        x *= (sCe = Math.sin(sCe));\n        if (this.mode === this.OBLIQ) {\n          ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho;\n          q = this.qp * ab;\n          y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe;\n        } else {\n          ab = y * sCe / rho;\n          q = this.qp * ab;\n          y = rho * cCe;\n        }\n      } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) {\n        if (this.mode === this.N_POLE) {\n          y = -y;\n        }\n        q = (x * x + y * y);\n        if (!q) {\n          p.x = this.long0;\n          p.y = this.lat0;\n          return p;\n        }\n        ab = 1 - q / this.qp;\n        if (this.mode === this.S_POLE) {\n          ab = -ab;\n        }\n      }\n      lam = Math.atan2(x, y);\n      phi = authlat(Math.asin(ab), this.apa);\n    }\n\n    p.x = adjust_lon(this.long0 + lam, this.over);\n    p.y = phi;\n    return p;\n  }\n\n  var names$m = ['Lambert Azimuthal Equal Area', 'Lambert_Azimuthal_Equal_Area', 'laea'];\n  var laea = {\n    init: init$m,\n    forward: forward$l,\n    inverse: inverse$l,\n    names: names$m,\n    S_POLE: S_POLE,\n    N_POLE: N_POLE,\n    EQUIT: EQUIT,\n    OBLIQ: OBLIQ\n  };\n\n  function asinz (x) {\n    if (Math.abs(x) > 1) {\n      x = (x > 1) ? 1 : -1;\n    }\n    return Math.asin(x);\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} temp\n   * @property {number} es\n   * @property {number} e3\n   * @property {number} sin_po\n   * @property {number} cos_po\n   * @property {number} t1\n   * @property {number} con\n   * @property {number} ms1\n   * @property {number} qs1\n   * @property {number} t2\n   * @property {number} ms2\n   * @property {number} qs2\n   * @property {number} t3\n   * @property {number} qs0\n   * @property {number} ns0\n   * @property {number} c\n   * @property {number} rh\n   * @property {number} sin_phi\n   * @property {number} cos_phi\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$l() {\n    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n      return;\n    }\n    this.temp = this.b / this.a;\n    this.es = 1 - Math.pow(this.temp, 2);\n    this.e3 = Math.sqrt(this.es);\n\n    this.sin_po = Math.sin(this.lat1);\n    this.cos_po = Math.cos(this.lat1);\n    this.t1 = this.sin_po;\n    this.con = this.sin_po;\n    this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po);\n    this.qs1 = qsfnz(this.e3, this.sin_po);\n\n    this.sin_po = Math.sin(this.lat2);\n    this.cos_po = Math.cos(this.lat2);\n    this.t2 = this.sin_po;\n    this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po);\n    this.qs2 = qsfnz(this.e3, this.sin_po);\n\n    this.sin_po = Math.sin(this.lat0);\n    this.cos_po = Math.cos(this.lat0);\n    this.t3 = this.sin_po;\n    this.qs0 = qsfnz(this.e3, this.sin_po);\n\n    if (Math.abs(this.lat1 - this.lat2) > EPSLN) {\n      this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1);\n    } else {\n      this.ns0 = this.con;\n    }\n    this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1;\n    this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0;\n  }\n\n  /* Albers Conical Equal Area forward equations--mapping lat,long to x,y\n    ------------------------------------------------------------------- */\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function forward$k(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    this.sin_phi = Math.sin(lat);\n    this.cos_phi = Math.cos(lat);\n\n    var qs = qsfnz(this.e3, this.sin_phi);\n    var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0;\n    var theta = this.ns0 * adjust_lon(lon - this.long0, this.over);\n    var x = rh1 * Math.sin(theta) + this.x0;\n    var y = this.rh - rh1 * Math.cos(theta) + this.y0;\n\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  function inverse$k(p) {\n    var rh1, qs, con, theta, lon, lat;\n\n    p.x -= this.x0;\n    p.y = this.rh - p.y + this.y0;\n    if (this.ns0 >= 0) {\n      rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n      con = 1;\n    } else {\n      rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n      con = -1;\n    }\n    theta = 0;\n    if (rh1 !== 0) {\n      theta = Math.atan2(con * p.x, con * p.y);\n    }\n    con = rh1 * this.ns0 / this.a;\n    if (this.sphere) {\n      lat = Math.asin((this.c - con * con) / (2 * this.ns0));\n    } else {\n      qs = (this.c - con * con) / this.ns0;\n      lat = this.phi1z(this.e3, qs);\n    }\n\n    lon = adjust_lon(theta / this.ns0 + this.long0, this.over);\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  /* Function to compute phi1, the latitude for the inverse of the\n     Albers Conical Equal-Area projection.\n  ------------------------------------------- */\n  function phi1z(eccent, qs) {\n    var sinphi, cosphi, con, com, dphi;\n    var phi = asinz(0.5 * qs);\n    if (eccent < EPSLN) {\n      return phi;\n    }\n\n    var eccnts = eccent * eccent;\n    for (var i = 1; i <= 25; i++) {\n      sinphi = Math.sin(phi);\n      cosphi = Math.cos(phi);\n      con = eccent * sinphi;\n      com = 1 - con * con;\n      dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n      phi = phi + dphi;\n      if (Math.abs(dphi) <= 1e-7) {\n        return phi;\n      }\n    }\n    return null;\n  }\n\n  var names$l = ['Albers_Conic_Equal_Area', 'Albers_Equal_Area', 'Albers', 'aea'];\n  var aea = {\n    init: init$l,\n    forward: forward$k,\n    inverse: inverse$k,\n    names: names$l,\n    phi1z: phi1z\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} sin_p14\n   * @property {number} cos_p14\n   * @property {number} infinity_dist\n   * @property {number} rc\n   */\n\n  /**\n    reference:\n      Wolfram Mathworld \"Gnomonic Projection\"\n      http://mathworld.wolfram.com/GnomonicProjection.html\n      Accessed: 12th November 2009\n     @this {import('../defs.js').ProjectionDefinition & LocalThis}\n   */\n  function init$k() {\n    /* Place parameters in static storage for common use\n        ------------------------------------------------- */\n    this.sin_p14 = Math.sin(this.lat0);\n    this.cos_p14 = Math.cos(this.lat0);\n    // Approximation for projecting points to the horizon (infinity)\n    this.infinity_dist = 1000 * this.a;\n    this.rc = 1;\n  }\n\n  /* Gnomonic forward equations--mapping lat,long to x,y\n      --------------------------------------------------- */\n  function forward$j(p) {\n    var sinphi, cosphi; /* sin and cos value        */\n    var dlon; /* delta longitude value      */\n    var coslon; /* cos of longitude        */\n    var ksp; /* scale factor          */\n    var g;\n    var x, y;\n    var lon = p.x;\n    var lat = p.y;\n    /* Forward equations\n        ----------------- */\n    dlon = adjust_lon(lon - this.long0, this.over);\n\n    sinphi = Math.sin(lat);\n    cosphi = Math.cos(lat);\n\n    coslon = Math.cos(dlon);\n    g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n    ksp = 1;\n    if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n      x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g;\n      y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g;\n    } else {\n      // Point is in the opposing hemisphere and is unprojectable\n      // We still need to return a reasonable point, so we project\n      // to infinity, on a bearing\n      // equivalent to the northern hemisphere equivalent\n      // This is a reasonable approximation for short shapes and lines that\n      // straddle the horizon.\n\n      x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon);\n      y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n    }\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  function inverse$j(p) {\n    var rh; /* Rho */\n    var sinc, cosc;\n    var c;\n    var lon, lat;\n\n    /* Inverse equations\n        ----------------- */\n    p.x = (p.x - this.x0) / this.a;\n    p.y = (p.y - this.y0) / this.a;\n\n    p.x /= this.k0;\n    p.y /= this.k0;\n\n    if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) {\n      c = Math.atan2(rh, this.rc);\n      sinc = Math.sin(c);\n      cosc = Math.cos(c);\n\n      lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh);\n      lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc);\n      lon = adjust_lon(this.long0 + lon, this.over);\n    } else {\n      lat = this.phic0;\n      lon = 0;\n    }\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$k = ['gnom'];\n  var gnom = {\n    init: init$k,\n    forward: forward$j,\n    inverse: inverse$j,\n    names: names$k\n  };\n\n  function iqsfnz (eccent, q) {\n    var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent));\n    if (Math.abs(Math.abs(q) - temp) < 1.0E-6) {\n      if (q < 0) {\n        return (-1 * HALF_PI);\n      } else {\n        return HALF_PI;\n      }\n    }\n    // var phi = 0.5* q/(1-eccent*eccent);\n    var phi = Math.asin(0.5 * q);\n    var dphi;\n    var sin_phi;\n    var cos_phi;\n    var con;\n    for (var i = 0; i < 30; i++) {\n      sin_phi = Math.sin(phi);\n      cos_phi = Math.cos(phi);\n      con = eccent * sin_phi;\n      dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con)));\n      phi += dphi;\n      if (Math.abs(dphi) <= 0.0000000001) {\n        return phi;\n      }\n    }\n\n    // console.log(\"IQSFN-CONV:Latitude failed to converge after 30 iterations\");\n    return NaN;\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} e\n   */\n\n  /**\n    reference:\n      \"Cartographic Projection Procedures for the UNIX Environment-\n      A User's Manual\" by Gerald I. Evenden,\n      USGS Open File Report 90-284and Release 4 Interim Reports (2003)\n    @this {import('../defs.js').ProjectionDefinition & LocalThis}\n  */\n  function init$j() {\n    // no-op\n    if (!this.sphere) {\n      this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts));\n    }\n  }\n\n  /* Cylindrical Equal Area forward equations--mapping lat,long to x,y\n      ------------------------------------------------------------ */\n  function forward$i(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var x, y;\n    /* Forward equations\n        ----------------- */\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    if (this.sphere) {\n      x = this.x0 + this.a * dlon * Math.cos(this.lat_ts);\n      y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts);\n    } else {\n      var qs = qsfnz(this.e, Math.sin(lat));\n      x = this.x0 + this.a * this.k0 * dlon;\n      y = this.y0 + this.a * qs * 0.5 / this.k0;\n    }\n\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long\n      ------------------------------------------------------------ */\n  function inverse$i(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n    var lon, lat;\n\n    if (this.sphere) {\n      lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts), this.over);\n      lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts));\n    } else {\n      lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a);\n      lon = adjust_lon(this.long0 + p.x / (this.a * this.k0), this.over);\n    }\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$j = ['cea'];\n  var cea = {\n    init: init$j,\n    forward: forward$i,\n    inverse: inverse$i,\n    names: names$j\n  };\n\n  function init$i() {\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.lat0 = this.lat0 || 0;\n    this.long0 = this.long0 || 0;\n    this.lat_ts = this.lat_ts || 0;\n    this.title = this.title || 'Equidistant Cylindrical (Plate Carre)';\n\n    this.rc = Math.cos(this.lat_ts);\n  }\n\n  // forward equations--mapping lat,long to x,y\n  // -----------------------------------------------------------------\n  function forward$h(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    var dlat = adjust_lat(lat - this.lat0);\n    p.x = this.x0 + (this.a * dlon * this.rc);\n    p.y = this.y0 + (this.a * dlat);\n    return p;\n  }\n\n  // inverse equations--mapping x,y to lat/long\n  // -----------------------------------------------------------------\n  function inverse$h(p) {\n    var x = p.x;\n    var y = p.y;\n\n    p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc)), this.over);\n    p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a)));\n    return p;\n  }\n\n  var names$i = ['Equirectangular', 'Equidistant_Cylindrical', 'Equidistant_Cylindrical_Spherical', 'eqc'];\n  var eqc = {\n    init: init$i,\n    forward: forward$h,\n    inverse: inverse$h,\n    names: names$i\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} temp\n   * @property {number} es\n   * @property {number} e\n   * @property {number} e0\n   * @property {number} e1\n   * @property {number} e2\n   * @property {number} e3\n   * @property {number} ml0\n   */\n\n  var MAX_ITER$1 = 20;\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$h() {\n    /* Place parameters in static storage for common use\n        ------------------------------------------------- */\n    this.temp = this.b / this.a;\n    this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles\n    this.e = Math.sqrt(this.es);\n    this.e0 = e0fn(this.es);\n    this.e1 = e1fn(this.es);\n    this.e2 = e2fn(this.es);\n    this.e3 = e3fn(this.es);\n    this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); // si que des zeros le calcul ne se fait pas\n  }\n\n  /* Polyconic forward equations--mapping lat,long to x,y\n      --------------------------------------------------- */\n  function forward$g(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var x, y, el;\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    el = dlon * Math.sin(lat);\n    if (this.sphere) {\n      if (Math.abs(lat) <= EPSLN) {\n        x = this.a * dlon;\n        y = -1 * this.a * this.lat0;\n      } else {\n        x = this.a * Math.sin(el) / Math.tan(lat);\n        y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat));\n      }\n    } else {\n      if (Math.abs(lat) <= EPSLN) {\n        x = this.a * dlon;\n        y = -1 * this.ml0;\n      } else {\n        var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat);\n        x = nl * Math.sin(el);\n        y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el));\n      }\n    }\n    p.x = x + this.x0;\n    p.y = y + this.y0;\n    return p;\n  }\n\n  /* Inverse equations\n    ----------------- */\n  function inverse$g(p) {\n    var lon, lat, x, y, i;\n    var al, bl;\n    var phi, dphi;\n    x = p.x - this.x0;\n    y = p.y - this.y0;\n\n    if (this.sphere) {\n      if (Math.abs(y + this.a * this.lat0) <= EPSLN) {\n        lon = adjust_lon(x / this.a + this.long0, this.over);\n        lat = 0;\n      } else {\n        al = this.lat0 + y / this.a;\n        bl = x * x / this.a / this.a + al * al;\n        phi = al;\n        var tanphi;\n        for (i = MAX_ITER$1; i; --i) {\n          tanphi = Math.tan(phi);\n          dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1);\n          phi += dphi;\n          if (Math.abs(dphi) <= EPSLN) {\n            lat = phi;\n            break;\n          }\n        }\n        lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat), this.over);\n      }\n    } else {\n      if (Math.abs(y + this.ml0) <= EPSLN) {\n        lat = 0;\n        lon = adjust_lon(this.long0 + x / this.a, this.over);\n      } else {\n        al = (this.ml0 + y) / this.a;\n        bl = x * x / this.a / this.a + al * al;\n        phi = al;\n        var cl, mln, mlnp, ma;\n        var con;\n        for (i = MAX_ITER$1; i; --i) {\n          con = this.e * Math.sin(phi);\n          cl = Math.sqrt(1 - con * con) * Math.tan(phi);\n          mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi);\n          mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi);\n          ma = mln / this.a;\n          dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp);\n          phi -= dphi;\n          if (Math.abs(dphi) <= EPSLN) {\n            lat = phi;\n            break;\n          }\n        }\n\n        // lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0);\n        cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat);\n        lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat), this.over);\n      }\n    }\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$h = ['Polyconic', 'American_Polyconic', 'poly'];\n  var poly = {\n    init: init$h,\n    forward: forward$g,\n    inverse: inverse$g,\n    names: names$h\n  };\n\n  /*\n    reference\n      Department of Land and Survey Technical Circular 1973/32\n        http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf\n      OSG Technical Report 4.1\n        http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf\n    */\n\n  /**\n   * iterations: Number of iterations to refine inverse transform.\n   *     0 -> km accuracy\n   *     1 -> m accuracy -- suitable for most mapping applications\n   *     2 -> mm accuracy\n   */\n  var iterations = 1;\n\n  function init$g() {\n    this.A = [];\n    this.A[1] = 0.6399175073;\n    this.A[2] = -0.1358797613;\n    this.A[3] = 0.063294409;\n    this.A[4] = -0.02526853;\n    this.A[5] = 0.0117879;\n    this.A[6] = -55161e-7;\n    this.A[7] = 0.0026906;\n    this.A[8] = -1333e-6;\n    this.A[9] = 0.00067;\n    this.A[10] = -34e-5;\n\n    this.B_re = [];\n    this.B_im = [];\n    this.B_re[1] = 0.7557853228;\n    this.B_im[1] = 0;\n    this.B_re[2] = 0.249204646;\n    this.B_im[2] = 0.003371507;\n    this.B_re[3] = -1541739e-9;\n    this.B_im[3] = 0.041058560;\n    this.B_re[4] = -0.10162907;\n    this.B_im[4] = 0.01727609;\n    this.B_re[5] = -0.26623489;\n    this.B_im[5] = -0.36249218;\n    this.B_re[6] = -0.6870983;\n    this.B_im[6] = -1.1651967;\n\n    this.C_re = [];\n    this.C_im = [];\n    this.C_re[1] = 1.3231270439;\n    this.C_im[1] = 0;\n    this.C_re[2] = -0.577245789;\n    this.C_im[2] = -7809598e-9;\n    this.C_re[3] = 0.508307513;\n    this.C_im[3] = -0.112208952;\n    this.C_re[4] = -0.15094762;\n    this.C_im[4] = 0.18200602;\n    this.C_re[5] = 1.01418179;\n    this.C_im[5] = 1.64497696;\n    this.C_re[6] = 1.9660549;\n    this.C_im[6] = 2.5127645;\n\n    this.D = [];\n    this.D[1] = 1.5627014243;\n    this.D[2] = 0.5185406398;\n    this.D[3] = -0.03333098;\n    this.D[4] = -0.1052906;\n    this.D[5] = -0.0368594;\n    this.D[6] = 0.007317;\n    this.D[7] = 0.01220;\n    this.D[8] = 0.00394;\n    this.D[9] = -13e-4;\n  }\n\n  /**\n      New Zealand Map Grid Forward  - long/lat to x/y\n      long/lat in radians\n    */\n  function forward$f(p) {\n    var n;\n    var lon = p.x;\n    var lat = p.y;\n\n    var delta_lat = lat - this.lat0;\n    var delta_lon = lon - this.long0;\n\n    // 1. Calculate d_phi and d_psi    ...                          // and d_lambda\n    // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians.\n    var d_phi = delta_lat / SEC_TO_RAD * 1E-5;\n    var d_lambda = delta_lon;\n    var d_phi_n = 1; // d_phi^0\n\n    var d_psi = 0;\n    for (n = 1; n <= 10; n++) {\n      d_phi_n = d_phi_n * d_phi;\n      d_psi = d_psi + this.A[n] * d_phi_n;\n    }\n\n    // 2. Calculate theta\n    var th_re = d_psi;\n    var th_im = d_lambda;\n\n    // 3. Calculate z\n    var th_n_re = 1;\n    var th_n_im = 0; // theta^0\n    var th_n_re1;\n    var th_n_im1;\n\n    var z_re = 0;\n    var z_im = 0;\n    for (n = 1; n <= 6; n++) {\n      th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n      th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n      th_n_re = th_n_re1;\n      th_n_im = th_n_im1;\n      z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im;\n      z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im;\n    }\n\n    // 4. Calculate easting and northing\n    p.x = (z_im * this.a) + this.x0;\n    p.y = (z_re * this.a) + this.y0;\n\n    return p;\n  }\n\n  /**\n      New Zealand Map Grid Inverse  -  x/y to long/lat\n    */\n  function inverse$f(p) {\n    var n;\n    var x = p.x;\n    var y = p.y;\n\n    var delta_x = x - this.x0;\n    var delta_y = y - this.y0;\n\n    // 1. Calculate z\n    var z_re = delta_y / this.a;\n    var z_im = delta_x / this.a;\n\n    // 2a. Calculate theta - first approximation gives km accuracy\n    var z_n_re = 1;\n    var z_n_im = 0; // z^0\n    var z_n_re1;\n    var z_n_im1;\n\n    var th_re = 0;\n    var th_im = 0;\n    for (n = 1; n <= 6; n++) {\n      z_n_re1 = z_n_re * z_re - z_n_im * z_im;\n      z_n_im1 = z_n_im * z_re + z_n_re * z_im;\n      z_n_re = z_n_re1;\n      z_n_im = z_n_im1;\n      th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im;\n      th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im;\n    }\n\n    // 2b. Iterate to refine the accuracy of the calculation\n    //        0 iterations gives km accuracy\n    //        1 iteration gives m accuracy -- good enough for most mapping applications\n    //        2 iterations bives mm accuracy\n    for (var i = 0; i < this.iterations; i++) {\n      var th_n_re = th_re;\n      var th_n_im = th_im;\n      var th_n_re1;\n      var th_n_im1;\n\n      var num_re = z_re;\n      var num_im = z_im;\n      for (n = 2; n <= 6; n++) {\n        th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n        th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n        th_n_re = th_n_re1;\n        th_n_im = th_n_im1;\n        num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n        num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n      }\n\n      th_n_re = 1;\n      th_n_im = 0;\n      var den_re = this.B_re[1];\n      var den_im = this.B_im[1];\n      for (n = 2; n <= 6; n++) {\n        th_n_re1 = th_n_re * th_re - th_n_im * th_im;\n        th_n_im1 = th_n_im * th_re + th_n_re * th_im;\n        th_n_re = th_n_re1;\n        th_n_im = th_n_im1;\n        den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im);\n        den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im);\n      }\n\n      // Complex division\n      var den2 = den_re * den_re + den_im * den_im;\n      th_re = (num_re * den_re + num_im * den_im) / den2;\n      th_im = (num_im * den_re - num_re * den_im) / den2;\n    }\n\n    // 3. Calculate d_phi              ...                                    // and d_lambda\n    var d_psi = th_re;\n    var d_lambda = th_im;\n    var d_psi_n = 1; // d_psi^0\n\n    var d_phi = 0;\n    for (n = 1; n <= 9; n++) {\n      d_psi_n = d_psi_n * d_psi;\n      d_phi = d_phi + this.D[n] * d_psi_n;\n    }\n\n    // 4. Calculate latitude and longitude\n    // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians.\n    var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5);\n    var lon = this.long0 + d_lambda;\n\n    p.x = lon;\n    p.y = lat;\n\n    return p;\n  }\n\n  var names$g = ['New_Zealand_Map_Grid', 'nzmg'];\n  var nzmg = {\n    init: init$g,\n    forward: forward$f,\n    inverse: inverse$f,\n    names: names$g,\n    iterations: iterations\n  };\n\n  /*\n    reference\n      \"New Equal-Area Map Projections for Noncircular Regions\", John P. Snyder,\n      The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355.\n    */\n\n  /* Initialize the Miller Cylindrical projection\n    ------------------------------------------- */\n  function init$f() {\n    // no-op\n  }\n\n  /* Miller Cylindrical forward equations--mapping lat,long to x,y\n      ------------------------------------------------------------ */\n  function forward$e(p) {\n    var lon = p.x;\n    var lat = p.y;\n    /* Forward equations\n        ----------------- */\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    var x = this.x0 + this.a * dlon;\n    var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25;\n\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  /* Miller Cylindrical inverse equations--mapping x,y to lat/long\n      ------------------------------------------------------------ */\n  function inverse$e(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n\n    var lon = adjust_lon(this.long0 + p.x / this.a, this.over);\n    var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4);\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$f = ['Miller_Cylindrical', 'mill'];\n  var mill = {\n    init: init$f,\n    forward: forward$e,\n    inverse: inverse$e,\n    names: names$f\n  };\n\n  var MAX_ITER = 20;\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {Array<number>} en\n   * @property {number} n\n   * @property {number} m\n   * @property {number} C_y\n   * @property {number} C_x\n   * @property {number} es\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$e() {\n    /* Place parameters in static storage for common use\n      ------------------------------------------------- */\n    this.long0 = this.long0 || 0;\n\n    if (!this.sphere) {\n      this.en = pj_enfn(this.es);\n    } else {\n      this.n = 1;\n      this.m = 0;\n      this.es = 0;\n      this.C_y = Math.sqrt((this.m + 1) / this.n);\n      this.C_x = this.C_y / (this.m + 1);\n    }\n  }\n\n  /* Sinusoidal forward equations--mapping lat,long to x,y\n    ----------------------------------------------------- */\n  function forward$d(p) {\n    var x, y;\n    var lon = p.x;\n    var lat = p.y;\n    /* Forward equations\n      ----------------- */\n    lon = adjust_lon(lon - this.long0, this.over);\n\n    if (this.sphere) {\n      if (!this.m) {\n        lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat;\n      } else {\n        var k = this.n * Math.sin(lat);\n        for (var i = MAX_ITER; i; --i) {\n          var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat));\n          lat -= V;\n          if (Math.abs(V) < EPSLN) {\n            break;\n          }\n        }\n      }\n      x = this.a * this.C_x * lon * (this.m + Math.cos(lat));\n      y = this.a * this.C_y * lat;\n    } else {\n      var s = Math.sin(lat);\n      var c = Math.cos(lat);\n      y = this.a * pj_mlfn(lat, s, c, this.en);\n      x = this.a * lon * c / Math.sqrt(1 - this.es * s * s);\n    }\n\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  function inverse$d(p) {\n    var lat, temp, lon, s;\n\n    p.x -= this.x0;\n    lon = p.x / this.a;\n    p.y -= this.y0;\n    lat = p.y / this.a;\n\n    if (this.sphere) {\n      lat /= this.C_y;\n      lon = lon / (this.C_x * (this.m + Math.cos(lat)));\n      if (this.m) {\n        lat = asinz((this.m * lat + Math.sin(lat)) / this.n);\n      } else if (this.n !== 1) {\n        lat = asinz(Math.sin(lat) / this.n);\n      }\n      lon = adjust_lon(lon + this.long0, this.over);\n      lat = adjust_lat(lat);\n    } else {\n      lat = pj_inv_mlfn(p.y / this.a, this.es, this.en);\n      s = Math.abs(lat);\n      if (s < HALF_PI) {\n        s = Math.sin(lat);\n        temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat));\n        // temp = this.long0 + p.x / (this.a * Math.cos(lat));\n        lon = adjust_lon(temp, this.over);\n      } else if ((s - EPSLN) < HALF_PI) {\n        lon = this.long0;\n      }\n    }\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$e = ['Sinusoidal', 'sinu'];\n  var sinu = {\n    init: init$e,\n    forward: forward$d,\n    inverse: inverse$d,\n    names: names$e\n  };\n\n  /**\n   * Eckert VI projection — spherical sinusoidal variant with m=1, n=1+π/2.\n   * Always forces spherical computation regardless of the ellipsoid.\n   *\n   * @typedef {Object} LocalThis\n   * @property {number} m\n   * @property {number} n\n   * @property {number} C_y\n   * @property {number} C_x\n   * @property {number} es\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$d() {\n    /* Force spherical handling */\n    this.sphere = true;\n    this.b = this.a;\n\n    this.m = 1.0;\n    this.n = 2.570796326794896619231321691; /* 1 + π/2 */\n    this.es = 0;\n\n    this.C_y = Math.sqrt((this.m + 1.0) / this.n);\n    this.C_x = this.C_y / (this.m + 1.0);\n  }\n\n  var forward$c = forward$d;\n  var inverse$c = inverse$d;\n\n  var names$d = ['Eckert_VI', 'eck6'];\n  var eck6 = {\n    init: init$d,\n    forward: forward$c,\n    inverse: inverse$c,\n    names: names$d\n  };\n\n  /** @this {import('../defs.js').ProjectionDefinition} */\n  function init$c() {\n    this.x0 = this.x0 !== undefined ? this.x0 : 0;\n    this.y0 = this.y0 !== undefined ? this.y0 : 0;\n    this.long0 = this.long0 !== undefined ? this.long0 : 0;\n  }\n\n  /* Mollweide forward equations--mapping lat,long to x,y\n      ---------------------------------------------------- */\n  function forward$b(p) {\n    /* Forward equations\n        ----------------- */\n    var lon = p.x;\n    var lat = p.y;\n\n    var delta_lon = adjust_lon(lon - this.long0, this.over);\n    var theta = lat;\n    var con = Math.PI * Math.sin(lat);\n\n    /* Iterate using the Newton-Raphson method to find theta\n        ----------------------------------------------------- */\n    while (true) {\n      var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta));\n      theta += delta_theta;\n      if (Math.abs(delta_theta) < EPSLN) {\n        break;\n      }\n    }\n    theta /= 2;\n\n    /* If the latitude is 90 deg, force the x coordinate to be \"0 + false easting\"\n         this is done here because of precision problems with \"cos(theta)\"\n         -------------------------------------------------------------------------- */\n    if (Math.PI / 2 - Math.abs(lat) < EPSLN) {\n      delta_lon = 0;\n    }\n    var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0;\n    var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0;\n\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  function inverse$b(p) {\n    var theta;\n    var arg;\n\n    /* Inverse equations\n        ----------------- */\n    p.x -= this.x0;\n    p.y -= this.y0;\n    arg = p.y / (1.4142135623731 * this.a);\n\n    /* Because of division by zero problems, 'arg' can not be 1.  Therefore\n         a number very close to one is used instead.\n         ------------------------------------------------------------------- */\n    if (Math.abs(arg) > 0.999999999999) {\n      arg = 0.999999999999;\n    }\n    theta = Math.asin(arg);\n    var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta))), this.over);\n    if (lon < (-Math.PI)) {\n      lon = -Math.PI;\n    }\n    if (lon > Math.PI) {\n      lon = Math.PI;\n    }\n    arg = (2 * theta + Math.sin(2 * theta)) / Math.PI;\n    if (Math.abs(arg) > 1) {\n      arg = 1;\n    }\n    var lat = Math.asin(arg);\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$c = ['Mollweide', 'moll'];\n  var moll = {\n    init: init$c,\n    forward: forward$b,\n    inverse: inverse$b,\n    names: names$c\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} temp\n   * @property {number} es\n   * @property {number} e\n   * @property {number} e0\n   * @property {number} e1\n   * @property {number} e2\n   * @property {number} e3\n   * @property {number} sin_phi\n   * @property {number} cos_phi\n   * @property {number} ms1\n   * @property {number} ml1\n   * @property {number} ms2\n   * @property {number} ml2\n   * @property {number} ns\n   * @property {number} g\n   * @property {number} ml0\n   * @property {number} rh\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$b() {\n    /* Place parameters in static storage for common use\n        ------------------------------------------------- */\n    // Standard Parallels cannot be equal and on opposite sides of the equator\n    if (Math.abs(this.lat1 + this.lat2) < EPSLN) {\n      return;\n    }\n    this.lat2 = this.lat2 || this.lat1;\n    this.temp = this.b / this.a;\n    this.es = 1 - Math.pow(this.temp, 2);\n    this.e = Math.sqrt(this.es);\n    this.e0 = e0fn(this.es);\n    this.e1 = e1fn(this.es);\n    this.e2 = e2fn(this.es);\n    this.e3 = e3fn(this.es);\n\n    this.sin_phi = Math.sin(this.lat1);\n    this.cos_phi = Math.cos(this.lat1);\n\n    this.ms1 = msfnz(this.e, this.sin_phi, this.cos_phi);\n    this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1);\n\n    if (Math.abs(this.lat1 - this.lat2) < EPSLN) {\n      this.ns = this.sin_phi;\n    } else {\n      this.sin_phi = Math.sin(this.lat2);\n      this.cos_phi = Math.cos(this.lat2);\n      this.ms2 = msfnz(this.e, this.sin_phi, this.cos_phi);\n      this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2);\n      this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1);\n    }\n    this.g = this.ml1 + this.ms1 / this.ns;\n    this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0);\n    this.rh = this.a * (this.g - this.ml0);\n  }\n\n  /* Equidistant Conic forward equations--mapping lat,long to x,y\n    ----------------------------------------------------------- */\n  function forward$a(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var rh1;\n\n    /* Forward equations\n        ----------------- */\n    if (this.sphere) {\n      rh1 = this.a * (this.g - lat);\n    } else {\n      var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat);\n      rh1 = this.a * (this.g - ml);\n    }\n    var theta = this.ns * adjust_lon(lon - this.long0, this.over);\n    var x = this.x0 + rh1 * Math.sin(theta);\n    var y = this.y0 + this.rh - rh1 * Math.cos(theta);\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  /* Inverse equations\n    ----------------- */\n  function inverse$a(p) {\n    p.x -= this.x0;\n    p.y = this.rh - p.y + this.y0;\n    var con, rh1, lat, lon;\n    if (this.ns >= 0) {\n      rh1 = Math.sqrt(p.x * p.x + p.y * p.y);\n      con = 1;\n    } else {\n      rh1 = -Math.sqrt(p.x * p.x + p.y * p.y);\n      con = -1;\n    }\n    var theta = 0;\n    if (rh1 !== 0) {\n      theta = Math.atan2(con * p.x, con * p.y);\n    }\n\n    if (this.sphere) {\n      lon = adjust_lon(this.long0 + theta / this.ns, this.over);\n      lat = adjust_lat(this.g - rh1 / this.a);\n      p.x = lon;\n      p.y = lat;\n      return p;\n    } else {\n      var ml = this.g - rh1 / this.a;\n      lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3);\n      lon = adjust_lon(this.long0 + theta / this.ns, this.over);\n      p.x = lon;\n      p.y = lat;\n      return p;\n    }\n  }\n\n  var names$b = ['Equidistant_Conic', 'eqdc'];\n  var eqdc = {\n    init: init$b,\n    forward: forward$a,\n    inverse: inverse$a,\n    names: names$b\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} R - Radius of the Earth\n   */\n\n  /**\n   * Initialize the Van Der Grinten projection\n   * @this {import('../defs.js').ProjectionDefinition & LocalThis}\n   */\n  function init$a() {\n    // this.R = 6370997; //Radius of earth\n    this.R = this.a;\n  }\n\n  function forward$9(p) {\n    var lon = p.x;\n    var lat = p.y;\n\n    /* Forward equations\n      ----------------- */\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    var x, y;\n\n    if (Math.abs(lat) <= EPSLN) {\n      x = this.x0 + this.R * dlon;\n      y = this.y0;\n      p.x = x;\n      p.y = y;\n      return p;\n    }\n    var theta = asinz(2 * Math.abs(lat / Math.PI));\n    if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) {\n      x = this.x0;\n      if (lat >= 0) {\n        y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta);\n      } else {\n        y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta);\n      }\n      p.x = x;\n      p.y = y;\n      return p;\n    }\n    var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI));\n    var asq = al * al;\n    var sinth = Math.sin(theta);\n    var costh = Math.cos(theta);\n\n    var g = costh / (sinth + costh - 1);\n    var gsq = g * g;\n    var m = g * (2 / sinth - 1);\n    var msq = m * m;\n    var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq);\n    if (dlon < 0) {\n      con = -con;\n    }\n    x = this.x0 + con;\n    // con = Math.abs(con / (Math.PI * this.R));\n    var q = asq + g;\n    con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq);\n    if (lat >= 0) {\n      // y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n      y = this.y0 + con;\n    } else {\n      // y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con);\n      y = this.y0 - con;\n    }\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  /* Van Der Grinten inverse equations--mapping x,y to lat/long\n    --------------------------------------------------------- */\n  function inverse$9(p) {\n    var lon, lat;\n    var xx, yy, xys, c1, c2, c3;\n    var a1;\n    var m1;\n    var con;\n    var th1;\n    var d;\n\n    /* inverse equations\n      ----------------- */\n    p.x -= this.x0;\n    p.y -= this.y0;\n    con = Math.PI * this.R;\n    xx = p.x / con;\n    yy = p.y / con;\n    xys = xx * xx + yy * yy;\n    c1 = -Math.abs(yy) * (1 + xys);\n    c2 = c1 - 2 * yy * yy + xx * xx;\n    c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys;\n    d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27;\n    a1 = (c1 - c2 * c2 / 3 / c3) / c3;\n    m1 = 2 * Math.sqrt(-a1 / 3);\n    con = ((3 * d) / a1) / m1;\n    if (Math.abs(con) > 1) {\n      if (con >= 0) {\n        con = 1;\n      } else {\n        con = -1;\n      }\n    }\n    th1 = Math.acos(con) / 3;\n    if (p.y >= 0) {\n      lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n    } else {\n      lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI;\n    }\n\n    if (Math.abs(xx) < EPSLN) {\n      lon = this.long0;\n    } else {\n      lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx, this.over);\n    }\n\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$a = ['Van_der_Grinten_I', 'VanDerGrinten', 'Van_der_Grinten', 'vandg'];\n  var vandg = {\n    init: init$a,\n    forward: forward$9,\n    inverse: inverse$9,\n    names: names$a\n  };\n\n  /**\n   * Calculates the inverse geodesic problem using Vincenty's formulae.\n   * Computes the forward azimuth and ellipsoidal distance between two points\n   * specified by latitude and longitude on the surface of an ellipsoid.\n   *\n   * @param {number} lat1 Latitude of the first point in radians.\n   * @param {number} lon1 Longitude of the first point in radians.\n   * @param {number} lat2 Latitude of the second point in radians.\n   * @param {number} lon2 Longitude of the second point in radians.\n   * @param {number} a Semi-major axis of the ellipsoid (meters).\n   * @param {number} f Flattening of the ellipsoid.\n   * @returns {{ azi1: number, s12: number }} An object containing:\n   *   - azi1: Forward azimuth from the first point to the second point (radians).\n   *   - s12: Ellipsoidal distance between the two points (meters).\n   */\n  function vincentyInverse(lat1, lon1, lat2, lon2, a, f) {\n    const L = lon2 - lon1;\n    const U1 = Math.atan((1 - f) * Math.tan(lat1));\n    const U2 = Math.atan((1 - f) * Math.tan(lat2));\n    const sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);\n    const sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);\n\n    let lambda = L, lambdaP, iterLimit = 100;\n    let sinLambda, cosLambda, sinSigma, cosSigma, sigma, sinAlpha, cos2Alpha, cos2SigmaM, C;\n    let uSq, A, B, deltaSigma, s;\n\n    do {\n      sinLambda = Math.sin(lambda);\n      cosLambda = Math.cos(lambda);\n      sinSigma = Math.sqrt(\n        (cosU2 * sinLambda) * (cosU2 * sinLambda)\n        + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda)\n        * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda)\n      );\n      if (sinSigma === 0) {\n        return { azi1: 0, s12: 0 }; // coincident points\n      }\n      cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n      sigma = Math.atan2(sinSigma, cosSigma);\n      sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;\n      cos2Alpha = 1 - sinAlpha * sinAlpha;\n      cos2SigmaM = (cos2Alpha !== 0) ? (cosSigma - 2 * sinU1 * sinU2 / cos2Alpha) : 0;\n      C = f / 16 * cos2Alpha * (4 + f * (4 - 3 * cos2Alpha));\n      lambdaP = lambda;\n      lambda = L + (1 - C) * f * sinAlpha\n      * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));\n    } while (Math.abs(lambda - lambdaP) > 1e-12 && --iterLimit > 0);\n\n    if (iterLimit === 0) {\n      return { azi1: NaN, s12: NaN }; // formula failed to converge\n    }\n\n    uSq = cos2Alpha * (a * a - (a * (1 - f)) * (a * (1 - f))) / ((a * (1 - f)) * (a * (1 - f)));\n    A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n    B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n    deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)\n      - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));\n\n    s = (a * (1 - f)) * A * (sigma - deltaSigma);\n\n    // Forward azimuth\n    const azi1 = Math.atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);\n\n    return { azi1, s12: s };\n  }\n\n  /**\n   * Solves the direct geodetic problem using Vincenty's formulae.\n   * Given a starting point, initial azimuth, and distance, computes the destination point on the ellipsoid.\n   *\n   * @param {number} lat1 Latitude of the starting point in radians.\n   * @param {number} lon1 Longitude of the starting point in radians.\n   * @param {number} azi1 Initial azimuth (forward azimuth) in radians.\n   * @param {number} s12 Distance to travel from the starting point in meters.\n   * @param {number} a Semi-major axis of the ellipsoid in meters.\n   * @param {number} f Flattening of the ellipsoid.\n   * @returns {{lat2: number, lon2: number}} The latitude and longitude (in radians) of the destination point.\n   */\n  function vincentyDirect(lat1, lon1, azi1, s12, a, f) {\n    const U1 = Math.atan((1 - f) * Math.tan(lat1));\n    const sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);\n    const sinAlpha1 = Math.sin(azi1), cosAlpha1 = Math.cos(azi1);\n\n    const sigma1 = Math.atan2(sinU1, cosU1 * cosAlpha1);\n    const sinAlpha = cosU1 * sinAlpha1;\n    const cos2Alpha = 1 - sinAlpha * sinAlpha;\n    const uSq = cos2Alpha * (a * a - (a * (1 - f)) * (a * (1 - f))) / ((a * (1 - f)) * (a * (1 - f)));\n    const A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));\n    const B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));\n\n    let sigma = s12 / ((a * (1 - f)) * A), sigmaP, iterLimit = 100;\n    let cos2SigmaM, sinSigma, cosSigma, deltaSigma;\n\n    do {\n      cos2SigmaM = Math.cos(2 * sigma1 + sigma);\n      sinSigma = Math.sin(sigma);\n      cosSigma = Math.cos(sigma);\n      deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)\n        - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));\n      sigmaP = sigma;\n      sigma = s12 / ((a * (1 - f)) * A) + deltaSigma;\n    } while (Math.abs(sigma - sigmaP) > 1e-12 && --iterLimit > 0);\n\n    if (iterLimit === 0) {\n      return { lat2: NaN, lon2: NaN };\n    }\n\n    const tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;\n    const lat2 = Math.atan2(\n      sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,\n      (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp)\n    );\n    const lambda = Math.atan2(\n      sinSigma * sinAlpha1,\n      cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1\n    );\n    const C = f / 16 * cos2Alpha * (4 + f * (4 - 3 * cos2Alpha));\n    const L = lambda - (1 - C) * f * sinAlpha\n      * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));\n    const lon2 = lon1 + L;\n\n    return { lat2, lon2 };\n  }\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {number} sin_p12\n   * @property {number} cos_p12\n   * @property {number} a\n   * @property {number} f\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$9() {\n    this.sin_p12 = Math.sin(this.lat0);\n    this.cos_p12 = Math.cos(this.lat0);\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.long0 = this.long0 || 0;\n    // flattening for ellipsoid\n    this.f = this.es / (1 + Math.sqrt(1 - this.es));\n  }\n\n  function forward$8(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var sinphi = Math.sin(p.y);\n    var cosphi = Math.cos(p.y);\n    var dlon = adjust_lon(lon - this.long0, this.over);\n    var e0, e1, e2, e3, Mlp, Ml, c, kp, cos_c, vars, azi1;\n    if (this.sphere) {\n      if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n        // North Pole case\n        p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon);\n        p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon);\n        return p;\n      } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n        // South Pole case\n        p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon);\n        p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon);\n        return p;\n      } else {\n        // default case\n        cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon);\n        c = Math.acos(cos_c);\n        kp = c ? c / Math.sin(c) : 1;\n        p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon);\n        p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon));\n        return p;\n      }\n    } else {\n      e0 = e0fn(this.es);\n      e1 = e1fn(this.es);\n      e2 = e2fn(this.es);\n      e3 = e3fn(this.es);\n      if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n        // North Pole case\n        Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n        Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n        p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon);\n        p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon);\n        return p;\n      } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n        // South Pole case\n        Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n        Ml = this.a * mlfn(e0, e1, e2, e3, lat);\n        p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon);\n        p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon);\n        return p;\n      } else {\n        // Default case\n        if (Math.abs(lon) < EPSLN && Math.abs(lat - this.lat0) < EPSLN) {\n          p.x = this.x0;\n          p.y = this.y0;\n          return p;\n        }\n        vars = vincentyInverse(this.lat0, this.long0, lat, lon, this.a, this.f);\n        azi1 = vars.azi1;\n        p.x = this.x0 + vars.s12 * Math.sin(azi1);\n        p.y = this.y0 + vars.s12 * Math.cos(azi1);\n        return p;\n      }\n    }\n  }\n\n  function inverse$8(p) {\n    p.x -= this.x0;\n    p.y -= this.y0;\n    var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, azi1, s12, vars;\n    if (this.sphere) {\n      rh = Math.sqrt(p.x * p.x + p.y * p.y);\n      if (rh > (2 * HALF_PI * this.a)) {\n        return;\n      }\n      z = rh / this.a;\n\n      sinz = Math.sin(z);\n      cosz = Math.cos(z);\n\n      lon = this.long0;\n      if (Math.abs(rh) <= EPSLN) {\n        lat = this.lat0;\n      } else {\n        lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh);\n        con = Math.abs(this.lat0) - HALF_PI;\n        if (Math.abs(con) <= EPSLN) {\n          if (this.lat0 >= 0) {\n            lon = adjust_lon(this.long0 + Math.atan2(p.x, -p.y), this.over);\n          } else {\n            lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y), this.over);\n          }\n        } else {\n          lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz), this.over);\n        }\n      }\n\n      p.x = lon;\n      p.y = lat;\n      return p;\n    } else {\n      e0 = e0fn(this.es);\n      e1 = e1fn(this.es);\n      e2 = e2fn(this.es);\n      e3 = e3fn(this.es);\n      if (Math.abs(this.sin_p12 - 1) <= EPSLN) {\n        // North pole case\n        Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n        rh = Math.sqrt(p.x * p.x + p.y * p.y);\n        M = Mlp - rh;\n        lat = imlfn(M / this.a, e0, e1, e2, e3);\n        lon = adjust_lon(this.long0 + Math.atan2(p.x, -1 * p.y), this.over);\n        p.x = lon;\n        p.y = lat;\n        return p;\n      } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) {\n        // South pole case\n        Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI);\n        rh = Math.sqrt(p.x * p.x + p.y * p.y);\n        M = rh - Mlp;\n\n        lat = imlfn(M / this.a, e0, e1, e2, e3);\n        lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y), this.over);\n        p.x = lon;\n        p.y = lat;\n        return p;\n      } else {\n        // default case\n        azi1 = Math.atan2(p.x, p.y);\n        s12 = Math.sqrt(p.x * p.x + p.y * p.y);\n        vars = vincentyDirect(this.lat0, this.long0, azi1, s12, this.a, this.f);\n\n        p.x = vars.lon2;\n        p.y = vars.lat2;\n        return p;\n      }\n    }\n  }\n\n  var names$9 = ['Azimuthal_Equidistant', 'aeqd'];\n  var aeqd = {\n    init: init$9,\n    forward: forward$8,\n    inverse: inverse$8,\n    names: names$9\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} sin_p14\n   * @property {number} cos_p14\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$8() {\n    // double temp;      /* temporary variable    */\n\n    /* Place parameters in static storage for common use\n        ------------------------------------------------- */\n    this.sin_p14 = Math.sin(this.lat0 || 0);\n    this.cos_p14 = Math.cos(this.lat0 || 0);\n  }\n\n  /* Orthographic forward equations--mapping lat,long to x,y\n      --------------------------------------------------- */\n  function forward$7(p) {\n    var sinphi, cosphi; /* sin and cos value        */\n    var dlon; /* delta longitude value      */\n    var coslon; /* cos of longitude        */\n    var ksp; /* scale factor          */\n    var g, x, y;\n    var lon = p.x;\n    var lat = p.y;\n    /* Forward equations\n        ----------------- */\n    dlon = adjust_lon(lon - (this.long0 || 0), this.over);\n\n    sinphi = Math.sin(lat);\n    cosphi = Math.cos(lat);\n\n    coslon = Math.cos(dlon);\n    g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon;\n    ksp = 1;\n    if ((g > 0) || (Math.abs(g) <= EPSLN)) {\n      x = (this.x0 || 0) + this.a * ksp * cosphi * Math.sin(dlon);\n      y = (this.y0 || 0) + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon);\n    }\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  function inverse$7(p) {\n    var rh; /* height above ellipsoid      */\n    var z; /* angle          */\n    var sinz, cosz; /* sin of z and cos of z      */\n    var con;\n    var lon, lat;\n    var long0, lat0;\n    /* Inverse equations\n        ----------------- */\n    p.x -= this.x0 || 0;\n    p.y -= this.y0 || 0;\n    rh = Math.sqrt(p.x * p.x + p.y * p.y);\n    z = asinz(rh / this.a);\n\n    sinz = Math.sin(z);\n    cosz = Math.cos(z);\n\n    long0 = this.long0 || 0;\n    lat0 = this.lat0 || 0;\n    lon = long0;\n    if (Math.abs(rh) <= EPSLN) {\n      lat = lat0;\n      p.x = lon;\n      p.y = lat;\n      return p;\n    }\n    lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh);\n    con = Math.abs(lat0) - HALF_PI;\n    if (Math.abs(con) <= EPSLN) {\n      if (lat0 >= 0) {\n        lon = adjust_lon(long0 + Math.atan2(p.x, -p.y), this.over);\n      } else {\n        lon = adjust_lon(long0 - Math.atan2(-p.x, p.y), this.over);\n      }\n      p.x = lon;\n      p.y = lat;\n      return p;\n    }\n    lon = adjust_lon(long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz), this.over);\n    p.x = lon;\n    p.y = lat;\n    return p;\n  }\n\n  var names$8 = ['ortho'];\n  var ortho = {\n    init: init$8,\n    forward: forward$7,\n    inverse: inverse$7,\n    names: names$8\n  };\n\n  // QSC projection rewritten from the original PROJ4\n  // https://github.com/OSGeo/proj.4/blob/master/src/PJ_qsc.c\n\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} face\n   * @property {number} x0\n   * @property {number} y0\n   * @property {number} es\n   * @property {number} one_minus_f\n   * @property {number} one_minus_f_squared\n   */\n\n  /* constants */\n  var FACE_ENUM = {\n    FRONT: 1,\n    RIGHT: 2,\n    BACK: 3,\n    LEFT: 4,\n    TOP: 5,\n    BOTTOM: 6\n  };\n\n  var AREA_ENUM = {\n    AREA_0: 1,\n    AREA_1: 2,\n    AREA_2: 3,\n    AREA_3: 4\n  };\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$7() {\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.lat0 = this.lat0 || 0;\n    this.long0 = this.long0 || 0;\n    this.lat_ts = this.lat_ts || 0;\n    this.title = this.title || 'Quadrilateralized Spherical Cube';\n\n    /* Determine the cube face from the center of projection. */\n    if (this.lat0 >= HALF_PI - FORTPI / 2.0) {\n      this.face = FACE_ENUM.TOP;\n    } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) {\n      this.face = FACE_ENUM.BOTTOM;\n    } else if (Math.abs(this.long0) <= FORTPI) {\n      this.face = FACE_ENUM.FRONT;\n    } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) {\n      this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT;\n    } else {\n      this.face = FACE_ENUM.BACK;\n    }\n\n    /* Fill in useful values for the ellipsoid <-> sphere shift\n     * described in [LK12]. */\n    if (this.es !== 0) {\n      this.one_minus_f = 1 - (this.a - this.b) / this.a;\n      this.one_minus_f_squared = this.one_minus_f * this.one_minus_f;\n    }\n  }\n\n  // QSC forward equations--mapping lat,long to x,y\n  // -----------------------------------------------------------------\n  function forward$6(p) {\n    var xy = { x: 0, y: 0 };\n    var lat, lon;\n    var theta, phi;\n    var t, mu;\n    /* nu; */\n    var area = { value: 0 };\n\n    // move lon according to projection's lon\n    p.x -= this.long0;\n\n    /* Convert the geodetic latitude to a geocentric latitude.\n     * This corresponds to the shift from the ellipsoid to the sphere\n     * described in [LK12]. */\n    if (this.es !== 0) { // if (P->es != 0) {\n      lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y));\n    } else {\n      lat = p.y;\n    }\n\n    /* Convert the input lat, lon into theta, phi as used by QSC.\n     * This depends on the cube face and the area on it.\n     * For the top and bottom face, we can compute theta and phi\n     * directly from phi, lam. For the other faces, we must use\n     * unit sphere cartesian coordinates as an intermediate step. */\n    lon = p.x; // lon = lp.lam;\n    if (this.face === FACE_ENUM.TOP) {\n      phi = HALF_PI - lat;\n      if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n        area.value = AREA_ENUM.AREA_0;\n        theta = lon - HALF_PI;\n      } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) {\n        area.value = AREA_ENUM.AREA_1;\n        theta = (lon > 0.0 ? lon - SPI : lon + SPI);\n      } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) {\n        area.value = AREA_ENUM.AREA_2;\n        theta = lon + HALF_PI;\n      } else {\n        area.value = AREA_ENUM.AREA_3;\n        theta = lon;\n      }\n    } else if (this.face === FACE_ENUM.BOTTOM) {\n      phi = HALF_PI + lat;\n      if (lon >= FORTPI && lon <= HALF_PI + FORTPI) {\n        area.value = AREA_ENUM.AREA_0;\n        theta = -lon + HALF_PI;\n      } else if (lon < FORTPI && lon >= -FORTPI) {\n        area.value = AREA_ENUM.AREA_1;\n        theta = -lon;\n      } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) {\n        area.value = AREA_ENUM.AREA_2;\n        theta = -lon - HALF_PI;\n      } else {\n        area.value = AREA_ENUM.AREA_3;\n        theta = (lon > 0.0 ? -lon + SPI : -lon - SPI);\n      }\n    } else {\n      var q, r, s;\n      var sinlat, coslat;\n      var sinlon, coslon;\n\n      if (this.face === FACE_ENUM.RIGHT) {\n        lon = qsc_shift_lon_origin(lon, +HALF_PI);\n      } else if (this.face === FACE_ENUM.BACK) {\n        lon = qsc_shift_lon_origin(lon, +SPI);\n      } else if (this.face === FACE_ENUM.LEFT) {\n        lon = qsc_shift_lon_origin(lon, -HALF_PI);\n      }\n      sinlat = Math.sin(lat);\n      coslat = Math.cos(lat);\n      sinlon = Math.sin(lon);\n      coslon = Math.cos(lon);\n      q = coslat * coslon;\n      r = coslat * sinlon;\n      s = sinlat;\n\n      if (this.face === FACE_ENUM.FRONT) {\n        phi = Math.acos(q);\n        theta = qsc_fwd_equat_face_theta(phi, s, r, area);\n      } else if (this.face === FACE_ENUM.RIGHT) {\n        phi = Math.acos(r);\n        theta = qsc_fwd_equat_face_theta(phi, s, -q, area);\n      } else if (this.face === FACE_ENUM.BACK) {\n        phi = Math.acos(-q);\n        theta = qsc_fwd_equat_face_theta(phi, s, -r, area);\n      } else if (this.face === FACE_ENUM.LEFT) {\n        phi = Math.acos(-r);\n        theta = qsc_fwd_equat_face_theta(phi, s, q, area);\n      } else {\n        /* Impossible */\n        phi = theta = 0;\n        area.value = AREA_ENUM.AREA_0;\n      }\n    }\n\n    /* Compute mu and nu for the area of definition.\n     * For mu, see Eq. (3-21) in [OL76], but note the typos:\n     * compare with Eq. (3-14). For nu, see Eq. (3-38). */\n    mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI));\n    t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta)))));\n\n    /* Apply the result to the real area. */\n    if (area.value === AREA_ENUM.AREA_1) {\n      mu += HALF_PI;\n    } else if (area.value === AREA_ENUM.AREA_2) {\n      mu += SPI;\n    } else if (area.value === AREA_ENUM.AREA_3) {\n      mu += 1.5 * SPI;\n    }\n\n    /* Now compute x, y from mu and nu */\n    xy.x = t * Math.cos(mu);\n    xy.y = t * Math.sin(mu);\n    xy.x = xy.x * this.a + this.x0;\n    xy.y = xy.y * this.a + this.y0;\n\n    p.x = xy.x;\n    p.y = xy.y;\n    return p;\n  }\n\n  // QSC inverse equations--mapping x,y to lat/long\n  // -----------------------------------------------------------------\n  function inverse$6(p) {\n    var lp = { lam: 0, phi: 0 };\n    var mu, nu, cosmu, tannu;\n    var tantheta, theta, cosphi, phi;\n    var t;\n    var area = { value: 0 };\n\n    /* de-offset */\n    p.x = (p.x - this.x0) / this.a;\n    p.y = (p.y - this.y0) / this.a;\n\n    /* Convert the input x, y to the mu and nu angles as used by QSC.\n     * This depends on the area of the cube face. */\n    nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y));\n    mu = Math.atan2(p.y, p.x);\n    if (p.x >= 0.0 && p.x >= Math.abs(p.y)) {\n      area.value = AREA_ENUM.AREA_0;\n    } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) {\n      area.value = AREA_ENUM.AREA_1;\n      mu -= HALF_PI;\n    } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) {\n      area.value = AREA_ENUM.AREA_2;\n      mu = (mu < 0.0 ? mu + SPI : mu - SPI);\n    } else {\n      area.value = AREA_ENUM.AREA_3;\n      mu += HALF_PI;\n    }\n\n    /* Compute phi and theta for the area of definition.\n     * The inverse projection is not described in the original paper, but some\n     * good hints can be found here (as of 2011-12-14):\n     * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302\n     * (search for \"Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>\") */\n    t = (SPI / 12) * Math.tan(mu);\n    tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2)));\n    theta = Math.atan(tantheta);\n    cosmu = Math.cos(mu);\n    tannu = Math.tan(nu);\n    cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta))));\n    if (cosphi < -1) {\n      cosphi = -1;\n    } else if (cosphi > 1) {\n      cosphi = 1;\n    }\n\n    /* Apply the result to the real area on the cube face.\n     * For the top and bottom face, we can compute phi and lam directly.\n     * For the other faces, we must use unit sphere cartesian coordinates\n     * as an intermediate step. */\n    if (this.face === FACE_ENUM.TOP) {\n      phi = Math.acos(cosphi);\n      lp.phi = HALF_PI - phi;\n      if (area.value === AREA_ENUM.AREA_0) {\n        lp.lam = theta + HALF_PI;\n      } else if (area.value === AREA_ENUM.AREA_1) {\n        lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI);\n      } else if (area.value === AREA_ENUM.AREA_2) {\n        lp.lam = theta - HALF_PI;\n      } else /* area.value == AREA_ENUM.AREA_3 */ {\n        lp.lam = theta;\n      }\n    } else if (this.face === FACE_ENUM.BOTTOM) {\n      phi = Math.acos(cosphi);\n      lp.phi = phi - HALF_PI;\n      if (area.value === AREA_ENUM.AREA_0) {\n        lp.lam = -theta + HALF_PI;\n      } else if (area.value === AREA_ENUM.AREA_1) {\n        lp.lam = -theta;\n      } else if (area.value === AREA_ENUM.AREA_2) {\n        lp.lam = -theta - HALF_PI;\n      } else /* area.value == AREA_ENUM.AREA_3 */ {\n        lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI);\n      }\n    } else {\n      /* Compute phi and lam via cartesian unit sphere coordinates. */\n      var q, r, s;\n      q = cosphi;\n      t = q * q;\n      if (t >= 1) {\n        s = 0;\n      } else {\n        s = Math.sqrt(1 - t) * Math.sin(theta);\n      }\n      t += s * s;\n      if (t >= 1) {\n        r = 0;\n      } else {\n        r = Math.sqrt(1 - t);\n      }\n      /* Rotate q,r,s into the correct area. */\n      if (area.value === AREA_ENUM.AREA_1) {\n        t = r;\n        r = -s;\n        s = t;\n      } else if (area.value === AREA_ENUM.AREA_2) {\n        r = -r;\n        s = -s;\n      } else if (area.value === AREA_ENUM.AREA_3) {\n        t = r;\n        r = s;\n        s = -t;\n      }\n      /* Rotate q,r,s into the correct cube face. */\n      if (this.face === FACE_ENUM.RIGHT) {\n        t = q;\n        q = -r;\n        r = t;\n      } else if (this.face === FACE_ENUM.BACK) {\n        q = -q;\n        r = -r;\n      } else if (this.face === FACE_ENUM.LEFT) {\n        t = q;\n        q = r;\n        r = -t;\n      }\n      /* Now compute phi and lam from the unit sphere coordinates. */\n      lp.phi = Math.acos(-s) - HALF_PI;\n      lp.lam = Math.atan2(r, q);\n      if (this.face === FACE_ENUM.RIGHT) {\n        lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI);\n      } else if (this.face === FACE_ENUM.BACK) {\n        lp.lam = qsc_shift_lon_origin(lp.lam, -SPI);\n      } else if (this.face === FACE_ENUM.LEFT) {\n        lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI);\n      }\n    }\n\n    /* Apply the shift from the sphere to the ellipsoid as described\n     * in [LK12]. */\n    if (this.es !== 0) {\n      var invert_sign;\n      var tanphi, xa;\n      invert_sign = (lp.phi < 0 ? 1 : 0);\n      tanphi = Math.tan(lp.phi);\n      xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared);\n      lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa));\n      if (invert_sign) {\n        lp.phi = -lp.phi;\n      }\n    }\n\n    lp.lam += this.long0;\n    p.x = lp.lam;\n    p.y = lp.phi;\n    return p;\n  }\n\n  /* Helper function for forward projection: compute the theta angle\n   * and determine the area number. */\n  function qsc_fwd_equat_face_theta(phi, y, x, area) {\n    var theta;\n    if (phi < EPSLN) {\n      area.value = AREA_ENUM.AREA_0;\n      theta = 0.0;\n    } else {\n      theta = Math.atan2(y, x);\n      if (Math.abs(theta) <= FORTPI) {\n        area.value = AREA_ENUM.AREA_0;\n      } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) {\n        area.value = AREA_ENUM.AREA_1;\n        theta -= HALF_PI;\n      } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) {\n        area.value = AREA_ENUM.AREA_2;\n        theta = (theta >= 0.0 ? theta - SPI : theta + SPI);\n      } else {\n        area.value = AREA_ENUM.AREA_3;\n        theta += HALF_PI;\n      }\n    }\n    return theta;\n  }\n\n  /* Helper function: shift the longitude. */\n  function qsc_shift_lon_origin(lon, offset) {\n    var slon = lon + offset;\n    if (slon < -SPI) {\n      slon += TWO_PI;\n    } else if (slon > +SPI) {\n      slon -= TWO_PI;\n    }\n    return slon;\n  }\n\n  var names$7 = ['Quadrilateralized Spherical Cube', 'Quadrilateralized_Spherical_Cube', 'qsc'];\n  var qsc = {\n    init: init$7,\n    forward: forward$6,\n    inverse: inverse$6,\n    names: names$7\n  };\n\n  // Robinson projection\n  // Based on https://github.com/OSGeo/proj.4/blob/master/src/PJ_robin.c\n  // Polynomial coeficients from http://article.gmane.org/gmane.comp.gis.proj-4.devel/6039\n\n\n  var COEFS_X = [\n    [1.0000, 2.2199e-17, -715515e-10, 3.1103e-06],\n    [0.9986, -482243e-9, -24897e-9, -13309e-10],\n    [0.9954, -83103e-8, -448605e-10, -9.86701e-7],\n    [0.9900, -135364e-8, -59661e-9, 3.6777e-06],\n    [0.9822, -167442e-8, -449547e-11, -572411e-11],\n    [0.9730, -214868e-8, -903571e-10, 1.8736e-08],\n    [0.9600, -305085e-8, -900761e-10, 1.64917e-06],\n    [0.9427, -382792e-8, -653386e-10, -26154e-10],\n    [0.9216, -467746e-8, -10457e-8, 4.81243e-06],\n    [0.8962, -536223e-8, -323831e-10, -543432e-11],\n    [0.8679, -609363e-8, -113898e-9, 3.32484e-06],\n    [0.8350, -698325e-8, -640253e-10, 9.34959e-07],\n    [0.7986, -755338e-8, -500009e-10, 9.35324e-07],\n    [0.7597, -798324e-8, -35971e-9, -227626e-11],\n    [0.7186, -851367e-8, -701149e-10, -86303e-10],\n    [0.6732, -986209e-8, -199569e-9, 1.91974e-05],\n    [0.6213, -0.010418, 8.83923e-05, 6.24051e-06],\n    [0.5722, -906601e-8, 0.000182, 6.24051e-06],\n    [0.5322, -677797e-8, 0.000275608, 6.24051e-06]\n  ];\n\n  var COEFS_Y = [\n    [-520417e-23, 0.0124, 1.21431e-18, -845284e-16],\n    [0.0620, 0.0124, -1.26793e-9, 4.22642e-10],\n    [0.1240, 0.0124, 5.07171e-09, -1.60604e-9],\n    [0.1860, 0.0123999, -1.90189e-8, 6.00152e-09],\n    [0.2480, 0.0124002, 7.10039e-08, -2.24e-8],\n    [0.3100, 0.0123992, -2.64997e-7, 8.35986e-08],\n    [0.3720, 0.0124029, 9.88983e-07, -3.11994e-7],\n    [0.4340, 0.0123893, -369093e-11, -4.35621e-7],\n    [0.4958, 0.0123198, -102252e-10, -3.45523e-7],\n    [0.5571, 0.0121916, -154081e-10, -5.82288e-7],\n    [0.6176, 0.0119938, -241424e-10, -5.25327e-7],\n    [0.6769, 0.011713, -320223e-10, -5.16405e-7],\n    [0.7346, 0.0113541, -397684e-10, -6.09052e-7],\n    [0.7903, 0.0109107, -489042e-10, -104739e-11],\n    [0.8435, 0.0103431, -64615e-9, -1.40374e-9],\n    [0.8936, 0.00969686, -64636e-9, -8547e-9],\n    [0.9394, 0.00840947, -192841e-9, -42106e-10],\n    [0.9761, 0.00616527, -256e-6, -42106e-10],\n    [1.0000, 0.00328947, -319159e-9, -42106e-10]\n  ];\n\n  var FXC = 0.8487;\n  var FYC = 1.3523;\n  var C1 = R2D / 5; // rad to 5-degree interval\n  var RC1 = 1 / C1;\n  var NODES = 18;\n\n  var poly3_val = function (coefs, x) {\n    return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3]));\n  };\n\n  var poly3_der = function (coefs, x) {\n    return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]);\n  };\n\n  function newton_rapshon(f_df, start, max_err, iters) {\n    var x = start;\n    for (; iters; --iters) {\n      var upd = f_df(x);\n      x -= upd;\n      if (Math.abs(upd) < max_err) {\n        break;\n      }\n    }\n    return x;\n  }\n\n  function init$6() {\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.long0 = this.long0 || 0;\n    this.es = 0;\n    this.title = this.title || 'Robinson';\n  }\n\n  function forward$5(ll) {\n    var lon = adjust_lon(ll.x - this.long0, this.over);\n\n    var dphi = Math.abs(ll.y);\n    var i = Math.floor(dphi * C1);\n    if (i < 0) {\n      i = 0;\n    } else if (i >= NODES) {\n      i = NODES - 1;\n    }\n    dphi = R2D * (dphi - RC1 * i);\n    var xy = {\n      x: poly3_val(COEFS_X[i], dphi) * lon,\n      y: poly3_val(COEFS_Y[i], dphi)\n    };\n    if (ll.y < 0) {\n      xy.y = -xy.y;\n    }\n\n    xy.x = xy.x * this.a * FXC + this.x0;\n    xy.y = xy.y * this.a * FYC + this.y0;\n\n    if (ll.z !== undefined) {\n      xy.z = ll.z;\n    }\n    if (ll.m !== undefined) {\n      xy.m = ll.m;\n    }\n    return xy;\n  }\n\n  function inverse$5(xy) {\n    var ll = {\n      x: (xy.x - this.x0) / (this.a * FXC),\n      y: Math.abs(xy.y - this.y0) / (this.a * FYC)\n    };\n\n    if (ll.y >= 1) { // pathologic case\n      ll.x /= COEFS_X[NODES][0];\n      ll.y = xy.y < 0 ? -HALF_PI : HALF_PI;\n    } else {\n      // find table interval\n      var i = Math.floor(ll.y * NODES);\n      if (i < 0) {\n        i = 0;\n      } else if (i >= NODES) {\n        i = NODES - 1;\n      }\n      for (;;) {\n        if (COEFS_Y[i][0] > ll.y) {\n          --i;\n        } else if (COEFS_Y[i + 1][0] <= ll.y) {\n          ++i;\n        } else {\n          break;\n        }\n      }\n      // linear interpolation in 5 degree interval\n      var coefs = COEFS_Y[i];\n      var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i + 1][0] - coefs[0]);\n      // find t so that poly3_val(coefs, t) = ll.y\n      t = newton_rapshon(function (x) {\n        return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x);\n      }, t, EPSLN, 100);\n\n      ll.x /= poly3_val(COEFS_X[i], t);\n      ll.y = (5 * i + t) * D2R$1;\n      if (xy.y < 0) {\n        ll.y = -ll.y;\n      }\n    }\n\n    ll.x = adjust_lon(ll.x + this.long0, this.over);\n\n    if (xy.z !== undefined) {\n      ll.z = xy.z;\n    }\n    if (xy.m !== undefined) {\n      ll.m = xy.m;\n    }\n    return ll;\n  }\n\n  var names$6 = ['Robinson', 'robin'];\n  var robin = {\n    init: init$6,\n    forward: forward$5,\n    inverse: inverse$5,\n    names: names$6\n  };\n\n  function init$5() {\n    this.name = 'geocent';\n  }\n\n  function forward$4(p) {\n    var point = geodeticToGeocentric(p, this.es, this.a);\n    return point;\n  }\n\n  function inverse$4(p) {\n    var point = geocentricToGeodetic(p, this.es, this.a, this.b);\n    return point;\n  }\n\n  var names$5 = ['Geocentric', 'geocentric', 'geocent', 'Geocent'];\n  var geocent = {\n    init: init$5,\n    forward: forward$4,\n    inverse: inverse$4,\n    names: names$5\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} mode\n   * @property {number} sinph0\n   * @property {number} cosph0\n   * @property {number} pn1\n   * @property {number} h\n   * @property {number} rp\n   * @property {number} p\n   * @property {number} h1\n   * @property {number} pfact\n   * @property {number} es\n   * @property {number} tilt\n   * @property {number} azi\n   * @property {number} cg\n   * @property {number} sg\n   * @property {number} cw\n   * @property {number} sw\n   */\n\n  var mode = {\n    N_POLE: 0,\n    S_POLE: 1,\n    EQUIT: 2,\n    OBLIQ: 3\n  };\n\n  var params = {\n    h: { def: 100000, num: true }, // default is Karman line, no default in PROJ.7\n    azi: { def: 0, num: true, degrees: true }, // default is North\n    tilt: { def: 0, num: true, degrees: true }, // default is Nadir\n    long0: { def: 0, num: true }, // default is Greenwich, conversion to rad is automatic\n    lat0: { def: 0, num: true } // default is Equator, conversion to rad is automatic\n  };\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$4() {\n    Object.keys(params).forEach(function (p) {\n      if (typeof this[p] === 'undefined') {\n        this[p] = params[p].def;\n      } else if (params[p].num && isNaN(this[p])) {\n        throw new Error('Invalid parameter value, must be numeric ' + p + ' = ' + this[p]);\n      } else if (params[p].num) {\n        this[p] = parseFloat(this[p]);\n      }\n      if (params[p].degrees) {\n        this[p] = this[p] * D2R$1;\n      }\n    }.bind(this));\n\n    if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) {\n      this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE;\n    } else if (Math.abs(this.lat0) < EPSLN) {\n      this.mode = mode.EQUIT;\n    } else {\n      this.mode = mode.OBLIQ;\n      this.sinph0 = Math.sin(this.lat0);\n      this.cosph0 = Math.cos(this.lat0);\n    }\n\n    this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius\n\n    if (this.pn1 <= 0 || this.pn1 > 1e10) {\n      throw new Error('Invalid height');\n    }\n\n    this.p = 1 + this.pn1;\n    this.rp = 1 / this.p;\n    this.h1 = 1 / this.pn1;\n    this.pfact = (this.p + 1) * this.h1;\n    this.es = 0;\n\n    var omega = this.tilt;\n    var gamma = this.azi;\n    this.cg = Math.cos(gamma);\n    this.sg = Math.sin(gamma);\n    this.cw = Math.cos(omega);\n    this.sw = Math.sin(omega);\n  }\n\n  function forward$3(p) {\n    p.x -= this.long0;\n    var sinphi = Math.sin(p.y);\n    var cosphi = Math.cos(p.y);\n    var coslam = Math.cos(p.x);\n    var x, y;\n    switch (this.mode) {\n      case mode.OBLIQ:\n        y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam;\n        break;\n      case mode.EQUIT:\n        y = cosphi * coslam;\n        break;\n      case mode.S_POLE:\n        y = -sinphi;\n        break;\n      case mode.N_POLE:\n        y = sinphi;\n        break;\n    }\n    y = this.pn1 / (this.p - y);\n    x = y * cosphi * Math.sin(p.x);\n\n    switch (this.mode) {\n      case mode.OBLIQ:\n        y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam;\n        break;\n      case mode.EQUIT:\n        y *= sinphi;\n        break;\n      case mode.N_POLE:\n        y *= -(cosphi * coslam);\n        break;\n      case mode.S_POLE:\n        y *= cosphi * coslam;\n        break;\n    }\n\n    // Tilt\n    var yt, ba;\n    yt = y * this.cg + x * this.sg;\n    ba = 1 / (yt * this.sw * this.h1 + this.cw);\n    x = (x * this.cg - y * this.sg) * this.cw * ba;\n    y = yt * ba;\n\n    p.x = x * this.a;\n    p.y = y * this.a;\n    return p;\n  }\n\n  function inverse$3(p) {\n    p.x /= this.a;\n    p.y /= this.a;\n    var r = { x: p.x, y: p.y };\n\n    // Un-Tilt\n    var bm, bq, yt;\n    yt = 1 / (this.pn1 - p.y * this.sw);\n    bm = this.pn1 * p.x * yt;\n    bq = this.pn1 * p.y * this.cw * yt;\n    p.x = bm * this.cg + bq * this.sg;\n    p.y = bq * this.cg - bm * this.sg;\n\n    var rh = hypot(p.x, p.y);\n    if (Math.abs(rh) < EPSLN) {\n      r.x = 0;\n      r.y = p.y;\n    } else {\n      var cosz, sinz;\n      sinz = 1 - rh * rh * this.pfact;\n      sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1);\n      cosz = Math.sqrt(1 - sinz * sinz);\n      switch (this.mode) {\n        case mode.OBLIQ:\n          r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh);\n          p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh;\n          p.x *= sinz * this.cosph0;\n          break;\n        case mode.EQUIT:\n          r.y = Math.asin(p.y * sinz / rh);\n          p.y = cosz * rh;\n          p.x *= sinz;\n          break;\n        case mode.N_POLE:\n          r.y = Math.asin(cosz);\n          p.y = -p.y;\n          break;\n        case mode.S_POLE:\n          r.y = -Math.asin(cosz);\n          break;\n      }\n      r.x = Math.atan2(p.x, p.y);\n    }\n\n    p.x = r.x + this.long0;\n    p.y = r.y;\n    return p;\n  }\n\n  var names$4 = ['Tilted_Perspective', 'tpers'];\n  var tpers = {\n    init: init$4,\n    forward: forward$3,\n    inverse: inverse$3,\n    names: names$4\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {1 | 0} flip_axis\n   * @property {number} h\n   * @property {number} radius_g_1\n   * @property {number} radius_g\n   * @property {number} radius_p\n   * @property {number} radius_p2\n   * @property {number} radius_p_inv2\n   * @property {'ellipse'|'sphere'} shape\n   * @property {number} C\n   * @property {string} sweep\n   * @property {number} es\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$3() {\n    this.flip_axis = (this.sweep === 'x' ? 1 : 0);\n    this.h = Number(this.h);\n    this.radius_g_1 = this.h / this.a;\n\n    if (this.radius_g_1 <= 0 || this.radius_g_1 > 1e10) {\n      throw new Error();\n    }\n\n    this.radius_g = 1.0 + this.radius_g_1;\n    this.C = this.radius_g * this.radius_g - 1.0;\n\n    if (this.es !== 0.0) {\n      var one_es = 1.0 - this.es;\n      var rone_es = 1 / one_es;\n\n      this.radius_p = Math.sqrt(one_es);\n      this.radius_p2 = one_es;\n      this.radius_p_inv2 = rone_es;\n\n      this.shape = 'ellipse'; // Use as a condition in the forward and inverse functions.\n    } else {\n      this.radius_p = 1.0;\n      this.radius_p2 = 1.0;\n      this.radius_p_inv2 = 1.0;\n\n      this.shape = 'sphere'; // Use as a condition in the forward and inverse functions.\n    }\n\n    if (!this.title) {\n      this.title = 'Geostationary Satellite View';\n    }\n  }\n\n  function forward$2(p) {\n    var lon = p.x;\n    var lat = p.y;\n    var tmp, v_x, v_y, v_z;\n    lon = lon - this.long0;\n\n    if (this.shape === 'ellipse') {\n      lat = Math.atan(this.radius_p2 * Math.tan(lat));\n      var r = this.radius_p / hypot(this.radius_p * Math.cos(lat), Math.sin(lat));\n\n      v_x = r * Math.cos(lon) * Math.cos(lat);\n      v_y = r * Math.sin(lon) * Math.cos(lat);\n      v_z = r * Math.sin(lat);\n\n      if (((this.radius_g - v_x) * v_x - v_y * v_y - v_z * v_z * this.radius_p_inv2) < 0.0) {\n        p.x = Number.NaN;\n        p.y = Number.NaN;\n        return p;\n      }\n\n      tmp = this.radius_g - v_x;\n      if (this.flip_axis) {\n        p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n        p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n      } else {\n        p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n        p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n      }\n    } else if (this.shape === 'sphere') {\n      tmp = Math.cos(lat);\n      v_x = Math.cos(lon) * tmp;\n      v_y = Math.sin(lon) * tmp;\n      v_z = Math.sin(lat);\n      tmp = this.radius_g - v_x;\n\n      if (this.flip_axis) {\n        p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp));\n        p.y = this.radius_g_1 * Math.atan(v_z / tmp);\n      } else {\n        p.x = this.radius_g_1 * Math.atan(v_y / tmp);\n        p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp));\n      }\n    }\n    p.x = p.x * this.a;\n    p.y = p.y * this.a;\n    return p;\n  }\n\n  function inverse$2(p) {\n    var v_x = -1;\n    var v_y = 0.0;\n    var v_z = 0.0;\n    var a, b, det, k;\n\n    p.x = p.x / this.a;\n    p.y = p.y / this.a;\n\n    if (this.shape === 'ellipse') {\n      if (this.flip_axis) {\n        v_z = Math.tan(p.y / this.radius_g_1);\n        v_y = Math.tan(p.x / this.radius_g_1) * hypot(1.0, v_z);\n      } else {\n        v_y = Math.tan(p.x / this.radius_g_1);\n        v_z = Math.tan(p.y / this.radius_g_1) * hypot(1.0, v_y);\n      }\n\n      var v_zp = v_z / this.radius_p;\n      a = v_y * v_y + v_zp * v_zp + v_x * v_x;\n      b = 2 * this.radius_g * v_x;\n      det = (b * b) - 4 * a * this.C;\n\n      if (det < 0.0) {\n        p.x = Number.NaN;\n        p.y = Number.NaN;\n        return p;\n      }\n\n      k = (-b - Math.sqrt(det)) / (2.0 * a);\n      v_x = this.radius_g + k * v_x;\n      v_y *= k;\n      v_z *= k;\n\n      p.x = Math.atan2(v_y, v_x);\n      p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n      p.y = Math.atan(this.radius_p_inv2 * Math.tan(p.y));\n    } else if (this.shape === 'sphere') {\n      if (this.flip_axis) {\n        v_z = Math.tan(p.y / this.radius_g_1);\n        v_y = Math.tan(p.x / this.radius_g_1) * Math.sqrt(1.0 + v_z * v_z);\n      } else {\n        v_y = Math.tan(p.x / this.radius_g_1);\n        v_z = Math.tan(p.y / this.radius_g_1) * Math.sqrt(1.0 + v_y * v_y);\n      }\n\n      a = v_y * v_y + v_z * v_z + v_x * v_x;\n      b = 2 * this.radius_g * v_x;\n      det = (b * b) - 4 * a * this.C;\n      if (det < 0.0) {\n        p.x = Number.NaN;\n        p.y = Number.NaN;\n        return p;\n      }\n\n      k = (-b - Math.sqrt(det)) / (2.0 * a);\n      v_x = this.radius_g + k * v_x;\n      v_y *= k;\n      v_z *= k;\n\n      p.x = Math.atan2(v_y, v_x);\n      p.y = Math.atan(v_z * Math.cos(p.x) / v_x);\n    }\n    p.x = p.x + this.long0;\n    return p;\n  }\n\n  var names$3 = ['Geostationary Satellite View', 'Geostationary_Satellite', 'geos'];\n  var geos = {\n    init: init$3,\n    forward: forward$2,\n    inverse: inverse$2,\n    names: names$3\n  };\n\n  /**\n   * Copyright 2018 Bernie Jenny, Monash University, Melbourne, Australia.\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\");\n   * you may not use this file except in compliance with the License.\n   * You may obtain a copy of the License at\n   *\n   * http://www.apache.org/licenses/LICENSE-2.0\n   *\n   * Unless required by applicable law or agreed to in writing, software\n   * distributed under the License is distributed on an \"AS IS\" BASIS,\n   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   * See the License for the specific language governing permissions and\n   * limitations under the License.\n   *\n   * Equal Earth is a projection inspired by the Robinson projection, but unlike\n   * the Robinson projection retains the relative size of areas. The projection\n   * was designed in 2018 by Bojan Savric, Tom Patterson and Bernhard Jenny.\n   *\n   * Publication:\n   * Bojan Savric, Tom Patterson & Bernhard Jenny (2018). The Equal Earth map\n   * projection, International Journal of Geographical Information Science,\n   * DOI: 10.1080/13658816.2018.1504949\n   *\n   * Code released August 2018\n   * Ported to JavaScript and adapted for mapshaper-proj by Matthew Bloch August 2018\n   * Modified for proj4js by Andreas Hocevar by Andreas Hocevar March 2024\n   */\n\n\n  var A1 = 1.340264,\n    A2 = -0.081106,\n    A3 = 0.000893,\n    A4 = 0.003796,\n    M = Math.sqrt(3) / 2.0;\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} es\n   * @property {number} e\n   * @property {Array<number>} apa\n   * @property {number} qp\n   * @property {number} rqda\n   */\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$2() {\n    this.long0 = this.long0 !== undefined ? this.long0 : 0;\n    this.x0 = this.x0 !== undefined ? this.x0 : 0;\n    this.y0 = this.y0 !== undefined ? this.y0 : 0;\n    if (this.es !== 0) {\n      this.apa = authset(this.es);\n      this.qp = qsfnz(this.e, 1);\n      this.rqda = Math.sqrt(0.5 * this.qp);\n    }\n  }\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function forward$1(p) {\n    var lam = adjust_lon(p.x - this.long0, this.over);\n    var phi = p.y;\n    var sinphi = Math.sin(phi);\n    if (this.es !== 0) {\n      sinphi = qsfnz(this.e, sinphi) / this.qp;\n    }\n    var paramLat = Math.asin(M * sinphi),\n      paramLatSq = paramLat * paramLat,\n      paramLatPow6 = paramLatSq * paramLatSq * paramLatSq;\n    p.x = lam * Math.cos(paramLat)\n      / (M * (A1 + 3 * A2 * paramLatSq + paramLatPow6 * (7 * A3 + 9 * A4 * paramLatSq)));\n    p.y = paramLat * (A1 + A2 * paramLatSq + paramLatPow6 * (A3 + A4 * paramLatSq));\n\n    if (this.es !== 0) {\n      p.x *= this.rqda;\n      p.y *= this.rqda;\n    }\n\n    p.x = this.a * p.x + this.x0;\n    p.y = this.a * p.y + this.y0;\n    return p;\n  }\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function inverse$1(p) {\n    p.x = (p.x - this.x0) / this.a;\n    p.y = (p.y - this.y0) / this.a;\n\n    if (this.es !== 0) {\n      p.x /= this.rqda;\n      p.y /= this.rqda;\n    }\n\n    var EPS = 1e-9,\n      NITER = 12,\n      paramLat = p.y,\n      paramLatSq, paramLatPow6, fy, fpy, dlat, i;\n\n    for (i = 0; i < NITER; ++i) {\n      paramLatSq = paramLat * paramLat;\n      paramLatPow6 = paramLatSq * paramLatSq * paramLatSq;\n      fy = paramLat * (A1 + A2 * paramLatSq + paramLatPow6 * (A3 + A4 * paramLatSq)) - p.y;\n      fpy = A1 + 3 * A2 * paramLatSq + paramLatPow6 * (7 * A3 + 9 * A4 * paramLatSq);\n      paramLat -= dlat = fy / fpy;\n      if (Math.abs(dlat) < EPS) {\n        break;\n      }\n    }\n    paramLatSq = paramLat * paramLat;\n    paramLatPow6 = paramLatSq * paramLatSq * paramLatSq;\n    p.x = M * p.x * (A1 + 3 * A2 * paramLatSq + paramLatPow6 * (7 * A3 + 9 * A4 * paramLatSq))\n      / Math.cos(paramLat);\n    p.y = Math.asin(Math.sin(paramLat) / M);\n\n    if (this.es !== 0) {\n      p.y = authlat(p.y, this.apa);\n    }\n\n    p.x = adjust_lon(p.x + this.long0, this.over);\n    return p;\n  }\n\n  var names$2 = ['eqearth', 'Equal Earth', 'Equal_Earth'];\n  var eqearth = {\n    init: init$2,\n    forward: forward$1,\n    inverse: inverse$1,\n    names: names$2\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} phi1\n   * @property {number} cphi1\n   * @property {number} es\n   * @property {Array<number>} en\n   * @property {number} m1\n   * @property {number} am1\n   */\n\n  var EPS10 = 1e-10;\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init$1() {\n    var c;\n\n    this.phi1 = this.lat1;\n    if (Math.abs(this.phi1) < EPS10) {\n      throw new Error();\n    }\n    if (this.es) {\n      this.en = pj_enfn(this.es);\n      this.m1 = pj_mlfn(this.phi1, this.am1 = Math.sin(this.phi1),\n        c = Math.cos(this.phi1), this.en);\n      this.am1 = c / (Math.sqrt(1 - this.es * this.am1 * this.am1) * this.am1);\n      this.inverse = e_inv;\n      this.forward = e_fwd;\n    } else {\n      if (Math.abs(this.phi1) + EPS10 >= HALF_PI) {\n        this.cphi1 = 0;\n      } else {\n        this.cphi1 = 1 / Math.tan(this.phi1);\n      }\n      this.inverse = s_inv;\n      this.forward = s_fwd;\n    }\n  }\n\n  function e_fwd(p) {\n    var lam = adjust_lon(p.x - (this.long0 || 0), this.over);\n    var phi = p.y;\n    var rh, E, c;\n    rh = this.am1 + this.m1 - pj_mlfn(phi, E = Math.sin(phi), c = Math.cos(phi), this.en);\n    E = c * lam / (rh * Math.sqrt(1 - this.es * E * E));\n    p.x = rh * Math.sin(E);\n    p.y = this.am1 - rh * Math.cos(E);\n\n    p.x = this.a * p.x + (this.x0 || 0);\n    p.y = this.a * p.y + (this.y0 || 0);\n    return p;\n  }\n\n  function e_inv(p) {\n    p.x = (p.x - (this.x0 || 0)) / this.a;\n    p.y = (p.y - (this.y0 || 0)) / this.a;\n\n    var s, rh, lam, phi;\n    rh = hypot(p.x, p.y = this.am1 - p.y);\n    phi = pj_inv_mlfn(this.am1 + this.m1 - rh, this.es, this.en);\n    if ((s = Math.abs(phi)) < HALF_PI) {\n      s = Math.sin(phi);\n      lam = rh * Math.atan2(p.x, p.y) * Math.sqrt(1 - this.es * s * s) / Math.cos(phi);\n    } else if (Math.abs(s - HALF_PI) <= EPS10) {\n      lam = 0;\n    } else {\n      throw new Error();\n    }\n    p.x = adjust_lon(lam + (this.long0 || 0), this.over);\n    p.y = adjust_lat(phi);\n    return p;\n  }\n\n  function s_fwd(p) {\n    var lam = adjust_lon(p.x - (this.long0 || 0), this.over);\n    var phi = p.y;\n    var E, rh;\n    rh = this.cphi1 + this.phi1 - phi;\n    if (Math.abs(rh) > EPS10) {\n      p.x = rh * Math.sin(E = lam * Math.cos(phi) / rh);\n      p.y = this.cphi1 - rh * Math.cos(E);\n    } else {\n      p.x = p.y = 0;\n    }\n\n    p.x = this.a * p.x + (this.x0 || 0);\n    p.y = this.a * p.y + (this.y0 || 0);\n    return p;\n  }\n\n  function s_inv(p) {\n    p.x = (p.x - (this.x0 || 0)) / this.a;\n    p.y = (p.y - (this.y0 || 0)) / this.a;\n\n    var lam, phi;\n    var rh = hypot(p.x, p.y = this.cphi1 - p.y);\n    phi = this.cphi1 + this.phi1 - rh;\n    if (Math.abs(phi) > HALF_PI) {\n      throw new Error();\n    }\n    if (Math.abs(Math.abs(phi) - HALF_PI) <= EPS10) {\n      lam = 0;\n    } else {\n      lam = rh * Math.atan2(p.x, p.y) / Math.cos(phi);\n    }\n    p.x = adjust_lon(lam + (this.long0 || 0), this.over);\n    p.y = adjust_lat(phi);\n    return p;\n  }\n\n  var names$1 = ['bonne', 'Bonne (Werner lat_1=90)'];\n  var bonne = {\n    init: init$1,\n    names: names$1\n  };\n\n  /**\n      Original projection implementation:\n          https://github.com/OSGeo/PROJ/blob/46c47e9adf6376ae06afabe5d24a0016a05ced82/src/projections/ob_tran.cpp\n\n      Documentation:\n          https://proj.org/operations/projections/ob_tran.html\n\n      References/Formulas:\n          https://pubs.usgs.gov/pp/1395/report.pdf\n\n      Examples:\n          +proj=ob_tran +o_proj=moll +o_lat_p=45 +o_lon_p=-90\n          +proj=ob_tran +o_proj=moll +o_lat_p=45 +o_lon_p=-90 +lon_0=60\n          +proj=ob_tran +o_proj=moll +o_lat_p=45 +o_lon_p=-90 +lon_0=-90\n  */\n\n  const projectionType = {\n    OBLIQUE: {\n      forward: forwardOblique,\n      inverse: inverseOblique\n    },\n    TRANSVERSE: {\n      forward: forwardTransverse,\n      inverse: inverseTransverse\n    }\n  };\n\n  /**\n   * @typedef {Object} LocalThis\n   * @property {number} lamp\n   * @property {number} cphip\n   * @property {number} sphip\n   * @property {Object} projectionType\n   * @property {string | undefined} o_proj\n   * @property {string | undefined} o_lon_p\n   * @property {string | undefined} o_lat_p\n   * @property {string | undefined} o_alpha\n   * @property {string | undefined} o_lon_c\n   * @property {string | undefined} o_lat_c\n   * @property {string | undefined} o_lon_1\n   * @property {string | undefined} o_lat_1\n   * @property {string | undefined} o_lon_2\n   * @property {string | undefined} o_lat_2\n   * @property {number | undefined} oLongP\n   * @property {number | undefined} oLatP\n   * @property {number | undefined} oAlpha\n   * @property {number | undefined} oLongC\n   * @property {number | undefined} oLatC\n   * @property {number | undefined} oLong1\n   * @property {number | undefined} oLat1\n   * @property {number | undefined} oLong2\n   * @property {number | undefined} oLat2\n   * @property {boolean} isIdentity\n   * @property {import('..').Converter} obliqueProjection\n   *\n   */\n\n  /**\n   *    Parameters can be from the following sets:\n   *       New pole --> o_lat_p, o_lon_p\n   *       Rotate about point --> o_alpha, o_lon_c, o_lat_c\n   *       New equator points --> lon_1, lat_1, lon_2, lat_2\n   *\n   *    Per the original source code, the parameter sets are\n   *    checked in the order of the object below.\n   */\n  const paramSets = {\n    ROTATE: {\n      o_alpha: 'oAlpha',\n      o_lon_c: 'oLongC',\n      o_lat_c: 'oLatC'\n    },\n    NEW_POLE: {\n      o_lat_p: 'oLatP',\n      o_lon_p: 'oLongP'\n    },\n    NEW_EQUATOR: {\n      o_lon_1: 'oLong1',\n      o_lat_1: 'oLat1',\n      o_lon_2: 'oLong2',\n      o_lat_2: 'oLat2'\n    }\n  };\n\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function init() {\n    this.x0 = this.x0 || 0;\n    this.y0 = this.y0 || 0;\n    this.long0 = this.long0 || 0;\n    this.title = this.title || 'General Oblique Transformation';\n    this.isIdentity = names$y.includes(this.o_proj);\n\n    /** Verify required parameters exist */\n    if (!this.o_proj) {\n      throw new Error('Missing parameter: o_proj');\n    }\n\n    if (this.o_proj === `ob_tran`) {\n      throw new Error('Invalid value for o_proj: ' + this.o_proj);\n    }\n\n    const newProjStr = this.projStr.replace('+proj=ob_tran', '').replace('+o_proj=', '+proj=').trim();\n\n    /** @type {import('../defs.js').ProjectionDefinition} */\n    const oProj = Projection(newProjStr);\n    if (!oProj) {\n      throw new Error('Invalid parameter: o_proj. Unknown projection ' + this.o_proj);\n    }\n    oProj.long0 = 0; // we handle long0 before/after forward/inverse\n    this.obliqueProjection = oProj;\n\n    let matchedSet;\n    const paramSetsKeys = Object.keys(paramSets);\n\n    /**\n     * parse strings, convert to radians, throw on NaN\n     * @param {string} name\n     * @returns {number | undefined}\n     */\n    const parseParam = (name) => {\n      if (typeof this[name] === `undefined`) {\n        return undefined;\n      }\n      const val = parseFloat(this[name]) * D2R$1;\n      if (isNaN(val)) {\n        throw new Error('Invalid value for ' + name + ': ' + this[name]);\n      }\n      return val;\n    };\n\n    for (let i = 0; i < paramSetsKeys.length; i++) {\n      const setKey = paramSetsKeys[i];\n      const set = paramSets[setKey];\n      const params = Object.entries(set);\n      const setHasParams = params.some(\n        ([p]) => typeof this[p] !== 'undefined'\n      );\n      if (!setHasParams) {\n        continue;\n      }\n      matchedSet = set;\n      for (let ii = 0; ii < params.length; ii++) {\n        const [inputParam, param] = params[ii];\n        const val = parseParam(inputParam);\n        if (typeof val === 'undefined') {\n          throw new Error('Missing parameter: ' + inputParam + '.');\n        }\n        this[param] = val;\n      }\n      break;\n    }\n\n    if (!matchedSet) {\n      throw new Error('No valid parameters provided for ob_tran projection.');\n    }\n\n    const { lamp, phip } = createRotation(this, matchedSet);\n    this.lamp = lamp;\n\n    if (Math.abs(phip) > EPSLN) {\n      this.cphip = Math.cos(phip);\n      this.sphip = Math.sin(phip);\n      this.projectionType = projectionType.OBLIQUE;\n    } else {\n      this.projectionType = projectionType.TRANSVERSE;\n    }\n  }\n\n  // ob_tran forward equations--mapping (lat,long) to (x,y)\n  // transverse (90 degrees from normal orientation) - forwardTransverse\n  // or oblique (arbitrary angle) used based on parameters - forwardOblique\n  // -----------------------------------------------------------------\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function forward(p) {\n    return this.projectionType.forward(this, p);\n  }\n\n  // inverse equations--mapping (x,y) to (lat,long)\n  // transverse: inverseTransverse\n  // oblique: inverseOblique\n  // -----------------------------------------------------------------\n  /** @this {import('../defs.js').ProjectionDefinition & LocalThis} */\n  function inverse(p) {\n    return this.projectionType.inverse(this, p);\n  }\n\n  /**\n   * @param {import('../defs.js').ProjectionDefinition & LocalThis} params - Initialized projection definition\n   * @param {Object} how - Transformation method\n   * @returns {{phip: number, lamp: number}}\n   */\n  function createRotation(params, how) {\n    let phip, lamp;\n    if (how === paramSets.ROTATE) {\n      let lamc = params.oLongC;\n      let phic = params.oLatC;\n      let alpha = params.oAlpha;\n      if (Math.abs(Math.abs(phic) - HALF_PI) <= EPSLN) {\n        throw new Error('Invalid value for o_lat_c: ' + params.o_lat_c + ' should be < 90°');\n      }\n      lamp = lamc + Math.atan2(-1 * Math.cos(alpha), -1 * Math.sin(alpha) * Math.sin(phic));\n      phip = Math.asin(Math.cos(phic) * Math.sin(alpha));\n    } else if (how === paramSets.NEW_POLE) {\n      lamp = params.oLongP;\n      phip = params.oLatP;\n    } else {\n      let lam1 = params.oLong1;\n      let phi1 = params.oLat1;\n      let lam2 = params.oLong2;\n      let phi2 = params.oLat2;\n      let con = Math.abs(phi1);\n\n      if (Math.abs(phi1) > HALF_PI - EPSLN) {\n        throw new Error('Invalid value for o_lat_1: ' + params.o_lat_1 + ' should be < 90°');\n      }\n\n      if (Math.abs(phi2) > HALF_PI - EPSLN) {\n        throw new Error('Invalid value for o_lat_2: ' + params.o_lat_2 + ' should be < 90°');\n      }\n\n      if (Math.abs(phi1 - phi2) < EPSLN) {\n        throw new Error('Invalid value for o_lat_1 and o_lat_2: o_lat_1 should be different from o_lat_2');\n      }\n      if (con < EPSLN) {\n        throw new Error('Invalid value for o_lat_1: o_lat_1 should be different from zero');\n      }\n\n      lamp = Math.atan2(\n        (Math.cos(phi1) * Math.sin(phi2) * Math.cos(lam1))\n        - (Math.sin(phi1) * Math.cos(phi2) * Math.cos(lam2)),\n        (Math.sin(phi1) * Math.cos(phi2) * Math.sin(lam2))\n        - (Math.cos(phi1) * Math.sin(phi2) * Math.sin(lam1))\n      );\n\n      phip = Math.atan(-1 * Math.cos(lamp - lam1) / Math.tan(phi1));\n    }\n\n    return { lamp, phip };\n  }\n\n  /**\n   * Forward (lng, lat) to (x, y) for oblique case\n   * @param {import('../defs.js').ProjectionDefinition & LocalThis} self\n   * @param {{x: number, y: number}} lp - lambda, phi\n   */\n  function forwardOblique(self, lp) {\n    let { x: lam, y: phi } = lp;\n    lam = adjust_lon(lam - self.long0, self.over);\n    const coslam = Math.cos(lam);\n    const sinphi = Math.sin(phi);\n    const cosphi = Math.cos(phi);\n\n    lp.x = adjust_lon(\n      Math.atan2(\n        cosphi * Math.sin(lam),\n        (self.sphip * cosphi * coslam) + (self.cphip * sinphi)\n      ) + self.lamp\n    );\n    lp.y = Math.asin(\n      (self.sphip * sinphi) - (self.cphip * cosphi * coslam)\n    );\n\n    const result = self.obliqueProjection.forward(lp);\n    if (self.isIdentity) {\n      result.x *= R2D;\n      result.y *= R2D;\n    }\n    return result;\n  }\n\n  /**\n   * Forward (lng, lat) to (x, y) for transverse case\n   * @param {import('../defs.js').ProjectionDefinition & LocalThis} self\n   * @param {{x: number, y: number}} lp - lambda, phi\n   */\n  function forwardTransverse(self, lp) {\n    let { x: lam, y: phi } = lp;\n    lam = adjust_lon(lam - self.long0, self.over);\n    const cosphi = Math.cos(phi);\n    const coslam = Math.cos(lam);\n    lp.x = adjust_lon(\n      Math.atan2(\n        cosphi * Math.sin(lam),\n        Math.sin(phi)\n      ) + self.lamp\n    );\n    lp.y = Math.asin(-1 * cosphi * coslam);\n\n    const result = self.obliqueProjection.forward(lp);\n\n    if (self.isIdentity) {\n      result.x *= R2D;\n      result.y *= R2D;\n    }\n    return result;\n  }\n\n  /**\n   * Inverse (x, y) to (lng, lat) for oblique case\n   * @param {import('../defs.js').ProjectionDefinition & LocalThis} self\n   * @param {{x: number, y: number}} lp - lambda, phi\n   */\n  function inverseOblique(self, lp) {\n    if (self.isIdentity) {\n      lp.x *= D2R$1;\n      lp.y *= D2R$1;\n    }\n\n    const innerLp = self.obliqueProjection.inverse(lp);\n    let { x: lam, y: phi } = innerLp;\n\n    if (lam < Number.MAX_VALUE) {\n      lam -= self.lamp;\n      const coslam = Math.cos(lam);\n      const sinphi = Math.sin(phi);\n      const cosphi = Math.cos(phi);\n      lp.x = Math.atan2(\n        cosphi * Math.sin(lam),\n        (self.sphip * cosphi * coslam) - (self.cphip * sinphi)\n      );\n      lp.y = Math.asin(\n        (self.sphip * sinphi) + (self.cphip * cosphi * coslam)\n      );\n    }\n\n    lp.x = adjust_lon(lp.x + self.long0);\n    return lp;\n  }\n\n  /**\n   * Inverse (x, y) to (lng, lat) for transverse case\n   * @param {import('../defs.js').ProjectionDefinition & LocalThis} self\n   * @param {{x: number, y: number}} lp - lambda, phi\n   */\n  function inverseTransverse(self, lp) {\n    if (self.isIdentity) {\n      lp.x *= D2R$1;\n      lp.y *= D2R$1;\n    }\n\n    const innerLp = self.obliqueProjection.inverse(lp);\n    let { x: lam, y: phi } = innerLp;\n\n    if (lam < Number.MAX_VALUE) {\n      const cosphi = Math.cos(phi);\n      lam -= self.lamp;\n      lp.x = Math.atan2(\n        cosphi * Math.sin(lam),\n        -1 * Math.sin(phi)\n      );\n      lp.y = Math.asin(\n        cosphi * Math.cos(lam)\n      );\n    }\n\n    lp.x = adjust_lon(lp.x + self.long0);\n    return lp;\n  }\n\n  var names = ['General Oblique Transformation', 'General_Oblique_Transformation', 'ob_tran'];\n  var ob_tran = {\n    init: init,\n    forward: forward,\n    inverse: inverse,\n    names: names\n  };\n\n  function includedProjections (proj4) {\n    proj4.Proj.projections.add(tmerc);\n    proj4.Proj.projections.add(etmerc);\n    proj4.Proj.projections.add(utm);\n    proj4.Proj.projections.add(sterea);\n    proj4.Proj.projections.add(stere);\n    proj4.Proj.projections.add(somerc);\n    proj4.Proj.projections.add(omerc);\n    proj4.Proj.projections.add(lcc);\n    proj4.Proj.projections.add(krovak);\n    proj4.Proj.projections.add(cass);\n    proj4.Proj.projections.add(laea);\n    proj4.Proj.projections.add(aea);\n    proj4.Proj.projections.add(gnom);\n    proj4.Proj.projections.add(cea);\n    proj4.Proj.projections.add(eqc);\n    proj4.Proj.projections.add(poly);\n    proj4.Proj.projections.add(nzmg);\n    proj4.Proj.projections.add(mill);\n    proj4.Proj.projections.add(sinu);\n    proj4.Proj.projections.add(eck6);\n    proj4.Proj.projections.add(moll);\n    proj4.Proj.projections.add(eqdc);\n    proj4.Proj.projections.add(vandg);\n    proj4.Proj.projections.add(aeqd);\n    proj4.Proj.projections.add(ortho);\n    proj4.Proj.projections.add(qsc);\n    proj4.Proj.projections.add(robin);\n    proj4.Proj.projections.add(geocent);\n    proj4.Proj.projections.add(tpers);\n    proj4.Proj.projections.add(geos);\n    proj4.Proj.projections.add(eqearth);\n    proj4.Proj.projections.add(bonne);\n    proj4.Proj.projections.add(ob_tran);\n  }\n\n  /**\n   * @typedef {Object} Mgrs\n   * @property {(lonlat: [number, number]) => string} forward\n   * @property {(mgrsString: string) => [number, number, number, number]} inverse\n   * @property {(mgrsString: string) => [number, number]} toPoint\n   */\n\n  /**\n   * @typedef {import('./defs').ProjectionDefinition} ProjectionDefinition\n   * @typedef {import('./core').TemplateCoordinates} TemplateCoordinates\n   * @typedef {import('./core').InterfaceCoordinates} InterfaceCoordinates\n   * @typedef {import('./core').Converter} Converter\n   * @typedef {import('./Proj').DatumDefinition} DatumDefinition\n   */\n\n  /**\n   * @template {import('./core').TemplateCoordinates} T\n   * @type {core<T> & {defaultDatum: string, Proj: typeof Proj, WGS84: Proj, Point: typeof Point, toPoint: typeof common, defs: typeof defs, nadgrid: typeof nadgrid, transform: typeof transform, mgrs: Mgrs, version: string}}\n   */\n  const proj4 = Object.assign(proj4$1, {\n    defaultDatum: 'WGS84',\n    Proj: Projection,\n    WGS84: new Projection('WGS84'),\n    Point,\n    toPoint: common,\n    defs,\n    nadgrid,\n    transform,\n    mgrs,\n    version: '2.22.0'\n  });\n  includedProjections(proj4);\n\n  return proj4;\n\n}));\n"]}