@jax-data-science/sci-image-visualizer 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -11
- package/esm2022/index.mjs +20 -1
- package/esm2022/lib/contracts/display-types.mjs +20 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +36 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
- package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +5 -3
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
- package/esm2022/lib/routing-visualizer.service.mjs +223 -12
- package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
- package/esm2022/lib/spatial/gene-search.mjs +77 -0
- package/esm2022/lib/spatial/spatial-density.mjs +224 -0
- package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
- package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
- package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
- package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
- package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
- package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
- package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
- package/esm2022/lib/spatial/world-grid.mjs +77 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
- package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
- package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +2 -2
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +9 -9
- package/esm2022/lib/toolbar/toolbar.component.mjs +30 -7
- package/esm2022/lib/visualization.module.mjs +23 -5
- package/esm2022/lib/visualizer.component.mjs +283 -22
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15282 -7829
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/tsne.worker.js +19091 -0
- package/index.d.ts +15 -0
- package/lib/contracts/display-types.d.ts +131 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/contracts/plot-type.d.ts +42 -2
- package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
- package/lib/contracts/visualizer.contract.d.ts +99 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
- package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
- package/lib/implementations/osd/osd-zoom.d.ts +19 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
- package/lib/implementations/plotly/plotly.service.d.ts +9 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
- package/lib/routing-visualizer.service.d.ts +45 -6
- package/lib/spatial/embedding-compute.d.ts +73 -0
- package/lib/spatial/gene-search.d.ts +48 -0
- package/lib/spatial/spatial-density.d.ts +73 -0
- package/lib/spatial/spatial-encoding.d.ts +155 -0
- package/lib/spatial/spatial-expression.d.ts +144 -0
- package/lib/spatial/spatial-framing.d.ts +37 -0
- package/lib/spatial/spatial-heatmap.d.ts +111 -0
- package/lib/spatial/spatial-hover.d.ts +49 -0
- package/lib/spatial/spatial-sections.d.ts +59 -0
- package/lib/spatial/spatial-selection.d.ts +113 -0
- package/lib/spatial/spatial-volume-image.d.ts +67 -0
- package/lib/spatial/tsne-worker.d.ts +7 -0
- package/lib/spatial/world-grid.d.ts +58 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
- package/lib/store/spatial-selection.service.d.ts +27 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/lib/toolbar/toolbar.component.d.ts +19 -3
- package/lib/visualization.module.d.ts +28 -24
- package/lib/visualizer.component.d.ts +73 -2
- package/package.json +7 -3
- package/src/lib/assets/spatial-omics-3d.svg +31 -0
- package/src/lib/assets/spatial-omics.svg +27 -0
|
@@ -3,6 +3,7 @@ import { HttpClient } from '@angular/common/http';
|
|
|
3
3
|
import { BehaviorSubject, Subject, combineLatest, firstValueFrom, of } from 'rxjs';
|
|
4
4
|
import { timeout } from 'rxjs/operators';
|
|
5
5
|
import { OSD } from './osd-lib';
|
|
6
|
+
import { OSD_ZOOM_PER_SCROLL } from './osd-zoom';
|
|
6
7
|
import { VisualizerStore } from '../../store/visualizer-store.service';
|
|
7
8
|
import { RegionStore } from '../../store/region-store.service';
|
|
8
9
|
import { TILE_ACCESS_PORT } from '../../contracts/ports/tile-access.port';
|
|
@@ -787,8 +788,9 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
|
|
|
787
788
|
ajaxHeaders: this.authHeaders, // bearer auth (Auth0), when available
|
|
788
789
|
crossOriginPolicy: 'Anonymous',
|
|
789
790
|
// Gentler zoom: the default (1.2) feels fast and big jumps cross several
|
|
790
|
-
// pyramid levels at once, firing a burst of tile requests.
|
|
791
|
-
|
|
791
|
+
// pyramid levels at once, firing a burst of tile requests. Shared with the
|
|
792
|
+
// region overlay, which takes the wheel over while a tool is active.
|
|
793
|
+
zoomPerScroll: OSD_ZOOM_PER_SCROLL,
|
|
792
794
|
// Click-to-zoom toward the clicked point (OpenSeadragon's default demo
|
|
793
795
|
// behaviour). Only applies when no region tool is active — an active tool
|
|
794
796
|
// disables OSD mouse-nav so clicks draw/select instead of zooming.
|
|
@@ -2034,4 +2036,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
2034
2036
|
type: Inject,
|
|
2035
2037
|
args: [VIZ_CONFIG]
|
|
2036
2038
|
}] }] });
|
|
2037
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVB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WUFDM0IsTUFBTSxHQUFHLEdBQWUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQzdELE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpD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QUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs4R0F0MURVLDhCQUE4Qiw0Q0E0SS9CLGdCQUFnQixtTEFNSixjQUFjLDRNQU0xQixVQUFVO2tIQXhKVCw4QkFBOEIsY0FEakIsTUFBTTs7MkZBQ25CLDhCQUE4QjtrQkFEMUMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQTZJN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQU12QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQU1qQyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0ICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5cblxuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlQWNjZXNzUG9ydCwgVElMRV9BQ0NFU1NfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IFZpekNvbmZpZywgVklaX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFBpeGVsRGF0YSwgSW50ZW5zaXR5UHJvZmlsZSwgSUlzb3N1cmZhY2VDb250cm9scywgSUludGVuc2l0eUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9vc2QtcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgT3NkU2NhbGVCYXIgfSBmcm9tICcuL29zZC1zY2FsZS1iYXInO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXksIFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuL29zZC1jb29yZGluYXRlLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VSZWN0VG9WaWV3cG9ydCwgdmlld3BvcnRSZWN0VG9JbWFnZSB9IGZyb20gJy4vb3NkLWNvb3Jkcyc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZUJpdG1hcCB9IGZyb20gJy4vdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgU2xpY2VDYWNoZSB9IGZyb20gJy4vc2xpY2UtY2FjaGUnO1xuaW1wb3J0IHsgRGlzcGxheVBpcGVsaW5lIH0gZnJvbSAnLi9kaXNwbGF5LXBpcGVsaW5lJztcbmltcG9ydCB7IEhpc3RvZ3JhbVNhbXBsZXIgfSBmcm9tICcuL2hpc3RvZ3JhbS1zYW1wbGVyJztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UsIFpvb21Ub0JveFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci96b29tLXRvLWJveC96b29tLXRvLWJveC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IGJ1aWxkQ29sb3JtYXBMdXQsIFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5cbi8qKlxuICogUXVpZXQgT3BlblNlYWRyYWdvbidzIFwiW1ZpZXdwb3J0LipdIGlzIG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlXCIgYWR2aXNvcmllcy5cbiAqIEEgbXVsdGljaGFubmVsIGltYWdlIGlzIGNvbXBvc2l0ZWQgZnJvbSBvbmUgVGlsZWRJbWFnZSBwZXIgY2hhbm5lbCDigJQgYSBsZWdpdGltYXRlXG4gKiBtdWx0aS1pbWFnZSB3b3JsZCDigJQgYW5kIE9TRCBsb2dzIHRoYXQgYWR2aXNvcnkgKGF0IGVycm9yIGxldmVsKSBmcm9tIGl0cyBvd25cbiAqIG5hdmlnYXRvci9vdmVydmlldyByZW5kZXJpbmcgb24gZXZlcnkgYW5pbWF0aW9uIGZyYW1lLCBmbG9vZGluZyB0aGUgY29uc29sZS4gT3VyXG4gKiBvd24gaW1hZ2U8LT52aWV3cG9ydCBjb252ZXJzaW9ucyBhbHJlYWR5IHJvdXRlIHRocm91Z2ggd29ybGQgaXRlbSAwIChzZWVcbiAqIG9zZC1jb29yZHMpLCBzbyB0aGUgcmVtYWluaW5nIGFkdmlzb3JpZXMgYXJlIE9TRC1pbnRlcm5hbCBhbmQgb25seSBhZmZlY3QgdGhlXG4gKiBtaW5pbWFwJ3MgYm94IGFjY3VyYWN5IChjb3NtZXRpYykuIFRoaXMgd3JhcHMgT1NEJ3MgbG9nZ2VyIGluIGEgUHJveHkgdGhhdCBkcm9wc1xuICogb25seSB0aGF0IG9uZSBtZXNzYWdlIHN0cmluZyBhbmQgZm9yd2FyZHMgZXZlcnkgb3RoZXIgbG9nIHVudG91Y2hlZC4gSWRlbXBvdGVudC5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpOiB2b2lkIHtcbiAgY29uc3Qgb3NkOiBhbnkgPSBPU0QgYXMgYW55O1xuICBpZiAob3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCkgcmV0dXJuO1xuICBjb25zdCBiYXNlOiBhbnkgPSAob3NkLmNvbnNvbGUgJiYgdHlwZW9mIG9zZC5jb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKVxuICAgID8gb3NkLmNvbnNvbGVcbiAgICA6ICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zb2xlIDogbnVsbCk7XG4gIGlmICghYmFzZSkgcmV0dXJuO1xuICBjb25zdCBpc0Fkdmlzb3J5ID0gKGE6IHVua25vd24pID0+XG4gICAgdHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEuaW5kZXhPZignbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UnKSAhPT0gLTE7XG4gIG9zZC5jb25zb2xlID0gbmV3IFByb3h5KGJhc2UsIHtcbiAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZykge1xuICAgICAgY29uc3Qgb3JpZyA9IHRhcmdldFtwcm9wXTtcbiAgICAgIGlmICgocHJvcCA9PT0gJ2Vycm9yJyB8fCBwcm9wID09PSAnd2FybicpICYmIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHsgaWYgKGlzQWR2aXNvcnkoYXJnc1swXSkpIHJldHVybjsgb3JpZy5hcHBseSh0YXJnZXQsIGFyZ3MpOyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nID8gb3JpZy5iaW5kKHRhcmdldCkgOiBvcmlnO1xuICAgIH0sXG4gIH0pO1xuICBvc2QuX19tdWx0aUltYWdlRmlsdGVySW5zdGFsbGVkID0gdHJ1ZTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AuICovXG5pbnRlcmZhY2UgVGlsZUxldmVsIHsgcmVzOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgLyoqIFRydWUgb25seSBmb3IgZ2VudWluZSBtdWx0aS1jaGFubmVsIGNvbXBvc2l0ZXMgKGluZGV4ZWQvTFVULWJlYXJpbmdcbiAgICogIGZsdW9yZXNjZW5jZSBzdGFja3MpIHRoZSBjbGllbnQgc2hvdWxkIHNwbGl0IGludG8gcGVyLWNoYW5uZWwgbGF5ZXJzLiBUaGVcbiAgICogIHNlcnZlciBzZXRzIGl0OyBhbiBSR0IgcGhvdG8gcmVhZCBhcyBzZXBhcmF0ZWQgcGxhbmVzIGhhcyBjaGFubmVscz4xIGJ1dFxuICAgKiAgbXVsdGljaGFubmVsPWZhbHNlLCBzbyBpdCBzdGF5cyBhIHNpbmdsZSBjb21wb3NpdGUgdGlsZSBzb3VyY2UuICovXG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgdGhlIHJlbWFpbmluZ1xuICAgKiAgbGV2ZWxzIGFyZSBzeW50aGV0aWMgY29tcG9zaXRlZCBvdmVydmlld3MgKG5vIHBlci1jaGFubmVsIHRpbGVzKS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgLyoqIFBlci1jaGFubmVsIG1ldGFkYXRhIChuYW1lL2NvbG9yL2JpdERlcHRoL21pbi1tYXhBbGxvd2VkKSBmb3IgbmF0aXZlIDE2LWJpdFxuICAgKiAgd2luZG93aW5nICsgaGlzdG9ncmFtOyBudWxsIGZvciBwbGFpbiA4LWJpdC9SR0Igc291cmNlcy4gKi9cbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmc7IGJpdERlcHRoPzogbnVtYmVyOyBtaW5BbGxvd2VkPzogbnVtYmVyOyBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBgbG9hZCgpYCBoYW5kcyB0byBgcGxvdCgpYC4gKi9cbmludGVyZmFjZSBPc2RMb2FkZWQge1xuICBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGw7XG4gIGluZm9CNjQ6IHN0cmluZztcbiAgejogbnVtYmVyO1xuICAvKiogTWlycm9ycyB0aGUgbG9hZGVkIGltYWdlJ3MgZmlsZW5hbWUg4oCUIHRoZSBkaWFncmFtJ3MgcmVuZGVyIHBpcGVsaW5lXG4gICAqICBndWFyZHMgb24gYGxvYWRlZC5maWxlbmFtZSA9PT0gcGhhc2VJbmZvLmZpbGVOYW1lYCBiZWZvcmUgY2FsbGluZyBwbG90KCkuICovXG4gIGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBTaW1wbGUgKG5vbi10aWxlZCkgaW1hZ2U6IGBwbG90KClgIG9wZW5zIHtAbGluayB1cmx9IGRpcmVjdGx5IHZpYSBPU0Qnc1xuICAgKiAgc2luZ2xlLWltYWdlIHNvdXJjZSDigJQgbm8gdGlsZSBweXJhbWlkLCBubyBzZXJ2ZXIuIFNldCB3aGVuIHRoZSBpbWFnZVxuICAgKiAgY2FycmllcyBgdGlsZWQgPT09IGZhbHNlYCAoc2VlIHtAbGluayBJSW1hZ2VJbmZvLnRpbGVkfSkuICovXG4gIHNpbXBsZT86IGJvb2xlYW47XG4gIC8qKiBUaGUgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2UgVVJMIChgYmxvYjpgL2BkYXRhOmAvYGh0dHBgKSBmb3Igc2ltcGxlIG1vZGUuICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuU2VhZHJhZ29uIHZpc3VhbGl6YXRpb24gYmFja2VuZC5cbiAqXG4gKiBSZW5kZXJzIHRoZSAqaW1hZ2UqIHBsb3QgdHlwZSBhcyBhIG5hdGl2ZWx5LXRpbGVkLCB6b29tYWJsZSByYXN0ZXIsIGJhY2tlZCBieVxuICogdGhlIGppdC1zZXJ2aWNlIHRpbGUgZW5kcG9pbnRzIChgR0VUIC90aWxlcy9pbmZvYCArIGBHRVQgL3RpbGVgLCB3aGljaCByZXVzZVxuICogdGhlIEJpby1Gb3JtYXRzIFJPSSByZW5kZXJlcikuIFBsb3RseSBrZWVwcyB0aGUgc2NpZW50aWZpYy9kYXRhIHBsb3QgdHlwZXNcbiAqIChzY2FsYXIgaGVhdG1hcCwgc3VyZmFjZSwgY29udG91ciwgc2NhdHRlciwgbGluZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSDigJRcbiAqIGhlbmNlIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIG9ubHkgYEltYWdlRGlzcGxheWAuXG4gKlxuICogV2lyZWQ6IGxvYWQg4oaSIGRlc2NyaXB0b3IsIHBsb3Qg4oaSIG1vdW50IHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlLFxuICogem9vbS9wYW4g4oaSIHZpZXdwb3J0IEFQSS4gTk9UIHdpcmVkIHlldCAoZm9sbG93LXVwcyk6IHJlZ2lvbiBvdmVybGF5cyArIHRvb2xzXG4gKiAoYSBwb3NpdGlvbmVkIGNhbnZhcy9TVkcgb3ZlcmxheSBvciBBbm5vdG9yaW91cyksIHBpeGVsIHJlYWRiYWNrLCBhbmQgdGhlXG4gKiBwZXItdGlsZSBMVVQvY29udHJhc3QgcGFyYW1zLiBOb3QgcmVnaXN0ZXJlZCBpbiBESSBwcm92aWRlcnMg4oCUIGBQbG90bHlTZXJ2aWNlYFxuICogaXMgc3RpbGwgdGhlIG9ubHkgYWN0aXZlIGJhY2tlbmQ7IHRoaXMgcHJvdmVzIHRoZSBjb250cmFjdCBzdXBwb3J0cyBhIHNlY29uZFxuICogaW1wbGVtZW50YXRpb24gYWdhaW5zdCByZWFsIGVuZHBvaW50cy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICAvKiogT1NEJ3Mgc3RyZW5ndGggaXMgZGlzcGxheWluZyBhIGxhcmdlIHpvb21hYmxlIGltYWdlIOKAlCBub3RoaW5nIGVsc2UgaGVyZS4gKi9cbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXldKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdlcjogT3BlblNlYWRyYWdvbi5WaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBJUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBPc2RTY2FsZUJhciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCYXNlNjQgUmF3RmlsZUluZm8gKyBjdXJyZW50IHotc2xpY2UsIGtlcHQgc28gc2V0WkluZGV4IGNhbiByZWJ1aWxkIHRoZVxuICAgKiAgdGlsZSBzb3VyY2UgYW5kIHN3YXAgc2xpY2VzIGxpdmUgKHN0YWNrIG5hdmlnYXRpb24pLiAqL1xuICBwcml2YXRlIGluZm9CNjQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50WiA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBjdXJyZW50IGltYWdlIGlzIFwic2ltcGxlXCIgKHRpbGVkOmZhbHNlIOKAlCBzZWxmLWNvbnRhaW5lZFxuICAgKiAgcGVyLXNsaWNlIFVSTHMsIG5vIHRpbGUgc2VydmVyOyBlLmcuIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZFxuICAgKiAgY2xpZW50LXNpZGUgaW50byBhIHN0YWNrKS4gc2V0WkluZGV4IHN3YXBzIHRoZSBzaW5nbGUtaW1hZ2Ugc291cmNlIGZvclxuICAgKiAgdGhlIG5ldyBzbGljZSdzIFVSTCBpbnN0ZWFkIG9mIHVwZGF0aW5nIGEgdGlsZWQgei1wYXJhbS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVNb2RlID0gZmFsc2U7XG4gIC8qKiB1cmxzW10gZm9yIHRoZSBjdXJyZW50IHNpbXBsZS1tb2RlIGltYWdlLCBzbyBzZXRaSW5kZXggY2FuIGxvb2sgdXAgdGhlXG4gICAqICBzbGljZSBiZWluZyBzY3J1YmJlZCB0byAodmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UudXJsRm9yfSkuXG4gICAqICBVbnVzZWQgKGFuZCBsZWZ0IHN0YWxlLCBoYXJtbGVzc2x5KSBpbiB0aWxlZCBtb2RlLiAqL1xuICBwcml2YXRlIHNpbXBsZVVybHM6IHN0cmluZ1tdID0gW107XG4gIC8qKiBwcmV2aWV3IGJsb2IgVVJMIOKGkiBmdWxsLXJlcyB1cHNjYWxlZCBibG9iIFVSTCAoc2VlIHRvRnVsbFJlc1VybCksIHNvXG4gICAqICByZS12aXNpdGluZyBhIHNpbXBsZS1tb2RlIHNsaWNlIGRvZXNuJ3QgcmUtdXBzY2FsZS4gUmV2b2tlZCBvbiBmaWxlIGNoYW5nZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaW1wbGVGdWxsUmVzVXJscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsQ291bnQ+MSk6IHRoZSBzdGFjaydzXG4gICAqICBwZXItc2xpY2UgcGVyLWNoYW5uZWwgcGxhbmUgVVJMcywgdGhlIGN1cnJlbnQgc2xpY2UncyBkZWNvZGVkIHBsYW5lcywgYW5kXG4gICAqICB0aGUgbGFzdCBjb21wb3NpdGUgYmxvYiBVUkwuIENvbXBvc2l0ZWQgY2xpZW50LXNpZGUgdmlhIGRpc3BsYXkuY2hhbm5lbFJnYkx1dFxuICAgKiAgKG5vIHRpbGUgc2VydmVyKTsga2VwdCBPRkYgdGhlIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGguICovXG4gIHByaXZhdGUgc2ltcGxlTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFVybHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDaGFubmVsUGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICBwcml2YXRlIHNpbXBsZUNvbXBvc2l0ZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTa2lwIHRoZSBmdWxsLXJlcyB1cHNjYWxlIGFib3ZlIHRoaXMgbG9uZ2VzdC1zaWRlIGRpbWVuc2lvbiDigJQgYSBmb2xkZXJcbiAgICogIHN0YWNrIGlzIHBlci1maWxlIHByZXZpZXdzICh3ZWxsIHVuZGVyIHRoaXMpOyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYW5cbiAgICogIGFjY2lkZW50YWwgZW5vcm1vdXMgY2FudmFzIGFsbG9jYXRpb24uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgU0lNUExFX1VQU0NBTEVfTUFYX0RJTSA9IDgxOTI7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLy8gUmVnaW9uIHN0YXRlIChyZWdpb25zLCBzZWxlY3Rpb24sIHRoZSB1cGRhdGUgZXZlbnQpIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IHRoZSBJUmVnaW9uU3RvcmUgbWV0aG9kcyBiZWxvdyBkZWxlZ2F0ZSB0byBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLy8gSW1hZ2UgbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIGNvbG9ybWFwL3JldmVyc2Ugc28gT1NEIHJlY29sb3JzIGluXG4gICAqIGxvY2stc3RlcCB3aXRoIFBsb3RseS4gSWRlbXBvdGVudCBhbmQgc2VsZi1oZWFsaW5nOiB0aGlzIHNlcnZpY2UgaXMgYSByb290XG4gICAqIHNpbmdsZXRvbiwgYnV0IGB1bnN1YnNjcmliZSgpYCAoY2FsbGVkIG9uIFZpc3VhbGl6ZXJDb21wb25lbnQgZGVzdHJveSlcbiAgICogdGVhcnMgdGhlIHN1YnNjcmlwdGlvbiBkb3duIOKAlCBhbmQgdGhlIGNvbnN0cnVjdG9yIG5ldmVyIHJ1bnMgYWdhaW4uIFNvXG4gICAqIGBwbG90KClgIGNhbGxzIHRoaXMgdG8gcmUtZXN0YWJsaXNoIGl0IGFmdGVyIGEgY29tcG9uZW50IHRlYXJkb3duL3JlY3JlYXRlXG4gICAqIChlLmcuIHN3aXRjaGluZyBpbWFnZXMpLCBvdGhlcndpc2UgY29sb3JtYXAgY2hhbmdlcyB3b3VsZCBiZSBzaWxlbnRseVxuICAgKiBkcm9wcGVkIG9uIGV2ZXJ5IGltYWdlIGFmdGVyIHRoZSBmaXJzdCBzd2l0Y2guXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbG9ybWFwU3ViKSByZXR1cm47XG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCB0aGUgc2luZ2xlIHNvdXJjZVxuICAgIC8vIG9mIHRydXRoIGZvciBib3RoIGJhY2tlbmRzLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBlaXRoZXIgY2hhbmdlcywgc28gT1NEIHJlY29sb3JzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlICsgcGVyLWNoYW5uZWwgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkgKyBpbnZlcnQgYWxsIGxpdmUgaW5cbiAgICAvLyB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgYW55IG9mIHRoZW0gY2hhbmdlcywgc28gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgdXBkYXRlcyB0aGVcbiAgICAvLyBpbWFnZSBsaXZlIGFuZCBPU0Qgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY20sIHJldiwgY2hhbm5lbHMsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY29sb3JMdXQgPSBidWlsZENvbG9ybWFwTHV0KGNtPy5kYXRhPy52YWx1ZSwgISFyZXYpO1xuICAgICAgdGhpcy5jaGFubmVsU3RhdGVzID0gY2hhbm5lbHM7XG4gICAgICB0aGlzLmludmVydEJnID0gISFpbnZlcnQ7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbDogcmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZFxuICAgICAgLy8gcGxhbmVzIHdpdGggdGhlIG5ldyBjaGFubmVsIHN0YXRlcyArIHJlLW9wZW4gKG5vIHRpbGUtaW52YWxpZGF0ZSBwYXRoKS5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkgeyB2b2lkIHRoaXMucmVjb21wb3NpdGVBbmRPcGVuKCk7IHJldHVybjsgfVxuICAgICAgLy8gTXVsdGljaGFubmVsOiBlYWNoIGNoYW5uZWwgaXMgaXRzIG93biBUaWxlZEltYWdlIOKAlCB2aXNpYmlsaXR5IGlzIHRoZVxuICAgICAgLy8gaW1hZ2UncyBvcGFjaXR5ICh3aW5kb3cvZ2FtbWEvY29sb3VyIGFyZSBhcHBsaWVkIGJ5IHJlY29sb3JDaGFubmVsVGlsZVxuICAgICAgLy8gb24gdGhlIGludmFsaWRhdGUgYmVsb3cpLiBSZS1hcHBseWluZyB0aGUgY3VycmVudCBzbGljZSdzIHJldmVhbCBwaWNrcyB1cFxuICAgICAgLy8gdGhlIG5ldyBwZXItY2hhbm5lbCB2aXNpYmlsaXR5IChjYWNoZWQgc2xpY2VzIHN0YXkgaGlkZGVuKS5cbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuY2FjaGUucmV2ZWFsQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgfVxuICAgICAgLy8gcmVxdWVzdEludmFsaWRhdGUodHJ1ZSkgcmVzdG9yZXMgZWFjaCB0aWxlIHRvIGl0cyBvcmlnaW5hbCBkYXRhIGJlZm9yZVxuICAgICAgLy8gcmUtcnVubmluZyByZWNvbG9yVGlsZSwgc28gYSBjaGFuZ2UgYWx3YXlzIG1hcHMgYWZyZXNoIChubyBjb21wb3VuZGluZykuXG4gICAgICAvLyBSR0Igbm93IHJlY29sb3JzIHRvbyAocGVyLWNoYW5uZWwgd2luZG93L3Zpc2liaWxpdHkpLCBzbyBkb24ndCBnYXRlIG9uXG4gICAgICAvLyBncmF5c2NhbGUuIENvYWxlc2NlZDogUHJpbWVORydzIHNsaWRlciBmaXJlcyAob25DaGFuZ2UpIGNvbnRpbnVvdXNseSwgc29cbiAgICAgIC8vIGEgc2luZ2xlIGRyYWcgd291bGQgb3RoZXJ3aXNlIHF1ZXVlIGRvemVucyBvZiBvdmVybGFwcGluZyByZXN0b3JlICtcbiAgICAgIC8vIHJlLXByb2Nlc3Mgcm91bmRzIG92ZXIgZXZlcnkgY2hhbm5lbCBpbWFnZS5cbiAgICAgIHRoaXMuc2NoZWR1bGVJbnZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VlZCB0aGUgSW50ZW5zaXR5IGNoYW5uZWwgd2l0aCBhIG1lYXN1cmVkIGF1dG8td2luZG93IHdoaWxlIGl0J3Mgc3RpbGxcbiAgICogIGF0IGZ1bGwgcmFuZ2UgKG5ldmVyIGNsb2JiZXIgdGhlIHVzZXIncyBtYW51YWwgd2luZG93KTsgaWYgdGhlIHVzZXJcbiAgICogIGFscmVhZHkgd2luZG93ZWQsIGp1c3QgcmUtaW52YWxpZGF0ZSBzbyBwYWludGVkIHRpbGVzIHBpY2sgdGhlIExVVCB1cC4gKi9cbiAgcHJpdmF0ZSBzZWVkR3JheVdpbmRvdyhtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjaDAgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgaWYgKGNoMCAmJiBjaDAubWluID09PSAwICYmIGNoMC5tYXggPT09IDI1NSkge1xuICAgICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoMCwgeyBtaW4sIG1heCB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY29sb3JMdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I/LndvcmxkPy5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGF0YVJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgdGlsZS1zb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIHNlbGVjdGVkIGZpbGUuIFRoZSBgaW5mb2AgcGFyYW0gaXNcbiAgICogdGhlIGJhc2U2NCBSYXdGaWxlSW5mbyB0aGUgcmVzdCBvZiB0aGUgQVBJIHVzZXM7IHRoZSBHRVQgZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBhdXRoIGludGVyY2VwdG9yIChCZWFyZXIpLiBXZSBhbHNvIGdyYWIgYSB0b2tlbiBoZXJlIGZvciBPU0QncyBvd24gdGlsZVxuICAgKiBmZXRjaGVzIChpdHMgbG9hZGVyIGJ5cGFzc2VzIEh0dHBDbGllbnQpLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgLy8gQSBkaWZmZXJlbnQgaW1hZ2Ugd2FzIHNlbGVjdGVkIOKAlCBzdG9wIHRoZSBwcmV2aW91cyBzdGFjaydzIGJhY2tncm91bmRcbiAgICAvLyBsb2FkaW5nIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxldHRpbmcgaXQgZmluaXNoIGJlaGluZCB0aGUgbmV3IGltYWdlLlxuICAgIGlmIChmaWxlbmFtZSAmJiB0aGlzLmN1cnJlbnRGaWxlTmFtZSAmJiBmaWxlbmFtZSAhPT0gdGhpcy5jdXJyZW50RmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAgIHRoaXMucmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTtcbiAgICB9XG4gICAgdGhpcy5zaW1wbGVTdGFjay5ub3RlQWN0aXZlRmlsZShmaWxlbmFtZSk7XG4gICAgLy8gU2ltcGxlIChpbi1tZW1vcnkgLyBub24tdGlsZWQpIGltYWdlOiBza2lwIHRoZSB0aWxlIHNlcnZlciBlbnRpcmVseSDigJQgbm9cbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQsIG5vIC90aWxlcy9pbmZvIHBvbGwuIGB1cmxzW3pJbmRleF1gIGlzIGEgY29tcGxldGUgaW1hZ2VcbiAgICAvLyBPU0Qgb3BlbnMgdmlhIGl0cyBzaW5nbGUtaW1hZ2Ugc291cmNlIChzZWUgcGxvdCgpKS5cbiAgICBpZiAodGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbWFnZUluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkU2ltcGxlKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXMuZ2V0QXV0aEhlYWRlcnMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTsgLy8gZmFsbCBiYWNrIHRvIGNvb2tpZSBhdXRoIChhamF4V2l0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgICAvLyBQb2xsIC90aWxlcy9pbmZvOiB0aGUgYmFja2VuZCByZXR1cm5zIDIwMiB3aGlsZSB0aGUgc291cmNlIGZpbGUgaXMgc3RpbGxcbiAgICAvLyBiZWluZyBjYWNoZWQgKEdDUy0+UFZDKSDigJQgaXQga2lja3MgdGhlIGRvd25sb2FkIG9mZiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBlYWNoIHJlcXVlc3QgaXMgc2hvcnQgKG5vIGxvbmctaGVsZCBjb25uZWN0aW9uIHRvIHRyaXAgaW5ncmVzcy9wcm94eSBvclxuICAgIC8vIGNsaWVudCB0aW1lb3V0cyksIGFuZCAyMDAgd2l0aCB0aGUgZGVzY3JpcHRvciBvbmNlIGl0J3MgcmVhZHkuIFRoZVxuICAgIC8vIGNhY2hlLXByb2dyZXNzIG92ZXJsYXkgc2hvd3MgcHJvZ3Jlc3MgZHVyaW5nIHRoZSB3YWl0LiBXZSBnaXZlIHVwIGFmdGVyXG4gICAgLy8gdGlsZXNJbmZvVGltZW91dE1zIHNvIHRoZSByZW5kZXIgcGlwZWxpbmUgbmV2ZXIgaGFuZ3MgKHRoZSByb3V0ZXIgdGhlblxuICAgIC8vIGZhbGxzIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlKS5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy50aWxlc0luZm9UaW1lb3V0TXM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbGVzL2luZm8gbm90IHJlYWR5IGJlZm9yZSBkZWFkbGluZSDigJQgZmlsZSBzdGlsbCBjYWNoaW5nJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxUaWxlRGVzY3JpcHRvcj4odXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZSh0aW1lb3V0KDQ1MDAwKSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwICYmIHJlc3AuYm9keSkge1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHJlc3AuYm9keTtcbiAgICAgICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiByZXNwLmJvZHksIGluZm9CNjQsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiBBY2NlcHRlZCAob3IgZW1wdHkgYm9keSkg4oaSIHN0aWxsIGNhY2hpbmc7IGZhbGwgdGhyb3VnaCBhbmQgcmUtcG9sbC5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUb2xlcmF0ZSB0cmFuc2llbnQgZmFpbHVyZXMgV0hJTEUgdGhlIGZpbGUgaXMgYmVpbmcgcHJlcGFyZWQ6IGEgc2xvd1xuICAgICAgICAvLyBtZXRhZGF0YSByZWFkIG9uIGEgbXVsdGktR0IgZmlsZSAoSUZEIHdhbGspLCBhIDV4eCBtaWQtcGlwZWxpbmUsIGFcbiAgICAgICAgLy8gcHJveHkgaGljY3VwLiBBIHNpbmdsZSBiYWQgcG9sbCBtdXN0IE5PVCBkcm9wIHVzIHRvIFBsb3RseSDigJQgYSBsYXJnZVxuICAgICAgICAvLyBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhpcyBidXN5IHdpbmRvdywgc28gYmFpbGluZyBoZXJlIGlzIHdoeVxuICAgICAgICAvLyBpdCBcImFsd2F5cyBlbmRzIHVwIG9uIFBsb3RseVwiLiBLZWVwIHBvbGxpbmcgdW50aWwgcmVhZHkgb3IgZGVhZGxpbmUuXG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDE1MDApKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIGBwbG90KClgIHBheWxvYWQgZm9yIGEgc2ltcGxlICh0aWxlZDpmYWxzZSkgaW1hZ2U6IGEgc2luZ2xlLWxldmVsXG4gICAqICBkZXNjcmlwdG9yIHNpemVkIGZyb20gYHRydWVJbWFnZVNpemVgLCBwbHVzIHRoZSBkaXJlY3RseS1sb2FkYWJsZSBVUkwg4oCUXG4gICAqICByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEge0BsaW5rIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZX0gKHNoYXJlZCB3aXRoXG4gICAqICBuYXBhcmktanM7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSByYXcgYGZldGNoKClgL2A8aW1nPmApLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGUoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgeiA9IHpJbmRleCB8fCAwO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IG1ldGEgPSBpbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgLy8gU0VSVkVSTEVTUyBNVUxUSUNIQU5ORUw6IGNvbXBvc2l0ZSB0aGUgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXNcbiAgICAvLyBjbGllbnQtc2lkZSAobm8gdGlsZSBzZXJ2ZXIpLCBkcml2ZW4gYnkgdGhlIGNoYW5uZWwgcGFuZS4gS2VwdCBPRkYgdGhlXG4gICAgLy8gdGlsZWQgaXNNdWx0aUNoYW5uZWwgcGF0aCAoc2VlIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCkuXG4gICAgY29uc3QgY2hVcmxzID0gaW1hZ2VJbmZvLmNoYW5uZWxVcmxzO1xuICAgIHRoaXMuc2ltcGxlTXVsdGljaGFubmVsID0gISFjaFVybHM/Lmxlbmd0aCAmJiAobWV0YT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBsZXQgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gY2hVcmxzIGFzIHN0cmluZ1tdW107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKGNoVXJscyFbel0gPz8gY2hVcmxzIVswXSk7XG4gICAgICAgIHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgIC8vIE5COiBoaXN0b2dyYW1zIGFyZSBiaW5uZWQgaW4gcGxvdCgpLCBBRlRFUiBkZXN0cm95Vmlld2VyIGNsZWFycyB0aGVcbiAgICAgICAgLy8gc2FtcGxlciDigJQgY29tcHV0aW5nIHRoZW0gaGVyZSB3b3VsZCBiZSB3aXBlZCBieSB0aGF0IGNsZWFyLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgZmFpbGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IFtdO1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gW107XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVN0YWNrLnVybEZvcihpbWFnZUluZm8sIHopO1xuICAgICAgaWYgKHJhd1VybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybCk7XG4gICAgICAgICAgLy8gVXBzY2FsZSB0aGUgKGRvd25zY2FsZWQpIHByZXZpZXcgdG8gZnVsbCByZXNvbHV0aW9uIHNvIE9TRCdzIHdvcmxkXG4gICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2Ug4oCUIHNlZSB0b0Z1bGxSZXNVcmwuXG4gICAgICAgICAgdXJsID0gYXdhaXQgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsb2FkYWJsZSBVUkwgKGVtcHR5IHVybHNbXSBvciB0aGUgZmV0Y2ggZmFpbGVkKTogc2lnbmFsIFwiY291bGRuJ3RcbiAgICAvLyBsb2FkXCIgd2l0aCBhIG51bGwgZGVzY3JpcHRvciDigJQgc2FtZSBhcyB0aGUgdGlsZWQgcGF0aCB3aGVuIHRoZXJlJ3Mgbm9cbiAgICAvLyBzZWxlY3RlZC1maWxlIGluZm8g4oCUIHNvIHBsb3QoKSByZXR1cm5zIGZhbHNlIChpdHMgYGlmICghZClgIGd1YXJkKSBhbmRcbiAgICAvLyB0aGUgcm91dGVyIGNhbiBmYWxsIGJhY2ssIGluc3RlYWQgb2YgbW91bnRpbmcgYW4gPGltZz4gd2l0aCBhbiB1bmRlZmluZWRcbiAgICAvLyBzcmMgdGhhdCB0aHJvd3MgYXQgcnVudGltZS5cbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBoYXMgbm8gbG9hZGFibGUgVVJMOyBza2lwcGluZyBPU0QgcmVuZGVyJywgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHosIGZpbGVuYW1lIH07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aWxlU2l6ZTogMCwgICAgICAgICAgICAvLyB1bnVzZWQ6IHNpbXBsZSBtb2RlIG5ldmVyIGNhbGxzIGJ1aWxkVGlsZVNvdXJjZVxuICAgICAgejogMSwgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGZyYW1lXG4gICAgICBjaGFubmVsczogbWV0YT8ucmdiQ2hhbm5lbHMgPz8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSA/IDEgOiAzKSxcbiAgICAgIG11bHRpY2hhbm5lbDogZmFsc2UsXG4gICAgICByZWFsTGV2ZWxzOiAxLFxuICAgICAgbGV2ZWxzOiBbeyByZXM6IDAsIHdpZHRoLCBoZWlnaHQgfV0sXG4gICAgICBtcHBYOiBtZXRhPy5tcHBYID8/IDAsXG4gICAgICBtcHBZOiBtZXRhPy5tcHBZID8/IDAsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZm9CNjQ6ICcnLFxuICAgICAgeixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc2ltcGxlOiB0cnVlLFxuICAgICAgdXJsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT1NEJ3MgYHt0eXBlOidpbWFnZSd9YCBzb3VyY2Ugc2l6ZXMgaXRzIGNvb3JkaW5hdGUgd29ybGQgdG8gdGhlIGltYWdlJ3NcbiAgICogTkFUVVJBTCBwaXhlbHMuIEEgZm9sZGVyLXN0YWNrIHNsaWNlIGlzIGEgc2VydmVyIGAvcHJldmlld2Agd2hvc2UgcGl4ZWwgc2l6ZVxuICAgKiBuZWVkbid0IG1hdGNoIHRoZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ug4oCUIGl0IG1heSBiZSBkb3duc2NhbGVkIChsYXJnZVxuICAgKiBpbWFnZXMpIE9SIGxhcmdlciB0aGFuIHRoZSBkaW1lbnNpb25zIGAvbWV0YWRhdGFgIHJlcG9ydHMuIEVpdGhlciB3YXkgT1NEJ3NcbiAgICogd29ybGQgd291bGQgZGlmZmVyIGZyb20gdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIChRdVBhdGggZ2VvanNvbixcbiAgICogaW4gbGV2ZWwtMCBwaXhlbHMpOiBhIHNtYWxsZXIgcHJldmlldyByZW5kZXJzIFJPSXMgb3ZlcnNpemVkLCBhIGxhcmdlciBvbmVcbiAgICogcmVuZGVycyB0aGVtIHVuZGVyc2l6ZWQvb2Zmc2V0LiBSZXNhbXBsZSB0aGUgcHJldmlldyB0byBFWEFDVExZIHRoZVxuICAgKiBmdWxsLXJlc29sdXRpb24gZGltZW5zaW9ucyAoYmx1cnJ5IGJ1dCBwb3NpdGlvbmFsbHkgZXhhY3Qg4oCUIHNjYWxpbmcgdXAgb3JcbiAgICogZG93biBhcyBuZWVkZWQpIHNvIE9TRCdzIHdvcmxkIG1hdGNoZXMgdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlLCB3aGlsZSBzdGlsbFxuICAgKiB1c2luZyBPU0QncyByZWxpYWJsZSBzaW5nbGUtaW1hZ2UgcmVuZGVyZXIuIENhY2hlZCBwZXIgcHJldmlldyBVUkwgKHJldm9rZWRcbiAgICogb24gZmlsZSBjaGFuZ2UpOyBhIG5vLW9wIHdoZW4gdGhlIHByZXZpZXcgaXMgYWxyZWFkeSBleGFjdGx5IGZ1bGwtcmVzIChzbWFsbFxuICAgKiBpbWFnZXMsIGluLW1lbW9yeSBwaXBlbGluZSBibG9icyksIHdoZW4gdGhlIGRpbXMgYXJlIHVua25vd24sIG9yIHdoZW5cbiAgICogdGhleSdyZSBpbXBsYXVzaWJseSBsYXJnZSAoZ3VhcmRzIGFnYWluc3QgYW4gZW5vcm1vdXMgY2FudmFzKS4gKGppdC11aSM5MylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdG9GdWxsUmVzVXJsKHByZXZpZXdVcmw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSA+IHRoaXMuU0lNUExFX1VQU0NBTEVfTUFYX0RJTSkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5nZXQocHJldmlld1VybCk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHByZXZpZXdVcmw7IC8vIGNvdWxkbid0IGRlY29kZSDigJQgbGV0IE9TRCB0cnkgdGhlIFVSTCBhcy1pc1xuICAgIH1cbiAgICAvLyBBbHJlYWR5IHRoZSBleGFjdCBmdWxsLXJlcyB3b3JsZCDigJQgbm8gcmVzYW1wbGUgbmVlZGVkLiAoQSBwcmV2aWV3IHRoYXQgaXNcbiAgICAvLyBsYXJnZXIgT1Igc21hbGxlciB0aGFuIGZ1bGwtcmVzIG11c3Qgc3RpbGwgYmUgcmVzaXplZCBzbyBPU0QncyB3b3JsZCA9PVxuICAgIC8vIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZTsgb25seSBhbiBleGFjdCBtYXRjaCBpcyBza2lwcGFibGUuKVxuICAgIGlmIChpbWcubmF0dXJhbFdpZHRoID09PSB3aWR0aCAmJiBpbWcubmF0dXJhbEhlaWdodCA9PT0gaGVpZ2h0KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7IC8vIHNjYWxlIHByZXZpZXcgKHVwIG9yIGRvd24pIHRvIGZ1bGwtcmVzXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4gY2FudmFzLnRvQmxvYihyZXNvbHZlKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBmdWxsUmVzVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnNldChwcmV2aWV3VXJsLCBmdWxsUmVzVXJsKTtcbiAgICByZXR1cm4gZnVsbFJlc1VybDtcbiAgfVxuXG4gIC8qKiBTYW1wbGUgYSBTSU1QTEUtbW9kZSBzbGljZSdzIG93biBkZWNvZGVkIHBpeGVscyBpbnRvIHRoZSBoaXN0b2dyYW0g4oCUIHRoZVxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHNhbXBsZXJzIChubyB0aWxlIHNlcnZlcikuIEZpcmUtYW5kLWZvcmdldDtcbiAgICogIGEgZGVjb2RlIGZhaWx1cmUganVzdCBsZWF2ZXMgdGhlIHBhbmUgZW1wdHkgcmF0aGVyIHRoYW4gdGhyb3dpbmcuICovXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHVybCk7XG4gICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgaWYgKCF3IHx8ICFoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6LCBkYXRhLCB0aGlzLmlzR3JheXNjYWxlSW1hZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBoaXN0b2dyYW0gc2FtcGxlIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoICsgZGVjb2RlIGEgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXMgKHNpbmdsZS1iYW5kIGdyYXlzY2FsZSkgaW50b1xuICAgKiAgcGl4ZWwgYnVmZmVycywgZm9yIHRoZSBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCBjb21wb3NpdG9yLiBBdXRoLXNhZmU6IGdvZXNcbiAgICogIHRocm91Z2ggU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChibG9iOi9kYXRhOiBhcy1pczsgaHR0cCB2aWEgSHR0cENsaWVudCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJsczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChjb25zdCB1IG9mIHVybHMgPz8gW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHUpO1xuICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICBpZiAoIXcgfHwgIWgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWN0eCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGNoYW5uZWwgcGxhbmUgZGVjb2RlIGZhaWxlZCcsIGVycik7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBwbGFuZXM7XG4gIH1cblxuICAvKiogQ29tcG9zaXRlIHRoZSBjYWNoZWQgcGVyLWNoYW5uZWwgcGxhbmVzIGludG8gT05FIFJHQkEgaW1hZ2UgdXNpbmcgdGhlXG4gICAqICBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIChjb2xvdXIvd2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIOKAlCB0aGUgY2xpZW50LXNpZGUsXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgcGVyLWNoYW5uZWwgJ2xpZ2h0ZXInIGNvbXBvc2l0b3JcbiAgICogIChzYW1lIGRpc3BsYXkuY2hhbm5lbFJnYkx1dCBtYXRoIGFzIHJlY29sb3JDaGFubmVsVGlsZSwgYXBwbGllZCBwZXItcGxhbmUpLlxuICAgKiAgUmV0dXJucyBhIGJsb2I6IFVSTCBvZiB0aGUgY29tcG9zaXRlIFBORywgcmV2b2tpbmcgdGhlIHByZXZpb3VzIG9uZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwbGFuZXMgPSB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXM7XG4gICAgaWYgKCFwbGFuZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHcgPSBwbGFuZXNbMF0ud2lkdGgsIGggPSBwbGFuZXNbMF0uaGVpZ2h0O1xuICAgIGlmICghdyB8fCAhaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHcgKiBoICogNCk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBwbGFuZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzW2NdO1xuICAgICAgaWYgKHN0ICYmIHN0LnZpc2libGUgPT09IGZhbHNlKSBjb250aW51ZTsgLy8gaGlkZGVuIGNoYW5uZWwgY29udHJpYnV0ZXMgbm90aGluZ1xuICAgICAgY29uc3QgcGxhbmUgPSBwbGFuZXNbY107XG4gICAgICBpZiAocGxhbmUud2lkdGggIT09IHcgfHwgcGxhbmUuaGVpZ2h0ICE9PSBoIHx8ICFwbGFuZS5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICBjb25zdCB7IHIsIGcsIGIgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICAgIGNvbnN0IHBkID0gcGxhbmUuZGF0YTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChwZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsdW0gPSBwZFtpXTsgLy8gc2luZ2xlLWJhbmQgcGxhbmUgKFI9Rz1CKVxuICAgICAgICBvdXRbaV0gKz0gcltsdW1dOyAgICAgICAgICAvLyBVaW50OENsYW1wZWRBcnJheSBjbGFtcHMg4oaSIGFkZGl0aXZlICgnbGlnaHRlcicpXG4gICAgICAgIG91dFtpICsgMV0gKz0gZ1tsdW1dO1xuICAgICAgICBvdXRbaSArIDJdICs9IGJbbHVtXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIG91dFtpXSA9IDI1NTsgLy8gb3BhcXVlXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG91dCwgdywgaCksIDAsIDApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlcykgPT4gY2FudmFzLnRvQmxvYihyZXMsICdpbWFnZS9wbmcnKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7XG4gICAgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHJldHVybiB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybDtcbiAgfVxuXG4gIC8qKiBSZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkIHBsYW5lcyAobmV3IGNoYW5uZWwgc3RhdGVzKVxuICAgKiAgYW5kIHJlLW9wZW4g4oCUIHRoZSBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgaW52YWxpZGF0ZS1vbi1jaGFubmVsLWNoYW5nZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbXBvc2l0ZUFuZE9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICBpZiAoIXVybCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0cnkgeyB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTsgfSBjYXRjaCB7IC8qIHZpZXdlciBnb25lICovIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGEgVVJMIGludG8gYW4gSFRNTEltYWdlRWxlbWVudCAocmVzb2x2ZXMgb25jZSBkZWNvZGVkKS4gVXNlc1xuICAgKiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCByYXRoZXIgdGhhbiBgbmV3IEltYWdlKClgIGJlY2F1c2UgdGhpcyBmaWxlJ3NcbiAgICogIGBJbWFnZWAgaW1wb3J0IGlzIGltYWdlLWpzJ3MgZGVjb2Rlciwgbm90IHRoZSBET00gZWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VFbCh1cmw6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG4gICAgICBpbWcub25lcnJvciA9IChlKSA9PiByZWplY3QoZSk7XG4gICAgICBpbWcuc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXZva2VTaW1wbGVGdWxsUmVzVXJscygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy52YWx1ZXMoKSkgVVJMLnJldm9rZU9iamVjdFVSTCh1KTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpOyB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IG51bGw7IH1cbiAgfVxuXG4gIC8qKiBNb3VudCB0aGUgdmlld2VyIHdpdGggYSBjdXN0b20gdGlsZSBzb3VyY2UgcG9pbnRpbmcgYXQgYEdFVCAvdGlsZWAuICovXG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiBhbnksXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIF9zY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBfcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBpbWFnZUxvYWRlZCBhcyBPc2RMb2FkZWQ7XG4gICAgY29uc3QgZCA9IGxvYWRlZD8uZGVzY3JpcHRvcjtcbiAgICBpZiAoIWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIC8vIFJlLWVzdGFibGlzaCB0aGUgY29sb3JtYXAgc3Vic2NyaXB0aW9uIGlmIGEgcHJpb3IgY29tcG9uZW50IHRlYXJkb3duXG4gICAgLy8gKHVuc3Vic2NyaWJlKCkpIHRvcmUgaXQgZG93biDigJQgdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdCBzaW5nbGV0b24sIHNvIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yIHdvbid0IHJ1biBhZ2FpbiB0byByZWNyZWF0ZSBpdC5cbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gICAgLy8gT1NEIHRpbGVzIG5hdGl2ZWx5LCBzbyB0aGUgaW4tcGxhY2UgKGxhcmdlKSBwYXNzIGlzIG5vcm1hbGx5IGEgbm8tb3BcbiAgICAvLyBvbmNlIG1vdW50ZWQg4oCUIHRoZSB0aWxlIHB5cmFtaWQgSVMgdGhlIGZ1bGwgcmVzb2x1dGlvbiByZWdhcmRsZXNzIG9mXG4gICAgLy8gd2hpY2ggSW1hZ2VJbmZvIHRpZXIgcmVxdWVzdGVkIGl0LiBTaW1wbGUgbW9kZSBoYXMgbm8gcHlyYW1pZCB0byBmYWxsXG4gICAgLy8gYmFjayBvbjogaXQgZGlzcGxheXMgbGl0ZXJhbGx5IHdoYXRldmVyIFVSTCB3YXMgbGFzdCBvcGVuZWQsIHNvXG4gICAgLy8gd2l0aG91dCB0aGlzIHN3YXAgdGhlIHNtYWxsIHRpZXIncyAxMjhweCBwbGFjZWhvbGRlciB3b3VsZCBzdGF5IG9uXG4gICAgLy8gc2NyZWVuIGZvcmV2ZXIgKHBpeGVsYXRlZCwgbmV2ZXIgXCJzaGFycGVuaW5nXCIgbGlrZSB0aGUgdGlsZWQgcGF0aCkuXG4gICAgaWYgKGluUGxhY2UgJiYgdGhpcy52aWV3ZXIpIHtcbiAgICAgIGlmIChsb2FkZWQuc2ltcGxlICYmIGxvYWRlZC51cmwpIHtcbiAgICAgICAgLy8gQWxzbyByZWZyZXNoIHNpbXBsZVVybHMgdG8gVEhJUyBwaGFzZSdzIChsYXJnZS10aWVyKSB1cmxzW10g4oCUIGl0IHdhc1xuICAgICAgICAvLyBzZXQgZnJvbSB0aGUgc21hbGwgdGllcidzIDEyOHB4IHVybHMgb24gdGhlIGluaXRpYWwgbW91bnQgYmVsb3csXG4gICAgICAgIC8vIHdoaWNoIG5ldmVyIHJ1bnMgYWdhaW4gZm9yIHRoZSBpbi1wbGFjZSBwYXNzLiBXaXRob3V0IHRoaXMsXG4gICAgICAgIC8vIHNldFpJbmRleCdzIGxhdGVyIHNsaWRlciBzY3J1YnMgd291bGQga2VlcCByZWFkaW5nIHRoZSBzbWFsbFxuICAgICAgICAvLyB0aWVyJ3MgbG93LXJlcyBVUkxzIGZvcmV2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBpbml0aWFsIHNsaWNlIHdhc1xuICAgICAgICAvLyBjb3JyZWN0bHkgc3dhcHBlZCB0byBmdWxsIHJlc29sdXRpb24gaGVyZS5cbiAgICAgICAgdGhpcy5zaW1wbGVVcmxzID0gaW1hZ2VJbmZvPy51cmxzID8/IHRoaXMuc2ltcGxlVXJscztcbiAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIHRoaXMuY3VycmVudEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0b3IgPSBkO1xuICAgIHRoaXMuaW5mb0I2NCA9IGxvYWRlZC5pbmZvQjY0O1xuICAgIHRoaXMuY3VycmVudFogPSBsb2FkZWQuejtcbiAgICB0aGlzLnNpbXBsZU1vZGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgdGhpcy5zaW1wbGVVcmxzID0gbG9hZGVkLnNpbXBsZSA/IChpbWFnZUluZm8/LnVybHMgPz8gW10pIDogW107XG4gICAgLy8gVGhlIGRlc2NyaXB0b3IncyBwaHlzaWNhbCBwaXhlbCBzaXplIChzZXJ2ZXIgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBwdXNoIGl0IGludG8gdGhlIHNoYXJlZCBtZXRhIHNvIHRoZSBSZWdpb24gRWRpdG9yIHJlcG9ydHNcbiAgICAvLyBhcmVhcyBpbiDCtW3Csi9tbcKyLCBtYXRjaGluZyB0aGUgc2NhbGUgYmFyIGJ1aWx0IGZyb20gYGQubXBwWGAgYmVsb3cuXG4gICAgdGhpcy5zdG9yZS5zZXRQaHlzaWNhbFBpeGVsU2l6ZShkLm1wcFgsIGQubXBwWSk7XG4gICAgLy8gVXNlIHRoZSBTQU1FIGdyYXlzY2FsZSBmbGFnIHRoZSBjb2xvcm1hcCBkcm9wZG93biAvIFBsb3RseSB1c2VcbiAgICAvLyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlIOKGkCByZ2JDaGFubmVscyA9PT0gMSkuIFRoZSBkZXNjcmlwdG9yJ3MgYGNoYW5uZWxzYFxuICAgIC8vIChjaGFubmVsQ291bnQpIGRpdmVyZ2VzIGZyb20gcmdiQ2hhbm5lbHMgZm9yIHN0YWNrcywgd2hpY2ggbGVmdCBncmF5c2NhbGVcbiAgICAvLyBzdGFja3MgdW4tcmVjb2xvcmVkIGV2ZW4gdGhvdWdoIHRoZSBjb2xvcm1hcCBzZWxlY3RvciB3YXMgc2hvd24uXG4gICAgdGhpcy5pc0dyYXlzY2FsZUltYWdlID0gISFpbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgIC8vIFNpbXBsZSAobm9uLXRpbGVkLCBpbi1tZW1vcnkpIGltYWdlOiBubyBweXJhbWlkLCBubyBwZXItY2hhbm5lbCB0aWxlcywgYW5kXG4gICAgLy8gbm8gc2VydmVyLXNpZGUgaW50ZW5zaXR5IHNhbXBsaW5nIOKAlCBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXNcbiAgICAvLyB1cmxzW3pdIGRpcmVjdGx5LiBTa2lwIHRoZSB3aG9sZSB0aWxlZC1zZXR1cCBwYXRoIGJlbG93LlxuICAgIGNvbnN0IHNpbXBsZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICBpZiAoc2ltcGxlKSB7XG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSAxO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2VydmVybGVzcyBoaXN0b2dyYW0g4oCUIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgKGl0cyBsYXN0IGFjdCBpcyBzYW1wbGVyLmNsZWFyKCkpLlxuICAgICAgLy8gTXVsdGljaGFubmVsIGJpbnMgZWFjaCBjYWNoZWQgY2hhbm5lbCBwbGFuZTsgc2luZ2xlLWJhbmQgLyBSR0IgYmlucyB0aGVcbiAgICAgIC8vIGRlY29kZWQgZnJhbWUncyBvd24gcGl4ZWxzLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyhsb2FkZWQueiwgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgdGhpcy5zYW1wbGVTaW1wbGVIaXN0b2dyYW0obG9hZGVkLnVybCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChpbmRleGVkL0xVVC1iZWFyaW5nIHN0YWNrcykgY29tcG9zaXRlIGNsaWVudC1zaWRlXG4gICAgICAvLyBmcm9tIHBlci1jaGFubmVsIHRpbGVzLiBUcnVzdCB0aGUgc2VydmVyJ3MgZXhwbGljaXQgYG11bHRpY2hhbm5lbGAgZmxhZyDigJQgdGhlXG4gICAgICAvLyBvbGQgYGNoYW5uZWxzPjEgJiYgZ3JheXNjYWxlYCBoZXVyaXN0aWMgYWxzbyBtYXRjaGVkIFJHQiBwaG90b3MgQmlvLUZvcm1hdHNcbiAgICAgIC8vIHJlYWRzIGFzIHNlcGFyYXRlZCBwbGFuZXMgKGNoYW5uZWxzPjEsIHJnYkNoYW5uZWxzPT0xKSwgc3BsaXR0aW5nIHRoZW0gaW50byBOXG4gICAgICAvLyBwZXItY2hhbm5lbCBUaWxlZEltYWdlcyB0aGF0IGZsb29kZWQgdGhlIHRpbGUgZW5kcG9pbnQgYW5kIGh1bmcgb24gbG9hZC5cbiAgICAgIHRoaXMucmVhbExldmVscyA9IGQucmVhbExldmVscyA/PyBkLmxldmVscy5sZW5ndGg7XG4gICAgICAvLyBUaWxlcyB0byBjb3ZlciB0aGUgd2hvbGUgaW1hZ2UgYXQgdGhlIGNvYXJzZXN0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWwgKHRoZVxuICAgICAgLy8gc21hbGxlc3QgbGV2ZWwgdGhhdCBoYXMgcmVhbCwgcGVyLWNoYW5uZWwtZmV0Y2hhYmxlIHRpbGVzIOKAlCBzeW50aGV0aWMgb3ZlcnZpZXdcbiAgICAgIC8vIGxldmVscyBhcmUgc2VydmVyLWNvbXBvc2l0ZWQgb25seSkuIEEgcHlyYW1pZGFsIGltYWdlJ3MgY29hcnNlc3QgcmVhbCBsZXZlbCBpc1xuICAgICAgLy8gdGlueSAoZmV3IHRpbGVzKTsgYSBmbGF0L25vLXB5cmFtaWQgaW1hZ2UncyBpcyB0aGUgZnVsbC1yZXMgZ3JpZCAobWFueSB0aWxlcykuXG4gICAgICBjb25zdCBjb2Fyc2UgPSBkLmxldmVsc1t0aGlzLnJlYWxMZXZlbHMgLSAxXSA/PyBkLmxldmVsc1tkLmxldmVscy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGNvYXJzZVcgPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLndpZHRoIC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlSCA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2UuaGVpZ2h0IC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlVGlsZXMgPSBjb2Fyc2VXICogY29hcnNlSDtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSAhIWQubXVsdGljaGFubmVsO1xuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgLy8gUGVyLWNoYW5uZWwgcmVuZGVyaW5nIGNhbiBvbmx5IHVzZSB0aGUgUkVBTCBsZXZlbHMsIHNvIE9TRCByZXF1ZXN0cyB0aGVcbiAgICAgICAgLy8gY29hcnNlc3QgcmVhbCBsZXZlbCdzIHdob2xlIHRpbGUgZ3JpZCDDlyBOIGNoYW5uZWxzIGF0IGZpdC4gV2hlbiB0aGF0J3MgbGFyZ2VcbiAgICAgICAgLy8gKGEgd2hvbGUtc2xpZGUpLCBpdCdzIHRvbyBtYW55IChvZnRlbiBzbG93LCBweXJhbWlkLWxlc3MpIGZ1bGwtcmVzIHJlYWRzIOKAlFxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZSBzZXJ2ZXItY29tcG9zaXRlZCBzb3VyY2UgKHdoaWNoIGtlZXBzIHRoZSBmYXN0XG4gICAgICAgIC8vIHN5bnRoZXRpYyBvdmVydmlld3MpLiBBIHNtYWxsIHNpbmdsZS1GT1Ygei1zdGFjayBzdGF5cyBwZXItY2hhbm5lbC4gU2l6ZSBpblxuICAgICAgICAvLyBCWVRFUyBpc24ndCB0aGUgc2lnbmFsIOKAlCB0aWxlIGNvdW50IGlzLlxuICAgICAgICBjb25zdCBmaXRUaWxlcyA9IGNvYXJzZVRpbGVzICogTWF0aC5tYXgoMSwgZC5jaGFubmVscyA/PyAxKTtcbiAgICAgICAgaWYgKGZpdFRpbGVzID4gdGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFUykge1xuICAgICAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW09TRF0gbXVsdGljaGFubmVsIGNvbXBvc2l0ZSB0b28gbGFyZ2UgZm9yIHBlci1jaGFubmVsIHJlbmRlcmluZzogJyArXG4gICAgICAgICAgICBgJHtjb2Fyc2VXfXgke2NvYXJzZUh9IHRpbGVzIHggJHtkLmNoYW5uZWxzfSBjaGFubmVscyA9ICR7Zml0VGlsZXN9IGF0IHRoZSBjb2Fyc2VzdCBgICtcbiAgICAgICAgICAgIGByZWFsIGxldmVsICg+ICR7dGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFU30pOyByZW5kZXJpbmcgc2VydmVyLWNvbXBvc2l0ZWQgZm9yIHNwZWVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIC8vIEF1dG8tcmFuZ2UgZ3JheXNjYWxlIHRpbGVzIHRvIHRoZSBpbWFnZSdzIGFjdHVhbCBpbnRlbnNpdHkgc3BhbiAobGlrZSB0aGVcbiAgICAgIC8vIGhlYXRtYXApLCBzYW1wbGluZyB0aGUgY29hcnNlc3QgdGlsZSBsZXZlbCBzbyB0aGUgd2luZG93IG1hdGNoZXMgdGhlIHJhd1xuICAgICAgLy8gdGlsZSB2YWx1ZXMuIEZpcmUtYW5kLWZvcmdldDogaXQgcmUtaW52YWxpZGF0ZXMgb25jZSB0aGUgd2luZG93IGlzIGtub3duO1xuICAgICAgLy8gdGlsZXMgcGFpbnQgdW53aW5kb3dlZCB1bnRpbCB0aGVuLiAoTXVsdGljaGFubmVsIHdpbmRvd3MgYXJlIHBlci1jaGFubmVsLFxuICAgICAgLy8gZGVmYXVsdGluZyB0byBmdWxsIHJhbmdlOyB0aGUgdXNlciBhdXRvL2VkaXRzIGVhY2ggY2hhbm5lbC4pXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3coZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2l6ZSB0aGUgc2xpY2UgY2FjaGUgZm9yIHRoaXMgaW1hZ2U6IExSVSBjYXAgdG8gaG9sZCB0aGUgd2hvbGUgc3RhY2tcbiAgICAgIC8vIChjYXBwZWQpIGFuZCBza2lwIGJhY2tncm91bmQgcHJlbG9hZGluZyBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBwcmVsb2FkXG4gICAgICAvLyAod291bGQgZmxvb2QgZnVsbC1yZXMgcmVhZHMpLiBOb3JtYWwgc3RhY2tzIGtlZXAgdGhlIGZsaWNrZXItZnJlZSBwcmUtY2FjaGUuXG4gICAgICB0aGlzLmNhY2hlLmNvbmZpZ3VyZShkLnogPz8gMSwgY29hcnNlVGlsZXMpO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBtb2RlOiBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXMgdGhlIFVSTCAoYmxvYjovZGF0YTovaHR0cClcbiAgICAvLyBkaXJlY3RseSDigJQgbm8gcHlyYW1pZCwgbm8gc2VydmVyLiBUaWxlZCBtb2RlOiB0aGUgY3VzdG9tIHNlcnZlci1iYWNrZWQgdGlsZVxuICAgIC8vIHNvdXJjZSAobXVsdGljaGFubmVsIG9wZW5zIG9uIGNoYW5uZWwgMDsgdGhlIG9wZW4gaGFuZGxlciB0aGVuIHN3YXBzIGluIHRoaXNcbiAgICAvLyBzbGljZSdzIHBlci1jaGFubmVsIGdyb3VwIGFuZCB0aGUgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0KS5cbiAgICBjb25zdCB0aWxlU291cmNlID0gc2ltcGxlXG4gICAgICA/IHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH1cbiAgICAgIDogdGhpcy5idWlsZFRpbGVTb3VyY2UoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56LCB0aGlzLmlzTXVsdGlDaGFubmVsID8gMCA6IHVuZGVmaW5lZCk7XG4gICAgc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpO1xuICAgIHRoaXMudmlld2VyID0gKE9TRCBhcyBhbnkpKHtcbiAgICAgIGlkOiBwbG90RGl2LFxuICAgICAgLy8gU2ltcGxlLW1vZGUgei1zY3J1YiBjYWxscyB2aWV3ZXIub3BlbigpIGFnYWluIHBlciBzbGljZSAoc2VlXG4gICAgICAvLyBzZXRaSW5kZXgpIOKAlCB3aXRob3V0IHRoaXMgaXQgcmVzZXRzIHRvIHRoZSBob21lIHpvb20vcGFuIG9uIGV2ZXJ5XG4gICAgICAvLyBzbGljZSBjaGFuZ2UuIFRpbGVkIG1vZGUgbmV2ZXIgcmUtb3BlbnMgKGl0IHRvZ2dsZXMgcHJlLWFkZGVkXG4gICAgICAvLyBUaWxlZEltYWdlcycgb3BhY2l0eSBpbnN0ZWFkKSwgc28gdGhpcyBpcyBhIG5vLW9wIHRoZXJlLlxuICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgIC8vIFVzZSB0aGUgMkQgY2FudmFzIGRyYXdlciwgbm90IFdlYkdMOiBjcmVhdGluZy9kZXN0cm95aW5nIGEgdmlld2VyIG9uXG4gICAgICAvLyBlYWNoIGVuZ2luZSB0b2dnbGUgLyBpbWFnZSBsb2FkIGNodXJucyBXZWJHTCBjb250ZXh0cyAoYnJvd3NlcnMgY2FwXG4gICAgICAvLyBob3cgbWFueSBleGlzdCBhdCBvbmNlKSwgd2hpY2ggc3VyZmFjZXMgYXMgXCJXZWJHTCBjb250ZXh0IHdhcyBsb3N0XCJcbiAgICAgIC8vIGFuZCBibGFuayB0aWxlcy4gVGhlIGNhbnZhcyBkcmF3ZXIgaGFzIG5vIHN1Y2ggbGltaXQuXG4gICAgICBkcmF3ZXI6ICdjYW52YXMnLFxuICAgICAgc2hvd05hdmlnYXRpb25Db250cm9sOiBmYWxzZSwgLy8gYXZvaWRzIG5lZWRpbmcgdGhlIGljb24taW1hZ2UgYXNzZXRzXG4gICAgICAvLyBPdmVydmlldyB0aHVtYm5haWwgd2l0aCB0aGUgY3VycmVudC12aWV3cG9ydCByZWN0YW5nbGUsIGJvdHRvbS1yaWdodC5cbiAgICAgIHNob3dOYXZpZ2F0b3I6IHRoaXMubmF2aWdhdG9yVmlzaWJsZSxcbiAgICAgIC8vIE5lYXJlc3QtbmVpZ2hib3VyIHdoZW4gb2ZmIOKGkiBjcmlzcCBwaXhlbHMgb24gem9vbS1pbiAocGl4ZWwgaW5zcGVjdGlvbikuXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IHRoaXMuc21vb3RoaW5nRW5hYmxlZCxcbiAgICAgIG5hdmlnYXRvclBvc2l0aW9uOiAnQk9UVE9NX1JJR0hUJyxcbiAgICAgIG5hdmlnYXRvclNpemVSYXRpbzogMC4xNixcbiAgICAgIG5hdmlnYXRvckF1dG9GYWRlOiBmYWxzZSxcbiAgICAgIG5hdmlnYXRvckJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLDAuNSknLFxuICAgICAgbG9hZFRpbGVzV2l0aEFqYXg6IHRydWUsXG4gICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiB0cnVlLCAvLyBjb29raWUgYXV0aCAob2F1dGgyLXByb3h5KVxuICAgICAgYWpheEhlYWRlcnM6IHRoaXMuYXV0aEhlYWRlcnMsIC8vIGJlYXJlciBhdXRoIChBdXRoMCksIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjcm9zc09yaWdpblBvbGljeTogJ0Fub255bW91cycsXG4gICAgICAvLyBHZW50bGVyIHpvb206IHRoZSBkZWZhdWx0ICgxLjIpIGZlZWxzIGZhc3QgYW5kIGJpZyBqdW1wcyBjcm9zcyBzZXZlcmFsXG4gICAgICAvLyBweXJhbWlkIGxldmVscyBhdCBvbmNlLCBmaXJpbmcgYSBidXJzdCBvZiB0aWxlIHJlcXVlc3RzLlxuICAgICAgem9vbVBlclNjcm9sbDogMS4xLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIE9TRCdzIHN0b2NrIHZhbHVlLCByZXN0b3JlZC4gRE8gTk9UIFJBSVNFIElUOiB0aGUgbmFtZSByZWFkcyBsaWtlXG4gICAgICAvLyBcIm1pbmltdW0gc2hhcnBuZXNzXCIgYnV0IGl0IGlzIHRoZSBvcHBvc2l0ZS4gRnJvbSBPU0QncyBvd25cbiAgICAgIC8vIFRpbGVkSW1hZ2UuX2dldExldmVsc0ludGVydmFsOlxuICAgICAgLy9cbiAgICAgIC8vICAgaGlnaGVzdExldmVsID0gZmxvb3IoIGxvZzIoIGN1cnJlbnRaZXJvUmF0aW8gLyBtaW5QaXhlbFJhdGlvICkgKVxuICAgICAgLy9cbiAgICAgIC8vIG1pblBpeGVsUmF0aW8gaXMgYSBmbG9vciBvbiBob3cgc21hbGwgYSB0aWxlIHBpeGVsIG1heSBzaHJpbmssIGFuZCBpdFxuICAgICAgLy8gRElWSURFUyBpbnRvIHRoZSByYXRpbyAtIHNvIHJhaXNpbmcgaXQgbG93ZXJzIHRoZSBjaG9zZW4gbGV2ZWwsIGkuZS5cbiAgICAgIC8vIHBpY2tzIGEgQ09BUlNFUiBpbWFnZS4gT1NEJ3Mgb3duIGNvbW1lbnQgb24gdGhlIGRlZmF1bHQgc2F5cyBhcyBtdWNoOlxuICAgICAgLy8gXCJjbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cIi5cbiAgICAgIC8vXG4gICAgICAvLyBNZWFzdXJlZCBvbiBhIGZsYXQgMjIzMDR4MjQ1MjggaW1hZ2UgKGxldmVscyA2OTcvMTM5NC8yNzg4LzU1NzYvMTExNTIvXG4gICAgICAvLyAyMjMwNCksIHByZWRpY3RlZCBsZXZlbCBtYXRjaGluZyBhY3R1YWwgaW4gYWxsIG5pbmUgdHJpYWxzOlxuICAgICAgLy9cbiAgICAgIC8vICAgICAgICAgICAgem9vbSAyICAgICAgICB6b29tIDggICAgICAgIH4xOjFcbiAgICAgIC8vICAgMS4wICAgICAgMS4zNHggdXAgICAgICAxLjM0eCB1cCAgICAgIDEuODZ4IHVwXG4gICAgICAvLyAgIDAuNSAgICAgIDAuNjd4IChub25lKSAgMC42N3ggKG5vbmUpICAwLjkzeCAtPiBmdWxsIHJlc1xuICAgICAgLy8gICAwLjI1ICAgICAwLjMzeCAgICAgICAgIDAuMzN4ICAgICAgICAgMC45M3hcbiAgICAgIC8vXG4gICAgICAvLyAwLjUgaXMgd2hhdCBnaXZlcyBcIm5ldmVyIHVwc2NhbGVkIGJlbG93IG5hdGl2ZSwgZnVsbCByZXNvbHV0aW9uIGF0IDE6MVwiLlxuICAgICAgLy8gMC4yNSBpcyBub3QgYmV0dGVyIC0gaXQganVtcHMgdHdvIHJ1bmdzIGZpbmVyIGFuZCBmZXRjaGVzIH40eCB0aGUgdGlsZXNcbiAgICAgIC8vIGZvciBubyB2aXNpYmxlIGdhaW4sIGFuZCB0aWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgaW5ncmVzcy5cbiAgICAgIG1pblBpeGVsUmF0aW86IDAuNSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBDaHJvbWUgY29tcG9zaXRvciBidWc6IGFmdGVyIGFuIE9TRCB6b29tIHRoZSBkb2NrZWQgdG9vbGJhciAoYSBzaWJsaW5nIG9mXG4gICAgICAgIC8vICNwbG90IGluIHRoZSA8dmlzdWFsaXplcj4gaG9zdCkgaXMgbGVmdCBsYWlkLW91dC1idXQtdW5wYWludGVkIGFuZFxuICAgICAgICAvLyB2YW5pc2hlcyDigJQgY29uZmlybWVkIHZpYSBEZXZUb29scyAoRE9NIGludGFjdCwgcmVnaW9uIHNpbXBseSBub3QgcGFpbnRlZCkuXG4gICAgICAgIC8vIENTUyAoei1pbmRleCAvIGlzb2xhdGlvbiAvIGNvbnRhaW4pIGFuZCBET00tcmVwYXJlbnRpbmcgZG9uJ3QgZml4IGl0OyBhXG4gICAgICAgIC8vIHJlcGFpbnQgcmVsaWFibHkgZG9lcy4gTnVkZ2UgaXQgZWFjaCBhbmltYXRpb24gZnJhbWUgKHNvIGl0IG5ldmVyIHZpc2libHlcbiAgICAgICAgLy8gZHJvcHMpIGFuZCBvbiBzZXR0bGUuIFRoZSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIHdpdGggbm9cbiAgICAgICAgLy8gdmlzaWJsZSBnb25lLWZyYW1lIGFuZCBubyBsYXlvdXQgc2hpZnQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24nLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5udWRnZVRvb2xiYXJSZXBhaW50KCkpO1xuICAgICAgICBpZiAoIXNpbXBsZSkgdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgIC8vIEZvcmNlIGZpdC10by12aWV3IGFzIHRoZSBzcGxpdC9mbGV4IGxheW91dCBzZXR0bGVzLiBBIHRhbGxcbiAgICAgICAgLy8gbm9uLXB5cmFtaWRhbCBpbWFnZSBjYW4gb3RoZXJ3aXNlIG9wZW4gem9vbWVkLWluIChpbWFnZSB3aWR0aCBmaWxsaW5nXG4gICAgICAgIC8vIHRoZSB2aWV3ZXIpLCBtYWtpbmcgT1NEIGRlbWFuZCBzbG93IGZ1bGwtcmVzIHJlcz0wIHRpbGVzIGZvciB0aGVcbiAgICAgICAgLy8gY2VudHJlIGluc3RlYWQgb2YgdGhlIGZhc3QgY29hcnNlIG92ZXJ2aWV3IOKGkiB3aGl0ZSBjYW52YXMuIGdvSG9tZVxuICAgICAgICAvLyBmaXRzIHRoZSB3aG9sZSBpbWFnZSBzbyBPU0Qgc2VsZWN0cyB0aGUgY29hcnNlIHN5bnRoZXRpYyBsZXZlbC4gUmV0cnlcbiAgICAgICAgLy8gYWNyb3NzIGEgZmV3IGZyYW1lcyBiZWNhdXNlIHRoZSBjb250YWluZXIgbWF5IG5vdCBoYXZlIGl0cyBmaW5hbCBzaXplXG4gICAgICAgIC8vIG9uIHRoZSBmaXJzdCBmcmFtZSBhZnRlciAnb3BlbicuXG4gICAgICAgIGNvbnN0IHJlZml0ID0gKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKHRydWUpO1xuICAgICAgICAgICAgLy8gVGhlIG5hdmlnYXRvciB3YXMgc2l6ZWQgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgQkVGT1JFIHRoZVxuICAgICAgICAgICAgLy8gbGF5b3V0IHNldHRsZWQg4oCUIHNvIGl0cyBlbGVtZW50IGNhbiBjYXJyeSBhIHN0YWxlIChldmVuXG4gICAgICAgICAgICAvLyB3cm9uZy1hc3BlY3QpIHNpemUgdGhhdCBmbG9hdHMgdGhlIHZpc2libGUgbWluaW1hcCBhYm92ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcm5lci4gUmUtc2l6ZSBpdCBmcm9tIHRoZSBzZXR0bGVkIGNvbnRhaW5lci5cbiAgICAgICAgICAgIHRoaXMucmVzaXplTmF2aWdhdG9yKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiB0b3JuIGRvd24gKi9cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZpdCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDE1MCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDQwMCk7XG4gICAgICAgIC8vIFRoZSB0aW1lZCByZXRyaWVzIGFib3ZlIG1pc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBTVElMTFxuICAgICAgICAvLyB6ZXJvLXNpemUgYXQgNDAwbXMg4oCUIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgcmVuZGVyIHN0YXJ0cyB3aGlsZSB0aGVcbiAgICAgICAgLy8gZmlsZSB2aWV3ZXIgaXMgbWlkLXN3aXRjaCBmcm9tIHRoZSBmb2xkZXIgdmlldyB0byB0aGUgZGlhZ3JhbSAoZS5nLlxuICAgICAgICAvLyBcIkxvYWQgYXMgU3RhY2tcIiBmcm9tIGEgZm9sZGVyLCB3aXRoIG5vIGltYWdlIG9wZW4gZmlyc3QpLiBCZWNhdXNlXG4gICAgICAgIC8vIHByZXNlcnZlVmlld3BvcnQgc3VwcHJlc3NlcyBPU0QncyBvd24gb3Blbi10aW1lIGZpdCwgdGhlIGltYWdlIHdvdWxkXG4gICAgICAgIC8vIHRoZW4gYmUgbGVmdCB1bi1maXR0ZWQgYXQgdGhlIHRvcC1sZWZ0IChcImEgdGlsZVwiKS4gQSBvbmUtc2hvdFxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBmaXRzIHRoZSBpbnN0YW50IHRoZSBjb250YWluZXIgZmlyc3QgaGFzIGEgcmVhbCBzaXplLFxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHJlbmRlciBiZWdhbiAoaml0LXVpIzEwNikuXG4gICAgICAgIHRoaXMuZml0V2hlbkNvbnRhaW5lclNpemVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpLCByZWZpdCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIG5hdmlnYXRvciBzaXplZCB0byB0aGUgY29udGFpbmVyIGFzIHRoZSBwYW5lbCByZXNpemVzLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVOYXZpZ2F0b3IoKSk7XG4gICAgICAgIGRvbmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gb3Blbi1mYWlsZWQnLCBlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghc2V0dGxlZCkgY29uc29sZS53YXJuKCdbT1NEXSB2aWV3ZXIgb3BlbiB0aW1lZCBvdXQnKTtcbiAgICAgICAgZG9uZShmYWxzZSk7XG4gICAgICB9LCA4MDAwKTtcbiAgICAgIHRoaXMudmlld2VyIS5vcGVuKHRpbGVTb3VyY2UgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXQtdG8taG9tZSBvbmNlIGBlbGAgZmlyc3QgaGFzIGEgbm9uLXplcm8gc2l6ZS4gSWYgaXQncyBhbHJlYWR5IHNpemVkIHdlXG4gICAqIHJlbHkgb24gdGhlIHRpbWVkIHJlZml0cyB0aGUgY2FsbGVyIHNjaGVkdWxlZDsgb3RoZXJ3aXNlIGEgb25lLXNob3RcbiAgICogUmVzaXplT2JzZXJ2ZXIgcnVucyBgcmVmaXRgIHRoZSBtb21lbnQgdGhlIGNvbnRhaW5lciBpcyBsYWlkIG91dCAodGhlblxuICAgKiBkaXNjb25uZWN0cyksIHNvIHRoZSBpbml0aWFsIGZpdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgcmVuZGVyJ3Mgc3RhcnQgdGltZVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZGlhZ3JhbSBjb250YWluZXIncyBsYXlvdXQuIE5vLW9wIHdpdGhvdXQgYSBjb250YWluZXIgb3JcbiAgICogUmVzaXplT2JzZXJ2ZXIgKHRoZSB0aW1lZCByZWZpdHMgcmVtYWluIHRoZSBmYWxsYmFjaykuIE9uZS1zaG90ICsgb25seVxuICAgKiBhdHRhY2hlZCBvbiBhIGZyZXNoIG1vdW50LCBzbyBzbGljZS1zY3J1YiByZS1vcGVucyBrZWVwIHRoZSB1c2VyJ3Mgem9vbS5cbiAgICovXG4gIHByaXZhdGUgZml0V2hlbkNvbnRhaW5lclNpemVkKGVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJlZml0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKCFlbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSByZXR1cm47IC8vIGFscmVhZHkgc2l6ZWQg4oCUIHRpbWVkIHJlZml0cyBzdWZmaWNlXG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgIHJvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVmaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByby5vYnNlcnZlKGVsKTtcbiAgICAvLyBTYWZldHkgbmV0OiBzdG9wIG9ic2VydmluZyBldmVuIGlmIGl0IG5ldmVyIGdhaW5zIGEgc2l6ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHJvLmRpc2Nvbm5lY3QoKSwgNTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIHRpbGUgc291cmNlIGJ1aWx0IGZyb20gdGhlIGRlc2NyaXB0b3IuIE9TRCBudW1iZXJzIGxldmVsc1xuICAgKiBjb2Fyc2VzdC1maXJzdDsgdGhlIGJhY2tlbmQgbnVtYmVycyByZXNvbHV0aW9ucyBmdWxsLXJlcy1maXJzdCwgc29cbiAgICogYHJlcyA9IChsZXZlbHMtMSkgLSBvc2RMZXZlbGAuIE92ZXJyaWRpbmcgZ2V0TGV2ZWxTY2FsZS9nZXROdW1UaWxlcyBsZXRzIHVzXG4gICAqIGhvbm91ciBCaW8tRm9ybWF0cycgYWN0dWFsIHBlci1sZXZlbCBkaW1lbnNpb25zIChub3QgYXNzdW1lIHBvd2VyLW9mLXR3bykuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZVNvdXJjZShkOiBUaWxlRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpOiBhbnkge1xuICAgIC8vIE11bHRpY2hhbm5lbCBpbWFnZXMgY29tcG9zaXRlIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMsIHdoaWNoIG9ubHkgZXhpc3QgYXRcbiAgICAvLyByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb25zIOKAlCBzbyBkcml2ZSBPU0Qgb2ZmIHRoZSByZWFsIGxldmVscyBhbG9uZSBhbmRcbiAgICAvLyBza2lwIHRoZSBzeW50aGV0aWMgKHNlcnZlci1jb21wb3NpdGVkKSBvdmVydmlld3MuIEV2ZXJ5IGRpc3BsYXllZCB0aWxlIGlzXG4gICAgLy8gdGhlbiBwZXItY2hhbm5lbC1mZXRjaGFibGUgYXQgYW55IHpvb20uXG4gICAgY29uc3QgbGV2ZWxzID0gdGhpcy5pc011bHRpQ2hhbm5lbCA/IGQubGV2ZWxzLnNsaWNlKDAsIHRoaXMucmVhbExldmVscykgOiBkLmxldmVscztcbiAgICBjb25zdCBuID0gbGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5hcGk7XG5cbiAgICAvLyBPU0QgbGV2ZWwgaSAoMCA9IGNvYXJzZXN0KSA8LT4gYmFja2VuZCByZXNvbHV0aW9uIChuLTEtaSkgKHJlcyAwID0gZnVsbCkuXG4gICAgLy8gVGhlIGJhY2tlbmQgcHlyYW1pZCBpcyBOT1QgbmVjZXNzYXJpbHkgcG93ZXItb2YtdHdvLCBzbyB3ZSBkcml2ZSBPU0Qgb2ZmXG4gICAgLy8gdGhlIGJhY2tlbmQncyByZWFsIHBlci1sZXZlbCBkaW1lbnNpb25zLiBXZSBvdmVycmlkZSBPTkxZIGdldExldmVsU2NhbGU6XG4gICAgLy8gT1NEIGRlcml2ZXMgZ2V0TnVtVGlsZXMsIGdldFRpbGVCb3VuZHMgQU5EIGl0cyBwZXItem9vbSBsZXZlbCBzZWxlY3Rpb25cbiAgICAvLyBmcm9tIGdldExldmVsU2NhbGUsIHNvIHRoZXkgYWxsIHN0YXkgY29uc2lzdGVudCDigJQgcmVxdWVzdGluZyBleGFjdGx5IHRoZVxuICAgIC8vIHRpbGVzIGVhY2ggcmVzb2x1dGlvbiBhY3R1YWxseSBoYXMgKG5vIG91dC1vZi1yYW5nZSA0MDBzLCBubyBmbG9vZCkuXG4gICAgY29uc3QgcmVzRm9yTGV2ZWwgPSAobGV2ZWw6IG51bWJlcikgPT4gbiAtIDEgLSBsZXZlbDtcbiAgICBjb25zdCB0czogYW55ID0gbmV3IChPU0QgYXMgYW55KS5UaWxlU291cmNlKHtcbiAgICAgIHdpZHRoOiBkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkLmhlaWdodCxcbiAgICAgIHRpbGVTaXplOiB0LFxuICAgICAgdGlsZU92ZXJsYXA6IDAsXG4gICAgICBtaW5MZXZlbDogMCxcbiAgICAgIG1heExldmVsOiBuIC0gMSxcbiAgICB9KTtcbiAgICB0cy5nZXRMZXZlbFNjYWxlID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgcmV0dXJuIGx2bCA/IGx2bC53aWR0aCAvIGQud2lkdGggOiAxO1xuICAgIH07XG4gICAgLy8gRHJpdmUgdGhlIHRpbGUgQ09VTlQgb2ZmIGVhY2ggbGV2ZWwncyBvd24gKGluZGVwZW5kZW50bHktcm91bmRlZCkgZGltZW5zaW9ucyxcbiAgICAvLyBub3QgT1NEJ3MgZGVmYXVsdCBgY2VpbChzY2FsZSAqIGZ1bGxEaW1lbnNpb24gLyB0aWxlU2l6ZSlgLiBTeW50aGV0aWMgQU5EIHJlYWxcbiAgICAvLyBCaW8tRm9ybWF0cyBsZXZlbHMgYXJlbid0IGV4YWN0IHByb3BvcnRpb25hbCBzY2FsZXMgb2YgdGhlIGZ1bGwgaW1hZ2UsIHNvXG4gICAgLy8gYHNjYWxlICogZnVsbEhlaWdodGAgY2FuIHJvdW5kIHVwIHRvIG9uZSBtb3JlIHJvdyAob3IgY29sdW1uKSB0aGFuIHRoZSBsZXZlbFxuICAgIC8vIGFjdHVhbGx5IGhhcyDigJQgT1NEIHRoZW4gcmVxdWVzdHMgYW4gb3V0LW9mLXJhbmdlIHRpbGUgdGhhdCB0aGUgc2VydmVyIDQwMHNcbiAgICAvLyAoXCJUaWxlIChjb2wscm93KSBvdXQgb2YgcmFuZ2VcIikuIFVzaW5nIHRoZSBsZXZlbCdzIHJlYWwgdy9oIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VydmVyJ3Mgb3duIGJvdW5kcyBjaGVjayBleGFjdGx5LlxuICAgIGNvbnN0IFBvaW50ID0gKE9TRCBhcyBhbnkpLlBvaW50O1xuICAgIHRzLmdldE51bVRpbGVzID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgaWYgKCFsdmwpIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICByZXR1cm4gbmV3IFBvaW50KE1hdGguY2VpbChsdmwud2lkdGggLyB0KSwgTWF0aC5jZWlsKGx2bC5oZWlnaHQgLyB0KSk7XG4gICAgfTtcbiAgICB0cy5nZXRUaWxlVXJsID0gKGxldmVsOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgICAgYnVpbGRUaWxlVXJsKGJhc2UsIGluZm9CNjQsIHsgcmVzOiByZXNGb3JMZXZlbChsZXZlbCksIGNvbDogeCwgcm93OiB5LCB6LCB0aWxlU2l6ZTogdCwgY2hhbm5lbCB9KTtcbiAgICByZXR1cm4gdHM7XG4gIH1cblxuICAvKiogUmUtYXBwbHkgdGhlIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9jb2xvdXIvaW52ZXJ0KSBhZnRlciBhIHN0YXRlIGNoYW5nZS5cbiAgICogIE11bHRpY2hhbm5lbCBpbnZhbGlkYXRlcyBPTkxZIHRoZSB2aXNpYmxlIHNsaWNlJ3MgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZ1xuICAgKiAgdGhlIHdob2xlIHdvcmxkIHdvdWxkIHJlLXByb2Nlc3MgZXZlcnkgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksXG4gICAqICBmbG9vZGluZyBPU0Qgd2l0aCBcIltDYWNoZVJlY29yZF0g4oCmIEludmFsaWRTdGF0ZUVycm9yXCIgYW5kIHdhc3Rpbmcgd29yayBvbiB0aWxlc1xuICAgKiAgdGhhdCBhcmVuJ3Qgb24gc2NyZWVuLiBUaGUgb3RoZXIgY2FjaGVkIHNsaWNlcyBhcmUgbWFya2VkIHN0YWxlIGFuZCByZS10aW50ZWRcbiAgICogIGxhemlseSB3aGVuIHJldmVhbGVkLiBDb21wb3NpdGUvZ3JheXNjYWxlIGludmFsaWRhdGUgdGhlIHdvcmxkIGFzIGJlZm9yZS4gKi9cbiAgLyoqIENvbGxhcHNlIGEgYnVyc3Qgb2YgZGlzcGxheS1zdGF0ZSBjaGFuZ2VzIGludG8gT05FIGludmFsaWRhdGlvbiBvbiB0aGUgbmV4dFxuICAgKiAgZnJhbWUuIERyYWdnaW5nIGEgd2luZG93IHNsaWRlciBlbWl0cyBwZXIgcGl4ZWwgb2YgdHJhdmVsLCBhbmQgZWFjaCByb3VuZFxuICAgKiAgcmVzdG9yZXMgYW5kIHJlLXByb2Nlc3NlcyBldmVyeSB0aWxlIG9mIGV2ZXJ5IGNoYW5uZWwg4oCUIHNvIHRoZSBidXJzdCBpcyBib3RoXG4gICAqICB3YXN0ZWQgd29yayBhbmQgdGhlIHJhY2UgdGhhdCBicmVha3MgY2FjaGUgcmVjb3JkcyAoc2VlIHtAbGluayBkaXNwbGF5VG9rZW59KS5cbiAgICogIFRoZSBzdG9yZSB3cml0ZSBzdGF5cyBsaXZlLCBzbyB0aGUgcGFuZSBpdHNlbGYgcmVtYWlucyByZXNwb25zaXZlLiAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgcXVldWVkIGZvciB0aGlzIGZyYW1lXG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgICB0aGlzLmludmFsaWRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVEaXNwbGF5KCk6IHZvaWQge1xuICAgIC8vIFN1cGVyc2VkZSBhbnkgaW4tZmxpZ2h0IHJlY29sb3Igcm91bmQgYmVmb3JlIHJlc3RhcnRpbmcgb25lIChzZWUgZGlzcGxheVRva2VuKS5cbiAgICB0aGlzLmRpc3BsYXlUb2tlbisrO1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLmNhY2hlLmludmFsaWRhdGVDaGFubmVsRGlzcGxheSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHsgdi53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTsgfSBjYXRjaCB7IC8qIG5vLW9wICovIH1cbiAgICB0cnkgeyB2Lm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Vmlld2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdmlld3BvcnQgbm90IHJlYWR5ICovXG4gICAgfVxuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgcGFpbnRzIGluc3RlYWQgb2YgcGFubmluZy5cbiAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTtcbiAgICAvLyBUaGUgYnJ1c2ggd29ya3MgaW4gdGhlIHJlbmRlcmVkLXZpZXdwb3J0IGNvb3JkaW5hdGUgZnJhbWUg4oCUIHJlYWQgaXQgYmFja1xuICAgIC8vIGxhemlseSBvbiBmaXJzdCB1c2UsIGxpa2UgdGhlIHdhbmQuIEl0IHNoYXJlcyB0aGUgd2FuZCdzIGhvc3QuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZSgob3B0aW9ucyBhcyBCcnVzaE9wdGlvbnMpPy5zaXplID8/IDApO1xuICB9XG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRvb2wgdGFrZXMgdGhlIHBvaW50ZXJcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRoZSBib3ggZHJhZyBtdXN0IG5vdCBwYW5cbiAgICAgIHRoaXMuem9vbVRvQm94VG9vbC5iaW5kSG9zdCh0aGlzLnpvb21Cb3hIb3N0KCkpO1xuICAgIH1cbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICAgIGlmICghYWN0aXZlKSB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKHRydWUpO1xuICB9XG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNOiBzZWdtZW50IHRoZSBkcmF3biByZWN0YW5nbGVzLiBUaGUgU0FNIHRvb2wgcmV1c2VzIHRoZVxuICAgKiAgd2FuZCBob3N0ICh2aWV3cG9ydCByZWFkYmFjayArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gc2VnbWVudCBhZ2FpbnN0IHRoZSBjdXJyZW50IHZpZXdwb3J0IHJlYWRiYWNrXG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy5jZWxsU2VnbWVudGVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDApO1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBjcm9wIGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9vbC5zZXRNb2RlbChpZCk7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZWwoaWQpO1xuICB9XG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gY2xpY2tzIGFkZCBwb2ludHMsIGRvbid0IHBhblxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7IH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKiogQnVpbGQgdGhlIHdhbmQvZXJhc2VyIGhvc3Qgb2JqZWN0cyBib3VuZCB0byB0aGlzIGJhY2tlbmQuIEJvdGggdG9vbHMgcnVuXG4gICAqICBvdmVyIE9TRCB2aWEgdGhlIHNoYXJlZCBjb29yZGluYXRlIHRyYW5zZm9ybSArIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2ssXG4gICAqICBhbmQgcmVhZC93cml0ZSByZWdpb25zIGRpcmVjdGx5IG9uIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgKG5ldXRyYWwgbW9kZWwpLiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5jdXJyZW50WixcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmN1cnJlbnRGaWxlTmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldENhY2hlZEltYWdlUmF0aW86ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBlbGVtZW50IHRoZSBvbi1jYW52YXMgdG9vbCBvdmVybGF5cyBhdHRhY2ggdG8gKE9TRCBpcyBtb3VudGVkIGhlcmUpLiAqL1xuICBwcml2YXRlIGdldE92ZXJsYXlDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gIH1cblxuICAvKiogU2l6ZSB0aGUgbmF2aWdhdG9yIGZyb20gdGhlIENVUlJFTlQgY29udGFpbmVyIChuYXZpZ2F0b3JTaXplUmF0aW8gb2YgdGhlXG4gICAqICB2aWV3ZXIgZWxlbWVudCkgYW5kIGtlZXAgaXQgcGlubmVkIHRvIHRoZSBjb3JuZXIuIE9TRCBjb21wdXRlcyB0aGUgc2l6ZVxuICAgKiAgb25jZSBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBiZWZvcmUgdGhlIGhvc3QgZmxleCBsYXlvdXQgc2V0dGxlcyDigJRcbiAgICogIGFuZCBuZXZlciBjb3JyZWN0cyBpdCwgbGVhdmluZyBhIHN0YWxlLXNpemUgZWxlbWVudCB3aG9zZSB2aXNpYmxlIG1pbmltYXBcbiAgICogIGZsb2F0cyBhYm92ZSB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lci4gKi9cbiAgcHJpdmF0ZSByZXNpemVOYXZpZ2F0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3QgbmF2ID0gdj8ubmF2aWdhdG9yO1xuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHY/LmVsZW1lbnQ7XG4gICAgaWYgKCFuYXY/LmVsZW1lbnQgfHwgIWVsPy5jbGllbnRXaWR0aCB8fCAhZWw/LmNsaWVudEhlaWdodCkgcmV0dXJuO1xuICAgIGNvbnN0IHcgPSBNYXRoLnJvdW5kKGVsLmNsaWVudFdpZHRoICogMC4xNik7XG4gICAgY29uc3QgaCA9IE1hdGgucm91bmQoZWwuY2xpZW50SGVpZ2h0ICogMC4xNik7XG4gICAgaWYgKG5hdi5lbGVtZW50LnN0eWxlLndpZHRoICE9PSBgJHt3fXB4YCB8fCBuYXYuZWxlbWVudC5zdHlsZS5oZWlnaHQgIT09IGAke2h9cHhgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuYXYuc2V0V2lkdGgodyk7XG4gICAgICAgIG5hdi5zZXRIZWlnaHQoaCk7XG4gICAgICB9IGNhdGNoIHsgLyogbmF2aWdhdG9yIHRvcm4gZG93biAqLyB9XG4gICAgfVxuICAgIC8vIE5vcm1hbGl6ZSBPU0QncyBjb250cm9sLWNvcm5lciBzdGFjayBzbyB0aGUgbWluaW1hcCBzaXRzIGZsdXNoIGluIHRoZVxuICAgIC8vIGNvcm5lciwgaW5zZXQgMTJweCB0byBsaW5lIHVwIHdpdGggdGhlIHNjYWxlIGJhcjpcbiAgICAvLyAgLSB0aGUgaW5saW5lLWJsb2NrIHdyYXBwZXIgY2FycmllcyBsaW5lLWJveCBzdHJ1dHMgYW5kIGNhbiByZXRhaW4gc3RhbGVcbiAgICAvLyAgICBzaXppbmcg4oaSIG1ha2UgaXQgYSB0aWdodCBibG9jaztcbiAgICAvLyAgLSBhbnl0aGluZyBlbHNlIE9TRCBsZWZ0IGluIHRoZSBjb3JuZXIgd291bGQgc3RhY2sgYmVsb3cgdGhlIG5hdmlnYXRvclxuICAgIC8vICAgIGFuZCBmbG9hdCBpdCB1cCDihpIgaGlkZSBpdDtcbiAgICAvLyAgLSBpbnNldCB0aGUgY29ybmVyIGl0c2VsZiAoYm90dG9tL3JpZ2h0IDEycHgpLCBrZWVwaW5nIHRoZSBlbGVtZW50IGluXG4gICAgLy8gICAgbm9ybWFsIGZsb3cuXG4gICAgY29uc3Qgd3JhcHBlciA9IG5hdi5lbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGNvcm5lciA9IHdyYXBwZXI/LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh3cmFwcGVyICYmIGNvcm5lcikge1xuICAgICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHdyYXBwZXIuc3R5bGUubGluZUhlaWdodCA9ICcwJztcbiAgICAgIHdyYXBwZXIuc3R5bGUuZm9udFNpemUgPSAnMCc7XG4gICAgICAvLyBUaGUgd3JhcHBlciBrZWVwcyB0aGUgbmF2aWdhdG9yJ3Mgc3RhbGUgcHJlLXNldHRsZSBoZWlnaHQgYXMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IHNpemUgKHRoZSBuYXYgd2FzIDAuMTZ4IHRoZSBVTlNFVFRMRUQgY29udGFpbmVyIGF0IGNyZWF0aW9uKSxcbiAgICAgIC8vIGxlYXZpbmcgYW4gZW1wdHkgYmFuZCB1bmRlciB0aGUgcmVzaXplZCBtaW5pbWFwIOKAlCBtZWFzdXJlZCBsaXZlOlxuICAgICAgLy8gbmF2SD04NyBpbnNpZGUgd3JhcEg9MTY3LiBGb3JjZSBpdCB0byBodWcgaXRzIGNvbnRlbnQuXG4gICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSAnYXV0byc7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20oY29ybmVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gd3JhcHBlcikgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbSh3cmFwcGVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbmF2LmVsZW1lbnQpIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBjb3JuZXIuc3R5bGUuYm90dG9tID0gJzEycHgnO1xuICAgICAgY29ybmVyLnN0eWxlLnJpZ2h0ID0gJzEycHgnO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG5hdi5lbGVtZW50LnN0eWxlLCB7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB0b3A6ICcnLCBsZWZ0OiAnJywgYm90dG9tOiAnJywgcmlnaHQ6ICcnLCBtYXJnaW46ICcwJyB9KTtcbiAgICAvLyBUT0RPKGRlYnVnKTogcmVtb3ZlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IG5lciA9IG5hdi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyID0gd3JhcHBlcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY3IgPSBjb3JuZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBlciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnNvbGUud2FybihgW3ZpejpuYXZdIG5hdkJvdHRvbT0ke01hdGgucm91bmQobmVyLmJvdHRvbSl9IHdyYXBCb3R0b209JHtNYXRoLnJvdW5kKHdyPy5ib3R0b20gPz8gLTEpfSBgICtcbiAgICAgIGBjb3JuZXJCb3R0b209JHtNYXRoLnJvdW5kKGNyPy5ib3R0b20gPz8gLTEpfSBwbG90Qm90dG9tPSR7TWF0aC5yb3VuZChwZXIuYm90dG9tKX0gYCArXG4gICAgICBgbmF2SD0ke01hdGgucm91bmQobmVyLmhlaWdodCl9IHdyYXBIPSR7TWF0aC5yb3VuZCh3cj8uaGVpZ2h0ID8/IC0xKX0gY29ybmVySD0ke01hdGgucm91bmQoY3I/LmhlaWdodCA/PyAtMSl9YCk7XG4gIH1cblxuICAvKiogRm9yY2UgdGhlIGRvY2tlZCB0b29sYmFyIHRvIHJlcGFpbnQgYWZ0ZXIgYW4gT1NEIHpvb20uIENocm9tZSBsZWF2ZXMgaXRcbiAgICogIGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgKHRoZSBjYW52YXMncyBjb21wb3NpdGluZyBjaHVybiBzdHJhbmRzIHRoZSB0b29sYmFyJ3NcbiAgICogIHJhc3RlcikuIEEgc3luY2hyb25vdXMgZGlzcGxheSB0b2dnbGUgcmUtcmFzdGVycyBpdCB3aXRoIG5vIHZpc2libGUgZ29uZS1mcmFtZVxuICAgKiAgYW5kIG5vIGxheW91dCBzaGlmdC4gTG9jYXRlZCB2aWEgdGhlIERPTSBzaW5jZSB0aGlzIHNlcnZpY2UgZG9lc24ndCBvd24gdGhlXG4gICAqICB0b29sYmFyOyBhIG5vLW9wIHdoZW4gdGhlcmUncyBubyB0b29sYmFyIChlLmcuIGVtYmVkZGVkIHdpdGhvdXQgb25lKS4gKi9cbiAgcHJpdmF0ZSBudWRnZVRvb2xiYXJSZXBhaW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHBsb3RFbCA9IHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICAgIGNvbnN0IGRvY2sgPSBwbG90RWw/LmNsb3Nlc3QoJ3Zpc3VhbGl6YXRpb24nKT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy50b29sYmFyLWRvY2snKTtcbiAgICBpZiAoIWRvY2spIHJldHVybjtcbiAgICBjb25zdCBwcmV2ID0gZG9jay5zdHlsZS5kaXNwbGF5O1xuICAgIGRvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB2b2lkIGRvY2sub2Zmc2V0SGVpZ2h0OyAvLyByZWZsb3cgc28gdGhlIHRvZ2dsZSByZS1yYXN0ZXJzIG9uIHRoZSBuZXh0IHBhaW50XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gcHJldjtcbiAgfVxuXG4gIC8qKiBIb3N0IGZvciB0aGUgKHNoYXJlZCkgem9vbS10by1ib3ggdG9vbDogY29udmVydCBvdmVybGF5IHBpeGVscyB0byBpbWFnZVxuICAgKiAgY29vcmRzIHZpYSB0aGUgdmlld3BvcnQsIGFuZCBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBjaG9zZW4gcmVjdGFuZ2xlLiAqL1xuICBwcml2YXRlIHpvb21Cb3hIb3N0KCk6IFpvb21Ub0JveFRvb2xIb3N0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweDogbnVtYmVyLCBweTogbnVtYmVyKSA9PiBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgcHgsIHB5KSxcbiAgICAgIGFwcGx5Wm9vbVRvQm94OiAoY29vcmRzOiBudW1iZXJbXSkgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogRml0IHRoZSBPU0Qgdmlld3BvcnQgdG8gYW4gaW1hZ2Utc3BhY2UgcmVjdGFuZ2xlIChjb29yZHMgb3JkZXJlZFxuICAgKiAgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dKS4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8IGNvb3JkaW5hdGVzLmxlbmd0aCA8IDQpIHJldHVybjtcbiAgICBjb25zdCBbYSwgYiwgYywgZF0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4ID0gTWF0aC5taW4oYSwgYik7XG4gICAgY29uc3QgdyA9IE1hdGguYWJzKGIgLSBhKTtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oYywgZCk7XG4gICAgY29uc3QgaCA9IE1hdGguYWJzKGMgLSBkKTtcbiAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBpbWFnZVJlY3RUb1ZpZXdwb3J0KHRoaXMudmlld2VyLCB4LCB5LCB3LCBoKTtcbiAgICB0aGlzLnZpZXdlci52aWV3cG9ydC5maXRCb3VuZHMocmVjdCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYmFjayB0aGUgKmN1cnJlbnRseSByZW5kZXJlZCogT1NEIGNhbnZhcyBhcyB0aGUgd2FuZCdzIHBpeGVsIG1hdHJpeC5cbiAgICogVGhlIG1hdHJpeCBjb3ZlcnMgb25seSB0aGUgdmlzaWJsZSB2aWV3cG9ydCBhdCBzY3JlZW4gcmVzb2x1dGlvbiwgc28gd2hlblxuICAgKiB0aGUgdXNlciBpcyB6b29tZWQgaW50byBhIHN1Yi1yZWdpb24gdGhlIHdhbmQgc2FtcGxlcyB0aGF0IHJlZ2lvbidzIGRldGFpbFxuICAgKiAocmF0aGVyIHRoYW4gdGhlIHdob2xlIGltYWdlIGF0IHByZXZpZXcgcmVzb2x1dGlvbikuIGBvcmlnaW5YL29yaWdpbllgIGFuZFxuICAgKiBgcmF0aW9zYCBtYXAgaW1hZ2UgY29vcmRzIDwtPiByZWFkYmFjay1waXhlbCBjb29yZHMgZm9yIHRoZSB3YW5kJ3NcbiAgICogZGF0YS9yYXRpby9vcmlnaW4gbW9kZWwuIENhY2hlZCB1bnRpbCB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZGJhY2tWaWV3cG9ydCgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFBpeGVscykgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXIgYXMgYW55O1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSB2aWV3ZXI/LmRyYXdlcj8uY2FudmFzO1xuICAgIGNvbnN0IHZwID0gdmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0IHx8ICF2cCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aDsgLy8gZGV2aWNlIHBpeGVsc1xuICAgIGNvbnN0IGggPSBjYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7IC8vIFJHQkEsIHJvdy1tYWpvclxuICAgIC8vIEJ1aWxkIHRoZSBbeV1beF0gPSBbcixnLGJdIG1hdHJpeCB0aGUgd2FuZCBleHBlY3RzIGZvciBSR0IgZnJhbWVzLlxuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuXG4gICAgLy8gSW1hZ2UtY29vcmQgc3BhbiB0aGUgcmVhZGJhY2sgY292ZXJzIChDU1MgcHggaW4sIGltYWdlIGNvb3JkcyBvdXQpLiBSb3V0ZVxuICAgIC8vIHRocm91Z2ggd29ybGQgaXRlbSAwIChvc2QtY29vcmRzKSBzbyBpdCBzdGF5cyBhY2N1cmF0ZSDigJQgYW5kIHF1aWV0IOKAlCB3aGVuXG4gICAgLy8gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWwgbXVsdGljaGFubmVsIGxheWVycykuXG4gICAgY29uc3QgZWxXID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgZWxIID0gY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIGNvbnN0IHRsID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIDAsIDApO1xuICAgIGNvbnN0IGJyID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIGVsVywgZWxIKTtcbiAgICBjb25zdCByYXRpb1ggPSAoYnIueCAtIHRsLngpIC8gdzsgLy8gaW1hZ2UgcHggcGVyIHJlYWRiYWNrIHB4XG4gICAgY29uc3QgcmF0aW9ZID0gKGJyLnkgLSB0bC55KSAvIGg7XG5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0ge1xuICAgICAgZnJhbWVzOiBbbWF0cml4XSxcbiAgICAgIHdpZHRoOiB3LFxuICAgICAgaGVpZ2h0OiBoLFxuICAgICAgcmF0aW9zOiBbcmF0aW9YLCByYXRpb1ldLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLCAvLyBjYW52YXMgcmVhZGJhY2sgaXMgYWx3YXlzIFJHQkFcbiAgICAgIG9yaWdpblg6IHRsLngsXG4gICAgICBvcmlnaW5ZOiB0bC55LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gIH1cblxuICAvKipcbiAgICogUmVjb2xvciBhIGdyYXlzY2FsZSB0aWxlIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBMVVQsIHVzaW5nIE9TRCdzXG4gICAqIHRpbGUtaW52YWxpZGF0ZWQgcGl4ZWwgcGlwZWxpbmUgKE9TRCA1Ky82KS4gTWFwcyBlYWNoIHBpeGVsJ3MgZ3JheXNjYWxlXG4gICAqIHZhbHVlIChyPT1nPT1iKSB0byB0aGUgTFVUJ3MgUkdCLiBOby1vcCBmb3IgUkdCIGltYWdlcyBvciB1bnRpbCB0aGUgTFVUIGlzXG4gICAqIGJ1aWx0LiBIYW5kbGVyIGlzIGFzeW5jIOKAlCBPU0QgYXdhaXRzIGl0IChyYWlzZUV2ZW50QXdhaXRpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVjb2xvckNoYW5uZWxUaWxlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCBncmF5ID0gdGhpcy5pc0dyYXlzY2FsZUltYWdlO1xuICAgIGlmIChncmF5KSB7XG4gICAgICBpZiAoIXRoaXMuY29sb3JMdXQpIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc3BsYXkucmdiTmVlZHNSZWNvbG9yKCkpIHtcbiAgICAgIHJldHVybjsgLy8gUkdCIGF0IGRlZmF1bHQgKGFsbCB2aXNpYmxlLCBmdWxsIHdpbmRvdywgzrM9MSwgbm8gaW52ZXJ0KSDihpIgcGFzc3Rocm91Z2hcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSB0aWxlJ3MgcGl4ZWxzLiBQcmVmZXIgdGhlIHJlbmRlcmluZyBjb250ZXh0LCBidXQgc29tZSB0aWxlIGNhY2hlc1xuICAgIC8vIChhamF4IFBORyBibG9icykgY29udmVydCB0byBhbiAqZW1wdHkqIGNvbnRleHQyZCDigJQgcmVjb2xvcmluZyB0aGF0IHdvdWxkXG4gICAgLy8gYmxhbmsgdGhlIHRpbGUgKHdoaXRlIGNhbnZhcykuIFNvIGlmIHRoZSBjb250ZXh0IGhhcyBubyBvcGFxdWUgcGl4ZWxzLCBkcmF3XG4gICAgLy8gdGhlIHRpbGUncyBvd24gYml0bWFwL2ltYWdlIGFuZCByZWNvbG9yIHRoYXQgaW5zdGVhZC4gV2UgbmV2ZXIgd3JpdGUgYmFja1xuICAgIC8vIHVubGVzcyB3ZSBhY3R1YWxseSByZWNvbG9yZWQgc29tZXRoaW5nLCBzbyBhIHRpbGUgaXMgbmV2ZXIgYmxhbmtlZC5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY3R4ID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnY29udGV4dDJkJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB0cnkgYml0bWFwIGJlbG93ICovXG4gICAgfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpbWcgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWltZyB8fCAhdGhpcy5oYXNPcGFxdWUoaW1nLmRhdGEpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHRpbGUncyBkZWNvZGVkIGltYWdlL2JpdG1hcC5cbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vbmUgKi9cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiBub25lICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHJldHVybjsgLy8gY2FuJ3QgZ2V0IHBpeGVscyDigJQgbGVhdmUgdGhlIHRpbGUgdW50b3VjaGVkXG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoO1xuICAgICAgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltZy5kYXRhKSB8fCAhY3R4KSByZXR1cm47IC8vIG5vdGhpbmcgb3BhcXVlXG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kIGhhcyBhbHJlYWR5IHJlc3RvcmVkIHRoaXMgdGlsZSDigJQgd3JpdGluZyBub3cgd291bGRcbiAgICAvLyBoYW5kIE9TRCBhIHN1cGVyc2VkZWQgY2FudmFzIGFuZCBkZXN0cm95IHRoZSBjYWNoZSByZWNvcmQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBUaGUgdGlsZSdzIGNhY2hlIGNhbiBzdGlsbCBiZSBldmljdGVkIGJldHdlZW4gdGhlIGF3YWl0cyBhYm92ZSBhbmQgaGVyZSAoYVxuICAgIC8vIHNsaWNlIGNoYW5nZSksIG1ha2luZyBzZXREYXRhIHRocm93IGEgRE9NRXhjZXB0aW9uIG9uIGEgZGVhZCBjYW52YXMuXG4gICAgLy8gU3dhbGxvdyBpdCDigJQgdGhlIHRpbGUgaXMgZ29uZSwgc28gdGhlcmUncyBub3RoaW5nIHRvIHJlY29sb3IuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKipcbiAgICogVGludCBhIHNpbmdsZSBjaGFubmVsJ3MgdGlsZSBpbiBwbGFjZS4gRWFjaCBjaGFubmVsIGlzIGl0cyBvd24gT3BlblNlYWRyYWdvblxuICAgKiBUaWxlZEltYWdlIChhIHNpbmdsZS1iYW5kIGdyYXlzY2FsZSB0aWxlKTsgT1NEIGNvbXBvc2l0ZXMgdGhlIE4gaW1hZ2VzXG4gICAqIGFkZGl0aXZlbHkgKCdsaWdodGVyJykgaW4gaXRzIGRyYXdlciDigJQgc28gdGhpcyBqdXN0IG1hcHMgdGhlIHRpbGUncyBpbnRlbnNpdHlcbiAgICogdGhyb3VnaCB0aGUgY2hhbm5lbCdzIHdpbmRvdy9nYW1tYSBhbmQgaXRzIHBzZXVkby1jb2xvdXIuIFN5bmNocm9ub3VzIChub1xuICAgKiBjcm9zcy10aWxlIGZldGNoKSDihpIgbm8gcmFjZSwgbm8gc2VhbXMuIENoYW5uZWwgaXMgcGFyc2VkIGZyb20gdGhlIHRpbGUgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5kaXNwbGF5VG9rZW47XG4gICAgY29uc3QgdGlsZSA9IGV2ZW50Py50aWxlO1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gKHRpbGUgJiYgKHR5cGVvZiB0aWxlLmdldFVybCA9PT0gJ2Z1bmN0aW9uJyA/IHRpbGUuZ2V0VXJsKCkgOiB0aWxlLnVybCkpIHx8ICcnO1xuICAgIGNvbnN0IG0gPSAvWz8mXWNoYW5uZWw9KFxcZCspLy5leGVjKHVybCk7XG4gICAgY29uc3QgY2ggPSBtID8gcGFyc2VJbnQobVsxXSwgMTApIDogMDtcbiAgICBjb25zdCBzdCA9IHRoaXMuY2hhbm5lbFN0YXRlc1tjaF07XG5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkgeyBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIGZhbGxiYWNrIGJlbG93ICovIH1cbiAgICBsZXQgaW1nOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3R4ICYmIGN0eC5jYW52YXMgJiYgY3R4LmNhbnZhcy53aWR0aCAmJiBjdHguY2FudmFzLmhlaWdodCkge1xuICAgICAgdHJ5IHsgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7IH0gY2F0Y2ggeyBpbWcgPSBudWxsOyB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkgeyBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpOyB9IGNhdGNoIHsgLyogbm9uZSAqLyB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSB7IHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH0gfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuO1xuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHNyYy53aWR0aDsgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuXG4gICAgLy8gUHJlY29tcHV0ZSBsdW0oMC4uMjU1KSDihpIgdGludGVkIFJHQiBvbmNlLCB0aGVuIG1hcCBlYWNoIHBpeGVsIGJ5IGxvb2t1cCDigJRcbiAgICAvLyB0aGUgY2hhbm5lbCB0aWxlIGlzIHNpbmdsZS1iYW5kLCBzbyB0aGlzIHR1cm5zIH4yNjJrIHBlci1waXhlbFxuICAgIC8vIGNoYW5uZWxJbnRlbnNpdHkoKSAod2l0aCBNYXRoLnBvdyBmb3IgZ2FtbWEpIGNhbGxzIGludG8gMjU2IOKAlCB0aGUgZGlmZmVyZW5jZVxuICAgIC8vIGJldHdlZW4gYSBzbmFwcHkgYW5kIGEgc2x1Z2dpc2ggc2xpZGVyIG9uIGEgNC1jaGFubmVsIHN0YWNrLlxuICAgIGNvbnN0IHsgcjogckwsIGc6IGdMLCBiOiBiTCB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgIGNvbnN0IGQgPSBpbWcuZGF0YTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHIgPSBkW2ldLCBnID0gZFtpICsgMV0sIGIgPSBkW2kgKyAyXTtcbiAgICAgIGNvbnN0IGx1bSA9IHIgPj0gZyA/IChyID49IGIgPyByIDogYikgOiBnID49IGIgPyBnIDogYjsgLy8gc2luZ2xlLWJhbmQg4oaSIG1heFxuICAgICAgZFtpXSA9IHJMW2x1bV07XG4gICAgICBkW2kgKyAxXSA9IGdMW2x1bV07XG4gICAgICBkW2kgKyAyXSA9IGJMW2x1bV07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kICh0aGUgbmV4dCB0aWNrIG9mIGEgc2xpZGVyIGRyYWcpIGhhcyBhbHJlYWR5IHJlc3RvcmVkXG4gICAgLy8gdGhpcyB0aWxlLiBXcml0aW5nIGEgc3VwZXJzZWRlZCBjb250ZXh0IGJhY2sgbWFrZXMgT1NEJ3MgY29udmVyc2lvbiB0aHJvd1xuICAgIC8vIERPTUV4Y2VwdGlvbiwgd2hpY2ggZGVzdHJveXMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZSDigJQgZG9cbiAgICAvLyBub3RoaW5nIGFuZCBsZXQgdGhlIG5ld2VyIHJvdW5kIHJlcGFpbnQgaXQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBTZWUgcmVjb2xvclRpbGU6IHRoZSB0aWxlIGNhY2hlIGNhbiBzdGlsbCBkaWUgYmV0d2VlbiB0aGUgYXdhaXRzIGFuZCBoZXJlLlxuICAgIHRyeSB7IGF3YWl0IGV2ZW50LnNldERhdGEoY3R4LCAnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiB0aWxlIGV2aWN0ZWQgKi8gfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUsIGZyb20gdGhlIGN1cnJlbnRcbiAgICogIHNsaWNlJ3Mgc2FtcGxlZCB0aWxlcyAoZ3JheXNjYWxlIOKGkiBjaGFubmVsIDA7IFJHQiDihpIgUi9HL0IpLiBOdWxsIHVudGlsIHRoZVxuICAgKiAgYXN5bmMgc2FtcGxpbmcgcmVzb2x2ZXMgb3IgaWYgaXQgd2FzIHNraXBwZWQuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgX2JpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLmdldCh0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgpO1xuICB9XG5cbiAgLyoqIE5hdGl2ZSBiaXQgZGVwdGggb2YgYSBjaGFubmVsIGZyb20gdGhlIHRpbGUgZGVzY3JpcHRvciAoOCB3aGVuIHVua25vd24pLiAqL1xuICBwcml2YXRlIGNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcj8uY2hhbm5lbEluZm8/LltjaGFubmVsSW5kZXhdPy5iaXREZXB0aCA/PyA4O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUuIEZvciA+OC1iaXQgaW1hZ2VzIGl0XG4gICAqIGZldGNoZXMgdGhlICoqbmF0aXZlKiogZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciBgL2hpc3RvZ3JhbWAgZW5kcG9pbnRcbiAgICogKHRoZSA4LWJpdCBjYW52YXMgdGlsZXMgY2FuJ3QgY2FycnkgMTYtYml0IHZhbHVlcykgYW5kIGNhY2hlcyBpdCBwZXJcbiAgICogc2xpY2UrY2hhbm5lbDsgZm9yIDgtYml0L1JHQiBpdCByZXR1cm5zIHRoZSBleGlzdGluZyBjbGllbnQtc2FtcGxlZCA4LWJpdFxuICAgKiBoaXN0b2dyYW0uIFJlYWQtb25seSDigJQgaXQgbmV2ZXIgdG91Y2hlcyB0aGUgdGlsZS9kaXNwbGF5IHBpcGVsaW5lLlxuICAgKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXgpIDw9IDggfHwgIXRoaXMuaW5mb0I2NCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLm5hdGl2ZSQodGhpcy5pbmZvQjY0LCB0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRiBhdFxuICAgKiBuYXRpdmUgYml0IGRlcHRoIHZpYSBgR0VUIC9leHBvcnQvdGlmZmAgKHRoZSBzZXJ2ZXIgcmVhZHMgdGhlIHJhdyAxNi1iaXRcbiAgICogcGxhbmVzIOKAlCB0aGUgY2xpZW50IG5ldmVyIHNlZXMgdGhlbSkuIFNlbmRzIG9ubHkgdGhlIHZpc2libGUgY2hhbm5lbHM7IHRoZVxuICAgKiBleGlzdGluZyA4LWJpdCBjb21wb3NpdGUgUE5HIGV4cG9ydCBpcyB1bmFmZmVjdGVkLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5mb0I2NCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmNoYW5uZWxTdGF0ZXMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4gYy5pbmRleCk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aDtcbiAgICAvLyBPbWl0IGBjaGFubmVsc2Agd2hlbiBldmVyeSBjaGFubmVsIGlzIHZpc2libGUgKHNlcnZlciBkZWZhdWx0ID0gYWxsKS5cbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgYWxsID8gYCZjaGFubmVscz0ke3Zpc2libGUuam9pbignLCcpfWAgOiAnJztcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX1leHBvcnQvdGlmZj9pbmZvPSR7dGhpcy5pbmZvQjY0fSZ6PSR7dGhpcy5jdXJyZW50Wn0ke2NoUGFyYW19YDtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAuZ2V0KHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6ICdibG9iJyB9KVxuICAgICAgICAgIC5waXBlKHRpbWVvdXQoNjAwMDAwKSksIC8vIGxhcmdlIGV4cG9ydHMgc3RyZWFtIHNsb3dseTsgZ2VuZXJvdXMgZGVhZGxpbmVcbiAgICAgICk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsb2IgPSByZXNwLmJvZHk7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19XzE2Yml0Lm9tZS50aWZgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IFRJRkYgZXhwb3J0IGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgY3VycmVudCBzbGljZSBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBjb21wb3NpdGVkIHdpdGggdGhlXG4gICAqIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIG9yIHBlci1jaGFubmVsIHBzZXVkby1cbiAgICogY29sb3VycyAvIGludmVydCkuIFBpY2tzIHRoZSBsYXJnZXN0IHB5cmFtaWQgbGV2ZWwgdW5kZXIgYSBwaXhlbCBjYXAgKHRoZVxuICAgKiBjb2Fyc2VyIG92ZXJ2aWV3IGZvciBodWdlIHdob2xlLXNsaWRlcyksIGZldGNoZXMgdGhhdCBsZXZlbCdzIHRpbGUgZ3JpZCxcbiAgICogc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLCBydW5zIHRoZSBzaGFyZWQgZGlzcGxheSBwaXBlbGluZSwgYW5kIHNhdmVzIGl0LlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Q29tcG9zaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgbGV2ZWxzID0gZGVzYz8ubGV2ZWxzID8/IFtdO1xuICAgIGlmICghZGVzYyB8fCAhdGhpcy5pbmZvQjY0IHx8ICFsZXZlbHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgQ0FQID0gMzJfMDAwXzAwMDsgLy8gfjMyIE1QIOKAlCBib3VuZHMgbWVtb3J5IGZvciB3aG9sZS1zbGlkZSBpbWFnZXNcbiAgICBsZXQgcmVzID0gbGV2ZWxzLmxlbmd0aCAtIDE7IC8vIGNvYXJzZXN0IGZhbGxiYWNrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsZXZlbHNbaV0ud2lkdGggKiBsZXZlbHNbaV0uaGVpZ2h0IDw9IENBUCkgeyByZXMgPSBpOyBicmVhazsgfVxuICAgIH1cbiAgICBjb25zdCBsdyA9IGxldmVsc1tyZXNdLndpZHRoO1xuICAgIGNvbnN0IGxoID0gbGV2ZWxzW3Jlc10uaGVpZ2h0O1xuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplO1xuICAgIGNvbnN0IGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHcgLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaCAvIHQpKTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBsdztcbiAgICBjYW52YXMuaGVpZ2h0ID0gbGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICBjb25zdCB6ID0gdGhpcy5jdXJyZW50WjtcbiAgICBjb25zdCBqb2JzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sczsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCB0aGlzLmluZm9CNjQsIHsgcmVzLCBjb2wsIHJvdywgeiwgdGlsZVNpemU6IHQgfSk7XG4gICAgICAgIGpvYnMucHVzaChcbiAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlQml0bWFwKHRoaXMuaHR0cCwgdXJsLCAzMDAwMCk7XG4gICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgICAgICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBTa2lwIGEgZmFpbGVkIHRpbGUg4oCUIHRoZSBleHBvcnRlZCBjb21wb3NpdGUgaGFzIGEgZ2FwIHRoZXJlLlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgdGlsZSBmZXRjaCBmYWlsZWQsIHNraXBwaW5nJywgdXJsLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGpvYnMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGx3LCBsaCk7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltYWdlRGF0YS5kYXRhKSkgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gS2VlcCB0aGUgdW4tcmVjb2xvcmVkIGNvbXBvc2l0ZSBpZiByZWFkYmFjayBmYWlscyDigJQgYnV0IHNheSB3aHkuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgcmVjb2xvciByZWFkYmFjayBmYWlsZWQg4oCUIGV4cG9ydGluZyByYXcgdGlsZXMnLCBlcnIpO1xuICAgIH1cbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19X2NvbXBvc2l0ZS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBhbnkgcGl4ZWwgaW4gdGhlIFJHQkEgYnVmZmVyIGlzIG5vbi10cmFuc3BhcmVudC4gKi9cbiAgcHJpdmF0ZSBoYXNPcGFxdWUoZDogVWludDhDbGFtcGVkQXJyYXkpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkW2ldICE9PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEaXNwbGF5T3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFZpc3VhbGl6ZXJTdG9yZSwgc28gT1NEIGFuZCBQbG90bHkgc3RheSBpbiBsb2NrLXN0ZXAuIE9TRCBhcHBsaWVzIHRoZVxuICAvLyBjb2xvcm1hcCB0byBncmF5c2NhbGUgdGlsZXMgdmlhIHRoZSBMVVQgcmVhY3RpdmVseSAoc2VlIHRoZSBjb25zdHJ1Y3RvcidzXG4gIC8vIGNvbG9ybWFwIHN1YnNjcmlwdGlvbiksIG5vdCBpbiBzZXRDb2xvcm1hcC5cblxuICAvLyDilIDilIAgSVZpc3VhbGl6ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29sb3JtYXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IG51bGw7XG4gICAgLy8gRHJvcCBhIHF1ZXVlZCBpbnZhbGlkYXRpb24gc28gaXQgY2FuJ3QgZmlyZSBhZ2FpbnN0IGEgdG9ybi1kb3duIHZpZXdlci5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmludmFsaWRhdGVIYW5kbGUpO1xuICAgICAgZWxzZSBjbGVhclRpbWVvdXQodGhpcy5pbnZhbGlkYXRlSGFuZGxlIGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
2039
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFL0QsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRWhHLE9BQU8sRUFBc0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsc0JBQXNCLEVB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RCxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OEdBdjFEVSw4QkFBOEIsNENBNEkvQixnQkFBZ0IsbUxBTUosY0FBYyw0TUFNMUIsVUFBVTtrSEF4SlQsOEJBQThCLGNBRGpCLE1BQU07OzJGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFNdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFNakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgT1NEX1pPT01fUEVSX1NDUk9MTCB9IGZyb20gJy4vb3NkLXpvb20nO1xuXG5cbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBWaXpDb25maWcsIFZJWl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUExPVF9UWVBFX0RFU0NSSVBUT1JTLCBQbG90VHlwZURlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzLCBWaWV3ZXJGZWF0dXJlLCBjYXBhYmlsaXRpZXNPZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE9zZFNjYWxlQmFyIH0gZnJvbSAnLi9vc2Qtc2NhbGUtYmFyJztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9vc2QtY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlUmVjdFRvVmlld3BvcnQsIHZpZXdwb3J0UmVjdFRvSW1hZ2UgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUaWxlVXJsLCBmZXRjaFRpbGVCaXRtYXAgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IFNsaWNlQ2FjaGUgfSBmcm9tICcuL3NsaWNlLWNhY2hlJztcbmltcG9ydCB7IERpc3BsYXlQaXBlbGluZSB9IGZyb20gJy4vZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgeyBIaXN0b2dyYW1TYW1wbGVyIH0gZnJvbSAnLi9oaXN0b2dyYW0tc2FtcGxlcic7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsIFZlcnRleEVyYXNlclRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlLCBab29tVG9Cb3hUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG4vKipcbiAqIFF1aWV0IE9wZW5TZWFkcmFnb24ncyBcIltWaWV3cG9ydC4qXSBpcyBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZVwiIGFkdmlzb3JpZXMuXG4gKiBBIG11bHRpY2hhbm5lbCBpbWFnZSBpcyBjb21wb3NpdGVkIGZyb20gb25lIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwg4oCUIGEgbGVnaXRpbWF0ZVxuICogbXVsdGktaW1hZ2Ugd29ybGQg4oCUIGFuZCBPU0QgbG9ncyB0aGF0IGFkdmlzb3J5IChhdCBlcnJvciBsZXZlbCkgZnJvbSBpdHMgb3duXG4gKiBuYXZpZ2F0b3Ivb3ZlcnZpZXcgcmVuZGVyaW5nIG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSwgZmxvb2RpbmcgdGhlIGNvbnNvbGUuIE91clxuICogb3duIGltYWdlPC0+dmlld3BvcnQgY29udmVyc2lvbnMgYWxyZWFkeSByb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAoc2VlXG4gKiBvc2QtY29vcmRzKSwgc28gdGhlIHJlbWFpbmluZyBhZHZpc29yaWVzIGFyZSBPU0QtaW50ZXJuYWwgYW5kIG9ubHkgYWZmZWN0IHRoZVxuICogbWluaW1hcCdzIGJveCBhY2N1cmFjeSAoY29zbWV0aWMpLiBUaGlzIHdyYXBzIE9TRCdzIGxvZ2dlciBpbiBhIFByb3h5IHRoYXQgZHJvcHNcbiAqIG9ubHkgdGhhdCBvbmUgbWVzc2FnZSBzdHJpbmcgYW5kIGZvcndhcmRzIGV2ZXJ5IG90aGVyIGxvZyB1bnRvdWNoZWQuIElkZW1wb3RlbnQuXG4gKi9cbmZ1bmN0aW9uIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTogdm9pZCB7XG4gIGNvbnN0IG9zZDogYW55ID0gT1NEIGFzIGFueTtcbiAgaWYgKG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQpIHJldHVybjtcbiAgY29uc3QgYmFzZTogYW55ID0gKG9zZC5jb25zb2xlICYmIHR5cGVvZiBvc2QuY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IG9zZC5jb25zb2xlXG4gICAgOiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnID8gY29uc29sZSA6IG51bGwpO1xuICBpZiAoIWJhc2UpIHJldHVybjtcbiAgY29uc3QgaXNBZHZpc29yeSA9IChhOiB1bmtub3duKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ25vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlJykgIT09IC0xO1xuICBvc2QuY29uc29sZSA9IG5ldyBQcm94eShiYXNlLCB7XG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSB0YXJnZXRbcHJvcF07XG4gICAgICBpZiAoKHByb3AgPT09ICdlcnJvcicgfHwgcHJvcCA9PT0gJ3dhcm4nKSAmJiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7IGlmIChpc0Fkdmlzb3J5KGFyZ3NbMF0pKSByZXR1cm47IG9yaWcuYXBwbHkodGFyZ2V0LCBhcmdzKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJyA/IG9yaWcuYmluZCh0YXJnZXQpIDogb3JpZztcbiAgICB9LFxuICB9KTtcbiAgb3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCA9IHRydWU7XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7IHJlczogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxuXG4vKiogVGlsZS1zb3VyY2UgZGVzY3JpcHRvciByZXR1cm5lZCBieSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBiaXREZXB0aD86IG51bWJlcjsgbWluQWxsb3dlZD86IG51bWJlcjsgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0gKDAgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KS4gKi9cbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYGxvYWQoKWAgaGFuZHMgdG8gYHBsb3QoKWAuICovXG5pbnRlcmZhY2UgT3NkTG9hZGVkIHtcbiAgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsO1xuICBpbmZvQjY0OiBzdHJpbmc7XG4gIHo6IG51bWJlcjtcbiAgLyoqIE1pcnJvcnMgdGhlIGxvYWRlZCBpbWFnZSdzIGZpbGVuYW1lIOKAlCB0aGUgZGlhZ3JhbSdzIHJlbmRlciBwaXBlbGluZVxuICAgKiAgZ3VhcmRzIG9uIGBsb2FkZWQuZmlsZW5hbWUgPT09IHBoYXNlSW5mby5maWxlTmFtZWAgYmVmb3JlIGNhbGxpbmcgcGxvdCgpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogU2ltcGxlIChub24tdGlsZWQpIGltYWdlOiBgcGxvdCgpYCBvcGVucyB7QGxpbmsgdXJsfSBkaXJlY3RseSB2aWEgT1NEJ3NcbiAgICogIHNpbmdsZS1pbWFnZSBzb3VyY2Ug4oCUIG5vIHRpbGUgcHlyYW1pZCwgbm8gc2VydmVyLiBTZXQgd2hlbiB0aGUgaW1hZ2VcbiAgICogIGNhcnJpZXMgYHRpbGVkID09PSBmYWxzZWAgKHNlZSB7QGxpbmsgSUltYWdlSW5mby50aWxlZH0pLiAqL1xuICBzaW1wbGU/OiBib29sZWFuO1xuICAvKiogVGhlIGRpcmVjdGx5LWxvYWRhYmxlIGltYWdlIFVSTCAoYGJsb2I6YC9gZGF0YTpgL2BodHRwYCkgZm9yIHNpbXBsZSBtb2RlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiB2aXN1YWxpemF0aW9uIGJhY2tlbmQuXG4gKlxuICogUmVuZGVycyB0aGUgKmltYWdlKiBwbG90IHR5cGUgYXMgYSBuYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyLCBiYWNrZWQgYnlcbiAqIHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cyAoYEdFVCAvdGlsZXMvaW5mb2AgKyBgR0VUIC90aWxlYCwgd2hpY2ggcmV1c2VcbiAqIHRoZSBCaW8tRm9ybWF0cyBST0kgcmVuZGVyZXIpLiBQbG90bHkga2VlcHMgdGhlIHNjaWVudGlmaWMvZGF0YSBwbG90IHR5cGVzXG4gKiAoc2NhbGFyIGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkg4oCUXG4gKiBoZW5jZSB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBvbmx5IGBJbWFnZURpc3BsYXlgLlxuICpcbiAqIFdpcmVkOiBsb2FkIOKGkiBkZXNjcmlwdG9yLCBwbG90IOKGkiBtb3VudCB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSxcbiAqIHpvb20vcGFuIOKGkiB2aWV3cG9ydCBBUEkuIE5PVCB3aXJlZCB5ZXQgKGZvbGxvdy11cHMpOiByZWdpb24gb3ZlcmxheXMgKyB0b29sc1xuICogKGEgcG9zaXRpb25lZCBjYW52YXMvU1ZHIG92ZXJsYXkgb3IgQW5ub3RvcmlvdXMpLCBwaXhlbCByZWFkYmFjaywgYW5kIHRoZVxuICogcGVyLXRpbGUgTFVUL2NvbnRyYXN0IHBhcmFtcy4gTm90IHJlZ2lzdGVyZWQgaW4gREkgcHJvdmlkZXJzIOKAlCBgUGxvdGx5U2VydmljZWBcbiAqIGlzIHN0aWxsIHRoZSBvbmx5IGFjdGl2ZSBiYWNrZW5kOyB0aGlzIHByb3ZlcyB0aGUgY29udHJhY3Qgc3VwcG9ydHMgYSBzZWNvbmRcbiAqIGltcGxlbWVudGF0aW9uIGFnYWluc3QgcmVhbCBlbmRwb2ludHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgLyoqIE9TRCdzIHN0cmVuZ3RoIGlzIGRpc3BsYXlpbmcgYSBsYXJnZSB6b29tYWJsZSBpbWFnZSDigJQgbm90aGluZyBlbHNlIGhlcmUuICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1ZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5XSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcbiAgcHJpdmF0ZSB2aWV3ZXI6IE9wZW5TZWFkcmFnb24uVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogT3NkU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICAvKiogQmFzZTY0IFJhd0ZpbGVJbmZvICsgY3VycmVudCB6LXNsaWNlLCBrZXB0IHNvIHNldFpJbmRleCBjYW4gcmVidWlsZCB0aGVcbiAgICogIHRpbGUgc291cmNlIGFuZCBzd2FwIHNsaWNlcyBsaXZlIChzdGFjayBuYXZpZ2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbmZvQjY0ID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFogPSAwO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY3VycmVudCBpbWFnZSBpcyBcInNpbXBsZVwiICh0aWxlZDpmYWxzZSDigJQgc2VsZi1jb250YWluZWRcbiAgICogIHBlci1zbGljZSBVUkxzLCBubyB0aWxlIHNlcnZlcjsgZS5nLiBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWRcbiAgICogIGNsaWVudC1zaWRlIGludG8gYSBzdGFjaykuIHNldFpJbmRleCBzd2FwcyB0aGUgc2luZ2xlLWltYWdlIHNvdXJjZSBmb3JcbiAgICogIHRoZSBuZXcgc2xpY2UncyBVUkwgaW5zdGVhZCBvZiB1cGRhdGluZyBhIHRpbGVkIHotcGFyYW0uICovXG4gIHByaXZhdGUgc2ltcGxlTW9kZSA9IGZhbHNlO1xuICAvKiogdXJsc1tdIGZvciB0aGUgY3VycmVudCBzaW1wbGUtbW9kZSBpbWFnZSwgc28gc2V0WkluZGV4IGNhbiBsb29rIHVwIHRoZVxuICAgKiAgc2xpY2UgYmVpbmcgc2NydWJiZWQgdG8gKHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLnVybEZvcn0pLlxuICAgKiAgVW51c2VkIChhbmQgbGVmdCBzdGFsZSwgaGFybWxlc3NseSkgaW4gdGlsZWQgbW9kZS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogcHJldmlldyBibG9iIFVSTCDihpIgZnVsbC1yZXMgdXBzY2FsZWQgYmxvYiBVUkwgKHNlZSB0b0Z1bGxSZXNVcmwpLCBzb1xuICAgKiAgcmUtdmlzaXRpbmcgYSBzaW1wbGUtbW9kZSBzbGljZSBkb2Vzbid0IHJlLXVwc2NhbGUuIFJldm9rZWQgb24gZmlsZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlRnVsbFJlc1VybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbENvdW50PjEpOiB0aGUgc3RhY2snc1xuICAgKiAgcGVyLXNsaWNlIHBlci1jaGFubmVsIHBsYW5lIFVSTHMsIHRoZSBjdXJyZW50IHNsaWNlJ3MgZGVjb2RlZCBwbGFuZXMsIGFuZFxuICAgKiAgdGhlIGxhc3QgY29tcG9zaXRlIGJsb2IgVVJMLiBDb21wb3NpdGVkIGNsaWVudC1zaWRlIHZpYSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXRcbiAgICogIChubyB0aWxlIHNlcnZlcik7IGtlcHQgT0ZGIHRoZSB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoLiAqL1xuICBwcml2YXRlIHNpbXBsZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxVcmxzOiBzdHJpbmdbXVtdID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDb21wb3NpdGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2tpcCB0aGUgZnVsbC1yZXMgdXBzY2FsZSBhYm92ZSB0aGlzIGxvbmdlc3Qtc2lkZSBkaW1lbnNpb24g4oCUIGEgZm9sZGVyXG4gICAqICBzdGFjayBpcyBwZXItZmlsZSBwcmV2aWV3cyAod2VsbCB1bmRlciB0aGlzKTsgdGhpcyBvbmx5IGd1YXJkcyBhZ2FpbnN0IGFuXG4gICAqICBhY2NpZGVudGFsIGVub3Jtb3VzIGNhbnZhcyBhbGxvY2F0aW9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNJTVBMRV9VUFNDQUxFX01BWF9ESU0gPSA4MTkyO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhbmRIb3N0ITogV2FuZFRvb2xIb3N0O1xuICBwcml2YXRlIGVyYXNlckhvc3QhOiBWZXJ0ZXhFcmFzZXJUb29sSG9zdDtcbiAgLyoqIFdhbmQgc2FtcGxpbmcgbWF0cml4IHJlYWQgYmFjayBmcm9tIHRoZSByZW5kZXJlZCB2aWV3cG9ydDsgY2FjaGVkIHVudGlsXG4gICAqICB0aGUgdmlld3BvcnQgY2hhbmdlcyAoc2VlIHJlYWRiYWNrVmlld3BvcnQpLiAqL1xuICBwcml2YXRlIHZpZXdwb3J0UGl4ZWxzOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBET00gaWQgb2YgdGhlIGVsZW1lbnQgT1NEIGlzIG1vdW50ZWQgaW4gKHNoYXJlZCB3aXRoIFBsb3RseSk7IHRoZVxuICAgKiAgb24tY2FudmFzIHRvb2xzIGF0dGFjaCB0aGVpciBvdmVybGF5cyBoZXJlLiAqL1xuICBwcml2YXRlIHBsb3REaXYgPSAnJztcbiAgLyoqIEN1cnJlbnQgZmlsZSBuYW1lLCB0YWdnZWQgb250byB3YW5kLWNyZWF0ZWQgc2hhcGVzLiAqL1xuICBwcml2YXRlIGN1cnJlbnRGaWxlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogMjU2LWVudHJ5IFJHQiBMVVQgZm9yIHRoZSBhY3RpdmUgY29sb3JtYXAsIGFwcGxpZWQgdG8gZ3JheXNjYWxlIHRpbGVzIHZpYVxuICAgKiAgdGhlIHRpbGUtaW52YWxpZGF0ZWQgcGl4ZWwgcGlwZWxpbmUgKG1pcnJvcnMgUGxvdGx5J3MgaGVhdG1hcCBjb2xvcnNjYWxlKS5cbiAgICogIE51bGwgd2hpbGUgb3B0aW9ucyByZXNvbHZlOyByZWNvbG9yaW5nIGlzIHNraXBwZWQgdW50aWwgaXQncyBidWlsdC4gKi9cbiAgcHJpdmF0ZSBjb2xvckx1dDogUmdiW10gfCBudWxsID0gbnVsbDtcbiAgLyoqIE9ubHkgZ3JheXNjYWxlIGltYWdlcyBnZXQgYSBjb2xvcm1hcCAoUkdCIHRpbGVzIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQpLiAqL1xuICBwcml2YXRlIGlzR3JheXNjYWxlSW1hZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb2xvcm1hcFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgYnkgZXZlcnkgZGlzcGxheSBpbnZhbGlkYXRpb24uIEEgcmVjb2xvciByb3VuZCBjYXB0dXJlcyBpdCBhbmQsIGFmdGVyXG4gICAqICBlYWNoIGBhd2FpdGAsIGFiYW5kb25zIHRoZSB0aWxlIG9uY2UgYSBuZXdlciByb3VuZCBoYXMgc3RhcnRlZC4gV3JpdGluZyBhXG4gICAqICBzdXBlcnNlZGVkIGNvbnRleHQgYmFjayBpcyBub3QgbWVyZWx5IHdhc3RlZCB3b3JrOiBPU0QncyBjb252ZXJzaW9uIHNlZXMgYVxuICAgKiAgY2FudmFzIHRoZSBuZXdlciByb3VuZCBhbHJlYWR5IHJlcGxhY2VkLCB0aHJvd3MgYERPTUV4Y2VwdGlvbmAsIGFuZFxuICAgKiAgYF9oYW5kbGVDb252ZXJzaW9uRXJyb3JgIERFU1RST1lTIHRoZSBjYWNoZSByZWNvcmQgYW5kIHVubG9hZHMgdGhlIHRpbGVcbiAgICogICh1bmxpa2UgdGhlIGRyYXdlcidzIHJhc3RlckJsb2IgcGF0aCwgaXQgZG9lcyBub3QgcmUtcHJlcGFyZSkuIEVub3VnaCBvZlxuICAgKiAgdGhvc2UgYW5kIHRoZSB2aWV3ZXIgZ29lcyB3aGl0ZSBtaWQtZHJhZy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5VG9rZW4gPSAwO1xuICAvKiogUGVuZGluZyBjb2FsZXNjZWQgaW52YWxpZGF0aW9uIChzZWUge0BsaW5rIHNjaGVkdWxlSW52YWxpZGF0ZX0pLiAqL1xuICBwcml2YXRlIGludmFsaWRhdGVIYW5kbGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF0ZXN0IHBlci1jaGFubmVsIGRpc3BsYXkgc3RhdGUgKHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5KSBmcm9tIHRoZSBzdG9yZSxcbiAgICogIHJlYWQgc3luY2hyb25vdXNseSBieSByZWNvbG9yVGlsZS4gQ2hhbm5lbCAwIGRyaXZlcyBncmF5c2NhbGUgd2luZG93aW5nO1xuICAgKiAgUi9HL0IgKGluZGljZXMgMC0yKSBkcml2ZSBSR0IgcGVyLWNoYW5uZWwgd2luZG93aW5nLiAqL1xuICBwcml2YXRlIGNoYW5uZWxTdGF0ZXM6IElDaGFubmVsU3RhdGVbXSA9IFtdO1xuICAvKiogVHJ1ZSBmb3IgbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSwgbm90IFJHQik6IHRpbGVzIGFyZVxuICAgKiAgY29tcG9zaXRlZCBjbGllbnQtc2lkZSBmcm9tIHBlci1jaGFubmVsIHNpbmdsZS1iYW5kIGZldGNoZXMgKHNlZVxuICAgKiAgcmVjb2xvck11bHRpQ2hhbm5lbFRpbGUpIHJhdGhlciB0aGFuIHJlY29sb3JlZCBpbiBwbGFjZS4gKi9cbiAgcHJpdmF0ZSBpc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAvKiogQ291bnQgb2YgcmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seVxuICAgKiAgaGVyZSkuIEZvciBtdWx0aWNoYW5uZWwgaW1hZ2VzIHRoZSB0aWxlIHNvdXJjZSBpcyBidWlsdCBmcm9tIHRoZXNlIGFsb25lIHNvXG4gICAqICBldmVyeSBkaXNwbGF5ZWQgdGlsZSBzdXBwb3J0cyBhIHBlci1jaGFubmVsIGZldGNoLiAqL1xuICBwcml2YXRlIHJlYWxMZXZlbHMgPSAwO1xuICAvKiogSW52ZXJ0ZWQgYmFja2dyb3VuZCAod2hpdGUgPSB6ZXJvKTogaW52ZXJ0cyB0aGUgZGlzcGxheSB2YWx1ZSBiZWZvcmUgdGhlXG4gICAqICBMVVQgKGdyYXlzY2FsZSkgLyBwZXIgY2hhbm5lbCAoUkdCKS4gKi9cbiAgcHJpdmF0ZSBpbnZlcnRCZyA9IGZhbHNlO1xuICAvKiogQmVhcmVyIHRva2VuIGZvciBPU0QncyBvd24gdGlsZSBmZXRjaGVzIChIdHRwQ2xpZW50IGNhbGxzIGdldCBpdCB2aWEgdGhlXG4gICAqICBpbnRlcmNlcHRvcjsgT1NEJ3MgbG9hZGVyIGRvZXMgbm90LCBzbyB3ZSBwYXNzIGl0IGFzIGFuIGFqYXggaGVhZGVyKS4gKi9cbiAgcHJpdmF0ZSBhdXRoSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvKiogV2hldGhlciB0aGUgb3ZlcnZpZXcgbmF2aWdhdG9yIChtaW5pbWFwKSBpcyBzaG93bi4gUmVhZCBhdCB2aWV3ZXIgY3JlYXRpb247XG4gICAqICBhIGNvbnN1bWVyIHRoYXQgZG9lc24ndCB3YW50IGl0IChlLmcuIGEgc21hbGwgZW1iZWRkZWQgcHJldmlldykgc2V0cyBpdCBvZmZcbiAgICogIHZpYSB7QGxpbmsgc2V0TmF2aWdhdG9yVmlzaWJsZX0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVmlzaWJsZSA9IHRydWU7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKS4gYGZhbHNlYCDihpIgbmVhcmVzdC1uZWlnaGJvdXIsIHNvIHpvb21lZC1pbiBwaXhlbHNcbiAgICogIHJlbmRlciBhcyBjcmlzcCBibG9ja3MgKHBpeGVsIGluc3BlY3Rpb24pLiBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIHRoZSBpbWFnZVxuICAgKiAgb3BlbnMgc2hvd2luZyByYXcgcGl4ZWxzLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjsgdG9nZ2xlZCB2aWFcbiAgICogIHtAbGluayBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWR9LiAqL1xuICBwcml2YXRlIHNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuICAvKiogT3ZlcmFsbCBkZWFkbGluZSBmb3IgdGhlIC90aWxlcy9pbmZvIHBvbGwgbG9vcC4gQW4gdW5jYWNoZWQgd2hvbGUtc2xpZGVcbiAgICogIGltYWdlIChlLmcuIC5uZHBpKSBpcyBjYWNoZWQgc2VydmVyLXNpZGUgZmlyc3QgKEdDUy0+UFZDKSwgd2hpY2ggY2FuIHRha2VcbiAgICogIHNldmVyYWwgbWludXRlcyDigJQgd2UgcG9sbCAoc2hvcnQgcmVxdWVzdHM7IHRoZSBjYWNoZS1wcm9ncmVzcyBvdmVybGF5XG4gICAqICBzaG93cyB0aGUgd2FpdCkgdW50aWwgaXQncyByZWFkeS4gR2VuZXJvdXMgYmVjYXVzZSBlYWNoIHBvbGwgaXMgY2hlYXA7IG9uXG4gICAqICBleHBpcnkgdGhlIHJlbmRlciBwaXBlbGluZSBnaXZlcyB1cCBhbmQgdGhlIHJvdXRlciBmYWxscyBiYWNrIHRvIFBsb3RseS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlc0luZm9UaW1lb3V0TXMgPSA2MDAwMDA7IC8vIDEwIG1pblxuXG4gIC8qKiBQZXItY2hhbm5lbCBmaXQtdmlldyB0aWxlIGJ1ZGdldCAodGlsZXMgYXQgdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgw5cgY2hhbm5lbHMpLlxuICAgKiAgQWJvdmUgaXQsIGEgbXVsdGljaGFubmVsIGltYWdlIHJlbmRlcnMgc2VydmVyLWNvbXBvc2l0ZWQgaW5zdGVhZCBvZiBwZXItY2hhbm5lbFxuICAgKiAg4oCUIGl0cyBmdWxsLXJlcyByZWFkcyAoaXQgaGFzIG5vIG92ZXJ2aWV3IHB5cmFtaWQpIHdvdWxkIGJlIHRvbyBtYW55IMOXIE4gY2hhbm5lbHMuXG4gICAqICA2NCAoZS5nLiBhIDR4NCBzaW5nbGUtRk9WIHotc3RhY2sgw5cgNGNoKSBzdGF5cyBwZXItY2hhbm5lbDsgYSB3aG9sZS1zbGlkZVxuICAgKiAgKGh1bmRyZWRz4oCTdGhvdXNhbmRzKSBmYWxscyBiYWNrLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTID0gMjU2O1xuXG4gIC8qKiBQaXhlbCBkaXNwbGF5IHBpcGVsaW5lICh3aW5kb3cvZ2FtbWEvaW52ZXJ0L2NvbG9ybWFwICsgYWRkaXRpdmUgdGludCkg4oCUXG4gICAqICBzaGFyZWQgYnkgdGlsZSByZWNvbG9yaW5nIGFuZCB0aGUgY29tcG9zaXRlIGV4cG9ydCBzbyB0aGV5IHN0YXkgaWRlbnRpY2FsXG4gICAqICAoc2VlIERpc3BsYXlQaXBlbGluZSkuIEhvc3QgY2xvc3VyZXMgcmVhZCB0aGUgc2VydmljZSdzIGxpdmUgZmllbGRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXkgPSBuZXcgRGlzcGxheVBpcGVsaW5lKHtcbiAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgIGNvbG9yTHV0OiAoKSA9PiB0aGlzLmNvbG9yTHV0LFxuICAgIGNoYW5uZWxTdGF0ZXM6ICgpID0+IHRoaXMuY2hhbm5lbFN0YXRlcyxcbiAgICBpbnZlcnRCZzogKCkgPT4gdGhpcy5pbnZlcnRCZyxcbiAgfSk7XG5cbiAgLyoqIEhpc3RvZ3JhbSArIGF1dG8td2luZG93IHNhbXBsaW5nIChzZWUgSGlzdG9ncmFtU2FtcGxlcikuIENvbnN0cnVjdGVkIGluXG4gICAqICB0aGUgY3RvciBib2R5IGJlY2F1c2UgaXQgY2FwdHVyZXMgdGhlIHJlc29sdmVkIEFQSSBiYXNlIFVSTC4gKi9cbiAgcHJpdmF0ZSBzYW1wbGVyITogSGlzdG9ncmFtU2FtcGxlcjtcblxuICAvKiogU3RhY2stc2xpY2UgY2FjaGUgKyBiYWNrZ3JvdW5kIHByZWxvYWRlciAoc2VlIFNsaWNlQ2FjaGUg4oCUIHJlZmFjdG9yaW5nXG4gICAqICBwbGFuIFN0ZXAgMykuIFRoZSBob3N0IGFjY2Vzc29ycyBhcmUgbGl2ZSBjbG9zdXJlcywgc28gdGhlIGNhY2hlIGFsd2F5c1xuICAgKiAgcmVhZHMgdGhlIHNlcnZpY2UncyBjdXJyZW50IHZpZXdlci9kZXNjcmlwdG9yL3og4oCUIGV4YWN0bHkgdGhlIGZpZWxkcyB0aGVcbiAgICogIG1vdmVkIGNvZGUgdXNlZCB0byByZWFkIGRpcmVjdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFNsaWNlQ2FjaGUoe1xuICAgIHZpZXdlcjogKCkgPT4gdGhpcy52aWV3ZXIsXG4gICAgaGFzSW1hZ2U6ICgpID0+ICEhKHRoaXMudmlld2VyICYmIHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmluZm9CNjQpLFxuICAgIHNsaWNlQ291bnQ6ICgpID0+IHRoaXMuZGVzY3JpcHRvcj8ueiA/PyAxLFxuICAgIGN1cnJlbnRaOiAoKSA9PiB0aGlzLmN1cnJlbnRaLFxuICAgIGlzTXVsdGlDaGFubmVsOiAoKSA9PiB0aGlzLmlzTXVsdGlDaGFubmVsLFxuICAgIGNoYW5uZWxDb3VudDogKCkgPT4gTWF0aC5tYXgoMSwgdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aCB8fCAodGhpcy5kZXNjcmlwdG9yPy5jaGFubmVscyA/PyAxKSksXG4gICAgY2hhbm5lbFZpc2libGU6IChjOiBudW1iZXIpID0+IHRoaXMuY2hhbm5lbFN0YXRlc1tjXT8udmlzaWJsZSAhPT0gZmFsc2UsXG4gICAgYnVpbGRUaWxlU291cmNlOiAoejogbnVtYmVyLCBjaGFubmVsPzogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5idWlsZFRpbGVTb3VyY2UodGhpcy5kZXNjcmlwdG9yISwgdGhpcy5pbmZvQjY0LCB6LCBjaGFubmVsKSxcbiAgICBvbkNvbXBvc2l0ZVNsaWNlQWRkZWQ6ICh6OiBudW1iZXIpID0+IHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3codGhpcy5kZXNjcmlwdG9yISwgdGhpcy5pbmZvQjY0LCB6KSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgcHJpdmF0ZSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FtVG9vbDogU2FtVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZWxsU2VnbWVudFRvb2w6IENlbGxTZWdtZW50VG9vbFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDRUxMX1NFR01FTlRFUikgcHJpdmF0ZSBjZWxsU2VnbWVudGVyOiBJQ2VsbFNlZ21lbnRlciB8IG51bGwsXG4gICAgcHJpdmF0ZSBlcmFzZXJUb29sOiBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHpvb21Ub0JveFRvb2w6IFpvb21Ub0JveFRvb2xTZXJ2aWNlLFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgICB0aGlzLnNhbXBsZXIgPSBuZXcgSGlzdG9ncmFtU2FtcGxlcih0aGlzLmh0dHAsIHRoaXMuYXBpLCB7XG4gICAgICByZWFsTGV2ZWxzOiAoKSA9PiB0aGlzLnJlYWxMZXZlbHMsXG4gICAgICBjaGFubmVsQ291bnQ6IChkKSA9PiB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8IChkLmNoYW5uZWxzID8/IDEpLFxuICAgICAgaXNHcmF5c2NhbGU6ICgpID0+IHRoaXMuaXNHcmF5c2NhbGVJbWFnZSxcbiAgICAgIC8vIE51ZGdlIHRoZSBjaGFubmVsLXN0YXRlcyBzdHJlYW0gc28gdGhlIHBhbmUgcmUtcmVhZHMgZ2V0SGlzdG9ncmFtIG5vdyxcbiAgICAgIC8vIGluIGNhc2UgaXRzIGJvdW5kZWQgcmV0cnkgd2luZG93IGFscmVhZHkgbGFwc2VkLlxuICAgICAgb25DaGFubmVsSGlzdG9ncmFtc1NhbXBsZWQ6ICgpID0+IHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlcyh0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCkpLFxuICAgICAgb25HcmF5V2luZG93U2FtcGxlZDogKG1pbiwgbWF4KSA9PiB0aGlzLnNlZWRHcmF5V2luZG93KG1pbiwgbWF4KSxcbiAgICB9KTtcbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAvKiogVmlzaWJsZSBpbWFnZSByZWdpb24gKGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzKSBlbWl0dGVkIHdoZW4gdGhlIHZpZXdcbiAgICogIHNldHRsZXMsIHNvIHRoZSBpbnRlbnNpdHkgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+KCk7XG4gIC8vIFJlZ2lvbiBzdGF0ZSAocmVnaW9ucywgc2VsZWN0aW9uLCB0aGUgdXBkYXRlIGV2ZW50KSBsaXZlcyBpbiB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlOyB0aGUgSVJlZ2lvblN0b3JlIG1ldGhvZHMgYmVsb3cgZGVsZWdhdGUgdG8gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5UHJvZmlsZSQgPSBuZXcgU3ViamVjdDxJbnRlbnNpdHlQcm9maWxlW10+KCk7XG4gIC8vIEltYWdlIG1ldGFkYXRhIGFuZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUuXG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSBjb2xvcm1hcC9yZXZlcnNlIHNvIE9TRCByZWNvbG9ycyBpblxuICAgKiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuIElkZW1wb3RlbnQgYW5kIHNlbGYtaGVhbGluZzogdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdFxuICAgKiBzaW5nbGV0b24sIGJ1dCBgdW5zdWJzY3JpYmUoKWAgKGNhbGxlZCBvbiBWaXN1YWxpemVyQ29tcG9uZW50IGRlc3Ryb3kpXG4gICAqIHRlYXJzIHRoZSBzdWJzY3JpcHRpb24gZG93biDigJQgYW5kIHRoZSBjb25zdHJ1Y3RvciBuZXZlciBydW5zIGFnYWluLiBTb1xuICAgKiBgcGxvdCgpYCBjYWxscyB0aGlzIHRvIHJlLWVzdGFibGlzaCBpdCBhZnRlciBhIGNvbXBvbmVudCB0ZWFyZG93bi9yZWNyZWF0ZVxuICAgKiAoZS5nLiBzd2l0Y2hpbmcgaW1hZ2VzKSwgb3RoZXJ3aXNlIGNvbG9ybWFwIGNoYW5nZXMgd291bGQgYmUgc2lsZW50bHlcbiAgICogZHJvcHBlZCBvbiBldmVyeSBpbWFnZSBhZnRlciB0aGUgZmlyc3Qgc3dpdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVDb2xvcm1hcFN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb2xvcm1hcFN1YikgcmV0dXJuO1xuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSDigJQgdGhlIHNpbmdsZSBzb3VyY2VcbiAgICAvLyBvZiB0cnV0aCBmb3IgYm90aCBiYWNrZW5kcy4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgZWl0aGVyIGNoYW5nZXMsIHNvIE9TRCByZWNvbG9ycyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSArIHBlci1jaGFubmVsIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5ICsgaW52ZXJ0IGFsbCBsaXZlIGluXG4gICAgLy8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGFueSBvZiB0aGVtIGNoYW5nZXMsIHNvIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHVwZGF0ZXMgdGhlXG4gICAgLy8gaW1hZ2UgbGl2ZSBhbmQgT1NEIHN0YXlzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICB0aGlzLmNvbG9ybWFwU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgIF0pLnN1YnNjcmliZSgoW2NtLCByZXYsIGNoYW5uZWxzLCBpbnZlcnRdKSA9PiB7XG4gICAgICB0aGlzLmNvbG9yTHV0ID0gYnVpbGRDb2xvcm1hcEx1dChjbT8uZGF0YT8udmFsdWUsICEhcmV2KTtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyA9IGNoYW5uZWxzO1xuICAgICAgdGhpcy5pbnZlcnRCZyA9ICEhaW52ZXJ0O1xuICAgICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWw6IHJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWRcbiAgICAgIC8vIHBsYW5lcyB3aXRoIHRoZSBuZXcgY2hhbm5lbCBzdGF0ZXMgKyByZS1vcGVuIChubyB0aWxlLWludmFsaWRhdGUgcGF0aCkuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHsgdm9pZCB0aGlzLnJlY29tcG9zaXRlQW5kT3BlbigpOyByZXR1cm47IH1cbiAgICAgIC8vIE11bHRpY2hhbm5lbDogZWFjaCBjaGFubmVsIGlzIGl0cyBvd24gVGlsZWRJbWFnZSDigJQgdmlzaWJpbGl0eSBpcyB0aGVcbiAgICAgIC8vIGltYWdlJ3Mgb3BhY2l0eSAod2luZG93L2dhbW1hL2NvbG91ciBhcmUgYXBwbGllZCBieSByZWNvbG9yQ2hhbm5lbFRpbGVcbiAgICAgIC8vIG9uIHRoZSBpbnZhbGlkYXRlIGJlbG93KS4gUmUtYXBwbHlpbmcgdGhlIGN1cnJlbnQgc2xpY2UncyByZXZlYWwgcGlja3MgdXBcbiAgICAgIC8vIHRoZSBuZXcgcGVyLWNoYW5uZWwgdmlzaWJpbGl0eSAoY2FjaGVkIHNsaWNlcyBzdGF5IGhpZGRlbikuXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLmNhY2hlLnJldmVhbENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlcXVlc3RJbnZhbGlkYXRlKHRydWUpIHJlc3RvcmVzIGVhY2ggdGlsZSB0byBpdHMgb3JpZ2luYWwgZGF0YSBiZWZvcmVcbiAgICAgIC8vIHJlLXJ1bm5pbmcgcmVjb2xvclRpbGUsIHNvIGEgY2hhbmdlIGFsd2F5cyBtYXBzIGFmcmVzaCAobm8gY29tcG91bmRpbmcpLlxuICAgICAgLy8gUkdCIG5vdyByZWNvbG9ycyB0b28gKHBlci1jaGFubmVsIHdpbmRvdy92aXNpYmlsaXR5KSwgc28gZG9uJ3QgZ2F0ZSBvblxuICAgICAgLy8gZ3JheXNjYWxlLiBDb2FsZXNjZWQ6IFByaW1lTkcncyBzbGlkZXIgZmlyZXMgKG9uQ2hhbmdlKSBjb250aW51b3VzbHksIHNvXG4gICAgICAvLyBhIHNpbmdsZSBkcmFnIHdvdWxkIG90aGVyd2lzZSBxdWV1ZSBkb3plbnMgb2Ygb3ZlcmxhcHBpbmcgcmVzdG9yZSArXG4gICAgICAvLyByZS1wcm9jZXNzIHJvdW5kcyBvdmVyIGV2ZXJ5IGNoYW5uZWwgaW1hZ2UuXG4gICAgICB0aGlzLnNjaGVkdWxlSW52YWxpZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIEludGVuc2l0eSBjaGFubmVsIHdpdGggYSBtZWFzdXJlZCBhdXRvLXdpbmRvdyB3aGlsZSBpdCdzIHN0aWxsXG4gICAqICBhdCBmdWxsIHJhbmdlIChuZXZlciBjbG9iYmVyIHRoZSB1c2VyJ3MgbWFudWFsIHdpbmRvdyk7IGlmIHRoZSB1c2VyXG4gICAqICBhbHJlYWR5IHdpbmRvd2VkLCBqdXN0IHJlLWludmFsaWRhdGUgc28gcGFpbnRlZCB0aWxlcyBwaWNrIHRoZSBMVVQgdXAuICovXG4gIHByaXZhdGUgc2VlZEdyYXlXaW5kb3cobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY2gwID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIGlmIChjaDAgJiYgY2gwLm1pbiA9PT0gMCAmJiBjaDAubWF4ID09PSAyNTUpIHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0Q2hhbm5lbFN0YXRlKDAsIHsgbWluLCBtYXggfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmNvbG9yTHV0KSB7XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRmV0Y2ggdGhlIHRpbGUtc291cmNlIGRlc2NyaXB0b3IgZm9yIHRoZSBzZWxlY3RlZCBmaWxlLiBUaGUgYGluZm9gIHBhcmFtIGlzXG4gICAqIHRoZSBiYXNlNjQgUmF3RmlsZUluZm8gdGhlIHJlc3Qgb2YgdGhlIEFQSSB1c2VzOyB0aGUgR0VUIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogYXV0aCBpbnRlcmNlcHRvciAoQmVhcmVyKS4gV2UgYWxzbyBncmFiIGEgdG9rZW4gaGVyZSBmb3IgT1NEJ3Mgb3duIHRpbGVcbiAgICogZmV0Y2hlcyAoaXRzIGxvYWRlciBieXBhc3NlcyBIdHRwQ2xpZW50KS5cbiAgICovXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIC8vIEEgZGlmZmVyZW50IGltYWdlIHdhcyBzZWxlY3RlZCDigJQgc3RvcCB0aGUgcHJldmlvdXMgc3RhY2sncyBiYWNrZ3JvdW5kXG4gICAgLy8gbG9hZGluZyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGZpbmlzaCBiZWhpbmQgdGhlIG5ldyBpbWFnZS5cbiAgICBpZiAoZmlsZW5hbWUgJiYgdGhpcy5jdXJyZW50RmlsZU5hbWUgJiYgZmlsZW5hbWUgIT09IHRoaXMuY3VycmVudEZpbGVOYW1lKSB7XG4gICAgICB0aGlzLmNhY2hlLmNhbmNlbEJhY2tncm91bmRMb2FkKCk7XG4gICAgICB0aGlzLnJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk7XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoZmlsZW5hbWUpO1xuICAgIC8vIFNpbXBsZSAoaW4tbWVtb3J5IC8gbm9uLXRpbGVkKSBpbWFnZTogc2tpcCB0aGUgdGlsZSBzZXJ2ZXIgZW50aXJlbHkg4oCUIG5vXG4gICAgLy8gZ2V0U2VsZWN0ZWRJbmZvQjY0LCBubyAvdGlsZXMvaW5mbyBwb2xsLiBgdXJsc1t6SW5kZXhdYCBpcyBhIGNvbXBsZXRlIGltYWdlXG4gICAgLy8gT1NEIG9wZW5zIHZpYSBpdHMgc2luZ2xlLWltYWdlIHNvdXJjZSAoc2VlIHBsb3QoKSkuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW1hZ2VJbmZvKSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFNpbXBsZShpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfVxuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzLmdldEF1dGhIZWFkZXJzKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307IC8vIGZhbGwgYmFjayB0byBjb29raWUgYXV0aCAoYWpheFdpdGhDcmVkZW50aWFscylcbiAgICB9XG4gICAgLy8gUG9sbCAvdGlsZXMvaW5mbzogdGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZSBmaWxlIGlzIHN0aWxsXG4gICAgLy8gYmVpbmcgY2FjaGVkIChHQ1MtPlBWQykg4oCUIGl0IGtpY2tzIHRoZSBkb3dubG9hZCBvZmYgaW4gdGhlIGJhY2tncm91bmQsIHNvXG4gICAgLy8gZWFjaCByZXF1ZXN0IGlzIHNob3J0IChubyBsb25nLWhlbGQgY29ubmVjdGlvbiB0byB0cmlwIGluZ3Jlc3MvcHJveHkgb3JcbiAgICAvLyBjbGllbnQgdGltZW91dHMpLCBhbmQgMjAwIHdpdGggdGhlIGRlc2NyaXB0b3Igb25jZSBpdCdzIHJlYWR5LiBUaGVcbiAgICAvLyBjYWNoZS1wcm9ncmVzcyBvdmVybGF5IHNob3dzIHByb2dyZXNzIGR1cmluZyB0aGUgd2FpdC4gV2UgZ2l2ZSB1cCBhZnRlclxuICAgIC8vIHRpbGVzSW5mb1RpbWVvdXRNcyBzbyB0aGUgcmVuZGVyIHBpcGVsaW5lIG5ldmVyIGhhbmdzICh0aGUgcm91dGVyIHRoZW5cbiAgICAvLyBmYWxscyBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSkuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZXMvaW5mbz9pbmZvPSR7aW5mb0I2NH1gO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMudGlsZXNJbmZvVGltZW91dE1zO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlcy9pbmZvIG5vdCByZWFkeSBiZWZvcmUgZGVhZGxpbmUg4oCUIGZpbGUgc3RpbGwgY2FjaGluZycpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8VGlsZURlc2NyaXB0b3I+KHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUodGltZW91dCg0NTAwMCkpLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMCAmJiByZXNwLmJvZHkpIHtcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSByZXNwLmJvZHk7XG4gICAgICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogcmVzcC5ib2R5LCBpbmZvQjY0LCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyAyMDIgQWNjZXB0ZWQgKG9yIGVtcHR5IGJvZHkpIOKGkiBzdGlsbCBjYWNoaW5nOyBmYWxsIHRocm91Z2ggYW5kIHJlLXBvbGwuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVG9sZXJhdGUgdHJhbnNpZW50IGZhaWx1cmVzIFdISUxFIHRoZSBmaWxlIGlzIGJlaW5nIHByZXBhcmVkOiBhIHNsb3dcbiAgICAgICAgLy8gbWV0YWRhdGEgcmVhZCBvbiBhIG11bHRpLUdCIGZpbGUgKElGRCB3YWxrKSwgYSA1eHggbWlkLXBpcGVsaW5lLCBhXG4gICAgICAgIC8vIHByb3h5IGhpY2N1cC4gQSBzaW5nbGUgYmFkIHBvbGwgbXVzdCBOT1QgZHJvcCB1cyB0byBQbG90bHkg4oCUIGEgbGFyZ2VcbiAgICAgICAgLy8gaW1hZ2UgYWx3YXlzIHBhc3NlcyB0aHJvdWdoIHRoaXMgYnVzeSB3aW5kb3csIHNvIGJhaWxpbmcgaGVyZSBpcyB3aHlcbiAgICAgICAgLy8gaXQgXCJhbHdheXMgZW5kcyB1cCBvbiBQbG90bHlcIi4gS2VlcCBwb2xsaW5nIHVudGlsIHJlYWR5IG9yIGRlYWRsaW5lLlxuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHRpbGVzL2luZm8gcG9sbCByZXRyeScsIGVycik7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxNTAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBgcGxvdCgpYCBwYXlsb2FkIGZvciBhIHNpbXBsZSAodGlsZWQ6ZmFsc2UpIGltYWdlOiBhIHNpbmdsZS1sZXZlbFxuICAgKiAgZGVzY3JpcHRvciBzaXplZCBmcm9tIGB0cnVlSW1hZ2VTaXplYCwgcGx1cyB0aGUgZGlyZWN0bHktbG9hZGFibGUgVVJMIOKAlFxuICAgKiAgcmVzb2x2ZWQgYW5kIGZldGNoZWQgdmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2V9IChzaGFyZWQgd2l0aFxuICAgKiAgbmFwYXJpLWpzOyBzZWUgaXRzIGRvY3MgZm9yIHdoeSB0aGlzIGNhbid0IGJlIGEgcmF3IGBmZXRjaCgpYC9gPGltZz5gKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IHogPSB6SW5kZXggfHwgMDtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9O1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGltYWdlSW5mby50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICBjb25zdCBtZXRhID0gaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIC8vIFNFUlZFUkxFU1MgTVVMVElDSEFOTkVMOiBjb21wb3NpdGUgdGhlIHNsaWNlJ3MgcGVyLWNoYW5uZWwgcGxhbmVzXG4gICAgLy8gY2xpZW50LXNpZGUgKG5vIHRpbGUgc2VydmVyKSwgZHJpdmVuIGJ5IHRoZSBjaGFubmVsIHBhbmUuIEtlcHQgT0ZGIHRoZVxuICAgIC8vIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGggKHNlZSBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwpLlxuICAgIGNvbnN0IGNoVXJscyA9IGltYWdlSW5mby5jaGFubmVsVXJscztcbiAgICB0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCA9ICEhY2hVcmxzPy5sZW5ndGggJiYgKG1ldGE/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgbGV0IHVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IGNoVXJscyBhcyBzdHJpbmdbXVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyhjaFVybHMhW3pdID8/IGNoVXJscyFbMF0pO1xuICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgICAgICAvLyBOQjogaGlzdG9ncmFtcyBhcmUgYmlubmVkIGluIHBsb3QoKSwgQUZURVIgZGVzdHJveVZpZXdlciBjbGVhcnMgdGhlXG4gICAgICAgIC8vIHNhbXBsZXIg4oCUIGNvbXB1dGluZyB0aGVtIGhlcmUgd291bGQgYmUgd2lwZWQgYnkgdGhhdCBjbGVhci5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBbXTtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IFtdO1xuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmIChyYXdVcmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcmV2aWV3VXJsID0gYXdhaXQgdGhpcy5zaW1wbGVTdGFjay5mZXRjaEFzQmxvYlVybChyYXdVcmwpO1xuICAgICAgICAgIC8vIFVwc2NhbGUgdGhlIChkb3duc2NhbGVkKSBwcmV2aWV3IHRvIGZ1bGwgcmVzb2x1dGlvbiBzbyBPU0QncyB3b3JsZFxuICAgICAgICAgIC8vIG1hdGNoZXMgdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIOKAlCBzZWUgdG9GdWxsUmVzVXJsLlxuICAgICAgICAgIHVybCA9IGF3YWl0IHRoaXMudG9GdWxsUmVzVXJsKHByZXZpZXdVcmwsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTm8gbG9hZGFibGUgVVJMIChlbXB0eSB1cmxzW10gb3IgdGhlIGZldGNoIGZhaWxlZCk6IHNpZ25hbCBcImNvdWxkbid0XG4gICAgLy8gbG9hZFwiIHdpdGggYSBudWxsIGRlc2NyaXB0b3Ig4oCUIHNhbWUgYXMgdGhlIHRpbGVkIHBhdGggd2hlbiB0aGVyZSdzIG5vXG4gICAgLy8gc2VsZWN0ZWQtZmlsZSBpbmZvIOKAlCBzbyBwbG90KCkgcmV0dXJucyBmYWxzZSAoaXRzIGBpZiAoIWQpYCBndWFyZCkgYW5kXG4gICAgLy8gdGhlIHJvdXRlciBjYW4gZmFsbCBiYWNrLCBpbnN0ZWFkIG9mIG1vdW50aW5nIGFuIDxpbWc+IHdpdGggYW4gdW5kZWZpbmVkXG4gICAgLy8gc3JjIHRoYXQgdGhyb3dzIGF0IHJ1bnRpbWUuXG4gICAgaWYgKCF1cmwpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgaGFzIG5vIGxvYWRhYmxlIFVSTDsgc2tpcHBpbmcgT1NEIHJlbmRlcicsIGZpbGVuYW1lKTtcbiAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6LCBmaWxlbmFtZSB9O1xuICAgIH1cbiAgICBjb25zdCBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IDAsICAgICAgICAgICAgLy8gdW51c2VkOiBzaW1wbGUgbW9kZSBuZXZlciBjYWxscyBidWlsZFRpbGVTb3VyY2VcbiAgICAgIHo6IDEsICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBmcmFtZVxuICAgICAgY2hhbm5lbHM6IG1ldGE/LnJnYkNoYW5uZWxzID8/IChpbWFnZUluZm8uaXNHcmF5c2NhbGUgPyAxIDogMyksXG4gICAgICBtdWx0aWNoYW5uZWw6IGZhbHNlLFxuICAgICAgcmVhbExldmVsczogMSxcbiAgICAgIGxldmVsczogW3sgcmVzOiAwLCB3aWR0aCwgaGVpZ2h0IH1dLFxuICAgICAgbXBwWDogbWV0YT8ubXBwWCA/PyAwLFxuICAgICAgbXBwWTogbWV0YT8ubXBwWSA/PyAwLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0b3IsXG4gICAgICBpbmZvQjY0OiAnJyxcbiAgICAgIHosXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHNpbXBsZTogdHJ1ZSxcbiAgICAgIHVybCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9TRCdzIGB7dHlwZTonaW1hZ2UnfWAgc291cmNlIHNpemVzIGl0cyBjb29yZGluYXRlIHdvcmxkIHRvIHRoZSBpbWFnZSdzXG4gICAqIE5BVFVSQUwgcGl4ZWxzLiBBIGZvbGRlci1zdGFjayBzbGljZSBpcyBhIHNlcnZlciBgL3ByZXZpZXdgIHdob3NlIHBpeGVsIHNpemVcbiAgICogbmVlZG4ndCBtYXRjaCB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIOKAlCBpdCBtYXkgYmUgZG93bnNjYWxlZCAobGFyZ2VcbiAgICogaW1hZ2VzKSBPUiBsYXJnZXIgdGhhbiB0aGUgZGltZW5zaW9ucyBgL21ldGFkYXRhYCByZXBvcnRzLiBFaXRoZXIgd2F5IE9TRCdzXG4gICAqIHdvcmxkIHdvdWxkIGRpZmZlciBmcm9tIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSAoUXVQYXRoIGdlb2pzb24sXG4gICAqIGluIGxldmVsLTAgcGl4ZWxzKTogYSBzbWFsbGVyIHByZXZpZXcgcmVuZGVycyBST0lzIG92ZXJzaXplZCwgYSBsYXJnZXIgb25lXG4gICAqIHJlbmRlcnMgdGhlbSB1bmRlcnNpemVkL29mZnNldC4gUmVzYW1wbGUgdGhlIHByZXZpZXcgdG8gRVhBQ1RMWSB0aGVcbiAgICogZnVsbC1yZXNvbHV0aW9uIGRpbWVuc2lvbnMgKGJsdXJyeSBidXQgcG9zaXRpb25hbGx5IGV4YWN0IOKAlCBzY2FsaW5nIHVwIG9yXG4gICAqIGRvd24gYXMgbmVlZGVkKSBzbyBPU0QncyB3b3JsZCBtYXRjaGVzIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZSwgd2hpbGUgc3RpbGxcbiAgICogdXNpbmcgT1NEJ3MgcmVsaWFibGUgc2luZ2xlLWltYWdlIHJlbmRlcmVyLiBDYWNoZWQgcGVyIHByZXZpZXcgVVJMIChyZXZva2VkXG4gICAqIG9uIGZpbGUgY2hhbmdlKTsgYSBuby1vcCB3aGVuIHRoZSBwcmV2aWV3IGlzIGFscmVhZHkgZXhhY3RseSBmdWxsLXJlcyAoc21hbGxcbiAgICogaW1hZ2VzLCBpbi1tZW1vcnkgcGlwZWxpbmUgYmxvYnMpLCB3aGVuIHRoZSBkaW1zIGFyZSB1bmtub3duLCBvciB3aGVuXG4gICAqIHRoZXkncmUgaW1wbGF1c2libHkgbGFyZ2UgKGd1YXJkcyBhZ2FpbnN0IGFuIGVub3Jtb3VzIGNhbnZhcykuIChqaXQtdWkjOTMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRvRnVsbFJlc1VybChwcmV2aWV3VXJsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQgfHwgTWF0aC5tYXgod2lkdGgsIGhlaWdodCkgPiB0aGlzLlNJTVBMRV9VUFNDQUxFX01BWF9ESU0pIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuZ2V0KHByZXZpZXdVcmwpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgbGV0IGltZzogSFRNTEltYWdlRWxlbWVudDtcbiAgICB0cnkge1xuICAgICAgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbChwcmV2aWV3VXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBwcmV2aWV3VXJsOyAvLyBjb3VsZG4ndCBkZWNvZGUg4oCUIGxldCBPU0QgdHJ5IHRoZSBVUkwgYXMtaXNcbiAgICB9XG4gICAgLy8gQWxyZWFkeSB0aGUgZXhhY3QgZnVsbC1yZXMgd29ybGQg4oCUIG5vIHJlc2FtcGxlIG5lZWRlZC4gKEEgcHJldmlldyB0aGF0IGlzXG4gICAgLy8gbGFyZ2VyIE9SIHNtYWxsZXIgdGhhbiBmdWxsLXJlcyBtdXN0IHN0aWxsIGJlIHJlc2l6ZWQgc28gT1NEJ3Mgd29ybGQgPT1cbiAgICAvLyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2U7IG9ubHkgYW4gZXhhY3QgbWF0Y2ggaXMgc2tpcHBhYmxlLilcbiAgICBpZiAoaW1nLm5hdHVyYWxXaWR0aCA9PT0gd2lkdGggJiYgaW1nLm5hdHVyYWxIZWlnaHQgPT09IGhlaWdodCkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOyAvLyBzY2FsZSBwcmV2aWV3ICh1cCBvciBkb3duKSB0byBmdWxsLXJlc1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlc29sdmUpID0+IGNhbnZhcy50b0Jsb2IocmVzb2x2ZSkpO1xuICAgIGlmICghYmxvYikgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgZnVsbFJlc1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5zZXQocHJldmlld1VybCwgZnVsbFJlc1VybCk7XG4gICAgcmV0dXJuIGZ1bGxSZXNVcmw7XG4gIH1cblxuICAvKiogU2FtcGxlIGEgU0lNUExFLW1vZGUgc2xpY2UncyBvd24gZGVjb2RlZCBwaXhlbHMgaW50byB0aGUgaGlzdG9ncmFtIOKAlCB0aGVcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBzYW1wbGVycyAobm8gdGlsZSBzZXJ2ZXIpLiBGaXJlLWFuZC1mb3JnZXQ7XG4gICAqICBhIGRlY29kZSBmYWlsdXJlIGp1c3QgbGVhdmVzIHRoZSBwYW5lIGVtcHR5IHJhdGhlciB0aGFuIHRocm93aW5nLiAqL1xuICBwcml2YXRlIGFzeW5jIHNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF1cmwpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbCh1cmwpO1xuICAgICAgY29uc3QgdyA9IGltZy5uYXR1cmFsV2lkdGgsIGggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgICAgIGlmICghdyB8fCAhaCkgcmV0dXJuO1xuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgIGNvbnN0IGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVIaXN0b2dyYW0oeiwgZGF0YSwgdGhpcy5pc0dyYXlzY2FsZUltYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgaGlzdG9ncmFtIHNhbXBsZSBmYWlsZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGZXRjaCArIGRlY29kZSBhIHNsaWNlJ3MgcGVyLWNoYW5uZWwgcGxhbmVzIChzaW5nbGUtYmFuZCBncmF5c2NhbGUpIGludG9cbiAgICogIHBpeGVsIGJ1ZmZlcnMsIGZvciB0aGUgU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgY29tcG9zaXRvci4gQXV0aC1zYWZlOiBnb2VzXG4gICAqICB0aHJvdWdoIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSAoYmxvYjovZGF0YTogYXMtaXM7IGh0dHAgdmlhIEh0dHBDbGllbnQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgdSBvZiB1cmxzID8/IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcmV2aWV3VXJsID0gYXdhaXQgdGhpcy5zaW1wbGVTdGFjay5mZXRjaEFzQmxvYlVybCh1KTtcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VFbChwcmV2aWV3VXJsKTtcbiAgICAgICAgY29uc3QgdyA9IGltZy5uYXR1cmFsV2lkdGgsIGggPSBpbWcubmF0dXJhbEhlaWdodDtcbiAgICAgICAgaWYgKCF3IHx8ICFoKSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICAgIGNvbnN0IGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKCFjdHgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGEsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBjaGFubmVsIHBsYW5lIGRlY29kZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gcGxhbmVzO1xuICB9XG5cbiAgLyoqIENvbXBvc2l0ZSB0aGUgY2FjaGVkIHBlci1jaGFubmVsIHBsYW5lcyBpbnRvIE9ORSBSR0JBIGltYWdlIHVzaW5nIHRoZVxuICAgKiAgY3VycmVudCBjaGFubmVsIHN0YXRlcyAoY29sb3VyL3dpbmRvdy9nYW1tYS92aXNpYmlsaXR5KSDigJQgdGhlIGNsaWVudC1zaWRlLFxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHBlci1jaGFubmVsICdsaWdodGVyJyBjb21wb3NpdG9yXG4gICAqICAoc2FtZSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXQgbWF0aCBhcyByZWNvbG9yQ2hhbm5lbFRpbGUsIGFwcGxpZWQgcGVyLXBsYW5lKS5cbiAgICogIFJldHVybnMgYSBibG9iOiBVUkwgb2YgdGhlIGNvbXBvc2l0ZSBQTkcsIHJldm9raW5nIHRoZSBwcmV2aW91cyBvbmUuICovXG4gIHByaXZhdGUgYXN5bmMgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGxhbmVzID0gdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzO1xuICAgIGlmICghcGxhbmVzLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB3ID0gcGxhbmVzWzBdLndpZHRoLCBoID0gcGxhbmVzWzBdLmhlaWdodDtcbiAgICBpZiAoIXcgfHwgIWgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3ICogaCAqIDQpO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcGxhbmVzLmxlbmd0aDsgYysrKSB7XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1tjXTtcbiAgICAgIGlmIChzdCAmJiBzdC52aXNpYmxlID09PSBmYWxzZSkgY29udGludWU7IC8vIGhpZGRlbiBjaGFubmVsIGNvbnRyaWJ1dGVzIG5vdGhpbmdcbiAgICAgIGNvbnN0IHBsYW5lID0gcGxhbmVzW2NdO1xuICAgICAgaWYgKHBsYW5lLndpZHRoICE9PSB3IHx8IHBsYW5lLmhlaWdodCAhPT0gaCB8fCAhcGxhbmUuZGF0YS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyByLCBnLCBiIH0gPSB0aGlzLmRpc3BsYXkuY2hhbm5lbFJnYkx1dChzdCk7XG4gICAgICBjb25zdCBwZCA9IHBsYW5lLmRhdGE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBpZiAocGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbHVtID0gcGRbaV07IC8vIHNpbmdsZS1iYW5kIHBsYW5lIChSPUc9QilcbiAgICAgICAgb3V0W2ldICs9IHJbbHVtXTsgICAgICAgICAgLy8gVWludDhDbGFtcGVkQXJyYXkgY2xhbXBzIOKGkiBhZGRpdGl2ZSAoJ2xpZ2h0ZXInKVxuICAgICAgICBvdXRbaSArIDFdICs9IGdbbHVtXTtcbiAgICAgICAgb3V0W2kgKyAyXSArPSBiW2x1bV07XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSBvdXRbaV0gPSAyNTU7IC8vIG9wYXF1ZVxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHc7IGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN0eC5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShvdXQsIHcsIGgpLCAwLCAwKTtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXMpID0+IGNhbnZhcy50b0Jsb2IocmVzLCAnaW1hZ2UvcG5nJykpO1xuICAgIGlmICghYmxvYikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpO1xuICAgIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICByZXR1cm4gdGhpcy5zaW1wbGVDb21wb3NpdGVVcmw7XG4gIH1cblxuICAvKiogUmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZCBwbGFuZXMgKG5ldyBjaGFubmVsIHN0YXRlcylcbiAgICogIGFuZCByZS1vcGVuIOKAlCB0aGUgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIGludmFsaWRhdGUtb24tY2hhbm5lbC1jaGFuZ2UuICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb21wb3NpdGVBbmRPcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgaWYgKCF1cmwgfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgdHJ5IHsgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7IH0gY2F0Y2ggeyAvKiB2aWV3ZXIgZ29uZSAqLyB9XG4gIH1cblxuICAvKiogTG9hZCBhIFVSTCBpbnRvIGFuIEhUTUxJbWFnZUVsZW1lbnQgKHJlc29sdmVzIG9uY2UgZGVjb2RlZCkuIFVzZXNcbiAgICogIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgcmF0aGVyIHRoYW4gYG5ldyBJbWFnZSgpYCBiZWNhdXNlIHRoaXMgZmlsZSdzXG4gICAqICBgSW1hZ2VgIGltcG9ydCBpcyBpbWFnZS1qcydzIGRlY29kZXIsIG5vdCB0aGUgRE9NIGVsZW1lbnQuICovXG4gIHByaXZhdGUgbG9hZEltYWdlRWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuICAgICAgaW1nLm9uZXJyb3IgPSAoZSkgPT4gcmVqZWN0KGUpO1xuICAgICAgaW1nLnNyYyA9IHVybDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB1IG9mIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMudmFsdWVzKCkpIFVSTC5yZXZva2VPYmplY3RVUkwodSk7XG4gICAgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5jbGVhcigpO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgeyBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTsgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBudWxsOyB9XG4gIH1cblxuICAvKiogTW91bnQgdGhlIHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlIHBvaW50aW5nIGF0IGBHRVQgL3RpbGVgLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogYW55LFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBfc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgX3Bsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBpblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9hZGVkID0gaW1hZ2VMb2FkZWQgYXMgT3NkTG9hZGVkO1xuICAgIGNvbnN0IGQgPSBsb2FkZWQ/LmRlc2NyaXB0b3I7XG4gICAgaWYgKCFkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAvLyBSZS1lc3RhYmxpc2ggdGhlIGNvbG9ybWFwIHN1YnNjcmlwdGlvbiBpZiBhIHByaW9yIGNvbXBvbmVudCB0ZWFyZG93blxuICAgIC8vICh1bnN1YnNjcmliZSgpKSB0b3JlIGl0IGRvd24g4oCUIHRoaXMgc2VydmljZSBpcyBhIHJvb3Qgc2luZ2xldG9uLCBzbyB0aGVcbiAgICAvLyBjb25zdHJ1Y3RvciB3b24ndCBydW4gYWdhaW4gdG8gcmVjcmVhdGUgaXQuXG4gICAgdGhpcy5lbnN1cmVDb2xvcm1hcFN1YnNjcmlwdGlvbigpO1xuICAgIC8vIE9TRCB0aWxlcyBuYXRpdmVseSwgc28gdGhlIGluLXBsYWNlIChsYXJnZSkgcGFzcyBpcyBub3JtYWxseSBhIG5vLW9wXG4gICAgLy8gb25jZSBtb3VudGVkIOKAlCB0aGUgdGlsZSBweXJhbWlkIElTIHRoZSBmdWxsIHJlc29sdXRpb24gcmVnYXJkbGVzcyBvZlxuICAgIC8vIHdoaWNoIEltYWdlSW5mbyB0aWVyIHJlcXVlc3RlZCBpdC4gU2ltcGxlIG1vZGUgaGFzIG5vIHB5cmFtaWQgdG8gZmFsbFxuICAgIC8vIGJhY2sgb246IGl0IGRpc3BsYXlzIGxpdGVyYWxseSB3aGF0ZXZlciBVUkwgd2FzIGxhc3Qgb3BlbmVkLCBzb1xuICAgIC8vIHdpdGhvdXQgdGhpcyBzd2FwIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggcGxhY2Vob2xkZXIgd291bGQgc3RheSBvblxuICAgIC8vIHNjcmVlbiBmb3JldmVyIChwaXhlbGF0ZWQsIG5ldmVyIFwic2hhcnBlbmluZ1wiIGxpa2UgdGhlIHRpbGVkIHBhdGgpLlxuICAgIGlmIChpblBsYWNlICYmIHRoaXMudmlld2VyKSB7XG4gICAgICBpZiAobG9hZGVkLnNpbXBsZSAmJiBsb2FkZWQudXJsKSB7XG4gICAgICAgIC8vIEFsc28gcmVmcmVzaCBzaW1wbGVVcmxzIHRvIFRISVMgcGhhc2UncyAobGFyZ2UtdGllcikgdXJsc1tdIOKAlCBpdCB3YXNcbiAgICAgICAgLy8gc2V0IGZyb20gdGhlIHNtYWxsIHRpZXIncyAxMjhweCB1cmxzIG9uIHRoZSBpbml0aWFsIG1vdW50IGJlbG93LFxuICAgICAgICAvLyB3aGljaCBuZXZlciBydW5zIGFnYWluIGZvciB0aGUgaW4tcGxhY2UgcGFzcy4gV2l0aG91dCB0aGlzLFxuICAgICAgICAvLyBzZXRaSW5kZXgncyBsYXRlciBzbGlkZXIgc2NydWJzIHdvdWxkIGtlZXAgcmVhZGluZyB0aGUgc21hbGxcbiAgICAgICAgLy8gdGllcidzIGxvdy1yZXMgVVJMcyBmb3JldmVyLCBldmVuIHRob3VnaCB0aGUgaW5pdGlhbCBzbGljZSB3YXNcbiAgICAgICAgLy8gY29ycmVjdGx5IHN3YXBwZWQgdG8gZnVsbCByZXNvbHV0aW9uIGhlcmUuXG4gICAgICAgIHRoaXMuc2ltcGxlVXJscyA9IGltYWdlSW5mbz8udXJscyA/PyB0aGlzLnNpbXBsZVVybHM7XG4gICAgICAgIHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5wbG90RGl2ID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRGaWxlTmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdG9yID0gZDtcbiAgICB0aGlzLmluZm9CNjQgPSBsb2FkZWQuaW5mb0I2NDtcbiAgICB0aGlzLmN1cnJlbnRaID0gbG9hZGVkLno7XG4gICAgdGhpcy5zaW1wbGVNb2RlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIHRoaXMuc2ltcGxlVXJscyA9IGxvYWRlZC5zaW1wbGUgPyAoaW1hZ2VJbmZvPy51cmxzID8/IFtdKSA6IFtdO1xuICAgIC8vIFRoZSBkZXNjcmlwdG9yJ3MgcGh5c2ljYWwgcGl4ZWwgc2l6ZSAoc2VydmVyIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgcHVzaCBpdCBpbnRvIHRoZSBzaGFyZWQgbWV0YSBzbyB0aGUgUmVnaW9uIEVkaXRvciByZXBvcnRzXG4gICAgLy8gYXJlYXMgaW4gwrVtwrIvbW3CsiwgbWF0Y2hpbmcgdGhlIHNjYWxlIGJhciBidWlsdCBmcm9tIGBkLm1wcFhgIGJlbG93LlxuICAgIHRoaXMuc3RvcmUuc2V0UGh5c2ljYWxQaXhlbFNpemUoZC5tcHBYLCBkLm1wcFkpO1xuICAgIC8vIFVzZSB0aGUgU0FNRSBncmF5c2NhbGUgZmxhZyB0aGUgY29sb3JtYXAgZHJvcGRvd24gLyBQbG90bHkgdXNlXG4gICAgLy8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSDihpAgcmdiQ2hhbm5lbHMgPT09IDEpLiBUaGUgZGVzY3JpcHRvcidzIGBjaGFubmVsc2BcbiAgICAvLyAoY2hhbm5lbENvdW50KSBkaXZlcmdlcyBmcm9tIHJnYkNoYW5uZWxzIGZvciBzdGFja3MsIHdoaWNoIGxlZnQgZ3JheXNjYWxlXG4gICAgLy8gc3RhY2tzIHVuLXJlY29sb3JlZCBldmVuIHRob3VnaCB0aGUgY29sb3JtYXAgc2VsZWN0b3Igd2FzIHNob3duLlxuICAgIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSA9ICEhaW1hZ2VJbmZvPy5pc0dyYXlzY2FsZTtcbiAgICAvLyBTaW1wbGUgKG5vbi10aWxlZCwgaW4tbWVtb3J5KSBpbWFnZTogbm8gcHlyYW1pZCwgbm8gcGVyLWNoYW5uZWwgdGlsZXMsIGFuZFxuICAgIC8vIG5vIHNlcnZlci1zaWRlIGludGVuc2l0eSBzYW1wbGluZyDigJQgT1NEJ3Mgc2luZ2xlLWltYWdlIHNvdXJjZSBkZWNvZGVzXG4gICAgLy8gdXJsc1t6XSBkaXJlY3RseS4gU2tpcCB0aGUgd2hvbGUgdGlsZWQtc2V0dXAgcGF0aCBiZWxvdy5cbiAgICBjb25zdCBzaW1wbGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgaWYgKHNpbXBsZSkge1xuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gMTtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FjaGUuY2xlYXJDaGFubmVsR3JvdXBzKCk7XG4gICAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgICAgIC8vIFNlcnZlcmxlc3MgaGlzdG9ncmFtIOKAlCBBRlRFUiBkZXN0cm95Vmlld2VyIChpdHMgbGFzdCBhY3QgaXMgc2FtcGxlci5jbGVhcigpKS5cbiAgICAgIC8vIE11bHRpY2hhbm5lbCBiaW5zIGVhY2ggY2FjaGVkIGNoYW5uZWwgcGxhbmU7IHNpbmdsZS1iYW5kIC8gUkdCIGJpbnMgdGhlXG4gICAgICAvLyBkZWNvZGVkIGZyYW1lJ3Mgb3duIHBpeGVscy5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZU11bHRpY2hhbm5lbEhpc3RvZ3JhbXMobG9hZGVkLnosIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2lkIHRoaXMuc2FtcGxlU2ltcGxlSGlzdG9ncmFtKGxvYWRlZC51cmwsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoaW5kZXhlZC9MVVQtYmVhcmluZyBzdGFja3MpIGNvbXBvc2l0ZSBjbGllbnQtc2lkZVxuICAgICAgLy8gZnJvbSBwZXItY2hhbm5lbCB0aWxlcy4gVHJ1c3QgdGhlIHNlcnZlcidzIGV4cGxpY2l0IGBtdWx0aWNoYW5uZWxgIGZsYWcg4oCUIHRoZVxuICAgICAgLy8gb2xkIGBjaGFubmVscz4xICYmIGdyYXlzY2FsZWAgaGV1cmlzdGljIGFsc28gbWF0Y2hlZCBSR0IgcGhvdG9zIEJpby1Gb3JtYXRzXG4gICAgICAvLyByZWFkcyBhcyBzZXBhcmF0ZWQgcGxhbmVzIChjaGFubmVscz4xLCByZ2JDaGFubmVscz09MSksIHNwbGl0dGluZyB0aGVtIGludG8gTlxuICAgICAgLy8gcGVyLWNoYW5uZWwgVGlsZWRJbWFnZXMgdGhhdCBmbG9vZGVkIHRoZSB0aWxlIGVuZHBvaW50IGFuZCBodW5nIG9uIGxvYWQuXG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSBkLnJlYWxMZXZlbHMgPz8gZC5sZXZlbHMubGVuZ3RoO1xuICAgICAgLy8gVGlsZXMgdG8gY292ZXIgdGhlIHdob2xlIGltYWdlIGF0IHRoZSBjb2Fyc2VzdCBSRUFMIEJpby1Gb3JtYXRzIGxldmVsICh0aGVcbiAgICAgIC8vIHNtYWxsZXN0IGxldmVsIHRoYXQgaGFzIHJlYWwsIHBlci1jaGFubmVsLWZldGNoYWJsZSB0aWxlcyDigJQgc3ludGhldGljIG92ZXJ2aWV3XG4gICAgICAvLyBsZXZlbHMgYXJlIHNlcnZlci1jb21wb3NpdGVkIG9ubHkpLiBBIHB5cmFtaWRhbCBpbWFnZSdzIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXNcbiAgICAgIC8vIHRpbnkgKGZldyB0aWxlcyk7IGEgZmxhdC9uby1weXJhbWlkIGltYWdlJ3MgaXMgdGhlIGZ1bGwtcmVzIGdyaWQgKG1hbnkgdGlsZXMpLlxuICAgICAgY29uc3QgY29hcnNlID0gZC5sZXZlbHNbdGhpcy5yZWFsTGV2ZWxzIC0gMV0gPz8gZC5sZXZlbHNbZC5sZXZlbHMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBjb2Fyc2VXID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS53aWR0aCAvIGQudGlsZVNpemUpIDogMTtcbiAgICAgIGNvbnN0IGNvYXJzZUggPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLmhlaWdodCAvIGQudGlsZVNpemUpIDogMTtcbiAgICAgIGNvbnN0IGNvYXJzZVRpbGVzID0gY29hcnNlVyAqIGNvYXJzZUg7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gISFkLm11bHRpY2hhbm5lbDtcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIC8vIFBlci1jaGFubmVsIHJlbmRlcmluZyBjYW4gb25seSB1c2UgdGhlIFJFQUwgbGV2ZWxzLCBzbyBPU0QgcmVxdWVzdHMgdGhlXG4gICAgICAgIC8vIGNvYXJzZXN0IHJlYWwgbGV2ZWwncyB3aG9sZSB0aWxlIGdyaWQgw5cgTiBjaGFubmVscyBhdCBmaXQuIFdoZW4gdGhhdCdzIGxhcmdlXG4gICAgICAgIC8vIChhIHdob2xlLXNsaWRlKSwgaXQncyB0b28gbWFueSAob2Z0ZW4gc2xvdywgcHlyYW1pZC1sZXNzKSBmdWxsLXJlcyByZWFkcyDigJRcbiAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBzaW5nbGUgc2VydmVyLWNvbXBvc2l0ZWQgc291cmNlICh3aGljaCBrZWVwcyB0aGUgZmFzdFxuICAgICAgICAvLyBzeW50aGV0aWMgb3ZlcnZpZXdzKS4gQSBzbWFsbCBzaW5nbGUtRk9WIHotc3RhY2sgc3RheXMgcGVyLWNoYW5uZWwuIFNpemUgaW5cbiAgICAgICAgLy8gQllURVMgaXNuJ3QgdGhlIHNpZ25hbCDigJQgdGlsZSBjb3VudCBpcy5cbiAgICAgICAgY29uc3QgZml0VGlsZXMgPSBjb2Fyc2VUaWxlcyAqIE1hdGgubWF4KDEsIGQuY2hhbm5lbHMgPz8gMSk7XG4gICAgICAgIGlmIChmaXRUaWxlcyA+IHRoaXMuTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMpIHtcbiAgICAgICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1tPU0RdIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgdG9vIGxhcmdlIGZvciBwZXItY2hhbm5lbCByZW5kZXJpbmc6ICcgK1xuICAgICAgICAgICAgYCR7Y29hcnNlV314JHtjb2Fyc2VIfSB0aWxlcyB4ICR7ZC5jaGFubmVsc30gY2hhbm5lbHMgPSAke2ZpdFRpbGVzfSBhdCB0aGUgY29hcnNlc3QgYCArXG4gICAgICAgICAgICBgcmVhbCBsZXZlbCAoPiAke3RoaXMuTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVN9KTsgcmVuZGVyaW5nIHNlcnZlci1jb21wb3NpdGVkIGZvciBzcGVlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGUuY2xlYXJDaGFubmVsR3JvdXBzKCk7XG4gICAgICAvLyBBdXRvLXJhbmdlIGdyYXlzY2FsZSB0aWxlcyB0byB0aGUgaW1hZ2UncyBhY3R1YWwgaW50ZW5zaXR5IHNwYW4gKGxpa2UgdGhlXG4gICAgICAvLyBoZWF0bWFwKSwgc2FtcGxpbmcgdGhlIGNvYXJzZXN0IHRpbGUgbGV2ZWwgc28gdGhlIHdpbmRvdyBtYXRjaGVzIHRoZSByYXdcbiAgICAgIC8vIHRpbGUgdmFsdWVzLiBGaXJlLWFuZC1mb3JnZXQ6IGl0IHJlLWludmFsaWRhdGVzIG9uY2UgdGhlIHdpbmRvdyBpcyBrbm93bjtcbiAgICAgIC8vIHRpbGVzIHBhaW50IHVud2luZG93ZWQgdW50aWwgdGhlbi4gKE11bHRpY2hhbm5lbCB3aW5kb3dzIGFyZSBwZXItY2hhbm5lbCxcbiAgICAgIC8vIGRlZmF1bHRpbmcgdG8gZnVsbCByYW5nZTsgdGhlIHVzZXIgYXV0by9lZGl0cyBlYWNoIGNoYW5uZWwuKVxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZUltYWdlV2luZG93KGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgICAgIC8vIFNpemUgdGhlIHNsaWNlIGNhY2hlIGZvciB0aGlzIGltYWdlOiBMUlUgY2FwIHRvIGhvbGQgdGhlIHdob2xlIHN0YWNrXG4gICAgICAvLyAoY2FwcGVkKSBhbmQgc2tpcCBiYWNrZ3JvdW5kIHByZWxvYWRpbmcgZm9yIHN0YWNrcyB0b28gbGFyZ2UgdG8gcHJlbG9hZFxuICAgICAgLy8gKHdvdWxkIGZsb29kIGZ1bGwtcmVzIHJlYWRzKS4gTm9ybWFsIHN0YWNrcyBrZWVwIHRoZSBmbGlja2VyLWZyZWUgcHJlLWNhY2hlLlxuICAgICAgdGhpcy5jYWNoZS5jb25maWd1cmUoZC56ID8/IDEsIGNvYXJzZVRpbGVzKTtcbiAgICB9XG5cbiAgICAvLyBTaW1wbGUgbW9kZTogT1NEJ3Mgc2luZ2xlLWltYWdlIHNvdXJjZSBkZWNvZGVzIHRoZSBVUkwgKGJsb2I6L2RhdGE6L2h0dHApXG4gICAgLy8gZGlyZWN0bHkg4oCUIG5vIHB5cmFtaWQsIG5vIHNlcnZlci4gVGlsZWQgbW9kZTogdGhlIGN1c3RvbSBzZXJ2ZXItYmFja2VkIHRpbGVcbiAgICAvLyBzb3VyY2UgKG11bHRpY2hhbm5lbCBvcGVucyBvbiBjaGFubmVsIDA7IHRoZSBvcGVuIGhhbmRsZXIgdGhlbiBzd2FwcyBpbiB0aGlzXG4gICAgLy8gc2xpY2UncyBwZXItY2hhbm5lbCBncm91cCBhbmQgdGhlIGJhY2tncm91bmQgbG9hZGVyIHByZS1maWxscyB0aGUgcmVzdCkuXG4gICAgY29uc3QgdGlsZVNvdXJjZSA9IHNpbXBsZVxuICAgICAgPyB7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9XG4gICAgICA6IHRoaXMuYnVpbGRUaWxlU291cmNlKGQsIGxvYWRlZC5pbmZvQjY0LCBsb2FkZWQueiwgdGhpcy5pc011bHRpQ2hhbm5lbCA/IDAgOiB1bmRlZmluZWQpO1xuICAgIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTtcbiAgICB0aGlzLnZpZXdlciA9IChPU0QgYXMgYW55KSh7XG4gICAgICBpZDogcGxvdERpdixcbiAgICAgIC8vIFNpbXBsZS1tb2RlIHotc2NydWIgY2FsbHMgdmlld2VyLm9wZW4oKSBhZ2FpbiBwZXIgc2xpY2UgKHNlZVxuICAgICAgLy8gc2V0WkluZGV4KSDigJQgd2l0aG91dCB0aGlzIGl0IHJlc2V0cyB0byB0aGUgaG9tZSB6b29tL3BhbiBvbiBldmVyeVxuICAgICAgLy8gc2xpY2UgY2hhbmdlLiBUaWxlZCBtb2RlIG5ldmVyIHJlLW9wZW5zIChpdCB0b2dnbGVzIHByZS1hZGRlZFxuICAgICAgLy8gVGlsZWRJbWFnZXMnIG9wYWNpdHkgaW5zdGVhZCksIHNvIHRoaXMgaXMgYSBuby1vcCB0aGVyZS5cbiAgICAgIHByZXNlcnZlVmlld3BvcnQ6IHRydWUsXG4gICAgICAvLyBVc2UgdGhlIDJEIGNhbnZhcyBkcmF3ZXIsIG5vdCBXZWJHTDogY3JlYXRpbmcvZGVzdHJveWluZyBhIHZpZXdlciBvblxuICAgICAgLy8gZWFjaCBlbmdpbmUgdG9nZ2xlIC8gaW1hZ2UgbG9hZCBjaHVybnMgV2ViR0wgY29udGV4dHMgKGJyb3dzZXJzIGNhcFxuICAgICAgLy8gaG93IG1hbnkgZXhpc3QgYXQgb25jZSksIHdoaWNoIHN1cmZhY2VzIGFzIFwiV2ViR0wgY29udGV4dCB3YXMgbG9zdFwiXG4gICAgICAvLyBhbmQgYmxhbmsgdGlsZXMuIFRoZSBjYW52YXMgZHJhd2VyIGhhcyBubyBzdWNoIGxpbWl0LlxuICAgICAgZHJhd2VyOiAnY2FudmFzJyxcbiAgICAgIHNob3dOYXZpZ2F0aW9uQ29udHJvbDogZmFsc2UsIC8vIGF2b2lkcyBuZWVkaW5nIHRoZSBpY29uLWltYWdlIGFzc2V0c1xuICAgICAgLy8gT3ZlcnZpZXcgdGh1bWJuYWlsIHdpdGggdGhlIGN1cnJlbnQtdmlld3BvcnQgcmVjdGFuZ2xlLCBib3R0b20tcmlnaHQuXG4gICAgICBzaG93TmF2aWdhdG9yOiB0aGlzLm5hdmlnYXRvclZpc2libGUsXG4gICAgICAvLyBOZWFyZXN0LW5laWdoYm91ciB3aGVuIG9mZiDihpIgY3Jpc3AgcGl4ZWxzIG9uIHpvb20taW4gKHBpeGVsIGluc3BlY3Rpb24pLlxuICAgICAgaW1hZ2VTbW9vdGhpbmdFbmFibGVkOiB0aGlzLnNtb290aGluZ0VuYWJsZWQsXG4gICAgICBuYXZpZ2F0b3JQb3NpdGlvbjogJ0JPVFRPTV9SSUdIVCcsXG4gICAgICBuYXZpZ2F0b3JTaXplUmF0aW86IDAuMTYsXG4gICAgICBuYXZpZ2F0b3JBdXRvRmFkZTogZmFsc2UsXG4gICAgICBuYXZpZ2F0b3JCYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwwLjUpJyxcbiAgICAgIGxvYWRUaWxlc1dpdGhBamF4OiB0cnVlLFxuICAgICAgYWpheFdpdGhDcmVkZW50aWFsczogdHJ1ZSwgLy8gY29va2llIGF1dGggKG9hdXRoMi1wcm94eSlcbiAgICAgIGFqYXhIZWFkZXJzOiB0aGlzLmF1dGhIZWFkZXJzLCAvLyBiZWFyZXIgYXV0aCAoQXV0aDApLCB3aGVuIGF2YWlsYWJsZVxuICAgICAgY3Jvc3NPcmlnaW5Qb2xpY3k6ICdBbm9ueW1vdXMnLFxuICAgICAgLy8gR2VudGxlciB6b29tOiB0aGUgZGVmYXVsdCAoMS4yKSBmZWVscyBmYXN0IGFuZCBiaWcganVtcHMgY3Jvc3Mgc2V2ZXJhbFxuICAgICAgLy8gcHlyYW1pZCBsZXZlbHMgYXQgb25jZSwgZmlyaW5nIGEgYnVyc3Qgb2YgdGlsZSByZXF1ZXN0cy4gU2hhcmVkIHdpdGggdGhlXG4gICAgICAvLyByZWdpb24gb3ZlcmxheSwgd2hpY2ggdGFrZXMgdGhlIHdoZWVsIG92ZXIgd2hpbGUgYSB0b29sIGlzIGFjdGl2ZS5cbiAgICAgIHpvb21QZXJTY3JvbGw6IE9TRF9aT09NX1BFUl9TQ1JPTEwsXG4gICAgICAvLyBDbGljay10by16b29tIHRvd2FyZCB0aGUgY2xpY2tlZCBwb2ludCAoT3BlblNlYWRyYWdvbidzIGRlZmF1bHQgZGVtb1xuICAgICAgLy8gYmVoYXZpb3VyKS4gT25seSBhcHBsaWVzIHdoZW4gbm8gcmVnaW9uIHRvb2wgaXMgYWN0aXZlIOKAlCBhbiBhY3RpdmUgdG9vbFxuICAgICAgLy8gZGlzYWJsZXMgT1NEIG1vdXNlLW5hdiBzbyBjbGlja3MgZHJhdy9zZWxlY3QgaW5zdGVhZCBvZiB6b29taW5nLlxuICAgICAgZ2VzdHVyZVNldHRpbmdzTW91c2U6IHsgY2xpY2tUb1pvb206IHRydWUsIHNjcm9sbFRvWm9vbTogdHJ1ZSB9LFxuICAgICAgLy8gWm9vbSBsaW1pdHMgKGppdC11aSM5NCkuIERlZmF1bHQgbWluWm9vbUltYWdlUmF0aW8gKDAuOSkgc3RvcHMgeW91IGZyb21cbiAgICAgIC8vIHpvb21pbmcgdGhlIGltYWdlIHNtYWxsZXIgdGhhbiB+aG9tZTsgZHJvcCBpdCBzbyB0aGUgaW1hZ2UgY2FuIGJlIHNocnVua1xuICAgICAgLy8gZnJlZWx5IChlZmZlY3RpdmVseSBubyBtaW5pbXVtKS4gRGVmYXVsdCBtYXhab29tUGl4ZWxSYXRpbyAoMS4xKSBjYXBzXG4gICAgICAvLyB6b29tLWluIGF0IH4xIHNjcmVlbiBweCBwZXIgaW1hZ2UgcHg7IHJhaXNlIGl0IHNvIHlvdSBjYW4gem9vbSBpbiB0b1xuICAgICAgLy8gaW5zcGVjdCBpbmRpdmlkdWFsIHBpeGVscyAocGFpcmVkIHdpdGggaW1hZ2VTbW9vdGhpbmdFbmFibGVkPWZhbHNlIGZvclxuICAgICAgLy8gY3Jpc3AgbmVhcmVzdC1uZWlnaGJvdXIgYmxvY2tzKS5cbiAgICAgIG1pblpvb21JbWFnZVJhdGlvOiAwLjAxLFxuICAgICAgbWF4Wm9vbVBpeGVsUmF0aW86IDIwLFxuICAgICAgLy8gT1NEJ3Mgc3RvY2sgdmFsdWUsIHJlc3RvcmVkLiBETyBOT1QgUkFJU0UgSVQ6IHRoZSBuYW1lIHJlYWRzIGxpa2VcbiAgICAgIC8vIFwibWluaW11bSBzaGFycG5lc3NcIiBidXQgaXQgaXMgdGhlIG9wcG9zaXRlLiBGcm9tIE9TRCdzIG93blxuICAgICAgLy8gVGlsZWRJbWFnZS5fZ2V0TGV2ZWxzSW50ZXJ2YWw6XG4gICAgICAvL1xuICAgICAgLy8gICBoaWdoZXN0TGV2ZWwgPSBmbG9vciggbG9nMiggY3VycmVudFplcm9SYXRpbyAvIG1pblBpeGVsUmF0aW8gKSApXG4gICAgICAvL1xuICAgICAgLy8gbWluUGl4ZWxSYXRpbyBpcyBhIGZsb29yIG9uIGhvdyBzbWFsbCBhIHRpbGUgcGl4ZWwgbWF5IHNocmluaywgYW5kIGl0XG4gICAgICAvLyBESVZJREVTIGludG8gdGhlIHJhdGlvIC0gc28gcmFpc2luZyBpdCBsb3dlcnMgdGhlIGNob3NlbiBsZXZlbCwgaS5lLlxuICAgICAgLy8gcGlja3MgYSBDT0FSU0VSIGltYWdlLiBPU0QncyBvd24gY29tbWVudCBvbiB0aGUgZGVmYXVsdCBzYXlzIGFzIG11Y2g6XG4gICAgICAvLyBcImNsb3NlciB0byAwIGRyYXdzIHRpbGVzIG1lYW50IGZvciBhIGhpZ2hlciB6b29tIGF0IHRoaXMgem9vbVwiLlxuICAgICAgLy9cbiAgICAgIC8vIE1lYXN1cmVkIG9uIGEgZmxhdCAyMjMwNHgyNDUyOCBpbWFnZSAobGV2ZWxzIDY5Ny8xMzk0LzI3ODgvNTU3Ni8xMTE1Mi9cbiAgICAgIC8vIDIyMzA0KSwgcHJlZGljdGVkIGxldmVsIG1hdGNoaW5nIGFjdHVhbCBpbiBhbGwgbmluZSB0cmlhbHM6XG4gICAgICAvL1xuICAgICAgLy8gICAgICAgICAgICB6b29tIDIgICAgICAgIHpvb20gOCAgICAgICAgfjE6MVxuICAgICAgLy8gICAxLjAgICAgICAxLjM0eCB1cCAgICAgIDEuMzR4IHVwICAgICAgMS44NnggdXBcbiAgICAgIC8vICAgMC41ICAgICAgMC42N3ggKG5vbmUpICAwLjY3eCAobm9uZSkgIDAuOTN4IC0+IGZ1bGwgcmVzXG4gICAgICAvLyAgIDAuMjUgICAgIDAuMzN4ICAgICAgICAgMC4zM3ggICAgICAgICAwLjkzeFxuICAgICAgLy9cbiAgICAgIC8vIDAuNSBpcyB3aGF0IGdpdmVzIFwibmV2ZXIgdXBzY2FsZWQgYmVsb3cgbmF0aXZlLCBmdWxsIHJlc29sdXRpb24gYXQgMToxXCIuXG4gICAgICAvLyAwLjI1IGlzIG5vdCBiZXR0ZXIgLSBpdCBqdW1wcyB0d28gcnVuZ3MgZmluZXIgYW5kIGZldGNoZXMgfjR4IHRoZSB0aWxlc1xuICAgICAgLy8gZm9yIG5vIHZpc2libGUgZ2FpbiwgYW5kIHRpbGVzIGFyZSBub3QgY2FjaGVkIGJ5IHRoZSBpbmdyZXNzLlxuICAgICAgbWluUGl4ZWxSYXRpbzogMC41LFxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHZpZXcgdG8gc2V0dGxlIGJlZm9yZSBwdWxsaW5nIG5ldyB0aWxlcyAobGVzcyBjaHVybikuXG4gICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxuICAgICAgYW5pbWF0aW9uVGltZTogMC40LFxuICAgICAgLy8gUmVsZWFzZSBtZW1vcnkgYWdncmVzc2l2ZWx5OiBjYXAgdGhlIHRpbGUgY2FjaGUgc28gdGlsZXMgb3V0c2lkZSB0aGVcbiAgICAgIC8vIGN1cnJlbnQgdmlldyAoZS5nLiB0aGUgY29hcnNlciBsZXZlbHMgbGVmdCBiZWhpbmQgYWZ0ZXIgem9vbWluZyBpbikgYXJlXG4gICAgICAvLyBldmljdGVkIGluc3RlYWQgb2YgYWNjdW11bGF0aW5nLiBMYXJnZSB3aG9sZS1zbGlkZSB0aWxlcyDigJQgZG91YmxlZCB3aGVuXG4gICAgICAvLyB0aGUgY29sb3JtYXAgcGlwZWxpbmUga2VlcHMgYSByZWNvbG9yZWQgY29weSDigJQgbWFrZSBhbiB1bmJvdW5kZWQgY2FjaGVcbiAgICAgIC8vIGNvc3RseS4gVHVuYWJsZTsgbG93ZXIgPSBsZXNzIG1lbW9yeSwgbW9yZSByZS1mZXRjaCBvbiBwYW4tYmFjay5cbiAgICAgIC8vIFN0YWNrcyBrZWVwIG1hbnkgc2xpY2VzIHJlc2lkZW50ICh0aGUgd2hvbGUgc3RhY2sgaXMgYmFja2dyb3VuZC1sb2FkZWQpLFxuICAgICAgLy8gc28gdGhleSBnZXQgYSBtdWNoIGxhcmdlciB0aWxlIGJ1ZGdldCDigJQgb3RoZXJ3aXNlIHN3aXRjaGluZyBzbGljZXMgZXZpY3RzXG4gICAgICAvLyBlYWNoIG90aGVyJ3MgdGlsZXMgYW5kIHNjcnViYmluZyBiYWNrIHJlLWZldGNoZXMuIFNjYWxlZCB0byB0aGUgcmVzaWRlbnRcbiAgICAgIC8vIHNsaWNlIGNvdW50OyBzaW5nbGUgaW1hZ2VzIGtlZXAgdGhlIGxlYW4gZGVmYXVsdC5cbiAgICAgIG1heEltYWdlQ2FjaGVDb3VudDogKGQueiA/PyAxKSA+IDEgPyBNYXRoLm1pbigyNDAwLCBNYXRoLm1heCg2MDAsIHRoaXMuY2FjaGUubWF4U2xpY2VzKCkgKiA0MCkpIDogMTUwLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyBBbHdheXMgc2V0dGxlOiBpZiBPU0QgbmV2ZXIgZW1pdHMgb3Blbi9vcGVuLWZhaWxlZCAoYSBiYWQgdGlsZSBzb3VyY2UsXG4gICAgICAvLyBhIHZpZXdlciB0b3JuIGRvd24gbWlkLW9wZW4pLCB0aGUgcmVuZGVyIHBpcGVsaW5lIG11c3Qgbm90IGhhbmcg4oCUIGEgaGFuZ1xuICAgICAgLy8gbGVhdmVzIGltYWdlTG9hZGluZz10cnVlLCBzdGlja2luZyB0aGUgc3Bpbm5lciBhbmQgdGhlIDUwMG1zXG4gICAgICAvLyBjYWNoZS1wcm9ncmVzcyBwb2xsIGZvcmV2ZXIgKE5TX0JJTkRJTkdfQUJPUlRFRCBzdG9ybSkuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IChvazogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXNldHRsZWQpIHtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKG9rKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3BlbicsICgpID0+IHtcbiAgICAgICAgLy8gUmVnaW9uIG92ZXJsYXkgcmVhZHMvd3JpdGVzIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUsIHNvIHJlZ2lvbnMgc3RheVxuICAgICAgICAvLyBpbiBzeW5jIHdpdGggUGxvdGx5IGFuZCB0aGUgUmVnaW9uIEVkaXRvci4gUmVjcmVhdGUgaXQgcGVyIG9wZW4oKSBzb1xuICAgICAgICAvLyBpdCBiaW5kcyB0byB0aGUgZnJlc2hseS1vcGVuZWQgdmlld2VyJ3MgY2FudmFzL01vdXNlVHJhY2tlci5cbiAgICAgICAgdGhpcy5vdmVybGF5Py5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBPc2RSZWdpb25PdmVybGF5KHRoaXMudmlld2VyIGFzIGFueSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgICAgIHRoaXMuY29vcmRUcmFuc2Zvcm0gPSBuZXcgT3NkQ29vcmRpbmF0ZVRyYW5zZm9ybSh0aGlzLnZpZXdlciBhcyBhbnkpO1xuICAgICAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE9zZFNjYWxlQmFyKHRoaXMudmlld2VyIGFzIGFueSwgZC5tcHBYID8/IDApO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgICAgIC8vIFNpbXBsZSBtb2RlIGlzIGEgc2luZ2xlLCBzZWxmLWNvbnRhaW5lZCBpbWFnZSDigJQgbm8gc2xpY2UgY2FjaGUgdG8gc2VlZC5cbiAgICAgICAgaWYgKHNpbXBsZSkge1xuICAgICAgICAgIC8qIG5vdGhpbmcgdG8gY2FjaGU6IG9uZSBmcmFtZSwgbm8gcHlyYW1pZCAqL1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICAvLyBEcm9wIHRoZSBzaW5nbGUgb3BlbmVkIChjaGFubmVsLTApIGltYWdlIGFuZCBhZGQgdGhpcyBzbGljZSdzIGNoYW5uZWxcbiAgICAgICAgICAvLyBncm91cCB0byB0aGUgcGVyLXNsaWNlIGNhY2hlLiBUaGUgc2hhcmVkIGJhY2tncm91bmQgbG9hZGVyIC8gTFJVIHRoZW5cbiAgICAgICAgICAvLyBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgY2hhbm5lbCBncm91cHMgc28gei1zY3J1YiBpcyBmbGlja2VyLWZyZWUuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGl0MCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICAgIGlmIChpdDApICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgICAgICB9IGNhdGNoIHsgLyogbm90aGluZyB0byByZW1vdmUgKi8gfVxuICAgICAgICAgIHRoaXMuY2FjaGUuYWRkQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlZWQgdGhlIHNsaWNlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIHNsaWNlICh3b3JsZCBpdGVtIDApLCBzb1xuICAgICAgICAgIC8vIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uXG4gICAgICAgICAgY29uc3QgZmlyc3RJdGVtID0gKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuY2FjaGUuc2VlZENvbXBvc2l0ZSh0aGlzLmN1cnJlbnRaLCBmaXJzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlICpyZW5kZXJlZCB2aWV3cG9ydCosIHNvIGl0cyBwaXhlbCBtYXRyaXggaXMgb25seVxuICAgICAgICAvLyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgdmlldyDigJQgZHJvcCBpdCB3aGVuZXZlciB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ3ZpZXdwb3J0LWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdyYXlzY2FsZSB0aWxlcyBnZXQgdGhlIGFjdGl2ZSBjb2xvcm1hcCB2aWEgdGhlIHBpeGVsIHBpcGVsaW5lLiBUaGVcbiAgICAgICAgLy8gaGFuZGxlciBydW5zIHBlciB0aWxlIG9uIGxvYWQgKGFuZCBvbiByZXF1ZXN0SW52YWxpZGF0ZSk7IHJlY29sb3JpbmdcbiAgICAgICAgLy8gaXMgYSBuby1vcCBmb3IgUkdCIGltYWdlcyBvciBiZWZvcmUgdGhlIExVVCByZXNvbHZlcy5cbiAgICAgICAgLy8gKGlzR3JheXNjYWxlSW1hZ2UgaXMgc2V0IGZyb20gaW1hZ2VJbmZvLmlzR3JheXNjYWxlIGluIHBsb3QoKSBhYm92ZS4pXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd0aWxlLWludmFsaWRhdGVkJywgKGV2ZW50OiBhbnkpID0+IHRoaXMucmVjb2xvclRpbGUoZXZlbnQpKTtcbiAgICAgICAgLy8gVGhlIG92ZXJ2aWV3IG5hdmlnYXRvciBpcyBhIHNlcGFyYXRlIG1pbmktdmlld2VyIHdpdGggaXRzIG93biB0aWxlcyxcbiAgICAgICAgLy8gc28gaXQgZG9lc24ndCByZWNlaXZlIHRoZSBtYWluIHZpZXdlcidzIHRpbGUtaW52YWxpZGF0ZWQgZXZlbnRzLiBBcHBseVxuICAgICAgICAvLyB0aGUgc2FtZSByZWNvbG9yIHBpcGVsaW5lIHRvIGl0IHNvIHRoZSBtaW5pbWFwIHRyYWNrcyB0aGUgbWFpbiBpbWFnZSdzXG4gICAgICAgIC8vIGNvbG9ybWFwL0xVVCBpbnN0ZWFkIG9mIHN0YXlpbmcgZ3JheXNjYWxlLlxuICAgICAgICBjb25zdCBuYXYgPSAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I7XG4gICAgICAgIG5hdj8uYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIGlmICgodGhpcy5pc0dyYXlzY2FsZUltYWdlICYmIHRoaXMuY29sb3JMdXQpIHx8IHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmF2Py53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBQcmVmZXRjaCBhZGphY2VudCB6LXNsaWNlcyBvbmNlIHRoZSB2aWV3IHNldHRsZXMgKGFuZCBvbiBlYWNoIHNldHRsZSxcbiAgICAgICAgLy8gc28gaXQgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXdwb3J0IGFzIHRoZSB1c2VyIHBhbnMvem9vbXMpLiBTaW1wbGUgbW9kZVxuICAgICAgICAvLyBoYXMgYSBzaW5nbGUgZnJhbWUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBwcmVmZXRjaC5cbiAgICAgICAgaWYgKCFzaW1wbGUpIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCkpO1xuICAgICAgICAvLyBUZWxsIGxpc3RlbmVycyAodGhlIGludGVuc2l0eSBpbnNldCkgdGhlIHZpc2libGUgaW1hZ2UgcmVnaW9uIHdoZW5ldmVyXG4gICAgICAgIC8vIHRoZSB2aWV3IHNldHRsZXMsIHNvIHRoZXkgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tIHJlc29sdXRpb24uXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5lbWl0Vmlld3BvcnRDaGFuZ2UoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIC8vIFRlYXIgZG93biBhbnkgYWN0aXZlIHRvb2wgb3ZlcmxheXMgKHNoYXJlZCBzaW5nbGV0b25zKS5cbiAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuYnJ1c2hUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICB0aGlzLm92ZXJsYXkuZGVzdHJveSgpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NhbGVCYXIpIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgdGhpcy52aWV3ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy52aWV3ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmNhY2hlLnJlc2V0KCk7XG4gICAgdGhpcy5zYW1wbGVyLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhpcyBiYWNrZW5kJ3MgcmVnaW9uIHJlbmRlcmVyICh0aGUgU1ZHIG92ZXJsYXkpLCBvbmNlIGEgcGxvdCBpcyBtb3VudGVkLiAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheTtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBpc29zdXJmYWNlLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyAzRCBzY2VuZXMsIHNvIG5vIGNvbnRyb2xzLiAqL1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBPU0QgcmVuZGVycyBvbmx5IHRoZSBpbWFnZSB0eXBlIOKAlCBubyBMSU5FIGludGVuc2l0eSBST0lzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHRvT3ZlcmxheU1vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiBSZWdpb25Ub29sTW9kZSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlICdkcmF3cmVjdCc6XG4gICAgICAgIHJldHVybiAnZHJhd3JlY3QnO1xuICAgICAgY2FzZSAnZHJhd2Nsb3NlZHBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdjbG9zZWRwYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdvcGVucGF0aCc6XG4gICAgICAgIHJldHVybiAnZHJhd29wZW5wYXRoJztcbiAgICAgIGNhc2UgJ2RyYXdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuICdkcmF3cG9seWdvbic7XG4gICAgICBjYXNlICdhZGRwb2ludCc6XG4gICAgICAgIHJldHVybiAnYWRkcG9pbnQnO1xuICAgICAgY2FzZSAnZGVsZXRlcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2RlbGV0ZXBvaW50JztcbiAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICByZXR1cm4gJ21vdmUnO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuICdzZWxlY3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cblxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIC8qIGhvc3QgcmUtZHJpdmVzIHBsb3QoKSB2aWEgdGhlIGltYWdlLWluZm8gc3RyZWFtICovXG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZwID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnApIHJldHVybjtcbiAgICAvLyBLZWVwIHRoZSB1c2VyJ3MgY3VycmVudCB2aWV3IGFjcm9zcyBhIGNvbnRhaW5lci9zcGxpdCByZXNpemUgaW5zdGVhZCBvZlxuICAgIC8vIHNuYXBwaW5nIGhvbWUuIFZpZXdwb3J0IGJvdW5kcyBhcmUgaW1hZ2UtcmVsYXRpdmUgKGltYWdlIHdpZHRoID0gMSksIHNvXG4gICAgLy8gdGhleSdyZSBpbmRlcGVuZGVudCBvZiB0aGUgY29udGFpbmVyJ3MgcGl4ZWwgc2l6ZSDigJQgY2FwdHVyZSB0aGUgdmlzaWJsZVxuICAgIC8vIHJlZ2lvbiBub3cgYW5kIHJlLWZpdCBpdCBvbmNlIHRoZSBuZXcgc2l6ZSBoYXMgc2V0dGxlZC4gT1NEJ3MgYXV0b1Jlc2l6ZVxuICAgIC8vIGZpcmVzIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgYW5ndWxhci1zcGxpdCB0cmFuc2l0aW9uIGFuaW1hdGVzIHRoZSB3aWR0aFxuICAgIC8vIG92ZXIgYSBmZXcgaHVuZHJlZCBtcywgc28gcmVzdG9yZSBvbiB0aGUgbmV4dCBmcmFtZSBhbmQgYWdhaW4gYWZ0ZXIgdGhlXG4gICAgLy8gdHJhbnNpdGlvbiBjb21wbGV0ZXMuXG4gICAgY29uc3QgYm91bmRzID0gdnAuZ2V0Qm91bmRzKHRydWUpO1xuICAgIGNvbnN0IHJlc3RvcmUgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZml0Qm91bmRzKGJvdW5kcywgdHJ1ZSk7XG4gICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIHZpZXdlciB0b3JuIGRvd24gKi9cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXN0b3JlKTtcbiAgICBzZXRUaW1lb3V0KHJlc3RvcmUsIDM1MCk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgfVxuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmdvSG9tZSgpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQoJ2F1dG9zY2FsZScpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC56b29tQnkoMSAvIDEuMyk7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmFwcGx5Q29uc3RyYWludHMoKTtcbiAgfVxuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIFJlY3RhbmdsZS9wb2x5Z29uIGRyYXdpbmcgcnVuIG9uIHRoZSBTVkcgb3ZlcmxheTsgd2FuZC9lcmFzZXIvem9vbS1ib3hcbiAgICAvLyAoY3VzdG9tIFBsb3RseSBvdmVybGF5cykgYXJlIHJvdXRlZCB0byBQbG90bHkgYnkgdGhlIHJvdXRlciBhbmQgYXJlbid0XG4gICAgLy8gaGFuZGxlZCBoZXJlIHlldC5cbiAgICB0aGlzLm92ZXJsYXk/LnNldE1vZGUodGhpcy50b092ZXJsYXlNb2RlKG1vZGUpKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogT1NEIG5hdmlnYXRlcyB0aGUgc3RhY2sgdmlhIHRoZSB6LXNsaWRlciAtPiBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvci4gU3RvcmVkIGZvciB0aGUgbmV4dCB2aWV3ZXIgY3JlYXRpb24sIGFuZFxuICAgKiAgYXBwbGllZCBsaXZlIHdoZW4gYSB2aWV3ZXIgaXMgYWxyZWFkeSBtb3VudGVkIChoaWRlcy9yZXZlYWxzIGl0cyBlbGVtZW50IOKAlFxuICAgKiAgdGhlIG5hdmlnYXRvciBpbnN0YW5jZSBpdHNlbGYgb25seSBleGlzdHMgd2hlbiBjcmVhdGVkIHdpdGggc2hvd05hdmlnYXRvcikuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgY29uc3QgbmF2RWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/Lm5hdmlnYXRvcj8uZWxlbWVudDtcbiAgICBpZiAobmF2RWwpIG5hdkVsLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvKiogVG9nZ2xlIGJpbGluZWFyIHNtb290aGluZyB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzKS4gU3RvcmVkIGZvciB0aGVcbiAgICogIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmQgYXBwbGllZCBsaXZlICh3aXRoIGEgcmVkcmF3KSB0byBhIG1vdW50ZWQgdmlld2VyLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc21vb3RoaW5nRW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgY29uc3QgZHJhd2VyOiBhbnkgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyO1xuICAgIGlmIChkcmF3ZXI/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCkge1xuICAgICAgZHJhd2VyLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICAgIHRoaXMudmlld2VyPy5mb3JjZVJlZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHRoZSBkaXNwbGF5ZWQgei1zbGljZSBsaXZlLiBTbGljZXMgYXJlIGtlcHQgYXMgc2VwYXJhdGUgdGlsZWQgaW1hZ2VzIGluXG4gICAqIHRoZSB3b3JsZCwgc28gc3dpdGNoaW5nIGlzIGp1c3QgYW4gb3BhY2l0eSB0b2dnbGU6IGEgcHJldmlvdXNseS12aXNpdGVkIHNsaWNlXG4gICAqIHNob3dzIGluc3RhbnRseSAoaXRzIGRlY29kZWQgKyByZWNvbG9yZWQgdGlsZXMgYXJlIHN0aWxsIHJlc2lkZW50KSwgYW5kIGFcbiAgICogbmV2ZXItc2VlbiBzbGljZSBpcyBhZGRlZCBvbmNlLiBUaGUgcmVnaW9uIG92ZXJsYXksIGNvb3JkaW5hdGUgdHJhbnNmb3JtLFxuICAgKiBzY2FsZSBiYXIsIGNvbG9ybWFwIHBpcGVsaW5lIGFuZCBjdXJyZW50IHpvb20vcGFuIGFsbCBwZXJzaXN0IOKAlCB0aGUgeC95XG4gICAqIGdlb21ldHJ5IGlzIGlkZW50aWNhbCBhY3Jvc3Mgc2xpY2VzLlxuICAgKlxuICAgKiBTaW1wbGUgbW9kZSAodGlsZWQ6ZmFsc2Ug4oCUIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZCBjbGllbnQtc2lkZSxcbiAgICogZWFjaCBzbGljZSBpdHMgb3duIGNvbXBsZXRlIGltYWdlIHdpdGggbm8gc2hhcmVkIHRpbGUgc2VydmVyKSBoYXMgbm9cbiAgICogcHlyYW1pZCB0byB0b2dnbGUgb3BhY2l0eSBvbiwgc28gaXQgcmUtb3BlbnMgdGhlIHZpZXdlciBvbiB0aGUgbmV3XG4gICAqIHNsaWNlJ3MgVVJMIGluc3RlYWQuIHByZXNlcnZlVmlld3BvcnQgKHZpZXdlciBvcHRpb24sIHNlZSBwbG90KCkpIGtlZXBzXG4gICAqIHRoZSBjdXJyZW50IHpvb20vcGFuIGFjcm9zcyB0aGF0IHJlb3Blbi5cbiAgICovXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHogPSB6SW5kZXggfHwgMDtcbiAgICBpZiAoeiA9PT0gdGhpcy5jdXJyZW50WikgcmV0dXJuO1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAodGhpcy5zaW1wbGVNb2RlKSB7XG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgY29uc3QgdXJscyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbel0gPz8gdGhpcy5zaW1wbGVDaGFubmVsVXJsc1swXTtcbiAgICAgICAgaWYgKCF1cmxzKSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJscyk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKHosIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyk7XG4gICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIgfHwgIXVybCkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVVybHNbel0gPz8gdGhpcy5zaW1wbGVVcmxzWzBdO1xuICAgICAgaWYgKCFyYXdVcmwpIHJldHVybjtcbiAgICAgIHRoaXMuY3VycmVudFogPSB6O1xuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAvLyBGZXRjaGVkIHZpYSBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGF1dGggaW50ZXJjZXB0b3IgYXBwbGllcykgdGhlblxuICAgICAgLy8gdXBzY2FsZWQgdG8gZnVsbC1yZXMgKHNhbWUgYXMgdGhlIGluaXRpYWwgbG9hZCDigJQgc2VlIHRvRnVsbFJlc1VybCkgc29cbiAgICAgIC8vIHRoZSB3b3JsZCBzdGF5cyBmdWxsLXJlcyBhY3Jvc3Mgc2xpY2VzIGFuZCBST0lzIGtlZXAgYWxpZ25pbmcuIEd1YXJkXG4gICAgICAvLyBhZ2FpbnN0IGEgbmV3ZXIgc2NydWIgbGFuZGluZyBmaXJzdC5cbiAgICAgIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKVxuICAgICAgICAudGhlbigocHJldmlld1VybCkgPT5cbiAgICAgICAgICB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IDAsIHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IDApLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKCh1cmwpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50WiAhPT0geiB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIHJlLW9wZW4gZmFpbGVkJywgZT8ubWVzc2FnZSA/PyBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgICB2b2lkIHRoaXMuc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybCwgeik7IC8vIHJlLWJpbiB0aGUgc2NydWJiZWQgc2xpY2VcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignW09TRF0gc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kZXNjcmlwdG9yIHx8ICF0aGlzLmluZm9CNjQpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gd2FuZCByZWFkYmFjayBpcyBzbGljZS1zcGVjaWZpY1xuICAgIHRoaXMuY2FjaGUuc2hvd1NsaWNlKHopO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXModGhpcy5kZXNjcmlwdG9yLCB0aGlzLmluZm9CNjQsIHopO1xuICAgIH1cbiAgfVxuXG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChzdGFja0xvYWRpbmcpO1xuICB9XG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0U3RhY2tMb2FkaW5nUHJvZ3Jlc3MoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3IgPyB7IHdpZHRoOiB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGhlaWdodDogdGhpcy5kZXNjcmlwdG9yLmhlaWdodCB9IDogbnVsbDtcbiAgfVxuICBnZXRDdXJyZW50SW1hZ2UoKTogUHJvbWlzZTxJbWFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBpeGVscyDigJQgdGhlIHJlbmRlcmVkIHZpZXdwb3J0ICh3aGF0IHRoZSB1c2VyIHNlZXMsXG4gICAqIGluY2x1ZGluZyB0aGUgY3VycmVudCB6b29tIGFuZCBhbnkgY29sb3JtYXAgcmVjb2xvciksIGFzIFJHQkEuIEZlZWRzIHRoZVxuICAgKiBwcm9jZXNzaW5nLXBpcGVsaW5lIGRpYWxvZydzIFwidXNlIGN1cnJlbnQgdmlld1wiLiBSZXR1cm5zIG51bGwgdW50aWwgdGlsZXNcbiAgICogYXJlIGRyYXduLlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSAodGhpcy52aWV3ZXIgYXMgYW55KT8uZHJhd2VyPy5jYW52YXM7XG4gICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy53aWR0aCB8fCAhY2FudmFzLmhlaWdodCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzO1xuICAgIGNvbnN0IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHM6IDQsIGRhdGE6IGltZy5kYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogSW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlIHRoZSBkcmF3ZXIgY2FudmFzICh3aGF0IHtAbGluayBnZXREaXNwbGF5ZWRQaXhlbERhdGF9XG4gICAqIHJlYWRzKSBjdXJyZW50bHkgY292ZXJzLiBVbmxpa2Uge0BsaW5rIGVtaXRWaWV3cG9ydENoYW5nZX0sIHRoaXMgaXMgTk9UXG4gICAqIGNsYW1wZWQgdG8gdGhlIGltYWdlIGJvdW5kczogdGhlIGNhbnZhcyBtYXBzIDE6MSB0byB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlLFxuICAgKiBzbyBsZWF2aW5nIGl0IHVuY2xhbXBlZCBrZWVwcyBgY2FudmFzUHggLT4gaW1hZ2VQeGAgYW4gZXhhY3QgYWZmaW5lIG1hcFxuICAgKiAoY2xhbXBpbmcgd291bGQgc2tldyBjb29yZGluYXRlcyBuZWFyIHRoZSBpbWFnZSBlZGdlcykuIFJvdXRlZCB0aHJvdWdoIHdvcmxkXG4gICAqIGl0ZW0gMCAoc2VlIHtAbGluayB2aWV3cG9ydFJlY3RUb0ltYWdlfSkgZm9yIG11bHRpLWxheWVyIGFjY3VyYWN5LlxuICAgKi9cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gdmlld3BvcnRSZWN0VG9JbWFnZSh0aGlzLnZpZXdlciwgdnAuZ2V0Qm91bmRzKHRydWUpKTtcbiAgICAgIHJldHVybiB7IHg6IHIueCwgeTogci55LCB3aWR0aDogci53aWR0aCwgaGVpZ2h0OiByLmhlaWdodCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICAvLyBTbmFwc2hvdCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIE9TRCB2aWV3IGFzIGEgUE5HIChXWVNJV1lHKSDigJQgdGhlIHBhcmFsbGVsXG4gICAgLy8gdG8gUGxvdGx5J3MgZG93bmxvYWRJbWFnZS4gT1NEIHVzZXMgdGhlIDJEIGNhbnZhcyBkcmF3ZXIgYW5kIGJha2VzIHRoZVxuICAgIC8vIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIC8gcGVyLWNoYW5uZWwgY29sb3VycyAvXG4gICAgLy8gaW52ZXJ0KSBpbnRvIHRoZSB0aWxlcyB2aWEgdGhlIHJlY29sb3IgcGlwZWxpbmUsIHNvIHRoZSBkcmF3ZXIgY2FudmFzXG4gICAgLy8gYWxyZWFkeSByZWZsZWN0cyBleGFjdGx5IHdoYXQncyBvbiBzY3JlZW4gYXQgdGhlIGN1cnJlbnQgem9vbS9wYW4uIFRoZVxuICAgIC8vIGZ1bGwtcmVzb2x1dGlvbiBzdGl0Y2hlZCBleHBvcnQgbGl2ZXMgaW4gZXhwb3J0Q29tcG9zaXRlKCkgKENoYW5uZWxzICZcbiAgICAvLyBIaXN0b2dyYW0gZGlhbG9nKS5cbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19LnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKF9wbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICAvKiBPU0Qgb25seSByZW5kZXJzIHRoZSBpbWFnZSB0eXBlICovXG4gIH1cbiAgc2V0U3VyZmFjZURyYWdNb2RlKF9tb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICAvKiAzRCBub3Qgc3VwcG9ydGVkIGJ5IE9TRCAqL1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRvc2NhbGVFdmVudCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogVmlzaWJsZSBpbWFnZSByZWdpb24gKGZ1bGwtaW1hZ2UgcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3XG4gICAqICBzZXR0bGVzLiBUaGUgaW50ZW5zaXR5IGluc2V0IHJlLXNhbXBsZXMgdGhpcyByZWdpb24gYXQgdGhlIHpvb20gcmVzb2x1dGlvbi4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBpbnRlbnNpdHkgc2FtcGxpbmcgbGl2ZXMgaW4gdGhlIFBsb3RseVxuICAgKiAgYmFja2VuZCAoaXQgb3ducyBwaXhlbCByZWFkYmFjaykuIE9TRCBmZWVkcyBpdCBvbmx5IHZpYSBnZXRWaWV3cG9ydENoYW5nZSQ7XG4gICAqICB0aGUgc2FtcGxpbmctY2FjaGUgcHJpbWluZyBpdHNlbGYgaXMgYSBuby1vcCBoZXJlLiAqL1xuICBhc3luYyBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhfaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCBfekluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIHtAbGluayBJSW50ZW5zaXR5U2FtcGxpbmd9IHN0dWIg4oCUIHNlZSB7QGxpbmsgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmd9LiAqL1xuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koX3g6IG51bWJlciwgX3k6IG51bWJlciwgX3dpZHRoOiBudW1iZXIsIF9oZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF96SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIC8qIG5vLW9wOiBQbG90bHkgb3ducyBpbnRlbnNpdHkgc2FtcGxpbmcgKHNlZSBJSW50ZW5zaXR5U2FtcGxpbmcpICovXG4gIH1cblxuICAvKiogQ29tcHV0ZSB0aGUgY3VycmVudCB2aWV3cG9ydCdzIGltYWdlLXBpeGVsIHJlY3RhbmdsZSAoY2xhbXBlZCB0byB0aGUgaW1hZ2UpXG4gICAqICBhbmQgYnJvYWRjYXN0IGl0LiAqL1xuICBwcml2YXRlIGVtaXRWaWV3cG9ydENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2cDogYW55ID0gdGhpcy52aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghdnAgfHwgIXRoaXMuZGVzY3JpcHRvcikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAob3NkLWNvb3Jkcyk6IHZwLnZpZXdwb3J0VG9JbWFnZVJlY3RhbmdsZSBpc1xuICAgICAgLy8gaW5hY2N1cmF0ZSBhbmQgd2FybnMgd2hlbiB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbFxuICAgICAgLy8gbXVsdGljaGFubmVsIGxheWVycyksIHdoaWNoIGZlZCB0aGUgaW50ZW5zaXR5IGluc2V0IGEgd3JvbmcgUk9JLlxuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICBjb25zdCBpdyA9IHRoaXMuZGVzY3JpcHRvci53aWR0aCwgaWggPSB0aGlzLmRlc2NyaXB0b3IuaGVpZ2h0O1xuICAgICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGl3LCByLngpKTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpaCwgci55KSk7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGl3IC0geCwgci53aWR0aCkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oaWggLSB5LCByLmhlaWdodCkpO1xuICAgICAgdGhpcy52aWV3cG9ydENoYW5nZSQubmV4dCh7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogT1NEIHRhcmdldHMgdGhlIGltYWdlIGRpc3BsYXk7IHRoZSBzY2FsYXIvM0QgcGxvdCB0eXBlcyBiZWxvbmcgdG8gUGxvdGx5LiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICByZXR1cm4gW1BMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5IRUFUTUFQXSFdO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICAvKiogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZTsgdGhlIExJTkUgaW50ZW5zaXR5IGluc2V0IGlzIFBsb3RseS1vbmx5LiAqL1xuICByZW5kZXJJbnRlbnNpdHlJbnNldChfZGl2SWQ6IHN0cmluZywgX3Byb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICAvKiBubyBMSU5FIG1vZGUgb24gT1NEICovXG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gbmFwYXJpLWpzKS4gVGhlIE9TRCByZWdpb25cbiAgLy8gb3ZlcmxheSAoY29uc3RydWN0ZWQgaW4gcGxvdCgpKSByZWFkcy93cml0ZXMgdGhhdCBzYW1lIHN0b3JlLCBzbyByZWdpb25zXG4gIC8vIHN0YXkgaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3I7IE9TRCByZW5kZXJzIHRoZW0gYXMgYW4gU1ZHXG4gIC8vIG92ZXJsYXkgcmF0aGVyIHRoYW4gY2FycnlpbmcgUGxvdGx5IHNoYXBlIGRpY3RzLlxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdhbmQgKyB2ZXJ0ZXggZXJhc2VyIHJ1biBvdmVyIE9TRCB2aWEgSUNvb3JkaW5hdGVUcmFuc2Zvcm0uIFRoZXkgc2hhcmUgdGhlXG4gIC8vIHNpbmdsZXRvbiB0b29sIHNlcnZpY2VzIHdpdGggUGxvdGx5LCBzbyB3ZSByZS1iaW5kIHRvIG91ciBob3N0cyBvbiBhY3RpdmF0ZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgZHJhd3MgaW5zdGVhZCBvZiBwYW5uaW5nLiAoTmF2IGlzXG4gICAgLy8gcmUtZW5hYmxlZCB3aGVuIHRoZSByZWdpb24gb3ZlcmxheSByZXR1cm5zIHRvICdub25lJyBvbiB0b29sIHN3aXRjaC4pXG4gICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7XG4gICAgLy8gVGhlIHdhbmQgc2FtcGxlcyB0aGUgcmVuZGVyZWQgdmlld3BvcnQg4oCUIHJlYWQgYmFjayBsYXppbHkgb24gZmlyc3QgdXNlLlxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgIHRoaXMud2FuZFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKG9wdGlvbnMgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIGNsZWFyQWN0aXZlV2FuZFJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCk7XG4gIH1cbiAgc2V0QnJ1c2hNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGFrZSB0aGUgcG9pbnRlciBmcm9tIE9TRCBzbyB0aGUgZHJhZyBwYWludHMgaW5zdGVhZCBvZiBwYW5uaW5nLlxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSBicnVzaCB3b3JrcyBpbiB0aGUgcmVuZGVyZWQtdmlld3BvcnQgY29vcmRpbmF0ZSBmcmFtZSDigJQgcmVhZCBpdCBiYWNrXG4gICAgLy8gbGF6aWx5IG9uIGZpcnN0IHVzZSwgbGlrZSB0aGUgd2FuZC4gSXQgc2hhcmVzIHRoZSB3YW5kJ3MgaG9zdC5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLmJydXNoVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKHRydWUsIChvcHRpb25zID8/IHt9KSBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRTaXplKChvcHRpb25zIGFzIEJydXNoT3B0aW9ucyk/LnNpemUgPz8gMCk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdG9vbCB0YWtlcyB0aGUgcG9pbnRlclxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLmVyYXNlclRvb2wuYmluZEhvc3QodGhpcy5lcmFzZXJIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0UmFkaXVzKHJhZGl1cyk7XG4gIH1cbiAgc2V0Wm9vbVRvQm94TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gdGhlIGJveCBkcmFnIG11c3Qgbm90IHBhblxuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gICAgaWYgKCFhY3RpdmUpIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQodHJ1ZSk7XG4gIH1cbiAgLyoqIEJveC1wcm9tcHRlZCBTQU06IHNlZ21lbnQgdGhlIGRyYXduIHJlY3RhbmdsZXMuIFRoZSBTQU0gdG9vbCByZXVzZXMgdGhlXG4gICAqICB3YW5kIGhvc3QgKHZpZXdwb3J0IHJlYWRiYWNrICsgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyByZWdpb24gc3RvcmUpLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBzZWdtZW50IGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLnNhbVRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgcmV0dXJuIHRoaXMuc2FtVG9vbC5zZWdtZW50Qm94ZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNlbGxTZWdtZW50ZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIGNyb3AgYWdhaW5zdCB0aGUgY3VycmVudCB2aWV3cG9ydCByZWFkYmFja1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyBjbGlja3MgYWRkIHBvaW50cywgZG9uJ3QgcGFuXG4gICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgIHRoaXMuc2FtUG9pbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgY29tbWl0U2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jb21taXQoKTsgfVxuICBjbGVhclNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTsgfVxuXG4gIC8qKiBCdWlsZCB0aGUgd2FuZC9lcmFzZXIgaG9zdCBvYmplY3RzIGJvdW5kIHRvIHRoaXMgYmFja2VuZC4gQm90aCB0b29scyBydW5cbiAgICogIG92ZXIgT1NEIHZpYSB0aGUgc2hhcmVkIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgYSB2aWV3cG9ydCBwaXhlbCByZWFkYmFjayxcbiAgICogIGFuZCByZWFkL3dyaXRlIHJlZ2lvbnMgZGlyZWN0bHkgb24gdGhlIHNoYXJlZCBSZWdpb25TdG9yZSAobmV1dHJhbCBtb2RlbCkuICovXG4gIHByaXZhdGUgYnVpbGRUb29sSG9zdHMoKTogdm9pZCB7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCksXG4gICAgICBnZXRBY3RpdmVGcmFtZUluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMuY3VycmVudEZpbGVOYW1lLFxuICAgICAgZ2V0U2hhcGVDb2xvcjogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCksXG4gICAgfTtcbiAgICB0aGlzLmVyYXNlckhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBpbnZhbGlkYXRlV2FuZFJlZ2lvbjogKCkgPT4gdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpLFxuICAgICAgZ2V0T3ZlcmxheUNvbnRhaW5lcjogKCkgPT4gdGhpcy5nZXRPdmVybGF5Q29udGFpbmVyKCksXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VSYXRpbzogKCkgPT4gdGhpcy5yZWFkYmFja1ZpZXdwb3J0KCk/LnJhdGlvc1swXSA/PyAxLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIGVsZW1lbnQgdGhlIG9uLWNhbnZhcyB0b29sIG92ZXJsYXlzIGF0dGFjaCB0byAoT1NEIGlzIG1vdW50ZWQgaGVyZSkuICovXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBTaXplIHRoZSBuYXZpZ2F0b3IgZnJvbSB0aGUgQ1VSUkVOVCBjb250YWluZXIgKG5hdmlnYXRvclNpemVSYXRpbyBvZiB0aGVcbiAgICogIHZpZXdlciBlbGVtZW50KSBhbmQga2VlcCBpdCBwaW5uZWQgdG8gdGhlIGNvcm5lci4gT1NEIGNvbXB1dGVzIHRoZSBzaXplXG4gICAqICBvbmNlIGluIHRoZSBWaWV3ZXIgY29uc3RydWN0b3Ig4oCUIGJlZm9yZSB0aGUgaG9zdCBmbGV4IGxheW91dCBzZXR0bGVzIOKAlFxuICAgKiAgYW5kIG5ldmVyIGNvcnJlY3RzIGl0LCBsZWF2aW5nIGEgc3RhbGUtc2l6ZSBlbGVtZW50IHdob3NlIHZpc2libGUgbWluaW1hcFxuICAgKiAgZmxvYXRzIGFib3ZlIHRoZSBib3R0b20tcmlnaHQgY29ybmVyLiAqL1xuICBwcml2YXRlIHJlc2l6ZU5hdmlnYXRvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2OiBhbnkgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBuYXYgPSB2Py5uYXZpZ2F0b3I7XG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdj8uZWxlbWVudDtcbiAgICBpZiAoIW5hdj8uZWxlbWVudCB8fCAhZWw/LmNsaWVudFdpZHRoIHx8ICFlbD8uY2xpZW50SGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3QgdyA9IE1hdGgucm91bmQoZWwuY2xpZW50V2lkdGggKiAwLjE2KTtcbiAgICBjb25zdCBoID0gTWF0aC5yb3VuZChlbC5jbGllbnRIZWlnaHQgKiAwLjE2KTtcbiAgICBpZiAobmF2LmVsZW1lbnQuc3R5bGUud2lkdGggIT09IGAke3d9cHhgIHx8IG5hdi5lbGVtZW50LnN0eWxlLmhlaWdodCAhPT0gYCR7aH1weGApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5hdi5zZXRXaWR0aCh3KTtcbiAgICAgICAgbmF2LnNldEhlaWdodChoKTtcbiAgICAgIH0gY2F0Y2ggeyAvKiBuYXZpZ2F0b3IgdG9ybiBkb3duICovIH1cbiAgICB9XG4gICAgLy8gTm9ybWFsaXplIE9TRCdzIGNvbnRyb2wtY29ybmVyIHN0YWNrIHNvIHRoZSBtaW5pbWFwIHNpdHMgZmx1c2ggaW4gdGhlXG4gICAgLy8gY29ybmVyLCBpbnNldCAxMnB4IHRvIGxpbmUgdXAgd2l0aCB0aGUgc2NhbGUgYmFyOlxuICAgIC8vICAtIHRoZSBpbmxpbmUtYmxvY2sgd3JhcHBlciBjYXJyaWVzIGxpbmUtYm94IHN0cnV0cyBhbmQgY2FuIHJldGFpbiBzdGFsZVxuICAgIC8vICAgIHNpemluZyDihpIgbWFrZSBpdCBhIHRpZ2h0IGJsb2NrO1xuICAgIC8vICAtIGFueXRoaW5nIGVsc2UgT1NEIGxlZnQgaW4gdGhlIGNvcm5lciB3b3VsZCBzdGFjayBiZWxvdyB0aGUgbmF2aWdhdG9yXG4gICAgLy8gICAgYW5kIGZsb2F0IGl0IHVwIOKGkiBoaWRlIGl0O1xuICAgIC8vICAtIGluc2V0IHRoZSBjb3JuZXIgaXRzZWxmIChib3R0b20vcmlnaHQgMTJweCksIGtlZXBpbmcgdGhlIGVsZW1lbnQgaW5cbiAgICAvLyAgICBub3JtYWwgZmxvdy5cbiAgICBjb25zdCB3cmFwcGVyID0gbmF2LmVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgY29ybmVyID0gd3JhcHBlcj8ucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHdyYXBwZXIgJiYgY29ybmVyKSB7XG4gICAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgd3JhcHBlci5zdHlsZS5saW5lSGVpZ2h0ID0gJzAnO1xuICAgICAgd3JhcHBlci5zdHlsZS5mb250U2l6ZSA9ICcwJztcbiAgICAgIC8vIFRoZSB3cmFwcGVyIGtlZXBzIHRoZSBuYXZpZ2F0b3IncyBzdGFsZSBwcmUtc2V0dGxlIGhlaWdodCBhcyBhblxuICAgICAgLy8gZXhwbGljaXQgc2l6ZSAodGhlIG5hdiB3YXMgMC4xNnggdGhlIFVOU0VUVExFRCBjb250YWluZXIgYXQgY3JlYXRpb24pLFxuICAgICAgLy8gbGVhdmluZyBhbiBlbXB0eSBiYW5kIHVuZGVyIHRoZSByZXNpemVkIG1pbmltYXAg4oCUIG1lYXN1cmVkIGxpdmU6XG4gICAgICAvLyBuYXZIPTg3IGluc2lkZSB3cmFwSD0xNjcuIEZvcmNlIGl0IHRvIGh1ZyBpdHMgY29udGVudC5cbiAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgd3JhcHBlci5zdHlsZS53aWR0aCA9ICdhdXRvJztcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbShjb3JuZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSB3cmFwcGVyKSBjaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKHdyYXBwZXIuY2hpbGRyZW4pIGFzIEhUTUxFbGVtZW50W10pIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBuYXYuZWxlbWVudCkgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGNvcm5lci5zdHlsZS5ib3R0b20gPSAnMTJweCc7XG4gICAgICBjb3JuZXIuc3R5bGUucmlnaHQgPSAnMTJweCc7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24obmF2LmVsZW1lbnQuc3R5bGUsIHsgcG9zaXRpb246ICdyZWxhdGl2ZScsIHRvcDogJycsIGxlZnQ6ICcnLCBib3R0b206ICcnLCByaWdodDogJycsIG1hcmdpbjogJzAnIH0pO1xuICAgIC8vIFRPRE8oZGVidWcpOiByZW1vdmUgYWZ0ZXIgdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgbmVyID0gbmF2LmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3IgPSB3cmFwcGVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjciA9IGNvcm5lcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcGVyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc29sZS53YXJuKGBbdml6Om5hdl0gbmF2Qm90dG9tPSR7TWF0aC5yb3VuZChuZXIuYm90dG9tKX0gd3JhcEJvdHRvbT0ke01hdGgucm91bmQod3I/LmJvdHRvbSA/PyAtMSl9IGAgK1xuICAgICAgYGNvcm5lckJvdHRvbT0ke01hdGgucm91bmQoY3I/LmJvdHRvbSA/PyAtMSl9IHBsb3RCb3R0b209JHtNYXRoLnJvdW5kKHBlci5ib3R0b20pfSBgICtcbiAgICAgIGBuYXZIPSR7TWF0aC5yb3VuZChuZXIuaGVpZ2h0KX0gd3JhcEg9JHtNYXRoLnJvdW5kKHdyPy5oZWlnaHQgPz8gLTEpfSBjb3JuZXJIPSR7TWF0aC5yb3VuZChjcj8uaGVpZ2h0ID8/IC0xKX1gKTtcbiAgfVxuXG4gIC8qKiBGb3JjZSB0aGUgZG9ja2VkIHRvb2xiYXIgdG8gcmVwYWludCBhZnRlciBhbiBPU0Qgem9vbS4gQ2hyb21lIGxlYXZlcyBpdFxuICAgKiAgbGFpZC1vdXQtYnV0LXVucGFpbnRlZCAodGhlIGNhbnZhcydzIGNvbXBvc2l0aW5nIGNodXJuIHN0cmFuZHMgdGhlIHRvb2xiYXInc1xuICAgKiAgcmFzdGVyKS4gQSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIGl0IHdpdGggbm8gdmlzaWJsZSBnb25lLWZyYW1lXG4gICAqICBhbmQgbm8gbGF5b3V0IHNoaWZ0LiBMb2NhdGVkIHZpYSB0aGUgRE9NIHNpbmNlIHRoaXMgc2VydmljZSBkb2Vzbid0IG93biB0aGVcbiAgICogIHRvb2xiYXI7IGEgbm8tb3Agd2hlbiB0aGVyZSdzIG5vIHRvb2xiYXIgKGUuZy4gZW1iZWRkZWQgd2l0aG91dCBvbmUpLiAqL1xuICBwcml2YXRlIG51ZGdlVG9vbGJhclJlcGFpbnQoKTogdm9pZCB7XG4gICAgY29uc3QgcGxvdEVsID0gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gICAgY29uc3QgZG9jayA9IHBsb3RFbD8uY2xvc2VzdCgndmlzdWFsaXphdGlvbicpPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnRvb2xiYXItZG9jaycpO1xuICAgIGlmICghZG9jaykgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBkb2NrLnN0eWxlLmRpc3BsYXk7XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHZvaWQgZG9jay5vZmZzZXRIZWlnaHQ7IC8vIHJlZmxvdyBzbyB0aGUgdG9nZ2xlIHJlLXJhc3RlcnMgb24gdGhlIG5leHQgcGFpbnRcbiAgICBkb2NrLnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICB9XG5cbiAgLyoqIEhvc3QgZm9yIHRoZSAoc2hhcmVkKSB6b29tLXRvLWJveCB0b29sOiBjb252ZXJ0IG92ZXJsYXkgcGl4ZWxzIHRvIGltYWdlXG4gICAqICBjb29yZHMgdmlhIHRoZSB2aWV3cG9ydCwgYW5kIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGNob3NlbiByZWN0YW5nbGUuICovXG4gIHByaXZhdGUgem9vbUJveEhvc3QoKTogWm9vbVRvQm94VG9vbEhvc3Qge1xuICAgIHJldHVybiB7XG4gICAgICBnZXRQbG90RGl2OiAoKSA9PiB0aGlzLnBsb3REaXYsXG4gICAgICBwaXhlbFRvRGF0YTogKHB4OiBudW1iZXIsIHB5OiBudW1iZXIpID0+IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBweCwgcHkpLFxuICAgICAgYXBwbHlab29tVG9Cb3g6IChjb29yZHM6IG51bWJlcltdKSA9PiB0aGlzLmFwcGx5Wm9vbVRvQm94KGNvb3JkcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBGaXQgdGhlIE9TRCB2aWV3cG9ydCB0byBhbiBpbWFnZS1zcGFjZSByZWN0YW5nbGUgKGNvb3JkcyBvcmRlcmVkXG4gICAqICBbeE1pbiwgeE1heCwgeU1heCwgeU1pbl0pLiAqL1xuICBwcml2YXRlIGFwcGx5Wm9vbVRvQm94KGNvb3JkaW5hdGVzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuICAgIGNvbnN0IFthLCBiLCBjLCBkXSA9IGNvb3JkaW5hdGVzO1xuICAgIGNvbnN0IHggPSBNYXRoLm1pbihhLCBiKTtcbiAgICBjb25zdCB3ID0gTWF0aC5hYnMoYiAtIGEpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihjLCBkKTtcbiAgICBjb25zdCBoID0gTWF0aC5hYnMoYyAtIGQpO1xuICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IGltYWdlUmVjdFRvVmlld3BvcnQodGhpcy52aWV3ZXIsIHgsIHksIHcsIGgpO1xuICAgIHRoaXMudmlld2VyLnZpZXdwb3J0LmZpdEJvdW5kcyhyZWN0LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIHRoZSAqY3VycmVudGx5IHJlbmRlcmVkKiBPU0QgY2FudmFzIGFzIHRoZSB3YW5kJ3MgcGl4ZWwgbWF0cml4LlxuICAgKiBUaGUgbWF0cml4IGNvdmVycyBvbmx5IHRoZSB2aXNpYmxlIHZpZXdwb3J0IGF0IHNjcmVlbiByZXNvbHV0aW9uLCBzbyB3aGVuXG4gICAqIHRoZSB1c2VyIGlzIHpvb21lZCBpbnRvIGEgc3ViLXJlZ2lvbiB0aGUgd2FuZCBzYW1wbGVzIHRoYXQgcmVnaW9uJ3MgZGV0YWlsXG4gICAqIChyYXRoZXIgdGhhbiB0aGUgd2hvbGUgaW1hZ2UgYXQgcHJldmlldyByZXNvbHV0aW9uKS4gYG9yaWdpblgvb3JpZ2luWWAgYW5kXG4gICAqIGByYXRpb3NgIG1hcCBpbWFnZSBjb29yZHMgPC0+IHJlYWRiYWNrLXBpeGVsIGNvb3JkcyBmb3IgdGhlIHdhbmQnc1xuICAgKiBkYXRhL3JhdGlvL29yaWdpbiBtb2RlbC4gQ2FjaGVkIHVudGlsIHRoZSB2aWV3cG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkYmFja1ZpZXdwb3J0KCk6IENhY2hlZEltYWdlRGF0YSB8IG51bGwge1xuICAgIGlmICh0aGlzLnZpZXdwb3J0UGl4ZWxzKSByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlciBhcyBhbnk7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9IHZpZXdlcj8uZHJhd2VyPy5jYW52YXM7XG4gICAgY29uc3QgdnAgPSB2aWV3ZXI/LnZpZXdwb3J0O1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQgfHwgIXZwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoOyAvLyBkZXZpY2UgcGl4ZWxzXG4gICAgY29uc3QgaCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTsgLy8gUkdCQSwgcm93LW1ham9yXG4gICAgLy8gQnVpbGQgdGhlIFt5XVt4XSA9IFtyLGcsYl0gbWF0cml4IHRoZSB3YW5kIGV4cGVjdHMgZm9yIFJHQiBmcmFtZXMuXG4gICAgY29uc3QgbWF0cml4OiBudW1iZXJbXVtdW10gPSBuZXcgQXJyYXkoaCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoOyB5KyspIHtcbiAgICAgIGNvbnN0IHJvdzogbnVtYmVyW11bXSA9IG5ldyBBcnJheSh3KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB5ICogdyAqIDQ7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHc7IHgrKykge1xuICAgICAgICBjb25zdCBvID0gYmFzZSArIHggKiA0O1xuICAgICAgICByb3dbeF0gPSBbZGF0YVtvXSwgZGF0YVtvICsgMV0sIGRhdGFbbyArIDJdXTtcbiAgICAgIH1cbiAgICAgIG1hdHJpeFt5XSA9IHJvdztcbiAgICB9XG5cbiAgICAvLyBJbWFnZS1jb29yZCBzcGFuIHRoZSByZWFkYmFjayBjb3ZlcnMgKENTUyBweCBpbiwgaW1hZ2UgY29vcmRzIG91dCkuIFJvdXRlXG4gICAgLy8gdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpIHNvIGl0IHN0YXlzIGFjY3VyYXRlIOKAlCBhbmQgcXVpZXQg4oCUIHdoZW5cbiAgICAvLyB0aGUgd29ybGQgaG9sZHMgbXVsdGlwbGUgaW1hZ2VzIChwZXItY2hhbm5lbCBtdWx0aWNoYW5uZWwgbGF5ZXJzKS5cbiAgICBjb25zdCBlbFcgPSBjYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCBlbEggPSBjYW52YXMuY2xpZW50SGVpZ2h0IHx8IGg7XG4gICAgY29uc3QgdGwgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgMCwgMCk7XG4gICAgY29uc3QgYnIgPSBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgZWxXLCBlbEgpO1xuICAgIGNvbnN0IHJhdGlvWCA9IChici54IC0gdGwueCkgLyB3OyAvLyBpbWFnZSBweCBwZXIgcmVhZGJhY2sgcHhcbiAgICBjb25zdCByYXRpb1kgPSAoYnIueSAtIHRsLnkpIC8gaDtcblxuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSB7XG4gICAgICBmcmFtZXM6IFttYXRyaXhdLFxuICAgICAgd2lkdGg6IHcsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICByYXRpb3M6IFtyYXRpb1gsIHJhdGlvWV0sXG4gICAgICBpc0dyYXlzY2FsZTogZmFsc2UsIC8vIGNhbnZhcyByZWFkYmFjayBpcyBhbHdheXMgUkdCQVxuICAgICAgb3JpZ2luWDogdGwueCxcbiAgICAgIG9yaWdpblk6IHRsLnksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydFBpeGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbG9yIGEgZ3JheXNjYWxlIHRpbGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIExVVCwgdXNpbmcgT1NEJ3NcbiAgICogdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAoT1NEIDUrLzYpLiBNYXBzIGVhY2ggcGl4ZWwncyBncmF5c2NhbGVcbiAgICogdmFsdWUgKHI9PWc9PWIpIHRvIHRoZSBMVVQncyBSR0IuIE5vLW9wIGZvciBSR0IgaW1hZ2VzIG9yIHVudGlsIHRoZSBMVVQgaXNcbiAgICogYnVpbHQuIEhhbmRsZXIgaXMgYXN5bmMg4oCUIE9TRCBhd2FpdHMgaXQgKHJhaXNlRXZlbnRBd2FpdGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JUaWxlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGlzcGxheVRva2VuO1xuICAgIGNvbnN0IGdyYXkgPSB0aGlzLmlzR3JheXNjYWxlSW1hZ2U7XG4gICAgaWYgKGdyYXkpIHtcbiAgICAgIGlmICghdGhpcy5jb2xvckx1dCkgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzcGxheS5yZ2JOZWVkc1JlY29sb3IoKSkge1xuICAgICAgcmV0dXJuOyAvLyBSR0IgYXQgZGVmYXVsdCAoYWxsIHZpc2libGUsIGZ1bGwgd2luZG93LCDOsz0xLCBubyBpbnZlcnQpIOKGkiBwYXNzdGhyb3VnaFxuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHRpbGUncyBwaXhlbHMuIFByZWZlciB0aGUgcmVuZGVyaW5nIGNvbnRleHQsIGJ1dCBzb21lIHRpbGUgY2FjaGVzXG4gICAgLy8gKGFqYXggUE5HIGJsb2JzKSBjb252ZXJ0IHRvIGFuICplbXB0eSogY29udGV4dDJkIOKAlCByZWNvbG9yaW5nIHRoYXQgd291bGRcbiAgICAvLyBibGFuayB0aGUgdGlsZSAod2hpdGUgY2FudmFzKS4gU28gaWYgdGhlIGNvbnRleHQgaGFzIG5vIG9wYXF1ZSBwaXhlbHMsIGRyYXdcbiAgICAvLyB0aGUgdGlsZSdzIG93biBiaXRtYXAvaW1hZ2UgYW5kIHJlY29sb3IgdGhhdCBpbnN0ZWFkLiBXZSBuZXZlciB3cml0ZSBiYWNrXG4gICAgLy8gdW5sZXNzIHdlIGFjdHVhbGx5IHJlY29sb3JlZCBzb21ldGhpbmcsIHNvIGEgdGlsZSBpcyBuZXZlciBibGFua2VkLlxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHRyeSBiaXRtYXAgYmVsb3cgKi9cbiAgICB9XG4gICAgbGV0IGltZzogSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN0eCAmJiBjdHguY2FudmFzICYmIGN0eC5jYW52YXMud2lkdGggJiYgY3R4LmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGltZyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdGlsZSdzIGRlY29kZWQgaW1hZ2UvYml0bWFwLlxuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm9uZSAqL1xuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIG5vbmUgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuOyAvLyBjYW4ndCBnZXQgcGl4ZWxzIOKAlCBsZWF2ZSB0aGUgdGlsZSB1bnRvdWNoZWRcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSBzcmMud2lkdGg7XG4gICAgICBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1nLmRhdGEpIHx8ICFjdHgpIHJldHVybjsgLy8gbm90aGluZyBvcGFxdWVcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgaGFzIGFscmVhZHkgcmVzdG9yZWQgdGhpcyB0aWxlIOKAlCB3cml0aW5nIG5vdyB3b3VsZFxuICAgIC8vIGhhbmQgT1NEIGEgc3VwZXJzZWRlZCBjYW52YXMgYW5kIGRlc3Ryb3kgdGhlIGNhY2hlIHJlY29yZC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFRoZSB0aWxlJ3MgY2FjaGUgY2FuIHN0aWxsIGJlIGV2aWN0ZWQgYmV0d2VlbiB0aGUgYXdhaXRzIGFib3ZlIGFuZCBoZXJlIChhXG4gICAgLy8gc2xpY2UgY2hhbmdlKSwgbWFraW5nIHNldERhdGEgdGhyb3cgYSBET01FeGNlcHRpb24gb24gYSBkZWFkIGNhbnZhcy5cbiAgICAvLyBTd2FsbG93IGl0IOKAlCB0aGUgdGlsZSBpcyBnb25lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcmVjb2xvci5cbiAgICB0cnkgeyBhd2FpdCBldmVudC5zZXREYXRhKGN0eCwgJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogdGlsZSBldmljdGVkICovIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaW50IGEgc2luZ2xlIGNoYW5uZWwncyB0aWxlIGluIHBsYWNlLiBFYWNoIGNoYW5uZWwgaXMgaXRzIG93biBPcGVuU2VhZHJhZ29uXG4gICAqIFRpbGVkSW1hZ2UgKGEgc2luZ2xlLWJhbmQgZ3JheXNjYWxlIHRpbGUpOyBPU0QgY29tcG9zaXRlcyB0aGUgTiBpbWFnZXNcbiAgICogYWRkaXRpdmVseSAoJ2xpZ2h0ZXInKSBpbiBpdHMgZHJhd2VyIOKAlCBzbyB0aGlzIGp1c3QgbWFwcyB0aGUgdGlsZSdzIGludGVuc2l0eVxuICAgKiB0aHJvdWdoIHRoZSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hIGFuZCBpdHMgcHNldWRvLWNvbG91ci4gU3luY2hyb25vdXMgKG5vXG4gICAqIGNyb3NzLXRpbGUgZmV0Y2gpIOKGkiBubyByYWNlLCBubyBzZWFtcy4gQ2hhbm5lbCBpcyBwYXJzZWQgZnJvbSB0aGUgdGlsZSBVUkwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29sb3JDaGFubmVsVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCB0aWxlID0gZXZlbnQ/LnRpbGU7XG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSAodGlsZSAmJiAodHlwZW9mIHRpbGUuZ2V0VXJsID09PSAnZnVuY3Rpb24nID8gdGlsZS5nZXRVcmwoKSA6IHRpbGUudXJsKSkgfHwgJyc7XG4gICAgY29uc3QgbSA9IC9bPyZdY2hhbm5lbD0oXFxkKykvLmV4ZWModXJsKTtcbiAgICBjb25zdCBjaCA9IG0gPyBwYXJzZUludChtWzFdLCAxMCkgOiAwO1xuICAgIGNvbnN0IHN0ID0gdGhpcy5jaGFubmVsU3RhdGVzW2NoXTtcblxuICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7IGN0eCA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogZmFsbGJhY2sgYmVsb3cgKi8gfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkgeyBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsgfSBjYXRjaCB7IGltZyA9IG51bGw7IH1cbiAgICB9XG4gICAgaWYgKCFpbWcgfHwgIXRoaXMuaGFzT3BhcXVlKGltZy5kYXRhKSkge1xuICAgICAgbGV0IHNyYzogYW55ID0gbnVsbDtcbiAgICAgIHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlQml0bWFwJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHsgdHJ5IHsgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2UnKTsgfSBjYXRjaCB7IC8qIG5vbmUgKi8gfSB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoOyBjLmhlaWdodCA9IHNyYy5oZWlnaHQ7XG4gICAgICBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShzcmMsIDAsIDApO1xuICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgfVxuICAgIGlmICghY3R4KSByZXR1cm47XG5cbiAgICAvLyBQcmVjb21wdXRlIGx1bSgwLi4yNTUpIOKGkiB0aW50ZWQgUkdCIG9uY2UsIHRoZW4gbWFwIGVhY2ggcGl4ZWwgYnkgbG9va3VwIOKAlFxuICAgIC8vIHRoZSBjaGFubmVsIHRpbGUgaXMgc2luZ2xlLWJhbmQsIHNvIHRoaXMgdHVybnMgfjI2MmsgcGVyLXBpeGVsXG4gICAgLy8gY2hhbm5lbEludGVuc2l0eSgpICh3aXRoIE1hdGgucG93IGZvciBnYW1tYSkgY2FsbHMgaW50byAyNTYg4oCUIHRoZSBkaWZmZXJlbmNlXG4gICAgLy8gYmV0d2VlbiBhIHNuYXBweSBhbmQgYSBzbHVnZ2lzaCBzbGlkZXIgb24gYSA0LWNoYW5uZWwgc3RhY2suXG4gICAgY29uc3QgeyByOiByTCwgZzogZ0wsIGI6IGJMIH0gPSB0aGlzLmRpc3BsYXkuY2hhbm5lbFJnYkx1dChzdCk7XG4gICAgY29uc3QgZCA9IGltZy5kYXRhO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3QgciA9IGRbaV0sIGcgPSBkW2kgKyAxXSwgYiA9IGRbaSArIDJdO1xuICAgICAgY29uc3QgbHVtID0gciA+PSBnID8gKHIgPj0gYiA/IHIgOiBiKSA6IGcgPj0gYiA/IGcgOiBiOyAvLyBzaW5nbGUtYmFuZCDihpIgbWF4XG4gICAgICBkW2ldID0gckxbbHVtXTtcbiAgICAgIGRbaSArIDFdID0gZ0xbbHVtXTtcbiAgICAgIGRbaSArIDJdID0gYkxbbHVtXTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZWQpIHJldHVybjtcbiAgICAvLyBBIG5ld2VyIGRpc3BsYXkgcm91bmQgKHRoZSBuZXh0IHRpY2sgb2YgYSBzbGlkZXIgZHJhZykgaGFzIGFscmVhZHkgcmVzdG9yZWRcbiAgICAvLyB0aGlzIHRpbGUuIFdyaXRpbmcgYSBzdXBlcnNlZGVkIGNvbnRleHQgYmFjayBtYWtlcyBPU0QncyBjb252ZXJzaW9uIHRocm93XG4gICAgLy8gRE9NRXhjZXB0aW9uLCB3aGljaCBkZXN0cm95cyB0aGUgY2FjaGUgcmVjb3JkIGFuZCB1bmxvYWRzIHRoZSB0aWxlIOKAlCBkb1xuICAgIC8vIG5vdGhpbmcgYW5kIGxldCB0aGUgbmV3ZXIgcm91bmQgcmVwYWludCBpdC5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuZGlzcGxheVRva2VuKSByZXR1cm47XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIC8vIFNlZSByZWNvbG9yVGlsZTogdGhlIHRpbGUgY2FjaGUgY2FuIHN0aWxsIGRpZSBiZXR3ZWVuIHRoZSBhd2FpdHMgYW5kIGhlcmUuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKiogUGVyLWNoYW5uZWwgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSwgZnJvbSB0aGUgY3VycmVudFxuICAgKiAgc2xpY2UncyBzYW1wbGVkIHRpbGVzIChncmF5c2NhbGUg4oaSIGNoYW5uZWwgMDsgUkdCIOKGkiBSL0cvQikuIE51bGwgdW50aWwgdGhlXG4gICAqICBhc3luYyBzYW1wbGluZyByZXNvbHZlcyBvciBpZiBpdCB3YXMgc2tpcHBlZC4gKi9cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBfYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZXIuZ2V0KHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCk7XG4gIH1cblxuICAvKiogTmF0aXZlIGJpdCBkZXB0aCBvZiBhIGNoYW5uZWwgZnJvbSB0aGUgdGlsZSBkZXNjcmlwdG9yICg4IHdoZW4gdW5rbm93bikuICovXG4gIHByaXZhdGUgY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgaGlzdG9ncmFtIGZvciB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZS4gRm9yID44LWJpdCBpbWFnZXMgaXRcbiAgICogZmV0Y2hlcyB0aGUgKipuYXRpdmUqKiBkaXN0cmlidXRpb24gZnJvbSB0aGUgc2VydmVyIGAvaGlzdG9ncmFtYCBlbmRwb2ludFxuICAgKiAodGhlIDgtYml0IGNhbnZhcyB0aWxlcyBjYW4ndCBjYXJyeSAxNi1iaXQgdmFsdWVzKSBhbmQgY2FjaGVzIGl0IHBlclxuICAgKiBzbGljZStjaGFubmVsOyBmb3IgOC1iaXQvUkdCIGl0IHJldHVybnMgdGhlIGV4aXN0aW5nIGNsaWVudC1zYW1wbGVkIDgtYml0XG4gICAqIGhpc3RvZ3JhbS4gUmVhZC1vbmx5IOKAlCBpdCBuZXZlciB0b3VjaGVzIHRoZSB0aWxlL2Rpc3BsYXkgcGlwZWxpbmUuXG4gICAqL1xuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuY2hhbm5lbEJpdERlcHRoKGNoYW5uZWxJbmRleCkgPD0gOCB8fCAhdGhpcy5pbmZvQjY0KSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNhbXBsZXIubmF0aXZlJCh0aGlzLmluZm9CNjQsIHRoaXMuY3VycmVudFosIGNoYW5uZWxJbmRleCwgYmlucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGltYWdlIGRhdGEgYXMgYSBkYXRhLXByZXNlcnZpbmcgbXVsdGktYmFuZCBUSUZGIGF0XG4gICAqIG5hdGl2ZSBiaXQgZGVwdGggdmlhIGBHRVQgL2V4cG9ydC90aWZmYCAodGhlIHNlcnZlciByZWFkcyB0aGUgcmF3IDE2LWJpdFxuICAgKiBwbGFuZXMg4oCUIHRoZSBjbGllbnQgbmV2ZXIgc2VlcyB0aGVtKS4gU2VuZHMgb25seSB0aGUgdmlzaWJsZSBjaGFubmVsczsgdGhlXG4gICAqIGV4aXN0aW5nIDgtYml0IGNvbXBvc2l0ZSBQTkcgZXhwb3J0IGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBhc3luYyBleHBvcnREYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY2hhbm5lbFN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoO1xuICAgIC8vIE9taXQgYGNoYW5uZWxzYCB3aGVuIGV2ZXJ5IGNoYW5uZWwgaXMgdmlzaWJsZSAoc2VydmVyIGRlZmF1bHQgPSBhbGwpLlxuICAgIGNvbnN0IGNoUGFyYW0gPVxuICAgICAgdmlzaWJsZS5sZW5ndGggJiYgdmlzaWJsZS5sZW5ndGggPCBhbGwgPyBgJmNoYW5uZWxzPSR7dmlzaWJsZS5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWV4cG9ydC90aWZmP2luZm89JHt0aGlzLmluZm9CNjR9Jno9JHt0aGlzLmN1cnJlbnRafSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQodXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pXG4gICAgICAgICAgLnBpcGUodGltZW91dCg2MDAwMDApKSwgLy8gbGFyZ2UgZXhwb3J0cyBzdHJlYW0gc2xvd2x5OyBnZW5lcm91cyBkZWFkbGluZVxuICAgICAgKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IGV4cG9ydDogZmlsZSBzdGlsbCBjYWNoaW5nIOKAlCB0cnkgYWdhaW4gc2hvcnRseS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYmxvYiA9IHJlc3AuYm9keTtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IHRoZSBjdXJyZW50IHNsaWNlIGFzIGEgcHVibGljYXRpb24tcmVhZHkgUE5HIGNvbXBvc2l0ZWQgd2l0aCB0aGVcbiAgICogYWN0aXZlIGRpc3BsYXkgc2V0dGluZ3MgKHdpbmRvdyAvIGdhbW1hIC8gY29sb3JtYXAgb3IgcGVyLWNoYW5uZWwgcHNldWRvLVxuICAgKiBjb2xvdXJzIC8gaW52ZXJ0KS4gUGlja3MgdGhlIGxhcmdlc3QgcHlyYW1pZCBsZXZlbCB1bmRlciBhIHBpeGVsIGNhcCAodGhlXG4gICAqIGNvYXJzZXIgb3ZlcnZpZXcgZm9yIGh1Z2Ugd2hvbGUtc2xpZGVzKSwgZmV0Y2hlcyB0aGF0IGxldmVsJ3MgdGlsZSBncmlkLFxuICAgKiBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMsIHJ1bnMgdGhlIHNoYXJlZCBkaXNwbGF5IHBpcGVsaW5lLCBhbmQgc2F2ZXMgaXQuXG4gICAqL1xuICBhc3luYyBleHBvcnRDb21wb3NpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVzYyA9IHRoaXMuZGVzY3JpcHRvcjtcbiAgICBjb25zdCBsZXZlbHMgPSBkZXNjPy5sZXZlbHMgPz8gW107XG4gICAgaWYgKCFkZXNjIHx8ICF0aGlzLmluZm9CNjQgfHwgIWxldmVscy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBDQVAgPSAzMl8wMDBfMDAwOyAvLyB+MzIgTVAg4oCUIGJvdW5kcyBtZW1vcnkgZm9yIHdob2xlLXNsaWRlIGltYWdlc1xuICAgIGxldCByZXMgPSBsZXZlbHMubGVuZ3RoIC0gMTsgLy8gY29hcnNlc3QgZmFsbGJhY2tcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxldmVsc1tpXS53aWR0aCAqIGxldmVsc1tpXS5oZWlnaHQgPD0gQ0FQKSB7IHJlcyA9IGk7IGJyZWFrOyB9XG4gICAgfVxuICAgIGNvbnN0IGx3ID0gbGV2ZWxzW3Jlc10ud2lkdGg7XG4gICAgY29uc3QgbGggPSBsZXZlbHNbcmVzXS5oZWlnaHQ7XG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemU7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsdyAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxoIC8gdCkpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGx3O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBsaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIGNvbnN0IHogPSB0aGlzLmN1cnJlbnRaO1xuICAgIGNvbnN0IGpvYnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykge1xuICAgICAgICBjb25zdCB1cmwgPSBidWlsZFRpbGVVcmwodGhpcy5hcGksIHRoaXMuaW5mb0I2NCwgeyByZXMsIGNvbCwgcm93LCB6LCB0aWxlU2l6ZTogdCB9KTtcbiAgICAgICAgam9icy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGVCaXRtYXAodGhpcy5odHRwLCB1cmwsIDMwMDAwKTtcbiAgICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYSBmYWlsZWQgdGlsZSDigJQgdGhlIGV4cG9ydGVkIGNvbXBvc2l0ZSBoYXMgYSBnYXAgdGhlcmUuXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSB0aWxlIGZldGNoIGZhaWxlZCwgc2tpcHBpbmcnLCB1cmwsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoam9icyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgbHcsIGxoKTtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXkuYXBwbHlUb1JnYmEoaW1hZ2VEYXRhLmRhdGEpKSBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBLZWVwIHRoZSB1bi1yZWNvbG9yZWQgY29tcG9zaXRlIGlmIHJlYWRiYWNrIGZhaWxzIOKAlCBidXQgc2F5IHdoeS5cbiAgICAgIGNvbnNvbGUud2FybignW3ZpejpleHBvcnRdIGNvbXBvc2l0ZSByZWNvbG9yIHJlYWRiYWNrIGZhaWxlZCDigJQgZXhwb3J0aW5nIHJhdyB0aWxlcycsIGVycik7XG4gICAgfVxuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5jdXJyZW50RmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSBzYXZlQXMoYmxvYiwgYCR7c3RlbX1fY29tcG9zaXRlLnBuZ2ApO1xuICAgIH0sICdpbWFnZS9wbmcnKTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBwaXhlbCBpbiB0aGUgUkdCQSBidWZmZXIgaXMgbm9uLXRyYW5zcGFyZW50LiAqL1xuICBwcml2YXRlIGhhc09wYXF1ZShkOiBVaW50OENsYW1wZWRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaV0gIT09IDApIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyDilIDilIAgSURpc3BsYXlPcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gVmlzdWFsaXplclN0b3JlLCBzbyBPU0QgYW5kIFBsb3RseSBzdGF5IGluIGxvY2stc3RlcC4gT1NEIGFwcGxpZXMgdGhlXG4gIC8vIGNvbG9ybWFwIHRvIGdyYXlzY2FsZSB0aWxlcyB2aWEgdGhlIExVVCByZWFjdGl2ZWx5IChzZWUgdGhlIGNvbnN0cnVjdG9yJ3NcbiAgLy8gY29sb3JtYXAgc3Vic2NyaXB0aW9uKSwgbm90IGluIHNldENvbG9ybWFwLlxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcm1hcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbG9ybWFwU3ViID0gbnVsbDtcbiAgICAvLyBEcm9wIGEgcXVldWVkIGludmFsaWRhdGlvbiBzbyBpdCBjYW4ndCBmaXJlIGFnYWluc3QgYSB0b3JuLWRvd24gdmlld2VyLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbicpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaW52YWxpZGF0ZUhhbmRsZSk7XG4gICAgICBlbHNlIGNsZWFyVGltZW91dCh0aGlzLmludmFsaWRhdGVIYW5kbGUgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pik7XG4gICAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lWaWV3ZXIoKTtcbiAgfVxufVxuIl19
|