@tomtom-org/maps-sdk 1.0.0-rc.4 → 1.0.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +112 -0
- package/README.md +4 -4
- package/core/dist/core.es.js +1 -1
- package/core/dist/index.d.ts +774 -981
- package/map/dist/index.d.ts +1115 -569
- package/map/dist/map.es.js +5 -3
- package/package.json +2 -1
- package/services/dist/index.d.ts +128 -210
- package/services/dist/services.es.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,117 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.0-rc.6
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2045](https://github.com/tomtom-internal/maps-sdk-js/pull/2045) [`3cbf97a`](https://github.com/tomtom-internal/maps-sdk-js/commit/3cbf97a94a37b2fe5f5ca49f1fc08ed3253c5d79) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: The attribution shows the TomTom and OpenStreetMap credits as logos, each keeping its credit's link, with any other credit after them as text.
|
|
8
|
+
|
|
9
|
+
- `attribution` takes `position` (the corner) and `padding` to place the logos. It only places them: no value turns them off or swaps them for plain text
|
|
10
|
+
- The logos are black with a white outline on every style, light and dark
|
|
11
|
+
- A soft, blurred backdrop sits behind the logos so they stand out from map labels. It follows the style's theme across `setStyle`. `backdrop: false` removes it, and the logos stay
|
|
12
|
+
- Your own `credits` follow the logos
|
|
13
|
+
- **Breaking:** CSS or layout code aimed at `.maplibregl-ctrl-attrib` no longer finds the attribution: place the logos clear of your layout with `position` and `padding`
|
|
14
|
+
- examples: `attribution-playground` places the logos in each corner, over every standard style, with or without their backdrop
|
|
15
|
+
|
|
16
|
+
- [#2811](https://github.com/tomtom-internal/maps-sdk-js/pull/2811) [`e77a737`](https://github.com/tomtom-internal/maps-sdk-js/commit/e77a737112b1e1cbf8115d86ebfcbd2d487e78c0) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** core, services, map: a refused API key reads the same on the map as on a service call, so `PrivatePreviewAccess`, which both errors now carry, is imported from `@tomtom-org/maps-sdk/core`, not `@tomtom-org/maps-sdk/services`
|
|
17
|
+
- core: `APIErrorDetails` declares `apiErrorCode` and `privatePreviewAccess` once, for one function to read a service call's error and the map's alike
|
|
18
|
+
- map: `TomTomMapError` implements it, as `SDKServiceError` does
|
|
19
|
+
- map: a style, tile, sprite or glyph refused with a JSON body names the API's own code in `apiErrorCode`, `'InvalidReferer'` when the key's domain restriction refused the page and `'Forbidden'` when the API isn't enabled for the key, and adds the API's own message to `message`
|
|
20
|
+
- map: the message of a failed style, tile, sprite or glyph request shows the API key in its URL as `key=…`, so the message is safe to log
|
|
21
|
+
- map: a plugin's data that fails to load, such as the Landmarks 3D tiles, reaches `addErrorHandler` as a `TomTomMapError` under the plugin's source, coded by status like the map's own tiles
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- [#2821](https://github.com/tomtom-internal/maps-sdk-js/pull/2821) [`9f0d43b`](https://github.com/tomtom-internal/maps-sdk-js/commit/9f0d43be079eb933c12436c0cb20cd18faaf87ca) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `BaseMapModule` lights up the style's own 3D buildings: `buildings3D.hover` and `buildings3D.click` set the colour a hovered or clicked building turns towards, and `setBuildingColors` gives the buildings you pick by id a colour of their own
|
|
26
|
+
|
|
27
|
+
- A building reacts while a `BaseMapModule` handler reaches the `buildings3D` group, and stays as drawn while you leave both colours unset
|
|
28
|
+
- A building the map data splits into parts lights up and takes its colour whole, by the id of any of its parts
|
|
29
|
+
- `getBuildingIdAt` names the building standing at a position, to highlight buildings you know by place
|
|
30
|
+
- Features of the base map, the POIs and the traffic tiles now carry their `eventState` as a feature state, for your own `styling.layers` paint to read
|
|
31
|
+
- The 3D buildings' `fill-extrusion-color` is now an expression around the style's colour on every map, so `getPaintProperty` and an exported style return that expression; the style's own colour is its output at intensity 0
|
|
32
|
+
- The four settings are knobs of `baseMapKnobCatalogue`, `buildings3D.{hover,click}.{color,intensity}`
|
|
33
|
+
- The new `base-map-buildings-interaction` example hovers, selects and paints buildings over Midtown Manhattan
|
|
34
|
+
|
|
35
|
+
- [#2732](https://github.com/tomtom-internal/maps-sdk-js/pull/2732) [`7d786f7`](https://github.com/tomtom-internal/maps-sdk-js/commit/7d786f77afa3dd91dbdab0da293932951ef87f5e) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `getMapLight` reads where the map's light comes from, as a compass direction and an altitude, so a layer of your own can light its surfaces from the same direction as the 3D buildings
|
|
36
|
+
|
|
37
|
+
- With neither `view.light.direction` nor `view.light.altitude` set, the light knobs leave MapLibre's position unset, so a colour, intensity or alignment on its own, and a clean style switch, leave `getMapLight` `undefined` instead of writing the 210°/60° default
|
|
38
|
+
|
|
39
|
+
- [#2815](https://github.com/tomtom-internal/maps-sdk-js/pull/2815) [`c91ee5a`](https://github.com/tomtom-internal/maps-sdk-js/commit/c91ee5a1d20ca21d6e37eca13b1256f8c423eaf5) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: an unknown POI category logs its id, not the name the service sent
|
|
40
|
+
|
|
41
|
+
- [#2813](https://github.com/tomtom-internal/maps-sdk-js/pull/2813) [`c186703`](https://github.com/tomtom-internal/maps-sdk-js/commit/c1867038e9a38e300ea72e8812419204bf008e73) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - core: geometry helpers handle routes, boxes and cells across the antimeridian, and a new stop slots into a round trip where it belongs
|
|
42
|
+
|
|
43
|
+
- core: `bboxFromGeoJSON` gives the narrowest box around shapes on both sides of the antimeridian, and `undefined` for a geometry missing its coordinates
|
|
44
|
+
- core: route positions, owned polygons and hexagon cells wrap past ±180° instead of jumping across the map
|
|
45
|
+
- core: departure, arrival, waypoint, border and tollgate instructions carry no lanes
|
|
46
|
+
- core: `findBestWaypointInsertionIndex` and `withInsertedWaypoints` slot a new stop on a round trip between the right passes of its origin and destination
|
|
47
|
+
- core: `calculateProgressAtRoutePoint`, `getRouteProgressBetween` and `getRouteProgressForSection` return `undefined` for a path index that is no whole number, where they returned `NaN` values
|
|
48
|
+
- core: `formatDuration` rounds a half minute up, and `formatDistance` and `formatDuration` keep the global units for an option left `undefined`
|
|
49
|
+
- core: bundlers drop `TomTomConfig` from an app that never reads it
|
|
50
|
+
- core: a junction's instruction keeps its lanes where a waypoint instruction shares its path point
|
|
51
|
+
|
|
52
|
+
- [#2813](https://github.com/tomtom-internal/maps-sdk-js/pull/2813) [`c186703`](https://github.com/tomtom-internal/maps-sdk-js/commit/c1867038e9a38e300ea72e8812419204bf008e73) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `setLanguage` also translates style labels that read their name inside an expression, such as POIs, states, peaks and ferries
|
|
53
|
+
|
|
54
|
+
- map: a sourceless map error is `STYLE_LOAD_FAILED` only while a style loads, and `INTERNAL` otherwise
|
|
55
|
+
- map: colour knobs refuse colour forms MapLibre can't paint, instead of drawing nothing
|
|
56
|
+
- map: `CustomGeoJSONModule.applyConfig` replaces a layer whose type changes instead of throwing
|
|
57
|
+
- map: a failed or superseded style switch finishes cleanly, and a switch to the same style resets knobs and raw edits
|
|
58
|
+
- map: route summary bubbles stay above their route on a rotated map, hidden sections stay hidden, and section icons follow their size knob
|
|
59
|
+
- map: places keep another module's config properties, draw a mapped category icon, and rebuild once per knob batch
|
|
60
|
+
- map: traffic incident icons keep their visibility across config changes, opacities clamp to 0–1, and area analytics grids take regions across the antimeridian
|
|
61
|
+
- map: `setLanguage` relabels only the map style's own labels, so module and app layers keep the text they were given
|
|
62
|
+
- map: `calculateFittingBBox` expands latitudes in Web Mercator, as `fitBounds` frames them, so its south and north move
|
|
63
|
+
- map: a custom `icon.default` image repositions the place labels, a hovered `base-map` place draws once, and a clicked `pin-clustered` micro dot stays drawn
|
|
64
|
+
- map: `invertFeature` shades a polygon's holes, a MultiPolygon's title sits on its outer ring, and an expression `fill.color` falls through to `color`
|
|
65
|
+
- map: shown-features handlers keep firing after one of them unsubscribes
|
|
66
|
+
- map: custom images load from an SVG file's URL, from SVG markup with text past Latin-1 and from another origin that allows CORS
|
|
67
|
+
- map: each `where()` scope over one source keeps its own hover and cursor, `off` also removes the handlers on a source a config change dropped, and an unsubscribe removes only the registration it came from
|
|
68
|
+
- map: routes, places, area analytics and traffic filters reload only the sources a change reaches
|
|
69
|
+
- map: a clean switch to the style already loaded removes the traffic flow and incident filters, as it does the POI ones
|
|
70
|
+
- map: the map look reads a page background the browser reports in `oklch()` as painted
|
|
71
|
+
- map: POI and place category icon offsets apply where the style's own icon offset is a zoom ramp
|
|
72
|
+
|
|
73
|
+
- [#2813](https://github.com/tomtom-internal/maps-sdk-js/pull/2813) [`c186703`](https://github.com/tomtom-internal/maps-sdk-js/commit/c1867038e9a38e300ea72e8812419204bf008e73) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: a `geoBias` with both a point and a bounding box fails validation as `INVALID_REQUEST`, and error statuses survive bodies the SDK can't read
|
|
74
|
+
|
|
75
|
+
- services: search results map their fields, opening hours and polygon boxes as the service sends them, and keep area-scoped brands
|
|
76
|
+
- services: an XML error over HTTP/2 names its status, and an unread error body is freed
|
|
77
|
+
- services: a zero `Retry-After` still backs off before the next try
|
|
78
|
+
- services: suggestions pick their concept independently of `limit`
|
|
79
|
+
- services: traffic area analytics checks its date rules before the request, rejecting a call that breaks them as `INVALID_REQUEST`
|
|
80
|
+
- services: an along-route search whose filters hold only keys it doesn't declare fails validation, as one with no filter does
|
|
81
|
+
- services: a route leaves out `vehicleRestricted` when it has none, as it does every other section type, and `sectionTypes: ['lanes']` without `guidance` requests no sections
|
|
82
|
+
- services: `geometryData` sends a footprint that several places share once, and gives it the first place's properties, where the last place's won
|
|
83
|
+
- services: an `INVALID_REQUEST` message lists its issues without the `Issues:` JSON, which stays in the error's `issues`
|
|
84
|
+
- services: fuzzy search drops a query intent it doesn't know, and reverse geocoding an area type it doesn't know, rather than returning `undefined`
|
|
85
|
+
- services: `trafficIncidentDetails` sends a polygon cut at 180° as one box across the antimeridian, not one around the world
|
|
86
|
+
- services: a cached `getPOICategories` call rejects an insecure base URL, as an uncached one does
|
|
87
|
+
|
|
88
|
+
## 1.0.0-rc.5
|
|
89
|
+
|
|
90
|
+
### Minor Changes
|
|
91
|
+
|
|
92
|
+
- [#2799](https://github.com/tomtom-internal/maps-sdk-js/pull/2799) [`0661ea4`](https://github.com/tomtom-internal/maps-sdk-js/commit/0661ea49050f1769653ea81f4da8d0b3a038c53d) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** core: `formatDuration` returns a `string` for any `number`, so you can pass its result where a `string` is required with no fallback
|
|
93
|
+
|
|
94
|
+
- **Breaking:** core: `0` gives `"0 min"` and any other duration under 30 seconds gives `"< 1 min"`, in your minute units, where it returned `undefined`. Only `undefined` still returns `undefined`, so where `undefined` hid a label for no delay or no wait, test the seconds before you format them
|
|
95
|
+
- map: `RoutingModule` still leaves out a traffic delay, a jam delay, a stop's wait and a duration difference that round to no minutes, and a summary bubble on a route under 30 seconds reads `"< 1 min"`
|
|
96
|
+
- examples: the route, traffic and store examples drop their fallbacks for a short duration
|
|
97
|
+
|
|
98
|
+
### Patch Changes
|
|
99
|
+
|
|
100
|
+
- [#2798](https://github.com/tomtom-internal/maps-sdk-js/pull/2798) [`f5e7999`](https://github.com/tomtom-internal/maps-sdk-js/commit/f5e79999c0499e9b20a95b9b6cc8c1bc9f3e6f9a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `calculatePaddedBBox`, `calculatePaddedCenter` and `calculateFittingBBox` cut an element short of the map's full width and height from the side that leaves the most of the map visible, so a toolbar inset from the map edges leaves the area below it visible rather than none
|
|
101
|
+
|
|
102
|
+
- map: this changes the result for any such element whose closest map edge is not that side, whether it floats, sits in a corner or touches one edge. A 600 × 150 px panel against the left edge of a 1280 × 720 px map cuts from the top, and a short panel in the top-right corner cuts from the top rather than the right
|
|
103
|
+
- map: an element spanning the map's full width or height cuts as before. If two sides leave the same area, the side nearest a map edge wins
|
|
104
|
+
|
|
105
|
+
- [#2803](https://github.com/tomtom-internal/maps-sdk-js/pull/2803) [`1a62c72`](https://github.com/tomtom-internal/maps-sdk-js/commit/1a62c72eb372d037397bb88485ea731763f3e554) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - The README links the repository's security policy page, which sends a vulnerability report to TomTom's HackerOne program
|
|
106
|
+
|
|
107
|
+
- [#2807](https://github.com/tomtom-internal/maps-sdk-js/pull/2807) [`8962157`](https://github.com/tomtom-internal/maps-sdk-js/commit/8962157661412b72bc3053e7bcde936063ed3f78) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: waypoint labels win over the route's section icons, and the section focus ring outlines the route instead of crossing it
|
|
108
|
+
- A tunnel, closed-to-vehicles, ferry, toll-road or traffic icon under a stop's name gives way to it, as it does to the pin, rather than pushing the name aside.
|
|
109
|
+
- `setSectionFocus` draws its ring under the route's own lines, so on a road that doubles back, or where focused sections meet end to end, the route covers the ring rather than the ring crossing it.
|
|
110
|
+
|
|
111
|
+
- [#2797](https://github.com/tomtom-internal/maps-sdk-js/pull/2797) [`387694f`](https://github.com/tomtom-internal/maps-sdk-js/commit/387694ff1ba9d081c9f39d2c64ad4cb8f31abd06) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - services: `geocode` and `discoverPlaces` take a bare query string, the same as `{ query }`, as `geocodeOne` and `discoverOnePlace` already do
|
|
112
|
+
|
|
113
|
+
- services: `discoverPlaces('coffee')` runs a fuzzy search and is typed as one
|
|
114
|
+
|
|
3
115
|
## 1.0.0-rc.4
|
|
4
116
|
|
|
5
117
|
### Major Changes
|
package/README.md
CHANGED
|
@@ -68,7 +68,7 @@ It's built on [MapLibre GL JS](https://docs.tomtom.com/maps-sdk-js/guides/map/ab
|
|
|
68
68
|
- **A browser with WebGL** for the Map bundle.
|
|
69
69
|
- **A bundler** such as Vite or webpack, because the SDK ships as ES modules. Under Vite, `TomTomMap` sets up MapLibre's web worker on its own; [Vite projects](https://docs.tomtom.com/maps-sdk-js/introduction/project-setup#vite-projects) says when another bundler, such as webpack, needs it set up by hand.
|
|
70
70
|
- **Peer dependencies**, installed by the commands above: MapLibre GL JS 6.15+, Turf 7, culori 4, Lodash 4 and Zod 4.
|
|
71
|
-
- **TypeScript is optional**: the type definitions ship with the package
|
|
71
|
+
- **TypeScript is optional**: the SDK's own type definitions ship with the package. The GeoJSON types come from `@types/geojson`, which you install yourself under pnpm ([TypeScript support](https://docs.tomtom.com/maps-sdk-js/introduction/project-setup#typescript-support)).
|
|
72
72
|
|
|
73
73
|
[Project setup](https://docs.tomtom.com/maps-sdk-js/introduction/project-setup) has the full requirements and the [React, Vue and Node.js](https://docs.tomtom.com/maps-sdk-js/introduction/project-setup#framework-specific-setup) setups.
|
|
74
74
|
|
|
@@ -79,7 +79,7 @@ One package, `@tomtom-org/maps-sdk`, carries three bundles:
|
|
|
79
79
|
| Bundle | Import path | Runs in | Holds |
|
|
80
80
|
| --- | --- | --- | --- |
|
|
81
81
|
| [**Map**](https://docs.tomtom.com/maps-sdk-js/guides/map/quickstart) | `@tomtom-org/maps-sdk/map` | Browser | `TomTomMap` and its modules for places, routes, traffic and more |
|
|
82
|
-
| [**Services**](https://docs.tomtom.com/maps-sdk-js/guides/services/quickstart) | `@tomtom-org/maps-sdk/services` | Browser, Node.js
|
|
82
|
+
| [**Services**](https://docs.tomtom.com/maps-sdk-js/guides/services/quickstart) | `@tomtom-org/maps-sdk/services` | Browser, Node.js | One function per TomTom API, most returning GeoJSON |
|
|
83
83
|
| [**Core**](https://docs.tomtom.com/maps-sdk-js/guides/core/quickstart) | `@tomtom-org/maps-sdk/core` | Anywhere | The shared configuration, types and utilities |
|
|
84
84
|
|
|
85
85
|
[How the SDK works](https://docs.tomtom.com/maps-sdk-js/guides/how-the-sdk-works) shows how the three fit together. Everything is tree-shakable: your bundle carries only the modules and services you import.
|
|
@@ -131,7 +131,7 @@ Separate packages, each declaring the SDK as a peer dependency:
|
|
|
131
131
|
| [**Fly-over**](https://docs.tomtom.com/maps-sdk-js/guides/plugins/flyover) | A camera that flies along a route, framing the junctions ahead |
|
|
132
132
|
| [**Route dragging**](https://docs.tomtom.com/maps-sdk-js/guides/plugins/route-dragging) | Lets your users edit a route by dragging its stops and its line, re-planned as they drag |
|
|
133
133
|
| [**Viewport places**](https://docs.tomtom.com/maps-sdk-js/guides/plugins/viewport-places) | Keeps search results for the visible map area on the map as it moves |
|
|
134
|
-
| [**Landmarks 3D**](https://docs.tomtom.com/maps-sdk-js/guides/plugins/landmarks-3d) | Detailed 3D models of recognizable buildings, in Private Preview,
|
|
134
|
+
| [**Landmarks 3D**](https://docs.tomtom.com/maps-sdk-js/guides/plugins/landmarks-3d) | Detailed 3D models of recognizable buildings, in Private Preview, the base map's buildings in 3D with windows, lights and shadows, and textured water, ground and roads with 3D trees |
|
|
135
135
|
|
|
136
136
|
## Coming from MapLibre GL JS
|
|
137
137
|
|
|
@@ -151,7 +151,7 @@ Where the SDK has a feature for the job, prefer it. It survives style switches a
|
|
|
151
151
|
- [**Where your API key runs**](https://docs.tomtom.com/maps-sdk-js/guides/security/where-your-api-key-runs): anyone who opens the page can read a key used from the browser, but not one used from Node.js.
|
|
152
152
|
- [**Proxying your API calls**](https://docs.tomtom.com/maps-sdk-js/guides/security/proxying-api-calls): keep the key on your server by routing the SDK's requests through your own proxy, then [harden that proxy](https://docs.tomtom.com/maps-sdk-js/guides/security/hardening-your-proxy).
|
|
153
153
|
- [**What the SDK sends, and where**](https://docs.tomtom.com/maps-sdk-js/guides/security/what-the-sdk-sends): the data your users' browsers send to TomTom, for your privacy notice.
|
|
154
|
-
- [**Reporting a vulnerability**](https://github.com/tomtom-international/maps-sdk-js/
|
|
154
|
+
- [**Reporting a vulnerability**](https://github.com/tomtom-international/maps-sdk-js/security/policy): report it privately, never in a public issue. When we fix one, we publish a GitHub security advisory and deprecate the affected versions on npm.
|
|
155
155
|
|
|
156
156
|
## Resources for AI agents
|
|
157
157
|
|
package/core/dist/core.es.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{booleanPointInPolygon,distance,lengthToDegrees,nearestPointOnLine}from"@turf/turf";import{isNil,mean,sum}from"lodash-es";var definedFields=e=>Object.fromEntries(Object.entries(e??{}).filter(([,e])=>void 0!==e)),pickKeys=(e,t)=>Object.fromEntries(t.filter(t=>t in e).map(t=>[t,e[t]])),DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultRetryConfig={initialWaitMs:447,backoffFactor:1.618,timeoutMs:4e4},defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:defaultRetryConfig},withRetryDefaults=(...e)=>e.reduce((e,t)=>({...e,...definedFields(t)}),{...defaultRetryConfig}),copyOfDefaultConfig=()=>({...defaultConfig,retry:withRetryDefaults()}),TomTomConfig=class TomTomConfig{static{this.instance=new TomTomConfig}constructor(){this.config=copyOfDefaultConfig()}put(e){this.config={...this.config,...e,...e.retry&&{retry:withRetryDefaults(e.retry)}}}reset(){this.config=copyOfDefaultConfig()}get(){return this.config}},mergeFromGlobal=(e={})=>{const t=TomTomConfig.instance.get(),A={...t,...e};return{...A,retry:A.retry&&withRetryDefaults(t.retry,e.retry)}},isProxyCredentialsMode=(e=TomTomConfig.instance.get())=>!e.apiKey&&"https://api.tomtom.com"!==(e.commonBaseURL??"https://api.tomtom.com"),LOOPBACK_IPV4=/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,isSecureBaseURL=e=>{let t;try{t=new URL(e)}catch{return!0}if("https:"===t.protocol)return!0;const{hostname:A}=t;return"http:"===t.protocol&&("localhost"===A||A.endsWith(".localhost")||"[::1]"===A||LOOPBACK_IPV4.test(A))},insecureBaseURLMessage=e=>`commonBaseURL ${e} is not https:, so requests to it would carry the API key in the clear; only loopback addresses may use http:.`,geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],languages=["ngt","ngt-Latn","ar","eu-ES","bg-BG","ca-ES","zh-Hant","zh-Hans","hr-HR","cs-CZ","da-DK","nl-NL","en-AU","en-CA","en-GB","en-NZ","en-US","et-EE","fi-FI","fr-FR","gl-ES","de-DE","el-GR","he-IL","hi-IN","hu-HU","id-ID","it-IT","ja-JP","kk-KZ","ko-KR","ko-Latn-KR","lv-LV","lt-LT","ms-MY","nb-NO","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","ru-Latn-RU","ru-Cyrl-RU","sr-RS","sk-SK","sl-SI","es-ES","es-MX","sv-SE","th-TH","tr-TR","uk-UA"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PARK_GENERIC","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CAR_WASH_GENERIC","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLLEGE_OR_UNIVERSITY_GENERIC","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARINA_GENERIC","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPEN_CAR_PARKING_AREA_GENERIC","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SCHOOL_GENERIC","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_CENTER_GENERIC","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEATER_GENERIC","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAFFIC_CONTROL_DEPARTMENT_GENERIC","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WEIGH_STATION_GENERIC","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km"},avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],geometrySectionTypes=["curve","curvyStretch"],apiSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],defaultSectionTypes=/* @__PURE__ */(()=>[...apiSectionTypes,"lanes"])(),inputSectionTypes=/* @__PURE__ */(()=>[...apiSectionTypes,...geometrySectionTypes])(),inputSectionTypesWithGuidance=/* @__PURE__ */(()=>[...inputSectionTypes,"lanes"])(),sectionTypes=/* @__PURE__ */(()=>[...inputSectionTypesWithGuidance,"leg","distinct"])(),sdkErrorCodes=["INVALID_REQUEST","INSECURE_BASE_URL","INVALID_CREDENTIALS","INSUFFICIENT_PERMISSIONS","NOT_FOUND","RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE","ABORTED","WEBGL_UNSUPPORTED","WEBGL_CONTEXT_LOST","STYLE_LOAD_FAILED","INTERNAL"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=/* @__PURE__ */(()=>[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"])(),trafficIncidentTimeValidities=["present","future"],isBBoxWithArea=e=>!!e&&e.length>=4&&e[3]!==e[1]&&e[2]!==e[0],bboxOnlyIfWithArea=e=>isBBoxWithArea(e)?e:void 0,unwrappedEast=([e,,t])=>e>t?t+360:t,bboxLongitudeSpan=e=>unwrappedEast(e)-e[0],toBBox=(e,t,A,E)=>e>A?[180===e?-180:e,t,-180===A?180:A,E]:[e,t,A,E],wrapLongitude=e=>e>180?e-360:e<-180?e+360:e,longitudeRanges=e=>{if(bboxLongitudeSpan(e)>=360)return[[-180,180]];const t=wrapLongitude(e[0]),A=wrapLongitude(e[2]);return t>A?[[t,180],[-180,A]]:[[t,A]]},bboxFromBBoxes=e=>{const t=e?.filter(e=>!!e)??[];if(t.length<=1)return t[0];let A=Number.POSITIVE_INFINITY,E=Number.NEGATIVE_INFINITY;for(const I of t)A=Math.min(A,I[1]),E=Math.max(E,I[3]);const R=(e=>{const t=[];for(const[A,E]of e.flatMap(longitudeRanges).sort((e,t)=>e[0]-t[0])){const e=t.at(-1);e&&A<=e[1]?e[1]=Math.max(e[1],E):t.push([A,E])}return t})(t);let n=R.length-1,T=R[0][0]+360-R[n][1];for(let I=0;I<R.length-1;I++){const e=R[I+1][0]-R[I][1];e>T&&(T=e,n=I)}return toBBox(R[(n+1)%R.length][0],A,R[n][1],E)},positionsExtent=(e,t)=>{const A=e?.length;if(!A)return;const E={west:Number.POSITIVE_INFINITY,east:Number.NEGATIVE_INFINITY,crossingWest:Number.POSITIVE_INFINITY,crossingEast:Number.NEGATIVE_INFINITY,south:Number.POSITIVE_INFINITY,north:Number.NEGATIVE_INFINITY},R=e=>{if(!e||e.length<2)return;const A=t(e[0]);E.west=Math.min(E.west,A),E.east=Math.max(E.east,A),A<0?E.crossingEast=Math.max(E.crossingEast,A):E.crossingWest=Math.min(E.crossingWest,A),E.south=Math.min(E.south,e[1]),E.north=Math.max(E.north,e[1])},n=Math.ceil(A/1e3);for(let T=0;T<A;T+=n)R(e[T]);return n>1&&R(e[A-1]),E.south===Number.POSITIVE_INFINITY?void 0:E},bboxFromCoordsArray=e=>{const t=positionsExtent(e,wrapLongitude);if(!t)return;const{west:A,south:E,east:R,north:n,crossingWest:T,crossingEast:I}=t,o=R-A,r=I+360-T;return Number.isFinite(r)&&o<360&&r<o?toBBox(T,E,I,n):[A,E,R,n]},bboxFromLine=e=>{const t=positionsExtent(e,e=>e);if(!t)return;const{west:A,south:E,east:R,north:n}=t;if(R-A>=360)return[-180,E,180,n];const T=wrapLongitude(A),I=R+(T-A);return toBBox(T,E,I>180?I-360:I,n)},bboxFromGeoJSON=e=>{if(!e)return;if(Array.isArray(e))return"number"==typeof e[0]?e.length>=4?e:void 0:bboxFromBBoxes(e.map(e=>bboxFromGeoJSON(e)));const{bbox:t}=e;if(t)return 6===t.length?[t[0],t[1],t[3],t[4]]:t;switch(e.type){case"Feature":return bboxFromGeoJSON(e.geometry);case"FeatureCollection":return bboxFromBBoxes(e.features.map(bboxFromGeoJSON));case"GeometryCollection":return bboxFromBBoxes(e.geometries.map(bboxFromGeoJSON));case"Point":return bboxFromCoordsArray([e.coordinates]);case"MultiPoint":return bboxFromCoordsArray(e.coordinates);case"LineString":return bboxFromLine(e.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(e.coordinates.map(bboxFromLine));case"MultiPolygon":return bboxFromBBoxes(e.coordinates.flatMap(e=>e.map(bboxFromLine)));default:return}},bboxCenter=e=>{const[t,A,,E]=e,R=(t+unwrappedEast(e))/2;return[R>180?R-360:R,(A+E)/2]},polygonFromBBox=e=>{const[t,A,,E]=e,R=unwrappedEast(e);return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[t,A],[R,A],[R,E],[t,E],[t,A]]]},properties:{}}},MAX_MERCATOR_LATITUDE=85.051129,getPosition=(e,t)=>{if(e){if(Array.isArray(e))return e;if(e.coordinates)return e.coordinates;if(e.geometry)return"main-when-available"===t?.useEntryPoint?(e=>{const t=e?.properties?.entryPoints;return t?.find(e=>"main"===e.type)??t?.find(e=>!e.type)})(e)?.position??e.geometry.coordinates:e.geometry.coordinates}return null},getPositionStrict=(e,t)=>{const A=getPosition(e,t);if(!A)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(e)}`);return A},toPointGeometry=e=>({type:"Point",coordinates:e}),clamp=(e,t,A)=>Math.max(t,Math.min(e,A)),projectAlongRouteLocation=(e,t)=>nearestPointOnLine(e,getPositionStrict(t)).properties.totalDistance,findInsertionSlot=(e,t)=>{for(let A=0;A<e.length-1;A++)if(t>=e[A]&&t<=e[A+1])return A+1;return t<e[0]?0:e.length},slotNewWaypoints=(e,t,A)=>{if(!A.length||e.geometry.coordinates.length<2||t.length<2)return A.map(()=>({slot:0,location:0}));const E=t.map(t=>projectAlongRouteLocation(e,t));return A.map(t=>{const A=projectAlongRouteLocation(e,t);return{slot:findInsertionSlot(E,A),location:A}})},findBestWaypointInsertionIndex=(e,t,A)=>findBestWaypointInsertionIndices(e,t,[A])[0],findBestWaypointInsertionIndices=(e,t,A)=>slotNewWaypoints(e,t,A).map(({slot:e})=>e),withInsertedWaypoint=(e,t,A)=>withInsertedWaypoints(e,t,[A]),withInsertedWaypoints=(e,t,A)=>{const E=Array.from({length:t.length+1},()=>[]),R=slotNewWaypoints(e,t,A);for(const[T,{slot:I,location:o}]of R.entries())E[I].push({waypoint:A[T],location:o,inputIndex:T});for(const T of E)T.sort((e,t)=>e.location-t.location||e.inputIndex-t.inputIndex);const n=[];for(let T=0;T<t.length;T++){for(const e of E[T])n.push(e.waypoint);n.push(t[T])}for(const T of E[t.length])n.push(T.waypoint);return n},progressValuesOf=({distanceInMeters:e,travelTimeInSeconds:t})=>void 0===e||void 0===t?void 0:{distanceInMeters:e,travelTimeInSeconds:t},progressBetween=(e,t,A)=>({distanceInMeters:e.distanceInMeters+A*(t.distanceInMeters-e.distanceInMeters),travelTimeInSeconds:e.travelTimeInSeconds+A*(t.travelTimeInSeconds-e.travelTimeInSeconds)}),calculateProgressAtRoutePoint=(e,t)=>{const{progress:A}=e.properties;if(!A||0===A.length)return;const E=e.geometry.coordinates.length;if(t<0||t>=E)return;const R=findBracketingProgressPoints(A,"pointIndex",t);if(!R)return;const{lower:n,lowerValue:T,upper:I,upperValue:o}=R,r=progressValuesOf(n),N=progressValuesOf(I);if(!r||!N)return;if(T===o)return r;const _=lengthShareOfBracket(e.geometry.coordinates,T,t,o);return progressBetween(r,N,_)},getRouteProgressBetween=(e,t,A)=>{const E=calculateProgressAtRoutePoint(e,t),R=calculateProgressAtRoutePoint(e,A);if(E&&R)return{start:E,end:R,delta:{distanceInMeters:R.distanceInMeters-E.distanceInMeters,travelTimeInSeconds:R.travelTimeInSeconds-E.travelTimeInSeconds}}},getRouteProgressForSection=(e,t)=>getRouteProgressBetween(e,t.startPointIndex,t.endPointIndex),getSectionBBox=(e,t)=>{const A=e.geometry.coordinates;if(!A||0===A.length||t.startPointIndex<0||t.endPointIndex>=A.length||t.startPointIndex>t.endPointIndex)return;const E=Math.floor((t.startPointIndex+t.endPointIndex)/2);return bboxFromCoordsArray([A[t.startPointIndex],A[E],A[t.endPointIndex]])},getSectionOverlap=(e,t)=>{const A=Math.max(e.startPointIndex,t.startPointIndex),E=Math.min(e.endPointIndex,t.endPointIndex);return E>A?{startPointIndex:A,endPointIndex:E}:void 0},metersWithin=(e,t,A=[{startPointIndex:0,endPointIndex:e.length-1}])=>A.reduce((A,E)=>{const R=getSectionOverlap(E,t);return A+(R?e[R.endPointIndex]-e[R.startPointIndex]:0)},0),firstIndexPast=(e,t,A)=>{let E=e,R=0,n=e;for(;R<n;){const e=R+n>>>1;let T=e;for(;T<n&&void 0===t(T);)T++;const I=T<n?t(T):void 0;void 0===I?n=e:A(I)?(E=T,n=e):R=T+1}return E},findBracketingProgressPoints=(e,t,A)=>{const E=A=>e[A][t],R=e[firstIndexPast(e.length,E,e=>e>=A)];let n=firstIndexPast(e.length,E,e=>e>A)-1;for(;n>=0&&void 0===e[n][t];)n--;const T=e[n],I=T?.[t],o=R?.[t];return void 0!==I&&void 0!==o?{lower:T,lowerValue:I,upper:R,upperValue:o}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,EARTH_RADIUS_IN_METERS=6371008.8,RADIANS_PER_DEGREE=Math.PI/180,metersAlongLine=e=>{const t=metersAlongLineCache.get(e);if(t?.length===e.length)return t;const A=new Float64Array(e.length);let[E=0,R=0]=e[0]??[],n=Math.cos(R*RADIANS_PER_DEGREE);for(let T=1;T<e.length;T++){const[t,I]=e[T],o=Math.cos(I*RADIANS_PER_DEGREE),r=Math.sin((I-R)*RADIANS_PER_DEGREE/2),N=Math.sin((t-E)*RADIANS_PER_DEGREE/2),_=r*r+N*N*n*o;A[T]=A[T-1]+12742017.6*Math.atan2(Math.sqrt(_),Math.sqrt(1-_)),E=t,R=I,n=o}return metersAlongLineCache.set(e,A),A},segmentAtMeters=(e,t,A,E)=>{const R=firstIndexPast(e.length,t=>e[t],e=>e>=t),n=clamp(R-1,A,E-1),T=e[n+1]-e[n];return{pathIndex:n,share:T>0?clamp((t-e[n])/T,0,1):0}},positionBetween=(e,t,A)=>[e[0]+A*(t[0]-e[0]),e[1]+A*(t[1]-e[1])],lengthShareOfBracket=(e,t,A,E)=>{const R=metersAlongLine(e),n=R[E]-R[t];return n>0?(R[A]-R[t])/n:(A-t)/(E-t)},interpolateProgressAtPathIndex=(e,t,A)=>{const E=e.geometry.coordinates,R=Math.min(t+1,E.length-1),n=calculateProgressAtRoutePoint(e,t),T=calculateProgressAtRoutePoint(e,R);if(n&&T)return{position:positionBetween(E[t],E[R],A),...progressBetween(n,T,A)}},coordinateAtProgressPoint=(e,t)=>{const A=progressValuesOf(t);return A&&{position:e[t.pointIndex],...A}},resolveCoordinateAtProgress=(e,t,A)=>{const{progress:E}=e.properties,R=E?.at(-1);if(!E||!R)return;const n=e.geometry.coordinates,T=E[0],I=T[t],o=R[t];if(void 0===I||void 0===o)return;if(A<=I)return coordinateAtProgressPoint(n,T);if(A>=o)return coordinateAtProgressPoint(n,R);const r=((e,t,A,E)=>{const R=findBracketingProgressPoints(e,A,E);if(!R)return;const{lower:n,lowerValue:T,upper:I,upperValue:o}=R,r=T===o?0:(E-T)/(o-T),N=metersAlongLine(t),_=N[I.pointIndex]-N[n.pointIndex];if(0===_){const e=n.pointIndex+r*(I.pointIndex-n.pointIndex),t=Math.floor(e);return{pathIndex:t,progressRatioTowardsNextPathPoint:e-t}}const S=N[n.pointIndex]+r*_,i=segmentAtMeters(N,S,n.pointIndex,I.pointIndex);return{pathIndex:i.pathIndex,progressRatioTowardsNextPathPoint:i.share}})(E,n,t,A);return void 0!==r?interpolateProgressAtPathIndex(e,r.pathIndex,r.progressRatioTowardsNextPathPoint):void 0},getCoordinateAtRouteProgress=(e,t)=>{if("traveledTimeInSeconds"in t)return resolveCoordinateAtProgress(e,"travelTimeInSeconds",t.traveledTimeInSeconds);if("traveledDistanceInMeters"in t)return resolveCoordinateAtProgress(e,"distanceInMeters",t.traveledDistanceInMeters);const A=e.properties.summary.departureTime;if(!A)return;const E=(t.clockTime.getTime()-A.getTime())/1e3;return E<0?void 0:resolveCoordinateAtProgress(e,"travelTimeInSeconds",E)},getProgressAtNearestRoutePoint=(e,t)=>{const{progress:A}=e.properties,E=e.geometry.coordinates;if(!A?.length||E.length<2)return;const R=nearestPointOnLine(e,getPositionStrict(t)),n=R.properties.segmentIndex,T=Math.min(n+1,E.length-1),I=((e,t,A)=>{const E=A[0]-e[0],R=A[1]-e[1],n=E*E+R*R;if(0===n)return 0;const T=((t[0]-e[0])*E+(t[1]-e[1])*R)/n;return clamp(T,0,1)})(E[n],R.geometry.coordinates,E[T]);return interpolateProgressAtPathIndex(e,n,I)},SQRT_3=/* @__PURE__ */Math.sqrt(3),HEXAGON_ANGLES=/* @__PURE__ */(()=>[0,1,2,3,4,5].map(e=>2*Math.PI/6*e))(),HEXAGON_COSINES=/* @__PURE__ */(()=>HEXAGON_ANGLES.map(Math.cos))(),HEXAGON_SINES=/* @__PURE__ */(()=>HEXAGON_ANGLES.map(Math.sin))(),hexagonRowHeight=e=>SQRT_3/2*e.height,hexagonColumnOffset=(e,t)=>1&t?hexagonRowHeight(e)/2:0,hexagonCentre=(e,{column:t,row:A})=>[e.origin[0]+t*e.width*.75,e.origin[1]+A*hexagonRowHeight(e)-hexagonColumnOffset(e,t)],hexagonInColumn=(e,t,A)=>({column:t,row:Math.round((A-e.origin[1]+hexagonColumnOffset(e,t))/hexagonRowHeight(e))}),latticeCellOf=(e,t)=>"hex"===e.shape?((e,t)=>{const A=Math.round((t[0]-e.origin[0])/(.75*e.width)),E=A=>((e,t,[A,E])=>{const R=Math.abs(A-t[0])/(e.width/2),n=Math.abs(E-t[1])/(e.height/2);return Math.max(R+n/SQRT_3,2*n/SQRT_3)})(e,hexagonCentre(e,A),t);let R=hexagonInColumn(e,A,t[1]);for(const n of[A-1,A+1]){const A=hexagonInColumn(e,n,t[1]);E(A)<E(R)&&(R=A)}return R})(e,t):{column:Math.floor((t[0]-e.origin[0])/e.width+.5),row:Math.floor((t[1]-e.origin[1])/e.height+.5)},latticeCellPolygon=(e,t)=>{if("hex"===e.shape){const[A,E]=hexagonCentre(e,t),R=HEXAGON_COSINES.map((t,R)=>[A+e.width/2*t,E+e.height/2*HEXAGON_SINES[R]]);return{type:"Polygon",coordinates:[[...R,[...R[0]]]]}}const A=e.origin[0]+(t.column-.5)*e.width,E=e.origin[1]+(t.row-.5)*e.height;return polygonFromBBox([A,E,A+e.width,E+e.height]).geometry},inBBox=([e,t,A,E],[R,n])=>n>=t&&n<=E&&(e>A?R>=e||R<=A:R>=e&&R<=A),inPolygon=(e,t,[A,E])=>booleanPointInPolygon([A,E],e)||t[0]>t[2]&&(booleanPointInPolygon([A+360,E],e)||booleanPointInPolygon([A-360,E],e)),statisticOf={count:e=>e.length,sum:sum,mean:mean,median:e=>{const t=Float64Array.from(e).sort(),A=Math.floor(t.length/2);return t.length%2?t[A]:(t[A-1]+t[A])/2},min:e=>e.reduce((e,t)=>Math.min(e,t),Number.POSITIVE_INFINITY),max:e=>e.reduce((e,t)=>Math.max(e,t),Number.NEGATIVE_INFINITY)},aggregateIntoCells=(e,t)=>{const A=t,E=void 0===(R=A.value)?()=>0:"function"==typeof R?R:e=>e.properties?.[R];var R;const n=[];for(const r of e.features){const e=E(r),t=r.geometry?.coordinates;"number"==typeof e&&Number.isFinite(e)&&Number.isFinite(t?.[0])&&Number.isFinite(t?.[1])&&n.push({position:t,value:e})}const T=(e=>"string"==typeof e.grid)(A)?((e,t)=>{const{cellSizeKM:A}=t;if(!(A>0&&Number.isFinite(A)))throw new Error(`cellSizeKM must be a positive number, got ${A}`);if(!e.length)return[];const E=(({grid:e,cellSizeKM:t,gridOrigin:A},E)=>{const R=bboxFromCoordsArray(E),n=A??(R?bboxCenter(R):E[0]),T=lengthToDegrees(t,"kilometers"),I=clamp(n[1],-85.051129,85.051129),o="hex"===e?2:1;return{shape:e,origin:n,width:T/Math.cos(I*RADIANS_PER_DEGREE)*o,height:T*o}})(t,e.map(({position:e})=>e)),R=E.origin[0],n=/* @__PURE__ */new Map;for(const{position:T,value:I}of e){const e=T[0]-360*Math.round((T[0]-R)/360),t=latticeCellOf(E,[e,T[1]]),A=`${E.shape}:${t.column}:${t.row}`;let o=n.get(A);o||(o={cell:{type:"Feature",id:A,geometry:latticeCellPolygon(E,t),properties:{}},values:[]},n.set(A,o)),o.values.push(I)}return[...n.values()]})(n,A):((e,t)=>{const A=t.features.map(e=>({bbox:bboxFromGeoJSON(e),bin:{cell:e,values:[]}}));for(const{position:E,value:R}of e)for(const{bbox:e,bin:t}of A)e&&inBBox(e,E)&&inPolygon(t.cell,e,E)&&t.values.push(R);return A.map(({bin:e})=>e)})(n,A.grid),I=A.stats??["count"],o=Math.max(A.minCount??1,1);return{type:"FeatureCollection",features:T.filter(({values:e})=>e.length>=o).map(({cell:e,values:t})=>({...e,properties:{...e.properties,...Object.fromEntries(I.map(e=>[e,statisticOf[e](t)]))}}))}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),MIN_PROGRESS=5*Math.PI/180,MAX_TURN_BACK=10*Math.PI/180,NO_JUNCTION=/^(DEPART|ARRIVE|WAYPOINT|CROSS_BORDER|TOLLGATE)/,roadNamesOf=e=>[e?.streetName?.text,...(e?.roadShields??[]).map(e=>e.roadNumber.text)].filter(e=>!!e),followsTheRoad=({maneuver:e,maneuverView:t,previousRoadInfo:A,nextRoadInfo:E})=>{if(e.includes("ROUNDABOUT")||e.includes("UTURN"))return!1;if(t&&!t.offRouteAngles.length)return!0;const R=roadNamesOf(A);return roadNamesOf(E).some(e=>R.includes(e))},curvinessWeight=e=>e<30?2:e<60?1.6:e<100?1.3:e<175?1:0,SLOW_JUNCTION=/^(?:TURN|SHARP|MAKE_UTURN|.*ROUNDABOUT)/,severityOf=(e,t,A,E)=>{const R=e+.75/Math.tan(Math.min(Math.abs(t),Math.PI)/4)**2,n=3.6*Math.sqrt(3*R),T=E&&SLOW_JUNCTION.test(E)?Math.min(n,20):n;return Math.max(0,1-(T/A)**2)},turnBetween=(e,t)=>{const A=t-e;return A>Math.PI?A-2*Math.PI:A<=-Math.PI?A+2*Math.PI:A},bearing=(e,t)=>{const A=turnBetween(e[0]*RADIANS_PER_DEGREE,t[0]*RADIANS_PER_DEGREE);return Math.atan2(A*Math.cos((e[1]+t[1])/2*RADIANS_PER_DEGREE),(t[1]-e[1])*RADIANS_PER_DEGREE)},turnsBack=({meters:e,turns:t},A,E,R,n)=>{let T=0;for(let I=A;I>0&&I<t.length-1;I+=E){if(Math.abs(e[I]-e[A])>n)return!1;if(T+=R*t[I],T<-MAX_TURN_BACK)return!0;if(T>MAX_TURN_BACK)return!1}return!1},turnWithin=({along:e},t,A,E,R)=>{const n=bearing(t[A],t[E]);let T=0,I=A;for(let o=A;o<E;o++){for(;I<E&&e[I]-e[o]<5;)I++;if(e[I]-e[o]<5)break;T=Math.max(T,R*turnBetween(n,bearing(t[o],t[I])))}return T},fittedRadius=(e,t,A)=>{if(A-t<2)return;const[E,R]=e[t],n=6371008.8*Math.cos(R*RADIANS_PER_DEGREE),T=e.slice(t,A+1).map(([e,t])=>[turnBetween(E*RADIANS_PER_DEGREE,e*RADIANS_PER_DEGREE)*n,(t-R)*RADIANS_PER_DEGREE*6371008.8]),I=T.reduce((e,[t])=>e+t,0)/T.length,o=T.reduce((e,[,t])=>e+t,0)/T.length;let r=0,N=0,_=0,S=0,i=0;for(const[C,L]of T){const e=C-I,t=L-o;r+=e*e,N+=e*t,_+=t*t,S+=e*(e*e+t*t),i+=t*(e*e+t*t)}const s=r*_-N*N;if(s<=1e-6*(r+_)**2)return;const O=(S*_-i*N)/(2*s),a=(i*r-S*N)/(2*s);return Math.sqrt(O*O+a*a+(r+_)/T.length)},runFrom=(e,t,A,E,R)=>{let n=A,T=A;for(let I=A+1;I<e.length-1;I++){const A=E*e[I];if(A>E*e[n]&&(n=I),A-E*e[T]>=MIN_PROGRESS&&(T=I),E*e[n]-A>MAX_TURN_BACK)return{last:n,next:n+1};if(t[I]-t[T]>R)return{last:n,next:I}}return{last:n,next:e.length-1}},sharpestPart=({meters:e,turns:t},{sign:A,first:E,last:R},n)=>{let T=0,I=Number.POSITIVE_INFINITY,o=E,r=Number.NEGATIVE_INFINITY;const N={first:E,last:E};for(let _=E;_<=R;_++){const E=T-n*e[_];E<I&&(I=E,o=_),T+=A*t[_];const R=T-n*e[_]-I;R>r&&(r=R,N.first=o,N.last=_)}return N},fittedRadiusOf=(e,t,A,E,R)=>{const{indexes:n}=e,T=(({meters:e,turns:t},A,E,R)=>{const n=.8*Math.abs(R),T=Math.sign(R),I={first:A,last:E};let o=A,r=0;for(let N=A;N<=E;N++){for(r+=T*t[N];o<N&&r-T*t[o]>=n;)r-=T*t[o++];r>=n&&e[N]-e[o]<e[I.last]-e[I.first]&&(I.first=o,I.last=N)}return I})(e,A,E,R),I=T.first===T.last,o=I?Math.max(A,T.first-1):T.first,r=I?Math.min(E,T.last+1):T.last;return fittedRadius(t,n[o],n[r])??fittedRadius(t,n[A],n[E])},headingOf=(e,t,{sign:A,first:E,last:R},n)=>{const{indexes:T,turns:I}=e;let o=0;for(let r=E;r<=R;r++)o+=I[r];return turnsBack(e,E-1,-1,A,n)&&(o+=A*turnWithin(e,t,T[E-1],T[E],-A)),turnsBack(e,R+1,1,A,n)&&(o+=A*turnWithin(e,t,T[R],T[R+1],A)),o},getCurveSections=(e,{minHeadingChangeInDegrees:t=40,maxRadiusInMeters:A=250,maxStraightInMeters:E=Math.max(40,.15*A)}={})=>{const R=e.properties.sections.leg.slice(0,-1).flatMap(e=>e.endPointIndex??[]),{coordinates:n}=e.geometry,T=((e,t)=>{const A=metersAlongLine(e),E=new Int32Array(e.length),R=new Float64Array(e.length);let n=0;for(let r=0;r<e.length;r++){const t=n?A[r]-R[n-1]:Number.POSITIVE_INFINITY;(t>=10||r===e.length-1&&t>0)&&(E[n]=r,R[n++]=A[r])}const T=new Float64Array(n);let I=n>1?bearing(e[E[0]],e[E[1]]):0,o=0;for(let r=1;r<n-1;r++){const A=bearing(e[E[r]],e[E[r+1]]);for(;o<t.length&&t[o]<=E[r-1];)o++;const R=o<t.length&&t[o]<E[r+1];T[r]=R?0:turnBetween(I,A),I=A}return{along:A,indexes:E.subarray(0,n),meters:R.subarray(0,n),turns:T}})(n,R),{along:I,indexes:o,meters:r}=T,N=((e,t)=>{let A=0;return E=>{const R=t[E]-150;for(;A<e.length&&t[e[A].endPointIndex]<R;)A++;let n=0;for(let t=A;t<e.length&&e[t].startPointIndex<=E;t++)n=Math.max(n,e[t].maxSpeedLimitInKmh);return n||80}})(e.properties.sections.speedLimit??[],I),_=(e=>{let t=0;return(A,E)=>{for(;t<e.length&&e[t].pathPointIndex<A;)t++;for(let R=t;R<e.length&&e[R].pathPointIndex<=E;R++){const t=e[R];if(!NO_JUNCTION.test(t.maneuver)&&!followsTheRoad(t))return t.maneuver}}})(e.properties.guidance?.instructions??[]);let S=0;const i=[],s=t*RADIANS_PER_DEGREE;for(const O of(({meters:e,turns:t},A,E)=>{const R=new Float64Array(t.length);for(let I=1;I<t.length;I++)R[I]=R[I-1]+t[I];const n=[];let T=1;for(;T<t.length-1;){if(0===t[T]){T++;continue}const I=t[T]>0?1:-1,o=T,{last:r,next:N}=runFrom(R,e,o,I,A);I*(R[r]-R[o-1])>=E&&n.push({sign:I,first:o,last:r}),T=N}return n})(T,E,s/2)){const{first:e,last:t}=sharpestPart(T,O,1/(2*A)),R=headingOf(T,n,{sign:O.sign,first:e,last:t},E),I=r[e]-r[e-1],o=r[t+1]-r[t],N=(Math.min(I,o,E)+(r[t]-r[e]))/Math.abs(R),_=fittedRadiusOf(T,n,e,t,R)??N,a=Math.max(I<=E?e-1:e,S),C=o<=E?t+1:t;Math.abs(R)<s||_>A||a>=C||(S=C,i.push({start:a,end:C,heading:R,radiusInMeters:_}))}return i.map(({start:e,end:t,heading:A,radiusInMeters:E},R)=>{const n=o[e],T=o[t],I=i[R+1]?.start===t,S=_(n,I?T-1:T);return{id:generateId(),startPointIndex:n,endPointIndex:T,headingChangeInDegrees:A/RADIANS_PER_DEGREE,radiusInMeters:E,lengthInMeters:r[t]-r[e],curvinessScore:curvinessWeight(E)*E*Math.abs(A),severity:severityOf(E,A,N(n),S),...S&&{maneuver:S}}})},isHairpin=e=>!e.maneuver&&Math.abs(e.headingChangeInDegrees)>=140&&e.radiusInMeters<=40,getCurvyStretchSections=(e,{curves:t=e.properties.sections.curve??getCurveSections(e),maxGapInMeters:A=500,minCurveCount:E=3}={})=>{const R=metersAlongLine(e.geometry.coordinates),n=[];let T=[];const I=()=>{const e=T.at(-1);if(e&&T.length>=E){const{startPointIndex:t}=T[0],{endPointIndex:A}=e;n.push({id:generateId(),startPointIndex:t,endPointIndex:A,curveCount:T.length,lengthInMeters:R[A]-R[t],hairpinCount:T.filter(isHairpin).length,minRadiusInMeters:Math.min(...T.map(e=>e.radiusInMeters)),curvinessScore:T.reduce((e,t)=>e+t.curvinessScore,0)})}T=[]};for(const o of t){if(o.maneuver){I();continue}const e=T.at(-1);e&&R[o.startPointIndex]-R[e.endPointIndex]>A&&I(),T.push(o)}return I(),n},withCurveSections=(e,{curve:t,curvyStretch:A}={})=>{const E=getCurveSections(e,t),R=getCurvyStretchSections(e,{...A,curves:E}),{curve:n,curvyStretch:T,...I}=e.properties.sections;return{...e,properties:{...e.properties,sections:{...I,...E.length&&{curve:E},...R.length&&{curvyStretch:R}}}}},bucket=e=>Math.round(1e5*e),vertexHash=(e,t)=>Math.imul(Math.imul(e,2654435761)^t,2246822507),holds=(e,t,A,E,R,n)=>e[t]===A&&e[t+1]===E&&e[t+2]===R&&e[t+3]===n,slotOf=(e,t,A,E,R,n,T)=>{const I=vertexHash(E,R)+vertexHash(n,T);let o=6*((I^I>>>15)&e.length/6-1);for(;e[o+4]&&!holds(e,o,E,R,n,T)&&!holds(e,o,n,T,E,R);)o=(o+6)%e.length;return e[o+4]||(e[o]=E,e[o+1]=R,e[o+2]=n,e[o+3]=T,e[o+4]=t+1,e[o+5]=A),o},getDistinctSections=(e,{minLengthInMeters:t=0}={})=>{const A=Array.isArray(e)?e:e.features,{firsts:E,shared:R}=(e=>{const t=new Int32Array(6*2**Math.ceil(Math.log2(1.5*e.reduce((e,t)=>e+t.length,0)+1))),A=e.map(e=>new Int32Array(Math.max(e.length-1,0))),E=A.map(e=>new Uint8Array(e.length)),R=(e,t)=>{E[e][A[e][t]]=1};return e.forEach((E,n)=>{const T=A[n];let I;const[o=0,r=0]=E[0]??[];let N=bucket(o),_=bucket(r);for(let A=0;A<T.length;A++){const o=N,r=_;if(N=bucket(E[A+1][0]),_=bucket(E[A+1][1]),o===N&&r===_){T[A]=-1;continue}T[A]=A;const S=I&&e[I.route][I.vertex+I.step];if(I&&S&&bucket(S[0])===N&&bucket(S[1])===_){R(n,A),R(I.route,Math.min(I.vertex,I.vertex+I.step)),I.vertex+=I.step;continue}const i=slotOf(t,n,A,o,r,N,_),s=t[i+4]-1,O=t[i+5];if(I=void 0,s===n){T[A]=O;continue}R(n,A),R(s,O);const a=t[i]===o&&t[i+1]===r;I={route:s,vertex:a?O+1:O,step:a?1:-1}}}),{firsts:A,shared:E}})(A.map(e=>e.geometry.coordinates));return A.map((e,A)=>{const n=E[A],T=R[A],I=metersAlongLine(e.geometry.coordinates),o=[];let r;for(let E=0;E<=n.length;E++){if(-1===n[E])continue;if(E<n.length&&!T[n[E]]){r??=E;continue}if(void 0===r)continue;const e=I[E]-I[r];e>=t&&o.push({id:generateId(),startPointIndex:r,endPointIndex:E,lengthInMeters:e}),r=void 0}return o})},viewsNotServed={mapTiles:["CN","RU"],search:["KR","US"],placeDetails:["KR","US"],reverseGeocoding:["KR","US"],geocoding:["AE","BN","CL","DZ","KR","MY","PH","US","VN"]},servesGeopoliticalView=(e,t)=>!viewsNotServed[t].includes(e),TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=e=>!1===e.sendUserAgentHeader?{}:{"tomtom-user-agent":e["tomtom-user-agent"]??"MapsSDKJS/1.0.0-rc.4"},getImportantRoads=(e,{within:t,minLengthInMeters:A=0}={})=>{const E=metersAlongLine(e.geometry.coordinates),R=/* @__PURE__ */new Map,n=[...e.properties.sections.importantRoadStretch??[]].sort((e,t)=>e.startPointIndex-t.startPointIndex);for(const T of n){const e=metersWithin(E,T,t);if(!e)continue;const{index:A,roadNumbers:n=[],streetName:I}=T,o=n[0]??I,r=o??A,N=R.get(r);N?(N.index=Math.min(N.index,A),N.roadNumbers=[.../* @__PURE__ */new Set([...N.roadNumbers,...n])],N.streetName??=I,N.lengthInMeters+=e,N.sections.push(T)):R.set(r,{index:A,...o&&{name:o},roadNumbers:n,...I&&{streetName:I},lengthInMeters:e,sections:[T]})}return[...R.values()].filter(e=>e.lengthInMeters>=A)},getInstructionLanes=(e,t)=>{const A=e.properties.guidance?.instructions??[];if(A.find(e=>e.pathPointIndex===t.pathPointIndex)?.maneuver!==t.maneuver)return;const E=({startPointIndex:t,endPointIndex:E})=>{const R=A.findLast(({pathPointIndex:e})=>t<=e&&e<=E);if(R)return R.pathPointIndex;const n=A.find(({pathPointIndex:e})=>e>E),T=e.geometry.coordinates[E];return n&&T&&distance(T,n.maneuverPoint,{units:"meters"})<=100?n.pathPointIndex:void 0};let R;for(const n of e.properties.sections.lanes??[])(!R||n.endPointIndex>R.endPointIndex)&&E(n)===t.pathPointIndex&&(R=n);return R},serviceLanguageCodes={"zh-Hans":"zh-CN","zh-Hant":"zh-TW"},serviceLanguage=e=>serviceLanguageCodes[e]??e,placesLanguageCodes={ngt:void 0,"en-CA":"en-GB","es-MX":"es-419","hi-IN":void 0,"ja-JP":void 0},placesLanguage=e=>Object.hasOwn(placesLanguageCodes,e)?placesLanguageCodes[e]:serviceLanguage(e),poiCategoriesLanguage=e=>"ngt-Latn"===e?void 0:placesLanguage(e),trafficIncidentLanguages={ngt:void 0,"ngt-Latn":void 0,ar:"ar","bg-BG":void 0,"ca-ES":"ca-ES","zh-Hant":"zh-TW","zh-Hans":void 0,"hr-HR":void 0,"cs-CZ":"cs-CZ","da-DK":"da-DK","nl-NL":"nl-NL","en-AU":"en-GB","en-CA":"en-GB","en-GB":"en-GB","en-NZ":"en-GB","en-US":"en-US","et-EE":"et-EE","eu-ES":void 0,"fi-FI":"fi-FI","fr-FR":"fr-FR","gl-ES":void 0,"de-DE":"de-DE","el-GR":"el-GR","he-IL":"he-IL","hi-IN":void 0,"hu-HU":"hu-HU","id-ID":"id-ID","it-IT":"it-IT","ja-JP":"ja-JP","kk-KZ":void 0,"ko-KR":"ko-KR","ko-Latn-KR":void 0,"lv-LV":"lv-LV","lt-LT":"lt-LT","ms-MY":void 0,"nb-NO":"nb-NO","pl-PL":"pl-PL","pt-BR":"pt-PT","pt-PT":"pt-PT","ro-RO":"ro-RO","ru-RU":"ru-RU","ru-Latn-RU":void 0,"ru-Cyrl-RU":"ru-RU","sr-RS":void 0,"sk-SK":"sk-SK","sl-SI":void 0,"es-ES":"es-ES","es-MX":"es-ES","sv-SE":"sv-SE","th-TH":"th-TH","tr-TR":"tr-TR","uk-UA":void 0},trafficIncidentLanguage=e=>e&&trafficIncidentLanguages[e],poiCategoriesToID={TRAFFIC_CONTROL_DEPARTMENT:7301,TRAFFIC_CONTROL_DEPARTMENT_GENERIC:7301002,TRAIL_SYSTEM:7302,MOUNTAIN_BIKE_TRAIL:7302002,ADVENTURE_VEHICLE_TRAIL:7302003,HIKING_TRAIL:7302004,HORSE_RIDING_TRAIL:7302005,ROCK_CLIMBING_TRAIL:7302006,RESIDENTIAL_ACCOMMODATION:7303,RETIREMENT_COMMUNITY:7303002,FLATS_OR_APARTMENT_COMPLEX:7303003,HOLIDAY_RENTAL:7304,COTTAGE_RENTAL:7304002,VILLA_RENTAL:7304003,BUNGALOW_RENTAL:7304004,CHALET_RENTAL:7304005,APARTMENT_RENTAL:7304006,ADVENTURE_SPORTS_FACILITY:7305,HELIPORT_OR_HELIPAD:7308,CHARGING_LOCATION:7309,VEHICLE_REPAIR:7310,BODYSHOP:7310002,CAR_GLASS_REPLACEMENT_SHOP:7310003,CAR_REPAIR_AND_SERVICE:7310004,TIRE_SERVICE:7310007,MOTORCYCLE_REPAIR:7310008,TRUCK_REPAIR_AND_SERVICE:7310009,FUEL_STATION:7311,CAR_RENTAL:7312,PARKING_GARAGE:7313,HOTEL_OR_MOTEL:7314,BANDB_OR_GUEST_HOUSE:7314002,HOTEL:7314003,HOSTEL:7314004,RESORT:7314005,MOTEL:7314006,CABINS_LODGES:7314007,REST_CAMP:7314008,RESTAURANT:7315,AFRICAN_RESTAURANT:7315002,AMERICAN_RESTAURANT:7315003,AUSTRIAN_RESTAURANT:7315004,BARBECUE_RESTAURANT:7315005,BELGIAN_RESTAURANT:7315006,BISTRO:7315007,BRITISH_RESTAURANT:7315008,CALIFORNIAN_RESTAURANT:7315009,CANADIAN_RESTAURANT:7315010,CARIBBEAN_RESTAURANT:7315011,CHINESE_RESTAURANT:7315012,CREPERIE:7315013,DUTCH_RESTAURANT:7315014,FAST_FOOD:7315015,PHILIPPINE_RESTAURANT:7315016,FRENCH_RESTAURANT:7315017,GERMAN_RESTAURANT:7315018,GREEK_RESTAURANT:7315019,GRILL_RESTAURANT:7315020,HAWAIIAN_RESTAURANT:7315021,HUNGARIAN_RESTAURANT:7315022,INDIAN_RESTAURANT:7315023,INDONESIAN_RESTAURANT:7315024,ITALIAN_RESTAURANT:7315025,JAPANESE_RESTAURANT:7315026,JEWISH_RESTAURANT:7315027,KOREAN_RESTAURANT:7315028,LATIN_AMERICAN_RESTAURANT:7315029,LEBANESE_RESTAURANT:7315030,MEDITERRANEAN_RESTAURANT:7315032,MEXICAN_RESTAURANT:7315033,MIDDLE_EASTERN_RESTAURANT:7315034,ORIENTAL_RESTAURANT:7315035,PIZZERIA:7315036,POLISH_RESTAURANT:7315037,PORTUGUESE_RESTAURANT:7315038,RUSSIAN_RESTAURANT:7315040,SANDWICH_RESTAURANT:7315042,SEAFOOD:7315043,SPANISH_RESTAURANT:7315044,STEAK_HOUSE:7315045,SWISS_RESTAURANT:7315047,THAI_RESTAURANT:7315048,TURKISH_RESTAURANT:7315049,VEGETARIAN_RESTAURANT:7315050,VIETNAMESE_RESTAURANT:7315051,HUNAN_RESTAURANT:7315052,SHANDONG_RESTAURANT:7315053,SICHUAN_RESTAURANT:7315056,DONGBEI_RESTAURANT:7315057,HOT_POT_RESTAURANT:7315058,TAIWANESE_RESTAURANT:7315059,WESTERN_RESTAURANT:7315060,PERUVIAN_RESTAURANT:7315061,ASIAN_RESTAURANT:7315062,CREOLE_RESTAURANT:7315063,SOUL_FOOD:7315064,IRISH_RESTAURANT:7315065,JAMAICAN_RESTAURANT:7315066,KOSHER_RESTAURANT:7315067,CZECH_RESTAURANT:7315068,HAMBURGER_RESTAURANT:7315069,CHICKEN_RESTAURANT:7315070,FUSION_RESTAURANT:7315071,BRAZILIAN_RESTAURANT:7315072,INTERNATIONAL_RESTAURANT:7315073,MOROCCAN_RESTAURANT:7315074,ORGANIC_FOOD_RESTAURANT:7315075,TAPAS_RESTAURANT:7315076,ICE_CREAM_PARLOR:7315078,DOUGHNUT_RESTAURANT:7315079,AFGHAN_RESTAURANT:7315081,ARABIAN_RESTAURANT:7315083,ARMENIAN_RESTAURANT:7315085,AUSTRALIAN_RESTAURANT:7315086,BASQUE_RESTAURANT:7315087,BOLIVIAN_RESTAURANT:7315088,BULGARIAN_RESTAURANT:7315090,BURMESE_RESTAURANT:7315091,CAMBODIAN_RESTAURANT:7315092,CHILEAN_RESTAURANT:7315093,COLOMBIAN_RESTAURANT:7315094,CORSICAN_RESTAURANT:7315095,CUBAN_RESTAURANT:7315096,DANISH_RESTAURANT:7315098,EGYPTIAN_RESTAURANT:7315100,ENGLISH_RESTAURANT:7315101,ETHIOPIAN_RESTAURANT:7315102,FINNISH_RESTAURANT:7315104,IRANIAN_RESTAURANT:7315105,ISRAELI_RESTAURANT:7315106,MONGOLIAN_RESTAURANT:7315110,NEPALESE_RESTAURANT:7315111,NORWEGIAN_RESTAURANT:7315112,SCANDINAVIAN_RESTAURANT:7315114,SWEDISH_RESTAURANT:7315119,SYRIAN_RESTAURANT:7315120,TEPPANYAKI_RESTAURANT:7315121,TIBETAN_RESTAURANT:7315122,TUNISIAN_RESTAURANT:7315123,VENEZUELAN_RESTAURANT:7315125,PAKISTANI_RESTAURANT:7315127,FONDUE_RESTAURANT:7315134,SNACKS_RESTAURANT:7315139,SOUP_RESTAURANT:7315140,BUFFET_RESTAURANT:7315142,SALAD_BAR:7315143,TAKEOUT_FOOD:7315145,BANQUET_ROOMS:7315146,CAFETERIA:7315147,SUSHI_RESTAURANT:7315148,JUICE_BAR:7315149,TOURIST_INFORMATION:7316,MUSEUM:7317,THEATER:7318,CONCERT_HALL:7318002,MUSIC_CENTER:7318003,OPERA_HOUSE:7318004,THEATER_GENERIC:7318005,CABARET_THEATER:7318006,AMPHITHEATER:7318007,DINNER_THEATER:7318008,CULTURAL_CENTER:7319,SPORTS_CENTER:7320,FITNESS_CLUB_AND_CENTER:7320002,HORSE_RIDING:7320003,SPORTS_CENTER_GENERIC:7320004,THEMATIC_SPORT_CENTER:7320005,SQUASH_COURT:7320006,HOSPITAL:7321,GENERAL_HOSPITAL_AND_POLYCLINIC:7321002,SPECIAL_HOSPITAL:7321003,HOSPITAL_OF_CHINESE_MEDICINE:7321004,HOSPITAL_FOR_WOMEN_AND_CHILDREN:7321005,POLICE_STATION:7322,POST_OFFICE:7324,PHARMACY:7326,DEPARTMENT_STORE:7327,BANK:7328,MARKETPLACE:7332,INFORMAL_MARKET:7332002,PUBLIC_MARKET:7332003,FARMERS_MARKET:7332004,SUPERMARKET:7332005,AGRICULTURE:7335,HORTICULTURE:7335002,PRIMARY_PRODUCER:7335003,FARM:7335004,VIEWPOINT:7337,SWIMMING_POOL:7338,RELIGIOUS_SITE:7339,CHURCH:7339002,MOSQUE:7339003,SYNAGOG:7339004,TEMPLE:7339005,GURUDWARA:7339006,PAGODA:7339008,CASINO_AND_GAMBLING:7341,CINEMA:7342,MOVIE_THEATER:7342002,DRIVE_IN_MOVIES:7342003,MARINA:7347,MARINA_GENERIC:7347002,YACHT_BASIN:7347003,WINERY:7349,FERRY_TERMINAL:7352,TRUCK_STOP:7358,WEIGH_STATION:7359,WEIGH_STATION_GENERIC:7359002,CAMPING_GROUND:7360,RECREATIONAL_CAMPING_GROUND:7360002,CARAVAN_SITE:7360003,COMMUNITY_CENTER:7363,EMBASSY:7365,BORDER_CONTROL:7366,GOVERNMENT_OFFICE:7367,MOTORING_ORGANIZATION_OFFICE:7368,OPEN_CAR_PARKING_AREA:7369,OPEN_CAR_PARKING_AREA_GENERIC:7369002,SCHOOL:7372,SCHOOL_GENERIC:7372002,CHILDCARE:7372003,PRE_SCHOOL:7372004,PRIMARY_SCHOOL:7372005,HIGH_SCHOOL:7372006,SENIOR_HIGH_SCHOOL:7372007,VOCATIONAL_SCHOOL:7372008,LANGUAGE_SCHOOL:7372010,ART_SCHOOL:7372012,MIDDLE_SCHOOL:7372014,DRIVING_SCHOOL:7372016,MALL:7373,STADIUM:7374,ATHLETICS_TRACK:7374002,CRICKET_GROUND:7374003,SOCCER_STADIUM:7374004,HORSE_RACING_TRACK:7374005,MULTI_PURPOSE_STADIUM:7374006,RUGBY_GROUND:7374007,ICE_HOCKEY_ARENA:7374008,BASEBALL_PARK:7374009,FOOTBALL_STADIUM:7374010,MOTOR_RACING_STADIUM:7374011,BASKETBALL_ARENA:7374012,RACE_TRACK:7374013,NETBALL_STADIUM:7374014,TOLL_GATE:7375,TOURIST_ATTRACTION:7376,BUILDING:7376002,MONUMENT:7376003,NATURAL_TOURIST_ATTRACTION:7376004,OBSERVATORY:7376005,PLANETARIUM:7376006,DAM:7376007,TUNNEL:7376008,TOWER:7376009,BRIDGE:7376010,MAUSOLEUM_OR_GRAVE:7376011,ARCH:7376012,STATUE:7376013,WATER_HOLE:7376014,COLLEGE_OR_UNIVERSITY:7377,COLLEGE_OR_UNIVERSITY_GENERIC:7377002,JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:7377003,BUSINESS_PARK:7378,RAILWAY_STATION:7380,INTERNATIONAL_RAILROAD_STATION:7380002,NATIONAL_RAILROAD_STATION:7380003,URBAN_STATION:7380004,SUBWAY_STATION:7380005,AIRPORT:7383,PUBLIC_AIRPORT:7383002,PRIVATE_AIRPORT:7383003,MILITARY_AIRPORT:7383004,AIRFIELD:7383005,COURIER_DROP_BOX:7388,TRANSPORT_ACCESS:7389,AIRLINE_ACCESS:7389002,STATION_ACCESS:7389003,SECURED_ENTRANCE:7389004,SUBWAY_ENTRANCE:7389999,EMERGENCY_MEDICAL_SERVICE:7391,FIRE_STATION:7392,REST_AREA:7395,ATM:7397,NATURAL_FEATURE:8099,MOUNTAIN_PEAK:8099002,CAVE:8099003,RIDGE:8099004,DUNE:8099005,VALLEY:8099006,PLAIN_OR_FLAT:8099007,PLATEAU:8099008,PAN:8099009,WELL:8099010,OASIS:8099011,ROCKS:8099012,RESERVOIR:8099013,REEF:8099014,RAPIDS:8099015,BAY:8099016,COVE:8099017,HARBOR:8099018,CAPE:8099020,MINERAL_OR_HOT_SPRINGS:8099021,ISLAND:8099022,MARSH:8099023,RIVER_CROSSING:8099024,HILL:8099025,QUARRY:8099026,LOCALE:8099027,PRIMARY_RESOURCE_UTILITY:9150,TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:9151,NON_GOVERNMENTAL_ORGANIZATION:9152,WELFARE_ORGANIZATION:9153,PRISON:9154,CAR_WASH:9155,CAR_WASH_GENERIC:9155002,MANUFACTURING_FACILITY:9156,RESEARCH_FACILITY:9157,MEDIA_FACILITY:9158,PORT_WAREHOUSE_FACILITY:9159,EXCHANGE:9160,STOCK_EXCHANGE:9160002,GOLD_EXCHANGE:9160003,FOREIGN_EXCHANGE:9160004,COMPANY:9352,SERVICE_COMPANY:9352002,ADVERTISING_COMPANY:9352003,COMPUTER_AND_DATA_SERVICES:9352004,SOFTWARE_COMPANY:9352005,DIVERSIFIED_FINANCIALS:9352006,INSURANCE_COMPANY:9352007,DELIVERY_SERVICE:9352008,REAL_ESTATE_COMPANY:9352009,MANUFACTURING_COMPANY:9352011,AGRICULTURAL_TECHNOLOGY:9352012,AUTOMOBILE_COMPANY:9352013,CHEMICAL_COMPANY:9352014,ELECTRONICS_COMPANY:9352015,MECHANICAL_ENGINEERING:9352016,PHARMACEUTICAL_COMPANY:9352018,PUBLISHING_TECHNOLOGIES:9352019,TELECOMMUNICATIONS:9352020,TAX_SERVICES:9352022,LEGAL_SERVICES:9352023,TRANSPORT_COMPANY:9352024,BUS_CHARTER_COMPANY:9352025,TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:9352026,BUS_LINES:9352027,SCHOOL_BUS_COMPANY:9352028,CLEANING_SERVICES:9352029,OIL_AND_NATURAL_GAS:9352030,MINING_COMPANY:9352031,CONSTRUCTION_COMPANY:9352032,MOVING_AND_STORAGE_COMPANY:9352033,AIRLINE_COMPANY:9352034,FUNERAL_SERVICE_AND_MORTUARIES:9352036,INVESTMENT_ADVISOR:9352037,EQUIPMENT_RENTAL:9352038,BUSINESS_SERVICES:9352039,CABLE_AND_TELEPHONE_COMPANY:9352040,AUTOMOBILE_MANUFACTURING:9352041,IMPORT_OR_EXPORT_AND_DISTRIBUTION:9352042,CATERING_SERVICES:9352043,HOME_APPLIANCE_REPAIR:9352044,ANIMAL_SHELTER:9352045,WEDDING_SERVICES:9352046,BEACH:9357,RESTAURANT_AREA:9359,ICE_RINK:9360,SHOP_OR_STORE:9361,BOOK_SHOP:9361002,C_DS_DVD_VIDEOS:9361003,CHILDREN_S_CLOTHES:9361004,FOOTWEAR_SHOE_REPAIRS:9361005,CLOTHING_SHOP:9361006,MEN_S_CLOTHING:9361007,WOMEN_S_CLOTHING:9361008,CONVENIENCE_STORE:9361009,DRY_CLEANER:9361010,CAMERAS_AND_PHOTOGRAPHY:9361011,COMPUTER_AND_COMPUTER_SUPPLIES:9361012,CONSUMER_ELECTRONICS:9361013,OFFICE_EQUIPMENT:9361014,REAL_ESTATE_AGENT:9361015,FACTORY_OUTLET:9361016,FLORISTS:9361017,BAKERY:9361018,BUTCHER:9361019,FISHMONGER:9361020,FOOD_MARKET:9361021,GREENGROCER:9361022,GROCERY_STORE:9361023,FOOD_AND_DRINKS_SHOP:9361024,WINE_SPIRITS:9361025,GIFTS_CARDS_NOVELTIES_SOUVENIRS:9361026,HAIRDRESSER:9361027,CARPET_FLOOR_COVERINGS:9361028,CURTAINS_TEXTILES:9361029,DO_IT_YOURSELF_CENTERS:9361030,HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:9361031,GARDEN_CENTERS_SERVICES:9361032,KITCHENS_BATHROOMS:9361033,LIGHTING_SHOPS:9361034,PAINTING_DECORATING:9361035,JEWELRY_CLOCKS_WATCHES:9361036,NEWSAGENTS_TOBACCONISTS:9361037,OPTICIAN:9361038,SPORTS_EQUIPMENT_AND_CLOTHING:9361039,TOYS_GAMES_SHOP:9361040,TRAVEL_AGENT:9361041,CONSTRUCTION_MATERIAL_AND_EQUIPMENT:9361042,MEDICAL_SUPPLIES_EQUIPMENT:9361043,VIDEO_RENTAL_SHOP:9361044,LAUNDRY:9361045,PHOTO_LAB_OR_DEVELOPMENT:9361046,PHOTOCOPY_SHOP:9361047,ANIMAL_SERVICE:9361048,ANTIQUE_ART_SHOP:9361049,BEAUTY_SUPPLIES:9361050,DRUG_STORE:9361051,ELECTRICAL_APPLIANCES_SHOP:9361052,HOBBY_SHOP:9361053,FURNITURE_HOME_FURNISHINGS:9361054,GLASSWARE_CERAMIC_SHOP:9361055,LOCAL_SPECIALITIES_SHOP:9361056,RECYCLING_SHOP:9361057,BAGS_LEATHERWEAR:9361058,MUSIC_INSTRUMENTS_STORE:9361059,DELICATESSEN:9361060,SPECIALTY_FOODS:9361061,SHOPPING_SERVICE:9361062,RETAIL_OUTLET:9361063,PET_SUPPLIES:9361064,WHOLESALE_CLUB:9361066,BEAUTY_SALON:9361067,NAIL_SALON:9361068,HARDWARE_STORE:9361069,PAWN_SHOP:9361070,LOTTERY_SHOP:9361071,BETTING_STATION:9361072,AGRICULTURAL_SUPPLIES:9361073,MOBILE_PHONE_SHOP:9361075,DRIVE_THROUGH_BOTTLE_SHOP:9361076,TAILOR_SHOP:9361077,SECURITY_PRODUCTS:9361078,SPECIALTY_CLOTHING_SHOP:9361079,GLASS_WINDOWS_STORE:9361080,VARIETY_STORE:9361081,CHRISTMAS_OR_HOLIDAY_SHOP:9361082,BOATING_EQUIPMENT_AND_ACCESSORIES:9361083,PARK_AND_RECREATION_AREA:9362,BATTLEFIELD:9362002,CEMETERY:9362003,HISTORIC_SITE:9362004,HISTORICAL_PARK:9362005,MEMORIAL:9362007,PARK:9362008,PARKWAY:9362009,RECREATION_AREA:9362011,WILDERNESS_AREA:9362014,FOREST_AREA:9362015,FISHING_AND_HUNTING_AREA:9362016,FAIRGROUND:9362017,SKI_RESORT:9362026,BOAT_LAUNCHING_RAMP:9362032,PICNIC_AREA:9362033,PROTECTED_LAND:9362037,COURTHOUSE:9363,CANNABIS_SHOP:9364,MEDICINAL_MARIJUANA_DISPENSARY:9364002,RECREATIONAL_MARIJUANA_DISPENSARY:9364003,MEDICINAL_AND_RECREATIONAL_DISPENSARY:9364004,TENNIS_COURT:9369,WATER_SPORT:9371,DOCTOR:9373,GENERAL_PRACTITIONER:9373002,SPECIALIST:9373003,DENTIST:9374,VETERINARY:9375,CAFE_PUB:9376,CAFE:9376002,PUB:9376003,INTERNET_CAFE:9376004,TEA_HOUSE:9376005,COFFEE_SHOP:9376006,MICROBREWERY:9376007,EXHIBITION_CONVENTION_CENTER:9377,LEISURE_CENTER:9378,BOWLING_CENTER:9378002,DANCE_STUDIO_AND_SCHOOL:9378003,FLYING_CLUB:9378004,SAUNA_SOLARIUM_MASSAGE:9378005,NIGHTLIFE:9379,DISCO_CLUB:9379002,BAR:9379004,COCKTAIL_BAR:9379006,JAZZ_CLUB:9379008,COMEDY_CLUB:9379009,KARAOKE_CLUB:9379010,COMMERCIAL_BUILDING:9382,INDUSTRIAL_BUILDING:9383,ABORIGINAL_LAND:9389,HEALTHCARE_SERVICE:9663,PERSONAL_SERVICE:9663002,PERSONAL_CARE_FACILITY:9663003,BLOOD_BANK:9663004,AMBULANCE_UNIT:9663005,ENTERTAINMENT:9900,AMUSEMENT_PARK:9902,AMUSEMENT_PARK_GENERIC:9902003,AMUSEMENT_PLACE:9902004,VEHICLE_DEALER:9910,CAR_DEALER:9910002,MOTORCYCLE_DEALER:9910003,BOAT_DEALER:9910004,RECREATIONAL_VEHICLE_DEALER:9910005,TRUCK_DEALER:9910006,VAN_DEALER:9910007,BUS_DEALER:9910008,ATV_DEALER:9910009,GOLF_COURSE:9911,PUBLIC_LIBRARY:9913,ZOOS_ARBORETA_BOTANICAL_GARDEN:9927,ARBORETA_AND_BOTANICAL_GARDENS:9927002,ZOO:9927003,AQUATIC_ZOO:9927004,WILDLIFE_PARK:9927005,RENTAL_CAR_PARKING:9930,PUBLIC_AMENITY:9932,PASSENGER_TRANSPORT_TICKET_OFFICE:9932002,PEDESTRIAN_SUBWAY:9932003,PUBLIC_CALL_BOX:9932004,PUBLIC_BATHROOM:9932005,RESCUE_SERVICE:9932006,MOUNTAIN_PASS:9935,CLUB_AND_ASSOCIATION:9937,BEACH_CLUB:9937002,HOCKEY_CLUB:9937003,PUBLIC_TRANSPORT_STOP:9942,BUS_STOP:9942002,TAXI_STAND:9942003,STREETCAR_STOP:9942004,EMERGENCY_ROOM:9956,RESIDENTIAL_ENTRANCE:9999},poiIDsToCategories=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(poiCategoriesToID).map(([e,t])=>[t,e])))(),getRoutePlanningLocationType=e=>Array.isArray(e)?Array.isArray(e[0])?"path":"waypoint":"Feature"===e.type&&"LineString"===e.geometry.type?"path":"waypoint",sdkErrorCodeForStatus=e=>401===e?"INVALID_CREDENTIALS":403===e?"INSUFFICIENT_PERMISSIONS":404===e?"NOT_FOUND":429===e?"RATE_LIMITED":e>=500?"LIVE_SERVICE_NOT_AVAILABLE":e>=400?"INVALID_REQUEST":"INTERNAL",retryableCodes=/* @__PURE__ */new Set(["RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE"]),canRetrySDKErrorCode=e=>retryableCodes.has(e),getSectionsWithin=(e,{within:t,types:A=sectionTypes}={})=>{const E=metersAlongLine(e.geometry.coordinates),R={};for(const n of A){const A=e.properties.sections[n]??[],T=[],I=[];let o=0;for(const e of A){const{startPointIndex:A=0,endPointIndex:R=0}=e,n=metersWithin(E,{startPointIndex:A,endPointIndex:R},t);n>0&&(T.push(e),I.push(n/(E[R]-E[A])),o+=n)}T.length&&(R[n]={sections:T,shares:I,lengthInMeters:o})}return R},compareRoutes=(e,t,{types:A=inputSectionTypesWithGuidance}={})=>{const[E,R]=getDistinctSections([e,t]);return{distinct:E,referenceDistinct:R,adds:getSectionsWithin(e,{within:E,types:A}),avoids:getSectionsWithin(t,{within:R,types:A})}},indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategoryMap={1:"accident",2:"fog",3:"danger",4:"rain",5:"frost",6:"jam",7:"lane-closed",8:"road-closed",9:"roadworks",10:"wind",11:"flooding",12:"animals-on-road",13:"narrow-lanes",14:"broken-down-vehicle"},categoryToIconMap=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(iconCategoryMap).map(([e,t])=>[t,Number(e)])))(),iconToTrafficIncidentCategory=e=>iconCategoryMap[e]??"other",trafficIncidentToIconCategory=e=>categoryToIconMap[e]??0,minuteUnits=e=>e?.minutes??"min",formatDuration=(e,t)=>{if(e){const E=Math.abs(e)/3600;let R=Math.floor(E),n=Math.round(E%1*60);60===n&&(n=0,R++);const T={...TomTomConfig.instance.get().displayUnits?.time,...t};if(R)return`${R} ${A=T,A?.hours??"hr"} ${n.toString().padStart(2,"0")} ${minuteUnits(T)}`;if(n)return`${n.toString()} ${minuteUnits(T)}`}var A},MILE_IN_METERS=1609.344,meterUnits=e=>e?.meters??"m",kmUnits=e=>e?.kilometers??"km",roundHalfAwayFromZero=e=>Math.sign(e)*Math.round(Math.abs(e)),formatFeet=(e,t)=>{const A=t.feet??"ft",E=e/.3048,R=Math.abs(E);return R<30?`${roundHalfAwayFromZero(E)} ${A}`:R<500?`${10*roundHalfAwayFromZero(E/10)} ${A}`:`${100*roundHalfAwayFromZero(E/100)} ${A}`},formatYards=(e,t)=>{const A=t.yards??"yd",E=e/.9144;return Math.abs(E)<10?`${roundHalfAwayFromZero(E)} ${A}`:`${10*roundHalfAwayFromZero(E/10)} ${A}`},QUARTER_MILE_GLYPHS=["","¼","½","¾"],formatImperial=(e,t,A)=>{const E=e/1609.344;return Math.abs(E)<.125?A(e,t):((e,t)=>{const A=Math.abs(e);if(A>=10)return`${roundHalfAwayFromZero(e)} ${t}`;const E=A<3?1:2,R=Number.parseInt(A.toString()),n=Math.round(4*(A-R)/E)*E,T=e<0?"-":"";return n%4?`${T}${R||""}${QUARTER_MILE_GLYPHS[n]} ${t}`:`${T}${R+n/4} ${t}`})(E,t.miles??"mi")},formatDistance=(e,t)=>{if(isNil(e))return"";const A={...TomTomConfig.instance.get().displayUnits?.distance,...t};switch(A?.type??"metric"){case"metric":return((e,t)=>{const A=Math.abs(e);if(A<10)return`${roundHalfAwayFromZero(10*e)/10} ${meterUnits(t)}`;if(A<500)return`${10*roundHalfAwayFromZero(e/10)} ${meterUnits(t)}`;if(A<1e3){const A=100*roundHalfAwayFromZero(e/100);return 1e3===A||-1e3===A?`${e<0?"-":""}1 ${kmUnits(t)}`:`${A} ${meterUnits(t)}`}return A<1e4?`${100*roundHalfAwayFromZero(e/100)/1e3} ${kmUnits(t)}`:`${roundHalfAwayFromZero(e/1e3)} ${kmUnits(t)}`})(e,A);case"imperial_us":return formatImperial(e,A,formatFeet);case"imperial_uk":return formatImperial(e,A,formatYards)}};export{DEFAULT_COMMON_BASE_URL,EARTH_RADIUS_IN_METERS,MAX_MERCATOR_LATITUDE,MILE_IN_METERS,RADIANS_PER_DEGREE,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,aggregateIntoCells,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxLongitudeSpan,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,canRetrySDKErrorCode,chargingPointCapabilities,chargingPointRestrictions,clamp,compareRoutes,connectorTypes,currentTypes,defaultConfig,defaultSectionTypes,definedFields,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geometrySectionTypes,geopoliticalViews,getCoordinateAtRouteProgress,getCurveSections,getCurvyStretchSections,getDistinctSections,getImportantRoads,getInstructionLanes,getPosition,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,getSectionOverlap,getSectionsWithin,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,insecureBaseURLMessage,isBBoxWithArea,isHairpin,isProxyCredentialsMode,isSecureBaseURL,languages,latticeCellOf,latticeCellPolygon,mergeFromGlobal,metersAlongLine,metersWithin,pickKeys,placeTypes,placesLanguage,poiCategories,poiCategoriesLanguage,poiCategoriesToID,poiIDsToCategories,polygonFromBBox,positionBetween,sdkErrorCodeForStatus,sdkErrorCodes,sectionTypes,segmentAtMeters,servesGeopoliticalView,serviceLanguage,toPointGeometry,trafficIncidentLanguage,trafficIncidentRequestCategories,trafficIncidentTimeValidities,trafficIncidentToIconCategory,withCurveSections,withInsertedWaypoint,withInsertedWaypoints};
|
|
1
|
+
import{booleanPointInPolygon,distance,length,lengthToDegrees,nearestPointOnLine}from"@turf/turf";import{get,isNil,mean,sum}from"lodash-es";var instance,definedFields=e=>Object.fromEntries(Object.entries(e??{}).filter(([,e])=>void 0!==e)),pickKeys=(e,t)=>Object.fromEntries(t.filter(t=>t in e).map(t=>[t,e[t]])),DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultRetryConfig={initialWaitMs:447,backoffFactor:1.618,timeoutMs:4e4},defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:defaultRetryConfig},withRetryDefaults=(...e)=>e.reduce((e,t)=>({...e,...definedFields(t)}),{...defaultRetryConfig}),copyOfDefaultConfig=()=>({...defaultConfig,retry:withRetryDefaults()}),TomTomConfig=class TomTomConfig{static get instance(){return instance??=new TomTomConfig,instance}constructor(){this.config=copyOfDefaultConfig()}put(e){this.config={...this.config,...e,...e.retry&&{retry:withRetryDefaults(e.retry)}}}reset(){this.config=copyOfDefaultConfig()}get(){return this.config}},mergeFromGlobal=(e={})=>{const t=TomTomConfig.instance.get(),A={...t,...e};return{...A,retry:A.retry&&withRetryDefaults(t.retry,e.retry)}},isProxyCredentialsMode=(e=TomTomConfig.instance.get())=>!e.apiKey&&"https://api.tomtom.com"!==(e.commonBaseURL??"https://api.tomtom.com"),setApiKeyParameter=(e,t)=>{t&&e.set("key",t)},LOOPBACK_IPV4=/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,isSecureBaseURL=e=>{let t;try{t=new URL(e)}catch{return!0}if("https:"===t.protocol)return!0;const{hostname:A}=t;return"http:"===t.protocol&&("localhost"===A||A.endsWith(".localhost")||"[::1]"===A||LOOPBACK_IPV4.test(A))},insecureBaseURLMessage=e=>`commonBaseURL ${e} is not https:, so requests to it would carry the API key, or a proxy's session cookie, in the clear; only loopback addresses may use http:.`,geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],languages=["ngt","ngt-Latn","ar","eu-ES","bg-BG","ca-ES","zh-Hant","zh-Hans","hr-HR","cs-CZ","da-DK","nl-NL","en-AU","en-CA","en-GB","en-NZ","en-US","et-EE","fi-FI","fr-FR","gl-ES","de-DE","el-GR","he-IL","hi-IN","hu-HU","id-ID","it-IT","ja-JP","kk-KZ","ko-KR","ko-Latn-KR","lv-LV","lt-LT","ms-MY","nb-NO","pl-PL","pt-BR","pt-PT","ro-RO","ru-RU","ru-Latn-RU","ru-Cyrl-RU","sr-RS","sk-SK","sl-SI","es-ES","es-MX","sv-SE","th-TH","tr-TR","uk-UA"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PARK_GENERIC","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CAR_WASH_GENERIC","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLLEGE_OR_UNIVERSITY_GENERIC","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARINA_GENERIC","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPEN_CAR_PARKING_AREA_GENERIC","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SCHOOL_GENERIC","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_CENTER_GENERIC","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEATER_GENERIC","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAFFIC_CONTROL_DEPARTMENT_GENERIC","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WEIGH_STATION_GENERIC","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km"},avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],geometrySectionTypes=["curve","curvyStretch"],apiSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],defaultSectionTypes=/* @__PURE__ */(()=>[...apiSectionTypes,"lanes"])(),inputSectionTypes=/* @__PURE__ */(()=>[...apiSectionTypes,...geometrySectionTypes])(),inputSectionTypesWithGuidance=/* @__PURE__ */(()=>[...inputSectionTypes,"lanes"])(),sectionTypes=/* @__PURE__ */(()=>[...inputSectionTypesWithGuidance,"leg","distinct"])(),sdkErrorCodes=["INVALID_REQUEST","INSECURE_BASE_URL","INVALID_CREDENTIALS","INSUFFICIENT_PERMISSIONS","NOT_FOUND","RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE","ABORTED","WEBGL_UNSUPPORTED","WEBGL_CONTEXT_LOST","STYLE_LOAD_FAILED","INTERNAL"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=/* @__PURE__ */(()=>[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"])(),trafficIncidentTimeValidities=["present","future"],clamp=(e,t,A)=>Math.max(t,Math.min(e,A)),wrapDegrees=e=>(e%360+360)%360,getPositionEntryPointOptions=["main-when-available","ignore"],MAX_MERCATOR_LATITUDE=85.051129,clampLatitude=e=>clamp(e,-85.051129,85.051129),wrapLongitude=e=>e>180||e<-180?e-360*Math.round(e/360):e,getPosition=(e,t)=>{if(e){if(Array.isArray(e))return e;if("coordinates"in e)return e.coordinates;if(e.geometry)return"main-when-available"===t?.useEntryPoint?(e=>{const t=e.properties?.entryPoints;return t?.find(e=>"main"===e.type)??t?.find(e=>!e.type)})(e)?.position??e.geometry.coordinates:e.geometry.coordinates}return null},getPositionStrict=(e,t)=>{const A=getPosition(e,t);if(!A)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(e)}`);return A},withNearestLongitude=(e,t)=>{const[A,...E]=t,R=Math.round((A-e[0])/360);return R?[A-360*R,...E]:t},toPointGeometry=e=>({type:"Point",coordinates:e}),isBBoxWithArea=e=>!!e&&e.length>=4&&e[3]!==e[1]&&e[2]!==e[0],bboxOnlyIfWithArea=e=>isBBoxWithArea(e)?e:void 0,unwrappedEast=([e,,t])=>e>t?t+360:t,bboxLongitudeSpan=e=>unwrappedEast(e)-e[0],toBBox=(e,t,A,E)=>e<=A?[e,t,A,E]:180===e?[-180,t,A,E]:[e,t,-180===A?180:A,E],bboxFromBBoxes=e=>{const t=e?.filter(e=>!!e)??[];if(t.length<=1)return t[0];let A=Number.POSITIVE_INFINITY,E=Number.NEGATIVE_INFINITY,R=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,o=!0;for(const i of t)A=Math.min(A,i[1]),E=Math.max(E,i[3]),R=Math.min(R,i[0]),n=Math.max(n,i[2]),o&&=i[0]<=i[2]&&i[0]>=-180&&i[2]<=180;if(o&&n-R<=180)return[R,A,n,E];const{wests:r,easts:T}=(e=>{const t=[],A=[];for(const E of e){const e=wrapLongitude(E[0]),R=wrapLongitude(E[2]);bboxLongitudeSpan(E)>=360?(t.push(-180),A.push(180)):e>R?(t.push(e,-180),A.push(180,R)):(t.push(e),A.push(R))}return{wests:Float64Array.from(t).sort(),easts:Float64Array.from(A).sort()}})(t),I=r.length-1;let N=I,_=r[0]+360-T[I];for(let i=0;i<I;i++){const e=r[i+1]-T[i];e>_&&(_=e,N=i)}return toBBox(r[(N+1)%r.length],A,T[N],E)},positionsExtent=(e,t,A=1e3,E)=>{const R=e?.length;if(!R)return;const n={west:Number.POSITIVE_INFINITY,east:Number.NEGATIVE_INFINITY,south:Number.POSITIVE_INFINITY,north:Number.NEGATIVE_INFINITY},o=e=>{if(!e||e.length<2)return;const A=t(e[0]);n.west=Math.min(n.west,A),n.east=Math.max(n.east,A),E?.push(A),n.south=Math.min(n.south,e[1]),n.north=Math.max(n.north,e[1])},r=Math.max(Math.ceil(R/A),1);for(let T=0;T<R;T+=r)o(e[T]);return r>1&&o(e[R-1]),n.south===Number.POSITIVE_INFINITY?void 0:n},bboxFromCoordsArray=e=>{const t=[],A=positionsExtent(e,wrapLongitude,void 0,t);if(!A)return;const{west:E,south:R,east:n,north:o}=A;return n-E<=180||n-E>=360?[E,R,n,o]:bboxFromBBoxes(t.map(e=>[e,R,e,o]))},bboxFromLine=(e,t)=>{const A=positionsExtent(e,e=>e,t);if(!A)return;const{west:E,south:R,east:n,north:o}=A;if(n-E>=360)return[-180,R,180,o];const r=wrapLongitude(E);return toBBox(r,R,wrapLongitude(n+(r-E)),o)},withoutAltitudes=e=>6===e.length?[e[0],e[1],e[3],e[4]]:e.length>=4?e:void 0,bboxFromGeoJSON=e=>{if(!e)return;if(Array.isArray(e))return"number"==typeof e[0]?withoutAltitudes(e):bboxFromBBoxes(e.map(e=>bboxFromGeoJSON(e)));const{bbox:t}=e;if(t)return withoutAltitudes(t);switch(e.type){case"Feature":return bboxFromGeoJSON(e.geometry);case"FeatureCollection":return bboxFromBBoxes(e.features?.map(bboxFromGeoJSON)??[]);case"GeometryCollection":return bboxFromBBoxes(e.geometries?.map(bboxFromGeoJSON)??[]);case"Point":return bboxFromCoordsArray([e.coordinates]);case"MultiPoint":return bboxFromCoordsArray(e.coordinates);case"LineString":return bboxFromLine(e.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(e.coordinates?.map(e=>bboxFromLine(e))??[]);case"MultiPolygon":return bboxFromBBoxes(e.coordinates?.flatMap(e=>e.map(e=>bboxFromLine(e)))??[]);default:return}},bboxCenter=e=>{const[t,A,,E]=e;return[wrapLongitude((t+unwrappedEast(e))/2),(A+E)/2]},polygonFromBBox=e=>{const[t,A,,E]=e,R=unwrappedEast(e);return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[t,A],[R,A],[R,E],[t,E],[t,A]]]},properties:{}}},projectAlongRouteLocation=(e,t)=>nearestPointOnLine(e,getPositionStrict(t)).properties.totalDistance,findInsertionSlot=(e,t)=>{for(let A=0;A<e.length-1;A++)if(t>=e[A]&&t<=e[A+1])return A+1;return t<e[0]?0:e.length},slotNewWaypoints=(e,t,A)=>{if(!A.length||e.geometry.coordinates.length<2||t.length<2)return A.map(()=>({slot:0,location:0}));const E=t.map(t=>projectAlongRouteLocation(e,t));E[0]>=E[1]&&(E[0]=0);const R=E.length-1;return E[R]<=E[R-1]&&(E[R]=length(e)),A.map(t=>{const A=projectAlongRouteLocation(e,t);return{slot:findInsertionSlot(E,A),location:A}})},findBestWaypointInsertionIndex=(e,t,A)=>findBestWaypointInsertionIndices(e,t,[A])[0],findBestWaypointInsertionIndices=(e,t,A)=>slotNewWaypoints(e,t,A).map(({slot:e})=>e),withInsertedWaypoint=(e,t,A)=>withInsertedWaypoints(e,t,[A]),withInsertedWaypoints=(e,t,A)=>{const E=Array.from({length:t.length+1},()=>[]),R=slotNewWaypoints(e,t,A);for(const[o,{slot:r,location:T}]of R.entries())E[r].push({waypoint:A[o],location:T});for(const o of E)o.sort((e,t)=>e.location-t.location);const n=[];for(let o=0;o<t.length;o++){for(const e of E[o])n.push(e.waypoint);n.push(t[o])}for(const o of E[t.length])n.push(o.waypoint);return n},progressValuesOf=({distanceInMeters:e,travelTimeInSeconds:t})=>void 0===e||void 0===t?void 0:{distanceInMeters:e,travelTimeInSeconds:t},progressBetween=(e,t,A)=>({distanceInMeters:e.distanceInMeters+A*(t.distanceInMeters-e.distanceInMeters),travelTimeInSeconds:e.travelTimeInSeconds+A*(t.travelTimeInSeconds-e.travelTimeInSeconds)}),calculateProgressAtRoutePoint=(e,t)=>{const{progress:A}=e.properties;if(!A||0===A.length)return;const E=e.geometry.coordinates.length;if(!Number.isInteger(t)||t<0||t>=E)return;const R=findBracketingProgressPoints(A,"pointIndex",t);if(!R)return;const{lower:n,lowerValue:o,upper:r,upperValue:T}=R,I=progressValuesOf(n),N=progressValuesOf(r);if(!I||!N)return;if(o===T)return I;const _=lengthShareOfBracket(e.geometry.coordinates,o,t,T);return progressBetween(I,N,_)},getRouteProgressBetween=(e,t,A)=>{const E=calculateProgressAtRoutePoint(e,t),R=calculateProgressAtRoutePoint(e,A);if(E&&R)return{start:E,end:R,delta:{distanceInMeters:R.distanceInMeters-E.distanceInMeters,travelTimeInSeconds:R.travelTimeInSeconds-E.travelTimeInSeconds}}},getRouteProgressForSection=(e,t)=>getRouteProgressBetween(e,t.startPointIndex,t.endPointIndex),getSectionBBox=(e,t)=>{const A=e.geometry.coordinates;if(!A||t.startPointIndex<0||t.endPointIndex>=A.length||t.startPointIndex>t.endPointIndex)return;const E=Math.floor((t.startPointIndex+t.endPointIndex)/2);return bboxFromCoordsArray([A[t.startPointIndex],A[E],A[t.endPointIndex]])},getSectionOverlap=(e,t)=>{const A=Math.max(e.startPointIndex,t.startPointIndex),E=Math.min(e.endPointIndex,t.endPointIndex);return E>A?{startPointIndex:A,endPointIndex:E}:void 0},metersWithin=(e,t,A=[{startPointIndex:0,endPointIndex:e.length-1}])=>A.reduce((A,E)=>{const R=getSectionOverlap(E,t);return A+(R?e[R.endPointIndex]-e[R.startPointIndex]:0)},0),firstIndexPast=(e,t,A)=>{let E=e,R=0,n=e;for(;R<n;){const e=R+n>>>1;let o=e;for(;o<n&&void 0===t(o);)o++;const r=o<n?t(o):void 0;void 0===r?n=e:A(r)?(E=o,n=e):R=o+1}return E},findBracketingProgressPoints=(e,t,A)=>{const E=A=>e[A][t],R=e[firstIndexPast(e.length,E,e=>e>=A)];let n=firstIndexPast(e.length,E,e=>e>A)-1;for(;n>=0&&void 0===e[n][t];)n--;const o=e[n],r=o?.[t],T=R?.[t];return void 0!==r&&void 0!==T?{lower:o,lowerValue:r,upper:R,upperValue:T}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,EARTH_RADIUS_IN_METERS=6371008.8,RADIANS_PER_DEGREE=Math.PI/180,metersAlongLine=e=>{const t=metersAlongLineCache.get(e);if(t?.length===e.length)return t;const A=new Float64Array(e.length);let[E=0,R=0]=e[0]??[],n=Math.cos(R*RADIANS_PER_DEGREE);for(let o=1;o<e.length;o++){const[t,r]=e[o],T=Math.cos(r*RADIANS_PER_DEGREE),I=Math.sin((r-R)*RADIANS_PER_DEGREE/2),N=Math.sin((t-E)*RADIANS_PER_DEGREE/2),_=I*I+N*N*n*T;A[o]=A[o-1]+12742017.6*Math.asin(Math.min(Math.sqrt(_),1)),E=t,R=r,n=T}return metersAlongLineCache.set(e,A),A},segmentAtMeters=(e,t,A,E)=>{const R=firstIndexPast(e.length,t=>e[t],e=>e>=t),n=clamp(R-1,A,E-1),o=e[n+1]-e[n];return{pathIndex:n,share:o>0?clamp((t-e[n])/o,0,1):0}},positionBetween=(e,t,A)=>{const E=t[0]-e[0],R=wrapLongitude(E),n=e[0]+A*R;return[R===E?n:wrapLongitude(n),e[1]+A*(t[1]-e[1])]},lengthShareOfBracket=(e,t,A,E)=>{const R=metersAlongLine(e),n=R[E]-R[t];return n>0?(R[A]-R[t])/n:(A-t)/(E-t)},positionAtShareOfBracket=(e,t,A,E)=>{const R=metersAlongLine(e),n=R[A]-R[t];let o,r;if(0===n){const e=t+E*(A-t);o=Math.floor(e),r=e-o}else{const e=R[t]+E*n;({pathIndex:o,share:r}=segmentAtMeters(R,e,t,A))}const T=Math.min(o+1,e.length-1);return positionBetween(e[o],e[T],r)},coordinateAtProgressPoint=(e,t)=>{const A=progressValuesOf(t);return A&&{position:e[t.pointIndex],...A}},resolveCoordinateAtProgress=(e,t,A)=>{const{progress:E}=e.properties,R=E?.at(-1);if(!E||!R)return;const n=e.geometry.coordinates,o=E[0],r=o[t],T=R[t];if(void 0===r||void 0===T)return;if(A<=r)return coordinateAtProgressPoint(n,o);if(A>=T)return coordinateAtProgressPoint(n,R);const I=findBracketingProgressPoints(E,t,A);if(!I)return;const{lower:N,lowerValue:_,upper:i,upperValue:S}=I,s=progressValuesOf(N),a=progressValuesOf(i);if(!s||!a)return;const O=_===S?0:(A-_)/(S-_);return{position:positionAtShareOfBracket(n,N.pointIndex,i.pointIndex,O),...progressBetween(s,a,O)}},getCoordinateAtRouteProgress=(e,t)=>{if("traveledTimeInSeconds"in t)return resolveCoordinateAtProgress(e,"travelTimeInSeconds",t.traveledTimeInSeconds);if("traveledDistanceInMeters"in t)return resolveCoordinateAtProgress(e,"distanceInMeters",t.traveledDistanceInMeters);const A=e.properties.summary.departureTime;if(!A)return;const E=(t.clockTime.getTime()-A.getTime())/1e3;return E<0?void 0:resolveCoordinateAtProgress(e,"travelTimeInSeconds",E)},getProgressAtNearestRoutePoint=(e,t)=>{const{progress:A}=e.properties,E=e.geometry.coordinates;if(!A?.length||E.length<2)return;const R=1e3*nearestPointOnLine(e,getPositionStrict(t)).properties.totalDistance,{pathIndex:n,share:o}=segmentAtMeters(metersAlongLine(E),R,0,E.length-1);return((e,t,A)=>{const E=e.geometry.coordinates,R=Math.min(t+1,E.length-1),n=calculateProgressAtRoutePoint(e,t),o=calculateProgressAtRoutePoint(e,R);if(n&&o)return{position:positionBetween(E[t],E[R],A),...progressBetween(n,o,A)}})(e,n,o)},SQRT_3=/* @__PURE__ */Math.sqrt(3),HEXAGON_ANGLES=/* @__PURE__ */(()=>[0,1,2,3,4,5].map(e=>2*Math.PI/6*e))(),HEXAGON_COSINES=/* @__PURE__ */(()=>HEXAGON_ANGLES.map(Math.cos))(),HEXAGON_SINES=/* @__PURE__ */(()=>HEXAGON_ANGLES.map(Math.sin))(),hexagonRowHeight=e=>SQRT_3/2*e.height,hexagonColumnOffset=(e,t)=>1&t?hexagonRowHeight(e)/2:0,hexagonCentre=(e,{column:t,row:A})=>[e.origin[0]+t*e.width*.75,e.origin[1]+A*hexagonRowHeight(e)-hexagonColumnOffset(e,t)],hexagonNorm=(e,t,[A,E])=>{const R=Math.abs(A-t[0])/(e.width/2),n=Math.abs(E-t[1])/(e.height/2);return Math.max(R+n/SQRT_3,2*n/SQRT_3)},hexagonInColumn=(e,t,A)=>({column:t,row:Math.round((A-e.origin[1]+hexagonColumnOffset(e,t))/hexagonRowHeight(e))}),latticeCellOf=(e,t)=>"hex"===e.shape?((e,t)=>{const A=Math.round((t[0]-e.origin[0])/(.75*e.width));let E=hexagonInColumn(e,A,t[1]),R=hexagonNorm(e,hexagonCentre(e,E),t);if(R<=1)return E;for(let n=A-1;n<=A+1;n+=2){const A=hexagonInColumn(e,n,t[1]),o=hexagonNorm(e,hexagonCentre(e,A),t);o<R&&(E=A,R=o)}return E})(e,t):{column:Math.floor((t[0]-e.origin[0])/e.width+.5),row:Math.floor((t[1]-e.origin[1])/e.height+.5)},latticeCellPolygon=(e,t)=>{if("hex"===e.shape){const[A,E]=hexagonCentre(e,t),R=HEXAGON_COSINES.map((t,R)=>[A+e.width/2*t,E+e.height/2*HEXAGON_SINES[R]]);return{type:"Polygon",coordinates:[[...R,[...R[0]]]]}}const A=e.origin[0]+(t.column-.5)*e.width,E=e.origin[1]+(t.row-.5)*e.height;return polygonFromBBox([A,E,A+e.width,E+e.height]).geometry},inBBox=(e,t)=>t[1]>=e[1]&&t[1]<=e[3]&&(e[0]>e[2]?t[0]>=e[0]||t[0]<=e[2]:t[0]>=e[0]&&t[0]<=e[2]),inPolygon=(e,t,A)=>booleanPointInPolygon(A,e)||t&&(booleanPointInPolygon([A[0]+360,A[1]],e)||booleanPointInPolygon([A[0]-360,A[1]],e)),runsPastAntimeridian=({geometry:e})=>("Polygon"===e.type?[e.coordinates]:e.coordinates).some(([e=[]])=>e.some(([e])=>Math.abs(e)>180)),statisticOf={count:e=>e.length,sum:sum,mean:mean,median:e=>{const t=Float64Array.from(e).sort(),A=Math.floor(t.length/2);return t.length%2?t[A]:(t[A-1]+t[A])/2},min:e=>e.reduce((e,t)=>Math.min(e,t),Number.POSITIVE_INFINITY),max:e=>e.reduce((e,t)=>Math.max(e,t),Number.NEGATIVE_INFINITY)},aggregateIntoCells=(e,t)=>{const A=t,E=void 0===(R=A.value)?()=>0:"function"==typeof R?R:e=>e.properties?.[R];var R;const n=[];for(const I of e.features){const e=E(I),t=I.geometry?.coordinates;"number"==typeof e&&Number.isFinite(e)&&Number.isFinite(t?.[0])&&Number.isFinite(t?.[1])&&n.push({position:t,value:e})}const o=(e=>"string"==typeof e.grid)(A)?((e,t)=>{const{cellSizeKM:A}=t;if(!(A>0&&Number.isFinite(A)))throw new Error(`cellSizeKM must be a positive number, got ${A}`);if(!e.length)return[];const E=(({grid:e,cellSizeKM:t,gridOrigin:A},E)=>{const R=A??(e=>{const t=e.map(({position:e})=>e),A=bboxFromCoordsArray(t);return A?bboxCenter(A):t[0]})(E),n=lengthToDegrees(t,"kilometers"),o=clampLatitude(R[1]),r="hex"===e?2:1;return{shape:e,origin:R,width:n/Math.cos(o*RADIANS_PER_DEGREE)*r,height:n*r}})(t,e),R=/* @__PURE__ */new Map,n=[];for(const{position:o,value:r}of e){const e=latticeCellOf(E,withNearestLongitude(E.origin,o));let t=R.get(e.column);t||(t=/* @__PURE__ */new Map,R.set(e.column,t));let A=t.get(e.row);A||(A={toCell:t=>({type:"Feature",id:`${E.shape}:${e.column}:${e.row}`,geometry:latticeCellPolygon(E,e),properties:t}),values:[]},t.set(e.row,A),n.push(A)),A.values.push(r)}return n})(n,A):((e,t)=>{const A=t.features.flatMap(e=>{const t=(A=e.geometry,bboxFromBBoxes(("Polygon"===A.type?[A.coordinates]:A.coordinates).map(([e])=>bboxFromLine(e,Number.POSITIVE_INFINITY))));var A;return t?[{cell:e,bbox:t,pastAntimeridian:runsPastAntimeridian(e),bin:{toCell:t=>({...e,properties:{...e.properties,...t}}),values:[]}}]:[]});for(const{position:E,value:R}of e){const e=[wrapLongitude(E[0]),E[1]];for(const{cell:t,bbox:E,pastAntimeridian:n,bin:o}of A)inBBox(E,e)&&inPolygon(t,n,e)&&o.values.push(R)}return A.map(({bin:e})=>e)})(n,A.grid),r=A.stats??["count"],T=Math.max(A.minCount??1,1);return{type:"FeatureCollection",features:o.filter(({values:e})=>e.length>=T).map(({toCell:e,values:t})=>e(Object.fromEntries(r.map(e=>[e,statisticOf[e](t)]))))}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),NO_JUNCTION_MANEUVER=/^(DEPART|ARRIVE|WAYPOINT|CROSS_BORDER|TOLLGATE)/,MIN_PROGRESS=5*Math.PI/180,MAX_TURN_BACK=10*Math.PI/180,roadNamesOf=e=>[e?.streetName?.text,...(e?.roadShields??[]).map(e=>e.roadNumber.text)].filter(e=>!!e),followsTheRoad=({maneuver:e,maneuverView:t,previousRoadInfo:A,nextRoadInfo:E})=>{if(e.includes("ROUNDABOUT")||e.includes("UTURN"))return!1;if(t&&!t.offRouteAngles.length)return!0;const R=roadNamesOf(A);return roadNamesOf(E).some(e=>R.includes(e))},curvinessWeight=e=>e<30?2:e<60?1.6:e<100?1.3:e<175?1:0,SLOW_JUNCTION=/^(?:TURN|SHARP|MAKE_UTURN|.*ROUNDABOUT)/,severityOf=(e,t,A,E)=>{const R=e+.75/Math.tan(Math.min(Math.abs(t),Math.PI)/4)**2,n=3.6*Math.sqrt(3*R),o=E&&SLOW_JUNCTION.test(E)?Math.min(n,20):n;return Math.max(0,1-(o/A)**2)},turnBetween=(e,t)=>{const A=t-e;return A>Math.PI?A-2*Math.PI:A<=-Math.PI?A+2*Math.PI:A},bearing=(e,t)=>{const A=wrapLongitude(t[0]-e[0])*RADIANS_PER_DEGREE;return Math.atan2(A*Math.cos((e[1]+t[1])/2*RADIANS_PER_DEGREE),(t[1]-e[1])*RADIANS_PER_DEGREE)},turnsBack=({meters:e,turns:t},A,E,R,n)=>{let o=0;for(let r=A;r>0&&r<t.length-1;r+=E){if(Math.abs(e[r]-e[A])>n)return!1;if(o+=R*t[r],o<-MAX_TURN_BACK)return!0;if(o>MAX_TURN_BACK)return!1}return!1},turnWithin=({along:e},t,A,E,R)=>{const n=bearing(t[A],t[E]);let o=0,r=A;for(let T=A;T<E;T++){for(;r<E&&e[r]-e[T]<5;)r++;if(e[r]-e[T]<5)break;o=Math.max(o,R*turnBetween(n,bearing(t[T],t[r])))}return o},fittedRadius=(e,t,A)=>{if(A-t<2)return;const[E,R]=e[t],n=6371008.8*Math.cos(R*RADIANS_PER_DEGREE),o=A-t+1,r=new Float64Array(o),T=new Float64Array(o);let I=0,N=0;for(let c=0;c<o;c++){const[A,o]=e[t+c];r[c]=wrapLongitude(A-E)*RADIANS_PER_DEGREE*n,T[c]=(o-R)*RADIANS_PER_DEGREE*6371008.8,I+=r[c],N+=T[c]}const _=I/o,i=N/o;let S=0,s=0,a=0,O=0,C=0;for(let c=0;c<o;c++){const e=r[c]-_,t=T[c]-i;S+=e*e,s+=e*t,a+=t*t,O+=e*(e*e+t*t),C+=t*(e*e+t*t)}const L=S*a-s*s;if(L<=1e-6*(S+a)**2)return;const U=(O*a-C*s)/(2*L),P=(C*S-O*s)/(2*L);return Math.sqrt(U*U+P*P+(S+a)/o)},runFrom=(e,t,A,E,R)=>{let n=A,o=A;for(let r=A+1;r<e.length-1;r++){const A=E*e[r];if(A>E*e[n]&&(n=r),A-E*e[o]>=MIN_PROGRESS&&(o=r),E*e[n]-A>MAX_TURN_BACK)return{last:n,next:n+1};if(t[r]-t[o]>R)return{last:n,next:r}}return{last:n,next:e.length-1}},sharpestPart=({meters:e,turns:t},{sign:A,first:E,last:R},n)=>{let o=0,r=Number.POSITIVE_INFINITY,T=E,I=Number.NEGATIVE_INFINITY;const N={first:E,last:E};for(let _=E;_<=R;_++){const E=o-n*e[_];E<r&&(r=E,T=_),o+=A*t[_];const R=o-n*e[_]-r;R>I&&(I=R,N.first=T,N.last=_)}return N},fittedRadiusOf=(e,t,A,E,R)=>{const{indexes:n}=e,o=(({meters:e,turns:t},A,E,R)=>{const n=.8*Math.abs(R),o=Math.sign(R),r={first:A,last:E};let T=A,I=0;for(let N=A;N<=E;N++){for(I+=o*t[N];T<N&&I-o*t[T]>=n;)I-=o*t[T++];I>=n&&e[N]-e[T]<e[r.last]-e[r.first]&&(r.first=T,r.last=N)}return r})(e,A,E,R),r=o.first===o.last,T=r?Math.max(A,o.first-1):o.first,I=r?Math.min(E,o.last+1):o.last;return fittedRadius(t,n[T],n[I])??fittedRadius(t,n[A],n[E])},headingOf=(e,t,{sign:A,first:E,last:R},n)=>{const{indexes:o,turns:r}=e;let T=0;for(let I=E;I<=R;I++)T+=r[I];return turnsBack(e,E-1,-1,A,n)&&(T+=A*turnWithin(e,t,o[E-1],o[E],-A)),turnsBack(e,R+1,1,A,n)&&(T+=A*turnWithin(e,t,o[R],o[R+1],A)),T},getCurveSections=(e,{minHeadingChangeInDegrees:t=40,maxRadiusInMeters:A=250,maxStraightInMeters:E=Math.max(40,.15*A)}={})=>{const R=e.properties.sections.leg.slice(0,-1).flatMap(e=>e.endPointIndex??[]),{coordinates:n}=e.geometry,o=((e,t)=>{const A=metersAlongLine(e),E=new Int32Array(e.length),R=new Float64Array(e.length);let n=0;for(let I=0;I<e.length;I++){const t=n?A[I]-R[n-1]:Number.POSITIVE_INFINITY;(t>=10||I===e.length-1&&t>0)&&(E[n]=I,R[n++]=A[I])}const o=new Float64Array(n);let r=n>1?bearing(e[E[0]],e[E[1]]):0,T=0;for(let I=1;I<n-1;I++){const A=bearing(e[E[I]],e[E[I+1]]);for(;T<t.length&&t[T]<=E[I-1];)T++;const R=T<t.length&&t[T]<E[I+1];o[I]=R?0:turnBetween(r,A),r=A}return{along:A,indexes:E.subarray(0,n),meters:R.subarray(0,n),turns:o}})(n,R),{along:r,indexes:T,meters:I}=o,N=((e,t)=>{let A=0;return E=>{const R=t[E]-150;for(;A<e.length&&t[e[A].endPointIndex]<R;)A++;let n=0;for(let t=A;t<e.length&&e[t].startPointIndex<=E;t++)n=Math.max(n,e[t].maxSpeedLimitInKmh);return n||80}})(e.properties.sections.speedLimit??[],r),_=(e=>{let t=0;return(A,E)=>{for(;t<e.length&&e[t].pathPointIndex<A;)t++;for(let R=t;R<e.length&&e[R].pathPointIndex<=E;R++){const t=e[R];if(!NO_JUNCTION_MANEUVER.test(t.maneuver)&&!followsTheRoad(t))return t.maneuver}}})(e.properties.guidance?.instructions??[]);let i=0;const S=[],s=t*RADIANS_PER_DEGREE;for(const a of(({meters:e,turns:t},A,E)=>{const R=new Float64Array(t.length);for(let r=1;r<t.length;r++)R[r]=R[r-1]+t[r];const n=[];let o=1;for(;o<t.length-1;){if(0===t[o]){o++;continue}const r=t[o]>0?1:-1,T=o,{last:I,next:N}=runFrom(R,e,T,r,A);r*(R[I]-R[T-1])>=E&&n.push({sign:r,first:T,last:I}),o=N}return n})(o,E,s/2)){const{first:e,last:t}=sharpestPart(o,a,1/(2*A)),R=headingOf(o,n,{sign:a.sign,first:e,last:t},E);if(Math.abs(R)<s)continue;const r=I[e]-I[e-1],T=I[t+1]-I[t],N=(Math.min(r,T,E)+(I[t]-I[e]))/Math.abs(R),_=fittedRadiusOf(o,n,e,t,R)??N,O=Math.max(r<=E?e-1:e,i),C=T<=E?t+1:t;_>A||O>=C||(i=C,S.push({start:O,end:C,heading:R,radiusInMeters:_}))}return S.map(({start:e,end:t,heading:A,radiusInMeters:E},R)=>{const n=T[e],o=T[t],r=S[R+1]?.start===t,i=_(n,r?o-1:o);return{id:generateId(),startPointIndex:n,endPointIndex:o,headingChangeInDegrees:A/RADIANS_PER_DEGREE,radiusInMeters:E,lengthInMeters:I[t]-I[e],curvinessScore:curvinessWeight(E)*E*Math.abs(A),severity:severityOf(E,A,N(n),i),...i&&{maneuver:i}}})},isHairpin=e=>!e.maneuver&&Math.abs(e.headingChangeInDegrees)>=140&&e.radiusInMeters<=40,getCurvyStretchSections=(e,{curves:t=e.properties.sections.curve??getCurveSections(e),maxGapInMeters:A=500,minCurveCount:E=3}={})=>{const R=metersAlongLine(e.geometry.coordinates),n=[];let o=[];const r=()=>{const e=o.at(-1);if(e&&o.length>=E){const{startPointIndex:t}=o[0],{endPointIndex:A}=e;n.push({id:generateId(),startPointIndex:t,endPointIndex:A,curveCount:o.length,lengthInMeters:R[A]-R[t],hairpinCount:o.filter(isHairpin).length,minRadiusInMeters:Math.min(...o.map(e=>e.radiusInMeters)),curvinessScore:o.reduce((e,t)=>e+t.curvinessScore,0)})}o=[]};for(const T of t){if(T.maneuver){r();continue}const e=o.at(-1);e&&R[T.startPointIndex]-R[e.endPointIndex]>A&&r(),o.push(T)}return r(),n},withCurveSections=(e,{curve:t,curvyStretch:A}={})=>{const E=getCurveSections(e,t),R=getCurvyStretchSections(e,{...A,curves:E}),{curve:n,curvyStretch:o,...r}=e.properties.sections;return{...e,properties:{...e.properties,sections:{...r,...E.length&&{curve:E},...R.length&&{curvyStretch:R}}}}},bucket=e=>Math.round(1e5*e),vertexHash=(e,t)=>Math.imul(Math.imul(e,2654435761)^t,2246822507),holds=(e,t,A,E,R,n)=>e[t]===A&&e[t+1]===E&&e[t+2]===R&&e[t+3]===n,slotOf=(e,t,A,E,R,n,o)=>{const r=vertexHash(E,R)+vertexHash(n,o);let T=6*((r^r>>>15)&e.length/6-1);for(;e[T+4]&&!holds(e,T,E,R,n,o)&&!holds(e,T,n,o,E,R);)T=(T+6)%e.length;return e[T+4]||(e[T]=E,e[T+1]=R,e[T+2]=n,e[T+3]=o,e[T+4]=t+1,e[T+5]=A),T},getDistinctSections=(e,{minLengthInMeters:t=0}={})=>{const A=Array.isArray(e)?e:e.features,{firsts:E,shared:R}=(e=>{const t=new Int32Array(6*2**Math.ceil(Math.log2(1.5*e.reduce((e,t)=>e+t.length,0)+1))),A=e.map(e=>new Int32Array(Math.max(e.length-1,0))),E=A.map(e=>new Uint8Array(e.length)),R=(e,t)=>{E[e][A[e][t]]=1};return e.forEach((E,n)=>{const o=A[n];let r;const[T=0,I=0]=E[0]??[];let N=bucket(T),_=bucket(I);for(let A=0;A<o.length;A++){const T=N,I=_;if(N=bucket(E[A+1][0]),_=bucket(E[A+1][1]),T===N&&I===_){o[A]=-1;continue}o[A]=A;const i=r&&e[r.route][r.vertex+r.step];if(r&&i&&bucket(i[0])===N&&bucket(i[1])===_){R(n,A),R(r.route,Math.min(r.vertex,r.vertex+r.step)),r.vertex+=r.step;continue}const S=slotOf(t,n,A,T,I,N,_),s=t[S+4]-1,a=t[S+5];if(r=void 0,s===n){o[A]=a;continue}R(n,A),R(s,a);const O=t[S]===T&&t[S+1]===I;r={route:s,vertex:O?a+1:a,step:O?1:-1}}}),{firsts:A,shared:E}})(A.map(e=>e.geometry.coordinates));return A.map((e,A)=>{const n=E[A],o=R[A],r=metersAlongLine(e.geometry.coordinates),T=[];let I;for(let E=0;E<=n.length;E++){if(-1===n[E])continue;if(E<n.length&&!o[n[E]]){I??=E;continue}if(void 0===I)continue;const e=r[E]-r[I];e>=t&&T.push({id:generateId(),startPointIndex:I,endPointIndex:E,lengthInMeters:e}),I=void 0}return T})},viewsNotServed={mapTiles:["CN","RU"],search:["KR","US"],placeDetails:["KR","US"],reverseGeocoding:["KR","US"],geocoding:["AE","BN","CL","DZ","KR","MY","PH","US","VN"]},servesGeopoliticalView=(e,t)=>!viewsNotServed[t].includes(e),TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=e=>!1===e.sendUserAgentHeader?{}:{"tomtom-user-agent":"tomtom-user-agent"in e&&"string"==typeof e["tomtom-user-agent"]?e["tomtom-user-agent"]:"MapsSDKJS/1.0.0-rc.6"},getImportantRoads=(e,{within:t,minLengthInMeters:A=0}={})=>{const E=metersAlongLine(e.geometry.coordinates),R=/* @__PURE__ */new Map,n=[...e.properties.sections.importantRoadStretch??[]].sort((e,t)=>e.startPointIndex-t.startPointIndex);for(const o of n){const e=metersWithin(E,o,t);if(!e)continue;const{index:A,roadNumbers:n=[],streetName:r}=o,T=n[0]??r,I=T??A,N=R.get(I);N?(N.index=Math.min(N.index,A),N.roadNumbers=[.../* @__PURE__ */new Set([...N.roadNumbers,...n])],N.streetName??=r,N.lengthInMeters+=e,N.sections.push(o)):R.set(I,{index:A,...T&&{name:T},roadNumbers:n,...r&&{streetName:r},lengthInMeters:e,sections:[o]})}return[...R.values()].filter(e=>e.lengthInMeters>=A)},getInstructionLanes=(e,t)=>{if(NO_JUNCTION_MANEUVER.test(t.maneuver))return;const A=(e.properties.guidance?.instructions??[]).filter(({maneuver:e})=>!NO_JUNCTION_MANEUVER.test(e));if(A.find(e=>e.pathPointIndex===t.pathPointIndex)?.maneuver!==t.maneuver)return;const E=({startPointIndex:t,endPointIndex:E})=>{const R=A.findLast(({pathPointIndex:e})=>t<=e&&e<=E);if(R)return R.pathPointIndex;const n=A.find(({pathPointIndex:e})=>e>E),o=e.geometry.coordinates[E];return n&&o&&distance(o,n.maneuverPoint,{units:"meters"})<=100?n.pathPointIndex:void 0};let R;for(const n of e.properties.sections.lanes??[])(!R||n.endPointIndex>R.endPointIndex)&&E(n)===t.pathPointIndex&&(R=n);return R},serviceLanguageCodes={"zh-Hans":"zh-CN","zh-Hant":"zh-TW"},serviceLanguage=e=>serviceLanguageCodes[e]??e,placesLanguageCodes={ngt:void 0,"en-CA":"en-GB","es-MX":"es-419","hi-IN":void 0,"ja-JP":void 0},placesLanguage=e=>Object.hasOwn(placesLanguageCodes,e)?placesLanguageCodes[e]:serviceLanguage(e),poiCategoriesLanguage=e=>"ngt-Latn"===e?void 0:placesLanguage(e),trafficIncidentLanguages={ngt:void 0,"ngt-Latn":void 0,ar:"ar","bg-BG":void 0,"ca-ES":"ca-ES","zh-Hant":"zh-TW","zh-Hans":void 0,"hr-HR":void 0,"cs-CZ":"cs-CZ","da-DK":"da-DK","nl-NL":"nl-NL","en-AU":"en-GB","en-CA":"en-GB","en-GB":"en-GB","en-NZ":"en-GB","en-US":"en-US","et-EE":"et-EE","eu-ES":void 0,"fi-FI":"fi-FI","fr-FR":"fr-FR","gl-ES":void 0,"de-DE":"de-DE","el-GR":"el-GR","he-IL":"he-IL","hi-IN":void 0,"hu-HU":"hu-HU","id-ID":"id-ID","it-IT":"it-IT","ja-JP":"ja-JP","kk-KZ":void 0,"ko-KR":"ko-KR","ko-Latn-KR":void 0,"lv-LV":"lv-LV","lt-LT":"lt-LT","ms-MY":void 0,"nb-NO":"nb-NO","pl-PL":"pl-PL","pt-BR":"pt-PT","pt-PT":"pt-PT","ro-RO":"ro-RO","ru-RU":"ru-RU","ru-Latn-RU":void 0,"ru-Cyrl-RU":"ru-RU","sr-RS":void 0,"sk-SK":"sk-SK","sl-SI":void 0,"es-ES":"es-ES","es-MX":"es-ES","sv-SE":"sv-SE","th-TH":"th-TH","tr-TR":"tr-TR","uk-UA":void 0},trafficIncidentLanguage=e=>e&&trafficIncidentLanguages[e],poiCategoriesToID={TRAFFIC_CONTROL_DEPARTMENT:7301,TRAFFIC_CONTROL_DEPARTMENT_GENERIC:7301002,TRAIL_SYSTEM:7302,MOUNTAIN_BIKE_TRAIL:7302002,ADVENTURE_VEHICLE_TRAIL:7302003,HIKING_TRAIL:7302004,HORSE_RIDING_TRAIL:7302005,ROCK_CLIMBING_TRAIL:7302006,RESIDENTIAL_ACCOMMODATION:7303,RETIREMENT_COMMUNITY:7303002,FLATS_OR_APARTMENT_COMPLEX:7303003,HOLIDAY_RENTAL:7304,COTTAGE_RENTAL:7304002,VILLA_RENTAL:7304003,BUNGALOW_RENTAL:7304004,CHALET_RENTAL:7304005,APARTMENT_RENTAL:7304006,ADVENTURE_SPORTS_FACILITY:7305,HELIPORT_OR_HELIPAD:7308,CHARGING_LOCATION:7309,VEHICLE_REPAIR:7310,BODYSHOP:7310002,CAR_GLASS_REPLACEMENT_SHOP:7310003,CAR_REPAIR_AND_SERVICE:7310004,TIRE_SERVICE:7310007,MOTORCYCLE_REPAIR:7310008,TRUCK_REPAIR_AND_SERVICE:7310009,FUEL_STATION:7311,CAR_RENTAL:7312,PARKING_GARAGE:7313,HOTEL_OR_MOTEL:7314,BANDB_OR_GUEST_HOUSE:7314002,HOTEL:7314003,HOSTEL:7314004,RESORT:7314005,MOTEL:7314006,CABINS_LODGES:7314007,REST_CAMP:7314008,RESTAURANT:7315,AFRICAN_RESTAURANT:7315002,AMERICAN_RESTAURANT:7315003,AUSTRIAN_RESTAURANT:7315004,BARBECUE_RESTAURANT:7315005,BELGIAN_RESTAURANT:7315006,BISTRO:7315007,BRITISH_RESTAURANT:7315008,CALIFORNIAN_RESTAURANT:7315009,CANADIAN_RESTAURANT:7315010,CARIBBEAN_RESTAURANT:7315011,CHINESE_RESTAURANT:7315012,CREPERIE:7315013,DUTCH_RESTAURANT:7315014,FAST_FOOD:7315015,PHILIPPINE_RESTAURANT:7315016,FRENCH_RESTAURANT:7315017,GERMAN_RESTAURANT:7315018,GREEK_RESTAURANT:7315019,GRILL_RESTAURANT:7315020,HAWAIIAN_RESTAURANT:7315021,HUNGARIAN_RESTAURANT:7315022,INDIAN_RESTAURANT:7315023,INDONESIAN_RESTAURANT:7315024,ITALIAN_RESTAURANT:7315025,JAPANESE_RESTAURANT:7315026,JEWISH_RESTAURANT:7315027,KOREAN_RESTAURANT:7315028,LATIN_AMERICAN_RESTAURANT:7315029,LEBANESE_RESTAURANT:7315030,MEDITERRANEAN_RESTAURANT:7315032,MEXICAN_RESTAURANT:7315033,MIDDLE_EASTERN_RESTAURANT:7315034,ORIENTAL_RESTAURANT:7315035,PIZZERIA:7315036,POLISH_RESTAURANT:7315037,PORTUGUESE_RESTAURANT:7315038,RUSSIAN_RESTAURANT:7315040,SANDWICH_RESTAURANT:7315042,SEAFOOD:7315043,SPANISH_RESTAURANT:7315044,STEAK_HOUSE:7315045,SWISS_RESTAURANT:7315047,THAI_RESTAURANT:7315048,TURKISH_RESTAURANT:7315049,VEGETARIAN_RESTAURANT:7315050,VIETNAMESE_RESTAURANT:7315051,HUNAN_RESTAURANT:7315052,SHANDONG_RESTAURANT:7315053,SICHUAN_RESTAURANT:7315056,DONGBEI_RESTAURANT:7315057,HOT_POT_RESTAURANT:7315058,TAIWANESE_RESTAURANT:7315059,WESTERN_RESTAURANT:7315060,PERUVIAN_RESTAURANT:7315061,ASIAN_RESTAURANT:7315062,CREOLE_RESTAURANT:7315063,SOUL_FOOD:7315064,IRISH_RESTAURANT:7315065,JAMAICAN_RESTAURANT:7315066,KOSHER_RESTAURANT:7315067,CZECH_RESTAURANT:7315068,HAMBURGER_RESTAURANT:7315069,CHICKEN_RESTAURANT:7315070,FUSION_RESTAURANT:7315071,BRAZILIAN_RESTAURANT:7315072,INTERNATIONAL_RESTAURANT:7315073,MOROCCAN_RESTAURANT:7315074,ORGANIC_FOOD_RESTAURANT:7315075,TAPAS_RESTAURANT:7315076,ICE_CREAM_PARLOR:7315078,DOUGHNUT_RESTAURANT:7315079,AFGHAN_RESTAURANT:7315081,ARABIAN_RESTAURANT:7315083,ARMENIAN_RESTAURANT:7315085,AUSTRALIAN_RESTAURANT:7315086,BASQUE_RESTAURANT:7315087,BOLIVIAN_RESTAURANT:7315088,BULGARIAN_RESTAURANT:7315090,BURMESE_RESTAURANT:7315091,CAMBODIAN_RESTAURANT:7315092,CHILEAN_RESTAURANT:7315093,COLOMBIAN_RESTAURANT:7315094,CORSICAN_RESTAURANT:7315095,CUBAN_RESTAURANT:7315096,DANISH_RESTAURANT:7315098,EGYPTIAN_RESTAURANT:7315100,ENGLISH_RESTAURANT:7315101,ETHIOPIAN_RESTAURANT:7315102,FINNISH_RESTAURANT:7315104,IRANIAN_RESTAURANT:7315105,ISRAELI_RESTAURANT:7315106,MONGOLIAN_RESTAURANT:7315110,NEPALESE_RESTAURANT:7315111,NORWEGIAN_RESTAURANT:7315112,SCANDINAVIAN_RESTAURANT:7315114,SWEDISH_RESTAURANT:7315119,SYRIAN_RESTAURANT:7315120,TEPPANYAKI_RESTAURANT:7315121,TIBETAN_RESTAURANT:7315122,TUNISIAN_RESTAURANT:7315123,VENEZUELAN_RESTAURANT:7315125,PAKISTANI_RESTAURANT:7315127,FONDUE_RESTAURANT:7315134,SNACKS_RESTAURANT:7315139,SOUP_RESTAURANT:7315140,BUFFET_RESTAURANT:7315142,SALAD_BAR:7315143,TAKEOUT_FOOD:7315145,BANQUET_ROOMS:7315146,CAFETERIA:7315147,SUSHI_RESTAURANT:7315148,JUICE_BAR:7315149,TOURIST_INFORMATION:7316,MUSEUM:7317,THEATER:7318,CONCERT_HALL:7318002,MUSIC_CENTER:7318003,OPERA_HOUSE:7318004,THEATER_GENERIC:7318005,CABARET_THEATER:7318006,AMPHITHEATER:7318007,DINNER_THEATER:7318008,CULTURAL_CENTER:7319,SPORTS_CENTER:7320,FITNESS_CLUB_AND_CENTER:7320002,HORSE_RIDING:7320003,SPORTS_CENTER_GENERIC:7320004,THEMATIC_SPORT_CENTER:7320005,SQUASH_COURT:7320006,HOSPITAL:7321,GENERAL_HOSPITAL_AND_POLYCLINIC:7321002,SPECIAL_HOSPITAL:7321003,HOSPITAL_OF_CHINESE_MEDICINE:7321004,HOSPITAL_FOR_WOMEN_AND_CHILDREN:7321005,POLICE_STATION:7322,POST_OFFICE:7324,PHARMACY:7326,DEPARTMENT_STORE:7327,BANK:7328,MARKETPLACE:7332,INFORMAL_MARKET:7332002,PUBLIC_MARKET:7332003,FARMERS_MARKET:7332004,SUPERMARKET:7332005,AGRICULTURE:7335,HORTICULTURE:7335002,PRIMARY_PRODUCER:7335003,FARM:7335004,VIEWPOINT:7337,SWIMMING_POOL:7338,RELIGIOUS_SITE:7339,CHURCH:7339002,MOSQUE:7339003,SYNAGOG:7339004,TEMPLE:7339005,GURUDWARA:7339006,PAGODA:7339008,CASINO_AND_GAMBLING:7341,CINEMA:7342,MOVIE_THEATER:7342002,DRIVE_IN_MOVIES:7342003,MARINA:7347,MARINA_GENERIC:7347002,YACHT_BASIN:7347003,WINERY:7349,FERRY_TERMINAL:7352,TRUCK_STOP:7358,WEIGH_STATION:7359,WEIGH_STATION_GENERIC:7359002,CAMPING_GROUND:7360,RECREATIONAL_CAMPING_GROUND:7360002,CARAVAN_SITE:7360003,COMMUNITY_CENTER:7363,EMBASSY:7365,BORDER_CONTROL:7366,GOVERNMENT_OFFICE:7367,MOTORING_ORGANIZATION_OFFICE:7368,OPEN_CAR_PARKING_AREA:7369,OPEN_CAR_PARKING_AREA_GENERIC:7369002,SCHOOL:7372,SCHOOL_GENERIC:7372002,CHILDCARE:7372003,PRE_SCHOOL:7372004,PRIMARY_SCHOOL:7372005,HIGH_SCHOOL:7372006,SENIOR_HIGH_SCHOOL:7372007,VOCATIONAL_SCHOOL:7372008,LANGUAGE_SCHOOL:7372010,ART_SCHOOL:7372012,MIDDLE_SCHOOL:7372014,DRIVING_SCHOOL:7372016,MALL:7373,STADIUM:7374,ATHLETICS_TRACK:7374002,CRICKET_GROUND:7374003,SOCCER_STADIUM:7374004,HORSE_RACING_TRACK:7374005,MULTI_PURPOSE_STADIUM:7374006,RUGBY_GROUND:7374007,ICE_HOCKEY_ARENA:7374008,BASEBALL_PARK:7374009,FOOTBALL_STADIUM:7374010,MOTOR_RACING_STADIUM:7374011,BASKETBALL_ARENA:7374012,RACE_TRACK:7374013,NETBALL_STADIUM:7374014,TOLL_GATE:7375,TOURIST_ATTRACTION:7376,BUILDING:7376002,MONUMENT:7376003,NATURAL_TOURIST_ATTRACTION:7376004,OBSERVATORY:7376005,PLANETARIUM:7376006,DAM:7376007,TUNNEL:7376008,TOWER:7376009,BRIDGE:7376010,MAUSOLEUM_OR_GRAVE:7376011,ARCH:7376012,STATUE:7376013,WATER_HOLE:7376014,COLLEGE_OR_UNIVERSITY:7377,COLLEGE_OR_UNIVERSITY_GENERIC:7377002,JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:7377003,BUSINESS_PARK:7378,RAILWAY_STATION:7380,INTERNATIONAL_RAILROAD_STATION:7380002,NATIONAL_RAILROAD_STATION:7380003,URBAN_STATION:7380004,SUBWAY_STATION:7380005,AIRPORT:7383,PUBLIC_AIRPORT:7383002,PRIVATE_AIRPORT:7383003,MILITARY_AIRPORT:7383004,AIRFIELD:7383005,COURIER_DROP_BOX:7388,TRANSPORT_ACCESS:7389,AIRLINE_ACCESS:7389002,STATION_ACCESS:7389003,SECURED_ENTRANCE:7389004,SUBWAY_ENTRANCE:7389999,EMERGENCY_MEDICAL_SERVICE:7391,FIRE_STATION:7392,REST_AREA:7395,ATM:7397,NATURAL_FEATURE:8099,MOUNTAIN_PEAK:8099002,CAVE:8099003,RIDGE:8099004,DUNE:8099005,VALLEY:8099006,PLAIN_OR_FLAT:8099007,PLATEAU:8099008,PAN:8099009,WELL:8099010,OASIS:8099011,ROCKS:8099012,RESERVOIR:8099013,REEF:8099014,RAPIDS:8099015,BAY:8099016,COVE:8099017,HARBOR:8099018,CAPE:8099020,MINERAL_OR_HOT_SPRINGS:8099021,ISLAND:8099022,MARSH:8099023,RIVER_CROSSING:8099024,HILL:8099025,QUARRY:8099026,LOCALE:8099027,PRIMARY_RESOURCE_UTILITY:9150,TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:9151,NON_GOVERNMENTAL_ORGANIZATION:9152,WELFARE_ORGANIZATION:9153,PRISON:9154,CAR_WASH:9155,CAR_WASH_GENERIC:9155002,MANUFACTURING_FACILITY:9156,RESEARCH_FACILITY:9157,MEDIA_FACILITY:9158,PORT_WAREHOUSE_FACILITY:9159,EXCHANGE:9160,STOCK_EXCHANGE:9160002,GOLD_EXCHANGE:9160003,FOREIGN_EXCHANGE:9160004,COMPANY:9352,SERVICE_COMPANY:9352002,ADVERTISING_COMPANY:9352003,COMPUTER_AND_DATA_SERVICES:9352004,SOFTWARE_COMPANY:9352005,DIVERSIFIED_FINANCIALS:9352006,INSURANCE_COMPANY:9352007,DELIVERY_SERVICE:9352008,REAL_ESTATE_COMPANY:9352009,MANUFACTURING_COMPANY:9352011,AGRICULTURAL_TECHNOLOGY:9352012,AUTOMOBILE_COMPANY:9352013,CHEMICAL_COMPANY:9352014,ELECTRONICS_COMPANY:9352015,MECHANICAL_ENGINEERING:9352016,PHARMACEUTICAL_COMPANY:9352018,PUBLISHING_TECHNOLOGIES:9352019,TELECOMMUNICATIONS:9352020,TAX_SERVICES:9352022,LEGAL_SERVICES:9352023,TRANSPORT_COMPANY:9352024,BUS_CHARTER_COMPANY:9352025,TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:9352026,BUS_LINES:9352027,SCHOOL_BUS_COMPANY:9352028,CLEANING_SERVICES:9352029,OIL_AND_NATURAL_GAS:9352030,MINING_COMPANY:9352031,CONSTRUCTION_COMPANY:9352032,MOVING_AND_STORAGE_COMPANY:9352033,AIRLINE_COMPANY:9352034,FUNERAL_SERVICE_AND_MORTUARIES:9352036,INVESTMENT_ADVISOR:9352037,EQUIPMENT_RENTAL:9352038,BUSINESS_SERVICES:9352039,CABLE_AND_TELEPHONE_COMPANY:9352040,AUTOMOBILE_MANUFACTURING:9352041,IMPORT_OR_EXPORT_AND_DISTRIBUTION:9352042,CATERING_SERVICES:9352043,HOME_APPLIANCE_REPAIR:9352044,ANIMAL_SHELTER:9352045,WEDDING_SERVICES:9352046,BEACH:9357,RESTAURANT_AREA:9359,ICE_RINK:9360,SHOP_OR_STORE:9361,BOOK_SHOP:9361002,C_DS_DVD_VIDEOS:9361003,CHILDREN_S_CLOTHES:9361004,FOOTWEAR_SHOE_REPAIRS:9361005,CLOTHING_SHOP:9361006,MEN_S_CLOTHING:9361007,WOMEN_S_CLOTHING:9361008,CONVENIENCE_STORE:9361009,DRY_CLEANER:9361010,CAMERAS_AND_PHOTOGRAPHY:9361011,COMPUTER_AND_COMPUTER_SUPPLIES:9361012,CONSUMER_ELECTRONICS:9361013,OFFICE_EQUIPMENT:9361014,REAL_ESTATE_AGENT:9361015,FACTORY_OUTLET:9361016,FLORISTS:9361017,BAKERY:9361018,BUTCHER:9361019,FISHMONGER:9361020,FOOD_MARKET:9361021,GREENGROCER:9361022,GROCERY_STORE:9361023,FOOD_AND_DRINKS_SHOP:9361024,WINE_SPIRITS:9361025,GIFTS_CARDS_NOVELTIES_SOUVENIRS:9361026,HAIRDRESSER:9361027,CARPET_FLOOR_COVERINGS:9361028,CURTAINS_TEXTILES:9361029,DO_IT_YOURSELF_CENTERS:9361030,HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:9361031,GARDEN_CENTERS_SERVICES:9361032,KITCHENS_BATHROOMS:9361033,LIGHTING_SHOPS:9361034,PAINTING_DECORATING:9361035,JEWELRY_CLOCKS_WATCHES:9361036,NEWSAGENTS_TOBACCONISTS:9361037,OPTICIAN:9361038,SPORTS_EQUIPMENT_AND_CLOTHING:9361039,TOYS_GAMES_SHOP:9361040,TRAVEL_AGENT:9361041,CONSTRUCTION_MATERIAL_AND_EQUIPMENT:9361042,MEDICAL_SUPPLIES_EQUIPMENT:9361043,VIDEO_RENTAL_SHOP:9361044,LAUNDRY:9361045,PHOTO_LAB_OR_DEVELOPMENT:9361046,PHOTOCOPY_SHOP:9361047,ANIMAL_SERVICE:9361048,ANTIQUE_ART_SHOP:9361049,BEAUTY_SUPPLIES:9361050,DRUG_STORE:9361051,ELECTRICAL_APPLIANCES_SHOP:9361052,HOBBY_SHOP:9361053,FURNITURE_HOME_FURNISHINGS:9361054,GLASSWARE_CERAMIC_SHOP:9361055,LOCAL_SPECIALITIES_SHOP:9361056,RECYCLING_SHOP:9361057,BAGS_LEATHERWEAR:9361058,MUSIC_INSTRUMENTS_STORE:9361059,DELICATESSEN:9361060,SPECIALTY_FOODS:9361061,SHOPPING_SERVICE:9361062,RETAIL_OUTLET:9361063,PET_SUPPLIES:9361064,WHOLESALE_CLUB:9361066,BEAUTY_SALON:9361067,NAIL_SALON:9361068,HARDWARE_STORE:9361069,PAWN_SHOP:9361070,LOTTERY_SHOP:9361071,BETTING_STATION:9361072,AGRICULTURAL_SUPPLIES:9361073,MOBILE_PHONE_SHOP:9361075,DRIVE_THROUGH_BOTTLE_SHOP:9361076,TAILOR_SHOP:9361077,SECURITY_PRODUCTS:9361078,SPECIALTY_CLOTHING_SHOP:9361079,GLASS_WINDOWS_STORE:9361080,VARIETY_STORE:9361081,CHRISTMAS_OR_HOLIDAY_SHOP:9361082,BOATING_EQUIPMENT_AND_ACCESSORIES:9361083,PARK_AND_RECREATION_AREA:9362,BATTLEFIELD:9362002,CEMETERY:9362003,HISTORIC_SITE:9362004,HISTORICAL_PARK:9362005,MEMORIAL:9362007,PARK:9362008,PARKWAY:9362009,RECREATION_AREA:9362011,WILDERNESS_AREA:9362014,FOREST_AREA:9362015,FISHING_AND_HUNTING_AREA:9362016,FAIRGROUND:9362017,SKI_RESORT:9362026,BOAT_LAUNCHING_RAMP:9362032,PICNIC_AREA:9362033,PROTECTED_LAND:9362037,COURTHOUSE:9363,CANNABIS_SHOP:9364,MEDICINAL_MARIJUANA_DISPENSARY:9364002,RECREATIONAL_MARIJUANA_DISPENSARY:9364003,MEDICINAL_AND_RECREATIONAL_DISPENSARY:9364004,TENNIS_COURT:9369,WATER_SPORT:9371,DOCTOR:9373,GENERAL_PRACTITIONER:9373002,SPECIALIST:9373003,DENTIST:9374,VETERINARY:9375,CAFE_PUB:9376,CAFE:9376002,PUB:9376003,INTERNET_CAFE:9376004,TEA_HOUSE:9376005,COFFEE_SHOP:9376006,MICROBREWERY:9376007,EXHIBITION_CONVENTION_CENTER:9377,LEISURE_CENTER:9378,BOWLING_CENTER:9378002,DANCE_STUDIO_AND_SCHOOL:9378003,FLYING_CLUB:9378004,SAUNA_SOLARIUM_MASSAGE:9378005,NIGHTLIFE:9379,DISCO_CLUB:9379002,BAR:9379004,COCKTAIL_BAR:9379006,JAZZ_CLUB:9379008,COMEDY_CLUB:9379009,KARAOKE_CLUB:9379010,COMMERCIAL_BUILDING:9382,INDUSTRIAL_BUILDING:9383,ABORIGINAL_LAND:9389,HEALTHCARE_SERVICE:9663,PERSONAL_SERVICE:9663002,PERSONAL_CARE_FACILITY:9663003,BLOOD_BANK:9663004,AMBULANCE_UNIT:9663005,ENTERTAINMENT:9900,AMUSEMENT_PARK:9902,AMUSEMENT_PARK_GENERIC:9902003,AMUSEMENT_PLACE:9902004,VEHICLE_DEALER:9910,CAR_DEALER:9910002,MOTORCYCLE_DEALER:9910003,BOAT_DEALER:9910004,RECREATIONAL_VEHICLE_DEALER:9910005,TRUCK_DEALER:9910006,VAN_DEALER:9910007,BUS_DEALER:9910008,ATV_DEALER:9910009,GOLF_COURSE:9911,PUBLIC_LIBRARY:9913,ZOOS_ARBORETA_BOTANICAL_GARDEN:9927,ARBORETA_AND_BOTANICAL_GARDENS:9927002,ZOO:9927003,AQUATIC_ZOO:9927004,WILDLIFE_PARK:9927005,RENTAL_CAR_PARKING:9930,PUBLIC_AMENITY:9932,PASSENGER_TRANSPORT_TICKET_OFFICE:9932002,PEDESTRIAN_SUBWAY:9932003,PUBLIC_CALL_BOX:9932004,PUBLIC_BATHROOM:9932005,RESCUE_SERVICE:9932006,MOUNTAIN_PASS:9935,CLUB_AND_ASSOCIATION:9937,BEACH_CLUB:9937002,HOCKEY_CLUB:9937003,PUBLIC_TRANSPORT_STOP:9942,BUS_STOP:9942002,TAXI_STAND:9942003,STREETCAR_STOP:9942004,EMERGENCY_ROOM:9956,RESIDENTIAL_ENTRANCE:9999},poiIDsToCategories=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(poiCategoriesToID).map(([e,t])=>[t,e])))(),isPOICategory=e=>Object.hasOwn(poiCategoriesToID,e),pointInsidePolygon=e=>{const t=(e[0]??[]).map(([,e])=>e),A=(Math.min(...t)+Math.max(...t))/2,E=[...new Set(e.flat().map(([,e])=>e))].sort((e,t)=>e-t),R=Math.max(E.findIndex(e=>e>A),1),n=(E[R-1]+E[R])/2,o=[];for(const I of e)for(let e=0,t=I.length-1;e<I.length;t=e++){const[A,E]=[I[t],I[e]];A[1]>n!=E[1]>n&&o.push(A[0]+(n-A[1])*(E[0]-A[0])/(E[1]-A[1]))}o.sort((e,t)=>e-t);let r=e[0]?.[0]??[0,0],T=0;for(let I=0;I+1<o.length;I+=2){const e=o[I+1]-o[I];e>T&&(T=e,r=[(o[I]+o[I+1])/2,n])}return r},getRoutePlanningLocationType=e=>Array.isArray(e)?Array.isArray(e[0])?"path":"waypoint":"Feature"===e.type&&"LineString"===e.geometry.type?"path":"waypoint",sdkErrorCodeForStatus=e=>401===e?"INVALID_CREDENTIALS":403===e?"INSUFFICIENT_PERMISSIONS":404===e?"NOT_FOUND":429===e?"RATE_LIMITED":e>=500?"LIVE_SERVICE_NOT_AVAILABLE":e>=400?"INVALID_REQUEST":"INTERNAL",retryableCodes=/* @__PURE__ */new Set(["RATE_LIMITED","LIVE_SERVICE_NOT_AVAILABLE","NETWORK_NOT_AVAILABLE"]),canRetrySDKErrorCode=e=>retryableCodes.has(e),apiErrorCodeIn=e=>{const t=get(e,["detailedError","code"]);return"string"==typeof t?t:void 0},apiErrorMessagePaths=[["errorText"],["message"],["detailedError","message"]],apiErrorMessageIn=e=>{for(const t of apiErrorMessagePaths){const A=get(e,t);if("string"==typeof A)return A}},describeAPIError=e=>{const{message:t,code:A,apiErrorCode:E,privatePreviewAccess:R}=e;if(!R||"INSUFFICIENT_PERMISSIONS"!==A||void 0!==E&&"Forbidden"!==E)return{message:t,apiErrorCode:E};const{product:n,requestAccessURL:o}=R;return{message:`${t}. ${n} is in Private Preview (https://docs.tomtom.com/legal/private-preview), and the API key needs access to it: request it from TomTom Sales at ${o}`,apiErrorCode:E,privatePreviewAccess:R}},getSectionsWithin=(e,{within:t,types:A=sectionTypes}={})=>{const E=metersAlongLine(e.geometry.coordinates),R={};for(const n of A){const A=e.properties.sections[n]??[],o=[],r=[];let T=0;for(const e of A){const{startPointIndex:A=0,endPointIndex:R=0}=e,n=metersWithin(E,{startPointIndex:A,endPointIndex:R},t);n>0&&(o.push(e),r.push(n/(E[R]-E[A])),T+=n)}o.length&&(R[n]={sections:o,shares:r,lengthInMeters:T})}return R},compareRoutes=(e,t,{types:A=inputSectionTypesWithGuidance}={})=>{const[E,R]=getDistinctSections([e,t]);return{distinct:E,referenceDistinct:R,adds:getSectionsWithin(e,{within:E,types:A}),avoids:getSectionsWithin(t,{within:R,types:A})}},indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategories=["other","accident","fog","danger","rain","frost","jam","lane-closed","road-closed","roadworks","wind","flooding","animals-on-road","narrow-lanes","broken-down-vehicle"],iconToTrafficIncidentCategory=e=>iconCategories[e]??"other",trafficIncidentToIconCategory=e=>Math.max(iconCategories.indexOf(e),0),minuteUnits=e=>e?.minutes??"min";function formatDuration(e,t){if(isNil(e))return;const A=Math.round(Math.abs(e)/60),E=Math.floor(A/60),R=A%60,n={...TomTomConfig.instance.get().displayUnits?.time,...definedFields(t)};return E?`${E} ${o=n,o?.hours??"hr"} ${R.toString().padStart(2,"0")} ${minuteUnits(n)}`:R?`${R.toString()} ${minuteUnits(n)}`:`${e?"< 1":"0"} ${minuteUnits(n)}`;var o}var MILE_IN_METERS=1609.344,meterUnits=e=>e?.meters??"m",kilometerUnits=e=>e?.kilometers??"km",roundHalfAwayFromZero=e=>Math.sign(e)*Math.round(Math.abs(e)),formatFeet=(e,t)=>{const A=t.feet??"ft",E=e/.3048,R=Math.abs(E);return R<30?`${roundHalfAwayFromZero(E)} ${A}`:R<500?`${10*roundHalfAwayFromZero(E/10)} ${A}`:`${100*roundHalfAwayFromZero(E/100)} ${A}`},formatYards=(e,t)=>{const A=t.yards??"yd",E=e/.9144;return Math.abs(E)<10?`${roundHalfAwayFromZero(E)} ${A}`:`${10*roundHalfAwayFromZero(E/10)} ${A}`},QUARTER_MILE_GLYPHS=["","¼","½","¾"],formatImperial=(e,t,A)=>{const E=e/1609.344;return Math.abs(E)<.125?A(e,t):((e,t)=>{const A=Math.abs(e);if(A>=10)return`${roundHalfAwayFromZero(e)} ${t}`;const E=A<3?1:2,R=Math.trunc(A),n=Math.round(4*(A-R)/E)*E,o=e<0?"-":"";return n%4?`${o}${R||""}${QUARTER_MILE_GLYPHS[n]} ${t}`:`${o}${R+n/4} ${t}`})(E,t.miles??"mi")},formatDistance=(e,t)=>{if(isNil(e))return"";const A={...TomTomConfig.instance.get().displayUnits?.distance,...definedFields(t)};switch(A?.type??"metric"){case"metric":return((e,t)=>{const A=Math.abs(e);if(A<10)return`${roundHalfAwayFromZero(10*e)/10} ${meterUnits(t)}`;if(A<500)return`${10*roundHalfAwayFromZero(e/10)} ${meterUnits(t)}`;if(A<1e3){const A=100*roundHalfAwayFromZero(e/100);return 1e3===Math.abs(A)?`${A/1e3} ${kilometerUnits(t)}`:`${A} ${meterUnits(t)}`}return A<1e4?`${100*roundHalfAwayFromZero(e/100)/1e3} ${kilometerUnits(t)}`:`${roundHalfAwayFromZero(e/1e3)} ${kilometerUnits(t)}`})(e,A);case"imperial_us":return formatImperial(e,A,formatFeet);case"imperial_uk":return formatImperial(e,A,formatYards)}},distinctBy=(e,t)=>{const A=/* @__PURE__ */new Set;return e.filter(e=>{const E=t(e);return void 0===E||!A.has(E)&&(A.add(E),!0)})};export{DEFAULT_COMMON_BASE_URL,EARTH_RADIUS_IN_METERS,MAX_MERCATOR_LATITUDE,MILE_IN_METERS,RADIANS_PER_DEGREE,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,aggregateIntoCells,apiErrorCodeIn,apiErrorMessageIn,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxLongitudeSpan,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,canRetrySDKErrorCode,chargingPointCapabilities,chargingPointRestrictions,clamp,clampLatitude,compareRoutes,connectorTypes,currentTypes,defaultConfig,defaultSectionTypes,definedFields,describeAPIError,distinctBy,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geometrySectionTypes,geopoliticalViews,getCoordinateAtRouteProgress,getCurveSections,getCurvyStretchSections,getDistinctSections,getImportantRoads,getInstructionLanes,getPosition,getPositionEntryPointOptions,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,getSectionOverlap,getSectionsWithin,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,insecureBaseURLMessage,isBBoxWithArea,isHairpin,isPOICategory,isProxyCredentialsMode,isSecureBaseURL,languages,latticeCellOf,latticeCellPolygon,mergeFromGlobal,metersAlongLine,metersWithin,pickKeys,placeTypes,placesLanguage,poiCategories,poiCategoriesLanguage,poiCategoriesToID,poiIDsToCategories,pointInsidePolygon,polygonFromBBox,positionBetween,sdkErrorCodeForStatus,sdkErrorCodes,sectionTypes,segmentAtMeters,servesGeopoliticalView,serviceLanguage,setApiKeyParameter,toPointGeometry,trafficIncidentLanguage,trafficIncidentRequestCategories,trafficIncidentTimeValidities,trafficIncidentToIconCategory,withCurveSections,withInsertedWaypoint,withInsertedWaypoints,withNearestLongitude,wrapDegrees,wrapLongitude};
|