@theseam/ui-common 0.3.0 → 0.3.3

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 (131) hide show
  1. package/breadcrumbs/_breadcrumbs-theme.scss +3 -0
  2. package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -0
  3. package/breadcrumbs/styles/_utilities.scss +3 -0
  4. package/breadcrumbs/styles/_variables.scss +1 -0
  5. package/breadcrumbs/theseam-ui-common-breadcrumbs.metadata.json +1 -1
  6. package/bundles/theseam-ui-common-breadcrumbs.umd.js +2 -1
  7. package/bundles/theseam-ui-common-breadcrumbs.umd.js.map +1 -1
  8. package/bundles/theseam-ui-common-dynamic.umd.js +1 -0
  9. package/bundles/theseam-ui-common-dynamic.umd.js.map +1 -1
  10. package/bundles/theseam-ui-common-form-field.umd.js +1 -1
  11. package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
  12. package/bundles/theseam-ui-common-framework.umd.js +18 -15
  13. package/bundles/theseam-ui-common-framework.umd.js.map +1 -1
  14. package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
  15. package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
  16. package/bundles/theseam-ui-common-menu.umd.js +1 -0
  17. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  18. package/bundles/theseam-ui-common-modal.umd.js +21 -1
  19. package/bundles/theseam-ui-common-modal.umd.js.map +1 -1
  20. package/bundles/theseam-ui-common-utils.umd.js +610 -136
  21. package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
  22. package/bundles/theseam-ui-common-widget.umd.js +4 -2
  23. package/bundles/theseam-ui-common-widget.umd.js.map +1 -1
  24. package/esm2015/breadcrumbs/breadcrumbs/breadcrumbs.component.js +4 -3
  25. package/esm2015/dynamic/evaluators/jexl-evaluator/jexl-evaluator.js +2 -1
  26. package/esm2015/form-field/input.directive.js +2 -2
  27. package/esm2015/framework/base-layout/base-layout.component.js +3 -3
  28. package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +5 -5
  29. package/esm2015/framework/top-bar/top-bar-title/top-bar-title.component.js +4 -3
  30. package/esm2015/framework/top-bar/top-bar.component.js +10 -8
  31. package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
  32. package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
  33. package/esm2015/google-maps/google-maps-controls.service.js +70 -0
  34. package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
  35. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
  36. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
  37. package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
  38. package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
  39. package/esm2015/google-maps/google-maps.module.js +45 -0
  40. package/esm2015/google-maps/google-maps.service.js +344 -0
  41. package/esm2015/google-maps/map-control.component.js +65 -0
  42. package/esm2015/google-maps/map-controls-service.js +4 -0
  43. package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
  44. package/esm2015/google-maps/map-value-manager.service.js +46 -0
  45. package/esm2015/google-maps/public-api.js +14 -0
  46. package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
  47. package/esm2015/menu/menu-toggle.directive.js +2 -1
  48. package/esm2015/modal/modal-ref.js +22 -2
  49. package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
  50. package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
  51. package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
  52. package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
  53. package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
  54. package/esm2015/utils/geo-json/merge-polygons.js +35 -0
  55. package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
  56. package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
  57. package/esm2015/utils/geo-json/read-geo-file.js +99 -0
  58. package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
  59. package/esm2015/utils/is-null-or-undefined.js +1 -1
  60. package/esm2015/utils/public-api.js +11 -1
  61. package/esm2015/widget/widget/widget.component.js +1 -1
  62. package/esm2015/widget/widget-content-components/widget-tile/widget-tile.component.js +4 -2
  63. package/fesm2015/theseam-ui-common-breadcrumbs.js +3 -2
  64. package/fesm2015/theseam-ui-common-breadcrumbs.js.map +1 -1
  65. package/fesm2015/theseam-ui-common-dynamic.js +1 -0
  66. package/fesm2015/theseam-ui-common-dynamic.js.map +1 -1
  67. package/fesm2015/theseam-ui-common-form-field.js +1 -1
  68. package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
  69. package/fesm2015/theseam-ui-common-framework.js +15 -12
  70. package/fesm2015/theseam-ui-common-framework.js.map +1 -1
  71. package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
  72. package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
  73. package/fesm2015/theseam-ui-common-menu.js +1 -0
  74. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  75. package/fesm2015/theseam-ui-common-modal.js +21 -1
  76. package/fesm2015/theseam-ui-common-modal.js.map +1 -1
  77. package/fesm2015/theseam-ui-common-utils.js +477 -94
  78. package/fesm2015/theseam-ui-common-utils.js.map +1 -1
  79. package/fesm2015/theseam-ui-common-widget.js +4 -2
  80. package/fesm2015/theseam-ui-common-widget.js.map +1 -1
  81. package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
  82. package/framework/base-layout/base-layout.component.scss +14 -0
  83. package/framework/base-layout/styles/_variables.scss +14 -0
  84. package/framework/theseam-ui-common-framework.metadata.json +1 -1
  85. package/framework/top-bar/_top-bar-theme.scss +5 -0
  86. package/framework/top-bar/styles/_utilities.scss +3 -0
  87. package/framework/top-bar/styles/_variables.scss +18 -0
  88. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +3 -1
  89. package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.scss +15 -0
  90. package/framework/top-bar/top-bar-title/top-bar-title.component.scss +6 -0
  91. package/framework/top-bar/top-bar.component.d.ts +3 -0
  92. package/framework/top-bar/top-bar.component.scss +39 -0
  93. package/google-maps/google-maps/google-maps.component.d.ts +89 -0
  94. package/google-maps/google-maps-contextmenu.d.ts +15 -0
  95. package/google-maps/google-maps-controls.service.d.ts +23 -0
  96. package/google-maps/google-maps-feature-helpers.d.ts +37 -0
  97. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
  98. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
  99. package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
  100. package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
  101. package/google-maps/google-maps.module.d.ts +2 -0
  102. package/google-maps/google-maps.service.d.ts +53 -0
  103. package/google-maps/map-control.component.d.ts +20 -0
  104. package/google-maps/map-controls-service.d.ts +13 -0
  105. package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
  106. package/google-maps/map-value-manager.service.d.ts +18 -0
  107. package/google-maps/package.json +11 -0
  108. package/google-maps/public-api.d.ts +13 -0
  109. package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
  110. package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
  111. package/modal/modal-ref.d.ts +1 -0
  112. package/modal/theseam-ui-common-modal.metadata.json +1 -1
  113. package/package.json +17 -10
  114. package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
  115. package/utils/geo-json/geo-json-to-area.d.ts +6 -0
  116. package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
  117. package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
  118. package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
  119. package/utils/geo-json/merge-polygons.d.ts +9 -0
  120. package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
  121. package/utils/geo-json/no-kinks.validator.d.ts +3 -0
  122. package/utils/geo-json/read-geo-file.d.ts +7 -0
  123. package/utils/geo-json/split-multi-polygons.d.ts +8 -0
  124. package/utils/is-null-or-undefined.d.ts +1 -1
  125. package/utils/public-api.d.ts +10 -0
  126. package/utils/theseam-ui-common-utils.metadata.json +1 -1
  127. package/widget/styles/_variables.scss +3 -0
  128. package/widget/theseam-ui-common-widget.metadata.json +1 -1
  129. package/widget/widget/widget.component.scss +2 -0
  130. package/widget/widget-content-components/widget-tile/widget-tile.component.d.ts +2 -0
  131. package/widget/widget-content-components/widget-tile/widget-tile.component.scss +1 -1
