{"version":3,"file":"static/chunks/16.ddf7df5b9c00cdc9.js","mappings":"mBAEA,cACA,MACA,iCAEA,sBACA,oEACA,kCAEA,oBACA,yBAGA,6EACA,mBAEA,2DACA,CChBA,OACA,uBACA,uBACA,wBACA,qBACA,0BACA,qBACA,qBACA,OATA,UAUA,OAVA,UAWA,wBACA,wBACA,wBACA,6BACA,UACA,uBACA,EAkBA,mBAA+C,EAC/C,OAAiB,gBASjB,MARA,kBACA,YAEA,QACA,gBAEA,mBACA,aACA,CACA,CAmBA,mBAAoD,EACpD,MACA,uCAEA,qBACA,4CAEA,cACA,2DAEA,IAAO,EAAQ,QAAqB,EAAQ,MAC5C,IAD4C,EAC5C,0CAMA,SAJA,CACA,aACA,aACA,EACA,IACA,CA4IA,cAEA,OADA,MACA,WACA,CAqBA,SAAS,EAAQ,GACjB,OADiB,MACjB,+BACA,CC1OA,MAbA,iBAAwC,EACxC,MAAqB,EAAQ,GAC7B,EAAqB,CADQ,CACA,GAK7B,GAL6B,IAK7B,aAJa,EAAgB,WAI7B,wBAHa,EAAgB,WAG7B,GAH6B,GAG7B,SAFa,EAAgB,OAE7B,OAF6B,CAE7B,CADa,EAAgB,OAE7B,OAAS,SDgLT,MChLwB,UDgLxB,EACA,WACA,MACA,mCAEA,UACA,ECrLA,0CACA,QAEA,ECZA,IAAMA,EAAkE,CACtEC,GAAI,aACJC,GAAI,OACN,EAeaC,EAAiC,CAC5CC,EACAC,EACAC,EACAC,KAEA,IAAMC,EAAOC,EACXC,EAAM,CAACN,EAAeO,SAAS,CAAEP,EAAeQ,EAD7BH,MACqC,CAAC,EACzDC,EAAM,CAACL,EAAFK,SAAwB,CAAEL,EAAaO,QAAQ,CAAC,EACrD,CACEC,MAAOb,CAAa,CAACM,EAAa,GAItC,OAAOQ,OAAOC,SAAS,CAACR,IAAYA,GAAW,EAAIO,OAAON,EAAKQ,OAAO,CAACT,IAAYC,CACrF,EAAE,EC1BoB,CACpBS,IAAK,EACLC,KAAM,CAAC,CACT,EAIMC,EAAwB,CAC5BC,EACAC,EACAC,KAGA,IAAMC,EAAS,CAAEX,SAAUQ,GAAkBI,KAAO,EAAGb,UAAWS,GAAkBK,KAAO,CAAE,EACvFb,EAAWS,GAAiBT,UAAY,EACxCD,EAAYU,GAAiBV,WAAa,EAOhD,MAAO,CACLF,SANA,GACEE,GACAR,EAA+B,CAAES,qBAAUD,CAAU,EAAGY,EAP1B,CAOApB,KAAkCG,CAP/CgB,EAAoB,KAAO,KAOkC,IAChF,CAIF,CACF,EAqBMI,EAAc,CAClBN,EACAC,KAEA,GAAM,UAAEZ,CAAQ,CAAE,CAAGU,EAAsBC,EAAkBC,GAC7D,OAAOZ,CACT,EACMkB,EAAiB,CAACC,EAAcC,EAAcT,KAClD,IAEMU,EAFYJ,EAAYN,EAAkBQ,EAAEG,MAEXC,MAFuB,EAAEC,YAC9CP,EAAYN,EAAkBS,EAAEE,YAAY,EAAEE,YAIhE,GAA2B,IAAvBH,EAA0B,OAAOA,EAGrC,IAAMI,EAAQN,EAAEO,IAAI,EAAI,GAClBC,EAAQP,EAAEM,IAAI,EAAI,GACxB,OAAOD,EAAMG,aAAa,CAACD,EAC7B,EAEME,EAAe,CACnBV,EACAC,EACAU,EACAnB,KAEA,IAOMoB,EAPAC,CAOoBA,CANxBb,EAAEc,OAMgCC,mBANN,EAAEC,SAC7BL,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,CAAgB,EAEhEjB,GAAEa,0BAA0B,EAAEE,SAC7BL,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,CAAgB,CAE9BH,CAAM,CAAKJ,SAG/C,GAA4B,CAAxBC,EAA+BA,EAG5Bb,EAAeC,EAAGC,EAAGT,EAC9B,EAEM2B,EAAc,CAClBnB,EACAC,EACAU,EACAnB,EACA4B,EACAC,SAEIC,EACAC,EAEJ,GAAIH,EAAY,CACd,IAAMI,EAAcH,EAChBD,CAAU,CAACpB,EAAEyB,OAAO,CAAC,EAAEC,SAASC,QAAQC,eACxCR,CAAU,CAACpB,EAAEyB,OAAO,CAAC,EAAEC,SAASC,QAAQE,WACtCC,EAAcT,EAChBD,CAAU,CAACnB,EAAEwB,OAAO,CAAC,EAAEC,SAASC,QAAQC,eACxCR,CAAU,CAACnB,EAAEwB,OAAO,CAAC,EAAEC,SAASC,QAAQE,WAC5CP,EAASE,IAAgBb,IAAcM,EAAc3B,IAAI,CAAhCqB,CAAoC,EAAIzB,OAAOgC,gBAAAA,EACxEK,EAASO,IAAgBnB,IAAcM,EAAc3B,IAAI,CAAhCqB,CAAoC,EAAIzB,OAAOgC,gBAAAA,CAC1E,MAGEI,CADG,CAEDtB,EAAE+B,QAAQ,EAAEJ,QAAQE,aACnBlB,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAgB,EAClEK,EACEtB,EAAE8B,QAAQ,EAAEJ,QAAQE,aACnBlB,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,EAGpD,IAAMc,EAAkB,CAACV,EAASC,CAAAA,CAAK,CAAKZ,SAG5C,GAA2B,CAAvBqB,EAA8BA,EAG3BjC,EAAeC,EAAGC,EAAGT,EAC9B,EAEMyC,EAAe,CACnBjC,EACAC,EACAU,EACAnB,EACA4B,SAEIc,EACAC,EACAf,GACFc,EACEd,GAAY,CAACpB,EAAEyB,CAFH,MAEU,CAAC,EAAEC,SAASU,SAASC,mBAC1C1B,EAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,EAClDiB,EACEf,GAAY,CAACnB,EAAEwB,OAAO,CAAC,EAAEC,SAASU,SAASC,oBAC1C1B,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,IAIlDgB,EACElC,EAAE+B,QAAQ,EAAEK,SAASE,MAAMD,mBAC1B1B,EAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,EAClDiB,EACElC,EAAE8B,QAAQ,EAAEK,SAASE,MAAMD,oBAC1B1B,CAAAA,GAAcM,EAAc3B,IAAI,CAAG,CAAC,EAAIJ,OAAOgC,gBAAAA,GAGpD,IAAMqB,EAAmB,GAAWJ,CAAAA,CAAM,CAAKxB,SAG/C,GAA4B,CAAxB4B,EAA+BA,EAG5BxC,EAAeC,EAAGC,EAAGT,EAC9B,EAEMgD,EAAc,CAClBC,EACAC,EACAlD,KAEA,IAAMmD,EAAyBC,EAAeF,EAAQlD,GAKtD,MAAO,IAJiBmD,EAAuBE,MAAM,CAAC,GAAWC,EAAML,SAAS,GAAKA,MAC/DE,EAAuBE,MAAM,CAAEC,GAAUA,EAAML,SAAS,GAAKA,GAGtC,EAGzCG,EAAiB,CAACF,EAAqBlD,IAC3CkD,EAAOK,IAAI,CAAC,CAAC/C,EAAGC,IAAMF,EAAeC,EAAGC,EAAGT,IAEvCwD,EAAe,CACnBN,EACA/B,EACAnB,EACA4B,IACGsB,EAAOK,IAAI,CAAC,CAAC/C,EAAGC,IAAMgC,EAAajC,EAAGC,EAAGU,EAAWnB,EAAkB4B,IAErE6B,EAAc,CAClBP,EACA/B,EACAnB,EACA4B,EACAC,IAEAqB,EAAOK,IAAI,CAAC,CAAC/C,EAAGC,IACdkB,EAAYnB,EAAGC,EAAGU,EAAWnB,EAAkB4B,EAAYC,IAGzD6B,EAAe,CACnBR,EACA/B,EACAnB,IACGkD,EAAOK,IAAI,CAAC,CAAC/C,EAAGC,IAAMS,EAAaV,EAAGC,EAAGU,EAAWnB,IAE5C2D,EAAa,CACxBC,EACAX,EACAC,EACAlD,EACA4B,EACAC,KAEA,GAAI,CAACqB,GAAQW,OAAQ,MAAO,EAAE,CAC9B,OAAQD,GACN,IAAK,QACH,OAAOZ,EAAYC,EAAWC,EAAQlD,EACxC,KAAK,WACH,OAAOoD,EAAeF,EAAQlD,EAChC,KAAK,mBACH,OAAOwD,EAAaN,EAAQzB,EAAc5B,GAAG,CAAEG,EAAkB4B,EACnE,KAAK,oBACH,OAAO4B,EAAaN,EAAQzB,EAAc3B,IAAI,CAAEE,EAAkB4B,EACpE,KAAK,kBACH,OAAO6B,EACLP,EACAzB,EAAc5B,GAAG,CACjBG,EACA4B,EACAC,EAEJ,KAAK,mBACH,OAAO4B,EACLP,EACAzB,EAAc3B,IAAI,CAClBE,EACA4B,EACAC,EAEJ,KAAK,oBACH,OAAO6B,EAAaR,EAAQzB,EAAc5B,GAAG,CAAEG,EACjD,KAAK,qBACH,OAAO0D,EAAaR,EAAQzB,EAAc3B,IAAI,CAAEE,EAClD,SACE,OAAOkD,CACX,CACF,EAAE,KC9PGY,gBAAgB,CAAC,UAAW,IAC/B,GAAM,CAAEF,UAAQ,WAAEX,CAAS,QAAEC,CAAM,kBAAElD,CAAgB,YAAE4B,CAAU,oBAAEC,CAAkB,CAAE,CACrFkC,EAAMC,IAAI,CAENC,EAASN,EACbC,EACAX,EACAC,EACAlD,EAJuB2D,EAMvB9B,GAGFqC,KAAKC,WAAW,CAACF,EACnB","sources":["webpack://_N_E/../../node_modules/.pnpm/@turf+invariant@7.2.0/node_modules/@turf/invariant/dist/esm/index.js","webpack://_N_E/../../node_modules/.pnpm/@turf+helpers@7.2.0/node_modules/@turf/helpers/dist/esm/index.js","webpack://_N_E/../../node_modules/.pnpm/@turf+distance@7.2.0/node_modules/@turf/distance/dist/esm/index.js","webpack://_N_E/./utils/calculate-center-to-hotel-distance.ts","webpack://_N_E/./utils/hotel-sort-utils.ts","webpack://_N_E/./utils/hotel-sort-worker.ts"],"sourcesContent":["// index.ts\nimport { isNumber } from \"@turf/helpers\";\nfunction getCoord(coord) {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n if (!Array.isArray(coord)) {\n if (coord.type === \"Feature\" && coord.geometry !== null && coord.geometry.type === \"Point\") {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {\n return [...coord];\n }\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\nfunction getCoords(coords) {\n if (Array.isArray(coords)) {\n return coords;\n }\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\nfunction containsNumber(coordinates) {\n if (coordinates.length > 1 && isNumber(coordinates[0]) && isNumber(coordinates[1])) {\n return true;\n }\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\nfunction geojsonType(value, type, name) {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + value.type\n );\n }\n}\nfunction featureOf(feature, type, name) {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + feature.geometry.type\n );\n }\n}\nfunction collectionOf(featureCollection, type, name) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" + name + \": must be a \" + type + \", given \" + feature.geometry.type\n );\n }\n }\n}\nfunction getGeom(geojson) {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\nfunction getType(geojson, _name) {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\nexport {\n collectionOf,\n containsNumber,\n featureOf,\n geojsonType,\n getCoord,\n getCoords,\n getGeom,\n getType\n};\n//# sourceMappingURL=index.js.map","// index.ts\nvar earthRadius = 63710088e-1;\nvar factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1e3,\n kilometres: earthRadius / 1e3,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1e3,\n millimetres: earthRadius * 1e3,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936\n};\nvar areaFactors = {\n acres: 247105e-9,\n centimeters: 1e4,\n centimetres: 1e4,\n feet: 10.763910417,\n hectares: 1e-4,\n inches: 1550.003100006,\n kilometers: 1e-6,\n kilometres: 1e-6,\n meters: 1,\n metres: 1,\n miles: 386e-9,\n nauticalmiles: 29155334959812285e-23,\n millimeters: 1e6,\n millimetres: 1e6,\n yards: 1.195990046\n};\nfunction feature(geom, properties, options = {}) {\n const feat = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\nfunction geometry(type, coordinates, _options = {}) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\nfunction point(coordinates, properties, options = {}) {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n const geom = {\n type: \"Point\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction points(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\nfunction polygon(coordinates, properties, options = {}) {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom = {\n type: \"Polygon\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction polygons(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\nfunction lineString(coordinates, properties, options = {}) {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom = {\n type: \"LineString\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction lineStrings(coordinates, properties, options = {}) {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\nfunction featureCollection(features, options = {}) {\n const fc = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\nfunction multiLineString(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiLineString\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction multiPoint(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiPoint\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction multiPolygon(coordinates, properties, options = {}) {\n const geom = {\n type: \"MultiPolygon\",\n coordinates\n };\n return feature(geom, properties, options);\n}\nfunction geometryCollection(geometries, properties, options = {}) {\n const geom = {\n type: \"GeometryCollection\",\n geometries\n };\n return feature(geom, properties, options);\n}\nfunction round(num, precision = 0) {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\nfunction radiansToLength(radians, units = \"kilometers\") {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\nfunction lengthToRadians(distance, units = \"kilometers\") {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\nfunction lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\nfunction bearingToAzimuth(bearing) {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\nfunction azimuthToBearing(angle) {\n angle = angle % 360;\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n return angle;\n}\nfunction radiansToDegrees(radians) {\n const normalisedRadians = radians % (2 * Math.PI);\n return normalisedRadians * 180 / Math.PI;\n}\nfunction degreesToRadians(degrees) {\n const normalisedDegrees = degrees % 360;\n return normalisedDegrees * Math.PI / 180;\n}\nfunction convertLength(length, originalUnit = \"kilometers\", finalUnit = \"kilometers\") {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\nfunction convertArea(area, originalUnit = \"meters\", finalUnit = \"kilometers\") {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n return area / startFactor * finalFactor;\n}\nfunction isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\nfunction isObject(input) {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\nfunction validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\nfunction validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\nexport {\n areaFactors,\n azimuthToBearing,\n bearingToAzimuth,\n convertArea,\n convertLength,\n degreesToRadians,\n earthRadius,\n factors,\n feature,\n featureCollection,\n geometry,\n geometryCollection,\n isNumber,\n isObject,\n lengthToDegrees,\n lengthToRadians,\n lineString,\n lineStrings,\n multiLineString,\n multiPoint,\n multiPolygon,\n point,\n points,\n polygon,\n polygons,\n radiansToDegrees,\n radiansToLength,\n round,\n validateBBox,\n validateId\n};\n//# sourceMappingURL=index.js.map","// index.ts\nimport { getCoord } from \"@turf/invariant\";\nimport { radiansToLength, degreesToRadians } from \"@turf/helpers\";\nfunction distance(from, to, options = {}) {\n var coordinates1 = getCoord(from);\n var coordinates2 = getCoord(to);\n var dLat = degreesToRadians(coordinates2[1] - coordinates1[1]);\n var dLon = degreesToRadians(coordinates2[0] - coordinates1[0]);\n var lat1 = degreesToRadians(coordinates1[1]);\n var lat2 = degreesToRadians(coordinates2[1]);\n var a = Math.pow(Math.sin(dLat / 2), 2) + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);\n return radiansToLength(\n 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)),\n options.units\n );\n}\nvar turf_distance_default = distance;\nexport {\n turf_distance_default as default,\n distance\n};\n//# sourceMappingURL=index.js.map","import distance from '@turf/distance';\nimport { point } from '@turf/helpers';\n\nconst DISTANCE_UNIT: Readonly<Record<string, 'miles' | 'kilometers'>> = {\n km: 'kilometers',\n mi: 'miles',\n};\n\ninterface Coordinate {\n latitude: number;\n longitude: number;\n}\n\n/**\n * Calculates distance between two coordinate points.\n *\n * @param fromCoordinate\n * @param toCoordinate\n * @param distanceUnit\n * @param decimal\n */\nexport const calculateCenterToHotelDistance = (\n fromCoordinate: Coordinate,\n toCoordinate: Coordinate,\n distanceUnit: keyof typeof DISTANCE_UNIT,\n decimal: number\n) => {\n const dist = distance(\n point([fromCoordinate.longitude, fromCoordinate.latitude]),\n point([toCoordinate.longitude, toCoordinate.latitude]),\n {\n units: DISTANCE_UNIT[distanceUnit],\n }\n );\n\n return Number.isInteger(decimal) && decimal >= 0 ? Number(dist.toFixed(decimal)) : dist;\n};\n","import type { HotelType } from '../providers/app-provider/app-provider.types';\nimport type {\n ShopMultiPropAvailPointsQuery,\n ShopMultiPropAvailQuery,\n HotelCoordinate,\n} from '@dx-ui/queries-dx-shop-search-ui';\nimport type { TFunction } from 'i18next';\nimport { calculateCenterToHotelDistance } from './calculate-center-to-hotel-distance';\nimport type { GoogleCoordinate } from './get-bounds-nodes/get-bounds-nodes';\n\nconst SortDirection = {\n Asc: 1,\n Desc: -1,\n};\n\ntype HotelCenterCoordinate = Pick<HotelCoordinate, 'latitude' | 'longitude'> | undefined;\n\nconst getDistanceFromCenter = (\n centerCoordinate: GoogleCoordinate | null,\n hotelCoordinate: HotelCenterCoordinate | null,\n language?: string\n) => {\n const distanceUnit = language !== 'en' ? 'km' : 'mi';\n const center = { latitude: centerCoordinate?.lat || 0, longitude: centerCoordinate?.lng || 0 };\n const latitude = hotelCoordinate?.latitude || 0;\n const longitude = hotelCoordinate?.longitude || 0;\n const distance =\n (latitude &&\n longitude &&\n calculateCenterToHotelDistance({ latitude, longitude }, center, distanceUnit, 2)) ||\n 0;\n\n return {\n distance,\n };\n};\n\nexport const getDistanceFromCenterFmt = (\n t: TFunction<['hotel-card']>,\n centerCoordinate: GoogleCoordinate | null,\n hotelCoordinate: HotelCenterCoordinate | null,\n language?: string\n) => {\n const distanceUnit = language !== 'en' ? 'km' : 'mi';\n const { distance } = getDistanceFromCenter(centerCoordinate, hotelCoordinate, language);\n const distanceFmt = `${new Intl.NumberFormat(language, {\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n }).format(distance)} ${distanceUnit === 'mi' ? t('miles') : t('kilometers')}`;\n\n return {\n distanceFmt,\n distance,\n };\n};\n\nconst getDistance = (\n centerCoordinate: GoogleCoordinate | null,\n hotelCoordinate?: HotelCenterCoordinate | null\n) => {\n const { distance } = getDistanceFromCenter(centerCoordinate, hotelCoordinate);\n return distance;\n};\nconst distanceSortFn = (a: HotelType, b: HotelType, centerCoordinate: GoogleCoordinate | null) => {\n const aDistance = getDistance(centerCoordinate, a.localization?.coordinate);\n const bDistance = getDistance(centerCoordinate, b.localization?.coordinate);\n const distanceSortResult = aDistance - bDistance;\n\n // If distances are different, then we're done sorting\n if (distanceSortResult !== 0) return distanceSortResult;\n\n // If distances are the same, then sort by name\n const aName = a.name || '';\n const bName = b.name || '';\n return aName.localeCompare(bName);\n};\n\nconst ratingSortFn = (\n a: HotelType,\n b: HotelType,\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null\n) => {\n const aRating =\n a.tripAdvisorLocationSummary?.rating ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n const bRating =\n b.tripAdvisorLocationSummary?.rating ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n\n const ratingSortResult = (aRating - bRating) * direction;\n\n // If prices are different, then we're done sorting\n if (ratingSortResult !== 0) return ratingSortResult;\n\n // When prices are the same, then sort by distance\n return distanceSortFn(a, b, centerCoordinate);\n};\n\nconst priceSortFn = (\n a: HotelType,\n b: HotelType,\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null,\n mpaPricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>,\n showAmountAfterTax?: boolean\n) => {\n let aPrice;\n let bPrice;\n // if we are using shopMultiPropAvail data then use different field for price sort\n if (mpaPricing) {\n const aRateAmount = showAmountAfterTax\n ? mpaPricing[a.ctyhocn]?.summary?.lowest?.amountAfterTax\n : mpaPricing[a.ctyhocn]?.summary?.lowest?.rateAmount;\n const bRateAmount = showAmountAfterTax\n ? mpaPricing[b.ctyhocn]?.summary?.lowest?.amountAfterTax\n : mpaPricing[b.ctyhocn]?.summary?.lowest?.rateAmount;\n aPrice = aRateAmount ?? (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n bPrice = bRateAmount ?? (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n }\n // else use lead rates from hotel object\n else {\n aPrice =\n a.leadRate?.lowest?.rateAmount ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n bPrice =\n b.leadRate?.lowest?.rateAmount ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n }\n\n const priceSortResult = (aPrice - bPrice) * direction;\n\n // If prices are different, then we're done sorting\n if (priceSortResult !== 0) return priceSortResult;\n\n // When prices are the same, then sort by distance\n return distanceSortFn(a, b, centerCoordinate);\n};\n\nconst pointsSortFn = (\n a: HotelType,\n b: HotelType,\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null,\n mpaPricing?: Record<string, ShopMultiPropAvailPointsQuery['shopMultiPropAvail'][0]>\n) => {\n let aPoints;\n let bPoints;\n if (mpaPricing) {\n aPoints =\n mpaPricing?.[a.ctyhocn]?.summary?.hhonors?.dailyRmPointsRate ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n bPoints =\n mpaPricing?.[b.ctyhocn]?.summary?.hhonors?.dailyRmPointsRate ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n }\n // else use lead rates from hotel object\n else {\n aPoints =\n a.leadRate?.hhonors?.lead?.dailyRmPointsRate ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n bPoints =\n b.leadRate?.hhonors?.lead?.dailyRmPointsRate ??\n (direction === SortDirection.Desc ? -1 : Number.MAX_SAFE_INTEGER);\n }\n\n const pointsSortResult = (aPoints - bPoints) * direction;\n\n // If points are different, then we're done sorting\n if (pointsSortResult !== 0) return pointsSortResult;\n\n // otherwise fallback to distance sort\n return distanceSortFn(a, b, centerCoordinate);\n};\n\nconst sortByBrand = (\n brandCode: string | undefined,\n hotels: HotelType[],\n centerCoordinate: GoogleCoordinate | null\n) => {\n const hotelsSortedByDistance = sortByDistance(hotels, centerCoordinate);\n const brandedCtyhocns = hotelsSortedByDistance.filter((hotel) => hotel.brandCode === brandCode);\n const otherCtyhocns = hotelsSortedByDistance.filter((hotel) => hotel.brandCode !== brandCode);\n\n // merge results\n return [...brandedCtyhocns, ...otherCtyhocns];\n};\n\nconst sortByDistance = (hotels: HotelType[], centerCoordinate: GoogleCoordinate | null) =>\n hotels.sort((a, b) => distanceSortFn(a, b, centerCoordinate));\n\nconst sortByPoints = (\n hotels: HotelType[],\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null,\n mpaPricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>\n) => hotels.sort((a, b) => pointsSortFn(a, b, direction, centerCoordinate, mpaPricing));\n\nconst sortByPrice = (\n hotels: HotelType[],\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null,\n mpaPricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>,\n showAmountAfterTax?: boolean\n) =>\n hotels.sort((a, b) =>\n priceSortFn(a, b, direction, centerCoordinate, mpaPricing, showAmountAfterTax)\n );\n\nconst sortByRating = (\n hotels: HotelType[],\n direction: ValuesOf<typeof SortDirection>,\n centerCoordinate: GoogleCoordinate | null\n) => hotels.sort((a, b) => ratingSortFn(a, b, direction, centerCoordinate));\n\nexport const sortHotels = (\n sortType: string | null,\n brandCode: string | undefined,\n hotels: HotelType[],\n centerCoordinate: GoogleCoordinate | null,\n mpaPricing?: Record<string, ShopMultiPropAvailQuery['shopMultiPropAvail'][0]>,\n showAmountAfterTax?: boolean\n) => {\n if (!hotels?.length) return [];\n switch (sortType) {\n case 'BRAND':\n return sortByBrand(brandCode, hotels, centerCoordinate);\n case 'DISTANCE':\n return sortByDistance(hotels, centerCoordinate);\n case 'POINTS_ASCENDING':\n return sortByPoints(hotels, SortDirection.Asc, centerCoordinate, mpaPricing);\n case 'POINTS_DESCENDING':\n return sortByPoints(hotels, SortDirection.Desc, centerCoordinate, mpaPricing);\n case 'PRICE_ASCENDING':\n return sortByPrice(\n hotels,\n SortDirection.Asc,\n centerCoordinate,\n mpaPricing,\n showAmountAfterTax\n );\n case 'PRICE_DESCENDING':\n return sortByPrice(\n hotels,\n SortDirection.Desc,\n centerCoordinate,\n mpaPricing,\n showAmountAfterTax\n );\n case 'RATINGS_ASCENDING':\n return sortByRating(hotels, SortDirection.Asc, centerCoordinate);\n case 'RATINGS_DESCENDING':\n return sortByRating(hotels, SortDirection.Desc, centerCoordinate);\n default:\n return hotels;\n }\n};\n","import { sortHotels } from './hotel-sort-utils';\n\nself.addEventListener('message', (event) => {\n const { sortType, brandCode, hotels, centerCoordinate, mpaPricing, showAmountAfterTax } =\n event.data;\n\n const result = sortHotels(\n sortType,\n brandCode,\n hotels,\n centerCoordinate,\n mpaPricing,\n showAmountAfterTax\n );\n\n self.postMessage(result);\n});\n"],"names":["DISTANCE_UNIT","km","mi","calculateCenterToHotelDistance","fromCoordinate","toCoordinate","distanceUnit","decimal","dist","distance","point","longitude","latitude","units","Number","isInteger","toFixed","Asc","Desc","getDistanceFromCenter","centerCoordinate","hotelCoordinate","language","center","lat","lng","getDistance","distanceSortFn","a","b","distanceSortResult","localization","bDistance","coordinate","aName","name","bName","localeCompare","ratingSortFn","direction","ratingSortResult","aRating","tripAdvisorLocationSummary","bRating","rating","SortDirection","MAX_SAFE_INTEGER","priceSortFn","mpaPricing","showAmountAfterTax","aPrice","bPrice","aRateAmount","ctyhocn","summary","lowest","amountAfterTax","rateAmount","bRateAmount","leadRate","priceSortResult","pointsSortFn","aPoints","bPoints","hhonors","dailyRmPointsRate","lead","pointsSortResult","sortByBrand","brandCode","hotels","hotelsSortedByDistance","sortByDistance","filter","hotel","sort","sortByPoints","sortByPrice","sortByRating","sortHotels","sortType","length","addEventListener","event","data","result","self","postMessage"],"sourceRoot":"","ignoreList":[0,1,2]}