@fieldia/map 0.15.0 → 0.17.0

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.
Files changed (118) hide show
  1. package/README.md +79 -11
  2. package/package.json +4 -4
  3. package/src/index.d.mts +2 -1
  4. package/src/index.d.ts +2 -1
  5. package/src/index.js +3 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +1 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/answers.d.mts +17 -0
  10. package/src/lib/answers.d.ts +17 -0
  11. package/src/lib/answers.js +27 -0
  12. package/src/lib/answers.js.map +1 -0
  13. package/src/lib/answers.mjs +21 -0
  14. package/src/lib/answers.mjs.map +1 -0
  15. package/src/lib/area.js +2 -1
  16. package/src/lib/area.js.map +1 -1
  17. package/src/lib/area.mjs +3 -2
  18. package/src/lib/area.mjs.map +1 -1
  19. package/src/lib/card.d.mts +10 -2
  20. package/src/lib/card.d.ts +10 -2
  21. package/src/lib/card.js +13 -4
  22. package/src/lib/card.js.map +1 -1
  23. package/src/lib/card.mjs +13 -4
  24. package/src/lib/card.mjs.map +1 -1
  25. package/src/lib/form-map.d.mts +18 -0
  26. package/src/lib/form-map.d.ts +18 -0
  27. package/src/lib/form-map.js +586 -0
  28. package/src/lib/form-map.js.map +1 -0
  29. package/src/lib/form-map.mjs +583 -0
  30. package/src/lib/form-map.mjs.map +1 -0
  31. package/src/lib/heat.d.mts +25 -0
  32. package/src/lib/heat.d.ts +25 -0
  33. package/src/lib/heat.js +111 -0
  34. package/src/lib/heat.js.map +1 -0
  35. package/src/lib/heat.mjs +108 -0
  36. package/src/lib/heat.mjs.map +1 -0
  37. package/src/lib/labels.d.mts +33 -0
  38. package/src/lib/labels.d.ts +33 -0
  39. package/src/lib/labels.js +60 -1
  40. package/src/lib/labels.js.map +1 -1
  41. package/src/lib/labels.mjs +58 -0
  42. package/src/lib/labels.mjs.map +1 -1
  43. package/src/lib/list-view.js +168 -70
  44. package/src/lib/list-view.js.map +1 -1
  45. package/src/lib/list-view.mjs +162 -64
  46. package/src/lib/list-view.mjs.map +1 -1
  47. package/src/lib/map-core.d.mts +8 -0
  48. package/src/lib/map-core.d.ts +8 -0
  49. package/src/lib/map-core.js +57 -4
  50. package/src/lib/map-core.js.map +1 -1
  51. package/src/lib/map-core.mjs +56 -4
  52. package/src/lib/map-core.mjs.map +1 -1
  53. package/src/lib/marks.d.mts +34 -0
  54. package/src/lib/marks.d.ts +34 -0
  55. package/src/lib/marks.js +56 -0
  56. package/src/lib/marks.js.map +1 -0
  57. package/src/lib/marks.mjs +49 -0
  58. package/src/lib/marks.mjs.map +1 -0
  59. package/src/lib/measure.d.mts +15 -0
  60. package/src/lib/measure.d.ts +15 -0
  61. package/src/lib/measure.js +157 -0
  62. package/src/lib/measure.js.map +1 -0
  63. package/src/lib/measure.mjs +153 -0
  64. package/src/lib/measure.mjs.map +1 -0
  65. package/src/lib/pins.d.mts +2 -0
  66. package/src/lib/pins.d.ts +2 -0
  67. package/src/lib/pins.js +5 -1
  68. package/src/lib/pins.js.map +1 -1
  69. package/src/lib/pins.mjs +3 -1
  70. package/src/lib/pins.mjs.map +1 -1
  71. package/src/lib/place.js +3 -1
  72. package/src/lib/place.js.map +1 -1
  73. package/src/lib/place.mjs +4 -2
  74. package/src/lib/place.mjs.map +1 -1
  75. package/src/lib/providers.d.mts +43 -3
  76. package/src/lib/providers.d.ts +43 -3
  77. package/src/lib/providers.js +76 -67
  78. package/src/lib/providers.js.map +1 -1
  79. package/src/lib/providers.mjs +24 -15
  80. package/src/lib/providers.mjs.map +1 -1
  81. package/src/lib/reach.d.mts +25 -0
  82. package/src/lib/reach.d.ts +25 -0
  83. package/src/lib/reach.js +158 -0
  84. package/src/lib/reach.js.map +1 -0
  85. package/src/lib/reach.mjs +153 -0
  86. package/src/lib/reach.mjs.map +1 -0
  87. package/src/lib/regions.d.mts +137 -0
  88. package/src/lib/regions.d.ts +137 -0
  89. package/src/lib/regions.js +456 -0
  90. package/src/lib/regions.js.map +1 -0
  91. package/src/lib/regions.mjs +445 -0
  92. package/src/lib/regions.mjs.map +1 -0
  93. package/src/lib/route-line.d.mts +34 -0
  94. package/src/lib/route-line.d.ts +34 -0
  95. package/src/lib/route-line.js +53 -0
  96. package/src/lib/route-line.js.map +1 -0
  97. package/src/lib/route-line.mjs +47 -0
  98. package/src/lib/route-line.mjs.map +1 -0
  99. package/src/lib/routes.d.mts +40 -0
  100. package/src/lib/routes.d.ts +40 -0
  101. package/src/lib/routes.js +149 -0
  102. package/src/lib/routes.js.map +1 -0
  103. package/src/lib/routes.mjs +140 -0
  104. package/src/lib/routes.mjs.map +1 -0
  105. package/src/lib/settings.d.mts +13 -3
  106. package/src/lib/settings.d.ts +13 -3
  107. package/src/lib/styles.d.mts +10 -2
  108. package/src/lib/styles.d.ts +10 -2
  109. package/src/lib/styles.js +52 -3
  110. package/src/lib/styles.js.map +1 -1
  111. package/src/lib/styles.mjs +50 -2
  112. package/src/lib/styles.mjs.map +1 -1
  113. package/src/lib/tools.d.mts +27 -0
  114. package/src/lib/tools.d.ts +27 -0
  115. package/src/lib/tools.js +84 -0
  116. package/src/lib/tools.js.map +1 -0
  117. package/src/lib/tools.mjs +81 -0
  118. package/src/lib/tools.mjs.map +1 -0
@@ -0,0 +1,137 @@
1
+ import type * as Leaflet from 'leaflet';
2
+ import type { Locale, MapLayer, MapRegions, ResolvedFilter } from '@fieldia/core';
3
+ import { type MapLabels } from './labels';
4
+ import type { LeafletModule } from './leaflet';
5
+ import { type MapBox } from './map-core';
6
+ /**
7
+ * Areas shaded by colour on a map: districts, zones, municipalities. Their
8
+ * borders are the app's (a GeoJSON FeatureCollection of polygons), each known
9
+ * by one of its properties and named by another. An area's number shades it
10
+ * in up to five steps of the page's accent, from light to strong, with a
11
+ * legend; an area with none is outlined only. The pointer over one lights it
12
+ * and says its name and number; a press does what the map says (search for its
13
+ * records, or choose it). On the keyboard the areas are one stop: Tab reaches
14
+ * the first (or the one chosen), the arrow keys go from area to area in
15
+ * reading order, Enter or Space presses one. Loaded with the first map that
16
+ * has them.
17
+ */
18
+ export interface Border {
19
+ /** Its key as text, and as the border holds it: what a record's field holds. */
20
+ key: string;
21
+ value: string | number;
22
+ name: string;
23
+ properties: Record<string, unknown>;
24
+ /** Its polygons, each as rings of [longitude, latitude]: the outer ring, then its holes. */
25
+ polygons: [number, number][][][];
26
+ }
27
+ /** The borders a set holds: Polygon and MultiPolygon features with a key; anything else is passed over. */
28
+ export declare function readBorders(collection: unknown, spec: {
29
+ key: string;
30
+ name?: string;
31
+ }): Border[];
32
+ /** A set of borders the app's maps give, by name: asked for once for all the maps sharing the settings; undefined when there is no such set. */
33
+ export declare function loadBorders(sets: Record<string, unknown> | undefined, name: string): Promise<unknown>;
34
+ /**
35
+ * The shades' steps: up to five, each ending on a round number, so the legend
36
+ * reads "11–20, 21–30…" rather than "9.6–19.2". They start from nothing, or
37
+ * from a round number under the least when every number is well above
38
+ * nothing (fees of 15 to 40 start at 10). Whole numbers (counts) step by whole
39
+ * numbers.
40
+ */
41
+ export declare function shadeSteps(values: readonly number[]): {
42
+ from: number;
43
+ ends: number[];
44
+ };
45
+ /** The shade a number falls in: 0 for the lightest, null for none. */
46
+ export declare function shadeOf(value: number | null | undefined, steps: readonly number[]): number | null;
47
+ export declare const REGIONS_CSS = "\npath.fd-map-region { stroke: var(--fd-surface); stroke-width: 1.4; stroke-opacity: 0.95; fill: var(--fd-accent); fill-opacity: 0.06; cursor: pointer; transition: fill-opacity 0.12s; }\npath.fd-map-region[data-shade] { fill: var(--fd-region); fill-opacity: 0.5; }\npath.fd-map-region:hover, path.fd-map-region[data-lit] { fill-opacity: 0.8; stroke: var(--fd-text); stroke-width: 2; }\npath.fd-map-region[data-chosen] { stroke: var(--fd-accent); stroke-width: 3.5; stroke-opacity: 1; }\npath.fd-map-region:focus { outline: none; }\n/* While a way is measured or an area drawn, every press is the map's. */\n.fd-map-box[data-measuring] path.fd-map-region, .fd-map-box[data-drawing] path.fd-map-region { pointer-events: none; }\npath.fd-map-region:focus-visible { stroke: var(--fd-focus); stroke-width: 4; stroke-opacity: 1; }\n.fd-map-box[data-plain] path.fd-map-region { cursor: default; }\n.fd-map-legend {\n position: absolute; right: 8px; bottom: 26px; z-index: 1000; display: grid; gap: 3px; max-width: min(240px, 60%); padding: 6px 9px; border-radius: 6px;\n font-size: 12px; line-height: 1.35; background: color-mix(in srgb, var(--fd-surface) 94%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);\n}\n.fd-map-legend[hidden] { display: none; }\n.fd-map-legend-title { font-weight: 700; overflow-wrap: anywhere; }\n.fd-map-legend ol { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }\n.fd-map-legend li { display: flex; align-items: center; gap: 7px; font-variant-numeric: tabular-nums; }\n.fd-map-legend i { width: 18px; height: 11px; flex: none; border-radius: 2px; background: var(--fd-region, transparent); border: 1px solid color-mix(in srgb, var(--fd-text) 35%, transparent); }\n.fd-map-legend i[data-shade] { background: color-mix(in srgb, var(--fd-region) 50%, var(--fd-surface)); }\n.leaflet-tooltip.fd-map-tip {\n padding: 3px 8px; border: 0; border-radius: 6px; font: inherit; font-size: 12.5px; font-weight: 600; white-space: nowrap;\n background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);\n}\n.leaflet-tooltip.fd-map-tip::before { display: none; }\n";
48
+ export interface RegionsLayer {
49
+ /** Each area's number, by its key (null: none shaded), and the area chosen. */
50
+ shade(values: ReadonlyMap<string, number> | null, chosen: string | null): void;
51
+ /** The area under a place, if any: for a fence, or a record's own area. */
52
+ at(lat: number, lng: number): Border | null;
53
+ /** On the map or off it, as its layer's `invisible` says. */
54
+ show(on: boolean): void;
55
+ destroy(): void;
56
+ }
57
+ export declare function drawRegions(options: {
58
+ box: MapBox;
59
+ map: Leaflet.Map;
60
+ L: LeafletModule;
61
+ document: Document;
62
+ locale: Locale;
63
+ labels: MapLabels;
64
+ borders: Border[];
65
+ /** The legend's title, and the areas' name as a group: "Orders", "Districts". */
66
+ title: string;
67
+ legend: boolean;
68
+ /** What a press on an area does; without it, the areas are only shown. */
69
+ press?: (border: Border) => void;
70
+ }): RegionsLayer;
71
+ /** Inside a polygon: inside its outer ring and none of its holes. */
72
+ export declare function insideRings(x: number, y: number, rings: [number, number][][]): boolean;
73
+ /**
74
+ * A list's areas shaded by its records: drawn once their borders load, their
75
+ * numbers asked for again with each search — each area's records under the
76
+ * search but for an area searched itself, so the others keep their shades —
77
+ * or a number of their own. A press searches for an area's records.
78
+ */
79
+ export declare function listRegions(options: {
80
+ sets: Record<string, unknown> | undefined;
81
+ spec: MapRegions & {
82
+ field: string;
83
+ };
84
+ box: MapBox;
85
+ map: Leaflet.Map;
86
+ L: LeafletModule;
87
+ document: Document;
88
+ locale: Locale;
89
+ labels: MapLabels & {
90
+ inRegion: string;
91
+ };
92
+ title: string;
93
+ model: string;
94
+ dataSource: {
95
+ groups?(request: {
96
+ model: string;
97
+ field: string;
98
+ filter: ResolvedFilter[];
99
+ }): Promise<{
100
+ value: unknown;
101
+ count: number;
102
+ }[]>;
103
+ } | undefined;
104
+ addSearch(search: {
105
+ label: string;
106
+ filter: ResolvedFilter[];
107
+ }): void;
108
+ /** The records the map has, to count when the data source cannot. */
109
+ records(): readonly {
110
+ values: Record<string, unknown>;
111
+ }[];
112
+ }): {
113
+ shade(filter: readonly ResolvedFilter[], current: () => boolean): Promise<void>;
114
+ destroy(): void;
115
+ };
116
+ /**
117
+ * A form's areas by colour, a layer each: shaded by a number of their own,
118
+ * the one the record's field holds drawn strong, a press choosing one into
119
+ * that field where the person may change it; on the map or off it as each
120
+ * layer's `invisible` says.
121
+ */
122
+ export declare function formRegions(options: {
123
+ sets: Record<string, unknown> | undefined;
124
+ layers: readonly MapLayer[];
125
+ box: MapBox;
126
+ map: Leaflet.Map;
127
+ L: LeafletModule;
128
+ document: Document;
129
+ locale: Locale;
130
+ labels: MapLabels;
131
+ /** Whether a person may write a field now: a press chooses only where they may. */
132
+ writable(field: string): boolean;
133
+ choose(field: string, value: string | number): void;
134
+ }): {
135
+ update(values: Record<string, unknown>, hidden: (layerId: string) => boolean): void;
136
+ destroy(): void;
137
+ };
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REGIONS_CSS = void 0;
4
+ exports.readBorders = readBorders;
5
+ exports.loadBorders = loadBorders;
6
+ exports.shadeSteps = shadeSteps;
7
+ exports.shadeOf = shadeOf;
8
+ exports.drawRegions = drawRegions;
9
+ exports.insideRings = insideRings;
10
+ exports.listRegions = listRegions;
11
+ exports.formRegions = formRegions;
12
+ const labels_1 = require("./labels");
13
+ const map_core_1 = require("./map-core");
14
+ const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
15
+ /** The borders a set holds: Polygon and MultiPolygon features with a key; anything else is passed over. */
16
+ function readBorders(collection, spec) {
17
+ const features = isObject(collection) && Array.isArray(collection['features']) ? collection['features'] : [];
18
+ return features.flatMap((feature) => {
19
+ if (!isObject(feature) || !isObject(feature['geometry']))
20
+ return [];
21
+ const properties = isObject(feature['properties']) ? feature['properties'] : {};
22
+ const key = properties[spec.key];
23
+ if (typeof key !== 'string' && typeof key !== 'number')
24
+ return [];
25
+ if (key === '')
26
+ return [];
27
+ const geometry = feature['geometry'];
28
+ const coordinates = geometry['coordinates'];
29
+ const polygons = geometry['type'] === 'Polygon' ? [coordinates] : geometry['type'] === 'MultiPolygon' ? coordinates : [];
30
+ if (!polygons.length)
31
+ return [];
32
+ const name = properties[spec.name ?? spec.key];
33
+ return [{ key: String(key), value: key, name: String(name ?? key), properties, polygons }];
34
+ });
35
+ }
36
+ const loaded = new WeakMap();
37
+ /** A set of borders the app's maps give, by name: asked for once for all the maps sharing the settings; undefined when there is no such set. */
38
+ function loadBorders(sets, name) {
39
+ if (!sets || !(name in sets))
40
+ return Promise.resolve(undefined);
41
+ const mine = loaded.get(sets) ?? new Map();
42
+ loaded.set(sets, mine);
43
+ let found = mine.get(name);
44
+ if (!found) {
45
+ const given = sets[name];
46
+ found = Promise.resolve(typeof given === 'function' ? given() : given);
47
+ // A set that failed to load is asked for again next time.
48
+ found.catch(() => mine.delete(name));
49
+ mine.set(name, found);
50
+ }
51
+ return found;
52
+ }
53
+ /**
54
+ * The shades' steps: up to five, each ending on a round number, so the legend
55
+ * reads "11–20, 21–30…" rather than "9.6–19.2". They start from nothing, or
56
+ * from a round number under the least when every number is well above
57
+ * nothing (fees of 15 to 40 start at 10). Whole numbers (counts) step by whole
58
+ * numbers.
59
+ */
60
+ function shadeSteps(values) {
61
+ const shown = values.filter((v) => Number.isFinite(v) && v > 0);
62
+ if (!shown.length)
63
+ return { from: 0, ends: [] };
64
+ const most = Math.max(...shown);
65
+ const least = Math.min(...shown);
66
+ const whole = shown.every((v) => Number.isInteger(v));
67
+ if (whole && most <= 5)
68
+ return { from: 0, ends: Array.from({ length: most }, (_, i) => i + 1) };
69
+ const nice = (raw) => {
70
+ const power = 10 ** Math.floor(Math.log10(raw));
71
+ return [1, 2, 2.5, 5, 10].map((m) => m * power).find((m) => m >= raw);
72
+ };
73
+ // Whole numbers' steps read "11–20": the start is under the least, so the least is in the first.
74
+ const unit = nice((most - least) / 5 || most / 5);
75
+ const from = least > most / 5 ? Math.floor((least - (whole ? 1 : 0)) / unit) * unit : 0;
76
+ const step = whole ? Math.max(1, Math.ceil(nice((most - from) / 5))) : nice((most - from) / 5);
77
+ const ends = [];
78
+ for (let end = from + step; ends.length < 5; end += step) {
79
+ ends.push(Number(end.toPrecision(12)));
80
+ if (end >= most)
81
+ break;
82
+ }
83
+ return { from: Number(from.toPrecision(12)), ends };
84
+ }
85
+ /** The shade a number falls in: 0 for the lightest, null for none. */
86
+ function shadeOf(value, steps) {
87
+ if (value === null || value === undefined || !Number.isFinite(value) || value <= 0 || !steps.length)
88
+ return null;
89
+ const i = steps.findIndex((end) => value <= end);
90
+ return i === -1 ? steps.length - 1 : i;
91
+ }
92
+ /** How much of the accent each shade takes, against the page's surface; spread over five steps however many there are. */
93
+ const MIX = [22, 40, 58, 76, 94];
94
+ const mixOf = (step, count) => MIX[count <= 1 ? 4 : Math.round((step * 4) / (count - 1))];
95
+ exports.REGIONS_CSS = `
96
+ path.fd-map-region { stroke: var(--fd-surface); stroke-width: 1.4; stroke-opacity: 0.95; fill: var(--fd-accent); fill-opacity: 0.06; cursor: pointer; transition: fill-opacity 0.12s; }
97
+ path.fd-map-region[data-shade] { fill: var(--fd-region); fill-opacity: 0.5; }
98
+ path.fd-map-region:hover, path.fd-map-region[data-lit] { fill-opacity: 0.8; stroke: var(--fd-text); stroke-width: 2; }
99
+ path.fd-map-region[data-chosen] { stroke: var(--fd-accent); stroke-width: 3.5; stroke-opacity: 1; }
100
+ path.fd-map-region:focus { outline: none; }
101
+ /* While a way is measured or an area drawn, every press is the map's. */
102
+ .fd-map-box[data-measuring] path.fd-map-region, .fd-map-box[data-drawing] path.fd-map-region { pointer-events: none; }
103
+ path.fd-map-region:focus-visible { stroke: var(--fd-focus); stroke-width: 4; stroke-opacity: 1; }
104
+ .fd-map-box[data-plain] path.fd-map-region { cursor: default; }
105
+ .fd-map-legend {
106
+ position: absolute; right: 8px; bottom: 26px; z-index: 1000; display: grid; gap: 3px; max-width: min(240px, 60%); padding: 6px 9px; border-radius: 6px;
107
+ font-size: 12px; line-height: 1.35; background: color-mix(in srgb, var(--fd-surface) 94%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
108
+ }
109
+ .fd-map-legend[hidden] { display: none; }
110
+ .fd-map-legend-title { font-weight: 700; overflow-wrap: anywhere; }
111
+ .fd-map-legend ol { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
112
+ .fd-map-legend li { display: flex; align-items: center; gap: 7px; font-variant-numeric: tabular-nums; }
113
+ .fd-map-legend i { width: 18px; height: 11px; flex: none; border-radius: 2px; background: var(--fd-region, transparent); border: 1px solid color-mix(in srgb, var(--fd-text) 35%, transparent); }
114
+ .fd-map-legend i[data-shade] { background: color-mix(in srgb, var(--fd-region) 50%, var(--fd-surface)); }
115
+ .leaflet-tooltip.fd-map-tip {
116
+ padding: 3px 8px; border: 0; border-radius: 6px; font: inherit; font-size: 12.5px; font-weight: 600; white-space: nowrap;
117
+ background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);
118
+ }
119
+ .leaflet-tooltip.fd-map-tip::before { display: none; }
120
+ `;
121
+ function installRegionStyles(doc) {
122
+ if (doc.getElementById('fieldia-map-region-styles'))
123
+ return;
124
+ const style = doc.createElement('style');
125
+ style.id = 'fieldia-map-region-styles';
126
+ style.textContent = exports.REGIONS_CSS;
127
+ (doc.getElementById('fieldia-map-styles') ?? doc.head.lastElementChild)?.after(style);
128
+ if (!style.isConnected)
129
+ doc.head.append(style);
130
+ }
131
+ function drawRegions(options) {
132
+ const { box, map, L, document: doc, locale, labels, borders } = options;
133
+ installRegionStyles(doc);
134
+ const number = (n) => new Intl.NumberFormat(locale, { numberingSystem: 'latn', maximumFractionDigits: 2 }).format(n);
135
+ // Their own pane: under a reachable area, routes and pins, over a heat map.
136
+ const pane = map.getPane('fd-regions') ?? map.createPane('fd-regions');
137
+ pane.style.zIndex = '370';
138
+ // Before the pins in the page, so Tab reaches the areas first.
139
+ map.getPane('markerPane')?.before(pane);
140
+ const group = L.featureGroup().addTo(map);
141
+ // Reading order: top to bottom, then from the start of the line.
142
+ const centre = (border) => {
143
+ const ring = border.polygons[0][0];
144
+ return { lat: ring.reduce((s, p) => s + p[1], 0) / ring.length, lng: ring.reduce((s, p) => s + p[0], 0) / ring.length };
145
+ };
146
+ const ordered = [...borders].sort((a, b) => {
147
+ const [x, y] = [centre(a), centre(b)];
148
+ return Math.abs(x.lat - y.lat) > 0.01 ? y.lat - x.lat : x.lng - y.lng;
149
+ });
150
+ let values = null;
151
+ let chosen = null;
152
+ let visible = true;
153
+ const paths = new Map();
154
+ const words = (border) => {
155
+ const value = values?.get(border.key);
156
+ return value === undefined ? border.name : (0, labels_1.fill)(labels.areaValue, { name: border.name, value: number(value) });
157
+ };
158
+ for (const border of ordered) {
159
+ const latLngs = border.polygons.map((rings) => rings.map((ring) => ring.map(([lng, lat]) => [lat, lng])));
160
+ const path = L.polygon(latLngs, { className: 'fd-map-region', pane: 'fd-regions', interactive: true, bubblingMouseEvents: false }).addTo(group);
161
+ path.bindTooltip(() => words(border), { sticky: true, direction: 'top', offset: [0, -8], className: 'fd-map-tip', opacity: 1 });
162
+ if (options.press)
163
+ path.on('click', () => options.press?.(border));
164
+ paths.set(border.key, path);
165
+ }
166
+ if (!options.press)
167
+ box.element.toggleAttribute('data-plain', true);
168
+ // ---- the keyboard: one stop, the arrows from area to area -----------------------------
169
+ const elementOf = (border) => paths.get(border.key)?.getElement();
170
+ let current = 0;
171
+ function roving() {
172
+ ordered.forEach((border, i) => {
173
+ const element = elementOf(border);
174
+ if (!element)
175
+ return;
176
+ element.setAttribute('tabindex', i === current ? '0' : '-1');
177
+ element.setAttribute('role', options.press ? 'button' : 'img');
178
+ element.setAttribute('aria-label', `${words(border)} · ${options.title}`);
179
+ if (chosen !== null)
180
+ element.setAttribute('aria-pressed', String(border.key === chosen));
181
+ });
182
+ }
183
+ const keyed = (event) => {
184
+ const at = ordered.findIndex((border) => elementOf(border) === event.target);
185
+ if (at === -1)
186
+ return;
187
+ const step = event.key === 'ArrowDown' || event.key === 'ArrowRight' ? 1 : event.key === 'ArrowUp' || event.key === 'ArrowLeft' ? -1 : 0;
188
+ if (step || event.key === 'Home' || event.key === 'End') {
189
+ // The page does not scroll; the map pans by its arrows only while it has the keys itself.
190
+ event.preventDefault();
191
+ current = event.key === 'Home' ? 0 : event.key === 'End' ? ordered.length - 1 : (at + step + ordered.length) % ordered.length;
192
+ roving();
193
+ const element = elementOf(ordered[current]);
194
+ const path = paths.get(ordered[current].key);
195
+ if (path && !map.getBounds().contains(path.getBounds()))
196
+ map.panInside(path.getCenter(), { padding: [40, 40] });
197
+ element?.focus({ preventScroll: true });
198
+ }
199
+ else if ((event.key === 'Enter' || event.key === ' ') && options.press) {
200
+ event.preventDefault();
201
+ event.stopPropagation();
202
+ options.press(ordered[at]);
203
+ }
204
+ };
205
+ const focused = (event) => {
206
+ const border = ordered.find((b) => elementOf(b) === event.target);
207
+ if (!border)
208
+ return;
209
+ paths.get(border.key)?.getElement()?.toggleAttribute('data-lit', event.type === 'focusin');
210
+ if (event.type === 'focusin')
211
+ paths.get(border.key)?.openTooltip(paths.get(border.key)?.getCenter());
212
+ else
213
+ paths.get(border.key)?.closeTooltip();
214
+ };
215
+ box.element.addEventListener('keydown', keyed, true);
216
+ box.element.addEventListener('focusin', focused);
217
+ box.element.addEventListener('focusout', focused);
218
+ // ---- the legend --------------------------------------------------------------------
219
+ const legend = doc.createElement('div');
220
+ legend.className = 'fd-map-legend';
221
+ legend.hidden = true;
222
+ box.element.append(legend);
223
+ box.follow(legend);
224
+ function drawLegend({ from: start, ends: steps }, none) {
225
+ legend.replaceChildren();
226
+ if (!options.legend || !steps.length) {
227
+ legend.hidden = true;
228
+ return;
229
+ }
230
+ const title = doc.createElement('div');
231
+ title.className = 'fd-map-legend-title';
232
+ title.textContent = options.title;
233
+ const list = doc.createElement('ol');
234
+ const whole = steps.every((end) => Number.isInteger(end));
235
+ // Areas with nothing to shade them, when there are some.
236
+ if (none) {
237
+ const empty = doc.createElement('li');
238
+ empty.append(doc.createElement('i'), labels.areasNone);
239
+ list.append(empty);
240
+ }
241
+ steps.forEach((end, i) => {
242
+ const item = doc.createElement('li');
243
+ const swatch = doc.createElement('i');
244
+ swatch.setAttribute('data-shade', String(i));
245
+ swatch.style.setProperty('--fd-region', `color-mix(in srgb, var(--fd-accent) ${mixOf(i, steps.length)}%, var(--fd-surface))`);
246
+ const below = i === 0 ? start : steps[i - 1];
247
+ const from = whole ? below + 1 : below;
248
+ // A range reads from its least, in a right-to-left page too: its numbers kept left to right.
249
+ const range = doc.createElement('bdi');
250
+ range.dir = 'ltr';
251
+ range.textContent = from >= end ? number(end) : `${number(from)}–${number(end)}`;
252
+ item.append(swatch, range);
253
+ list.append(item);
254
+ });
255
+ legend.append(title, list);
256
+ legend.hidden = !visible;
257
+ }
258
+ const layer = {
259
+ shade(next, nowChosen) {
260
+ values = next;
261
+ chosen = nowChosen;
262
+ const steps = values ? shadeSteps([...values.values()]) : { from: 0, ends: [] };
263
+ let none = false;
264
+ for (const border of ordered) {
265
+ const element = elementOf(border);
266
+ if (!element)
267
+ continue;
268
+ const shade = values ? shadeOf(values.get(border.key), steps.ends) : null;
269
+ none ||= shade === null;
270
+ if (shade === null) {
271
+ element.removeAttribute('data-shade');
272
+ element.style.removeProperty('--fd-region');
273
+ }
274
+ else {
275
+ element.setAttribute('data-shade', String(shade));
276
+ element.style.setProperty('--fd-region', `color-mix(in srgb, var(--fd-accent) ${mixOf(shade, steps.ends.length)}%, var(--fd-surface))`);
277
+ }
278
+ element.toggleAttribute('data-chosen', border.key === chosen);
279
+ }
280
+ const at = ordered.findIndex((border) => border.key === chosen);
281
+ if (at !== -1 && !box.element.contains(doc.activeElement))
282
+ current = at;
283
+ roving();
284
+ // Under every pin and route by their pane; never moved in the page, which would take the keys from a focused area.
285
+ drawLegend(steps, none);
286
+ },
287
+ at(lat, lng) {
288
+ return borders.find((border) => border.polygons.some((rings) => insideRings(lng, lat, rings))) ?? null;
289
+ },
290
+ show(on) {
291
+ if (on === map.hasLayer(group))
292
+ return;
293
+ if (on)
294
+ group.addTo(map);
295
+ else
296
+ group.remove();
297
+ visible = on;
298
+ legend.hidden = !on || !legend.childElementCount;
299
+ },
300
+ destroy() {
301
+ box.element.removeEventListener('keydown', keyed, true);
302
+ box.element.removeEventListener('focusin', focused);
303
+ box.element.removeEventListener('focusout', focused);
304
+ group.remove();
305
+ legend.remove();
306
+ },
307
+ };
308
+ layer.shade(null, null);
309
+ return layer;
310
+ }
311
+ /** Inside a polygon: inside its outer ring and none of its holes. */
312
+ function insideRings(x, y, rings) {
313
+ const inside = (ring) => {
314
+ let odd = false;
315
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
316
+ const [xi, yi] = ring[i];
317
+ const [xj, yj] = ring[j];
318
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)
319
+ odd = !odd;
320
+ }
321
+ return odd;
322
+ };
323
+ return rings.length > 0 && inside(rings[0]) && !rings.slice(1).some(inside);
324
+ }
325
+ /** A set of borders, loaded and read; null (said once to the developer) when the app gives none by that name, or it failed. */
326
+ async function bordersOf(sets, spec) {
327
+ let set;
328
+ try {
329
+ set = await loadBorders(sets, spec.from);
330
+ }
331
+ catch (error) {
332
+ (0, map_core_1.warnOnce)(`The borders "${spec.from}" did not load: ${String(error)}`);
333
+ return null;
334
+ }
335
+ if (set === undefined) {
336
+ (0, map_core_1.warnOnce)(`No borders "${spec.from}" in the maps' regions: give them as regions: { ${JSON.stringify(spec.from)}: () => fetch(…).then((r) => r.json()) }.`);
337
+ return null;
338
+ }
339
+ return readBorders(set, spec);
340
+ }
341
+ /** Each border's number among its properties, by its key: what a layer's `shade` names. */
342
+ function ownNumbers(borders, property) {
343
+ const values = new Map();
344
+ for (const border of borders) {
345
+ const value = Number(border.properties[property]);
346
+ if (Number.isFinite(value))
347
+ values.set(border.key, value);
348
+ }
349
+ return values;
350
+ }
351
+ /**
352
+ * A list's areas shaded by its records: drawn once their borders load, their
353
+ * numbers asked for again with each search — each area's records under the
354
+ * search but for an area searched itself, so the others keep their shades —
355
+ * or a number of their own. A press searches for an area's records.
356
+ */
357
+ function listRegions(options) {
358
+ const { spec } = options;
359
+ let gone = false;
360
+ const drawn = bordersOf(options.sets, spec).then((borders) => !borders || gone
361
+ ? null
362
+ : {
363
+ borders,
364
+ layer: drawRegions({
365
+ ...options,
366
+ borders,
367
+ legend: spec.legend !== false,
368
+ press: (border) => options.addSearch({ label: (0, labels_1.fill)(options.labels.inRegion, { name: border.name }), filter: [{ field: spec.field, op: '=', value: border.value }] }),
369
+ }),
370
+ });
371
+ const isArea = (item) => 'field' in item && item.field === spec.field && item.op === '=';
372
+ return {
373
+ async shade(filter, current) {
374
+ const made = await drawn;
375
+ if (!made || !current())
376
+ return;
377
+ const picked = filter.find(isArea);
378
+ const chosen = picked && 'value' in picked ? String(picked.value) : null;
379
+ const shade = spec.shade ?? 'count';
380
+ let values = new Map();
381
+ if (shade !== 'count')
382
+ values = ownNumbers(made.borders, shade);
383
+ else if (options.dataSource?.groups) {
384
+ try {
385
+ const groups = await options.dataSource.groups({ model: options.model, field: spec.field, filter: filter.filter((item) => !isArea(item)) });
386
+ for (const group of groups)
387
+ if (group.value !== null)
388
+ values.set(String(group.value), group.count);
389
+ }
390
+ catch {
391
+ return;
392
+ }
393
+ }
394
+ else {
395
+ // Without a way to count, the records the map has.
396
+ for (const record of options.records()) {
397
+ const raw = record.values[spec.field];
398
+ const key = raw !== null && typeof raw === 'object' && 'id' in raw ? raw.id : raw;
399
+ if (key !== null && key !== undefined && key !== false)
400
+ values.set(String(key), (values.get(String(key)) ?? 0) + 1);
401
+ }
402
+ }
403
+ if (current())
404
+ made.layer.shade(values, chosen);
405
+ },
406
+ destroy() {
407
+ gone = true;
408
+ void drawn.then((made) => made?.layer.destroy());
409
+ },
410
+ };
411
+ }
412
+ /**
413
+ * A form's areas by colour, a layer each: shaded by a number of their own,
414
+ * the one the record's field holds drawn strong, a press choosing one into
415
+ * that field where the person may change it; on the map or off it as each
416
+ * layer's `invisible` says.
417
+ */
418
+ function formRegions(options) {
419
+ let gone = false;
420
+ const made = options.layers.map((layer) => {
421
+ const spec = layer.regions;
422
+ const choose = spec.choose;
423
+ return bordersOf(options.sets, spec).then((borders) => !borders || gone
424
+ ? null
425
+ : {
426
+ layer,
427
+ spec,
428
+ borders,
429
+ regions: drawRegions({
430
+ ...options,
431
+ borders,
432
+ title: layer.label ?? spec.from,
433
+ legend: spec.legend !== false && spec.shade !== undefined,
434
+ ...(choose && options.writable(choose) ? { press: (border) => options.choose(choose, border.value) } : {}),
435
+ }),
436
+ });
437
+ });
438
+ return {
439
+ update(values, hidden) {
440
+ for (const one of made)
441
+ void one.then((drawn) => {
442
+ if (!drawn || gone)
443
+ return;
444
+ const chosen = drawn.spec.choose ? values[drawn.spec.choose] : null;
445
+ drawn.regions.shade(drawn.spec.shade ? ownNumbers(drawn.borders, drawn.spec.shade) : null, chosen === null || chosen === undefined || chosen === false ? null : String(chosen));
446
+ drawn.regions.show(!hidden(drawn.layer.id));
447
+ });
448
+ },
449
+ destroy() {
450
+ gone = true;
451
+ for (const one of made)
452
+ void one.then((drawn) => drawn?.regions.destroy());
453
+ },
454
+ };
455
+ }
456
+ //# sourceMappingURL=regions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regions.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/regions.ts"],"names":[],"mappings":";;;AAgCA,kCAeC;AAID,kCAaC;AASD,gCAqBC;AAGD,0BAIC;AAoDD,kCAoLC;AAGD,kCAWC;AAkCD,kCA+DC;AAQD,kCAiDC;AAnfD,qCAAgD;AAEhD,yCAAmD;AAyBnD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE5I,2GAA2G;AAC3G,SAAgB,WAAW,CAAC,UAAmB,EAAE,IAAoC;IACnF,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,UAAU,CAAC,UAAU,CAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5H,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAClE,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAkD,CAAC;QAC7F,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAmC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC,CAAC,CAAE,WAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7K,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,OAAO,EAAyC,CAAC;AACpE,gJAAgJ;AAChJ,SAAgB,WAAW,CAAC,IAAyC,EAAE,IAAY;IACjF,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAA4B,CAAC;IACrE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvB,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAAuB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1F,0DAA0D;QAC1D,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,MAAyB;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAW,CAAC;IAClF,CAAC,CAAC;IACF,iGAAiG;IACjG,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,IAAI;YAAE,MAAM;IACzB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,sEAAsE;AACtE,SAAgB,OAAO,CAAC,KAAgC,EAAE,KAAwB;IAChF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACjH,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,0HAA0H;AAC1H,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7F,QAAA,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyB1B,CAAC;AAEF,SAAS,mBAAmB,CAAC,GAAa;IACxC,IAAI,GAAG,CAAC,cAAc,CAAC,2BAA2B,CAAC;QAAE,OAAO;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,2BAA2B,CAAC;IACvC,KAAK,CAAC,WAAW,GAAG,mBAAW,CAAC;IAChC,CAAC,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtF,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAYD,SAAgB,WAAW,CAAC,OAa3B;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACxE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7H,4EAA4E;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IAC1B,+DAA+D;IAC/D,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,iEAAiE;IACjE,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1H,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,GAAuC,IAAI,CAAC;IACtD,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,aAAI,EAAC,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAqB,CAAC,CAAC,CAAC,CAAC;QAC9H,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChJ,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAChI,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEpE,0FAA0F;IAC1F,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAA4B,CAAC;IACpG,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,SAAS,MAAM;QACb,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7E,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzI,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACxD,0FAA0F;YAC1F,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9H,MAAM,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAChH,OAAO,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACzE,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC3F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;;YAChG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IAC7C,CAAC,CAAC;IACF,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACrD,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAElD,uFAAuF;IACvF,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC;IACnC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnB,SAAS,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAoC,EAAE,IAAa;QAC/F,MAAM,CAAC,eAAe,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,CAAC,SAAS,GAAG,qBAAqB,CAAC;QACxC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,yDAAyD;QACzD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,uCAAuC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC9H,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACvC,6FAA6F;YAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;YAClB,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAiB;QAC1B,KAAK,CAAC,IAAI,EAAE,SAAS;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAChF,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1E,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC;gBACxB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;oBACtC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,uCAAuC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;gBAC1I,CAAC;gBACD,OAAO,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAChE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE,OAAO,GAAG,EAAE,CAAC;YACxE,MAAM,EAAE,CAAC;YACT,mHAAmH;YACnH,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,EAAE,CAAC,GAAG,EAAE,GAAG;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACzG,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO;YACvC,IAAI,EAAE;gBAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;gBACpB,KAAK,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACnD,CAAC;QACD,OAAO;YACL,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;IACF,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qEAAqE;AACrE,SAAgB,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,KAA2B;IAC3E,MAAM,MAAM,GAAG,CAAC,IAAwB,EAAE,EAAE;QAC1C,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAC9D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;gBAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QACnF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED,+HAA+H;AAC/H,KAAK,UAAU,SAAS,CAAC,IAAyC,EAAE,IAAgB;IAClF,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,mBAAQ,EAAC,gBAAgB,IAAI,CAAC,IAAI,mBAAmB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAA,mBAAQ,EAAC,eAAe,IAAI,CAAC,IAAI,mDAAmD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1J,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,2FAA2F;AAC3F,SAAS,UAAU,CAAC,OAA0B,EAAE,QAAgB;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,OAe3B;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC3D,CAAC,OAAO,IAAI,IAAI;QACd,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,OAAO;YACP,KAAK,EAAE,WAAW,CAAC;gBACjB,GAAG,OAAO;gBACV,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK;gBAC7B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAA,aAAI,EAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;aACrK,CAAC;SACH,CACN,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC;IACzG,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO;YACzB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;gBAAE,OAAO;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;YACpC,IAAI,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;YACvC,IAAI,KAAK,KAAK,OAAO;gBAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;iBAC3D,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5I,KAAK,MAAM,KAAK,IAAI,MAAM;wBAAE,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;4BAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrG,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,mDAAmD;gBACnD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACvC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAE,GAAuB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;oBACvG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK;wBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtH,CAAC;YACH,CAAC;YACD,IAAI,OAAO,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,OAAO;YACL,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,OAY3B;IACC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,OAA2C,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACpD,CAAC,OAAO,IAAI,IAAI;YACd,CAAC,CAAC,IAAI;YACN,CAAC,CAAC;gBACE,KAAK;gBACL,IAAI;gBACJ,OAAO;gBACP,OAAO,EAAE,WAAW,CAAC;oBACnB,GAAG,OAAO;oBACV,OAAO;oBACP,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;oBAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;oBACzD,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnH,CAAC;aACH,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,MAAM,CAAC,MAAM,EAAE,MAAM;YACnB,KAAK,MAAM,GAAG,IAAI,IAAI;gBACpB,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACtB,IAAI,CAAC,KAAK,IAAI,IAAI;wBAAE,OAAO;oBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBAChL,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO;YACL,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC"}