@igo2/geo 17.0.0-next.6 → 17.0.0-next.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +7 -5
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +6 -5
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +3 -2
- package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +4 -4
- package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +5 -5
- package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +36 -14
- package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +5 -1
- package/esm2022/lib/catalog/catalog-library/index.mjs +2 -7
- package/esm2022/lib/catalog/catalog.module.mjs +13 -6
- package/esm2022/lib/catalog/index.mjs +2 -7
- package/esm2022/lib/catalog/shared/catalog.interface.mjs +1 -1
- package/esm2022/lib/catalog/shared/index.mjs +1 -1
- package/esm2022/lib/datasource/index.mjs +1 -1
- package/esm2022/lib/datasource/shared/datasources/index.mjs +1 -1
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +4 -4
- package/esm2022/lib/directions/directions-buttons/index.mjs +1 -1
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +4 -4
- package/esm2022/lib/directions/directions-inputs/index.mjs +1 -1
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +4 -4
- package/esm2022/lib/directions/directions-results/index.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -2
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +8 -1
- package/esm2022/lib/directions/directions-sources/index.mjs +1 -1
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +67 -36
- package/esm2022/lib/directions/directions.component.mjs +72 -18
- package/esm2022/lib/directions/directions.module.mjs +4 -10
- package/esm2022/lib/directions/directions.provider.mjs +16 -0
- package/esm2022/lib/directions/index.mjs +2 -1
- package/esm2022/lib/directions/shared/directions-source.service.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.enum.mjs +1 -1
- package/esm2022/lib/directions/shared/directions.service.mjs +11 -19
- package/esm2022/lib/directions/shared/directions.utils.mjs +2 -2
- package/esm2022/lib/directions/shared/index.mjs +1 -1
- package/esm2022/lib/directions/shared/store.mjs +2 -2
- package/esm2022/lib/download/download-button/download-button.component.mjs +4 -4
- package/esm2022/lib/download/download-button/index.mjs +1 -1
- package/esm2022/lib/download/index.mjs +1 -1
- package/esm2022/lib/download/shared/download.interface.mjs +1 -1
- package/esm2022/lib/download/shared/index.mjs +1 -1
- package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +4 -4
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +4 -4
- package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +5 -5
- package/esm2022/lib/draw/draw/draw.component.mjs +5 -5
- package/esm2022/lib/draw/index.mjs +1 -1
- package/esm2022/lib/environment/environment.interface.mjs +1 -1
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +6 -5
- package/esm2022/lib/feature/feature-details/feature-details.module.mjs +10 -4
- package/esm2022/lib/feature/feature-details/index.mjs +2 -7
- package/esm2022/lib/feature/feature-form/feature-form.component.mjs +3 -3
- package/esm2022/lib/feature/feature.module.mjs +13 -6
- package/esm2022/lib/feature/index.mjs +2 -7
- package/esm2022/lib/feature/shared/feature.enums.mjs +1 -1
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2022/lib/feature/shared/feature.utils.mjs +2 -2
- package/esm2022/lib/feature/shared/store.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/loading.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/search.mjs +2 -2
- package/esm2022/lib/feature/shared/strategies/selection.mjs +2 -2
- package/esm2022/lib/filter/filter.module.mjs +4 -4
- package/esm2022/lib/filter/index.mjs +2 -36
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +5 -5
- package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +4 -4
- package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +6 -6
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +18 -20
- package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +2 -2
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +5 -5
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +5 -5
- package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +1 -1
- package/esm2022/lib/filter/shared/ogc-filter.mjs +46 -3
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +5 -5
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +5 -5
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +5 -5
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +5 -5
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +4 -4
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +5 -5
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +2 -2
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +5 -5
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +5 -1
- package/esm2022/lib/geometry/geometry-form-field/index.mjs +3 -8
- package/esm2022/lib/geometry/shared/controls/index.mjs +1 -1
- package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +1 -1
- package/esm2022/lib/geometry/shared/index.mjs +1 -1
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +4 -4
- package/esm2022/lib/import-export/export-button/index.mjs +1 -1
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +8 -6
- package/esm2022/lib/import-export/import-export/index.mjs +1 -1
- package/esm2022/lib/import-export/import-export.module.mjs +6 -1
- package/esm2022/lib/import-export/index.mjs +2 -9
- package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +4 -3
- package/esm2022/lib/import-export/shared/export.errors.mjs +1 -1
- package/esm2022/lib/import-export/shared/export.service.mjs +8 -2
- package/esm2022/lib/import-export/shared/export.utils.mjs +2 -2
- package/esm2022/lib/import-export/shared/import.utils.mjs +1 -1
- package/esm2022/lib/import-export/shared/index.mjs +1 -1
- package/esm2022/lib/layer/index.mjs +2 -19
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +4 -4
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +7 -5
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +5 -5
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +26 -20
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +5 -5
- package/esm2022/lib/layer/layer.module.mjs +12 -1
- package/esm2022/lib/layer/shared/layers/index.mjs +1 -1
- package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +4 -4
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +4 -4
- package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +4 -4
- package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +4 -4
- package/esm2022/lib/map/index.mjs +1 -32
- package/esm2022/lib/map/map.module.mjs +34 -34
- package/esm2022/lib/map/menu-button/menu-button.component.mjs +4 -4
- package/esm2022/lib/map/offline-button/offline-button.component.mjs +4 -4
- package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +4 -4
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +2 -2
- package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +4 -4
- package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +4 -4
- package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +4 -4
- package/esm2022/lib/measure/measurer/measurer-item.component.mjs +4 -4
- package/esm2022/lib/measure/measurer/measurer.component.mjs +5 -5
- package/esm2022/lib/measure/shared/index.mjs +1 -1
- package/esm2022/lib/metadata/index.mjs +2 -6
- package/esm2022/lib/metadata/metadata-button/index.mjs +1 -1
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +6 -6
- package/esm2022/lib/metadata/metadata.module.mjs +5 -1
- package/esm2022/lib/metadata/shared/index.mjs +1 -1
- package/esm2022/lib/metadata/shared/metadata.service.mjs +1 -1
- package/esm2022/lib/offline/geoDB/index.mjs +1 -1
- package/esm2022/lib/offline/shared/index.mjs +1 -1
- package/esm2022/lib/overlay/index.mjs +1 -1
- package/esm2022/lib/print/index.mjs +1 -1
- package/esm2022/lib/print/print-form/index.mjs +1 -1
- package/esm2022/lib/print/print-form/print-form.component.mjs +4 -4
- package/esm2022/lib/print/shared/index.mjs +1 -1
- package/esm2022/lib/print/shared/print.service.mjs +85 -76
- package/esm2022/lib/query/index.mjs +1 -1
- package/esm2022/lib/query/shared/index.mjs +2 -1
- package/esm2022/lib/query/shared/query.enums.mjs +1 -1
- package/esm2022/lib/search/index.mjs +2 -13
- package/esm2022/lib/search/search-bar/search-bar.component.mjs +9 -6
- package/esm2022/lib/search/search-results/index.mjs +2 -7
- package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +5 -5
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +7 -5
- package/esm2022/lib/search/search-results/search-results-item.component.mjs +3 -2
- package/esm2022/lib/search/search-results/search-results.component.mjs +7 -5
- package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
- package/esm2022/lib/search/search-selector/search-selector.component.mjs +4 -4
- package/esm2022/lib/search/search-settings/search-settings.component.mjs +4 -4
- package/esm2022/lib/search/search.module.mjs +15 -1
- package/esm2022/lib/search/shared/index.mjs +2 -1
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +2 -2
- package/esm2022/lib/search/shared/search-source.service.mjs +1 -1
- package/esm2022/lib/search/shared/search.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/search.provider.mjs +20 -0
- package/esm2022/lib/search/shared/search.service.mjs +29 -10
- package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +8 -1
- package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +11 -1
- package/esm2022/lib/search/shared/sources/icherche-icons.mjs +2 -2
- package/esm2022/lib/search/shared/sources/icherche.mjs +2 -2
- package/esm2022/lib/search/shared/sources/icherche.providers.mjs +20 -1
- package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +11 -1
- package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +1 -1
- package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +8 -1
- package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -2
- package/esm2022/lib/search/shared/sources/source.mjs +1 -1
- package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +14 -1
- package/esm2022/lib/search/shared/sources/workspace.providers.mjs +8 -1
- package/esm2022/lib/style/shared/feature/feature-style.mjs +3 -2
- package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +5 -5
- package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +5 -5
- package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +4 -4
- package/esm2022/lib/toast/index.mjs +1 -1
- package/esm2022/lib/toast/toast.component.mjs +4 -2
- package/esm2022/lib/wkt/index.mjs +1 -1
- package/esm2022/lib/wkt/shared/index.mjs +1 -1
- package/esm2022/lib/workspace/index.mjs +1 -1
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +2 -2
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +3 -2
- package/esm2022/lib/workspace/shared/feature-workspace.mjs +2 -2
- package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +3 -2
- package/esm2022/lib/workspace/shared/index.mjs +1 -1
- package/esm2022/lib/workspace/shared/wfs-workspace.mjs +2 -2
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +3 -2
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +3 -2
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +2 -2
- package/esm2022/lib/workspace/widgets/index.mjs +1 -1
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +1 -1
- package/esm2022/lib/workspace/widgets/widgets.mjs +2 -2
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +3 -3
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +1 -1
- package/esm2022/lib/workspace/workspace.module.mjs +2 -2
- package/fesm2022/igo2-geo.mjs +30361 -30092
- package/fesm2022/igo2-geo.mjs.map +1 -1
- package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +2 -2
- package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +1 -1
- package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +1 -1
- package/lib/catalog/catalog-library/catalog-library.component.d.ts +7 -2
- package/lib/catalog/catalog-library/catalog-library.module.d.ts +3 -0
- package/lib/catalog/catalog-library/index.d.ts +1 -3
- package/lib/catalog/catalog.module.d.ts +6 -3
- package/lib/catalog/index.d.ts +1 -2
- package/lib/catalog/shared/catalog.interface.d.ts +1 -1
- package/lib/directions/directions-sources/directions-source.d.ts +7 -3
- package/lib/directions/directions-sources/directions-source.interface.d.ts +19 -6
- package/lib/directions/directions-sources/directions-source.provider.d.ts +2 -0
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +19 -10
- package/lib/directions/directions.component.d.ts +15 -3
- package/lib/directions/directions.module.d.ts +5 -6
- package/lib/directions/directions.provider.d.ts +3 -0
- package/lib/directions/index.d.ts +1 -0
- package/lib/directions/shared/directions.service.d.ts +3 -2
- package/lib/directions/shared/directions.utils.d.ts +1 -1
- package/lib/directions/shared/store.d.ts +1 -1
- package/lib/draw/draw/draw-shorcuts.component.d.ts +1 -1
- package/lib/draw/draw/draw.component.d.ts +1 -1
- package/lib/environment/environment.interface.d.ts +2 -1
- package/lib/feature/feature-details/feature-details.component.d.ts +1 -1
- package/lib/feature/feature-details/feature-details.module.d.ts +3 -0
- package/lib/feature/feature-details/index.d.ts +1 -3
- package/lib/feature/feature-form/feature-form.component.d.ts +1 -2
- package/lib/feature/feature.module.d.ts +6 -3
- package/lib/feature/index.d.ts +1 -2
- package/lib/feature/shared/feature.interfaces.d.ts +1 -1
- package/lib/feature/shared/feature.utils.d.ts +1 -1
- package/lib/feature/shared/store.d.ts +1 -1
- package/lib/feature/shared/strategies/geo-properties.d.ts +1 -1
- package/lib/feature/shared/strategies/in-map-extent.d.ts +1 -1
- package/lib/feature/shared/strategies/in-map-resolution.d.ts +1 -1
- package/lib/feature/shared/strategies/loading-layer.d.ts +1 -1
- package/lib/feature/shared/strategies/loading.d.ts +1 -1
- package/lib/feature/shared/strategies/search.d.ts +1 -1
- package/lib/feature/shared/strategies/selection.d.ts +1 -1
- package/lib/filter/filter.module.d.ts +19 -0
- package/lib/filter/index.d.ts +1 -16
- package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +1 -1
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +3 -3
- package/lib/filter/shared/ogc-filter.d.ts +7 -0
- package/lib/filter/shared/ogc-filter.interface.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +1 -1
- package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +3 -0
- package/lib/geometry/geometry-form-field/index.d.ts +2 -4
- package/lib/geometry/shared/geometry.interfaces.d.ts +1 -1
- package/lib/import-export/import-export/import-export.component.d.ts +2 -2
- package/lib/import-export/import-export.module.d.ts +4 -0
- package/lib/import-export/index.d.ts +1 -4
- package/lib/import-export/shared/drop-geo-file.directive.d.ts +2 -1
- package/lib/import-export/shared/export.utils.d.ts +1 -1
- package/lib/import-export/shared/import.utils.d.ts +1 -1
- package/lib/layer/index.d.ts +1 -8
- package/lib/layer/layer-list/layer-list.component.d.ts +4 -3
- package/lib/layer/layer.module.d.ts +10 -0
- package/lib/map/index.d.ts +0 -14
- package/lib/map/map.module.d.ts +32 -15
- package/lib/measure/measurer/measurer.component.d.ts +1 -1
- package/lib/metadata/index.d.ts +1 -2
- package/lib/metadata/metadata.module.d.ts +2 -0
- package/lib/print/shared/print.service.d.ts +11 -7
- package/lib/query/shared/index.d.ts +1 -0
- package/lib/search/index.d.ts +1 -5
- package/lib/search/search-bar/search-bar.component.d.ts +2 -1
- package/lib/search/search-results/index.d.ts +1 -3
- package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
- package/lib/search/search-results/search-results.component.d.ts +1 -1
- package/lib/search/search-results/search-results.directive.d.ts +3 -0
- package/lib/search/search.module.d.ts +8 -0
- package/lib/search/shared/index.d.ts +1 -0
- package/lib/search/shared/search-source.service.d.ts +1 -1
- package/lib/search/shared/search.interfaces.d.ts +1 -1
- package/lib/search/shared/search.provider.d.ts +8 -0
- package/lib/search/shared/search.service.d.ts +7 -2
- package/lib/search/shared/sources/cadastre.providers.d.ts +2 -0
- package/lib/search/shared/sources/coordinates.providers.d.ts +2 -0
- package/lib/search/shared/sources/icherche-icons.d.ts +1 -1
- package/lib/search/shared/sources/icherche.providers.d.ts +6 -12
- package/lib/search/shared/sources/ilayer.providers.d.ts +2 -0
- package/lib/search/shared/sources/nominatim.providers.d.ts +2 -0
- package/lib/search/shared/sources/source.d.ts +1 -1
- package/lib/search/shared/sources/source.interfaces.d.ts +16 -0
- package/lib/search/shared/sources/storedqueries.providers.d.ts +3 -0
- package/lib/search/shared/sources/workspace.providers.d.ts +2 -0
- package/lib/toast/toast.component.d.ts +1 -1
- package/lib/workspace/shared/edition-workspace.d.ts +1 -1
- package/lib/workspace/shared/feature-workspace.d.ts +1 -1
- package/lib/workspace/shared/wfs-workspace.d.ts +1 -1
- package/lib/workspace/shared/workspace.utils.d.ts +2 -1
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +2 -1
- package/lib/workspace/widgets/widgets.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/lib/workspace/workspace.module.d.ts +1 -1
- package/locale/en.geo.json +6 -1
- package/locale/fr.geo.json +6 -1
- package/package.json +5 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
|
-
import { SecureImagePipe } from '@igo2/common';
|
|
3
|
+
import { SecureImagePipe } from '@igo2/common/image';
|
|
4
4
|
import { ActivityService } from '@igo2/core/activity';
|
|
5
5
|
import { ConfigService } from '@igo2/core/config';
|
|
6
6
|
import { LanguageService } from '@igo2/core/language';
|
|
@@ -31,14 +31,14 @@ export class PrintService {
|
|
|
31
31
|
zipFile;
|
|
32
32
|
nbFileToProcess;
|
|
33
33
|
activityId;
|
|
34
|
-
imgSizeAdded;
|
|
35
34
|
mapPrintExtent;
|
|
35
|
+
imgSizeAdded;
|
|
36
36
|
TEXTPDFFONT = {
|
|
37
|
-
titleFont: '
|
|
37
|
+
titleFont: 'times',
|
|
38
38
|
titleFontStyle: 'bold',
|
|
39
|
-
subtitleFont: '
|
|
39
|
+
subtitleFont: 'times',
|
|
40
40
|
subtitleFontStyle: 'bold',
|
|
41
|
-
commentFont: '
|
|
41
|
+
commentFont: 'times',
|
|
42
42
|
commentFontStyle: 'normal',
|
|
43
43
|
commentFontSize: 12
|
|
44
44
|
};
|
|
@@ -62,54 +62,53 @@ export class PrintService {
|
|
|
62
62
|
format: paperFormat.toLowerCase(),
|
|
63
63
|
unit: 'mm' // default
|
|
64
64
|
});
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
];
|
|
69
|
-
const margins = [10, 10, 10, 10];
|
|
70
|
-
const width = dimensions[0] - margins[3] - margins[1];
|
|
71
|
-
const height = dimensions[1] - margins[0] - margins[2];
|
|
72
|
-
const size = [width, height];
|
|
65
|
+
const { width: pageWidth, height: pageHeight } = doc.internal.pageSize;
|
|
66
|
+
/** top | right | bottom | left */
|
|
67
|
+
const baseMargins = [10, 10, 10, 10];
|
|
73
68
|
let titleSizes;
|
|
74
69
|
let subtitleSizes;
|
|
75
70
|
// if paper format A1 or A0 add margin top
|
|
76
71
|
if ((options.title !== '' || options.subtitle !== '') &&
|
|
77
72
|
(paperFormat === PrintPaperFormat.A1 ||
|
|
78
73
|
paperFormat === PrintPaperFormat.A0)) {
|
|
79
|
-
|
|
74
|
+
baseMargins[0] += 10;
|
|
80
75
|
}
|
|
81
76
|
// PDF title
|
|
82
|
-
const fontSizeInPt = Math.round(2 * (
|
|
77
|
+
const fontSizeInPt = Math.round(2 * (pageHeight + 145) * 0.05) / 2; //calculate the fontSize title from the page height.
|
|
83
78
|
if (options.title !== undefined && options.title !== '') {
|
|
84
|
-
titleSizes = this.getTextPdfObjectSizeAndMarg(options.title,
|
|
85
|
-
this.addTextInPdfDoc(doc, options.title, this.TEXTPDFFONT.titleFont, this.TEXTPDFFONT.titleFontStyle, titleSizes.fontSize, titleSizes.marginLeft +
|
|
86
|
-
|
|
79
|
+
titleSizes = this.getTextPdfObjectSizeAndMarg(options.title, baseMargins, this.TEXTPDFFONT.titleFont, fontSizeInPt, this.TEXTPDFFONT.titleFontStyle, doc);
|
|
80
|
+
this.addTextInPdfDoc(doc, options.title, this.TEXTPDFFONT.titleFont, this.TEXTPDFFONT.titleFontStyle, titleSizes.fontSize, titleSizes.marginLeft + baseMargins[3], baseMargins[0]);
|
|
81
|
+
baseMargins[0] = titleSizes.height + baseMargins[0]; // cumulative margin top for next elem to place in pdf doc
|
|
87
82
|
}
|
|
88
83
|
// PDF subtitle
|
|
89
84
|
if (options.subtitle !== undefined && options.subtitle !== '') {
|
|
90
|
-
subtitleSizes = this.getTextPdfObjectSizeAndMarg(options.subtitle,
|
|
85
|
+
subtitleSizes = this.getTextPdfObjectSizeAndMarg(options.subtitle, baseMargins, this.TEXTPDFFONT.subtitleFont, options.title !== '' ? titleSizes.fontSize * 0.7 : fontSizeInPt * 0.7, // 70% size of title
|
|
91
86
|
this.TEXTPDFFONT.subtitleFontStyle, doc);
|
|
92
|
-
this.addTextInPdfDoc(doc, options.subtitle, this.TEXTPDFFONT.subtitleFont, this.TEXTPDFFONT.subtitleFontStyle, subtitleSizes.fontSize, subtitleSizes.marginLeft +
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
if (options.showProjection === true || options.showScale === true) {
|
|
96
|
-
this.addProjScale(doc, map, resolution, options.showProjection, options.showScale);
|
|
87
|
+
this.addTextInPdfDoc(doc, options.subtitle, this.TEXTPDFFONT.subtitleFont, this.TEXTPDFFONT.subtitleFontStyle, subtitleSizes.fontSize, subtitleSizes.marginLeft + baseMargins[3], baseMargins[0]);
|
|
88
|
+
baseMargins[0] += 5; // cumulative marg top for next elem to place in pdf doc. 5 is a fix it could be adjust
|
|
97
89
|
}
|
|
90
|
+
const verticalSpacing = 5;
|
|
98
91
|
if (options.comment !== undefined && options.comment !== '') {
|
|
99
|
-
this.addComment(doc, options.comment);
|
|
92
|
+
this.addComment(doc, options.comment, baseMargins, verticalSpacing);
|
|
100
93
|
}
|
|
101
|
-
|
|
94
|
+
if (options.showProjection === true || options.showScale === true) {
|
|
95
|
+
this.addProjScale(doc, map, resolution, options.showProjection, options.showScale, baseMargins, verticalSpacing);
|
|
96
|
+
}
|
|
97
|
+
const width = pageWidth - baseMargins[3] - baseMargins[1];
|
|
98
|
+
const height = pageHeight - baseMargins[0] - baseMargins[2];
|
|
99
|
+
const size = [width, height];
|
|
100
|
+
this.addMap(doc, map, resolution, size, baseMargins, legendPostion).subscribe(async (status) => {
|
|
102
101
|
if (status === SubjectStatus.Done) {
|
|
103
|
-
await this.handleMeasureLayer(doc, map,
|
|
102
|
+
await this.handleMeasureLayer(doc, map, baseMargins);
|
|
104
103
|
const width = this.imgSizeAdded[0];
|
|
105
104
|
const height = this.imgSizeAdded[1];
|
|
106
|
-
this.addGeoRef(doc, width, height,
|
|
105
|
+
this.addGeoRef(doc, map, width, height, baseMargins);
|
|
107
106
|
if (options.legendPosition !== 'none') {
|
|
108
107
|
if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(options.legendPosition) > -1) {
|
|
109
|
-
await this.addLegendSamePage(doc, map,
|
|
108
|
+
await this.addLegendSamePage(doc, map, baseMargins, resolution, options.legendPosition);
|
|
110
109
|
}
|
|
111
110
|
else if (options.legendPosition === 'newpage') {
|
|
112
|
-
await this.addLegend(doc, map,
|
|
111
|
+
await this.addLegend(doc, map, baseMargins, resolution);
|
|
113
112
|
}
|
|
114
113
|
}
|
|
115
114
|
else {
|
|
@@ -124,12 +123,12 @@ export class PrintService {
|
|
|
124
123
|
return status$;
|
|
125
124
|
}
|
|
126
125
|
// ref GeoMoose https://github.com/geomoose/gm3/tree/main/src/gm3/components/print
|
|
127
|
-
addGeoRef(doc, width, height,
|
|
126
|
+
addGeoRef(doc, map, width, height, baseMargins) {
|
|
128
127
|
const unit = 'mm';
|
|
129
128
|
const docHeight = doc.internal.pageSize.getHeight();
|
|
130
129
|
// x,y = margin left-bottom corner for img in pdf doc
|
|
131
|
-
const x =
|
|
132
|
-
const y = docHeight -
|
|
130
|
+
const x = baseMargins[3];
|
|
131
|
+
const y = docHeight - baseMargins[0] - height;
|
|
133
132
|
let pdf_extents = [x, y, x + width, y + height];
|
|
134
133
|
for (let i = 0; i < pdf_extents.length; i++) {
|
|
135
134
|
pdf_extents[i] = this.pdf_units2points(pdf_extents[i], unit);
|
|
@@ -140,9 +139,9 @@ export class PrintService {
|
|
|
140
139
|
* Add measure overlay on the map on the document when the measure layer is present
|
|
141
140
|
* @param doc - Pdf document where measure tooltip will be added
|
|
142
141
|
* @param map - Map of the app
|
|
143
|
-
* @param
|
|
142
|
+
* @param baseMargins - Page margins
|
|
144
143
|
*/
|
|
145
|
-
async handleMeasureLayer(doc, map,
|
|
144
|
+
async handleMeasureLayer(doc, map, baseMargins) {
|
|
146
145
|
if (map.layers.find((layer) => layer.visible && layer.id.startsWith('igo-measures-'))) {
|
|
147
146
|
let canvasOverlayHTMLMeasures;
|
|
148
147
|
const mapOverlayMeasuresHTML = map.ol.getOverlayContainer();
|
|
@@ -152,7 +151,7 @@ export class PrintService {
|
|
|
152
151
|
}).then((e) => {
|
|
153
152
|
canvasOverlayHTMLMeasures = e;
|
|
154
153
|
});
|
|
155
|
-
this.addCanvas(doc, canvasOverlayHTMLMeasures,
|
|
154
|
+
this.addCanvas(doc, canvasOverlayHTMLMeasures, baseMargins); // this adds measure overlays
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
157
|
/**
|
|
@@ -292,14 +291,19 @@ export class PrintService {
|
|
|
292
291
|
}
|
|
293
292
|
/**
|
|
294
293
|
* Add comment to the document
|
|
295
|
-
*
|
|
296
|
-
*
|
|
294
|
+
* @param doc - pdf document
|
|
295
|
+
* @param comment - Comment to add in the document
|
|
296
|
+
* @param baseMargins - top | right | bottom | left
|
|
297
|
+
* @param verticalSpacing - calculate text position and map height
|
|
297
298
|
*/
|
|
298
|
-
addComment(doc, comment) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
const
|
|
302
|
-
|
|
299
|
+
addComment(doc, comment, baseMargins, verticalSpacing) {
|
|
300
|
+
// calculate map image height
|
|
301
|
+
baseMargins[2] += verticalSpacing;
|
|
302
|
+
const xPosition = baseMargins[3]; //margin left and bottom is fix
|
|
303
|
+
const marginBottom = baseMargins[2];
|
|
304
|
+
// calculate text position Y
|
|
305
|
+
const yPosition = doc.internal.pageSize.height - marginBottom + verticalSpacing;
|
|
306
|
+
this.addTextInPdfDoc(doc, comment, this.TEXTPDFFONT.commentFont, this.TEXTPDFFONT.commentFontStyle, this.TEXTPDFFONT.commentFontSize, xPosition, yPosition, true);
|
|
303
307
|
}
|
|
304
308
|
addTextInPdfDoc(doc, textToAdd, textFont, textFontStyle, textFontSize, textMarginLeft, textMarginTop, isComment = false) {
|
|
305
309
|
doc.setFont(textFont, textFontStyle);
|
|
@@ -316,13 +320,18 @@ export class PrintService {
|
|
|
316
320
|
* @param dpi - DPI resolution of the document
|
|
317
321
|
* @param projection - Bool to indicate if projection need to be added
|
|
318
322
|
* @param scale - Bool to indicate if scale need to be added
|
|
323
|
+
* @param baseMargins - top | right | bottom | left
|
|
324
|
+
* @param verticalSpacing - calculate text position and map height
|
|
319
325
|
*/
|
|
320
|
-
addProjScale(doc, map, dpi, projection, scale) {
|
|
326
|
+
addProjScale(doc, map, dpi, projection, scale, baseMargins, verticalSpacing) {
|
|
327
|
+
// calculate map image height
|
|
328
|
+
baseMargins[2] += verticalSpacing;
|
|
321
329
|
const translate = this.languageService.translate;
|
|
322
330
|
const projScaleSize = 12;
|
|
323
|
-
const
|
|
324
|
-
const marginBottom =
|
|
325
|
-
|
|
331
|
+
const xPosition = baseMargins[3];
|
|
332
|
+
const marginBottom = baseMargins[2];
|
|
333
|
+
// calculate text position Y
|
|
334
|
+
const yPosition = doc.internal.pageSize.height - marginBottom + verticalSpacing;
|
|
326
335
|
let textProjScale = '';
|
|
327
336
|
if (projection === true) {
|
|
328
337
|
const projText = translate.instant('igo.geo.printForm.projection');
|
|
@@ -338,7 +347,7 @@ export class PrintService {
|
|
|
338
347
|
}
|
|
339
348
|
doc.setFont(this.TEXTPDFFONT.commentFont);
|
|
340
349
|
doc.setFontSize(projScaleSize);
|
|
341
|
-
doc.text(textProjScale,
|
|
350
|
+
doc.text(textProjScale, xPosition, yPosition);
|
|
342
351
|
}
|
|
343
352
|
/**
|
|
344
353
|
* Add the legend to the document
|
|
@@ -385,9 +394,9 @@ export class PrintService {
|
|
|
385
394
|
* Add the legend to the document
|
|
386
395
|
* @param doc - Pdf document where legend will be added
|
|
387
396
|
* @param map - Map of the app
|
|
388
|
-
* @param
|
|
397
|
+
* @param baseMargins - Page margins
|
|
389
398
|
*/
|
|
390
|
-
async addLegendSamePage(doc, map,
|
|
399
|
+
async addLegendSamePage(doc, map, baseMargins, resolution, legendPosition) {
|
|
391
400
|
// Get html code for the legend
|
|
392
401
|
const width = doc.internal.pageSize.width;
|
|
393
402
|
const html = await this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
@@ -419,35 +428,35 @@ export class PrintService {
|
|
|
419
428
|
// Move the legend to the correct position on the page
|
|
420
429
|
if (legendPosition === 'bottomright') {
|
|
421
430
|
marginsLegend = [
|
|
422
|
-
doc.internal.pageSize.height -
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
doc.internal.pageSize.width -
|
|
431
|
+
doc.internal.pageSize.height - baseMargins[2] - imageSize[1],
|
|
432
|
+
baseMargins[1],
|
|
433
|
+
baseMargins[2],
|
|
434
|
+
doc.internal.pageSize.width - baseMargins[1] - imageSize[0]
|
|
426
435
|
];
|
|
427
436
|
}
|
|
428
437
|
else if (legendPosition === 'topright') {
|
|
429
438
|
marginsLegend = [
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
doc.internal.pageSize.height -
|
|
433
|
-
doc.internal.pageSize.width -
|
|
439
|
+
baseMargins[0],
|
|
440
|
+
baseMargins[1],
|
|
441
|
+
doc.internal.pageSize.height - baseMargins[0] - imageSize[1],
|
|
442
|
+
doc.internal.pageSize.width - baseMargins[1] - imageSize[0]
|
|
434
443
|
];
|
|
435
444
|
}
|
|
436
445
|
else if (legendPosition === 'bottomleft') {
|
|
437
446
|
// When the legend is in the bottom left, raise the legend slightly upward so that attributions are visible
|
|
438
447
|
marginsLegend = [
|
|
439
|
-
doc.internal.pageSize.height -
|
|
440
|
-
doc.internal.pageSize.width -
|
|
441
|
-
|
|
442
|
-
|
|
448
|
+
doc.internal.pageSize.height - baseMargins[2] - imageSize[1],
|
|
449
|
+
doc.internal.pageSize.width - baseMargins[3] - imageSize[0],
|
|
450
|
+
baseMargins[2],
|
|
451
|
+
baseMargins[3]
|
|
443
452
|
];
|
|
444
453
|
}
|
|
445
454
|
else if (legendPosition === 'topleft') {
|
|
446
455
|
marginsLegend = [
|
|
447
|
-
|
|
448
|
-
doc.internal.pageSize.width -
|
|
449
|
-
doc.internal.pageSize.height -
|
|
450
|
-
|
|
456
|
+
baseMargins[0],
|
|
457
|
+
doc.internal.pageSize.width - baseMargins[3] - imageSize[0],
|
|
458
|
+
doc.internal.pageSize.height - baseMargins[0] - imageSize[1],
|
|
459
|
+
baseMargins[3]
|
|
451
460
|
];
|
|
452
461
|
}
|
|
453
462
|
this.addCanvas(doc, canvas, marginsLegend); // this adds the legend
|
|
@@ -460,7 +469,7 @@ export class PrintService {
|
|
|
460
469
|
timeout(ms) {
|
|
461
470
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
462
471
|
}
|
|
463
|
-
addCanvas(doc, canvas,
|
|
472
|
+
addCanvas(doc, canvas, baseMargins) {
|
|
464
473
|
let image;
|
|
465
474
|
if (canvas) {
|
|
466
475
|
image = canvas.toDataURL('image/png');
|
|
@@ -470,17 +479,17 @@ export class PrintService {
|
|
|
470
479
|
console.log('Warning: An image cannot be print in pdf file');
|
|
471
480
|
return;
|
|
472
481
|
}
|
|
473
|
-
const imageSize = this.getImageSizeToFitPdf(doc, canvas,
|
|
474
|
-
doc.addImage(image, 'PNG',
|
|
475
|
-
doc.rect(
|
|
482
|
+
const imageSize = this.getImageSizeToFitPdf(doc, canvas, baseMargins);
|
|
483
|
+
doc.addImage(image, 'PNG', baseMargins[3], baseMargins[0], imageSize[0], imageSize[1]);
|
|
484
|
+
doc.rect(baseMargins[3], baseMargins[0], imageSize[0], imageSize[1]);
|
|
476
485
|
this.imgSizeAdded = imageSize; // keep img size for georef later
|
|
477
486
|
}
|
|
478
487
|
}
|
|
479
488
|
// TODO fix printing with image resolution
|
|
480
|
-
addMap(doc, map, resolution,
|
|
489
|
+
addMap(doc, map, resolution, imageDimensions, baseMargins, legendPostion) {
|
|
481
490
|
const mapSize = map.ol.getSize();
|
|
482
491
|
const viewResolution = map.ol.getView().getResolution();
|
|
483
|
-
const dimensionPixels = this.setMapResolution(map,
|
|
492
|
+
const dimensionPixels = this.setMapResolution(map, imageDimensions, resolution, viewResolution);
|
|
484
493
|
const status$ = new Subject();
|
|
485
494
|
let timeout;
|
|
486
495
|
map.ol.once('rendercomplete', async (event) => {
|
|
@@ -500,7 +509,7 @@ export class PrintService {
|
|
|
500
509
|
let status = SubjectStatus.Done;
|
|
501
510
|
try {
|
|
502
511
|
if (mapResultCanvas.width !== 0) {
|
|
503
|
-
this.addCanvas(doc, mapResultCanvas,
|
|
512
|
+
this.addCanvas(doc, mapResultCanvas, baseMargins);
|
|
504
513
|
}
|
|
505
514
|
}
|
|
506
515
|
catch (err) {
|
|
@@ -516,7 +525,7 @@ export class PrintService {
|
|
|
516
525
|
let status = SubjectStatus.Done;
|
|
517
526
|
try {
|
|
518
527
|
if (mapResultCanvas.width !== 0) {
|
|
519
|
-
this.addCanvas(doc, mapResultCanvas,
|
|
528
|
+
this.addCanvas(doc, mapResultCanvas, baseMargins);
|
|
520
529
|
}
|
|
521
530
|
}
|
|
522
531
|
catch (err) {
|
|
@@ -942,7 +951,7 @@ export class PrintService {
|
|
|
942
951
|
*/
|
|
943
952
|
getImageSizeToFitPdf(doc, canvas, margins) {
|
|
944
953
|
// Define variable to calculate best size to fit in one page
|
|
945
|
-
const pageHeight = doc.internal.pageSize.getHeight() - (margins[0] + margins[2]
|
|
954
|
+
const pageHeight = doc.internal.pageSize.getHeight() - (margins[0] + margins[2]);
|
|
946
955
|
const pageWidth = doc.internal.pageSize.getWidth() - (margins[1] + margins[3]);
|
|
947
956
|
const canHeight = this.pdf_units2points(canvas.height, 'mm');
|
|
948
957
|
const canWidth = this.pdf_units2points(canvas.width, 'mm');
|
|
@@ -1098,4 +1107,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
|
|
|
1098
1107
|
providedIn: 'root'
|
|
1099
1108
|
}]
|
|
1100
1109
|
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i3.ActivityService }, { type: i4.LanguageService }, { type: i5.ConfigService }] });
|
|
1101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLFlBQVksTUFBTSxVQUFVLENBQUM7QUFFcEMsT0FBTyxFQUVM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LEdBQUcsSUFBSSxDQUFDO2dCQUNkLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ2QsTUFBTTtZQUNSLEtBQUssSUFBSTtnQkFDUCxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNQLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ1osTUFBTTtZQUNSLEtBQUssSUFBSTtnQkFDUCxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNQLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxNQUFNO1lBQ1IsS0FBSyxJQUFJO2dCQUNQLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ04sTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7dUdBejRDVSxZQUFZOzJHQUFaLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNlY3VyZUltYWdlUGlwZSB9IGZyb20gJ0BpZ28yL2NvbW1vbic7XG5pbXBvcnQgeyBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2FjdGl2aXR5JztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9tZXNzYWdlJztcbmltcG9ydCB7IFN1YmplY3RTdGF0dXMgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEpTWmlwIH0gZnJvbSAnanN6aXAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCBhcyByeE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTGVnZW5kTWFwVmlld09wdGlvbnMgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL2xlZ2VuZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0TGF5ZXJzTGVnZW5kcyB9IGZyb20gJy4uLy4uL2xheWVyL3V0aWxzL291dHB1dExlZ2VuZCc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCBHZW9QZGZQbHVnaW4gZnJvbSAnLi9nZW9wZGYnO1xuaW1wb3J0IHsgUHJpbnRPcHRpb25zLCBUZXh0UGRmU2l6ZUFuZE1hcmdpbiB9IGZyb20gJy4vcHJpbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFByaW50TGVnZW5kUG9zaXRpb24sXG4gIFByaW50UGFwZXJGb3JtYXQsXG4gIFByaW50UmVzb2x1dGlvblxufSBmcm9tICcuL3ByaW50LnR5cGUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBOYXZpZ2F0b3Ige1xuICAgIG1zU2F2ZUJsb2I/OiAoYmxvYjogYW55LCBkZWZhdWx0TmFtZT86IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcmludFNlcnZpY2Uge1xuICB6aXBGaWxlOiBKU1ppcDtcbiAgbmJGaWxlVG9Qcm9jZXNzOiBudW1iZXI7XG4gIGFjdGl2aXR5SWQ6IHN0cmluZztcbiAgaW1nU2l6ZUFkZGVkOiBBcnJheTxudW1iZXI+O1xuICBtYXBQcmludEV4dGVudDogQXJyYXk8bnVtYmVyPjtcblxuICBURVhUUERGRk9OVCA9IHtcbiAgICB0aXRsZUZvbnQ6ICdTYW5zIFNlcmlmJyxcbiAgICB0aXRsZUZvbnRTdHlsZTogJ2JvbGQnLFxuICAgIHN1YnRpdGxlRm9udDogJ1NhbnMgU2VyaWYnLFxuICAgIHN1YnRpdGxlRm9udFN0eWxlOiAnYm9sZCcsXG4gICAgY29tbWVudEZvbnQ6ICdTYW5zIFNlcmlmJyxcbiAgICBjb21tZW50Rm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICBjb21tZW50Rm9udFNpemU6IDEyXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZpdHlTZXJ2aWNlOiBBY3Rpdml0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIHByaW50KG1hcDogSWdvTWFwLCBvcHRpb25zOiBQcmludE9wdGlvbnMpOiBTdWJqZWN0PGFueT4ge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IHBhcGVyRm9ybWF0OiBzdHJpbmcgPSBvcHRpb25zLnBhcGVyRm9ybWF0O1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArb3B0aW9ucy5yZXNvbHV0aW9uOyAvLyBEZWZhdWx0IGlzIDk2XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgIGNvbnN0IGxlZ2VuZFBvc3Rpb24gPSBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG5cbiAgICBHZW9QZGZQbHVnaW4oanNQREYuQVBJKTtcblxuICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7XG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGZvcm1hdDogcGFwZXJGb3JtYXQudG9Mb3dlckNhc2UoKSxcbiAgICAgIHVuaXQ6ICdtbScgLy8gZGVmYXVsdFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGltZW5zaW9ucyA9IFtcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCxcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHRcbiAgICBdO1xuXG4gICAgY29uc3QgbWFyZ2lucyA9IFsxMCwgMTAsIDEwLCAxMF07XG4gICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zWzBdIC0gbWFyZ2luc1szXSAtIG1hcmdpbnNbMV07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXSAtIG1hcmdpbnNbMF0gLSBtYXJnaW5zWzJdO1xuICAgIGNvbnN0IHNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbd2lkdGgsIGhlaWdodF07XG4gICAgbGV0IHRpdGxlU2l6ZXM6IFRleHRQZGZTaXplQW5kTWFyZ2luO1xuICAgIGxldCBzdWJ0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcblxuICAgIC8vIGlmIHBhcGVyIGZvcm1hdCBBMSBvciBBMCBhZGQgbWFyZ2luIHRvcFxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnRpdGxlICE9PSAnJyB8fCBvcHRpb25zLnN1YnRpdGxlICE9PSAnJykgJiZcbiAgICAgIChwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMSB8fFxuICAgICAgICBwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMClcbiAgICApIHtcbiAgICAgIG1hcmdpbnNbMF0gKz0gMTA7XG4gICAgfVxuICAgIC8vIFBERiB0aXRsZVxuICAgIGNvbnN0IGZvbnRTaXplSW5QdCA9IE1hdGgucm91bmQoMiAqIChoZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyOyAvL2NhbGN1bGF0ZSB0aGUgZm9udFNpemUgdGl0bGUgZnJvbSB0aGUgcGFnZSBoZWlnaHQuXG4gICAgaWYgKG9wdGlvbnMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnRpdGxlICE9PSAnJykge1xuICAgICAgdGl0bGVTaXplcyA9IHRoaXMuZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKFxuICAgICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgICBtYXJnaW5zLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udCxcbiAgICAgICAgZm9udFNpemVJblB0LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBkb2NcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgICBkb2MsXG4gICAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQudGl0bGVGb250LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICB0aXRsZVNpemVzLmZvbnRTaXplLFxuICAgICAgICB0aXRsZVNpemVzLm1hcmdpbkxlZnQgKyBtYXJnaW5zWzNdLFxuICAgICAgICBtYXJnaW5zWzBdXG4gICAgICApO1xuXG4gICAgICBtYXJnaW5zWzBdID0gdGl0bGVTaXplcy5oZWlnaHQgKyBtYXJnaW5zWzBdOyAvLyBjdW11bGF0aXZlIG1hcmdpbiB0b3AgZm9yIG5leHQgZWxlbSB0byBwbGFjZSBpbiBwZGYgZG9jXG4gICAgfVxuXG4gICAgLy8gUERGIHN1YnRpdGxlXG4gICAgaWYgKG9wdGlvbnMuc3VidGl0bGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN1YnRpdGxlICE9PSAnJykge1xuICAgICAgc3VidGl0bGVTaXplcyA9IHRoaXMuZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKFxuICAgICAgICBvcHRpb25zLnN1YnRpdGxlLFxuICAgICAgICBtYXJnaW5zLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udCxcbiAgICAgICAgb3B0aW9ucy50aXRsZSAhPT0gJycgPyB0aXRsZVNpemVzLmZvbnRTaXplICogMC43IDogZm9udFNpemVJblB0ICogMC43LCAvLyA3MCUgc2l6ZSBvZiB0aXRsZVxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBkb2NcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgICBkb2MsXG4gICAgICAgIG9wdGlvbnMuc3VidGl0bGUsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBzdWJ0aXRsZVNpemVzLmZvbnRTaXplLFxuICAgICAgICBzdWJ0aXRsZVNpemVzLm1hcmdpbkxlZnQgKyBtYXJnaW5zWzNdLFxuICAgICAgICBtYXJnaW5zWzBdXG4gICAgICApO1xuXG4gICAgICBtYXJnaW5zWzBdICs9IDU7IC8vIGN1bXVsYXRpdmUgbWFyZyB0b3AgZm9yIG5leHQgZWxlbSB0byBwbGFjZSBpbiBwZGYgZG9jLiA1IGlzIGEgZml4IGl0IGNvdWxkIGJlIGFkanVzdFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dQcm9qZWN0aW9uID09PSB0cnVlIHx8IG9wdGlvbnMuc2hvd1NjYWxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmFkZFByb2pTY2FsZShcbiAgICAgICAgZG9jLFxuICAgICAgICBtYXAsXG4gICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1Byb2plY3Rpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1NjYWxlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5jb21tZW50ICE9PSAnJykge1xuICAgICAgdGhpcy5hZGRDb21tZW50KGRvYywgb3B0aW9ucy5jb21tZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZE1hcChkb2MsIG1hcCwgcmVzb2x1dGlvbiwgc2l6ZSwgbWFyZ2lucywgbGVnZW5kUG9zdGlvbikuc3Vic2NyaWJlKFxuICAgICAgYXN5bmMgKHN0YXR1czogU3ViamVjdFN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgbWFyZ2lucyk7XG5cbiAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaW1nU2l6ZUFkZGVkWzBdO1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaW1nU2l6ZUFkZGVkWzFdO1xuXG4gICAgICAgICAgdGhpcy5hZGRHZW9SZWYoZG9jLCB3aWR0aCwgaGVpZ2h0LCBtYXJnaW5zKTtcblxuICAgICAgICAgIGlmIChvcHRpb25zLmxlZ2VuZFBvc2l0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgWyd0b3BsZWZ0JywgJ3RvcHJpZ2h0JywgJ2JvdHRvbWxlZnQnLCAnYm90dG9tcmlnaHQnXS5pbmRleE9mKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMubGVnZW5kUG9zaXRpb25cbiAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRMZWdlbmRTYW1lUGFnZShcbiAgICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgICAgIG1hcmdpbnMsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZChkb2MsIG1hcCwgbWFyZ2lucywgcmVzb2x1dGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRG9uZSB8fCBzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XG4gICAgICAgICAgc3RhdHVzJC5uZXh0KFN1YmplY3RTdGF0dXMuRG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cbiAgLy8gcmVmIEdlb01vb3NlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZW9tb29zZS9nbTMvdHJlZS9tYWluL3NyYy9nbTMvY29tcG9uZW50cy9wcmludFxuICBhZGRHZW9SZWYoZG9jLCB3aWR0aCwgaGVpZ2h0LCBtYXJnaW5zKSB7XG4gICAgY29uc3QgdW5pdCA9ICdtbSc7XG4gICAgY29uc3QgZG9jSGVpZ2h0ID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpO1xuXG4gICAgLy8geCx5ID0gbWFyZ2luIGxlZnQtYm90dG9tIGNvcm5lciBmb3IgaW1nIGluIHBkZiBkb2NcbiAgICBjb25zdCB4ID0gbWFyZ2luc1szXTtcbiAgICBjb25zdCB5ID0gZG9jSGVpZ2h0IC0gbWFyZ2luc1swXSAtIGhlaWdodDtcblxuICAgIGxldCBwZGZfZXh0ZW50cyA9IFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGRmX2V4dGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBkZl9leHRlbnRzW2ldID0gdGhpcy5wZGZfdW5pdHMycG9pbnRzKHBkZl9leHRlbnRzW2ldLCB1bml0KTtcbiAgICB9XG4gICAgZG9jLnNldEdlb0FyZWEocGRmX2V4dGVudHMsIHRoaXMubWFwUHJpbnRFeHRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtZWFzdXJlIG92ZXJsYXkgb24gdGhlIG1hcCBvbiB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgbWVhc3VyZSBsYXllciBpcyBwcmVzZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIG1lYXN1cmUgdG9vbHRpcCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZU1lYXN1cmVMYXllcihcbiAgICBkb2M6IGpzUERGLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgbWFwLmxheWVycy5maW5kKFxuICAgICAgICAobGF5ZXIpID0+IGxheWVyLnZpc2libGUgJiYgbGF5ZXIuaWQuc3RhcnRzV2l0aCgnaWdvLW1lYXN1cmVzLScpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsZXQgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcztcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgICAgYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheU1lYXN1cmVzSFRNTCwge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXG4gICAgICB9KS50aGVuKChlKSA9PiB7XG4gICAgICAgIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMgPSBlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMsIG1hcmdpbnMpOyAvLyB0aGlzIGFkZHMgbWVhc3VyZSBvdmVybGF5c1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaHRtbCBjb2RlIGZvciBhbGwgbGF5ZXJzIGxlZ2VuZFxuICAgKiBAcGFyYW0gIG1hcCBJZ29NYXBcbiAgICogQHBhcmFtICB3aWR0aCBUaGUgd2lkdGggdGhhdCB0aGUgbGVnZW5kIG5lZWQgdG8gYmVcbiAgICogQHJldHVybiBIdG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcbiAgICovXG4gIGdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgY29uc3QgbGVnZW5kcyA9IGdldExheWVyc0xlZ2VuZHMobWFwLmxheWVycywge1xuICAgICAgICByZXNvbHV0aW9uOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpLFxuICAgICAgICBleHRlbnQ6IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKSxcbiAgICAgICAgcHJvamVjdGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldE9sUHJvamVjdGlvbigpLmdldENvZGUoKSxcbiAgICAgICAgLy8gc2NhbGU6IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShyZXNvbHV0aW9uKSxcbiAgICAgICAgc2l6ZTogbWFwLm9sLmdldFNpemUoKVxuICAgICAgfSBhcyBMZWdlbmRNYXBWaWV3T3B0aW9ucyk7XG5cbiAgICAgIGlmIChsZWdlbmRzLmZpbHRlcigobCkgPT4gbC5kaXNwbGF5ID09PSB0cnVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChodG1sKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGVmaW5lIGltcG9ydGFudCBzdHlsZSB0byBiZSBzdXJlIHRoYXQgYWxsIGNvbnRhaW5lciBpcyBjb252ZXJ0XG4gICAgICAvLyB0byBpbWFnZSBub3QganVzdCB2aXNpYmxlIHBhcnRcbiAgICAgIGh0bWwgKz0gJzxzdHlsZSBtZWRpYT1cInNjcmVlblwiIHR5cGU9XCJ0ZXh0L2Nzc1wiPic7XG4gICAgICBodG1sICs9XG4gICAgICAgICcuaHRtbDJjYW52YXMtY29udGFpbmVyIHsgd2lkdGg6ICcgK1xuICAgICAgICB3aWR0aCArXG4gICAgICAgICdtbSAhaW1wb3J0YW50OyBoZWlnaHQ6IDIwMDBweCAhaW1wb3J0YW50OyB9JztcbiAgICAgIGh0bWwgKz0gJ3RhYmxlLnRhYmxlTGVnZW5kIHt0YWJsZS1sYXlvdXQ6IGF1dG87fSc7XG4gICAgICBodG1sICs9XG4gICAgICAgICdkaXYuc3R5bGVMZWdlbmQge3BhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6NXB4O3BhZGRpbmctbGVmdDo1cHg7cGFkZGluZy1ib3R0b206NXB4O30nO1xuICAgICAgaHRtbCArPSAnPC9zdHlsZT4nO1xuICAgICAgLy8gVGhlIGZvbnQgc2l6ZSB3aWxsIGFsc28gYmUgbG93ZXJlZCBhZnRlcndhcmRzIChnbG9iYWxseSBhbG9uZyB0aGUgbGVnZW5kIHNpemUpXG4gICAgICAvLyB0aGlzIGFsbG93cyBoYXZpbmcgYSBnb29kIHJlbGF0aXZlIGZvbnQgc2l6ZSBoZXJlIGFuZCB0byBrZWVwIGFqdXN0aW5nIHRoZSBsZWdlbmQgc2l6ZVxuICAgICAgLy8gd2hpbGUga2VlcGluZyBnb29kIHJlbGF0aXZlIGZvbnQgc2l6ZVxuICAgICAgaHRtbCArPSAnPGZvbnQgc2l6ZT1cIjNcIiBmYWNlPVwiVGltZXNcIiA+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzdHlsZUxlZ2VuZFwiPic7XG4gICAgICBodG1sICs9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZUxlZ2VuZFwiID4nO1xuXG4gICAgICAvLyBGb3IgZWFjaCBsZWdlbmQsIGRlZmluZSBhbiBodG1sIHRhYmxlIGNlbGxcbiAgICAgIGNvbnN0IGltYWdlcyQgPSBsZWdlbmRzXG4gICAgICAgIC5maWx0ZXIoKGwpID0+IGwuZGlzcGxheSAmJiBsLmlzSW5SZXNvbHV0aW9uc1JhbmdlID09PSB0cnVlKVxuICAgICAgICAubWFwKChsZWdlbmQpID0+XG4gICAgICAgICAgdGhpcy5nZXREYXRhSW1hZ2UobGVnZW5kLnVybCkucGlwZShcbiAgICAgICAgICAgIHJ4TWFwKChkYXRhSW1hZ2UpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGh0bWxJbWcgPVxuICAgICAgICAgICAgICAgICc8dHI+PHRkPicgKyBsZWdlbmQudGl0bGUudG9VcHBlckNhc2UoKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgICAgICAgaHRtbEltZyArPSAnPHRyPjx0ZD48aW1nIHNyYz1cIicgKyBkYXRhSW1hZ2UgKyAnXCI+PC90ZD48L3RyPic7XG4gICAgICAgICAgICAgIHJldHVybiBodG1sSW1nO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICBmb3JrSm9pbihpbWFnZXMkKS5zdWJzY3JpYmUoKGRhdGFJbWFnZXMpID0+IHtcbiAgICAgICAgaHRtbCA9IGRhdGFJbWFnZXMucmVkdWNlKChhY2MsIGN1cnJlbnQpID0+IChhY2MgKz0gY3VycmVudCksIGh0bWwpO1xuICAgICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldERhdGFJbWFnZSh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qgc2VjdXJlSU1HID0gbmV3IFNlY3VyZUltYWdlUGlwZSh0aGlzLmh0dHAsIHRoaXMuY29uZmlnU2VydmljZSk7XG4gICAgcmV0dXJuIHNlY3VyZUlNRy50cmFuc2Zvcm0odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBsZWdlbmQgaW4gYSBzaW5nbGUgaW1hZ2VcbiAgICogKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBsZWdlbmRcbiAgICovXG4gIGFzeW5jIGdldExheWVyc0xlZ2VuZEltYWdlKFxuICAgIG1hcCxcbiAgICBmb3JtYXQ6IHN0cmluZyA9ICdwbmcnLFxuICAgIGRvWmlwRmlsZTogYm9vbGVhbixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gMjAwOyAvLyBtaWxpbWV0ZXJzIHVuaXQsIG9yaWdpbmFsbHkgZGVmaW5lIGZvciBkb2N1bWVudCBwZGZcbiAgICBsZXQgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgZm9ybWF0ID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBJZiBubyBsZWdlbmQgc2hvdyBObyBMRUdFTkQgaW4gYW4gaW1hZ2VcbiAgICBpZiAoaHRtbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGh0bWwgPSAnPGZvbnQgc2l6ZT1cIjEyXCIgZmFjZT1cIkNvdXJpZXIgTmV3XCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGFsaWduPVwiY2VudGVyXCI+PGI+Tk8gTEVHRU5EPC9iPjwvZGl2Pic7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGxldCBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkRvbmU7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xuICAgICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCAnbGVnZW5kSW1hZ2UnLCBmb3JtYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsICdsZWdlbmRJbWFnZScgKyAnLicgKyBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgIH1cbiAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVIdG1sRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgfVxuXG4gIGdldFRleHRQZGZPYmplY3RTaXplQW5kTWFyZyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgbWFyZ2lucyxcbiAgICBmb250OiBzdHJpbmcsXG4gICAgZm9udFNpemVJblB0OiBudW1iZXIsXG4gICAgZm9udFN0eWxlOiBzdHJpbmcsXG4gICAgZG9jOiBqc1BERlxuICApOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbiB7XG4gICAgY29uc3QgcGRmUmVzb2x1dGlvbiA9IDk2O1xuICAgIGNvbnN0IGRvY1dpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XG4gICAgY29uc3QgcGFnZVdpZHRoID0gZG9jV2lkdGggLSBtYXJnaW5zWzFdIC0gbWFyZ2luc1szXTtcblxuICAgIC8vIGltcG9ydGFudCB0byBzZXQgaXQgZmlyc3QsIHRoZSB0ZXh0RGltZW5zaW9uIGNoYW5nZSB3aGVuIGZvbnQgY2hhbmdlIVxuICAgIGRvYy5zZXRGb250KGZvbnQsIGZvbnRTdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplSW5QdCk7XG5cbiAgICBsZXQgdGV4dERpbWVuc2lvbnMgPSBkb2MuZ2V0VGV4dERpbWVuc2lvbnModGV4dCk7XG4gICAgbGV0IHRleHRNYXJnaW5MZWZ0OiBudW1iZXI7XG5cbiAgICBpZiAodGV4dERpbWVuc2lvbnMudyA+IHBhZ2VXaWR0aCkge1xuICAgICAgLy8gaWYgdGhlIHRleHQgaXMgdG8gbG9uZywgcmVkdWNlIGZvbnRTaXplIDcwJSBhbmQgdGhlIG92ZXJmbG93IHdpdGggYmUgY3V0IGluIHByaW50Li4uXG4gICAgICB0ZXh0TWFyZ2luTGVmdCA9IDA7XG4gICAgICBmb250U2l6ZUluUHQgPSBmb250U2l6ZUluUHQgKiAwLjc7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoZm9udFNpemVJblB0KTtcbiAgICAgIHRleHREaW1lbnNpb25zID0gZG9jLmdldFRleHREaW1lbnNpb25zKHRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0TWFyZ2luTGVmdCA9IChwYWdlV2lkdGggLSB0ZXh0RGltZW5zaW9ucy53KSAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvbnRTaXplOiBmb250U2l6ZUluUHQsXG4gICAgICBtYXJnaW5MZWZ0OiB0ZXh0TWFyZ2luTGVmdCxcbiAgICAgIGhlaWdodDogdGV4dERpbWVuc2lvbnMuaFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNvbW1lbnQgdG8gdGhlIGRvY3VtZW50XG4gICAqICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBpbiB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByaXZhdGUgYWRkQ29tbWVudChkb2M6IGpzUERGLCBjb21tZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb21tZW50TWFyZ2luTGVmdCA9IDEwOyAvL21hcmdpbiBsZWZ0IGFuZCBib3R0b20gaXMgZml4XG4gICAgY29uc3QgY29tbWVudE1hcmdpbkJvdHRvbSA9IDEwO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBjb21tZW50TWFyZ2luQm90dG9tO1xuICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgZG9jLFxuICAgICAgY29tbWVudCxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnQsXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250U3R5bGUsXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250U2l6ZSxcbiAgICAgIGNvbW1lbnRNYXJnaW5MZWZ0LFxuICAgICAgbWFyZ2luVG9wLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRleHRJblBkZkRvYyhcbiAgICBkb2M6IGpzUERGLFxuICAgIHRleHRUb0FkZDogc3RyaW5nLFxuICAgIHRleHRGb250OiBzdHJpbmcsXG4gICAgdGV4dEZvbnRTdHlsZTogc3RyaW5nLFxuICAgIHRleHRGb250U2l6ZTogbnVtYmVyLFxuICAgIHRleHRNYXJnaW5MZWZ0OiBudW1iZXIsXG4gICAgdGV4dE1hcmdpblRvcDogbnVtYmVyLFxuICAgIGlzQ29tbWVudDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRvYy5zZXRGb250KHRleHRGb250LCB0ZXh0Rm9udFN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUodGV4dEZvbnRTaXplKTtcblxuICAgIGlmIChpc0NvbW1lbnQpIHtcbiAgICAgIHRleHRUb0FkZCA9IGRvYy5zcGxpdFRleHRUb1NpemUoXG4gICAgICAgIHRleHRUb0FkZCxcbiAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSB0ZXh0TWFyZ2luTGVmdCAqIDNcbiAgICAgICk7XG4gICAgfVxuICAgIGRvYy50ZXh0KHRleHRUb0FkZCwgdGV4dE1hcmdpbkxlZnQsIHRleHRNYXJnaW5Ub3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBwcm9qZWN0aW9uIGFuZC9vciBzY2FsZSB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGRwaSAtIERQSSByZXNvbHV0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgKiBAcGFyYW0gIHByb2plY3Rpb24gLSBCb29sIHRvIGluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIHNjYWxlIC0gQm9vbCB0byBpbmRpY2F0ZSBpZiBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkXG4gICAqL1xuICBwcml2YXRlIGFkZFByb2pTY2FsZShcbiAgICBkb2M6IGpzUERGLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGRwaTogbnVtYmVyLFxuICAgIHByb2plY3Rpb246IGJvb2xlYW4sXG4gICAgc2NhbGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGNvbnN0IHByb2pTY2FsZVNpemUgPSAxMjtcbiAgICBjb25zdCBwcm9qU2NhbGVNYXJnaW5MZWZ0ID0gMTA7XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gMTU7XG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbkJvdHRvbTtcblxuICAgIGxldCB0ZXh0UHJvalNjYWxlOiBzdHJpbmcgPSAnJztcbiAgICBpZiAocHJvamVjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHJvalRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0ucHJvamVjdGlvbicpO1xuICAgICAgdGV4dFByb2pTY2FsZSArPSBwcm9qVGV4dCArICc6ICcgKyBtYXAucHJvamVjdGlvbjtcbiAgICB9XG4gICAgaWYgKHNjYWxlID09PSB0cnVlKSB7XG4gICAgICBpZiAocHJvamVjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICB0ZXh0UHJvalNjYWxlICs9ICcgICAnO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NhbGVUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnNjYWxlJyk7XG4gICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShkcGkpO1xuICAgICAgdGV4dFByb2pTY2FsZSArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xuICAgIH1cbiAgICBkb2Muc2V0Rm9udCh0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250KTtcbiAgICBkb2Muc2V0Rm9udFNpemUocHJvalNjYWxlU2l6ZSk7XG4gICAgZG9jLnRleHQodGV4dFByb2pTY2FsZSwgcHJvalNjYWxlTWFyZ2luTGVmdCwgaGVpZ2h0UGl4ZWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGNvbnN0IHBvdXJjZW50YWdlUmVkdWN0aW9uID0gMC44NTtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtcbiAgICAgICAgKHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMud2lkdGgpKSAvIHJlc29sdXRpb24sXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLmhlaWdodCkpIC8gcmVzb2x1dGlvblxuICAgICAgXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFNhbWVQYWdlKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZ1xuICApIHtcbiAgICAvLyBHZXQgaHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcbiAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBsZXQgbWFyZ2luc0xlZ2VuZDtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSkgLyByZXNvbHV0aW9uLFxuICAgICAgICAocG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy5oZWlnaHQpKSAvIHJlc29sdXRpb25cbiAgICAgIF07XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIG1hcmdpbnNbMV0sXG4gICAgICAgICAgbWFyZ2luc1syXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBtYXJnaW5zWzFdIC0gaW1hZ2VTaXplWzBdXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wcmlnaHQnKSB7XG4gICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbXG4gICAgICAgICAgbWFyZ2luc1swXSxcbiAgICAgICAgICBtYXJnaW5zWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzBdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbMV0gLSBpbWFnZVNpemVbMF1cbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICAvLyBXaGVuIHRoZSBsZWdlbmQgaXMgaW4gdGhlIGJvdHRvbSBsZWZ0LCByYWlzZSB0aGUgbGVnZW5kIHNsaWdodGx5IHVwd2FyZCBzbyB0aGF0IGF0dHJpYnV0aW9ucyBhcmUgdmlzaWJsZVxuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdIC0gMTUsXG4gICAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoIC0gbWFyZ2luc1szXSAtIGltYWdlU2l6ZVswXSxcbiAgICAgICAgICBtYXJnaW5zWzJdICsgMTUsXG4gICAgICAgICAgbWFyZ2luc1szXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcGxlZnQnKSB7XG4gICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbXG4gICAgICAgICAgbWFyZ2luc1swXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBtYXJnaW5zWzNdIC0gaW1hZ2VTaXplWzBdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzBdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIG1hcmdpbnNbM11cbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zTGVnZW5kKTsgLy8gdGhpcyBhZGRzIHRoZSBsZWdlbmRcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgIH1cbiAgfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc1BERixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgbGV0IGltYWdlO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbWFnZS5sZW5ndGggPCAyMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnV2FybmluZzogQW4gaW1hZ2UgY2Fubm90IGJlIHByaW50IGluIHBkZiBmaWxlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IHRoaXMuZ2V0SW1hZ2VTaXplVG9GaXRQZGYoZG9jLCBjYW52YXMsIG1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIG1hcmdpbnNbM10sXG4gICAgICAgIG1hcmdpbnNbMF0sXG4gICAgICAgIGltYWdlU2l6ZVswXSxcbiAgICAgICAgaW1hZ2VTaXplWzFdXG4gICAgICApO1xuXG4gICAgICBkb2MucmVjdChtYXJnaW5zWzNdLCBtYXJnaW5zWzBdLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG5cbiAgICAgIHRoaXMuaW1nU2l6ZUFkZGVkID0gaW1hZ2VTaXplOyAvLyBrZWVwIGltZyBzaXplIGZvciBnZW9yZWYgbGF0ZXJcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIGZpeCBwcmludGluZyB3aXRoIGltYWdlIHJlc29sdXRpb25cbiAgYWRkTWFwKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGRvY1NpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICBsZWdlbmRQb3N0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uXG4gICkge1xuICAgIGNvbnN0IG1hcFNpemUgPSBtYXAub2wuZ2V0U2l6ZSgpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgY29uc3Qgdmlld1Jlc29sdXRpb24gPSBtYXAub2wuZ2V0VmlldygpLmdldFJlc29sdXRpb24oKTtcbiAgICBjb25zdCBkaW1lbnNpb25QaXhlbHMgPSB0aGlzLnNldE1hcFJlc29sdXRpb24oXG4gICAgICBtYXAsXG4gICAgICBkb2NTaXplLFxuICAgICAgcmVzb2x1dGlvbixcbiAgICAgIHZpZXdSZXNvbHV0aW9uXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGxldCB0aW1lb3V0O1xuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGF3YWl0IHRoaXMuZHJhd01hcChkaW1lbnNpb25QaXhlbHMsIG1hcENhbnZhcyk7XG4gICAgICB0aGlzLm1hcFByaW50RXh0ZW50ID0gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgnRVBTRzozODU3Jyk7XG5cbiAgICAgIHRoaXMucmVzZXRPcmlnaW5hbE1hcFNpemUobWFwLCBtYXBTaXplLCB2aWV3UmVzb2x1dGlvbik7XG5cbiAgICAgIGF3YWl0IHRoaXMuZHJhd01hcENvbnRyb2xzKG1hcCwgbWFwUmVzdWx0Q2FudmFzLCBsZWdlbmRQb3N0aW9uKTtcblxuICAgICAgY29uc3QgbWFwU3RhdHVzJCQgPSBtYXAuc3RhdHVzJC5zdWJzY3JpYmUoKG1hcFN0YXR1czogU3ViamVjdFN0YXR1cykgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChtYXBTdGF0dXMgIT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBtYXBTdGF0dXMkJC51bnN1YnNjcmliZSgpO1xuICAgICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtYXBSZXN1bHRDYW52YXMud2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgbWFwUmVzdWx0Q2FudmFzLCBtYXJnaW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIG5vIGxvYWRpbmcgYXMgc3RhcnRlZCBhZnRlciAyMDBtcywgdGhlbiBwcm9iYWJseSBubyBsb2FkaW5nXG4gICAgICAvLyBpcyByZXF1aXJlZC5cbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG1hcFN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWFwUmVzdWx0Q2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIG1hcFJlc3VsdENhbnZhcywgbWFyZ2lucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuICAgICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWFwUmVzb2x1dGlvbihcbiAgICBtYXA6IElnb01hcCxcbiAgICBpbml0aWFsU2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKTtcbiAgICBjb25zdCB3aWR0aFBpeGVscyA9IE1hdGgucm91bmQoKGluaXRpYWxTaXplWzBdICogcmVzb2x1dGlvbikgLyAyNS40KTtcbiAgICBjb25zdCBoZWlnaHRQaXhlbHMgPSBNYXRoLnJvdW5kKChpbml0aWFsU2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG5cbiAgICAvLyBTZXQgcHJpbnQgc2l6ZVxuICAgIGNvbnN0IHByaW50U2l6ZSA9IFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgICBtYXAub2wuc2V0U2l6ZShwcmludFNpemUpO1xuICAgIGNvbnN0IHNjYWxpbmcgPSBNYXRoLm1pbihcbiAgICAgIHdpZHRoUGl4ZWxzIC8gbWFwU2l6ZVswXSxcbiAgICAgIGhlaWdodFBpeGVscyAvIG1hcFNpemVbMV1cbiAgICApO1xuICAgIG1hcC5vbC5nZXRWaWV3KCkuc2V0UmVzb2x1dGlvbih2aWV3UmVzb2x1dGlvbiAvIHNjYWxpbmcpO1xuXG4gICAgcmV0dXJuIFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRPcmlnaW5hbE1hcFNpemUoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApIHtcbiAgICBtYXAub2wuc2V0U2l6ZShpbml0aWFsU2l6ZSk7XG4gICAgbWFwLm9sLmdldFZpZXcoKS5zZXRSZXNvbHV0aW9uKHZpZXdSZXNvbHV0aW9uKTtcbiAgICBtYXAub2wudXBkYXRlU2l6ZSgpO1xuICAgIG1hcC5vbC5yZW5kZXJTeW5jKCk7XG4gIH1cblxuICBhc3luYyBkcmF3TWFwKFxuICAgIHNpemU6IEFycmF5PG51bWJlcj4sXG4gICAgbWFwQ2FudmFzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PlxuICApOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgbWFwUmVzdWx0Q2FudmFzLndpZHRoID0gc2l6ZVswXTtcbiAgICBtYXBSZXN1bHRDYW52YXMuaGVpZ2h0ID0gc2l6ZVsxXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXBDYW52YXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBtYXBDYW52YXNbaW5kZXhdO1xuICAgICAgaWYgKGNhbnZhcy53aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDYW52YXMoY2FudmFzLCBtYXBSZXN1bHRDYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Q2FudmFzO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXMoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXBSZXN1bHRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gICkge1xuICAgIGNvbnN0IG1hcENvbnRleHRSZXN1bHQgPSBtYXBSZXN1bHRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUub3BhY2l0eSB8fCBjYW52YXMuc3R5bGUub3BhY2l0eTtcbiAgICBtYXBDb250ZXh0UmVzdWx0Lmdsb2JhbEFscGhhID0gb3BhY2l0eSA9PT0gJycgPyAxIDogTnVtYmVyKG9wYWNpdHkpO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNhbnZhcy5zdHlsZS50cmFuc2Zvcm07XG4gICAgbGV0IG1hdHJpeDogbnVtYmVyW107XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm0gcGFyYW1ldGVycyBmcm9tIHRoZSBzdHlsZSdzIHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybVxuICAgICAgICAubWF0Y2goL15tYXRyaXhcXCgoW15cXChdKilcXCkkLylbMV1cbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChOdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRyaXggPSBbXG4gICAgICAgIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSAvIGNhbnZhcy53aWR0aCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSAvIGNhbnZhcy5oZWlnaHQsXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIF07XG4gICAgfVxuICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc2V0VHJhbnNmb3JtLmFwcGx5KFxuICAgICAgbWFwQ29udGV4dFJlc3VsdCxcbiAgICAgIG1hdHJpeFxuICAgICk7XG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIG1hcENvbnRleHRSZXN1bHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgbWFwQ29udGV4dFJlc3VsdC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgICBtYXBDb250ZXh0UmVzdWx0LmRyYXdJbWFnZShjYW52YXMsIDAsIDApO1xuICAgIG1hcENvbnRleHRSZXN1bHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgIC8vIHJlc2V0IGNhbnZhcyB0cmFuc2Zvcm0gdG8gaW5pdGlhbFxuICAgIG1hcENvbnRleHRSZXN1bHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICB9XG5cbiAgYXN5bmMgZHJhd01hcENvbnRyb2xzKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIEdldCB0aGUgc2NhbGUgYW5kIGF0dHJpYnV0aW9uXG4gICAgLy8gd2UgdXNlIGNsb25lTm9kZSB0byBtb2RpZnkgdGhlIG5vZGVzIHRvIHByaW50IHdpdGhvdXQgbW9kaWZ5aW5nIGl0IG9uIHRoZSBwYWdlLCB1c2luZyBkZWVwOnRydWUgdG8gZ2V0IGNoaWxkcmVuXG4gICAgY29uc3QgbWFwT3ZlcmxheUhUTUwgPSBtYXAub2xcbiAgICAgIC5nZXRPdmVybGF5Q29udGFpbmVyU3RvcEV2ZW50KClcbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gYWRkIE5vcnRoIERpcmVjdGlvbiB0byBtYXBPdmVybHlcbiAgICBhd2FpdCB0aGlzLmFkZE5vcnRoRGlyZWN0aW9uKG1hcE92ZXJsYXlIVE1MLCBwb3NpdGlvbik7XG4gICAgLy8gYWRkIG1hcCBBdHRyaWJ1dGlvbiBkZXNpZ25lIHRvIHByaW50XG4gICAgYXdhaXQgdGhpcy5hZGRBdHRyaWJ1dGlvbihtYXBPdmVybGF5SFRNTCk7XG5cbiAgICAvLyBzZXQgJ092ZXJsYXlDb250YWluZXInIHNpemUgdG8gcHJpbnQgc2l6ZVxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLndpZHRoID0gY2FudmFzLndpZHRoICsgJ3B4JztcbiAgICBtYXBPdmVybGF5SFRNTC5zdHlsZS5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAvLyB3ZSBhZGQgemluZGV4IC0xIHRvIG5vdCBzaG93IG1vZGlmaWNhdGlvbiB0byB0aGUgdXNlclxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gYW5kIG1ha2Ugc3VyZSBodG1sMmNhbnZhcyB0byByZW5kZXIgdGhlIGltYWdlIGNvcnJlY3RseVxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnb2wtdmlld3BvcnQnKVswXVxuICAgICAgLmFwcGVuZENoaWxkKG1hcE92ZXJsYXlIVE1MKTtcbiAgICAvLyBDaGFuZ2UgdGhlIHN0eWxlcyBvZiBoeXBlcmxpbmsgaW4gdGhlIHByaW50ZWQgdmVyc2lvblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgT3ZlcmxheSBpbnRvIGEgY2FudmFzXG4gICAgLy8gc2NhbGUgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgaW4gZ29vZ2xlIGNocm9tZVxuICAgIC8vIGJhY2tncm91bmQgYXMgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyB3aGl0ZSBhbmQgY292ZXIgdGhlIG1hcFxuICAgIC8vIGFsbG93dGFpbnQgaXMgdG8gYWxsb3cgcmVuZGVyaW5nIGltYWdlcyBpbiB0aGUgYXR0cmlidXRpb25zXG4gICAgLy8gdXNlQ09SUzogdHJ1ZSBwb3VyIHBlcm1ldHRyZSBkZSByZW5kZXJlciBsZXMgaW1hZ2VzIChuZSBtYXJjaGUgcGFzIGVuIGxvY2FsKVxuICAgIGNvbnN0IGNhbnZhc092ZXJsYXlIVE1MID0gYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheUhUTUwsIHtcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgYWxsb3dUYWludDogdHJ1ZSxcbiAgICAgIHVzZUNPUlM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjYW52YXNPdmVybGF5SFRNTC53aWR0aCAhPT0gMCAmJiBjYW52YXNPdmVybGF5SFRNTC5oZWlnaHQgIT09IDApIHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGNhbnZhc092ZXJsYXlIVE1MLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ21hcE92ZXJsYXlIVE1MJyBhZnRlciBnZW5lcmF0aW5nIGNhbnZhc1xuICAgIG1hcE92ZXJsYXlIVE1MLnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGROb3J0aERpcmVjdGlvbihcbiAgICBtYXBPdmVybGF5SFRNTDogSFRNTEVsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ydGhEaXJlY3Rpb24gPSBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZ28tcm90YXRpb24tYnV0dG9uJylbMF1cbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgSFRNTEJ1dHRvbiA9IG5vcnRoRGlyZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgJ2J1dHRvbidcbiAgICApWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGluIGNhc2UgbGVnZW5kIHBvc2l0aW9uIGlzIHRvcHJpZ2h0XG4gICAgLy8gd2UgY2hhbmdlIHJvdGF0ZSBidG4gdG8gdG9wbGVmdFxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgbm9ydGhEaXJlY3Rpb24uc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgICBub3J0aERpcmVjdGlvbi5zdHlsZS5sZWZ0ID0gJzEwcHgnO1xuICAgIH1cbiAgICBIVE1MQnV0dG9uLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgSFRNTEJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMDAwJztcbiAgICBtYXBPdmVybGF5SFRNTC5hcHBlbmRDaGlsZChub3J0aERpcmVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEF0dHJpYnV0aW9uKG1hcE92ZXJsYXlIVE1MOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEhUTUxhdHRyaWJ1dGlvbiA9XG4gICAgICBtYXBPdmVybGF5SFRNTC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdvbC1hdHRyaWJ1dGlvbicpWzBdO1xuICAgIGNvbnN0IEhUTUxCdXR0b24gPSBIVE1MYXR0cmlidXRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpWzBdO1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIEhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XG4gICAgY29uc3Qgb2xDb2xsYXBzZWQ6IGJvb2xlYW4gPVxuICAgICAgSFRNTGF0dHJpYnV0aW9uLmNsYXNzTGlzdC5jb250YWlucygnb2wtY29sbGFwc2VkJyk7XG4gICAgaWYgKG9sQ29sbGFwc2VkKSB7XG4gICAgICBIVE1MYXR0cmlidXRpb24uY2xhc3NMaXN0LnJlbW92ZSgnb2wtY29sbGFwc2VkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcHJpbnRSZXNvbHV0aW9uOiBQcmludFJlc29sdXRpb24sXG4gICAgZm9ybWF0ID0gJ3BuZycsXG4gICAgcHJvamVjdGlvbiA9IGZhbHNlLFxuICAgIHNjYWxlID0gZmFsc2UsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBzdWJ0aXRsZSA9ICcnLFxuICAgIGNvbW1lbnQgPSAnJyxcbiAgICBkb1ppcEZpbGUgPSB0cnVlLFxuICAgIGxlZ2VuZFBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArcHJpbnRSZXNvbHV0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxNYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG5cbiAgICBtYXAub2wub25jZSgncmVuZGVyY29tcGxldGUnLCBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGF3YWl0IHRoaXMuZHJhd01hcChzaXplLCBtYXBDYW52YXMpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgaW5pdGlhbE1hcFNpemUsIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgICAgYXdhaXQgdGhpcy5kcmF3TWFwQ29udHJvbHMobWFwLCBtYXBSZXN1bHRDYW52YXMsIGxlZ2VuZFBvc2l0aW9uKTtcbiAgICAgIC8vIENoZWNrIHRoZSBsZWdlbmRQb3NpdGlvblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kVG9JbWFnZShcbiAgICAgICAgICAgIG1hcFJlc3VsdENhbnZhcyxcbiAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgICAgIGZvcm1hdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UobWFwLCBmb3JtYXQsIGRvWmlwRmlsZSwgcmVzb2x1dGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFkZCBvdGhlciBpbmZvcm1hdGlvbiB0byBmaW5hbCBjYW52YXMgYmVmb3JlIGV4cG9ydGluZ1xuICAgICAgY29uc3QgbmV3Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjb25zdCBuZXdDb250ZXh0ID0gbmV3Q2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAvLyBQb3N0aW9uIGluIGhlaWdodCB0byBzZXQgdGhlIGNhbnZhcyBpbiBuZXcgY2FudmFzXG4gICAgICBsZXQgcG9zaXRpb25IQ2FudmFzID0gMDtcbiAgICAgIC8vIEdldCBoZWlnaHQvd2lkdGggb2YgbWFwIGNhbnZhc1xuICAgICAgY29uc3Qgd2lkdGggPSBtYXBSZXN1bHRDYW52YXMud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gbWFwUmVzdWx0Q2FudmFzLmhlaWdodDtcbiAgICAgIC8vIFNldCBGb250IHRvIGNhbGN1bGF0ZSBjb21tZW50IHdpZHRoXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIGNvbnN0IGNvbW1lbnRXaWR0aCA9IG5ld0NvbnRleHQubWVhc3VyZVRleHQoY29tbWVudCkud2lkdGg7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciB0aXRsZSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHN1YnRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBwcm9qZWN0aW9uICE9PSBmYWxzZSB8fCBzY2FsZSAhPT0gZmFsc2UgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSFByb2pTY2FsZSA9IGhlaWdodCAtIDEwO1xuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcbiAgICAgIGNvbnN0IGNvbW1lbnROYkxpbmUgPSBNYXRoLmNlaWwoY29tbWVudFdpZHRoIC8gd2lkdGgpO1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgbXVsdGlsaW5lIGNvbW1lbnQgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XG4gICAgICBsZXQgcG9zaXRpb25IQ29tbWVudCA9IGhlaWdodCAtIGNvbW1lbnROYkxpbmUgKiAyMCArIDU7XG4gICAgICAvLyBTZXQgdGhlIG5ldyBjYW52YXMgd2l0aCB0aGUgbmV3IGNhbGN1bGF0ZWQgc2l6ZVxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoWydibXAnLCAnZ2lmJywgJ2pwZWcnLCAncG5nJywgJ3RpZmYnXS5pbmRleE9mKGZvcm1hdCkgPiAtMSkge1xuICAgICAgICAvLyBQYXRjaCBKcGVnIGRlZmF1bHQgYmxhY2sgYmFja2dyb3VuZCB0byB3aGl0ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybWF0ID09PSAnanBlZycgfHxcbiAgICAgICAgICB0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBzdWJ0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBjb21tZW50ICE9PSAnJyB8fFxuICAgICAgICAgIHByb2plY3Rpb24gIT09IGZhbHNlIHx8XG4gICAgICAgICAgc2NhbGUgIT09IGZhbHNlXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIGEgdGl0bGUgbmVlZCB0byBiZSBhZGRlZCB0byBjYW52YXNcbiAgICAgIGlmICh0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSAzMDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dCh0aXRsZSwgd2lkdGggLyAyLCAyMCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VidGl0bGUgIT09ICcnKSB7XG4gICAgICAgIC8vIFNldCBmb250IGZvciBzdWJ0aXRsZVxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxuICAgICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjZweCBDYWxpYnJpJztcbiAgICAgICAgcG9zaXRpb25IQ2FudmFzID0gNjA7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoc3VidGl0bGUsIHdpZHRoIC8gMiwgNTAsIHdpZHRoICogMC45KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGZvbnQgZm9yIG5leHQgc2VjdGlvblxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XG4gICAgICAvLyBJZiBwcm9qZWN0aW9uIG9yL2VuZCBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgcHJvamVjdGlvblNjYWxlVGV4dCA9ICcnO1xuICAgICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBwcm9qVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5wcm9qZWN0aW9uJyk7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCA9IHByb2pUZXh0ICsgJzogJyArIG1hcC5wcm9qZWN0aW9uICsgJyAgICAgICAgICc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnNjYWxlJyk7XG4gICAgICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbik7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCxcbiAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgcG9zaXRpb25IUHJvalNjYWxlLFxuICAgICAgICAgIHdpZHRoICogMC45XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgY29tbWVudCBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKGNvbW1lbnQgIT09ICcnKSB7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIGxpbmUsIG5vIG5lZWQgdG8gbXVsdGlsaW5lIHRoZSBjb21tZW50XG4gICAgICAgIGlmIChjb21tZW50TmJMaW5lID09PSAxKSB7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChjb21tZW50LCB3aWR0aCAvIDIsIHBvc2l0aW9uSENvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIHRoZSBzZXRlbnNlcyB0byBiZSBhcHByb3guIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgIGNvbnN0IG5iQ29tbWVudENoYXIgPSBjb21tZW50Lmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBDb21tZW50TGVuZ3RoVG9DdXQgPSBNYXRoLmZsb29yKG5iQ29tbWVudENoYXIgLyBjb21tZW50TmJMaW5lKTtcbiAgICAgICAgICBsZXQgY29tbWVudEN1cnJlbnRMaW5lID0gJyc7XG4gICAgICAgICAgbGV0IHBvc2l0aW9uRmlyc3RDdXRDaGFyID0gMDtcbiAgICAgICAgICBsZXQgcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgLy8gTG9vcCBmb3IgdGhlIG51bWJlciBvZiBsaW5lIGNhbGN1bGF0ZWRcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnROYkxpbmU7IGkrKykge1xuICAgICAgICAgICAgLy8gRm9yIGFsbCBsaW5lIGV4Y2VwdCBsYXN0XG4gICAgICAgICAgICBpZiAoY29tbWVudE5iTGluZSAtIDEgPiBpKSB7XG4gICAgICAgICAgICAgIC8vIEdldCBjb21tZW50IGN1cnJlbnQgbGluZSB0byBmaW5kIHRoZSByaWdodCBwbGFjZSB0dSBjdXQgY29tbWVudFxuICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUgPSBjb21tZW50LnN1YnN0cihcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhcixcbiAgICAgICAgICAgICAgICBDb21tZW50TGVuZ3RoVG9DdXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQ3V0IHRoZSBzZXRlbmNlIGF0IGJsYW5rXG4gICAgICAgICAgICAgIHBvc2l0aW9uTGFzdEJsYW5rID0gY29tbWVudEN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCcgJyk7XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudEN1cnJlbnRMaW5lLnN1YnN0cigwLCBwb3NpdGlvbkxhc3RCbGFuayksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcG9zaXRpb25GaXJzdEN1dENoYXIgKz0gcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgICAgIC8vIEdvIHRvIG5leHQgbGluZSBmb3IgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnQgKz0gMjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjdXQgbGFzdCBwYXJ0XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudC5zdWJzdHIocG9zaXRpb25GaXJzdEN1dENoYXIpLFxuICAgICAgICAgICAgICAgIHdpZHRoIC8gMixcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkhDb21tZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5ld0NvbnRleHQuZHJhd0ltYWdlKG1hcFJlc3VsdENhbnZhcywgMCwgcG9zaXRpb25IQ2FudmFzKTtcblxuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgIGxldCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICBmaWxlTmFtZVdpdGhFeHQgPVxuICAgICAgICAgICdtYXAnICsgbWFwLnByb2plY3Rpb24ucmVwbGFjZSgnOicsICdfJykgKyAnLicgKyBmb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUobmV3Q2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChuZXdDYW52YXMsIGZpbGVOYW1lV2l0aEV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKG5ld0NhbnZhcywgZmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGZ3RmlsZU5hbWVXaXRoRXh0ID1cbiAgICAgICAgICBmaWxlTmFtZVdpdGhFeHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZpbGVOYW1lV2l0aEV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy50aWZmJylcbiAgICAgICAgICApICsgJy50ZncnO1xuICAgICAgICBjb25zdCB0aXdDb250ZW50ID0gdGhpcy5nZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApO1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Rpd0NvbnRlbnRdLCB7XG4gICAgICAgICAgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCdcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgLy8gc2F2ZUFzIGF1dG9tYXRpY2x5IHJlcGxhY2UgJzonIGZvciAnXydcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgdGZ3RmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgICB0aGlzLnNhdmVGaWxlUHJvY2Vzc2luZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKHRmd0ZpbGVOYW1lV2l0aEV4dCwgYmxvYik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TWFwSW1hZ2VSZXNvbHV0aW9uKG1hcCwgaW5pdGlhbE1hcFNpemUsIHJlc29sdXRpb24sIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNYXBJbWFnZVJlc29sdXRpb24oXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbE1hcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSByZXNvbHV0aW9uIC8gOTY7XG4gICAgY29uc3QgbmV3TWFwU2l6ZSA9IFtcbiAgICAgIE1hdGgucm91bmQoaW5pdGlhbE1hcFNpemVbMF0gKiBzY2FsZUZhY3RvciksIC8vIHdpZHRoXG4gICAgICBNYXRoLnJvdW5kKGluaXRpYWxNYXBTaXplWzFdICogc2NhbGVGYWN0b3IpIC8vIGhlaWdodFxuICAgIF07XG4gICAgbWFwLm9sLnNldFNpemUobmV3TWFwU2l6ZSk7XG4gICAgY29uc3Qgc2NhbGluZyA9IE1hdGgubWluKFxuICAgICAgbmV3TWFwU2l6ZVswXSAvIGluaXRpYWxNYXBTaXplWzBdLFxuICAgICAgbmV3TWFwU2l6ZVsxXSAvIGluaXRpYWxNYXBTaXplWzFdXG4gICAgKTtcbiAgICBjb25zdCB2aWV3ID0gbWFwLm9sLmdldFZpZXcoKTtcbiAgICB2aWV3LnNldFJlc29sdXRpb24odmlld1Jlc29sdXRpb24gLyBzY2FsaW5nKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgQWRkIExlZ2VuZCB0byB0aGUgbWFwIGNhbnZhc1xuICAgKiBAcGFyYW0gIGNhbnZhcyBDYW52YXMgb2YgdGhlIG1hcFxuICAgKiBAcGFyYW0gIG1hcCBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIHJlc29sdXRpb24gUmVzb2x1dGlvbiBvZiBtYXBcbiAgICogQHBhcmFtICBsZWdlbmRQb3NpdGlvbiBMZWdlbmQgcG9zaXRpb25cbiAgICogQHBhcmFtICBmb3JtYXQgSW1hZ2UgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFRvSW1hZ2UoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXA6IElnb01hcCxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICBjYW52YXMud2lkdGgsXG4gICAgICByZXNvbHV0aW9uXG4gICAgKS50b1Byb21pc2UoKTtcbiAgICAvLyBJZiBubyBsZWdlbmQsIHNhdmUgdGhlIG1hcCBkaXJlY3RseVxuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICBkaXYuc3R5bGUuekluZGV4ID0gJy0xJztcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXNMZWdlbmQgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaChcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FudmFzTGVnZW5kKSB7XG4gICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBsZWdlbmRIZWlnaHQgPSBjYW52YXNMZWdlbmQuaGVpZ2h0O1xuICAgICAgY29uc3QgbGVnZW5kV2lkdGggPSBjYW52YXNMZWdlbmQud2lkdGg7XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNhbnZhc0hlaWdodCAqIDAuMDE7XG4gICAgICBsZXQgbGVnZW5kWDogbnVtYmVyO1xuICAgICAgbGV0IGxlZ2VuZFk6IG51bWJlcjtcblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tcmlnaHQnKSB7XG4gICAgICAgIGxlZ2VuZFggPSBjYW52YXNXaWR0aCAtIGxlZ2VuZFdpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBsZWdlbmRYID0gY2FudmFzV2lkdGggLSBsZWdlbmRXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICBsZWdlbmRYID0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0IC0gMTU7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbGVnZW5kWCA9IG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIGNhbnZhc0xlZ2VuZCxcbiAgICAgICAgbGVnZW5kWCxcbiAgICAgICAgbGVnZW5kWSxcbiAgICAgICAgbGVnZW5kV2lkdGgsXG4gICAgICAgIGxlZ2VuZEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChsZWdlbmRYLCBsZWdlbmRZLCBsZWdlbmRXaWR0aCwgbGVnZW5kSGVpZ2h0KTtcbiAgICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWFwKG1hcCwgc2l6ZSwgZXh0ZW50KSB7XG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBEb2N1bWVudCB0byBzYXZlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURvYyhkb2M6IGpzUERGKSB7XG4gICAgYXdhaXQgZG9jLnNhdmUoJ21hcF9nZW9yZWYucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBnZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgbWFyZ2lucykge1xuICAgIC8vIERlZmluZSB2YXJpYWJsZSB0byBjYWxjdWxhdGUgYmVzdCBzaXplIHRvIGZpdCBpbiBvbmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gKG1hcmdpbnNbMF0gKyBtYXJnaW5zWzJdICsgMTApO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChtYXJnaW5zWzFdICsgbWFyZ2luc1szXSk7XG4gICAgY29uc3QgY2FuSGVpZ2h0ID0gdGhpcy5wZGZfdW5pdHMycG9pbnRzKGNhbnZhcy5oZWlnaHQsICdtbScpO1xuICAgIGNvbnN0IGNhbldpZHRoID0gdGhpcy5wZGZfdW5pdHMycG9pbnRzKGNhbnZhcy53aWR0aCwgJ21tJyk7XG5cbiAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNhbkhlaWdodCAvIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNhbldpZHRoIC8gcGFnZVdpZHRoO1xuICAgIGNvbnN0IG1heFJhdGlvID0gaGVpZ2h0UmF0aW8gPiB3aWR0aFJhdGlvID8gaGVpZ2h0UmF0aW8gOiB3aWR0aFJhdGlvO1xuICAgIGNvbnN0IGltZ0hlaWdoID0gbWF4UmF0aW8gPiAxID8gY2FuSGVpZ2h0IC8gbWF4UmF0aW8gOiBjYW5IZWlnaHQ7XG4gICAgY29uc3QgaW1nV2lkdGggPSBtYXhSYXRpbyA+IDEgPyBjYW5XaWR0aCAvIG1heFJhdGlvIDogY2FuV2lkdGg7XG4gICAgcmV0dXJuIFtpbWdXaWR0aCwgaW1nSGVpZ2hdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdvcmxkIGZpbGUgaW5mb3JtYXRpb24gZm9yIHRpZmZcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApIHtcbiAgICBjb25zdCBjdXJyZW50UmVzb2x1dGlvbiA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRSZXNvbHV0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEV4dGVudCA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKTsgLy8gUmV0dXJuIFttaW54LCBtaW55LCBtYXh4LCBtYXh5XVxuICAgIHJldHVybiBbXG4gICAgICBjdXJyZW50UmVzb2x1dGlvbixcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLWN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgY3VycmVudEV4dGVudFswXSArIGN1cnJlbnRSZXNvbHV0aW9uIC8gMC41LFxuICAgICAgY3VycmVudEV4dGVudFszXSAtIGN1cnJlbnRSZXNvbHV0aW9uIC8gMC41XG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNhbnZhcyBpbWFnZSBhcyBmaWxlXG4gICAqIEBwYXJhbSBjYW52YXMgLSBDYW52YXMgdG8gc2F2ZVxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGZpbGVcbiAgICogQHBhcmFtIGZvcm1hdCAtIGZpbGUgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIHNhdmVDYW52YXNJbWFnZUFzRmlsZShjYW52YXMsIG5hbWVXaXRoRXh0LCBmb3JtYXQpIHtcbiAgICBjb25zdCBibG9iRm9ybWF0ID0gJ2ltYWdlLycgKyBmb3JtYXQ7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cbiAgICB0cnkge1xuICAgICAgY2FudmFzLnRvRGF0YVVSTCgpOyAvLyBKdXN0IHRvIG1ha2UgdGhlIGNhdGNoIHRyaWdnZXIgd2lodG91dCB0b0Jsb2IgRXJyb3IgdGhyb3cgbm90IGNhdGNoZWRcbiAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgLy8gZG93bmxvYWQgaW1hZ2VcbiAgICAgICAgc2F2ZUFzKGJsb2IsIG5hbWVXaXRoRXh0KTtcbiAgICAgICAgdGhhdC5zYXZlRmlsZVByb2Nlc3NpbmcoKTtcbiAgICAgIH0sIGJsb2JGb3JtYXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JyxcbiAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZmlsZSB0byBhIHppcFxuICAgKiBAcGFyYW0gY2FudmFzIC0gRmlsZSB0byBhZGQgdG8gdGhlIHppcFxuICAgKiBAcGFyYW0gIG5hbWUgLU5hbWUgb2YgdGhlIGZpbGVvdmVydmlld1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKGNhbnZhcywgbmFtZSkge1xuICAgIGNvbnN0IGJsb2JGb3JtYXQgPSAnaW1hZ2UvJyArICdqcGVnJztcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBpZiAoXG4gICAgICAhdGhpcy5oYXNPd25Qcm9wZXJ0eSgnemlwRmlsZScpIHx8XG4gICAgICB0eXBlb2YgdGhpcy56aXBGaWxlID09PSAndW5kZWZpbmVkJ1xuICAgICkge1xuICAgICAgdGhpcy56aXBGaWxlID0gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAobmFtZSwgY2FudmFzLm1zVG9CbG9iKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICAgIHRoYXQuYWRkRmlsZVRvWmlwKG5hbWUsIGJsb2IpO1xuICAgICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGZpbGUgdG8gemlwLCBpZiBhbGwgZmlsZSBhcmUgemlwcGVkLCBkb3dubG9hZFxuICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIGZpbGVzXG4gICAqIEBwYXJhbSBibG9iIC0gQ29udGFpbiBvZiBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFkZEZpbGVUb1ppcChuYW1lLCBibG9iKSB7XG4gICAgLy8gYWRkIGZpbGUgdG8gemlwXG4gICAgdGhpcy56aXBGaWxlLmZpbGUobmFtZSwgYmxvYik7XG4gICAgdGhpcy5uYkZpbGVUb1Byb2Nlc3MtLTtcblxuICAgIC8vIElmIGFsbCBmaWxlcyBhcmUgcHJvY2Nlc3NlZFxuICAgIGlmICh0aGlzLm5iRmlsZVRvUHJvY2VzcyA9PT0gMCkge1xuICAgICAgLy8gRG93bmxvYWQgemlwIGZpbGVcbiAgICAgIHRoaXMuZ2V0WmlwRmlsZSgpO1xuICAgICAgLy8gU3RvcCBsb2FkaW5nXG4gICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRmlsZVByb2Nlc3NpbmcoKSB7XG4gICAgdGhpcy5uYkZpbGVUb1Byb2Nlc3MtLTtcblxuICAgIC8vIElmIGFsbCBmaWxlcyBhcmUgcHJvY2Nlc3NlZFxuICAgIGlmICh0aGlzLm5iRmlsZVRvUHJvY2VzcyA9PT0gMCkge1xuICAgICAgLy8gU3RvcCBsb2FkaW5nXG4gICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgemlwcGVkIGZpbGVcbiAgICogQHJldHVybiBSZXR1biBhIHppcCBmaWxlXG4gICAqL1xuICBwcml2YXRlIGdldFppcEZpbGUoKSB7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy56aXBGaWxlLmdlbmVyYXRlQXN5bmMoeyB0eXBlOiAnYmxvYicgfSkudGhlbigoYmxvYikgPT4ge1xuICAgICAgLy8gMSkgZ2VuZXJhdGUgdGhlIHppcCBmaWxlXG4gICAgICBzYXZlQXMoYmxvYiwgJ21hcC56aXAnKTtcbiAgICAgIGRlbGV0ZSB0aGF0LnppcEZpbGU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBkZl91bml0czJwb2ludHMobiwgdW5pdCk6IG51bWJlciB7XG4gICAgbGV0IGsgPSAxO1xuXG4gICAgLy8gdGhpcyBjb2RlIGlzIGJvcnJvd2VkIGZyb20ganNQREZcbiAgICAvLyAgYXMgaXQgZG9lcyBub3QgZXhwb3NlIGEgcHVibGljIEFQSVxuICAgIC8vICBmb3IgY29udmVydGluZyB1bml0cyB0byBwb2ludHMuXG4gICAgc3dpdGNoICh1bml0KSB7XG4gICAgICBjYXNlICdwdCc6XG4gICAgICAgIGsgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgayA9IDcyIC8gMjUuNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbSc6XG4gICAgICAgIGsgPSA3MiAvIDIuNTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW4nOlxuICAgICAgICBrID0gNzI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHgnOlxuICAgICAgICBrID0gOTYgLyA3MjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYyc6XG4gICAgICAgIGsgPSAxMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbSc6XG4gICAgICAgIGsgPSAxMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleCc6XG4gICAgICAgIGsgPSA2O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bml0OiAnICsgdW5pdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG4gKiBrO1xuICB9XG59XG4iXX0=
|
|
1110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sSUFBSSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sWUFBWSxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVB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b24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNlY3VyZUltYWdlUGlwZSB9IGZyb20gJ0BpZ28yL2NvbW1vbi9pbWFnZSc7XG5pbXBvcnQgeyBBY3Rpdml0eVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2FjdGl2aXR5JztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlL2xhbmd1YWdlJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZS9tZXNzYWdlJztcbmltcG9ydCB7IFN1YmplY3RTdGF0dXMgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEpTWmlwIH0gZnJvbSAnanN6aXAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCBhcyByeE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTGVnZW5kTWFwVmlld09wdGlvbnMgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL2xlZ2VuZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0TGF5ZXJzTGVnZW5kcyB9IGZyb20gJy4uLy4uL2xheWVyL3V0aWxzL291dHB1dExlZ2VuZCc7XG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCBHZW9QZGZQbHVnaW4gZnJvbSAnLi9nZW9wZGYnO1xuaW1wb3J0IHsgUHJpbnRPcHRpb25zLCBUZXh0UGRmU2l6ZUFuZE1hcmdpbiB9IGZyb20gJy4vcHJpbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFByaW50TGVnZW5kUG9zaXRpb24sXG4gIFByaW50UGFwZXJGb3JtYXQsXG4gIFByaW50UmVzb2x1dGlvblxufSBmcm9tICcuL3ByaW50LnR5cGUnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBOYXZpZ2F0b3Ige1xuICAgIG1zU2F2ZUJsb2I/OiAoYmxvYjogYW55LCBkZWZhdWx0TmFtZT86IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcmludFNlcnZpY2Uge1xuICB6aXBGaWxlOiBKU1ppcDtcbiAgbmJGaWxlVG9Qcm9jZXNzOiBudW1iZXI7XG4gIGFjdGl2aXR5SWQ6IHN0cmluZztcbiAgbWFwUHJpbnRFeHRlbnQ6IEFycmF5PG51bWJlcj47XG4gIGltZ1NpemVBZGRlZDogQXJyYXk8bnVtYmVyPjtcblxuICBURVhUUERGRk9OVCA9IHtcbiAgICB0aXRsZUZvbnQ6ICd0aW1lcycsXG4gICAgdGl0bGVGb250U3R5bGU6ICdib2xkJyxcbiAgICBzdWJ0aXRsZUZvbnQ6ICd0aW1lcycsXG4gICAgc3VidGl0bGVGb250U3R5bGU6ICdib2xkJyxcbiAgICBjb21tZW50Rm9udDogJ3RpbWVzJyxcbiAgICBjb21tZW50Rm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICBjb21tZW50Rm9udFNpemU6IDEyXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZpdHlTZXJ2aWNlOiBBY3Rpdml0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIHByaW50KG1hcDogSWdvTWFwLCBvcHRpb25zOiBQcmludE9wdGlvbnMpOiBTdWJqZWN0PGFueT4ge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IHBhcGVyRm9ybWF0OiBzdHJpbmcgPSBvcHRpb25zLnBhcGVyRm9ybWF0O1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArb3B0aW9ucy5yZXNvbHV0aW9uOyAvLyBEZWZhdWx0IGlzIDk2XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBvcHRpb25zLm9yaWVudGF0aW9uO1xuICAgIGNvbnN0IGxlZ2VuZFBvc3Rpb24gPSBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG5cbiAgICBHZW9QZGZQbHVnaW4oanNQREYuQVBJKTtcblxuICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7XG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGZvcm1hdDogcGFwZXJGb3JtYXQudG9Mb3dlckNhc2UoKSxcbiAgICAgIHVuaXQ6ICdtbScgLy8gZGVmYXVsdFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyB3aWR0aDogcGFnZVdpZHRoLCBoZWlnaHQ6IHBhZ2VIZWlnaHQgfSA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZTtcblxuICAgIC8qKiB0b3AgfCByaWdodCB8IGJvdHRvbSB8IGxlZnQgKi9cbiAgICBjb25zdCBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMTAsIDEwLCAxMCwgMTBdO1xuXG4gICAgbGV0IHRpdGxlU2l6ZXM6IFRleHRQZGZTaXplQW5kTWFyZ2luO1xuICAgIGxldCBzdWJ0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcblxuICAgIC8vIGlmIHBhcGVyIGZvcm1hdCBBMSBvciBBMCBhZGQgbWFyZ2luIHRvcFxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnRpdGxlICE9PSAnJyB8fCBvcHRpb25zLnN1YnRpdGxlICE9PSAnJykgJiZcbiAgICAgIChwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMSB8fFxuICAgICAgICBwYXBlckZvcm1hdCA9PT0gUHJpbnRQYXBlckZvcm1hdC5BMClcbiAgICApIHtcbiAgICAgIGJhc2VNYXJnaW5zWzBdICs9IDEwO1xuICAgIH1cbiAgICAvLyBQREYgdGl0bGVcbiAgICBjb25zdCBmb250U2l6ZUluUHQgPSBNYXRoLnJvdW5kKDIgKiAocGFnZUhlaWdodCArIDE0NSkgKiAwLjA1KSAvIDI7IC8vY2FsY3VsYXRlIHRoZSBmb250U2l6ZSB0aXRsZSBmcm9tIHRoZSBwYWdlIGhlaWdodC5cbiAgICBpZiAob3B0aW9ucy50aXRsZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMudGl0bGUgIT09ICcnKSB7XG4gICAgICB0aXRsZVNpemVzID0gdGhpcy5nZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcoXG4gICAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICAgIGJhc2VNYXJnaW5zLFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udCxcbiAgICAgICAgZm9udFNpemVJblB0LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICBkb2NcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkVGV4dEluUGRmRG9jKFxuICAgICAgICBkb2MsXG4gICAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQudGl0bGVGb250LFxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxuICAgICAgICB0aXRsZVNpemVzLmZvbnRTaXplLFxuICAgICAgICB0aXRsZVNpemVzLm1hcmdpbkxlZnQgKyBiYXNlTWFyZ2luc1szXSxcbiAgICAgICAgYmFzZU1hcmdpbnNbMF1cbiAgICAgICk7XG5cbiAgICAgIGJhc2VNYXJnaW5zWzBdID0gdGl0bGVTaXplcy5oZWlnaHQgKyBiYXNlTWFyZ2luc1swXTsgLy8gY3VtdWxhdGl2ZSBtYXJnaW4gdG9wIGZvciBuZXh0IGVsZW0gdG8gcGxhY2UgaW4gcGRmIGRvY1xuICAgIH1cblxuICAgIC8vIFBERiBzdWJ0aXRsZVxuICAgIGlmIChvcHRpb25zLnN1YnRpdGxlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdWJ0aXRsZSAhPT0gJycpIHtcbiAgICAgIHN1YnRpdGxlU2l6ZXMgPSB0aGlzLmdldFRleHRQZGZPYmplY3RTaXplQW5kTWFyZyhcbiAgICAgICAgb3B0aW9ucy5zdWJ0aXRsZSxcbiAgICAgICAgYmFzZU1hcmdpbnMsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250LFxuICAgICAgICBvcHRpb25zLnRpdGxlICE9PSAnJyA/IHRpdGxlU2l6ZXMuZm9udFNpemUgKiAwLjcgOiBmb250U2l6ZUluUHQgKiAwLjcsIC8vIDcwJSBzaXplIG9mIHRpdGxlXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250U3R5bGUsXG4gICAgICAgIGRvY1xuICAgICAgKTtcblxuICAgICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoXG4gICAgICAgIGRvYyxcbiAgICAgICAgb3B0aW9ucy5zdWJ0aXRsZSxcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC5zdWJ0aXRsZUZvbnQsXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQuc3VidGl0bGVGb250U3R5bGUsXG4gICAgICAgIHN1YnRpdGxlU2l6ZXMuZm9udFNpemUsXG4gICAgICAgIHN1YnRpdGxlU2l6ZXMubWFyZ2luTGVmdCArIGJhc2VNYXJnaW5zWzNdLFxuICAgICAgICBiYXNlTWFyZ2luc1swXVxuICAgICAgKTtcblxuICAgICAgYmFzZU1hcmdpbnNbMF0gKz0gNTsgLy8gY3VtdWxhdGl2ZSBtYXJnIHRvcCBmb3IgbmV4dCBlbGVtIHRvIHBsYWNlIGluIHBkZiBkb2MuIDUgaXMgYSBmaXggaXQgY291bGQgYmUgYWRqdXN0XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGljYWxTcGFjaW5nOiBudW1iZXIgPSA1O1xuICAgIGlmIChvcHRpb25zLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbW1lbnQgIT09ICcnKSB7XG4gICAgICB0aGlzLmFkZENvbW1lbnQoZG9jLCBvcHRpb25zLmNvbW1lbnQsIGJhc2VNYXJnaW5zLCB2ZXJ0aWNhbFNwYWNpbmcpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNob3dQcm9qZWN0aW9uID09PSB0cnVlIHx8IG9wdGlvbnMuc2hvd1NjYWxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmFkZFByb2pTY2FsZShcbiAgICAgICAgZG9jLFxuICAgICAgICBtYXAsXG4gICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1Byb2plY3Rpb24sXG4gICAgICAgIG9wdGlvbnMuc2hvd1NjYWxlLFxuICAgICAgICBiYXNlTWFyZ2lucyxcbiAgICAgICAgdmVydGljYWxTcGFjaW5nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gcGFnZVdpZHRoIC0gYmFzZU1hcmdpbnNbM10gLSBiYXNlTWFyZ2luc1sxXTtcbiAgICBjb25zdCBoZWlnaHQgPSBwYWdlSGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBiYXNlTWFyZ2luc1syXTtcbiAgICBjb25zdCBzaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW3dpZHRoLCBoZWlnaHRdO1xuXG4gICAgdGhpcy5hZGRNYXAoXG4gICAgICBkb2MsXG4gICAgICBtYXAsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgc2l6ZSxcbiAgICAgIGJhc2VNYXJnaW5zLFxuICAgICAgbGVnZW5kUG9zdGlvblxuICAgICkuc3Vic2NyaWJlKGFzeW5jIChzdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgIGlmIChzdGF0dXMgPT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgYmFzZU1hcmdpbnMpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaW1nU2l6ZUFkZGVkWzBdO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmltZ1NpemVBZGRlZFsxXTtcbiAgICAgICAgdGhpcy5hZGRHZW9SZWYoZG9jLCBtYXAsIHdpZHRoLCBoZWlnaHQsIGJhc2VNYXJnaW5zKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRQb3NpdGlvbiAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgWyd0b3BsZWZ0JywgJ3RvcHJpZ2h0JywgJ2JvdHRvbWxlZnQnLCAnYm90dG9tcmlnaHQnXS5pbmRleE9mKFxuICAgICAgICAgICAgICBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgICApID4gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kU2FtZVBhZ2UoXG4gICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgICBiYXNlTWFyZ2lucyxcbiAgICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmRQb3NpdGlvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRMZWdlbmQoZG9jLCBtYXAsIGJhc2VNYXJnaW5zLCByZXNvbHV0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lIHx8IHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5FcnJvcikge1xuICAgICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XG4gICAgICAgIHN0YXR1cyQubmV4dChTdWJqZWN0U3RhdHVzLkRvbmUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cbiAgLy8gcmVmIEdlb01vb3NlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZW9tb29zZS9nbTMvdHJlZS9tYWluL3NyYy9nbTMvY29tcG9uZW50cy9wcmludFxuICBhZGRHZW9SZWYoXG4gICAgZG9jLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYmFzZU1hcmdpbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICkge1xuICAgIGNvbnN0IHVuaXQgPSAnbW0nO1xuICAgIGNvbnN0IGRvY0hlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcblxuICAgIC8vIHgseSA9IG1hcmdpbiBsZWZ0LWJvdHRvbSBjb3JuZXIgZm9yIGltZyBpbiBwZGYgZG9jXG4gICAgY29uc3QgeCA9IGJhc2VNYXJnaW5zWzNdO1xuICAgIGNvbnN0IHkgPSBkb2NIZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGhlaWdodDtcblxuICAgIGxldCBwZGZfZXh0ZW50cyA9IFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGRmX2V4dGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBkZl9leHRlbnRzW2ldID0gdGhpcy5wZGZfdW5pdHMycG9pbnRzKHBkZl9leHRlbnRzW2ldLCB1bml0KTtcbiAgICB9XG4gICAgZG9jLnNldEdlb0FyZWEocGRmX2V4dGVudHMsIHRoaXMubWFwUHJpbnRFeHRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtZWFzdXJlIG92ZXJsYXkgb24gdGhlIG1hcCBvbiB0aGUgZG9jdW1lbnQgd2hlbiB0aGUgbWVhc3VyZSBsYXllciBpcyBwcmVzZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIG1lYXN1cmUgdG9vbHRpcCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBiYXNlTWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZWFzdXJlTGF5ZXIoXG4gICAgZG9jOiBqc1BERixcbiAgICBtYXA6IElnb01hcCxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgbWFwLmxheWVycy5maW5kKFxuICAgICAgICAobGF5ZXIpID0+IGxheWVyLnZpc2libGUgJiYgbGF5ZXIuaWQuc3RhcnRzV2l0aCgnaWdvLW1lYXN1cmVzLScpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBsZXQgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcztcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgICAgYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheU1lYXN1cmVzSFRNTCwge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXG4gICAgICB9KS50aGVuKChlKSA9PiB7XG4gICAgICAgIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMgPSBlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMsIGJhc2VNYXJnaW5zKTsgLy8gdGhpcyBhZGRzIG1lYXN1cmUgb3ZlcmxheXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh0bWwgY29kZSBmb3IgYWxsIGxheWVycyBsZWdlbmRcbiAgICogQHBhcmFtICBtYXAgSWdvTWFwXG4gICAqIEBwYXJhbSAgd2lkdGggVGhlIHdpZHRoIHRoYXQgdGhlIGxlZ2VuZCBuZWVkIHRvIGJlXG4gICAqIEByZXR1cm4gSHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAqL1xuICBnZXRMYXllcnNMZWdlbmRIdG1sKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGNvbnN0IGxlZ2VuZHMgPSBnZXRMYXllcnNMZWdlbmRzKG1hcC5sYXllcnMsIHtcbiAgICAgICAgcmVzb2x1dGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKSxcbiAgICAgICAgZXh0ZW50OiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCksXG4gICAgICAgIHByb2plY3Rpb246IG1hcC52aWV3Q29udHJvbGxlci5nZXRPbFByb2plY3Rpb24oKS5nZXRDb2RlKCksXG4gICAgICAgIC8vIHNjYWxlOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbiksXG4gICAgICAgIHNpemU6IG1hcC5vbC5nZXRTaXplKClcbiAgICAgIH0gYXMgTGVnZW5kTWFwVmlld09wdGlvbnMpO1xuXG4gICAgICBpZiAobGVnZW5kcy5maWx0ZXIoKGwpID0+IGwuZGlzcGxheSA9PT0gdHJ1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpbXBvcnRhbnQgc3R5bGUgdG8gYmUgc3VyZSB0aGF0IGFsbCBjb250YWluZXIgaXMgY29udmVydFxuICAgICAgLy8gdG8gaW1hZ2Ugbm90IGp1c3QgdmlzaWJsZSBwYXJ0XG4gICAgICBodG1sICs9ICc8c3R5bGUgbWVkaWE9XCJzY3JlZW5cIiB0eXBlPVwidGV4dC9jc3NcIj4nO1xuICAgICAgaHRtbCArPVxuICAgICAgICAnLmh0bWwyY2FudmFzLWNvbnRhaW5lciB7IHdpZHRoOiAnICtcbiAgICAgICAgd2lkdGggK1xuICAgICAgICAnbW0gIWltcG9ydGFudDsgaGVpZ2h0OiAyMDAwcHggIWltcG9ydGFudDsgfSc7XG4gICAgICBodG1sICs9ICd0YWJsZS50YWJsZUxlZ2VuZCB7dGFibGUtbGF5b3V0OiBhdXRvO30nO1xuICAgICAgaHRtbCArPVxuICAgICAgICAnZGl2LnN0eWxlTGVnZW5kIHtwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O3BhZGRpbmctYm90dG9tOjVweDt9JztcbiAgICAgIGh0bWwgKz0gJzwvc3R5bGU+JztcbiAgICAgIC8vIFRoZSBmb250IHNpemUgd2lsbCBhbHNvIGJlIGxvd2VyZWQgYWZ0ZXJ3YXJkcyAoZ2xvYmFsbHkgYWxvbmcgdGhlIGxlZ2VuZCBzaXplKVxuICAgICAgLy8gdGhpcyBhbGxvd3MgaGF2aW5nIGEgZ29vZCByZWxhdGl2ZSBmb250IHNpemUgaGVyZSBhbmQgdG8ga2VlcCBhanVzdGluZyB0aGUgbGVnZW5kIHNpemVcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgZ29vZCByZWxhdGl2ZSBmb250IHNpemVcbiAgICAgIGh0bWwgKz0gJzxmb250IHNpemU9XCIzXCIgZmFjZT1cIlRpbWVzXCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic3R5bGVMZWdlbmRcIj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPVwidGFibGVMZWdlbmRcIiA+JztcblxuICAgICAgLy8gRm9yIGVhY2ggbGVnZW5kLCBkZWZpbmUgYW4gaHRtbCB0YWJsZSBjZWxsXG4gICAgICBjb25zdCBpbWFnZXMkID0gbGVnZW5kc1xuICAgICAgICAuZmlsdGVyKChsKSA9PiBsLmRpc3BsYXkgJiYgbC5pc0luUmVzb2x1dGlvbnNSYW5nZSA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgobGVnZW5kKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUltYWdlKGxlZ2VuZC51cmwpLnBpcGUoXG4gICAgICAgICAgICByeE1hcCgoZGF0YUltYWdlKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBodG1sSW1nID1cbiAgICAgICAgICAgICAgICAnPHRyPjx0ZD4nICsgbGVnZW5kLnRpdGxlLnRvVXBwZXJDYXNlKCkgKyAnPC90ZD48L3RyPic7XG4gICAgICAgICAgICAgIGh0bWxJbWcgKz0gJzx0cj48dGQ+PGltZyBzcmM9XCInICsgZGF0YUltYWdlICsgJ1wiPjwvdGQ+PC90cj4nO1xuICAgICAgICAgICAgICByZXR1cm4gaHRtbEltZztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgZm9ya0pvaW4oaW1hZ2VzJCkuc3Vic2NyaWJlKChkYXRhSW1hZ2VzKSA9PiB7XG4gICAgICAgIGh0bWwgPSBkYXRhSW1hZ2VzLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiAoYWNjICs9IGN1cnJlbnQpLCBodG1sKTtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGh0bWwpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhSW1hZ2UodXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlY3VyZUlNRyA9IG5ldyBTZWN1cmVJbWFnZVBpcGUodGhpcy5odHRwLCB0aGlzLmNvbmZpZ1NlcnZpY2UpO1xuICAgIHJldHVybiBzZWN1cmVJTUcudHJhbnNmb3JtKHVybCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgbGVnZW5kIGluIGEgc2luZ2xlIGltYWdlXG4gICAqICogQHBhcmFtICBmb3JtYXQgLSBJbWFnZSBmb3JtYXQuIGRlZmF1bHQgdmFsdWUgdG8gXCJwbmdcIlxuICAgKiBAcmV0dXJuIFRoZSBpbWFnZSBvZiB0aGUgbGVnZW5kXG4gICAqL1xuICBhc3luYyBnZXRMYXllcnNMZWdlbmRJbWFnZShcbiAgICBtYXAsXG4gICAgZm9ybWF0OiBzdHJpbmcgPSAncG5nJyxcbiAgICBkb1ppcEZpbGU6IGJvb2xlYW4sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcbiAgICBjb25zdCB3aWR0aCA9IDIwMDsgLy8gbWlsaW1ldGVycyB1bml0LCBvcmlnaW5hbGx5IGRlZmluZSBmb3IgZG9jdW1lbnQgcGRmXG4gICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gSWYgbm8gbGVnZW5kIHNob3cgTm8gTEVHRU5EIGluIGFuIGltYWdlXG4gICAgaWYgKGh0bWwubGVuZ3RoID09PSAwKSB7XG4gICAgICBodG1sID0gJzxmb250IHNpemU9XCIxMlwiIGZhY2U9XCJDb3VyaWVyIE5ld1wiID4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBhbGlnbj1cImNlbnRlclwiPjxiPk5PIExFR0VORDwvYj48L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuICAgIC8vIEFkZCBodG1sIGNvZGUgdG8gY29udmVydCBpbiB0aGUgbmV3IHdpbmRvd1xuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgZGl2LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFkb1ppcEZpbGUpIHtcbiAgICAgICAgICAvLyBTYXZlIHRoZSBjYW52YXMgYXMgZmlsZVxuICAgICAgICAgIHRoaXMuc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgJ2xlZ2VuZEltYWdlJywgZm9ybWF0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAoY2FudmFzLCAnbGVnZW5kSW1hZ2UnICsgJy4nICsgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSHRtbEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gIH1cblxuICBnZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG1hcmdpbnMsXG4gICAgZm9udDogc3RyaW5nLFxuICAgIGZvbnRTaXplSW5QdDogbnVtYmVyLFxuICAgIGZvbnRTdHlsZTogc3RyaW5nLFxuICAgIGRvYzoganNQREZcbiAgKTogVGV4dFBkZlNpemVBbmRNYXJnaW4ge1xuICAgIGNvbnN0IHBkZlJlc29sdXRpb24gPSA5NjtcbiAgICBjb25zdCBkb2NXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvY1dpZHRoIC0gbWFyZ2luc1sxXSAtIG1hcmdpbnNbM107XG5cbiAgICAvLyBpbXBvcnRhbnQgdG8gc2V0IGl0IGZpcnN0LCB0aGUgdGV4dERpbWVuc2lvbiBjaGFuZ2Ugd2hlbiBmb250IGNoYW5nZSFcbiAgICBkb2Muc2V0Rm9udChmb250LCBmb250U3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShmb250U2l6ZUluUHQpO1xuXG4gICAgbGV0IHRleHREaW1lbnNpb25zID0gZG9jLmdldFRleHREaW1lbnNpb25zKHRleHQpO1xuICAgIGxldCB0ZXh0TWFyZ2luTGVmdDogbnVtYmVyO1xuXG4gICAgaWYgKHRleHREaW1lbnNpb25zLncgPiBwYWdlV2lkdGgpIHtcbiAgICAgIC8vIGlmIHRoZSB0ZXh0IGlzIHRvIGxvbmcsIHJlZHVjZSBmb250U2l6ZSA3MCUgYW5kIHRoZSBvdmVyZmxvdyB3aXRoIGJlIGN1dCBpbiBwcmludC4uLlxuICAgICAgdGV4dE1hcmdpbkxlZnQgPSAwO1xuICAgICAgZm9udFNpemVJblB0ID0gZm9udFNpemVJblB0ICogMC43O1xuICAgICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplSW5QdCk7XG4gICAgICB0ZXh0RGltZW5zaW9ucyA9IGRvYy5nZXRUZXh0RGltZW5zaW9ucyh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dE1hcmdpbkxlZnQgPSAocGFnZVdpZHRoIC0gdGV4dERpbWVuc2lvbnMudykgLyAyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmb250U2l6ZTogZm9udFNpemVJblB0LFxuICAgICAgbWFyZ2luTGVmdDogdGV4dE1hcmdpbkxlZnQsXG4gICAgICBoZWlnaHQ6IHRleHREaW1lbnNpb25zLmhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb21tZW50IHRvIHRoZSBkb2N1bWVudFxuICAgKiBAcGFyYW0gIGRvYyAtIHBkZiBkb2N1bWVudFxuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBpbiB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtIGJhc2VNYXJnaW5zIC0gdG9wIHwgcmlnaHQgfCBib3R0b20gfCBsZWZ0XG4gICAqIEBwYXJhbSB2ZXJ0aWNhbFNwYWNpbmcgLSBjYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBhbmQgbWFwIGhlaWdodFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRDb21tZW50KFxuICAgIGRvYzoganNQREYsXG4gICAgY29tbWVudDogc3RyaW5nLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB2ZXJ0aWNhbFNwYWNpbmc6IG51bWJlclxuICApIHtcbiAgICAvLyBjYWxjdWxhdGUgbWFwIGltYWdlIGhlaWdodFxuICAgIGJhc2VNYXJnaW5zWzJdICs9IHZlcnRpY2FsU3BhY2luZztcblxuICAgIGNvbnN0IHhQb3NpdGlvbiA9IGJhc2VNYXJnaW5zWzNdOyAvL21hcmdpbiBsZWZ0IGFuZCBib3R0b20gaXMgZml4XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gYmFzZU1hcmdpbnNbMl07XG4gICAgLy8gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gWVxuICAgIGNvbnN0IHlQb3NpdGlvbiA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luQm90dG9tICsgdmVydGljYWxTcGFjaW5nO1xuXG4gICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoXG4gICAgICBkb2MsXG4gICAgICBjb21tZW50LFxuICAgICAgdGhpcy5URVhUUERGRk9OVC5jb21tZW50Rm9udCxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTdHlsZSxcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTaXplLFxuICAgICAgeFBvc2l0aW9uLFxuICAgICAgeVBvc2l0aW9uLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRleHRJblBkZkRvYyhcbiAgICBkb2M6IGpzUERGLFxuICAgIHRleHRUb0FkZDogc3RyaW5nLFxuICAgIHRleHRGb250OiBzdHJpbmcsXG4gICAgdGV4dEZvbnRTdHlsZTogc3RyaW5nLFxuICAgIHRleHRGb250U2l6ZTogbnVtYmVyLFxuICAgIHRleHRNYXJnaW5MZWZ0OiBudW1iZXIsXG4gICAgdGV4dE1hcmdpblRvcDogbnVtYmVyLFxuICAgIGlzQ29tbWVudDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRvYy5zZXRGb250KHRleHRGb250LCB0ZXh0Rm9udFN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUodGV4dEZvbnRTaXplKTtcblxuICAgIGlmIChpc0NvbW1lbnQpIHtcbiAgICAgIHRleHRUb0FkZCA9IGRvYy5zcGxpdFRleHRUb1NpemUoXG4gICAgICAgIHRleHRUb0FkZCxcbiAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSB0ZXh0TWFyZ2luTGVmdCAqIDNcbiAgICAgICk7XG4gICAgfVxuICAgIGRvYy50ZXh0KHRleHRUb0FkZCwgdGV4dE1hcmdpbkxlZnQsIHRleHRNYXJnaW5Ub3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBwcm9qZWN0aW9uIGFuZC9vciBzY2FsZSB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGRwaSAtIERQSSByZXNvbHV0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgKiBAcGFyYW0gIHByb2plY3Rpb24gLSBCb29sIHRvIGluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIHNjYWxlIC0gQm9vbCB0byBpbmRpY2F0ZSBpZiBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkXG4gICAqIEBwYXJhbSBiYXNlTWFyZ2lucyAtIHRvcCB8IHJpZ2h0IHwgYm90dG9tIHwgbGVmdFxuICAgKiBAcGFyYW0gdmVydGljYWxTcGFjaW5nIC0gY2FsY3VsYXRlIHRleHQgcG9zaXRpb24gYW5kIG1hcCBoZWlnaHRcbiAgICovXG4gIHByaXZhdGUgYWRkUHJvalNjYWxlKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgZHBpOiBudW1iZXIsXG4gICAgcHJvamVjdGlvbjogYm9vbGVhbixcbiAgICBzY2FsZTogYm9vbGVhbixcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdmVydGljYWxTcGFjaW5nOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gY2FsY3VsYXRlIG1hcCBpbWFnZSBoZWlnaHRcbiAgICBiYXNlTWFyZ2luc1syXSArPSB2ZXJ0aWNhbFNwYWNpbmc7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGNvbnN0IHByb2pTY2FsZVNpemUgPSAxMjtcbiAgICBjb25zdCB4UG9zaXRpb24gPSBiYXNlTWFyZ2luc1szXTtcbiAgICBjb25zdCBtYXJnaW5Cb3R0b20gPSBiYXNlTWFyZ2luc1syXTtcbiAgICAvLyBjYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBZXG4gICAgY29uc3QgeVBvc2l0aW9uID1cbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5Cb3R0b20gKyB2ZXJ0aWNhbFNwYWNpbmc7XG5cbiAgICBsZXQgdGV4dFByb2pTY2FsZTogc3RyaW5nID0gJyc7XG4gICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHByb2pUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnByb2plY3Rpb24nKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb247XG4gICAgfVxuICAgIGlmIChzY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgdGV4dFByb2pTY2FsZSArPSAnICAgJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUoZHBpKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gc2NhbGVUZXh0ICsgJzogfiAxIC8gJyArIGZvcm1hdFNjYWxlKG1hcFNjYWxlKTtcbiAgICB9XG4gICAgZG9jLnNldEZvbnQodGhpcy5URVhUUERGRk9OVC5jb21tZW50Rm9udCk7XG4gICAgZG9jLnNldEZvbnRTaXplKHByb2pTY2FsZVNpemUpO1xuICAgIGRvYy50ZXh0KHRleHRQcm9qU2NhbGUsIHhQb3NpdGlvbiwgeVBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIGRpdi5zdHlsZS56SW5kZXggPSAnLTEnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZW1vdmVIdG1sRWxlbWVudChkaXYpO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGNvbnN0IHBvdXJjZW50YWdlUmVkdWN0aW9uID0gMC44NTtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtcbiAgICAgICAgKHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMud2lkdGgpKSAvIHJlc29sdXRpb24sXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLmhlaWdodCkpIC8gcmVzb2x1dGlvblxuICAgICAgXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBiYXNlTWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhZGRMZWdlbmRTYW1lUGFnZShcbiAgICBkb2M6IGpzUERGLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZ1xuICApIHtcbiAgICAvLyBHZXQgaHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcbiAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XG4gICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH0pO1xuICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICBsZXQgbWFyZ2luc0xlZ2VuZDtcbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbXG4gICAgICAgIChwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSkgLyByZXNvbHV0aW9uLFxuICAgICAgICAocG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy5oZWlnaHQpKSAvIHJlc29sdXRpb25cbiAgICAgIF07XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1syXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1sxXSxcbiAgICAgICAgICBiYXNlTWFyZ2luc1syXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBtYXJnaW5zTGVnZW5kID0gW1xuICAgICAgICAgIGJhc2VNYXJnaW5zWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBiYXNlTWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXVxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbWxlZnQnKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXG4gICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbXG4gICAgICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIGJhc2VNYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdLFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIGJhc2VNYXJnaW5zWzNdIC0gaW1hZ2VTaXplWzBdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzJdLFxuICAgICAgICAgIGJhc2VNYXJnaW5zWzNdXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFtcbiAgICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBiYXNlTWFyZ2luc1szXSAtIGltYWdlU2l6ZVswXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gYmFzZU1hcmdpbnNbMF0gLSBpbWFnZVNpemVbMV0sXG4gICAgICAgICAgYmFzZU1hcmdpbnNbM11cbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zTGVnZW5kKTsgLy8gdGhpcyBhZGRzIHRoZSBsZWdlbmRcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuICAgIH1cbiAgfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc1BERixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIGJhc2VNYXJnaW5zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICApIHtcbiAgICBsZXQgaW1hZ2U7XG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGltYWdlLmxlbmd0aCA8IDIwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXYXJuaW5nOiBBbiBpbWFnZSBjYW5ub3QgYmUgcHJpbnQgaW4gcGRmIGZpbGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW1hZ2VTaXplID0gdGhpcy5nZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIGJhc2VNYXJnaW5zWzNdLFxuICAgICAgICBiYXNlTWFyZ2luc1swXSxcbiAgICAgICAgaW1hZ2VTaXplWzBdLFxuICAgICAgICBpbWFnZVNpemVbMV1cbiAgICAgICk7XG4gICAgICBkb2MucmVjdChiYXNlTWFyZ2luc1szXSwgYmFzZU1hcmdpbnNbMF0sIGltYWdlU2l6ZVswXSwgaW1hZ2VTaXplWzFdKTtcbiAgICAgIHRoaXMuaW1nU2l6ZUFkZGVkID0gaW1hZ2VTaXplOyAvLyBrZWVwIGltZyBzaXplIGZvciBnZW9yZWYgbGF0ZXJcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIGZpeCBwcmludGluZyB3aXRoIGltYWdlIHJlc29sdXRpb25cbiAgYWRkTWFwKFxuICAgIGRvYzoganNQREYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGltYWdlRGltZW5zaW9uczogW251bWJlciwgbnVtYmVyXSxcbiAgICBiYXNlTWFyZ2luczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgbGVnZW5kUG9zdGlvbjogUHJpbnRMZWdlbmRQb3NpdGlvblxuICApIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG4gICAgY29uc3QgZGltZW5zaW9uUGl4ZWxzID0gdGhpcy5zZXRNYXBSZXNvbHV0aW9uKFxuICAgICAgbWFwLFxuICAgICAgaW1hZ2VEaW1lbnNpb25zLFxuICAgICAgcmVzb2x1dGlvbixcbiAgICAgIHZpZXdSZXNvbHV0aW9uXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGxldCB0aW1lb3V0O1xuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICAgICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gYXdhaXQgdGhpcy5kcmF3TWFwKGRpbWVuc2lvblBpeGVscywgbWFwQ2FudmFzKTtcblxuICAgICAgdGhpcy5tYXBQcmludEV4dGVudCA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoJ0VQU0c6Mzg1NycpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuXG4gICAgICBhd2FpdCB0aGlzLmRyYXdNYXBDb250cm9scyhtYXAsIG1hcFJlc3VsdENhbnZhcywgbGVnZW5kUG9zdGlvbik7XG5cbiAgICAgIGNvbnN0IG1hcFN0YXR1cyQkID0gbWFwLnN0YXR1cyQuc3Vic2NyaWJlKChtYXBTdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAobWFwU3RhdHVzICE9PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWFwUmVzdWx0Q2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIG1hcFJlc3VsdENhbnZhcywgYmFzZU1hcmdpbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JyxcbiAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm8gbG9hZGluZyBhcyBzdGFydGVkIGFmdGVyIDIwMG1zLCB0aGVuIHByb2JhYmx5IG5vIGxvYWRpbmdcbiAgICAgIC8vIGlzIHJlcXVpcmVkLlxuICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtYXBSZXN1bHRDYW52YXMud2lkdGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgbWFwUmVzdWx0Q2FudmFzLCBiYXNlTWFyZ2lucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgbWFwU2l6ZSwgdmlld1Jlc29sdXRpb24pO1xuICAgICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWFwUmVzb2x1dGlvbihcbiAgICBtYXA6IElnb01hcCxcbiAgICBpbml0aWFsU2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKTtcbiAgICBjb25zdCB3aWR0aFBpeGVscyA9IE1hdGgucm91bmQoKGluaXRpYWxTaXplWzBdICogcmVzb2x1dGlvbikgLyAyNS40KTtcbiAgICBjb25zdCBoZWlnaHRQaXhlbHMgPSBNYXRoLnJvdW5kKChpbml0aWFsU2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG5cbiAgICAvLyBTZXQgcHJpbnQgc2l6ZVxuICAgIGNvbnN0IHByaW50U2l6ZSA9IFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgICBtYXAub2wuc2V0U2l6ZShwcmludFNpemUpO1xuICAgIGNvbnN0IHNjYWxpbmcgPSBNYXRoLm1pbihcbiAgICAgIHdpZHRoUGl4ZWxzIC8gbWFwU2l6ZVswXSxcbiAgICAgIGhlaWdodFBpeGVscyAvIG1hcFNpemVbMV1cbiAgICApO1xuICAgIG1hcC5vbC5nZXRWaWV3KCkuc2V0UmVzb2x1dGlvbih2aWV3UmVzb2x1dGlvbiAvIHNjYWxpbmcpO1xuXG4gICAgcmV0dXJuIFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRPcmlnaW5hbE1hcFNpemUoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgdmlld1Jlc29sdXRpb246IG51bWJlclxuICApIHtcbiAgICBtYXAub2wuc2V0U2l6ZShpbml0aWFsU2l6ZSk7XG4gICAgbWFwLm9sLmdldFZpZXcoKS5zZXRSZXNvbHV0aW9uKHZpZXdSZXNvbHV0aW9uKTtcbiAgICBtYXAub2wudXBkYXRlU2l6ZSgpO1xuICAgIG1hcC5vbC5yZW5kZXJTeW5jKCk7XG4gIH1cblxuICBhc3luYyBkcmF3TWFwKFxuICAgIHNpemU6IEFycmF5PG51bWJlcj4sXG4gICAgbWFwQ2FudmFzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PlxuICApOiBQcm9taXNlPEhUTUxDYW52YXNFbGVtZW50PiB7XG4gICAgY29uc3QgbWFwUmVzdWx0Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgbWFwUmVzdWx0Q2FudmFzLndpZHRoID0gc2l6ZVswXTtcbiAgICBtYXBSZXN1bHRDYW52YXMuaGVpZ2h0ID0gc2l6ZVsxXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXBDYW52YXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBtYXBDYW52YXNbaW5kZXhdO1xuICAgICAgaWYgKGNhbnZhcy53aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDYW52YXMoY2FudmFzLCBtYXBSZXN1bHRDYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Q2FudmFzO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXMoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXBSZXN1bHRDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gICkge1xuICAgIGNvbnN0IG1hcENvbnRleHRSZXN1bHQgPSBtYXBSZXN1bHRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUub3BhY2l0eSB8fCBjYW52YXMuc3R5bGUub3BhY2l0eTtcbiAgICBtYXBDb250ZXh0UmVzdWx0Lmdsb2JhbEFscGhhID0gb3BhY2l0eSA9PT0gJycgPyAxIDogTnVtYmVyKG9wYWNpdHkpO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGNhbnZhcy5zdHlsZS50cmFuc2Zvcm07XG4gICAgbGV0IG1hdHJpeDogbnVtYmVyW107XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm0gcGFyYW1ldGVycyBmcm9tIHRoZSBzdHlsZSdzIHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybVxuICAgICAgICAubWF0Y2goL15tYXRyaXhcXCgoW15cXChdKilcXCkkLylbMV1cbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChOdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRyaXggPSBbXG4gICAgICAgIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSAvIGNhbnZhcy53aWR0aCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSAvIGNhbnZhcy5oZWlnaHQsXG4gICAgICAgIDAsXG4gICAgICAgIDBcbiAgICAgIF07XG4gICAgfVxuICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc2V0VHJhbnNmb3JtLmFwcGx5KFxuICAgICAgbWFwQ29udGV4dFJlc3VsdCxcbiAgICAgIG1hdHJpeFxuICAgICk7XG4gICAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIG1hcENvbnRleHRSZXN1bHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgbWFwQ29udGV4dFJlc3VsdC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIH1cbiAgICBtYXBDb250ZXh0UmVzdWx0LmRyYXdJbWFnZShjYW52YXMsIDAsIDApO1xuICAgIG1hcENvbnRleHRSZXN1bHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgIC8vIHJlc2V0IGNhbnZhcyB0cmFuc2Zvcm0gdG8gaW5pdGlhbFxuICAgIG1hcENvbnRleHRSZXN1bHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICB9XG5cbiAgYXN5bmMgZHJhd01hcENvbnRyb2xzKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIEdldCB0aGUgc2NhbGUgYW5kIGF0dHJpYnV0aW9uXG4gICAgLy8gd2UgdXNlIGNsb25lTm9kZSB0byBtb2RpZnkgdGhlIG5vZGVzIHRvIHByaW50IHdpdGhvdXQgbW9kaWZ5aW5nIGl0IG9uIHRoZSBwYWdlLCB1c2luZyBkZWVwOnRydWUgdG8gZ2V0IGNoaWxkcmVuXG4gICAgY29uc3QgbWFwT3ZlcmxheUhUTUwgPSBtYXAub2xcbiAgICAgIC5nZXRPdmVybGF5Q29udGFpbmVyU3RvcEV2ZW50KClcbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gYWRkIE5vcnRoIERpcmVjdGlvbiB0byBtYXBPdmVybHlcbiAgICBhd2FpdCB0aGlzLmFkZE5vcnRoRGlyZWN0aW9uKG1hcE92ZXJsYXlIVE1MLCBwb3NpdGlvbik7XG4gICAgLy8gYWRkIG1hcCBBdHRyaWJ1dGlvbiBkZXNpZ25lIHRvIHByaW50XG4gICAgYXdhaXQgdGhpcy5hZGRBdHRyaWJ1dGlvbihtYXBPdmVybGF5SFRNTCk7XG5cbiAgICAvLyBzZXQgJ092ZXJsYXlDb250YWluZXInIHNpemUgdG8gcHJpbnQgc2l6ZVxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLndpZHRoID0gY2FudmFzLndpZHRoICsgJ3B4JztcbiAgICBtYXBPdmVybGF5SFRNTC5zdHlsZS5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAvLyB3ZSBhZGQgemluZGV4IC0xIHRvIG5vdCBzaG93IG1vZGlmaWNhdGlvbiB0byB0aGUgdXNlclxuICAgIG1hcE92ZXJsYXlIVE1MLnN0eWxlLnpJbmRleCA9ICctMSc7XG4gICAgLy8gYW5kIG1ha2Ugc3VyZSBodG1sMmNhbnZhcyB0byByZW5kZXIgdGhlIGltYWdlIGNvcnJlY3RseVxuICAgIGRvY3VtZW50XG4gICAgICAuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnb2wtdmlld3BvcnQnKVswXVxuICAgICAgLmFwcGVuZENoaWxkKG1hcE92ZXJsYXlIVE1MKTtcbiAgICAvLyBDaGFuZ2UgdGhlIHN0eWxlcyBvZiBoeXBlcmxpbmsgaW4gdGhlIHByaW50ZWQgdmVyc2lvblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgT3ZlcmxheSBpbnRvIGEgY2FudmFzXG4gICAgLy8gc2NhbGUgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgaW4gZ29vZ2xlIGNocm9tZVxuICAgIC8vIGJhY2tncm91bmQgYXMgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyB3aGl0ZSBhbmQgY292ZXIgdGhlIG1hcFxuICAgIC8vIGFsbG93dGFpbnQgaXMgdG8gYWxsb3cgcmVuZGVyaW5nIGltYWdlcyBpbiB0aGUgYXR0cmlidXRpb25zXG4gICAgLy8gdXNlQ09SUzogdHJ1ZSBwb3VyIHBlcm1ldHRyZSBkZSByZW5kZXJlciBsZXMgaW1hZ2VzIChuZSBtYXJjaGUgcGFzIGVuIGxvY2FsKVxuICAgIGNvbnN0IGNhbnZhc092ZXJsYXlIVE1MID0gYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheUhUTUwsIHtcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgYWxsb3dUYWludDogdHJ1ZSxcbiAgICAgIHVzZUNPUlM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjYW52YXNPdmVybGF5SFRNTC53aWR0aCAhPT0gMCAmJiBjYW52YXNPdmVybGF5SFRNTC5oZWlnaHQgIT09IDApIHtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGNhbnZhc092ZXJsYXlIVE1MLCAwLCAwKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgJ21hcE92ZXJsYXlIVE1MJyBhZnRlciBnZW5lcmF0aW5nIGNhbnZhc1xuICAgIG1hcE92ZXJsYXlIVE1MLnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGROb3J0aERpcmVjdGlvbihcbiAgICBtYXBPdmVybGF5SFRNTDogSFRNTEVsZW1lbnQsXG4gICAgcG9zaXRpb246IFByaW50TGVnZW5kUG9zaXRpb25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ydGhEaXJlY3Rpb24gPSBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZ28tcm90YXRpb24tYnV0dG9uJylbMF1cbiAgICAgIC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgSFRNTEJ1dHRvbiA9IG5vcnRoRGlyZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKFxuICAgICAgJ2J1dHRvbidcbiAgICApWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGluIGNhc2UgbGVnZW5kIHBvc2l0aW9uIGlzIHRvcHJpZ2h0XG4gICAgLy8gd2UgY2hhbmdlIHJvdGF0ZSBidG4gdG8gdG9wbGVmdFxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgbm9ydGhEaXJlY3Rpb24uc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgICBub3J0aERpcmVjdGlvbi5zdHlsZS5sZWZ0ID0gJzEwcHgnO1xuICAgIH1cbiAgICBIVE1MQnV0dG9uLnBhcmVudEVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgSFRNTEJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMDAwJztcbiAgICBtYXBPdmVybGF5SFRNTC5hcHBlbmRDaGlsZChub3J0aERpcmVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEF0dHJpYnV0aW9uKG1hcE92ZXJsYXlIVE1MOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEhUTUxhdHRyaWJ1dGlvbiA9XG4gICAgICBtYXBPdmVybGF5SFRNTC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdvbC1hdHRyaWJ1dGlvbicpWzBdO1xuICAgIGNvbnN0IEhUTUxCdXR0b24gPSBIVE1MYXR0cmlidXRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpWzBdO1xuICAgIGlmICghSFRNTEJ1dHRvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIEhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XG4gICAgY29uc3Qgb2xDb2xsYXBzZWQ6IGJvb2xlYW4gPVxuICAgICAgSFRNTGF0dHJpYnV0aW9uLmNsYXNzTGlzdC5jb250YWlucygnb2wtY29sbGFwc2VkJyk7XG4gICAgaWYgKG9sQ29sbGFwc2VkKSB7XG4gICAgICBIVE1MYXR0cmlidXRpb24uY2xhc3NMaXN0LnJlbW92ZSgnb2wtY29sbGFwc2VkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcHJpbnRSZXNvbHV0aW9uOiBQcmludFJlc29sdXRpb24sXG4gICAgZm9ybWF0ID0gJ3BuZycsXG4gICAgcHJvamVjdGlvbiA9IGZhbHNlLFxuICAgIHNjYWxlID0gZmFsc2UsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBzdWJ0aXRsZSA9ICcnLFxuICAgIGNvbW1lbnQgPSAnJyxcbiAgICBkb1ppcEZpbGUgPSB0cnVlLFxuICAgIGxlZ2VuZFBvc2l0aW9uOiBQcmludExlZ2VuZFBvc2l0aW9uXG4gICkge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlO1xuICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSArcHJpbnRSZXNvbHV0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxNYXBTaXplID0gbWFwLm9sLmdldFNpemUoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IHZpZXdSZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG5cbiAgICBtYXAub2wub25jZSgncmVuZGVyY29tcGxldGUnLCBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBtYXBDYW52YXMgPSBldmVudC50YXJnZXRcbiAgICAgICAgLmdldFZpZXdwb3J0KClcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICAgIGNvbnN0IG1hcFJlc3VsdENhbnZhcyA9IGF3YWl0IHRoaXMuZHJhd01hcChzaXplLCBtYXBDYW52YXMpO1xuXG4gICAgICB0aGlzLnJlc2V0T3JpZ2luYWxNYXBTaXplKG1hcCwgaW5pdGlhbE1hcFNpemUsIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgICAgYXdhaXQgdGhpcy5kcmF3TWFwQ29udHJvbHMobWFwLCBtYXBSZXN1bHRDYW52YXMsIGxlZ2VuZFBvc2l0aW9uKTtcbiAgICAgIC8vIENoZWNrIHRoZSBsZWdlbmRQb3NpdGlvblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uICE9PSAnbm9uZScpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uXG4gICAgICAgICAgKSA+IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kVG9JbWFnZShcbiAgICAgICAgICAgIG1hcFJlc3VsdENhbnZhcyxcbiAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgICAgIGZvcm1hdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICduZXdwYWdlJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UobWFwLCBmb3JtYXQsIGRvWmlwRmlsZSwgcmVzb2x1dGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFkZCBvdGhlciBpbmZvcm1hdGlvbiB0byBmaW5hbCBjYW52YXMgYmVmb3JlIGV4cG9ydGluZ1xuICAgICAgY29uc3QgbmV3Q2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjb25zdCBuZXdDb250ZXh0ID0gbmV3Q2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAvLyBQb3N0aW9uIGluIGhlaWdodCB0byBzZXQgdGhlIGNhbnZhcyBpbiBuZXcgY2FudmFzXG4gICAgICBsZXQgcG9zaXRpb25IQ2FudmFzID0gMDtcbiAgICAgIC8vIEdldCBoZWlnaHQvd2lkdGggb2YgbWFwIGNhbnZhc1xuICAgICAgY29uc3Qgd2lkdGggPSBtYXBSZXN1bHRDYW52YXMud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gbWFwUmVzdWx0Q2FudmFzLmhlaWdodDtcbiAgICAgIC8vIFNldCBGb250IHRvIGNhbGN1bGF0ZSBjb21tZW50IHdpZHRoXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIGNvbnN0IGNvbW1lbnRXaWR0aCA9IG5ld0NvbnRleHQubWVhc3VyZVRleHQoY29tbWVudCkud2lkdGg7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciB0aXRsZSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHN1YnRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBwcm9qZWN0aW9uICE9PSBmYWxzZSB8fCBzY2FsZSAhPT0gZmFsc2UgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSFByb2pTY2FsZSA9IGhlaWdodCAtIDEwO1xuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcbiAgICAgIGNvbnN0IGNvbW1lbnROYkxpbmUgPSBNYXRoLmNlaWwoY29tbWVudFdpZHRoIC8gd2lkdGgpO1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgbXVsdGlsaW5lIGNvbW1lbnQgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XG4gICAgICBsZXQgcG9zaXRpb25IQ29tbWVudCA9IGhlaWdodCAtIGNvbW1lbnROYkxpbmUgKiAyMCArIDU7XG4gICAgICAvLyBTZXQgdGhlIG5ldyBjYW52YXMgd2l0aCB0aGUgbmV3IGNhbGN1bGF0ZWQgc2l6ZVxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoWydibXAnLCAnZ2lmJywgJ2pwZWcnLCAncG5nJywgJ3RpZmYnXS5pbmRleE9mKGZvcm1hdCkgPiAtMSkge1xuICAgICAgICAvLyBQYXRjaCBKcGVnIGRlZmF1bHQgYmxhY2sgYmFja2dyb3VuZCB0byB3aGl0ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9ybWF0ID09PSAnanBlZycgfHxcbiAgICAgICAgICB0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBzdWJ0aXRsZSAhPT0gJycgfHxcbiAgICAgICAgICBjb21tZW50ICE9PSAnJyB8fFxuICAgICAgICAgIHByb2plY3Rpb24gIT09IGZhbHNlIHx8XG4gICAgICAgICAgc2NhbGUgIT09IGZhbHNlXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xuICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIGEgdGl0bGUgbmVlZCB0byBiZSBhZGRlZCB0byBjYW52YXNcbiAgICAgIGlmICh0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSAzMDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dCh0aXRsZSwgd2lkdGggLyAyLCAyMCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3VidGl0bGUgIT09ICcnKSB7XG4gICAgICAgIC8vIFNldCBmb250IGZvciBzdWJ0aXRsZVxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxuICAgICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjZweCBDYWxpYnJpJztcbiAgICAgICAgcG9zaXRpb25IQ2FudmFzID0gNjA7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoc3VidGl0bGUsIHdpZHRoIC8gMiwgNTAsIHdpZHRoICogMC45KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGZvbnQgZm9yIG5leHQgc2VjdGlvblxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XG4gICAgICAvLyBJZiBwcm9qZWN0aW9uIG9yL2VuZCBzY2FsZSBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgcHJvamVjdGlvblNjYWxlVGV4dCA9ICcnO1xuICAgICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBwcm9qVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5wcm9qZWN0aW9uJyk7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCA9IHByb2pUZXh0ICsgJzogJyArIG1hcC5wcm9qZWN0aW9uICsgJyAgICAgICAgICc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnNjYWxlJyk7XG4gICAgICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbik7XG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCxcbiAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgcG9zaXRpb25IUHJvalNjYWxlLFxuICAgICAgICAgIHdpZHRoICogMC45XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgY29tbWVudCBuZWVkIHRvIGJlIGFkZGVkIHRvIGNhbnZhc1xuICAgICAgaWYgKGNvbW1lbnQgIT09ICcnKSB7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIGxpbmUsIG5vIG5lZWQgdG8gbXVsdGlsaW5lIHRoZSBjb21tZW50XG4gICAgICAgIGlmIChjb21tZW50TmJMaW5lID09PSAxKSB7XG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChjb21tZW50LCB3aWR0aCAvIDIsIHBvc2l0aW9uSENvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIHRoZSBzZXRlbnNlcyB0byBiZSBhcHByb3guIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICAgIGNvbnN0IG5iQ29tbWVudENoYXIgPSBjb21tZW50Lmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBDb21tZW50TGVuZ3RoVG9DdXQgPSBNYXRoLmZsb29yKG5iQ29tbWVudENoYXIgLyBjb21tZW50TmJMaW5lKTtcbiAgICAgICAgICBsZXQgY29tbWVudEN1cnJlbnRMaW5lID0gJyc7XG4gICAgICAgICAgbGV0IHBvc2l0aW9uRmlyc3RDdXRDaGFyID0gMDtcbiAgICAgICAgICBsZXQgcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgLy8gTG9vcCBmb3IgdGhlIG51bWJlciBvZiBsaW5lIGNhbGN1bGF0ZWRcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnROYkxpbmU7IGkrKykge1xuICAgICAgICAgICAgLy8gRm9yIGFsbCBsaW5lIGV4Y2VwdCBsYXN0XG4gICAgICAgICAgICBpZiAoY29tbWVudE5iTGluZSAtIDEgPiBpKSB7XG4gICAgICAgICAgICAgIC8vIEdldCBjb21tZW50IGN1cnJlbnQgbGluZSB0byBmaW5kIHRoZSByaWdodCBwbGFjZSB0dSBjdXQgY29tbWVudFxuICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUgPSBjb21tZW50LnN1YnN0cihcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhcixcbiAgICAgICAgICAgICAgICBDb21tZW50TGVuZ3RoVG9DdXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQ3V0IHRoZSBzZXRlbmNlIGF0IGJsYW5rXG4gICAgICAgICAgICAgIHBvc2l0aW9uTGFzdEJsYW5rID0gY29tbWVudEN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCcgJyk7XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudEN1cnJlbnRMaW5lLnN1YnN0cigwLCBwb3NpdGlvbkxhc3RCbGFuayksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcG9zaXRpb25GaXJzdEN1dENoYXIgKz0gcG9zaXRpb25MYXN0Qmxhbms7XG4gICAgICAgICAgICAgIC8vIEdvIHRvIG5leHQgbGluZSBmb3IgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnQgKz0gMjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjdXQgbGFzdCBwYXJ0XG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICAgICAgY29tbWVudC5zdWJzdHIocG9zaXRpb25GaXJzdEN1dENoYXIpLFxuICAgICAgICAgICAgICAgIHdpZHRoIC8gMixcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkhDb21tZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5ld0NvbnRleHQuZHJhd0ltYWdlKG1hcFJlc3VsdENhbnZhcywgMCwgcG9zaXRpb25IQ2FudmFzKTtcblxuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgIGxldCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICBmaWxlTmFtZVdpdGhFeHQgPVxuICAgICAgICAgICdtYXAnICsgbWFwLnByb2plY3Rpb24ucmVwbGFjZSgnOicsICdfJykgKyAnLicgKyBmb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUobmV3Q2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChuZXdDYW52YXMsIGZpbGVOYW1lV2l0aEV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKG5ld0NhbnZhcywgZmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICB9XG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGZ3RmlsZU5hbWVXaXRoRXh0ID1cbiAgICAgICAgICBmaWxlTmFtZVdpdGhFeHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZpbGVOYW1lV2l0aEV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy50aWZmJylcbiAgICAgICAgICApICsgJy50ZncnO1xuICAgICAgICBjb25zdCB0aXdDb250ZW50ID0gdGhpcy5nZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApO1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Rpd0NvbnRlbnRdLCB7XG4gICAgICAgICAgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCdcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZG9aaXBGaWxlKSB7XG4gICAgICAgICAgLy8gc2F2ZUFzIGF1dG9tYXRpY2x5IHJlcGxhY2UgJzonIGZvciAnXydcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgdGZ3RmlsZU5hbWVXaXRoRXh0KTtcbiAgICAgICAgICB0aGlzLnNhdmVGaWxlUHJvY2Vzc2luZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKHRmd0ZpbGVOYW1lV2l0aEV4dCwgYmxvYik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0TWFwSW1hZ2VSZXNvbHV0aW9uKG1hcCwgaW5pdGlhbE1hcFNpemUsIHJlc29sdXRpb24sIHZpZXdSZXNvbHV0aW9uKTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNYXBJbWFnZVJlc29sdXRpb24oXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgaW5pdGlhbE1hcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIHZpZXdSZXNvbHV0aW9uOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSByZXNvbHV0aW9uIC8gOTY7XG4gICAgY29uc3QgbmV3TWFwU2l6ZSA9IFtcbiAgICAgIE1hdGgucm91bmQoaW5pdGlhbE1hcFNpemVbMF0gKiBzY2FsZUZhY3RvciksIC8vIHdpZHRoXG4gICAgICBNYXRoLnJvdW5kKGluaXRpYWxNYXBTaXplWzFdICogc2NhbGVGYWN0b3IpIC8vIGhlaWdodFxuICAgIF07XG4gICAgbWFwLm9sLnNldFNpemUobmV3TWFwU2l6ZSk7XG4gICAgY29uc3Qgc2NhbGluZyA9IE1hdGgubWluKFxuICAgICAgbmV3TWFwU2l6ZVswXSAvIGluaXRpYWxNYXBTaXplWzBdLFxuICAgICAgbmV3TWFwU2l6ZVsxXSAvIGluaXRpYWxNYXBTaXplWzFdXG4gICAgKTtcbiAgICBjb25zdCB2aWV3ID0gbWFwLm9sLmdldFZpZXcoKTtcbiAgICB2aWV3LnNldFJlc29sdXRpb24odmlld1Jlc29sdXRpb24gLyBzY2FsaW5nKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgQWRkIExlZ2VuZCB0byB0aGUgbWFwIGNhbnZhc1xuICAgKiBAcGFyYW0gIGNhbnZhcyBDYW52YXMgb2YgdGhlIG1hcFxuICAgKiBAcGFyYW0gIG1hcCBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIHJlc29sdXRpb24gUmVzb2x1dGlvbiBvZiBtYXBcbiAgICogQHBhcmFtICBsZWdlbmRQb3NpdGlvbiBMZWdlbmQgcG9zaXRpb25cbiAgICogQHBhcmFtICBmb3JtYXQgSW1hZ2UgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFRvSW1hZ2UoXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbiAgICBtYXA6IElnb01hcCxcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXG4gICAgbGVnZW5kUG9zaXRpb246IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICBjYW52YXMud2lkdGgsXG4gICAgICByZXNvbHV0aW9uXG4gICAgKS50b1Byb21pc2UoKTtcbiAgICAvLyBJZiBubyBsZWdlbmQsIHNhdmUgdGhlIG1hcCBkaXJlY3RseVxuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICBkaXYuc3R5bGUuekluZGV4ID0gJy0xJztcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXNMZWdlbmQgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaChcbiAgICAgIChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FudmFzTGVnZW5kKSB7XG4gICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgICBjb25zdCBsZWdlbmRIZWlnaHQgPSBjYW52YXNMZWdlbmQuaGVpZ2h0O1xuICAgICAgY29uc3QgbGVnZW5kV2lkdGggPSBjYW52YXNMZWdlbmQud2lkdGg7XG4gICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgIGNvbnN0IG9mZnNldCA9IGNhbnZhc0hlaWdodCAqIDAuMDE7XG4gICAgICBsZXQgbGVnZW5kWDogbnVtYmVyO1xuICAgICAgbGV0IGxlZ2VuZFk6IG51bWJlcjtcblxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tcmlnaHQnKSB7XG4gICAgICAgIGxlZ2VuZFggPSBjYW52YXNXaWR0aCAtIGxlZ2VuZFdpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xuICAgICAgICBsZWdlbmRYID0gY2FudmFzV2lkdGggLSBsZWdlbmRXaWR0aCAtIG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICBsZWdlbmRYID0gb2Zmc2V0O1xuICAgICAgICBsZWdlbmRZID0gY2FudmFzSGVpZ2h0IC0gbGVnZW5kSGVpZ2h0IC0gb2Zmc2V0IC0gMTU7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgbGVnZW5kWCA9IG9mZnNldDtcbiAgICAgICAgbGVnZW5kWSA9IG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIGNhbnZhc0xlZ2VuZCxcbiAgICAgICAgbGVnZW5kWCxcbiAgICAgICAgbGVnZW5kWSxcbiAgICAgICAgbGVnZW5kV2lkdGgsXG4gICAgICAgIGxlZ2VuZEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChsZWdlbmRYLCBsZWdlbmRZLCBsZWdlbmRXaWR0aCwgbGVnZW5kSGVpZ2h0KTtcbiAgICAgIHRoaXMucmVtb3ZlSHRtbEVsZW1lbnQoZGl2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTWFwKG1hcCwgc2l6ZSwgZXh0ZW50KSB7XG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBEb2N1bWVudCB0byBzYXZlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURvYyhkb2M6IGpzUERGKSB7XG4gICAgYXdhaXQgZG9jLnNhdmUoJ21hcF9nZW9yZWYucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBnZXRJbWFnZVNpemVUb0ZpdFBkZihkb2MsIGNhbnZhcywgbWFyZ2lucykge1xuICAgIC8vIERlZmluZSB2YXJpYWJsZSB0byBjYWxjdWxhdGUgYmVzdCBzaXplIHRvIGZpdCBpbiBvbmUgcGFnZVxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gKG1hcmdpbnNbMF0gKyBtYXJnaW5zWzJdKTtcbiAgICBjb25zdCBwYWdlV2lkdGggPVxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCkgLSAobWFyZ2luc1sxXSArIG1hcmdpbnNbM10pO1xuICAgIGNvbnN0IGNhbkhlaWdodCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMuaGVpZ2h0LCAnbW0nKTtcbiAgICBjb25zdCBjYW5XaWR0aCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMud2lkdGgsICdtbScpO1xuXG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBjYW5IZWlnaHQgLyBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjYW5XaWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBtYXhSYXRpbyA9IGhlaWdodFJhdGlvID4gd2lkdGhSYXRpbyA/IGhlaWdodFJhdGlvIDogd2lkdGhSYXRpbztcbiAgICBjb25zdCBpbWdIZWlnaCA9IG1heFJhdGlvID4gMSA/IGNhbkhlaWdodCAvIG1heFJhdGlvIDogY2FuSGVpZ2h0O1xuICAgIGNvbnN0IGltZ1dpZHRoID0gbWF4UmF0aW8gPiAxID8gY2FuV2lkdGggLyBtYXhSYXRpbyA6IGNhbldpZHRoO1xuICAgIHJldHVybiBbaW1nV2lkdGgsIGltZ0hlaWdoXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3b3JsZCBmaWxlIGluZm9ybWF0aW9uIGZvciB0aWZmXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICovXG4gIHByaXZhdGUgZ2V0V29ybGRGaWxlSW5mb3JtYXRpb24obWFwKSB7XG4gICAgY29uc3QgY3VycmVudFJlc29sdXRpb24gPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0UmVzb2x1dGlvbigpO1xuICAgIGNvbnN0IGN1cnJlbnRFeHRlbnQgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCk7IC8vIFJldHVybiBbbWlueCwgbWlueSwgbWF4eCwgbWF4eV1cbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFJlc29sdXRpb24sXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC1jdXJyZW50UmVzb2x1dGlvbixcbiAgICAgIGN1cnJlbnRFeHRlbnRbMF0gKyBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNSxcbiAgICAgIGN1cnJlbnRFeHRlbnRbM10gLSBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNVxuICAgIF0uam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjYW52YXMgaW1hZ2UgYXMgZmlsZVxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIHRvIHNhdmVcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBmaWxlIGZvcm1hdFxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCBuYW1lV2l0aEV4dCwgZm9ybWF0KSB7XG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgIC8vIGRvd25sb2FkIGltYWdlXG4gICAgICAgIHNhdmVBcyhibG9iLCBuYW1lV2l0aEV4dCk7XG4gICAgICAgIHRoYXQuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsXG4gICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGZpbGUgdG8gYSB6aXBcbiAgICogQHBhcmFtIGNhbnZhcyAtIEZpbGUgdG8gYWRkIHRvIHRoZSB6aXBcbiAgICogQHBhcmFtICBuYW1lIC1OYW1lIG9mIHRoZSBmaWxlb3ZlcnZpZXdcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsIG5hbWUpIHtcbiAgICBjb25zdCBibG9iRm9ybWF0ID0gJ2ltYWdlLycgKyAnanBlZyc7XG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzT3duUHJvcGVydHkoJ3ppcEZpbGUnKSB8fFxuICAgICAgdHlwZW9mIHRoaXMuemlwRmlsZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIHRoaXMuemlwRmlsZSA9IG5ldyBKU1ppcCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjYW52YXMudG9EYXRhVVJMKCk7IC8vIEp1c3QgdG8gbWFrZSB0aGUgY2F0Y2ggdHJpZ2dlciB3aWh0b3V0IHRvQmxvYiBFcnJvciB0aHJvdyBub3QgY2F0Y2hlZFxuICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgIHRoaXMuYWRkRmlsZVRvWmlwKG5hbWUsIGNhbnZhcy5tc1RvQmxvYigpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgICB0aGF0LmFkZEZpbGVUb1ppcChuYW1lLCBibG9iKTtcbiAgICAgICAgfSwgYmxvYkZvcm1hdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLFxuICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBmaWxlIHRvIHppcCwgaWYgYWxsIGZpbGUgYXJlIHppcHBlZCwgZG93bmxvYWRcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRhaW4gb2YgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xuICAgIC8vIGFkZCBmaWxlIHRvIHppcFxuICAgIHRoaXMuemlwRmlsZS5maWxlKG5hbWUsIGJsb2IpO1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIERvd25sb2FkIHppcCBmaWxlXG4gICAgICB0aGlzLmdldFppcEZpbGUoKTtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUZpbGVQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHppcHBlZCBmaWxlXG4gICAqIEByZXR1cm4gUmV0dW4gYSB6aXAgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRaaXBGaWxlKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIC8vIDEpIGdlbmVyYXRlIHRoZSB6aXAgZmlsZVxuICAgICAgc2F2ZUFzKGJsb2IsICdtYXAuemlwJyk7XG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwZGZfdW5pdHMycG9pbnRzKG4sIHVuaXQpOiBudW1iZXIge1xuICAgIGxldCBrID0gMTtcblxuICAgIC8vIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIGpzUERGXG4gICAgLy8gIGFzIGl0IGRvZXMgbm90IGV4cG9zZSBhIHB1YmxpYyBBUElcbiAgICAvLyAgZm9yIGNvbnZlcnRpbmcgdW5pdHMgdG8gcG9pbnRzLlxuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAncHQnOlxuICAgICAgICBrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtbSc6XG4gICAgICAgIGsgPSA3MiAvIDI1LjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY20nOlxuICAgICAgICBrID0gNzIgLyAyLjU0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgayA9IDcyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3B4JzpcbiAgICAgICAgayA9IDk2IC8gNzI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGMnOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW0nOlxuICAgICAgICBrID0gMTI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXgnOlxuICAgICAgICBrID0gNjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5pdDogJyArIHVuaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBuICogaztcbiAgfVxufVxuIl19
|