@fieldia/map 0.0.0-stage → 0.14.1
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/LICENSE +21 -0
- package/README.md +98 -2
- package/package.json +37 -3
- package/src/index.d.mts +6 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +22 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +6 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/area.d.mts +3 -0
- package/src/lib/area.d.ts +3 -0
- package/src/lib/area.js +591 -0
- package/src/lib/area.js.map +1 -0
- package/src/lib/area.mjs +588 -0
- package/src/lib/area.mjs.map +1 -0
- package/src/lib/geo.d.mts +72 -0
- package/src/lib/geo.d.ts +72 -0
- package/src/lib/geo.js +149 -0
- package/src/lib/geo.js.map +1 -0
- package/src/lib/geo.mjs +134 -0
- package/src/lib/geo.mjs.map +1 -0
- package/src/lib/kinds.d.mts +35 -0
- package/src/lib/kinds.d.ts +35 -0
- package/src/lib/kinds.js +127 -0
- package/src/lib/kinds.js.map +1 -0
- package/src/lib/kinds.mjs +124 -0
- package/src/lib/kinds.mjs.map +1 -0
- package/src/lib/labels.d.mts +62 -0
- package/src/lib/labels.d.ts +62 -0
- package/src/lib/labels.js +226 -0
- package/src/lib/labels.js.map +1 -0
- package/src/lib/labels.mjs +221 -0
- package/src/lib/labels.mjs.map +1 -0
- package/src/lib/leaflet-css.d.mts +2 -0
- package/src/lib/leaflet-css.d.ts +2 -0
- package/src/lib/leaflet-css.js +34 -0
- package/src/lib/leaflet-css.js.map +1 -0
- package/src/lib/leaflet-css.mjs +31 -0
- package/src/lib/leaflet-css.mjs.map +1 -0
- package/src/lib/leaflet.d.mts +15 -0
- package/src/lib/leaflet.d.ts +15 -0
- package/src/lib/leaflet.js +76 -0
- package/src/lib/leaflet.js.map +1 -0
- package/src/lib/leaflet.mjs +72 -0
- package/src/lib/leaflet.mjs.map +1 -0
- package/src/lib/map-core.d.mts +49 -0
- package/src/lib/map-core.d.ts +49 -0
- package/src/lib/map-core.js +312 -0
- package/src/lib/map-core.js.map +1 -0
- package/src/lib/map-core.mjs +308 -0
- package/src/lib/map-core.mjs.map +1 -0
- package/src/lib/place.d.mts +3 -0
- package/src/lib/place.d.ts +3 -0
- package/src/lib/place.js +363 -0
- package/src/lib/place.js.map +1 -0
- package/src/lib/place.mjs +360 -0
- package/src/lib/place.mjs.map +1 -0
- package/src/lib/providers.d.mts +152 -0
- package/src/lib/providers.d.ts +152 -0
- package/src/lib/providers.js +408 -0
- package/src/lib/providers.js.map +1 -0
- package/src/lib/providers.mjs +401 -0
- package/src/lib/providers.mjs.map +1 -0
- package/src/lib/search-box.d.mts +30 -0
- package/src/lib/search-box.d.ts +30 -0
- package/src/lib/search-box.js +155 -0
- package/src/lib/search-box.js.map +1 -0
- package/src/lib/search-box.mjs +152 -0
- package/src/lib/search-box.mjs.map +1 -0
- package/src/lib/settings.d.mts +19 -0
- package/src/lib/settings.d.ts +19 -0
- package/src/lib/settings.js +3 -0
- package/src/lib/settings.js.map +1 -0
- package/src/lib/settings.mjs +2 -0
- package/src/lib/settings.mjs.map +1 -0
- package/src/lib/styles.d.mts +11 -0
- package/src/lib/styles.d.ts +11 -0
- package/src/lib/styles.js +130 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/styles.mjs +125 -0
- package/src/lib/styles.mjs.map +1 -0
- package/src/lib/widgets.d.mts +14 -0
- package/src/lib/widgets.d.ts +14 -0
- package/src/lib/widgets.js +21 -0
- package/src/lib/widgets.js.map +1 -0
- package/src/lib/widgets.mjs +18 -0
- package/src/lib/widgets.mjs.map +1 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { Locale } from '@fieldia/core';
|
|
2
|
+
import type { Bounds, LatLng } from './geo';
|
|
3
|
+
/**
|
|
4
|
+
* Where a map's images, credits and address search come from. Every map in
|
|
5
|
+
* the package draws through one of these, so an app changes provider in one
|
|
6
|
+
* place and nothing else moves. Keys never live in Fieldia: the app passes
|
|
7
|
+
* them, or a function that fetches a short-lived token from its own server.
|
|
8
|
+
* Credits are text and links built here, never HTML from a provider.
|
|
9
|
+
*/
|
|
10
|
+
export type BaseMap = 'road' | 'dark' | 'satellite';
|
|
11
|
+
export interface TileSpec {
|
|
12
|
+
/** With `{z}`, `{x}` and `{y}` where the tile's numbers go. */
|
|
13
|
+
url: string;
|
|
14
|
+
maxZoom: number;
|
|
15
|
+
tileSize?: number;
|
|
16
|
+
zoomOffset?: number;
|
|
17
|
+
/** Headers each image is fetched with: a token that must not sit in an address. */
|
|
18
|
+
headers?: () => Promise<Record<string, string>>;
|
|
19
|
+
}
|
|
20
|
+
export interface Credit {
|
|
21
|
+
text: string;
|
|
22
|
+
href?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface MapView {
|
|
25
|
+
zoom: number;
|
|
26
|
+
bounds: Bounds;
|
|
27
|
+
}
|
|
28
|
+
export interface PlaceFound {
|
|
29
|
+
/** The place itself: a name, or a street and its number. */
|
|
30
|
+
label: string;
|
|
31
|
+
/** Where it is, on the line under it: its district, city, country. */
|
|
32
|
+
detail?: string;
|
|
33
|
+
/** Where it is on the map; or, for a provider whose suggestions carry none (Google's), `locate` finds it when the place is picked. */
|
|
34
|
+
lat?: number;
|
|
35
|
+
lng?: number;
|
|
36
|
+
locate?: () => Promise<{
|
|
37
|
+
lat: number;
|
|
38
|
+
lng: number;
|
|
39
|
+
address?: string;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
export interface SearchRequest {
|
|
43
|
+
text: string;
|
|
44
|
+
/** Where the map is: results near it first. */
|
|
45
|
+
near?: LatLng;
|
|
46
|
+
/** How close the map is, for how far "near" reaches. */
|
|
47
|
+
zoom?: number;
|
|
48
|
+
locale: Locale;
|
|
49
|
+
signal?: AbortSignal;
|
|
50
|
+
}
|
|
51
|
+
export type AddressSearch = (request: SearchRequest) => Promise<PlaceFound[]>;
|
|
52
|
+
export type ReverseSearch = (at: LatLng & {
|
|
53
|
+
locale: Locale;
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
}) => Promise<string | null>;
|
|
56
|
+
export interface MapProvider {
|
|
57
|
+
readonly id: string;
|
|
58
|
+
/** The map images of a kind, or null when the provider has none of it. */
|
|
59
|
+
tiles(kind: BaseMap, locale: Locale): Promise<TileSpec | null>;
|
|
60
|
+
/** What must be credited under the map, for what is in view. */
|
|
61
|
+
credits(kind: BaseMap, view: MapView, locale: Locale): Promise<Credit[]>;
|
|
62
|
+
/** The provider's mark, which its terms ask for in the map's corner. */
|
|
63
|
+
readonly logo?: {
|
|
64
|
+
text: string;
|
|
65
|
+
image?: string;
|
|
66
|
+
href?: string;
|
|
67
|
+
};
|
|
68
|
+
readonly search?: AddressSearch;
|
|
69
|
+
readonly reverse?: ReverseSearch;
|
|
70
|
+
/** Whether its terms allow a search for each pause in typing; otherwise it searches when Enter is pressed. */
|
|
71
|
+
readonly searchAsYouType?: boolean;
|
|
72
|
+
/** Free for trying things out, not for an app in use: a warning says so once. */
|
|
73
|
+
readonly demoOnly?: boolean;
|
|
74
|
+
}
|
|
75
|
+
type Fetch = typeof globalThis.fetch;
|
|
76
|
+
export interface OpenStreetMapOptions {
|
|
77
|
+
/**
|
|
78
|
+
* Whose search: Photon (komoot's, on OpenStreetMap's data), which answers as
|
|
79
|
+
* people type, nearest the map first; or Nominatim, OpenStreetMap's own,
|
|
80
|
+
* whose policy allows a search only when Enter is pressed.
|
|
81
|
+
*/
|
|
82
|
+
search?: 'photon' | 'nominatim';
|
|
83
|
+
/** Photon's address, for a copy of it the app runs: `https://photon.komoot.io` unless said. */
|
|
84
|
+
photonUrl?: string;
|
|
85
|
+
fetch?: Fetch;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* OpenStreetMap's own map images, for demos and development only (its usage
|
|
89
|
+
* policy treats an app in production as heavy use), with Photon's search,
|
|
90
|
+
* which answers as people type, or Nominatim's.
|
|
91
|
+
*/
|
|
92
|
+
export declare function openStreetMap(options?: OpenStreetMapOptions): MapProvider;
|
|
93
|
+
export interface AzureMapsOptions {
|
|
94
|
+
/** A subscription key, restricted to the app's sites in Azure. */
|
|
95
|
+
key?: string;
|
|
96
|
+
/** Or a Microsoft Entra token, fetched from the app's own server; sent in a header with `clientId`. */
|
|
97
|
+
token?: () => Promise<string>;
|
|
98
|
+
clientId?: string;
|
|
99
|
+
fetch?: Fetch;
|
|
100
|
+
}
|
|
101
|
+
/** Microsoft Azure Maps: road, dark and satellite map images, credits for the view, and address search. */
|
|
102
|
+
export declare function azureMaps(options: AzureMapsOptions): MapProvider;
|
|
103
|
+
export interface GoogleMapsOptions {
|
|
104
|
+
key: string;
|
|
105
|
+
/** The country whose borders and names the map follows (CLDR, such as `EG`). */
|
|
106
|
+
region?: string;
|
|
107
|
+
/** Google's logo, as an image the app serves; its name is shown in its place until one is given. */
|
|
108
|
+
logo?: string;
|
|
109
|
+
fetch?: Fetch;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Google's map images through its Map Tiles API (a session for each kind and
|
|
113
|
+
* language, credits for the view, Google's mark in the corner its terms
|
|
114
|
+
* name), its Places API's suggestions as people type, and its Geocoding API
|
|
115
|
+
* to name a point. The key needs those three APIs enabled, and should be
|
|
116
|
+
* restricted to the app's sites.
|
|
117
|
+
*/
|
|
118
|
+
export declare function googleMaps(options: GoogleMapsOptions): MapProvider;
|
|
119
|
+
export interface MapboxOptions {
|
|
120
|
+
token: string;
|
|
121
|
+
/** Style ids, `owner/style`. */
|
|
122
|
+
style?: string;
|
|
123
|
+
darkStyle?: string;
|
|
124
|
+
satelliteStyle?: string;
|
|
125
|
+
/** Mapbox's wordmark, as an image the app serves; its name is shown until one is given. */
|
|
126
|
+
logo?: string;
|
|
127
|
+
/**
|
|
128
|
+
* Ask for results the app may keep (Mapbox's permanent geocoding). On by
|
|
129
|
+
* default, because a place field keeps what it finds; off only for an app
|
|
130
|
+
* that stores nothing.
|
|
131
|
+
*/
|
|
132
|
+
permanent?: boolean;
|
|
133
|
+
fetch?: Fetch;
|
|
134
|
+
}
|
|
135
|
+
/** Mapbox: its styles as map images, its credits and wordmark, and its address search as people type. */
|
|
136
|
+
export declare function mapbox(options: MapboxOptions): MapProvider;
|
|
137
|
+
export interface TilesOptions {
|
|
138
|
+
/** With `{z}`, `{x}` and `{y}`: the app's own map images, or any provider's. */
|
|
139
|
+
url: string;
|
|
140
|
+
darkUrl?: string;
|
|
141
|
+
satelliteUrl?: string;
|
|
142
|
+
credit: Credit | Credit[];
|
|
143
|
+
maxZoom?: number;
|
|
144
|
+
tileSize?: number;
|
|
145
|
+
zoomOffset?: number;
|
|
146
|
+
search?: AddressSearch;
|
|
147
|
+
reverse?: ReverseSearch;
|
|
148
|
+
searchAsYouType?: boolean;
|
|
149
|
+
}
|
|
150
|
+
/** Map images from any address, such as the app's own server, with their credit. */
|
|
151
|
+
export declare function tiles(options: TilesOptions): MapProvider;
|
|
152
|
+
export {};
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openStreetMap = openStreetMap;
|
|
4
|
+
exports.azureMaps = azureMaps;
|
|
5
|
+
exports.googleMaps = googleMaps;
|
|
6
|
+
exports.mapbox = mapbox;
|
|
7
|
+
exports.tiles = tiles;
|
|
8
|
+
const query = (params) => Object.entries(params)
|
|
9
|
+
.filter(([, value]) => value !== undefined)
|
|
10
|
+
.map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)
|
|
11
|
+
.join('&');
|
|
12
|
+
/**
|
|
13
|
+
* A provider's answer, or its refusal in its own words: "Places API (New) has
|
|
14
|
+
* not been used in project … or it is disabled" says what to do; a bare 403
|
|
15
|
+
* does not.
|
|
16
|
+
*/
|
|
17
|
+
async function getJson(fetchWith, url, init) {
|
|
18
|
+
const response = await fetchWith(url, init);
|
|
19
|
+
if (response.ok)
|
|
20
|
+
return response.json();
|
|
21
|
+
const body = await response.json().catch(() => null);
|
|
22
|
+
const said = pathOf(body, 'error', 'message') ?? pathOf(body, 'error_message') ?? pathOf(body, 'message');
|
|
23
|
+
throw new Error(`${url.split('?')[0]} answered ${response.status}${typeof said === 'string' && said ? `: ${said}` : ''}`);
|
|
24
|
+
}
|
|
25
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
26
|
+
const pathOf = (value, ...path) => path.reduce((at, key) => (isObject(at) ? at[key] : undefined), value);
|
|
27
|
+
/** A provider's words, without the direction marks and embeddings Azure and Google put in Arabic: unseen, they would stay in an address field and its searches. */
|
|
28
|
+
const clean = (value) => (typeof value === 'string' ? value.replace(/[\u200e\u200f\u061c\u202a-\u202e\u2066-\u2069]/g, '').trim() : '');
|
|
29
|
+
const ENTITIES = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', copy: '©', reg: '®' };
|
|
30
|
+
/** A credit a provider sends as HTML (Azure's are links), as the words a reader sees: never put on the page as HTML. */
|
|
31
|
+
const textOfHtml = (html) => html
|
|
32
|
+
.replace(/<[^>]*>/g, '')
|
|
33
|
+
.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z]+);/gi, (all, name) => name[0] === '#' ? String.fromCodePoint(parseInt(name.slice(name[1] === 'x' || name[1] === 'X' ? 2 : 1), name[1] === 'x' || name[1] === 'X' ? 16 : 10)) : (ENTITIES[name.toLowerCase()] ?? all))
|
|
34
|
+
.trim();
|
|
35
|
+
/** The words of a list that are there, once each, joined: "Downtown, Cairo, Egypt". */
|
|
36
|
+
const joined = (...parts) => {
|
|
37
|
+
const seen = [];
|
|
38
|
+
for (const part of parts)
|
|
39
|
+
if (typeof part === 'string' && part.trim() && !seen.includes(part.trim()))
|
|
40
|
+
seen.push(part.trim());
|
|
41
|
+
return seen.join(', ');
|
|
42
|
+
};
|
|
43
|
+
/** Places from a GeoJSON FeatureCollection: each named by the first of `labels` it has, with the line under it from `detail`. */
|
|
44
|
+
function placesFrom(collection, labels, detail) {
|
|
45
|
+
const features = pathOf(collection, 'features');
|
|
46
|
+
if (!Array.isArray(features))
|
|
47
|
+
return [];
|
|
48
|
+
return features.flatMap((feature) => {
|
|
49
|
+
const [lng, lat] = pathOf(feature, 'geometry', 'coordinates') ?? [];
|
|
50
|
+
const label = labels.map((path) => pathOf(feature, ...path)).find((text) => typeof text === 'string' && text.trim());
|
|
51
|
+
if (typeof lat !== 'number' || typeof lng !== 'number' || typeof label !== 'string')
|
|
52
|
+
return [];
|
|
53
|
+
const under = detail?.(pathOf(feature, 'properties'));
|
|
54
|
+
return [{ label, ...(under && under !== label ? { detail: under } : {}), lat, lng }];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Languages Photon names places in; in any other it gives the places' own names. */
|
|
58
|
+
const PHOTON_LANGUAGES = new Set(['en', 'de', 'fr']);
|
|
59
|
+
/** Photon's places: each one's name (or its street and number) on one line, where it is on the next. */
|
|
60
|
+
function photonPlaces(found) {
|
|
61
|
+
const features = pathOf(found, 'features');
|
|
62
|
+
if (!Array.isArray(features))
|
|
63
|
+
return [];
|
|
64
|
+
return features.flatMap((feature) => {
|
|
65
|
+
const [lng, lat] = pathOf(feature, 'geometry', 'coordinates') ?? [];
|
|
66
|
+
const p = pathOf(feature, 'properties');
|
|
67
|
+
const name = pathOf(p, 'name');
|
|
68
|
+
const label = typeof name === 'string' && name.trim() ? name.trim() : streetOf(p);
|
|
69
|
+
if (typeof lat !== 'number' || typeof lng !== 'number' || !label)
|
|
70
|
+
return [];
|
|
71
|
+
// Under a named place, its street when it has one; then its district, city and country.
|
|
72
|
+
const detail = joined(label === streetOf(p) ? '' : streetOf(p), pathOf(p, 'district'), pathOf(p, 'city'), pathOf(p, 'state'), pathOf(p, 'country'));
|
|
73
|
+
return [{ label, ...(detail ? { detail } : {}), lat, lng }];
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* OpenStreetMap's own map images, for demos and development only (its usage
|
|
78
|
+
* policy treats an app in production as heavy use), with Photon's search,
|
|
79
|
+
* which answers as people type, or Nominatim's.
|
|
80
|
+
*/
|
|
81
|
+
function openStreetMap(options = {}) {
|
|
82
|
+
const fetchWith = options.fetch ?? ((...args) => globalThis.fetch(...args));
|
|
83
|
+
const photon = (options.photonUrl ?? 'https://photon.komoot.io').replace(/\/$/, '');
|
|
84
|
+
const base = {
|
|
85
|
+
id: 'openstreetmap',
|
|
86
|
+
demoOnly: true,
|
|
87
|
+
async tiles(kind) {
|
|
88
|
+
return kind === 'road' ? { url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', maxZoom: 19 } : null;
|
|
89
|
+
},
|
|
90
|
+
async credits() {
|
|
91
|
+
return [{ text: '© OpenStreetMap contributors', href: 'https://www.openstreetmap.org/copyright' }];
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
if (options.search === 'nominatim') {
|
|
95
|
+
return {
|
|
96
|
+
...base,
|
|
97
|
+
searchAsYouType: false,
|
|
98
|
+
async search({ text, locale, signal }) {
|
|
99
|
+
const found = await getJson(fetchWith, `https://nominatim.openstreetmap.org/search?${query({ format: 'jsonv2', limit: 5, q: text, 'accept-language': locale })}`, { signal });
|
|
100
|
+
return Array.isArray(found)
|
|
101
|
+
? found.flatMap((place) => {
|
|
102
|
+
const lat = Number(pathOf(place, 'lat'));
|
|
103
|
+
const lng = Number(pathOf(place, 'lon'));
|
|
104
|
+
const whole = pathOf(place, 'display_name');
|
|
105
|
+
if (!Number.isFinite(lat) || !Number.isFinite(lng) || typeof whole !== 'string')
|
|
106
|
+
return [];
|
|
107
|
+
const name = pathOf(place, 'name');
|
|
108
|
+
const label = typeof name === 'string' && name.trim() ? name : whole.split(',')[0];
|
|
109
|
+
const rest = whole.split(',').map((part) => part.trim()).filter((part, i) => !(i === 0 && part === label));
|
|
110
|
+
return [{ label, ...(rest.length ? { detail: rest.join(', ') } : {}), lat, lng }];
|
|
111
|
+
})
|
|
112
|
+
: [];
|
|
113
|
+
},
|
|
114
|
+
async reverse({ lat, lng, locale, signal }) {
|
|
115
|
+
const found = await getJson(fetchWith, `https://nominatim.openstreetmap.org/reverse?${query({ format: 'jsonv2', lat, lon: lng, 'accept-language': locale })}`, { signal });
|
|
116
|
+
const label = pathOf(found, 'display_name');
|
|
117
|
+
return typeof label === 'string' ? label : null;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const lang = (locale) => (PHOTON_LANGUAGES.has(locale) ? locale : undefined);
|
|
122
|
+
return {
|
|
123
|
+
...base,
|
|
124
|
+
searchAsYouType: true,
|
|
125
|
+
async search({ text, near, zoom, locale, signal }) {
|
|
126
|
+
const found = await getJson(fetchWith, `${photon}/api?${query({ q: text, limit: 6, lang: lang(locale), lat: near?.lat, lon: near?.lng, zoom: near && zoom !== undefined ? Math.round(zoom) : undefined })}`, { signal });
|
|
127
|
+
return photonPlaces(found);
|
|
128
|
+
},
|
|
129
|
+
async reverse({ lat, lng, locale, signal }) {
|
|
130
|
+
const found = await getJson(fetchWith, `${photon}/reverse?${query({ lat, lon: lng, limit: 1, lang: lang(locale) })}`, { signal });
|
|
131
|
+
const [place] = photonPlaces(found);
|
|
132
|
+
return place ? joined(place.label, place.detail) : null;
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** A street with its number, as a place without a name of its own is called. */
|
|
137
|
+
function streetOf(properties) {
|
|
138
|
+
const street = pathOf(properties, 'street');
|
|
139
|
+
const number = pathOf(properties, 'housenumber');
|
|
140
|
+
return typeof street === 'string' ? [street, typeof number === 'string' ? number : ''].filter(Boolean).join(' ') : '';
|
|
141
|
+
}
|
|
142
|
+
/** Azure lists the languages it draws; it refuses any other tag, `ar-001` among them. */
|
|
143
|
+
const AZURE_LANGUAGE = { en: 'en-US', ar: 'ar', fr: 'fr-FR', de: 'de-DE' };
|
|
144
|
+
const AZURE_TILESET = { road: 'microsoft.base.road', dark: 'microsoft.base.darkgrey', satellite: 'microsoft.imagery' };
|
|
145
|
+
/** Microsoft Azure Maps: road, dark and satellite map images, credits for the view, and address search. */
|
|
146
|
+
function azureMaps(options) {
|
|
147
|
+
if (!options.key && !options.token)
|
|
148
|
+
throw new Error('azureMaps needs a key or a token');
|
|
149
|
+
const fetchWith = options.fetch ?? ((...args) => globalThis.fetch(...args));
|
|
150
|
+
const auth = options.key ? `&subscription-key=${encodeURIComponent(options.key)}` : '';
|
|
151
|
+
const headers = async () => options.key ? {} : { Authorization: `Bearer ${await options.token()}`, ...(options.clientId ? { 'x-ms-client-id': options.clientId } : {}) };
|
|
152
|
+
const ask = async (path, params, locale, signal) => getJson(fetchWith, `https://atlas.microsoft.com/${path}?${query(params)}${auth}`, {
|
|
153
|
+
signal,
|
|
154
|
+
headers: { ...(await headers()), ...(locale ? { 'Accept-Language': AZURE_LANGUAGE[locale] } : {}) },
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
id: 'azure-maps',
|
|
158
|
+
searchAsYouType: true,
|
|
159
|
+
async tiles(kind, locale) {
|
|
160
|
+
const url = `https://atlas.microsoft.com/map/tile?api-version=2024-04-01&tilesetId=${AZURE_TILESET[kind]}&zoom={z}&x={x}&y={y}&tileSize=256&language=${AZURE_LANGUAGE[locale]}&view=Auto${auth}`;
|
|
161
|
+
return { url, maxZoom: kind === 'satellite' ? 19 : 22, ...(options.key ? {} : { headers }) };
|
|
162
|
+
},
|
|
163
|
+
async credits(kind, { zoom, bounds }) {
|
|
164
|
+
try {
|
|
165
|
+
const answer = await ask('map/attribution', { 'api-version': '2024-04-01', tilesetId: AZURE_TILESET[kind], zoom: Math.round(zoom), bounds: [bounds.west, bounds.south, bounds.east, bounds.north].join(',') });
|
|
166
|
+
const copyrights = pathOf(answer, 'copyrights');
|
|
167
|
+
if (Array.isArray(copyrights) && copyrights.length)
|
|
168
|
+
return copyrights.filter((c) => typeof c === 'string').map((html) => ({ text: textOfHtml(html) })).filter((c) => c.text);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Its credits stay said even when the service that lists them is down.
|
|
172
|
+
}
|
|
173
|
+
return [{ text: '© Microsoft' }];
|
|
174
|
+
},
|
|
175
|
+
async search({ text, near, locale, signal }) {
|
|
176
|
+
const coordinates = near ? `${near.lng},${near.lat}` : undefined;
|
|
177
|
+
// Its autocomplete reads a word half typed, as geocoding does not; its suggestions carry no place, so a picked one is geocoded then.
|
|
178
|
+
const found = await ask('geocode:autocomplete', { 'api-version': '2026-01-01', top: 5, query: text, coordinates }, locale, signal);
|
|
179
|
+
return azurePlaces(found).map((place) => ({
|
|
180
|
+
...place,
|
|
181
|
+
locate: async () => {
|
|
182
|
+
const address = [place.label, place.detail].filter(Boolean).join(', ');
|
|
183
|
+
const [hit] = azurePlaces(await ask('geocode', { 'api-version': '2023-06-01', top: 1, query: place.whole ?? address, coordinates }, locale));
|
|
184
|
+
if (hit?.lat === undefined || hit.lng === undefined)
|
|
185
|
+
throw new Error('Azure Maps found no place');
|
|
186
|
+
// The address as its two lines read: with its town, which Azure's own may leave out.
|
|
187
|
+
return { lat: hit.lat, lng: hit.lng, address };
|
|
188
|
+
},
|
|
189
|
+
})).map(({ whole: _whole, ...place }) => place);
|
|
190
|
+
},
|
|
191
|
+
async reverse({ lat, lng, locale, signal }) {
|
|
192
|
+
const found = await ask('reverseGeocode', { 'api-version': '2023-06-01', coordinates: `${lng},${lat}` }, locale, signal);
|
|
193
|
+
const features = pathOf(found, 'features');
|
|
194
|
+
const formatted = Array.isArray(features) ? clean(pathOf(features[0], 'properties', 'address', 'formattedAddress')) : '';
|
|
195
|
+
return formatted || null;
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Azure's addresses on two lines: the street (or the place's name), then the
|
|
201
|
+
* rest of the address, its town always in it; where it is, when the answer
|
|
202
|
+
* says (geocoding does, autocomplete does not); and the whole address as Azure
|
|
203
|
+
* wrote it, to geocode a suggestion by.
|
|
204
|
+
*/
|
|
205
|
+
function azurePlaces(found) {
|
|
206
|
+
const features = pathOf(found, 'features');
|
|
207
|
+
if (!Array.isArray(features))
|
|
208
|
+
return [];
|
|
209
|
+
return features.flatMap((feature) => {
|
|
210
|
+
const [lng, lat] = pathOf(feature, 'geometry', 'coordinates') ?? [];
|
|
211
|
+
const address = pathOf(feature, 'properties', 'address');
|
|
212
|
+
const whole = clean(pathOf(address, 'formattedAddress'));
|
|
213
|
+
const parts = whole
|
|
214
|
+
.split(',')
|
|
215
|
+
.map((part) => part.trim())
|
|
216
|
+
.filter(Boolean);
|
|
217
|
+
const label = clean(pathOf(address, 'addressLine')) || parts[0];
|
|
218
|
+
if (!label)
|
|
219
|
+
return [];
|
|
220
|
+
let rest = parts.filter((part, i) => !(i === 0 && part === label) && part !== label);
|
|
221
|
+
const town = clean(pathOf(address, 'locality'));
|
|
222
|
+
if (town && !rest.includes(town))
|
|
223
|
+
rest = [town, ...rest];
|
|
224
|
+
const at = typeof lat === 'number' && typeof lng === 'number' ? { lat, lng } : {};
|
|
225
|
+
return [{ label, ...(rest.length ? { detail: rest.join(', ') } : {}), ...at, ...(whole ? { whole } : {}) }];
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
const GOOGLE_MAP_TYPE = { road: 'roadmap', satellite: 'satellite' };
|
|
229
|
+
/**
|
|
230
|
+
* Google's map images through its Map Tiles API (a session for each kind and
|
|
231
|
+
* language, credits for the view, Google's mark in the corner its terms
|
|
232
|
+
* name), its Places API's suggestions as people type, and its Geocoding API
|
|
233
|
+
* to name a point. The key needs those three APIs enabled, and should be
|
|
234
|
+
* restricted to the app's sites.
|
|
235
|
+
*/
|
|
236
|
+
function googleMaps(options) {
|
|
237
|
+
const fetchWith = options.fetch ?? ((...args) => globalThis.fetch(...args));
|
|
238
|
+
const key = encodeURIComponent(options.key);
|
|
239
|
+
const sessions = new Map();
|
|
240
|
+
function session(kind, locale) {
|
|
241
|
+
const mapType = GOOGLE_MAP_TYPE[kind];
|
|
242
|
+
const id = `${mapType}:${locale}`;
|
|
243
|
+
const known = sessions.get(id);
|
|
244
|
+
return known ?? open();
|
|
245
|
+
function open() {
|
|
246
|
+
const opening = getJson(fetchWith, `https://tile.googleapis.com/v1/createSession?key=${key}`, {
|
|
247
|
+
method: 'POST',
|
|
248
|
+
headers: { 'Content-Type': 'application/json' },
|
|
249
|
+
body: JSON.stringify({ mapType, language: locale, region: options.region ?? 'US' }),
|
|
250
|
+
}).then((answer) => {
|
|
251
|
+
const value = pathOf(answer, 'session');
|
|
252
|
+
if (typeof value !== 'string')
|
|
253
|
+
throw new Error('Google gave no session');
|
|
254
|
+
const expiry = Number(pathOf(answer, 'expiry')) * 1000;
|
|
255
|
+
// A session lasts about two weeks; one near its end is opened again.
|
|
256
|
+
if (Number.isFinite(expiry)) {
|
|
257
|
+
const timer = setTimeout(() => sessions.delete(id), Math.min(2 ** 31 - 1, Math.max(0, expiry - Date.now() - 3_600_000)));
|
|
258
|
+
// In Node (a test, a server), a timer waiting two weeks must not keep the process alive.
|
|
259
|
+
timer.unref?.();
|
|
260
|
+
}
|
|
261
|
+
return { session: value, expiry };
|
|
262
|
+
});
|
|
263
|
+
opening.catch(() => sessions.delete(id));
|
|
264
|
+
sessions.set(id, opening);
|
|
265
|
+
return opening;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** One session from the first letter typed to the place picked: Google charges the suggestions of a session that ends in a pick as the pick. */
|
|
269
|
+
let searching;
|
|
270
|
+
const newSession = () => (globalThis.crypto?.randomUUID?.() ?? 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => ((Math.random() * 16) | (c === 'x' ? 0 : 8)).toString(16).slice(0, 1)));
|
|
271
|
+
/** How far "near" reaches at a zoom: about what the map shows, within Google's bounds. */
|
|
272
|
+
const radiusAt = (zoom) => Math.round(Math.min(50_000, Math.max(100, 40_075_016 / 2 ** (zoom ?? 12))));
|
|
273
|
+
return {
|
|
274
|
+
id: 'google',
|
|
275
|
+
logo: { text: 'Google Maps', ...(options.logo ? { image: options.logo } : {}) },
|
|
276
|
+
searchAsYouType: true,
|
|
277
|
+
async search({ text, near, zoom, locale, signal }) {
|
|
278
|
+
searching ??= newSession();
|
|
279
|
+
const token = searching;
|
|
280
|
+
const answer = await getJson(fetchWith, 'https://places.googleapis.com/v1/places:autocomplete', {
|
|
281
|
+
method: 'POST',
|
|
282
|
+
signal,
|
|
283
|
+
headers: { 'Content-Type': 'application/json', 'X-Goog-Api-Key': options.key },
|
|
284
|
+
body: JSON.stringify({
|
|
285
|
+
input: text,
|
|
286
|
+
languageCode: locale,
|
|
287
|
+
...(options.region ? { regionCode: options.region } : {}),
|
|
288
|
+
sessionToken: token,
|
|
289
|
+
...(near ? { locationBias: { circle: { center: { latitude: near.lat, longitude: near.lng }, radius: radiusAt(zoom) } } } : {}),
|
|
290
|
+
}),
|
|
291
|
+
});
|
|
292
|
+
const suggestions = pathOf(answer, 'suggestions');
|
|
293
|
+
if (!Array.isArray(suggestions))
|
|
294
|
+
return [];
|
|
295
|
+
return suggestions.flatMap((suggestion) => {
|
|
296
|
+
const prediction = pathOf(suggestion, 'placePrediction');
|
|
297
|
+
const placeId = pathOf(prediction, 'placeId');
|
|
298
|
+
const label = clean(pathOf(prediction, 'structuredFormat', 'mainText', 'text')) || clean(pathOf(prediction, 'text', 'text'));
|
|
299
|
+
if (typeof placeId !== 'string' || !label)
|
|
300
|
+
return [];
|
|
301
|
+
const detail = clean(pathOf(prediction, 'structuredFormat', 'secondaryText', 'text'));
|
|
302
|
+
return [
|
|
303
|
+
{
|
|
304
|
+
label,
|
|
305
|
+
...(detail ? { detail } : {}),
|
|
306
|
+
locate: async () => {
|
|
307
|
+
const place = await getJson(fetchWith, `https://places.googleapis.com/v1/places/${encodeURIComponent(placeId)}?${query({ languageCode: locale, sessionToken: token })}`, {
|
|
308
|
+
headers: { 'X-Goog-Api-Key': options.key, 'X-Goog-FieldMask': 'location,formattedAddress' },
|
|
309
|
+
});
|
|
310
|
+
// Picked: the session is over, the next letter typed opens another.
|
|
311
|
+
if (searching === token)
|
|
312
|
+
searching = undefined;
|
|
313
|
+
const latitude = pathOf(place, 'location', 'latitude');
|
|
314
|
+
const longitude = pathOf(place, 'location', 'longitude');
|
|
315
|
+
if (typeof latitude !== 'number' || typeof longitude !== 'number')
|
|
316
|
+
throw new Error('Google gave no place');
|
|
317
|
+
const address = clean(pathOf(place, 'formattedAddress'));
|
|
318
|
+
return { lat: latitude, lng: longitude, ...(address ? { address } : {}) };
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
];
|
|
322
|
+
});
|
|
323
|
+
},
|
|
324
|
+
async reverse({ lat, lng, locale, signal }) {
|
|
325
|
+
const answer = await getJson(fetchWith, `https://maps.googleapis.com/maps/api/geocode/json?${query({ latlng: `${lat},${lng}`, language: locale, key: options.key })}`, { signal });
|
|
326
|
+
// The Geocoding API refuses inside a 200: its status says so, and its message why.
|
|
327
|
+
const status = pathOf(answer, 'status');
|
|
328
|
+
if (typeof status === 'string' && status !== 'OK' && status !== 'ZERO_RESULTS')
|
|
329
|
+
throw new Error(`Google's Geocoding API answered ${status}: ${String(pathOf(answer, 'error_message') ?? '')}`);
|
|
330
|
+
const results = pathOf(answer, 'results');
|
|
331
|
+
const named = Array.isArray(results) ? clean(pathOf(results[0], 'formatted_address')) : '';
|
|
332
|
+
return named || null;
|
|
333
|
+
},
|
|
334
|
+
async tiles(kind, locale) {
|
|
335
|
+
if (!GOOGLE_MAP_TYPE[kind])
|
|
336
|
+
return null;
|
|
337
|
+
const { session: id } = await session(kind, locale);
|
|
338
|
+
return { url: `https://tile.googleapis.com/v1/2dtiles/{z}/{x}/{y}?session=${id}&key=${key}`, maxZoom: 22 };
|
|
339
|
+
},
|
|
340
|
+
async credits(kind, { zoom, bounds }, locale) {
|
|
341
|
+
try {
|
|
342
|
+
const { session: id } = await session(kind === 'dark' ? 'road' : kind, locale);
|
|
343
|
+
const answer = await getJson(fetchWith, `https://tile.googleapis.com/tile/v1/viewport?${query({ session: id, key: options.key, zoom: Math.round(zoom), north: bounds.north, south: bounds.south, east: bounds.east, west: bounds.west })}`);
|
|
344
|
+
const copyright = pathOf(answer, 'copyright');
|
|
345
|
+
if (typeof copyright === 'string' && copyright.trim())
|
|
346
|
+
return [{ text: copyright }];
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
// Said even when the service that lists them is down.
|
|
350
|
+
}
|
|
351
|
+
return [{ text: 'Map data © Google' }];
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/** Mapbox: its styles as map images, its credits and wordmark, and its address search as people type. */
|
|
356
|
+
function mapbox(options) {
|
|
357
|
+
const fetchWith = options.fetch ?? ((...args) => globalThis.fetch(...args));
|
|
358
|
+
const token = encodeURIComponent(options.token);
|
|
359
|
+
const styles = {
|
|
360
|
+
road: options.style ?? 'mapbox/streets-v12',
|
|
361
|
+
dark: options.darkStyle ?? 'mapbox/dark-v11',
|
|
362
|
+
satellite: options.satelliteStyle ?? 'mapbox/satellite-streets-v12',
|
|
363
|
+
};
|
|
364
|
+
const permanent = options.permanent ?? true;
|
|
365
|
+
const ask = async (path, params, signal) => getJson(fetchWith, `https://api.mapbox.com/search/geocode/v6/${path}?${query({ ...params, permanent: String(permanent) })}&access_token=${token}`, { signal });
|
|
366
|
+
return {
|
|
367
|
+
id: 'mapbox',
|
|
368
|
+
searchAsYouType: true,
|
|
369
|
+
logo: { text: 'mapbox', ...(options.logo ? { image: options.logo } : {}), href: 'https://www.mapbox.com/' },
|
|
370
|
+
async tiles(kind) {
|
|
371
|
+
return { url: `https://api.mapbox.com/styles/v1/${styles[kind]}/tiles/512/{z}/{x}/{y}@2x?access_token=${token}`, maxZoom: 22, tileSize: 512, zoomOffset: -1 };
|
|
372
|
+
},
|
|
373
|
+
async credits() {
|
|
374
|
+
return [
|
|
375
|
+
{ text: '© Mapbox', href: 'https://www.mapbox.com/about/maps/' },
|
|
376
|
+
{ text: '© OpenStreetMap', href: 'https://www.openstreetmap.org/copyright' },
|
|
377
|
+
{ text: 'Improve this map', href: 'https://www.mapbox.com/map-feedback/' },
|
|
378
|
+
];
|
|
379
|
+
},
|
|
380
|
+
async search({ text, near, locale, signal }) {
|
|
381
|
+
return placesFrom(await ask('forward', { q: text, limit: 5, language: locale, proximity: near ? `${near.lng},${near.lat}` : undefined }, signal), [['properties', 'name'], ['properties', 'full_address']], (p) => joined(pathOf(p, 'place_formatted')));
|
|
382
|
+
},
|
|
383
|
+
async reverse({ lat, lng, locale, signal }) {
|
|
384
|
+
return placesFrom(await ask('reverse', { longitude: lng, latitude: lat, language: locale, limit: 1 }, signal), [['properties', 'full_address'], ['properties', 'name']])[0]?.label ?? null;
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/** Map images from any address, such as the app's own server, with their credit. */
|
|
389
|
+
function tiles(options) {
|
|
390
|
+
const urls = { road: options.url, dark: options.darkUrl, satellite: options.satelliteUrl };
|
|
391
|
+
const credits = Array.isArray(options.credit) ? options.credit : [options.credit];
|
|
392
|
+
return {
|
|
393
|
+
id: 'tiles',
|
|
394
|
+
search: options.search,
|
|
395
|
+
reverse: options.reverse,
|
|
396
|
+
searchAsYouType: options.searchAsYouType ?? !!options.search,
|
|
397
|
+
async tiles(kind) {
|
|
398
|
+
const url = urls[kind];
|
|
399
|
+
if (!url)
|
|
400
|
+
return null;
|
|
401
|
+
return { url, maxZoom: options.maxZoom ?? 19, ...(options.tileSize ? { tileSize: options.tileSize } : {}), ...(options.zoomOffset ? { zoomOffset: options.zoomOffset } : {}) };
|
|
402
|
+
},
|
|
403
|
+
async credits() {
|
|
404
|
+
return credits;
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/providers.ts"],"names":[],"mappings":";;AAwKA,sCAqDC;AAyBD,8BAkDC;AAiDD,gCA6GC;AAsBD,wBAgCC;AAmBD,sBAiBC;AAtdD,MAAM,KAAK,GAAG,CAAC,MAAmD,EAAE,EAAE,CACpE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACnB,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;KAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;KACpE,IAAI,CAAC,GAAG,CAAC,CAAC;AAEf;;;;GAIG;AACH,KAAK,UAAU,OAAO,CAAC,SAAgB,EAAE,GAAW,EAAE,IAAkB;IACtE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1G,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5H,CAAC;AAGD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAiB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACzH,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,GAAG,IAAc,EAAW,EAAE,CAAC,IAAI,CAAC,MAAM,CAAU,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAE9I,mKAAmK;AACnK,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEjJ,MAAM,QAAQ,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9H,wHAAwH;AACxH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAClC,IAAI;KACD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;KACvB,OAAO,CAAC,kCAAkC,EAAE,CAAC,GAAG,EAAE,IAAY,EAAE,EAAE,CACjE,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,CAC/L;KACA,IAAI,EAAE,CAAC;AAEZ,uFAAuF;AACvF,MAAM,MAAM,GAAG,CAAC,GAAG,KAAgB,EAAE,EAAE;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7H,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,iIAAiI;AACjI,SAAS,UAAU,CAAC,UAAmB,EAAE,MAAkB,EAAE,MAAwC;IACnG,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAA0B,IAAI,EAAE,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrH,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC/F,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC;AAgBD,qFAAqF;AACrF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAErD,wGAAwG;AACxG,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAA0B,IAAI,EAAE,CAAC;QAC9F,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAC5E,wFAAwF;QACxF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QACpJ,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,UAAgC,EAAE;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,IAAI;QACd,KAAK,CAAC,KAAK,CAAC,IAAa;YACvB,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,gDAAgD,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzG,CAAC;QACD,KAAK,CAAC,OAAO;YACX,OAAO,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC,CAAC;QACrG,CAAC;KACF,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;YACL,GAAG,IAAI;YACP,eAAe,EAAE,KAAK;YACtB,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;gBACnC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,8CAA8C,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9K,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;wBACtB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;wBACzC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;wBACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;wBAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;4BAAE,OAAO,EAAE,CAAC;wBAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wBACnC,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;wBAC3G,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpF,CAAC,CAAC;oBACJ,CAAC,CAAC,EAAE,CAAC;YACT,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;gBACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,+CAA+C,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3K,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;gBAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,CAAC;SACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrF,OAAO;QACL,GAAG,IAAI;QACP,eAAe,EAAE,IAAI;QACrB,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,GAAG,MAAM,QAAQ,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzN,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAClI,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,UAAmB;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACjD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxH,CAAC;AAaD,yFAAyF;AACzF,MAAM,cAAc,GAA2B,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACnG,MAAM,aAAa,GAA4B,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,yBAAyB,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AAEhJ,2GAA2G;AAC3G,SAAgB,SAAS,CAAC,OAAyB;IACjD,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,OAAO,GAAG,KAAK,IAAqC,EAAE,CAC1D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,OAAO,CAAC,KAAM,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChJ,MAAM,GAAG,GAAG,KAAK,EAAE,IAAY,EAAE,MAAmD,EAAE,MAAe,EAAE,MAAoB,EAAE,EAAE,CAC7H,OAAO,CAAC,SAAS,EAAE,+BAA+B,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE;QAChF,MAAM;QACN,OAAO,EAAE,EAAE,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KACpG,CAAC,CAAC;IACL,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,eAAe,EAAE,IAAI;QACrB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM;YACtB,MAAM,GAAG,GAAG,yEAAyE,aAAa,CAAC,IAAI,CAAC,+CAA+C,cAAc,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YACjM,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/F,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/M,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM;oBAAE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5L,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,qIAAqI;YACrI,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,sBAAsB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnI,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,GAAG,KAAK;gBACR,MAAM,EAAE,KAAK,IAAI,EAAE;oBACjB,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvE,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC7I,IAAI,GAAG,EAAE,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAClG,qFAAqF;oBACrF,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;gBACjD,CAAC;aACF,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YACxC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzH,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzH,OAAO,SAAS,IAAI,IAAI,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAI,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAA0B,IAAI,EAAE,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK;aAChB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;AACL,CAAC;AAaD,MAAM,eAAe,GAAqC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAEtG;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,OAA0B;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwD,CAAC;IACjF,SAAS,OAAO,CAAC,IAAa,EAAE,MAAc;QAC5C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAE,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,IAAI;YACX,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,oDAAoD,GAAG,EAAE,EAAE;gBAC5F,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;aACpF,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACxC,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;gBACvD,qEAAqE;gBACrE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBACzH,yFAAyF;oBACxF,KAA2C,CAAC,KAAK,EAAE,EAAE,CAAC;gBACzD,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,gJAAgJ;IAChJ,IAAI,SAA6B,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtM,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,CAAC,IAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3H,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAC/E,eAAe,EAAE,IAAI;QACrB,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;YAC/C,SAAS,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,SAAS,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,sDAAsD,EAAE;gBAC9F,MAAM,EAAE,MAAM;gBACd,MAAM;gBACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE;gBAC9E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI;oBACX,YAAY,EAAE,MAAM;oBACpB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,YAAY,EAAE,KAAK;oBACnB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/H,CAAC;aACH,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3C,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;gBACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7H,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK;oBAAE,OAAO,EAAE,CAAC;gBACrD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtF,OAAO;oBACL;wBACE,KAAK;wBACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7B,MAAM,EAAE,KAAK,IAAI,EAAE;4BACjB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,2CAA2C,kBAAkB,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gCACvK,OAAO,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,2BAA2B,EAAE;6BAC5F,CAAC,CAAC;4BACH,oEAAoE;4BACpE,IAAI,SAAS,KAAK,KAAK;gCAAE,SAAS,GAAG,SAAS,CAAC;4BAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;4BACvD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;4BACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ;gCAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;4BAC3G,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC;4BACzD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC5E,CAAC;qBACF;iBACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,qDAAqD,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACnL,mFAAmF;YACnF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/L,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,OAAO,KAAK,IAAI,IAAI,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM;YACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO,EAAE,GAAG,EAAE,8DAA8D,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC7G,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM;YAC1C,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,gDAAgD,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5O,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACtF,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAqBD,yGAAyG;AACzG,SAAgB,MAAM,CAAC,OAAsB;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,oBAAoB;QAC3C,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI,iBAAiB;QAC5C,SAAS,EAAE,OAAO,CAAC,cAAc,IAAI,8BAA8B;KACpE,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,EAAE,IAAY,EAAE,MAAmD,EAAE,MAAoB,EAAE,EAAE,CAC5G,OAAO,CAAC,SAAS,EAAE,4CAA4C,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACjK,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,eAAe,EAAE,IAAI;QACrB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;QAC3G,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,EAAE,oCAAoC,MAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;QAChK,CAAC;QACD,KAAK,CAAC,OAAO;YACX,OAAO;gBACL,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,oCAAoC,EAAE;gBAChE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,yCAAyC,EAAE;gBAC5E,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,sCAAsC,EAAE;aAC3E,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;YACzC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC3P,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;YACxC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QAC7L,CAAC;KACF,CAAC;AACJ,CAAC;AAkBD,oFAAoF;AACpF,SAAgB,KAAK,CAAC,OAAqB;IACzC,MAAM,IAAI,GAAwC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;IAChI,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,OAAO;QACL,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;QAC5D,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACjL,CAAC;QACD,KAAK,CAAC,OAAO;YACX,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|