@theseam/ui-common 0.3.1 → 0.3.4

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 (100) hide show
  1. package/bundles/theseam-ui-common-dynamic.umd.js +1 -0
  2. package/bundles/theseam-ui-common-dynamic.umd.js.map +1 -1
  3. package/bundles/theseam-ui-common-form-field.umd.js +1 -1
  4. package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
  5. package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
  6. package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
  7. package/bundles/theseam-ui-common-menu.umd.js +1 -0
  8. package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
  9. package/bundles/theseam-ui-common-modal.umd.js +21 -1
  10. package/bundles/theseam-ui-common-modal.umd.js.map +1 -1
  11. package/bundles/theseam-ui-common-utils.umd.js +610 -136
  12. package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
  13. package/bundles/theseam-ui-common-widget.umd.js +3 -1
  14. package/bundles/theseam-ui-common-widget.umd.js.map +1 -1
  15. package/esm2015/dynamic/evaluators/jexl-evaluator/jexl-evaluator.js +2 -1
  16. package/esm2015/form-field/input.directive.js +2 -2
  17. package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
  18. package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
  19. package/esm2015/google-maps/google-maps-controls.service.js +70 -0
  20. package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
  21. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
  22. package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
  23. package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
  24. package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
  25. package/esm2015/google-maps/google-maps.module.js +45 -0
  26. package/esm2015/google-maps/google-maps.service.js +344 -0
  27. package/esm2015/google-maps/map-control.component.js +65 -0
  28. package/esm2015/google-maps/map-controls-service.js +4 -0
  29. package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
  30. package/esm2015/google-maps/map-value-manager.service.js +46 -0
  31. package/esm2015/google-maps/public-api.js +14 -0
  32. package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
  33. package/esm2015/menu/menu-toggle.directive.js +2 -1
  34. package/esm2015/modal/modal-ref.js +22 -2
  35. package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
  36. package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
  37. package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
  38. package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
  39. package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
  40. package/esm2015/utils/geo-json/merge-polygons.js +35 -0
  41. package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
  42. package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
  43. package/esm2015/utils/geo-json/read-geo-file.js +99 -0
  44. package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
  45. package/esm2015/utils/is-null-or-undefined.js +1 -1
  46. package/esm2015/utils/public-api.js +11 -1
  47. package/esm2015/widget/widget-content-components/widget-tile/widget-tile.component.js +4 -2
  48. package/fesm2015/theseam-ui-common-dynamic.js +1 -0
  49. package/fesm2015/theseam-ui-common-dynamic.js.map +1 -1
  50. package/fesm2015/theseam-ui-common-form-field.js +1 -1
  51. package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
  52. package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
  53. package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
  54. package/fesm2015/theseam-ui-common-menu.js +1 -0
  55. package/fesm2015/theseam-ui-common-menu.js.map +1 -1
  56. package/fesm2015/theseam-ui-common-modal.js +21 -1
  57. package/fesm2015/theseam-ui-common-modal.js.map +1 -1
  58. package/fesm2015/theseam-ui-common-utils.js +477 -94
  59. package/fesm2015/theseam-ui-common-utils.js.map +1 -1
  60. package/fesm2015/theseam-ui-common-widget.js +3 -1
  61. package/fesm2015/theseam-ui-common-widget.js.map +1 -1
  62. package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
  63. package/google-maps/google-maps/google-maps.component.d.ts +89 -0
  64. package/google-maps/google-maps-contextmenu.d.ts +15 -0
  65. package/google-maps/google-maps-controls.service.d.ts +23 -0
  66. package/google-maps/google-maps-feature-helpers.d.ts +37 -0
  67. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
  68. package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
  69. package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
  70. package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
  71. package/google-maps/google-maps.module.d.ts +2 -0
  72. package/google-maps/google-maps.service.d.ts +53 -0
  73. package/google-maps/map-control.component.d.ts +20 -0
  74. package/google-maps/map-controls-service.d.ts +13 -0
  75. package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
  76. package/google-maps/map-value-manager.service.d.ts +18 -0
  77. package/google-maps/package.json +11 -0
  78. package/google-maps/public-api.d.ts +13 -0
  79. package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
  80. package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
  81. package/modal/modal-ref.d.ts +1 -0
  82. package/modal/theseam-ui-common-modal.metadata.json +1 -1
  83. package/package.json +17 -10
  84. package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
  85. package/utils/geo-json/geo-json-to-area.d.ts +6 -0
  86. package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
  87. package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
  88. package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
  89. package/utils/geo-json/merge-polygons.d.ts +9 -0
  90. package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
  91. package/utils/geo-json/no-kinks.validator.d.ts +3 -0
  92. package/utils/geo-json/read-geo-file.d.ts +7 -0
  93. package/utils/geo-json/split-multi-polygons.d.ts +8 -0
  94. package/utils/is-null-or-undefined.d.ts +1 -1
  95. package/utils/public-api.d.ts +10 -0
  96. package/utils/theseam-ui-common-utils.metadata.json +1 -1
  97. package/widget/styles/_variables.scss +1 -0
  98. package/widget/theseam-ui-common-widget.metadata.json +1 -1
  99. package/widget/widget-content-components/widget-tile/widget-tile.component.d.ts +2 -0
  100. package/widget/widget-content-components/widget-tile/widget-tile.component.scss +1 -1
