@geoit/ui 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
2
  import GeoJSON from 'ol/format/GeoJSON';
3
+ import LayerGroup from 'ol/layer/Group';
3
4
  import TileLayer from 'ol/layer/Tile';
4
5
  import VectorLayer from 'ol/layer/Vector';
5
6
  import OSM from 'ol/source/OSM';
@@ -10,6 +11,7 @@ import WMTS from 'ol/source/WMTS';
10
11
  import WMTSTileGrid from 'ol/tilegrid/WMTS';
11
12
  import { get as getProjection } from 'ol/proj';
12
13
  import { getTopLeft, getWidth } from 'ol/extent';
14
+ import { apply as applyMapboxStyle } from 'ol-mapbox-style';
13
15
  import { GEO_MAP_BASEMAP_LAYER_ID } from '../geo-map.constants';
14
16
  import { GeoMapProjectionService } from './geo-map-projection.service';
15
17
  import * as i0 from "@angular/core";
@@ -44,6 +46,22 @@ export class GeoMapLayerService {
44
46
  };
45
47
  return this.createLayer(config);
46
48
  }
49
+ if (basemap.type === 'mapbox-style') {
50
+ const config = {
51
+ id: GEO_MAP_BASEMAP_LAYER_ID,
52
+ title: basemap.title ?? 'Mapbox style basemap',
53
+ type: 'mapbox-style',
54
+ styleJson: basemap.styleJson,
55
+ styleUrl: basemap.styleUrl,
56
+ transformRequest: basemap.transformRequest,
57
+ visible: true,
58
+ opacity: 1,
59
+ zIndex: 0,
60
+ basemap: true,
61
+ group: 'base-map',
62
+ };
63
+ return this.createLayer(config);
64
+ }
47
65
  const config = {
48
66
  id: GEO_MAP_BASEMAP_LAYER_ID,
49
67
  title: basemap.title ?? 'XYZ basemap',
@@ -83,6 +101,9 @@ export class GeoMapLayerService {
83
101
  case 'vector':
84
102
  layer = this.createVectorLayer(config);
85
103
  break;
104
+ case 'mapbox-style':
105
+ layer = this.createMapboxStyleLayer(config);
106
+ break;
86
107
  default: {
87
108
  const _exhaustive = config;
88
109
  throw new Error(`Unsupported layer type: ${JSON.stringify(_exhaustive)}`);
@@ -138,6 +159,10 @@ export class GeoMapLayerService {
138
159
  previous.dataProjection !== next.dataProjection);
139
160
  case 'vector':
140
161
  return previous.features !== next.features;
162
+ case 'mapbox-style':
163
+ return (previous.styleUrl !== next.styleUrl ||
164
+ JSON.stringify(previous.styleJson) !==
165
+ JSON.stringify(next.styleJson));
141
166
  default:
142
167
  return true;
143
168
  }
@@ -207,6 +232,9 @@ export class GeoMapLayerService {
207
232
  if (config.type === 'geojson' && config.data == null) {
208
233
  throw new Error(`GeoJSON layer "${config.id}" is missing data.`);
209
234
  }
235
+ if (config.type === 'mapbox-style' && !config.styleJson && !config.styleUrl?.trim()) {
236
+ throw new Error(`Mapbox-style layer "${config.id}" requires styleJson or styleUrl.`);
237
+ }
210
238
  }
211
239
  applyCommonOptions(layer, config) {
212
240
  layer.set(LAYER_ID_KEY, config.id);
@@ -359,10 +387,30 @@ export class GeoMapLayerService {
359
387
  });
360
388
  return new VectorLayer({ source });
361
389
  }
390
+ createMapboxStyleLayer(config) {
391
+ const group = new LayerGroup({ layers: [] });
392
+ const styleInput = config.styleJson ?? config.styleUrl;
393
+ if (!styleInput) {
394
+ throw new Error(`Mapbox-style layer "${config.id}" is missing styleJson/styleUrl.`);
395
+ }
396
+ applyMapboxStyle(group, styleInput, { transformRequest: config.transformRequest })
397
+ .then(() => {
398
+ this.runtime.set(config.id, { id: config.id, status: 'ready' });
399
+ })
400
+ .catch((err) => {
401
+ console.error(`[GeoMapLayerService] Mapbox style apply error "${config.id}"`, err);
402
+ this.runtime.set(config.id, {
403
+ id: config.id,
404
+ status: 'error',
405
+ errorMessage: 'Không áp được style bản đồ nền.',
406
+ });
407
+ });
408
+ return group;
409
+ }
362
410
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
363
411
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayerService });
364
412
  }
365
413
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayerService, decorators: [{
366
414
  type: Injectable
367
415
  }] });
368
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1sYXllci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9zZXJ2aWNlcy9nZW8tbWFwLWxheWVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFHeEMsT0FBTyxTQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUN4QyxPQUFPLFlBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFaEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEMsT0FBTyxZQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7O0FBRXZFLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQztBQUNsQyxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUM7QUFRM0M7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNaLFVBQVUs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QztZQUNILE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNoRCxjQUFjO2dCQUNkLGlCQUFpQjthQUNsQixDQUF3QixDQUFDO1lBQzFCLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUErQjtRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQztZQUM5QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFO1NBQ2hDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7d0dBL1hVLGtCQUFrQjs0R0FBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcbmltcG9ydCBHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCB0eXBlIEdlb21ldHJ5IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgQmFzZUxheWVyIGZyb20gJ29sL2xheWVyL0Jhc2UnO1xuaW1wb3J0IFRpbGVMYXllciBmcm9tICdvbC9sYXllci9UaWxlJztcbmltcG9ydCBWZWN0b3JMYXllciBmcm9tICdvbC9sYXllci9WZWN0b3InO1xuaW1wb3J0IE9TTSBmcm9tICdvbC9zb3VyY2UvT1NNJztcbmltcG9ydCBUaWxlV01TIGZyb20gJ29sL3NvdXJjZS9UaWxlV01TJztcbmltcG9ydCBWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XG5pbXBvcnQgWFlaIGZyb20gJ29sL3NvdXJjZS9YWVonO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0aW9uTGlrZSB9IGZyb20gJ29sL3Byb2onO1xuaW1wb3J0IFdNVFMgZnJvbSAnb2wvc291cmNlL1dNVFMnO1xuaW1wb3J0IFdNVFNUaWxlR3JpZCBmcm9tICdvbC90aWxlZ3JpZC9XTVRTJztcbmltcG9ydCB7IGdldCBhcyBnZXRQcm9qZWN0aW9uIH0gZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgeyBnZXRUb3BMZWZ0LCBnZXRXaWR0aCB9IGZyb20gJ29sL2V4dGVudCc7XG5pbXBvcnQgeyBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQgfSBmcm9tICcuLi9nZW8tbWFwLmNvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdlb01hcEJhc2VtYXBJbnB1dCxcbiAgR2VvTWFwR2VvSnNvbkxheWVyQ29uZmlnLFxuICBHZW9NYXBMYXllckNvbmZpZyxcbiAgR2VvTWFwTGF5ZXJSdW50aW1lU3RhdGUsXG4gIEdlb01hcE9zbUxheWVyQ29uZmlnLFxuICBHZW9NYXBWZWN0b3JMYXllckNvbmZpZyxcbiAgR2VvTWFwV21zTGF5ZXJDb25maWcsXG4gIEdlb01hcFdtdHNMYXllckNvbmZpZyxcbiAgR2VvTWFwWHl6TGF5ZXJDb25maWcsXG59IGZyb20gJy4uL2dlby1tYXAudHlwZXMnO1xuaW1wb3J0IHsgR2VvTWFwUHJvamVjdGlvblNlcnZpY2UgfSBmcm9tICcuL2dlby1tYXAtcHJvamVjdGlvbi5zZXJ2aWNlJztcblxuY29uc3QgTEFZRVJfSURfS0VZID0gJ2dlb0xheWVySWQnO1xuY29uc3QgTEFZRVJfQkFTRU1BUF9LRVkgPSAnZ2VvQmFzZW1hcCc7XG5jb25zdCBMQVlFUl9HUk9VUF9LRVkgPSAnZ2VvR3JvdXAnO1xuY29uc3QgTEFZRVJfUVVFUllBQkxFX0tFWSA9ICdnZW9RdWVyeWFibGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZWRNYXBMYXllciB7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbmZpZzogR2VvTWFwTGF5ZXJDb25maWc7XG4gIGxheWVyOiBCYXNlTGF5ZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIGFuZCBpbmNyZW1lbnRhbGx5IHBhdGNoZXMgT3BlbkxheWVycyBsYXllcnMgZnJvbSB0eXBlZCBjb25maWdzLlxuICogVmlzaWJpbGl0eSAvIG9wYWNpdHkgdXBkYXRlcyBtdXN0IG5vdCByZWNyZWF0ZSBzb3VyY2VzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR2VvTWFwTGF5ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0aW9uID0gaW5qZWN0KEdlb01hcFByb2plY3Rpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lID0gbmV3IE1hcDxzdHJpbmcsIEdlb01hcExheWVyUnVudGltZVN0YXRlPigpO1xuXG4gIGdldFJ1bnRpbWVTdGF0ZShsYXllcklkOiBzdHJpbmcpOiBHZW9NYXBMYXllclJ1bnRpbWVTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZS5nZXQobGF5ZXJJZCk7XG4gIH1cblxuICBnZXRBbGxSdW50aW1lU3RhdGVzKCk6IEdlb01hcExheWVyUnVudGltZVN0YXRlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5ydW50aW1lLnZhbHVlcygpXTtcbiAgfVxuXG4gIGNyZWF0ZUZyb21CYXNlbWFwSW5wdXQoYmFzZW1hcDogR2VvTWFwQmFzZW1hcElucHV0KTogQ3JlYXRlZE1hcExheWVyIHtcbiAgICBpZiAoYmFzZW1hcCA9PT0gJ29zbScpIHtcbiAgICAgIGNvbnN0IGNvbmZpZzogR2VvTWFwT3NtTGF5ZXJDb25maWcgPSB7XG4gICAgICAgIGlkOiBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQsXG4gICAgICAgIHRpdGxlOiAnT3BlblN0cmVldE1hcCcsXG4gICAgICAgIHR5cGU6ICdvc20nLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgIGJhc2VtYXA6IHRydWUsXG4gICAgICAgIGdyb3VwOiAnYmFzZS1tYXAnLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxheWVyKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBHZW9NYXBYeXpMYXllckNvbmZpZyA9IHtcbiAgICAgIGlkOiBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQsXG4gICAgICB0aXRsZTogYmFzZW1hcC50aXRsZSA/PyAnWFlaIGJhc2VtYXAnLFxuICAgICAgdHlwZTogJ3h5eicsXG4gICAgICB1cmw6IGJhc2VtYXAudXJsLFxuICAgICAgYXR0cmlidXRpb25zOiBiYXNlbWFwLmF0dHJpYnV0aW9ucyxcbiAgICAgIG1heFpvb206IGJhc2VtYXAubWF4Wm9vbSxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgekluZGV4OiAwLFxuICAgICAgYmFzZW1hcDogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnYmFzZS1tYXAnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTGF5ZXIoY29uZmlnKTtcbiAgfVxuXG4gIGNyZWF0ZUxheWVyKGNvbmZpZzogR2VvTWFwTGF5ZXJDb25maWcpOiBDcmVhdGVkTWFwTGF5ZXIge1xuICAgIHRoaXMucnVudGltZS5zZXQoY29uZmlnLmlkLCB7IGlkOiBjb25maWcuaWQsIHN0YXR1czogJ2xvYWRpbmcnIH0pO1xuXG4gICAgbGV0IGxheWVyOiBCYXNlTGF5ZXI7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnb3NtJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlT3NtTGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneHl6JzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlWHl6TGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd21zJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlV21zTGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd210cyc6XG4gICAgICAgICAgbGF5ZXIgPSB0aGlzLmNyZWF0ZVdtdHNMYXllcihjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdnZW9qc29uJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlR2VvSnNvbkxheWVyKGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgICAgICAgbGF5ZXIgPSB0aGlzLmNyZWF0ZVZlY3RvckxheWVyKGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBjb25maWc7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsYXllciB0eXBlOiAke0pTT04uc3RyaW5naWZ5KF9leGhhdXN0aXZlKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5hcHBseUNvbW1vbk9wdGlvbnMobGF5ZXIsIGNvbmZpZyk7XG4gICAgICB0aGlzLndpcmVTb3VyY2VTdGF0dXMoY29uZmlnLmlkLCBsYXllcik7XG4gICAgICB0aGlzLnJ1bnRpbWUuc2V0KGNvbmZpZy5pZCwgeyBpZDogY29uZmlnLmlkLCBzdGF0dXM6ICdyZWFkeScgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgY29uc29sZS5lcnJvcihgW0dlb01hcExheWVyU2VydmljZV0gRmFpbGVkIHRvIGNyZWF0ZSBsYXllciBcIiR7Y29uZmlnLmlkfVwiYCwgZXJyKTtcbiAgICAgIHRoaXMucnVudGltZS5zZXQoY29uZmlnLmlkLCB7XG4gICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICAvLyBQbGFjZWhvbGRlciBpbnZpc2libGUgbGF5ZXIgc28gY2FsbGVycyBjYW4gc3RpbGwgdHJhY2sgaWRcbiAgICAgIGxheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICAgICAgc291cmNlOiBuZXcgVmVjdG9yU291cmNlKCksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5Q29tbW9uT3B0aW9ucyhsYXllciwgeyAuLi5jb25maWcsIHZpc2libGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlkOiBjb25maWcuaWQsIGNvbmZpZywgbGF5ZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB2aXNpYmlsaXR5L29wYWNpdHkvekluZGV4IHdpdGhvdXQgcmVjcmVhdGluZyB0aGUgT0wgbGF5ZXIuXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHN0cnVjdHVyYWwgZmllbGRzIGNoYW5nZWQgYW5kIHRoZSBsYXllciBzaG91bGQgYmUgcmVjcmVhdGVkLlxuICAgKi9cbiAgbmVlZHNSZWNyZWF0ZShwcmV2aW91czogR2VvTWFwTGF5ZXJDb25maWcsIG5leHQ6IEdlb01hcExheWVyQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXZpb3VzLnR5cGUgIT09IG5leHQudHlwZSB8fCBwcmV2aW91cy5pZCAhPT0gbmV4dC5pZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHN3aXRjaCAobmV4dC50eXBlKSB7XG4gICAgICBjYXNlICdvc20nOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICd4eXonOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBYeXpMYXllckNvbmZpZykudXJsICE9PSBuZXh0LnVybCB8fFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBYeXpMYXllckNvbmZpZykubWF4Wm9vbSAhPT0gbmV4dC5tYXhab29tXG4gICAgICAgICk7XG4gICAgICBjYXNlICd3bXMnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBXbXNMYXllckNvbmZpZykudXJsICE9PSBuZXh0LnVybCB8fFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KChwcmV2aW91cyBhcyBHZW9NYXBXbXNMYXllckNvbmZpZykucGFyYW1zKSAhPT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHQucGFyYW1zKSB8fFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBXbXNMYXllckNvbmZpZykubGF5ZXJOYW1lICE9PSBuZXh0LmxheWVyTmFtZVxuICAgICAgICApO1xuICAgICAgY2FzZSAnd210cyc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFdtdHNMYXllckNvbmZpZykudXJsICE9PSBuZXh0LnVybCB8fFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBXbXRzTGF5ZXJDb25maWcpLmxheWVyICE9PSBuZXh0LmxheWVyIHx8XG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFdtdHNMYXllckNvbmZpZykubWF0cml4U2V0ICE9PSBuZXh0Lm1hdHJpeFNldFxuICAgICAgICApO1xuICAgICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoKHByZXZpb3VzIGFzIEdlb01hcEdlb0pzb25MYXllckNvbmZpZykuZGF0YSkgIT09XG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuZXh0LmRhdGEpIHx8XG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcEdlb0pzb25MYXllckNvbmZpZykuZGF0YVByb2plY3Rpb24gIT09IG5leHQuZGF0YVByb2plY3Rpb25cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgICAgIHJldHVybiAocHJldmlvdXMgYXMgR2VvTWFwVmVjdG9yTGF5ZXJDb25maWcpLmZlYXR1cmVzICE9PSBuZXh0LmZlYXR1cmVzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcGF0Y2hMYXllcihsYXllcjogQmFzZUxheWVyLCBjb25maWc6IEdlb01hcExheWVyQ29uZmlnKTogdm9pZCB7XG4gICAgbGF5ZXIuc2V0VmlzaWJsZShjb25maWcudmlzaWJsZSA/PyB0cnVlKTtcbiAgICBsYXllci5zZXRPcGFjaXR5KGNvbmZpZy5vcGFjaXR5ID8/IDEpO1xuICAgIGlmIChjb25maWcuekluZGV4ICE9IG51bGwpIHtcbiAgICAgIGxheWVyLnNldFpJbmRleChjb25maWcuekluZGV4KTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5taW5ab29tICE9IG51bGwpIHtcbiAgICAgIGxheWVyLnNldE1pblpvb20oY29uZmlnLm1pblpvb20pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLm1heFpvb20gIT0gbnVsbCkge1xuICAgICAgbGF5ZXIuc2V0TWF4Wm9vbShjb25maWcubWF4Wm9vbSk7XG4gICAgfVxuICAgIGxheWVyLnNldChMQVlFUl9CQVNFTUFQX0tFWSwgISFjb25maWcuYmFzZW1hcCk7XG4gICAgbGF5ZXIuc2V0KExBWUVSX0dST1VQX0tFWSwgY29uZmlnLmdyb3VwID8/ICcnKTtcbiAgICBsYXllci5zZXQoTEFZRVJfUVVFUllBQkxFX0tFWSwgISFjb25maWcucXVlcnlhYmxlKTtcbiAgfVxuXG4gIHNldFZpc2libGUobGF5ZXI6IEJhc2VMYXllciwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGxheWVyLnNldFZpc2libGUodmlzaWJsZSk7XG4gIH1cblxuICBzZXRPcGFjaXR5KGxheWVyOiBCYXNlTGF5ZXIsIG9wYWNpdHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcGFjaXR5KSk7XG4gICAgbGF5ZXIuc2V0T3BhY2l0eShjbGFtcGVkKTtcbiAgfVxuXG4gIGdldExheWVySWQobGF5ZXI6IEJhc2VMYXllcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaWQgPSBsYXllci5nZXQoTEFZRVJfSURfS0VZKTtcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGlkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNCYXNlbWFwKGxheWVyOiBCYXNlTGF5ZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFsYXllci5nZXQoTEFZRVJfQkFTRU1BUF9LRVkpO1xuICB9XG5cbiAgcmVzb2x2ZUJhc2VtYXBFeGNsdXNpdmUoXG4gICAgbGF5ZXJzOiBDcmVhdGVkTWFwTGF5ZXJbXSxcbiAgICBhY3RpdmVCYXNlbWFwSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGxheWVycykge1xuICAgICAgaWYgKCFpdGVtLmNvbmZpZy5iYXNlbWFwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmlzaWJsZSA9IGl0ZW0uaWQgPT09IGFjdGl2ZUJhc2VtYXBJZDtcbiAgICAgIGl0ZW0ubGF5ZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgIGl0ZW0uY29uZmlnID0geyAuLi5pdGVtLmNvbmZpZywgdmlzaWJsZSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWcoY29uZmlnOiBHZW9NYXBMYXllckNvbmZpZyk6IHZvaWQge1xuICAgIGlmICghY29uZmlnLmlkPy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTGF5ZXIgY29uZmlnIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGlkLicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09ICd4eXonICYmICFjb25maWcudXJsPy50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWFlaIGxheWVyIFwiJHtjb25maWcuaWR9XCIgaXMgbWlzc2luZyB1cmwuYCk7XG4gICAgfVxuICAgIGlmIChjb25maWcudHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIGlmICghY29uZmlnLnVybD8udHJpbSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgV01TIGxheWVyIFwiJHtjb25maWcuaWR9XCIgaXMgbWlzc2luZyB1cmwuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXllcnNQYXJhbSA9XG4gICAgICAgIGNvbmZpZy5sYXllck5hbWUgPz9cbiAgICAgICAgKGNvbmZpZy5wYXJhbXNbJ0xBWUVSUyddICE9IG51bGwgPyBTdHJpbmcoY29uZmlnLnBhcmFtc1snTEFZRVJTJ10pIDogJycpO1xuICAgICAgaWYgKCFsYXllcnNQYXJhbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFdNUyBsYXllciBcIiR7Y29uZmlnLmlkfVwiIG5lZWRzIGxheWVyTmFtZSBvciBwYXJhbXMuTEFZRVJTLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcudHlwZSA9PT0gJ3dtdHMnKSB7XG4gICAgICBpZiAoIWNvbmZpZy51cmw/LnRyaW0oKSB8fCAhY29uZmlnLmxheWVyPy50cmltKCkgfHwgIWNvbmZpZy5tYXRyaXhTZXQ/LnRyaW0oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFdNVFMgbGF5ZXIgXCIke2NvbmZpZy5pZH1cIiByZXF1aXJlcyB1cmwsIGxheWVyLCBhbmQgbWF0cml4U2V0LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcudHlwZSA9PT0gJ2dlb2pzb24nICYmIGNvbmZpZy5kYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VvSlNPTiBsYXllciBcIiR7Y29uZmlnLmlkfVwiIGlzIG1pc3NpbmcgZGF0YS5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q29tbW9uT3B0aW9ucyhsYXllcjogQmFzZUxheWVyLCBjb25maWc6IEdlb01hcExheWVyQ29uZmlnKTogdm9pZCB7XG4gICAgbGF5ZXIuc2V0KExBWUVSX0lEX0tFWSwgY29uZmlnLmlkKTtcbiAgICBsYXllci5zZXQoTEFZRVJfQkFTRU1BUF9LRVksICEhY29uZmlnLmJhc2VtYXApO1xuICAgIGxheWVyLnNldChMQVlFUl9HUk9VUF9LRVksIGNvbmZpZy5ncm91cCA/PyAnJyk7XG4gICAgbGF5ZXIuc2V0KExBWUVSX1FVRVJZQUJMRV9LRVksICEhY29uZmlnLnF1ZXJ5YWJsZSk7XG4gICAgbGF5ZXIuc2V0VmlzaWJsZShjb25maWcudmlzaWJsZSA/PyB0cnVlKTtcbiAgICBsYXllci5zZXRPcGFjaXR5KGNvbmZpZy5vcGFjaXR5ID8/IDEpO1xuICAgIGlmIChjb25maWcuekluZGV4ICE9IG51bGwpIHtcbiAgICAgIGxheWVyLnNldFpJbmRleChjb25maWcuekluZGV4KTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5taW5ab29tICE9IG51bGwpIHtcbiAgICAgIGxheWVyLnNldE1pblpvb20oY29uZmlnLm1pblpvb20pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLm1heFpvb20gIT0gbnVsbCkge1xuICAgICAgbGF5ZXIuc2V0TWF4Wm9vbShjb25maWcubWF4Wm9vbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3aXJlU291cmNlU3RhdHVzKGxheWVySWQ6IHN0cmluZywgbGF5ZXI6IEJhc2VMYXllcik6IHZvaWQge1xuICAgIGlmICghKGxheWVyIGluc3RhbmNlb2YgVGlsZUxheWVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBsYXllci5nZXRTb3VyY2UoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNvdXJjZS5vbigndGlsZWxvYWRlcnJvcicsICgpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihgW0dlb01hcExheWVyU2VydmljZV0gVGlsZSBlcnJvciBvbiBsYXllciBcIiR7bGF5ZXJJZH1cImApO1xuICAgICAgdGhpcy5ydW50aW1lLnNldChsYXllcklkLCB7XG4gICAgICAgIGlkOiBsYXllcklkLFxuICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIGVycm9yTWVzc2FnZTogJ0tow7RuZyB04bqjaSDEkcaw4bujYyBk4buvIGxp4buHdSBs4bubcCBi4bqjbiDEkeG7ky4nLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzb3VyY2Uub24oJ3RpbGVsb2FkZW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucnVudGltZS5nZXQobGF5ZXJJZCk7XG4gICAgICBpZiAoY3VycmVudD8uc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucnVudGltZS5zZXQobGF5ZXJJZCwgeyBpZDogbGF5ZXJJZCwgc3RhdHVzOiAncmVhZHknIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPc21MYXllcihfY29uZmlnOiBHZW9NYXBPc21MYXllckNvbmZpZyk6IFRpbGVMYXllcjxPU00+IHtcbiAgICByZXR1cm4gbmV3IFRpbGVMYXllcih7XG4gICAgICBzb3VyY2U6IG5ldyBPU00oKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWHl6TGF5ZXIoY29uZmlnOiBHZW9NYXBYeXpMYXllckNvbmZpZyk6IFRpbGVMYXllcjxYWVo+IHtcbiAgICByZXR1cm4gbmV3IFRpbGVMYXllcih7XG4gICAgICBzb3VyY2U6IG5ldyBYWVooe1xuICAgICAgICB1cmw6IGNvbmZpZy51cmwsXG4gICAgICAgIGF0dHJpYnV0aW9uczogY29uZmlnLmF0dHJpYnV0aW9ucyxcbiAgICAgICAgbWF4Wm9vbTogY29uZmlnLm1heFpvb20sXG4gICAgICAgIGNyb3NzT3JpZ2luOiBjb25maWcuY3Jvc3NPcmlnaW4gPz8gJ2Fub255bW91cycsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV21zTGF5ZXIoY29uZmlnOiBHZW9NYXBXbXNMYXllckNvbmZpZyk6IFRpbGVMYXllcjxUaWxlV01TPiB7XG4gICAgY29uc3QgbGF5ZXJzID1cbiAgICAgIGNvbmZpZy5sYXllck5hbWUgPz9cbiAgICAgIChjb25maWcucGFyYW1zWydMQVlFUlMnXSAhPSBudWxsID8gU3RyaW5nKGNvbmZpZy5wYXJhbXNbJ0xBWUVSUyddKSA6ICcnKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0ge1xuICAgICAgLi4uY29uZmlnLnBhcmFtcyxcbiAgICAgIExBWUVSUzogbGF5ZXJzLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgc291cmNlOiBuZXcgVGlsZVdNUyh7XG4gICAgICAgIHVybDogY29uZmlnLnVybCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBzZXJ2ZXJUeXBlOiBjb25maWcuc2VydmVyVHlwZSxcbiAgICAgICAgY3Jvc3NPcmlnaW46IGNvbmZpZy5jcm9zc09yaWdpbiA/PyAnYW5vbnltb3VzJyxcbiAgICAgICAgcHJvamVjdGlvbjogY29uZmlnLnByb2plY3Rpb24gYXMgUHJvamVjdGlvbkxpa2UgfCB1bmRlZmluZWQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV210c0xheWVyKGNvbmZpZzogR2VvTWFwV210c0xheWVyQ29uZmlnKTogVGlsZUxheWVyPFdNVFM+IHtcbiAgICBjb25zdCBwcm9qZWN0aW9uQ29kZSA9IGNvbmZpZy5wcm9qZWN0aW9uID8/ICdFUFNHOjM4NTcnO1xuICAgIHRoaXMucHJvamVjdGlvbi5lbnN1cmVSZWdpc3RlcmVkKHByb2plY3Rpb25Db2RlKTtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gZ2V0UHJvamVjdGlvbihwcm9qZWN0aW9uQ29kZSk7XG4gICAgaWYgKCFwcm9qZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdNVFMgcHJvamVjdGlvbiBcIiR7cHJvamVjdGlvbkNvZGV9XCIgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICB9XG4gICAgY29uc3QgcHJvamVjdGlvbkV4dGVudCA9IHByb2plY3Rpb24uZ2V0RXh0ZW50KCk7XG4gICAgaWYgKCFwcm9qZWN0aW9uRXh0ZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXTVRTIHByb2plY3Rpb24gXCIke3Byb2plY3Rpb25Db2RlfVwiIGhhcyBubyBleHRlbnQ7IHByb3ZpZGUgYSBjdXN0b20gdGlsZSBncmlkIGluIGEgbGF0ZXIgcGhhc2UuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNpemUgPSBnZXRXaWR0aChwcm9qZWN0aW9uRXh0ZW50KSAvIDI1NjtcbiAgICBjb25zdCByZXNvbHV0aW9uczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBtYXRyaXhJZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgeiA9IDA7IHogPCAyMDsgeiArPSAxKSB7XG4gICAgICByZXNvbHV0aW9uc1t6XSA9IHNpemUgLyBNYXRoLnBvdygyLCB6KTtcbiAgICAgIG1hdHJpeElkc1t6XSA9IFN0cmluZyh6KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRpbGVMYXllcih7XG4gICAgICBzb3VyY2U6IG5ldyBXTVRTKHtcbiAgICAgICAgdXJsOiBjb25maWcudXJsLFxuICAgICAgICBsYXllcjogY29uZmlnLmxheWVyLFxuICAgICAgICBtYXRyaXhTZXQ6IGNvbmZpZy5tYXRyaXhTZXQsXG4gICAgICAgIGZvcm1hdDogY29uZmlnLmZvcm1hdCA/PyAnaW1hZ2UvcG5nJyxcbiAgICAgICAgc3R5bGU6IGNvbmZpZy5zdHlsZSA/PyAnJyxcbiAgICAgICAgcHJvamVjdGlvbjogcHJvamVjdGlvbkNvZGUsXG4gICAgICAgIGNyb3NzT3JpZ2luOiBjb25maWcuY3Jvc3NPcmlnaW4gPz8gJ2Fub255bW91cycsXG4gICAgICAgIHRpbGVHcmlkOiBuZXcgV01UU1RpbGVHcmlkKHtcbiAgICAgICAgICBvcmlnaW46IGdldFRvcExlZnQocHJvamVjdGlvbkV4dGVudCksXG4gICAgICAgICAgcmVzb2x1dGlvbnMsXG4gICAgICAgICAgbWF0cml4SWRzLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW9Kc29uTGF5ZXIoY29uZmlnOiBHZW9NYXBHZW9Kc29uTGF5ZXJDb25maWcpOiBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+IHtcbiAgICBjb25zdCBmb3JtYXQgPSBuZXcgR2VvSlNPTigpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBWZWN0b3JTb3VyY2UoKTtcbiAgICBjb25zdCBmZWF0dXJlUHJvamVjdGlvbiA9IGNvbmZpZy5mZWF0dXJlUHJvamVjdGlvbiA/PyAnRVBTRzozODU3JztcbiAgICBjb25zdCBkYXRhUHJvamVjdGlvbiA9IGNvbmZpZy5kYXRhUHJvamVjdGlvbiA/PyAnRVBTRzo0MzI2JztcblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBVUkwg4oCUIGxldCBWZWN0b3JTb3VyY2UgbG9hZCBhc3luY2hyb25vdXNseVxuICAgICAgY29uc3QgdXJsU291cmNlID0gbmV3IFZlY3RvclNvdXJjZSh7XG4gICAgICAgIHVybDogY29uZmlnLmRhdGEsXG4gICAgICAgIGZvcm1hdDogbmV3IEdlb0pTT04oe1xuICAgICAgICAgIGRhdGFQcm9qZWN0aW9uLFxuICAgICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgdXJsU291cmNlLm9uKCdmZWF0dXJlc2xvYWRlcnJvcicsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW0dlb01hcExheWVyU2VydmljZV0gR2VvSlNPTiBsb2FkIGVycm9yIFwiJHtjb25maWcuaWR9XCJgKTtcbiAgICAgICAgdGhpcy5ydW50aW1lLnNldChjb25maWcuaWQsIHtcbiAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6ICdLaMO0bmcgdOG6o2kgxJHGsOG7o2MgR2VvSlNPTi4nLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBWZWN0b3JMYXllcih7IHNvdXJjZTogdXJsU291cmNlIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmZWF0dXJlcyA9IGZvcm1hdC5yZWFkRmVhdHVyZXMoY29uZmlnLmRhdGEsIHtcbiAgICAgICAgZGF0YVByb2plY3Rpb24sXG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uLFxuICAgICAgfSkgYXMgRmVhdHVyZTxHZW9tZXRyeT5bXTtcbiAgICAgIHNvdXJjZS5hZGRGZWF0dXJlcyhmZWF0dXJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbR2VvTWFwTGF5ZXJTZXJ2aWNlXSBJbnZhbGlkIEdlb0pTT04gZm9yIFwiJHtjb25maWcuaWR9XCJgLCBlcnIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZW9KU09OIGtow7RuZyBo4bujcCBs4buHIGNobyBs4bubcCBcIiR7Y29uZmlnLmlkfVwiLmApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVmVjdG9yTGF5ZXIoeyBzb3VyY2UgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZlY3RvckxheWVyKGNvbmZpZzogR2VvTWFwVmVjdG9yTGF5ZXJDb25maWcpOiBWZWN0b3JMYXllcjxWZWN0b3JTb3VyY2U+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgVmVjdG9yU291cmNlKHtcbiAgICAgIGZlYXR1cmVzOiBjb25maWcuZmVhdHVyZXMgPz8gW10sXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JMYXllcih7IHNvdXJjZSB9KTtcbiAgfVxufVxuIl19
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1sYXllci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9zZXJ2aWNlcy9nZW8tbWFwLWxheWVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFHeEMsT0FBTyxVQUFVLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxTQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUN4QyxPQUFPLFlBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUM7QUFFaEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEMsT0FBTyxZQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBYWhFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQUV2RSxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUM7QUFDdkMsTUFBTSxlQUFlLEdBQUcs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aEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxDQUFDLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQW9CLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUN6RixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUMxQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsWUFBWSxFQUFFLGlDQUFpQzthQUNoRCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzt3R0FqYlUsa0JBQWtCOzRHQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xuaW1wb3J0IEdlb0pTT04gZnJvbSAnb2wvZm9ybWF0L0dlb0pTT04nO1xuaW1wb3J0IHR5cGUgR2VvbWV0cnkgZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBCYXNlTGF5ZXIgZnJvbSAnb2wvbGF5ZXIvQmFzZSc7XG5pbXBvcnQgTGF5ZXJHcm91cCBmcm9tICdvbC9sYXllci9Hcm91cCc7XG5pbXBvcnQgVGlsZUxheWVyIGZyb20gJ29sL2xheWVyL1RpbGUnO1xuaW1wb3J0IFZlY3RvckxheWVyIGZyb20gJ29sL2xheWVyL1ZlY3Rvcic7XG5pbXBvcnQgT1NNIGZyb20gJ29sL3NvdXJjZS9PU00nO1xuaW1wb3J0IFRpbGVXTVMgZnJvbSAnb2wvc291cmNlL1RpbGVXTVMnO1xuaW1wb3J0IFZlY3RvclNvdXJjZSBmcm9tICdvbC9zb3VyY2UvVmVjdG9yJztcbmltcG9ydCBYWVogZnJvbSAnb2wvc291cmNlL1hZWic7XG5pbXBvcnQgdHlwZSB7IFByb2plY3Rpb25MaWtlIH0gZnJvbSAnb2wvcHJvaic7XG5pbXBvcnQgV01UUyBmcm9tICdvbC9zb3VyY2UvV01UUyc7XG5pbXBvcnQgV01UU1RpbGVHcmlkIGZyb20gJ29sL3RpbGVncmlkL1dNVFMnO1xuaW1wb3J0IHsgZ2V0IGFzIGdldFByb2plY3Rpb24gfSBmcm9tICdvbC9wcm9qJztcbmltcG9ydCB7IGdldFRvcExlZnQsIGdldFdpZHRoIH0gZnJvbSAnb2wvZXh0ZW50JztcbmltcG9ydCB7IGFwcGx5IGFzIGFwcGx5TWFwYm94U3R5bGUgfSBmcm9tICdvbC1tYXBib3gtc3R5bGUnO1xuaW1wb3J0IHsgR0VPX01BUF9CQVNFTUFQX0xBWUVSX0lEIH0gZnJvbSAnLi4vZ2VvLW1hcC5jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1xuICBHZW9NYXBCYXNlbWFwSW5wdXQsXG4gIEdlb01hcEdlb0pzb25MYXllckNvbmZpZyxcbiAgR2VvTWFwTGF5ZXJDb25maWcsXG4gIEdlb01hcExheWVyUnVudGltZVN0YXRlLFxuICBHZW9NYXBNYXBib3hTdHlsZUxheWVyQ29uZmlnLFxuICBHZW9NYXBPc21MYXllckNvbmZpZyxcbiAgR2VvTWFwVmVjdG9yTGF5ZXJDb25maWcsXG4gIEdlb01hcFdtc0xheWVyQ29uZmlnLFxuICBHZW9NYXBXbXRzTGF5ZXJDb25maWcsXG4gIEdlb01hcFh5ekxheWVyQ29uZmlnLFxufSBmcm9tICcuLi9nZW8tbWFwLnR5cGVzJztcbmltcG9ydCB7IEdlb01hcFByb2plY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9nZW8tbWFwLXByb2plY3Rpb24uc2VydmljZSc7XG5cbmNvbnN0IExBWUVSX0lEX0tFWSA9ICdnZW9MYXllcklkJztcbmNvbnN0IExBWUVSX0JBU0VNQVBfS0VZID0gJ2dlb0Jhc2VtYXAnO1xuY29uc3QgTEFZRVJfR1JPVVBfS0VZID0gJ2dlb0dyb3VwJztcbmNvbnN0IExBWUVSX1FVRVJZQUJMRV9LRVkgPSAnZ2VvUXVlcnlhYmxlJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVkTWFwTGF5ZXIge1xuICBpZDogc3RyaW5nO1xuICBjb25maWc6IEdlb01hcExheWVyQ29uZmlnO1xuICBsYXllcjogQmFzZUxheWVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhbmQgaW5jcmVtZW50YWxseSBwYXRjaGVzIE9wZW5MYXllcnMgbGF5ZXJzIGZyb20gdHlwZWQgY29uZmlncy5cbiAqIFZpc2liaWxpdHkgLyBvcGFjaXR5IHVwZGF0ZXMgbXVzdCBub3QgcmVjcmVhdGUgc291cmNlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdlb01hcExheWVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdGlvbiA9IGluamVjdChHZW9NYXBQcm9qZWN0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZSA9IG5ldyBNYXA8c3RyaW5nLCBHZW9NYXBMYXllclJ1bnRpbWVTdGF0ZT4oKTtcblxuICBnZXRSdW50aW1lU3RhdGUobGF5ZXJJZDogc3RyaW5nKTogR2VvTWFwTGF5ZXJSdW50aW1lU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWUuZ2V0KGxheWVySWQpO1xuICB9XG5cbiAgZ2V0QWxsUnVudGltZVN0YXRlcygpOiBHZW9NYXBMYXllclJ1bnRpbWVTdGF0ZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucnVudGltZS52YWx1ZXMoKV07XG4gIH1cblxuICBjcmVhdGVGcm9tQmFzZW1hcElucHV0KGJhc2VtYXA6IEdlb01hcEJhc2VtYXBJbnB1dCk6IENyZWF0ZWRNYXBMYXllciB7XG4gICAgaWYgKGJhc2VtYXAgPT09ICdvc20nKSB7XG4gICAgICBjb25zdCBjb25maWc6IEdlb01hcE9zbUxheWVyQ29uZmlnID0ge1xuICAgICAgICBpZDogR0VPX01BUF9CQVNFTUFQX0xBWUVSX0lELFxuICAgICAgICB0aXRsZTogJ09wZW5TdHJlZXRNYXAnLFxuICAgICAgICB0eXBlOiAnb3NtJyxcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgekluZGV4OiAwLFxuICAgICAgICBiYXNlbWFwOiB0cnVlLFxuICAgICAgICBncm91cDogJ2Jhc2UtbWFwJyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVMYXllcihjb25maWcpO1xuICAgIH1cblxuICAgIGlmIChiYXNlbWFwLnR5cGUgPT09ICdtYXBib3gtc3R5bGUnKSB7XG4gICAgICBjb25zdCBjb25maWc6IEdlb01hcE1hcGJveFN0eWxlTGF5ZXJDb25maWcgPSB7XG4gICAgICAgIGlkOiBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQsXG4gICAgICAgIHRpdGxlOiBiYXNlbWFwLnRpdGxlID8/ICdNYXBib3ggc3R5bGUgYmFzZW1hcCcsXG4gICAgICAgIHR5cGU6ICdtYXBib3gtc3R5bGUnLFxuICAgICAgICBzdHlsZUpzb246IGJhc2VtYXAuc3R5bGVKc29uLFxuICAgICAgICBzdHlsZVVybDogYmFzZW1hcC5zdHlsZVVybCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogYmFzZW1hcC50cmFuc2Zvcm1SZXF1ZXN0LFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgIGJhc2VtYXA6IHRydWUsXG4gICAgICAgIGdyb3VwOiAnYmFzZS1tYXAnLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxheWVyKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBHZW9NYXBYeXpMYXllckNvbmZpZyA9IHtcbiAgICAgIGlkOiBHRU9fTUFQX0JBU0VNQVBfTEFZRVJfSUQsXG4gICAgICB0aXRsZTogYmFzZW1hcC50aXRsZSA/PyAnWFlaIGJhc2VtYXAnLFxuICAgICAgdHlwZTogJ3h5eicsXG4gICAgICB1cmw6IGJhc2VtYXAudXJsLFxuICAgICAgYXR0cmlidXRpb25zOiBiYXNlbWFwLmF0dHJpYnV0aW9ucyxcbiAgICAgIG1heFpvb206IGJhc2VtYXAubWF4Wm9vbSxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgekluZGV4OiAwLFxuICAgICAgYmFzZW1hcDogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnYmFzZS1tYXAnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTGF5ZXIoY29uZmlnKTtcbiAgfVxuXG4gIGNyZWF0ZUxheWVyKGNvbmZpZzogR2VvTWFwTGF5ZXJDb25maWcpOiBDcmVhdGVkTWFwTGF5ZXIge1xuICAgIHRoaXMucnVudGltZS5zZXQoY29uZmlnLmlkLCB7IGlkOiBjb25maWcuaWQsIHN0YXR1czogJ2xvYWRpbmcnIH0pO1xuXG4gICAgbGV0IGxheWVyOiBCYXNlTGF5ZXI7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnb3NtJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlT3NtTGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneHl6JzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlWHl6TGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd21zJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlV21zTGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd210cyc6XG4gICAgICAgICAgbGF5ZXIgPSB0aGlzLmNyZWF0ZVdtdHNMYXllcihjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdnZW9qc29uJzpcbiAgICAgICAgICBsYXllciA9IHRoaXMuY3JlYXRlR2VvSnNvbkxheWVyKGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgICAgICAgbGF5ZXIgPSB0aGlzLmNyZWF0ZVZlY3RvckxheWVyKGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21hcGJveC1zdHlsZSc6XG4gICAgICAgICAgbGF5ZXIgPSB0aGlzLmNyZWF0ZU1hcGJveFN0eWxlTGF5ZXIoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IGNvbmZpZztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxheWVyIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoX2V4aGF1c3RpdmUpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFwcGx5Q29tbW9uT3B0aW9ucyhsYXllciwgY29uZmlnKTtcbiAgICAgIHRoaXMud2lyZVNvdXJjZVN0YXR1cyhjb25maWcuaWQsIGxheWVyKTtcbiAgICAgIHRoaXMucnVudGltZS5zZXQoY29uZmlnLmlkLCB7IGlkOiBjb25maWcuaWQsIHN0YXR1czogJ3JlYWR5JyB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICBjb25zb2xlLmVycm9yKGBbR2VvTWFwTGF5ZXJTZXJ2aWNlXSBGYWlsZWQgdG8gY3JlYXRlIGxheWVyIFwiJHtjb25maWcuaWR9XCJgLCBlcnIpO1xuICAgICAgdGhpcy5ydW50aW1lLnNldChjb25maWcuaWQsIHtcbiAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGludmlzaWJsZSBsYXllciBzbyBjYWxsZXJzIGNhbiBzdGlsbCB0cmFjayBpZFxuICAgICAgbGF5ZXIgPSBuZXcgVmVjdG9yTGF5ZXIoe1xuICAgICAgICBzb3VyY2U6IG5ldyBWZWN0b3JTb3VyY2UoKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlDb21tb25PcHRpb25zKGxheWVyLCB7IC4uLmNvbmZpZywgdmlzaWJsZTogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaWQ6IGNvbmZpZy5pZCwgY29uZmlnLCBsYXllciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHZpc2liaWxpdHkvb3BhY2l0eS96SW5kZXggd2l0aG91dCByZWNyZWF0aW5nIHRoZSBPTCBsYXllci5cbiAgICogUmV0dXJucyB0cnVlIHdoZW4gc3RydWN0dXJhbCBmaWVsZHMgY2hhbmdlZCBhbmQgdGhlIGxheWVyIHNob3VsZCBiZSByZWNyZWF0ZWQuXG4gICAqL1xuICBuZWVkc1JlY3JlYXRlKHByZXZpb3VzOiBHZW9NYXBMYXllckNvbmZpZywgbmV4dDogR2VvTWFwTGF5ZXJDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAocHJldmlvdXMudHlwZSAhPT0gbmV4dC50eXBlIHx8IHByZXZpb3VzLmlkICE9PSBuZXh0LmlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3dpdGNoIChuZXh0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ29zbSc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgJ3h5eic6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFh5ekxheWVyQ29uZmlnKS51cmwgIT09IG5leHQudXJsIHx8XG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFh5ekxheWVyQ29uZmlnKS5tYXhab29tICE9PSBuZXh0Lm1heFpvb21cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3dtcyc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFdtc0xheWVyQ29uZmlnKS51cmwgIT09IG5leHQudXJsIHx8XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoKHByZXZpb3VzIGFzIEdlb01hcFdtc0xheWVyQ29uZmlnKS5wYXJhbXMpICE9PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dC5wYXJhbXMpIHx8XG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFdtc0xheWVyQ29uZmlnKS5sYXllck5hbWUgIT09IG5leHQubGF5ZXJOYW1lXG4gICAgICAgICk7XG4gICAgICBjYXNlICd3bXRzJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAocHJldmlvdXMgYXMgR2VvTWFwV210c0xheWVyQ29uZmlnKS51cmwgIT09IG5leHQudXJsIHx8XG4gICAgICAgICAgKHByZXZpb3VzIGFzIEdlb01hcFdtdHNMYXllckNvbmZpZykubGF5ZXIgIT09IG5leHQubGF5ZXIgfHxcbiAgICAgICAgICAocHJldmlvdXMgYXMgR2VvTWFwV210c0xheWVyQ29uZmlnKS5tYXRyaXhTZXQgIT09IG5leHQubWF0cml4U2V0XG4gICAgICAgICk7XG4gICAgICBjYXNlICdnZW9qc29uJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSgocHJldmlvdXMgYXMgR2VvTWFwR2VvSnNvbkxheWVyQ29uZmlnKS5kYXRhKSAhPT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHQuZGF0YSkgfHxcbiAgICAgICAgICAocHJldmlvdXMgYXMgR2VvTWFwR2VvSnNvbkxheWVyQ29uZmlnKS5kYXRhUHJvamVjdGlvbiAhPT0gbmV4dC5kYXRhUHJvamVjdGlvblxuICAgICAgICApO1xuICAgICAgY2FzZSAndmVjdG9yJzpcbiAgICAgICAgcmV0dXJuIChwcmV2aW91cyBhcyBHZW9NYXBWZWN0b3JMYXllckNvbmZpZykuZmVhdHVyZXMgIT09IG5leHQuZmVhdHVyZXM7XG4gICAgICBjYXNlICdtYXBib3gtc3R5bGUnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChwcmV2aW91cyBhcyBHZW9NYXBNYXBib3hTdHlsZUxheWVyQ29uZmlnKS5zdHlsZVVybCAhPT0gbmV4dC5zdHlsZVVybCB8fFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KChwcmV2aW91cyBhcyBHZW9NYXBNYXBib3hTdHlsZUxheWVyQ29uZmlnKS5zdHlsZUpzb24pICE9PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dC5zdHlsZUpzb24pXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwYXRjaExheWVyKGxheWVyOiBCYXNlTGF5ZXIsIGNvbmZpZzogR2VvTWFwTGF5ZXJDb25maWcpOiB2b2lkIHtcbiAgICBsYXllci5zZXRWaXNpYmxlKGNvbmZpZy52aXNpYmxlID8/IHRydWUpO1xuICAgIGxheWVyLnNldE9wYWNpdHkoY29uZmlnLm9wYWNpdHkgPz8gMSk7XG4gICAgaWYgKGNvbmZpZy56SW5kZXggIT0gbnVsbCkge1xuICAgICAgbGF5ZXIuc2V0WkluZGV4KGNvbmZpZy56SW5kZXgpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLm1pblpvb20gIT0gbnVsbCkge1xuICAgICAgbGF5ZXIuc2V0TWluWm9vbShjb25maWcubWluWm9vbSk7XG4gICAgfVxuICAgIGlmIChjb25maWcubWF4Wm9vbSAhPSBudWxsKSB7XG4gICAgICBsYXllci5zZXRNYXhab29tKGNvbmZpZy5tYXhab29tKTtcbiAgICB9XG4gICAgbGF5ZXIuc2V0KExBWUVSX0JBU0VNQVBfS0VZLCAhIWNvbmZpZy5iYXNlbWFwKTtcbiAgICBsYXllci5zZXQoTEFZRVJfR1JPVVBfS0VZLCBjb25maWcuZ3JvdXAgPz8gJycpO1xuICAgIGxheWVyLnNldChMQVlFUl9RVUVSWUFCTEVfS0VZLCAhIWNvbmZpZy5xdWVyeWFibGUpO1xuICB9XG5cbiAgc2V0VmlzaWJsZShsYXllcjogQmFzZUxheWVyLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGF5ZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuXG4gIHNldE9wYWNpdHkobGF5ZXI6IEJhc2VMYXllciwgb3BhY2l0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG9wYWNpdHkpKTtcbiAgICBsYXllci5zZXRPcGFjaXR5KGNsYW1wZWQpO1xuICB9XG5cbiAgZ2V0TGF5ZXJJZChsYXllcjogQmFzZUxheWVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpZCA9IGxheWVyLmdldChMQVlFUl9JRF9LRVkpO1xuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnID8gaWQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBpc0Jhc2VtYXAobGF5ZXI6IEJhc2VMYXllcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWxheWVyLmdldChMQVlFUl9CQVNFTUFQX0tFWSk7XG4gIH1cblxuICByZXNvbHZlQmFzZW1hcEV4Y2x1c2l2ZShcbiAgICBsYXllcnM6IENyZWF0ZWRNYXBMYXllcltdLFxuICAgIGFjdGl2ZUJhc2VtYXBJZDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGF5ZXJzKSB7XG4gICAgICBpZiAoIWl0ZW0uY29uZmlnLmJhc2VtYXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlID0gaXRlbS5pZCA9PT0gYWN0aXZlQmFzZW1hcElkO1xuICAgICAgaXRlbS5sYXllci5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgaXRlbS5jb25maWcgPSB7IC4uLml0ZW0uY29uZmlnLCB2aXNpYmxlIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZyhjb25maWc6IEdlb01hcExheWVyQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCFjb25maWcuaWQ/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYXllciBjb25maWcgcmVxdWlyZXMgYSBub24tZW1wdHkgaWQuJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcudHlwZSA9PT0gJ3h5eicgJiYgIWNvbmZpZy51cmw/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYWVogbGF5ZXIgXCIke2NvbmZpZy5pZH1cIiBpcyBtaXNzaW5nIHVybC5gKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnd21zJykge1xuICAgICAgaWYgKCFjb25maWcudXJsPy50cmltKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXTVMgbGF5ZXIgXCIke2NvbmZpZy5pZH1cIiBpcyBtaXNzaW5nIHVybC5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxheWVyc1BhcmFtID1cbiAgICAgICAgY29uZmlnLmxheWVyTmFtZSA/P1xuICAgICAgICAoY29uZmlnLnBhcmFtc1snTEFZRVJTJ10gIT0gbnVsbCA/IFN0cmluZyhjb25maWcucGFyYW1zWydMQVlFUlMnXSkgOiAnJyk7XG4gICAgICBpZiAoIWxheWVyc1BhcmFtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV01TIGxheWVyIFwiJHtjb25maWcuaWR9XCIgbmVlZHMgbGF5ZXJOYW1lIG9yIHBhcmFtcy5MQVlFUlMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnd210cycpIHtcbiAgICAgIGlmICghY29uZmlnLnVybD8udHJpbSgpIHx8ICFjb25maWcubGF5ZXI/LnRyaW0oKSB8fCAhY29uZmlnLm1hdHJpeFNldD8udHJpbSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV01UUyBsYXllciBcIiR7Y29uZmlnLmlkfVwiIHJlcXVpcmVzIHVybCwgbGF5ZXIsIGFuZCBtYXRyaXhTZXQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnZ2VvanNvbicgJiYgY29uZmlnLmRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZW9KU09OIGxheWVyIFwiJHtjb25maWcuaWR9XCIgaXMgbWlzc2luZyBkYXRhLmApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09ICdtYXBib3gtc3R5bGUnICYmICFjb25maWcuc3R5bGVKc29uICYmICFjb25maWcuc3R5bGVVcmw/LnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXBib3gtc3R5bGUgbGF5ZXIgXCIke2NvbmZpZy5pZH1cIiByZXF1aXJlcyBzdHlsZUpzb24gb3Igc3R5bGVVcmwuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUNvbW1vbk9wdGlvbnMobGF5ZXI6IEJhc2VMYXllciwgY29uZmlnOiBHZW9NYXBMYXllckNvbmZpZyk6IHZvaWQge1xuICAgIGxheWVyLnNldChMQVlFUl9JRF9LRVksIGNvbmZpZy5pZCk7XG4gICAgbGF5ZXIuc2V0KExBWUVSX0JBU0VNQVBfS0VZLCAhIWNvbmZpZy5iYXNlbWFwKTtcbiAgICBsYXllci5zZXQoTEFZRVJfR1JPVVBfS0VZLCBjb25maWcuZ3JvdXAgPz8gJycpO1xuICAgIGxheWVyLnNldChMQVlFUl9RVUVSWUFCTEVfS0VZLCAhIWNvbmZpZy5xdWVyeWFibGUpO1xuICAgIGxheWVyLnNldFZpc2libGUoY29uZmlnLnZpc2libGUgPz8gdHJ1ZSk7XG4gICAgbGF5ZXIuc2V0T3BhY2l0eShjb25maWcub3BhY2l0eSA/PyAxKTtcbiAgICBpZiAoY29uZmlnLnpJbmRleCAhPSBudWxsKSB7XG4gICAgICBsYXllci5zZXRaSW5kZXgoY29uZmlnLnpJbmRleCk7XG4gICAgfVxuICAgIGlmIChjb25maWcubWluWm9vbSAhPSBudWxsKSB7XG4gICAgICBsYXllci5zZXRNaW5ab29tKGNvbmZpZy5taW5ab29tKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5tYXhab29tICE9IG51bGwpIHtcbiAgICAgIGxheWVyLnNldE1heFpvb20oY29uZmlnLm1heFpvb20pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2lyZVNvdXJjZVN0YXR1cyhsYXllcklkOiBzdHJpbmcsIGxheWVyOiBCYXNlTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoIShsYXllciBpbnN0YW5jZW9mIFRpbGVMYXllcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gbGF5ZXIuZ2V0U291cmNlKCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzb3VyY2Uub24oJ3RpbGVsb2FkZXJyb3InLCAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oYFtHZW9NYXBMYXllclNlcnZpY2VdIFRpbGUgZXJyb3Igb24gbGF5ZXIgXCIke2xheWVySWR9XCJgKTtcbiAgICAgIHRoaXMucnVudGltZS5zZXQobGF5ZXJJZCwge1xuICAgICAgICBpZDogbGF5ZXJJZCxcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBlcnJvck1lc3NhZ2U6ICdLaMO0bmcgdOG6o2kgxJHGsOG7o2MgZOG7ryBsaeG7h3UgbOG7m3AgYuG6o24gxJHhu5MuJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc291cmNlLm9uKCd0aWxlbG9hZGVuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJ1bnRpbWUuZ2V0KGxheWVySWQpO1xuICAgICAgaWYgKGN1cnJlbnQ/LnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bnRpbWUuc2V0KGxheWVySWQsIHsgaWQ6IGxheWVySWQsIHN0YXR1czogJ3JlYWR5JyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3NtTGF5ZXIoX2NvbmZpZzogR2VvTWFwT3NtTGF5ZXJDb25maWcpOiBUaWxlTGF5ZXI8T1NNPiB7XG4gICAgcmV0dXJuIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgc291cmNlOiBuZXcgT1NNKCksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVh5ekxheWVyKGNvbmZpZzogR2VvTWFwWHl6TGF5ZXJDb25maWcpOiBUaWxlTGF5ZXI8WFlaPiB7XG4gICAgcmV0dXJuIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgc291cmNlOiBuZXcgWFlaKHtcbiAgICAgICAgdXJsOiBjb25maWcudXJsLFxuICAgICAgICBhdHRyaWJ1dGlvbnM6IGNvbmZpZy5hdHRyaWJ1dGlvbnMsXG4gICAgICAgIG1heFpvb206IGNvbmZpZy5tYXhab29tLFxuICAgICAgICBjcm9zc09yaWdpbjogY29uZmlnLmNyb3NzT3JpZ2luID8/ICdhbm9ueW1vdXMnLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdtc0xheWVyKGNvbmZpZzogR2VvTWFwV21zTGF5ZXJDb25maWcpOiBUaWxlTGF5ZXI8VGlsZVdNUz4ge1xuICAgIGNvbnN0IGxheWVycyA9XG4gICAgICBjb25maWcubGF5ZXJOYW1lID8/XG4gICAgICAoY29uZmlnLnBhcmFtc1snTEFZRVJTJ10gIT0gbnVsbCA/IFN0cmluZyhjb25maWcucGFyYW1zWydMQVlFUlMnXSkgOiAnJyk7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9IHtcbiAgICAgIC4uLmNvbmZpZy5wYXJhbXMsXG4gICAgICBMQVlFUlM6IGxheWVycyxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgVGlsZUxheWVyKHtcbiAgICAgIHNvdXJjZTogbmV3IFRpbGVXTVMoe1xuICAgICAgICB1cmw6IGNvbmZpZy51cmwsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgc2VydmVyVHlwZTogY29uZmlnLnNlcnZlclR5cGUsXG4gICAgICAgIGNyb3NzT3JpZ2luOiBjb25maWcuY3Jvc3NPcmlnaW4gPz8gJ2Fub255bW91cycsXG4gICAgICAgIHByb2plY3Rpb246IGNvbmZpZy5wcm9qZWN0aW9uIGFzIFByb2plY3Rpb25MaWtlIHwgdW5kZWZpbmVkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdtdHNMYXllcihjb25maWc6IEdlb01hcFdtdHNMYXllckNvbmZpZyk6IFRpbGVMYXllcjxXTVRTPiB7XG4gICAgY29uc3QgcHJvamVjdGlvbkNvZGUgPSBjb25maWcucHJvamVjdGlvbiA/PyAnRVBTRzozODU3JztcbiAgICB0aGlzLnByb2plY3Rpb24uZW5zdXJlUmVnaXN0ZXJlZChwcm9qZWN0aW9uQ29kZSk7XG4gICAgY29uc3QgcHJvamVjdGlvbiA9IGdldFByb2plY3Rpb24ocHJvamVjdGlvbkNvZGUpO1xuICAgIGlmICghcHJvamVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXTVRTIHByb2plY3Rpb24gXCIke3Byb2plY3Rpb25Db2RlfVwiIGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3Rpb25FeHRlbnQgPSBwcm9qZWN0aW9uLmdldEV4dGVudCgpO1xuICAgIGlmICghcHJvamVjdGlvbkV4dGVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV01UUyBwcm9qZWN0aW9uIFwiJHtwcm9qZWN0aW9uQ29kZX1cIiBoYXMgbm8gZXh0ZW50OyBwcm92aWRlIGEgY3VzdG9tIHRpbGUgZ3JpZCBpbiBhIGxhdGVyIHBoYXNlLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzaXplID0gZ2V0V2lkdGgocHJvamVjdGlvbkV4dGVudCkgLyAyNTY7XG4gICAgY29uc3QgcmVzb2x1dGlvbnM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgbWF0cml4SWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgMjA7IHogKz0gMSkge1xuICAgICAgcmVzb2x1dGlvbnNbel0gPSBzaXplIC8gTWF0aC5wb3coMiwgeik7XG4gICAgICBtYXRyaXhJZHNbel0gPSBTdHJpbmcoeik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUaWxlTGF5ZXIoe1xuICAgICAgc291cmNlOiBuZXcgV01UUyh7XG4gICAgICAgIHVybDogY29uZmlnLnVybCxcbiAgICAgICAgbGF5ZXI6IGNvbmZpZy5sYXllcixcbiAgICAgICAgbWF0cml4U2V0OiBjb25maWcubWF0cml4U2V0LFxuICAgICAgICBmb3JtYXQ6IGNvbmZpZy5mb3JtYXQgPz8gJ2ltYWdlL3BuZycsXG4gICAgICAgIHN0eWxlOiBjb25maWcuc3R5bGUgPz8gJycsXG4gICAgICAgIHByb2plY3Rpb246IHByb2plY3Rpb25Db2RlLFxuICAgICAgICBjcm9zc09yaWdpbjogY29uZmlnLmNyb3NzT3JpZ2luID8/ICdhbm9ueW1vdXMnLFxuICAgICAgICB0aWxlR3JpZDogbmV3IFdNVFNUaWxlR3JpZCh7XG4gICAgICAgICAgb3JpZ2luOiBnZXRUb3BMZWZ0KHByb2plY3Rpb25FeHRlbnQpLFxuICAgICAgICAgIHJlc29sdXRpb25zLFxuICAgICAgICAgIG1hdHJpeElkcyxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR2VvSnNvbkxheWVyKGNvbmZpZzogR2VvTWFwR2VvSnNvbkxheWVyQ29uZmlnKTogVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPiB7XG4gICAgY29uc3QgZm9ybWF0ID0gbmV3IEdlb0pTT04oKTtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgVmVjdG9yU291cmNlKCk7XG4gICAgY29uc3QgZmVhdHVyZVByb2plY3Rpb24gPSBjb25maWcuZmVhdHVyZVByb2plY3Rpb24gPz8gJ0VQU0c6Mzg1Nyc7XG4gICAgY29uc3QgZGF0YVByb2plY3Rpb24gPSBjb25maWcuZGF0YVByb2plY3Rpb24gPz8gJ0VQU0c6NDMyNic7XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVVJMIOKAlCBsZXQgVmVjdG9yU291cmNlIGxvYWQgYXN5bmNocm9ub3VzbHlcbiAgICAgIGNvbnN0IHVybFNvdXJjZSA9IG5ldyBWZWN0b3JTb3VyY2Uoe1xuICAgICAgICB1cmw6IGNvbmZpZy5kYXRhLFxuICAgICAgICBmb3JtYXQ6IG5ldyBHZW9KU09OKHtcbiAgICAgICAgICBkYXRhUHJvamVjdGlvbixcbiAgICAgICAgICBmZWF0dXJlUHJvamVjdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICAgIHVybFNvdXJjZS5vbignZmVhdHVyZXNsb2FkZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtHZW9NYXBMYXllclNlcnZpY2VdIEdlb0pTT04gbG9hZCBlcnJvciBcIiR7Y29uZmlnLmlkfVwiYCk7XG4gICAgICAgIHRoaXMucnVudGltZS5zZXQoY29uZmlnLmlkLCB7XG4gICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcbiAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiAnS2jDtG5nIHThuqNpIMSRxrDhu6NjIEdlb0pTT04uJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yTGF5ZXIoeyBzb3VyY2U6IHVybFNvdXJjZSB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBmb3JtYXQucmVhZEZlYXR1cmVzKGNvbmZpZy5kYXRhLCB7XG4gICAgICAgIGRhdGFQcm9qZWN0aW9uLFxuICAgICAgICBmZWF0dXJlUHJvamVjdGlvbixcbiAgICAgIH0pIGFzIEZlYXR1cmU8R2VvbWV0cnk+W107XG4gICAgICBzb3VyY2UuYWRkRmVhdHVyZXMoZmVhdHVyZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgW0dlb01hcExheWVyU2VydmljZV0gSW52YWxpZCBHZW9KU09OIGZvciBcIiR7Y29uZmlnLmlkfVwiYCwgZXJyKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VvSlNPTiBraMO0bmcgaOG7o3AgbOG7hyBjaG8gbOG7m3AgXCIke2NvbmZpZy5pZH1cIi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFZlY3RvckxheWVyKHsgc291cmNlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZWN0b3JMYXllcihjb25maWc6IEdlb01hcFZlY3RvckxheWVyQ29uZmlnKTogVmVjdG9yTGF5ZXI8VmVjdG9yU291cmNlPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFZlY3RvclNvdXJjZSh7XG4gICAgICBmZWF0dXJlczogY29uZmlnLmZlYXR1cmVzID8/IFtdLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgVmVjdG9yTGF5ZXIoeyBzb3VyY2UgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1hcGJveFN0eWxlTGF5ZXIoY29uZmlnOiBHZW9NYXBNYXBib3hTdHlsZUxheWVyQ29uZmlnKTogTGF5ZXJHcm91cCB7XG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgTGF5ZXJHcm91cCh7IGxheWVyczogW10gfSk7XG4gICAgY29uc3Qgc3R5bGVJbnB1dCA9IGNvbmZpZy5zdHlsZUpzb24gPz8gY29uZmlnLnN0eWxlVXJsO1xuICAgIGlmICghc3R5bGVJbnB1dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXBib3gtc3R5bGUgbGF5ZXIgXCIke2NvbmZpZy5pZH1cIiBpcyBtaXNzaW5nIHN0eWxlSnNvbi9zdHlsZVVybC5gKTtcbiAgICB9XG4gICAgYXBwbHlNYXBib3hTdHlsZShncm91cCwgc3R5bGVJbnB1dCBhcyBvYmplY3QsIHsgdHJhbnNmb3JtUmVxdWVzdDogY29uZmlnLnRyYW5zZm9ybVJlcXVlc3QgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW50aW1lLnNldChjb25maWcuaWQsIHsgaWQ6IGNvbmZpZy5pZCwgc3RhdHVzOiAncmVhZHknIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtHZW9NYXBMYXllclNlcnZpY2VdIE1hcGJveCBzdHlsZSBhcHBseSBlcnJvciBcIiR7Y29uZmlnLmlkfVwiYCwgZXJyKTtcbiAgICAgICAgdGhpcy5ydW50aW1lLnNldChjb25maWcuaWQsIHtcbiAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6ICdLaMO0bmcgw6FwIMSRxrDhu6NjIHN0eWxlIGLhuqNuIMSR4buTIG7hu4FuLicsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIGdyb3VwO1xuICB9XG59XG4iXX0=
@@ -100,6 +100,7 @@ import * as i1$6 from 'ng-zorro-antd/core/transition-patch';
100
100
  import { Subscription } from 'rxjs';
