@igo2/geo 1.11.1 → 1.13.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/icons/cross_black_18px.svg +88 -88
- package/assets/icons/place_blue_36px.svg +55 -55
- package/assets/icons/place_green_36px.svg +55 -55
- package/assets/icons/place_red_36px.svg +55 -55
- package/assets/icons/place_yellow_36px.svg +55 -55
- package/{esm2015/igo2-geo.js → esm2020/igo2-geo.mjs} +0 -0
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +299 -0
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +268 -0
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +244 -0
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +80 -0
- package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +209 -0
- package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +79 -0
- package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +217 -0
- package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +95 -0
- package/esm2020/lib/catalog/catalog.module.mjs +53 -0
- package/esm2020/lib/catalog/index.mjs +5 -0
- package/esm2020/lib/catalog/shared/catalog.abstract.mjs +95 -0
- package/esm2020/lib/catalog/shared/catalog.enum.mjs +16 -0
- package/esm2020/lib/catalog/shared/catalog.interface.mjs +2 -0
- package/esm2020/lib/catalog/shared/catalog.service.mjs +606 -0
- package/esm2020/lib/catalog/shared/index.mjs +5 -0
- package/esm2020/lib/datasource/datasource.module.mjs +22 -0
- package/esm2020/lib/datasource/index.mjs +3 -0
- package/esm2020/lib/datasource/shared/capabilities.service.mjs +426 -0
- package/esm2020/lib/datasource/shared/datasource.service.mjs +236 -0
- package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +145 -0
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +109 -0
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +15 -0
- package/esm2020/lib/datasource/shared/datasources/data.service.mjs +3 -0
- package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/datasource.mjs +29 -0
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +43 -0
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +57 -0
- package/esm2020/lib/datasource/shared/datasources/index.mjs +36 -0
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +28 -0
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +12 -0
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +49 -0
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +15 -0
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +54 -0
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +74 -0
- package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +152 -0
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +205 -0
- package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +207 -0
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +16 -0
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +9 -0
- package/esm2020/lib/datasource/shared/index.mjs +5 -0
- package/esm2020/lib/datasource/shared/options/index.mjs +5 -0
- package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +2 -0
- package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +15 -0
- package/esm2020/lib/datasource/shared/options/options-api.service.mjs +81 -0
- package/esm2020/lib/datasource/shared/options/options.service.mjs +3 -0
- package/esm2020/lib/datasource/utils/esri-style-generator.mjs +357 -0
- package/esm2020/lib/datasource/utils/index.mjs +3 -0
- package/esm2020/lib/datasource/utils/tilegrid.mjs +20 -0
- package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +224 -0
- package/esm2020/lib/directions/directions-buttons/index.mjs +2 -0
- package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +290 -0
- package/esm2020/lib/directions/directions-inputs/index.mjs +2 -0
- package/esm2020/lib/directions/directions-results/directions-results.component.mjs +196 -0
- package/esm2020/lib/directions/directions-results/index.mjs +2 -0
- package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +2 -0
- package/esm2020/lib/directions/directions-sources/directions-source.mjs +3 -0
- package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +16 -0
- package/esm2020/lib/directions/directions-sources/index.mjs +5 -0
- package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +99 -0
- package/esm2020/lib/directions/directions.component.mjs +311 -0
- package/esm2020/lib/directions/directions.module.mjs +102 -0
- package/esm2020/lib/directions/index.mjs +7 -0
- package/esm2020/lib/directions/shared/directions-source.service.mjs +17 -0
- package/esm2020/lib/directions/shared/directions.enum.mjs +28 -0
- package/esm2020/lib/directions/shared/directions.interface.mjs +2 -0
- package/esm2020/lib/directions/shared/directions.service.mjs +29 -0
- package/esm2020/lib/directions/shared/directions.utils.mjs +510 -0
- package/esm2020/lib/directions/shared/index.mjs +6 -0
- package/esm2020/lib/directions/shared/store.mjs +24 -0
- package/esm2020/lib/download/download-button/download-button.component.mjs +61 -0
- package/esm2020/lib/download/download-button/index.mjs +2 -0
- package/esm2020/lib/download/download.module.mjs +42 -0
- package/esm2020/lib/download/index.mjs +3 -0
- package/esm2020/lib/download/shared/download.interface.mjs +2 -0
- package/esm2020/lib/download/shared/download.service.mjs +65 -0
- package/esm2020/lib/download/shared/index.mjs +3 -0
- package/esm2020/lib/draw/draw/draw-popup.component.mjs +61 -0
- package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +48 -0
- package/esm2020/lib/draw/draw/draw.component.mjs +714 -0
- package/esm2020/lib/draw/draw/draw.module.mjs +100 -0
- package/esm2020/lib/draw/drawingTool.module.mjs +20 -0
- package/esm2020/lib/draw/index.mjs +3 -0
- package/esm2020/lib/draw/shared/draw-icon.service.mjs +27 -0
- package/esm2020/lib/draw/shared/draw-style.service.mjs +173 -0
- package/esm2020/lib/draw/shared/draw.enum.mjs +24 -0
- package/esm2020/lib/draw/shared/draw.interface.mjs +2 -0
- package/esm2020/lib/draw/shared/draw.utils.mjs +104 -0
- package/esm2020/lib/draw/shared/index.mjs +6 -0
- package/esm2020/lib/feature/feature-details/feature-details.component.mjs +377 -0
- package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +54 -0
- package/esm2020/lib/feature/feature-details/feature-details.module.mjs +48 -0
- package/esm2020/lib/feature/feature-form/feature-form.component.mjs +112 -0
- package/esm2020/lib/feature/feature-form/feature-form.module.mjs +34 -0
- package/esm2020/lib/feature/feature.module.mjs +28 -0
- package/esm2020/lib/feature/index.mjs +4 -0
- package/esm2020/lib/feature/shared/feature.enums.mjs +9 -0
- package/esm2020/lib/feature/shared/feature.interfaces.mjs +2 -0
- package/esm2020/lib/feature/shared/feature.utils.mjs +348 -0
- package/esm2020/lib/feature/shared/index.mjs +7 -0
- package/esm2020/lib/feature/shared/store.mjs +112 -0
- package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +113 -0
- package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +94 -0
- package/esm2020/lib/feature/shared/strategies/index.mjs +6 -0
- package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +104 -0
- package/esm2020/lib/feature/shared/strategies/loading.mjs +133 -0
- package/esm2020/lib/feature/shared/strategies/selection.mjs +370 -0
- package/esm2020/lib/feature/shared/strategies.utils.mjs +37 -0
- package/esm2020/lib/filter/filter.module.mjs +289 -0
- package/esm2020/lib/filter/index.mjs +16 -0
- package/esm2020/lib/filter/ogc-filter-button/index.mjs +2 -0
- package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +140 -0
- package/esm2020/lib/filter/ogc-filter-form/index.mjs +2 -0
- package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +645 -0
- package/esm2020/lib/filter/ogc-filter-selection/index.mjs +2 -0
- package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1302 -0
- package/esm2020/lib/filter/ogc-filter-time/index.mjs +3 -0
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +177 -0
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +871 -0
- package/esm2020/lib/filter/ogc-filterable-form/index.mjs +2 -0
- package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +59 -0
- package/esm2020/lib/filter/ogc-filterable-item/index.mjs +2 -0
- package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +302 -0
- package/esm2020/lib/filter/ogc-filterable-list/index.mjs +3 -0
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +31 -0
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +31 -0
- package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +55 -0
- package/esm2020/lib/filter/shared/index.mjs +12 -0
- package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
- package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +30 -0
- package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +2 -0
- package/esm2020/lib/filter/shared/ogc-filter.mjs +692 -0
- package/esm2020/lib/filter/shared/ogc-filter.service.mjs +46 -0
- package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +23 -0
- package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +2 -0
- package/esm2020/lib/filter/shared/spatial-filter.service.mjs +269 -0
- package/esm2020/lib/filter/shared/time-filter.enum.mjs +13 -0
- package/esm2020/lib/filter/shared/time-filter.interface.mjs +2 -0
- package/esm2020/lib/filter/shared/time-filter.service.mjs +107 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1076 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +208 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +144 -0
- package/esm2020/lib/filter/time-filter-button/index.mjs +2 -0
- package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +78 -0
- package/esm2020/lib/filter/time-filter-form/index.mjs +2 -0
- package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +734 -0
- package/esm2020/lib/filter/time-filter-item/index.mjs +2 -0
- package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +119 -0
- package/esm2020/lib/filter/time-filter-list/index.mjs +3 -0
- package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +31 -0
- package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +39 -0
- package/esm2020/lib/geo.module.mjs +102 -0
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +511 -0
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +189 -0
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +64 -0
- package/esm2020/lib/geometry/geometry.module.mjs +27 -0
- package/esm2020/lib/geometry/index.mjs +4 -0
- package/esm2020/lib/geometry/shared/controls/draw.mjs +271 -0
- package/esm2020/lib/geometry/shared/controls/index.mjs +4 -0
- package/esm2020/lib/geometry/shared/controls/modify.mjs +521 -0
- package/esm2020/lib/geometry/shared/controls/slice.mjs +177 -0
- package/esm2020/lib/geometry/shared/geometry.errors.mjs +26 -0
- package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +2 -0
- package/esm2020/lib/geometry/shared/geometry.utils.mjs +122 -0
- package/esm2020/lib/geometry/shared/index.mjs +5 -0
- package/esm2020/lib/import-export/export-button/export-button.component.mjs +64 -0
- package/esm2020/lib/import-export/export-button/index.mjs +2 -0
- package/esm2020/lib/import-export/import-export/import-export.component.mjs +1190 -0
- package/esm2020/lib/import-export/import-export/index.mjs +2 -0
- package/esm2020/lib/import-export/import-export.module.mjs +93 -0
- package/esm2020/lib/import-export/index.mjs +5 -0
- package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +135 -0
- package/esm2020/lib/import-export/shared/export.errors.mjs +15 -0
- package/esm2020/lib/import-export/shared/export.interface.mjs +2 -0
- package/esm2020/lib/import-export/shared/export.service.mjs +195 -0
- package/esm2020/lib/import-export/shared/export.type.mjs +4 -0
- package/esm2020/lib/import-export/shared/export.utils.mjs +55 -0
- package/esm2020/lib/import-export/shared/import.errors.mjs +39 -0
- package/esm2020/lib/import-export/shared/import.interface.mjs +2 -0
- package/esm2020/lib/import-export/shared/import.service.mjs +195 -0
- package/esm2020/lib/import-export/shared/import.utils.mjs +234 -0
- package/esm2020/lib/import-export/shared/index.mjs +11 -0
- package/esm2020/lib/import-export/style-list/index.mjs +5 -0
- package/esm2020/lib/import-export/style-list/style-list.interface.mjs +2 -0
- package/esm2020/lib/import-export/style-list/style-list.module.mjs +23 -0
- package/esm2020/lib/import-export/style-list/style-list.provider.mjs +21 -0
- package/esm2020/lib/import-export/style-list/style-list.service.mjs +51 -0
- package/esm2020/lib/layer/index.mjs +10 -0
- package/esm2020/lib/layer/layer-item/index.mjs +2 -0
- package/esm2020/lib/layer/layer-item/layer-item.component.mjs +300 -0
- package/esm2020/lib/layer/layer-legend/index.mjs +2 -0
- package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +382 -0
- package/esm2020/lib/layer/layer-legend-item/index.mjs +2 -0
- package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +84 -0
- package/esm2020/lib/layer/layer-legend-list/index.mjs +3 -0
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +48 -0
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +195 -0
- package/esm2020/lib/layer/layer-list/index.mjs +4 -0
- package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +59 -0
- package/esm2020/lib/layer/layer-list/layer-list.component.mjs +1024 -0
- package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +19 -0
- package/esm2020/lib/layer/layer-list-tool/index.mjs +5 -0
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +165 -0
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +7 -0
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +2 -0
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +22 -0
- package/esm2020/lib/layer/layer.module.mjs +173 -0
- package/esm2020/lib/layer/shared/clusterParam.mjs +2 -0
- package/esm2020/lib/layer/shared/index.mjs +7 -0
- package/esm2020/lib/layer/shared/layer.enums.mjs +2 -0
- package/esm2020/lib/layer/shared/layer.service.mjs +186 -0
- package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/any-layer.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/image-layer.mjs +68 -0
- package/esm2020/lib/layer/shared/layers/index.mjs +13 -0
- package/esm2020/lib/layer/shared/layers/layer.interface.mjs +17 -0
- package/esm2020/lib/layer/shared/layers/layer.mjs +170 -0
- package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/tile-layer.mjs +47 -0
- package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/vector-layer.mjs +376 -0
- package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
- package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +104 -0
- package/esm2020/lib/layer/shared/style.service.mjs +356 -0
- package/esm2020/lib/layer/shared/vector-style.interface.mjs +2 -0
- package/esm2020/lib/layer/track-feature-button/index.mjs +2 -0
- package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +59 -0
- package/esm2020/lib/layer/utils/image-watcher.mjs +62 -0
- package/esm2020/lib/layer/utils/index.mjs +7 -0
- package/esm2020/lib/layer/utils/layer.utils.mjs +10 -0
- package/esm2020/lib/layer/utils/layerSync-watcher.mjs +242 -0
- package/esm2020/lib/layer/utils/outputLegend.mjs +27 -0
- package/esm2020/lib/layer/utils/tile-watcher.mjs +50 -0
- package/esm2020/lib/layer/utils/vector-watcher.mjs +48 -0
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +97 -0
- package/esm2020/lib/map/baselayers-switcher/index.mjs +3 -0
- package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +133 -0
- package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +76 -0
- package/esm2020/lib/map/geolocate-button/index.mjs +2 -0
- package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +63 -0
- package/{esm2015/lib/map/home-extent-button/index.js → esm2020/lib/map/home-extent-button/index.mjs} +0 -0
- package/esm2020/lib/map/index.mjs +14 -0
- package/esm2020/lib/map/info-section/index.mjs +2 -0
- package/esm2020/lib/map/info-section/info-section.component.mjs +30 -0
- package/esm2020/lib/map/map-browser/index.mjs +2 -0
- package/esm2020/lib/map/map-browser/map-browser.component.mjs +66 -0
- package/esm2020/lib/map/map-center/index.mjs +2 -0
- package/esm2020/lib/map/map-center/map-center.component.mjs +50 -0
- package/esm2020/lib/map/map.module.mjs +127 -0
- package/esm2020/lib/map/menu-button/index.mjs +2 -0
- package/esm2020/lib/map/menu-button/menu-button.component.mjs +62 -0
- package/esm2020/lib/map/offline-button/index.mjs +2 -0
- package/esm2020/lib/map/offline-button/offline-button.component.mjs +76 -0
- package/esm2020/lib/map/rotation-button/index.mjs +2 -0
- package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +91 -0
- package/esm2020/lib/map/shared/controllers/controller.mjs +42 -0
- package/esm2020/lib/map/shared/controllers/geolocation.mjs +308 -0
- package/esm2020/lib/map/shared/controllers/index.mjs +4 -0
- package/esm2020/lib/map/shared/controllers/view.mjs +342 -0
- package/esm2020/lib/map/shared/hover-feature.directive.mjs +506 -0
- package/esm2020/lib/map/shared/index.mjs +13 -0
- package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +107 -0
- package/esm2020/lib/map/shared/map.enums.mjs +6 -0
- package/esm2020/lib/map/shared/map.interface.mjs +2 -0
- package/esm2020/lib/map/shared/map.mjs +417 -0
- package/esm2020/lib/map/shared/map.service.mjs +29 -0
- package/esm2020/lib/map/shared/map.utils.mjs +459 -0
- package/esm2020/lib/map/shared/mapOffline.directive.mjs +163 -0
- package/esm2020/lib/map/shared/projection.interfaces.mjs +2 -0
- package/esm2020/lib/map/shared/projection.service.mjs +65 -0
- package/esm2020/lib/map/shared/projection.utils.mjs +64 -0
- package/esm2020/lib/map/swipe-control/index.mjs +2 -0
- package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +193 -0
- package/esm2020/lib/map/utils/layer-watcher.mjs +58 -0
- package/esm2020/lib/map/wake-lock-button/index.mjs +2 -0
- package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +114 -0
- package/esm2020/lib/map/zoom-button/index.mjs +2 -0
- package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +40 -0
- package/esm2020/lib/measure/index.mjs +4 -0
- package/esm2020/lib/measure/measure.module.mjs +20 -0
- package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +37 -0
- package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +180 -0
- package/esm2020/lib/measure/measurer/measurer-item.component.mjs +140 -0
- package/esm2020/lib/measure/measurer/measurer.component.mjs +1042 -0
- package/esm2020/lib/measure/measurer/measurer.module.mjs +94 -0
- package/esm2020/lib/measure/shared/index.mjs +4 -0
- package/esm2020/lib/measure/shared/measure.enum.mjs +37 -0
- package/esm2020/lib/measure/shared/measure.interfaces.mjs +2 -0
- package/esm2020/lib/measure/shared/measure.utils.mjs +489 -0
- package/esm2020/lib/metadata/index.mjs +3 -0
- package/esm2020/lib/metadata/metadata-button/index.mjs +2 -0
- package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +134 -0
- package/esm2020/lib/metadata/metadata.module.mjs +55 -0
- package/esm2020/lib/metadata/shared/index.mjs +3 -0
- package/esm2020/lib/metadata/shared/metadata.interface.mjs +2 -0
- package/esm2020/lib/metadata/shared/metadata.service.mjs +19 -0
- package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +6 -0
- package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +2 -0
- package/esm2020/lib/offline/geoDB/geoDB.service.mjs +161 -0
- package/esm2020/lib/offline/geoDB/index.mjs +4 -0
- package/esm2020/lib/offline/index.mjs +3 -0
- package/esm2020/lib/offline/shared/geo-network.service.mjs +66 -0
- package/esm2020/lib/offline/shared/index.mjs +2 -0
- package/esm2020/lib/overlay/index.mjs +2 -0
- package/esm2020/lib/overlay/overlay.module.mjs +23 -0
- package/esm2020/lib/overlay/shared/index.mjs +7 -0
- package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +69 -0
- package/esm2020/lib/overlay/shared/overlay.directive.mjs +33 -0
- package/esm2020/lib/overlay/shared/overlay.enum.mjs +8 -0
- package/esm2020/lib/overlay/shared/overlay.mjs +130 -0
- package/esm2020/lib/overlay/shared/overlay.service.mjs +27 -0
- package/esm2020/lib/overlay/shared/overlay.utils.mjs +103 -0
- package/esm2020/lib/print/index.mjs +4 -0
- package/esm2020/lib/print/print/print.component.mjs +123 -0
- package/esm2020/lib/print/print-form/index.mjs +2 -0
- package/esm2020/lib/print/print-form/print-form.component.mjs +405 -0
- package/esm2020/lib/print/print.module.mjs +65 -0
- package/esm2020/lib/print/shared/index.mjs +4 -0
- package/esm2020/lib/print/shared/print.interface.mjs +2 -0
- package/esm2020/lib/print/shared/print.service.mjs +807 -0
- package/esm2020/lib/print/shared/print.type.mjs +30 -0
- package/esm2020/lib/query/index.mjs +2 -0
- package/esm2020/lib/query/query.module.mjs +29 -0
- package/esm2020/lib/query/shared/index.mjs +7 -0
- package/esm2020/lib/query/shared/query-search-source.mjs +35 -0
- package/esm2020/lib/query/shared/query-search-source.providers.mjs +22 -0
- package/esm2020/lib/query/shared/query.directive.mjs +261 -0
- package/esm2020/lib/query/shared/query.enums.mjs +30 -0
- package/esm2020/lib/query/shared/query.interfaces.mjs +2 -0
- package/esm2020/lib/query/shared/query.service.mjs +613 -0
- package/esm2020/lib/query/shared/query.utils.mjs +37 -0
- package/esm2020/lib/search/index.mjs +12 -0
- package/esm2020/lib/search/search-bar/search-bar.component.mjs +489 -0
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +75 -0
- package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +35 -0
- package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +193 -0
- package/esm2020/lib/search/search-results/search-results-item.component.mjs +124 -0
- package/esm2020/lib/search/search-results/search-results.component.mjs +331 -0
- package/esm2020/lib/search/search-results/search-results.module.mjs +77 -0
- package/esm2020/lib/search/search-selector/search-selector.component.mjs +123 -0
- package/esm2020/lib/search/search-selector/search-selector.module.mjs +56 -0
- package/esm2020/lib/search/search-settings/search-settings.component.mjs +418 -0
- package/esm2020/lib/search/search-settings/search-settings.module.mjs +60 -0
- package/esm2020/lib/search/search.module.mjs +67 -0
- package/esm2020/lib/search/shared/index.mjs +9 -0
- package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +322 -0
- package/esm2020/lib/search/shared/search-source-service.providers.mjs +20 -0
- package/esm2020/lib/search/shared/search-source.service.mjs +47 -0
- package/esm2020/lib/search/shared/search.enums.mjs +4 -0
- package/esm2020/lib/search/shared/search.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/search.service.mjs +118 -0
- package/esm2020/lib/search/shared/search.utils.mjs +78 -0
- package/esm2020/lib/search/shared/sources/cadastre.mjs +126 -0
- package/esm2020/lib/search/shared/sources/cadastre.providers.mjs +23 -0
- package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/coordinates.mjs +147 -0
- package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +40 -0
- package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/icherche.mjs +755 -0
- package/esm2020/lib/search/shared/sources/icherche.providers.mjs +66 -0
- package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/ilayer.mjs +320 -0
- package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +40 -0
- package/esm2020/lib/search/shared/sources/index.mjs +20 -0
- package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/nominatim.mjs +253 -0
- package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +23 -0
- package/esm2020/lib/search/shared/sources/source.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/source.mjs +179 -0
- package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
- package/esm2020/lib/search/shared/sources/storedqueries.mjs +425 -0
- package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +41 -0
- package/esm2020/lib/toast/index.mjs +2 -0
- package/esm2020/lib/toast/toast.component.mjs +113 -0
- package/esm2020/lib/toast/toast.module.mjs +45 -0
- package/esm2020/lib/utils/commonVectorStyle.interface.mjs +2 -0
- package/esm2020/lib/utils/commonVectorStyle.mjs +75 -0
- package/esm2020/lib/utils/googleLinks.mjs +13 -0
- package/esm2020/lib/utils/id-generator.mjs +110 -0
- package/esm2020/lib/utils/index.mjs +6 -0
- package/esm2020/lib/utils/osmLinks.mjs +10 -0
- package/esm2020/lib/wkt/index.mjs +2 -0
- package/esm2020/lib/wkt/shared/index.mjs +2 -0
- package/esm2020/lib/wkt/shared/wkt.service.mjs +239 -0
- package/esm2020/lib/wkt/wkt.module.mjs +22 -0
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +48 -0
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +36 -0
- package/esm2020/lib/workspace/confirmation-popup/index.mjs +3 -0
- package/esm2020/lib/workspace/index.mjs +8 -0
- package/esm2020/lib/workspace/shared/edition-workspace.mjs +278 -0
- package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +642 -0
- package/esm2020/lib/workspace/shared/feature-workspace.mjs +35 -0
- package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +150 -0
- package/esm2020/lib/workspace/shared/index.mjs +8 -0
- package/esm2020/lib/workspace/shared/wfs-workspace.mjs +35 -0
- package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +150 -0
- package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +261 -0
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +24 -0
- package/esm2020/lib/workspace/widgets/index.mjs +4 -0
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +47 -0
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +36 -0
- package/esm2020/lib/workspace/widgets/widgets.mjs +15 -0
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +133 -0
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +28 -0
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +113 -0
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +28 -0
- package/esm2020/lib/workspace/workspace.module.mjs +62 -0
- package/esm2020/public_api.mjs +55 -0
- package/fesm2015/igo2-geo.mjs +42904 -0
- package/fesm2015/igo2-geo.mjs.map +1 -0
- package/fesm2020/igo2-geo.mjs +41183 -0
- package/fesm2020/igo2-geo.mjs.map +1 -0
- package/{igo2-geo.d.ts → index.d.ts} +0 -0
- package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +1 -1
- package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +1 -1
- package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +1 -1
- package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +4 -4
- package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +1 -1
- package/lib/catalog/catalog-library/catalog-library.component.d.ts +1 -1
- package/lib/catalog/shared/catalog.interface.d.ts +9 -1
- package/lib/catalog/shared/catalog.service.d.ts +1 -0
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +7 -1
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +1 -1
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +1 -1
- package/lib/directions/directions-results/directions-results.component.d.ts +1 -1
- package/lib/directions/directions.component.d.ts +1 -1
- package/lib/download/download-button/download-button.component.d.ts +1 -1
- package/lib/draw/draw/draw-popup.component.d.ts +4 -2
- package/lib/draw/draw/draw-shorcuts.component.d.ts +1 -1
- package/lib/draw/draw/draw.component.d.ts +22 -5
- package/lib/draw/shared/draw-style.service.d.ts +6 -0
- package/lib/draw/shared/draw.enum.d.ts +15 -0
- package/lib/feature/feature-details/feature-details.component.d.ts +13 -3
- package/lib/feature/feature-details/feature-details.directive.d.ts +3 -14
- package/lib/feature/feature-form/feature-form.component.d.ts +1 -1
- package/lib/feature/shared/feature.interfaces.d.ts +2 -2
- package/lib/filter/filter.module.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
- package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +1 -1
- package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +33 -15
- package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +1 -1
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -6
- package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
- package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +1 -1
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +1 -1
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +1 -1
- package/lib/filter/shared/ogc-filter.interface.d.ts +19 -2
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +5 -5
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +4 -4
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -3
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +1 -1
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
- package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +1 -1
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +1 -1
- package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +1 -1
- package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +3 -3
- package/lib/import-export/export-button/export-button.component.d.ts +1 -1
- package/lib/import-export/import-export/import-export.component.d.ts +5 -5
- package/lib/import-export/shared/drop-geo-file.directive.d.ts +1 -1
- package/lib/import-export/shared/import.utils.d.ts +1 -1
- package/lib/layer/layer-item/layer-item.component.d.ts +2 -1
- package/lib/layer/layer-legend/layer-legend.component.d.ts +4 -3
- package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +1 -1
- package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +1 -1
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +1 -1
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +1 -1
- package/lib/layer/layer-list/layer-list.component.d.ts +1 -1
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +1 -1
- package/lib/layer/shared/layer.service.d.ts +6 -3
- package/lib/layer/shared/layers/layer.interface.d.ts +1 -0
- package/lib/layer/shared/layers/vector-layer.d.ts +5 -1
- package/lib/layer/shared/style.service.d.ts +38 -3
- package/lib/layer/shared/vector-style.interface.d.ts +11 -0
- package/lib/layer/track-feature-button/track-feature-button.component.d.ts +1 -1
- package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +1 -1
- package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +1 -1
- package/lib/map/geolocate-button/geolocate-button.component.d.ts +9 -2
- package/lib/map/home-extent-button/home-extent-button.component.d.ts +1 -1
- package/lib/map/index.d.ts +1 -0
- package/lib/map/info-section/info-section.component.d.ts +1 -1
- package/lib/map/map-browser/map-browser.component.d.ts +1 -1
- package/lib/map/map-center/map-center.component.d.ts +1 -1
- package/lib/map/map.module.d.ts +13 -12
- package/lib/map/menu-button/menu-button.component.d.ts +1 -1
- package/lib/map/offline-button/offline-button.component.d.ts +1 -1
- package/lib/map/rotation-button/rotation-button.component.d.ts +1 -1
- package/lib/map/shared/controllers/geolocation.d.ts +112 -0
- package/lib/map/shared/controllers/index.d.ts +1 -0
- package/lib/map/shared/controllers/view.d.ts +7 -0
- package/lib/map/shared/hover-feature.directive.d.ts +2 -2
- package/lib/map/shared/map-pointer-position.directive.d.ts +1 -1
- package/lib/map/shared/map.d.ts +7 -19
- package/lib/map/shared/map.interface.d.ts +0 -1
- package/lib/map/shared/mapOffline.directive.d.ts +1 -1
- package/lib/map/swipe-control/swipe-control.component.d.ts +1 -1
- package/lib/map/wake-lock-button/index.d.ts +1 -0
- package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +30 -0
- package/lib/map/zoom-button/zoom-button.component.d.ts +1 -1
- package/lib/measure/measurer/measure-format.pipe.d.ts +1 -1
- package/lib/measure/measurer/measurer-dialog.component.d.ts +1 -1
- package/lib/measure/measurer/measurer-item.component.d.ts +1 -1
- package/lib/measure/measurer/measurer.component.d.ts +1 -1
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +2 -2
- package/lib/offline/geoDB/geoDB.enums.d.ts +4 -0
- package/lib/offline/geoDB/geoDB.interface.d.ts +9 -0
- package/lib/offline/geoDB/geoDB.service.d.ts +35 -0
- package/lib/offline/geoDB/index.d.ts +3 -0
- package/lib/offline/index.d.ts +2 -0
- package/lib/offline/shared/geo-network.service.d.ts +28 -0
- package/lib/offline/shared/index.d.ts +1 -0
- package/lib/overlay/shared/overlay.directive.d.ts +1 -1
- package/lib/print/print/print.component.d.ts +1 -1
- package/lib/print/print-form/print-form.component.d.ts +17 -17
- package/lib/print/shared/print.service.d.ts +9 -3
- package/lib/query/query.module.d.ts +2 -1
- package/lib/query/shared/query.directive.d.ts +1 -1
- package/lib/query/shared/query.service.d.ts +7 -1
- package/lib/search/search-bar/search-bar.component.d.ts +1 -1
- package/lib/search/search-bar/search-url-param.directive.d.ts +1 -1
- package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
- package/lib/search/search-results/search-results-item.component.d.ts +1 -1
- package/lib/search/search-results/search-results.component.d.ts +1 -1
- package/lib/search/search-selector/search-selector.component.d.ts +1 -1
- package/lib/search/search-settings/search-settings.component.d.ts +1 -1
- package/lib/search/shared/search-pointer-summary.directive.d.ts +1 -1
- package/lib/toast/toast.component.d.ts +1 -1
- package/lib/wkt/shared/wkt.service.d.ts +1 -1
- package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +1 -1
- package/lib/workspace/shared/edition-workspace.d.ts +2 -1
- package/lib/workspace/shared/edition-workspace.service.d.ts +5 -2
- package/lib/workspace/shared/feature-workspace.service.d.ts +3 -2
- package/lib/workspace/shared/wfs-workspace.service.d.ts +3 -2
- package/lib/workspace/shared/wms-workspace.service.d.ts +5 -2
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
- package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +1 -1
- package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +1 -1
- package/ngcc.config.js +3 -3
- package/package.json +35 -20
- package/public_api.d.ts +1 -0
- package/style/geo.theming.scss +12 -12
- package/bundles/igo2-geo.umd.js +0 -45805
- package/bundles/igo2-geo.umd.js.map +0 -1
- package/esm2015/lib/catalog/catalog-browser/catalog-browser-group.component.js +0 -305
- package/esm2015/lib/catalog/catalog-browser/catalog-browser-layer.component.js +0 -274
- package/esm2015/lib/catalog/catalog-browser/catalog-browser.component.js +0 -248
- package/esm2015/lib/catalog/catalog-browser/catalog-browser.module.js +0 -82
- package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +0 -235
- package/esm2015/lib/catalog/catalog-library/catalog-library-item.component.js +0 -85
- package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +0 -224
- package/esm2015/lib/catalog/catalog-library/catalog-library.module.js +0 -97
- package/esm2015/lib/catalog/catalog.module.js +0 -55
- package/esm2015/lib/catalog/index.js +0 -5
- package/esm2015/lib/catalog/shared/catalog.abstract.js +0 -95
- package/esm2015/lib/catalog/shared/catalog.enum.js +0 -16
- package/esm2015/lib/catalog/shared/catalog.interface.js +0 -2
- package/esm2015/lib/catalog/shared/catalog.service.js +0 -535
- package/esm2015/lib/catalog/shared/index.js +0 -5
- package/esm2015/lib/datasource/datasource.module.js +0 -22
- package/esm2015/lib/datasource/index.js +0 -3
- package/esm2015/lib/datasource/shared/capabilities.service.js +0 -427
- package/esm2015/lib/datasource/shared/datasource.service.js +0 -236
- package/esm2015/lib/datasource/shared/datasources/any-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/any-datasource.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.js +0 -145
- package/esm2015/lib/datasource/shared/datasources/carto-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/carto-datasource.js +0 -109
- package/esm2015/lib/datasource/shared/datasources/cluster-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/cluster-datasource.js +0 -15
- package/esm2015/lib/datasource/shared/datasources/data.service.js +0 -3
- package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/datasource.js +0 -29
- package/esm2015/lib/datasource/shared/datasources/feature-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/feature-datasource.js +0 -43
- package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.js +0 -57
- package/esm2015/lib/datasource/shared/datasources/index.js +0 -36
- package/esm2015/lib/datasource/shared/datasources/mvt-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +0 -28
- package/esm2015/lib/datasource/shared/datasources/osm-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/osm-datasource.js +0 -12
- package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.js +0 -49
- package/esm2015/lib/datasource/shared/datasources/tiledebug-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/tiledebug-datasource.js +0 -15
- package/esm2015/lib/datasource/shared/datasources/websocket-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/websocket-datasource.js +0 -54
- package/esm2015/lib/datasource/shared/datasources/wfs-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/wfs-datasource.js +0 -71
- package/esm2015/lib/datasource/shared/datasources/wfs.service.js +0 -153
- package/esm2015/lib/datasource/shared/datasources/wms-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/wms-datasource.js +0 -202
- package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +0 -207
- package/esm2015/lib/datasource/shared/datasources/wmts-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/wmts-datasource.js +0 -16
- package/esm2015/lib/datasource/shared/datasources/xyz-datasource.interface.js +0 -2
- package/esm2015/lib/datasource/shared/datasources/xyz-datasource.js +0 -9
- package/esm2015/lib/datasource/shared/index.js +0 -5
- package/esm2015/lib/datasource/shared/options/index.js +0 -5
- package/esm2015/lib/datasource/shared/options/options-api.interface.js +0 -2
- package/esm2015/lib/datasource/shared/options/options-api.providers.js +0 -15
- package/esm2015/lib/datasource/shared/options/options-api.service.js +0 -81
- package/esm2015/lib/datasource/shared/options/options.service.js +0 -3
- package/esm2015/lib/datasource/utils/esri-style-generator.js +0 -357
- package/esm2015/lib/datasource/utils/index.js +0 -3
- package/esm2015/lib/datasource/utils/tilegrid.js +0 -20
- package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +0 -229
- package/esm2015/lib/directions/directions-buttons/index.js +0 -2
- package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +0 -300
- package/esm2015/lib/directions/directions-inputs/index.js +0 -2
- package/esm2015/lib/directions/directions-results/directions-results.component.js +0 -204
- package/esm2015/lib/directions/directions-results/index.js +0 -2
- package/esm2015/lib/directions/directions-sources/directions-source.interface.js +0 -2
- package/esm2015/lib/directions/directions-sources/directions-source.js +0 -3
- package/esm2015/lib/directions/directions-sources/directions-source.provider.js +0 -16
- package/esm2015/lib/directions/directions-sources/index.js +0 -5
- package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +0 -99
- package/esm2015/lib/directions/directions.component.js +0 -316
- package/esm2015/lib/directions/directions.module.js +0 -104
- package/esm2015/lib/directions/index.js +0 -7
- package/esm2015/lib/directions/shared/directions-source.service.js +0 -17
- package/esm2015/lib/directions/shared/directions.enum.js +0 -28
- package/esm2015/lib/directions/shared/directions.interface.js +0 -2
- package/esm2015/lib/directions/shared/directions.service.js +0 -29
- package/esm2015/lib/directions/shared/directions.utils.js +0 -510
- package/esm2015/lib/directions/shared/index.js +0 -6
- package/esm2015/lib/directions/shared/store.js +0 -24
- package/esm2015/lib/download/download-button/download-button.component.js +0 -66
- package/esm2015/lib/download/download-button/index.js +0 -2
- package/esm2015/lib/download/download.module.js +0 -44
- package/esm2015/lib/download/index.js +0 -3
- package/esm2015/lib/download/shared/download.interface.js +0 -2
- package/esm2015/lib/download/shared/download.service.js +0 -65
- package/esm2015/lib/download/shared/index.js +0 -3
- package/esm2015/lib/draw/draw/draw-popup.component.js +0 -63
- package/esm2015/lib/draw/draw/draw-shorcuts.component.js +0 -64
- package/esm2015/lib/draw/draw/draw.component.js +0 -637
- package/esm2015/lib/draw/draw/draw.module.js +0 -102
- package/esm2015/lib/draw/drawingTool.module.js +0 -20
- package/esm2015/lib/draw/index.js +0 -3
- package/esm2015/lib/draw/shared/draw-icon.service.js +0 -27
- package/esm2015/lib/draw/shared/draw-style.service.js +0 -154
- package/esm2015/lib/draw/shared/draw.enum.js +0 -8
- package/esm2015/lib/draw/shared/draw.interface.js +0 -2
- package/esm2015/lib/draw/shared/draw.utils.js +0 -104
- package/esm2015/lib/draw/shared/index.js +0 -6
- package/esm2015/lib/feature/feature-details/feature-details.component.js +0 -317
- package/esm2015/lib/feature/feature-details/feature-details.directive.js +0 -109
- package/esm2015/lib/feature/feature-details/feature-details.module.js +0 -50
- package/esm2015/lib/feature/feature-form/feature-form.component.js +0 -117
- package/esm2015/lib/feature/feature-form/feature-form.module.js +0 -36
- package/esm2015/lib/feature/feature.module.js +0 -30
- package/esm2015/lib/feature/index.js +0 -4
- package/esm2015/lib/feature/shared/feature.enums.js +0 -9
- package/esm2015/lib/feature/shared/feature.interfaces.js +0 -2
- package/esm2015/lib/feature/shared/feature.utils.js +0 -348
- package/esm2015/lib/feature/shared/index.js +0 -7
- package/esm2015/lib/feature/shared/store.js +0 -112
- package/esm2015/lib/feature/shared/strategies/in-map-extent.js +0 -114
- package/esm2015/lib/feature/shared/strategies/in-map-resolution.js +0 -94
- package/esm2015/lib/feature/shared/strategies/index.js +0 -6
- package/esm2015/lib/feature/shared/strategies/loading-layer.js +0 -104
- package/esm2015/lib/feature/shared/strategies/loading.js +0 -133
- package/esm2015/lib/feature/shared/strategies/selection.js +0 -370
- package/esm2015/lib/feature/shared/strategies.utils.js +0 -37
- package/esm2015/lib/filter/filter.module.js +0 -287
- package/esm2015/lib/filter/index.js +0 -16
- package/esm2015/lib/filter/ogc-filter-button/index.js +0 -2
- package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +0 -136
- package/esm2015/lib/filter/ogc-filter-form/index.js +0 -2
- package/esm2015/lib/filter/ogc-filter-form/ogc-filter-form.component.js +0 -657
- package/esm2015/lib/filter/ogc-filter-selection/index.js +0 -2
- package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +0 -993
- package/esm2015/lib/filter/ogc-filter-time/index.js +0 -3
- package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.js +0 -185
- package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +0 -898
- package/esm2015/lib/filter/ogc-filterable-form/index.js +0 -2
- package/esm2015/lib/filter/ogc-filterable-form/ogc-filterable-form.component.js +0 -62
- package/esm2015/lib/filter/ogc-filterable-item/index.js +0 -2
- package/esm2015/lib/filter/ogc-filterable-item/ogc-filterable-item.component.js +0 -306
- package/esm2015/lib/filter/ogc-filterable-list/index.js +0 -3
- package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.js +0 -31
- package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list.component.js +0 -35
- package/esm2015/lib/filter/shared/filterable-datasource.pipe.js +0 -54
- package/esm2015/lib/filter/shared/index.js +0 -12
- package/esm2015/lib/filter/shared/ogc-filter-time.service.js +0 -73
- package/esm2015/lib/filter/shared/ogc-filter.enum.js +0 -30
- package/esm2015/lib/filter/shared/ogc-filter.interface.js +0 -2
- package/esm2015/lib/filter/shared/ogc-filter.js +0 -682
- package/esm2015/lib/filter/shared/ogc-filter.service.js +0 -46
- package/esm2015/lib/filter/shared/spatial-filter.enum.js +0 -23
- package/esm2015/lib/filter/shared/spatial-filter.interface.js +0 -2
- package/esm2015/lib/filter/shared/spatial-filter.service.js +0 -269
- package/esm2015/lib/filter/shared/time-filter.enum.js +0 -13
- package/esm2015/lib/filter/shared/time-filter.interface.js +0 -2
- package/esm2015/lib/filter/shared/time-filter.service.js +0 -107
- package/esm2015/lib/filter/spatial-filter/spatial-filter-item/index.js +0 -2
- package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +0 -1108
- package/esm2015/lib/filter/spatial-filter/spatial-filter-list/index.js +0 -2
- package/esm2015/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.js +0 -224
- package/esm2015/lib/filter/spatial-filter/spatial-filter-type/index.js +0 -2
- package/esm2015/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.js +0 -157
- package/esm2015/lib/filter/time-filter-button/index.js +0 -2
- package/esm2015/lib/filter/time-filter-button/time-filter-button.component.js +0 -83
- package/esm2015/lib/filter/time-filter-form/index.js +0 -2
- package/esm2015/lib/filter/time-filter-form/time-filter-form.component.js +0 -772
- package/esm2015/lib/filter/time-filter-item/index.js +0 -2
- package/esm2015/lib/filter/time-filter-item/time-filter-item.component.js +0 -126
- package/esm2015/lib/filter/time-filter-list/index.js +0 -3
- package/esm2015/lib/filter/time-filter-list/time-filter-list-binding.directive.js +0 -31
- package/esm2015/lib/filter/time-filter-list/time-filter-list.component.js +0 -43
- package/esm2015/lib/geo.module.js +0 -102
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field-input.component.js +0 -515
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.component.js +0 -199
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.module.js +0 -66
- package/esm2015/lib/geometry/geometry.module.js +0 -29
- package/esm2015/lib/geometry/index.js +0 -4
- package/esm2015/lib/geometry/shared/controls/draw.js +0 -271
- package/esm2015/lib/geometry/shared/controls/index.js +0 -4
- package/esm2015/lib/geometry/shared/controls/modify.js +0 -521
- package/esm2015/lib/geometry/shared/controls/slice.js +0 -177
- package/esm2015/lib/geometry/shared/geometry.errors.js +0 -26
- package/esm2015/lib/geometry/shared/geometry.interfaces.js +0 -2
- package/esm2015/lib/geometry/shared/geometry.utils.js +0 -122
- package/esm2015/lib/geometry/shared/index.js +0 -5
- package/esm2015/lib/import-export/export-button/export-button.component.js +0 -70
- package/esm2015/lib/import-export/export-button/index.js +0 -2
- package/esm2015/lib/import-export/import-export/import-export.component.js +0 -1238
- package/esm2015/lib/import-export/import-export/index.js +0 -2
- package/esm2015/lib/import-export/import-export.module.js +0 -95
- package/esm2015/lib/import-export/index.js +0 -5
- package/esm2015/lib/import-export/shared/drop-geo-file.directive.js +0 -136
- package/esm2015/lib/import-export/shared/export.errors.js +0 -15
- package/esm2015/lib/import-export/shared/export.interface.js +0 -2
- package/esm2015/lib/import-export/shared/export.service.js +0 -187
- package/esm2015/lib/import-export/shared/export.type.js +0 -4
- package/esm2015/lib/import-export/shared/export.utils.js +0 -55
- package/esm2015/lib/import-export/shared/import.errors.js +0 -39
- package/esm2015/lib/import-export/shared/import.interface.js +0 -2
- package/esm2015/lib/import-export/shared/import.service.js +0 -195
- package/esm2015/lib/import-export/shared/import.utils.js +0 -207
- package/esm2015/lib/import-export/shared/index.js +0 -11
- package/esm2015/lib/import-export/style-list/index.js +0 -5
- package/esm2015/lib/import-export/style-list/style-list.interface.js +0 -2
- package/esm2015/lib/import-export/style-list/style-list.module.js +0 -23
- package/esm2015/lib/import-export/style-list/style-list.provider.js +0 -21
- package/esm2015/lib/import-export/style-list/style-list.service.js +0 -51
- package/esm2015/lib/layer/index.js +0 -10
- package/esm2015/lib/layer/layer-item/index.js +0 -2
- package/esm2015/lib/layer/layer-item/layer-item.component.js +0 -298
- package/esm2015/lib/layer/layer-legend/index.js +0 -2
- package/esm2015/lib/layer/layer-legend/layer-legend.component.js +0 -394
- package/esm2015/lib/layer/layer-legend-item/index.js +0 -2
- package/esm2015/lib/layer/layer-legend-item/layer-legend-item.component.js +0 -91
- package/esm2015/lib/layer/layer-legend-list/index.js +0 -3
- package/esm2015/lib/layer/layer-legend-list/layer-legend-list-binding.directive.js +0 -48
- package/esm2015/lib/layer/layer-legend-list/layer-legend-list.component.js +0 -200
- package/esm2015/lib/layer/layer-list/index.js +0 -4
- package/esm2015/lib/layer/layer-list/layer-list-binding.directive.js +0 -59
- package/esm2015/lib/layer/layer-list/layer-list.component.js +0 -1043
- package/esm2015/lib/layer/layer-list/layer-list.enum.js +0 -19
- package/esm2015/lib/layer/layer-list-tool/index.js +0 -5
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.component.js +0 -176
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.enum.js +0 -7
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.interface.js +0 -2
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.service.js +0 -22
- package/esm2015/lib/layer/layer.module.js +0 -174
- package/esm2015/lib/layer/shared/clusterParam.js +0 -2
- package/esm2015/lib/layer/shared/index.js +0 -7
- package/esm2015/lib/layer/shared/layer.enums.js +0 -2
- package/esm2015/lib/layer/shared/layer.service.js +0 -162
- package/esm2015/lib/layer/shared/layers/any-layer.interface.js +0 -2
- package/esm2015/lib/layer/shared/layers/any-layer.js +0 -2
- package/esm2015/lib/layer/shared/layers/image-layer.interface.js +0 -2
- package/esm2015/lib/layer/shared/layers/image-layer.js +0 -68
- package/esm2015/lib/layer/shared/layers/index.js +0 -13
- package/esm2015/lib/layer/shared/layers/layer.interface.js +0 -17
- package/esm2015/lib/layer/shared/layers/layer.js +0 -169
- package/esm2015/lib/layer/shared/layers/tile-layer.interface.js +0 -2
- package/esm2015/lib/layer/shared/layers/tile-layer.js +0 -47
- package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +0 -2
- package/esm2015/lib/layer/shared/layers/vector-layer.js +0 -325
- package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +0 -2
- package/esm2015/lib/layer/shared/layers/vectortile-layer.js +0 -104
- package/esm2015/lib/layer/shared/style.service.js +0 -289
- package/esm2015/lib/layer/shared/vector-style.interface.js +0 -2
- package/esm2015/lib/layer/track-feature-button/index.js +0 -2
- package/esm2015/lib/layer/track-feature-button/track-feature-button.component.js +0 -64
- package/esm2015/lib/layer/utils/image-watcher.js +0 -62
- package/esm2015/lib/layer/utils/index.js +0 -7
- package/esm2015/lib/layer/utils/layer.utils.js +0 -11
- package/esm2015/lib/layer/utils/layerSync-watcher.js +0 -249
- package/esm2015/lib/layer/utils/outputLegend.js +0 -25
- package/esm2015/lib/layer/utils/tile-watcher.js +0 -50
- package/esm2015/lib/layer/utils/vector-watcher.js +0 -48
- package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.animation.js +0 -20
- package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.component.js +0 -105
- package/esm2015/lib/map/baselayers-switcher/index.js +0 -3
- package/esm2015/lib/map/baselayers-switcher/mini-basemap.component.js +0 -137
- package/esm2015/lib/map/geolocate-button/geolocate-button.component.js +0 -47
- package/esm2015/lib/map/geolocate-button/index.js +0 -2
- package/esm2015/lib/map/home-extent-button/home-extent-button.component.js +0 -69
- package/esm2015/lib/map/index.js +0 -13
- package/esm2015/lib/map/info-section/index.js +0 -2
- package/esm2015/lib/map/info-section/info-section.component.js +0 -36
- package/esm2015/lib/map/map-browser/index.js +0 -2
- package/esm2015/lib/map/map-browser/map-browser.component.js +0 -70
- package/esm2015/lib/map/map-center/index.js +0 -2
- package/esm2015/lib/map/map-center/map-center.component.js +0 -55
- package/esm2015/lib/map/map.module.js +0 -124
- package/esm2015/lib/map/menu-button/index.js +0 -2
- package/esm2015/lib/map/menu-button/menu-button.component.js +0 -66
- package/esm2015/lib/map/offline-button/index.js +0 -2
- package/esm2015/lib/map/offline-button/offline-button.component.js +0 -84
- package/esm2015/lib/map/rotation-button/index.js +0 -2
- package/esm2015/lib/map/rotation-button/rotation-button.component.js +0 -97
- package/esm2015/lib/map/shared/controllers/controller.js +0 -42
- package/esm2015/lib/map/shared/controllers/index.js +0 -3
- package/esm2015/lib/map/shared/controllers/view.js +0 -326
- package/esm2015/lib/map/shared/hover-feature.directive.js +0 -508
- package/esm2015/lib/map/shared/index.js +0 -13
- package/esm2015/lib/map/shared/map-pointer-position.directive.js +0 -107
- package/esm2015/lib/map/shared/map.enums.js +0 -6
- package/esm2015/lib/map/shared/map.interface.js +0 -2
- package/esm2015/lib/map/shared/map.js +0 -538
- package/esm2015/lib/map/shared/map.service.js +0 -29
- package/esm2015/lib/map/shared/map.utils.js +0 -459
- package/esm2015/lib/map/shared/mapOffline.directive.js +0 -163
- package/esm2015/lib/map/shared/projection.interfaces.js +0 -2
- package/esm2015/lib/map/shared/projection.service.js +0 -65
- package/esm2015/lib/map/shared/projection.utils.js +0 -64
- package/esm2015/lib/map/swipe-control/index.js +0 -2
- package/esm2015/lib/map/swipe-control/swipe-control.component.js +0 -199
- package/esm2015/lib/map/utils/layer-watcher.js +0 -58
- package/esm2015/lib/map/zoom-button/index.js +0 -2
- package/esm2015/lib/map/zoom-button/zoom-button.component.js +0 -46
- package/esm2015/lib/measure/index.js +0 -4
- package/esm2015/lib/measure/measure.module.js +0 -20
- package/esm2015/lib/measure/measurer/measure-format.pipe.js +0 -37
- package/esm2015/lib/measure/measurer/measurer-dialog.component.js +0 -220
- package/esm2015/lib/measure/measurer/measurer-item.component.js +0 -148
- package/esm2015/lib/measure/measurer/measurer.component.js +0 -1053
- package/esm2015/lib/measure/measurer/measurer.module.js +0 -96
- package/esm2015/lib/measure/shared/index.js +0 -4
- package/esm2015/lib/measure/shared/measure.enum.js +0 -37
- package/esm2015/lib/measure/shared/measure.interfaces.js +0 -2
- package/esm2015/lib/measure/shared/measure.utils.js +0 -489
- package/esm2015/lib/metadata/index.js +0 -3
- package/esm2015/lib/metadata/metadata-button/index.js +0 -2
- package/esm2015/lib/metadata/metadata-button/metadata-button.component.js +0 -135
- package/esm2015/lib/metadata/metadata.module.js +0 -57
- package/esm2015/lib/metadata/shared/index.js +0 -3
- package/esm2015/lib/metadata/shared/metadata.interface.js +0 -2
- package/esm2015/lib/metadata/shared/metadata.service.js +0 -19
- package/esm2015/lib/overlay/index.js +0 -2
- package/esm2015/lib/overlay/overlay.module.js +0 -23
- package/esm2015/lib/overlay/shared/index.js +0 -7
- package/esm2015/lib/overlay/shared/overlay-marker-style.utils.js +0 -69
- package/esm2015/lib/overlay/shared/overlay.directive.js +0 -33
- package/esm2015/lib/overlay/shared/overlay.enum.js +0 -8
- package/esm2015/lib/overlay/shared/overlay.js +0 -130
- package/esm2015/lib/overlay/shared/overlay.service.js +0 -27
- package/esm2015/lib/overlay/shared/overlay.utils.js +0 -103
- package/esm2015/lib/print/index.js +0 -4
- package/esm2015/lib/print/print/print.component.js +0 -126
- package/esm2015/lib/print/print-form/index.js +0 -2
- package/esm2015/lib/print/print-form/print-form.component.js +0 -447
- package/esm2015/lib/print/print.module.js +0 -67
- package/esm2015/lib/print/shared/index.js +0 -4
- package/esm2015/lib/print/shared/print.interface.js +0 -2
- package/esm2015/lib/print/shared/print.service.js +0 -814
- package/esm2015/lib/print/shared/print.type.js +0 -30
- package/esm2015/lib/query/index.js +0 -2
- package/esm2015/lib/query/query.module.js +0 -28
- package/esm2015/lib/query/shared/index.js +0 -7
- package/esm2015/lib/query/shared/query-search-source.js +0 -35
- package/esm2015/lib/query/shared/query-search-source.providers.js +0 -22
- package/esm2015/lib/query/shared/query.directive.js +0 -261
- package/esm2015/lib/query/shared/query.enums.js +0 -30
- package/esm2015/lib/query/shared/query.interfaces.js +0 -2
- package/esm2015/lib/query/shared/query.service.js +0 -592
- package/esm2015/lib/query/shared/query.utils.js +0 -37
- package/esm2015/lib/search/index.js +0 -12
- package/esm2015/lib/search/search-bar/search-bar.component.js +0 -496
- package/esm2015/lib/search/search-bar/search-bar.module.js +0 -77
- package/esm2015/lib/search/search-bar/search-url-param.directive.js +0 -35
- package/esm2015/lib/search/search-results/search-results-add-button.component.js +0 -198
- package/esm2015/lib/search/search-results/search-results-item.component.js +0 -129
- package/esm2015/lib/search/search-results/search-results.component.js +0 -337
- package/esm2015/lib/search/search-results/search-results.module.js +0 -79
- package/esm2015/lib/search/search-selector/search-selector.component.js +0 -132
- package/esm2015/lib/search/search-selector/search-selector.module.js +0 -58
- package/esm2015/lib/search/search-settings/search-settings.component.js +0 -435
- package/esm2015/lib/search/search-settings/search-settings.module.js +0 -62
- package/esm2015/lib/search/search.module.js +0 -69
- package/esm2015/lib/search/shared/index.js +0 -9
- package/esm2015/lib/search/shared/search-pointer-summary.directive.js +0 -322
- package/esm2015/lib/search/shared/search-source-service.providers.js +0 -20
- package/esm2015/lib/search/shared/search-source.service.js +0 -47
- package/esm2015/lib/search/shared/search.enums.js +0 -4
- package/esm2015/lib/search/shared/search.interfaces.js +0 -2
- package/esm2015/lib/search/shared/search.service.js +0 -118
- package/esm2015/lib/search/shared/search.utils.js +0 -78
- package/esm2015/lib/search/shared/sources/cadastre.js +0 -126
- package/esm2015/lib/search/shared/sources/cadastre.providers.js +0 -23
- package/esm2015/lib/search/shared/sources/coordinates.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/coordinates.js +0 -147
- package/esm2015/lib/search/shared/sources/coordinates.providers.js +0 -40
- package/esm2015/lib/search/shared/sources/icherche.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/icherche.js +0 -756
- package/esm2015/lib/search/shared/sources/icherche.providers.js +0 -66
- package/esm2015/lib/search/shared/sources/ilayer.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/ilayer.js +0 -320
- package/esm2015/lib/search/shared/sources/ilayer.providers.js +0 -40
- package/esm2015/lib/search/shared/sources/index.js +0 -20
- package/esm2015/lib/search/shared/sources/nominatim.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/nominatim.js +0 -253
- package/esm2015/lib/search/shared/sources/nominatim.providers.js +0 -23
- package/esm2015/lib/search/shared/sources/source.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/source.js +0 -179
- package/esm2015/lib/search/shared/sources/storedqueries.interfaces.js +0 -2
- package/esm2015/lib/search/shared/sources/storedqueries.js +0 -425
- package/esm2015/lib/search/shared/sources/storedqueries.providers.js +0 -41
- package/esm2015/lib/toast/index.js +0 -2
- package/esm2015/lib/toast/toast.component.js +0 -119
- package/esm2015/lib/toast/toast.module.js +0 -47
- package/esm2015/lib/utils/commonVectorStyle.interface.js +0 -2
- package/esm2015/lib/utils/commonVectorStyle.js +0 -75
- package/esm2015/lib/utils/googleLinks.js +0 -13
- package/esm2015/lib/utils/id-generator.js +0 -110
- package/esm2015/lib/utils/index.js +0 -6
- package/esm2015/lib/utils/osmLinks.js +0 -10
- package/esm2015/lib/wkt/index.js +0 -2
- package/esm2015/lib/wkt/shared/index.js +0 -2
- package/esm2015/lib/wkt/shared/wkt.service.js +0 -239
- package/esm2015/lib/wkt/wkt.module.js +0 -22
- package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.component.js +0 -56
- package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.module.js +0 -38
- package/esm2015/lib/workspace/confirmation-popup/index.js +0 -3
- package/esm2015/lib/workspace/index.js +0 -8
- package/esm2015/lib/workspace/shared/edition-workspace.js +0 -271
- package/esm2015/lib/workspace/shared/edition-workspace.service.js +0 -619
- package/esm2015/lib/workspace/shared/feature-workspace.js +0 -37
- package/esm2015/lib/workspace/shared/feature-workspace.service.js +0 -146
- package/esm2015/lib/workspace/shared/index.js +0 -8
- package/esm2015/lib/workspace/shared/wfs-workspace.js +0 -37
- package/esm2015/lib/workspace/shared/wfs-workspace.service.js +0 -146
- package/esm2015/lib/workspace/shared/wms-workspace.service.js +0 -239
- package/esm2015/lib/workspace/shared/workspace.utils.js +0 -24
- package/esm2015/lib/workspace/widgets/index.js +0 -4
- package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.component.js +0 -52
- package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.module.js +0 -38
- package/esm2015/lib/workspace/widgets/widgets.js +0 -15
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +0 -135
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.module.js +0 -30
- package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +0 -116
- package/esm2015/lib/workspace/workspace-updator/workspace-updator.module.js +0 -30
- package/esm2015/lib/workspace/workspace.module.js +0 -64
- package/esm2015/public_api.js +0 -54
- package/fesm2015/igo2-geo.js +0 -40591
- package/fesm2015/igo2-geo.js.map +0 -1
|
@@ -1,814 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Observable, Subject, forkJoin } from 'rxjs';
|
|
4
|
-
import { map as rxMap } from 'rxjs/operators';
|
|
5
|
-
import { saveAs } from 'file-saver';
|
|
6
|
-
import jspdf from 'jspdf';
|
|
7
|
-
import html2canvas from 'html2canvas';
|
|
8
|
-
import * as JSZip from 'jszip';
|
|
9
|
-
import { SubjectStatus } from '@igo2/utils';
|
|
10
|
-
import { SecureImagePipe } from '@igo2/common';
|
|
11
|
-
import { formatScale } from '../../map/shared/map.utils';
|
|
12
|
-
import { getLayersLegends } from '../../layer/utils/outputLegend';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/common/http";
|
|
15
|
-
import * as i2 from "@igo2/core";
|
|
16
|
-
export class PrintService {
|
|
17
|
-
constructor(http, messageService, activityService, languageService) {
|
|
18
|
-
this.http = http;
|
|
19
|
-
this.messageService = messageService;
|
|
20
|
-
this.activityService = activityService;
|
|
21
|
-
this.languageService = languageService;
|
|
22
|
-
}
|
|
23
|
-
print(map, options) {
|
|
24
|
-
const status$ = new Subject();
|
|
25
|
-
const paperFormat = options.paperFormat;
|
|
26
|
-
const resolution = +options.resolution; // Default is 96
|
|
27
|
-
const orientation = options.orientation;
|
|
28
|
-
const legendPostion = options.legendPosition;
|
|
29
|
-
this.activityId = this.activityService.register();
|
|
30
|
-
const doc = new jspdf({
|
|
31
|
-
orientation,
|
|
32
|
-
format: paperFormat.toLowerCase()
|
|
33
|
-
});
|
|
34
|
-
const dimensions = [
|
|
35
|
-
doc.internal.pageSize.width,
|
|
36
|
-
doc.internal.pageSize.height
|
|
37
|
-
];
|
|
38
|
-
const margins = [10, 10, 10, 10];
|
|
39
|
-
const width = dimensions[0] - margins[3] - margins[1];
|
|
40
|
-
const height = dimensions[1] - margins[0] - margins[2];
|
|
41
|
-
const size = [width, height];
|
|
42
|
-
let titleSizeResults = [0, 0];
|
|
43
|
-
if (options.title !== undefined) {
|
|
44
|
-
titleSizeResults = this.getTitleSize(options.title, width, height, doc); // return : size(pt) and left margin (mm)
|
|
45
|
-
this.addTitle(doc, options.title, titleSizeResults[0], margins[3] + titleSizeResults[1], titleSizeResults[0] * (25.4 / 72));
|
|
46
|
-
}
|
|
47
|
-
if (options.subtitle !== undefined) {
|
|
48
|
-
let subtitleSizeResult = 0;
|
|
49
|
-
const titleH = titleSizeResults[0];
|
|
50
|
-
subtitleSizeResult = this.getSubTitleSize(options.subtitle, width, height, doc); // return : size(pt) and left margin (mm)
|
|
51
|
-
this.addSubTitle(doc, options.subtitle, titleH * 0.7, margins[3] + subtitleSizeResult, titleH * 1.7 * (25.4 / 72));
|
|
52
|
-
margins[0] = margins[0] + titleSizeResults[0] * 0.7 * (25.4 / 72);
|
|
53
|
-
}
|
|
54
|
-
if (options.showProjection === true || options.showScale === true) {
|
|
55
|
-
this.addProjScale(doc, map, resolution, options.showProjection, options.showScale);
|
|
56
|
-
}
|
|
57
|
-
if (options.comment !== '') {
|
|
58
|
-
this.addComment(doc, options.comment);
|
|
59
|
-
}
|
|
60
|
-
this.addMap(doc, map, resolution, size, margins).subscribe((status) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
-
if (status === SubjectStatus.Done) {
|
|
62
|
-
yield this.addScale(doc, map, margins);
|
|
63
|
-
yield this.handleMeasureLayer(doc, map, margins);
|
|
64
|
-
if (options.legendPosition !== 'none') {
|
|
65
|
-
if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(options.legendPosition) > -1) {
|
|
66
|
-
yield this.addLegendSamePage(doc, map, margins, resolution, options.legendPosition);
|
|
67
|
-
}
|
|
68
|
-
else if (options.legendPosition === 'newpage') {
|
|
69
|
-
yield this.addLegend(doc, map, margins, resolution);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
yield this.saveDoc(doc);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (status === SubjectStatus.Done || status === SubjectStatus.Error) {
|
|
77
|
-
this.activityService.unregister(this.activityId);
|
|
78
|
-
status$.next(SubjectStatus.Done);
|
|
79
|
-
}
|
|
80
|
-
}));
|
|
81
|
-
return status$;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Add measure overlay on the map on the document when the measure layer is present
|
|
85
|
-
* @param doc - Pdf document where measure tooltip will be added
|
|
86
|
-
* @param map - Map of the app
|
|
87
|
-
* @param margins - Page margins
|
|
88
|
-
*/
|
|
89
|
-
handleMeasureLayer(doc, map, margins) {
|
|
90
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
-
if (map.layers.find(layer => layer.visible && layer.id.startsWith('igo-measures-'))) {
|
|
92
|
-
let canvasOverlayHTMLMeasures;
|
|
93
|
-
const mapOverlayMeasuresHTML = map.ol.getOverlayContainer();
|
|
94
|
-
yield html2canvas(mapOverlayMeasuresHTML, {
|
|
95
|
-
scale: 1,
|
|
96
|
-
backgroundColor: null
|
|
97
|
-
}).then(e => {
|
|
98
|
-
canvasOverlayHTMLMeasures = e;
|
|
99
|
-
});
|
|
100
|
-
this.addCanvas(doc, canvasOverlayHTMLMeasures, margins); // this adds measure overlays
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Get html code for all layers legend
|
|
106
|
-
* @param map IgoMap
|
|
107
|
-
* @param width The width that the legend need to be
|
|
108
|
-
* @return Html code for the legend
|
|
109
|
-
*/
|
|
110
|
-
getLayersLegendHtml(map, width, resolution) {
|
|
111
|
-
return new Observable((observer) => {
|
|
112
|
-
let html = '';
|
|
113
|
-
const legends = getLayersLegends(map.layers, {
|
|
114
|
-
resolution: map.viewController.getResolution(),
|
|
115
|
-
extent: map.viewController.getExtent(),
|
|
116
|
-
projection: map.viewController.getOlProjection().getCode(),
|
|
117
|
-
scale: map.viewController.getScale(resolution),
|
|
118
|
-
size: map.ol.getSize()
|
|
119
|
-
});
|
|
120
|
-
if (legends.length === 0) {
|
|
121
|
-
observer.next(html);
|
|
122
|
-
observer.complete();
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
// Define important style to be sure that all container is convert
|
|
126
|
-
// to image not just visible part
|
|
127
|
-
html += '<style media="screen" type="text/css">';
|
|
128
|
-
html += '.html2canvas-container { width: ' + width + 'mm !important; height: 2000px !important; }';
|
|
129
|
-
html += 'table.tableLegend {table-layout: auto;}';
|
|
130
|
-
html += 'div.styleLegend {padding-top: 5px; padding-right:5px;padding-left:5px;padding-bottom:5px;}';
|
|
131
|
-
html += '</style>';
|
|
132
|
-
// The font size will also be lowered afterwards (globally along the legend size)
|
|
133
|
-
// this allows having a good relative font size here and to keep ajusting the legend size
|
|
134
|
-
// while keeping good relative font size
|
|
135
|
-
html += '<font size="3" face="Times" >';
|
|
136
|
-
html += '<div class="styleLegend">';
|
|
137
|
-
html += '<table class="tableLegend" >';
|
|
138
|
-
// For each legend, define an html table cell
|
|
139
|
-
const images$ = legends.map((legend) => this.getDataImage(legend.url).pipe(rxMap((dataImage) => {
|
|
140
|
-
let htmlImg = '<tr><td>' + legend.title.toUpperCase() + '</td></tr>';
|
|
141
|
-
htmlImg += '<tr><td><img src="' + dataImage + '"></td></tr>';
|
|
142
|
-
return htmlImg;
|
|
143
|
-
})));
|
|
144
|
-
forkJoin(images$).subscribe((dataImages) => {
|
|
145
|
-
html = dataImages.reduce((acc, current) => (acc += current), html);
|
|
146
|
-
html += '</table>';
|
|
147
|
-
html += '</div>';
|
|
148
|
-
observer.next(html);
|
|
149
|
-
observer.complete();
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
getDataImage(url) {
|
|
154
|
-
const secureIMG = new SecureImagePipe(this.http);
|
|
155
|
-
return secureIMG.transform(url);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Get all the legend in a single image
|
|
159
|
-
* * @param format - Image format. default value to "png"
|
|
160
|
-
* @return The image of the legend
|
|
161
|
-
*/
|
|
162
|
-
getLayersLegendImage(map, format = 'png', doZipFile, resolution) {
|
|
163
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
-
const status$ = new Subject();
|
|
165
|
-
// Get html code for the legend
|
|
166
|
-
const width = 200; // milimeters unit, originally define for document pdf
|
|
167
|
-
let html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
168
|
-
format = format.toLowerCase();
|
|
169
|
-
// If no legend show No LEGEND in an image
|
|
170
|
-
if (html.length === 0) {
|
|
171
|
-
html = '<font size="12" face="Courier New" >';
|
|
172
|
-
html += '<div align="center"><b>NO LEGEND</b></div>';
|
|
173
|
-
}
|
|
174
|
-
// Create div to contain html code for legend
|
|
175
|
-
const div = window.document.createElement('div');
|
|
176
|
-
div.style.position = 'absolute';
|
|
177
|
-
div.style.top = '0';
|
|
178
|
-
// Add html code to convert in the new window
|
|
179
|
-
window.document.body.appendChild(div);
|
|
180
|
-
div.innerHTML = html;
|
|
181
|
-
yield this.timeout(1);
|
|
182
|
-
const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
|
|
183
|
-
console.log(e);
|
|
184
|
-
});
|
|
185
|
-
if (canvas) {
|
|
186
|
-
let status = SubjectStatus.Done;
|
|
187
|
-
try {
|
|
188
|
-
if (!doZipFile) {
|
|
189
|
-
// Save the canvas as file
|
|
190
|
-
this.saveCanvasImageAsFile(canvas, 'legendImage', format);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
// Add the canvas to zip
|
|
194
|
-
this.generateCanvaFileToZip(canvas, 'legendImage' + '.' + format);
|
|
195
|
-
}
|
|
196
|
-
div.parentNode.removeChild(div); // remove temp div (IE)
|
|
197
|
-
}
|
|
198
|
-
catch (err) {
|
|
199
|
-
status = SubjectStatus.Error;
|
|
200
|
-
}
|
|
201
|
-
status$.next(status);
|
|
202
|
-
}
|
|
203
|
-
return status$;
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
getTitleSize(title, pageWidth, pageHeight, doc) {
|
|
207
|
-
const pdfResolution = 96;
|
|
208
|
-
const titleSize = Math.round(2 * (pageHeight + 145) * 0.05) / 2;
|
|
209
|
-
doc.setFont('Times', 'bold');
|
|
210
|
-
const width = doc.getTextWidth(title);
|
|
211
|
-
const titleWidth = doc.getStringUnitWidth(title) * titleSize / doc.internal.scaleFactor;
|
|
212
|
-
const titleTailleMinimale = Math.round(2 * (pageHeight + 150) * 0.037) / 2;
|
|
213
|
-
let titleFontSize = 0;
|
|
214
|
-
let titleMarginLeft;
|
|
215
|
-
if (titleWidth >= (pageWidth)) {
|
|
216
|
-
titleMarginLeft = 0;
|
|
217
|
-
titleFontSize = Math.round(((pageWidth / title.length) * pdfResolution) / 25.4);
|
|
218
|
-
// If the formula to find the font size gives below the defined minimum size
|
|
219
|
-
if (titleFontSize < titleTailleMinimale) {
|
|
220
|
-
titleFontSize = titleTailleMinimale;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
titleMarginLeft = (pageWidth - titleWidth) / 2;
|
|
225
|
-
titleFontSize = titleSize;
|
|
226
|
-
}
|
|
227
|
-
return [titleFontSize, titleMarginLeft];
|
|
228
|
-
}
|
|
229
|
-
getSubTitleSize(subtitle, pageWidth, pageHeight, doc) {
|
|
230
|
-
const subtitleSize = 0.7 * Math.round(2 * (pageHeight + 145) * 0.05) / 2; // 70% of the title's font size
|
|
231
|
-
doc.setFont('Times', 'bold');
|
|
232
|
-
const subtitleWidth = doc.getStringUnitWidth(subtitle) * subtitleSize / doc.internal.scaleFactor;
|
|
233
|
-
let subtitleMarginLeft;
|
|
234
|
-
if (subtitleWidth >= (pageWidth)) {
|
|
235
|
-
subtitleMarginLeft = 0;
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
subtitleMarginLeft = (pageWidth - subtitleWidth) / 2;
|
|
239
|
-
}
|
|
240
|
-
return subtitleMarginLeft;
|
|
241
|
-
}
|
|
242
|
-
addTitle(doc, title, titleFontSize, titleMarginLeft, titleMarginTop) {
|
|
243
|
-
doc.setFont('Times', 'bold');
|
|
244
|
-
doc.setFontSize(titleFontSize);
|
|
245
|
-
doc.text(title, titleMarginLeft, titleMarginTop);
|
|
246
|
-
}
|
|
247
|
-
addSubTitle(doc, subtitle, subtitleFontSize, subtitleMarginLeft, subtitleMarginTop) {
|
|
248
|
-
doc.setFont('Times', 'bold');
|
|
249
|
-
doc.setFontSize(subtitleFontSize);
|
|
250
|
-
doc.text(subtitle, subtitleMarginLeft, subtitleMarginTop);
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Add comment to the document
|
|
254
|
-
* * @param doc - pdf document
|
|
255
|
-
* * @param comment - Comment to add in the document
|
|
256
|
-
* * @param size - Size of the document
|
|
257
|
-
*/
|
|
258
|
-
addComment(doc, comment) {
|
|
259
|
-
const commentSize = 16;
|
|
260
|
-
const commentMarginLeft = 20;
|
|
261
|
-
const marginBottom = 5;
|
|
262
|
-
const heightPixels = doc.internal.pageSize.height - marginBottom;
|
|
263
|
-
doc.setFont('courier');
|
|
264
|
-
doc.setFontSize(commentSize);
|
|
265
|
-
doc.text(comment, commentMarginLeft, heightPixels);
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Add projection and/or scale to the document
|
|
269
|
-
* @param doc - pdf document
|
|
270
|
-
* @param map - Map of the app
|
|
271
|
-
* @param dpi - DPI resolution of the document
|
|
272
|
-
* @param projection - Bool to indicate if projection need to be added
|
|
273
|
-
* @param scale - Bool to indicate if scale need to be added
|
|
274
|
-
*/
|
|
275
|
-
addProjScale(doc, map, dpi, projection, scale) {
|
|
276
|
-
const translate = this.languageService.translate;
|
|
277
|
-
const projScaleSize = 16;
|
|
278
|
-
const projScaleMarginLeft = 20;
|
|
279
|
-
const marginBottom = 15;
|
|
280
|
-
const heightPixels = doc.internal.pageSize.height - marginBottom;
|
|
281
|
-
let textProjScale = '';
|
|
282
|
-
if (projection === true) {
|
|
283
|
-
const projText = translate.instant('igo.geo.printForm.projection');
|
|
284
|
-
textProjScale += projText + ': ' + map.projection;
|
|
285
|
-
}
|
|
286
|
-
if (scale === true) {
|
|
287
|
-
if (projection === true) {
|
|
288
|
-
textProjScale += ' ';
|
|
289
|
-
}
|
|
290
|
-
const scaleText = translate.instant('igo.geo.printForm.scale');
|
|
291
|
-
const mapScale = map.viewController.getScale(dpi);
|
|
292
|
-
textProjScale += scaleText + ': ~ 1 / ' + formatScale(mapScale);
|
|
293
|
-
}
|
|
294
|
-
doc.setFont('courier');
|
|
295
|
-
doc.setFontSize(projScaleSize);
|
|
296
|
-
doc.text(textProjScale, projScaleMarginLeft, heightPixels);
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Add the legend to the document
|
|
300
|
-
* @param doc - Pdf document where legend will be added
|
|
301
|
-
* @param map - Map of the app
|
|
302
|
-
* @param margins - Page margins
|
|
303
|
-
*/
|
|
304
|
-
addLegend(doc, map, margins, resolution) {
|
|
305
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
306
|
-
// Get html code for the legend
|
|
307
|
-
const width = doc.internal.pageSize.width;
|
|
308
|
-
const html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
309
|
-
// If no legend, save the map directly
|
|
310
|
-
if (html === '') {
|
|
311
|
-
yield this.saveDoc(doc);
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
// Create div to contain html code for legend
|
|
315
|
-
const div = window.document.createElement('div');
|
|
316
|
-
div.style.position = 'absolute';
|
|
317
|
-
div.style.top = '0';
|
|
318
|
-
// Add html code to convert in the new window
|
|
319
|
-
window.document.body.appendChild(div);
|
|
320
|
-
div.innerHTML = html;
|
|
321
|
-
yield this.timeout(1);
|
|
322
|
-
const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
|
|
323
|
-
console.log(e);
|
|
324
|
-
});
|
|
325
|
-
if (canvas) {
|
|
326
|
-
const pourcentageReduction = 0.85;
|
|
327
|
-
const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution, pourcentageReduction
|
|
328
|
-
* (25.4 * canvas.height) / resolution];
|
|
329
|
-
let imgData;
|
|
330
|
-
doc.addPage();
|
|
331
|
-
imgData = canvas.toDataURL('image/png');
|
|
332
|
-
doc.addImage(imgData, 'PNG', 10, 10, imageSize[0], imageSize[1]);
|
|
333
|
-
div.parentNode.removeChild(div); // remove temp div (IE style)
|
|
334
|
-
}
|
|
335
|
-
yield this.saveDoc(doc);
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Add the legend to the document
|
|
340
|
-
* @param doc - Pdf document where legend will be added
|
|
341
|
-
* @param map - Map of the app
|
|
342
|
-
* @param margins - Page margins
|
|
343
|
-
*/
|
|
344
|
-
addLegendSamePage(doc, map, margins, resolution, legendPosition) {
|
|
345
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
346
|
-
// Get html code for the legend
|
|
347
|
-
const width = doc.internal.pageSize.width;
|
|
348
|
-
const html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
349
|
-
// If no legend, save the map directly
|
|
350
|
-
if (html === '') {
|
|
351
|
-
yield this.saveDoc(doc);
|
|
352
|
-
return true;
|
|
353
|
-
}
|
|
354
|
-
// Create div to contain html code for legend
|
|
355
|
-
const div = window.document.createElement('div');
|
|
356
|
-
div.style.position = 'absolute';
|
|
357
|
-
div.style.top = '0';
|
|
358
|
-
// Add html code to convert in the new window
|
|
359
|
-
window.document.body.appendChild(div);
|
|
360
|
-
div.innerHTML = html;
|
|
361
|
-
yield this.timeout(1);
|
|
362
|
-
const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
|
|
363
|
-
console.log(e);
|
|
364
|
-
});
|
|
365
|
-
let marginsLegend;
|
|
366
|
-
if (canvas) {
|
|
367
|
-
const pourcentageReduction = 0.85;
|
|
368
|
-
const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution,
|
|
369
|
-
pourcentageReduction * (25.4 * canvas.height) / resolution];
|
|
370
|
-
// Move the legend to the correct position on the page
|
|
371
|
-
if (legendPosition === 'bottomright') {
|
|
372
|
-
marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1], margins[1],
|
|
373
|
-
margins[2], doc.internal.pageSize.width - margins[1] - imageSize[0]];
|
|
374
|
-
}
|
|
375
|
-
else if (legendPosition === 'topright') {
|
|
376
|
-
marginsLegend = [margins[0], margins[1], doc.internal.pageSize.height - margins[0] - imageSize[1],
|
|
377
|
-
doc.internal.pageSize.width - margins[1] - imageSize[0]];
|
|
378
|
-
}
|
|
379
|
-
else if (legendPosition === 'bottomleft') {
|
|
380
|
-
// When the legend is in the bottom left, raise the legend slightly upward so that attributions are visible
|
|
381
|
-
marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1] - 15,
|
|
382
|
-
doc.internal.pageSize.width - margins[3] - imageSize[0], margins[2] + 15, margins[3]];
|
|
383
|
-
}
|
|
384
|
-
else if (legendPosition === 'topleft') {
|
|
385
|
-
marginsLegend = [margins[0], doc.internal.pageSize.width - margins[3] - imageSize[0],
|
|
386
|
-
doc.internal.pageSize.height - margins[0] - imageSize[1], margins[3]];
|
|
387
|
-
}
|
|
388
|
-
this.addCanvas(doc, canvas, marginsLegend); // this adds the legend
|
|
389
|
-
div.parentNode.removeChild(div); // remove temp div (IE style)
|
|
390
|
-
yield this.saveDoc(doc);
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Add scale and attributions on the map on the document
|
|
396
|
-
* @param doc - Pdf document where legend will be added
|
|
397
|
-
* @param map - Map of the app
|
|
398
|
-
* @param margins - Page margins
|
|
399
|
-
*/
|
|
400
|
-
addScale(doc, map, margins) {
|
|
401
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
402
|
-
const mapSize = map.ol.getSize();
|
|
403
|
-
const extent = map.ol.getView().calculateExtent(mapSize);
|
|
404
|
-
// Get the scale and attribution
|
|
405
|
-
// we use cloneNode to modify the nodes to print without modifying it on the page, using deep:true to get children
|
|
406
|
-
let canvasOverlayHTML;
|
|
407
|
-
const mapOverlayHTML = map.ol.getOverlayContainerStopEvent();
|
|
408
|
-
// Remove the UI buttons from the nodes
|
|
409
|
-
const OverlayHTMLButtons = mapOverlayHTML.getElementsByTagName('button');
|
|
410
|
-
const OverlayHTMLButtonsarr = Array.from(OverlayHTMLButtons);
|
|
411
|
-
for (const OverlayHTMLButton of OverlayHTMLButtonsarr) {
|
|
412
|
-
OverlayHTMLButton.setAttribute('data-html2canvas-ignore', 'true');
|
|
413
|
-
}
|
|
414
|
-
// Change the styles of hyperlink in the printed version
|
|
415
|
-
// Transform the Overlay into a canvas
|
|
416
|
-
// scale is necessary to make it in google chrome
|
|
417
|
-
// background as null because otherwise it is white and cover the map
|
|
418
|
-
// allowtaint is to allow rendering images in the attributions
|
|
419
|
-
// useCORS: true pour permettre de renderer les images (ne marche pas en local)
|
|
420
|
-
const canvas = yield html2canvas(mapOverlayHTML, {
|
|
421
|
-
scale: 1,
|
|
422
|
-
backgroundColor: null,
|
|
423
|
-
allowTaint: true,
|
|
424
|
-
useCORS: true,
|
|
425
|
-
}).then(e => {
|
|
426
|
-
canvasOverlayHTML = e;
|
|
427
|
-
});
|
|
428
|
-
this.addCanvas(doc, canvasOverlayHTML, margins); // this adds scales and attributions
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
defineNbFileToProcess(nbFileToProcess) {
|
|
432
|
-
this.nbFileToProcess = nbFileToProcess;
|
|
433
|
-
}
|
|
434
|
-
timeout(ms) {
|
|
435
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
436
|
-
}
|
|
437
|
-
addCanvas(doc, canvas, margins) {
|
|
438
|
-
let image;
|
|
439
|
-
if (canvas) {
|
|
440
|
-
image = canvas.toDataURL('image/png');
|
|
441
|
-
}
|
|
442
|
-
if (image !== undefined) {
|
|
443
|
-
const imageSize = this.getImageSizeToFitPdf(doc, canvas, margins);
|
|
444
|
-
doc.addImage(image, 'PNG', margins[3], margins[0], imageSize[0], imageSize[1]);
|
|
445
|
-
doc.rect(margins[3], margins[0], imageSize[0], imageSize[1]);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
// TODO fix printing with image resolution
|
|
449
|
-
addMap(doc, map, resolution, size, margins) {
|
|
450
|
-
const status$ = new Subject();
|
|
451
|
-
const mapSize = map.ol.getSize();
|
|
452
|
-
const extent = map.ol.getView().calculateExtent(mapSize);
|
|
453
|
-
const widthPixels = Math.round((size[0] * resolution) / 25.4);
|
|
454
|
-
const heightPixels = Math.round((size[1] * resolution) / 25.4);
|
|
455
|
-
let timeout;
|
|
456
|
-
map.ol.once('rendercomplete', (event) => {
|
|
457
|
-
const canvases = event.target.getViewport().getElementsByTagName('canvas');
|
|
458
|
-
const mapStatus$$ = map.status$.subscribe((mapStatus) => {
|
|
459
|
-
clearTimeout(timeout);
|
|
460
|
-
if (mapStatus !== SubjectStatus.Done) {
|
|
461
|
-
return;
|
|
462
|
-
}
|
|
463
|
-
mapStatus$$.unsubscribe();
|
|
464
|
-
let status = SubjectStatus.Done;
|
|
465
|
-
try {
|
|
466
|
-
for (const canvas of canvases) {
|
|
467
|
-
if (canvas.width !== 0) {
|
|
468
|
-
this.addCanvas(doc, canvas, margins);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
catch (err) {
|
|
473
|
-
status = SubjectStatus.Error;
|
|
474
|
-
this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
|
|
475
|
-
}
|
|
476
|
-
this.renderMap(map, mapSize, extent);
|
|
477
|
-
status$.next(status);
|
|
478
|
-
});
|
|
479
|
-
// If no loading as started after 200ms, then probably no loading
|
|
480
|
-
// is required.
|
|
481
|
-
timeout = window.setTimeout(() => {
|
|
482
|
-
mapStatus$$.unsubscribe();
|
|
483
|
-
let status = SubjectStatus.Done;
|
|
484
|
-
try {
|
|
485
|
-
for (const canvas of canvases) {
|
|
486
|
-
if (canvas.width !== 0) {
|
|
487
|
-
this.addCanvas(doc, canvas, margins);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
catch (err) {
|
|
492
|
-
status = SubjectStatus.Error;
|
|
493
|
-
this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
|
|
494
|
-
}
|
|
495
|
-
this.renderMap(map, mapSize, extent);
|
|
496
|
-
status$.next(status);
|
|
497
|
-
}, 200);
|
|
498
|
-
});
|
|
499
|
-
this.renderMap(map, [widthPixels, heightPixels], extent);
|
|
500
|
-
return status$;
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* Download an image of the map with addition of informations
|
|
504
|
-
* @param map - Map of the app
|
|
505
|
-
* @param format - Image format. default value to "png"
|
|
506
|
-
* @param projection - Indicate if projection need to be add. Default to false
|
|
507
|
-
* @param scale - Indicate if scale need to be add. Default to false
|
|
508
|
-
* @param legend - Indicate if the legend of layers need to be download. Default to false
|
|
509
|
-
* @param title - Title to add for the map - Default to blank
|
|
510
|
-
* @param subtitle - Subtitle to add for the map - Default to blank
|
|
511
|
-
* @param comment - Comment to add for the map - Default to blank
|
|
512
|
-
* @param doZipFile - Indicate if we do a zip with the file
|
|
513
|
-
* @return Image file of the map with extension format given as parameter
|
|
514
|
-
*/
|
|
515
|
-
downloadMapImage(map, resolution, format = 'png', projection = false, scale = false, legend = false, title = '', subtitle = '', comment = '', doZipFile = true) {
|
|
516
|
-
const status$ = new Subject();
|
|
517
|
-
// const resolution = map.ol.getView().getResolution();
|
|
518
|
-
this.activityId = this.activityService.register();
|
|
519
|
-
const translate = this.languageService.translate;
|
|
520
|
-
map.ol.once('rendercomplete', (event) => {
|
|
521
|
-
format = format.toLowerCase();
|
|
522
|
-
const oldCanvas = event.target
|
|
523
|
-
.getViewport()
|
|
524
|
-
.getElementsByTagName('canvas')[0];
|
|
525
|
-
const newCanvas = document.createElement('canvas');
|
|
526
|
-
const newContext = newCanvas.getContext('2d');
|
|
527
|
-
// Postion in height to set the canvas in new canvas
|
|
528
|
-
let positionHCanvas = 0;
|
|
529
|
-
// Position in width to set the Proj/Scale in new canvas
|
|
530
|
-
let positionWProjScale = 10;
|
|
531
|
-
// Get height/width of map canvas
|
|
532
|
-
const width = oldCanvas.width;
|
|
533
|
-
let height = oldCanvas.height;
|
|
534
|
-
// Set Font to calculate comment width
|
|
535
|
-
newContext.font = '20px Calibri';
|
|
536
|
-
const commentWidth = newContext.measureText(comment).width;
|
|
537
|
-
// Add height for title if defined
|
|
538
|
-
height = title !== '' ? height + 30 : height;
|
|
539
|
-
// Add height for title if defined
|
|
540
|
-
height = subtitle !== '' ? height + 30 : height;
|
|
541
|
-
// Add height for projection or scale (same line) if defined
|
|
542
|
-
height = projection !== false || scale !== false ? height + 30 : height;
|
|
543
|
-
const positionHProjScale = height - 10;
|
|
544
|
-
// Define number of line depending of the comment length
|
|
545
|
-
const commentNbLine = Math.ceil(commentWidth / width);
|
|
546
|
-
// Add height for multiline comment if defined
|
|
547
|
-
height = comment !== '' ? height + commentNbLine * 30 : height;
|
|
548
|
-
let positionHComment = height - commentNbLine * 20 + 5;
|
|
549
|
-
// Set the new canvas with the new calculated size
|
|
550
|
-
newCanvas.width = width;
|
|
551
|
-
newCanvas.height = height;
|
|
552
|
-
// Patch Jpeg default black background to white
|
|
553
|
-
if (format === 'jpeg') {
|
|
554
|
-
newContext.fillStyle = '#ffffff';
|
|
555
|
-
newContext.fillRect(0, 0, width, height);
|
|
556
|
-
newContext.fillStyle = '#000000';
|
|
557
|
-
}
|
|
558
|
-
// If a title need to be added to canvas
|
|
559
|
-
if (title !== '') {
|
|
560
|
-
// Set font for title
|
|
561
|
-
// Adjust according to title length
|
|
562
|
-
newContext.font = '26px Calibri';
|
|
563
|
-
positionHCanvas = 30;
|
|
564
|
-
newContext.textAlign = 'center';
|
|
565
|
-
newContext.fillText(title, width / 2, 20, width * 0.9);
|
|
566
|
-
}
|
|
567
|
-
if (subtitle !== '') {
|
|
568
|
-
// Set font for subtitle
|
|
569
|
-
// Adjust according to title length
|
|
570
|
-
newContext.font = '26px Calibri';
|
|
571
|
-
positionHCanvas = 60;
|
|
572
|
-
newContext.textAlign = 'center';
|
|
573
|
-
newContext.fillText(subtitle, width / 2, 50, width * 0.9);
|
|
574
|
-
}
|
|
575
|
-
// Set font for next section
|
|
576
|
-
newContext.font = '20px Calibri';
|
|
577
|
-
// If projection need to be added to canvas
|
|
578
|
-
if (projection !== false) {
|
|
579
|
-
const projText = translate.instant('igo.geo.printForm.projection');
|
|
580
|
-
newContext.textAlign = 'start';
|
|
581
|
-
newContext.fillText(projText + ': ' + map.projection, positionWProjScale, positionHProjScale);
|
|
582
|
-
positionWProjScale += 200; // Width position change for scale position
|
|
583
|
-
}
|
|
584
|
-
// If scale need to be added to canvas
|
|
585
|
-
if (scale !== false) {
|
|
586
|
-
const scaleText = translate.instant('igo.geo.printForm.scale');
|
|
587
|
-
const mapScale = map.viewController.getScale(resolution);
|
|
588
|
-
newContext.textAlign = 'start';
|
|
589
|
-
newContext.fillText(scaleText + ': ~ 1 / ' + formatScale(mapScale), positionWProjScale, positionHProjScale);
|
|
590
|
-
}
|
|
591
|
-
// If a comment need to be added to canvas
|
|
592
|
-
if (comment !== '') {
|
|
593
|
-
newContext.textAlign = 'center';
|
|
594
|
-
// If only one line, no need to multiline the comment
|
|
595
|
-
if (commentNbLine === 1) {
|
|
596
|
-
newContext.fillText(comment, width / 2, positionHComment);
|
|
597
|
-
}
|
|
598
|
-
else {
|
|
599
|
-
// Separate the setenses to be approx. the same length
|
|
600
|
-
const nbCommentChar = comment.length;
|
|
601
|
-
const CommentLengthToCut = Math.floor(nbCommentChar / commentNbLine);
|
|
602
|
-
let commentCurrentLine = '';
|
|
603
|
-
let positionFirstCutChar = 0;
|
|
604
|
-
let positionLastBlank;
|
|
605
|
-
// Loop for the number of line calculated
|
|
606
|
-
for (let i = 0; i < commentNbLine; i++) {
|
|
607
|
-
// For all line except last
|
|
608
|
-
if (commentNbLine - 1 > i) {
|
|
609
|
-
// Get comment current line to find the right place tu cut comment
|
|
610
|
-
commentCurrentLine = comment.substr(positionFirstCutChar, CommentLengthToCut);
|
|
611
|
-
// Cut the setence at blank
|
|
612
|
-
positionLastBlank = commentCurrentLine.lastIndexOf(' ');
|
|
613
|
-
newContext.fillText(commentCurrentLine.substr(0, positionLastBlank), width / 2, positionHComment);
|
|
614
|
-
positionFirstCutChar += positionLastBlank;
|
|
615
|
-
// Go to next line for insertion
|
|
616
|
-
positionHComment += 20;
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
// Don't cut last part
|
|
620
|
-
newContext.fillText(comment.substr(positionFirstCutChar), width / 2, positionHComment);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
// Add map to new canvas
|
|
626
|
-
newContext.drawImage(oldCanvas, 0, positionHCanvas);
|
|
627
|
-
let status = SubjectStatus.Done;
|
|
628
|
-
try {
|
|
629
|
-
// Save the canvas as file
|
|
630
|
-
if (!doZipFile) {
|
|
631
|
-
this.saveCanvasImageAsFile(newCanvas, 'map', format);
|
|
632
|
-
}
|
|
633
|
-
else if (format.toLowerCase() === 'tiff') {
|
|
634
|
-
// Add the canvas to zip
|
|
635
|
-
this.generateCanvaFileToZip(newCanvas, 'map' + map.projection.replace(':', '_') + '.' + format);
|
|
636
|
-
}
|
|
637
|
-
else {
|
|
638
|
-
// Add the canvas to zip
|
|
639
|
-
this.generateCanvaFileToZip(newCanvas, 'map' + '.' + format);
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
catch (err) {
|
|
643
|
-
status = SubjectStatus.Error;
|
|
644
|
-
}
|
|
645
|
-
status$.next(status);
|
|
646
|
-
if (format.toLowerCase() === 'tiff') {
|
|
647
|
-
const tiwContent = this.getWorldFileInformation(map);
|
|
648
|
-
const blob = new Blob([tiwContent], {
|
|
649
|
-
type: 'text/plain;charset=utf-8'
|
|
650
|
-
});
|
|
651
|
-
if (!doZipFile) {
|
|
652
|
-
// saveAs automaticly replace ':' for '_'
|
|
653
|
-
saveAs(blob, 'map' + map.projection + '.tfw');
|
|
654
|
-
this.saveFileProcessing();
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
// Add the canvas to zip
|
|
658
|
-
this.addFileToZip('map' + map.projection.replace(':', '_') + '.tfw', blob);
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
});
|
|
662
|
-
map.ol.renderSync();
|
|
663
|
-
return status$;
|
|
664
|
-
}
|
|
665
|
-
renderMap(map, size, extent) {
|
|
666
|
-
map.ol.updateSize();
|
|
667
|
-
map.ol.renderSync();
|
|
668
|
-
}
|
|
669
|
-
/**
|
|
670
|
-
* Save document
|
|
671
|
-
* @param doc - Document to save
|
|
672
|
-
*/
|
|
673
|
-
saveDoc(doc) {
|
|
674
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
675
|
-
yield doc.save('map.pdf', { returnPromise: true });
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
/**
|
|
679
|
-
* Calculate the best Image size to fit in pdf
|
|
680
|
-
* @param doc - Pdf Document
|
|
681
|
-
* @param canvas - Canvas of image
|
|
682
|
-
* @param margins - Page margins
|
|
683
|
-
*/
|
|
684
|
-
getImageSizeToFitPdf(doc, canvas, margins) {
|
|
685
|
-
// Define variable to calculate best size to fit in one page
|
|
686
|
-
const pageHeight = doc.internal.pageSize.getHeight() - (margins[0] + margins[2]);
|
|
687
|
-
const pageWidth = doc.internal.pageSize.getWidth() - (margins[1] + margins[3]);
|
|
688
|
-
const canHeight = canvas.height;
|
|
689
|
-
const canWidth = canvas.width;
|
|
690
|
-
const heightRatio = canHeight / pageHeight;
|
|
691
|
-
const widthRatio = canWidth / pageWidth;
|
|
692
|
-
const maxRatio = heightRatio > widthRatio ? heightRatio : widthRatio;
|
|
693
|
-
const imgHeigh = maxRatio > 1 ? canHeight / maxRatio : canHeight;
|
|
694
|
-
const imgWidth = maxRatio > 1 ? canWidth / maxRatio : canWidth;
|
|
695
|
-
return [imgWidth, imgHeigh];
|
|
696
|
-
}
|
|
697
|
-
/**
|
|
698
|
-
* Get a world file information for tiff
|
|
699
|
-
* @param map - Map of the app
|
|
700
|
-
*/
|
|
701
|
-
getWorldFileInformation(map) {
|
|
702
|
-
const currentResolution = map.viewController.getResolution();
|
|
703
|
-
const currentExtent = map.viewController.getExtent(); // Return [minx, miny, maxx, maxy]
|
|
704
|
-
return [
|
|
705
|
-
currentResolution,
|
|
706
|
-
0,
|
|
707
|
-
0,
|
|
708
|
-
-currentResolution,
|
|
709
|
-
currentExtent[0] + currentResolution / 0.5,
|
|
710
|
-
currentExtent[3] - currentResolution / 0.5
|
|
711
|
-
].join('\n');
|
|
712
|
-
}
|
|
713
|
-
/**
|
|
714
|
-
* Save canvas image as file
|
|
715
|
-
* @param canvas - Canvas to save
|
|
716
|
-
* @param name - Name of the file
|
|
717
|
-
* @param format - file format
|
|
718
|
-
*/
|
|
719
|
-
saveCanvasImageAsFile(canvas, name, format) {
|
|
720
|
-
const blobFormat = 'image/' + format;
|
|
721
|
-
const that = this;
|
|
722
|
-
try {
|
|
723
|
-
canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
|
|
724
|
-
// If navigator is Internet Explorer
|
|
725
|
-
if (navigator.msSaveBlob) {
|
|
726
|
-
navigator.msSaveBlob(canvas.msToBlob(), name + '.' + format);
|
|
727
|
-
this.saveFileProcessing();
|
|
728
|
-
}
|
|
729
|
-
else {
|
|
730
|
-
canvas.toBlob((blob) => {
|
|
731
|
-
// download image
|
|
732
|
-
saveAs(blob, name + '.' + format);
|
|
733
|
-
that.saveFileProcessing();
|
|
734
|
-
}, blobFormat);
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
catch (err) {
|
|
738
|
-
this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
/**
|
|
742
|
-
* Add file to a zip
|
|
743
|
-
* @param canvas - File to add to the zip
|
|
744
|
-
* @param name -Name of the fileoverview
|
|
745
|
-
*/
|
|
746
|
-
generateCanvaFileToZip(canvas, name) {
|
|
747
|
-
const blobFormat = 'image/' + 'jpeg';
|
|
748
|
-
const that = this;
|
|
749
|
-
if (!this.hasOwnProperty('zipFile') ||
|
|
750
|
-
typeof this.zipFile === 'undefined') {
|
|
751
|
-
this.zipFile = new JSZip();
|
|
752
|
-
}
|
|
753
|
-
try {
|
|
754
|
-
canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
|
|
755
|
-
if (navigator.msSaveBlob) {
|
|
756
|
-
this.addFileToZip(name, canvas.msToBlob());
|
|
757
|
-
}
|
|
758
|
-
else {
|
|
759
|
-
canvas.toBlob((blob) => {
|
|
760
|
-
that.addFileToZip(name, blob);
|
|
761
|
-
}, blobFormat);
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
catch (err) {
|
|
765
|
-
this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
/**
|
|
769
|
-
* Add file to zip, if all file are zipped, download
|
|
770
|
-
* @param name - Name of the files
|
|
771
|
-
* @param blob - Contain of file
|
|
772
|
-
*/
|
|
773
|
-
addFileToZip(name, blob) {
|
|
774
|
-
// add file to zip
|
|
775
|
-
this.zipFile.file(name, blob);
|
|
776
|
-
this.nbFileToProcess--;
|
|
777
|
-
// If all files are proccessed
|
|
778
|
-
if (this.nbFileToProcess === 0) {
|
|
779
|
-
// Download zip file
|
|
780
|
-
this.getZipFile();
|
|
781
|
-
// Stop loading
|
|
782
|
-
this.activityService.unregister(this.activityId);
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
saveFileProcessing() {
|
|
786
|
-
this.nbFileToProcess--;
|
|
787
|
-
// If all files are proccessed
|
|
788
|
-
if (this.nbFileToProcess === 0) {
|
|
789
|
-
// Stop loading
|
|
790
|
-
this.activityService.unregister(this.activityId);
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
/**
|
|
794
|
-
* Get the zipped file
|
|
795
|
-
* @return Retun a zip file
|
|
796
|
-
*/
|
|
797
|
-
getZipFile() {
|
|
798
|
-
const that = this;
|
|
799
|
-
this.zipFile.generateAsync({ type: 'blob' }).then((blob) => {
|
|
800
|
-
// 1) generate the zip file
|
|
801
|
-
saveAs(blob, 'map.zip');
|
|
802
|
-
delete that.zipFile;
|
|
803
|
-
});
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
PrintService.ɵfac = function PrintService_Factory(t) { return new (t || PrintService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.MessageService), i0.ɵɵinject(i2.ActivityService), i0.ɵɵinject(i2.LanguageService)); };
|
|
807
|
-
PrintService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PrintService, factory: PrintService.ɵfac, providedIn: 'root' });
|
|
808
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrintService, [{
|
|
809
|
-
type: Injectable,
|
|
810
|
-
args: [{
|
|
811
|
-
providedIn: 'root'
|
|
812
|
-
}]
|
|
813
|
-
}], function () { return [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i2.ActivityService }, { type: i2.LanguageService }]; }, null); })();
|
|
814
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBT2xFLE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQ1UsSUFBZ0IsRUFDaEIsY0FBOEIsRUFDOUIsZUFBZ0MsRUFDaEMsZUFBZ0M7UUFIaEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtJQUN2QyxDQUFDO0lBRUosS0FBSyxDQUFDLEdBQVcsRUFBRSxPQUFxQjtRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlC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LE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2Qiw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUM5QixvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLGVBQWU7WUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2Qiw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUM5QixlQUFlO1lBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVU7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekQsMkJBQTJCO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7d0VBbDlCVSxZQUFZO2tFQUFaLFlBQVksV0FBWixZQUFZLG1CQUZYLE1BQU07dUZBRVAsWUFBWTtjQUh4QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIGFzIHJ4TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCBqc3BkZiBmcm9tICdqc3BkZic7XG5pbXBvcnQgaHRtbDJjYW52YXMgZnJvbSAnaHRtbDJjYW52YXMnO1xuaW1wb3J0ICogYXMgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG5pbXBvcnQgeyBTdWJqZWN0U3RhdHVzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuaW1wb3J0IHsgU2VjdXJlSW1hZ2VQaXBlIH0gZnJvbSAnQGlnbzIvY29tbW9uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlLCBBY3Rpdml0eVNlcnZpY2UsIExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xuXG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCB7IExlZ2VuZE1hcFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9sYXllci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0TGF5ZXJzTGVnZW5kcyB9IGZyb20gJy4uLy4uL2xheWVyL3V0aWxzL291dHB1dExlZ2VuZCc7XG5cbmltcG9ydCB7IFByaW50T3B0aW9ucyB9IGZyb20gJy4vcHJpbnQuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJpbnRTZXJ2aWNlIHtcbiAgemlwRmlsZTogSlNaaXA7XG4gIG5iRmlsZVRvUHJvY2VzczogbnVtYmVyO1xuICBhY3Rpdml0eUlkOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2aXR5U2VydmljZTogQWN0aXZpdHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaW50KG1hcDogSWdvTWFwLCBvcHRpb25zOiBQcmludE9wdGlvbnMpOiBTdWJqZWN0PGFueT4ge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3QgcGFwZXJGb3JtYXQ6IHN0cmluZyA9IG9wdGlvbnMucGFwZXJGb3JtYXQ7XG4gICAgY29uc3QgcmVzb2x1dGlvbiA9ICtvcHRpb25zLnJlc29sdXRpb247IC8vIERlZmF1bHQgaXMgOTZcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgY29uc3QgbGVnZW5kUG9zdGlvbiA9IG9wdGlvbnMubGVnZW5kUG9zaXRpb247XG5cbiAgICB0aGlzLmFjdGl2aXR5SWQgPSB0aGlzLmFjdGl2aXR5U2VydmljZS5yZWdpc3RlcigpO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBqc3BkZih7XG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGZvcm1hdDogcGFwZXJGb3JtYXQudG9Mb3dlckNhc2UoKVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGltZW5zaW9ucyA9IFtcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCxcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHRcbiAgICBdO1xuXG4gICAgY29uc3QgbWFyZ2lucyA9IFsxMCwgMTAsIDEwLCAxMF07XG4gICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zWzBdIC0gbWFyZ2luc1szXSAtIG1hcmdpbnNbMV07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXSAtIG1hcmdpbnNbMF0gLSBtYXJnaW5zWzJdO1xuICAgIGNvbnN0IHNpemUgPSBbd2lkdGgsIGhlaWdodF07XG4gICAgbGV0IHRpdGxlU2l6ZVJlc3VsdHMgPSBbMCwgMF07XG5cbiAgICBpZiAob3B0aW9ucy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aXRsZVNpemVSZXN1bHRzID0gdGhpcy5nZXRUaXRsZVNpemUob3B0aW9ucy50aXRsZSwgd2lkdGgsIGhlaWdodCwgZG9jKTsgLy8gcmV0dXJuIDogc2l6ZShwdCkgYW5kIGxlZnQgbWFyZ2luIChtbSlcbiAgICAgIHRoaXMuYWRkVGl0bGUoZG9jLCBvcHRpb25zLnRpdGxlLCB0aXRsZVNpemVSZXN1bHRzWzBdLCBtYXJnaW5zWzNdICsgdGl0bGVTaXplUmVzdWx0c1sxXSwgdGl0bGVTaXplUmVzdWx0c1swXSAqICgyNS40IC8gNzIpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3VidGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHN1YnRpdGxlU2l6ZVJlc3VsdCA9IDA7XG4gICAgICBjb25zdCB0aXRsZUggPSB0aXRsZVNpemVSZXN1bHRzWzBdO1xuICAgICAgc3VidGl0bGVTaXplUmVzdWx0ID0gdGhpcy5nZXRTdWJUaXRsZVNpemUob3B0aW9ucy5zdWJ0aXRsZSwgd2lkdGgsIGhlaWdodCwgZG9jKTsgLy8gcmV0dXJuIDogc2l6ZShwdCkgYW5kIGxlZnQgbWFyZ2luIChtbSlcbiAgICAgIHRoaXMuYWRkU3ViVGl0bGUoZG9jLCBvcHRpb25zLnN1YnRpdGxlLCB0aXRsZUggKiAwLjcsIG1hcmdpbnNbM10gKyBzdWJ0aXRsZVNpemVSZXN1bHQsIHRpdGxlSCAqIDEuNyAqICgyNS40IC8gNzIpKTtcbiAgICAgIG1hcmdpbnNbMF0gPSBtYXJnaW5zWzBdICsgdGl0bGVTaXplUmVzdWx0c1swXSAqIDAuNyAqICgyNS40IC8gNzIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSB8fCBvcHRpb25zLnNob3dTY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hZGRQcm9qU2NhbGUoXG4gICAgICAgIGRvYyxcbiAgICAgICAgbWFwLFxuICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICBvcHRpb25zLnNob3dQcm9qZWN0aW9uLFxuICAgICAgICBvcHRpb25zLnNob3dTY2FsZVxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jb21tZW50ICE9PSAnJykge1xuICAgICAgdGhpcy5hZGRDb21tZW50KGRvYywgb3B0aW9ucy5jb21tZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZE1hcChkb2MsIG1hcCwgcmVzb2x1dGlvbiwgc2l6ZSwgbWFyZ2lucykuc3Vic2NyaWJlKFxuICAgICAgYXN5bmMgKHN0YXR1czogU3ViamVjdFN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkZFNjYWxlKGRvYywgbWFwLCBtYXJnaW5zKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgbWFyZ2lucyk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gIT09ICdub25lJykge1xuICAgICAgICAgICAgaWYgKFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihvcHRpb25zLmxlZ2VuZFBvc2l0aW9uKSA+IC0xICkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZFNhbWVQYWdlKGRvYywgbWFwLCBtYXJnaW5zLCByZXNvbHV0aW9uLCBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5sZWdlbmRQb3NpdGlvbiA9PT0gJ25ld3BhZ2UnKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kKGRvYywgbWFwLCBtYXJnaW5zLCByZXNvbHV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lIHx8IHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5FcnJvcikge1xuICAgICAgICAgIHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5hY3Rpdml0eUlkKTtcbiAgICAgICAgICBzdGF0dXMkLm5leHQoU3ViamVjdFN0YXR1cy5Eb25lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbWVhc3VyZSBvdmVybGF5IG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50IHdoZW4gdGhlIG1lYXN1cmUgbGF5ZXIgaXMgcHJlc2VudFxuICAgKiBAcGFyYW0gIGRvYyAtIFBkZiBkb2N1bWVudCB3aGVyZSBtZWFzdXJlIHRvb2x0aXAgd2lsbCBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXG4gICAqIEBwYXJhbSAgbWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZWFzdXJlTGF5ZXIoXG4gICAgZG9jOiBqc3BkZixcbiAgICBtYXA6IElnb01hcCxcbiAgICBtYXJnaW5zOiBBcnJheTxudW1iZXI+XG4gICkge1xuICAgIGlmIChtYXAubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudmlzaWJsZSAmJiBsYXllci5pZC5zdGFydHNXaXRoKCdpZ28tbWVhc3VyZXMtJykpKSB7XG4gICAgICBsZXQgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcztcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgICAgYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheU1lYXN1cmVzSFRNTCwge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXG4gICAgICB9KS50aGVuKGUgPT4ge1xuICAgICAgICBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzID0gZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzLCBtYXJnaW5zKTsgLy8gdGhpcyBhZGRzIG1lYXN1cmUgb3ZlcmxheXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh0bWwgY29kZSBmb3IgYWxsIGxheWVycyBsZWdlbmRcbiAgICogQHBhcmFtICBtYXAgSWdvTWFwXG4gICAqIEBwYXJhbSAgd2lkdGggVGhlIHdpZHRoIHRoYXQgdGhlIGxlZ2VuZCBuZWVkIHRvIGJlXG4gICAqIEByZXR1cm4gSHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAqL1xuICBnZXRMYXllcnNMZWdlbmRIdG1sKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGNvbnN0IGxlZ2VuZHMgPSBnZXRMYXllcnNMZWdlbmRzKFxuICAgICAgICBtYXAubGF5ZXJzLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x1dGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKSxcbiAgICAgICAgICBleHRlbnQ6IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKSxcbiAgICAgICAgICBwcm9qZWN0aW9uOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpLFxuICAgICAgICAgIHNjYWxlOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbiksXG4gICAgICAgICAgc2l6ZTogbWFwLm9sLmdldFNpemUoKVxuICAgICAgICB9IGFzIExlZ2VuZE1hcFZpZXdPcHRpb25zXG4gICAgICApO1xuICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpbXBvcnRhbnQgc3R5bGUgdG8gYmUgc3VyZSB0aGF0IGFsbCBjb250YWluZXIgaXMgY29udmVydFxuICAgICAgLy8gdG8gaW1hZ2Ugbm90IGp1c3QgdmlzaWJsZSBwYXJ0XG4gICAgICBodG1sICs9ICc8c3R5bGUgbWVkaWE9XCJzY3JlZW5cIiB0eXBlPVwidGV4dC9jc3NcIj4nO1xuICAgICAgaHRtbCArPSAnLmh0bWwyY2FudmFzLWNvbnRhaW5lciB7IHdpZHRoOiAnICsgd2lkdGggKyAnbW0gIWltcG9ydGFudDsgaGVpZ2h0OiAyMDAwcHggIWltcG9ydGFudDsgfSc7XG4gICAgICBodG1sICs9ICd0YWJsZS50YWJsZUxlZ2VuZCB7dGFibGUtbGF5b3V0OiBhdXRvO30nO1xuICAgICAgaHRtbCArPSAnZGl2LnN0eWxlTGVnZW5kIHtwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O3BhZGRpbmctYm90dG9tOjVweDt9JztcbiAgICAgIGh0bWwgKz0gJzwvc3R5bGU+JztcbiAgICAgIC8vIFRoZSBmb250IHNpemUgd2lsbCBhbHNvIGJlIGxvd2VyZWQgYWZ0ZXJ3YXJkcyAoZ2xvYmFsbHkgYWxvbmcgdGhlIGxlZ2VuZCBzaXplKVxuICAgICAgLy8gdGhpcyBhbGxvd3MgaGF2aW5nIGEgZ29vZCByZWxhdGl2ZSBmb250IHNpemUgaGVyZSBhbmQgdG8ga2VlcCBhanVzdGluZyB0aGUgbGVnZW5kIHNpemVcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgZ29vZCByZWxhdGl2ZSBmb250IHNpemVcbiAgICAgIGh0bWwgKz0gJzxmb250IHNpemU9XCIzXCIgZmFjZT1cIlRpbWVzXCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic3R5bGVMZWdlbmRcIj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPVwidGFibGVMZWdlbmRcIiA+JztcblxuICAgICAgLy8gRm9yIGVhY2ggbGVnZW5kLCBkZWZpbmUgYW4gaHRtbCB0YWJsZSBjZWxsXG4gICAgICBjb25zdCBpbWFnZXMkID0gbGVnZW5kcy5tYXAoKGxlZ2VuZCkgPT5cbiAgICAgICAgdGhpcy5nZXREYXRhSW1hZ2UobGVnZW5kLnVybCkucGlwZShcbiAgICAgICAgICByeE1hcCgoZGF0YUltYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgaHRtbEltZyA9ICc8dHI+PHRkPicgKyBsZWdlbmQudGl0bGUudG9VcHBlckNhc2UoKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgICAgIGh0bWxJbWcgKz0gJzx0cj48dGQ+PGltZyBzcmM9XCInICsgZGF0YUltYWdlICsgJ1wiPjwvdGQ+PC90cj4nO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxJbWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZvcmtKb2luKGltYWdlcyQpLnN1YnNjcmliZSgoZGF0YUltYWdlcykgPT4ge1xuICAgICAgICBodG1sID0gZGF0YUltYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4gKGFjYyArPSBjdXJyZW50KSwgaHRtbCk7XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChodG1sKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0YUltYWdlKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBzZWN1cmVJTUcgPSBuZXcgU2VjdXJlSW1hZ2VQaXBlKHRoaXMuaHR0cCk7XG4gICAgcmV0dXJuIHNlY3VyZUlNRy50cmFuc2Zvcm0odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBsZWdlbmQgaW4gYSBzaW5nbGUgaW1hZ2VcbiAgICogKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBsZWdlbmRcbiAgICovXG4gIGFzeW5jIGdldExheWVyc0xlZ2VuZEltYWdlKFxuICAgIG1hcCxcbiAgICBmb3JtYXQ6IHN0cmluZyA9ICdwbmcnLFxuICAgIGRvWmlwRmlsZTogYm9vbGVhbixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gMjAwOyAvLyBtaWxpbWV0ZXJzIHVuaXQsIG9yaWdpbmFsbHkgZGVmaW5lIGZvciBkb2N1bWVudCBwZGZcbiAgICBsZXQgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgZm9ybWF0ID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBJZiBubyBsZWdlbmQgc2hvdyBObyBMRUdFTkQgaW4gYW4gaW1hZ2VcbiAgICBpZiAoaHRtbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGh0bWwgPSAnPGZvbnQgc2l6ZT1cIjEyXCIgZmFjZT1cIkNvdXJpZXIgTmV3XCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGFsaWduPVwiY2VudGVyXCI+PGI+Tk8gTEVHRU5EPC9iPjwvZGl2Pic7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG5cbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgYXdhaXQgdGhpcy50aW1lb3V0KDEpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9KTtcblxuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGxldCBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkRvbmU7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xuICAgICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCAnbGVnZW5kSW1hZ2UnLCBmb3JtYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsICdsZWdlbmRJbWFnZScgKyAnLicgKyBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7IC8vIHJlbW92ZSB0ZW1wIGRpdiAoSUUpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgIH1cbiAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgZ2V0VGl0bGVTaXplKHRpdGxlOiBzdHJpbmcsIHBhZ2VXaWR0aDogbnVtYmVyLCBwYWdlSGVpZ2h0OiBudW1iZXIsIGRvYzoganNwZGYpIHtcbiAgICBjb25zdCBwZGZSZXNvbHV0aW9uID0gOTY7XG4gICAgY29uc3QgdGl0bGVTaXplID0gTWF0aC5yb3VuZCgyICogKHBhZ2VIZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyO1xuICAgIGRvYy5zZXRGb250KCdUaW1lcycsICdib2xkJyk7XG4gICAgY29uc3Qgd2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRpdGxlKTtcblxuICAgIGNvbnN0IHRpdGxlV2lkdGggPSBkb2MuZ2V0U3RyaW5nVW5pdFdpZHRoKHRpdGxlKSAqIHRpdGxlU2l6ZSAvIGRvYy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICBjb25zdCB0aXRsZVRhaWxsZU1pbmltYWxlID0gTWF0aC5yb3VuZCggMiAqIChwYWdlSGVpZ2h0ICsgMTUwICkgKiAwLjAzNykgLyAyO1xuICAgIGxldCB0aXRsZUZvbnRTaXplID0gMDtcblxuICAgIGxldCB0aXRsZU1hcmdpbkxlZnQ7XG4gICAgaWYgKHRpdGxlV2lkdGggPj0gKHBhZ2VXaWR0aCkpIHtcbiAgICAgIHRpdGxlTWFyZ2luTGVmdCA9IDA7XG4gICAgICB0aXRsZUZvbnRTaXplID0gTWF0aC5yb3VuZCgoKHBhZ2VXaWR0aCAvIHRpdGxlLmxlbmd0aCkgKiBwZGZSZXNvbHV0aW9uKSAvIDI1LjQpO1xuICAgICAgLy8gSWYgdGhlIGZvcm11bGEgdG8gZmluZCB0aGUgZm9udCBzaXplIGdpdmVzIGJlbG93IHRoZSBkZWZpbmVkIG1pbmltdW0gc2l6ZVxuICAgICAgaWYgKHRpdGxlRm9udFNpemUgPCB0aXRsZVRhaWxsZU1pbmltYWxlKSB7XG4gICAgICAgIHRpdGxlRm9udFNpemUgPSB0aXRsZVRhaWxsZU1pbmltYWxlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZU1hcmdpbkxlZnQgPSAocGFnZVdpZHRoIC0gdGl0bGVXaWR0aCkgLyAyIDtcbiAgICAgIHRpdGxlRm9udFNpemUgPSB0aXRsZVNpemU7XG4gICAgfVxuICAgIHJldHVybiBbdGl0bGVGb250U2l6ZSwgdGl0bGVNYXJnaW5MZWZ0XTtcbiAgfVxuXG4gIGdldFN1YlRpdGxlU2l6ZShzdWJ0aXRsZTogc3RyaW5nLCBwYWdlV2lkdGg6IG51bWJlciwgcGFnZUhlaWdodDogbnVtYmVyLCBkb2M6IGpzcGRmKSB7XG4gICAgY29uc3Qgc3VidGl0bGVTaXplID0gMC43ICogTWF0aC5yb3VuZCgyICogKHBhZ2VIZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyOyAvLyA3MCUgb2YgdGhlIHRpdGxlJ3MgZm9udCBzaXplXG5cbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuXG4gICAgY29uc3Qgc3VidGl0bGVXaWR0aCA9IGRvYy5nZXRTdHJpbmdVbml0V2lkdGgoc3VidGl0bGUpICogc3VidGl0bGVTaXplIC8gZG9jLmludGVybmFsLnNjYWxlRmFjdG9yO1xuXG4gICAgbGV0IHN1YnRpdGxlTWFyZ2luTGVmdDtcbiAgICBpZiAoc3VidGl0bGVXaWR0aCA+PSAocGFnZVdpZHRoKSkge1xuICAgICAgc3VidGl0bGVNYXJnaW5MZWZ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VidGl0bGVNYXJnaW5MZWZ0ID0gKHBhZ2VXaWR0aCAtIHN1YnRpdGxlV2lkdGgpIC8gMiA7XG4gICAgfVxuICAgIHJldHVybiBzdWJ0aXRsZU1hcmdpbkxlZnQ7XG4gIH1cblxuICBwcml2YXRlIGFkZFRpdGxlKGRvYzoganNwZGYsIHRpdGxlOiBzdHJpbmcsIHRpdGxlRm9udFNpemU6IG51bWJlciwgdGl0bGVNYXJnaW5MZWZ0OiBudW1iZXIsIHRpdGxlTWFyZ2luVG9wOiBudW1iZXIpIHtcbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSh0aXRsZUZvbnRTaXplKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgdGl0bGVNYXJnaW5MZWZ0LCB0aXRsZU1hcmdpblRvcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFN1YlRpdGxlKGRvYzoganNwZGYsIHN1YnRpdGxlOiBzdHJpbmcsIHN1YnRpdGxlRm9udFNpemU6IG51bWJlciwgc3VidGl0bGVNYXJnaW5MZWZ0OiBudW1iZXIsIHN1YnRpdGxlTWFyZ2luVG9wOiBudW1iZXIpIHtcbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzdWJ0aXRsZUZvbnRTaXplKTtcbiAgICBkb2MudGV4dChzdWJ0aXRsZSwgc3VidGl0bGVNYXJnaW5MZWZ0LCBzdWJ0aXRsZU1hcmdpblRvcCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBjb21tZW50IHRvIHRoZSBkb2N1bWVudFxuICAgKiAqIEBwYXJhbSAgZG9jIC0gcGRmIGRvY3VtZW50XG4gICAqICogQHBhcmFtICBjb21tZW50IC0gQ29tbWVudCB0byBhZGQgaW4gdGhlIGRvY3VtZW50XG4gICAqICogQHBhcmFtICBzaXplIC0gU2l6ZSBvZiB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByaXZhdGUgYWRkQ29tbWVudChkb2M6IGpzcGRmLCBjb21tZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb21tZW50U2l6ZSA9IDE2O1xuICAgIGNvbnN0IGNvbW1lbnRNYXJnaW5MZWZ0ID0gMjA7XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gNTtcbiAgICBjb25zdCBoZWlnaHRQaXhlbHMgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luQm90dG9tO1xuXG4gICAgZG9jLnNldEZvbnQoJ2NvdXJpZXInKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoY29tbWVudFNpemUpO1xuICAgIGRvYy50ZXh0KGNvbW1lbnQsIGNvbW1lbnRNYXJnaW5MZWZ0LCBoZWlnaHRQaXhlbHMpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgcHJvamVjdGlvbiBhbmQvb3Igc2NhbGUgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gcGRmIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBkcGkgLSBEUEkgcmVzb2x1dGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBwcm9qZWN0aW9uIC0gQm9vbCB0byBpbmRpY2F0ZSBpZiBwcm9qZWN0aW9uIG5lZWQgdG8gYmUgYWRkZWRcbiAgICogQHBhcmFtICBzY2FsZSAtIEJvb2wgdG8gaW5kaWNhdGUgaWYgc2NhbGUgbmVlZCB0byBiZSBhZGRlZFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRQcm9qU2NhbGUoXG4gICAgZG9jOiBqc3BkZixcbiAgICBtYXA6IElnb01hcCxcbiAgICBkcGk6IG51bWJlcixcbiAgICBwcm9qZWN0aW9uOiBib29sZWFuLFxuICAgIHNjYWxlOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgICBjb25zdCBwcm9qU2NhbGVTaXplID0gMTY7XG4gICAgY29uc3QgcHJvalNjYWxlTWFyZ2luTGVmdCA9IDIwO1xuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IDE1O1xuICAgIGNvbnN0IGhlaWdodFBpeGVscyA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5Cb3R0b207XG5cbiAgICBsZXQgdGV4dFByb2pTY2FsZTogc3RyaW5nID0gJyc7XG4gICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHByb2pUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnByb2plY3Rpb24nKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb247XG4gICAgfVxuICAgIGlmIChzY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgdGV4dFByb2pTY2FsZSArPSAnICAgJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUoZHBpKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gc2NhbGVUZXh0ICsgJzogfiAxIC8gJyArIGZvcm1hdFNjYWxlKG1hcFNjYWxlKTtcbiAgICB9XG4gICAgZG9jLnNldEZvbnQoJ2NvdXJpZXInKTtcbiAgICBkb2Muc2V0Rm9udFNpemUocHJvalNjYWxlU2l6ZSk7XG4gICAgZG9jLnRleHQodGV4dFByb2pTY2FsZSwgcHJvalNjYWxlTWFyZ2luTGVmdCwgaGVpZ2h0UGl4ZWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNwZGYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG5cbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbcG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy53aWR0aCkgLyByZXNvbHV0aW9uLCBwb3VyY2VudGFnZVJlZHVjdGlvblxuICAgICAgICAqICgyNS40ICogY2FudmFzLmhlaWdodCkgLyByZXNvbHV0aW9uXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOyAvLyByZW1vdmUgdGVtcCBkaXYgKElFIHN0eWxlKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICAgICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFNhbWVQYWdlKFxuICAgICAgZG9jOiBqc3BkZixcbiAgICAgIG1hcDogSWdvTWFwLFxuICAgICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICAgIHJlc29sdXRpb246IG51bWJlcixcbiAgICAgIGxlZ2VuZFBvc2l0aW9uOiBzdHJpbmdcbiAgICApIHtcbiAgICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcbiAgICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgICAgbWFwLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgcmVzb2x1dGlvblxuICAgICAgKS50b1Byb21pc2UoKTtcbiAgICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIC8vIEFkZCBodG1sIGNvZGUgdG8gY29udmVydCBpbiB0aGUgbmV3IHdpbmRvd1xuICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgYXdhaXQgdGhpcy50aW1lb3V0KDEpO1xuICAgICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9KTtcbiAgICAgIGxldCBtYXJnaW5zTGVnZW5kO1xuICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSAvIHJlc29sdXRpb24sXG4gICAgICAgICAgIHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMuaGVpZ2h0KSAvIHJlc29sdXRpb25dO1xuICAgICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgICAgaWYgKCBsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbnNbMl0gLSBpbWFnZVNpemVbMV0sIG1hcmdpbnNbMV0sXG4gICAgICAgICAgIG1hcmdpbnNbMl0sIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbMV0gLSBpbWFnZVNpemVbMF1dO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wcmlnaHQnKSB7XG4gICAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFttYXJnaW5zWzBdLCBtYXJnaW5zWzFdLCBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBtYXJnaW5zWzFdIC0gaW1hZ2VTaXplWzBdIF07XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXG4gICAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFtkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1syXSAtIGltYWdlU2l6ZVsxXSAtIDE1LFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbM10gLSBpbWFnZVNpemVbMF0sIG1hcmdpbnNbMl0gKyAxNSwgbWFyZ2luc1szXSBdO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgICBtYXJnaW5zTGVnZW5kID0gW21hcmdpbnNbMF0sIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbM10gLSBpbWFnZVNpemVbMF0sXG4gICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzBdIC0gaW1hZ2VTaXplWzFdLCBtYXJnaW5zWzNdIF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBjYW52YXMsIG1hcmdpbnNMZWdlbmQpOyAvLyB0aGlzIGFkZHMgdGhlIGxlZ2VuZFxuICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOyAvLyByZW1vdmUgdGVtcCBkaXYgKElFIHN0eWxlKVxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzY2FsZSBhbmQgYXR0cmlidXRpb25zIG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFNjYWxlKFxuICAgIGRvYzoganNwZGYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxuICAgICkge1xuICAgICAgY29uc3QgbWFwU2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcbiAgICAgIC8vIEdldCB0aGUgc2NhbGUgYW5kIGF0dHJpYnV0aW9uXG4gICAgICAvLyB3ZSB1c2UgY2xvbmVOb2RlIHRvIG1vZGlmeSB0aGUgbm9kZXMgdG8gcHJpbnQgd2l0aG91dCBtb2RpZnlpbmcgaXQgb24gdGhlIHBhZ2UsIHVzaW5nIGRlZXA6dHJ1ZSB0byBnZXQgY2hpbGRyZW5cbiAgICAgIGxldCBjYW52YXNPdmVybGF5SFRNTDtcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlIVE1MID0gbWFwLm9sLmdldE92ZXJsYXlDb250YWluZXJTdG9wRXZlbnQoKTtcbiAgICAgIC8vIFJlbW92ZSB0aGUgVUkgYnV0dG9ucyBmcm9tIHRoZSBub2Rlc1xuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zID0gbWFwT3ZlcmxheUhUTUwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zYXJyID0gQXJyYXkuZnJvbShPdmVybGF5SFRNTEJ1dHRvbnMpO1xuICAgICAgZm9yIChjb25zdCBPdmVybGF5SFRNTEJ1dHRvbiBvZiBPdmVybGF5SFRNTEJ1dHRvbnNhcnIpIHtcbiAgICAgICAgT3ZlcmxheUhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XG4gICAgICB9XG4gICAgICAvLyBDaGFuZ2UgdGhlIHN0eWxlcyBvZiBoeXBlcmxpbmsgaW4gdGhlIHByaW50ZWQgdmVyc2lvblxuICAgICAgLy8gVHJhbnNmb3JtIHRoZSBPdmVybGF5IGludG8gYSBjYW52YXNcbiAgICAgIC8vIHNjYWxlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGluIGdvb2dsZSBjaHJvbWVcbiAgICAgIC8vIGJhY2tncm91bmQgYXMgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyB3aGl0ZSBhbmQgY292ZXIgdGhlIG1hcFxuICAgICAgLy8gYWxsb3d0YWludCBpcyB0byBhbGxvdyByZW5kZXJpbmcgaW1hZ2VzIGluIHRoZSBhdHRyaWJ1dGlvbnNcbiAgICAgIC8vIHVzZUNPUlM6IHRydWUgcG91ciBwZXJtZXR0cmUgZGUgcmVuZGVyZXIgbGVzIGltYWdlcyAobmUgbWFyY2hlIHBhcyBlbiBsb2NhbClcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKG1hcE92ZXJsYXlIVE1MLCB7XG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG51bGwsXG4gICAgICAgIGFsbG93VGFpbnQ6IHRydWUsXG4gICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICB9KS50aGVuKCBlID0+IHtcbiAgICAgICAgY2FudmFzT3ZlcmxheUhUTUwgPSBlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MLCBtYXJnaW5zKTsgLy8gdGhpcyBhZGRzIHNjYWxlcyBhbmQgYXR0cmlidXRpb25zXG4gfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc3BkZixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgbGV0IGltYWdlO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IHRoaXMuZ2V0SW1hZ2VTaXplVG9GaXRQZGYoZG9jLCBjYW52YXMsIG1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIG1hcmdpbnNbM10sXG4gICAgICAgIG1hcmdpbnNbMF0sXG4gICAgICAgIGltYWdlU2l6ZVswXSxcbiAgICAgICAgaW1hZ2VTaXplWzFdXG4gICAgICApO1xuICAgICAgZG9jLnJlY3QobWFyZ2luc1szXSwgbWFyZ2luc1swXSwgaW1hZ2VTaXplWzBdLCBpbWFnZVNpemVbMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gZml4IHByaW50aW5nIHdpdGggaW1hZ2UgcmVzb2x1dGlvblxuICBwcml2YXRlIGFkZE1hcChcbiAgICBkb2M6IGpzcGRmLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHJlc29sdXRpb246IG51bWJlcixcbiAgICBzaXplOiBBcnJheTxudW1iZXI+LFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKTtcbiAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcblxuICAgIGNvbnN0IHdpZHRoUGl4ZWxzID0gTWF0aC5yb3VuZCgoc2l6ZVswXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gTWF0aC5yb3VuZCgoc2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG5cbiAgICBsZXQgdGltZW91dDtcblxuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBjYW52YXNlcyA9IGV2ZW50LnRhcmdldC5nZXRWaWV3cG9ydCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IG1hcFN0YXR1cyQkID0gbWFwLnN0YXR1cyQuc3Vic2NyaWJlKChtYXBTdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgIGlmIChtYXBTdGF0dXMgIT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcFN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNhbnZhcyBvZiBjYW52YXNlcykge1xuICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhcywgbWFyZ2lucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5J1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyTWFwKG1hcCwgbWFwU2l6ZSwgZXh0ZW50KTtcbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm8gbG9hZGluZyBhcyBzdGFydGVkIGFmdGVyIDIwMG1zLCB0aGVuIHByb2JhYmx5IG5vIGxvYWRpbmdcbiAgICAgIC8vIGlzIHJlcXVpcmVkLlxuICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIGNhbnZhc2VzKSB7XG4gICAgICAgICAgICBpZiAoY2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJNYXAobWFwLCBtYXBTaXplLCBleHRlbnQpO1xuICAgICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlck1hcChtYXAsIFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXSwgZXh0ZW50KTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGZvcm1hdCA9ICdwbmcnLFxuICAgIHByb2plY3Rpb24gPSBmYWxzZSxcbiAgICBzY2FsZSA9IGZhbHNlLFxuICAgIGxlZ2VuZCA9IGZhbHNlLFxuICAgIHRpdGxlID0gJycsXG4gICAgc3VidGl0bGUgPSAnJyxcbiAgICBjb21tZW50ID0gJycsXG4gICAgZG9aaXBGaWxlID0gdHJ1ZVxuICApIHtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcbiAgICAvLyBjb25zdCByZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG4gICAgdGhpcy5hY3Rpdml0eUlkID0gdGhpcy5hY3Rpdml0eVNlcnZpY2UucmVnaXN0ZXIoKTtcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgbWFwLm9sLm9uY2UoJ3JlbmRlcmNvbXBsZXRlJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgb2xkQ2FudmFzID0gZXZlbnQudGFyZ2V0XG4gICAgICAgIC5nZXRWaWV3cG9ydCgpXG4gICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJylbMF07XG4gICAgICBjb25zdCBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRleHQgPSBuZXdDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIC8vIFBvc3Rpb24gaW4gaGVpZ2h0IHRvIHNldCB0aGUgY2FudmFzIGluIG5ldyBjYW52YXNcbiAgICAgIGxldCBwb3NpdGlvbkhDYW52YXMgPSAwO1xuICAgICAgLy8gUG9zaXRpb24gaW4gd2lkdGggdG8gc2V0IHRoZSBQcm9qL1NjYWxlIGluIG5ldyBjYW52YXNcbiAgICAgIGxldCBwb3NpdGlvbldQcm9qU2NhbGUgPSAxMDtcbiAgICAgIC8vIEdldCBoZWlnaHQvd2lkdGggb2YgbWFwIGNhbnZhc1xuICAgICAgY29uc3Qgd2lkdGggPSBvbGRDYW52YXMud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gb2xkQ2FudmFzLmhlaWdodDtcbiAgICAgIC8vIFNldCBGb250IHRvIGNhbGN1bGF0ZSBjb21tZW50IHdpZHRoXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIGNvbnN0IGNvbW1lbnRXaWR0aCA9IG5ld0NvbnRleHQubWVhc3VyZVRleHQoY29tbWVudCkud2lkdGg7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciB0aXRsZSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHN1YnRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBwcm9qZWN0aW9uICE9PSBmYWxzZSB8fCBzY2FsZSAhPT0gZmFsc2UgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSFByb2pTY2FsZSA9IGhlaWdodCAtIDEwO1xuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcbiAgICAgIGNvbnN0IGNvbW1lbnROYkxpbmUgPSBNYXRoLmNlaWwoY29tbWVudFdpZHRoIC8gd2lkdGgpO1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgbXVsdGlsaW5lIGNvbW1lbnQgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XG4gICAgICBsZXQgcG9zaXRpb25IQ29tbWVudCA9IGhlaWdodCAtIGNvbW1lbnROYkxpbmUgKiAyMCArIDU7XG4gICAgICAvLyBTZXQgdGhlIG5ldyBjYW52YXMgd2l0aCB0aGUgbmV3IGNhbGN1bGF0ZWQgc2l6ZVxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgLy8gUGF0Y2ggSnBlZyBkZWZhdWx0IGJsYWNrIGJhY2tncm91bmQgdG8gd2hpdGVcbiAgICAgIGlmIChmb3JtYXQgPT09ICdqcGVnJykge1xuICAgICAgICBuZXdDb250ZXh0LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICB9XG4gICAgICAvLyBJZiBhIHRpdGxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAodGl0bGUgIT09ICcnKSB7XG4gICAgICAgIC8vIFNldCBmb250IGZvciB0aXRsZVxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxuICAgICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjZweCBDYWxpYnJpJztcbiAgICAgICAgcG9zaXRpb25IQ2FudmFzID0gMzA7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQodGl0bGUsIHdpZHRoIC8gMiwgMjAsIHdpZHRoICogMC45KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJ0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHN1YnRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSA2MDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChzdWJ0aXRsZSwgd2lkdGggLyAyLCA1MCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuICAgICAgLy8gU2V0IGZvbnQgZm9yIG5leHQgc2VjdGlvblxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XG4gICAgICAvLyBJZiBwcm9qZWN0aW9uIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcHJvalRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0ucHJvamVjdGlvbicpO1xuICAgICAgICBuZXdDb250ZXh0LnRleHRBbGlnbiA9ICdzdGFydCc7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb24sXG4gICAgICAgICAgcG9zaXRpb25XUHJvalNjYWxlLFxuICAgICAgICAgIHBvc2l0aW9uSFByb2pTY2FsZVxuICAgICAgICApO1xuICAgICAgICBwb3NpdGlvbldQcm9qU2NhbGUgKz0gMjAwOyAvLyBXaWR0aCBwb3NpdGlvbiBjaGFuZ2UgZm9yIHNjYWxlIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNjYWxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShyZXNvbHV0aW9uKTtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnc3RhcnQnO1xuICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgIHNjYWxlVGV4dCArICc6IH4gMSAvICcgKyBmb3JtYXRTY2FsZShtYXBTY2FsZSksXG4gICAgICAgICAgcG9zaXRpb25XUHJvalNjYWxlLFxuICAgICAgICAgIHBvc2l0aW9uSFByb2pTY2FsZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSWYgYSBjb21tZW50IG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAoY29tbWVudCAhPT0gJycpIHtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgLy8gSWYgb25seSBvbmUgbGluZSwgbm8gbmVlZCB0byBtdWx0aWxpbmUgdGhlIGNvbW1lbnRcbiAgICAgICAgaWYgKGNvbW1lbnROYkxpbmUgPT09IDEpIHtcbiAgICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KGNvbW1lbnQsIHdpZHRoIC8gMiwgcG9zaXRpb25IQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VwYXJhdGUgdGhlIHNldGVuc2VzIHRvIGJlIGFwcHJveC4gdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgbmJDb21tZW50Q2hhciA9IGNvbW1lbnQubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IENvbW1lbnRMZW5ndGhUb0N1dCA9IE1hdGguZmxvb3IobmJDb21tZW50Q2hhciAvIGNvbW1lbnROYkxpbmUpO1xuICAgICAgICAgIGxldCBjb21tZW50Q3VycmVudExpbmUgPSAnJztcbiAgICAgICAgICBsZXQgcG9zaXRpb25GaXJzdEN1dENoYXIgPSAwO1xuICAgICAgICAgIGxldCBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAvLyBMb29wIGZvciB0aGUgbnVtYmVyIG9mIGxpbmUgY2FsY3VsYXRlZFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudE5iTGluZTsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGb3IgYWxsIGxpbmUgZXhjZXB0IGxhc3RcbiAgICAgICAgICAgIGlmIChjb21tZW50TmJMaW5lIC0gMSA+IGkpIHtcbiAgICAgICAgICAgICAgLy8gR2V0IGNvbW1lbnQgY3VycmVudCBsaW5lIHRvIGZpbmQgdGhlIHJpZ2h0IHBsYWNlIHR1IGN1dCBjb21tZW50XG4gICAgICAgICAgICAgIGNvbW1lbnRDdXJyZW50TGluZSA9IGNvbW1lbnQuc3Vic3RyKFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uRmlyc3RDdXRDaGFyLFxuICAgICAgICAgICAgICAgIENvbW1lbnRMZW5ndGhUb0N1dFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBDdXQgdGhlIHNldGVuY2UgYXQgYmxhbmtcbiAgICAgICAgICAgICAgcG9zaXRpb25MYXN0QmxhbmsgPSBjb21tZW50Q3VycmVudExpbmUubGFzdEluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUuc3Vic3RyKDAsIHBvc2l0aW9uTGFzdEJsYW5rKSxcbiAgICAgICAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhciArPSBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAgICAgLy8gR28gdG8gbmV4dCBsaW5lIGZvciBpbnNlcnRpb25cbiAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudCArPSAyMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGN1dCBsYXN0IHBhcnRcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50LnN1YnN0cihwb3NpdGlvbkZpcnN0Q3V0Q2hhciksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCBtYXAgdG8gbmV3IGNhbnZhc1xuICAgICAgbmV3Q29udGV4dC5kcmF3SW1hZ2Uob2xkQ2FudmFzLCAwLCBwb3NpdGlvbkhDYW52YXMpO1xuXG4gICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU2F2ZSB0aGUgY2FudmFzIGFzIGZpbGVcbiAgICAgICAgaWYgKCFkb1ppcEZpbGUpIHtcbiAgICAgICAgICB0aGlzLnNhdmVDYW52YXNJbWFnZUFzRmlsZShuZXdDYW52YXMsICdtYXAnLCBmb3JtYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAoXG4gICAgICAgICAgICBuZXdDYW52YXMsXG4gICAgICAgICAgICAnbWFwJyArIG1hcC5wcm9qZWN0aW9uLnJlcGxhY2UoJzonLCAnXycpICsgJy4nICsgZm9ybWF0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAobmV3Q2FudmFzLCAnbWFwJyArICcuJyArIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGl3Q29udGVudCA9IHRoaXMuZ2V0V29ybGRGaWxlSW5mb3JtYXRpb24obWFwKTtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0aXdDb250ZW50XSwge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xuICAgICAgICAgIC8vIHNhdmVBcyBhdXRvbWF0aWNseSByZXBsYWNlICc6JyBmb3IgJ18nXG4gICAgICAgICAgc2F2ZUFzKGJsb2IsICdtYXAnICsgbWFwLnByb2plY3Rpb24gKyAnLnRmdycpO1xuICAgICAgICAgIHRoaXMuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAoXG4gICAgICAgICAgICAnbWFwJyArIG1hcC5wcm9qZWN0aW9uLnJlcGxhY2UoJzonLCAnXycpICsgJy50ZncnLFxuICAgICAgICAgICAgYmxvYlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1hcChtYXAsIHNpemUsIGV4dGVudCkge1xuICAgIG1hcC5vbC51cGRhdGVTaXplKCk7XG4gICAgbWFwLm9sLnJlbmRlclN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gRG9jdW1lbnQgdG8gc2F2ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVEb2MoZG9jOiBqc3BkZikge1xuICAgIGF3YWl0IGRvYy5zYXZlKCdtYXAucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGdldEltYWdlU2l6ZVRvRml0UGRmKGRvYywgY2FudmFzLCBtYXJnaW5zKSB7XG4gICAgLy8gRGVmaW5lIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZSBiZXN0IHNpemUgdG8gZml0IGluIG9uZSBwYWdlXG4gICAgY29uc3QgcGFnZUhlaWdodCA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSAobWFyZ2luc1swXSArIG1hcmdpbnNbMl0pO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChtYXJnaW5zWzFdICsgbWFyZ2luc1szXSk7XG4gICAgY29uc3QgY2FuSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBjYW5XaWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNhbkhlaWdodCAvIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNhbldpZHRoIC8gcGFnZVdpZHRoO1xuICAgIGNvbnN0IG1heFJhdGlvID0gaGVpZ2h0UmF0aW8gPiB3aWR0aFJhdGlvID8gaGVpZ2h0UmF0aW8gOiB3aWR0aFJhdGlvO1xuICAgIGNvbnN0IGltZ0hlaWdoID0gbWF4UmF0aW8gPiAxID8gY2FuSGVpZ2h0IC8gbWF4UmF0aW8gOiBjYW5IZWlnaHQ7XG4gICAgY29uc3QgaW1nV2lkdGggPSBtYXhSYXRpbyA+IDEgPyBjYW5XaWR0aCAvIG1heFJhdGlvIDogY2FuV2lkdGg7XG5cbiAgICByZXR1cm4gW2ltZ1dpZHRoLCBpbWdIZWlnaF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd29ybGQgZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGlmZlxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXG4gICAqL1xuICBwcml2YXRlIGdldFdvcmxkRmlsZUluZm9ybWF0aW9uKG1hcCkge1xuICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50RXh0ZW50ID0gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpOyAvLyBSZXR1cm4gW21pbngsIG1pbnksIG1heHgsIG1heHldXG4gICAgcmV0dXJuIFtcbiAgICAgIGN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAtY3VycmVudFJlc29sdXRpb24sXG4gICAgICBjdXJyZW50RXh0ZW50WzBdICsgY3VycmVudFJlc29sdXRpb24gLyAwLjUsXG4gICAgICBjdXJyZW50RXh0ZW50WzNdIC0gY3VycmVudFJlc29sdXRpb24gLyAwLjVcbiAgICBdLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgY2FudmFzIGltYWdlIGFzIGZpbGVcbiAgICogQHBhcmFtIGNhbnZhcyAtIENhbnZhcyB0byBzYXZlXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgZmlsZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gZmlsZSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgbmFtZSwgZm9ybWF0KSB7XG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICAvLyBJZiBuYXZpZ2F0b3IgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihjYW52YXMubXNUb0Jsb2IoKSwgbmFtZSArICcuJyArIGZvcm1hdCk7XG4gICAgICAgIHRoaXMuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgICAgLy8gZG93bmxvYWQgaW1hZ2VcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgbmFtZSArICcuJyArIGZvcm1hdCk7XG4gICAgICAgICAgdGhhdC5zYXZlRmlsZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgfSwgYmxvYkZvcm1hdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknXG4gICAgICAgICksXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZmlsZSB0byBhIHppcFxuICAgKiBAcGFyYW0gY2FudmFzIC0gRmlsZSB0byBhZGQgdG8gdGhlIHppcFxuICAgKiBAcGFyYW0gIG5hbWUgLU5hbWUgb2YgdGhlIGZpbGVvdmVydmlld1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKGNhbnZhcywgbmFtZSkge1xuICAgIGNvbnN0IGJsb2JGb3JtYXQgPSAnaW1hZ2UvJyArICdqcGVnJztcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBpZiAoXG4gICAgICAhdGhpcy5oYXNPd25Qcm9wZXJ0eSgnemlwRmlsZScpIHx8XG4gICAgICB0eXBlb2YgdGhpcy56aXBGaWxlID09PSAndW5kZWZpbmVkJ1xuICAgICkge1xuICAgICAgdGhpcy56aXBGaWxlID0gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAobmFtZSwgY2FudmFzLm1zVG9CbG9iKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICAgIHRoYXQuYWRkRmlsZVRvWmlwKG5hbWUsIGJsb2IpO1xuICAgICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keSdcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBmaWxlIHRvIHppcCwgaWYgYWxsIGZpbGUgYXJlIHppcHBlZCwgZG93bmxvYWRcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRhaW4gb2YgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xuICAgIC8vIGFkZCBmaWxlIHRvIHppcFxuICAgIHRoaXMuemlwRmlsZS5maWxlKG5hbWUsIGJsb2IpO1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIERvd25sb2FkIHppcCBmaWxlXG4gICAgICB0aGlzLmdldFppcEZpbGUoKTtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUZpbGVQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHppcHBlZCBmaWxlXG4gICAqIEByZXR1cm4gUmV0dW4gYSB6aXAgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRaaXBGaWxlKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIC8vIDEpIGdlbmVyYXRlIHRoZSB6aXAgZmlsZVxuICAgICAgc2F2ZUFzKGJsb2IsICdtYXAuemlwJyk7XG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|