@@ -0,0 +1,177 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import { Observable } from 'rxjs';
3
+ import { notNullOrUndefined } from '@theseam/ui-common/utils';
4
+ import booleanContains from '@turf/boolean-contains';
5
+ import { multiPolygon as turfjsMultiPolygon, polygon as turfjsPolygon, } from '@turf/helpers';
6
+ export var AppFeaturePropertyName;
7
+ (function (AppFeaturePropertyName) {
8
+ AppFeaturePropertyName["IsSelected"] = "__app__isSelected";
9
+ })(AppFeaturePropertyName || (AppFeaturePropertyName = {}));
10
+ export function isAppFeatureProperty(propertyName) {
11
+ return Object.values(AppFeaturePropertyName)
12
+ .findIndex(value => value === propertyName) !== -1;
13
+ }
14
+ export function isFeatureSelected(feature) {
15
+ const isSelected = feature.getProperty(AppFeaturePropertyName.IsSelected);
16
+ return coerceBooleanProperty(isSelected);
17
+ }
18
+ export function setFeatureSelected(feature, isSelected) {
19
+ feature.setProperty(AppFeaturePropertyName.IsSelected, isSelected);
20
+ }
21
+ // TODO: Check performance of cloning a google.maps.Data instance, so the
22
+ // properties can be removed with the google maps api, instead of on the
23
+ // resulting json.
24
+ export function stripAppFeaturePropertiesFromJson(json) {
25
+ if (notNullOrUndefined(json) && Array.isArray(json === null || json === void 0 ? void 0 : json.features)) {
26
+ for (const feature of json.features) {
27
+ if (notNullOrUndefined(feature === null || feature === void 0 ? void 0 : feature.properties)) {
28
+ for (const k of Object.keys(feature.properties)) {
29
+ if (isAppFeatureProperty(k)) {
30
+ feature.properties[k] = undefined;
31
+ delete feature.properties[k];
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Searches for a Feature in Data that contains the provided Feature and can use
40
+ * it as a cutout area.
41
+ */
42
+ export function getPossibleExteriorFeature(data, feature) {
43
+ let exteriorPolygonFeature;
44
+ data.forEach(f => {
45
+ if (f !== feature && (f.getGeometry().getType() === 'Polygon' && featureContains(f, feature))) {
46
+ exteriorPolygonFeature = f;
47
+ }
48
+ });
49
+ return exteriorPolygonFeature;
50
+ }
51
+ export function addInnerFeatureCutoutToExteriorFeature(exteriorFeature, innerFeature) {
52
+ // NOTE: Other geometries may support cutouts, but our map shapes editor only
53
+ // supports polygons currently, so we will need to handle other geometry types
54
+ // here if we start allowing users to draw shapes other than polygon.
55
+ if (exteriorFeature.getGeometry().getType() !== 'Polygon' || innerFeature.getGeometry().getType() !== 'Polygon') {
56
+ throw Error(`Inner cutout is only supported by Polygon gemoetry.`);
57
+ }
58
+ const featurePolygon = innerFeature.getGeometry();
59
+ const exteriorPolygon = exteriorFeature.getGeometry();
60
+ exteriorFeature.setGeometry(new google.maps.Data.Polygon([
61
+ ...exteriorPolygon.getArray(),
62
+ featurePolygon.getAt(0).getArray().reverse()
63
+ ]));
64
+ }
65
+ /**
66
+ * Google maps paths don't always start and stop at the exact same position, so
67
+ * this will fix that for turfjs.
68
+ */
69
+ export function fixPathDifferentStartingAndEndingPoint(coordinates) {
70
+ if (coordinates.length <= 1) {
71
+ return;
72
+ }
73
+ const start = coordinates[0];
74
+ const end = coordinates[coordinates.length - 1];
75
+ if (start[0] === end[0] && start[1] === end[1]) {
76
+ return;
77
+ }
78
+ coordinates.push(coordinates[0]);
79
+ }
80
+ export function polygonCoordinates(polygon) {
81
+ return polygon.getArray().map(linRing => {
82
+ const coords = linRing.getArray().map(x => [x.lng(), x.lat()]);
83
+ fixPathDifferentStartingAndEndingPoint(coords);
84
+ return coords;
85
+ });
86
+ }
87
+ export function multiPolygonCoordinates(multiPolygon) {
88
+ return multiPolygon.getArray().map(x => polygonCoordinates(x));
89
+ }
90
+ export function toTurfJsPolygon(polygon) {
91
+ return turfjsPolygon(polygonCoordinates(polygon));
92
+ }
93
+ export function toTurfJsMultiPolygon(multiPolygon) {
94
+ return turfjsMultiPolygon(multiPolygonCoordinates(multiPolygon));
95
+ }
96
+ export function toTurfJsFeature(googleFeature) {
97
+ if (googleFeature.getGeometry().getType() === 'Polygon') {
98
+ return toTurfJsPolygon(googleFeature.getGeometry());
99
+ }
100
+ else if (googleFeature.getGeometry().getType() === 'MultiPolygon') {
101
+ return toTurfJsMultiPolygon(googleFeature.getGeometry());
102
+ }
103
+ throw Error(`Unexpected geometry.`);
104
+ }
105
+ export function featureContains(featureA, featureB) {
106
+ const polygonA = toTurfJsFeature(featureA);
107
+ const polygonB = toTurfJsFeature(featureB);
108
+ return booleanContains(polygonA, polygonB);
109
+ }
110
+ export function createDataFeatureFromPolygon(polygon) {
111
+ const arr = polygon.getPath().getArray();
112
+ return new google.maps.Data.Feature({
113
+ geometry: new google.maps.Data.Polygon([arr])
114
+ });
115
+ }
116
+ export function getBoundsWithAllFeatures(data) {
117
+ const bounds = new google.maps.LatLngBounds();
118
+ data.forEach(feature => {
119
+ const geometry = feature.getGeometry();
120
+ geometry.forEachLatLng(latLng => {
121
+ bounds.extend(latLng);
122
+ });
123
+ });
124
+ return bounds;
125
+ }
126
+ export function getFeatureBounds(feature) {
127
+ const bounds = new google.maps.LatLngBounds();
128
+ const geometry = feature.getGeometry();
129
+ geometry.forEachLatLng(latLng => {
130
+ bounds.extend(latLng);
131
+ });
132
+ return bounds;
133
+ }
134
+ export function getFeatureCenter(feature) {
135
+ return getFeatureBounds(feature).getCenter();
136
+ }
137
+ export function removeAllFeatures(data) {
138
+ data.forEach(f => data.remove(f));
139
+ }
140
+ export function getFeaturesCount(data) {
141
+ let count = 0;
142
+ data.forEach(() => count++);
143
+ return count;
144
+ }
145
+ /**
146
+ * NOTE: Original events are not emitted, because filtering may omit events.
147
+ */
148
+ export function createFeatureChangeObservable(data, ngZone) {
149
+ return new Observable(subscriber => {
150
+ const listeners = [];
151
+ ngZone.runOutsideAngular(() => {
152
+ listeners.push(data.addListener('setgeometry', (event) => {
153
+ ngZone.run(() => { subscriber.next(undefined); });
154
+ }));
155
+ listeners.push(data.addListener('addfeature', (event) => {
156
+ ngZone.run(() => { subscriber.next(undefined); });
157
+ }));
158
+ listeners.push(data.addListener('removefeature', (event) => {
159
+ ngZone.run(() => { subscriber.next(undefined); });
160
+ }));
161
+ listeners.push(data.addListener('setproperty', (event) => {
162
+ if (!isAppFeatureProperty(event.name)) {
163
+ ngZone.run(() => { subscriber.next(undefined); });
164
+ }
165
+ }));
166
+ listeners.push(data.addListener('removeproperty', (event) => {
167
+ if (!isAppFeatureProperty(event.name)) {
168
+ ngZone.run(() => { subscriber.next(undefined); });
169
+ }
170
+ }));
171
+ });
172
+ return () => {
173
+ listeners.forEach(google.maps.event.removeListener);
174
+ };
175
+ });
176
+ }
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtZmVhdHVyZS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL2dvb2dsZS1tYXBzL2dvb2dsZS1tYXBzLWZlYXR1cmUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRWpDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQzdELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sRUFDTCxZQUFZLElBQUksa0JBQWtCLEVBQ2xDLE9BQU8sSUFBSSxhQUFhLEdBQ3pCLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE1BQU0sQ0FBTixJQUFZLHNCQUVYO0FBRkQsV0FBWSxzQkFBc0I7SUFDaEMsMERBQWdDLENBQUE7QUFDbEMsQ0FBQyxFQUZXLHNCQUFzQixLQUF0QixzQkFBc0IsUUFFakM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1NBQ3pDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQWlDO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekUsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUMxQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQWlDLEVBQUUsVUFBbUI7SUFDdkYsT0FBTyxDQUFDLFdBQVcs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QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUNqRDtZQUNILENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxFQUFFO1lBQ1YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRCxDQUFDLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXG5pbXBvcnQgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5cbmltcG9ydCB7IG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B0aGVzZWFtL3VpLWNvbW1vbi91dGlscydcbmltcG9ydCBib29sZWFuQ29udGFpbnMgZnJvbSAnQHR1cmYvYm9vbGVhbi1jb250YWlucydcbmltcG9ydCB7XG4gIG11bHRpUG9seWdvbiBhcyB0dXJmanNNdWx0aVBvbHlnb24sXG4gIHBvbHlnb24gYXMgdHVyZmpzUG9seWdvbixcbn0gZnJvbSAnQHR1cmYvaGVscGVycydcblxuZXhwb3J0IGVudW0gQXBwRmVhdHVyZVByb3BlcnR5TmFtZSB7XG4gIElzU2VsZWN0ZWQgPSBgX19hcHBfX2lzU2VsZWN0ZWRgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcEZlYXR1cmVQcm9wZXJ0eShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHByb3BlcnR5TmFtZSBpcyBBcHBGZWF0dXJlUHJvcGVydHlOYW1lIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQXBwRmVhdHVyZVByb3BlcnR5TmFtZSlcbiAgICAuZmluZEluZGV4KHZhbHVlID0+IHZhbHVlID09PSBwcm9wZXJ0eU5hbWUpICE9PSAtMVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGZWF0dXJlU2VsZWN0ZWQoZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBmZWF0dXJlLmdldFByb3BlcnR5KEFwcEZlYXR1cmVQcm9wZXJ0eU5hbWUuSXNTZWxlY3RlZClcbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShpc1NlbGVjdGVkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZVNlbGVjdGVkKGZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSwgaXNTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICBmZWF0dXJlLnNldFByb3BlcnR5KEFwcEZlYXR1cmVQcm9wZXJ0eU5hbWUuSXNTZWxlY3RlZCwgaXNTZWxlY3RlZClcbn1cblxuLy8gVE9ETzogQ2hlY2sgcGVyZm9ybWFuY2Ugb2YgY2xvbmluZyBhIGdvb2dsZS5tYXBzLkRhdGEgaW5zdGFuY2UsIHNvIHRoZVxuLy8gcHJvcGVydGllcyBjYW4gYmUgcmVtb3ZlZCB3aXRoIHRoZSBnb29nbGUgbWFwcyBhcGksIGluc3RlYWQgb2Ygb24gdGhlXG4vLyByZXN1bHRpbmcganNvbi5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFwcEZlYXR1cmVQcm9wZXJ0aWVzRnJvbUpzb24oanNvbjogYW55KSB7XG4gIGlmIChub3ROdWxsT3JVbmRlZmluZWQoanNvbikgJiYgQXJyYXkuaXNBcnJheShqc29uPy5mZWF0dXJlcykpIHtcbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YganNvbi5mZWF0dXJlcykge1xuICAgICAgaWYgKG5vdE51bGxPclVuZGVmaW5lZChmZWF0dXJlPy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZmVhdHVyZS5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgIGlmIChpc0FwcEZlYXR1cmVQcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tdID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBkZWxldGUgZmVhdHVyZS5wcm9wZXJ0aWVzW2tdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgZm9yIGEgRmVhdHVyZSBpbiBEYXRhIHRoYXQgY29udGFpbnMgdGhlIHByb3ZpZGVkIEZlYXR1cmUgYW5kIGNhbiB1c2VcbiAqIGl0IGFzIGEgY3V0b3V0IGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NzaWJsZUV4dGVyaW9yRmVhdHVyZShcbiAgZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSxcbiAgZmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlXG4pOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUgfCB1bmRlZmluZWQge1xuICBsZXQgZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlIHwgdW5kZWZpbmVkXG4gIGRhdGEuZm9yRWFjaChmID0+IHtcbiAgICBpZiAoZiAhPT0gZmVhdHVyZSAmJiAoZi5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSA9PT0gJ1BvbHlnb24nICYmIGZlYXR1cmVDb250YWlucyhmLCBmZWF0dXJlKSkpIHtcbiAgICAgIGV4dGVyaW9yUG9seWdvbkZlYXR1cmUgPSBmXG4gICAgfVxuICB9KVxuICByZXR1cm4gZXh0ZXJpb3JQb2x5Z29uRmVhdHVyZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkSW5uZXJGZWF0dXJlQ3V0b3V0VG9FeHRlcmlvckZlYXR1cmUoXG4gIGV4dGVyaW9yRmVhdHVyZTogZ29vZ2xlLm1hcHMuRGF0YS5GZWF0dXJlLFxuICBpbm5lckZlYXR1cmU6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZVxuKTogdm9pZCB7XG4gIC8vIE5PVEU6IE90aGVyIGdlb21ldHJpZXMgbWF5IHN1cHBvcnQgY3V0b3V0cywgYnV0IG91ciBtYXAgc2hhcGVzIGVkaXRvciBvbmx5XG4gIC8vIHN1cHBvcnRzIHBvbHlnb25zIGN1cnJlbnRseSwgc28gd2Ugd2lsbCBuZWVkIHRvIGhhbmRsZSBvdGhlciBnZW9tZXRyeSB0eXBlc1xuICAvLyBoZXJlIGlmIHdlIHN0YXJ0IGFsbG93aW5nIHVzZXJzIHRvIGRyYXcgc2hhcGVzIG90aGVyIHRoYW4gcG9seWdvbi5cbiAgaWYgKGV4dGVyaW9yRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSAhPT0gJ1BvbHlnb24nIHx8IGlubmVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSAhPT0gJ1BvbHlnb24nKSB7XG4gICAgdGhyb3cgRXJyb3IoYElubmVyIGN1dG91dCBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb2x5Z29uIGdlbW9ldHJ5LmApXG4gIH1cblxuICBjb25zdCBmZWF0dXJlUG9seWdvbiA9IGlubmVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvblxuICBjb25zdCBleHRlcmlvclBvbHlnb24gPSBleHRlcmlvckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBnb29nbGUubWFwcy5EYXRhLlBvbHlnb25cbiAgZXh0ZXJpb3JGZWF0dXJlLnNldEdlb21ldHJ5KG5ldyBnb29nbGUubWFwcy5EYXRhLlBvbHlnb24oW1xuICAgIC4uLmV4dGVyaW9yUG9seWdvbi5nZXRBcnJheSgpLFxuICAgIGZlYXR1cmVQb2x5Z29uLmdldEF0KDApLmdldEFycmF5KCkucmV2ZXJzZSgpXG4gIF0pKVxufVxuXG4vKipcbiAqIEdvb2dsZSBtYXBzIHBhdGhzIGRvbid0IGFsd2F5cyBzdGFydCBhbmQgc3RvcCBhdCB0aGUgZXhhY3Qgc2FtZSBwb3NpdGlvbiwgc29cbiAqIHRoaXMgd2lsbCBmaXggdGhhdCBmb3IgdHVyZmpzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4UGF0aERpZmZlcmVudFN0YXJ0aW5nQW5kRW5kaW5nUG9pbnQoY29vcmRpbmF0ZXM6IG51bWJlcltdW10pOiB2b2lkIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzdGFydCA9IGNvb3JkaW5hdGVzWzBdXG4gIGNvbnN0IGVuZCA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdXG4gIGlmIChzdGFydFswXSA9PT0gZW5kWzBdICYmIHN0YXJ0WzFdID09PSBlbmRbMV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2x5Z29uQ29vcmRpbmF0ZXMocG9seWdvbjogZ29vZ2xlLm1hcHMuRGF0YS5Qb2x5Z29uKTogbnVtYmVyW11bXVtdIHtcbiAgcmV0dXJuIHBvbHlnb24uZ2V0QXJyYXkoKS5tYXAobGluUmluZyA9PiB7XG4gICAgY29uc3QgY29vcmRzID0gbGluUmluZy5nZXRBcnJheSgpLm1hcCh4ID0+IFsgeC5sbmcoKSwgeC5sYXQoKSBdKVxuICAgIGZpeFBhdGhEaWZmZXJlbnRTdGFydGluZ0FuZEVuZGluZ1BvaW50KGNvb3JkcylcbiAgICByZXR1cm4gY29vcmRzXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aVBvbHlnb25Db29yZGluYXRlcyhtdWx0aVBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuTXVsdGlQb2x5Z29uKTogbnVtYmVyW11bXVtdW10ge1xuICByZXR1cm4gbXVsdGlQb2x5Z29uLmdldEFycmF5KCkubWFwKHggPT4gcG9seWdvbkNvb3JkaW5hdGVzKHgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9UdXJmSnNQb2x5Z29uKHBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvbikge1xuICByZXR1cm4gdHVyZmpzUG9seWdvbihwb2x5Z29uQ29vcmRpbmF0ZXMocG9seWdvbikpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1R1cmZKc011bHRpUG9seWdvbihtdWx0aVBvbHlnb246IGdvb2dsZS5tYXBzLkRhdGEuTXVsdGlQb2x5Z29uKSB7XG4gIHJldHVybiB0dXJmanNNdWx0aVBvbHlnb24obXVsdGlQb2x5Z29uQ29vcmRpbmF0ZXMobXVsdGlQb2x5Z29uKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvVHVyZkpzRmVhdHVyZShnb29nbGVGZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpIHtcbiAgaWYgKGdvb2dsZUZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCkgPT09ICdQb2x5Z29uJykge1xuICAgIHJldHVybiB0b1R1cmZKc1BvbHlnb24oZ29vZ2xlRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGdvb2dsZS5tYXBzLkRhdGEuUG9seWdvbilcbiAgfSBlbHNlIGlmIChnb29nbGVGZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0VHlwZSgpID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgIHJldHVybiB0b1R1cmZKc011bHRpUG9seWdvbihnb29nbGVGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgZ29vZ2xlLm1hcHMuRGF0YS5NdWx0aVBvbHlnb24pXG4gIH1cblxuICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBnZW9tZXRyeS5gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUNvbnRhaW5zKGZlYXR1cmVBOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUsIGZlYXR1cmVCOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBib29sZWFuIHtcbiAgY29uc3QgcG9seWdvbkEgPSB0b1R1cmZKc0ZlYXR1cmUoZmVhdHVyZUEpXG4gIGNvbnN0IHBvbHlnb25CID0gdG9UdXJmSnNGZWF0dXJlKGZlYXR1cmVCKVxuICByZXR1cm4gYm9vbGVhbkNvbnRhaW5zKHBvbHlnb25BLCBwb2x5Z29uQilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGFGZWF0dXJlRnJvbVBvbHlnb24ocG9seWdvbjogZ29vZ2xlLm1hcHMuUG9seWdvbik6IGdvb2dsZS5tYXBzLkRhdGEuRmVhdHVyZSB7XG4gIGNvbnN0IGFyciA9IHBvbHlnb24uZ2V0UGF0aCgpLmdldEFycmF5KClcbiAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUoe1xuICAgIGdlb21ldHJ5OiBuZXcgZ29vZ2xlLm1hcHMuRGF0YS5Qb2x5Z29uKFsgYXJyIF0pXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZHNXaXRoQWxsRmVhdHVyZXMoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB7XG4gIGNvbnN0IGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKVxuXG4gIGRhdGEuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKVxuICAgIGdlb21ldHJ5LmZvckVhY2hMYXRMbmcobGF0TG5nID0+IHtcbiAgICAgIGJvdW5kcy5leHRlbmQobGF0TG5nKVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIGJvdW5kc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVhdHVyZUJvdW5kcyhmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMge1xuICBjb25zdCBib3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKClcblxuICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2V0R2VvbWV0cnkoKVxuICBnZW9tZXRyeS5mb3JFYWNoTGF0TG5nKGxhdExuZyA9PiB7XG4gICAgYm91bmRzLmV4dGVuZChsYXRMbmcpXG4gIH0pXG5cbiAgcmV0dXJuIGJvdW5kc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVhdHVyZUNlbnRlcihmZWF0dXJlOiBnb29nbGUubWFwcy5EYXRhLkZlYXR1cmUpOiBnb29nbGUubWFwcy5MYXRMbmcge1xuICByZXR1cm4gZ2V0RmVhdHVyZUJvdW5kcyhmZWF0dXJlKS5nZXRDZW50ZXIoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsRmVhdHVyZXMoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IHZvaWQge1xuICBkYXRhLmZvckVhY2goZiA9PiBkYXRhLnJlbW92ZShmKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzQ291bnQoZGF0YTogZ29vZ2xlLm1hcHMuRGF0YSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDBcbiAgZGF0YS5mb3JFYWNoKCgpID0+IGNvdW50KyspXG4gIHJldHVybiBjb3VudFxufVxuXG4vKipcbiAqIE5PVEU6IE9yaWdpbmFsIGV2ZW50cyBhcmUgbm90IGVtaXR0ZWQsIGJlY2F1c2UgZmlsdGVyaW5nIG1heSBvbWl0IGV2ZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmVDaGFuZ2VPYnNlcnZhYmxlKGRhdGE6IGdvb2dsZS5tYXBzLkRhdGEsIG5nWm9uZTogTmdab25lKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihzdWJzY3JpYmVyID0+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IGdvb2dsZS5tYXBzLk1hcHNFdmVudExpc3RlbmVyW10gPSBbXVxuXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGxpc3RlbmVycy5wdXNoKGRhdGEuYWRkTGlzdGVuZXIoJ3NldGdlb21ldHJ5JywgKGV2ZW50OiBnb29nbGUubWFwcy5EYXRhLlNldEdlb21ldHJ5RXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcignYWRkZmVhdHVyZScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5BZGRGZWF0dXJlRXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcigncmVtb3ZlZmVhdHVyZScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5SZW1vdmVGZWF0dXJlRXZlbnQpID0+IHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICB9KSlcblxuICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YS5hZGRMaXN0ZW5lcignc2V0cHJvcGVydHknLCAoZXZlbnQ6IGdvb2dsZS5tYXBzLkRhdGEuU2V0UHJvcGVydHlFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIWlzQXBwRmVhdHVyZVByb3BlcnR5KGV2ZW50Lm5hbWUpKSB7XG4gICAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7IHN1YnNjcmliZXIubmV4dCh1bmRlZmluZWQpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pKVxuXG4gICAgICBsaXN0ZW5lcnMucHVzaChkYXRhLmFkZExpc3RlbmVyKCdyZW1vdmVwcm9wZXJ0eScsIChldmVudDogZ29vZ2xlLm1hcHMuRGF0YS5SZW1vdmVQcm9wZXJ0eUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghaXNBcHBGZWF0dXJlUHJvcGVydHkoZXZlbnQubmFtZSkpIHtcbiAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHsgc3Vic2NyaWJlci5uZXh0KHVuZGVmaW5lZCkgfSlcbiAgICAgICAgfVxuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChnb29nbGUubWFwcy5ldmVudC5yZW1vdmVMaXN0ZW5lcilcbiAgICB9XG4gIH0pXG59XG4iXX0=
@@ -0,0 +1,195 @@
1
+ import { __decorate } from "tslib";
2
+ import { coerceNumberProperty } from '@angular/cdk/coercion';
3
+ import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
4
+ import { interval, Observable, Subject } from 'rxjs';
5
+ import { filter, mapTo, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
6
+ import { faSearchLocation } from '@fortawesome/free-solid-svg-icons';
7
+ import { InputBoolean } from '@theseam/ui-common/core';
8
+ import { InputDirective } from '@theseam/ui-common/form-field';
9
+ import { SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS, TheSeamGoogleMapsPlacesAutocompleteDirective } from './google-maps-places-autocomplete.directive';
10
+ /**
11
+ *
12
+ */
13
+ export class TheSeamGoogleMapsPlacesAutoCompleteComponent {
14
+ constructor(_elementRef) {
15
+ this._elementRef = _elementRef;
16
+ this._ngUnsubscribe = new Subject();
17
+ this._autoCompleteReadySubject = new Subject();
18
+ this._placeChangedPending = [];
19
+ this.label = 'Search by address, place or name';
20
+ this.icon = faSearchLocation;
21
+ this.disabled = false;
22
+ this.placeholder = 'Enter address, place or name';
23
+ this.autocorrect = 'off';
24
+ this.autocapitalize = 'off';
25
+ this._tabIndex = -1;
26
+ this._options = SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
27
+ this.placeChanged = this._autoCompleteReadySubject.pipe(startWith(undefined), switchMap(() => this._createPlaceChangedObservable()));
28
+ }
29
+ /**
30
+ * Set the tab index to `-1` to allow the root element of the
31
+ * component to receive `focus` event from javascript, but not get focused by
32
+ * keyboard navigation.
33
+ */
34
+ set tabIndex(value) { this._tabIndex = coerceNumberProperty(value); }
35
+ get tabIndex() { return this._tabIndex; }
36
+ set options(value) {
37
+ this._options = value || SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
38
+ }
39
+ set __autocompleteDirective(value) {
40
+ this._autoCompleteDirective = value;
41
+ this._untilAutoCompleteReady().pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {
42
+ this.autoComplete = this._autoCompleteDirective.autoComplete;
43
+ this._placeChangedPending.forEach(pending => pending.observable.subscribe(pending.subscriber));
44
+ this._placeChangedPending = [];
45
+ });
46
+ }
47
+ get _attrTabIndex() { return this.disabled ? -1 : (this.tabIndex || 0); }
48
+ _onClick(event) {
49
+ this._inputDirective.focus();
50
+ }
51
+ _onFocus() {
52
+ var _a;
53
+ (_a = this._inputDirective) === null || _a === void 0 ? void 0 : _a.focus();
54
+ }
55
+ ngOnInit() { }
56
+ /** @ignore */
57
+ ngOnDestroy() {
58
+ this._ngUnsubscribe.next();
59
+ this._ngUnsubscribe.complete();
60
+ }
61
+ _untilAutoCompleteReady() {
62
+ return interval(500).pipe(filter(() => !!this._autoCompleteDirective.autoComplete), take(1), mapTo(undefined));
63
+ }
64
+ /**
65
+ * Returns the bounds to which predictions are biased.
66
+ */
67
+ getBounds() {
68
+ this._assertInitialized();
69
+ return this.autoComplete.getBounds();
70
+ }
71
+ /**
72
+ * Returns the fields to be included for the Place in the details response
73
+ * when the details are successfully retrieved. For a list of fields see
74
+ * [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
75
+ */
76
+ getFields() {
77
+ this._assertInitialized();
78
+ return this.autoComplete.getFields();
79
+ }
80
+ /**
81
+ * Returns the details of the Place selected by user if the details were
82
+ * successfully retrieved. Otherwise returns a stub Place object, with the
83
+ * name property set to the current value of the input field.
84
+ */
85
+ getPlace() {
86
+ this._assertInitialized();
87
+ return this.autoComplete.getPlace();
88
+ }
89
+ /**
90
+ * Sets the preferred area within which to return Place results. Results are
91
+ * biased towards, but not restricted to, this area.
92
+ */
93
+ setBounds(bounds) {
94
+ this._assertInitialized();
95
+ // tslint:disable-next-line: no-non-null-assertion
96
+ return this.autoComplete.setBounds(bounds);
97
+ }
98
+ /**
99
+ * Sets the component restrictions. Component restrictions are used to
100
+ * restrict predictions to only those within the parent component. For
101
+ * example, the country.
102
+ */
103
+ setComponentRestrictions(restrictions) {
104
+ this._assertInitialized();
105
+ // tslint:disable-next-line: no-non-null-assertion
106
+ return this.autoComplete.setComponentRestrictions(restrictions);
107
+ }
108
+ /**
109
+ * Sets the fields to be included for the Place in the details response when
110
+ * the details are successfully retrieved. For a list of fields see
111
+ * [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
112
+ */
113
+ setFields(fields) {
114
+ this._assertInitialized();
115
+ // tslint:disable-next-line: no-non-null-assertion
116
+ return this.autoComplete.setFields(fields);
117
+ }
118
+ /** */
119
+ setOptions(options) {
120
+ this._assertInitialized();
121
+ // tslint:disable-next-line: no-non-null-assertion
122
+ return this.autoComplete.setOptions(options);
123
+ }
124
+ /**
125
+ * Sets the types of predictions to be returned. For supported types, see the
126
+ * [developer's guide](https://developers.google.com/maps/documentation/javascript/places-autocomplete#constrain-place-types).
127
+ * If no types are specified, all types will be returned.
128
+ */
129
+ setTypes(types) {
130
+ this._assertInitialized();
131
+ // tslint:disable-next-line: no-non-null-assertion
132
+ return this.autoComplete.setTypes(types);
133
+ }
134
+ /** Focuses the input. */
135
+ focus() {
136
+ this._elementRef.nativeElement.focus();
137
+ }
138
+ /** Unfocuses the input. */
139
+ blur() {
140
+ this._elementRef.nativeElement.blur();
141
+ }
142
+ getHostElement() {
143
+ return this._elementRef.nativeElement;
144
+ }
145
+ _createPlaceChangedObservable() {
146
+ const observable = new Observable(subscriber => {
147
+ if (!this.autoComplete) {
148
+ this._placeChangedPending.push({ observable, subscriber });
149
+ return undefined;
150
+ }
151
+ const sub = this._autoCompleteDirective.placeChanged.subscribe(subscriber);
152
+ return () => sub.unsubscribe();
153
+ });
154
+ return observable;
155
+ }
156
+ /** Asserts that the map has been initialized. */
157
+ _assertInitialized() {
158
+ if (!this.autoComplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {
159
+ throw Error('Cannot access Google Map Places information before the API has been initialized. ' +
160
+ 'Please wait for the API to load before trying to interact with it.');
161
+ }
162
+ }
163
+ }
164
+ TheSeamGoogleMapsPlacesAutoCompleteComponent.decorators = [
165
+ { type: Component, args: [{
166
+ selector: 'seam-google-maps-places-autocomplete',
167
+ template: "<div *ngIf=\"icon\" class=\"search-container--icon-wrapper\">\n <seam-icon [icon]=\"icon\" class=\"text-muted\" size=\"lg\"></seam-icon>\n</div>\n<label *ngIf=\"label || placeholder\" [attr.for]=\"inp.id\" class=\"sr-only\">{{ label || placeholder }}</label>\n<input #inp=\"seamInput\"\n seamInput\n seamGoogleMapsPlacesAutocomplete\n [disabled]=\"disabled\"\n [attr.placeholder]=\"placeholder\"\n [attr.autocorrect]=\"autocorrect\"\n [attr.autocapitalize]=\"autocapitalize\"\n [options]=\"_options\"\n/>\n",
168
+ changeDetection: ChangeDetectionStrategy.OnPush,
169
+ exportAs: 'seamGoogleMapsPlacesAutoComplete',
170
+ styles: [":host{position:relative;width:100%}:host>input{padding-left:40px}:host .search-container--icon-wrapper{position:absolute;top:6px;left:10px;bottom:0px}:host .search-container--icon-wrapper ::ng-deep .svg-inline--fa{vertical-align:middle}\n"]
171
+ },] }
172
+ ];
173
+ TheSeamGoogleMapsPlacesAutoCompleteComponent.ctorParameters = () => [
174
+ { type: ElementRef }
175
+ ];
176
+ TheSeamGoogleMapsPlacesAutoCompleteComponent.propDecorators = {
177
+ label: [{ type: Input }],
178
+ icon: [{ type: Input }],
179
+ disabled: [{ type: Input }],
180
+ placeholder: [{ type: Input }],
181
+ autocorrect: [{ type: Input }],
182
+ autocapitalize: [{ type: Input }],
183
+ tabIndex: [{ type: Input }],
184
+ options: [{ type: Input }],
185
+ placeChanged: [{ type: Output }],
186
+ _inputDirective: [{ type: ViewChild, args: ['inp', { read: InputDirective, static: true },] }],
187
+ __autocompleteDirective: [{ type: ViewChild, args: [TheSeamGoogleMapsPlacesAutocompleteDirective, { static: true },] }],
188
+ _attrTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],
189
+ _onClick: [{ type: HostListener, args: ['click', ['event'],] }],
190
+ _onFocus: [{ type: HostListener, args: ['focus', ['$event'],] }]
191
+ };
192
+ __decorate([
193
+ InputBoolean()
194
+ ], TheSeamGoogleMapsPlacesAutoCompleteComponent.prototype, "disabled", void 0);
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFnQixvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzFFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFNLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQTtBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRzlELE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLDZDQUE2QyxDQUFBO0FBSzNKOztHQUVHO0FBUUgsTUFBTSxPQUFPLDRDQUE0QztJQTJFdkQsWUFDbUIsV0FBdUI7UUFBdkIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUF6RXpCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUNwQyw4QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFB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QWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxRQUFRLEVBQUUsa0NBQWtDOzthQUM3Qzs7O1lBL0JDLFVBQVU7OztvQkEwQ1QsS0FBSzttQkFFTCxLQUFLO3VCQUVMLEtBQUs7MEJBRUwsS0FBSzswQkFFTCxLQUFLOzZCQUVMLEtBQUs7dUJBT0osS0FBSztzQkFLTixLQUFLOzJCQWVMLE1BQU07OEJBRU4sU0FBUyxTQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtzQ0FFdkQsU0FBUyxTQUFDLDRDQUE0QyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkFXeEUsV0FBVyxTQUFDLGVBQWU7dUJBRzNCLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBRSxPQUFPLENBQUU7dUJBS2pDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBRSxRQUFRLENBQUU7O0FBeERWO0lBQWYsWUFBWSxFQUFFOzhFQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgaW50ZXJ2YWwsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwVG8sIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgZmFTZWFyY2hMb2NhdGlvbiB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucydcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ0B0aGVzZWFtL3VpLWNvbW1vbi9jb3JlJ1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICdAdGhlc2VhbS91aS1jb21tb24vZm9ybS1maWVsZCdcbmltcG9ydCB7IFNlYW1JY29uIH0gZnJvbSAnQHRoZXNlYW0vdWktY29tbW9uL2ljb24nXG5cbmltcG9ydCB7IFNFQU1fR09PR0xFX1BMQUNFU19BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TLCBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5kaXJlY3RpdmUnXG5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkXG50eXBlIFdpdGhSZXF1aXJlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBUICYgeyBbUCBpbiBLXS0/OiBUW1BdIH1cblxuLyoqXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZWFtLWdvb2dsZS1tYXBzLXBsYWNlcy1hdXRvY29tcGxldGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dvb2dsZS1tYXBzLXBsYWNlcy1hdXRvY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGV4cG9ydEFzOiAnc2VhbUdvb2dsZU1hcHNQbGFjZXNBdXRvQ29tcGxldGUnXG59KVxuZXhwb3J0IGNsYXNzIFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgcmVhZG9ubHkgX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KClcblxuICBwcml2YXRlIF9wbGFjZUNoYW5nZWRQZW5kaW5nOiB7IG9ic2VydmFibGU6IE9ic2VydmFibGU8YW55Piwgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxhbnk+IH1bXSA9IFtdXG5cbiAgcHVibGljIGF1dG9Db21wbGV0ZT86IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVcblxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCA9ICdTZWFyY2ggYnkgYWRkcmVzcywgcGxhY2Ugb3IgbmFtZSdcblxuICBASW5wdXQoKSBpY29uOiBTZWFtSWNvbiB8IHVuZGVmaW5lZCB8IG51bGwgPSBmYVNlYXJjaExvY2F0aW9uXG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGRpc2FibGVkOiBCb29sZWFuSW5wdXQgPSBmYWxzZVxuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsID0gJ0VudGVyIGFkZHJlc3MsIHBsYWNlIG9yIG5hbWUnXG5cbiAgQElucHV0KCkgYXV0b2NvcnJlY3Q6ICdvZmYnIHwgJ29uJyB8IHVuZGVmaW5lZCB8IG51bGwgPSAnb2ZmJ1xuXG4gIEBJbnB1dCgpIGF1dG9jYXBpdGFsaXplOiAnb2ZmJyB8ICdvbicgfCB1bmRlZmluZWQgfCBudWxsID0gJ29mZidcblxuICAvKipcbiAgICogU2V0IHRoZSB0YWIgaW5kZXggdG8gYC0xYCB0byBhbGxvdyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZVxuICAgKiBjb21wb25lbnQgdG8gcmVjZWl2ZSBgZm9jdXNgIGV2ZW50IGZyb20gamF2YXNjcmlwdCwgYnV0IG5vdCBnZXQgZm9jdXNlZCBieVxuICAgKiBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgIEBJbnB1dCgpXG4gICBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikgeyB0aGlzLl90YWJJbmRleCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSB9XG4gICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYkluZGV4IH1cbiAgIHByaXZhdGUgX3RhYkluZGV4ID0gLTFcblxuICBASW5wdXQoKVxuICBzZXQgb3B0aW9ucyh2YWx1ZTogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlIHx8IFNFQU1fR09PR0xFX1BMQUNFU19BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TXG4gIH1cbiAgX29wdGlvbnM6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVPcHRpb25zID0gU0VBTV9HT09HTEVfUExBQ0VTX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlNcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgUGxhY2VSZXN1bHQgaXMgbWFkZSBhdmFpbGFibGUgZm9yIGEgUGxhY2UgdGhlXG4gICAqIHVzZXIgaGFzIHNlbGVjdGVkLiBJZiB0aGUgdXNlciBlbnRlcnMgdGhlIG5hbWUgb2YgYSBQbGFjZSB0aGF0IHdhcyBub3RcbiAgICogc3VnZ2VzdGVkIGJ5IHRoZSBjb250cm9sIGFuZCBwcmVzc2VzIHRoZSBFbnRlciBrZXksIG9yIGlmIGEgUGxhY2UgRGV0YWlsc1xuICAgKiByZXF1ZXN0IGZhaWxzLCB0aGUgUGxhY2VSZXN1bHQgY29udGFpbnMgdGhlIHVzZXIgaW5wdXQgaW4gdGhlIG5hbWVcbiAgICogcHJvcGVydHksIHdpdGggbm8gb3RoZXIgcHJvcGVydGllcyBkZWZpbmVkLlxuICAgKlxuICAgKiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9wbGFjZXMtd2lkZ2V0I0F1dG9jb21wbGV0ZS5wbGFjZV9jaGFuZ2VkXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcGxhY2VDaGFuZ2VkOiBPYnNlcnZhYmxlPHZvaWQ+XG5cbiAgQFZpZXdDaGlsZCgnaW5wJywgeyByZWFkOiBJbnB1dERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pIF9pbnB1dERpcmVjdGl2ZSE6IElucHV0RGlyZWN0aXZlXG5cbiAgQFZpZXdDaGlsZChUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgc2V0IF9fYXV0b2NvbXBsZXRlRGlyZWN0aXZlKHZhbHVlOiBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZSkge1xuICAgIHRoaXMuX2F1dG9Db21wbGV0ZURpcmVjdGl2ZSA9IHZhbHVlXG4gICAgdGhpcy5fdW50aWxBdXRvQ29tcGxldGVSZWFkeSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX25nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hdXRvQ29tcGxldGUgPSB0aGlzLl9hdXRvQ29tcGxldGVEaXJlY3RpdmUuYXV0b0NvbXBsZXRlXG4gICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nLmZvckVhY2gocGVuZGluZyA9PiBwZW5kaW5nLm9ic2VydmFibGUuc3Vic2NyaWJlKHBlbmRpbmcuc3Vic2NyaWJlcikpXG4gICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nID0gW11cbiAgICB9KVxuICB9XG4gIF9hdXRvQ29tcGxldGVEaXJlY3RpdmUhOiBUaGVTZWFtR29vZ2xlTWFwc1BsYWNlc0F1dG9jb21wbGV0ZURpcmVjdGl2ZVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIGdldCBfYXR0clRhYkluZGV4KCkgeyByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IC0xIDogKHRoaXMudGFiSW5kZXggfHwgMCkgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyAnZXZlbnQnIF0pXG4gIF9vbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5faW5wdXREaXJlY3RpdmUuZm9jdXMoKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbICckZXZlbnQnIF0pXG4gIF9vbkZvY3VzKCkge1xuICAgIHRoaXMuX2lucHV0RGlyZWN0aXZlPy5mb2N1cygpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICApIHtcbiAgICB0aGlzLnBsYWNlQ2hhbmdlZCA9IHRoaXMuX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fY3JlYXRlUGxhY2VDaGFuZ2VkT2JzZXJ2YWJsZTxhbnk+KCkpXG4gICAgKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7IH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLm5leHQoKVxuICAgIHRoaXMuX25nVW5zdWJzY3JpYmUuY29tcGxldGUoKVxuICB9XG5cbiAgcHJpdmF0ZSBfdW50aWxBdXRvQ29tcGxldGVSZWFkeSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gaW50ZXJ2YWwoNTAwKS5waXBlKFxuICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5fYXV0b0NvbXBsZXRlRGlyZWN0aXZlLmF1dG9Db21wbGV0ZSksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwVG8odW5kZWZpbmVkKSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYm91bmRzIHRvIHdoaWNoIHByZWRpY3Rpb25zIGFyZSBiaWFzZWQuXG4gICAqL1xuICAgcHVibGljIGdldEJvdW5kcygpOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCB1bmRlZmluZWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuZ2V0Qm91bmRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaWVsZHMgdG8gYmUgaW5jbHVkZWQgZm9yIHRoZSBQbGFjZSBpbiB0aGUgZGV0YWlscyByZXNwb25zZVxuICAgKiB3aGVuIHRoZSBkZXRhaWxzIGFyZSBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLiBGb3IgYSBsaXN0IG9mIGZpZWxkcyBzZWVcbiAgICogW1BsYWNlUmVzdWx0XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvcGxhY2VzLXNlcnZpY2UjUGxhY2VSZXN1bHQpLlxuICAgKi9cbiAgcHVibGljIGdldEZpZWxkcygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJldHVybiAodGhpcy5hdXRvQ29tcGxldGUgYXMgYW55KS5nZXRGaWVsZHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRldGFpbHMgb2YgdGhlIFBsYWNlIHNlbGVjdGVkIGJ5IHVzZXIgaWYgdGhlIGRldGFpbHMgd2VyZVxuICAgKiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLiBPdGhlcndpc2UgcmV0dXJucyBhIHN0dWIgUGxhY2Ugb2JqZWN0LCB3aXRoIHRoZVxuICAgKiBuYW1lIHByb3BlcnR5IHNldCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQgZmllbGQuXG4gICAqL1xuICAgcHVibGljIGdldFBsYWNlKCk6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5nZXRQbGFjZSgpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcHJlZmVycmVkIGFyZWEgd2l0aGluIHdoaWNoIHRvIHJldHVybiBQbGFjZSByZXN1bHRzLiBSZXN1bHRzIGFyZVxuICAgKiBiaWFzZWQgdG93YXJkcywgYnV0IG5vdCByZXN0cmljdGVkIHRvLCB0aGlzIGFyZWEuXG4gICAqL1xuICBwdWJsaWMgc2V0Qm91bmRzKGJvdW5kcz86IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kc0xpdGVyYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0Qm91bmRzKGJvdW5kcyEpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29tcG9uZW50IHJlc3RyaWN0aW9ucy4gQ29tcG9uZW50IHJlc3RyaWN0aW9ucyBhcmUgdXNlZCB0b1xuICAgKiByZXN0cmljdCBwcmVkaWN0aW9ucyB0byBvbmx5IHRob3NlIHdpdGhpbiB0aGUgcGFyZW50IGNvbXBvbmVudC4gRm9yXG4gICAqIGV4YW1wbGUsIHRoZSBjb3VudHJ5LlxuICAgKi9cbiAgcHVibGljIHNldENvbXBvbmVudFJlc3RyaWN0aW9ucyhyZXN0cmljdGlvbnM/OiBnb29nbGUubWFwcy5wbGFjZXMuQ29tcG9uZW50UmVzdHJpY3Rpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldENvbXBvbmVudFJlc3RyaWN0aW9ucyhyZXN0cmljdGlvbnMhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpZWxkcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIFBsYWNlIGluIHRoZSBkZXRhaWxzIHJlc3BvbnNlIHdoZW5cbiAgICogdGhlIGRldGFpbHMgYXJlIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuIEZvciBhIGxpc3Qgb2YgZmllbGRzIHNlZVxuICAgKiBbUGxhY2VSZXN1bHRdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9wbGFjZXMtc2VydmljZSNQbGFjZVJlc3VsdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0RmllbGRzKGZpZWxkcz86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldEZpZWxkcyhmaWVsZHMhKVxuICB9XG5cbiAgLyoqICovXG4gIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM/OiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5zZXRPcHRpb25zKG9wdGlvbnMhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHR5cGVzIG9mIHByZWRpY3Rpb25zIHRvIGJlIHJldHVybmVkLiBGb3Igc3VwcG9ydGVkIHR5cGVzLCBzZWUgdGhlXG4gICAqIFtkZXZlbG9wZXIncyBndWlkZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcGxhY2VzLWF1dG9jb21wbGV0ZSNjb25zdHJhaW4tcGxhY2UtdHlwZXMpLlxuICAgKiBJZiBubyB0eXBlcyBhcmUgc3BlY2lmaWVkLCBhbGwgdHlwZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBzZXRUeXBlcyh0eXBlcz86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldFR5cGVzKHR5cGVzISlcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgcHVibGljIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpXG4gIH1cblxuICAvKiogVW5mb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgcHVibGljIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmJsdXIoKVxuICB9XG5cbiAgcHVibGljIGdldEhvc3RFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVBsYWNlQ2hhbmdlZE9ic2VydmFibGU8VD4oKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICAgICAgaWYgKCF0aGlzLmF1dG9Db21wbGV0ZSkge1xuICAgICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nLnB1c2goeyBvYnNlcnZhYmxlLCBzdWJzY3JpYmVyIH0pXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fYXV0b0NvbXBsZXRlRGlyZWN0aXZlLnBsYWNlQ2hhbmdlZC5zdWJzY3JpYmUoc3Vic2NyaWJlcilcblxuICAgICAgcmV0dXJuICgpID0+IHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgICByZXR1cm4gb2JzZXJ2YWJsZVxuICB9XG5cbiAgLyoqIEFzc2VydHMgdGhhdCB0aGUgbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkLiAqL1xuICBwcml2YXRlIF9hc3NlcnRJbml0aWFsaXplZCgpOiBhc3NlcnRzIHRoaXMgaXMgV2l0aFJlcXVpcmVkPFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b0NvbXBsZXRlQ29tcG9uZW50LCAnYXV0b0NvbXBsZXRlJz4ge1xuICAgIGlmICghdGhpcy5hdXRvQ29tcGxldGUgJiYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGFjY2VzcyBHb29nbGUgTWFwIFBsYWNlcyBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZC4gJyArXG4gICAgICAgICAgJ1BsZWFzZSB3YWl0IGZvciB0aGUgQVBJIHRvIGxvYWQgYmVmb3JlIHRyeWluZyB0byBpbnRlcmFjdCB3aXRoIGl0LicsXG4gICAgICApXG4gICAgfVxuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,163 @@
1
+ import { Directive, ElementRef, HostBinding, Input, NgZone, Output } from '@angular/core';
2
+ import { interval, Observable, Subject } from 'rxjs';
3
+ import { filter, mapTo, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
4
+ export const SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS = {
5
+ componentRestrictions: { country: 'US' }
6
+ };
7
+ export class TheSeamGoogleMapsPlacesAutocompleteDirective {
8
+ constructor(_elementRef, _ngZone) {
9
+ this._elementRef = _elementRef;
10
+ this._ngZone = _ngZone;
11
+ this._autoCompleteReadySubject = new Subject();
12
+ this._ngUnsubscribe = new Subject();
13
+ this._placeChangedPending = [];
14
+ this._listeners = [];
15
+ this._options = SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
16
+ this._attrType = 'text';
17
+ this.placeChanged = this._autoCompleteReadySubject.pipe(startWith(undefined), switchMap(() => this._createPlaceChangedObservable()));
18
+ }
19
+ set options(value) {
20
+ this._options = value || SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS;
21
+ }
22
+ ngOnInit() {
23
+ this._ngZone.runOutsideAngular(() => {
24
+ this._untilGoogleMapsApiLoaded().pipe(takeUntil(this._ngUnsubscribe)).subscribe(() => {
25
+ this.autoComplete = new google.maps.places.Autocomplete(this.getHostElement(), this._options);
26
+ this._placeChangedPending.forEach(pending => pending.observable.subscribe(pending.subscriber));
27
+ this._autoCompleteReadySubject.next();
28
+ });
29
+ });
30
+ }
31
+ ngOnDestroy() {
32
+ this._listeners.forEach(l => l.remove());
33
+ this._listeners = [];
34
+ this._ngUnsubscribe.next();
35
+ this._ngUnsubscribe.complete();
36
+ }
37
+ ngOnChanges(changes) {
38
+ if (this.autoComplete && changes['options']) {
39
+ this.autoComplete.setOptions(this._options);
40
+ }
41
+ }
42
+ _untilGoogleMapsApiLoaded() {
43
+ return interval(500).pipe(filter(() => !!(window.google && window.google.maps && window.google.maps.version)), take(1), mapTo(undefined));
44
+ }
45
+ /**
46
+ * Returns the bounds to which predictions are biased.
47
+ */
48
+ getBounds() {
49
+ this._assertInitialized();
50
+ return this.autoComplete.getBounds();
51
+ }
52
+ /**
53
+ * Returns the fields to be included for the Place in the details response
54
+ * when the details are successfully retrieved. For a list of fields see
55
+ * [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
56
+ */
57
+ getFields() {
58
+ this._assertInitialized();
59
+ return this.autoComplete.getFields();
60
+ }
61
+ /**
62
+ * Returns the details of the Place selected by user if the details were
63
+ * successfully retrieved. Otherwise returns a stub Place object, with the
64
+ * name property set to the current value of the input field.
65
+ */
66
+ getPlace() {
67
+ this._assertInitialized();
68
+ return this.autoComplete.getPlace();
69
+ }
70
+ /**
71
+ * Sets the preferred area within which to return Place results. Results are
72
+ * biased towards, but not restricted to, this area.
73
+ */
74
+ setBounds(bounds) {
75
+ this._assertInitialized();
76
+ // tslint:disable-next-line: no-non-null-assertion
77
+ return this.autoComplete.setBounds(bounds);
78
+ }
79
+ /**
80
+ * Sets the component restrictions. Component restrictions are used to
81
+ * restrict predictions to only those within the parent component. For
82
+ * example, the country.
83
+ */
84
+ setComponentRestrictions(restrictions) {
85
+ this._assertInitialized();
86
+ // tslint:disable-next-line: no-non-null-assertion
87
+ return this.autoComplete.setComponentRestrictions(restrictions);
88
+ }
89
+ /**
90
+ * Sets the fields to be included for the Place in the details response when
91
+ * the details are successfully retrieved. For a list of fields see
92
+ * [PlaceResult](https://developers.google.com/maps/documentation/javascript/reference/places-service#PlaceResult).
93
+ */
94
+ setFields(fields) {
95
+ this._assertInitialized();
96
+ // tslint:disable-next-line: no-non-null-assertion
97
+ return this.autoComplete.setFields(fields);
98
+ }
99
+ /** */
100
+ setOptions(options) {
101
+ this._assertInitialized();
102
+ // tslint:disable-next-line: no-non-null-assertion
103
+ return this.autoComplete.setOptions(options);
104
+ }
105
+ /**
106
+ * Sets the types of predictions to be returned. For supported types, see the
107
+ * [developer's guide](https://developers.google.com/maps/documentation/javascript/places-autocomplete#constrain-place-types).
108
+ * If no types are specified, all types will be returned.
109
+ */
110
+ setTypes(types) {
111
+ this._assertInitialized();
112
+ // tslint:disable-next-line: no-non-null-assertion
113
+ return this.autoComplete.setTypes(types);
114
+ }
115
+ /** Focuses the input. */
116
+ focus() {
117
+ this._elementRef.nativeElement.focus();
118
+ }
119
+ /** Unfocuses the input. */
120
+ blur() {
121
+ this._elementRef.nativeElement.blur();
122
+ }
123
+ getHostElement() {
124
+ return this._elementRef.nativeElement;
125
+ }
126
+ _createPlaceChangedObservable() {
127
+ const observable = new Observable(subscriber => {
128
+ if (!this.autoComplete) {
129
+ this._placeChangedPending.push({ observable, subscriber });
130
+ return undefined;
131
+ }
132
+ const listener = this.autoComplete.addListener('place_changed', (event) => {
133
+ this._ngZone.run(() => subscriber.next(event));
134
+ });
135
+ this._listeners.push(listener);
136
+ return () => listener.remove();
137
+ });
138
+ return observable;
139
+ }
140
+ /** Asserts that the map has been initialized. */
141
+ _assertInitialized() {
142
+ if (!this.autoComplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {
143
+ throw Error('Cannot access Google Map Places information before the API has been initialized. ' +
144
+ 'Please wait for the API to load before trying to interact with it.');
145
+ }
146
+ }
147
+ }
148
+ TheSeamGoogleMapsPlacesAutocompleteDirective.decorators = [
149
+ { type: Directive, args: [{
150
+ selector: 'input[seamGoogleMapsPlacesAutocomplete]',
151
+ exportAs: 'seamGoogleMapsPlacesAutocomplete'
152
+ },] }
153
+ ];
154
+ TheSeamGoogleMapsPlacesAutocompleteDirective.ctorParameters = () => [
155
+ { type: ElementRef },
156
+ { type: NgZone }
157
+ ];
158
+ TheSeamGoogleMapsPlacesAutocompleteDirective.propDecorators = {
159
+ options: [{ type: Input }],
160
+ placeChanged: [{ type: Output }],
161
+ _attrType: [{ type: HostBinding, args: ['attr.type',] }]
162
+ };
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vZ29vZ2xlLW1hcHMvZ29vZ2xlLW1hcHMtcGxhY2VzLWF1dG9jb21wbGV0ZS9nb29nbGUtbWFwcy1wbGFjZXMtYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZ0MsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQTtBQUN0SSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUE7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFLckYsTUFBTSxDQUFDLE1BQU0sK0NBQStDLEdBQTJDO0lBQ3JHLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtDQUN6QyxDQUFBO0FBTUQsTUFBTSxPQUFPLDRDQUE0QztJQTRCdkQsWUFDbUIsV0FBeUMsRUFDekMsT0FBZTtRQURmLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBN0JqQiw4QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO1FBQ3pDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUV2Qyx5QkFBb0IsR0FBbUUsRUFBRSxDQUFBO1FBQ3pGLGVBQVUsR0FBb0MsRUFBRSxDQUFBO1FBUWhELGFBQVEsR0FBMkMsK0NBQStDLENBQUE7UUFhaEYsY0FBUyxHQUFHLE1BQU0sQ0FBQTtRQU0xQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUks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SSxVQUFVLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO2dCQUMxRCxPQUFPLFNBQVMsQ0FBQTthQUNqQjtZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQVEsRUFBRSxFQUFFO2dCQUMzRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDaEQsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUU5QixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFFRCxpREFBaUQ7SUFDekMsa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxFQUFFO1lBQ3pFLE1BQU0sS0FBSyxDQUNULG1GQUFtRjtnQkFDakYsb0VBQW9FLENBQ3ZFLENBQUE7U0FDRjtJQUNILENBQUM7OztZQWhNRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlDQUF5QztnQkFDbkQsUUFBUSxFQUFFLGtDQUFrQzthQUM3Qzs7O1lBZG1CLFVBQVU7WUFBc0IsTUFBTTs7O3NCQXdCdkQsS0FBSzsyQkFlTCxNQUFNO3dCQUVOLFdBQVcsU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IGludGVydmFsLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwVG8sIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuZGVjbGFyZSBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW4gfCB1bmRlZmluZWRcbnR5cGUgV2l0aFJlcXVpcmVkPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IFQgJiB7IFtQIGluIEtdLT86IFRbUF0gfVxuXG5leHBvcnQgY29uc3QgU0VBTV9HT09HTEVfUExBQ0VTX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlM6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVPcHRpb25zID0ge1xuICBjb21wb25lbnRSZXN0cmljdGlvbnM6IHsgY291bnRyeTogJ1VTJyB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0W3NlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b2NvbXBsZXRlXScsXG4gIGV4cG9ydEFzOiAnc2VhbUdvb2dsZU1hcHNQbGFjZXNBdXRvY29tcGxldGUnXG59KVxuZXhwb3J0IGNsYXNzIFRoZVNlYW1Hb29nbGVNYXBzUGxhY2VzQXV0b2NvbXBsZXRlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KClcbiAgcHJpdmF0ZSByZWFkb25seSBfbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KClcblxuICBwcml2YXRlIF9wbGFjZUNoYW5nZWRQZW5kaW5nOiB7IG9ic2VydmFibGU6IE9ic2VydmFibGU8YW55Piwgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxhbnk+IH1bXSA9IFtdXG4gIHByaXZhdGUgX2xpc3RlbmVyczogZ29vZ2xlLm1hcHMuTWFwc0V2ZW50TGlzdGVuZXJbXSA9IFtdXG5cbiAgcHVibGljIGF1dG9Db21wbGV0ZT86IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVcblxuICBASW5wdXQoKVxuICBzZXQgb3B0aW9ucyh2YWx1ZTogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlIHx8IFNFQU1fR09PR0xFX1BMQUNFU19BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TXG4gIH1cbiAgcHJpdmF0ZSBfb3B0aW9uczogZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMgPSBTRUFNX0dPT0dMRV9QTEFDRVNfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OU1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBQbGFjZVJlc3VsdCBpcyBtYWRlIGF2YWlsYWJsZSBmb3IgYSBQbGFjZSB0aGVcbiAgICogdXNlciBoYXMgc2VsZWN0ZWQuIElmIHRoZSB1c2VyIGVudGVycyB0aGUgbmFtZSBvZiBhIFBsYWNlIHRoYXQgd2FzIG5vdFxuICAgKiBzdWdnZXN0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHByZXNzZXMgdGhlIEVudGVyIGtleSwgb3IgaWYgYSBQbGFjZSBEZXRhaWxzXG4gICAqIHJlcXVlc3QgZmFpbHMsIHRoZSBQbGFjZVJlc3VsdCBjb250YWlucyB0aGUgdXNlciBpbnB1dCBpbiB0aGUgbmFtZVxuICAgKiBwcm9wZXJ0eSwgd2l0aCBubyBvdGhlciBwcm9wZXJ0aWVzIGRlZmluZWQuXG4gICAqXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3BsYWNlcy13aWRnZXQjQXV0b2NvbXBsZXRlLnBsYWNlX2NoYW5nZWRcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBwbGFjZUNoYW5nZWQ6IE9ic2VydmFibGU8YW55PlxuXG4gIEBIb3N0QmluZGluZygnYXR0ci50eXBlJykgX2F0dHJUeXBlID0gJ3RleHQnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmU6IE5nWm9uZSxcbiAgKSB7XG4gICAgdGhpcy5wbGFjZUNoYW5nZWQgPSB0aGlzLl9hdXRvQ29tcGxldGVSZWFkeVN1YmplY3QucGlwZShcbiAgICAgIHN0YXJ0V2l0aCh1bmRlZmluZWQpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX2NyZWF0ZVBsYWNlQ2hhbmdlZE9ic2VydmFibGU8YW55PigpKVxuICAgIClcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl91bnRpbEdvb2dsZU1hcHNBcGlMb2FkZWQoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZSh0aGlzLmdldEhvc3RFbGVtZW50KCksIHRoaXMuX29wdGlvbnMpXG5cbiAgICAgICAgdGhpcy5fcGxhY2VDaGFuZ2VkUGVuZGluZy5mb3JFYWNoKHBlbmRpbmcgPT4gcGVuZGluZy5vYnNlcnZhYmxlLnN1YnNjcmliZShwZW5kaW5nLnN1YnNjcmliZXIpKVxuXG4gICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZVJlYWR5U3ViamVjdC5uZXh0KClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGwgPT4gbC5yZW1vdmUoKSlcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXVxuXG4gICAgdGhpcy5fbmdVbnN1YnNjcmliZS5uZXh0KClcbiAgICB0aGlzLl9uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvQ29tcGxldGUgJiYgY2hhbmdlc1snb3B0aW9ucyddKSB7XG4gICAgICB0aGlzLmF1dG9Db21wbGV0ZS5zZXRPcHRpb25zKHRoaXMuX29wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW50aWxHb29nbGVNYXBzQXBpTG9hZGVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBpbnRlcnZhbCg1MDApLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gISEod2luZG93Lmdvb2dsZSAmJiB3aW5kb3cuZ29vZ2xlLm1hcHMgJiYgd2luZG93Lmdvb2dsZS5tYXBzLnZlcnNpb24pKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXBUbyh1bmRlZmluZWQpLFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgdG8gd2hpY2ggcHJlZGljdGlvbnMgYXJlIGJpYXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRCb3VuZHMoKTogZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLmdldEJvdW5kcygpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmllbGRzIHRvIGJlIGluY2x1ZGVkIGZvciB0aGUgUGxhY2UgaW4gdGhlIGRldGFpbHMgcmVzcG9uc2VcbiAgICogd2hlbiB0aGUgZGV0YWlscyBhcmUgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4gRm9yIGEgbGlzdCBvZiBmaWVsZHMgc2VlXG4gICAqIFtQbGFjZVJlc3VsdF0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcmVmZXJlbmNlL3BsYWNlcy1zZXJ2aWNlI1BsYWNlUmVzdWx0KS5cbiAgICovXG4gIHB1YmxpYyBnZXRGaWVsZHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICByZXR1cm4gKHRoaXMuYXV0b0NvbXBsZXRlIGFzIGFueSkuZ2V0RmllbGRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZXRhaWxzIG9mIHRoZSBQbGFjZSBzZWxlY3RlZCBieSB1c2VyIGlmIHRoZSBkZXRhaWxzIHdlcmVcbiAgICogc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4gT3RoZXJ3aXNlIHJldHVybnMgYSBzdHViIFBsYWNlIG9iamVjdCwgd2l0aCB0aGVcbiAgICogbmFtZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGZpZWxkLlxuICAgKi9cbiAgcHVibGljIGdldFBsYWNlKCk6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5nZXRQbGFjZSgpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcHJlZmVycmVkIGFyZWEgd2l0aGluIHdoaWNoIHRvIHJldHVybiBQbGFjZSByZXN1bHRzLiBSZXN1bHRzIGFyZVxuICAgKiBiaWFzZWQgdG93YXJkcywgYnV0IG5vdCByZXN0cmljdGVkIHRvLCB0aGlzIGFyZWEuXG4gICAqL1xuICBwdWJsaWMgc2V0Qm91bmRzKGJvdW5kcz86IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcyB8IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kc0xpdGVyYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgpXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICByZXR1cm4gdGhpcy5hdXRvQ29tcGxldGUuc2V0Qm91bmRzKGJvdW5kcyEpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29tcG9uZW50IHJlc3RyaWN0aW9ucy4gQ29tcG9uZW50IHJlc3RyaWN0aW9ucyBhcmUgdXNlZCB0b1xuICAgKiByZXN0cmljdCBwcmVkaWN0aW9ucyB0byBvbmx5IHRob3NlIHdpdGhpbiB0aGUgcGFyZW50IGNvbXBvbmVudC4gRm9yXG4gICAqIGV4YW1wbGUsIHRoZSBjb3VudHJ5LlxuICAgKi9cbiAgcHVibGljIHNldENvbXBvbmVudFJlc3RyaWN0aW9ucyhyZXN0cmljdGlvbnM/OiBnb29nbGUubWFwcy5wbGFjZXMuQ29tcG9uZW50UmVzdHJpY3Rpb25zKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldENvbXBvbmVudFJlc3RyaWN0aW9ucyhyZXN0cmljdGlvbnMhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpZWxkcyB0byBiZSBpbmNsdWRlZCBmb3IgdGhlIFBsYWNlIGluIHRoZSBkZXRhaWxzIHJlc3BvbnNlIHdoZW5cbiAgICogdGhlIGRldGFpbHMgYXJlIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuIEZvciBhIGxpc3Qgb2YgZmllbGRzIHNlZVxuICAgKiBbUGxhY2VSZXN1bHRdKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3JlZmVyZW5jZS9wbGFjZXMtc2VydmljZSNQbGFjZVJlc3VsdCkuXG4gICAqL1xuICBwdWJsaWMgc2V0RmllbGRzKGZpZWxkcz86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldEZpZWxkcyhmaWVsZHMhKVxuICB9XG5cbiAgLyoqICovXG4gIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM/OiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKClcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIHJldHVybiB0aGlzLmF1dG9Db21wbGV0ZS5zZXRPcHRpb25zKG9wdGlvbnMhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHR5cGVzIG9mIHByZWRpY3Rpb25zIHRvIGJlIHJldHVybmVkLiBGb3Igc3VwcG9ydGVkIHR5cGVzLCBzZWUgdGhlXG4gICAqIFtkZXZlbG9wZXIncyBndWlkZV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvcGxhY2VzLWF1dG9jb21wbGV0ZSNjb25zdHJhaW4tcGxhY2UtdHlwZXMpLlxuICAgKiBJZiBubyB0eXBlcyBhcmUgc3BlY2lmaWVkLCBhbGwgdHlwZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBzZXRUeXBlcyh0eXBlcz86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NvbXBsZXRlLnNldFR5cGVzKHR5cGVzISlcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgcHVibGljIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpXG4gIH1cblxuICAvKiogVW5mb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgcHVibGljIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmJsdXIoKVxuICB9XG5cbiAgcHVibGljIGdldEhvc3RFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVBsYWNlQ2hhbmdlZE9ic2VydmFibGU8VD4oKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICAgICAgaWYgKCF0aGlzLmF1dG9Db21wbGV0ZSkge1xuICAgICAgICB0aGlzLl9wbGFjZUNoYW5nZWRQZW5kaW5nLnB1c2goeyBvYnNlcnZhYmxlLCBzdWJzY3JpYmVyIH0pXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5hdXRvQ29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoZXZlbnQ6IFQpID0+IHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiBzdWJzY3JpYmVyLm5leHQoZXZlbnQpKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuXG4gICAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXIucmVtb3ZlKClcbiAgICB9KVxuICAgIHJldHVybiBvYnNlcnZhYmxlXG4gIH1cblxuICAvKiogQXNzZXJ0cyB0aGF0IHRoZSBtYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovXG4gIHByaXZhdGUgX2Fzc2VydEluaXRpYWxpemVkKCk6IGFzc2VydHMgdGhpcyBpcyBXaXRoUmVxdWlyZWQ8VGhlU2VhbUdvb2dsZU1hcHNQbGFjZXNBdXRvY29tcGxldGVEaXJlY3RpdmUsICdhdXRvQ29tcGxldGUnPiB7XG4gICAgaWYgKCF0aGlzLmF1dG9Db21wbGV0ZSAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgYWNjZXNzIEdvb2dsZSBNYXAgUGxhY2VzIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkLiAnICtcbiAgICAgICAgICAnUGxlYXNlIHdhaXQgZm9yIHRoZSBBUEkgdG8gbG9hZCBiZWZvcmUgdHJ5aW5nIHRvIGludGVyYWN0IHdpdGggaXQuJyxcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiJdfQ==