@geoit/ui 0.0.4 → 0.0.5
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.
- package/AGENTS.md +12 -8
- package/README.md +49 -62
- package/ai/AGENTS.md +38 -28
- package/ai/README.md +35 -1
- package/ai/catalog.json +2796 -288
- package/ai/components/geo-alert.md +3 -3
- package/ai/components/geo-back-button.md +2 -2
- package/ai/components/geo-breadcrumb.md +1 -1
- package/ai/components/geo-button.md +3 -3
- package/ai/components/geo-chart.md +103 -0
- package/ai/components/geo-checkbox.md +4 -6
- package/ai/components/geo-column-picker.md +3 -3
- package/ai/components/geo-confirm-modal.md +4 -5
- package/ai/components/geo-dashboard.md +91 -0
- package/ai/components/geo-date-picker.md +5 -3
- package/ai/components/geo-date-range-picker.md +5 -3
- package/ai/components/geo-empty-state.md +75 -0
- package/ai/components/geo-feedback-form.md +97 -0
- package/ai/components/geo-file-picker.md +4 -2
- package/ai/components/geo-forgot-password.md +78 -0
- package/ai/components/geo-form-modal.md +9 -10
- package/ai/components/geo-icon.md +3 -3
- package/ai/components/geo-input.md +8 -6
- package/ai/components/geo-layout-footer.md +70 -0
- package/ai/components/geo-layout-header-actions.md +82 -0
- package/ai/components/geo-layout-header.md +89 -0
- package/ai/components/geo-layout-sidebar.md +86 -0
- package/ai/components/geo-layout.md +155 -0
- package/ai/components/geo-list-page.md +72 -0
- package/ai/components/geo-login.md +94 -0
- package/ai/components/geo-map-admin-filter.md +80 -0
- package/ai/components/geo-map-basemap-switcher.md +75 -0
- package/ai/components/geo-map-help.md +72 -0
- package/ai/components/geo-map-layer-card.md +73 -0
- package/ai/components/geo-map-layer-panel.md +75 -0
- package/ai/components/geo-map-layers-drawer.md +78 -0
- package/ai/components/geo-map-legend.md +74 -0
- package/ai/components/geo-map-locate.md +75 -0
- package/ai/components/geo-map-location-chip.md +71 -0
- package/ai/components/geo-map-measure.md +74 -0
- package/ai/components/geo-map-opacity.md +75 -0
- package/ai/components/geo-map-parcel-popup.md +79 -0
- package/ai/components/geo-map-search.md +83 -0
- package/ai/components/geo-map-shell.md +110 -0
- package/ai/components/geo-map-snapshot.md +75 -0
- package/ai/components/geo-map-swipe.md +73 -0
- package/ai/components/geo-map-toolbar.md +76 -0
- package/ai/components/geo-map-zoom.md +74 -0
- package/ai/components/geo-map.md +205 -0
- package/ai/components/geo-overlap-result.md +88 -0
- package/ai/components/geo-page-header.md +72 -0
- package/ai/components/geo-page-title.md +1 -1
- package/ai/components/geo-pagination.md +4 -7
- package/ai/components/geo-radio.md +3 -1
- package/ai/components/geo-row-actions.md +3 -3
- package/ai/components/geo-select.md +4 -2
- package/ai/components/geo-slider.md +5 -7
- package/ai/components/geo-stat-card.md +98 -0
- package/ai/components/geo-status-tag.md +2 -2
- package/ai/components/geo-step-form-layout.md +7 -8
- package/ai/components/geo-stepper.md +3 -4
- package/ai/components/geo-table-filter.md +4 -5
- package/ai/components/geo-table-pagination.md +4 -7
- package/ai/components/geo-table-toolbar.md +7 -7
- package/ai/components/geo-table.md +17 -20
- package/ai/components/geo-tabs.md +4 -6
- package/ai/components/geo-textarea.md +4 -2
- package/ai/components/geo-toast.md +4 -4
- package/ai/components/geo-tree.md +4 -6
- package/ai/components/geo-typography.md +1 -1
- package/ai/components/geo-upload.md +9 -10
- package/ai/mockup.html +1194 -0
- package/ai/recipes.md +98 -85
- package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +19 -36
- package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +14 -24
- package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +8 -11
- package/esm2022/lib/figma/geo-button/geo-button.component.mjs +30 -59
- package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +88 -0
- package/esm2022/lib/figma/geo-chart/geo-chart.types.mjs +2 -0
- package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +11 -22
- package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +22 -54
- package/esm2022/lib/figma/geo-dashboard/geo-dashboard.component.mjs +49 -0
- package/esm2022/lib/figma/geo-dashboard/geo-dashboard.types.mjs +2 -0
- package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +48 -78
- package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +47 -75
- package/esm2022/lib/figma/geo-empty-state/geo-empty-state.component.mjs +25 -0
- package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.component.mjs +75 -0
- package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.types.mjs +2 -0
- package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +59 -81
- package/esm2022/lib/figma/geo-forgot-password/geo-forgot-password.component.mjs +51 -0
- package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +45 -112
- package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +22 -32
- package/esm2022/lib/figma/geo-input/geo-input.component.mjs +41 -70
- package/esm2022/lib/figma/geo-layout/footer/geo-layout-footer.component.mjs +18 -0
- package/esm2022/lib/figma/geo-layout/geo-layout-actions.directive.mjs +15 -0
- package/esm2022/lib/figma/geo-layout/geo-layout.component.mjs +79 -0
- package/esm2022/lib/figma/geo-layout/geo-layout.types.mjs +42 -0
- package/esm2022/lib/figma/geo-layout/header/geo-layout-header.component.mjs +60 -0
- package/esm2022/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.mjs +70 -0
- package/esm2022/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.mjs +90 -0
- package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +22 -0
- package/esm2022/lib/figma/geo-login/geo-login.component.mjs +58 -0
- package/esm2022/lib/figma/geo-login/geo-login.types.mjs +2 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +52 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +61 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.mjs +26 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.mjs +24 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.mjs +146 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +37 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +30 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +72 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.mjs +21 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.mjs +375 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +94 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +136 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +182 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +577 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +93 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.mjs +129 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +64 -0
- package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +295 -0
- package/esm2022/lib/figma/geo-map/geo-map-toolbar.icons.mjs +18 -0
- package/esm2022/lib/figma/geo-map/geo-map.component.mjs +144 -0
- package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +497 -0
- package/esm2022/lib/figma/geo-map/geo-map.controller.mjs +71 -0
- package/esm2022/lib/figma/geo-map/geo-map.types.mjs +2 -0
- package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +368 -0
- package/esm2022/lib/figma/geo-map/services/geo-map-projection.service.mjs +110 -0
- package/esm2022/lib/figma/geo-map/services/geo-map.service.mjs +540 -0
- package/esm2022/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.mjs +47 -0
- package/esm2022/lib/figma/geo-map/utils/geo-map-interactions.util.mjs +30 -0
- package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.component.mjs +25 -0
- package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.types.mjs +2 -0
- package/esm2022/lib/figma/geo-page-header/geo-page-header.component.mjs +23 -0
- package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +20 -35
- package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +13 -43
- package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +32 -52
- package/esm2022/lib/figma/geo-select/geo-select.component.mjs +46 -72
- package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +12 -28
- package/esm2022/lib/figma/geo-stat-card/geo-stat-card.component.mjs +163 -0
- package/esm2022/lib/figma/geo-stat-card/geo-stat-card.types.mjs +2 -0
- package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +23 -27
- package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +39 -96
- package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +18 -33
- package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +14 -24
- package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +18 -36
- package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +41 -98
- package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +40 -73
- package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +26 -56
- package/esm2022/lib/figma/geo-table/geo-table.component.mjs +110 -210
- package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +33 -63
- package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +28 -44
- package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +18 -39
- package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +12 -40
- package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +49 -64
- package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +50 -101
- package/esm2022/lib/figma/index.mjs +50 -1
- package/esm2022/lib/styles/tokens.mjs +56 -24
- package/fesm2022/geoit-ui.mjs +5981 -1825
- package/fesm2022/geoit-ui.mjs.map +1 -1
- package/lib/figma/geo-alert/geo-alert.component.d.ts +10 -11
- package/lib/figma/geo-back-button/geo-back-button.component.d.ts +6 -7
- package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +2 -2
- package/lib/figma/geo-button/geo-button.component.d.ts +21 -17
- package/lib/figma/geo-chart/geo-chart.component.d.ts +40 -0
- package/lib/figma/geo-chart/geo-chart.types.d.ts +13 -0
- package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +6 -7
- package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +15 -17
- package/lib/figma/geo-dashboard/geo-dashboard.component.d.ts +29 -0
- package/lib/figma/geo-dashboard/geo-dashboard.types.d.ts +7 -0
- package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +26 -21
- package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +25 -20
- package/lib/figma/geo-empty-state/geo-empty-state.component.d.ts +17 -0
- package/lib/figma/geo-feedback-form/geo-feedback-form.component.d.ts +36 -0
- package/lib/figma/geo-feedback-form/geo-feedback-form.types.d.ts +8 -0
- package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +23 -20
- package/lib/figma/geo-forgot-password/geo-forgot-password.component.d.ts +24 -0
- package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +33 -35
- package/lib/figma/geo-icon/geo-icon.component.d.ts +7 -7
- package/lib/figma/geo-input/geo-input.component.d.ts +23 -21
- package/lib/figma/geo-layout/footer/geo-layout-footer.component.d.ts +10 -0
- package/lib/figma/geo-layout/geo-layout-actions.directive.d.ts +6 -0
- package/lib/figma/geo-layout/geo-layout.component.d.ts +48 -0
- package/lib/figma/geo-layout/geo-layout.types.d.ts +44 -0
- package/lib/figma/geo-layout/header/geo-layout-header.component.d.ts +31 -0
- package/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.d.ts +32 -0
- package/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.d.ts +34 -0
- package/lib/figma/geo-list-page/geo-list-page.component.d.ts +16 -0
- package/lib/figma/geo-login/geo-login.component.d.ts +27 -0
- package/lib/figma/geo-login/geo-login.types.d.ts +6 -0
- package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +28 -0
- package/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.d.ts +26 -0
- package/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.d.ts +20 -0
- package/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.d.ts +15 -0
- package/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.d.ts +40 -0
- package/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.d.ts +25 -0
- package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +18 -0
- package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.d.ts +24 -0
- package/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.d.ts +14 -0
- package/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.d.ts +49 -0
- package/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.d.ts +30 -0
- package/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.d.ts +44 -0
- package/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.d.ts +56 -0
- package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +103 -0
- package/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.d.ts +21 -0
- package/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.d.ts +33 -0
- package/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.d.ts +30 -0
- package/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.d.ts +67 -0
- package/lib/figma/geo-map/geo-map-toolbar.icons.d.ts +17 -0
- package/lib/figma/geo-map/geo-map.component.d.ts +53 -0
- package/lib/figma/geo-map/geo-map.constants.d.ts +73 -0
- package/lib/figma/geo-map/geo-map.controller.d.ts +49 -0
- package/lib/figma/geo-map/geo-map.types.d.ts +224 -0
- package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +42 -0
- package/lib/figma/geo-map/services/geo-map-projection.service.d.ts +32 -0
- package/lib/figma/geo-map/services/geo-map.service.d.ts +99 -0
- package/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.d.ts +13 -0
- package/lib/figma/geo-map/utils/geo-map-interactions.util.d.ts +9 -0
- package/lib/figma/geo-overlap-result/geo-overlap-result.component.d.ts +18 -0
- package/lib/figma/geo-overlap-result/geo-overlap-result.types.d.ts +7 -0
- package/lib/figma/geo-page-header/geo-page-header.component.d.ts +16 -0
- package/lib/figma/geo-page-title/geo-page-title.component.d.ts +9 -9
- package/lib/figma/geo-pagination/geo-pagination.component.d.ts +9 -14
- package/lib/figma/geo-radio/geo-radio.component.d.ts +17 -15
- package/lib/figma/geo-select/geo-select.component.d.ts +24 -19
- package/lib/figma/geo-slider/geo-slider.component.d.ts +7 -9
- package/lib/figma/geo-stat-card/geo-stat-card.component.d.ts +50 -0
- package/lib/figma/geo-stat-card/geo-stat-card.types.d.ts +11 -0
- package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +7 -7
- package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +27 -29
- package/lib/figma/geo-stepper/geo-stepper.component.d.ts +6 -8
- package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +6 -7
- package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +11 -12
- package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +21 -28
- package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +17 -20
- package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +17 -18
- package/lib/figma/geo-table/geo-table.component.d.ts +58 -62
- package/lib/figma/geo-tabs/geo-tabs.component.d.ts +14 -17
- package/lib/figma/geo-textarea/geo-textarea.component.d.ts +15 -13
- package/lib/figma/geo-toast/geo-toast.component.d.ts +11 -12
- package/lib/figma/geo-tree/geo-tree.component.d.ts +8 -13
- package/lib/figma/geo-typography/geo-typography.component.d.ts +13 -13
- package/lib/figma/geo-upload/geo-upload.component.d.ts +26 -28
- package/lib/figma/index.d.ts +49 -0
- package/lib/styles/tokens.d.ts +56 -23
- package/package.json +4 -2
- package/src/lib/figma/geo-map/assets/toolbar/fullscreen.svg +8 -0
- package/src/lib/figma/geo-map/assets/toolbar/home.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/layers.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/measure-area.svg +12 -0
- package/src/lib/figma/geo-map/assets/toolbar/measure-distance.svg +5 -0
- package/src/lib/figma/geo-map/assets/toolbar/pan.svg +13 -0
- package/src/lib/figma/geo-map/assets/toolbar/search.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/zoom-in.svg +3 -0
- package/src/lib/figma/geo-map/assets/toolbar/zoom-out.svg +5 -0
- package/src/lib/styles/design-tokens.scss +108 -35
- package/src/lib/styles/scrollbar.scss +2 -2
- package/src/lib/styles/theme.scss +1 -1
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, untracked, viewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { GEO_MAP_DEFAULT_BASEMAP_OPTIONS, GEO_MAP_DEFAULT_CENTER, GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326, GEO_MAP_DEFAULT_TOOLBAR_ACTIONS, 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_TRAFFIC_LAYER_ID, GEO_MAP_TRAFFIC_OVERLAY, } from '../../geo-map.constants';
|
|
3
|
+
import { GeoMapAdminFilterComponent } from '../geo-map-admin-filter/geo-map-admin-filter.component';
|
|
4
|
+
import { GeoMapBasemapSwitcherComponent } from '../geo-map-basemap-switcher/geo-map-basemap-switcher.component';
|
|
5
|
+
import { GeoMapHelpComponent } from '../geo-map-help/geo-map-help.component';
|
|
6
|
+
import { GeoMapLayersDrawerComponent } from '../geo-map-layers-drawer/geo-map-layers-drawer.component';
|
|
7
|
+
import { GeoMapLegendComponent } from '../geo-map-legend/geo-map-legend.component';
|
|
8
|
+
import { GeoMapLocationChipComponent } from '../geo-map-location-chip/geo-map-location-chip.component';
|
|
9
|
+
import { GeoMapMeasureComponent } from '../geo-map-measure/geo-map-measure.component';
|
|
10
|
+
import { GeoMapParcelPopupComponent } from '../geo-map-parcel-popup/geo-map-parcel-popup.component';
|
|
11
|
+
import { GeoMapSearchComponent } from '../geo-map-search/geo-map-search.component';
|
|
12
|
+
import { GeoMapSnapshotComponent } from '../geo-map-snapshot/geo-map-snapshot.component';
|
|
13
|
+
import { GeoMapSwipeComponent } from '../geo-map-swipe/geo-map-swipe.component';
|
|
14
|
+
import { GeoMapToolbarComponent } from '../geo-map-toolbar/geo-map-toolbar.component';
|
|
15
|
+
import { GeoMapZoomComponent } from '../geo-map-zoom/geo-map-zoom.component';
|
|
16
|
+
import { GeoMapComponent } from '../../geo-map.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
/**
|
|
19
|
+
* Map viewport + portal chrome (toolbar, layers drawer, legend, help, swipe, …).
|
|
20
|
+
*
|
|
21
|
+
* @summary Composed map shell with chrome tools for Storybook / portal.
|
|
22
|
+
* @whenToUse Public map page chrome (cổng công khai).
|
|
23
|
+
* @doNotUseWhen Need only the raw OL host — use geo-map.
|
|
24
|
+
*/
|
|
25
|
+
export class GeoMapShellComponent {
|
|
26
|
+
destroyRef = inject(DestroyRef);
|
|
27
|
+
snapshotRef = viewChild(GeoMapSnapshotComponent);
|
|
28
|
+
zoomRef = viewChild(GeoMapZoomComponent);
|
|
29
|
+
center = input([...GEO_MAP_DEFAULT_CENTER]);
|
|
30
|
+
zoom = input(GEO_MAP_DEFAULT_ZOOM);
|
|
31
|
+
height = input('560px');
|
|
32
|
+
showMousePosition = input(false);
|
|
33
|
+
basemapOptions = input(GEO_MAP_DEFAULT_BASEMAP_OPTIONS);
|
|
34
|
+
toolbarActions = input(GEO_MAP_DEFAULT_TOOLBAR_ACTIONS);
|
|
35
|
+
/** Extra overlays merged after demo thematic + traffic. */
|
|
36
|
+
layers = input([]);
|
|
37
|
+
legendItems = input(GEO_MAP_DEMO_LEGEND_ITEMS);
|
|
38
|
+
showNav = input(true);
|
|
39
|
+
includeDemoLayers = input(true);
|
|
40
|
+
adminNodes = input(GEO_MAP_DEMO_ADMIN_NODES);
|
|
41
|
+
locationLabel = input('Phường 1 — TP Đà Lạt, Lâm Đồng');
|
|
42
|
+
parcelAudience = input('citizen');
|
|
43
|
+
provinceExtent = input(GEO_MAP_DEFAULT_PROVINCE_EXTENT_4326);
|
|
44
|
+
/** When true, shell seeds mock search results (Storybook / demos). */
|
|
45
|
+
demoSearch = input(true);
|
|
46
|
+
/**
|
|
47
|
+
* `location` — Home opens ĐVHC filter (default).
|
|
48
|
+
* `emit` — Home only emits `actionClick` (e.g. portal navigates to login/dashboard).
|
|
49
|
+
*/
|
|
50
|
+
homeMode = input('location');
|
|
51
|
+
basemapId = model('osm');
|
|
52
|
+
measureMode = model('none');
|
|
53
|
+
checkedMap = model({ traffic: false });
|
|
54
|
+
layersOpen = model(false);
|
|
55
|
+
legendOpen = model(false);
|
|
56
|
+
helpOpen = model(false);
|
|
57
|
+
swipeActive = model(false);
|
|
58
|
+
searchOpen = model(false);
|
|
59
|
+
adminFilterOpen = model(false);
|
|
60
|
+
parcelOpen = model(false);
|
|
61
|
+
managedLayers = model([]);
|
|
62
|
+
searchResults = model([]);
|
|
63
|
+
selectedParcel = model(null);
|
|
64
|
+
adminCheckedKeys = model([]);
|
|
65
|
+
adminExpandedKeys = model(['lam-dong']);
|
|
66
|
+
mapReady = output();
|
|
67
|
+
mapClick = output();
|
|
68
|
+
locateDenied = output();
|
|
69
|
+
actionClick = output();
|
|
70
|
+
search = output();
|
|
71
|
+
searchReset = output();
|
|
72
|
+
resultSelect = output();
|
|
73
|
+
parcelExport = output();
|
|
74
|
+
adminApply = output();
|
|
75
|
+
controller = signal(null);
|
|
76
|
+
/** Active map pointer tool (`none` = default arrow cursor). */
|
|
77
|
+
toolMode = signal('none');
|
|
78
|
+
/** When true, parcel Back returns to search popover. */
|
|
79
|
+
parcelFromSearch = signal(false);
|
|
80
|
+
panCursorBound = false;
|
|
81
|
+
onPanPointerDown = () => {
|
|
82
|
+
if (this.toolMode() === 'pan') {
|
|
83
|
+
this.setMapCursor('grabbing');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
onPanPointerUp = () => {
|
|
87
|
+
if (this.toolMode() === 'pan') {
|
|
88
|
+
this.setMapCursor('grab');
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
constructor() {
|
|
92
|
+
// Enforce a single left chrome popover (search / ĐVHC / parcel / layers / legend).
|
|
93
|
+
effect(() => {
|
|
94
|
+
const search = this.searchOpen();
|
|
95
|
+
const admin = this.adminFilterOpen();
|
|
96
|
+
const parcel = this.parcelOpen();
|
|
97
|
+
const layers = this.layersOpen();
|
|
98
|
+
const legend = this.legendOpen();
|
|
99
|
+
const openCount = Number(search) +
|
|
100
|
+
Number(admin) +
|
|
101
|
+
Number(parcel) +
|
|
102
|
+
Number(layers) +
|
|
103
|
+
Number(legend);
|
|
104
|
+
if (openCount <= 1) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
untracked(() => {
|
|
108
|
+
if (parcel) {
|
|
109
|
+
this.closePanelsExcept('parcel');
|
|
110
|
+
}
|
|
111
|
+
else if (layers) {
|
|
112
|
+
this.closePanelsExcept('layers');
|
|
113
|
+
}
|
|
114
|
+
else if (legend) {
|
|
115
|
+
this.closePanelsExcept('legend');
|
|
116
|
+
}
|
|
117
|
+
else if (search) {
|
|
118
|
+
this.closePanelsExcept('search');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.closePanelsExcept('admin');
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}, { allowSignalWrites: true });
|
|
125
|
+
// When measure finishes / cancels, return to idle + default cursor.
|
|
126
|
+
effect(() => {
|
|
127
|
+
const mode = this.measureMode();
|
|
128
|
+
if (mode !== 'none') {
|
|
129
|
+
untracked(() => {
|
|
130
|
+
this.toolMode.set(mode);
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
untracked(() => {
|
|
135
|
+
const tool = this.toolMode();
|
|
136
|
+
if (tool === 'distance' || tool === 'area') {
|
|
137
|
+
this.toolMode.set('none');
|
|
138
|
+
this.setMapCursor(null);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}, { allowSignalWrites: true });
|
|
142
|
+
this.destroyRef.onDestroy(() => this.unbindPanCursor());
|
|
143
|
+
}
|
|
144
|
+
basemap = computed(() => {
|
|
145
|
+
const id = this.basemapId();
|
|
146
|
+
const option = this.basemapOptions().find((item) => item.id === id);
|
|
147
|
+
return option?.basemap ?? 'osm';
|
|
148
|
+
});
|
|
149
|
+
resolvedToolbarActions = computed(() => {
|
|
150
|
+
const mode = this.measureMode();
|
|
151
|
+
const tool = this.toolMode();
|
|
152
|
+
const swipe = this.swipeActive();
|
|
153
|
+
const layersOpen = this.layersOpen();
|
|
154
|
+
const legendOpen = this.legendOpen();
|
|
155
|
+
const searchOpen = this.searchOpen();
|
|
156
|
+
const adminOpen = this.adminFilterOpen();
|
|
157
|
+
const fullscreen = this.zoomRef()?.isFullscreen() ?? false;
|
|
158
|
+
return this.toolbarActions().map((action) => {
|
|
159
|
+
if (action.id === 'home' && this.homeMode() === 'emit') {
|
|
160
|
+
return {
|
|
161
|
+
...action,
|
|
162
|
+
label: 'Trang chủ',
|
|
163
|
+
tooltip: 'Về trang chủ / đăng nhập',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (action.id === 'pan') {
|
|
167
|
+
return { ...action, active: tool === 'pan' && mode === 'none' };
|
|
168
|
+
}
|
|
169
|
+
if (action.id === 'measure-distance') {
|
|
170
|
+
return { ...action, active: mode === 'distance' };
|
|
171
|
+
}
|
|
172
|
+
if (action.id === 'measure-area') {
|
|
173
|
+
return { ...action, active: mode === 'area' };
|
|
174
|
+
}
|
|
175
|
+
if (action.id === 'swipe') {
|
|
176
|
+
return { ...action, active: swipe };
|
|
177
|
+
}
|
|
178
|
+
if (action.id === 'layers') {
|
|
179
|
+
return { ...action, active: layersOpen };
|
|
180
|
+
}
|
|
181
|
+
if (action.id === 'legend') {
|
|
182
|
+
return { ...action, active: legendOpen };
|
|
183
|
+
}
|
|
184
|
+
if (action.id === 'search') {
|
|
185
|
+
return { ...action, active: searchOpen };
|
|
186
|
+
}
|
|
187
|
+
if (action.id === 'admin-filter') {
|
|
188
|
+
return { ...action, active: adminOpen };
|
|
189
|
+
}
|
|
190
|
+
if (action.id === 'fullscreen') {
|
|
191
|
+
return {
|
|
192
|
+
...action,
|
|
193
|
+
active: fullscreen,
|
|
194
|
+
icon: fullscreen ? 'fullscreen-exit' : 'fullscreen',
|
|
195
|
+
iconSrc: fullscreen ? undefined : action.iconSrc,
|
|
196
|
+
tooltip: fullscreen ? 'Thoát toàn màn hình' : 'Xem toàn bản đồ',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return action;
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
resolvedLayers = computed(() => {
|
|
203
|
+
const trafficOn = !!this.checkedMap()['traffic'];
|
|
204
|
+
const traffic = {
|
|
205
|
+
...GEO_MAP_TRAFFIC_OVERLAY,
|
|
206
|
+
visible: trafficOn,
|
|
207
|
+
};
|
|
208
|
+
const managed = this.managedLayers();
|
|
209
|
+
if (managed.length) {
|
|
210
|
+
return [...managed, traffic];
|
|
211
|
+
}
|
|
212
|
+
const demo = this.includeDemoLayers() ? GEO_MAP_DEMO_THEMATIC_LAYERS : [];
|
|
213
|
+
return [...demo, traffic, ...this.layers()];
|
|
214
|
+
});
|
|
215
|
+
onMapReady(ctrl) {
|
|
216
|
+
this.controller.set(ctrl);
|
|
217
|
+
if (!this.managedLayers().length) {
|
|
218
|
+
const seed = this.includeDemoLayers()
|
|
219
|
+
? GEO_MAP_DEMO_THEMATIC_LAYERS.map((layer) => ({ ...layer }))
|
|
220
|
+
: this.layers().map((layer) => ({ ...layer }));
|
|
221
|
+
this.managedLayers.set(seed);
|
|
222
|
+
}
|
|
223
|
+
this.bindPanCursor(ctrl);
|
|
224
|
+
if (this.toolMode() === 'pan') {
|
|
225
|
+
this.applyPanCursor();
|
|
226
|
+
}
|
|
227
|
+
this.mapReady.emit(ctrl);
|
|
228
|
+
}
|
|
229
|
+
onMapClick(event) {
|
|
230
|
+
this.parcelFromSearch.set(false);
|
|
231
|
+
this.mapClick.emit(event);
|
|
232
|
+
}
|
|
233
|
+
onBasemapChange(basemap) {
|
|
234
|
+
this.controller()?.setBasemap(basemap);
|
|
235
|
+
}
|
|
236
|
+
onToolbarAction(action) {
|
|
237
|
+
this.actionClick.emit(action);
|
|
238
|
+
switch (action.id) {
|
|
239
|
+
case 'home':
|
|
240
|
+
if (this.homeMode() === 'location') {
|
|
241
|
+
if (this.adminFilterOpen()) {
|
|
242
|
+
this.adminFilterOpen.set(false);
|
|
243
|
+
this.zoomRef()?.fitProvince();
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
this.openPanel('admin');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
case 'admin-filter':
|
|
251
|
+
if (this.adminFilterOpen()) {
|
|
252
|
+
this.adminFilterOpen.set(false);
|
|
253
|
+
this.zoomRef()?.fitProvince();
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.openPanel('admin');
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case 'fit-province':
|
|
260
|
+
this.zoomRef()?.fitProvince();
|
|
261
|
+
break;
|
|
262
|
+
case 'pan':
|
|
263
|
+
if (this.toolMode() === 'pan') {
|
|
264
|
+
this.exitToolMode();
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
this.enterPanMode();
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
case 'zoom-in':
|
|
271
|
+
this.zoomRef()?.zoomIn();
|
|
272
|
+
break;
|
|
273
|
+
case 'zoom-out':
|
|
274
|
+
this.zoomRef()?.zoomOut();
|
|
275
|
+
break;
|
|
276
|
+
case 'fullscreen':
|
|
277
|
+
this.zoomRef()?.toggleFullscreen();
|
|
278
|
+
break;
|
|
279
|
+
case 'search':
|
|
280
|
+
if (this.searchOpen()) {
|
|
281
|
+
this.searchOpen.set(false);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
this.openPanel('search');
|
|
285
|
+
}
|
|
286
|
+
break;
|
|
287
|
+
case 'layers':
|
|
288
|
+
if (this.layersOpen()) {
|
|
289
|
+
this.layersOpen.set(false);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.openPanel('layers');
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
case 'legend':
|
|
296
|
+
if (this.legendOpen()) {
|
|
297
|
+
this.legendOpen.set(false);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.openPanel('legend');
|
|
301
|
+
}
|
|
302
|
+
break;
|
|
303
|
+
case 'help':
|
|
304
|
+
this.helpOpen.set(true);
|
|
305
|
+
break;
|
|
306
|
+
case 'swipe':
|
|
307
|
+
this.measureMode.set('none');
|
|
308
|
+
this.toolMode.set('none');
|
|
309
|
+
this.zoomRef()?.resetInteractionMode();
|
|
310
|
+
this.setMapCursor(null);
|
|
311
|
+
this.swipeActive.update((v) => !v);
|
|
312
|
+
if (this.swipeActive()) {
|
|
313
|
+
this.ensureSwipeOverlayVisible();
|
|
314
|
+
}
|
|
315
|
+
break;
|
|
316
|
+
case 'measure-distance':
|
|
317
|
+
this.swipeActive.set(false);
|
|
318
|
+
this.zoomRef()?.resetInteractionMode();
|
|
319
|
+
if (this.measureMode() === 'distance') {
|
|
320
|
+
this.exitToolMode();
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
this.toolMode.set('distance');
|
|
324
|
+
this.measureMode.set('distance');
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
case 'measure-area':
|
|
328
|
+
this.swipeActive.set(false);
|
|
329
|
+
this.zoomRef()?.resetInteractionMode();
|
|
330
|
+
if (this.measureMode() === 'area') {
|
|
331
|
+
this.exitToolMode();
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.toolMode.set('area');
|
|
335
|
+
this.measureMode.set('area');
|
|
336
|
+
}
|
|
337
|
+
break;
|
|
338
|
+
case 'snapshot':
|
|
339
|
+
this.snapshotRef()?.capture();
|
|
340
|
+
break;
|
|
341
|
+
default:
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
onToolbarToggle(event) {
|
|
346
|
+
if (event.action.id === 'traffic') {
|
|
347
|
+
this.controller()?.setLayerVisibility(GEO_MAP_TRAFFIC_LAYER_ID, event.checked);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
onSearch(query) {
|
|
351
|
+
this.search.emit(query);
|
|
352
|
+
if (!this.demoSearch()) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const demo = this.buildDemoSearchResults(query);
|
|
356
|
+
this.searchResults.set(demo);
|
|
357
|
+
const geojsonCollection = {
|
|
358
|
+
type: 'FeatureCollection',
|
|
359
|
+
features: demo
|
|
360
|
+
.map((item) => item.geojson)
|
|
361
|
+
.filter((item) => !!item),
|
|
362
|
+
};
|
|
363
|
+
if (geojsonCollection.features.length) {
|
|
364
|
+
this.controller()?.setHighlightFromGeoJson(geojsonCollection);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
onSearchReset() {
|
|
368
|
+
this.searchResults.set([]);
|
|
369
|
+
this.selectedParcel.set(null);
|
|
370
|
+
this.parcelOpen.set(false);
|
|
371
|
+
this.controller()?.clearHighlight();
|
|
372
|
+
this.searchReset.emit();
|
|
373
|
+
}
|
|
374
|
+
onParcelClosed() {
|
|
375
|
+
this.parcelFromSearch.set(false);
|
|
376
|
+
this.selectedParcel.set(null);
|
|
377
|
+
this.controller()?.clearHighlight();
|
|
378
|
+
}
|
|
379
|
+
onParcelBack() {
|
|
380
|
+
const fromSearch = this.parcelFromSearch();
|
|
381
|
+
this.parcelOpen.set(false);
|
|
382
|
+
if (fromSearch) {
|
|
383
|
+
this.parcelFromSearch.set(false);
|
|
384
|
+
this.openPanel('search');
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
this.selectedParcel.set(null);
|
|
388
|
+
this.controller()?.clearHighlight();
|
|
389
|
+
}
|
|
390
|
+
onResultSelect(item) {
|
|
391
|
+
this.resultSelect.emit(item);
|
|
392
|
+
if (item.geojson) {
|
|
393
|
+
this.controller()?.setHighlightFromGeoJson(item.geojson);
|
|
394
|
+
}
|
|
395
|
+
else if (item.extent4326) {
|
|
396
|
+
this.controller()?.fitLonLatExtent(item.extent4326);
|
|
397
|
+
}
|
|
398
|
+
if (item.parcel) {
|
|
399
|
+
this.parcelFromSearch.set(true);
|
|
400
|
+
this.selectedParcel.set(item.parcel);
|
|
401
|
+
this.openPanel('parcel');
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
onAdminApply(keys) {
|
|
405
|
+
this.adminApply.emit(keys);
|
|
406
|
+
// Demo: fit a sample ward bbox when a leaf is selected.
|
|
407
|
+
if (this.demoSearch() && keys.some((key) => String(key).startsWith('xa-'))) {
|
|
408
|
+
this.controller()?.fitLonLatExtent([108.42, 11.92, 108.5, 11.98], {
|
|
409
|
+
maxZoom: 14,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
onFitProvince() {
|
|
414
|
+
this.controller()?.fitProvince(this.provinceExtent());
|
|
415
|
+
}
|
|
416
|
+
onAdminClosed() {
|
|
417
|
+
this.zoomRef()?.fitProvince();
|
|
418
|
+
}
|
|
419
|
+
/** Open one left chrome popover; close the others to avoid stacked scroll. */
|
|
420
|
+
openPanel(panel) {
|
|
421
|
+
this.closePanelsExcept(panel);
|
|
422
|
+
if (panel === 'search') {
|
|
423
|
+
this.searchOpen.set(true);
|
|
424
|
+
}
|
|
425
|
+
else if (panel === 'admin') {
|
|
426
|
+
this.adminFilterOpen.set(true);
|
|
427
|
+
}
|
|
428
|
+
else if (panel === 'parcel') {
|
|
429
|
+
this.parcelOpen.set(true);
|
|
430
|
+
}
|
|
431
|
+
else if (panel === 'layers') {
|
|
432
|
+
this.layersOpen.set(true);
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.legendOpen.set(true);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
closePanelsExcept(keep) {
|
|
439
|
+
if (keep !== 'search' && this.searchOpen()) {
|
|
440
|
+
this.searchOpen.set(false);
|
|
441
|
+
}
|
|
442
|
+
if (keep !== 'admin' && this.adminFilterOpen()) {
|
|
443
|
+
this.adminFilterOpen.set(false);
|
|
444
|
+
}
|
|
445
|
+
if (keep !== 'parcel' && this.parcelOpen()) {
|
|
446
|
+
this.parcelOpen.set(false);
|
|
447
|
+
}
|
|
448
|
+
if (keep !== 'layers' && this.layersOpen()) {
|
|
449
|
+
this.layersOpen.set(false);
|
|
450
|
+
}
|
|
451
|
+
if (keep !== 'legend' && this.legendOpen()) {
|
|
452
|
+
this.legendOpen.set(false);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
enterPanMode() {
|
|
456
|
+
this.toolMode.set('pan');
|
|
457
|
+
this.measureMode.set('none');
|
|
458
|
+
this.swipeActive.set(false);
|
|
459
|
+
this.zoomRef()?.resetInteractionMode();
|
|
460
|
+
this.applyPanCursor();
|
|
461
|
+
}
|
|
462
|
+
exitToolMode() {
|
|
463
|
+
this.toolMode.set('none');
|
|
464
|
+
this.measureMode.set('none');
|
|
465
|
+
this.swipeActive.set(false);
|
|
466
|
+
this.zoomRef()?.resetInteractionMode();
|
|
467
|
+
this.setMapCursor(null);
|
|
468
|
+
}
|
|
469
|
+
applyPanCursor() {
|
|
470
|
+
if (this.toolMode() !== 'pan') {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
this.setMapCursor('grab');
|
|
474
|
+
}
|
|
475
|
+
setMapCursor(cursor) {
|
|
476
|
+
const el = this.controller()?.getMap()?.getTargetElement();
|
|
477
|
+
if (!el) {
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
el.style.cursor = cursor ?? '';
|
|
481
|
+
}
|
|
482
|
+
bindPanCursor(ctrl) {
|
|
483
|
+
const el = ctrl.getMap()?.getTargetElement();
|
|
484
|
+
if (!el || this.panCursorBound) {
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
el.addEventListener('pointerdown', this.onPanPointerDown);
|
|
488
|
+
el.addEventListener('pointerup', this.onPanPointerUp);
|
|
489
|
+
el.addEventListener('pointerleave', this.onPanPointerUp);
|
|
490
|
+
el.addEventListener('pointercancel', this.onPanPointerUp);
|
|
491
|
+
this.panCursorBound = true;
|
|
492
|
+
}
|
|
493
|
+
unbindPanCursor() {
|
|
494
|
+
const el = this.controller()?.getMap()?.getTargetElement();
|
|
495
|
+
if (!el || !this.panCursorBound) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
el.removeEventListener('pointerdown', this.onPanPointerDown);
|
|
499
|
+
el.removeEventListener('pointerup', this.onPanPointerUp);
|
|
500
|
+
el.removeEventListener('pointerleave', this.onPanPointerUp);
|
|
501
|
+
el.removeEventListener('pointercancel', this.onPanPointerUp);
|
|
502
|
+
this.panCursorBound = false;
|
|
503
|
+
}
|
|
504
|
+
buildDemoSearchResults(query) {
|
|
505
|
+
const parcelLayer = GEO_MAP_DEMO_THEMATIC_LAYERS.find((layer) => layer.id === 'demo-parcel' && layer.type === 'geojson');
|
|
506
|
+
const feature = parcelLayer && parcelLayer.type === 'geojson'
|
|
507
|
+
? parcelLayer.data.features?.[0]
|
|
508
|
+
: undefined;
|
|
509
|
+
const keyword = Object.values(query.values)
|
|
510
|
+
.filter(Boolean)
|
|
511
|
+
.join(' ')
|
|
512
|
+
.trim();
|
|
513
|
+
const label = keyword || 'Thửa 12 — Tờ 45';
|
|
514
|
+
return [
|
|
515
|
+
{
|
|
516
|
+
id: 'demo-parcel-12',
|
|
517
|
+
title: `Thửa 12 / Tờ 45`,
|
|
518
|
+
subtitle: label,
|
|
519
|
+
extent4326: [108.45, 11.94, 108.465, 11.952],
|
|
520
|
+
geojson: feature ?? {
|
|
521
|
+
type: 'Feature',
|
|
522
|
+
properties: { parcel: '12', sheet: '45' },
|
|
523
|
+
geometry: {
|
|
524
|
+
type: 'Polygon',
|
|
525
|
+
coordinates: [
|
|
526
|
+
[
|
|
527
|
+
[108.45, 11.94],
|
|
528
|
+
[108.465, 11.94],
|
|
529
|
+
[108.465, 11.952],
|
|
530
|
+
[108.45, 11.952],
|
|
531
|
+
[108.45, 11.94],
|
|
532
|
+
],
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
},
|
|
536
|
+
parcel: { ...GEO_MAP_DEMO_PARCEL_DETAIL },
|
|
537
|
+
},
|
|
538
|
+
];
|
|
539
|
+
}
|
|
540
|
+
ensureSwipeOverlayVisible() {
|
|
541
|
+
const list = this.managedLayers();
|
|
542
|
+
if (!list.length) {
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const anyVisible = list.some((layer) => layer.visible !== false);
|
|
546
|
+
if (anyVisible) {
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
const next = list.map((layer, index) => index === 0 ? { ...layer, visible: true } : layer);
|
|
550
|
+
this.managedLayers.set(next);
|
|
551
|
+
}
|
|
552
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
553
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapShellComponent, isStandalone: true, selector: "geo-map-shell", inputs: { center: { classPropertyName: "center", publicName: "center", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, showMousePosition: { classPropertyName: "showMousePosition", publicName: "showMousePosition", isSignal: true, isRequired: false, transformFunction: null }, basemapOptions: { classPropertyName: "basemapOptions", publicName: "basemapOptions", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, layers: { classPropertyName: "layers", publicName: "layers", isSignal: true, isRequired: false, transformFunction: null }, legendItems: { classPropertyName: "legendItems", publicName: "legendItems", isSignal: true, isRequired: false, transformFunction: null }, showNav: { classPropertyName: "showNav", publicName: "showNav", isSignal: true, isRequired: false, transformFunction: null }, includeDemoLayers: { classPropertyName: "includeDemoLayers", publicName: "includeDemoLayers", isSignal: true, isRequired: false, transformFunction: null }, adminNodes: { classPropertyName: "adminNodes", publicName: "adminNodes", isSignal: true, isRequired: false, transformFunction: null }, locationLabel: { classPropertyName: "locationLabel", publicName: "locationLabel", isSignal: true, isRequired: false, transformFunction: null }, parcelAudience: { classPropertyName: "parcelAudience", publicName: "parcelAudience", isSignal: true, isRequired: false, transformFunction: null }, provinceExtent: { classPropertyName: "provinceExtent", publicName: "provinceExtent", isSignal: true, isRequired: false, transformFunction: null }, demoSearch: { classPropertyName: "demoSearch", publicName: "demoSearch", isSignal: true, isRequired: false, transformFunction: null }, homeMode: { classPropertyName: "homeMode", publicName: "homeMode", isSignal: true, isRequired: false, transformFunction: null }, basemapId: { classPropertyName: "basemapId", publicName: "basemapId", isSignal: true, isRequired: false, transformFunction: null }, measureMode: { classPropertyName: "measureMode", publicName: "measureMode", isSignal: true, isRequired: false, transformFunction: null }, checkedMap: { classPropertyName: "checkedMap", publicName: "checkedMap", isSignal: true, isRequired: false, transformFunction: null }, layersOpen: { classPropertyName: "layersOpen", publicName: "layersOpen", isSignal: true, isRequired: false, transformFunction: null }, legendOpen: { classPropertyName: "legendOpen", publicName: "legendOpen", isSignal: true, isRequired: false, transformFunction: null }, helpOpen: { classPropertyName: "helpOpen", publicName: "helpOpen", isSignal: true, isRequired: false, transformFunction: null }, swipeActive: { classPropertyName: "swipeActive", publicName: "swipeActive", isSignal: true, isRequired: false, transformFunction: null }, searchOpen: { classPropertyName: "searchOpen", publicName: "searchOpen", isSignal: true, isRequired: false, transformFunction: null }, adminFilterOpen: { classPropertyName: "adminFilterOpen", publicName: "adminFilterOpen", isSignal: true, isRequired: false, transformFunction: null }, parcelOpen: { classPropertyName: "parcelOpen", publicName: "parcelOpen", isSignal: true, isRequired: false, transformFunction: null }, managedLayers: { classPropertyName: "managedLayers", publicName: "managedLayers", isSignal: true, isRequired: false, transformFunction: null }, searchResults: { classPropertyName: "searchResults", publicName: "searchResults", isSignal: true, isRequired: false, transformFunction: null }, selectedParcel: { classPropertyName: "selectedParcel", publicName: "selectedParcel", isSignal: true, isRequired: false, transformFunction: null }, adminCheckedKeys: { classPropertyName: "adminCheckedKeys", publicName: "adminCheckedKeys", isSignal: true, isRequired: false, transformFunction: null }, adminExpandedKeys: { classPropertyName: "adminExpandedKeys", publicName: "adminExpandedKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { basemapId: "basemapIdChange", measureMode: "measureModeChange", checkedMap: "checkedMapChange", layersOpen: "layersOpenChange", legendOpen: "legendOpenChange", helpOpen: "helpOpenChange", swipeActive: "swipeActiveChange", searchOpen: "searchOpenChange", adminFilterOpen: "adminFilterOpenChange", parcelOpen: "parcelOpenChange", managedLayers: "managedLayersChange", searchResults: "searchResultsChange", selectedParcel: "selectedParcelChange", adminCheckedKeys: "adminCheckedKeysChange", adminExpandedKeys: "adminExpandedKeysChange", mapReady: "mapReady", mapClick: "mapClick", locateDenied: "locateDenied", actionClick: "actionClick", search: "search", searchReset: "searchReset", resultSelect: "resultSelect", parcelExport: "parcelExport", adminApply: "adminApply" }, host: { properties: { "style.height": "height()" }, classAttribute: "geo-map-shell-host" }, viewQueries: [{ propertyName: "snapshotRef", first: true, predicate: GeoMapSnapshotComponent, descendants: true, isSignal: true }, { propertyName: "zoomRef", first: true, predicate: GeoMapZoomComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"], dependencies: [{ kind: "component", type: GeoMapComponent, selector: "geo-map", inputs: ["center", "zoom", "minZoom", "maxZoom", "viewProjection", "basemap", "layers", "height", "registerProjections", "projections", "showMousePosition", "mousePositionProjection", "showZoomControl"], outputs: ["mapReady", "mapClick", "viewChange", "initError"] }, { kind: "component", type: GeoMapToolbarComponent, selector: "geo-map-toolbar", inputs: ["controller", "actions", "compact", "checkedMap"], outputs: ["checkedMapChange", "actionClick", "actionToggle"] }, { kind: "component", type: GeoMapZoomComponent, selector: "geo-map-zoom", inputs: ["controller", "showNav", "showFitProvince", "provinceExtent", "fullscreenTarget"] }, { kind: "component", type: GeoMapSnapshotComponent, selector: "geo-map-snapshot", inputs: ["controller", "label", "filename"], outputs: ["captured", "captureError"] }, { kind: "component", type: GeoMapMeasureComponent, selector: "geo-map-measure", inputs: ["controller", "mode", "showResult"], outputs: ["modeChange", "measureChange"] }, { kind: "component", type: GeoMapLayersDrawerComponent, selector: "geo-map-layers-drawer", inputs: ["controller", "open", "title", "legendItems", "showOpacity", "showLegend", "layers"], outputs: ["openChange", "layersChange", "closed"] }, { kind: "component", type: GeoMapLegendComponent, selector: "geo-map-legend", inputs: ["title", "items", "open"], outputs: ["openChange", "closed"] }, { kind: "component", type: GeoMapHelpComponent, selector: "geo-map-help", inputs: ["open", "title", "sections"], outputs: ["openChange"] }, { kind: "component", type: GeoMapSwipeComponent, selector: "geo-map-swipe", inputs: ["controller", "active", "position", "layerId"], outputs: ["activeChange", "positionChange"] }, { kind: "component", type: GeoMapSearchComponent, selector: "geo-map-search", inputs: ["open", "title", "mode", "results", "loading", "pageIndex", "pageSize", "total", "emptyText"], outputs: ["openChange", "modeChange", "pageIndexChange", "pageSizeChange", "search", "reset", "resultSelect", "closed"] }, { kind: "component", type: GeoMapAdminFilterComponent, selector: "geo-map-admin-filter", inputs: ["open", "title", "nodes", "checkedKeys", "expandedKeys"], outputs: ["openChange", "checkedKeysChange", "expandedKeysChange", "apply", "reset", "fitProvince", "closed", "selectionChange"] }, { kind: "component", type: GeoMapParcelPopupComponent, selector: "geo-map-parcel-popup", inputs: ["open", "title", "parcel", "audience", "showExport"], outputs: ["openChange", "closed", "back", "exportClick", "diagramClick"] }, { kind: "component", type: GeoMapLocationChipComponent, selector: "geo-map-location-chip", inputs: ["label", "icon"] }, { kind: "component", type: GeoMapBasemapSwitcherComponent, selector: "geo-map-basemap-switcher", inputs: ["options", "selectedId", "label", "tooltip"], outputs: ["selectedIdChange", "basemapChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
554
|
+
}
|
|
555
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapShellComponent, decorators: [{
|
|
556
|
+
type: Component,
|
|
557
|
+
args: [{ selector: 'geo-map-shell', standalone: true, imports: [
|
|
558
|
+
GeoMapComponent,
|
|
559
|
+
GeoMapToolbarComponent,
|
|
560
|
+
GeoMapZoomComponent,
|
|
561
|
+
GeoMapSnapshotComponent,
|
|
562
|
+
GeoMapMeasureComponent,
|
|
563
|
+
GeoMapLayersDrawerComponent,
|
|
564
|
+
GeoMapLegendComponent,
|
|
565
|
+
GeoMapHelpComponent,
|
|
566
|
+
GeoMapSwipeComponent,
|
|
567
|
+
GeoMapSearchComponent,
|
|
568
|
+
GeoMapAdminFilterComponent,
|
|
569
|
+
GeoMapParcelPopupComponent,
|
|
570
|
+
GeoMapLocationChipComponent,
|
|
571
|
+
GeoMapBasemapSwitcherComponent,
|
|
572
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
573
|
+
class: 'geo-map-shell-host',
|
|
574
|
+
'[style.height]': 'height()',
|
|
575
|
+
}, template: "<div class=\"geo-map-shell\">\n <geo-map\n class=\"geo-map-shell__map\"\n [center]=\"center()\"\n [zoom]=\"zoom()\"\n [height]=\"'100%'\"\n [basemap]=\"basemap()\"\n [layers]=\"resolvedLayers()\"\n [showMousePosition]=\"showMousePosition()\"\n [showZoomControl]=\"false\"\n (mapReady)=\"onMapReady($event)\"\n (mapClick)=\"onMapClick($event)\"\n />\n\n <div class=\"geo-map-shell__chrome-left\">\n <geo-map-toolbar\n class=\"geo-map-shell__toolbar\"\n [controller]=\"controller()\"\n [actions]=\"resolvedToolbarActions()\"\n [(checkedMap)]=\"checkedMap\"\n (actionClick)=\"onToolbarAction($event)\"\n (actionToggle)=\"onToolbarToggle($event)\"\n />\n\n <div class=\"geo-map-shell__panels\">\n <geo-map-search\n [(open)]=\"searchOpen\"\n [results]=\"searchResults()\"\n (search)=\"onSearch($event)\"\n (reset)=\"onSearchReset()\"\n (resultSelect)=\"onResultSelect($event)\"\n />\n <geo-map-admin-filter\n [(open)]=\"adminFilterOpen\"\n title=\"Chuy\u1EC3n v\u1ECB tr\u00ED\"\n [nodes]=\"adminNodes()\"\n [(checkedKeys)]=\"adminCheckedKeys\"\n [(expandedKeys)]=\"adminExpandedKeys\"\n (apply)=\"onAdminApply($event)\"\n (reset)=\"adminCheckedKeys.set([])\"\n (fitProvince)=\"onFitProvince()\"\n (closed)=\"onAdminClosed()\"\n />\n <geo-map-parcel-popup\n [(open)]=\"parcelOpen\"\n [parcel]=\"selectedParcel()\"\n [audience]=\"parcelAudience()\"\n (exportClick)=\"parcelExport.emit($event)\"\n (back)=\"onParcelBack()\"\n (closed)=\"onParcelClosed()\"\n />\n <geo-map-layers-drawer\n [controller]=\"controller()\"\n [(open)]=\"layersOpen\"\n [(layers)]=\"managedLayers\"\n />\n <geo-map-legend\n [(open)]=\"legendOpen\"\n [items]=\"legendItems()\"\n />\n </div>\n </div>\n\n <!-- Headless bridges: zoom/fullscreen + snapshot (driven by toolbar actions). -->\n <geo-map-zoom\n class=\"geo-map-shell__zoom-bridge\"\n [controller]=\"controller()\"\n [showNav]=\"showNav()\"\n [provinceExtent]=\"provinceExtent()\"\n />\n <geo-map-snapshot\n class=\"geo-map-shell__snapshot-bridge\"\n [controller]=\"controller()\"\n />\n\n <div class=\"geo-map-shell__top-right\">\n <ng-content select=\"[geoMapShellTopRight]\" />\n </div>\n\n <div class=\"geo-map-shell__bottom-right\">\n <geo-map-basemap-switcher\n [options]=\"basemapOptions()\"\n [(selectedId)]=\"basemapId\"\n (basemapChange)=\"onBasemapChange($event)\"\n />\n </div>\n\n <div class=\"geo-map-shell__status\">\n @if (locationLabel()) {\n <geo-map-location-chip [label]=\"locationLabel()\" />\n }\n <geo-map-measure\n [controller]=\"controller()\"\n [(mode)]=\"measureMode\"\n />\n </div>\n\n <geo-map-swipe\n [controller]=\"controller()\"\n [(active)]=\"swipeActive\"\n />\n\n <geo-map-help [(open)]=\"helpOpen\" />\n</div>\n", styles: [".geo-map-shell-host{display:block;min-height:360px}.geo-map-shell{position:relative;width:100%;height:100%;min-height:inherit;overflow:hidden;border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen,.geo-map-shell:-webkit-full-screen{width:100%;height:100%;min-height:100%;border:0;border-radius:0;background:var(--geo-color-neutral-100)}.geo-map-shell:fullscreen>.cdk-overlay-container,.geo-map-shell:-webkit-full-screen>.cdk-overlay-container{z-index:1200}.geo-map-shell__map{display:block;width:100%;height:100%}.geo-map-shell__chrome-left{position:absolute;top:16px;left:16px;z-index:6;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:calc(100% - 32px);max-height:calc(100% - 172px);overflow:visible;pointer-events:none}.geo-map-shell__chrome-left>*{pointer-events:auto}.geo-map-shell__toolbar{flex-shrink:0}.geo-map-shell__panels{display:flex;flex-direction:column;align-items:flex-start;gap:8px;width:min(420px,100%);min-height:0;overflow:visible;pointer-events:none}.geo-map-shell__panels>*{pointer-events:auto}.geo-map-shell__panels .geo-map-search,.geo-map-shell__panels .geo-map-admin-filter,.geo-map-shell__panels .geo-map-parcel-popup,.geo-map-shell__panels .geo-map-layers-drawer,.geo-map-shell__panels .geo-map-legend{max-height:min(640px,100dvh - 100px);overflow:auto}.geo-map-shell__snapshot-bridge,.geo-map-shell__zoom-bridge{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;opacity:0}.geo-map-shell__bottom-left{position:absolute;left:16px;bottom:72px;z-index:5;display:flex;flex-direction:column;align-items:flex-start;gap:8px;max-width:min(300px,100% - 120px);pointer-events:none}.geo-map-shell__bottom-left>*{pointer-events:auto}.geo-map-shell__top-right{position:absolute;top:16px;right:16px;z-index:7;display:flex;align-items:center;justify-content:flex-end;height:64px;max-width:min(360px,100% - 32px);pointer-events:none}.geo-map-shell__top-right>*{pointer-events:auto}.geo-map-shell__bottom-right{position:absolute;right:16px;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}.geo-map-shell__bottom-right>*{pointer-events:auto}.geo-map-shell__status{position:absolute;left:50%;bottom:24px;z-index:5;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:min(480px,100% - 32px);transform:translate(-50%);pointer-events:none}.geo-map-shell__status>*{pointer-events:auto}.geo-map-shell .geo-map__mouse-position,.geo-map-shell .ol-scale-line{display:none!important}.geo-map-shell .ol-attribution{display:none}\n"] }]
|
|
576
|
+
}], ctorParameters: () => [] });
|
|
577
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1zaGVsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nZW8tdWkvc3JjL2xpYi9maWdtYS9nZW8tbWFwL2Nocm9tZS9nZW8tbWFwLXNoZWxsL2dlby1tYXAtc2hlbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zaGVsbC9nZW8tbWFwLXNoZWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLCtCQUErQixFQUMvQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLHdCQUF3QixFQUN4Qix1QkFBdUIsR0FDeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNwRyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNoSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixP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QUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7d0dBdGpCVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixzcktBRVUsdUJBQXVCLDBGQUMzQixtQkFBbUIsZ0VDaEcxRCwwL0ZBd0dBLGtwRkRuQ0ksZUFBZSw4VEFDZixzQkFBc0Isc0xBQ3RCLG1CQUFtQixxSkFDbkIsdUJBQXVCLGlKQUN2QixzQkFBc0Isb0pBQ3RCLDJCQUEyQixvTkFDM0IscUJBQXFCLGtJQUNyQixtQkFBbUIseUhBQ25CLG9CQUFvQixnS0FDcEIscUJBQXFCLDRSQUNyQiwwQkFBMEIsc1FBQzFCLDBCQUEwQiwwTUFDMUIsMkJBQTJCLDZGQUMzQiw4QkFBOEI7OzRGQVdyQixvQkFBb0I7a0JBNUJoQyxTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1A7d0JBQ1AsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLDJCQUEyQjt3QkFDM0IscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQiwwQkFBMEI7d0JBQzFCLDBCQUEwQjt3QkFDMUIsMkJBQTJCO3dCQUMzQiw4QkFBOEI7cUJBQy9CLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSxvQkFBb0I7d0JBQzNCLGdCQUFnQixFQUFFLFVBQVU7cUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgR0VPX01BUF9ERUZBVUxUX0JBU0VNQVBfT1BUSU9OUyxcbiAgR0VPX01BUF9ERUZBVUxUX0NFTlRFUixcbiAgR0VPX01BUF9ERUZBVUxUX1BST1ZJTkNFX0VYVEVOVF80MzI2LFxuICBHRU9fTUFQX0RFRkFVTFRfVE9PTEJBUl9BQ1RJT05TLFxuICBHRU9fTUFQX0RFRkFVTFRfWk9PTSxcbiAgR0VPX01BUF9ERU1PX0FETUlOX05PREVTLFxuICBHRU9fTUFQX0RFTU9fTEVHRU5EX0lURU1TLFxuICBHRU9fTUFQX0RFTU9fUEFSQ0VMX0RFVEFJTCxcbiAgR0VPX01BUF9ERU1PX1RIRU1BVElDX0xBWUVSUyxcbiAgR0VPX01BUF9UUkFGRklDX0xBWUVSX0lELFxuICBHRU9fTUFQX1RSQUZGSUNfT1ZFUkxBWSxcbn0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb25zdGFudHMnO1xuaW1wb3J0IHsgR2VvTWFwQWRtaW5GaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLWFkbWluLWZpbHRlci9nZW8tbWFwLWFkbWluLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwQmFzZW1hcFN3aXRjaGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1iYXNlbWFwLXN3aXRjaGVyL2dlby1tYXAtYmFzZW1hcC1zd2l0Y2hlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwSGVscENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtaGVscC9nZW8tbWFwLWhlbHAuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcExheWVyc0RyYXdlckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtbGF5ZXJzLWRyYXdlci9nZW8tbWFwLWxheWVycy1kcmF3ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcExlZ2VuZENvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtbGVnZW5kL2dlby1tYXAtbGVnZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBMb2NhdGlvbkNoaXBDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLWxvY2F0aW9uLWNoaXAvZ2VvLW1hcC1sb2NhdGlvbi1jaGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBNZWFzdXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1tZWFzdXJlL2dlby1tYXAtbWVhc3VyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwUGFyY2VsUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLXBhcmNlbC1wb3B1cC9nZW8tbWFwLXBhcmNlbC1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1zZWFyY2gvZ2VvLW1hcC1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcFNuYXBzaG90Q29tcG9uZW50IH0gZnJvbSAnLi4vZ2VvLW1hcC1zbmFwc2hvdC9nZW8tbWFwLXNuYXBzaG90LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBTd2lwZUNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtc3dpcGUvZ2VvLW1hcC1zd2lwZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvTWFwVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uL2dlby1tYXAtdG9vbGJhci9nZW8tbWFwLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb01hcFpvb21Db21wb25lbnQgfSBmcm9tICcuLi9nZW8tbWFwLXpvb20vZ2VvLW1hcC16b29tLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9nZW8tbWFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9NYXBDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vZ2VvLW1hcC5jb250cm9sbGVyJztcbmltcG9ydCB0eXBlIHsgR2VvVHJlZU5vZGUgfSBmcm9tICcuLi8uLi8uLi9nZW8tdHJlZS9nZW8tdHJlZS50eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdlb01hcEJhc2VtYXAsXG4gIEdlb01hcEJhc2VtYXBPcHRpb24sXG4gIEdlb01hcENsaWNrRXZlbnQsXG4gIEdlb01hcExheWVyQ29uZmlnLFxuICBHZW9NYXBMZWdlbmRJdGVtLFxuICBHZW9NYXBNZWFzdXJlTW9kZSxcbiAgR2VvTWFwUGFyY2VsQXVkaWVuY2UsXG4gIEdlb01hcFBhcmNlbERldGFpbCxcbiAgR2VvTWFwU2VhcmNoUXVlcnksXG4gIEdlb01hcFNlYXJjaFJlc3VsdEl0ZW0sXG4gIEdlb01hcFRvb2xiYXJBY3Rpb24sXG59IGZyb20gJy4uLy4uL2dlby1tYXAudHlwZXMnO1xuXG4vKipcbiAqIE1hcCB2aWV3cG9ydCArIHBvcnRhbCBjaHJvbWUgKHRvb2xiYXIsIGxheWVycyBkcmF3ZXIsIGxlZ2VuZCwgaGVscCwgc3dpcGUsIOKApikuXG4gKlxuICogQHN1bW1hcnkgQ29tcG9zZWQgbWFwIHNoZWxsIHdpdGggY2hyb21lIHRvb2xzIGZvciBTdG9yeWJvb2sgLyBwb3J0YWwuXG4gKiBAd2hlblRvVXNlIFB1YmxpYyBtYXAgcGFnZSBjaHJvbWUgKGPhu5VuZyBjw7RuZyBraGFpKS5cbiAqIEBkb05vdFVzZVdoZW4gTmVlZCBvbmx5IHRoZSByYXcgT0wgaG9zdCDigJQgdXNlIGdlby1tYXAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dlby1tYXAtc2hlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgR2VvTWFwQ29tcG9uZW50LFxuICAgIEdlb01hcFRvb2xiYXJDb21wb25lbnQsXG4gICAgR2VvTWFwWm9vbUNvbXBvbmVudCxcbiAgICBHZW9NYXBTbmFwc2hvdENvbXBvbmVudCxcbiAgICBHZW9NYXBNZWFzdXJlQ29tcG9uZW50LFxuICAgIEdlb01hcExheWVyc0RyYXdlckNvbXBvbmVudCxcbiAgICBHZW9NYXBMZWdlbmRDb21wb25lbnQsXG4gICAgR2VvTWFwSGVscENvbXBvbmVudCxcbiAgICBHZW9NYXBTd2lwZUNvbXBvbmVudCxcbiAgICBHZW9NYXBTZWFyY2hDb21wb25lbnQsXG4gICAgR2VvTWFwQWRtaW5GaWx0ZXJDb21wb25lbnQsXG4gICAgR2VvTWFwUGFyY2VsUG9wdXBDb21wb25lbnQsXG4gICAgR2VvTWFwTG9jYXRpb25DaGlwQ29tcG9uZW50LFxuICAgIEdlb01hcEJhc2VtYXBTd2l0Y2hlckNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAtc2hlbGwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZ2VvLW1hcC1zaGVsbC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdnZW8tbWFwLXNoZWxsLWhvc3QnLFxuICAgICdbc3R5bGUuaGVpZ2h0XSc6ICdoZWlnaHQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb01hcFNoZWxsQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNuYXBzaG90UmVmID0gdmlld0NoaWxkKEdlb01hcFNuYXBzaG90Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b29tUmVmID0gdmlld0NoaWxkKEdlb01hcFpvb21Db21wb25lbnQpO1xuXG4gIHJlYWRvbmx5IGNlbnRlciA9IGlucHV0PG51bWJlcltdPihbLi4uR0VPX01BUF9ERUZBVUxUX0NFTlRFUl0pO1xuICByZWFkb25seSB6b29tID0gaW5wdXQoR0VPX01BUF9ERUZBVUxUX1pPT00pO1xuICByZWFkb25seSBoZWlnaHQgPSBpbnB1dCgnNTYwcHgnKTtcbiAgcmVhZG9ubHkgc2hvd01vdXNlUG9zaXRpb24gPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IGJhc2VtYXBPcHRpb25zID0gaW5wdXQ8R2VvTWFwQmFzZW1hcE9wdGlvbltdPihcbiAgICBHRU9fTUFQX0RFRkFVTFRfQkFTRU1BUF9PUFRJT05TLFxuICApO1xuICByZWFkb25seSB0b29sYmFyQWN0aW9ucyA9IGlucHV0PEdlb01hcFRvb2xiYXJBY3Rpb25bXT4oXG4gICAgR0VPX01BUF9ERUZBVUxUX1RPT0xCQVJfQUNUSU9OUyxcbiAgKTtcbiAgLyoqIEV4dHJhIG92ZXJsYXlzIG1lcmdlZCBhZnRlciBkZW1vIHRoZW1hdGljICsgdHJhZmZpYy4gKi9cbiAgcmVhZG9ubHkgbGF5ZXJzID0gaW5wdXQ8R2VvTWFwTGF5ZXJDb25maWdbXT4oW10pO1xuICByZWFkb25seSBsZWdlbmRJdGVtcyA9IGlucHV0PEdlb01hcExlZ2VuZEl0ZW1bXT4oR0VPX01BUF9ERU1PX0xFR0VORF9JVEVNUyk7XG4gIHJlYWRvbmx5IHNob3dOYXYgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgaW5jbHVkZURlbW9MYXllcnMgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgYWRtaW5Ob2RlcyA9IGlucHV0PEdlb1RyZWVOb2RlW10+KEdFT19NQVBfREVNT19BRE1JTl9OT0RFUyk7XG4gIHJlYWRvbmx5IGxvY2F0aW9uTGFiZWwgPSBpbnB1dCgnUGjGsOG7nW5nIDEg4oCUIFRQIMSQw6AgTOG6oXQsIEzDom0gxJDhu5NuZycpO1xuICByZWFkb25seSBwYXJjZWxBdWRpZW5jZSA9IGlucHV0PEdlb01hcFBhcmNlbEF1ZGllbmNlPignY2l0aXplbicpO1xuICByZWFkb25seSBwcm92aW5jZUV4dGVudCA9IGlucHV0PHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPihcbiAgICBHRU9fTUFQX0RFRkFVTFRfUFJPVklOQ0VfRVhURU5UXzQzMjYsXG4gICk7XG4gIC8qKiBXaGVuIHRydWUsIHNoZWxsIHNlZWRzIG1vY2sgc2VhcmNoIHJlc3VsdHMgKFN0b3J5Ym9vayAvIGRlbW9zKS4gKi9cbiAgcmVhZG9ubHkgZGVtb1NlYXJjaCA9IGlucHV0KHRydWUpO1xuICAvKipcbiAgICogYGxvY2F0aW9uYCDigJQgSG9tZSBvcGVucyDEkFZIQyBmaWx0ZXIgKGRlZmF1bHQpLlxuICAgKiBgZW1pdGAg4oCUIEhvbWUgb25seSBlbWl0cyBgYWN0aW9uQ2xpY2tgIChlLmcuIHBvcnRhbCBuYXZpZ2F0ZXMgdG8gbG9naW4vZGFzaGJvYXJkKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVNb2RlID0gaW5wdXQ8J2xvY2F0aW9uJyB8ICdlbWl0Jz4oJ2xvY2F0aW9uJyk7XG5cbiAgcmVhZG9ubHkgYmFzZW1hcElkID0gbW9kZWwoJ29zbScpO1xuICByZWFkb25seSBtZWFzdXJlTW9kZSA9IG1vZGVsPEdlb01hcE1lYXN1cmVNb2RlPignbm9uZScpO1xuICByZWFkb25seSBjaGVja2VkTWFwID0gbW9kZWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHsgdHJhZmZpYzogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGxheWVyc09wZW4gPSBtb2RlbChmYWxzZSk7XG4gIHJlYWRvbmx5IGxlZ2VuZE9wZW4gPSBtb2RlbChmYWxzZSk7XG4gIHJlYWRvbmx5IGhlbHBPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBzd2lwZUFjdGl2ZSA9IG1vZGVsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VhcmNoT3BlbiA9IG1vZGVsKGZhbHNlKTtcbiAgcmVhZG9ubHkgYWRtaW5GaWx0ZXJPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBwYXJjZWxPcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSBtYW5hZ2VkTGF5ZXJzID0gbW9kZWw8R2VvTWFwTGF5ZXJDb25maWdbXT4oW10pO1xuICByZWFkb25seSBzZWFyY2hSZXN1bHRzID0gbW9kZWw8R2VvTWFwU2VhcmNoUmVzdWx0SXRlbVtdPihbXSk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkUGFyY2VsID0gbW9kZWw8R2VvTWFwUGFyY2VsRGV0YWlsIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGFkbWluQ2hlY2tlZEtleXMgPSBtb2RlbDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PihbXSk7XG4gIHJlYWRvbmx5IGFkbWluRXhwYW5kZWRLZXlzID0gbW9kZWw8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj4oWydsYW0tZG9uZyddKTtcblxuICByZWFkb25seSBtYXBSZWFkeSA9IG91dHB1dDxHZW9NYXBDb250cm9sbGVyPigpO1xuICByZWFkb25seSBtYXBDbGljayA9IG91dHB1dDxHZW9NYXBDbGlja0V2ZW50PigpO1xuICByZWFkb25seSBsb2NhdGVEZW5pZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYWN0aW9uQ2xpY2sgPSBvdXRwdXQ8R2VvTWFwVG9vbGJhckFjdGlvbj4oKTtcbiAgcmVhZG9ubHkgc2VhcmNoID0gb3V0cHV0PEdlb01hcFNlYXJjaFF1ZXJ5PigpO1xuICByZWFkb25seSBzZWFyY2hSZXNldCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZXN1bHRTZWxlY3QgPSBvdXRwdXQ8R2VvTWFwU2VhcmNoUmVzdWx0SXRlbT4oKTtcbiAgcmVhZG9ubHkgcGFyY2VsRXhwb3J0ID0gb3V0cHV0PEdlb01hcFBhcmNlbERldGFpbD4oKTtcbiAgcmVhZG9ubHkgYWRtaW5BcHBseSA9IG91dHB1dDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PigpO1xuXG4gIHJlYWRvbmx5IGNvbnRyb2xsZXIgPSBzaWduYWw8R2VvTWFwQ29udHJvbGxlciB8IG51bGw+KG51bGwpO1xuICAvKiogQWN0aXZlIG1hcCBwb2ludGVyIHRvb2wgKGBub25lYCA9IGRlZmF1bHQgYXJyb3cgY3Vyc29yKS4gKi9cbiAgcmVhZG9ubHkgdG9vbE1vZGUgPSBzaWduYWw8J25vbmUnIHwgJ3BhbicgfCAnZGlzdGFuY2UnIHwgJ2FyZWEnPignbm9uZScpO1xuICAvKiogV2hlbiB0cnVlLCBwYXJjZWwgQmFjayByZXR1cm5zIHRvIHNlYXJjaCBwb3BvdmVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmNlbEZyb21TZWFyY2ggPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHBhbkN1cnNvckJvdW5kID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25QYW5Qb2ludGVyRG93biA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAncGFuJykge1xuICAgICAgdGhpcy5zZXRNYXBDdXJzb3IoJ2dyYWJiaW5nJyk7XG4gICAgfVxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUGFuUG9pbnRlclVwID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdwYW4nKSB7XG4gICAgICB0aGlzLnNldE1hcEN1cnNvcignZ3JhYicpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFbmZvcmNlIGEgc2luZ2xlIGxlZnQgY2hyb21lIHBvcG92ZXIgKHNlYXJjaCAvIMSQVkhDIC8gcGFyY2VsIC8gbGF5ZXJzIC8gbGVnZW5kKS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hPcGVuKCk7XG4gICAgICBjb25zdCBhZG1pbiA9IHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCk7XG4gICAgICBjb25zdCBwYXJjZWwgPSB0aGlzLnBhcmNlbE9wZW4oKTtcbiAgICAgIGNvbnN0IGxheWVycyA9IHRoaXMubGF5ZXJzT3BlbigpO1xuICAgICAgY29uc3QgbGVnZW5kID0gdGhpcy5sZWdlbmRPcGVuKCk7XG4gICAgICBjb25zdCBvcGVuQ291bnQgPVxuICAgICAgICBOdW1iZXIoc2VhcmNoKSArXG4gICAgICAgIE51bWJlcihhZG1pbikgK1xuICAgICAgICBOdW1iZXIocGFyY2VsKSArXG4gICAgICAgIE51bWJlcihsYXllcnMpICtcbiAgICAgICAgTnVtYmVyKGxlZ2VuZCk7XG4gICAgICBpZiAob3BlbkNvdW50IDw9IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHBhcmNlbCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ3BhcmNlbCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGxheWVycykge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2xheWVycycpO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2xlZ2VuZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ3NlYXJjaCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbHNFeGNlcHQoJ2FkbWluJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG5cbiAgICAvLyBXaGVuIG1lYXN1cmUgZmluaXNoZXMgLyBjYW5jZWxzLCByZXR1cm4gdG8gaWRsZSArIGRlZmF1bHQgY3Vyc29yLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5tZWFzdXJlTW9kZSgpO1xuICAgICAgaWYgKG1vZGUgIT09ICdub25lJykge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KG1vZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbCA9IHRoaXMudG9vbE1vZGUoKTtcbiAgICAgICAgaWYgKHRvb2wgPT09ICdkaXN0YW5jZScgfHwgdG9vbCA9PT0gJ2FyZWEnKSB7XG4gICAgICAgICAgdGhpcy50b29sTW9kZS5zZXQoJ25vbmUnKTtcbiAgICAgICAgICB0aGlzLnNldE1hcEN1cnNvcihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcblxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gdGhpcy51bmJpbmRQYW5DdXJzb3IoKSk7XG4gIH1cblxuICByZWFkb25seSBiYXNlbWFwID0gY29tcHV0ZWQ8R2VvTWFwQmFzZW1hcD4oKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5iYXNlbWFwSWQoKTtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLmJhc2VtYXBPcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgIHJldHVybiBvcHRpb24/LmJhc2VtYXAgPz8gJ29zbSc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlc29sdmVkVG9vbGJhckFjdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMubWVhc3VyZU1vZGUoKTtcbiAgICBjb25zdCB0b29sID0gdGhpcy50b29sTW9kZSgpO1xuICAgIGNvbnN0IHN3aXBlID0gdGhpcy5zd2lwZUFjdGl2ZSgpO1xuICAgIGNvbnN0IGxheWVyc09wZW4gPSB0aGlzLmxheWVyc09wZW4oKTtcbiAgICBjb25zdCBsZWdlbmRPcGVuID0gdGhpcy5sZWdlbmRPcGVuKCk7XG4gICAgY29uc3Qgc2VhcmNoT3BlbiA9IHRoaXMuc2VhcmNoT3BlbigpO1xuICAgIGNvbnN0IGFkbWluT3BlbiA9IHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCk7XG4gICAgY29uc3QgZnVsbHNjcmVlbiA9IHRoaXMuem9vbVJlZigpPy5pc0Z1bGxzY3JlZW4oKSA/PyBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy50b29sYmFyQWN0aW9ucygpLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoYWN0aW9uLmlkID09PSAnaG9tZScgJiYgdGhpcy5ob21lTW9kZSgpID09PSAnZW1pdCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgbGFiZWw6ICdUcmFuZyBjaOG7pycsXG4gICAgICAgICAgdG9vbHRpcDogJ1bhu4EgdHJhbmcgY2jhu6cgLyDEkcSDbmcgbmjhuq1wJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdwYW4nKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiB0b29sID09PSAncGFuJyAmJiBtb2RlID09PSAnbm9uZScgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdtZWFzdXJlLWRpc3RhbmNlJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogbW9kZSA9PT0gJ2Rpc3RhbmNlJyB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ21lYXN1cmUtYXJlYScpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYWN0aW9uLCBhY3RpdmU6IG1vZGUgPT09ICdhcmVhJyB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ3N3aXBlJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogc3dpcGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdsYXllcnMnKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiBsYXllcnNPcGVuIH07XG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uLmlkID09PSAnbGVnZW5kJykge1xuICAgICAgICByZXR1cm4geyAuLi5hY3Rpb24sIGFjdGl2ZTogbGVnZW5kT3BlbiB9O1xuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbi5pZCA9PT0gJ3NlYXJjaCcpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYWN0aW9uLCBhY3RpdmU6IHNlYXJjaE9wZW4gfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdhZG1pbi1maWx0ZXInKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmFjdGlvbiwgYWN0aXZlOiBhZG1pbk9wZW4gfTtcbiAgICAgIH1cbiAgICAgIGlmIChhY3Rpb24uaWQgPT09ICdmdWxsc2NyZWVuJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICBhY3RpdmU6IGZ1bGxzY3JlZW4sXG4gICAgICAgICAgaWNvbjogZnVsbHNjcmVlbiA/ICdmdWxsc2NyZWVuLWV4aXQnIDogJ2Z1bGxzY3JlZW4nLFxuICAgICAgICAgIGljb25TcmM6IGZ1bGxzY3JlZW4gPyB1bmRlZmluZWQgOiBhY3Rpb24uaWNvblNyYyxcbiAgICAgICAgICB0b29sdGlwOiBmdWxsc2NyZWVuID8gJ1Rob8OhdCB0b8OgbiBtw6BuIGjDrG5oJyA6ICdYZW0gdG/DoG4gYuG6o24gxJHhu5MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcmVzb2x2ZWRMYXllcnMgPSBjb21wdXRlZDxHZW9NYXBMYXllckNvbmZpZ1tdPigoKSA9PiB7XG4gICAgY29uc3QgdHJhZmZpY09uID0gISF0aGlzLmNoZWNrZWRNYXAoKVsndHJhZmZpYyddO1xuICAgIGNvbnN0IHRyYWZmaWM6IEdlb01hcExheWVyQ29uZmlnID0ge1xuICAgICAgLi4uR0VPX01BUF9UUkFGRklDX09WRVJMQVksXG4gICAgICB2aXNpYmxlOiB0cmFmZmljT24sXG4gICAgfTtcbiAgICBjb25zdCBtYW5hZ2VkID0gdGhpcy5tYW5hZ2VkTGF5ZXJzKCk7XG4gICAgaWYgKG1hbmFnZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gWy4uLm1hbmFnZWQsIHRyYWZmaWNdO1xuICAgIH1cbiAgICBjb25zdCBkZW1vID0gdGhpcy5pbmNsdWRlRGVtb0xheWVycygpID8gR0VPX01BUF9ERU1PX1RIRU1BVElDX0xBWUVSUyA6IFtdO1xuICAgIHJldHVybiBbLi4uZGVtbywgdHJhZmZpYywgLi4udGhpcy5sYXllcnMoKV07XG4gIH0pO1xuXG4gIG9uTWFwUmVhZHkoY3RybDogR2VvTWFwQ29udHJvbGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXQoY3RybCk7XG4gICAgaWYgKCF0aGlzLm1hbmFnZWRMYXllcnMoKS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSB0aGlzLmluY2x1ZGVEZW1vTGF5ZXJzKClcbiAgICAgICAgPyBHRU9fTUFQX0RFTU9fVEhFTUFUSUNfTEFZRVJTLm1hcCgobGF5ZXIpID0+ICh7IC4uLmxheWVyIH0pKVxuICAgICAgICA6IHRoaXMubGF5ZXJzKCkubWFwKChsYXllcikgPT4gKHsgLi4ubGF5ZXIgfSkpO1xuICAgICAgdGhpcy5tYW5hZ2VkTGF5ZXJzLnNldChzZWVkKTtcbiAgICB9XG4gICAgdGhpcy5iaW5kUGFuQ3Vyc29yKGN0cmwpO1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgPT09ICdwYW4nKSB7XG4gICAgICB0aGlzLmFwcGx5UGFuQ3Vyc29yKCk7XG4gICAgfVxuICAgIHRoaXMubWFwUmVhZHkuZW1pdChjdHJsKTtcbiAgfVxuXG4gIG9uTWFwQ2xpY2soZXZlbnQ6IEdlb01hcENsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmNlbEZyb21TZWFyY2guc2V0KGZhbHNlKTtcbiAgICB0aGlzLm1hcENsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25CYXNlbWFwQ2hhbmdlKGJhc2VtYXA6IEdlb01hcEJhc2VtYXApOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0QmFzZW1hcChiYXNlbWFwKTtcbiAgfVxuXG4gIG9uVG9vbGJhckFjdGlvbihhY3Rpb246IEdlb01hcFRvb2xiYXJBY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNsaWNrLmVtaXQoYWN0aW9uKTtcbiAgICBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgY2FzZSAnaG9tZSc6XG4gICAgICAgIGlmICh0aGlzLmhvbWVNb2RlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgICAgICBpZiAodGhpcy5hZG1pbkZpbHRlck9wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5hZG1pbkZpbHRlck9wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuem9vbVJlZigpPy5maXRQcm92aW5jZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYW5lbCgnYWRtaW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhZG1pbi1maWx0ZXInOlxuICAgICAgICBpZiAodGhpcy5hZG1pbkZpbHRlck9wZW4oKSkge1xuICAgICAgICAgIHRoaXMuYWRtaW5GaWx0ZXJPcGVuLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy56b29tUmVmKCk/LmZpdFByb3ZpbmNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuUGFuZWwoJ2FkbWluJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaXQtcHJvdmluY2UnOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uZml0UHJvdmluY2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYW4nOlxuICAgICAgICBpZiAodGhpcy50b29sTW9kZSgpID09PSAncGFuJykge1xuICAgICAgICAgIHRoaXMuZXhpdFRvb2xNb2RlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbnRlclBhbk1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3pvb20taW4nOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uem9vbUluKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnem9vbS1vdXQnOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8uem9vbU91dCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Z1bGxzY3JlZW4nOlxuICAgICAgICB0aGlzLnpvb21SZWYoKT8udG9nZ2xlRnVsbHNjcmVlbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaE9wZW4oKSkge1xuICAgICAgICAgIHRoaXMuc2VhcmNoT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdzZWFyY2gnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xheWVycyc6XG4gICAgICAgIGlmICh0aGlzLmxheWVyc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubGF5ZXJzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdsYXllcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZ2VuZCc6XG4gICAgICAgIGlmICh0aGlzLmxlZ2VuZE9wZW4oKSkge1xuICAgICAgICAgIHRoaXMubGVnZW5kT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3BlblBhbmVsKCdsZWdlbmQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hlbHAnOlxuICAgICAgICB0aGlzLmhlbHBPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzd2lwZSc6XG4gICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgICAgIHRoaXMuem9vbVJlZigpPy5yZXNldEludGVyYWN0aW9uTW9kZSgpO1xuICAgICAgICB0aGlzLnNldE1hcEN1cnNvcihudWxsKTtcbiAgICAgICAgdGhpcy5zd2lwZUFjdGl2ZS51cGRhdGUoKHYpID0+ICF2KTtcbiAgICAgICAgaWYgKHRoaXMuc3dpcGVBY3RpdmUoKSkge1xuICAgICAgICAgIHRoaXMuZW5zdXJlU3dpcGVPdmVybGF5VmlzaWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWVhc3VyZS1kaXN0YW5jZSc6XG4gICAgICAgIHRoaXMuc3dpcGVBY3RpdmUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy56b29tUmVmKCk/LnJlc2V0SW50ZXJhY3Rpb25Nb2RlKCk7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVNb2RlKCkgPT09ICdkaXN0YW5jZScpIHtcbiAgICAgICAgICB0aGlzLmV4aXRUb29sTW9kZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG9vbE1vZGUuc2V0KCdkaXN0YW5jZScpO1xuICAgICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdkaXN0YW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWVhc3VyZS1hcmVhJzpcbiAgICAgICAgdGhpcy5zd2lwZUFjdGl2ZS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnpvb21SZWYoKT8ucmVzZXRJbnRlcmFjdGlvbk1vZGUoKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZU1vZGUoKSA9PT0gJ2FyZWEnKSB7XG4gICAgICAgICAgdGhpcy5leGl0VG9vbE1vZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRvb2xNb2RlLnNldCgnYXJlYScpO1xuICAgICAgICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdhcmVhJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzbmFwc2hvdCc6XG4gICAgICAgIHRoaXMuc25hcHNob3RSZWYoKT8uY2FwdHVyZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9vbGJhclRvZ2dsZShldmVudDoge1xuICAgIGFjdGlvbjogR2VvTWFwVG9vbGJhckFjdGlvbjtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmFjdGlvbi5pZCA9PT0gJ3RyYWZmaWMnKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0TGF5ZXJWaXNpYmlsaXR5KFxuICAgICAgICBHRU9fTUFQX1RSQUZGSUNfTEFZRVJfSUQsXG4gICAgICAgIGV2ZW50LmNoZWNrZWQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKHF1ZXJ5OiBHZW9NYXBTZWFyY2hRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoLmVtaXQocXVlcnkpO1xuICAgIGlmICghdGhpcy5kZW1vU2VhcmNoKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVtbyA9IHRoaXMuYnVpbGREZW1vU2VhcmNoUmVzdWx0cyhxdWVyeSk7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzLnNldChkZW1vKTtcbiAgICBjb25zdCBnZW9qc29uQ29sbGVjdGlvbiA9IHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICBmZWF0dXJlczogZGVtb1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmdlb2pzb24pXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIG9iamVjdCA9PiAhIWl0ZW0pLFxuICAgIH07XG4gICAgaWYgKGdlb2pzb25Db2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyKCk/LnNldEhpZ2hsaWdodEZyb21HZW9Kc29uKGdlb2pzb25Db2xsZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaFJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoUmVzdWx0cy5zZXQoW10pO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJjZWwuc2V0KG51bGwpO1xuICAgIHRoaXMucGFyY2VsT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY29udHJvbGxlcigpPy5jbGVhckhpZ2hsaWdodCgpO1xuICAgIHRoaXMuc2VhcmNoUmVzZXQuZW1pdCgpO1xuICB9XG5cbiAgb25QYXJjZWxDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wYXJjZWxGcm9tU2VhcmNoLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RlZFBhcmNlbC5zZXQobnVsbCk7XG4gICAgdGhpcy5jb250cm9sbGVyKCk/LmNsZWFySGlnaGxpZ2h0KCk7XG4gIH1cblxuICBvblBhcmNlbEJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgZnJvbVNlYXJjaCA9IHRoaXMucGFyY2VsRnJvbVNlYXJjaCgpO1xuICAgIHRoaXMucGFyY2VsT3Blbi5zZXQoZmFsc2UpO1xuICAgIGlmIChmcm9tU2VhcmNoKSB7XG4gICAgICB0aGlzLnBhcmNlbEZyb21TZWFyY2guc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3BlblBhbmVsKCdzZWFyY2gnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFBhcmNlbC5zZXQobnVsbCk7XG4gICAgdGhpcy5jb250cm9sbGVyKCk/LmNsZWFySGlnaGxpZ2h0KCk7XG4gIH1cblxuICBvblJlc3VsdFNlbGVjdChpdGVtOiBHZW9NYXBTZWFyY2hSZXN1bHRJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5yZXN1bHRTZWxlY3QuZW1pdChpdGVtKTtcbiAgICBpZiAoaXRlbS5nZW9qc29uKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uc2V0SGlnaGxpZ2h0RnJvbUdlb0pzb24oaXRlbS5nZW9qc29uKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZXh0ZW50NDMyNikge1xuICAgICAgdGhpcy5jb250cm9sbGVyKCk/LmZpdExvbkxhdEV4dGVudChpdGVtLmV4dGVudDQzMjYpO1xuICAgIH1cbiAgICBpZiAoaXRlbS5wYXJjZWwpIHtcbiAgICAgIHRoaXMucGFyY2VsRnJvbVNlYXJjaC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUGFyY2VsLnNldChpdGVtLnBhcmNlbCk7XG4gICAgICB0aGlzLm9wZW5QYW5lbCgncGFyY2VsJyk7XG4gICAgfVxuICB9XG5cbiAgb25BZG1pbkFwcGx5KGtleXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiB2b2lkIHtcbiAgICB0aGlzLmFkbWluQXBwbHkuZW1pdChrZXlzKTtcbiAgICAvLyBEZW1vOiBmaXQgYSBzYW1wbGUgd2FyZCBiYm94IHdoZW4gYSBsZWFmIGlzIHNlbGVjdGVkLlxuICAgIGlmICh0aGlzLmRlbW9TZWFyY2goKSAmJiBrZXlzLnNvbWUoKGtleSkgPT4gU3RyaW5nKGtleSkuc3RhcnRzV2l0aCgneGEtJykpKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZml0TG9uTGF0RXh0ZW50KFsxMDguNDIsIDExLjkyLCAxMDguNSwgMTEuOThdLCB7XG4gICAgICAgIG1heFpvb206IDE0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25GaXRQcm92aW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIoKT8uZml0UHJvdmluY2UodGhpcy5wcm92aW5jZUV4dGVudCgpKTtcbiAgfVxuXG4gIG9uQWRtaW5DbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tUmVmKCk/LmZpdFByb3ZpbmNlKCk7XG4gIH1cblxuICAvKiogT3BlbiBvbmUgbGVmdCBjaHJvbWUgcG9wb3ZlcjsgY2xvc2UgdGhlIG90aGVycyB0byBhdm9pZCBzdGFja2VkIHNjcm9sbC4gKi9cbiAgcHJpdmF0ZSBvcGVuUGFuZWwoXG4gICAgcGFuZWw6ICdzZWFyY2gnIHwgJ2FkbWluJyB8ICdwYXJjZWwnIHwgJ2xheWVycycgfCAnbGVnZW5kJyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVBhbmVsc0V4Y2VwdChwYW5lbCk7XG4gICAgaWYgKHBhbmVsID09PSAnc2VhcmNoJykge1xuICAgICAgdGhpcy5zZWFyY2hPcGVuLnNldCh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHBhbmVsID09PSAnYWRtaW4nKSB7XG4gICAgICB0aGlzLmFkbWluRmlsdGVyT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChwYW5lbCA9PT0gJ3BhcmNlbCcpIHtcbiAgICAgIHRoaXMucGFyY2VsT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChwYW5lbCA9PT0gJ2xheWVycycpIHtcbiAgICAgIHRoaXMubGF5ZXJzT3Blbi5zZXQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGVnZW5kT3Blbi5zZXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVBhbmVsc0V4Y2VwdChcbiAgICBrZWVwOiAnc2VhcmNoJyB8ICdhZG1pbicgfCAncGFyY2VsJyB8ICdsYXllcnMnIHwgJ2xlZ2VuZCcsXG4gICk6IHZvaWQge1xuICAgIGlmIChrZWVwICE9PSAnc2VhcmNoJyAmJiB0aGlzLnNlYXJjaE9wZW4oKSkge1xuICAgICAgdGhpcy5zZWFyY2hPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnYWRtaW4nICYmIHRoaXMuYWRtaW5GaWx0ZXJPcGVuKCkpIHtcbiAgICAgIHRoaXMuYWRtaW5GaWx0ZXJPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAncGFyY2VsJyAmJiB0aGlzLnBhcmNlbE9wZW4oKSkge1xuICAgICAgdGhpcy5wYXJjZWxPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnbGF5ZXJzJyAmJiB0aGlzLmxheWVyc09wZW4oKSkge1xuICAgICAgdGhpcy5sYXllcnNPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICAgIGlmIChrZWVwICE9PSAnbGVnZW5kJyAmJiB0aGlzLmxlZ2VuZE9wZW4oKSkge1xuICAgICAgdGhpcy5sZWdlbmRPcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnRlclBhbk1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy50b29sTW9kZS5zZXQoJ3BhbicpO1xuICAgIHRoaXMubWVhc3VyZU1vZGUuc2V0KCdub25lJyk7XG4gICAgdGhpcy5zd2lwZUFjdGl2ZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuem9vbVJlZigpPy5yZXNldEludGVyYWN0aW9uTW9kZSgpO1xuICAgIHRoaXMuYXBwbHlQYW5DdXJzb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhpdFRvb2xNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbE1vZGUuc2V0KCdub25lJyk7XG4gICAgdGhpcy5tZWFzdXJlTW9kZS5zZXQoJ25vbmUnKTtcbiAgICB0aGlzLnN3aXBlQWN0aXZlLnNldChmYWxzZSk7XG4gICAgdGhpcy56b29tUmVmKCk/LnJlc2V0SW50ZXJhY3Rpb25Nb2RlKCk7XG4gICAgdGhpcy5zZXRNYXBDdXJzb3IobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5UGFuQ3Vyc29yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvb2xNb2RlKCkgIT09ICdwYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0TWFwQ3Vyc29yKCdncmFiJyk7XG4gIH1cblxuICBwcml2YXRlIHNldE1hcEN1cnNvcihjdXJzb3I6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuY29udHJvbGxlcigpPy5nZXRNYXAoKT8uZ2V0VGFyZ2V0RWxlbWVudCgpO1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwuc3R5bGUuY3Vyc29yID0gY3Vyc29yID8/ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kUGFuQ3Vyc29yKGN0cmw6IEdlb01hcENvbnRyb2xsZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGN0cmwuZ2V0TWFwKCk/LmdldFRhcmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsIHx8IHRoaXMucGFuQ3Vyc29yQm91bmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUGFuUG9pbnRlckRvd24pO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUGFuUG9pbnRlclVwKTtcbiAgICB0aGlzLnBhbkN1cnNvckJvdW5kID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kUGFuQ3Vyc29yKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5jb250cm9sbGVyKCk/LmdldE1hcCgpPy5nZXRUYXJnZXRFbGVtZW50KCk7XG4gICAgaWYgKCFlbCB8fCAhdGhpcy5wYW5DdXJzb3JCb3VuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25QYW5Qb2ludGVyRG93bik7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBhblBvaW50ZXJVcCk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgdGhpcy5vblBhblBvaW50ZXJVcCk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25QYW5Qb2ludGVyVXApO1xuICAgIHRoaXMucGFuQ3Vyc29yQm91bmQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZW1vU2VhcmNoUmVzdWx0cyhcbiAgICBxdWVyeTogR2VvTWFwU2VhcmNoUXVlcnksXG4gICk6IEdlb01hcFNlYXJjaFJlc3VsdEl0ZW1bXSB7XG4gICAgY29uc3QgcGFyY2VsTGF5ZXIgPSBHRU9fTUFQX0RFTU9fVEhFTUFUSUNfTEFZRVJTLmZpbmQoXG4gICAgICAobGF5ZXIpID0+IGxheWVyLmlkID09PSAnZGVtby1wYXJjZWwnICYmIGxheWVyLnR5cGUgPT09ICdnZW9qc29uJyxcbiAgICApO1xuICAgIGNvbnN0IGZlYXR1cmUgPVxuICAgICAgcGFyY2VsTGF5ZXIgJiYgcGFyY2VsTGF5ZXIudHlwZSA9PT0gJ2dlb2pzb24nXG4gICAgICAgID8gKHBhcmNlbExheWVyLmRhdGEgYXMgeyBmZWF0dXJlcz86IG9iamVjdFtdIH0pLmZlYXR1cmVzPy5bMF1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2V5d29yZCA9IE9iamVjdC52YWx1ZXMocXVlcnkudmFsdWVzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCBsYWJlbCA9IGtleXdvcmQgfHwgJ1Ro4butYSAxMiDigJQgVOG7nSA0NSc7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdkZW1vLXBhcmNlbC0xMicsXG4gICAgICAgIHRpdGxlOiBgVGjhu61hIDEyIC8gVOG7nSA0NWAsXG4gICAgICAgIHN1YnRpdGxlOiBsYWJlbCxcbiAgICAgICAgZXh0ZW50NDMyNjogWzEwOC40NSwgMTEuOTQsIDEwOC40NjUsIDExLjk1Ml0sXG4gICAgICAgIGdlb2pzb246IGZlYXR1cmUgPz8ge1xuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7IHBhcmNlbDogJzEyJywgc2hlZXQ6ICc0NScgfSxcbiAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsxMDguNDUsIDExLjk0XSxcbiAgICAgICAgICAgICAgICBbMTA4LjQ2NSwgMTEuOTRdLFxuICAgICAgICAgICAgICAgIFsxMDguNDY1LCAxMS45NTJdLFxuICAgICAgICAgICAgICAgIFsxMDguNDUsIDExLjk1Ml0sXG4gICAgICAgICAgICAgICAgWzEwOC40NSwgMTEuOTRdLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwYXJjZWw6IHsgLi4uR0VPX01BUF9ERU1PX1BBUkNFTF9ERVRBSUwgfSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlU3dpcGVPdmVybGF5VmlzaWJsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5tYW5hZ2VkTGF5ZXJzKCk7XG4gICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbnlWaXNpYmxlID0gbGlzdC5zb21lKChsYXllcikgPT4gbGF5ZXIudmlzaWJsZSAhPT0gZmFsc2UpO1xuICAgIGlmIChhbnlWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSBsaXN0Lm1hcCgobGF5ZXIsIGluZGV4KSA9PlxuICAgICAgaW5kZXggPT09IDAgPyB7IC4uLmxheWVyLCB2aXNpYmxlOiB0cnVlIH0gOiBsYXllcixcbiAgICApO1xuICAgIHRoaXMubWFuYWdlZExheWVycy5zZXQobmV4dCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnZW8tbWFwLXNoZWxsXCI+XG4gIDxnZW8tbWFwXG4gICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX19tYXBcIlxuICAgIFtjZW50ZXJdPVwiY2VudGVyKClcIlxuICAgIFt6b29tXT1cInpvb20oKVwiXG4gICAgW2hlaWdodF09XCInMTAwJSdcIlxuICAgIFtiYXNlbWFwXT1cImJhc2VtYXAoKVwiXG4gICAgW2xheWVyc109XCJyZXNvbHZlZExheWVycygpXCJcbiAgICBbc2hvd01vdXNlUG9zaXRpb25dPVwic2hvd01vdXNlUG9zaXRpb24oKVwiXG4gICAgW3Nob3dab29tQ29udHJvbF09XCJmYWxzZVwiXG4gICAgKG1hcFJlYWR5KT1cIm9uTWFwUmVhZHkoJGV2ZW50KVwiXG4gICAgKG1hcENsaWNrKT1cIm9uTWFwQ2xpY2soJGV2ZW50KVwiXG4gIC8+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX2Nocm9tZS1sZWZ0XCI+XG4gICAgPGdlby1tYXAtdG9vbGJhclxuICAgICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX190b29sYmFyXCJcbiAgICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXIoKVwiXG4gICAgICBbYWN0aW9uc109XCJyZXNvbHZlZFRvb2xiYXJBY3Rpb25zKClcIlxuICAgICAgWyhjaGVja2VkTWFwKV09XCJjaGVja2VkTWFwXCJcbiAgICAgIChhY3Rpb25DbGljayk9XCJvblRvb2xiYXJBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAoYWN0aW9uVG9nZ2xlKT1cIm9uVG9vbGJhclRvZ2dsZSgkZXZlbnQpXCJcbiAgICAvPlxuXG4gICAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX3BhbmVsc1wiPlxuICAgICAgPGdlby1tYXAtc2VhcmNoXG4gICAgICAgIFsob3BlbildPVwic2VhcmNoT3BlblwiXG4gICAgICAgIFtyZXN1bHRzXT1cInNlYXJjaFJlc3VsdHMoKVwiXG4gICAgICAgIChzZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIChyZXNldCk9XCJvblNlYXJjaFJlc2V0KClcIlxuICAgICAgICAocmVzdWx0U2VsZWN0KT1cIm9uUmVzdWx0U2VsZWN0KCRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxnZW8tbWFwLWFkbWluLWZpbHRlclxuICAgICAgICBbKG9wZW4pXT1cImFkbWluRmlsdGVyT3BlblwiXG4gICAgICAgIHRpdGxlPVwiQ2h1eeG7g24gduG7iyB0csOtXCJcbiAgICAgICAgW25vZGVzXT1cImFkbWluTm9kZXMoKVwiXG4gICAgICAgIFsoY2hlY2tlZEtleXMpXT1cImFkbWluQ2hlY2tlZEtleXNcIlxuICAgICAgICBbKGV4cGFuZGVkS2V5cyldPVwiYWRtaW5FeHBhbmRlZEtleXNcIlxuICAgICAgICAoYXBwbHkpPVwib25BZG1pbkFwcGx5KCRldmVudClcIlxuICAgICAgICAocmVzZXQpPVwiYWRtaW5DaGVja2VkS2V5cy5zZXQoW10pXCJcbiAgICAgICAgKGZpdFByb3ZpbmNlKT1cIm9uRml0UHJvdmluY2UoKVwiXG4gICAgICAgIChjbG9zZWQpPVwib25BZG1pbkNsb3NlZCgpXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1wYXJjZWwtcG9wdXBcbiAgICAgICAgWyhvcGVuKV09XCJwYXJjZWxPcGVuXCJcbiAgICAgICAgW3BhcmNlbF09XCJzZWxlY3RlZFBhcmNlbCgpXCJcbiAgICAgICAgW2F1ZGllbmNlXT1cInBhcmNlbEF1ZGllbmNlKClcIlxuICAgICAgICAoZXhwb3J0Q2xpY2spPVwicGFyY2VsRXhwb3J0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChiYWNrKT1cIm9uUGFyY2VsQmFjaygpXCJcbiAgICAgICAgKGNsb3NlZCk9XCJvblBhcmNlbENsb3NlZCgpXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1sYXllcnMtZHJhd2VyXG4gICAgICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXIoKVwiXG4gICAgICAgIFsob3BlbildPVwibGF5ZXJzT3BlblwiXG4gICAgICAgIFsobGF5ZXJzKV09XCJtYW5hZ2VkTGF5ZXJzXCJcbiAgICAgIC8+XG4gICAgICA8Z2VvLW1hcC1sZWdlbmRcbiAgICAgICAgWyhvcGVuKV09XCJsZWdlbmRPcGVuXCJcbiAgICAgICAgW2l0ZW1zXT1cImxlZ2VuZEl0ZW1zKClcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBIZWFkbGVzcyBicmlkZ2VzOiB6b29tL2Z1bGxzY3JlZW4gKyBzbmFwc2hvdCAoZHJpdmVuIGJ5IHRvb2xiYXIgYWN0aW9ucykuIC0tPlxuICA8Z2VvLW1hcC16b29tXG4gICAgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX196b29tLWJyaWRnZVwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICBbc2hvd05hdl09XCJzaG93TmF2KClcIlxuICAgIFtwcm92aW5jZUV4dGVudF09XCJwcm92aW5jZUV4dGVudCgpXCJcbiAgLz5cbiAgPGdlby1tYXAtc25hcHNob3RcbiAgICBjbGFzcz1cImdlby1tYXAtc2hlbGxfX3NuYXBzaG90LWJyaWRnZVwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgLz5cblxuICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1zaGVsbF9fdG9wLXJpZ2h0XCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2dlb01hcFNoZWxsVG9wUmlnaHRdXCIgLz5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2hlbGxfX2JvdHRvbS1yaWdodFwiPlxuICAgIDxnZW8tbWFwLWJhc2VtYXAtc3dpdGNoZXJcbiAgICAgIFtvcHRpb25zXT1cImJhc2VtYXBPcHRpb25zKClcIlxuICAgICAgWyhzZWxlY3RlZElkKV09XCJiYXNlbWFwSWRcIlxuICAgICAgKGJhc2VtYXBDaGFuZ2UpPVwib25CYXNlbWFwQ2hhbmdlKCRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNoZWxsX19zdGF0dXNcIj5cbiAgICBAaWYgKGxvY2F0aW9uTGFiZWwoKSkge1xuICAgICAgPGdlby1tYXAtbG9jYXRpb24tY2hpcCBbbGFiZWxdPVwibG9jYXRpb25MYWJlbCgpXCIgLz5cbiAgICB9XG4gICAgPGdlby1tYXAtbWVhc3VyZVxuICAgICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICAgIFsobW9kZSldPVwibWVhc3VyZU1vZGVcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDxnZW8tbWFwLXN3aXBlXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlcigpXCJcbiAgICBbKGFjdGl2ZSldPVwic3dpcGVBY3RpdmVcIlxuICAvPlxuXG4gIDxnZW8tbWFwLWhlbHAgWyhvcGVuKV09XCJoZWxwT3BlblwiIC8+XG48L2Rpdj5cbiJdfQ==
|