@@ -0,0 +1,344 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable, NgZone, ViewContainerRef } from '@angular/core';
3
+ import { BehaviorSubject, from, Subject } from 'rxjs';
4
+ import { switchMap, takeUntil, tap } from 'rxjs/operators';
5
+ import { isNullOrUndefined, notNullOrUndefined } from '@theseam/ui-common/utils';
6
+ import { GoogleMapsContextMenu } from './google-maps-contextmenu';
7
+ import { addInnerFeatureCutoutToExteriorFeature, createDataFeatureFromPolygon, createFeatureChangeObservable, getBoundsWithAllFeatures, getFeatureCenter, getFeaturesCount, getPossibleExteriorFeature, isFeatureSelected, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson, } from './google-maps-feature-helpers';
8
+ import { MapValueManagerService, MapValueSource } from './map-value-manager.service';
9
+ const DEFAULT_POLYGON_OPTIONS = {
10
+ clickable: true,
11
+ draggable: true,
12
+ editable: true,
13
+ // fillColor: 'rgba(60,150,60,1)',
14
+ // strokeColor: 'rgba(155,255,0,1)'
15
+ };
16
+ const DEFAULT_DRAWING_MANAGER_OPTIONS = () => ({
17
+ drawingControl: true,
18
+ drawingControlOptions: {
19
+ drawingModes: [
20
+ google.maps.drawing.OverlayType.POLYGON
21
+ ]
22
+ },
23
+ polygonOptions: DEFAULT_POLYGON_OPTIONS,
24
+ drawingMode: null
25
+ });
26
+ const ɵ0 = DEFAULT_DRAWING_MANAGER_OPTIONS;
27
+ const FEATURE_STYLE_OPTIONS_DEFAULT = {
28
+ clickable: true,
29
+ visible: true,
30
+ // zIndex?: number;
31
+ // cursor?: string;
32
+ draggable: false,
33
+ editable: false,
34
+ fillColor: 'teal',
35
+ fillOpacity: 0.3,
36
+ strokeColor: 'blue',
37
+ strokeOpacity: 1,
38
+ strokeWeight: 2,
39
+ };
40
+ const FEATURE_STYLE_OPTIONS_SELECTED = Object.assign(Object.assign({}, FEATURE_STYLE_OPTIONS_DEFAULT), { draggable: true, editable: true, fillColor: 'green', fillOpacity: 0.7, strokeColor: 'limegreen', strokeOpacity: 1, strokeWeight: 2 });
41
+ export class GoogleMapsService {
42
+ constructor(_mapValueManager, _ngZone, _vcr) {
43
+ this._mapValueManager = _mapValueManager;
44
+ this._ngZone = _ngZone;
45
+ this._vcr = _vcr;
46
+ this._ngUnsubscribe = new Subject();
47
+ this._mapReadySubject = new BehaviorSubject(false);
48
+ this._featureContextMenu = null;
49
+ this._activeContextMenu = null;
50
+ this._allowDrawingHoleInPolygon = false;
51
+ this.mapReady$ = this._mapReadySubject.asObservable();
52
+ }
53
+ get mapReady() { return this._mapReadySubject.value; }
54
+ ngOnDestroy() {
55
+ this._ngUnsubscribe.next();
56
+ this._ngUnsubscribe.complete();
57
+ }
58
+ setMap(map) {
59
+ this.googleMap = map;
60
+ this._mapReadySubject.next(true);
61
+ this._initDrawingManager();
62
+ this._initFeatureStyling();
63
+ this._initFeatureChangeListeners();
64
+ }
65
+ setBaseLatLng(lat, lng) {
66
+ this._baseLatLng = { lat, lng };
67
+ }
68
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
69
+ setFeatureContextMenu(menu) {
70
+ this._featureContextMenu = menu;
71
+ }
72
+ getDiv() {
73
+ this._assertInitialized();
74
+ return this.googleMap.getDiv();
75
+ }
76
+ fitBounds(bounds, padding) {
77
+ this._assertInitialized();
78
+ this.googleMap.fitBounds(bounds, padding);
79
+ }
80
+ /**
81
+ * Iterates the map's features and removes any that are selected.
82
+ */
83
+ deleteSelection() {
84
+ this._assertInitialized();
85
+ const mapData = this.googleMap.data;
86
+ mapData.forEach(f => {
87
+ if (isFeatureSelected(f)) {
88
+ mapData.remove(f);
89
+ }
90
+ });
91
+ }
92
+ /**
93
+ * Stops the current drawing.
94
+ */
95
+ stopDrawing() {
96
+ this._ngZone.runOutsideAngular(() => {
97
+ if (isNullOrUndefined(this._drawingManager) || this._drawingManager.getDrawingMode() === null) {
98
+ return;
99
+ }
100
+ // Listening for the completion event of the overlay currently being drawn
101
+ // and removing it. I haven't found a way to cancel the current drawing,
102
+ // without this hack that assumes our listeners will not run into a race
103
+ // condition.
104
+ const listener = google.maps.event.addListener(this._drawingManager, 'overlaycomplete', (event) => {
105
+ event.overlay.setMap(null);
106
+ listener.remove();
107
+ });
108
+ // To fake canceling the current drawing, without disabling the drawing
109
+ // mode, the drawin mode is being unset then immediately set back. When
110
+ // the mode is unset the 'overlaycomplete' event will fire, which will
111
+ // give a reference to the current overlay to remove, then it is set back
112
+ // to the mode the user was using. To the user is should just seem like
113
+ // the current drawing was canceled and they can start drawing again.
114
+ const mode = this._drawingManager.getDrawingMode();
115
+ this._drawingManager.setDrawingMode(null);
116
+ this._drawingManager.setDrawingMode(mode);
117
+ // 'overlaycomplete' should fire immediately, unless an overlay hadn't
118
+ // started drawing. This timeout will make sure the listener gets removed.
119
+ setTimeout(() => {
120
+ listener.remove();
121
+ });
122
+ });
123
+ }
124
+ _initDrawingManager() {
125
+ if (notNullOrUndefined(this._drawingManager)) {
126
+ throw Error(`DrawingManager is already initialized.`);
127
+ }
128
+ this._assertInitialized();
129
+ const options = DEFAULT_DRAWING_MANAGER_OPTIONS();
130
+ const drawingManager = new google.maps.drawing.DrawingManager(options);
131
+ drawingManager.setMap(this.googleMap);
132
+ this._drawingManager = drawingManager;
133
+ this._drawingManager.addListener('drawingmode_changed', event => {
134
+ var _a;
135
+ if (((_a = this._drawingManager) === null || _a === void 0 ? void 0 : _a.getDrawingMode()) !== null) {
136
+ this._assertInitialized();
137
+ this.googleMap.data.forEach(f => {
138
+ if (isFeatureSelected(f)) {
139
+ setFeatureSelected(f, false);
140
+ }
141
+ });
142
+ }
143
+ });
144
+ }
145
+ addControl(element, position) {
146
+ this._assertInitialized();
147
+ this.googleMap.controls[position].push(element);
148
+ }
149
+ setData(data) {
150
+ return __awaiter(this, void 0, void 0, function* () {
151
+ this._assertInitialized();
152
+ removeAllFeatures(this.googleMap.data);
153
+ this.googleMap.data.addGeoJson(data);
154
+ this.googleMap.fitBounds(getBoundsWithAllFeatures(this.googleMap.data));
155
+ });
156
+ }
157
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
158
+ reCenterOnFeatures() {
159
+ this._assertInitialized();
160
+ if (getFeaturesCount(this.googleMap.data) === 0) {
161
+ if (!this._baseLatLng) {
162
+ return;
163
+ }
164
+ this.googleMap.panTo(this._baseLatLng);
165
+ return;
166
+ }
167
+ this.googleMap.fitBounds(getBoundsWithAllFeatures(this.googleMap.data));
168
+ // TODO: Fix to pan to center. Currently fitBounds results in the expected
169
+ // result, but pantToBounds animates.
170
+ // this.googleMap.panToBounds(getBoundsWithAllFeatures(this.googleMap.data))
171
+ }
172
+ allowDrawingHoleInPolygon(allow) {
173
+ this._allowDrawingHoleInPolygon = allow;
174
+ }
175
+ setFileInputHandler(handler) {
176
+ this._fileInputHandler;
177
+ }
178
+ getFileInputHandler() {
179
+ return this._fileInputHandler;
180
+ }
181
+ _initFeatureStyling() {
182
+ this._assertInitialized();
183
+ // Disable any selection when clicking the map.
184
+ //
185
+ // TODO: There may be a better way to do this that would be more accurate or
186
+ // additional events that should be listened to, such as the disabling
187
+ // selection when the map looses focus.
188
+ this.googleMap.addListener('click', (even) => {
189
+ this._assertInitialized();
190
+ this.googleMap.data.forEach(f => setFeatureSelected(f, false));
191
+ });
192
+ // Determine what the style of the features are.
193
+ this.googleMap.data.setStyle((feature) => {
194
+ if (isFeatureSelected(feature)) {
195
+ return FEATURE_STYLE_OPTIONS_SELECTED;
196
+ }
197
+ return FEATURE_STYLE_OPTIONS_DEFAULT;
198
+ });
199
+ // Select a feature when clicked.
200
+ this.googleMap.data.addListener('click', (event) => {
201
+ this._assertInitialized();
202
+ setFeatureSelected(event.feature, true);
203
+ this.googleMap.data.forEach(f => {
204
+ if (f !== event.feature && isFeatureSelected(f)) {
205
+ setFeatureSelected(f, false);
206
+ }
207
+ });
208
+ });
209
+ // Set a style on hovered features that can be selected.
210
+ this.googleMap.data.addListener('mouseover', (event) => {
211
+ this._assertInitialized();
212
+ this.googleMap.data.revertStyle();
213
+ if (!this.isDrawing() && !isFeatureSelected(event.feature)) {
214
+ this.googleMap.data.overrideStyle(event.feature, { strokeWeight: 4 });
215
+ }
216
+ });
217
+ // Remove any hover styles when mouse moves away.
218
+ this.googleMap.data.addListener('mouseout', (event) => {
219
+ this._assertInitialized();
220
+ this.googleMap.data.revertStyle();
221
+ });
222
+ }
223
+ _initFeatureChangeListeners() {
224
+ this._assertInitialized();
225
+ createFeatureChangeObservable(this.googleMap.data, this._ngZone).pipe(switchMap(() => from(this.getGeoJson()).pipe(tap(geoJson => this._mapValueManager.setValue(geoJson, MapValueSource.FeatureChange)))), takeUntil(this._ngUnsubscribe)).subscribe();
226
+ this.googleMap.data.addListener('contextmenu', (event) => {
227
+ if (!isFeatureSelected(event.feature)) {
228
+ return;
229
+ }
230
+ this._openContextMenuForFeature(event.feature, event.latLng);
231
+ });
232
+ if (notNullOrUndefined(this._drawingManager)) {
233
+ google.maps.event.addListener(this._drawingManager, 'polygoncomplete', (polygon) => {
234
+ var _a;
235
+ // The DrawingManager doesn't seem to have a way to access the overlays,
236
+ // so if the map is not set then it shouldn'y be considered a successful
237
+ // completion. I am canceling the active drawing by disabling drawing
238
+ // mode and setting the map null in the 'overlaycomplete' event, which
239
+ // fires before the 'polygoncomplete' event.
240
+ if (isNullOrUndefined(polygon.getMap())) {
241
+ return;
242
+ }
243
+ this._assertInitialized();
244
+ // Create a map feature of the drawn polygon.
245
+ const feature = createDataFeatureFromPolygon(polygon);
246
+ // Remove the drawn polygon.
247
+ polygon.setMap(null);
248
+ // Stop drawing.
249
+ (_a = this._drawingManager) === null || _a === void 0 ? void 0 : _a.setDrawingMode(null);
250
+ // Check if the feature should be used as a cutout to an existing
251
+ // feature or added as it's own feature.
252
+ const exteriorPolygonFeature = this._allowDrawingHoleInPolygon
253
+ ? getPossibleExteriorFeature(this.googleMap.data, feature)
254
+ : undefined;
255
+ if (exteriorPolygonFeature) {
256
+ addInnerFeatureCutoutToExteriorFeature(exteriorPolygonFeature, feature);
257
+ setFeatureSelected(exteriorPolygonFeature, true);
258
+ }
259
+ else {
260
+ this.googleMap.data.add(feature);
261
+ setFeatureSelected(feature, true);
262
+ }
263
+ });
264
+ }
265
+ }
266
+ isDrawing() {
267
+ if (isNullOrUndefined(this._drawingManager)) {
268
+ return true;
269
+ }
270
+ return this._drawingManager.getDrawingMode() !== null;
271
+ }
272
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
273
+ hasSelectedFeature() {
274
+ this._assertInitialized();
275
+ let isSelected = false;
276
+ this.googleMap.data.forEach(f => {
277
+ if (isFeatureSelected(f)) {
278
+ isSelected = true;
279
+ }
280
+ });
281
+ return isSelected;
282
+ }
283
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
284
+ getSelectedFeature() {
285
+ this._assertInitialized();
286
+ let feature = null;
287
+ this.googleMap.data.forEach(f => {
288
+ if (isFeatureSelected(f)) {
289
+ feature = f;
290
+ }
291
+ });
292
+ return feature;
293
+ }
294
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
295
+ openContextMenu() {
296
+ const feature = this.getSelectedFeature();
297
+ if (feature) {
298
+ this._openContextMenuForFeature(feature);
299
+ }
300
+ }
301
+ // TODO: Refactor out of the service meant to just wrap the google maps api.
302
+ _openContextMenuForFeature(feature, position) {
303
+ if (this._activeContextMenu) {
304
+ this._activeContextMenu.close();
305
+ this._activeContextMenu = null;
306
+ }
307
+ this._assertInitialized();
308
+ let _position = position;
309
+ if (!_position) {
310
+ _position = getFeatureCenter(feature);
311
+ }
312
+ if (this._featureContextMenu) {
313
+ this._activeContextMenu = new GoogleMapsContextMenu(this.googleMap, this._featureContextMenu, _position, this._vcr, this._ngZone, this.googleMap.data, feature);
314
+ }
315
+ }
316
+ getGeoJson(removeAppProperties = true) {
317
+ return new Promise((resolve, reject) => {
318
+ this._assertInitialized();
319
+ this.googleMap.data.toGeoJson(f => {
320
+ if (removeAppProperties) {
321
+ stripAppFeaturePropertiesFromJson(f);
322
+ }
323
+ resolve(f);
324
+ });
325
+ });
326
+ }
327
+ /** Asserts that the map has been initialized. */
328
+ _assertInitialized() {
329
+ if (!this.googleMap && (typeof ngDevMode === 'undefined' || ngDevMode)) {
330
+ throw Error('Cannot access Google Map information before the API has been initialized. ' +
331
+ 'Please wait for the API to load before trying to interact with it.');
332
+ }
333
+ }
334
+ }
335
+ GoogleMapsService.decorators = [
336
+ { type: Injectable }
337
+ ];
338
+ GoogleMapsService.ctorParameters = () => [
339
+ { type: MapValueManagerService },
340
+ { type: NgZone },
341
+ { type: ViewContainerRef }
342
+ ];
343
+ export { ɵ0 };
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi9nb29nbGUtbWFwcy9nb29nbGUtbWFwcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFaEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDakUsT0FBTyxFQUNMLHNDQUFzQyxFQUN0Qyw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQ0FBaUMsR0FDbEMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFJcEYsTUFBTSx1QkFBdUIsR0FBK0I7SUFDMUQsU0FBUyxFQUFFLElBQUk7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2Qsa0NBQWtDO0lBQ2xDLG1DQUFtQztDQUNwQyxDQUFBO0FBRUQsTUFBTSwrQkFBK0IsR0FBc0QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoRyxjQUFjLEVBQUUsSUFBSTtJQUNwQixxQkFBcUIsRUFBRTtRQUNyQixZQUFZLEVB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U0FDRjtJQUNILENBQUM7SUFFTSxVQUFVLENBQUMsc0JBQStCLElBQUk7UUFDbkQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hDLElBQUksbUJBQW1CLEVBQUU7b0JBQ3ZCLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUNyQztnQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDWixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGlEQUFpRDtJQUN6QyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxLQUFLLENBQ1QsNEVBQTRFO2dCQUMxRSxvRUFBb0UsQ0FDdkUsQ0FBQTtTQUNGO0lBQ0gsQ0FBQzs7O1lBdlhGLFVBQVU7OztZQW5ERixzQkFBc0I7WUFyQlYsTUFBTTtZQUFhLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95LCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vbWVudSdcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkLCBub3ROdWxsT3JVbmRlZmluZWQgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vdXRpbHMnXG5cbmltcG9ydCB7IEdvb2dsZU1hcHNDb250ZXh0TWVudSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udGV4dG1lbnUnXG5pbXBvcnQge1xuICBhZGRJbm5lckZlYXR1cmVDdXRvdXRUb0V4dGVyaW9yRmVhdHVyZSxcbiAgY3JlYXRlRGF0YUZlYXR1cmVGcm9tUG9seWdvbixcbiAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUsXG4gIGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyxcbiAgZ2V0RmVhdHVyZUNlbnRlcixcbiAgZ2V0RmVhdHVyZXNDb3VudCxcbiAgZ2V0UG9zc2libGVFeHRlcmlvckZlYXR1cmUsXG4gIGlzRmVhdHVyZVNlbGVjdGVkLFxuICByZW1vdmVBbGxGZWF0dXJlcyxcbiAgc2V0RmVhdHVyZVNlbGVjdGVkLFxuICBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24sXG59IGZyb20gJy4vZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzJ1xuaW1wb3J0IHsgTWFwVmFsdWVNYW5hZ2VyU2VydmljZSwgTWFwVmFsdWVTb3VyY2UgfSBmcm9tICcuL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cbmNvbnN0IERFRkFVTFRfUE9MWUdPTl9PUFRJT05TOiBnb29nbGUubWFwcy5Qb2x5Z29uT3B0aW9ucyA9IHtcbiAgY2xpY2thYmxlOiB0cnVlLFxuICBkcmFnZ2FibGU6IHRydWUsXG4gIGVkaXRhYmxlOiB0cnVlLFxuICAvLyBmaWxsQ29sb3I6ICdyZ2JhKDYwLDE1MCw2MCwxKScsXG4gIC8vIHN0cm9rZUNvbG9yOiAncmdiYSgxNTUsMjU1LDAsMSknXG59XG5cbmNvbnN0IERFRkFVTFRfRFJBV0lOR19NQU5BR0VSX09QVElPTlM6ICgoKSA9PiBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyT3B0aW9ucykgPSAoKSA9PiAoe1xuICBkcmF3aW5nQ29udHJvbDogdHJ1ZSxcbiAgZHJhd2luZ0NvbnRyb2xPcHRpb25zOiB7XG4gICAgZHJhd2luZ01vZGVzOiBbXG4gICAgICBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLlBPTFlHT05cbiAgICBdXG4gIH0sXG4gIHBvbHlnb25PcHRpb25zOiBERUZBVUxUX1BPTFlHT05fT1BUSU9OUyxcbiAgZHJhd2luZ01vZGU6IG51bGxcbn0pXG5cbmNvbnN0IEZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxUOiBnb29nbGUubWFwcy5EYXRhLlN0eWxlT3B0aW9ucyA9IHtcbiAgY2xpY2thYmxlOiB0cnVlLFxuICB2aXNpYmxlOiB0cnVlLFxuICAvLyB6SW5kZXg/OiBudW1iZXI7XG5cbiAgLy8gY3Vyc29yPzogc3RyaW5nO1xuICBkcmFnZ2FibGU6IGZhbHNlLFxuICBlZGl0YWJsZTogZmFsc2UsXG4gIGZpbGxDb2xvcjogJ3RlYWwnLFxuICBmaWxsT3BhY2l0eTogMC4zLFxuICBzdHJva2VDb2xvcjogJ2JsdWUnLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXZWlnaHQ6IDIsXG59XG5cbmNvbnN0IEZFQVRVUkVfU1RZTEVfT1BUSU9OU19TRUxFQ1RFRDogZ29vZ2xlLm1hcHMuRGF0YS5TdHlsZU9wdGlvbnMgPSB7XG4gIC4uLkZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxULFxuICBkcmFnZ2FibGU6IHRydWUsXG4gIGVkaXRhYmxlOiB0cnVlLFxuICBmaWxsQ29sb3I6ICdncmVlbicsXG4gIGZpbGxPcGFjaXR5OiAwLjcsXG4gIHN0cm9rZUNvbG9yOiAnbGltZWdyZWVuJyxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2VpZ2h0OiAyLFxufVxuXG50eXBlIFdpdGhSZXF1aXJlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgeyBbUCBpbiBLXS0/OiBUW1BdIH1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdvb2dsZU1hcHNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tYXBSZWFkeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuXG4gIHByaXZhdGUgX2RyYXdpbmdNYW5hZ2VyPzogZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlclxuICBwcml2YXRlIF9mZWF0dXJlQ29udGV4dE1lbnU6IE1lbnVDb21wb25lbnQgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIF9hY3RpdmVDb250ZXh0TWVudTogR29vZ2xlTWFwc0NvbnRleHRNZW51IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBfYmFzZUxhdExuZz86IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWxcblxuICBwcml2YXRlIF9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uOiBib29sZWFuID0gZmFsc2VcblxuICAvLyBUT0RPOiBNb3ZlIHRvIGEgYmV0dGVyIHBsYWNlIHRoYW4gdGhlIG1hcCB3cmFwcGVyIHNlcnZpY2UuXG4gIHByaXZhdGUgX2ZpbGVJbnB1dEhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsXG5cbiAgcHVibGljIGdvb2dsZU1hcD86IGdvb2dsZS5tYXBzLk1hcFxuXG4gIHB1YmxpYyByZWFkb25seSBtYXBSZWFkeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj5cblxuICBwdWJsaWMgZ2V0IG1hcFJlYWR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbWFwUmVhZHlTdWJqZWN0LnZhbHVlIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYXBWYWx1ZU1hbmFnZXI6IE1hcFZhbHVlTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICApIHtcbiAgICB0aGlzLm1hcFJlYWR5JCA9IHRoaXMuX21hcFJlYWR5U3ViamVjdC5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXAobWFwOiBnb29nbGUubWFwcy5NYXApOiB2b2lkIHtcbiAgICB0aGlzLmdvb2dsZU1hcCA9IG1hcFxuICAgIHRoaXMuX21hcFJlYWR5U3ViamVjdC5uZXh0KHRydWUpXG4gICAgdGhpcy5faW5pdERyYXdpbmdNYW5hZ2VyKClcbiAgICB0aGlzLl9pbml0RmVhdHVyZVN0eWxpbmcoKVxuICAgIHRoaXMuX2luaXRGZWF0dXJlQ2hhbmdlTGlzdGVuZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBzZXRCYXNlTGF0TG5nKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Jhc2VMYXRMbmcgPSB7IGxhdCwgbG5nIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHNldEZlYXR1cmVDb250ZXh0TWVudShtZW51OiBNZW51Q29tcG9uZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZlYXR1cmVDb250ZXh0TWVudSA9IG1lbnVcbiAgfVxuXG4gIHB1YmxpYyBnZXREaXYoKTogSFRNTERpdkVsZW1lbnQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICByZXR1cm4gdGhpcy5nb29nbGVNYXAuZ2V0RGl2KCkgYXMgSFRNTERpdkVsZW1lbnRcbiAgfVxuXG4gIHB1YmxpYyBmaXRCb3VuZHMoYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsLCBwYWRkaW5nPzogbnVtYmVyIHwgZ29vZ2xlLm1hcHMuUGFkZGluZyk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoYm91bmRzLCBwYWRkaW5nKVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRoZSBtYXAncyBmZWF0dXJlcyBhbmQgcmVtb3ZlcyBhbnkgdGhhdCBhcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICBjb25zdCBtYXBEYXRhID0gdGhpcy5nb29nbGVNYXAuZGF0YVxuICAgIG1hcERhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICBtYXBEYXRhLnJlbW92ZShmKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGN1cnJlbnQgZHJhd2luZy5cbiAgICovXG4gIHB1YmxpYyBzdG9wRHJhd2luZygpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSB8fCB0aGlzLl9kcmF3aW5nTWFuYWdlci5nZXREcmF3aW5nTW9kZSgpID09PSBudWxsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW5pbmcgZm9yIHRoZSBjb21wbGV0aW9uIGV2ZW50IG9mIHRoZSBvdmVybGF5IGN1cnJlbnRseSBiZWluZyBkcmF3blxuICAgICAgLy8gYW5kIHJlbW92aW5nIGl0LiBJIGhhdmVuJ3QgZm91bmQgYSB3YXkgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGRyYXdpbmcsXG4gICAgICAvLyB3aXRob3V0IHRoaXMgaGFjayB0aGF0IGFzc3VtZXMgb3VyIGxpc3RlbmVycyB3aWxsIG5vdCBydW4gaW50byBhIHJhY2VcbiAgICAgIC8vIGNvbmRpdGlvbi5cbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIoXG4gICAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLFxuICAgICAgICAnb3ZlcmxheWNvbXBsZXRlJyxcbiAgICAgICAgKGV2ZW50OiBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlDb21wbGV0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQub3ZlcmxheS5zZXRNYXAobnVsbClcbiAgICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIC8vIFRvIGZha2UgY2FuY2VsaW5nIHRoZSBjdXJyZW50IGRyYXdpbmcsIHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBkcmF3aW5nXG4gICAgICAvLyBtb2RlLCB0aGUgZHJhd2luIG1vZGUgaXMgYmVpbmcgdW5zZXQgdGhlbiBpbW1lZGlhdGVseSBzZXQgYmFjay4gV2hlblxuICAgICAgLy8gdGhlIG1vZGUgaXMgdW5zZXQgdGhlICdvdmVybGF5Y29tcGxldGUnIGV2ZW50IHdpbGwgZmlyZSwgd2hpY2ggd2lsbFxuICAgICAgLy8gZ2l2ZSBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBvdmVybGF5IHRvIHJlbW92ZSwgdGhlbiBpdCBpcyBzZXQgYmFja1xuICAgICAgLy8gdG8gdGhlIG1vZGUgdGhlIHVzZXIgd2FzIHVzaW5nLiBUbyB0aGUgdXNlciBpcyBzaG91bGQganVzdCBzZWVtIGxpa2VcbiAgICAgIC8vIHRoZSBjdXJyZW50IGRyYXdpbmcgd2FzIGNhbmNlbGVkIGFuZCB0aGV5IGNhbiBzdGFydCBkcmF3aW5nIGFnYWluLlxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKClcbiAgICAgIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLnNldERyYXdpbmdNb2RlKG51bGwpXG4gICAgICB0aGlzLl9kcmF3aW5nTWFuYWdlci5zZXREcmF3aW5nTW9kZShtb2RlKVxuXG4gICAgICAvLyAnb3ZlcmxheWNvbXBsZXRlJyBzaG91bGQgZmlyZSBpbW1lZGlhdGVseSwgdW5sZXNzIGFuIG92ZXJsYXkgaGFkbid0XG4gICAgICAvLyBzdGFydGVkIGRyYXdpbmcuIFRoaXMgdGltZW91dCB3aWxsIG1ha2Ugc3VyZSB0aGUgbGlzdGVuZXIgZ2V0cyByZW1vdmVkLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLnJlbW92ZSgpXG4gICAgICB9KVxuXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2luaXREcmF3aW5nTWFuYWdlcigpOiB2b2lkIHtcbiAgICBpZiAobm90TnVsbE9yVW5kZWZpbmVkKHRoaXMuX2RyYXdpbmdNYW5hZ2VyKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYERyYXdpbmdNYW5hZ2VyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCBvcHRpb25zID0gREVGQVVMVF9EUkFXSU5HX01BTkFHRVJfT1BUSU9OUygpXG5cbiAgICBjb25zdCBkcmF3aW5nTWFuYWdlciA9IG5ldyBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyKG9wdGlvbnMpXG4gICAgZHJhd2luZ01hbmFnZXIuc2V0TWFwKHRoaXMuZ29vZ2xlTWFwKVxuXG4gICAgdGhpcy5fZHJhd2luZ01hbmFnZXIgPSBkcmF3aW5nTWFuYWdlclxuXG4gICAgdGhpcy5fZHJhd2luZ01hbmFnZXIuYWRkTGlzdGVuZXIoJ2RyYXdpbmdtb2RlX2NoYW5nZWQnLCBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5fZHJhd2luZ01hbmFnZXI/LmdldERyYXdpbmdNb2RlKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZiwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYWRkQ29udHJvbChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICB0aGlzLmdvb2dsZU1hcC5jb250cm9sc1twb3NpdGlvbl0ucHVzaChlbGVtZW50KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldERhdGEoZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJlbW92ZUFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGRHZW9Kc29uKGRhdGEpXG4gICAgdGhpcy5nb29nbGVNYXAuZml0Qm91bmRzKGdldEJvdW5kc1dpdGhBbGxGZWF0dXJlcyh0aGlzLmdvb2dsZU1hcC5kYXRhKSlcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIHJlQ2VudGVyT25GZWF0dXJlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgaWYgKGdldEZlYXR1cmVzQ291bnQodGhpcy5nb29nbGVNYXAuZGF0YSkgPT09IDApIHtcbiAgICAgIGlmICghdGhpcy5fYmFzZUxhdExuZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5nb29nbGVNYXAucGFuVG8odGhpcy5fYmFzZUxhdExuZylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmdvb2dsZU1hcC5maXRCb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuXG4gICAgLy8gVE9ETzogRml4IHRvIHBhbiB0byBjZW50ZXIuIEN1cnJlbnRseSBmaXRCb3VuZHMgcmVzdWx0cyBpbiB0aGUgZXhwZWN0ZWRcbiAgICAvLyByZXN1bHQsIGJ1dCBwYW50VG9Cb3VuZHMgYW5pbWF0ZXMuXG4gICAgLy8gdGhpcy5nb29nbGVNYXAucGFuVG9Cb3VuZHMoZ2V0Qm91bmRzV2l0aEFsbEZlYXR1cmVzKHRoaXMuZ29vZ2xlTWFwLmRhdGEpKVxuICB9XG5cbiAgcHVibGljIGFsbG93RHJhd2luZ0hvbGVJblBvbHlnb24oYWxsb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxvd0RyYXdpbmdIb2xlSW5Qb2x5Z29uID0gYWxsb3dcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaWxlSW5wdXRIYW5kbGVyKGhhbmRsZXI6ICgoZmlsZTogRmlsZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsZUlucHV0SGFuZGxlclxuICB9XG5cbiAgcHVibGljIGdldEZpbGVJbnB1dEhhbmRsZXIoKTogKChmaWxlOiBGaWxlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maWxlSW5wdXRIYW5kbGVyXG4gIH1cblxuICBwcml2YXRlIF9pbml0RmVhdHVyZVN0eWxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgLy8gRGlzYWJsZSBhbnkgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgdGhlIG1hcC5cbiAgICAvL1xuICAgIC8vIFRPRE86IFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUgb3JcbiAgICAvLyBhZGRpdGlvbmFsIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsaXN0ZW5lZCB0bywgc3VjaCBhcyB0aGUgZGlzYWJsaW5nXG4gICAgLy8gc2VsZWN0aW9uIHdoZW4gdGhlIG1hcCBsb29zZXMgZm9jdXMuXG4gICAgdGhpcy5nb29nbGVNYXAuYWRkTGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW46IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQgfCBnb29nbGUubWFwcy5JY29uTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4gc2V0RmVhdHVyZVNlbGVjdGVkKGYsIGZhbHNlKSlcbiAgICB9KVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoYXQgdGhlIHN0eWxlIG9mIHRoZSBmZWF0dXJlcyBhcmUuXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5zZXRTdHlsZSgoZmVhdHVyZSkgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGZlYXR1cmUpKSB7XG4gICAgICAgIHJldHVybiBGRUFUVVJFX1NUWUxFX09QVElPTlNfU0VMRUNURURcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEZFQVRVUkVfU1RZTEVfT1BUSU9OU19ERUZBVUxUXG4gICAgfSlcblxuICAgIC8vIFNlbGVjdCBhIGZlYXR1cmUgd2hlbiBjbGlja2VkLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuYWRkTGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLk1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUsIHRydWUpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmZvckVhY2goZiA9PiB7XG4gICAgICAgIGlmIChmICE9PSBldmVudC5mZWF0dXJlICYmIGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGYsIGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBTZXQgYSBzdHlsZSBvbiBob3ZlcmVkIGZlYXR1cmVzIHRoYXQgY2FuIGJlIHNlbGVjdGVkLlxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuYWRkTGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnJldmVydFN0eWxlKClcbiAgICAgIGlmICghdGhpcy5pc0RyYXdpbmcoKSAmJiAhaXNGZWF0dXJlU2VsZWN0ZWQoZXZlbnQuZmVhdHVyZSkpIHtcbiAgICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5vdmVycmlkZVN0eWxlKGV2ZW50LmZlYXR1cmUsIHsgc3Ryb2tlV2VpZ2h0OiA0IH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSBhbnkgaG92ZXIgc3R5bGVzIHdoZW4gbW91c2UgbW92ZXMgYXdheS5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdtb3VzZW91dCcsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLnJldmVydFN0eWxlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZlYXR1cmVDaGFuZ2VMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgY3JlYXRlRmVhdHVyZUNoYW5nZU9ic2VydmFibGUodGhpcy5nb29nbGVNYXAuZGF0YSwgdGhpcy5fbmdab25lKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IGZyb20odGhpcy5nZXRHZW9Kc29uKCkpLnBpcGUoXG4gICAgICAgIHRhcChnZW9Kc29uID0+IHRoaXMuX21hcFZhbHVlTWFuYWdlci5zZXRWYWx1ZShnZW9Kc29uLCBNYXBWYWx1ZVNvdXJjZS5GZWF0dXJlQ2hhbmdlKSksXG4gICAgICApKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9uZ1Vuc3Vic2NyaWJlKSxcbiAgICApLnN1YnNjcmliZSgpXG5cbiAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLmFkZExpc3RlbmVyKCdjb250ZXh0bWVudScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzRmVhdHVyZVNlbGVjdGVkKGV2ZW50LmZlYXR1cmUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnVGb3JGZWF0dXJlKGV2ZW50LmZlYXR1cmUsIGV2ZW50LmxhdExuZylcbiAgICB9KVxuXG4gICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikpIHtcbiAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKHRoaXMuX2RyYXdpbmdNYW5hZ2VyLCAncG9seWdvbmNvbXBsZXRlJywgKHBvbHlnb246IGdvb2dsZS5tYXBzLlBvbHlnb24pID0+IHtcbiAgICAgICAgLy8gVGhlIERyYXdpbmdNYW5hZ2VyIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgd2F5IHRvIGFjY2VzcyB0aGUgb3ZlcmxheXMsXG4gICAgICAgIC8vIHNvIGlmIHRoZSBtYXAgaXMgbm90IHNldCB0aGVuIGl0IHNob3VsZG4neSBiZSBjb25zaWRlcmVkIGEgc3VjY2Vzc2Z1bFxuICAgICAgICAvLyBjb21wbGV0aW9uLiBJIGFtIGNhbmNlbGluZyB0aGUgYWN0aXZlIGRyYXdpbmcgYnkgZGlzYWJsaW5nIGRyYXdpbmdcbiAgICAgICAgLy8gbW9kZSBhbmQgc2V0dGluZyB0aGUgbWFwIG51bGwgaW4gdGhlICdvdmVybGF5Y29tcGxldGUnIGV2ZW50LCB3aGljaFxuICAgICAgICAvLyBmaXJlcyBiZWZvcmUgdGhlICdwb2x5Z29uY29tcGxldGUnIGV2ZW50LlxuICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocG9seWdvbi5nZXRNYXAoKSkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcblxuICAgICAgICAvLyBDcmVhdGUgYSBtYXAgZmVhdHVyZSBvZiB0aGUgZHJhd24gcG9seWdvbi5cbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGNyZWF0ZURhdGFGZWF0dXJlRnJvbVBvbHlnb24ocG9seWdvbilcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBkcmF3biBwb2x5Z29uLlxuICAgICAgICBwb2x5Z29uLnNldE1hcChudWxsKVxuXG4gICAgICAgIC8vIFN0b3AgZHJhd2luZy5cbiAgICAgICAgdGhpcy5fZHJhd2luZ01hbmFnZXI/LnNldERyYXdpbmdNb2RlKG51bGwpXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgYXMgYSBjdXRvdXQgdG8gYW4gZXhpc3RpbmdcbiAgICAgICAgLy8gZmVhdHVyZSBvciBhZGRlZCBhcyBpdCdzIG93biBmZWF0dXJlLlxuICAgICAgICBjb25zdCBleHRlcmlvclBvbHlnb25GZWF0dXJlID0gdGhpcy5fYWxsb3dEcmF3aW5nSG9sZUluUG9seWdvblxuICAgICAgICAgID8gZ2V0UG9zc2libGVFeHRlcmlvckZlYXR1cmUodGhpcy5nb29nbGVNYXAuZGF0YSwgZmVhdHVyZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZSkge1xuICAgICAgICAgIGFkZElubmVyRmVhdHVyZUN1dG91dFRvRXh0ZXJpb3JGZWF0dXJlKGV4dGVyaW9yUG9seWdvbkZlYXR1cmUsIGZlYXR1cmUpXG4gICAgICAgICAgc2V0RmVhdHVyZVNlbGVjdGVkKGV4dGVyaW9yUG9seWdvbkZlYXR1cmUsIHRydWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS5hZGQoZmVhdHVyZSlcbiAgICAgICAgICBzZXRGZWF0dXJlU2VsZWN0ZWQoZmVhdHVyZSwgdHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNEcmF3aW5nKCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGxPclVuZGVmaW5lZCh0aGlzLl9kcmF3aW5nTWFuYWdlcikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RyYXdpbmdNYW5hZ2VyLmdldERyYXdpbmdNb2RlKCkgIT09IG51bGxcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIGhhc1NlbGVjdGVkRmVhdHVyZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgbGV0IGlzU2VsZWN0ZWQgPSBmYWxzZVxuICAgIHRoaXMuZ29vZ2xlTWFwLmRhdGEuZm9yRWFjaChmID0+IHtcbiAgICAgIGlmIChpc0ZlYXR1cmVTZWxlY3RlZChmKSkge1xuICAgICAgICBpc1NlbGVjdGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGlzU2VsZWN0ZWRcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIG91dCBvZiB0aGUgc2VydmljZSBtZWFudCB0byBqdXN0IHdyYXAgdGhlIGdvb2dsZSBtYXBzIGFwaS5cbiAgcHVibGljIGdldFNlbGVjdGVkRmVhdHVyZSgpOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUgfCBudWxsIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgbGV0IGZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5nb29nbGVNYXAuZGF0YS5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGlzRmVhdHVyZVNlbGVjdGVkKGYpKSB7XG4gICAgICAgIGZlYXR1cmUgPSBmXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZmVhdHVyZVxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3Igb3V0IG9mIHRoZSBzZXJ2aWNlIG1lYW50IHRvIGp1c3Qgd3JhcCB0aGUgZ29vZ2xlIG1hcHMgYXBpLlxuICBwdWJsaWMgb3BlbkNvbnRleHRNZW51KCk6IHZvaWQge1xuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmdldFNlbGVjdGVkRmVhdHVyZSgpXG4gICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudUZvckZlYXR1cmUoZmVhdHVyZSlcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciBvdXQgb2YgdGhlIHNlcnZpY2UgbWVhbnQgdG8ganVzdCB3cmFwIHRoZSBnb29nbGUgbWFwcyBhcGkuXG4gIHByaXZhdGUgX29wZW5Db250ZXh0TWVudUZvckZlYXR1cmUoZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlLCBwb3NpdGlvbj86IGdvb2dsZS5tYXBzLkxhdExuZykge1xuICAgIGlmICh0aGlzLl9hY3RpdmVDb250ZXh0TWVudSkge1xuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUuY2xvc2UoKVxuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuXG4gICAgbGV0IF9wb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgaWYgKCFfcG9zaXRpb24pIHtcbiAgICAgIF9wb3NpdGlvbiA9IGdldEZlYXR1cmVDZW50ZXIoZmVhdHVyZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZlYXR1cmVDb250ZXh0TWVudSkge1xuICAgICAgdGhpcy5fYWN0aXZlQ29udGV4dE1lbnUgPSBuZXcgR29vZ2xlTWFwc0NvbnRleHRNZW51KFxuICAgICAgICB0aGlzLmdvb2dsZU1hcCxcbiAgICAgICAgdGhpcy5fZmVhdHVyZUNvbnRleHRNZW51LFxuICAgICAgICBfcG9zaXRpb24sXG4gICAgICAgIHRoaXMuX3ZjcixcbiAgICAgICAgdGhpcy5fbmdab25lLFxuICAgICAgICB0aGlzLmdvb2dsZU1hcC5kYXRhLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRHZW9Kc29uKHJlbW92ZUFwcFByb3BlcnRpZXM6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgICAgdGhpcy5nb29nbGVNYXAuZGF0YS50b0dlb0pzb24oZiA9PiB7XG4gICAgICAgIGlmIChyZW1vdmVBcHBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RyaXBBcHBGZWF0dXJlUHJvcGVydGllc0Zyb21Kc29uKGYpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEFzc2VydHMgdGhhdCB0aGUgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMgV2l0aFJlcXVpcmVkPEdvb2dsZU1hcHNTZXJ2aWNlLCAnZ29vZ2xlTWFwJz4ge1xuICAgIGlmICghdGhpcy5nb29nbGVNYXAgJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGFjY2VzcyBHb29nbGUgTWFwIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkLiAnICtcbiAgICAgICAgICAnUGxlYXNlIHdhaXQgZm9yIHRoZSBBUEkgdG8gbG9hZCBiZWZvcmUgdHJ5aW5nIHRvIGludGVyYWN0IHdpdGggaXQuJyxcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,65 @@
1
+ import { ChangeDetectionStrategy, Component, Inject, Input, } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil, tap } from 'rxjs/operators';
4
+ import { GoogleMapsControlsService } from './google-maps-controls.service';
5
+ import { GoogleMapsService } from './google-maps.service';
6
+ import { MAP_CONTROLS_SERVICE } from './map-controls-service';
7
+ export class TheSeamMapsControlComponent {
8
+ constructor(_googleMaps, _googleMapsControls) {
9
+ this._googleMaps = _googleMaps;
10
+ this._googleMapsControls = _googleMapsControls;
11
+ this._ngUnsubscribe = new Subject();
12
+ }
13
+ set def(value) {
14
+ if (value !== this._def) {
15
+ this._remove();
16
+ this._def = value;
17
+ }
18
+ }
19
+ /** @ignore */
20
+ ngOnInit() {
21
+ this._googleMaps.mapReady$.pipe(tap(ready => {
22
+ if (ready) {
23
+ this._add();
24
+ }
25
+ else {
26
+ this._remove();
27
+ }
28
+ }), takeUntil(this._ngUnsubscribe)).subscribe();
29
+ }
30
+ /** @ignore */
31
+ ngOnDestroy() {
32
+ this._remove();
33
+ this._ngUnsubscribe.next();
34
+ this._ngUnsubscribe.complete();
35
+ }
36
+ _add() {
37
+ if (this._controlRef) {
38
+ return;
39
+ }
40
+ if (this._def === null || this._def === undefined) {
41
+ return;
42
+ }
43
+ this._controlRef = this._googleMapsControls.add(this._def);
44
+ }
45
+ _remove() {
46
+ var _a;
47
+ (_a = this._controlRef) === null || _a === void 0 ? void 0 : _a.destroy();
48
+ this._controlRef = undefined;
49
+ }
50
+ }
51
+ TheSeamMapsControlComponent.decorators = [
52
+ { type: Component, args: [{
53
+ selector: 'seam-map-control',
54
+ template: '',
55
+ changeDetection: ChangeDetectionStrategy.OnPush
56
+ },] }
57
+ ];
58
+ TheSeamMapsControlComponent.ctorParameters = () => [
59
+ { type: GoogleMapsService },
60
+ { type: GoogleMapsControlsService, decorators: [{ type: Inject, args: [MAP_CONTROLS_SERVICE,] }] }
61
+ ];
62
+ TheSeamMapsControlComponent.propDecorators = {
63
+ def: [{ type: Input }]
64
+ };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL21hcC1jb250cm9sLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQWlCLE1BQU0sZ0NBQWdDLENBQUE7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDekQsT0FBTyxFQUFjLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFPekUsTUFBTSxPQUFPLDJCQUEyQjtJQWN0QyxZQUNtQixXQUE4QixFQUNBLG1CQUE4QztRQUQ1RSxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDQSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQTJCO1FBZjlFLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtJQWdCakQsQ0FBQztJQVpMLElBQ0ksR0FBRyxDQUFDLEtBQW9DO1FBQzFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7U0FDbEI7SUFDSCxDQUFDO0lBUUQsY0FBYztJQUNkLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTthQUNaO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTthQUNmO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FDL0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFFRCxjQUFjO0lBQ2QsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVkLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRU8sSUFBSTtRQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixPQUFNO1NBQ1A7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ2pELE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVPLE9BQU87O1FBQ2IsTUFBQSxJQUFJLENBQUMsV0FBVywwQ0FBRSxPQUFPLEVBQUUsQ0FBQTtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDOzs7WUE3REYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7WUFQUSxpQkFBaUI7WUFEakIseUJBQXlCLHVCQXlCN0IsTUFBTSxTQUFDLG9CQUFvQjs7O2tCQVg3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgR29vZ2xlTWFwc0NvbnRyb2xzU2VydmljZSwgTWFwQ29udHJvbFJlZiB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtY29udHJvbHMuc2VydmljZSdcbmltcG9ydCB7IEdvb2dsZU1hcHNTZXJ2aWNlIH0gZnJvbSAnLi9nb29nbGUtbWFwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWFwQ29udHJvbCwgTUFQX0NPTlRST0xTX1NFUlZJQ0UgfSBmcm9tICcuL21hcC1jb250cm9scy1zZXJ2aWNlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZWFtLW1hcC1jb250cm9sJyxcbiAgdGVtcGxhdGU6ICcnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUaGVTZWFtTWFwc0NvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgcHJpdmF0ZSBfY29udHJvbFJlZj86IE1hcENvbnRyb2xSZWZcblxuICBASW5wdXQoKVxuICBzZXQgZGVmKHZhbHVlOiBNYXBDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fZGVmKSB7XG4gICAgICB0aGlzLl9yZW1vdmUoKVxuICAgICAgdGhpcy5fZGVmID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgX2RlZjogTWFwQ29udHJvbCB8IG51bGwgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nb29nbGVNYXBzOiBHb29nbGVNYXBzU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9DT05UUk9MU19TRVJWSUNFKSBwcml2YXRlIHJlYWRvbmx5IF9nb29nbGVNYXBzQ29udHJvbHM6IEdvb2dsZU1hcHNDb250cm9sc1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZ29vZ2xlTWFwcy5tYXBSZWFkeSQucGlwZShcbiAgICAgIHRhcChyZWFkeSA9PiB7XG4gICAgICAgIGlmIChyZWFkeSkge1xuICAgICAgICAgIHRoaXMuX2FkZCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YWtlVW50aWwodGhpcy5fbmdVbnN1YnNjcmliZSlcbiAgICApLnN1YnNjcmliZSgpXG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW1vdmUoKVxuXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIHByaXZhdGUgX2FkZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29udHJvbFJlZikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZiA9PT0gbnVsbCB8fCB0aGlzLl9kZWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29udHJvbFJlZiA9IHRoaXMuX2dvb2dsZU1hcHNDb250cm9scy5hZGQodGhpcy5fZGVmKVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbnRyb2xSZWY/LmRlc3Ryb3koKVxuICAgIHRoaXMuX2NvbnRyb2xSZWYgPSB1bmRlZmluZWRcbiAgfVxufVxuIl19
@@ -0,0 +1,4 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const MAP_CONTROLS_SERVICE = new InjectionToken('MAP_CONTROLS_SERVICE');
3
+ export const MAP_CONTROL_DATA = new InjectionToken('MAP_CONTROL_DATA');
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWNvbnRyb2xzLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvbWFwLWNvbnRyb2xzLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQWM5QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsc0JBQXNCLENBQUMsQ0FBQTtBQUVsRyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBTSxrQkFBa0IsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL21vZGVscydcblxuZXhwb3J0IGludGVyZmFjZSBNYXBDb250cm9sPFREYXRhID0gYW55PiB7XG4gIGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxhbnk+XG4gIGRhdGE/OiBURGF0YVxuICBwb3NpdGlvbj86IGdvb2dsZS5tYXBzLkNvbnRyb2xQb3NpdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcENvbnRyb2xzU2VydmljZSB7XG4gIGFkZChjb250cm9sOiBNYXBDb250cm9sKTogdm9pZFxufVxuXG5leHBvcnQgY29uc3QgTUFQX0NPTlRST0xTX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWFwQ29udHJvbHNTZXJ2aWNlPignTUFQX0NPTlRST0xTX1NFUlZJQ0UnKVxuXG5leHBvcnQgY29uc3QgTUFQX0NPTlRST0xfREFUQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnk+KCdNQVBfQ09OVFJPTF9EQVRBJylcbiJdfQ==
@@ -0,0 +1,135 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, NgZone, Renderer2, } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil, tap } from 'rxjs/operators';
4
+ import { readGeoFile } from '@theseam/ui-common/utils';
5
+ import { GoogleMapsService } from '../google-maps.service';
6
+ import { MapValueManagerService, MapValueSource } from '../map-value-manager.service';
7
+ /**
8
+ *
9
+ */
10
+ export class TheSeamMapFileDropComponent {
11
+ constructor(_elementRef, _ngZone, _googleMaps, _mapValueManager, _renderer) {
12
+ this._elementRef = _elementRef;
13
+ this._ngZone = _ngZone;
14
+ this._googleMaps = _googleMaps;
15
+ this._mapValueManager = _mapValueManager;
16
+ this._renderer = _renderer;
17
+ this._ngUnsubscribe = new Subject();
18
+ this._listeners = [];
19
+ this._globalDragInProgress = false;
20
+ this._handleDragOverEvent = (event) => {
21
+ if (!this._dropAllowed()) {
22
+ return;
23
+ }
24
+ if (!this._isSupportedDataTransferTypes(event.dataTransfer)) {
25
+ return;
26
+ }
27
+ event.preventDefault();
28
+ event.dataTransfer.dropEffect = 'copy';
29
+ };
30
+ this._handleDropEvent = (event) => {
31
+ if (!this._dropAllowed()) {
32
+ return;
33
+ }
34
+ event.preventDefault();
35
+ event.stopPropagation();
36
+ this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'none');
37
+ // TODO: Show error if multiple files?
38
+ if (!this._isSupportedDataTransfer(event.dataTransfer)) {
39
+ return;
40
+ }
41
+ const item = event.dataTransfer.items[0];
42
+ const file = item.getAsFile();
43
+ readGeoFile(file).then(json => {
44
+ this._mapValueManager.setValue(json, MapValueSource.Input);
45
+ });
46
+ };
47
+ this._handleDragEnterEvent = (event) => {
48
+ if (!this._dropAllowed()) {
49
+ return;
50
+ }
51
+ if (!this._isSupportedDataTransferTypes(event.dataTransfer)) {
52
+ return;
53
+ }
54
+ this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'block');
55
+ };
56
+ this._handleDragLeaveEvent = (event) => {
57
+ if (!this._dropAllowed()) {
58
+ return;
59
+ }
60
+ this._renderer.setStyle(this._elementRef.nativeElement, 'display', 'none');
61
+ };
62
+ }
63
+ /** @ignore */
64
+ ngOnInit() {
65
+ this._googleMaps.mapReady$.pipe(tap(ready => {
66
+ if (ready) {
67
+ this._enableFileDrop();
68
+ }
69
+ else {
70
+ this._disableFileDrop();
71
+ }
72
+ }), takeUntil(this._ngUnsubscribe)).subscribe();
73
+ }
74
+ /** @ignore */
75
+ ngOnDestroy() {
76
+ this._disableFileDrop();
77
+ this._ngUnsubscribe.next();
78
+ this._ngUnsubscribe.complete();
79
+ }
80
+ _enableFileDrop() {
81
+ const divElement = this._googleMaps.getDiv();
82
+ if (this._mapDiv === divElement) {
83
+ return;
84
+ }
85
+ if (this._mapDiv !== undefined) {
86
+ // Disable file drop on previous map div.
87
+ this._disableFileDrop();
88
+ }
89
+ this._mapDiv = divElement;
90
+ this._ngZone.runOutsideAngular(() => {
91
+ this._listeners.push(this._renderer.listen('document', 'dragstart', (event) => {
92
+ this._globalDragInProgress = true;
93
+ }));
94
+ this._listeners.push(this._renderer.listen('document', 'dragend', (event) => {
95
+ this._globalDragInProgress = false;
96
+ }));
97
+ this._listeners.push(this._renderer.listen(divElement, 'dragover', this._handleDragOverEvent));
98
+ this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'dragover', this._handleDragOverEvent));
99
+ this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'drop', this._handleDropEvent));
100
+ this._listeners.push(this._renderer.listen(divElement, 'dragenter', this._handleDragEnterEvent));
101
+ this._listeners.push(this._renderer.listen(this._elementRef.nativeElement, 'dragleave', this._handleDragLeaveEvent));
102
+ });
103
+ }
104
+ _disableFileDrop() {
105
+ if (this._listeners.length > 0) {
106
+ this._listeners.forEach(l => l());
107
+ this._listeners = [];
108
+ }
109
+ }
110
+ _dropAllowed() {
111
+ return !this._globalDragInProgress;
112
+ }
113
+ _isSupportedDataTransfer(dataTransfer) {
114
+ return dataTransfer.files.length === 1 && dataTransfer.types[0] === 'Files';
115
+ }
116
+ _isSupportedDataTransferTypes(dataTransfer) {
117
+ return dataTransfer.types[0] === 'Files';
118
+ }
119
+ }
120
+ TheSeamMapFileDropComponent.decorators = [
121
+ { type: Component, args: [{
122
+ selector: 'seam-map-file-drop',
123
+ template: "",
124
+ changeDetection: ChangeDetectionStrategy.OnPush,
125
+ styles: [":host{display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:9999!important;background-color:#1e1e1eb3}\n"]
126
+ },] }
127
+ ];
128
+ TheSeamMapFileDropComponent.ctorParameters = () => [
129
+ { type: ElementRef },
130
+ { type: NgZone },
131
+ { type: GoogleMapsService },
132
+ { type: MapValueManagerService },
133
+ { type: Renderer2 }
134
+ ];
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLWZpbGUtZHJvcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvbWFwLWZpbGUtZHJvcC9tYXAtZmlsZS1kcm9wLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUdOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBRXRELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUVyRjs7R0FFRztBQU9ILE1BQU0sT0FBTywyQkFBMkI7SUFhdEMsWUFDbUIsV0FBdUIsRUFDdkIsT0FBZSxFQUNmLFdBQThCLEVBQzlCLGdCQUF3QyxFQUN4QyxTQUFvQjtRQUpwQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7UUFDeEMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWhCdEIsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBTzdDLGVBQVUsR0FBb0IsRUFBRSxDQUFBO1FBRWhDLDBCQUFxQixHQUFZLEtBQUssQ0FBQTtRQW9FN0IseUJBQW9CLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsSUFBSSxD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QUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUF0QkMsVUFBVTtZQUNWLE1BQU07WUFVQyxpQkFBaUI7WUFDakIsc0JBQXNCO1lBUjdCLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IHJlYWRHZW9GaWxlIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL3V0aWxzJ1xuXG5pbXBvcnQgeyBHb29nbGVNYXBzU2VydmljZSB9IGZyb20gJy4uL2dvb2dsZS1tYXBzLnNlcnZpY2UnXG5pbXBvcnQgeyBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLCBNYXBWYWx1ZVNvdXJjZSB9IGZyb20gJy4uL21hcC12YWx1ZS1tYW5hZ2VyLnNlcnZpY2UnXG5cbi8qKlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2VhbS1tYXAtZmlsZS1kcm9wJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC1maWxlLWRyb3AuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXAtZmlsZS1kcm9wLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRoZVNlYW1NYXBGaWxlRHJvcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9uZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIC8qKlxuICAgKiBNYXAgZWxlbWVudCBkcmFnIGV2ZW50cyBhZGRlZCB0by5cbiAgICovXG4gIHByaXZhdGUgX21hcERpdjogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWRcblxuICBwcml2YXRlIF9saXN0ZW5lcnM6ICgoKSA9PiB2b2lkKVtdICA9IFtdXG5cbiAgcHJpdmF0ZSBfZ2xvYmFsRHJhZ0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ29vZ2xlTWFwczogR29vZ2xlTWFwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFwVmFsdWVNYW5hZ2VyOiBNYXBWYWx1ZU1hbmFnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7IH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9nb29nbGVNYXBzLm1hcFJlYWR5JC5waXBlKFxuICAgICAgdGFwKHJlYWR5ID0+IHtcbiAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgdGhpcy5fZW5hYmxlRmlsZURyb3AoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2Rpc2FibGVGaWxlRHJvcCgpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpXG4gICAgKS5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGlzYWJsZUZpbGVEcm9wKClcblxuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUubmV4dCgpXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpXG4gIH1cblxuICBwcml2YXRlIF9lbmFibGVGaWxlRHJvcCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaXZFbGVtZW50ID0gdGhpcy5fZ29vZ2xlTWFwcy5nZXREaXYoKVxuICAgIGlmICh0aGlzLl9tYXBEaXYgPT09IGRpdkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXBEaXYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGlzYWJsZSBmaWxlIGRyb3Agb24gcHJldmlvdXMgbWFwIGRpdi5cbiAgICAgIHRoaXMuX2Rpc2FibGVGaWxlRHJvcCgpXG4gICAgfVxuXG4gICAgdGhpcy5fbWFwRGl2ID0gZGl2RWxlbWVudFxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2RyYWdzdGFydCcsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fZ2xvYmFsRHJhZ0luUHJvZ3Jlc3MgPSB0cnVlXG4gICAgICB9KSlcblxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdkcmFnZW5kJywgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9nbG9iYWxEcmFnSW5Qcm9ncmVzcyA9IGZhbHNlXG4gICAgICB9KSlcblxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKGRpdkVsZW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZURyYWdPdmVyRXZlbnQpKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2godGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlRHJhZ092ZXJFdmVudCkpXG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZHJvcCcsIHRoaXMuX2hhbmRsZURyb3BFdmVudCkpXG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4oZGl2RWxlbWVudCwgJ2RyYWdlbnRlcicsIHRoaXMuX2hhbmRsZURyYWdFbnRlckV2ZW50KSlcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkcmFnbGVhdmUnLCB0aGlzLl9oYW5kbGVEcmFnTGVhdmVFdmVudCkpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVGaWxlRHJvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGwgPT4gbCgpKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW11cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9oYW5kbGVEcmFnT3ZlckV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhldmVudC5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyb3BFdmVudCA9IChldmVudDogYW55KSA9PiB7XG4gICAgaWYgKCF0aGlzLl9kcm9wQWxsb3dlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKVxuXG4gICAgLy8gVE9ETzogU2hvdyBlcnJvciBpZiBtdWx0aXBsZSBmaWxlcz9cbiAgICBpZiAoIXRoaXMuX2lzU3VwcG9ydGVkRGF0YVRyYW5zZmVyKGV2ZW50LmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF1cbiAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKVxuICAgIHJlYWRHZW9GaWxlKGZpbGUpLnRoZW4oanNvbiA9PiB7XG4gICAgICB0aGlzLl9tYXBWYWx1ZU1hbmFnZXIuc2V0VmFsdWUoanNvbiwgTWFwVmFsdWVTb3VyY2UuSW5wdXQpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyYWdFbnRlckV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhldmVudC5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJylcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhbmRsZURyYWdMZWF2ZUV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMuX2Ryb3BBbGxvd2VkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpXG4gIH1cblxuICBwcml2YXRlIF9kcm9wQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2dsb2JhbERyYWdJblByb2dyZXNzXG4gIH1cblxuICBwcml2YXRlIF9pc1N1cHBvcnRlZERhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXI6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoID09PSAxICYmIGRhdGFUcmFuc2Zlci50eXBlc1swXSA9PT0gJ0ZpbGVzJ1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNTdXBwb3J0ZWREYXRhVHJhbnNmZXJUeXBlcyhkYXRhVHJhbnNmZXI6IERhdGFUcmFuc2Zlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkYXRhVHJhbnNmZXIudHlwZXNbMF0gPT09ICdGaWxlcydcbiAgfVxuXG59XG4iXX0=