101
101
  import { NzConfigService } from 'ng-zorro-antd/core/config';
102
102
  import GeoJSON from 'ol/format/GeoJSON';
103
+ import LayerGroup from 'ol/layer/Group';
103
104
  import TileLayer from 'ol/layer/Tile';
104
105
  import VectorLayer from 'ol/layer/Vector';
105
106
  import OSM from 'ol/source/OSM';
@@ -110,6 +111,7 @@ import WMTS from 'ol/source/WMTS';
110
111
  import WMTSTileGrid from 'ol/tilegrid/WMTS';
111
112
  import { get, transform, transformExtent, fromLonLat } from 'ol/proj';
112
113
  import { getWidth, getTopLeft, getCenter } from 'ol/extent';
114
+ import { apply } from 'ol-mapbox-style';
113
115
  import { register } from 'ol/proj/proj4';
114
116
  import proj4 from 'proj4';
115
117
  import OlMap from 'ol/Map';
@@ -4065,9 +4067,48 @@ const GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326 = [107.2, 11.15, 108.75, 12.35];
4065
4067
  const GEO_MAP_TRAFFIC_LAYER_ID = '__geo_traffic';
4066
4068
  const GEO_MAP_ESRI_IMAGERY_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}';
4067
4069
  const GEO_MAP_ESRI_STREETS_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}';
4070
+ const GEO_MAP_ESRI_LIGHT_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}';
4071
+ const GEO_MAP_ESRI_DARK_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}';
4072
+ const GEO_MAP_ESRI_TOPO_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}';
4068
4073
  const GEO_MAP_ESRI_TRANSPORT_URL = 'https://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}';
4069
- /** Default basemap picker options (đường phố / vệ tinh). */
4074
+ /**
4075
+ * Default basemap picker options (vertical dropdown design).
4076
+ * Order matches design: vệ tinh → sáng → 3D → đường phố → địa hình.
4077
+ */
4070
4078
  const GEO_MAP_DEFAULT_BASEMAP_OPTIONS = [
4079
+ {
4080
+ id: 'satellite',
4081
+ label: 'Nền vệ tinh',
4082
+ basemap: {
4083
+ type: 'xyz',
4084
+ url: GEO_MAP_ESRI_IMAGERY_URL,
4085
+ attributions: 'Esri, Maxar, Earthstar Geographics',
4086
+ title: 'Ảnh vệ tinh',
4087
+ },
4088
+ previewUrl: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/6/30/50',
4089
+ },
4090
+ {
4091
+ id: 'light',
4092
+ label: 'Bản đồ sáng',
4093
+ basemap: {
4094
+ type: 'xyz',
4095
+ url: GEO_MAP_ESRI_LIGHT_URL,
4096
+ attributions: 'Esri',
4097
+ title: 'Bản đồ sáng',
4098
+ },
4099
+ previewUrl: 'https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/6/30/50',
4100
+ },
4101
+ {
4102
+ id: 'dark',
4103
+ label: 'Bản đồ 3D',
4104
+ basemap: {
4105
+ type: 'xyz',
4106
+ url: GEO_MAP_ESRI_DARK_URL,
4107
+ attributions: 'Esri',
4108
+ title: 'Bản đồ tối',
4109
+ },
4110
+ previewUrl: 'https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/6/30/50',
4111
+ },
4071
4112
  {
4072
4113
  id: 'osm',
4073
4114
  label: 'Đường phố',
@@ -4075,15 +4116,15 @@ const GEO_MAP_DEFAULT_BASEMAP_OPTIONS = [
4075
4116
  previewUrl: 'https://tile.openstreetmap.org/6/50/30.png',
4076
4117
  },
4077
4118
  {
4078
- id: 'satellite',
4079
- label: 'Vệ tinh',
4119
+ id: 'terrain',
4120
+ label: 'Nền địa hình',
4080
4121
  basemap: {
4081
4122
  type: 'xyz',
4082
- url: GEO_MAP_ESRI_IMAGERY_URL,
4083
- attributions: 'Esri, Maxar, Earthstar Geographics',
4084
- title: 'Ảnh vệ tinh',
4123
+ url: GEO_MAP_ESRI_TOPO_URL,
4124
+ attributions: 'Esri',
4125
+ title: 'Địa hình',
4085
4126
  },
4086
- previewUrl: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/6/30/50',
4127
+ previewUrl: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/6/30/50',
4087
4128
  },
4088
4129
  ];
4089
4130
  /** Transportation reference overlay — toggle independently of basemap. */
@@ -4752,6 +4793,22 @@ class GeoMapLayerService {
4752
4793
  };
4753
4794
  return this.createLayer(config);
4754
4795
  }
4796
+ if (basemap.type === 'mapbox-style') {
4797
+ const config = {
4798
+ id: GEO_MAP_BASEMAP_LAYER_ID,
4799
+ title: basemap.title ?? 'Mapbox style basemap',
4800
+ type: 'mapbox-style',
4801
+ styleJson: basemap.styleJson,
4802
+ styleUrl: basemap.styleUrl,
4803
+ transformRequest: basemap.transformRequest,
4804
+ visible: true,
4805
+ opacity: 1,
4806
+ zIndex: 0,
4807
+ basemap: true,
4808
+ group: 'base-map',
4809
+ };
4810
+ return this.createLayer(config);
4811
+ }
4755
4812
  const config = {
4756
4813
  id: GEO_MAP_BASEMAP_LAYER_ID,
4757
4814
  title: basemap.title ?? 'XYZ basemap',
@@ -4791,6 +4848,9 @@ class GeoMapLayerService {
4791
4848
  case 'vector':
4792
4849
  layer = this.createVectorLayer(config);
4793
4850
  break;
4851
+ case 'mapbox-style':
4852
+ layer = this.createMapboxStyleLayer(config);
4853
+ break;
4794
4854
  default: {
4795
4855
  const _exhaustive = config;
4796
4856
  throw new Error(`Unsupported layer type: ${JSON.stringify(_exhaustive)}`);
@@ -4846,6 +4906,10 @@ class GeoMapLayerService {
4846
4906
  previous.dataProjection !== next.dataProjection);
4847
4907
  case 'vector':
4848
4908
  return previous.features !== next.features;
4909
+ case 'mapbox-style':
4910
+ return (previous.styleUrl !== next.styleUrl ||
4911
+ JSON.stringify(previous.styleJson) !==
4912
+ JSON.stringify(next.styleJson));
4849
4913
  default:
4850
4914
  return true;
4851
4915
  }
@@ -4915,6 +4979,9 @@ class GeoMapLayerService {
4915
4979
  if (config.type === 'geojson' && config.data == null) {
4916
4980
  throw new Error(`GeoJSON layer "${config.id}" is missing data.`);
4917
4981
  }
4982
+ if (config.type === 'mapbox-style' && !config.styleJson && !config.styleUrl?.trim()) {
4983
+ throw new Error(`Mapbox-style layer "${config.id}" requires styleJson or styleUrl.`);
4984
+ }
4918
4985
  }
4919
4986
  applyCommonOptions(layer, config) {
4920
4987
  layer.set(LAYER_ID_KEY, config.id);
@@ -5067,6 +5134,26 @@ class GeoMapLayerService {
5067
5134
  });
5068
5135
  return new VectorLayer({ source });
5069
5136
  }
5137
+ createMapboxStyleLayer(config) {
5138
+ const group = new LayerGroup({ layers: [] });
5139
+ const styleInput = config.styleJson ?? config.styleUrl;
5140
+ if (!styleInput) {
5141
+ throw new Error(`Mapbox-style layer "${config.id}" is missing styleJson/styleUrl.`);
5142
+ }
5143
+ apply(group, styleInput, { transformRequest: config.transformRequest })
5144
+ .then(() => {
5145
+ this.runtime.set(config.id, { id: config.id, status: 'ready' });
5146
+ })
5147
+ .catch((err) => {
5148
+ console.error(`[GeoMapLayerService] Mapbox style apply error "${config.id}"`, err);
5149
+ this.runtime.set(config.id, {
5150
+ id: config.id,
5151
+ status: 'error',
5152
+ errorMessage: 'Không áp được style bản đồ nền.',
5153
+ });
5154
+ });
5155
+ return group;
5156
+ }
5070
5157
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5071
5158
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapLayerService });
5072
5159
  }
