@metadev/lux 0.27.0 → 0.28.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 (83) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -488
  4. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +258 -258
  5. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +77 -77
  6. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -156
  7. package/esm2022/lib/datasource.mjs +1 -1
  8. package/esm2022/lib/datetime/datetime.component.mjs +312 -312
  9. package/esm2022/lib/filter/filter.component.mjs +158 -158
  10. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -423
  11. package/esm2022/lib/geolocation/geolocation.service.mjs +122 -122
  12. package/esm2022/lib/geolocation/openlayer-loader.service.mjs +61 -61
  13. package/esm2022/lib/helperFns.mjs +117 -117
  14. package/esm2022/lib/input/input.component.mjs +469 -469
  15. package/esm2022/lib/input/regexp.service.mjs +194 -194
  16. package/esm2022/lib/lang.mjs +8 -8
  17. package/esm2022/lib/lux.module.mjs +118 -118
  18. package/esm2022/lib/map/geopoint.mjs +1 -1
  19. package/esm2022/lib/map/map.component.mjs +275 -275
  20. package/esm2022/lib/modal/modal-backdrop.mjs +24 -24
  21. package/esm2022/lib/modal/modal-config.mjs +11 -11
  22. package/esm2022/lib/modal/modal-dismiss-reasons.mjs +5 -5
  23. package/esm2022/lib/modal/modal-ref.mjs +100 -100
  24. package/esm2022/lib/modal/modal-stack.mjs +181 -181
  25. package/esm2022/lib/modal/modal-window.mjs +118 -118
  26. package/esm2022/lib/modal/modal.service.mjs +27 -27
  27. package/esm2022/lib/modal/util.mjs +81 -81
  28. package/esm2022/lib/pagination/pagination.component.mjs +144 -144
  29. package/esm2022/lib/pagination/pagination.mjs +1 -1
  30. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -129
  31. package/esm2022/lib/select/select.component.mjs +148 -148
  32. package/esm2022/lib/tooltip/placement.mjs +7 -7
  33. package/esm2022/lib/tooltip/tooltip-context.mjs +1 -1
  34. package/esm2022/lib/tooltip/tooltip.component.mjs +21 -21
  35. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -69
  36. package/esm2022/lib/tooltip/tooltip.service.mjs +136 -136
  37. package/esm2022/lib/tooltip/tooltop-content.mjs +8 -8
  38. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -79
  39. package/esm2022/lib/window/window.service.mjs +45 -45
  40. package/esm2022/metadev-lux.mjs +4 -4
  41. package/esm2022/public-api.mjs +20 -20
  42. package/fesm2022/metadev-lux.mjs +4372 -4372
  43. package/fesm2022/metadev-lux.mjs.map +1 -1
  44. package/index.d.ts +5 -5
  45. package/lib/autocomplete/autocomplete.component.d.ts +81 -81
  46. package/lib/autocomplete-list/autocomplete-list.component.d.ts +65 -65
  47. package/lib/breadcrumb/breadcrumb.component.d.ts +22 -22
  48. package/lib/checkbox/checkbox.component.d.ts +47 -47
  49. package/lib/datasource.d.ts +13 -13
  50. package/lib/datetime/datetime.component.d.ts +69 -69
  51. package/lib/filter/filter.component.d.ts +51 -51
  52. package/lib/geolocation/geolocation.component.d.ts +123 -123
  53. package/lib/geolocation/geolocation.service.d.ts +32 -32
  54. package/lib/geolocation/openlayer-loader.service.d.ts +7 -7
  55. package/lib/helperFns.d.ts +15 -15
  56. package/lib/input/input.component.d.ts +108 -108
  57. package/lib/input/regexp.service.d.ts +15 -15
  58. package/lib/lang.d.ts +2 -2
  59. package/lib/lux.module.d.ts +27 -27
  60. package/lib/map/geopoint.d.ts +7 -7
  61. package/lib/map/map.component.d.ts +39 -39
  62. package/lib/modal/modal-backdrop.d.ts +8 -8
  63. package/lib/modal/modal-config.d.ts +14 -14
  64. package/lib/modal/modal-dismiss-reasons.d.ts +4 -4
  65. package/lib/modal/modal-ref.d.ts +41 -41
  66. package/lib/modal/modal-stack.d.ts +31 -31
  67. package/lib/modal/modal-window.d.ts +28 -28
  68. package/lib/modal/modal.service.d.ts +19 -19
  69. package/lib/modal/util.d.ts +40 -40
  70. package/lib/pagination/pagination.component.d.ts +52 -52
  71. package/lib/pagination/pagination.d.ts +10 -10
  72. package/lib/radiogroup/radiogroup.component.d.ts +37 -37
  73. package/lib/select/select.component.d.ts +38 -38
  74. package/lib/tooltip/placement.d.ts +7 -7
  75. package/lib/tooltip/tooltip-context.d.ts +3 -3
  76. package/lib/tooltip/tooltip.component.d.ts +11 -11
  77. package/lib/tooltip/tooltip.directive.d.ts +27 -27
  78. package/lib/tooltip/tooltip.service.d.ts +20 -20
  79. package/lib/tooltip/tooltop-content.d.ts +6 -6
  80. package/lib/voice-recognition/voice-recognition.directive.d.ts +16 -16
  81. package/lib/window/window.service.d.ts +11 -11
  82. package/package.json +3 -4
  83. package/public-api.d.ts +18 -18
