@igo2/geo 18.0.0-next.6 → 18.0.0-next.7

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 (40) hide show
  1. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +1 -1
  2. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +1 -1
  3. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +1 -1
  4. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +1 -1
  5. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +1 -1
  6. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +1 -1
  7. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +1 -1
  8. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +1 -1
  9. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +1 -1
  10. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +1 -1
  11. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +66 -2
  12. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +1 -1
  13. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +7 -5
  14. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +1 -1
  15. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +1 -1
  16. package/esm2022/lib/filter/shared/ogc-filter.mjs +7 -2
  17. package/esm2022/lib/import-export/import-export/import-export.component.mjs +196 -315
  18. package/esm2022/lib/import-export/shared/export.interface.mjs +1 -1
  19. package/esm2022/lib/import-export/shared/export.service.mjs +278 -88
  20. package/esm2022/lib/import-export/shared/export.type.mjs +9 -9
  21. package/esm2022/lib/import-export/shared/export.utils.mjs +5 -1
  22. package/esm2022/lib/layer/shared/layer.service.mjs +1 -1
  23. package/esm2022/lib/layer/shared/layers/image-layer.mjs +1 -1
  24. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +1 -1
  25. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +12 -15
  26. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +1 -1
  27. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +1 -2
  28. package/fesm2022/igo2-geo.mjs +3146 -3008
  29. package/fesm2022/igo2-geo.mjs.map +1 -1
  30. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +15 -0
  31. package/lib/import-export/import-export/import-export.component.d.ts +22 -14
  32. package/lib/import-export/shared/export.interface.d.ts +10 -3
  33. package/lib/import-export/shared/export.service.d.ts +31 -15
  34. package/lib/import-export/shared/export.type.d.ts +8 -16
  35. package/lib/import-export/shared/export.utils.d.ts +2 -0
  36. package/lib/layer/shared/layers/vector-layer.d.ts +0 -3
  37. package/locale/en.geo.json +8 -3
  38. package/locale/fr.geo.json +8 -3
  39. package/package.json +6 -6
  40. package/src/_index.scss +2 -1
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ltcG9ydC1leHBvcnQvc2hhcmVkL2V4cG9ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVuY29kaW5nRm9ybWF0LCBFeHBvcnRGb3JtYXQgfSBmcm9tICcuL2V4cG9ydC50eXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRPcHRpb25zIHtcbiAgZm9ybWF0PzogRXhwb3J0Rm9ybWF0O1xuICBlbmNvZGluZz86IEVuY29kaW5nRm9ybWF0O1xuICBsYXllcnM6IHN0cmluZ1tdO1xuICBsYXllcnNXaXRoU2VsZWN0aW9uPzogc3RyaW5nW107XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGNvbWJpbmVMYXllcnM/OiBib29sZWFuO1xuICBzZXBhcmF0b3I/OiBib29sZWFuO1xuICBmZWF0dXJlSW5NYXBFeHRlbnQ/OiBib29sZWFuO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ltcG9ydC1leHBvcnQvc2hhcmVkL2V4cG9ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEZlYXR1cmUgfSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCB0eXBlIHsgVHlwZSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuXG5pbXBvcnQgeyBBbnlFeHBvcnRGb3JtYXQsIENzdlNlcGFyYXRvciB9IGZyb20gJy4vZXhwb3J0LnR5cGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydE9wdGlvbnMge1xuICBmb3JtYXQ/OiBBbnlFeHBvcnRGb3JtYXQ7XG4gIGxheWVyczogc3RyaW5nW107XG4gIGxheWVyc1dpdGhTZWxlY3Rpb24/OiBzdHJpbmdbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgY29tYmluZUxheWVycz86IGJvb2xlYW47XG4gIHNlcGFyYXRvcj86IGJvb2xlYW47XG4gIGNzdlNlcGFyYXRvcj86IENzdlNlcGFyYXRvcjtcbiAgZmVhdHVyZUluTWFwRXh0ZW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW9tZXRyeUNvbGxlY3Rpb24ge1xuICAvKiogVGhlIGdlb21ldHJ5IHR5cGUgKi9cbiAgdHlwZTogVHlwZSB8IG51bGw7XG4gIGZlYXR1cmVzOiBPbEZlYXR1cmVbXTtcbn1cbiJdfQ==
@@ -1,49 +1,58 @@
1
+ import { HttpClient } from '@angular/common/http';
1
2
  import { Injectable } from '@angular/core';
2
3
  import { ConfigService } from '@igo2/core/config';
3
- import { downloadContent } from '@igo2/utils';
4
+ import { downloadBlob, downloadContent, isIsoDate } from '@igo2/utils';
4
5
  import OlFeature from 'ol/Feature';
5
6
  import * as olformat from 'ol/format';
6
- import { Observable } from 'rxjs';
7
- import { encode } from 'windows-1252';
7
+ import { circular } from 'ol/geom/Polygon';
8
+ import { Observable, catchError, lastValueFrom, of, tap } from 'rxjs';
9
+ import { ClusterDataSource, WFSDataSource } from '../../datasource';
10
+ import { VectorLayer } from '../../layer';
8
11
  import { ExportInvalidFileError, ExportNothingToExportError } from './export.errors';
9
- import { EncodingFormat, ExportFormat } from './export.type';
12
+ import { isCsvExport } from './export.utils';
10
13
  import * as i0 from "@angular/core";
11
14
  import * as i1 from "@igo2/core/config";
15
+ import * as i2 from "@angular/common/http";
12
16
  const SHAPEFILE_FIELD_MAX_LENGHT = 255;