@@ -6318,59 +6405,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
6318
6405
  }] });
6319
6406
 
6320
6407
  /**
6321
- * Thumbnail card toggling street satellite basemap.
6408
+ * Thumbnail trigger + vertical dropdown to pick the map basemap.
6322
6409
  *
6323
- * @summary Toggle street / satellite basemap.
6324
- * @whenToUse Right-side basemap toggle.
6410
+ * @summary Pick basemap from a vertical thumbnail dropdown.
6411
+ * @whenToUse Bottom-right basemap picker («Lớp bản đồ»).
6325
6412
  * @doNotUseWhen Full layer panel — use geo-map-layer-panel.
6326
6413
  */
6327
6414
  class GeoMapBasemapSwitcherComponent {
6328
- /** Exactly two options (street + satellite). Extra items are ignored. */
6329
6415
  options = input(GEO_MAP_DEFAULT_BASEMAP_OPTIONS);
6330
6416
  selectedId = model('osm');
6331
6417
  /** Caption on the thumbnail card (design: «Lớp bản đồ»). */
6332
6418
  label = input('Lớp bản đồ');
6333
6419
  tooltip = input('Đổi lớp bản đồ nền');
6334
6420
  basemapChange = output();
6335
- pair = computed(() => {
6336
- const list = this.options().slice(0, 2);
6337
- return list.length >= 2 ? list : GEO_MAP_DEFAULT_BASEMAP_OPTIONS;
6421
+ open = signal(false);
6422
+ list = computed(() => {
6423
+ const list = this.options();
6424
+ return list.length ? list : GEO_MAP_DEFAULT_BASEMAP_OPTIONS;
6338
6425
  });
6339
6426
  selected = computed(() => {
6340
6427
  const id = this.selectedId();
6341
- const list = this.pair();
6428
+ const list = this.list();
6342
6429
  return list.find((item) => item.id === id) ?? list[0] ?? null;
6343
6430
  });
6344
- /** Preview of the other basemap (what click will switch to). */
6345
- next = computed(() => {
6346
- const list = this.pair();
6347
- if (!list.length) {
6348
- return null;
6349
- }
6350
- const currentId = this.selected()?.id;
6351
- return list.find((item) => item.id !== currentId) ?? list[0] ?? null;
6352
- });
6353
- tooltipText = computed(() => {
6354
- const next = this.next();
6355
- if (!next) {
6356
- return this.tooltip();
6357
- }
6358
- return `Chuyển sang ${next.label}`;
6359
- });
6360
- toggle() {
6361
- const next = this.next();
6362
- if (!next) {
6431
+ onVisible(visible) {
6432
+ this.open.set(visible);
6433
+ }
6434
+ pick(option) {
6435
+ this.open.set(false);
6436
+ if (option.id === this.selectedId()) {
6363
6437
  return;
6364
6438
  }
6365
- this.selectedId.set(next.id);
6366
- this.basemapChange.emit(next.basemap);
6439
+ this.selectedId.set(option.id);
6440
+ this.basemapChange.emit(option.basemap);
6367
6441
  }
6368
6442
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapBasemapSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6369
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapBasemapSwitcherComponent, isStandalone: true, selector: "geo-map-basemap-switcher", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedId: "selectedIdChange", basemapChange: "basemapChange" }, host: { classAttribute: "geo-map-basemap-switcher-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:4px;padding:0 8px 8px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:20px;height:20px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"], dependencies: [{ kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6443
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapBasemapSwitcherComponent, isStandalone: true, selector: "geo-map-basemap-switcher", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedId: { classPropertyName: "selectedId", publicName: "selectedId", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedId: "selectedIdChange", basemapChange: "basemapChange" }, host: { classAttribute: "geo-map-basemap-switcher-host" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"topCenter\"\n nzOverlayClassName=\"geo-map-basemap-switcher-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"open() ? '' : tooltip()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltip()\"\n [attr.aria-expanded]=\"open()\"\n>\n @if (selected(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__bar\" aria-hidden=\"true\">\n <span class=\"geo-map-basemap-switcher__icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 12 12 16.5l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div\n class=\"geo-map-basemap-switcher__panel\"\n role=\"listbox\"\n [attr.aria-label]=\"tooltip()\"\n >\n <ul class=\"geo-map-basemap-switcher__list\">\n @for (option of list(); track option.id) {\n <li>\n <button\n type=\"button\"\n role=\"option\"\n class=\"geo-map-basemap-switcher__option\"\n [class.geo-map-basemap-switcher__option--active]=\"option.id === selectedId()\"\n [attr.aria-selected]=\"option.id === selectedId()\"\n (click)=\"pick(option)\"\n >\n @if (option.previewUrl; as url) {\n <img\n class=\"geo-map-basemap-switcher__option-thumb\"\n [src]=\"url\"\n alt=\"\"\n />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__option-thumb geo-map-basemap-switcher__option-thumb--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__option-label\">{{ option.label }}</span>\n </button>\n </li>\n }\n </ul>\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-map-basemap-switcher-host{display:block;width:90px}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-info-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__bar{position:absolute;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;gap:4px;min-height:28px;padding:4px 6px;color:var(--geo-color-neutral-white, #fff);background:color-mix(in srgb,var(--geo-color-neutral-900) 72%,transparent);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;flex-shrink:0;width:14px;height:14px;color:inherit}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{min-width:0;overflow:hidden;font-size:var(--geo-font-size-tiny, 10px);font-weight:var(--geo-font-weight-semibold, 600);line-height:1.2;text-align:left;text-overflow:ellipsis;white-space:nowrap}.geo-map-basemap-switcher-overlay .ant-dropdown-menu{padding:0;margin-bottom:8px;border:0;background:transparent;box-shadow:none}.geo-map-basemap-switcher__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:104px;min-width:104px;max-width:104px;padding:10px 8px;border-radius:var(--geo-radius-xl, 14px);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-md)}.geo-map-basemap-switcher__list{display:flex;flex-direction:column;align-items:center;gap:10px;margin:0;padding:0;list-style:none}.geo-map-basemap-switcher__option{display:flex;flex-direction:column;align-items:center;gap:6px;width:100%;padding:0;border:0;background:transparent;color:var(--geo-color-neutral-900);font:inherit;cursor:pointer}.geo-map-basemap-switcher__option:hover .geo-map-basemap-switcher__option-thumb{box-shadow:0 0 0 2px color-mix(in srgb,var(--geo-color-info-default) 35%,transparent)}.geo-map-basemap-switcher__option:focus-visible .geo-map-basemap-switcher__option-thumb{outline:2px solid var(--geo-color-info-default);outline-offset:2px}.geo-map-basemap-switcher__option--active .geo-map-basemap-switcher__option-thumb{box-shadow:0 0 0 2px var(--geo-color-info-default)}.geo-map-basemap-switcher__option--active .geo-map-basemap-switcher__option-label{color:var(--geo-color-info-default);font-weight:var(--geo-font-weight-semibold, 600)}.geo-map-basemap-switcher__option-thumb{display:block;width:72px;height:72px;border-radius:var(--geo-radius-lg, 12px);object-fit:cover;background:var(--geo-color-neutral-200);transition:box-shadow .15s ease}.geo-map-basemap-switcher__option-thumb--empty{background:linear-gradient(145deg,var(--geo-color-neutral-500),var(--geo-color-neutral-700))}.geo-map-basemap-switcher__option-label{max-width:100%;padding:0 2px;overflow:hidden;color:inherit;font-size:var(--geo-font-size-tiny, 10px);font-weight:var(--geo-font-weight-medium, 500);line-height:1.25;text-align:center;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: NzToolTipModule }, { kind: "directive", type: i1$2.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "cdkConnectedOverlayPush", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i2$6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i2$6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
6370
6444
  }
6371
6445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapBasemapSwitcherComponent, decorators: [{
6372
6446
  type: Component,
6373
- args: [{ selector: 'geo-map-basemap-switcher', standalone: true, imports: [NzToolTipModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-basemap-switcher-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n [nz-tooltip]=\"tooltipText()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltipText()\"\n (click)=\"toggle()\"\n>\n @if (next(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__veil\" aria-hidden=\"true\"></span>\n <span class=\"geo-map-basemap-switcher__content\">\n <span class=\"geo-map-basemap-switcher__icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n", styles: [".geo-map-basemap-switcher-host{display:block}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__veil{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,transparent 40%,color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent) 100%)}.geo-map-basemap-switcher__content{position:absolute;inset:0;z-index:1;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;gap:4px;padding:0 8px 8px;color:var(--geo-color-neutral-white, #fff);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;width:20px;height:20px;color:inherit;filter:drop-shadow(0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 45%,transparent))}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{max-width:100%;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);line-height:1.2;text-align:left;white-space:nowrap;text-shadow:0 1px 2px color-mix(in srgb,var(--geo-color-neutral-900) 55%,transparent)}\n"] }]
6447
+ args: [{ selector: 'geo-map-basemap-switcher', standalone: true, imports: [NzToolTipModule, NzDropDownModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'geo-map-basemap-switcher-host' }, template: "<button\n type=\"button\"\n class=\"geo-map-basemap-switcher__trigger\"\n nz-dropdown\n nzTrigger=\"click\"\n nzPlacement=\"topCenter\"\n nzOverlayClassName=\"geo-map-basemap-switcher-overlay\"\n [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"open()\"\n (nzVisibleChange)=\"onVisible($event)\"\n [nz-tooltip]=\"open() ? '' : tooltip()\"\n nzTooltipPlacement=\"left\"\n [attr.aria-label]=\"tooltip()\"\n [attr.aria-expanded]=\"open()\"\n>\n @if (selected(); as option) {\n @if (option.previewUrl; as url) {\n <img class=\"geo-map-basemap-switcher__preview\" [src]=\"url\" alt=\"\" />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n } @else {\n <span\n class=\"geo-map-basemap-switcher__preview geo-map-basemap-switcher__preview--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__bar\" aria-hidden=\"true\">\n <span class=\"geo-map-basemap-switcher__icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4.2 3 8.7l9 4.5 9-4.5-9-4.5Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 15.3 12 19.8l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M3 12 12 16.5l9-4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n <span class=\"geo-map-basemap-switcher__caption\">{{ label() }}</span>\n </span>\n</button>\n\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div\n class=\"geo-map-basemap-switcher__panel\"\n role=\"listbox\"\n [attr.aria-label]=\"tooltip()\"\n >\n <ul class=\"geo-map-basemap-switcher__list\">\n @for (option of list(); track option.id) {\n <li>\n <button\n type=\"button\"\n role=\"option\"\n class=\"geo-map-basemap-switcher__option\"\n [class.geo-map-basemap-switcher__option--active]=\"option.id === selectedId()\"\n [attr.aria-selected]=\"option.id === selectedId()\"\n (click)=\"pick(option)\"\n >\n @if (option.previewUrl; as url) {\n <img\n class=\"geo-map-basemap-switcher__option-thumb\"\n [src]=\"url\"\n alt=\"\"\n />\n } @else {\n <span\n class=\"geo-map-basemap-switcher__option-thumb geo-map-basemap-switcher__option-thumb--empty\"\n aria-hidden=\"true\"\n ></span>\n }\n <span class=\"geo-map-basemap-switcher__option-label\">{{ option.label }}</span>\n </button>\n </li>\n }\n </ul>\n </div>\n</nz-dropdown-menu>\n", styles: ["@charset \"UTF-8\";.geo-map-basemap-switcher-host{display:block;width:90px}.geo-map-basemap-switcher__trigger{position:relative;display:block;width:90px;height:90px;padding:0;overflow:hidden;border:3px solid var(--geo-color-neutral-white, #fff);border-radius:var(--geo-radius-2xl);background:var(--geo-color-neutral-800);box-shadow:var(--geo-shadow-md);cursor:pointer;transition:box-shadow .15s ease,transform .15s ease}.geo-map-basemap-switcher__trigger:hover{box-shadow:var(--geo-shadow-lg, var(--geo-shadow-md));transform:translateY(-1px)}.geo-map-basemap-switcher__trigger:focus-visible{outline:2px solid var(--geo-color-info-default);outline-offset:2px}.geo-map-basemap-switcher__preview{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.geo-map-basemap-switcher__preview--empty{background:linear-gradient(145deg,var(--geo-color-neutral-600),var(--geo-color-neutral-800))}.geo-map-basemap-switcher__bar{position:absolute;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;gap:4px;min-height:28px;padding:4px 6px;color:var(--geo-color-neutral-white, #fff);background:color-mix(in srgb,var(--geo-color-neutral-900) 72%,transparent);pointer-events:none}.geo-map-basemap-switcher__icon{display:inline-flex;flex-shrink:0;width:14px;height:14px;color:inherit}.geo-map-basemap-switcher__icon svg{width:100%;height:100%}.geo-map-basemap-switcher__caption{min-width:0;overflow:hidden;font-size:var(--geo-font-size-tiny, 10px);font-weight:var(--geo-font-weight-semibold, 600);line-height:1.2;text-align:left;text-overflow:ellipsis;white-space:nowrap}.geo-map-basemap-switcher-overlay .ant-dropdown-menu{padding:0;margin-bottom:8px;border:0;background:transparent;box-shadow:none}.geo-map-basemap-switcher__panel{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:104px;min-width:104px;max-width:104px;padding:10px 8px;border-radius:var(--geo-radius-xl, 14px);background:var(--geo-color-neutral-white, #fff);box-shadow:var(--geo-shadow-md)}.geo-map-basemap-switcher__list{display:flex;flex-direction:column;align-items:center;gap:10px;margin:0;padding:0;list-style:none}.geo-map-basemap-switcher__option{display:flex;flex-direction:column;align-items:center;gap:6px;width:100%;padding:0;border:0;background:transparent;color:var(--geo-color-neutral-900);font:inherit;cursor:pointer}.geo-map-basemap-switcher__option:hover .geo-map-basemap-switcher__option-thumb{box-shadow:0 0 0 2px color-mix(in srgb,var(--geo-color-info-default) 35%,transparent)}.geo-map-basemap-switcher__option:focus-visible .geo-map-basemap-switcher__option-thumb{outline:2px solid var(--geo-color-info-default);outline-offset:2px}.geo-map-basemap-switcher__option--active .geo-map-basemap-switcher__option-thumb{box-shadow:0 0 0 2px var(--geo-color-info-default)}.geo-map-basemap-switcher__option--active .geo-map-basemap-switcher__option-label{color:var(--geo-color-info-default);font-weight:var(--geo-font-weight-semibold, 600)}.geo-map-basemap-switcher__option-thumb{display:block;width:72px;height:72px;border-radius:var(--geo-radius-lg, 12px);object-fit:cover;background:var(--geo-color-neutral-200);transition:box-shadow .15s ease}.geo-map-basemap-switcher__option-thumb--empty{background:linear-gradient(145deg,var(--geo-color-neutral-500),var(--geo-color-neutral-700))}.geo-map-basemap-switcher__option-label{max-width:100%;padding:0 2px;overflow:hidden;color:inherit;font-size:var(--geo-font-size-tiny, 10px);font-weight:var(--geo-font-weight-medium, 500);line-height:1.25;text-align:center;text-overflow:ellipsis;white-space:nowrap}\n"] }]
6374
6448
  }] });
6375
6449
 
6376
6450
  /**
@@ -8148,5 +8222,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8148
8222
  * Generated bundle index. Do not edit.
8149
8223
  */
8150
8224
 
8151
- export { DEFAULT_UI_ROW_ACTIONS, DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS, GEO_ICON_SIZE_MAP, GEO_LAYOUT_DEFAULT_NOTIFICATIONS, GEO_LAYOUT_DEFAULT_SUBSYSTEMS, GEO_LAYOUT_DEFAULT_USER, GEO_LAYOUT_DEFAULT_USER_MENU, GEO_MAP_BASEMAP_LAYER_ID, GEO_MAP_BUILTIN_PROJECTIONS, GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_HEIGHT, GEO_MAP_DEFAULT_HELP_SECTIONS, GEO_MAP_DEFAULT_MAX_ZOOM, GEO_MAP_DEFAULT_MIN_ZOOM, GEO_MAP_DEFAULT_PLANNING_LAYERS, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_DEFAULT_VIEW_PROJECTION, GEO_MAP_DEFAULT_ZOOM, GEO_MAP_DEMO_ADMIN_NODES, GEO_MAP_DEMO_LEGEND_ITEMS, GEO_MAP_DEMO_PARCEL_DETAIL, GEO_MAP_DEMO_THEMATIC_LAYERS, GEO_MAP_ENV_PLACEHOLDERS, GEO_MAP_ESRI_IMAGERY_URL, GEO_MAP_ESRI_STREETS_URL, GEO_MAP_ESRI_TRANSPORT_URL, GEO_MAP_HIGHLIGHT_LAYER_ID, GEO_MAP_LOCATE_TOOLBAR_ACTION, GEO_MAP_MEASURE_LAYER_ID, GEO_MAP_SELECTION_LAYER_ID, GEO_MAP_TOOLBAR_ASSET_BASE, GEO_MAP_TOOLBAR_ICONS, GEO_MAP_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, GEO_STATUS_COLOR_MAP, GEO_STATUS_LABELS, GEO_TOAST_DEFAULT_TITLES, GEO_TOAST_ICONS, GEO_TYPOGRAPHY_TAG, GEO_TYPOGRAPHY_VARIANTS, GeoAccordionComponent, GeoAccordionPanelDirective, GeoAlertComponent, GeoBackButtonComponent, GeoBreadcrumbComponent, GeoButtonComponent, GeoChartComponent, GeoCheckboxComponent, GeoColumnPickerComponent, GeoConfirmModalComponent, GeoDashboardComponent, GeoDatePickerComponent, GeoDateRangePickerComponent, GeoDetailViewComponent, GeoDetailViewItemDirective, GeoEmptyStateComponent, GeoFeedbackFormComponent, GeoFilePickerComponent, GeoForgotPasswordComponent, GeoFormModalComponent, GeoIconComponent, GeoInputComponent, GeoLayoutActionsDirective, GeoLayoutComponent, GeoLayoutFooterComponent, GeoLayoutHeaderActionsComponent, GeoLayoutHeaderComponent, GeoLayoutSidebarComponent, GeoListPageComponent, GeoLoginComponent, GeoMapAdminFilterComponent, GeoMapBasemapSwitcherComponent, GeoMapComponent, GeoMapController, GeoMapHelpComponent, GeoMapLayerCardComponent, GeoMapLayerPanelComponent, GeoMapLayerService, GeoMapLayersDrawerComponent, GeoMapLegendComponent, GeoMapLocateComponent, GeoMapLocationChipComponent, GeoMapMeasureComponent, GeoMapOpacityComponent, GeoMapParcelPopupComponent, GeoMapProjectionError, GeoMapProjectionService, GeoMapSearchComponent, GeoMapService, GeoMapShellComponent, GeoMapSnapshotComponent, GeoMapSwipeComponent, GeoMapToolbarComponent, GeoMapZoomComponent, GeoOverlapResultComponent, GeoPageHeaderComponent, GeoPageTitleComponent, GeoPaginationComponent, GeoRadioComponent, GeoRowActionsComponent, GeoSelectComponent, GeoSliderComponent, GeoStatCardComponent, GeoStatusTagComponent, GeoStepFormLayoutComponent, GeoStepperComponent, GeoSwitchComponent, GeoTabDirective, GeoTableComponent, GeoTableFilterComponent, GeoTablePaginationComponent, GeoTableToolbarComponent, GeoTabsComponent, GeoTextareaComponent, GeoToastComponent, GeoToastService, GeoTreeComponent, GeoTypographyComponent, GeoUploadComponent, NgZorroAntdModule, UI_ALERT_DEFAULT_TITLES, UI_STATUS_LABELS, UI_TABLE_MOBILE_BREAKPOINT, applyColumnPickerState, cssVar, geoColorCssVars, geoColorTokens, geoFormatBytes, geoFormatSpeed, geoRadiusCssVars, geoRadiusTokens, geoShadowTokens, geoTypographyTokens, geoUploadPercent, loadColumnPickerState, mergeColumnPickerItems, pickInlineRowActions, pickOverflowRowActions, saveColumnPickerState };
8225
+ export { DEFAULT_UI_ROW_ACTIONS, DEFAULT_UI_TABLE_PAGE_SIZE_OPTIONS, GEO_ICON_SIZE_MAP, GEO_LAYOUT_DEFAULT_NOTIFICATIONS, GEO_LAYOUT_DEFAULT_SUBSYSTEMS, GEO_LAYOUT_DEFAULT_USER, GEO_LAYOUT_DEFAULT_USER_MENU, GEO_MAP_BASEMAP_LAYER_ID, GEO_MAP_BUILTIN_PROJECTIONS, GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_HEIGHT, GEO_MAP_DEFAULT_HELP_SECTIONS, GEO_MAP_DEFAULT_MAX_ZOOM, GEO_MAP_DEFAULT_MIN_ZOOM, GEO_MAP_DEFAULT_PLANNING_LAYERS, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, GEO_MAP_DEFAULT_VIEW_PROJECTION, GEO_MAP_DEFAULT_ZOOM, GEO_MAP_DEMO_ADMIN_NODES, GEO_MAP_DEMO_LEGEND_ITEMS, GEO_MAP_DEMO_PARCEL_DETAIL, GEO_MAP_DEMO_THEMATIC_LAYERS, GEO_MAP_ENV_PLACEHOLDERS, GEO_MAP_ESRI_DARK_URL, GEO_MAP_ESRI_IMAGERY_URL, GEO_MAP_ESRI_LIGHT_URL, GEO_MAP_ESRI_STREETS_URL, GEO_MAP_ESRI_TOPO_URL, GEO_MAP_ESRI_TRANSPORT_URL, GEO_MAP_HIGHLIGHT_LAYER_ID, GEO_MAP_LOCATE_TOOLBAR_ACTION, GEO_MAP_MEASURE_LAYER_ID, GEO_MAP_SELECTION_LAYER_ID, GEO_MAP_TOOLBAR_ASSET_BASE, GEO_MAP_TOOLBAR_ICONS, GEO_MAP_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, GEO_STATUS_COLOR_MAP, GEO_STATUS_LABELS, GEO_TOAST_DEFAULT_TITLES, GEO_TOAST_ICONS, GEO_TYPOGRAPHY_TAG, GEO_TYPOGRAPHY_VARIANTS, GeoAccordionComponent, GeoAccordionPanelDirective, GeoAlertComponent, GeoBackButtonComponent, GeoBreadcrumbComponent, GeoButtonComponent, GeoChartComponent, GeoCheckboxComponent, GeoColumnPickerComponent, GeoConfirmModalComponent, GeoDashboardComponent, GeoDatePickerComponent, GeoDateRangePickerComponent, GeoDetailViewComponent, GeoDetailViewItemDirective, GeoEmptyStateComponent, GeoFeedbackFormComponent, GeoFilePickerComponent, GeoForgotPasswordComponent, GeoFormModalComponent, GeoIconComponent, GeoInputComponent, GeoLayoutActionsDirective, GeoLayoutComponent, GeoLayoutFooterComponent, GeoLayoutHeaderActionsComponent, GeoLayoutHeaderComponent, GeoLayoutSidebarComponent, GeoListPageComponent, GeoLoginComponent, GeoMapAdminFilterComponent, GeoMapBasemapSwitcherComponent, GeoMapComponent, GeoMapController, GeoMapHelpComponent, GeoMapLayerCardComponent, GeoMapLayerPanelComponent, GeoMapLayerService, GeoMapLayersDrawerComponent, GeoMapLegendComponent, GeoMapLocateComponent, GeoMapLocationChipComponent, GeoMapMeasureComponent, GeoMapOpacityComponent, GeoMapParcelPopupComponent, GeoMapProjectionError, GeoMapProjectionService, GeoMapSearchComponent, GeoMapService, GeoMapShellComponent, GeoMapSnapshotComponent, GeoMapSwipeComponent, GeoMapToolbarComponent, GeoMapZoomComponent, GeoOverlapResultComponent, GeoPageHeaderComponent, GeoPageTitleComponent, GeoPaginationComponent, GeoRadioComponent, GeoRowActionsComponent, GeoSelectComponent, GeoSliderComponent, GeoStatCardComponent, GeoStatusTagComponent, GeoStepFormLayoutComponent, GeoStepperComponent, GeoSwitchComponent, GeoTabDirective, GeoTableComponent, GeoTableFilterComponent, GeoTablePaginationComponent, GeoTableToolbarComponent, GeoTabsComponent, GeoTextareaComponent, GeoToastComponent, GeoToastService, GeoTreeComponent, GeoTypographyComponent, GeoUploadComponent, NgZorroAntdModule, UI_ALERT_DEFAULT_TITLES, UI_STATUS_LABELS, UI_TABLE_MOBILE_BREAKPOINT, applyColumnPickerState, cssVar, geoColorCssVars, geoColorTokens, geoFormatBytes, geoFormatSpeed, geoRadiusCssVars, geoRadiusTokens, geoShadowTokens, geoTypographyTokens, geoUploadPercent, loadColumnPickerState, mergeColumnPickerItems, pickInlineRowActions, pickOverflowRowActions, saveColumnPickerState };
8152
8226
  //# sourceMappingURL=geoit-ui.mjs.map