@@ -1,275 +1,275 @@
1
- /* eslint-disable no-self-assign */
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { OpenLayerLoaderService } from '../geolocation/openlayer-loader.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../geolocation/openlayer-loader.service";
7
- export class MapComponent {
8
- static idCounter = 0;
9
- loaded$ = new BehaviorSubject(false);
10
- _map;
11
- mapId;
12
- _zoom;
13
- set zoom(zoom) {
14
- if (!isNaN(zoom)) {
15
- this._zoom = zoom;
16
- if (this._map) {
17
- this._map.getView().setZoom(zoom);
18
- }
19
- }
20
- }
21
- get zoom() {
22
- return this._zoom;
23
- }
24
- _center;
25
- set center(center) {
26
- if (center && center.coordinates && center.coordinates.length === 2) {
27
- this._center = center;
28
- if (this._map) {
29
- this._map.getView().setCenter(ol.proj.fromLonLat(center.coordinates));
30
- }
31
- }
32
- }
33
- get center() {
34
- return this._center;
35
- }
36
- _readonly;
37
- set readonly(readonly) {
38
- if (!readonly) {
39
- if (this._map) {
40
- this._map.on('click', (args) => {
41
- // args.coordinate is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
42
- const coordinates = ol.proj.toLonLat(args.coordinate);
43
- // alternatively: const lonLat = ol.proj.transform(args.coordinate,'EPSG:3857','EPSG:4326');
44
- this.addMarkerAtCoordinates(coordinates);
45
- });
46
- this._map.on('pointermove', (event) => {
47
- const pixel = this._map.getEventPixel(event.originalEvent);
48
- const hit = this._map.hasFeatureAtPixel(pixel);
49
- this._map.getViewport().style.cursor = hit ? 'move' : 'grab';
50
- });
51
- }
52
- }
53
- else {
54
- if (this._map) {
55
- this._map.on('click', (args) => { });
56
- this._map.on('pointermove', (event) => { });
57
- this._map.getViewport().style.cursor = 'grab';
58
- }
59
- }
60
- this._readonly = readonly;
61
- // reset marker coordinates so marker interactions can be created or recreated accordingly
62
- // to the changes to readonly
63
- this.markerCoordinates = this.markerCoordinates;
64
- }
65
- get readonly() {
66
- return this._readonly;
67
- }
68
- _marker;
69
- _markerInteraction;
70
- _markerCoordinates;
71
- set markerCoordinates(markerCoordinates) {
72
- if (markerCoordinates && markerCoordinates.length === 2) {
73
- this._markerCoordinates = markerCoordinates;
74
- if (this._map) {
75
- this.addMarkerAtCoordinates(markerCoordinates);
76
- }
77
- }
78
- else {
79
- this._markerCoordinates = undefined;
80
- if (this._map) {
81
- this.removeMarker();
82
- }
83
- }
84
- }
85
- get markerCoordinates() {
86
- return this._markerCoordinates;
87
- }
88
- set markerPoint(markerPoint) {
89
- if (!markerPoint ||
90
- !(markerPoint.coordinates && markerPoint.coordinates.length === 2)) {
91
- this.markerCoordinates = undefined;
92
- }
93
- else {
94
- this.markerCoordinates = [
95
- +markerPoint.coordinates[0],
96
- +markerPoint.coordinates[1]
97
- ];
98
- }
99
- this.valueChange.emit(markerPoint);
100
- }
101
- get markerPoint() {
102
- return {
103
- type: 'Point',
104
- coordinates: this.markerCoordinates
105
- };
106
- }
107
- valueChange = new EventEmitter();
108
- _markerSource;
109
- _markerStyle;
110
- constructor(olLoader) {
111
- olLoader.load().subscribe((_) => {
112
- // Initialize
113
- this._markerSource = new ol.source.Vector();
114
- this._markerStyle = new ol.style.Style({
115
- image: new ol.style.Icon({
116
- anchor: [0.5, 1],
117
- scale: 0.25,
118
- src: '/assets/img/marker.png'
119
- })
120
- });
121
- this.loaded$.next(true);
122
- });
123
- }
124
- ngOnInit() {
125
- this.mapId = this.mapId ? this.mapId : 'map' + MapComponent.idCounter++;
126
- }
127
- ngAfterViewInit() {
128
- this.loaded$.subscribe((loaded) => {
129
- if (loaded) {
130
- this.initMap();
131
- }
132
- });
133
- }
134
- initMap() {
135
- this._map = new ol.Map({
136
- target: this.mapId,
137
- controls: ol.control.defaults({ attribution: false }),
138
- layers: [
139
- new ol.layer.Tile({
140
- source: new ol.source.OSM()
141
- }),
142
- new ol.layer.Vector({
143
- source: this._markerSource,
144
- style: this._markerStyle
145
- })
146
- ],
147
- view: new ol.View({
148
- center: ol.proj.fromLonLat(this.center !== undefined ? this.center.coordinates : [0, 0]),
149
- zoom: this.zoom
150
- })
151
- });
152
- if (this.center === undefined || this.center === null) {
153
- // if the center is not set, we set its default value
154
- if ('geolocation' in navigator) {
155
- navigator.geolocation.getCurrentPosition((position) => {
156
- this.center = {
157
- type: 'Point',
158
- coordinates: [position.coords.longitude, position.coords.latitude]
159
- };
160
- }, (error) => {
161
- this.center = {
162
- type: 'Point',
163
- coordinates: [0, 0]
164
- };
165
- });
166
- }
167
- else {
168
- this.center = {
169
- type: 'Point',
170
- coordinates: [0, 0]
171
- };
172
- }
173
- }
174
- else {
175
- // the center needs the map to be properly set, so if it was set before the map was initialized,
176
- // we set the center again to perform necessary adjustements
177
- this.center = this.center;
178
- }
179
- if (this.zoom === undefined || this.zoom === null) {
180
- // if the zoom is not set, we set its default value
181
- this.zoom = 18;
182
- }
183
- else {
184
- // the zoom needs the map to be properly set, so if it was set before the map was initialized,
185
- // we set the zoom again to perform necessary adjustements
186
- this.zoom = this.zoom;
187
- }
188
- if (this.readonly === undefined || this.readonly === null) {
189
- // if readonly is not set, we set its default value
190
- this.readonly = false;
191
- }
192
- else {
193
- // readonly needs the map to be properly set, so if it was set before the map was initialized,
194
- // we set readonly again to perform necessary adjustements
195
- this.readonly = this.readonly;
196
- }
197
- if (this.markerCoordinates !== undefined &&
198
- this.markerCoordinates !== null) {
199
- // the marker coordinates need the map to be properly set, so if they were set before the map was initialized,
200
- // we set the marker coordinates again to perform necessary adjustements
201
- this.markerCoordinates = this.markerCoordinates;
202
- }
203
- }
204
- addMarkerAtCoordinates(coordinates) {
205
- if (coordinates && coordinates.length === 2) {
206
- if (this._marker !== undefined) {
207
- this.removeMarker();
208
- }
209
- this._marker = new ol.Feature({
210
- geometry: new ol.geom.Point(
211
- // [lon, lat] is in EPSG:4326 (degrees), we transform it into EPSG:3857 (meters)
212
- ol.proj.transform(coordinates, 'EPSG:4326', 'EPSG:3857'))
213
- });
214
- this._markerSource.addFeature(this._marker);
215
- this._markerCoordinates = this.getMarkerCoordinates();
216
- if (!this.readonly) {
217
- const dragInteraction = new ol.interaction.Modify({
218
- features: new ol.Collection([this._marker]),
219
- style: this._markerStyle,
220
- pixelTolerance: 50,
221
- hitDetection: true
222
- });
223
- this._markerInteraction = dragInteraction;
224
- this._map.addInteraction(dragInteraction);
225
- }
226
- this._marker.on('change', () => {
227
- this._markerCoordinates = this.getMarkerCoordinates();
228
- }, this._marker);
229
- }
230
- }
231
- removeMarker() {
232
- if (this._marker !== undefined) {
233
- this._markerSource.removeFeature(this._marker);
234
- this._marker = undefined;
235
- }
236
- if (this._markerInteraction !== undefined) {
237
- this._map.getInteractions().pop();
238
- this._markerInteraction = undefined;
239
- }
240
- }
241
- getMarkerCoordinates() {
242
- if (this._marker === undefined || this._marker == null) {
243
- return this._marker;
244
- }
245
- const coordinates = this._marker.getGeometry().getCoordinates();
246
- // coordinates is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
247
- return ol.proj.transform(coordinates, 'EPSG:3857', 'EPSG:4326');
248
- }
249
- onResize() {
250
- if (this._map) {
251
- this._map.updateSize();
252
- }
253
- }
254
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MapComponent, deps: [{ token: i1.OpenLayerLoaderService }], target: i0.ɵɵFactoryTarget.Component });
255
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: MapComponent, selector: "lux-map", inputs: { mapId: "mapId", zoom: "zoom", center: "center", readonly: "readonly", markerCoordinates: "markerCoordinates", markerPoint: "markerPoint" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] });
256
- }
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MapComponent, decorators: [{
258
- type: Component,
259
- args: [{ selector: 'lux-map', template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] }]
260
- }], ctorParameters: function () { return [{ type: i1.OpenLayerLoaderService }]; }, propDecorators: { mapId: [{
261
- type: Input
262
- }], zoom: [{
263
- type: Input
264
- }], center: [{
265
- type: Input
266
- }], readonly: [{
267
- type: Input
268
- }], markerCoordinates: [{
269
- type: Input
270
- }], markerPoint: [{
271
- type: Input
272
- }], valueChange: [{
273
- type: Output
274
- }] } });
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvbWFwL21hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFFbkMsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7QUFZakYsTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFYixPQUFPLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBTTtJQUVULEtBQUssQ0FBQztJQUVmLEtBQUssQ0FBUztJQUNkLElBQ0ksSUFBSSxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sQ0FBVztJQUNsQixJQUNJLE1BQU0sQ0FBQyxNQUFnQjtRQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxX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SSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRSxpRkFBaUY7UUFDakYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7dUdBdlJVLFlBQVk7MkZBQVosWUFBWSw4T0N2QnpCLHFFQUNBOzsyRkRzQmEsWUFBWTtrQkFMeEIsU0FBUzsrQkFDRSxTQUFTOzZHQVdWLEtBQUs7c0JBQWIsS0FBSztnQkFJRixJQUFJO3NCQURQLEtBQUs7Z0JBZUYsTUFBTTtzQkFEVCxLQUFLO2dCQWVGLFFBQVE7c0JBRFgsS0FBSztnQkFvQ00saUJBQWlCO3NCQUQ1QixLQUFLO2dCQWtCRixXQUFXO3NCQURkLEtBQUs7Z0JBcUJJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcGVuTGF5ZXJMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ2VvbG9jYXRpb24vb3BlbmxheWVyLWxvYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgR2VvUG9pbnQgfSBmcm9tICcuL2dlb3BvaW50JztcblxuLy8gQGR5bmFtaWNcbmRlY2xhcmUgY29uc3Qgb2w6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBwcml2YXRlIGxvYWRlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHByaXZhdGUgX21hcDogYW55O1xuXG4gIEBJbnB1dCgpIG1hcElkO1xuXG4gIF96b29tOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHNldCB6b29tKHpvb206IG51bWJlcikge1xuICAgIGlmICghaXNOYU4oem9vbSkpIHtcbiAgICAgIHRoaXMuX3pvb20gPSB6b29tO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldFpvb20oem9vbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCB6b29tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3pvb207XG4gIH1cblxuICBfY2VudGVyOiBHZW9Qb2ludDtcbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEdlb1BvaW50KSB7XG4gICAgaWYgKGNlbnRlciAmJiBjZW50ZXIuY29vcmRpbmF0ZXMgJiYgY2VudGVyLmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fY2VudGVyID0gY2VudGVyO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldENlbnRlcihvbC5wcm9qLmZyb21Mb25MYXQoY2VudGVyLmNvb3JkaW5hdGVzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBjZW50ZXIoKTogR2VvUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBfcmVhZG9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xuICAgIGlmICghcmVhZG9ubHkpIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBhcmdzLmNvb3JkaW5hdGUgaXMgaW4gRVBTRzozODU3IChtZXRlcnMpLCB3ZSB0cmFuc2Zvcm0gaXQgaW50byBFUFNHOjQzMjYgKGRlZ3JlZXMpXG4gICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBvbC5wcm9qLnRvTG9uTGF0KGFyZ3MuY29vcmRpbmF0ZSk7XG4gICAgICAgICAgLy8gYWx0ZXJuYXRpdmVseTogY29uc3QgbG9uTGF0ID0gb2wucHJvai50cmFuc2Zvcm0oYXJncy5jb29yZGluYXRlLCdFUFNHOjM4NTcnLCdFUFNHOjQzMjYnKTtcbiAgICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLl9tYXAuZ2V0RXZlbnRQaXhlbChldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICBjb25zdCBoaXQgPSB0aGlzLl9tYXAuaGFzRmVhdHVyZUF0UGl4ZWwocGl4ZWwpO1xuICAgICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9IGhpdCA/ICdtb3ZlJyA6ICdncmFiJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHt9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7fSk7XG4gICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9ICdncmFiJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVhZG9ubHkgPSByZWFkb25seTtcbiAgICAvLyByZXNldCBtYXJrZXIgY29vcmRpbmF0ZXMgc28gbWFya2VyIGludGVyYWN0aW9ucyBjYW4gYmUgY3JlYXRlZCBvciByZWNyZWF0ZWQgYWNjb3JkaW5nbHlcbiAgICAvLyB0byB0aGUgY2hhbmdlcyB0byByZWFkb25seVxuICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICB9XG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBwcml2YXRlIF9tYXJrZXI6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VySW50ZXJhY3Rpb246IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyQ29vcmRpbmF0ZXM6IG51bWJlcltdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNldCBtYXJrZXJDb29yZGluYXRlcyhtYXJrZXJDb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICBpZiAobWFya2VyQ29vcmRpbmF0ZXMgJiYgbWFya2VyQ29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IG1hcmtlckNvb3JkaW5hdGVzO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMobWFya2VyQ29vcmRpbmF0ZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgbWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZXJDb29yZGluYXRlcztcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFya2VyUG9pbnQobWFya2VyUG9pbnQ6IEdlb1BvaW50KSB7XG4gICAgaWYgKFxuICAgICAgIW1hcmtlclBvaW50IHx8XG4gICAgICAhKG1hcmtlclBvaW50LmNvb3JkaW5hdGVzICYmIG1hcmtlclBvaW50LmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMilcbiAgICApIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSBbXG4gICAgICAgICttYXJrZXJQb2ludC5jb29yZGluYXRlc1swXSxcbiAgICAgICAgK21hcmtlclBvaW50LmNvb3JkaW5hdGVzWzFdXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobWFya2VyUG9pbnQpO1xuICB9XG4gIGdldCBtYXJrZXJQb2ludCgpOiBHZW9Qb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICBjb29yZGluYXRlczogdGhpcy5tYXJrZXJDb29yZGluYXRlc1xuICAgIH07XG4gIH1cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9Qb2ludD4oKTtcblxuICBwcml2YXRlIF9tYXJrZXJTb3VyY2U6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyU3R5bGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihvbExvYWRlcjogT3BlbkxheWVyTG9hZGVyU2VydmljZSkge1xuICAgIG9sTG9hZGVyLmxvYWQoKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemVcbiAgICAgIHRoaXMuX21hcmtlclNvdXJjZSA9IG5ldyBvbC5zb3VyY2UuVmVjdG9yKCk7XG4gICAgICB0aGlzLl9tYXJrZXJTdHlsZSA9IG5ldyBvbC5zdHlsZS5TdHlsZSh7XG4gICAgICAgIGltYWdlOiBuZXcgb2wuc3R5bGUuSWNvbih7XG4gICAgICAgICAgYW5jaG9yOiBbMC41LCAxXSxcbiAgICAgICAgICBzY2FsZTogMC4yNSxcbiAgICAgICAgICBzcmM6ICcvYXNzZXRzL2ltZy9tYXJrZXIucG5nJ1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvYWRlZCQubmV4dCh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwSWQgPSB0aGlzLm1hcElkID8gdGhpcy5tYXBJZCA6ICdtYXAnICsgTWFwQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGVkJC5zdWJzY3JpYmUoKGxvYWRlZCkgPT4ge1xuICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICB0aGlzLmluaXRNYXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGluaXRNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5fbWFwID0gbmV3IG9sLk1hcCh7XG4gICAgICB0YXJnZXQ6IHRoaXMubWFwSWQsXG4gICAgICBjb250cm9sczogb2wuY29udHJvbC5kZWZhdWx0cyh7IGF0dHJpYnV0aW9uOiBmYWxzZSB9KSxcbiAgICAgIGxheWVyczogW1xuICAgICAgICBuZXcgb2wubGF5ZXIuVGlsZSh7XG4gICAgICAgICAgc291cmNlOiBuZXcgb2wuc291cmNlLk9TTSgpXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgb2wubGF5ZXIuVmVjdG9yKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuX21hcmtlclNvdXJjZSxcbiAgICAgICAgICBzdHlsZTogdGhpcy5fbWFya2VyU3R5bGVcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICB2aWV3OiBuZXcgb2wuVmlldyh7XG4gICAgICAgIGNlbnRlcjogb2wucHJvai5mcm9tTG9uTGF0KFxuICAgICAgICAgIHRoaXMuY2VudGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLmNlbnRlci5jb29yZGluYXRlcyA6IFswLCAwXVxuICAgICAgICApLFxuICAgICAgICB6b29tOiB0aGlzLnpvb21cbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jZW50ZXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmNlbnRlciA9PT0gbnVsbCkge1xuICAgICAgLy8gaWYgdGhlIGNlbnRlciBpcyBub3Qgc2V0LCB3ZSBzZXQgaXRzIGRlZmF1bHQgdmFsdWVcbiAgICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xuICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgIChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbMCwgMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgICBjb29yZGluYXRlczogWzAsIDBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjZW50ZXIgbmVlZHMgdGhlIG1hcCB0byBiZSBwcm9wZXJseSBzZXQsIHNvIGlmIGl0IHdhcyBzZXQgYmVmb3JlIHRoZSBtYXAgd2FzIGluaXRpYWxpemVkLFxuICAgICAgLy8gd2Ugc2V0IHRoZSBjZW50ZXIgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnpvb20gPT09IHVuZGVmaW5lZCB8fCB0aGlzLnpvb20gPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHRoZSB6b29tIGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy56b29tID0gMTg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSB6b29tIG5lZWRzIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgc2V0LCBzbyBpZiBpdCB3YXMgc2V0IGJlZm9yZSB0aGUgbWFwIHdhcyBpbml0aWFsaXplZCxcbiAgICAgIC8vIHdlIHNldCB0aGUgem9vbSBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMuem9vbSA9IHRoaXMuem9vbTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFkb25seSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMucmVhZG9ubHkgPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHJlYWRvbmx5IGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy5yZWFkb25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZWFkb25seSBuZWVkcyB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgaXQgd2FzIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgcmVhZG9ubHkgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgIT09IG51bGxcbiAgICApIHtcbiAgICAgIC8vIHRoZSBtYXJrZXIgY29vcmRpbmF0ZXMgbmVlZCB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgdGhleSB3ZXJlIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgdGhlIG1hcmtlciBjb29yZGluYXRlcyBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTWFya2VyQXRDb29yZGluYXRlcyhjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBpZiAodGhpcy5fbWFya2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcmtlciA9IG5ldyBvbC5GZWF0dXJlKHtcbiAgICAgICAgZ2VvbWV0cnk6IG5ldyBvbC5nZW9tLlBvaW50KFxuICAgICAgICAgIC8vIFtsb24sIGxhdF0gaXMgaW4gRVBTRzo0MzI2IChkZWdyZWVzKSwgd2UgdHJhbnNmb3JtIGl0IGludG8gRVBTRzozODU3IChtZXRlcnMpXG4gICAgICAgICAgb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjQzMjYnLCAnRVBTRzozODU3JylcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9tYXJrZXJTb3VyY2UuYWRkRmVhdHVyZSh0aGlzLl9tYXJrZXIpO1xuICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLmdldE1hcmtlckNvb3JkaW5hdGVzKCk7XG5cbiAgICAgIGlmICghdGhpcy5yZWFkb25seSkge1xuICAgICAgICBjb25zdCBkcmFnSW50ZXJhY3Rpb24gPSBuZXcgb2wuaW50ZXJhY3Rpb24uTW9kaWZ5KHtcbiAgICAgICAgICBmZWF0dXJlczogbmV3IG9sLkNvbGxlY3Rpb24oW3RoaXMuX21hcmtlcl0pLFxuICAgICAgICAgIHN0eWxlOiB0aGlzLl9tYXJrZXJTdHlsZSxcbiAgICAgICAgICBwaXhlbFRvbGVyYW5jZTogNTAsXG4gICAgICAgICAgaGl0RGV0ZWN0aW9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9tYXJrZXJJbnRlcmFjdGlvbiA9IGRyYWdJbnRlcmFjdGlvbjtcbiAgICAgICAgdGhpcy5fbWFwLmFkZEludGVyYWN0aW9uKGRyYWdJbnRlcmFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcmtlci5vbihcbiAgICAgICAgJ2NoYW5nZScsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHRoaXMuZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fbWFya2VyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWFya2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tYXJrZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbWFya2VyU291cmNlLnJlbW92ZUZlYXR1cmUodGhpcy5fbWFya2VyKTtcbiAgICAgIHRoaXMuX21hcmtlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21hcmtlckludGVyYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21hcC5nZXRJbnRlcmFjdGlvbnMoKS5wb3AoKTtcbiAgICAgIHRoaXMuX21hcmtlckludGVyYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5fbWFya2VyID09PSB1bmRlZmluZWQgfHwgdGhpcy5fbWFya2VyID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZXI7XG4gICAgfVxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5fbWFya2VyLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAvLyBjb29yZGluYXRlcyBpcyBpbiBFUFNHOjM4NTcgKG1ldGVycyksIHdlIHRyYW5zZm9ybSBpdCBpbnRvIEVQU0c6NDMyNiAoZGVncmVlcylcbiAgICByZXR1cm4gb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjM4NTcnLCAnRVBTRzo0MzI2Jyk7XG4gIH1cblxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAudXBkYXRlU2l6ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBbaWRdPVwibWFwSWRcIiBjbGFzcz1cIm1hcFwiIChyZXNpemVkKT1cIm9uUmVzaXplKClcIj48L2Rpdj5cbiJdfQ==
1
+ /* eslint-disable no-self-assign */
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { OpenLayerLoaderService } from '../geolocation/openlayer-loader.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../geolocation/openlayer-loader.service";
7
+ export class MapComponent {
8
+ static idCounter = 0;
9
+ loaded$ = new BehaviorSubject(false);
10
+ _map;
11
+ mapId;
12
+ _zoom;
13
+ set zoom(zoom) {
14
+ if (!isNaN(zoom)) {
15
+ this._zoom = zoom;
16
+ if (this._map) {
17
+ this._map.getView().setZoom(zoom);
18
+ }
19
+ }
20
+ }
21
+ get zoom() {
22
+ return this._zoom;
23
+ }
24
+ _center;
25
+ set center(center) {
26
+ if (center && center.coordinates && center.coordinates.length === 2) {
27
+ this._center = center;
28
+ if (this._map) {
29
+ this._map.getView().setCenter(ol.proj.fromLonLat(center.coordinates));
30
+ }
31
+ }
32
+ }
33
+ get center() {
34
+ return this._center;
35
+ }
36
+ _readonly;
37
+ set readonly(readonly) {
38
+ if (!readonly) {
39
+ if (this._map) {
40
+ this._map.on('click', (args) => {
41
+ // args.coordinate is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
42
+ const coordinates = ol.proj.toLonLat(args.coordinate);
43
+ // alternatively: const lonLat = ol.proj.transform(args.coordinate,'EPSG:3857','EPSG:4326');
44
+ this.addMarkerAtCoordinates(coordinates);
45
+ });
46
+ this._map.on('pointermove', (event) => {
47
+ const pixel = this._map.getEventPixel(event.originalEvent);
48
+ const hit = this._map.hasFeatureAtPixel(pixel);
49
+ this._map.getViewport().style.cursor = hit ? 'move' : 'grab';
50
+ });
51
+ }
52
+ }
53
+ else {
54
+ if (this._map) {
55
+ this._map.on('click', (args) => { });
56
+ this._map.on('pointermove', (event) => { });
57
+ this._map.getViewport().style.cursor = 'grab';
58
+ }
59
+ }
60
+ this._readonly = readonly;
61
+ // reset marker coordinates so marker interactions can be created or recreated accordingly
62
+ // to the changes to readonly
63
+ this.markerCoordinates = this.markerCoordinates;
64
+ }
65
+ get readonly() {
66
+ return this._readonly;
67
+ }
68
+ _marker;
69
+ _markerInteraction;
70
+ _markerCoordinates;
71
+ set markerCoordinates(markerCoordinates) {
72
+ if (markerCoordinates && markerCoordinates.length === 2) {
73
+ this._markerCoordinates = markerCoordinates;
74
+ if (this._map) {
75
+ this.addMarkerAtCoordinates(markerCoordinates);
76
+ }
77
+ }
78
+ else {
79
+ this._markerCoordinates = undefined;
80
+ if (this._map) {
81
+ this.removeMarker();
82
+ }
83
+ }
84
+ }
85
+ get markerCoordinates() {
86
+ return this._markerCoordinates;
87
+ }
88
+ set markerPoint(markerPoint) {
89
+ if (!markerPoint ||
90
+ !(markerPoint.coordinates && markerPoint.coordinates.length === 2)) {
91
+ this.markerCoordinates = undefined;
92
+ }
93
+ else {
94
+ this.markerCoordinates = [
95
+ +markerPoint.coordinates[0],
96
+ +markerPoint.coordinates[1]
97
+ ];
98
+ }
99
+ this.valueChange.emit(markerPoint);
100
+ }
101
+ get markerPoint() {
102
+ return {
103
+ type: 'Point',
104
+ coordinates: this.markerCoordinates
105
+ };
106
+ }
107
+ valueChange = new EventEmitter();
108
+ _markerSource;
109
+ _markerStyle;
110
+ constructor(olLoader) {
111
+ olLoader.load().subscribe((_) => {
112
+ // Initialize
113
+ this._markerSource = new ol.source.Vector();
114
+ this._markerStyle = new ol.style.Style({
115
+ image: new ol.style.Icon({
116
+ anchor: [0.5, 1],
117
+ scale: 0.25,
118
+ src: '/assets/img/marker.png'
119
+ })
120
+ });
121
+ this.loaded$.next(true);
122
+ });
123
+ }
124
+ ngOnInit() {
125
+ this.mapId = this.mapId ? this.mapId : 'map' + MapComponent.idCounter++;
126
+ }
127
+ ngAfterViewInit() {
128
+ this.loaded$.subscribe((loaded) => {
129
+ if (loaded) {
130
+ this.initMap();
131
+ }
132
+ });
133
+ }
134
+ initMap() {
135
+ this._map = new ol.Map({
136
+ target: this.mapId,
137
+ controls: ol.control.defaults({ attribution: false }),
138
+ layers: [
139
+ new ol.layer.Tile({
140
+ source: new ol.source.OSM()
141
+ }),
142
+ new ol.layer.Vector({
143
+ source: this._markerSource,
144
+ style: this._markerStyle
145
+ })
146
+ ],
147
+ view: new ol.View({
148
+ center: ol.proj.fromLonLat(this.center !== undefined ? this.center.coordinates : [0, 0]),
149
+ zoom: this.zoom
150
+ })
151
+ });
152
+ if (this.center === undefined || this.center === null) {
153
+ // if the center is not set, we set its default value
154
+ if ('geolocation' in navigator) {
155
+ navigator.geolocation.getCurrentPosition((position) => {
156
+ this.center = {
157
+ type: 'Point',
158
+ coordinates: [position.coords.longitude, position.coords.latitude]
159
+ };
160
+ }, (error) => {
161
+ this.center = {
162
+ type: 'Point',
163
+ coordinates: [0, 0]
164
+ };
165
+ });
166
+ }
167
+ else {
168
+ this.center = {
169
+ type: 'Point',
170
+ coordinates: [0, 0]
171
+ };
172
+ }
173
+ }
174
+ else {
175
+ // the center needs the map to be properly set, so if it was set before the map was initialized,
176
+ // we set the center again to perform necessary adjustements
177
+ this.center = this.center;
178
+ }
179
+ if (this.zoom === undefined || this.zoom === null) {
180
+ // if the zoom is not set, we set its default value
181
+ this.zoom = 18;
182
+ }
183
+ else {
184
+ // the zoom needs the map to be properly set, so if it was set before the map was initialized,
185
+ // we set the zoom again to perform necessary adjustements
186
+ this.zoom = this.zoom;
187
+ }
188
+ if (this.readonly === undefined || this.readonly === null) {
189
+ // if readonly is not set, we set its default value
190
+ this.readonly = false;
191
+ }
192
+ else {
193
+ // readonly needs the map to be properly set, so if it was set before the map was initialized,
194
+ // we set readonly again to perform necessary adjustements
195
+ this.readonly = this.readonly;
196
+ }
197
+ if (this.markerCoordinates !== undefined &&
198
+ this.markerCoordinates !== null) {
199
+ // the marker coordinates need the map to be properly set, so if they were set before the map was initialized,
200
+ // we set the marker coordinates again to perform necessary adjustements
201
+ this.markerCoordinates = this.markerCoordinates;
202
+ }
203
+ }
204
+ addMarkerAtCoordinates(coordinates) {
205
+ if (coordinates && coordinates.length === 2) {
206
+ if (this._marker !== undefined) {
207
+ this.removeMarker();
208
+ }
209
+ this._marker = new ol.Feature({
210
+ geometry: new ol.geom.Point(
211
+ // [lon, lat] is in EPSG:4326 (degrees), we transform it into EPSG:3857 (meters)
212
+ ol.proj.transform(coordinates, 'EPSG:4326', 'EPSG:3857'))
213
+ });
214
+ this._markerSource.addFeature(this._marker);
215
+ this._markerCoordinates = this.getMarkerCoordinates();
216
+ if (!this.readonly) {
217
+ const dragInteraction = new ol.interaction.Modify({
218
+ features: new ol.Collection([this._marker]),
219
+ style: this._markerStyle,
220
+ pixelTolerance: 50,
221
+ hitDetection: true
222
+ });
223
+ this._markerInteraction = dragInteraction;
224
+ this._map.addInteraction(dragInteraction);
225
+ }
226
+ this._marker.on('change', () => {
227
+ this._markerCoordinates = this.getMarkerCoordinates();
228
+ }, this._marker);
229
+ }
230
+ }
231
+ removeMarker() {
232
+ if (this._marker !== undefined) {
233
+ this._markerSource.removeFeature(this._marker);
234
+ this._marker = undefined;
235
+ }
236
+ if (this._markerInteraction !== undefined) {
237
+ this._map.getInteractions().pop();
238
+ this._markerInteraction = undefined;
239
+ }
240
+ }
241
+ getMarkerCoordinates() {
242
+ if (this._marker === undefined || this._marker == null) {
243
+ return this._marker;
244
+ }
245
+ const coordinates = this._marker.getGeometry().getCoordinates();
246
+ // coordinates is in EPSG:3857 (meters), we transform it into EPSG:4326 (degrees)
247
+ return ol.proj.transform(coordinates, 'EPSG:3857', 'EPSG:4326');
248
+ }
249
+ onResize() {
250
+ if (this._map) {
251
+ this._map.updateSize();
252
+ }
253
+ }
254
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: MapComponent, deps: [{ token: i1.OpenLayerLoaderService }], target: i0.ɵɵFactoryTarget.Component });
255
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.4", type: MapComponent, selector: "lux-map", inputs: { mapId: "mapId", zoom: "zoom", center: "center", readonly: "readonly", markerCoordinates: "markerCoordinates", markerPoint: "markerPoint" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] });
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: MapComponent, decorators: [{
258
+ type: Component,
259
+ args: [{ selector: 'lux-map', template: "<div [id]=\"mapId\" class=\"map\" (resized)=\"onResize()\"></div>\n", styles: [".map{min-height:100px;height:100%;min-width:160px;width:100%}\n"] }]
260
+ }], ctorParameters: () => [{ type: i1.OpenLayerLoaderService }], propDecorators: { mapId: [{
261
+ type: Input
262
+ }], zoom: [{
263
+ type: Input
264
+ }], center: [{
265
+ type: Input
266
+ }], readonly: [{
267
+ type: Input
268
+ }], markerCoordinates: [{
269
+ type: Input
270
+ }], markerPoint: [{
271
+ type: Input
272
+ }], valueChange: [{
273
+ type: Output
274
+ }] } });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL21hcC9tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvbWFwL21hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFFbkMsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7QUFZakYsTUFBTSxPQUFPLFlBQVk7SUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFYixPQUFPLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBTTtJQUVULEtBQUssQ0FBQztJQUVmLEtBQUssQ0FBUztJQUNkLElBQ0ksSUFBSSxDQUFDLElBQVk7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sQ0FBVztJQUNsQixJQUNJLE1BQU0sQ0FBQyxNQUFnQjtRQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxX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SSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRSxpRkFBaUY7UUFDakYsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7dUdBdlJVLFlBQVk7MkZBQVosWUFBWSw4T0N2QnpCLHFFQUNBOzsyRkRzQmEsWUFBWTtrQkFMeEIsU0FBUzsrQkFDRSxTQUFTOzJGQVdWLEtBQUs7c0JBQWIsS0FBSztnQkFJRixJQUFJO3NCQURQLEtBQUs7Z0JBZUYsTUFBTTtzQkFEVCxLQUFLO2dCQWVGLFFBQVE7c0JBRFgsS0FBSztnQkFvQ00saUJBQWlCO3NCQUQ1QixLQUFLO2dCQWtCRixXQUFXO3NCQURkLEtBQUs7Z0JBcUJJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcGVuTGF5ZXJMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ2VvbG9jYXRpb24vb3BlbmxheWVyLWxvYWRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgR2VvUG9pbnQgfSBmcm9tICcuL2dlb3BvaW50JztcblxuLy8gQGR5bmFtaWNcbmRlY2xhcmUgY29uc3Qgb2w6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBwcml2YXRlIGxvYWRlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHByaXZhdGUgX21hcDogYW55O1xuXG4gIEBJbnB1dCgpIG1hcElkO1xuXG4gIF96b29tOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHNldCB6b29tKHpvb206IG51bWJlcikge1xuICAgIGlmICghaXNOYU4oem9vbSkpIHtcbiAgICAgIHRoaXMuX3pvb20gPSB6b29tO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldFpvb20oem9vbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCB6b29tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3pvb207XG4gIH1cblxuICBfY2VudGVyOiBHZW9Qb2ludDtcbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEdlb1BvaW50KSB7XG4gICAgaWYgKGNlbnRlciAmJiBjZW50ZXIuY29vcmRpbmF0ZXMgJiYgY2VudGVyLmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fY2VudGVyID0gY2VudGVyO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLl9tYXAuZ2V0VmlldygpLnNldENlbnRlcihvbC5wcm9qLmZyb21Mb25MYXQoY2VudGVyLmNvb3JkaW5hdGVzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBjZW50ZXIoKTogR2VvUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBfcmVhZG9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xuICAgIGlmICghcmVhZG9ubHkpIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBhcmdzLmNvb3JkaW5hdGUgaXMgaW4gRVBTRzozODU3IChtZXRlcnMpLCB3ZSB0cmFuc2Zvcm0gaXQgaW50byBFUFNHOjQzMjYgKGRlZ3JlZXMpXG4gICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBvbC5wcm9qLnRvTG9uTGF0KGFyZ3MuY29vcmRpbmF0ZSk7XG4gICAgICAgICAgLy8gYWx0ZXJuYXRpdmVseTogY29uc3QgbG9uTGF0ID0gb2wucHJvai50cmFuc2Zvcm0oYXJncy5jb29yZGluYXRlLCdFUFNHOjM4NTcnLCdFUFNHOjQzMjYnKTtcbiAgICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLl9tYXAuZ2V0RXZlbnRQaXhlbChldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgICBjb25zdCBoaXQgPSB0aGlzLl9tYXAuaGFzRmVhdHVyZUF0UGl4ZWwocGl4ZWwpO1xuICAgICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9IGhpdCA/ICdtb3ZlJyA6ICdncmFiJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIChhcmdzOiBhbnkpID0+IHt9KTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdwb2ludGVybW92ZScsIChldmVudDogYW55KSA9PiB7fSk7XG4gICAgICAgIHRoaXMuX21hcC5nZXRWaWV3cG9ydCgpLnN0eWxlLmN1cnNvciA9ICdncmFiJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcmVhZG9ubHkgPSByZWFkb25seTtcbiAgICAvLyByZXNldCBtYXJrZXIgY29vcmRpbmF0ZXMgc28gbWFya2VyIGludGVyYWN0aW9ucyBjYW4gYmUgY3JlYXRlZCBvciByZWNyZWF0ZWQgYWNjb3JkaW5nbHlcbiAgICAvLyB0byB0aGUgY2hhbmdlcyB0byByZWFkb25seVxuICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICB9XG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBwcml2YXRlIF9tYXJrZXI6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VySW50ZXJhY3Rpb246IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyQ29vcmRpbmF0ZXM6IG51bWJlcltdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNldCBtYXJrZXJDb29yZGluYXRlcyhtYXJrZXJDb29yZGluYXRlczogbnVtYmVyW10pIHtcbiAgICBpZiAobWFya2VyQ29vcmRpbmF0ZXMgJiYgbWFya2VyQ29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IG1hcmtlckNvb3JkaW5hdGVzO1xuICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICB0aGlzLmFkZE1hcmtlckF0Q29vcmRpbmF0ZXMobWFya2VyQ29vcmRpbmF0ZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgbWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZXJDb29yZGluYXRlcztcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWFya2VyUG9pbnQobWFya2VyUG9pbnQ6IEdlb1BvaW50KSB7XG4gICAgaWYgKFxuICAgICAgIW1hcmtlclBvaW50IHx8XG4gICAgICAhKG1hcmtlclBvaW50LmNvb3JkaW5hdGVzICYmIG1hcmtlclBvaW50LmNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMilcbiAgICApIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSBbXG4gICAgICAgICttYXJrZXJQb2ludC5jb29yZGluYXRlc1swXSxcbiAgICAgICAgK21hcmtlclBvaW50LmNvb3JkaW5hdGVzWzFdXG4gICAgICBdO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobWFya2VyUG9pbnQpO1xuICB9XG4gIGdldCBtYXJrZXJQb2ludCgpOiBHZW9Qb2ludCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICBjb29yZGluYXRlczogdGhpcy5tYXJrZXJDb29yZGluYXRlc1xuICAgIH07XG4gIH1cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9Qb2ludD4oKTtcblxuICBwcml2YXRlIF9tYXJrZXJTb3VyY2U6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2VyU3R5bGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihvbExvYWRlcjogT3BlbkxheWVyTG9hZGVyU2VydmljZSkge1xuICAgIG9sTG9hZGVyLmxvYWQoKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemVcbiAgICAgIHRoaXMuX21hcmtlclNvdXJjZSA9IG5ldyBvbC5zb3VyY2UuVmVjdG9yKCk7XG4gICAgICB0aGlzLl9tYXJrZXJTdHlsZSA9IG5ldyBvbC5zdHlsZS5TdHlsZSh7XG4gICAgICAgIGltYWdlOiBuZXcgb2wuc3R5bGUuSWNvbih7XG4gICAgICAgICAgYW5jaG9yOiBbMC41LCAxXSxcbiAgICAgICAgICBzY2FsZTogMC4yNSxcbiAgICAgICAgICBzcmM6ICcvYXNzZXRzL2ltZy9tYXJrZXIucG5nJ1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvYWRlZCQubmV4dCh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWFwSWQgPSB0aGlzLm1hcElkID8gdGhpcy5tYXBJZCA6ICdtYXAnICsgTWFwQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGVkJC5zdWJzY3JpYmUoKGxvYWRlZCkgPT4ge1xuICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICB0aGlzLmluaXRNYXAoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGluaXRNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5fbWFwID0gbmV3IG9sLk1hcCh7XG4gICAgICB0YXJnZXQ6IHRoaXMubWFwSWQsXG4gICAgICBjb250cm9sczogb2wuY29udHJvbC5kZWZhdWx0cyh7IGF0dHJpYnV0aW9uOiBmYWxzZSB9KSxcbiAgICAgIGxheWVyczogW1xuICAgICAgICBuZXcgb2wubGF5ZXIuVGlsZSh7XG4gICAgICAgICAgc291cmNlOiBuZXcgb2wuc291cmNlLk9TTSgpXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgb2wubGF5ZXIuVmVjdG9yKHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuX21hcmtlclNvdXJjZSxcbiAgICAgICAgICBzdHlsZTogdGhpcy5fbWFya2VyU3R5bGVcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICB2aWV3OiBuZXcgb2wuVmlldyh7XG4gICAgICAgIGNlbnRlcjogb2wucHJvai5mcm9tTG9uTGF0KFxuICAgICAgICAgIHRoaXMuY2VudGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLmNlbnRlci5jb29yZGluYXRlcyA6IFswLCAwXVxuICAgICAgICApLFxuICAgICAgICB6b29tOiB0aGlzLnpvb21cbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jZW50ZXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmNlbnRlciA9PT0gbnVsbCkge1xuICAgICAgLy8gaWYgdGhlIGNlbnRlciBpcyBub3Qgc2V0LCB3ZSBzZXQgaXRzIGRlZmF1bHQgdmFsdWVcbiAgICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xuICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgIChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbMCwgMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB7XG4gICAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgICBjb29yZGluYXRlczogWzAsIDBdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjZW50ZXIgbmVlZHMgdGhlIG1hcCB0byBiZSBwcm9wZXJseSBzZXQsIHNvIGlmIGl0IHdhcyBzZXQgYmVmb3JlIHRoZSBtYXAgd2FzIGluaXRpYWxpemVkLFxuICAgICAgLy8gd2Ugc2V0IHRoZSBjZW50ZXIgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnpvb20gPT09IHVuZGVmaW5lZCB8fCB0aGlzLnpvb20gPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHRoZSB6b29tIGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy56b29tID0gMTg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSB6b29tIG5lZWRzIHRoZSBtYXAgdG8gYmUgcHJvcGVybHkgc2V0LCBzbyBpZiBpdCB3YXMgc2V0IGJlZm9yZSB0aGUgbWFwIHdhcyBpbml0aWFsaXplZCxcbiAgICAgIC8vIHdlIHNldCB0aGUgem9vbSBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMuem9vbSA9IHRoaXMuem9vbTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFkb25seSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMucmVhZG9ubHkgPT09IG51bGwpIHtcbiAgICAgIC8vIGlmIHJlYWRvbmx5IGlzIG5vdCBzZXQsIHdlIHNldCBpdHMgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy5yZWFkb25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZWFkb25seSBuZWVkcyB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgaXQgd2FzIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgcmVhZG9ubHkgYWdhaW4gdG8gcGVyZm9ybSBuZWNlc3NhcnkgYWRqdXN0ZW1lbnRzXG4gICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm1hcmtlckNvb3JkaW5hdGVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgIT09IG51bGxcbiAgICApIHtcbiAgICAgIC8vIHRoZSBtYXJrZXIgY29vcmRpbmF0ZXMgbmVlZCB0aGUgbWFwIHRvIGJlIHByb3Blcmx5IHNldCwgc28gaWYgdGhleSB3ZXJlIHNldCBiZWZvcmUgdGhlIG1hcCB3YXMgaW5pdGlhbGl6ZWQsXG4gICAgICAvLyB3ZSBzZXQgdGhlIG1hcmtlciBjb29yZGluYXRlcyBhZ2FpbiB0byBwZXJmb3JtIG5lY2Vzc2FyeSBhZGp1c3RlbWVudHNcbiAgICAgIHRoaXMubWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLm1hcmtlckNvb3JkaW5hdGVzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTWFya2VyQXRDb29yZGluYXRlcyhjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoY29vcmRpbmF0ZXMgJiYgY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBpZiAodGhpcy5fbWFya2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21hcmtlciA9IG5ldyBvbC5GZWF0dXJlKHtcbiAgICAgICAgZ2VvbWV0cnk6IG5ldyBvbC5nZW9tLlBvaW50KFxuICAgICAgICAgIC8vIFtsb24sIGxhdF0gaXMgaW4gRVBTRzo0MzI2IChkZWdyZWVzKSwgd2UgdHJhbnNmb3JtIGl0IGludG8gRVBTRzozODU3IChtZXRlcnMpXG4gICAgICAgICAgb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjQzMjYnLCAnRVBTRzozODU3JylcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9tYXJrZXJTb3VyY2UuYWRkRmVhdHVyZSh0aGlzLl9tYXJrZXIpO1xuICAgICAgdGhpcy5fbWFya2VyQ29vcmRpbmF0ZXMgPSB0aGlzLmdldE1hcmtlckNvb3JkaW5hdGVzKCk7XG5cbiAgICAgIGlmICghdGhpcy5yZWFkb25seSkge1xuICAgICAgICBjb25zdCBkcmFnSW50ZXJhY3Rpb24gPSBuZXcgb2wuaW50ZXJhY3Rpb24uTW9kaWZ5KHtcbiAgICAgICAgICBmZWF0dXJlczogbmV3IG9sLkNvbGxlY3Rpb24oW3RoaXMuX21hcmtlcl0pLFxuICAgICAgICAgIHN0eWxlOiB0aGlzLl9tYXJrZXJTdHlsZSxcbiAgICAgICAgICBwaXhlbFRvbGVyYW5jZTogNTAsXG4gICAgICAgICAgaGl0RGV0ZWN0aW9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9tYXJrZXJJbnRlcmFjdGlvbiA9IGRyYWdJbnRlcmFjdGlvbjtcbiAgICAgICAgdGhpcy5fbWFwLmFkZEludGVyYWN0aW9uKGRyYWdJbnRlcmFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21hcmtlci5vbihcbiAgICAgICAgJ2NoYW5nZScsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tYXJrZXJDb29yZGluYXRlcyA9IHRoaXMuZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5fbWFya2VyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWFya2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tYXJrZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbWFya2VyU291cmNlLnJlbW92ZUZlYXR1cmUodGhpcy5fbWFya2VyKTtcbiAgICAgIHRoaXMuX21hcmtlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21hcmtlckludGVyYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX21hcC5nZXRJbnRlcmFjdGlvbnMoKS5wb3AoKTtcbiAgICAgIHRoaXMuX21hcmtlckludGVyYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFya2VyQ29vcmRpbmF0ZXMoKTogbnVtYmVyW10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5fbWFya2VyID09PSB1bmRlZmluZWQgfHwgdGhpcy5fbWFya2VyID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZXI7XG4gICAgfVxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5fbWFya2VyLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAvLyBjb29yZGluYXRlcyBpcyBpbiBFUFNHOjM4NTcgKG1ldGVycyksIHdlIHRyYW5zZm9ybSBpdCBpbnRvIEVQU0c6NDMyNiAoZGVncmVlcylcbiAgICByZXR1cm4gb2wucHJvai50cmFuc2Zvcm0oY29vcmRpbmF0ZXMsICdFUFNHOjM4NTcnLCAnRVBTRzo0MzI2Jyk7XG4gIH1cblxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICB0aGlzLl9tYXAudXBkYXRlU2l6ZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBbaWRdPVwibWFwSWRcIiBjbGFzcz1cIm1hcFwiIChyZXNpemVkKT1cIm9uUmVzaXplKClcIj48L2Rpdj5cbiJdfQ==