13
17
  export class ExportService {
14
18
  config;
19
+ httpClient;
15
20
  static ogreFormats = {
16
21
  GML: 'gml',
17
22
  GPX: 'gpx',
18
23
  KML: 'kml',
19
24
  Shapefile: 'ESRI Shapefile',
25
+ CSV: 'CSV',
26
+ /** @deprecated use CSV */
20
27
  CSVcomma: 'CSVcomma',
28
+ /** @deprecated use CSV */
21
29
  CSVsemicolon: 'CSVsemicolon'
22
30
  };
23
31
  static noOgreFallbacks = ['GML', 'GPX', 'KML'];
24
32
  ogreUrl;
25
33
  aggregateInComment = true;
26
- constructor(config) {
34
+ constructor(config, httpClient) {
27
35
  this.config = config;
36
+ this.httpClient = httpClient;
28
37
  this.ogreUrl = this.config.getConfig('importExport.url');
29
38
  const gpxAggregateInComment = this.config.getConfig('importExport.gpxAggregateInComment');
30
39
  if (gpxAggregateInComment !== undefined) {
31
40
  this.aggregateInComment = gpxAggregateInComment;
32
41
  }
33
42
  }
34
- export(olFeatures, format, title, encoding, projectionIn = 'EPSG:4326', projectionOut = 'EPSG:4326') {
35
- const exportOlFeatures = this.generateFeature(olFeatures, format, '_featureStore');
36
- return this.exportAsync(exportOlFeatures, format, title, encoding, projectionIn, projectionOut);
43
+ export(olFeatures, options, title, projectionIn = 'EPSG:4326', projectionOut = 'EPSG:4326') {
44
+ const exportOlFeatures = this.cleanFeatures(olFeatures, options.format, '_featureStore');
45
+ return this.exportAsync(exportOlFeatures, options, title, projectionIn, projectionOut);
37
46
  }
38
- generateFeature(olFeatures, format, excludePrefix = '_') {
39
- if (format === ExportFormat.GPX && this.aggregateInComment) {
47
+ cleanFeatures(olFeatures, format, excludePrefix = '_') {
48
+ if (format === 'GPX' && this.aggregateInComment) {
40
49
  return this.generateAggregatedFeature(olFeatures);
41
50
  }
42
51
  return olFeatures.map((olFeature) => {
43
52
  let keys = olFeature
44
53
  .getKeys()
45
54
  .filter((key) => !key.startsWith(excludePrefix));
46
- if (format === ExportFormat.Shapefile && olFeature.get('_style')) {
55
+ if (format === 'Shapefile' && olFeature.get('_style')) {
47
56
  const style = JSON.stringify(olFeature.get('_style'));
48
57
  if (style.length > SHAPEFILE_FIELD_MAX_LENGHT)
49
58
  keys = keys.filter((key) => key !== '_style');
@@ -79,8 +88,9 @@ export class ExportService {
79
88
  return newFeature;
80
89
  });
81
90
  }
82
- exportAsync(olFeatures, format, title, encoding, projectionIn, projectionOut) {
83
- const doExport = (observer) => {
91
+ exportAsync(olFeatures, options, title, projectionIn, projectionOut) {
92
+ const { format } = options;
93
+ return new Observable((observer) => {
84
94
  const nothingToExport = this.nothingToExport(olFeatures, format);
85
95
  if (nothingToExport) {
86
96
  observer.error(new ExportNothingToExportError());
@@ -90,103 +100,164 @@ export class ExportService {
90
100
  if (ogreFormats.indexOf(format) >= 0) {
91
101
  if (!this.ogreUrl) {
92
102
  if (ExportService.noOgreFallbacks.indexOf(format) >= 0) {
93
- this.exportToFile(olFeatures, observer, format, title, projectionIn, projectionOut);
103
+ this.exportToFile(olFeatures, format, title, projectionIn, projectionOut);
104
+ observer.complete();
94
105
  }
95
106
  else {
96
107
  observer.error(new ExportInvalidFileError());
97
108
  }
98
109
  return;
99
110
  }
100
- this.exportWithOgre(olFeatures, observer, format, title, encoding, projectionIn, projectionOut);
111
+ this.exportWithOgre(olFeatures, options, title, projectionIn, projectionOut).subscribe({
112
+ complete: () => observer.complete(),
113
+ error: (error) => observer.error(error)
114
+ });
101
115
  }
102
116
  else {
103
- this.exportToFile(olFeatures, observer, format, title, projectionIn, projectionOut);
117
+ this.exportToFile(olFeatures, format, title, projectionIn, projectionOut);
118
+ observer.complete();
104
119
  }
105
- };
106
- return new Observable(doExport);
120
+ });
121
+ }
122
+ async exportToFile(olFeatures, format, title, projectionIn, projectionOut) {
123
+ const features = this.formatFeatures(olFeatures, format, projectionIn, projectionOut);
124
+ const fileName = `${title}.${format.toLowerCase()}`;
125
+ downloadContent(features, 'attachment/plain;charset=utf-8', fileName);
107
126
  }
108
- exportToFile(olFeatures, observer, format, title, projectionIn, projectionOut) {
109
- const olFormat = new olformat[format]();
110
- const featuresText = olFormat.writeFeatures(olFeatures, {
127
+ formatFeatures(features, format, projectionIn = 'EPSG:4326', projectionOut = 'EPSG:4326') {
128
+ const formatter = this.getFormatter(format);
129
+ const cleanFeatures = this.cleanFeatures(features, format, '_featureStore');
130
+ return formatter.writeFeatures(cleanFeatures, {
111
131
  dataProjection: projectionOut,
112
- featureProjection: projectionIn,
113
- featureType: 'feature',
114
- featureNS: 'http://example.com/feature'
132
+ featureProjection: projectionIn
115
133
  });
116
- const fileName = `${title}.${format.toLowerCase()}`;
117
- downloadContent(featuresText, 'attachment/plain;charset=utf-8', fileName);
118
- observer.complete();
119
134
  }
120
- exportWithOgre(olFeatures, observer, format, title, encodingType, projectionIn, projectionOut) {
121
- let featuresText = new olformat.GeoJSON().writeFeatures(olFeatures, {
135
+ getFormatter(format) {
136
+ switch (format) {
137
+ case 'GPX':
138
+ return new olformat.GPX();
139
+ case 'GML':
140
+ return new olformat.GML();
141
+ case 'KML':
142
+ return new olformat.KML();
143
+ default:
144
+ return new olformat.GeoJSON();
145
+ }
146
+ }
147
+ async exportExcel(map, store, data) {
148
+ const { utils, writeFile } = await import('xlsx');
149
+ const workbook = utils.book_new();
150
+ for (const layerName of data.layers) {
151
+ const layer = map.getLayerById(layerName);
152
+ const features = await lastValueFrom(this.getFeatures(map, layer, data, store));
153
+ const formattedFeatures = features?.length
154
+ ? this.formatFeatures(features, 'GeoJSON')
155
+ : null;
156
+ await this.addExcelSheet(layer.title, formattedFeatures, workbook);
157
+ }
158
+ const title = this.getTitleFromLayers(data.layers, map);
159
+ writeFile(workbook, `${title}.xlsx`, { compression: true });
160
+ }
161
+ getTitleFromLayers(layers, map) {
162
+ return layers.length === 1
163
+ ? this.getLayerTitleFromId(layers[0], map)
164
+ : 'igo';
165
+ }
166
+ getLayerTitleFromId(id, map) {
167
+ const layer = map.getLayerById(id);
168
+ return layer.title;
169
+ }
170
+ async addExcelSheet(title, features, workbook) {
171
+ const { utils } = await import('xlsx');
172
+ const collection = features
173
+ ? JSON.parse(features)
174
+ : {
175
+ features: []
176
+ };
177
+ const rows = collection.features.map((feature) => this.formatRecord(feature.properties));
178
+ const worksheet = utils.json_to_sheet(rows);
179
+ /* calculate column width */
180
+ if (rows?.length) {
181
+ worksheet['!cols'] = this.getColumnsInfo(rows);
182
+ }
183
+ const SHEET_NAME_MAX_LENGTH = 31;
184
+ let sheetName = title.length >= SHEET_NAME_MAX_LENGTH
185
+ ? title.substring(0, SHEET_NAME_MAX_LENGTH)
186
+ : title;
187
+ if (workbook.SheetNames.includes(sheetName)) {
188
+ sheetName = `${sheetName.substring(0, SHEET_NAME_MAX_LENGTH - 3)}_${workbook.SheetNames.length}`;
189
+ }
190
+ utils.book_append_sheet(workbook, worksheet, sheetName);
191
+ }
192
+ formatRecord(record) {
193
+ return Object.entries(record).reduce((formatted, [key, value]) => {
194
+ formatted[key] = this.formatDataType(value);
195
+ return formatted;
196
+ }, {});
197
+ }
198
+ formatDataType(value) {
199
+ switch (true) {
200
+ case typeof value === 'string': {
201
+ if (isIsoDate(value)) {
202
+ return new Date(value).toLocaleString();
203
+ }
204
+ return value;
205
+ }
206
+ case typeof value === 'object':
207
+ case value instanceof Array: {
208
+ return JSON.stringify(value);
209
+ }
210
+ default:
211
+ return value;
212
+ }
213
+ }
214
+ getColumnsInfo(rows) {
215
+ const columns = Object.keys(rows[0]);
216
+ return columns.map((column) => ({
217
+ wch: this.getColumnMaxWidth(column, rows)
218
+ }));
219
+ }
220
+ getColumnMaxWidth(column, rows) {
221
+ return rows.reduce((width, row) => Math.max(width, row[column]?.length ?? 0), column.length);
222
+ }
223
+ exportWithOgre(olFeatures, { format, csvSeparator = null }, title, projectionIn, projectionOut) {
224
+ const featuresText = new olformat.GeoJSON().writeFeatures(olFeatures, {
122
225
  dataProjection: projectionOut,
123
226
  featureProjection: projectionIn
124
227
  });
125
228
  const url = `${this.ogreUrl}/convertJson`;
126
- const form = document.createElement('form');
127
- form.style.display = 'none';
128
- document.body.appendChild(form);
129
- form.setAttribute('method', 'post');
130
- form.setAttribute('target', '_blank');
131
- form.setAttribute('action', url);
132
- if (encodingType === EncodingFormat.UTF8) {
133
- form.acceptCharset = 'UTF-8';
134
- form.enctype = 'application/x-www-form-urlencoded; charset=utf-8;';
135
- }
136
- else if (encodingType === EncodingFormat.LATIN1) {
137
- const enctype = 'ISO-8859-1';
138
- const featuresJson = JSON.parse(featuresText);
139
- featuresJson.features.map((f) => {
140
- const encodedProperties = String.fromCharCode.apply(null, encode(JSON.stringify(f.properties), { mode: 'replacement' }));
141
- f.properties = JSON.parse(encodedProperties);
142
- });
143
- featuresText = JSON.stringify(featuresJson);
144
- const encoding = document.createElement('input');
145
- encoding.setAttribute('type', 'hidden');
146
- encoding.setAttribute('name', 'encoding');
147
- encoding.setAttribute('value', enctype);
148
- form.appendChild(encoding);
149
- }
150
- if (format === 'CSVsemicolon') {
151
- const options = document.createElement('input');
152
- options.setAttribute('type', 'hidden');
153
- options.setAttribute('name', 'lco');
154
- options.setAttribute('value', 'SEPARATOR=SEMICOLON');
155
- form.appendChild(options);
156
- }
157
- const geojsonField = document.createElement('input');
158
- geojsonField.setAttribute('type', 'hidden');
159
- geojsonField.setAttribute('name', 'json');
160
- geojsonField.setAttribute('value', featuresText);
161
- form.appendChild(geojsonField);
162
- const outputNameField = document.createElement('input');
229
+ const formData = new FormData();
230
+ formData.append('json', featuresText);
163
231
  let outputName = format === 'Shapefile'
164
232
  ? `${title}.zip`
165
233
  : `${title}.${format.toLowerCase()}`;
166
- if (format === 'CSVcomma' || format === 'CSVsemicolon') {
234
+ let ogreFormat = ExportService.ogreFormats[format];
235
+ if (isCsvExport(format)) {
167
236
  outputName = `${title}.csv`;
237
+ if (format === 'CSVcomma' || format === 'CSVsemicolon') {
238
+ ogreFormat = 'CSV';
239
+ }
240
+ formData.append('lco', `SEPARATOR=${csvSeparator}`);
241
+ if (format === 'CSVsemicolon') {
242
+ formData.append('lco', `SEPARATOR=${csvSeparator}`);
243
+ }
168
244
  }
169
- outputName = outputName.replace(' ', '_');
170
- outputName = outputName
245
+ formData.append('outputName', this.formatFilename(outputName));
246
+ formData.append('format', ogreFormat);
247
+ return this.httpClient
248
+ .post(url, formData, {
249
+ responseType: 'blob'
250
+ })
251
+ .pipe(tap((value) => {
252
+ downloadBlob(value, outputName);
253
+ }));
254
+ }
255
+ formatFilename(name) {
256
+ return name
257
+ .replaceAll(' ', '_')
171
258
  .normalize('NFD')
172
259
  .replace(/[\u0300-\u036f]/g, '')
173
260
  .replace(/’/g, "'");
174
- outputNameField.setAttribute('type', 'hidden');
175
- outputNameField.setAttribute('name', 'outputName');
176
- outputNameField.setAttribute('value', outputName);
177
- form.appendChild(outputNameField);
178
- let ogreFormat = ExportService.ogreFormats[format];
179
- if (format === 'CSVcomma' || format === 'CSVsemicolon') {
180
- ogreFormat = 'CSV';
181
- }
182
- const outputFormatField = document.createElement('input');
183
- outputFormatField.setAttribute('type', 'hidden');
184
- outputFormatField.setAttribute('name', 'format');
185
- outputFormatField.setAttribute('value', ogreFormat);
186
- form.appendChild(outputFormatField);
187
- form.submit();
188
- document.body.removeChild(form);
189
- observer.complete();
190
261
  }
191
262
  nothingToExport(olFeatures, format) {
192
263
  if (olFeatures.length === 0) {
@@ -200,7 +271,126 @@ export class ExportService {
200
271
  }
201
272
  return false;
202
273
  }
203
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExportService, deps: [{ token: i1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
274
+ getFeaturesFromMap(layer, options) {
275
+ const dataSource = layer.dataSource.ol;
276
+ const extent = layer.map.viewController.getExtent();
277
+ let features = options.featureInMapExtent
278
+ ? dataSource.getFeaturesInExtent(extent)
279
+ : dataSource.getFeatures();
280
+ if (layer.dataSource instanceof ClusterDataSource) {
281
+ features = features.flatMap((cluster) => cluster.get('features'));
282
+ }
283
+ return features;
284
+ }
285
+ getFeaturesFromWorkspace(wks, layerName, data) {
286
+ const hasSelection = data.layersWithSelection.indexOf(layerName) !== -1;
287
+ const isInMapExtent = data.featureInMapExtent;
288
+ if (hasSelection && isInMapExtent) {
289
+ // Only export selected feature && into map extent
290
+ return wks.entityStore.stateView
291
+ .all()
292
+ .filter((e) => e.state.inMapExtent && e.state.selected)
293
+ .map((e) => e.entity.ol);
294
+ }
295
+ else if (hasSelection && !isInMapExtent) {
296
+ // Only export selected feature && (into map extent OR not)
297
+ return wks.entityStore.stateView
298
+ .all()
299
+ .filter((e) => e.state.selected)
300
+ .map((e) => e.entity.ol);
301
+ }
302
+ else if (isInMapExtent) {
303
+ // Only into map extent
304
+ return wks.entityStore.stateView
305
+ .all()
306
+ .filter((e) => e.state.inMapExtent)
307
+ .map((e) => e.entity.ol);
308
+ }
309
+ else {
310
+ // All features
311
+ return wks.entityStore.stateView
312
+ .all()
313
+ .map((e) => e.entity.ol);
314
+ }
315
+ }
316
+ getFeatures(map, layer, data, store) {
317
+ const projection = map.viewController.getOlProjection();
318
+ const extent = data.featureInMapExtent
319
+ ? map.viewController.getExtent()
320
+ : undefined;
321
+ if (layer.dataSource instanceof WFSDataSource) {
322
+ return layer.dataSource
323
+ .fetchFeatures({
324
+ extent,
325
+ projection,
326
+ httpClient: this.httpClient
327
+ })
328
+ .pipe(catchError((e) => {
329
+ throw e;
330
+ }));
331
+ }
332
+ // Filter spatial use external API to make query and use Workspace to store data
333
+ else if (layer.options.workspace?.enabled) {
334
+ const wks = this.getWorkspaceByLayerId(layer.id, store);
335
+ if (wks?.entityStore?.stateView.all().length) {
336
+ const features = this.getFeaturesFromWorkspace(wks, layer.id, data);
337
+ return of(features).pipe(catchError((e) => {
338
+ throw e;
339
+ }));
340
+ }
341
+ }
342
+ else if (layer instanceof VectorLayer) {
343
+ return of(this.getFeaturesFromMap(layer, data));
344
+ }
345
+ return of([]);
346
+ }
347
+ getWorkspaceByLayerId(id, store) {
348
+ const wksFromLayerId = store
349
+ .all()
350
+ .find((workspace) => workspace
351
+ .layer.id === id);
352
+ if (wksFromLayerId) {
353
+ return wksFromLayerId;
354
+ }
355
+ return;
356
+ }
357
+ getGeomTypes(features, format) {
358
+ let geomTypes = [];
359
+ if (format === 'Shapefile' || format === 'GPX') {
360
+ features.forEach((olFeature) => {
361
+ const featureGeomType = olFeature.getGeometry().getType();
362
+ const currentGeomType = geomTypes.find((geomType) => geomType.type === featureGeomType);
363
+ if (currentGeomType) {
364
+ currentGeomType.features.push(olFeature);
365
+ }
366
+ else {
367
+ geomTypes.push({
368
+ type: featureGeomType,
369
+ features: [olFeature]
370
+ });
371
+ }
372
+ });
373
+ }
374
+ else {
375
+ geomTypes = [{ type: null, features: features }];
376
+ }
377
+ geomTypes.forEach((geomType) => {
378
+ geomType.features.forEach((feature) => {
379
+ const radius = feature.get('rad');
380
+ if (radius) {
381
+ const center4326 = [
382
+ feature.get('longitude'),
383
+ feature.get('latitude')
384
+ ];
385
+ const circle = circular(center4326, radius, 500);
386
+ circle.transform('EPSG:4326', feature.get('_projection'));
387
+ feature.setGeometry(circle);
388
+ }
389
+ });
390
+ });
391
+ return geomTypes;
392
+ }
393
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExportService, deps: [{ token: i1.ConfigService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
204
394
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExportService, providedIn: 'root' });
205
395
  }
206
396
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExportService, decorators: [{
@@ -208,5 +398,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
208
398
  args: [{
209
399
  providedIn: 'root'
210
400
  }]
211
- }], ctorParameters: () => [{ type: i1.ConfigService }] });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUd0QyxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRTdELE1BQU0sMEJBQTBCLEdBQUcsR0FBRyxDQUFDO0FBS3ZDLE1BQU0sT0FBTyxhQUFhO0lBZUo7SUFkcEIsTUFBTSxDQUFDLFdBQVcsR0FBRztRQUNuQixHQUFHLEVBQUUsS0FBSztRQUNWLEdBQUcsRUFBRSxLQUFLO1FBQ1YsR0FBRyxFQUFFLEtBQUs7UUFDVixTQUFTLEVBQUUsZ0JBQWdCO1FBQzNCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLFlBQVksRUFBRSxjQUFjO0tBQzdCLENBQUM7SUFFRixNQUFNLENBQUMsZUFBZSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQVM7SUFDaEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRWxDLFlBQW9CLE1B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RU8sZUFBZSxDQUNyQixVQUFtQyxFQUNuQyxNQUFjO1FBRWQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3JCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDaEQsT0FBTyxDQUNMLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FDaEQsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUNsQyxJQUFJLENBQUMsQ0FDUCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFdBQVcsS0FBSyxTQUFTLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzt3R0E3U1UsYUFBYTs0R0FBYixhQUFhLGNBRlosTUFBTTs7NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBkb3dubG9hZENvbnRlbnQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCBPbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgKiBhcyBvbGZvcm1hdCBmcm9tICdvbC9mb3JtYXQnO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGVuY29kZSB9IGZyb20gJ3dpbmRvd3MtMTI1Mic7XG5cbmltcG9ydCB7XG4gIEV4cG9ydEludmFsaWRGaWxlRXJyb3IsXG4gIEV4cG9ydE5vdGhpbmdUb0V4cG9ydEVycm9yXG59IGZyb20gJy4vZXhwb3J0LmVycm9ycyc7XG5pbXBvcnQgeyBFbmNvZGluZ0Zvcm1hdCwgRXhwb3J0Rm9ybWF0IH0gZnJvbSAnLi9leHBvcnQudHlwZSc7XG5cbmNvbnN0IFNIQVBFRklMRV9GSUVMRF9NQVhfTEVOR0hUID0gMjU1O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFeHBvcnRTZXJ2aWNlIHtcbiAgc3RhdGljIG9ncmVGb3JtYXRzID0ge1xuICAgIEdNTDogJ2dtbCcsXG4gICAgR1BYOiAnZ3B4JyxcbiAgICBLTUw6ICdrbWwnLFxuICAgIFNoYXBlZmlsZTogJ0VTUkkgU2hhcGVmaWxlJyxcbiAgICBDU1Zjb21tYTogJ0NTVmNvbW1hJyxcbiAgICBDU1ZzZW1pY29sb246ICdDU1ZzZW1pY29sb24nXG4gIH07XG5cbiAgc3RhdGljIG5vT2dyZUZhbGxiYWNrcyA9IFsnR01MJywgJ0dQWCcsICdLTUwnXTtcblxuICBwcml2YXRlIG9ncmVVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBhZ2dyZWdhdGVJbkNvbW1lbnQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlKSB7XG4gICAgdGhpcy5vZ3JlVXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQudXJsJyk7XG4gICAgY29uc3QgZ3B4QWdncmVnYXRlSW5Db21tZW50ID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydC5ncHhBZ2dyZWdhdGVJbkNvbW1lbnQnXG4gICAgKTtcbiAgICBpZiAoZ3B4QWdncmVnYXRlSW5Db21tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWdncmVnYXRlSW5Db21tZW50ID0gZ3B4QWdncmVnYXRlSW5Db21tZW50O1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydChcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEV4cG9ydEZvcm1hdCxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVuY29kaW5nOiBFbmNvZGluZ0Zvcm1hdCxcbiAgICBwcm9qZWN0aW9uSW4gPSAnRVBTRzo0MzI2JyxcbiAgICBwcm9qZWN0aW9uT3V0ID0gJ0VQU0c6NDMyNidcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZXhwb3J0T2xGZWF0dXJlcyA9IHRoaXMuZ2VuZXJhdGVGZWF0dXJlKFxuICAgICAgb2xGZWF0dXJlcyxcbiAgICAgIGZvcm1hdCxcbiAgICAgICdfZmVhdHVyZVN0b3JlJ1xuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5leHBvcnRBc3luYyhcbiAgICAgIGV4cG9ydE9sRmVhdHVyZXMsXG4gICAgICBmb3JtYXQsXG4gICAgICB0aXRsZSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgcHJvamVjdGlvbk91dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVGZWF0dXJlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIGZvcm1hdDogRXhwb3J0Rm9ybWF0LFxuICAgIGV4Y2x1ZGVQcmVmaXggPSAnXydcbiAgKTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10ge1xuICAgIGlmIChmb3JtYXQgPT09IEV4cG9ydEZvcm1hdC5HUFggJiYgdGhpcy5hZ2dyZWdhdGVJbkNvbW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQWdncmVnYXRlZEZlYXR1cmUob2xGZWF0dXJlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9sRmVhdHVyZXMubWFwKChvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PikgPT4ge1xuICAgICAgbGV0IGtleXMgPSBvbEZlYXR1cmVcbiAgICAgICAgLmdldEtleXMoKVxuICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4gIWtleS5zdGFydHNXaXRoKGV4Y2x1ZGVQcmVmaXgpKTtcblxuICAgICAgaWYgKGZvcm1hdCA9PT0gRXhwb3J0Rm9ybWF0LlNoYXBlZmlsZSAmJiBvbEZlYXR1cmUuZ2V0KCdfc3R5bGUnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IEpTT04uc3RyaW5naWZ5KG9sRmVhdHVyZS5nZXQoJ19zdHlsZScpKTtcbiAgICAgICAgaWYgKHN0eWxlLmxlbmd0aCA+IFNIQVBFRklMRV9GSUVMRF9NQVhfTEVOR0hUKVxuICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfc3R5bGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSBvbEZlYXR1cmUuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFnZ3JlZ2F0ZWRGZWF0dXJlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gb2xGZWF0dXJlXG4gICAgICAgIC5nZXRLZXlzKClcbiAgICAgICAgLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpKTtcbiAgICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG9iamVjdCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGtleSA9PT0gJ2lkJyAmJiBvbEZlYXR1cmUuZ2V0KCdkcmF3JylcbiAgICAgICAgICAgICAgPyAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KCdkcmF3JykgKyAnICAgXFxyXFxuJylcbiAgICAgICAgICAgICAgOiAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KGtleSkgKyAnICAgXFxyXFxuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY1trZXldID0gb2xGZWF0dXJlLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KClcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0ZlYXR1cmUgPSBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgICAgbmV3RmVhdHVyZS5zZXQoJ25hbWUnLCBvbEZlYXR1cmUuZ2V0SWQoKSk7XG4gICAgICBuZXdGZWF0dXJlLnNldCgnY210JywgY29tbWVudCk7XG5cbiAgICAgIHJldHVybiBuZXdGZWF0dXJlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRBc3luYyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEV4cG9ydEZvcm1hdCxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVuY29kaW5nOiBFbmNvZGluZ0Zvcm1hdCxcbiAgICBwcm9qZWN0aW9uSW46IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uT3V0OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZG9FeHBvcnQgPSAob2JzZXJ2ZXI6IE9ic2VydmVyPHZvaWQ+KSA9PiB7XG4gICAgICBjb25zdCBub3RoaW5nVG9FeHBvcnQgPSB0aGlzLm5vdGhpbmdUb0V4cG9ydChvbEZlYXR1cmVzLCBmb3JtYXQpO1xuICAgICAgaWYgKG5vdGhpbmdUb0V4cG9ydCkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXhwb3J0Tm90aGluZ1RvRXhwb3J0RXJyb3IoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2dyZUZvcm1hdHMgPSBPYmplY3Qua2V5cyhFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzKTtcbiAgICAgIGlmIChvZ3JlRm9ybWF0cy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICBpZiAoIXRoaXMub2dyZVVybCkge1xuICAgICAgICAgIGlmIChFeHBvcnRTZXJ2aWNlLm5vT2dyZUZhbGxiYWNrcy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoXG4gICAgICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgICAgIG9ic2VydmVyLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sXG4gICAgICAgICAgICAgIHByb2plY3Rpb25PdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFeHBvcnRJbnZhbGlkRmlsZUVycm9yKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBvcnRXaXRoT2dyZShcbiAgICAgICAgICBvbEZlYXR1cmVzLFxuICAgICAgICAgIG9ic2VydmVyLFxuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICBwcm9qZWN0aW9uSW4sXG4gICAgICAgICAgcHJvamVjdGlvbk91dFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoXG4gICAgICAgICAgb2xGZWF0dXJlcyxcbiAgICAgICAgICBvYnNlcnZlcixcbiAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgICAgIHByb2plY3Rpb25PdXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGRvRXhwb3J0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHBvcnRUb0ZpbGUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyPHZvaWQ+LFxuICAgIGZvcm1hdDogRXhwb3J0Rm9ybWF0LFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbk91dDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG9sRm9ybWF0ID0gbmV3IG9sZm9ybWF0W2Zvcm1hdF0oKTtcbiAgICBjb25zdCBmZWF0dXJlc1RleHQgPSBvbEZvcm1hdC53cml0ZUZlYXR1cmVzKG9sRmVhdHVyZXMsIHtcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBwcm9qZWN0aW9uT3V0LFxuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb25JbixcbiAgICAgIGZlYXR1cmVUeXBlOiAnZmVhdHVyZScsXG4gICAgICBmZWF0dXJlTlM6ICdodHRwOi8vZXhhbXBsZS5jb20vZmVhdHVyZSdcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7dGl0bGV9LiR7Zm9ybWF0LnRvTG93ZXJDYXNlKCl9YDtcblxuICAgIGRvd25sb2FkQ29udGVudChmZWF0dXJlc1RleHQsICdhdHRhY2htZW50L3BsYWluO2NoYXJzZXQ9dXRmLTgnLCBmaWxlTmFtZSk7XG4gICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwb3J0V2l0aE9ncmUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgb2JzZXJ2ZXI6IE9ic2VydmVyPHZvaWQ+LFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZW5jb2RpbmdUeXBlOiBFbmNvZGluZ0Zvcm1hdCxcbiAgICBwcm9qZWN0aW9uSW46IHN0cmluZyxcbiAgICBwcm9qZWN0aW9uT3V0OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGZlYXR1cmVzVGV4dDogc3RyaW5nID0gbmV3IG9sZm9ybWF0Lkdlb0pTT04oKS53cml0ZUZlYXR1cmVzKFxuICAgICAgb2xGZWF0dXJlcyxcbiAgICAgIHtcbiAgICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25PdXQsXG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiBwcm9qZWN0aW9uSW5cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vZ3JlVXJsfS9jb252ZXJ0SnNvbmA7XG4gICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZSgnbWV0aG9kJywgJ3Bvc3QnKTtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCB1cmwpO1xuXG4gICAgaWYgKGVuY29kaW5nVHlwZSA9PT0gRW5jb2RpbmdGb3JtYXQuVVRGOCkge1xuICAgICAgZm9ybS5hY2NlcHRDaGFyc2V0ID0gJ1VURi04JztcbiAgICAgIGZvcm0uZW5jdHlwZSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTg7JztcbiAgICB9IGVsc2UgaWYgKGVuY29kaW5nVHlwZSA9PT0gRW5jb2RpbmdGb3JtYXQuTEFUSU4xKSB7XG4gICAgICBjb25zdCBlbmN0eXBlID0gJ0lTTy04ODU5LTEnO1xuICAgICAgY29uc3QgZmVhdHVyZXNKc29uID0gSlNPTi5wYXJzZShmZWF0dXJlc1RleHQpO1xuICAgICAgZmVhdHVyZXNKc29uLmZlYXR1cmVzLm1hcCgoZikgPT4ge1xuICAgICAgICBjb25zdCBlbmNvZGVkUHJvcGVydGllcyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBlbmNvZGUoSlNPTi5zdHJpbmdpZnkoZi5wcm9wZXJ0aWVzKSwgeyBtb2RlOiAncmVwbGFjZW1lbnQnIH0pXG4gICAgICAgICk7XG4gICAgICAgIGYucHJvcGVydGllcyA9IEpTT04ucGFyc2UoZW5jb2RlZFByb3BlcnRpZXMpO1xuICAgICAgfSk7XG4gICAgICBmZWF0dXJlc1RleHQgPSBKU09OLnN0cmluZ2lmeShmZWF0dXJlc0pzb24pO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgZW5jb2Rpbmcuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2hpZGRlbicpO1xuICAgICAgZW5jb2Rpbmcuc2V0QXR0cmlidXRlKCduYW1lJywgJ2VuY29kaW5nJyk7XG4gICAgICBlbmNvZGluZy5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgZW5jdHlwZSk7XG4gICAgICBmb3JtLmFwcGVuZENoaWxkKGVuY29kaW5nKTtcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0ID09PSAnQ1NWc2VtaWNvbG9uJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBvcHRpb25zLnNldEF0dHJpYnV0ZSgndHlwZScsICdoaWRkZW4nKTtcbiAgICAgIG9wdGlvbnMuc2V0QXR0cmlidXRlKCduYW1lJywgJ2xjbycpO1xuICAgICAgb3B0aW9ucy5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgJ1NFUEFSQVRPUj1TRU1JQ09MT04nKTtcbiAgICAgIGZvcm0uYXBwZW5kQ2hpbGQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvanNvbkZpZWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBnZW9qc29uRmllbGQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2hpZGRlbicpO1xuICAgIGdlb2pzb25GaWVsZC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnanNvbicpO1xuICAgIGdlb2pzb25GaWVsZC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgZmVhdHVyZXNUZXh0KTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKGdlb2pzb25GaWVsZCk7XG5cbiAgICBjb25zdCBvdXRwdXROYW1lRmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGxldCBvdXRwdXROYW1lID1cbiAgICAgIGZvcm1hdCA9PT0gJ1NoYXBlZmlsZSdcbiAgICAgICAgPyBgJHt0aXRsZX0uemlwYFxuICAgICAgICA6IGAke3RpdGxlfS4ke2Zvcm1hdC50b0xvd2VyQ2FzZSgpfWA7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ0NTVmNvbW1hJyB8fCBmb3JtYXQgPT09ICdDU1ZzZW1pY29sb24nKSB7XG4gICAgICBvdXRwdXROYW1lID0gYCR7dGl0bGV9LmNzdmA7XG4gICAgfVxuICAgIG91dHB1dE5hbWUgPSBvdXRwdXROYW1lLnJlcGxhY2UoJyAnLCAnXycpO1xuICAgIG91dHB1dE5hbWUgPSBvdXRwdXROYW1lXG4gICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKVxuICAgICAgLnJlcGxhY2UoL+KAmS9nLCBcIidcIik7XG4gICAgb3V0cHV0TmFtZUZpZWxkLnNldEF0dHJpYnV0ZSgndHlwZScsICdoaWRkZW4nKTtcbiAgICBvdXRwdXROYW1lRmllbGQuc2V0QXR0cmlidXRlKCduYW1lJywgJ291dHB1dE5hbWUnKTtcbiAgICBvdXRwdXROYW1lRmllbGQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG91dHB1dE5hbWUpO1xuICAgIGZvcm0uYXBwZW5kQ2hpbGQob3V0cHV0TmFtZUZpZWxkKTtcblxuICAgIGxldCBvZ3JlRm9ybWF0ID0gRXhwb3J0U2VydmljZS5vZ3JlRm9ybWF0c1tmb3JtYXRdO1xuICAgIGlmIChmb3JtYXQgPT09ICdDU1Zjb21tYScgfHwgZm9ybWF0ID09PSAnQ1NWc2VtaWNvbG9uJykge1xuICAgICAgb2dyZUZvcm1hdCA9ICdDU1YnO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRGb3JtYXRGaWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgb3V0cHV0Rm9ybWF0RmllbGQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2hpZGRlbicpO1xuICAgIG91dHB1dEZvcm1hdEZpZWxkLnNldEF0dHJpYnV0ZSgnbmFtZScsICdmb3JtYXQnKTtcbiAgICBvdXRwdXRGb3JtYXRGaWVsZC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgb2dyZUZvcm1hdCk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChvdXRwdXRGb3JtYXRGaWVsZCk7XG5cbiAgICBmb3JtLnN1Ym1pdCgpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZm9ybSk7XG5cbiAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RoaW5nVG9FeHBvcnQoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgZm9ybWF0OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG9sRmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGNvbnN0IHBvaW50T3JMaW5lID0gb2xGZWF0dXJlcy5maW5kKChvbEZlYXR1cmUpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBbJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJ10uaW5kZXhPZihcbiAgICAgICAgICAgIG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKVxuICAgICAgICAgICkgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcG9pbnRPckxpbmUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
401
+ }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.HttpClient }] });
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXZFLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFFLFVBQVUsRUFBWSxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBWSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPcEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUd6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFN0MsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFLdkMsTUFBTSxPQUFPLGFBQWE7SUFtQmQ7SUFDQTtJQW5CVixNQUFNLENBQUMsV0FBVyxHQUFxQztRQUNyRCxHQUFHLEVBQUUsS0FBSztRQUNWLEdBQUcsRUFBRSxLQUFLO1FBQ1YsR0FBRyxFQUFFLEtB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LENBQUM7UUFDbkQsQ0FBQztRQUVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3QixRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNwQyxNQUFNLE1BQU0sR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE1BQU0sVUFBVSxHQUFrQjt3QkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7d0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO3FCQUN4QixDQUFDO29CQUNGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNqRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQzFELE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzt3R0F4aUJVLGFBQWE7NEdBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW50aXR5UmVjb3JkIH0gZnJvbSAnQGlnbzIvY29tbW9uL2VudGl0eSc7XG5pbXBvcnQgeyBXb3Jrc3BhY2UsIFdvcmtzcGFjZVN0b3JlIH0gZnJvbSAnQGlnbzIvY29tbW9uL3dvcmtzcGFjZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgZG93bmxvYWRCbG9iLCBkb3dubG9hZENvbnRlbnQsIGlzSXNvRGF0ZSB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IE9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCAqIGFzIG9sZm9ybWF0IGZyb20gJ29sL2Zvcm1hdCc7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IHsgY2lyY3VsYXIgfSBmcm9tICdvbC9nZW9tL1BvbHlnb24nO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJ2dlb2pzb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIGNhdGNoRXJyb3IsIGxhc3RWYWx1ZUZyb20sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB0eXBlIHsgQ29sSW5mbywgV29ya0Jvb2sgfSBmcm9tICd4bHN4JztcblxuaW1wb3J0IHsgQ2x1c3RlckRhdGFTb3VyY2UsIFdGU0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlJztcbmltcG9ydCB7IEZlYXR1cmUgfSBmcm9tICcuLi8uLi9mZWF0dXJlJztcbmltcG9ydCB7IEFueUxheWVyLCBWZWN0b3JMYXllciB9IGZyb20gJy4uLy4uL2xheWVyJztcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcCc7XG5pbXBvcnQge1xuICBFZGl0aW9uV29ya3NwYWNlLFxuICBGZWF0dXJlV29ya3NwYWNlLFxuICBXZnNXb3Jrc3BhY2Vcbn0gZnJvbSAnLi4vLi4vd29ya3NwYWNlJztcbmltcG9ydCB7XG4gIEV4cG9ydEludmFsaWRGaWxlRXJyb3IsXG4gIEV4cG9ydE5vdGhpbmdUb0V4cG9ydEVycm9yXG59IGZyb20gJy4vZXhwb3J0LmVycm9ycyc7XG5pbXBvcnQgeyBFeHBvcnRPcHRpb25zLCBHZW9tZXRyeUNvbGxlY3Rpb24gfSBmcm9tICcuL2V4cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQW55RXhwb3J0Rm9ybWF0LCBFeHBvcnRPZ3JlRm9ybWF0IH0gZnJvbSAnLi9leHBvcnQudHlwZSc7XG5pbXBvcnQgeyBpc0NzdkV4cG9ydCB9IGZyb20gJy4vZXhwb3J0LnV0aWxzJztcblxuY29uc3QgU0hBUEVGSUxFX0ZJRUxEX01BWF9MRU5HSFQgPSAyNTU7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2Uge1xuICBzdGF0aWMgb2dyZUZvcm1hdHM6IFJlY29yZDxFeHBvcnRPZ3JlRm9ybWF0LCBzdHJpbmc+ID0ge1xuICAgIEdNTDogJ2dtbCcsXG4gICAgR1BYOiAnZ3B4JyxcbiAgICBLTUw6ICdrbWwnLFxuICAgIFNoYXBlZmlsZTogJ0VTUkkgU2hhcGVmaWxlJyxcbiAgICBDU1Y6ICdDU1YnLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgQ1NWICovXG4gICAgQ1NWY29tbWE6ICdDU1Zjb21tYScsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBDU1YgKi9cbiAgICBDU1ZzZW1pY29sb246ICdDU1ZzZW1pY29sb24nXG4gIH07XG5cbiAgc3RhdGljIG5vT2dyZUZhbGxiYWNrczogUGFydGlhbDxBbnlFeHBvcnRGb3JtYXRbXT4gPSBbJ0dNTCcsICdHUFgnLCAnS01MJ107XG5cbiAgcHJpdmF0ZSBvZ3JlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgYWdncmVnYXRlSW5Db21tZW50ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy5vZ3JlVXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdpbXBvcnRFeHBvcnQudXJsJyk7XG4gICAgY29uc3QgZ3B4QWdncmVnYXRlSW5Db21tZW50ID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKFxuICAgICAgJ2ltcG9ydEV4cG9ydC5ncHhBZ2dyZWdhdGVJbkNvbW1lbnQnXG4gICAgKTtcbiAgICBpZiAoZ3B4QWdncmVnYXRlSW5Db21tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWdncmVnYXRlSW5Db21tZW50ID0gZ3B4QWdncmVnYXRlSW5Db21tZW50O1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydChcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluID0gJ0VQU0c6NDMyNicsXG4gICAgcHJvamVjdGlvbk91dCA9ICdFUFNHOjQzMjYnXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IGV4cG9ydE9sRmVhdHVyZXMgPSB0aGlzLmNsZWFuRmVhdHVyZXMoXG4gICAgICBvbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucy5mb3JtYXQsXG4gICAgICAnX2ZlYXR1cmVTdG9yZSdcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0QXN5bmMoXG4gICAgICBleHBvcnRPbEZlYXR1cmVzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHRpdGxlLFxuICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgcHJvamVjdGlvbk91dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW5GZWF0dXJlcyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEFueUV4cG9ydEZvcm1hdCxcbiAgICBleGNsdWRlUHJlZml4ID0gJ18nXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICBpZiAoZm9ybWF0ID09PSAnR1BYJyAmJiB0aGlzLmFnZ3JlZ2F0ZUluQ29tbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBZ2dyZWdhdGVkRmVhdHVyZShvbEZlYXR1cmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBsZXQga2V5cyA9IG9sRmVhdHVyZVxuICAgICAgICAuZ2V0S2V5cygpXG4gICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiAha2V5LnN0YXJ0c1dpdGgoZXhjbHVkZVByZWZpeCkpO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnU2hhcGVmaWxlJyAmJiBvbEZlYXR1cmUuZ2V0KCdfc3R5bGUnKSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IEpTT04uc3RyaW5naWZ5KG9sRmVhdHVyZS5nZXQoJ19zdHlsZScpKTtcbiAgICAgICAgaWYgKHN0eWxlLmxlbmd0aCA+IFNIQVBFRklMRV9GSUVMRF9NQVhfTEVOR0hUKVxuICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdfc3R5bGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAoYWNjOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYWNjW2tleV0gPSBvbEZlYXR1cmUuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFnZ3JlZ2F0ZWRGZWF0dXJlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdXG4gICk6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdIHtcbiAgICByZXR1cm4gb2xGZWF0dXJlcy5tYXAoKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gb2xGZWF0dXJlXG4gICAgICAgIC5nZXRLZXlzKClcbiAgICAgICAgLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+ICFrZXkuc3RhcnRzV2l0aCgnXycpKTtcbiAgICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG9iamVjdCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICYmIGtleSAhPT0gJ2dlb21ldHJ5Jykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGtleSA9PT0gJ2lkJyAmJiBvbEZlYXR1cmUuZ2V0KCdkcmF3JylcbiAgICAgICAgICAgICAgPyAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KCdkcmF3JykgKyAnICAgXFxyXFxuJylcbiAgICAgICAgICAgICAgOiAoY29tbWVudCArPSBrZXkgKyAnOicgKyBvbEZlYXR1cmUuZ2V0KGtleSkgKyAnICAgXFxyXFxuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY1trZXldID0gb2xGZWF0dXJlLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBnZW9tZXRyeTogb2xGZWF0dXJlLmdldEdlb21ldHJ5KClcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0ZlYXR1cmUgPSBuZXcgT2xGZWF0dXJlKHByb3BlcnRpZXMpO1xuICAgICAgbmV3RmVhdHVyZS5zZXQoJ25hbWUnLCBvbEZlYXR1cmUuZ2V0SWQoKSk7XG4gICAgICBuZXdGZWF0dXJlLnNldCgnY210JywgY29tbWVudCk7XG5cbiAgICAgIHJldHVybiBuZXdGZWF0dXJlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRBc3luYyhcbiAgICBvbEZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBvcHRpb25zOiBFeHBvcnRPcHRpb25zLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbk91dDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHsgZm9ybWF0IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPHZvaWQ+KSA9PiB7XG4gICAgICBjb25zdCBub3RoaW5nVG9FeHBvcnQgPSB0aGlzLm5vdGhpbmdUb0V4cG9ydChvbEZlYXR1cmVzLCBmb3JtYXQpO1xuICAgICAgaWYgKG5vdGhpbmdUb0V4cG9ydCkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXhwb3J0Tm90aGluZ1RvRXhwb3J0RXJyb3IoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2dyZUZvcm1hdHMgPSBPYmplY3Qua2V5cyhFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzKTtcbiAgICAgIGlmIChvZ3JlRm9ybWF0cy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICBpZiAoIXRoaXMub2dyZVVybCkge1xuICAgICAgICAgIGlmIChFeHBvcnRTZXJ2aWNlLm5vT2dyZUZhbGxiYWNrcy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5leHBvcnRUb0ZpbGUoXG4gICAgICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIHByb2plY3Rpb25JbixcbiAgICAgICAgICAgICAgcHJvamVjdGlvbk91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFeHBvcnRJbnZhbGlkRmlsZUVycm9yKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leHBvcnRXaXRoT2dyZShcbiAgICAgICAgICBvbEZlYXR1cmVzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgcHJvamVjdGlvbkluLFxuICAgICAgICAgIHByb2plY3Rpb25PdXRcbiAgICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IG9ic2VydmVyLmVycm9yKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXhwb3J0VG9GaWxlKFxuICAgICAgICAgIG9sRmVhdHVyZXMsXG4gICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHByb2plY3Rpb25JbixcbiAgICAgICAgICBwcm9qZWN0aW9uT3V0XG4gICAgICAgICk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZXhwb3J0VG9GaWxlKFxuICAgIG9sRmVhdHVyZXM6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PltdLFxuICAgIGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0LFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbkluOiBzdHJpbmcsXG4gICAgcHJvamVjdGlvbk91dDogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5mb3JtYXRGZWF0dXJlcyhcbiAgICAgIG9sRmVhdHVyZXMsXG4gICAgICBmb3JtYXQsXG4gICAgICBwcm9qZWN0aW9uSW4sXG4gICAgICBwcm9qZWN0aW9uT3V0XG4gICAgKTtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7dGl0bGV9LiR7Zm9ybWF0LnRvTG93ZXJDYXNlKCl9YDtcbiAgICBkb3dubG9hZENvbnRlbnQoZmVhdHVyZXMsICdhdHRhY2htZW50L3BsYWluO2NoYXJzZXQ9dXRmLTgnLCBmaWxlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEZlYXR1cmVzKFxuICAgIGZlYXR1cmVzOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT5bXSxcbiAgICBmb3JtYXQ6IEFueUV4cG9ydEZvcm1hdCxcbiAgICBwcm9qZWN0aW9uSW4gPSAnRVBTRzo0MzI2JyxcbiAgICBwcm9qZWN0aW9uT3V0ID0gJ0VQU0c6NDMyNidcbiAgKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gdGhpcy5nZXRGb3JtYXR0ZXIoZm9ybWF0KTtcbiAgICBjb25zdCBjbGVhbkZlYXR1cmVzID0gdGhpcy5jbGVhbkZlYXR1cmVzKGZlYXR1cmVzLCBmb3JtYXQsICdfZmVhdHVyZVN0b3JlJyk7XG4gICAgcmV0dXJuIGZvcm1hdHRlci53cml0ZUZlYXR1cmVzKGNsZWFuRmVhdHVyZXMsIHtcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBwcm9qZWN0aW9uT3V0LFxuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb25JblxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Rm9ybWF0dGVyKGZvcm1hdDogQW55RXhwb3J0Rm9ybWF0KSB7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ0dQWCc6XG4gICAgICAgIHJldHVybiBuZXcgb2xmb3JtYXQuR1BYKCk7XG4gICAgICBjYXNlICdHTUwnOlxuICAgICAgICByZXR1cm4gbmV3IG9sZm9ybWF0LkdNTCgpO1xuICAgICAgY2FzZSAnS01MJzpcbiAgICAgICAgcmV0dXJuIG5ldyBvbGZvcm1hdC5LTUwoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgb2xmb3JtYXQuR2VvSlNPTigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEV4Y2VsKG1hcDogSWdvTWFwLCBzdG9yZTogV29ya3NwYWNlU3RvcmUsIGRhdGE6IEV4cG9ydE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHV0aWxzLCB3cml0ZUZpbGUgfSA9IGF3YWl0IGltcG9ydCgneGxzeCcpO1xuXG4gICAgY29uc3Qgd29ya2Jvb2sgPSB1dGlscy5ib29rX25ldygpO1xuXG4gICAgZm9yIChjb25zdCBsYXllck5hbWUgb2YgZGF0YS5sYXllcnMpIHtcbiAgICAgIGNvbnN0IGxheWVyID0gbWFwLmdldExheWVyQnlJZChsYXllck5hbWUpO1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmdldEZlYXR1cmVzKG1hcCwgbGF5ZXIsIGRhdGEsIHN0b3JlKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZm9ybWF0dGVkRmVhdHVyZXMgPSBmZWF0dXJlcz8ubGVuZ3RoXG4gICAgICAgID8gdGhpcy5mb3JtYXRGZWF0dXJlcyhmZWF0dXJlcywgJ0dlb0pTT04nKVxuICAgICAgICA6IG51bGw7XG4gICAgICBhd2FpdCB0aGlzLmFkZEV4Y2VsU2hlZXQobGF5ZXIudGl0bGUsIGZvcm1hdHRlZEZlYXR1cmVzLCB3b3JrYm9vayk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLmdldFRpdGxlRnJvbUxheWVycyhkYXRhLmxheWVycywgbWFwKTtcbiAgICB3cml0ZUZpbGUod29ya2Jvb2ssIGAke3RpdGxlfS54bHN4YCwgeyBjb21wcmVzc2lvbjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGl0bGVGcm9tTGF5ZXJzKGxheWVyczogc3RyaW5nW10sIG1hcDogSWdvTWFwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGF5ZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgPyB0aGlzLmdldExheWVyVGl0bGVGcm9tSWQobGF5ZXJzWzBdLCBtYXApXG4gICAgICA6ICdpZ28nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXllclRpdGxlRnJvbUlkKGlkOiBzdHJpbmcsIG1hcDogSWdvTWFwKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXllciA9IG1hcC5nZXRMYXllckJ5SWQoaWQpO1xuICAgIHJldHVybiBsYXllci50aXRsZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkRXhjZWxTaGVldChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZlYXR1cmVzOiBzdHJpbmcgfCBudWxsLFxuICAgIHdvcmtib29rOiBXb3JrQm9va1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHV0aWxzIH0gPSBhd2FpdCBpbXBvcnQoJ3hsc3gnKTtcblxuICAgIGNvbnN0IGNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uID0gZmVhdHVyZXNcbiAgICAgID8gSlNPTi5wYXJzZShmZWF0dXJlcylcbiAgICAgIDoge1xuICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgIGNvbnN0IHJvd3MgPSBjb2xsZWN0aW9uLmZlYXR1cmVzLm1hcCgoZmVhdHVyZSkgPT5cbiAgICAgIHRoaXMuZm9ybWF0UmVjb3JkKGZlYXR1cmUucHJvcGVydGllcylcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0ID0gdXRpbHMuanNvbl90b19zaGVldChyb3dzKTtcblxuICAgIC8qIGNhbGN1bGF0ZSBjb2x1bW4gd2lkdGggKi9cbiAgICBpZiAocm93cz8ubGVuZ3RoKSB7XG4gICAgICB3b3Jrc2hlZXRbJyFjb2xzJ10gPSB0aGlzLmdldENvbHVtbnNJbmZvKHJvd3MpO1xuICAgIH1cblxuICAgIGNvbnN0IFNIRUVUX05BTUVfTUFYX0xFTkdUSCA9IDMxO1xuICAgIGxldCBzaGVldE5hbWUgPVxuICAgICAgdGl0bGUubGVuZ3RoID49IFNIRUVUX05BTUVfTUFYX0xFTkdUSFxuICAgICAgICA/IHRpdGxlLnN1YnN0cmluZygwLCBTSEVFVF9OQU1FX01BWF9MRU5HVEgpXG4gICAgICAgIDogdGl0bGU7XG5cbiAgICBpZiAod29ya2Jvb2suU2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE5hbWUpKSB7XG4gICAgICBzaGVldE5hbWUgPSBgJHtzaGVldE5hbWUuc3Vic3RyaW5nKDAsIFNIRUVUX05BTUVfTUFYX0xFTkdUSCAtIDMpfV8ke3dvcmtib29rLlNoZWV0TmFtZXMubGVuZ3RofWA7XG4gICAgfVxuXG4gICAgdXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHdvcmtzaGVldCwgc2hlZXROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZWNvcmQpLnJlZHVjZSgoZm9ybWF0dGVkLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGZvcm1hdHRlZFtrZXldID0gdGhpcy5mb3JtYXREYXRhVHlwZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0YVR5cGUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoaXNJc29EYXRlKHZhbHVlIGFzIHN0cmluZykpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgY2FzZSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnOlxuICAgICAgY2FzZSB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5OiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5zSW5mbyhyb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBDb2xJbmZvW10ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dzWzBdKTtcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIHdjaDogdGhpcy5nZXRDb2x1bW5NYXhXaWR0aChjb2x1bW4sIHJvd3MpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5NYXhXaWR0aChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93cy5yZWR1Y2UoXG4gICAgICAod2lkdGgsIHJvdykgPT4gTWF0aC5tYXgod2lkdGgsIHJvd1tjb2x1bW5dPy5sZW5ndGggPz8gMCksXG4gICAgICBjb2x1bW4ubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwb3J0V2l0aE9ncmUoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgeyBmb3JtYXQsIGNzdlNlcGFyYXRvciA9IG51bGwgfTogRXhwb3J0T3B0aW9ucyxcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHByb2plY3Rpb25Jbjogc3RyaW5nLFxuICAgIHByb2plY3Rpb25PdXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmZWF0dXJlc1RleHQgPSBuZXcgb2xmb3JtYXQuR2VvSlNPTigpLndyaXRlRmVhdHVyZXMob2xGZWF0dXJlcywge1xuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25PdXQsXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbkluXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vZ3JlVXJsfS9jb252ZXJ0SnNvbmA7XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgZm9ybURhdGEuYXBwZW5kKCdqc29uJywgZmVhdHVyZXNUZXh0KTtcblxuICAgIGxldCBvdXRwdXROYW1lID1cbiAgICAgIGZvcm1hdCA9PT0gJ1NoYXBlZmlsZSdcbiAgICAgICAgPyBgJHt0aXRsZX0uemlwYFxuICAgICAgICA6IGAke3RpdGxlfS4ke2Zvcm1hdC50b0xvd2VyQ2FzZSgpfWA7XG4gICAgbGV0IG9ncmVGb3JtYXQgPSBFeHBvcnRTZXJ2aWNlLm9ncmVGb3JtYXRzW2Zvcm1hdF07XG5cbiAgICBpZiAoaXNDc3ZFeHBvcnQoZm9ybWF0KSkge1xuICAgICAgb3V0cHV0TmFtZSA9IGAke3RpdGxlfS5jc3ZgO1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnQ1NWY29tbWEnIHx8IGZvcm1hdCA9PT0gJ0NTVnNlbWljb2xvbicpIHtcbiAgICAgICAgb2dyZUZvcm1hdCA9ICdDU1YnO1xuICAgICAgfVxuXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2xjbycsIGBTRVBBUkFUT1I9JHtjc3ZTZXBhcmF0b3J9YCk7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdDU1ZzZW1pY29sb24nKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbGNvJywgYFNFUEFSQVRPUj0ke2NzdlNlcGFyYXRvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ291dHB1dE5hbWUnLCB0aGlzLmZvcm1hdEZpbGVuYW1lKG91dHB1dE5hbWUpKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2Zvcm1hdCcsIG9ncmVGb3JtYXQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QodXJsLCBmb3JtRGF0YSwge1xuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgZG93bmxvYWRCbG9iKHZhbHVlLCBvdXRwdXROYW1lKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC5yZXBsYWNlQWxsKCcgJywgJ18nKVxuICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJylcbiAgICAgIC5yZXBsYWNlKC/igJkvZywgXCInXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RoaW5nVG9FeHBvcnQoXG4gICAgb2xGZWF0dXJlczogT2xGZWF0dXJlPE9sR2VvbWV0cnk+W10sXG4gICAgZm9ybWF0OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG9sRmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGNvbnN0IHBvaW50T3JMaW5lID0gb2xGZWF0dXJlcy5maW5kKChvbEZlYXR1cmUpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBbJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJ10uaW5kZXhPZihcbiAgICAgICAgICAgIG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKVxuICAgICAgICAgICkgPj0gMFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcG9pbnRPckxpbmUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21NYXAoXG4gICAgbGF5ZXI6IFZlY3RvckxheWVyLFxuICAgIG9wdGlvbnM6IEV4cG9ydE9wdGlvbnNcbiAgKTogT2xGZWF0dXJlW10ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBsYXllci5kYXRhU291cmNlLm9sO1xuICAgIGNvbnN0IGV4dGVudCA9IGxheWVyLm1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKTtcblxuICAgIGxldCBmZWF0dXJlczogT2xGZWF0dXJlW10gPSBvcHRpb25zLmZlYXR1cmVJbk1hcEV4dGVudFxuICAgICAgPyBkYXRhU291cmNlLmdldEZlYXR1cmVzSW5FeHRlbnQoZXh0ZW50KVxuICAgICAgOiBkYXRhU291cmNlLmdldEZlYXR1cmVzKCk7XG5cbiAgICBpZiAobGF5ZXIuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIENsdXN0ZXJEYXRhU291cmNlKSB7XG4gICAgICBmZWF0dXJlcyA9IGZlYXR1cmVzLmZsYXRNYXAoKGNsdXN0ZXIpID0+IGNsdXN0ZXIuZ2V0KCdmZWF0dXJlcycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGZWF0dXJlc0Zyb21Xb3Jrc3BhY2UoXG4gICAgd2tzOiBXb3Jrc3BhY2UsXG4gICAgbGF5ZXJOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9uc1xuICApOiBPbEZlYXR1cmVbXSB7XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uID0gZGF0YS5sYXllcnNXaXRoU2VsZWN0aW9uLmluZGV4T2YobGF5ZXJOYW1lKSAhPT0gLTE7XG4gICAgY29uc3QgaXNJbk1hcEV4dGVudCA9IGRhdGEuZmVhdHVyZUluTWFwRXh0ZW50O1xuICAgIGlmIChoYXNTZWxlY3Rpb24gJiYgaXNJbk1hcEV4dGVudCkge1xuICAgICAgLy8gT25seSBleHBvcnQgc2VsZWN0ZWQgZmVhdHVyZSAmJiBpbnRvIG1hcCBleHRlbnRcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChlOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gZS5zdGF0ZS5pbk1hcEV4dGVudCAmJiBlLnN0YXRlLnNlbGVjdGVkXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZSkgPT4gKGUuZW50aXR5IGFzIEZlYXR1cmUpLm9sIGFzIE9sRmVhdHVyZSk7XG4gICAgfSBlbHNlIGlmIChoYXNTZWxlY3Rpb24gJiYgIWlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgZXhwb3J0IHNlbGVjdGVkIGZlYXR1cmUgJiYgIChpbnRvIG1hcCBleHRlbnQgT1Igbm90KVxuICAgICAgcmV0dXJuIHdrcy5lbnRpdHlTdG9yZS5zdGF0ZVZpZXdcbiAgICAgICAgLmFsbCgpXG4gICAgICAgIC5maWx0ZXIoKGU6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PiBlLnN0YXRlLnNlbGVjdGVkKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9IGVsc2UgaWYgKGlzSW5NYXBFeHRlbnQpIHtcbiAgICAgIC8vIE9ubHkgaW50byBtYXAgZXh0ZW50XG4gICAgICByZXR1cm4gd2tzLmVudGl0eVN0b3JlLnN0YXRlVmlld1xuICAgICAgICAuYWxsKClcbiAgICAgICAgLmZpbHRlcigoZTogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IGUuc3RhdGUuaW5NYXBFeHRlbnQpXG4gICAgICAgIC5tYXAoKGUpID0+IChlLmVudGl0eSBhcyBGZWF0dXJlKS5vbCBhcyBPbEZlYXR1cmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbGwgZmVhdHVyZXNcbiAgICAgIHJldHVybiB3a3MuZW50aXR5U3RvcmUuc3RhdGVWaWV3XG4gICAgICAgIC5hbGwoKVxuICAgICAgICAubWFwKChlKSA9PiAoZS5lbnRpdHkgYXMgRmVhdHVyZSkub2wgYXMgT2xGZWF0dXJlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGZWF0dXJlcyhcbiAgICBtYXA6IElnb01hcCxcbiAgICBsYXllcjogQW55TGF5ZXIsXG4gICAgZGF0YTogRXhwb3J0T3B0aW9ucyxcbiAgICBzdG9yZTogV29ya3NwYWNlU3RvcmVcbiAgKTogT2JzZXJ2YWJsZTxPbEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCk7XG4gICAgY29uc3QgZXh0ZW50ID0gZGF0YS5mZWF0dXJlSW5NYXBFeHRlbnRcbiAgICAgID8gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChsYXllci5kYXRhU291cmNlIGluc3RhbmNlb2YgV0ZTRGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGxheWVyLmRhdGFTb3VyY2VcbiAgICAgICAgLmZldGNoRmVhdHVyZXMoe1xuICAgICAgICAgIGV4dGVudCxcbiAgICAgICAgICBwcm9qZWN0aW9uLFxuICAgICAgICAgIGh0dHBDbGllbnQ6IHRoaXMuaHR0cENsaWVudFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIEZpbHRlciBzcGF0aWFsIHVzZSBleHRlcm5hbCBBUEkgdG8gbWFrZSBxdWVyeSBhbmQgdXNlIFdvcmtzcGFjZSB0byBzdG9yZSBkYXRhXG4gICAgZWxzZSBpZiAobGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHdrcyA9IHRoaXMuZ2V0V29ya3NwYWNlQnlMYXllcklkKGxheWVyLmlkLCBzdG9yZSk7XG4gICAgICBpZiAod2tzPy5lbnRpdHlTdG9yZT8uc3RhdGVWaWV3LmFsbCgpLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RmVhdHVyZXNGcm9tV29ya3NwYWNlKHdrcywgbGF5ZXIuaWQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gb2YoZmVhdHVyZXMpLnBpcGUoXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGF5ZXIgaW5zdGFuY2VvZiBWZWN0b3JMYXllcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0RmVhdHVyZXNGcm9tTWFwKGxheWVyLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKFtdKTtcbiAgfVxuXG4gIGdldFdvcmtzcGFjZUJ5TGF5ZXJJZChpZDogc3RyaW5nLCBzdG9yZTogV29ya3NwYWNlU3RvcmUpOiBXb3Jrc3BhY2Uge1xuICAgIGNvbnN0IHdrc0Zyb21MYXllcklkID0gc3RvcmVcbiAgICAgIC5hbGwoKVxuICAgICAgLmZpbmQoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgKHdvcmtzcGFjZSBhcyBXZnNXb3Jrc3BhY2UgfCBGZWF0dXJlV29ya3NwYWNlIHwgRWRpdGlvbldvcmtzcGFjZSlcbiAgICAgICAgICAgIC5sYXllci5pZCA9PT0gaWRcbiAgICAgICk7XG4gICAgaWYgKHdrc0Zyb21MYXllcklkKSB7XG4gICAgICByZXR1cm4gd2tzRnJvbUxheWVySWQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldEdlb21UeXBlcyhcbiAgICBmZWF0dXJlczogT2xGZWF0dXJlW10sXG4gICAgZm9ybWF0PzogQW55RXhwb3J0Rm9ybWF0XG4gICk6IEdlb21ldHJ5Q29sbGVjdGlvbltdIHtcbiAgICBsZXQgZ2VvbVR5cGVzOiBHZW9tZXRyeUNvbGxlY3Rpb25bXSA9IFtdO1xuICAgIGlmIChmb3JtYXQgPT09ICdTaGFwZWZpbGUnIHx8IGZvcm1hdCA9PT0gJ0dQWCcpIHtcbiAgICAgIGZlYXR1cmVzLmZvckVhY2goKG9sRmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCBmZWF0dXJlR2VvbVR5cGUgPSBvbEZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRUeXBlKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRHZW9tVHlwZSA9IGdlb21UeXBlcy5maW5kKFxuICAgICAgICAgIChnZW9tVHlwZSkgPT4gZ2VvbVR5cGUudHlwZSA9PT0gZmVhdHVyZUdlb21UeXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXJyZW50R2VvbVR5cGUpIHtcbiAgICAgICAgICBjdXJyZW50R2VvbVR5cGUuZmVhdHVyZXMucHVzaChvbEZlYXR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdlb21UeXBlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGZlYXR1cmVHZW9tVHlwZSxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbb2xGZWF0dXJlXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VvbVR5cGVzID0gW3sgdHlwZTogbnVsbCwgZmVhdHVyZXM6IGZlYXR1cmVzIH1dO1xuICAgIH1cblxuICAgIGdlb21UeXBlcy5mb3JFYWNoKChnZW9tVHlwZSkgPT4ge1xuICAgICAgZ2VvbVR5cGUuZmVhdHVyZXMuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xuICAgICAgICBjb25zdCByYWRpdXM6IG51bWJlciA9IGZlYXR1cmUuZ2V0KCdyYWQnKTtcbiAgICAgICAgaWYgKHJhZGl1cykge1xuICAgICAgICAgIGNvbnN0IGNlbnRlcjQzMjY6IEFycmF5PG51bWJlcj4gPSBbXG4gICAgICAgICAgICBmZWF0dXJlLmdldCgnbG9uZ2l0dWRlJyksXG4gICAgICAgICAgICBmZWF0dXJlLmdldCgnbGF0aXR1ZGUnKVxuICAgICAgICAgIF07XG4gICAgICAgICAgY29uc3QgY2lyY2xlID0gY2lyY3VsYXIoY2VudGVyNDMyNiwgcmFkaXVzLCA1MDApO1xuICAgICAgICAgIGNpcmNsZS50cmFuc2Zvcm0oJ0VQU0c6NDMyNicsIGZlYXR1cmUuZ2V0KCdfcHJvamVjdGlvbicpKTtcbiAgICAgICAgICBmZWF0dXJlLnNldEdlb21ldHJ5KGNpcmNsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdlb21UeXBlcztcbiAgfVxufVxuIl19
@@ -1,13 +1,13 @@
1
- import { strEnum } from '@igo2/utils';
2
- export const ExportFormat = strEnum([
3
- 'URL',
1
+ export const ExportFormat = [
4
2
  'GeoJSON',
3
+ 'Excel',
4
+ 'Shapefile',
5
5
  'GML',
6
6
  'GPX',
7
7
  'KML',
8
- 'Shapefile',
9
- 'CSVcomma',
10
- 'CSVsemicolon'
11
- ]);
12
- export const EncodingFormat = strEnum(['UTF8', 'LATIN1']);
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUM7SUFDbEMsS0FBSztJQUNMLFNBQVM7SUFDVCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxXQUFXO0lBQ1gsVUFBVTtJQUNWLGNBQWM7Q0FDZixDQUFDLENBQUM7QUFHSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdHJFbnVtIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgRXhwb3J0Rm9ybWF0ID0gc3RyRW51bShbXG4gICdVUkwnLFxuICAnR2VvSlNPTicsXG4gICdHTUwnLFxuICAnR1BYJyxcbiAgJ0tNTCcsXG4gICdTaGFwZWZpbGUnLFxuICAnQ1NWY29tbWEnLFxuICAnQ1NWc2VtaWNvbG9uJ1xuXSk7XG5leHBvcnQgdHlwZSBFeHBvcnRGb3JtYXQgPSBrZXlvZiB0eXBlb2YgRXhwb3J0Rm9ybWF0O1xuXG5leHBvcnQgY29uc3QgRW5jb2RpbmdGb3JtYXQgPSBzdHJFbnVtKFsnVVRGOCcsICdMQVRJTjEnXSk7XG5leHBvcnQgdHlwZSBFbmNvZGluZ0Zvcm1hdCA9IGtleW9mIHR5cGVvZiBFbmNvZGluZ0Zvcm1hdDtcbiJdfQ==
8
+ 'CSV',
9
+ 'URL'
10
+ ];
11
+ export const ExportFormatLegacy = ['CSVcomma', 'CSVsemicolon'];
12
+ export const CsvSeparator = ['auto', 'comma', 'semicolon'];
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9pbXBvcnQtZXhwb3J0L3NoYXJlZC9leHBvcnQudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7Q0FDRyxDQUFDO0FBR1gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFVLENBQUM7QUFHeEUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEFueUV4cG9ydEZvcm1hdCA9IEV4cG9ydEZvcm1hdCB8IEV4cG9ydEZvcm1hdExlZ2FjeTtcblxuZXhwb3J0IGNvbnN0IEV4cG9ydEZvcm1hdCA9IFtcbiAgJ0dlb0pTT04nLFxuICAnRXhjZWwnLFxuICAnU2hhcGVmaWxlJyxcbiAgJ0dNTCcsXG4gICdHUFgnLFxuICAnS01MJyxcbiAgJ0NTVicsXG4gICdVUkwnXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRXhwb3J0Rm9ybWF0ID0gKHR5cGVvZiBFeHBvcnRGb3JtYXQpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBFeHBvcnRGb3JtYXRMZWdhY3kgPSBbJ0NTVmNvbW1hJywgJ0NTVnNlbWljb2xvbiddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRXhwb3J0Rm9ybWF0TGVnYWN5ID0gKHR5cGVvZiBFeHBvcnRGb3JtYXRMZWdhY3kpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBDc3ZTZXBhcmF0b3IgPSBbJ2F1dG8nLCAnY29tbWEnLCAnc2VtaWNvbG9uJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDc3ZTZXBhcmF0b3IgPSAodHlwZW9mIENzdlNlcGFyYXRvcilbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgRXhwb3J0T2dyZUZvcm1hdCA9IEV4dHJhY3Q8XG4gIEFueUV4cG9ydEZvcm1hdCxcbiAgJ0dNTCcgfCAnR1BYJyB8ICdLTUwnIHwgJ1NoYXBlZmlsZScgfCAnQ1NWY29tbWEnIHwgJ0NTVnNlbWljb2xvbicgfCAnQ1NWJ1xuPjtcbiJdfQ==