@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OSD } from './osd-lib';
|
|
1
|
+
import { OSD, quiet } from './osd-lib';
|
|
2
2
|
export class SliceCache {
|
|
3
3
|
constructor(host) {
|
|
4
4
|
this.host = host;
|
|
@@ -47,8 +47,7 @@ export class SliceCache {
|
|
|
47
47
|
* grid is too large (its slices only exist at full resolution). */
|
|
48
48
|
configure(stackDepth, coarseFitTiles) {
|
|
49
49
|
this.skipSlicePrefetch = coarseFitTiles > this.MAX_PREFETCH_FIT_TILES;
|
|
50
|
-
this.maxCachedSlices =
|
|
51
|
-
stackDepth > 1 ? Math.min(this.MAX_CACHED_SLICES_CAP, stackDepth) : 1;
|
|
50
|
+
this.maxCachedSlices = stackDepth > 1 ? Math.min(this.MAX_CACHED_SLICES_CAP, stackDepth) : 1;
|
|
52
51
|
}
|
|
53
52
|
/** Current LRU cap (the viewer sizes its tile cache from it). */
|
|
54
53
|
maxSlices() {
|
|
@@ -58,6 +57,28 @@ export class SliceCache {
|
|
|
58
57
|
clearChannelGroups() {
|
|
59
58
|
this.channelSliceItems.clear();
|
|
60
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Take over the slice the viewer just opened (world item 0). Composite: seed
|
|
62
|
+
* the cache with it, so scrubbing back to it later is an instant opacity
|
|
63
|
+
* toggle, not a re-open. Multichannel: drop that single (channel-0) image and
|
|
64
|
+
* add the slice's channel group instead; the background loader / LRU then
|
|
65
|
+
* pre-fills the other slices' groups so z-scrub is flicker-free.
|
|
66
|
+
*/
|
|
67
|
+
adoptOpenedSlice(z) {
|
|
68
|
+
const viewer = this.host.viewer();
|
|
69
|
+
if (this.host.isMultiChannel()) {
|
|
70
|
+
quiet(() => {
|
|
71
|
+
const it0 = viewer?.world?.getItemAt?.(0);
|
|
72
|
+
if (viewer && it0)
|
|
73
|
+
viewer.world.removeItem(it0);
|
|
74
|
+
});
|
|
75
|
+
this.addChannelSlice(z);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const firstItem = viewer?.world?.getItemAt?.(0);
|
|
79
|
+
if (firstItem)
|
|
80
|
+
this.seedComposite(z, firstItem);
|
|
81
|
+
}
|
|
61
82
|
/** Seed the cache with the just-opened composite slice (world item 0), so
|
|
62
83
|
* scrubbing back to it later is an instant opacity toggle, not a re-open. */
|
|
63
84
|
seedComposite(z, item) {
|
|
@@ -107,6 +128,9 @@ export class SliceCache {
|
|
|
107
128
|
this.addChannelSlice(z);
|
|
108
129
|
return;
|
|
109
130
|
}
|
|
131
|
+
const viewer = this.host.viewer();
|
|
132
|
+
if (!viewer)
|
|
133
|
+
return;
|
|
110
134
|
this.slicesLoading.add(z);
|
|
111
135
|
// Tag this add to the current image; if the user switches images before it
|
|
112
136
|
// resolves, the stale callback is dropped (the add belongs to the old stack).
|
|
@@ -114,7 +138,7 @@ export class SliceCache {
|
|
|
114
138
|
const ts = this.host.buildTileSource(z);
|
|
115
139
|
try {
|
|
116
140
|
// addTiledImage lives on the Viewer (it queues the add into the world).
|
|
117
|
-
|
|
141
|
+
viewer.addTiledImage({
|
|
118
142
|
tileSource: ts,
|
|
119
143
|
x: 0,
|
|
120
144
|
y: 0,
|
|
@@ -129,10 +153,7 @@ export class SliceCache {
|
|
|
129
153
|
// Image switched while this was adding — drop the orphan so it stops
|
|
130
154
|
// loading instead of streaming tiles for the abandoned stack.
|
|
131
155
|
if (item) {
|
|
132
|
-
|
|
133
|
-
this.host.viewer()?.world?.removeItem(item);
|
|
134
|
-
}
|
|
135
|
-
catch { /* gone */ }
|
|
156
|
+
quiet(() => this.host.viewer()?.world?.removeItem(item));
|
|
136
157
|
}
|
|
137
158
|
return;
|
|
138
159
|
}
|
|
@@ -173,6 +194,9 @@ export class SliceCache {
|
|
|
173
194
|
return;
|
|
174
195
|
if (this.channelSliceItems.has(z) || this.slicesLoading.has(z))
|
|
175
196
|
return;
|
|
197
|
+
const viewer = this.host.viewer();
|
|
198
|
+
if (!viewer)
|
|
199
|
+
return;
|
|
176
200
|
this.slicesLoading.add(z);
|
|
177
201
|
const token = this.sliceLoadToken;
|
|
178
202
|
const n = this.host.channelCount();
|
|
@@ -195,9 +219,11 @@ export class SliceCache {
|
|
|
195
219
|
};
|
|
196
220
|
for (let c = 0; c < n; c++) {
|
|
197
221
|
try {
|
|
198
|
-
|
|
222
|
+
viewer.addTiledImage({
|
|
199
223
|
tileSource: this.host.buildTileSource(z, c),
|
|
200
|
-
x: 0,
|
|
224
|
+
x: 0,
|
|
225
|
+
y: 0,
|
|
226
|
+
width: 1,
|
|
201
227
|
opacity: 0, // revealed by revealChannelSlice once the group is in
|
|
202
228
|
compositeOperation: 'lighter',
|
|
203
229
|
preload: true,
|
|
@@ -205,10 +231,7 @@ export class SliceCache {
|
|
|
205
231
|
const item = e?.item;
|
|
206
232
|
if (token !== this.sliceLoadToken) {
|
|
207
233
|
if (item) {
|
|
208
|
-
|
|
209
|
-
this.host.viewer()?.world?.removeItem(item);
|
|
210
|
-
}
|
|
211
|
-
catch { /* gone */ }
|
|
234
|
+
quiet(() => this.host.viewer()?.world?.removeItem(item));
|
|
212
235
|
}
|
|
213
236
|
return;
|
|
214
237
|
}
|
|
@@ -234,20 +257,14 @@ export class SliceCache {
|
|
|
234
257
|
if (!it)
|
|
235
258
|
return;
|
|
236
259
|
const visible = this.host.channelVisible(c);
|
|
237
|
-
|
|
238
|
-
it.setOpacity(active && visible ? 1 : 0);
|
|
239
|
-
}
|
|
240
|
-
catch { /* gone */ }
|
|
260
|
+
quiet(() => it.setOpacity(active && visible ? 1 : 0));
|
|
241
261
|
});
|
|
242
262
|
}
|
|
243
263
|
}
|
|
244
264
|
/** Show the given composite slice (opacity 1) and hide all other cached slices. */
|
|
245
265
|
showOnlySlice(z) {
|
|
246
266
|
for (const [zz, item] of this.sliceItems) {
|
|
247
|
-
|
|
248
|
-
item.setOpacity(zz === z ? 1 : 0);
|
|
249
|
-
}
|
|
250
|
-
catch { /* item gone */ }
|
|
267
|
+
quiet(() => item.setOpacity(zz === z ? 1 : 0));
|
|
251
268
|
}
|
|
252
269
|
}
|
|
253
270
|
// ── display invalidation (multichannel) ───────────────────────────────
|
|
@@ -271,14 +288,11 @@ export class SliceCache {
|
|
|
271
288
|
const group = this.channelSliceItems.get(z) ?? [];
|
|
272
289
|
if (!group.length)
|
|
273
290
|
return;
|
|
274
|
-
|
|
275
|
-
const tStamp = typeof
|
|
291
|
+
// Feature-tested: a mocked OSD module (specs) may not provide it.
|
|
292
|
+
const tStamp = typeof OSD.now === 'function' ? OSD.now() : Date.now();
|
|
276
293
|
for (const it of group) {
|
|
277
294
|
if (it && typeof it.requestInvalidate === 'function') {
|
|
278
|
-
|
|
279
|
-
it.requestInvalidate(true, false, tStamp);
|
|
280
|
-
}
|
|
281
|
-
catch { /* gone */ }
|
|
295
|
+
quiet(() => it.requestInvalidate?.(true, false, tStamp));
|
|
282
296
|
}
|
|
283
297
|
}
|
|
284
298
|
}
|
|
@@ -341,8 +355,11 @@ export class SliceCache {
|
|
|
341
355
|
for (let d = 0; d < sliceCount; d++) {
|
|
342
356
|
const candidates = d === 0 ? [cur] : [cur - d, cur + d];
|
|
343
357
|
for (const z of candidates) {
|
|
344
|
-
if (z >= 0 &&
|
|
345
|
-
|
|
358
|
+
if (z >= 0 &&
|
|
359
|
+
z < sliceCount &&
|
|
360
|
+
!this.sliceCacheHas(z) &&
|
|
361
|
+
!this.slicesLoading.has(z) &&
|
|
362
|
+
!this.bgAttempted.has(z)) {
|
|
346
363
|
return z;
|
|
347
364
|
}
|
|
348
365
|
}
|
|
@@ -379,10 +396,7 @@ export class SliceCache {
|
|
|
379
396
|
if (z === cur)
|
|
380
397
|
continue;
|
|
381
398
|
this.sliceItems.delete(z);
|
|
382
|
-
|
|
383
|
-
v.world.removeItem(item);
|
|
384
|
-
}
|
|
385
|
-
catch { /* already gone */ }
|
|
399
|
+
quiet(() => v.world.removeItem(item));
|
|
386
400
|
}
|
|
387
401
|
for (const [z, group] of [...this.channelSliceItems]) {
|
|
388
402
|
if (z === cur)
|
|
@@ -390,10 +404,7 @@ export class SliceCache {
|
|
|
390
404
|
this.channelSliceItems.delete(z);
|
|
391
405
|
for (const it of group) {
|
|
392
406
|
if (it) {
|
|
393
|
-
|
|
394
|
-
v.world.removeItem(it);
|
|
395
|
-
}
|
|
396
|
-
catch { /* gone */ }
|
|
407
|
+
quiet(() => v.world.removeItem(it));
|
|
397
408
|
}
|
|
398
409
|
}
|
|
399
410
|
}
|
|
@@ -428,10 +439,7 @@ export class SliceCache {
|
|
|
428
439
|
if (group && v)
|
|
429
440
|
for (const it of group) {
|
|
430
441
|
if (it) {
|
|
431
|
-
|
|
432
|
-
v.world.removeItem(it);
|
|
433
|
-
}
|
|
434
|
-
catch { /* gone */ }
|
|
442
|
+
quiet(() => v.world.removeItem(it));
|
|
435
443
|
}
|
|
436
444
|
}
|
|
437
445
|
}
|
|
@@ -439,17 +447,14 @@ export class SliceCache {
|
|
|
439
447
|
const item = this.sliceItems.get(z);
|
|
440
448
|
this.sliceItems.delete(z);
|
|
441
449
|
if (item && v) {
|
|
442
|
-
|
|
443
|
-
v.world.removeItem(item);
|
|
444
|
-
}
|
|
445
|
-
catch { /* gone */ }
|
|
450
|
+
quiet(() => v.world.removeItem(item));
|
|
446
451
|
}
|
|
447
452
|
}
|
|
448
453
|
}
|
|
449
454
|
/** Is the tiled image still in the world (not evicted)? */
|
|
450
455
|
sliceInWorld(item) {
|
|
451
456
|
try {
|
|
452
|
-
return this.host.viewer()
|
|
457
|
+
return (this.host.viewer()?.world.getIndexOfItem(item) ?? -1) >= 0;
|
|
453
458
|
}
|
|
454
459
|
catch {
|
|
455
460
|
return false;
|
|
@@ -485,4 +490,4 @@ export class SliceCache {
|
|
|
485
490
|
this.bgAttempted.clear();
|
|
486
491
|
}
|
|
487
492
|
}
|
|
488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvc2xpY2UtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlDaEMsTUFBTSxPQUFPLFVBQVU7SUF1Q3JCLFlBQW9CLElBQW9CO1FBQXBCLFNBQUksR0FBSixJQUFJLENBQWdCO1FBdEN4QyxxRUFBcUU7UUFDN0QsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDNUM7O2lEQUV5QztRQUNqQyxzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztRQUNyRDs4RUFDc0U7UUFDOUQsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3hDLHVEQUF1RDtRQUMvQyxhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLDBFQUEwRTtRQUNsRSxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDMUM7a0ZBQzBFO1FBQ2xFLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQzNCOzs2REFFcUQ7UUFDN0MsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDekM7dURBQytDO1FBQ3ZDLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLGdGQUFnRjtRQUN4RSxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsdUVBQXVFO1FBQy9ELG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLGdGQUFnRjtRQUMvRCwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDNUM7Ozt5QkFHaUI7UUFDQSwyQkFBc0IsR0FBRyxHQUFHLENBQUM7UUFDOUMsNERBQTREO1FBQ3BELHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFRLElBQUksQ0FBQztJQUVTLENBQUM7SUFFNUMseUVBQXlFO0lBRXpFOzs7d0VBR29FO0lB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Q0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDdEQsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFBRSxNQUFNO1lBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5cbi8qKlxuICogU3RhY2stc2xpY2UgY2FjaGUgZm9yIHRoZSBPcGVuU2VhZHJhZ29uIGJhY2tlbmQgKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgMyDigJRcbiAqIGEgcHVyZSBtb3ZlIG9mIHRoZSBjYWNoZSBjbHVzdGVyIG91dCBvZiB0aGUgdmlzdWFsaXplciBzZXJ2aWNlKS5cbiAqXG4gKiBTY3J1YmJpbmcgdGhlIHotc2xpZGVyIHVzZWQgdG8gdmlld2VyLm9wZW4oKSBhIGZyZXNoIHRpbGUgc291cmNlIHBlciBzbGljZSxcbiAqIHdoaWNoIGRlc3Ryb3lzIHRoZSBjdXJyZW50IHRpbGVkIGltYWdlIChhbmQgaXRzIGRlY29kZWQrcmVjb2xvcmVkIHRpbGVzKSwgc29cbiAqIHJldmlzaXRpbmcgYSBzbGljZSByZS1mZXRjaGVkIGV2ZXJ5dGhpbmcuIEluc3RlYWQgd2Uga2VlcCBlYWNoIHZpc2l0ZWQgc2xpY2VcbiAqIGFzIGl0cyBvd24gdGlsZWQgaW1hZ2UgaW4gdGhlIHdvcmxkIGFuZCBqdXN0IHRvZ2dsZSBvcGFjaXR5IOKAlCBhIHJldmlzaXRlZFxuICogc2xpY2UgaXMgaW5zdGFudCAobm8gbmV0d29yaywgbm8gcmUtZGVjb2RlLCBubyByZS1yZWNvbG9yKS4gQm91bmRlZCBieSBhblxuICogTFJVIHNvIGRlZXAgc3RhY2tzIGRvbid0IGdyb3cgd2l0aG91dCBsaW1pdC4gTXVsdGljaGFubmVsIHNsaWNlcyBjYWNoZSBvbmVcbiAqIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwgKGFkZGl0aXZlbHkgY29tcG9zaXRlZCk7IGNvbXBvc2l0ZSBzbGljZXMgY2FjaGUgb25lLlxuICogQSBiYWNrZ3JvdW5kIGxvYWRlciBwcmUtZmlsbHMgdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLCBvbmUgc2xpY2UgYXQgYSB0aW1lLFxuICogeWllbGRpbmcgdG8gdGhlIHZpc2libGUgc2xpY2Ugc28gb24tc2NyZWVuIHRpbGVzIGFsd2F5cyB3aW4gdGhlIGNvbm5lY3Rpb24uXG4gKi9cblxuLyoqIFdoYXQgdGhlIGNhY2hlIG5lZWRzIGZyb20gdGhlIHZpc3VhbGl6ZXIgc2VydmljZS4gQWxsIGFjY2Vzc29ycyBhcmUgbGl2ZVxuICogIChjYWxsZWQgYXQgdXNlIHRpbWUsIG5ldmVyIGNhcHR1cmVkKSBzbyB0aGUgY2FjaGUgYWx3YXlzIHNlZXMgdGhlIGN1cnJlbnRcbiAqICB2aWV3ZXIvZGVzY3JpcHRvci96IOKAlCBtYXRjaGluZyB0aGUgZmllbGQgcmVhZHMgaXQgcmVwbGFjZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlQ2FjaGVIb3N0IHtcbiAgLyoqIFRoZSBtb3VudGVkIHZpZXdlciwgb3IgbnVsbC4gKi9cbiAgdmlld2VyKCk6IGFueSB8IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gYSB2aWV3ZXIsIGRlc2NyaXB0b3IgYW5kIGluZm9CNjQgYXJlIGFsbCBwcmVzZW50LiAqL1xuICBoYXNJbWFnZSgpOiBib29sZWFuO1xuICAvKiogU3RhY2sgZGVwdGggKGRlc2NyaXB0b3IueiwgMSBmb3Igc2luZ2xlIGltYWdlcykuICovXG4gIHNsaWNlQ291bnQoKTogbnVtYmVyO1xuICAvKiogVGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgei1zbGljZS4gKi9cbiAgY3VycmVudFooKTogbnVtYmVyO1xuICAvKiogUGVyLWNoYW5uZWwgcmVuZGVyaW5nIChtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlKSB2cyBjb21wb3NpdGUuICovXG4gIGlzTXVsdGlDaGFubmVsKCk6IGJvb2xlYW47XG4gIC8qKiBDaGFubmVsIGNvdW50IGZvciBhIG11bHRpY2hhbm5lbCBncm91cCBhZGQuICovXG4gIGNoYW5uZWxDb3VudCgpOiBudW1iZXI7XG4gIC8qKiBDaGFubmVsIHZpc2liaWxpdHkgKGRyaXZlcyBncm91cCByZXZlYWwgb3BhY2l0eSkuICovXG4gIGNoYW5uZWxWaXNpYmxlKGM6IG51bWJlcik6IGJvb2xlYW47XG4gIC8qKiBUaWxlIHNvdXJjZSBmb3Igc2xpY2UgeiAob3B0aW9uYWxseSBvbmUgY2hhbm5lbCkuICovXG4gIGJ1aWxkVGlsZVNvdXJjZSh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpOiBhbnk7XG4gIC8qKiBBIGNvbXBvc2l0ZSBzbGljZSBsYW5kZWQgaW4gdGhlIHdvcmxkIOKAlCB0aGUgc2VydmljZSBzYW1wbGVzIGl0cyB3aW5kb3cuICovXG4gIG9uQ29tcG9zaXRlU2xpY2VBZGRlZCh6OiBudW1iZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgU2xpY2VDYWNoZSB7XG4gIC8qKiB6LXNsaWNlIOKGkiBpdHMgVGlsZWRJbWFnZSBpbiB0aGUgdmlld2VyIHdvcmxkIChjb21wb3NpdGUgcGF0aCkuICovXG4gIHByaXZhdGUgc2xpY2VJdGVtcyA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XG4gIC8qKiBNdWx0aWNoYW5uZWwgcGVyLXNsaWNlIGNhY2hlOiB6IOKGkiB0aGUgTiBjaGFubmVsIFRpbGVkSW1hZ2VzIGZvciB0aGF0IHNsaWNlXG4gICAqICAoYWRkaXRpdmVseSBjb21wb3NpdGVkIGJ5IE9TRDsgaW5kZXggPSBjaGFubmVsKS4gT25seSB0aGUgYWN0aXZlIHNsaWNlJ3NcbiAgICogIHZpc2libGUgY2hhbm5lbHMgaGF2ZSBvcGFjaXR5ID4gMC4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsU2xpY2VJdGVtcyA9IG5ldyBNYXA8bnVtYmVyLCBhbnlbXT4oKTtcbiAgLyoqIENhY2hlZCBtdWx0aWNoYW5uZWwgc2xpY2VzIHdob3NlIHRpbGVzIHdlcmUgdGludGVkIGJlZm9yZSB0aGUgbGF0ZXN0XG4gICAqICBkaXNwbGF5IGNoYW5nZTsgcmUtdGludGVkIGxhemlseSB3aGVuIG5leHQgcmV2ZWFsZWQgYnkgei1zY3J1Yi4gKi9cbiAgcHJpdmF0ZSBzdGFsZVNsaWNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAvKiogTW9zdC1yZWNlbnRseS1zaG93biB6IGxhc3Q7IGRyaXZlcyBMUlUgZXZpY3Rpb24uICovXG4gIHByaXZhdGUgc2xpY2VMcnU6IG51bWJlcltdID0gW107XG4gIC8qKiB6LXNsaWNlcyB3aG9zZSB0aWxlZCBpbWFnZSBpcyBiZWluZyBhZGRlZCAoZGVkdXBlIHJhcGlkIHNjcnViYmluZykuICovXG4gIHByaXZhdGUgc2xpY2VzTG9hZGluZyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAvKiogQnVtcGVkIHdoZW5ldmVyIHRoZSBsb2FkZWQgaW1hZ2UgY2hhbmdlczsgaW4tZmxpZ2h0IGJhY2tncm91bmQgc2xpY2UgYWRkc1xuICAgKiAgY2FwdHVyZWQgdW5kZXIgYW4gb2xkZXIgdG9rZW4gYXJlIGRyb3BwZWQgKGNhbmNlbGxlZCBpbWFnZSBzd2l0Y2gpLiAqL1xuICBwcml2YXRlIHNsaWNlTG9hZFRva2VuID0gMDtcbiAgLyoqIFRoZSBzbGljZSB0aGUgYmFja2dyb3VuZCBsb2FkZXIgaXMgY3VycmVudGx5IHdhaXRpbmcgb24gKGl0cyB0aWxlcyBhcmVcbiAgICogIHN0aWxsIHN0cmVhbWluZyk6IGFkZFRpbGVkSW1hZ2UgJ3N1Y2Nlc3MnIGZpcmVzIG9uIGFkZCwgbm90IG9uIHRpbGUgbG9hZCxcbiAgICogIHNvIHdlIGdhdGUgdGhlIG5leHQgc2xpY2Ugb24gZ2V0RnVsbHlMb2FkZWQoKS4gKi9cbiAgcHJpdmF0ZSBiZ0xvYWRpbmdaOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZW4gYmdMb2FkaW5nWiBzdGFydGVkIGxvYWRpbmcg4oCUIGEgZmFsbGJhY2sgc28gYSBzbG93L3N0dWNrIHNsaWNlIGNhbid0XG4gICAqICBzdGFsbCB0aGUgd2hvbGUgYmFja2dyb3VuZCBwYXNzIGZvcmV2ZXIuICovXG4gIHByaXZhdGUgYmdMb2FkaW5nU2luY2UgPSAwO1xuICAvKiogU2xpY2VzIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBoYXMgYWxyZWFkeSBhdHRlbXB0ZWQgKG5vIHRpZ2h0IHJldHJ5IGxvb3ApLiAqL1xuICBwcml2YXRlIGJnQXR0ZW1wdGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBNYXggY2FjaGVkIHNsaWNlIHRpbGVkIGltYWdlcyBrZXB0IHJlc2lkZW50IGJlZm9yZSBMUlUgZXZpY3Rpb24uICovXG4gIHByaXZhdGUgbWF4Q2FjaGVkU2xpY2VzID0gODtcbiAgLyoqIFVwcGVyIGJvdW5kIG9uIHJlc2lkZW50IHNsaWNlcywgcmVnYXJkbGVzcyBvZiBzdGFjayBkZXB0aCAobWVtb3J5IGd1YXJkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQ0FDSEVEX1NMSUNFU19DQVAgPSA2NDtcbiAgLyoqIEZpdC12aWV3IHRpbGUgYnVkZ2V0IGFib3ZlIHdoaWNoIGJhY2tncm91bmQgcHJlbG9hZGluZyBpcyBza2lwcGVkOiBhIGh1Z2VcbiAgICogIG5vLXB5cmFtaWQgc3RhY2sgd291bGQgcHJlbG9hZCBldmVyeSBzbGljZSBhdCBmdWxsIHJlc29sdXRpb24gYW5kXG4gICAqICBmbG9vZC90aW1lb3V0LiBOb3JtYWwgc3RhY2tzIHN0YXkgYmVsb3cgaXQgYW5kIEtFRVAgdGhlIGZsaWNrZXItZnJlZVxuICAgKiAgcHJlLWNhY2hlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9QUkVGRVRDSF9GSVRfVElMRVMgPSAyNTY7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIHN0YWNrcyB0b28gbGFyZ2UgdG8gYmFja2dyb3VuZC1wcmVsb2FkLiAqL1xuICBwcml2YXRlIHNraXBTbGljZVByZWZldGNoID0gZmFsc2U7XG4gIHByaXZhdGUgcHJlZmV0Y2hUaW1lcjogYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhvc3Q6IFNsaWNlQ2FjaGVIb3N0KSB7fVxuXG4gIC8vIOKUgOKUgCBjb25maWd1cmF0aW9uIChwZXIgaW1hZ2UsIGZyb20gcGxvdCgpKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogU2l6ZSB0aGUgY2FjaGUgZm9yIHRoZSBsb2FkZWQgaW1hZ2U6IGtlZXAgdGhlIHdob2xlIHN0YWNrIHJlc2lkZW50XG4gICAqICAoY2FwcGVkKSBzbyB0aGUgYmFja2dyb3VuZCBsb2FkZXIgZmlsbHMgZXZlcnkgc2xpY2Ugd2l0aG91dCBldmljdGluZ1xuICAgKiAgaXRzZWxmOyBza2lwIHByZWxvYWRpbmcgZW50aXJlbHkgd2hlbiBldmVuIHRoZSBjb2Fyc2VzdCBsZXZlbCdzIHRpbGVcbiAgICogIGdyaWQgaXMgdG9vIGxhcmdlIChpdHMgc2xpY2VzIG9ubHkgZXhpc3QgYXQgZnVsbCByZXNvbHV0aW9uKS4gKi9cbiAgY29uZmlndXJlKHN0YWNrRGVwdGg6IG51bWJlciwgY29hcnNlRml0VGlsZXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2tpcFNsaWNlUHJlZmV0Y2ggPSBjb2Fyc2VGaXRUaWxlcyA+IHRoaXMuTUFYX1BSRUZFVENIX0ZJVF9USUxFUztcbiAgICB0aGlzLm1heENhY2hlZFNsaWNlcyA9XG4gICAgICBzdGFja0RlcHRoID4gMSA/IE1hdGgubWluKHRoaXMuTUFYX0NBQ0hFRF9TTElDRVNfQ0FQLCBzdGFja0RlcHRoKSA6IDE7XG4gIH1cblxuICAvKiogQ3VycmVudCBMUlUgY2FwICh0aGUgdmlld2VyIHNpemVzIGl0cyB0aWxlIGNhY2hlIGZyb20gaXQpLiAqL1xuICBtYXhTbGljZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhDYWNoZWRTbGljZXM7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgcGVyLWNoYW5uZWwgZ3JvdXBzIChvbiBhIGZyZXNoIHBsb3QpLiAqL1xuICBjbGVhckNoYW5uZWxHcm91cHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIGNvbXBvc2l0ZSBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICogIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uICovXG4gIHNlZWRDb21wb3NpdGUoejogbnVtYmVyLCBpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSXRlbXMuc2V0KHosIGl0ZW0pO1xuICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBzbGljZSBkaXNwbGF5IChzZXRaSW5kZXgncyBjYWNoZSB3b3JrKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogU2hvdyBzbGljZSB6OiByZXZlYWwgaXQgaW5zdGFudGx5IHdoZW4gY2FjaGVkIChyZS10aW50aW5nIGEgc3RhbGVcbiAgICogIG11bHRpY2hhbm5lbCBncm91cCksIG90aGVyd2lzZSBhZGQgaXQgb25jZS4gVGhlIGN1cnJlbnQgc2xpY2Ugc3RheXNcbiAgICogIHZpc2libGUgdW50aWwgdGhlIG5ldyBvbmUgaXMgaW4g4oCUIG5vIHdoaXRlLWZsaWNrZXIuICovXG4gIHNob3dTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ob3N0LmlzTXVsdGlDaGFubmVsKCkpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5nZXQoeik7XG4gICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAubGVuZ3RoICYmIGdyb3VwLnNvbWUoKGl0KSA9PiBpdCAmJiB0aGlzLnNsaWNlSW5Xb3JsZChpdCkpKSB7XG4gICAgICAgIHRoaXMucmV2ZWFsQ2hhbm5lbFNsaWNlKHopO1xuICAgICAgICAvLyBJZiBhIGRpc3BsYXkgY2hhbmdlIGhhcHBlbmVkIHdoaWxlIHRoaXMgc2xpY2Ugd2FzIGNhY2hlZCwgaXRzIHRpbGVzXG4gICAgICAgIC8vIGhvbGQgYSBzdGFsZSB0aW50IOKAlCByZS1hcHBseSBub3cgKGl0J3MgdGhlIHZpc2libGUgc2xpY2UsIHNvIHRoZVxuICAgICAgICAvLyBicmllZiByZXN0b3JlIGZsYXNoIGlzIGFjY2VwdGFibGUsIGxpa2UgYSBmcmVzaCBsb2FkKS5cbiAgICAgICAgaWYgKHRoaXMuc3RhbGVTbGljZXMuZGVsZXRlKHopKSB0aGlzLmludmFsaWRhdGVTbGljZSh6KTtcbiAgICAgICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2xpY2VzTG9hZGluZy5oYXMoeikpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFubmVsU2xpY2Uoeik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2xpY2VJdGVtcy5nZXQoeik7XG4gICAgaWYgKGNhY2hlZCAmJiB0aGlzLnNsaWNlSW5Xb3JsZChjYWNoZWQpKSB7XG4gICAgICAvLyBJbnN0YW50OiByZXZlYWwgdGhlIGNhY2hlZCBzbGljZSwgaGlkZSB0aGUgb3RoZXJzIOKAlCBubyBmZXRjaC9kZWNvZGUuXG4gICAgICB0aGlzLnNob3dPbmx5U2xpY2Uoeik7XG4gICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2xpY2VzTG9hZGluZy5oYXMoeikpIHJldHVybjsgLy8gYWxyZWFkeSBiZWluZyBhZGRlZDsgc3VjY2VzcyByZXZlYWxzIGl0XG4gICAgdGhpcy5hZGRTbGljZSh6KTtcbiAgfVxuXG4gIC8qKiBBZGQgYSBuZXZlci1zZWVuIHNsaWNlIGFzIGEgaGlkZGVuIHRpbGVkIGltYWdlLCB0aGVuIHJldmVhbCBpdCBvbmNlIGxvYWRlZFxuICAgKiAgKGNvbXBvc2l0ZSBwYXRoOyBtdWx0aWNoYW5uZWwgcm91dGVzIHRvIGFkZENoYW5uZWxTbGljZSkuICovXG4gIHByaXZhdGUgYWRkU2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvc3QuaGFzSW1hZ2UoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgdGhpcy5hZGRDaGFubmVsU2xpY2Uoeik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2xpY2VzTG9hZGluZy5hZGQoeik7XG4gICAgLy8gVGFnIHRoaXMgYWRkIHRvIHRoZSBjdXJyZW50IGltYWdlOyBpZiB0aGUgdXNlciBzd2l0Y2hlcyBpbWFnZXMgYmVmb3JlIGl0XG4gICAgLy8gcmVzb2x2ZXMsIHRoZSBzdGFsZSBjYWxsYmFjayBpcyBkcm9wcGVkICh0aGUgYWRkIGJlbG9uZ3MgdG8gdGhlIG9sZCBzdGFjaykuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnNsaWNlTG9hZFRva2VuO1xuICAgIGNvbnN0IHRzID0gdGhpcy5ob3N0LmJ1aWxkVGlsZVNvdXJjZSh6KTtcbiAgICB0cnkge1xuICAgICAgLy8gYWRkVGlsZWRJbWFnZSBsaXZlcyBvbiB0aGUgVmlld2VyIChpdCBxdWV1ZXMgdGhlIGFkZCBpbnRvIHRoZSB3b3JsZCkuXG4gICAgICB0aGlzLmhvc3Qudmlld2VyKCkuYWRkVGlsZWRJbWFnZSh7XG4gICAgICAgIHRpbGVTb3VyY2U6IHRzLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3aWR0aDogMSwgLy8gbWF0Y2ggdGhlIHByaW1hcnkgaW1hZ2UncyBub3JtYWxpemVkIHBsYWNlbWVudFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAvLyBMb2FkIHRpbGVzIGV2ZW4gdGhvdWdoIGl0J3MgaGlkZGVuIOKAlCB0aGlzIGlzIHdoYXQgbGV0cyB0aGUgYmFja2dyb3VuZFxuICAgICAgICAvLyBsb2FkZXIgZmlsbCBldmVyeSBzbGljZSdzIGNhY2hlIHNvIHNjcnViYmluZyBnZXRzIHByb2dyZXNzaXZlbHkgc21vb3RoZXIuXG4gICAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgICAgIHN1Y2Nlc3M6IChlOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZT8uaXRlbTtcbiAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEltYWdlIHN3aXRjaGVkIHdoaWxlIHRoaXMgd2FzIGFkZGluZyDigJQgZHJvcCB0aGUgb3JwaGFuIHNvIGl0IHN0b3BzXG4gICAgICAgICAgICAvLyBsb2FkaW5nIGluc3RlYWQgb2Ygc3RyZWFtaW5nIHRpbGVzIGZvciB0aGUgYWJhbmRvbmVkIHN0YWNrLlxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZD8ucmVtb3ZlSXRlbShpdGVtKTsgfSBjYXRjaCB7IC8qIGdvbmUgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNsaWNlc0xvYWRpbmcuZGVsZXRlKHopO1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2xpY2VJdGVtcy5zZXQoeiwgaXRlbSk7XG4gICAgICAgICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICAgICAgICAgIHRoaXMuaG9zdC5vbkNvbXBvc2l0ZVNsaWNlQWRkZWQoeik7XG4gICAgICAgICAgLy8gT25seSByZXZlYWwgaWYgdGhlIHVzZXIgaXMgc3RpbGwgb24gdGhpcyBzbGljZSAoZmFzdCBzY3J1YmJpbmcgbWF5XG4gICAgICAgICAgLy8gaGF2ZSBtb3ZlZCBvbiDigJQgbGVhdmUgaXQgY2FjaGVkL2hpZGRlbiBmb3IgYSBsYXRlciByZXZpc2l0KS5cbiAgICAgICAgICBpZiAoeiA9PT0gdGhpcy5ob3N0LmN1cnJlbnRaKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd09ubHlTbGljZSh6KTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmV2aWN0U2xpY2VMcnUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICBpZiAodG9rZW4gPT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGZhaWxlZCB0byBhZGQgei1zbGljZScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzbGljZSB6J3MgY2hhbm5lbCBncm91cDogb25lIGFkZGl0aXZlbHktY29tcG9zaXRlZCAoJ2xpZ2h0ZXInID0gRmlqaVxuICAgKiBcIkNvbXBvc2l0ZVwiKSBUaWxlZEltYWdlIHBlciBjaGFubmVsLCBoaWRkZW4gKG9wYWNpdHkgMCkgdW50aWwgcmV2ZWFsZWQuXG4gICAqIEVhY2ggaXMgcHJlbG9hZGVkIHNvIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBjYW4gcHJlLWZpbGwgZXZlcnkgc2xpY2UuXG4gICAqIENhY2hlZCBzbyBhIHJldmlzaXQgaXMgYW4gaW5zdGFudCBvcGFjaXR5IHRvZ2dsZSDigJQgbm8gcmUtZmV0Y2gsIG5vXG4gICAqIHdoaXRlLWZsaWNrZXIuIE1pcnJvcnMgYWRkU2xpY2UgZm9yIHRoZSBjb21wb3NpdGUgcGF0aC5cbiAgICovXG4gIGFkZENoYW5uZWxTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuaGFzKHopIHx8IHRoaXMuc2xpY2VzTG9hZGluZy5oYXMoeikpIHJldHVybjtcbiAgICB0aGlzLnNsaWNlc0xvYWRpbmcuYWRkKHopO1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5zbGljZUxvYWRUb2tlbjtcbiAgICBjb25zdCBuID0gdGhpcy5ob3N0LmNoYW5uZWxDb3VudCgpO1xuICAgIGNvbnN0IGdyb3VwOiBhbnlbXSA9IG5ldyBBcnJheShuKTtcbiAgICBsZXQgc2V0dGxlZCA9IDA7XG4gICAgY29uc3Qgb25TZXR0bGVkID0gKCkgPT4ge1xuICAgICAgaWYgKCsrc2V0dGxlZCA8IG4pIHJldHVybjtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zbGljZUxvYWRUb2tlbikgcmV0dXJuOyAvLyBpbWFnZSBzd2l0Y2hlZCBtaWQtYWRkXG4gICAgICB0aGlzLnNsaWNlc0xvYWRpbmcuZGVsZXRlKHopO1xuICAgICAgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5zZXQoeiwgZ3JvdXApO1xuICAgICAgdGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeik7IC8vIGZyZXNobHkgdGludGVkIGF0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3RhdGVcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICB0aGlzLnJldmVhbENoYW5uZWxTbGljZSh6KTsgLy8gdGlsZXMgbWF5IHN0aWxsIGJlIGRlY29kaW5nOyBvcGFjaXR5IGlzIHNldCBub3dcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV2aWN0U2xpY2VMcnUoKTtcbiAgICB9O1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbjsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmhvc3Qudmlld2VyKCkuYWRkVGlsZWRJbWFnZSh7XG4gICAgICAgICAgdGlsZVNvdXJjZTogdGhpcy5ob3N0LmJ1aWxkVGlsZVNvdXJjZSh6LCBjKSxcbiAgICAgICAgICB4OiAwLCB5OiAwLCB3aWR0aDogMSxcbiAgICAgICAgICBvcGFjaXR5OiAwLCAvLyByZXZlYWxlZCBieSByZXZlYWxDaGFubmVsU2xpY2Ugb25jZSB0aGUgZ3JvdXAgaXMgaW5cbiAgICAgICAgICBjb21wb3NpdGVPcGVyYXRpb246ICdsaWdodGVyJyxcbiAgICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAgIHN1Y2Nlc3M6IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlPy5pdGVtO1xuICAgICAgICAgICAgaWYgKHRva2VuICE9PSB0aGlzLnNsaWNlTG9hZFRva2VuKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtKSB7IHRyeSB7IHRoaXMuaG9zdC52aWV3ZXIoKT8ud29ybGQ/LnJlbW92ZUl0ZW0oaXRlbSk7IH0gY2F0Y2ggeyAvKiBnb25lICovIH0gfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbSkgZ3JvdXBbY10gPSBpdGVtO1xuICAgICAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4gb25TZXR0bGVkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCBjaGFubmVsIHNsaWNlIGltYWdlJywgeiwgYywgZXJyKTtcbiAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFJldmVhbCBzbGljZSB6J3MgY2hhbm5lbCBncm91cCAoZWFjaCB2aXNpYmxlIGNoYW5uZWwg4oaSIG9wYWNpdHkgMSkgYW5kXG4gICAqICBoaWRlIGV2ZXJ5IG90aGVyIGNhY2hlZCBzbGljZSdzIGdyb3VwLiBJbnN0YW50OyBubyBmZXRjaC9kZWNvZGUuICovXG4gIHJldmVhbENoYW5uZWxTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt6eiwgZ3JvdXBdIG9mIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHp6ID09PSB6O1xuICAgICAgZ3JvdXAuZm9yRWFjaCgoaXQsIGMpID0+IHtcbiAgICAgICAgaWYgKCFpdCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5ob3N0LmNoYW5uZWxWaXNpYmxlKGMpO1xuICAgICAgICB0cnkgeyBpdC5zZXRPcGFjaXR5KGFjdGl2ZSAmJiB2aXNpYmxlID8gMSA6IDApOyB9IGNhdGNoIHsgLyogZ29uZSAqLyB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdyB0aGUgZ2l2ZW4gY29tcG9zaXRlIHNsaWNlIChvcGFjaXR5IDEpIGFuZCBoaWRlIGFsbCBvdGhlciBjYWNoZWQgc2xpY2VzLiAqL1xuICBwcml2YXRlIHNob3dPbmx5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbenosIGl0ZW1dIG9mIHRoaXMuc2xpY2VJdGVtcykge1xuICAgICAgdHJ5IHsgaXRlbS5zZXRPcGFjaXR5KHp6ID09PSB6ID8gMSA6IDApOyB9IGNhdGNoIHsgLyogaXRlbSBnb25lICovIH1cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgZGlzcGxheSBpbnZhbGlkYXRpb24gKG11bHRpY2hhbm5lbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJlLXRpbnQgYWZ0ZXIgYSBkaXNwbGF5IGNoYW5nZTogaW52YWxpZGF0ZSBPTkxZIHRoZSB2aXNpYmxlIHNsaWNlJ3NcbiAgICogIGNoYW5uZWwgaW1hZ2VzIOKAlCBpbnZhbGlkYXRpbmcgdGhlIHdob2xlIHdvcmxkIHdvdWxkIHJlLXByb2Nlc3MgZXZlcnlcbiAgICogIGhpZGRlbi9wcmVsb2FkZWQgc2xpY2UncyB0aWxlcyAoaHVuZHJlZHMpLCBmbG9vZGluZyBPU0QgYW5kIHdhc3Rpbmcgd29ya1xuICAgKiAgb24gdGlsZXMgdGhhdCBhcmVuJ3Qgb24gc2NyZWVuLiBUaGUgb3RoZXIgY2FjaGVkIHNsaWNlcyBhcmUgbWFya2VkIHN0YWxlXG4gICAqICBhbmQgcmUtdGludGVkIGxhemlseSB3aGVuIHJldmVhbGVkLiAqL1xuICBpbnZhbGlkYXRlQ2hhbm5lbERpc3BsYXkoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pbnZhbGlkYXRlU2xpY2Uoeik7XG4gICAgdGhpcy5zdGFsZVNsaWNlcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qgenogb2YgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5rZXlzKCkpIHtcbiAgICAgIGlmICh6eiAhPT0geikgdGhpcy5zdGFsZVNsaWNlcy5hZGQoenopO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlIChyZXN0b3JlICsgcmUtcmVjb2xvcikganVzdCB0aGUgY2hhbm5lbCBpbWFnZXMgb2Ygb25lIGNhY2hlZFxuICAgKiAgc2xpY2UuIEEgc2hhcmVkIHRpbWVzdGFtcCBiYXRjaGVzIHRoZSBwZXItaW1hZ2UgaW52YWxpZGF0aW9ucyBpbnRvIG9uZVxuICAgKiAgcHJvY2Vzc2luZyBwYXNzIChPU0QgZGVkdXBlcyB0aWxlcyBhbHJlYWR5IHN0YW1wZWQgYXQgPj0gdFN0YW1wKS4gKi9cbiAgcHJpdmF0ZSBpbnZhbGlkYXRlU2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KSA/PyBbXTtcbiAgICBpZiAoIWdyb3VwLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG9zZDogYW55ID0gT1NEO1xuICAgIGNvbnN0IHRTdGFtcCA9IHR5cGVvZiBvc2Qubm93ID09PSAnZnVuY3Rpb24nID8gb3NkLm5vdygpIDogRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IGl0IG9mIGdyb3VwKSB7XG4gICAgICBpZiAoaXQgJiYgdHlwZW9mIGl0LnJlcXVlc3RJbnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7IGl0LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUsIGZhbHNlLCB0U3RhbXApOyB9IGNhdGNoIHsgLyogZ29uZSAqLyB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGJhY2tncm91bmQgc3RhY2sgcHJlbG9hZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRGVib3VuY2Ugc28gYSBidXJzdCBvZiB2aWV3cG9ydC9zbGljZSBldmVudHMgY29hbGVzY2VzLCB0aGVuIGFkdmFuY2UgdGhlXG4gICAqICBiYWNrZ3JvdW5kIHN0YWNrIGxvYWRlciBieSBvbmUgc2xpY2UuICovXG4gIHNjaGVkdWxlUHJlZmV0Y2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcFNsaWNlUHJlZmV0Y2gpIHJldHVybjtcbiAgICBpZiAodGhpcy5wcmVmZXRjaFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5wcmVmZXRjaFRpbWVyKTtcbiAgICB0aGlzLnByZWZldGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKSwgMjAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZ3JvdW5kLWxvYWQgdGhlIHdob2xlIHN0YWNrOiBhZGQgZWFjaCBub3QteWV0LWNhY2hlZCBzbGljZSBhcyBhXG4gICAqIGhpZGRlbiwgcHJlbG9hZGVkIHRpbGVkIGltYWdlLCBvbmUgYXQgYSB0aW1lLCB3b3JraW5nIG91dHdhcmQgZnJvbSB0aGVcbiAgICogY3VycmVudCBzbGljZSDigJQgYW5kIG5ldmVyIGJsb2NraW5nIHRoZSB2aXNpYmxlIHNsaWNlIChpdCB5aWVsZHMgd2hpbGUgdGhlXG4gICAqIGN1cnJlbnQgdmlldyBpcyBzdGlsbCBzdHJlYW1pbmcgdGlsZXM7IG9ubHkgb25lIHNsaWNlIGlzIGluIGZsaWdodCBhdCBhXG4gICAqIHRpbWUgc28gdGhlIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgbG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IHRoaXMuaG9zdC5zbGljZUNvdW50KCk7XG4gICAgaWYgKHNsaWNlQ291bnQgPD0gMSkgcmV0dXJuOyAvLyBub3QgYSBzdGFjayDigJQgbm90aGluZyB0byBwcmVsb2FkXG4gICAgLy8gWWllbGQgdG8gdGhlIHZpc2libGUgc2xpY2Ugd2hpbGUgaXQncyBzdGlsbCBzdHJlYW1pbmcgdGlsZXMuXG4gICAgaWYgKHRoaXMuc2xpY2VUaWxlc0xvYWRpbmcodGhpcy5ob3N0LmN1cnJlbnRaKCkpKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR2F0ZSBvbiB0aGUgaW4tZmxpZ2h0IHNsaWNlJ3MgVElMRVMgZmluaXNoaW5nIOKAlCBhZGRUaWxlZEltYWdlJ3Mgc3VjY2Vzc1xuICAgIC8vIGZpcmVzIG9uIGFkZCwgbm90IG9uIHRpbGUgbG9hZCwgc28gd2l0aG91dCB0aGlzIHdlJ2QgYWRkIHRoZSB3aG9sZSBzdGFja1xuICAgIC8vIGF0IG9uY2UgYW5kIGZsb29kIHRoZSBjb25uZWN0aW9uLiBBIHRpbWUgZmFsbGJhY2sgcHJldmVudHMgYSBzdHVjayBzbGljZVxuICAgIC8vIGZyb20gc3RhbGxpbmcgdGhlIHBhc3MuXG4gICAgaWYgKHRoaXMuYmdMb2FkaW5nWiAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhZGRpbmcgPSB0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aWxlc0xvYWRpbmcgPSB0aGlzLnNsaWNlVGlsZXNMb2FkaW5nKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aW1lZE91dCA9IERhdGUubm93KCkgLSB0aGlzLmJnTG9hZGluZ1NpbmNlID4gODAwMDtcbiAgICAgIGlmICgoYWRkaW5nIHx8IHRpbGVzTG9hZGluZykgJiYgIXRpbWVkT3V0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsOyAvLyB0aGF0IHNsaWNlJ3MgdGlsZXMgYXJlIGluIChvciBnYXZlIHVwKSDigJQgYWR2YW5jZVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZWFyZXN0VW5jYWNoZWRTbGljZShzbGljZUNvdW50KTtcbiAgICBpZiAobmV4dCA9PSBudWxsKSByZXR1cm47IC8vIHdob2xlIHN0YWNrIGNhY2hlZCDigJQgZG9uZVxuICAgIHRoaXMuYmdMb2FkaW5nWiA9IG5leHQ7XG4gICAgdGhpcy5iZ0xvYWRpbmdTaW5jZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5iZ0F0dGVtcHRlZC5hZGQobmV4dCk7XG4gICAgdGhpcy5hZGRTbGljZShuZXh0KTsgLy8gaGlkZGVuICsgcHJlbG9hZCAoYWRkZWQgd2l0aCBvcGFjaXR5IDA7IG5vdCByZXZlYWxlZClcbiAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTsgLy8gcG9sbCB1bnRpbCBpdHMgdGlsZXMgbG9hZCwgdGhlbiBhZHZhbmNlXG4gIH1cblxuICAvKiogVGhlIG5vdC15ZXQtY2FjaGVkIHNsaWNlIGNsb3Nlc3QgdG8gdGhlIGN1cnJlbnQgb25lIChsb2FkIG5lYXJlc3QgZmlyc3QpLFxuICAgKiAgc2tpcHBpbmcgYW55IGFscmVhZHkgYXR0ZW1wdGVkIHNvIGEgZmFpbGVkL3Nsb3cgb25lIGlzbid0IHJldHJpZWQgaW4gYSBsb29wLiAqL1xuICBwcml2YXRlIG5lYXJlc3RVbmNhY2hlZFNsaWNlKHNsaWNlQ291bnQ6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgc2xpY2VDb3VudDsgZCsrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gZCA9PT0gMCA/IFtjdXJdIDogW2N1ciAtIGQsIGN1ciArIGRdO1xuICAgICAgZm9yIChjb25zdCB6IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPj0gMCAmJiB6IDwgc2xpY2VDb3VudCAmJlxuICAgICAgICAgICF0aGlzLnNsaWNlQ2FjaGVIYXMoeikgJiYgIXRoaXMuc2xpY2VzTG9hZGluZy5oYXMoeikgJiYgIXRoaXMuYmdBdHRlbXB0ZWQuaGFzKHopXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB6O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYmFja2dyb3VuZCBzdGFjayBwcmVsb2FkaW5nIGFuZCBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgc2xpY2UgYWRkLlxuICAgKiBDYWxsZWQgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpcyBzZWxlY3RlZCBzbyB0aGUgcHJldmlvdXMgc3RhY2sgc3RvcHNcbiAgICogbG9hZGluZyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGNhbmNlbEJhY2tncm91bmRMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWZldGNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnByZWZldGNoVGltZXIpO1xuICAgICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5iZ0xvYWRpbmdaID0gbnVsbDtcbiAgICB0aGlzLmJnQXR0ZW1wdGVkLmNsZWFyKCk7XG4gICAgdGhpcy5zbGljZUxvYWRUb2tlbisrOyAvLyBkcm9wIHBlbmRpbmcgYWRkVGlsZWRJbWFnZSBjYWxsYmFja3MgZnJvbSB0aGUgb2xkIGltYWdlXG4gICAgLy8gQWJvcnQgaW4tZmxpZ2h0IGJhY2tncm91bmQgdGlsZXMgaW1tZWRpYXRlbHkgYnkgZHJvcHBpbmcgdGhlIGhpZGRlblxuICAgIC8vIHByZWxvYWRlZCBzbGljZXMgKHJlbW92ZUl0ZW0gY2FuY2VscyB0aGVpciBwZW5kaW5nIHRpbGUgbG9hZHMpLiBLZWVwIHRoZVxuICAgIC8vIHZpc2libGUgc2xpY2Ugc28gdGhlIGN1cnJlbnQgdmlldyBkb2Vzbid0IGJsYW5rIGJlZm9yZSB0aGUgbmV4dCBwbG90LlxuICAgIHRoaXMuZHJvcEhpZGRlblNsaWNlcygpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBldmVyeSBjYWNoZWQgc2xpY2UgZXhjZXB0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIG9uZSwgYWJvcnRpbmdcbiAgICogIHRoZWlyIGluLWZsaWdodCB0aWxlIHJlcXVlc3RzLiAqL1xuICBwcml2YXRlIGRyb3BIaWRkZW5TbGljZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmhvc3QuY3VycmVudFooKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBpdGVtXSBvZiBbLi4udGhpcy5zbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLnNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgdHJ5IHsgdi53b3JsZC5yZW1vdmVJdGVtKGl0ZW0pOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbeiwgZ3JvdXBdIG9mIFsuLi50aGlzLmNoYW5uZWxTbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmRlbGV0ZSh6KTtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHsgaWYgKGl0KSB7IHRyeSB7IHYud29ybGQucmVtb3ZlSXRlbShpdCk7IH0gY2F0Y2ggeyAvKiBnb25lICovIH0gfSB9XG4gICAgfVxuICAgIHRoaXMuc2xpY2VMcnUgPSB0aGlzLnNsaWNlQ2FjaGVIYXMoY3VyKSA/IFtjdXJdIDogW107XG4gIH1cblxuICAvLyDilIDilIAgY2FjaGUgYm9va2tlZXBpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFdoZXRoZXIgc2xpY2UgeiBpcyBpbiB0aGUgYWN0aXZlIGNhY2hlIChjb21wb3NpdGUgc2luZ2xlIGltYWdlLCBvciB0aGVcbiAgICogIG11bHRpY2hhbm5lbCBwZXItY2hhbm5lbCBncm91cCkuICovXG4gIHByaXZhdGUgc2xpY2VDYWNoZUhhcyh6OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0LmlzTXVsdGlDaGFubmVsKCkgPyB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmhhcyh6KSA6IHRoaXMuc2xpY2VJdGVtcy5oYXMoeik7XG4gIH1cblxuICAvKiogVGhlIGNhY2hlZCBUaWxlZEltYWdlKHMpIGZvciBzbGljZSB6ICgw4oCTMSBmb3IgY29tcG9zaXRlLCBOIGZvciBtdWx0aWNoYW5uZWwpLiAqL1xuICBwcml2YXRlIHNsaWNlR3JvdXAoejogbnVtYmVyKTogYW55W10ge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkgcmV0dXJuIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZ2V0KHopID8/IFtdO1xuICAgIGNvbnN0IGl0ID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICByZXR1cm4gaXQgPyBbaXRdIDogW107XG4gIH1cblxuICAvKiogV2hldGhlciBzbGljZSB6J3MgdGlsZXMgYXJlIHN0aWxsIHN0cmVhbWluZyAoYW55IGNhY2hlZCBpbWFnZSBub3QgZnVsbHkgbG9hZGVkKS4gKi9cbiAgcHJpdmF0ZSBzbGljZVRpbGVzTG9hZGluZyh6OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBnID0gdGhpcy5zbGljZUdyb3VwKHopO1xuICAgIGlmICghZy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZy5zb21lKChpdCkgPT4gaXQgJiYgdHlwZW9mIGl0LmdldEZ1bGx5TG9hZGVkID09PSAnZnVuY3Rpb24nICYmICFpdC5nZXRGdWxseUxvYWRlZCgpKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgc2xpY2UgeidzIGNhY2hlZCBpbWFnZShzKSBmcm9tIHRoZSB3b3JsZCBhbmQgdGhlIGFjdGl2ZSBjYWNoZS4gKi9cbiAgcHJpdmF0ZSByZW1vdmVDYWNoZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgaWYgKGdyb3VwICYmIHYpIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHsgaWYgKGl0KSB7IHRyeSB7IHYud29ybGQucmVtb3ZlSXRlbShpdCk7IH0gY2F0Y2ggeyAvKiBnb25lICovIH0gfSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNsaWNlSXRlbXMuZ2V0KHopO1xuICAgICAgdGhpcy5zbGljZUl0ZW1zLmRlbGV0ZSh6KTtcbiAgICAgIGlmIChpdGVtICYmIHYpIHsgdHJ5IHsgdi53b3JsZC5yZW1vdmVJdGVtKGl0ZW0pOyB9IGNhdGNoIHsgLyogZ29uZSAqLyB9IH1cbiAgICB9XG4gIH1cblxuICAvKiogSXMgdGhlIHRpbGVkIGltYWdlIHN0aWxsIGluIHRoZSB3b3JsZCAobm90IGV2aWN0ZWQpPyAqL1xuICBwcml2YXRlIHNsaWNlSW5Xb3JsZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuaG9zdC52aWV3ZXIoKS53b3JsZC5nZXRJbmRleE9mSXRlbShpdGVtKSA+PSAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNYXJrIHogYXMgbW9zdC1yZWNlbnRseS11c2VkLiAqL1xuICBwcml2YXRlIHRvdWNoU2xpY2VMcnUoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaSA9IHRoaXMuc2xpY2VMcnUuaW5kZXhPZih6KTtcbiAgICBpZiAoaSA+PSAwKSB0aGlzLnNsaWNlTHJ1LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLnNsaWNlTHJ1LnB1c2goeik7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZWQgc2xpY2VzIGJleW9uZCB0aGUgY2FwIChuZXZlciB0aGVcbiAgICogIGN1cnJlbnQgb25lKSwgcmVtb3ZpbmcgdGhlaXIgdGlsZWQgaW1hZ2VzIHNvIG1lbW9yeSBzdGF5cyBib3VuZGVkLiAqL1xuICBwcml2YXRlIGV2aWN0U2xpY2VMcnUoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuc2xpY2VMcnUubGVuZ3RoID4gdGhpcy5tYXhDYWNoZWRTbGljZXMpIHtcbiAgICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5zbGljZUxydS5maW5kSW5kZXgoKHopID0+IHogIT09IGN1cik7XG4gICAgICBpZiAoaWR4IDwgMCkgYnJlYWs7XG4gICAgICBjb25zdCB6ID0gdGhpcy5zbGljZUxydS5zcGxpY2UoaWR4LCAxKVswXTtcbiAgICAgIHRoaXMucmVtb3ZlQ2FjaGVkU2xpY2Uoeik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBjYWNoZSAob24gdGVhcmRvd24gLyBpbWFnZSBzd2l0Y2gpLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFsZVNsaWNlcy5jbGVhcigpO1xuICAgIHRoaXMuc2xpY2VMcnUgPSBbXTtcbiAgICB0aGlzLnNsaWNlc0xvYWRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsO1xuICAgIHRoaXMuYmdBdHRlbXB0ZWQuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
493
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvc2xpY2UtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ3ZDLE1BQU0sT0FBTyxVQUFVO0lBdUNyQixZQUFvQixJQUFvQjtRQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXRDeEMscUVBQXFFO1FBQzdELGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUMxRDs7aURBRXlDO1FBQ2pDLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO1FBQ3BGOzhFQUNzRTtRQUM5RCxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsdURBQXVEO1FBQy9DLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFDaEMsMEVBQTBFO1FBQ2xFLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMxQztrRkFDMEU7UUFDbEUsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0I7OzZEQUVxRDtRQUM3QyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUN6Qzt1REFDK0M7UUFDdkMsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDM0IsZ0ZBQWdGO1FBQ3hFLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUN4Qyx1RUFBdUU7UUFDL0Qsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDNUIsZ0ZBQWdGO1FBQy9ELDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUM1Qzs7O3lCQUdpQjtRQUNBLDJCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUM5Qyw0REFBNEQ7UUFDcEQsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGtCQUFhLEdBQXlDLElBQUksQ0FBQztJQUV4QixDQUFDO0lBRTVDLHlFQUF5RTtJQUV6RTs7O3dFQUdvRTtJQUNwRSxTQUFTLENBQUMsVUFBa0IsRUFBRSxjQUFzQjtRQUNsRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUN0RSxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsQ0FBUztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLElBQUksR0FBRztvQkFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUksU0FBUztZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDtrRkFDOEU7SUFDOUUsYUFBYSxDQUFDLENBQVMsRUFBRSxJQUF1QjtRQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQseUVBQXlFO0lBRXpFOzs4REFFMEQ7SUFDMUQsU0FBUyxDQUFDLENBQVM7UUFDakIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixzRUFBc0U7Z0JBQ3RFLG1FQUFtRTtnQkFDbkUseURBQXlEO2dCQUN6RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDO2lCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4Qyx1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLENBQUMsMENBQTBDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVEO29FQUNnRTtJQUN4RCxRQUFRLENBQUMsQ0FBUztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPO1FBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQiwyRUFBMkU7UUFDM0UsOEVBQThFO1FBQzlFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsd0VBQXdFO1lBQ3hFLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ25CLFVBQVUsRUFBRSxFQUFFO2dCQUNkLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEtBQUssRUFBRSxDQUFDLEVBQUUsaURBQWlEO2dCQUMzRCxPQUFPLEVBQUUsQ0FBQztnQkFDVix3RUFBd0U7Z0JBQ3hFLDRFQUE0RTtnQkFDNUUsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztvQkFDckIsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNsQyxxRUFBcUU7d0JBQ3JFLDhEQUE4RDt3QkFDOUQsSUFBSSxJQUFJLEVBQUUsQ0FBQzs0QkFDVCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzNELENBQUM7d0JBQ0QsT0FBTztvQkFDVCxDQUFDO29CQUNELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSTt3QkFBRSxPQUFPO29CQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLHFFQUFxRTtvQkFDckUsK0RBQStEO29CQUMvRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7d0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxQixDQUFDO29CQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO29CQUNWLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjO3dCQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZSxDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTztRQUNsQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUN2RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQXlDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7WUFDckIsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFDMUIsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTyxDQUFDLHlCQUF5QjtZQUNwRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4QztZQUMxRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO2dCQUM5RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQztvQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNDLENBQUMsRUFBRSxDQUFDO29CQUNKLENBQUMsRUFBRSxDQUFDO29CQUNKLEtBQUssRUFBRSxDQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLEVBQUUsc0RBQXNEO29CQUNsRSxrQkFBa0IsRUFBRSxTQUFTO29CQUM3QixPQUFPLEVBQUUsSUFBSTtvQkFDYixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDYixNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO3dCQUNyQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ2xDLElBQUksSUFBSSxFQUFFLENBQUM7Z0NBQ1QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUMzRCxDQUFDOzRCQUNELE9BQU87d0JBQ1QsQ0FBQzt3QkFDRCxJQUFJLElBQUk7NEJBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDMUIsU0FBUyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFO2lCQUN6QixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsRUFBRSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7MkVBQ3VFO0lBQ3ZFLGtCQUFrQixDQUFDLENBQVM7UUFDMUIsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pELE1BQU0sTUFBTSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEVBQUU7b0JBQUUsT0FBTztnQkFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsbUZBQW1GO0lBQzNFLGFBQWEsQ0FBQyxDQUFTO1FBQzdCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFOzs7OzhDQUkwQztJQUMxQyx3QkFBd0IsQ0FBQyxDQUFTO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksRUFBRSxLQUFLLENBQUM7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRDs7NEVBRXdFO0lBQ2hFLGVBQWUsQ0FBQyxDQUFTO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDMUIsa0VBQWtFO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RFLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsaUJBQWlCLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3JELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFO2dEQUM0QztJQUM1QyxnQkFBZ0I7UUFDZCxJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ25DLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTztRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFDLElBQUksVUFBVSxJQUFJLENBQUM7WUFBRSxPQUFPLENBQUMsbUNBQW1DO1FBQ2hFLCtEQUErRDtRQUMvRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3pELElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxtREFBbUQ7UUFDN0UsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxDQUFDLDRCQUE0QjtRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsd0RBQXdEO1FBQzdFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsMENBQTBDO0lBQ3JFLENBQUM7SUFFRDt1RkFDbUY7SUFDM0Usb0JBQW9CLENBQUMsVUFBa0I7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUMzQixJQUNFLENBQUMsSUFBSSxDQUFDO29CQUNOLENBQUMsR0FBRyxVQUFVO29CQUNkLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUMxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUN4QixDQUFDO29CQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLDBEQUEwRDtRQUNqRixzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7eUNBQ3FDO0lBQzdCLGdCQUFnQjtRQUN0QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUFFLFNBQVM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUFFLFNBQVM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN2QixJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUNQLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFOzJDQUN1QztJQUMvQixhQUFhLENBQUMsQ0FBUztRQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRCxvRkFBb0Y7SUFDNUUsVUFBVSxDQUFDLENBQVM7UUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0UsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLGlCQUFpQixDQUFDLENBQVM7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxjQUFjLEtBQUssVUFBVSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELDRFQUE0RTtJQUNwRSxpQkFBaUIsQ0FBQyxDQUFTO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksS0FBSyxJQUFJLENBQUM7Z0JBQ1osS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDUCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEMsQ0FBQztnQkFDSCxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDZCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwyREFBMkQ7SUFDbkQsWUFBWSxDQUFDLElBQXVCO1FBQzFDLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxvQ0FBb0M7SUFDNUIsYUFBYSxDQUFDLENBQVM7UUFDN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7NkVBQ3lFO0lBQ2pFLGFBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQUUsTUFBTTtZQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPU0QsIHF1aWV0IH0gZnJvbSAnLi9vc2QtbGliJztcbmltcG9ydCB7IE9zZFRpbGVkSW1hZ2VMaWtlLCBPc2RWaWV3ZXJMaWtlIH0gZnJvbSAnLi9vc2Qtdmlld2VyLWxpa2UnO1xuXG4vKipcbiAqIFN0YWNrLXNsaWNlIGNhY2hlIGZvciB0aGUgT3BlblNlYWRyYWdvbiBiYWNrZW5kIChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDMg4oCUXG4gKiBhIHB1cmUgbW92ZSBvZiB0aGUgY2FjaGUgY2x1c3RlciBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSkuXG4gKlxuICogU2NydWJiaW5nIHRoZSB6LXNsaWRlciB1c2VkIHRvIHZpZXdlci5vcGVuKCkgYSBmcmVzaCB0aWxlIHNvdXJjZSBwZXIgc2xpY2UsXG4gKiB3aGljaCBkZXN0cm95cyB0aGUgY3VycmVudCB0aWxlZCBpbWFnZSAoYW5kIGl0cyBkZWNvZGVkK3JlY29sb3JlZCB0aWxlcyksIHNvXG4gKiByZXZpc2l0aW5nIGEgc2xpY2UgcmUtZmV0Y2hlZCBldmVyeXRoaW5nLiBJbnN0ZWFkIHdlIGtlZXAgZWFjaCB2aXNpdGVkIHNsaWNlXG4gKiBhcyBpdHMgb3duIHRpbGVkIGltYWdlIGluIHRoZSB3b3JsZCBhbmQganVzdCB0b2dnbGUgb3BhY2l0eSDigJQgYSByZXZpc2l0ZWRcbiAqIHNsaWNlIGlzIGluc3RhbnQgKG5vIG5ldHdvcmssIG5vIHJlLWRlY29kZSwgbm8gcmUtcmVjb2xvcikuIEJvdW5kZWQgYnkgYW5cbiAqIExSVSBzbyBkZWVwIHN0YWNrcyBkb24ndCBncm93IHdpdGhvdXQgbGltaXQuIE11bHRpY2hhbm5lbCBzbGljZXMgY2FjaGUgb25lXG4gKiBUaWxlZEltYWdlIHBlciBjaGFubmVsIChhZGRpdGl2ZWx5IGNvbXBvc2l0ZWQpOyBjb21wb3NpdGUgc2xpY2VzIGNhY2hlIG9uZS5cbiAqIEEgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0IG9mIHRoZSBzdGFjaywgb25lIHNsaWNlIGF0IGEgdGltZSxcbiAqIHlpZWxkaW5nIHRvIHRoZSB2aXNpYmxlIHNsaWNlIHNvIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uLlxuICovXG5cbi8qKiBXaGF0IHRoZSBjYWNoZSBuZWVkcyBmcm9tIHRoZSB2aXN1YWxpemVyIHNlcnZpY2UuIEFsbCBhY2Nlc3NvcnMgYXJlIGxpdmVcbiAqICAoY2FsbGVkIGF0IHVzZSB0aW1lLCBuZXZlciBjYXB0dXJlZCkgc28gdGhlIGNhY2hlIGFsd2F5cyBzZWVzIHRoZSBjdXJyZW50XG4gKiAgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgbWF0Y2hpbmcgdGhlIGZpZWxkIHJlYWRzIGl0IHJlcGxhY2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUNhY2hlSG9zdCB7XG4gIC8qKiBUaGUgbW91bnRlZCB2aWV3ZXIsIG9yIG51bGwuICovXG4gIHZpZXdlcigpOiBPc2RWaWV3ZXJMaWtlIHwgbnVsbDtcbiAgLyoqIFRydWUgd2hlbiBhIHZpZXdlciwgZGVzY3JpcHRvciBhbmQgaW5mb0I2NCBhcmUgYWxsIHByZXNlbnQuICovXG4gIGhhc0ltYWdlKCk6IGJvb2xlYW47XG4gIC8qKiBTdGFjayBkZXB0aCAoZGVzY3JpcHRvci56LCAxIGZvciBzaW5nbGUgaW1hZ2VzKS4gKi9cbiAgc2xpY2VDb3VudCgpOiBudW1iZXI7XG4gIC8qKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCB6LXNsaWNlLiAqL1xuICBjdXJyZW50WigpOiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCByZW5kZXJpbmcgKG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UpIHZzIGNvbXBvc2l0ZS4gKi9cbiAgaXNNdWx0aUNoYW5uZWwoKTogYm9vbGVhbjtcbiAgLyoqIENoYW5uZWwgY291bnQgZm9yIGEgbXVsdGljaGFubmVsIGdyb3VwIGFkZC4gKi9cbiAgY2hhbm5lbENvdW50KCk6IG51bWJlcjtcbiAgLyoqIENoYW5uZWwgdmlzaWJpbGl0eSAoZHJpdmVzIGdyb3VwIHJldmVhbCBvcGFjaXR5KS4gKi9cbiAgY2hhbm5lbFZpc2libGUoYzogbnVtYmVyKTogYm9vbGVhbjtcbiAgLyoqIFRpbGUgc291cmNlIGZvciBzbGljZSB6IChvcHRpb25hbGx5IG9uZSBjaGFubmVsKS4gKi9cbiAgYnVpbGRUaWxlU291cmNlKHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IHN0cmluZyB8IG9iamVjdDtcbiAgLyoqIEEgY29tcG9zaXRlIHNsaWNlIGxhbmRlZCBpbiB0aGUgd29ybGQg4oCUIHRoZSBzZXJ2aWNlIHNhbXBsZXMgaXRzIHdpbmRvdy4gKi9cbiAgb25Db21wb3NpdGVTbGljZUFkZGVkKHo6IG51bWJlcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTbGljZUNhY2hlIHtcbiAgLyoqIHotc2xpY2Ug4oaSIGl0cyBUaWxlZEltYWdlIGluIHRoZSB2aWV3ZXIgd29ybGQgKGNvbXBvc2l0ZSBwYXRoKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUl0ZW1zID0gbmV3IE1hcDxudW1iZXIsIE9zZFRpbGVkSW1hZ2VMaWtlPigpO1xuICAvKiogTXVsdGljaGFubmVsIHBlci1zbGljZSBjYWNoZTogeiDihpIgdGhlIE4gY2hhbm5lbCBUaWxlZEltYWdlcyBmb3IgdGhhdCBzbGljZVxuICAgKiAgKGFkZGl0aXZlbHkgY29tcG9zaXRlZCBieSBPU0Q7IGluZGV4ID0gY2hhbm5lbCkuIE9ubHkgdGhlIGFjdGl2ZSBzbGljZSdzXG4gICAqICB2aXNpYmxlIGNoYW5uZWxzIGhhdmUgb3BhY2l0eSA+IDAuICovXG4gIHByaXZhdGUgY2hhbm5lbFNsaWNlSXRlbXMgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8T3NkVGlsZWRJbWFnZUxpa2UgfCB1bmRlZmluZWQ+PigpO1xuICAvKiogQ2FjaGVkIG11bHRpY2hhbm5lbCBzbGljZXMgd2hvc2UgdGlsZXMgd2VyZSB0aW50ZWQgYmVmb3JlIHRoZSBsYXRlc3RcbiAgICogIGRpc3BsYXkgY2hhbmdlOyByZS10aW50ZWQgbGF6aWx5IHdoZW4gbmV4dCByZXZlYWxlZCBieSB6LXNjcnViLiAqL1xuICBwcml2YXRlIHN0YWxlU2xpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBNb3N0LXJlY2VudGx5LXNob3duIHogbGFzdDsgZHJpdmVzIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBzbGljZUxydTogbnVtYmVyW10gPSBbXTtcbiAgLyoqIHotc2xpY2VzIHdob3NlIHRpbGVkIGltYWdlIGlzIGJlaW5nIGFkZGVkIChkZWR1cGUgcmFwaWQgc2NydWJiaW5nKS4gKi9cbiAgcHJpdmF0ZSBzbGljZXNMb2FkaW5nID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGxvYWRlZCBpbWFnZSBjaGFuZ2VzOyBpbi1mbGlnaHQgYmFja2dyb3VuZCBzbGljZSBhZGRzXG4gICAqICBjYXB0dXJlZCB1bmRlciBhbiBvbGRlciB0b2tlbiBhcmUgZHJvcHBlZCAoY2FuY2VsbGVkIGltYWdlIHN3aXRjaCkuICovXG4gIHByaXZhdGUgc2xpY2VMb2FkVG9rZW4gPSAwO1xuICAvKiogVGhlIHNsaWNlIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBpcyBjdXJyZW50bHkgd2FpdGluZyBvbiAoaXRzIHRpbGVzIGFyZVxuICAgKiAgc3RpbGwgc3RyZWFtaW5nKTogYWRkVGlsZWRJbWFnZSAnc3VjY2VzcycgZmlyZXMgb24gYWRkLCBub3Qgb24gdGlsZSBsb2FkLFxuICAgKiAgc28gd2UgZ2F0ZSB0aGUgbmV4dCBzbGljZSBvbiBnZXRGdWxseUxvYWRlZCgpLiAqL1xuICBwcml2YXRlIGJnTG9hZGluZ1o6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hlbiBiZ0xvYWRpbmdaIHN0YXJ0ZWQgbG9hZGluZyDigJQgYSBmYWxsYmFjayBzbyBhIHNsb3cvc3R1Y2sgc2xpY2UgY2FuJ3RcbiAgICogIHN0YWxsIHRoZSB3aG9sZSBiYWNrZ3JvdW5kIHBhc3MgZm9yZXZlci4gKi9cbiAgcHJpdmF0ZSBiZ0xvYWRpbmdTaW5jZSA9IDA7XG4gIC8qKiBTbGljZXMgdGhlIGJhY2tncm91bmQgbG9hZGVyIGhhcyBhbHJlYWR5IGF0dGVtcHRlZCAobm8gdGlnaHQgcmV0cnkgbG9vcCkuICovXG4gIHByaXZhdGUgYmdBdHRlbXB0ZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgLyoqIE1heCBjYWNoZWQgc2xpY2UgdGlsZWQgaW1hZ2VzIGtlcHQgcmVzaWRlbnQgYmVmb3JlIExSVSBldmljdGlvbi4gKi9cbiAgcHJpdmF0ZSBtYXhDYWNoZWRTbGljZXMgPSA4O1xuICAvKiogVXBwZXIgYm91bmQgb24gcmVzaWRlbnQgc2xpY2VzLCByZWdhcmRsZXNzIG9mIHN0YWNrIGRlcHRoIChtZW1vcnkgZ3VhcmQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DQUNIRURfU0xJQ0VTX0NBUCA9IDY0O1xuICAvKiogRml0LXZpZXcgdGlsZSBidWRnZXQgYWJvdmUgd2hpY2ggYmFja2dyb3VuZCBwcmVsb2FkaW5nIGlzIHNraXBwZWQ6IGEgaHVnZVxuICAgKiAgbm8tcHlyYW1pZCBzdGFjayB3b3VsZCBwcmVsb2FkIGV2ZXJ5IHNsaWNlIGF0IGZ1bGwgcmVzb2x1dGlvbiBhbmRcbiAgICogIGZsb29kL3RpbWVvdXQuIE5vcm1hbCBzdGFja3Mgc3RheSBiZWxvdyBpdCBhbmQgS0VFUCB0aGUgZmxpY2tlci1mcmVlXG4gICAqICBwcmUtY2FjaGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX1BSRUZFVENIX0ZJVF9USUxFUyA9IDI1NjtcbiAgLyoqIFRydWUgb25seSBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBiYWNrZ3JvdW5kLXByZWxvYWQuICovXG4gIHByaXZhdGUgc2tpcFNsaWNlUHJlZmV0Y2ggPSBmYWxzZTtcbiAgcHJpdmF0ZSBwcmVmZXRjaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogU2xpY2VDYWNoZUhvc3QpIHt9XG5cbiAgLy8g4pSA4pSAIGNvbmZpZ3VyYXRpb24gKHBlciBpbWFnZSwgZnJvbSBwbG90KCkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaXplIHRoZSBjYWNoZSBmb3IgdGhlIGxvYWRlZCBpbWFnZToga2VlcCB0aGUgd2hvbGUgc3RhY2sgcmVzaWRlbnRcbiAgICogIChjYXBwZWQpIHNvIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBmaWxscyBldmVyeSBzbGljZSB3aXRob3V0IGV2aWN0aW5nXG4gICAqICBpdHNlbGY7IHNraXAgcHJlbG9hZGluZyBlbnRpcmVseSB3aGVuIGV2ZW4gdGhlIGNvYXJzZXN0IGxldmVsJ3MgdGlsZVxuICAgKiAgZ3JpZCBpcyB0b28gbGFyZ2UgKGl0cyBzbGljZXMgb25seSBleGlzdCBhdCBmdWxsIHJlc29sdXRpb24pLiAqL1xuICBjb25maWd1cmUoc3RhY2tEZXB0aDogbnVtYmVyLCBjb2Fyc2VGaXRUaWxlczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5za2lwU2xpY2VQcmVmZXRjaCA9IGNvYXJzZUZpdFRpbGVzID4gdGhpcy5NQVhfUFJFRkVUQ0hfRklUX1RJTEVTO1xuICAgIHRoaXMubWF4Q2FjaGVkU2xpY2VzID0gc3RhY2tEZXB0aCA+IDEgPyBNYXRoLm1pbih0aGlzLk1BWF9DQUNIRURfU0xJQ0VTX0NBUCwgc3RhY2tEZXB0aCkgOiAxO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgTFJVIGNhcCAodGhlIHZpZXdlciBzaXplcyBpdHMgdGlsZSBjYWNoZSBmcm9tIGl0KS4gKi9cbiAgbWF4U2xpY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWF4Q2FjaGVkU2xpY2VzO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHBlci1jaGFubmVsIGdyb3VwcyAob24gYSBmcmVzaCBwbG90KS4gKi9cbiAgY2xlYXJDaGFubmVsR3JvdXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIG92ZXIgdGhlIHNsaWNlIHRoZSB2aWV3ZXIganVzdCBvcGVuZWQgKHdvcmxkIGl0ZW0gMCkuIENvbXBvc2l0ZTogc2VlZFxuICAgKiB0aGUgY2FjaGUgd2l0aCBpdCwgc28gc2NydWJiaW5nIGJhY2sgdG8gaXQgbGF0ZXIgaXMgYW4gaW5zdGFudCBvcGFjaXR5XG4gICAqIHRvZ2dsZSwgbm90IGEgcmUtb3Blbi4gTXVsdGljaGFubmVsOiBkcm9wIHRoYXQgc2luZ2xlIChjaGFubmVsLTApIGltYWdlIGFuZFxuICAgKiBhZGQgdGhlIHNsaWNlJ3MgY2hhbm5lbCBncm91cCBpbnN0ZWFkOyB0aGUgYmFja2dyb3VuZCBsb2FkZXIgLyBMUlUgdGhlblxuICAgKiBwcmUtZmlsbHMgdGhlIG90aGVyIHNsaWNlcycgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgKi9cbiAgYWRvcHRPcGVuZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmhvc3Qudmlld2VyKCk7XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICBxdWlldCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0MCA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgICAgICBpZiAodmlld2VyICYmIGl0MCkgdmlld2VyLndvcmxkLnJlbW92ZUl0ZW0oaXQwKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDaGFubmVsU2xpY2Uoeik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0SXRlbSA9IHZpZXdlcj8ud29ybGQ/LmdldEl0ZW1BdD8uKDApO1xuICAgIGlmIChmaXJzdEl0ZW0pIHRoaXMuc2VlZENvbXBvc2l0ZSh6LCBmaXJzdEl0ZW0pO1xuICB9XG5cbiAgLyoqIFNlZWQgdGhlIGNhY2hlIHdpdGggdGhlIGp1c3Qtb3BlbmVkIGNvbXBvc2l0ZSBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICogIHNjcnViYmluZyBiYWNrIHRvIGl0IGxhdGVyIGlzIGFuIGluc3RhbnQgb3BhY2l0eSB0b2dnbGUsIG5vdCBhIHJlLW9wZW4uICovXG4gIHNlZWRDb21wb3NpdGUoejogbnVtYmVyLCBpdGVtOiBPc2RUaWxlZEltYWdlTGlrZSk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VJdGVtcy5zZXQoeiwgaXRlbSk7XG4gICAgdGhpcy50b3VjaFNsaWNlTHJ1KHopO1xuICB9XG5cbiAgLy8g4pSA4pSAIHNsaWNlIGRpc3BsYXkgKHNldFpJbmRleCdzIGNhY2hlIHdvcmspIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTaG93IHNsaWNlIHo6IHJldmVhbCBpdCBpbnN0YW50bHkgd2hlbiBjYWNoZWQgKHJlLXRpbnRpbmcgYSBzdGFsZVxuICAgKiAgbXVsdGljaGFubmVsIGdyb3VwKSwgb3RoZXJ3aXNlIGFkZCBpdCBvbmNlLiBUaGUgY3VycmVudCBzbGljZSBzdGF5c1xuICAgKiAgdmlzaWJsZSB1bnRpbCB0aGUgbmV3IG9uZSBpcyBpbiDigJQgbm8gd2hpdGUtZmxpY2tlci4gKi9cbiAgc2hvd1NsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIGlmIChncm91cCAmJiBncm91cC5sZW5ndGggJiYgZ3JvdXAuc29tZSgoaXQpID0+IGl0ICYmIHRoaXMuc2xpY2VJbldvcmxkKGl0KSkpIHtcbiAgICAgICAgdGhpcy5yZXZlYWxDaGFubmVsU2xpY2Uoeik7XG4gICAgICAgIC8vIElmIGEgZGlzcGxheSBjaGFuZ2UgaGFwcGVuZWQgd2hpbGUgdGhpcyBzbGljZSB3YXMgY2FjaGVkLCBpdHMgdGlsZXNcbiAgICAgICAgLy8gaG9sZCBhIHN0YWxlIHRpbnQg4oCUIHJlLWFwcGx5IG5vdyAoaXQncyB0aGUgdmlzaWJsZSBzbGljZSwgc28gdGhlXG4gICAgICAgIC8vIGJyaWVmIHJlc3RvcmUgZmxhc2ggaXMgYWNjZXB0YWJsZSwgbGlrZSBhIGZyZXNoIGxvYWQpLlxuICAgICAgICBpZiAodGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeikpIHRoaXMuaW52YWxpZGF0ZVNsaWNlKHopO1xuICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkge1xuICAgICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICBpZiAoY2FjaGVkICYmIHRoaXMuc2xpY2VJbldvcmxkKGNhY2hlZCkpIHtcbiAgICAgIC8vIEluc3RhbnQ6IHJldmVhbCB0aGUgY2FjaGVkIHNsaWNlLCBoaWRlIHRoZSBvdGhlcnMg4oCUIG5vIGZldGNoL2RlY29kZS5cbiAgICAgIHRoaXMuc2hvd09ubHlTbGljZSh6KTtcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkgcmV0dXJuOyAvLyBhbHJlYWR5IGJlaW5nIGFkZGVkOyBzdWNjZXNzIHJldmVhbHMgaXRcbiAgICB0aGlzLmFkZFNsaWNlKHopO1xuICB9XG5cbiAgLyoqIEFkZCBhIG5ldmVyLXNlZW4gc2xpY2UgYXMgYSBoaWRkZW4gdGlsZWQgaW1hZ2UsIHRoZW4gcmV2ZWFsIGl0IG9uY2UgbG9hZGVkXG4gICAqICAoY29tcG9zaXRlIHBhdGg7IG11bHRpY2hhbm5lbCByb3V0ZXMgdG8gYWRkQ2hhbm5lbFNsaWNlKS4gKi9cbiAgcHJpdmF0ZSBhZGRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5pc011bHRpQ2hhbm5lbCgpKSB7XG4gICAgICB0aGlzLmFkZENoYW5uZWxTbGljZSh6KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmFkZCh6KTtcbiAgICAvLyBUYWcgdGhpcyBhZGQgdG8gdGhlIGN1cnJlbnQgaW1hZ2U7IGlmIHRoZSB1c2VyIHN3aXRjaGVzIGltYWdlcyBiZWZvcmUgaXRcbiAgICAvLyByZXNvbHZlcywgdGhlIHN0YWxlIGNhbGxiYWNrIGlzIGRyb3BwZWQgKHRoZSBhZGQgYmVsb25ncyB0byB0aGUgb2xkIHN0YWNrKS5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2xpY2VMb2FkVG9rZW47XG4gICAgY29uc3QgdHMgPSB0aGlzLmhvc3QuYnVpbGRUaWxlU291cmNlKHopO1xuICAgIHRyeSB7XG4gICAgICAvLyBhZGRUaWxlZEltYWdlIGxpdmVzIG9uIHRoZSBWaWV3ZXIgKGl0IHF1ZXVlcyB0aGUgYWRkIGludG8gdGhlIHdvcmxkKS5cbiAgICAgIHZpZXdlci5hZGRUaWxlZEltYWdlKHtcbiAgICAgICAgdGlsZVNvdXJjZTogdHMsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHdpZHRoOiAxLCAvLyBtYXRjaCB0aGUgcHJpbWFyeSBpbWFnZSdzIG5vcm1hbGl6ZWQgcGxhY2VtZW50XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIC8vIExvYWQgdGlsZXMgZXZlbiB0aG91Z2ggaXQncyBoaWRkZW4g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIC8vIGxvYWRlciBmaWxsIGV2ZXJ5IHNsaWNlJ3MgY2FjaGUgc28gc2NydWJiaW5nIGdldHMgcHJvZ3Jlc3NpdmVseSBzbW9vdGhlci5cbiAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgc3VjY2VzczogKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZT8uaXRlbTtcbiAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEltYWdlIHN3aXRjaGVkIHdoaWxlIHRoaXMgd2FzIGFkZGluZyDigJQgZHJvcCB0aGUgb3JwaGFuIHNvIGl0IHN0b3BzXG4gICAgICAgICAgICAvLyBsb2FkaW5nIGluc3RlYWQgb2Ygc3RyZWFtaW5nIHRpbGVzIGZvciB0aGUgYWJhbmRvbmVkIHN0YWNrLlxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcXVpZXQoKCkgPT4gdGhpcy5ob3N0LnZpZXdlcigpPy53b3JsZD8ucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2xpY2VzTG9hZGluZy5kZWxldGUoeik7XG4gICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zbGljZUl0ZW1zLnNldCh6LCBpdGVtKTtcbiAgICAgICAgICB0aGlzLnRvdWNoU2xpY2VMcnUoeik7XG4gICAgICAgICAgdGhpcy5ob3N0Lm9uQ29tcG9zaXRlU2xpY2VBZGRlZCh6KTtcbiAgICAgICAgICAvLyBPbmx5IHJldmVhbCBpZiB0aGUgdXNlciBpcyBzdGlsbCBvbiB0aGlzIHNsaWNlIChmYXN0IHNjcnViYmluZyBtYXlcbiAgICAgICAgICAvLyBoYXZlIG1vdmVkIG9uIOKAlCBsZWF2ZSBpdCBjYWNoZWQvaGlkZGVuIGZvciBhIGxhdGVyIHJldmlzaXQpLlxuICAgICAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25seVNsaWNlKHopO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXZpY3RTbGljZUxydSgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIGlmICh0b2tlbiA9PT0gdGhpcy5zbGljZUxvYWRUb2tlbikgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zbGljZXNMb2FkaW5nLmRlbGV0ZSh6KTtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCB6LXNsaWNlJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNsaWNlIHoncyBjaGFubmVsIGdyb3VwOiBvbmUgYWRkaXRpdmVseS1jb21wb3NpdGVkICgnbGlnaHRlcicgPSBGaWppXG4gICAqIFwiQ29tcG9zaXRlXCIpIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwsIGhpZGRlbiAob3BhY2l0eSAwKSB1bnRpbCByZXZlYWxlZC5cbiAgICogRWFjaCBpcyBwcmVsb2FkZWQgc28gdGhlIGJhY2tncm91bmQgbG9hZGVyIGNhbiBwcmUtZmlsbCBldmVyeSBzbGljZS5cbiAgICogQ2FjaGVkIHNvIGEgcmV2aXNpdCBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlIOKAlCBubyByZS1mZXRjaCwgbm9cbiAgICogd2hpdGUtZmxpY2tlci4gTWlycm9ycyBhZGRTbGljZSBmb3IgdGhlIGNvbXBvc2l0ZSBwYXRoLlxuICAgKi9cbiAgYWRkQ2hhbm5lbFNsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0Lmhhc0ltYWdlKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5jaGFubmVsU2xpY2VJdGVtcy5oYXMoeikgfHwgdGhpcy5zbGljZXNMb2FkaW5nLmhhcyh6KSkgcmV0dXJuO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIHRoaXMuc2xpY2VzTG9hZGluZy5hZGQoeik7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnNsaWNlTG9hZFRva2VuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmhvc3QuY2hhbm5lbENvdW50KCk7XG4gICAgY29uc3QgZ3JvdXA6IEFycmF5PE9zZFRpbGVkSW1hZ2VMaWtlIHwgdW5kZWZpbmVkPiA9IG5ldyBBcnJheShuKTtcbiAgICBsZXQgc2V0dGxlZCA9IDA7XG4gICAgY29uc3Qgb25TZXR0bGVkID0gKCkgPT4ge1xuICAgICAgaWYgKCsrc2V0dGxlZCA8IG4pIHJldHVybjtcbiAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zbGljZUxvYWRUb2tlbikgcmV0dXJuOyAvLyBpbWFnZSBzd2l0Y2hlZCBtaWQtYWRkXG4gICAgICB0aGlzLnNsaWNlc0xvYWRpbmcuZGVsZXRlKHopO1xuICAgICAgdGhpcy5jaGFubmVsU2xpY2VJdGVtcy5zZXQoeiwgZ3JvdXApO1xuICAgICAgdGhpcy5zdGFsZVNsaWNlcy5kZWxldGUoeik7IC8vIGZyZXNobHkgdGludGVkIGF0IHRoZSBjdXJyZW50IGRpc3BsYXkgc3RhdGVcbiAgICAgIHRoaXMudG91Y2hTbGljZUxydSh6KTtcbiAgICAgIGlmICh6ID09PSB0aGlzLmhvc3QuY3VycmVudFooKSkge1xuICAgICAgICB0aGlzLnJldmVhbENoYW5uZWxTbGljZSh6KTsgLy8gdGlsZXMgbWF5IHN0aWxsIGJlIGRlY29kaW5nOyBvcGFjaXR5IGlzIHNldCBub3dcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmV2aWN0U2xpY2VMcnUoKTtcbiAgICB9O1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbjsgYysrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2aWV3ZXIuYWRkVGlsZWRJbWFnZSh7XG4gICAgICAgICAgdGlsZVNvdXJjZTogdGhpcy5ob3N0LmJ1aWxkVGlsZVNvdXJjZSh6LCBjKSxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgb3BhY2l0eTogMCwgLy8gcmV2ZWFsZWQgYnkgcmV2ZWFsQ2hhbm5lbFNsaWNlIG9uY2UgdGhlIGdyb3VwIGlzIGluXG4gICAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uOiAnbGlnaHRlcicsXG4gICAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgICBzdWNjZXNzOiAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGU/Lml0ZW07XG4gICAgICAgICAgICBpZiAodG9rZW4gIT09IHRoaXMuc2xpY2VMb2FkVG9rZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBxdWlldCgoKSA9PiB0aGlzLmhvc3Qudmlld2VyKCk/LndvcmxkPy5yZW1vdmVJdGVtKGl0ZW0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbSkgZ3JvdXBbY10gPSBpdGVtO1xuICAgICAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4gb25TZXR0bGVkKCksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gZmFpbGVkIHRvIGFkZCBjaGFubmVsIHNsaWNlIGltYWdlJywgeiwgYywgZXJyKTtcbiAgICAgICAgb25TZXR0bGVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFJldmVhbCBzbGljZSB6J3MgY2hhbm5lbCBncm91cCAoZWFjaCB2aXNpYmxlIGNoYW5uZWwg4oaSIG9wYWNpdHkgMSkgYW5kXG4gICAqICBoaWRlIGV2ZXJ5IG90aGVyIGNhY2hlZCBzbGljZSdzIGdyb3VwLiBJbnN0YW50OyBubyBmZXRjaC9kZWNvZGUuICovXG4gIHJldmVhbENoYW5uZWxTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt6eiwgZ3JvdXBdIG9mIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHp6ID09PSB6O1xuICAgICAgZ3JvdXAuZm9yRWFjaCgoaXQsIGMpID0+IHtcbiAgICAgICAgaWYgKCFpdCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5ob3N0LmNoYW5uZWxWaXNpYmxlKGMpO1xuICAgICAgICBxdWlldCgoKSA9PiBpdC5zZXRPcGFjaXR5KGFjdGl2ZSAmJiB2aXNpYmxlID8gMSA6IDApKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBnaXZlbiBjb21wb3NpdGUgc2xpY2UgKG9wYWNpdHkgMSkgYW5kIGhpZGUgYWxsIG90aGVyIGNhY2hlZCBzbGljZXMuICovXG4gIHByaXZhdGUgc2hvd09ubHlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt6eiwgaXRlbV0gb2YgdGhpcy5zbGljZUl0ZW1zKSB7XG4gICAgICBxdWlldCgoKSA9PiBpdGVtLnNldE9wYWNpdHkoenogPT09IHogPyAxIDogMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IGludmFsaWRhdGlvbiAobXVsdGljaGFubmVsKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmUtdGludCBhZnRlciBhIGRpc3BsYXkgY2hhbmdlOiBpbnZhbGlkYXRlIE9OTFkgdGhlIHZpc2libGUgc2xpY2Unc1xuICAgKiAgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZyB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeVxuICAgKiAgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksIGZsb29kaW5nIE9TRCBhbmQgd2FzdGluZyB3b3JrXG4gICAqICBvbiB0aWxlcyB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGVcbiAgICogIGFuZCByZS10aW50ZWQgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuICovXG4gIGludmFsaWRhdGVDaGFubmVsRGlzcGxheSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludmFsaWRhdGVTbGljZSh6KTtcbiAgICB0aGlzLnN0YWxlU2xpY2VzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB6eiBvZiB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmtleXMoKSkge1xuICAgICAgaWYgKHp6ICE9PSB6KSB0aGlzLnN0YWxlU2xpY2VzLmFkZCh6eik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEludmFsaWRhdGUgKHJlc3RvcmUgKyByZS1yZWNvbG9yKSBqdXN0IHRoZSBjaGFubmVsIGltYWdlcyBvZiBvbmUgY2FjaGVkXG4gICAqICBzbGljZS4gQSBzaGFyZWQgdGltZXN0YW1wIGJhdGNoZXMgdGhlIHBlci1pbWFnZSBpbnZhbGlkYXRpb25zIGludG8gb25lXG4gICAqICBwcm9jZXNzaW5nIHBhc3MgKE9TRCBkZWR1cGVzIHRpbGVzIGFscmVhZHkgc3RhbXBlZCBhdCA+PSB0U3RhbXApLiAqL1xuICBwcml2YXRlIGludmFsaWRhdGVTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZ2V0KHopID8/IFtdO1xuICAgIGlmICghZ3JvdXAubGVuZ3RoKSByZXR1cm47XG4gICAgLy8gRmVhdHVyZS10ZXN0ZWQ6IGEgbW9ja2VkIE9TRCBtb2R1bGUgKHNwZWNzKSBtYXkgbm90IHByb3ZpZGUgaXQuXG4gICAgY29uc3QgdFN0YW1wID0gdHlwZW9mIE9TRC5ub3cgPT09ICdmdW5jdGlvbicgPyBPU0Qubm93KCkgOiBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgIGlmIChpdCAmJiB0eXBlb2YgaXQucmVxdWVzdEludmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcXVpZXQoKCkgPT4gaXQucmVxdWVzdEludmFsaWRhdGU/Lih0cnVlLCBmYWxzZSwgdFN0YW1wKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGJhY2tncm91bmQgc3RhY2sgcHJlbG9hZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogRGVib3VuY2Ugc28gYSBidXJzdCBvZiB2aWV3cG9ydC9zbGljZSBldmVudHMgY29hbGVzY2VzLCB0aGVuIGFkdmFuY2UgdGhlXG4gICAqICBiYWNrZ3JvdW5kIHN0YWNrIGxvYWRlciBieSBvbmUgc2xpY2UuICovXG4gIHNjaGVkdWxlUHJlZmV0Y2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcFNsaWNlUHJlZmV0Y2gpIHJldHVybjtcbiAgICBpZiAodGhpcy5wcmVmZXRjaFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5wcmVmZXRjaFRpbWVyKTtcbiAgICB0aGlzLnByZWZldGNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKSwgMjAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZ3JvdW5kLWxvYWQgdGhlIHdob2xlIHN0YWNrOiBhZGQgZWFjaCBub3QteWV0LWNhY2hlZCBzbGljZSBhcyBhXG4gICAqIGhpZGRlbiwgcHJlbG9hZGVkIHRpbGVkIGltYWdlLCBvbmUgYXQgYSB0aW1lLCB3b3JraW5nIG91dHdhcmQgZnJvbSB0aGVcbiAgICogY3VycmVudCBzbGljZSDigJQgYW5kIG5ldmVyIGJsb2NraW5nIHRoZSB2aXNpYmxlIHNsaWNlIChpdCB5aWVsZHMgd2hpbGUgdGhlXG4gICAqIGN1cnJlbnQgdmlldyBpcyBzdGlsbCBzdHJlYW1pbmcgdGlsZXM7IG9ubHkgb25lIHNsaWNlIGlzIGluIGZsaWdodCBhdCBhXG4gICAqIHRpbWUgc28gdGhlIG9uLXNjcmVlbiB0aWxlcyBhbHdheXMgd2luIHRoZSBjb25uZWN0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgbG9hZE5leHRCYWNrZ3JvdW5kU2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuaG9zdC5oYXNJbWFnZSgpKSByZXR1cm47XG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IHRoaXMuaG9zdC5zbGljZUNvdW50KCk7XG4gICAgaWYgKHNsaWNlQ291bnQgPD0gMSkgcmV0dXJuOyAvLyBub3QgYSBzdGFjayDigJQgbm90aGluZyB0byBwcmVsb2FkXG4gICAgLy8gWWllbGQgdG8gdGhlIHZpc2libGUgc2xpY2Ugd2hpbGUgaXQncyBzdGlsbCBzdHJlYW1pbmcgdGlsZXMuXG4gICAgaWYgKHRoaXMuc2xpY2VUaWxlc0xvYWRpbmcodGhpcy5ob3N0LmN1cnJlbnRaKCkpKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR2F0ZSBvbiB0aGUgaW4tZmxpZ2h0IHNsaWNlJ3MgVElMRVMgZmluaXNoaW5nIOKAlCBhZGRUaWxlZEltYWdlJ3Mgc3VjY2Vzc1xuICAgIC8vIGZpcmVzIG9uIGFkZCwgbm90IG9uIHRpbGUgbG9hZCwgc28gd2l0aG91dCB0aGlzIHdlJ2QgYWRkIHRoZSB3aG9sZSBzdGFja1xuICAgIC8vIGF0IG9uY2UgYW5kIGZsb29kIHRoZSBjb25uZWN0aW9uLiBBIHRpbWUgZmFsbGJhY2sgcHJldmVudHMgYSBzdHVjayBzbGljZVxuICAgIC8vIGZyb20gc3RhbGxpbmcgdGhlIHBhc3MuXG4gICAgaWYgKHRoaXMuYmdMb2FkaW5nWiAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhZGRpbmcgPSB0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aWxlc0xvYWRpbmcgPSB0aGlzLnNsaWNlVGlsZXNMb2FkaW5nKHRoaXMuYmdMb2FkaW5nWik7XG4gICAgICBjb25zdCB0aW1lZE91dCA9IERhdGUubm93KCkgLSB0aGlzLmJnTG9hZGluZ1NpbmNlID4gODAwMDtcbiAgICAgIGlmICgoYWRkaW5nIHx8IHRpbGVzTG9hZGluZykgJiYgIXRpbWVkT3V0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVmZXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsOyAvLyB0aGF0IHNsaWNlJ3MgdGlsZXMgYXJlIGluIChvciBnYXZlIHVwKSDigJQgYWR2YW5jZVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5uZWFyZXN0VW5jYWNoZWRTbGljZShzbGljZUNvdW50KTtcbiAgICBpZiAobmV4dCA9PSBudWxsKSByZXR1cm47IC8vIHdob2xlIHN0YWNrIGNhY2hlZCDigJQgZG9uZVxuICAgIHRoaXMuYmdMb2FkaW5nWiA9IG5leHQ7XG4gICAgdGhpcy5iZ0xvYWRpbmdTaW5jZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5iZ0F0dGVtcHRlZC5hZGQobmV4dCk7XG4gICAgdGhpcy5hZGRTbGljZShuZXh0KTsgLy8gaGlkZGVuICsgcHJlbG9hZCAoYWRkZWQgd2l0aCBvcGFjaXR5IDA7IG5vdCByZXZlYWxlZClcbiAgICB0aGlzLnNjaGVkdWxlUHJlZmV0Y2goKTsgLy8gcG9sbCB1bnRpbCBpdHMgdGlsZXMgbG9hZCwgdGhlbiBhZHZhbmNlXG4gIH1cblxuICAvKiogVGhlIG5vdC15ZXQtY2FjaGVkIHNsaWNlIGNsb3Nlc3QgdG8gdGhlIGN1cnJlbnQgb25lIChsb2FkIG5lYXJlc3QgZmlyc3QpLFxuICAgKiAgc2tpcHBpbmcgYW55IGFscmVhZHkgYXR0ZW1wdGVkIHNvIGEgZmFpbGVkL3Nsb3cgb25lIGlzbid0IHJldHJpZWQgaW4gYSBsb29wLiAqL1xuICBwcml2YXRlIG5lYXJlc3RVbmNhY2hlZFNsaWNlKHNsaWNlQ291bnQ6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgc2xpY2VDb3VudDsgZCsrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gZCA9PT0gMCA/IFtjdXJdIDogW2N1ciAtIGQsIGN1ciArIGRdO1xuICAgICAgZm9yIChjb25zdCB6IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHogPj0gMCAmJlxuICAgICAgICAgIHogPCBzbGljZUNvdW50ICYmXG4gICAgICAgICAgIXRoaXMuc2xpY2VDYWNoZUhhcyh6KSAmJlxuICAgICAgICAgICF0aGlzLnNsaWNlc0xvYWRpbmcuaGFzKHopICYmXG4gICAgICAgICAgIXRoaXMuYmdBdHRlbXB0ZWQuaGFzKHopXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB6O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYmFja2dyb3VuZCBzdGFjayBwcmVsb2FkaW5nIGFuZCBpbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgc2xpY2UgYWRkLlxuICAgKiBDYWxsZWQgd2hlbiBhIGRpZmZlcmVudCBpbWFnZSBpcyBzZWxlY3RlZCBzbyB0aGUgcHJldmlvdXMgc3RhY2sgc3RvcHNcbiAgICogbG9hZGluZyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIGNhbmNlbEJhY2tncm91bmRMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWZldGNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnByZWZldGNoVGltZXIpO1xuICAgICAgdGhpcy5wcmVmZXRjaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zbGljZXNMb2FkaW5nLmNsZWFyKCk7XG4gICAgdGhpcy5iZ0xvYWRpbmdaID0gbnVsbDtcbiAgICB0aGlzLmJnQXR0ZW1wdGVkLmNsZWFyKCk7XG4gICAgdGhpcy5zbGljZUxvYWRUb2tlbisrOyAvLyBkcm9wIHBlbmRpbmcgYWRkVGlsZWRJbWFnZSBjYWxsYmFja3MgZnJvbSB0aGUgb2xkIGltYWdlXG4gICAgLy8gQWJvcnQgaW4tZmxpZ2h0IGJhY2tncm91bmQgdGlsZXMgaW1tZWRpYXRlbHkgYnkgZHJvcHBpbmcgdGhlIGhpZGRlblxuICAgIC8vIHByZWxvYWRlZCBzbGljZXMgKHJlbW92ZUl0ZW0gY2FuY2VscyB0aGVpciBwZW5kaW5nIHRpbGUgbG9hZHMpLiBLZWVwIHRoZVxuICAgIC8vIHZpc2libGUgc2xpY2Ugc28gdGhlIGN1cnJlbnQgdmlldyBkb2Vzbid0IGJsYW5rIGJlZm9yZSB0aGUgbmV4dCBwbG90LlxuICAgIHRoaXMuZHJvcEhpZGRlblNsaWNlcygpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBldmVyeSBjYWNoZWQgc2xpY2UgZXhjZXB0IHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIG9uZSwgYWJvcnRpbmdcbiAgICogIHRoZWlyIGluLWZsaWdodCB0aWxlIHJlcXVlc3RzLiAqL1xuICBwcml2YXRlIGRyb3BIaWRkZW5TbGljZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMuaG9zdC52aWV3ZXIoKTtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmhvc3QuY3VycmVudFooKTtcbiAgICBmb3IgKGNvbnN0IFt6LCBpdGVtXSBvZiBbLi4udGhpcy5zbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLnNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgcXVpZXQoKCkgPT4gdi53b3JsZC5yZW1vdmVJdGVtKGl0ZW0pKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbeiwgZ3JvdXBdIG9mIFsuLi50aGlzLmNoYW5uZWxTbGljZUl0ZW1zXSkge1xuICAgICAgaWYgKHogPT09IGN1cikgY29udGludWU7XG4gICAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmRlbGV0ZSh6KTtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgICAgaWYgKGl0KSB7XG4gICAgICAgICAgcXVpZXQoKCkgPT4gdi53b3JsZC5yZW1vdmVJdGVtKGl0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zbGljZUxydSA9IHRoaXMuc2xpY2VDYWNoZUhhcyhjdXIpID8gW2N1cl0gOiBbXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBjYWNoZSBib29ra2VlcGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciBzbGljZSB6IGlzIGluIHRoZSBhY3RpdmUgY2FjaGUgKGNvbXBvc2l0ZSBzaW5nbGUgaW1hZ2UsIG9yIHRoZVxuICAgKiAgbXVsdGljaGFubmVsIHBlci1jaGFubmVsIGdyb3VwKS4gKi9cbiAgcHJpdmF0ZSBzbGljZUNhY2hlSGFzKHo6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSA/IHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuaGFzKHopIDogdGhpcy5zbGljZUl0ZW1zLmhhcyh6KTtcbiAgfVxuXG4gIC8qKiBUaGUgY2FjaGVkIFRpbGVkSW1hZ2UocykgZm9yIHNsaWNlIHogKDDigJMxIGZvciBjb21wb3NpdGUsIE4gZm9yIG11bHRpY2hhbm5lbCkuICovXG4gIHByaXZhdGUgc2xpY2VHcm91cCh6OiBudW1iZXIpOiBBcnJheTxPc2RUaWxlZEltYWdlTGlrZSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkgcmV0dXJuIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZ2V0KHopID8/IFtdO1xuICAgIGNvbnN0IGl0ID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICByZXR1cm4gaXQgPyBbaXRdIDogW107XG4gIH1cblxuICAvKiogV2hldGhlciBzbGljZSB6J3MgdGlsZXMgYXJlIHN0aWxsIHN0cmVhbWluZyAoYW55IGNhY2hlZCBpbWFnZSBub3QgZnVsbHkgbG9hZGVkKS4gKi9cbiAgcHJpdmF0ZSBzbGljZVRpbGVzTG9hZGluZyh6OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBnID0gdGhpcy5zbGljZUdyb3VwKHopO1xuICAgIGlmICghZy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gZy5zb21lKChpdCkgPT4gaXQgJiYgdHlwZW9mIGl0LmdldEZ1bGx5TG9hZGVkID09PSAnZnVuY3Rpb24nICYmICFpdC5nZXRGdWxseUxvYWRlZCgpKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgc2xpY2UgeidzIGNhY2hlZCBpbWFnZShzKSBmcm9tIHRoZSB3b3JsZCBhbmQgdGhlIGFjdGl2ZSBjYWNoZS4gKi9cbiAgcHJpdmF0ZSByZW1vdmVDYWNoZWRTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy5ob3N0LnZpZXdlcigpO1xuICAgIGlmICh0aGlzLmhvc3QuaXNNdWx0aUNoYW5uZWwoKSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIHRoaXMuY2hhbm5lbFNsaWNlSXRlbXMuZGVsZXRlKHopO1xuICAgICAgaWYgKGdyb3VwICYmIHYpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAoaXQpIHtcbiAgICAgICAgICAgIHF1aWV0KCgpID0+IHYud29ybGQucmVtb3ZlSXRlbShpdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5zbGljZUl0ZW1zLmdldCh6KTtcbiAgICAgIHRoaXMuc2xpY2VJdGVtcy5kZWxldGUoeik7XG4gICAgICBpZiAoaXRlbSAmJiB2KSB7XG4gICAgICAgIHF1aWV0KCgpID0+IHYud29ybGQucmVtb3ZlSXRlbShpdGVtKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIElzIHRoZSB0aWxlZCBpbWFnZSBzdGlsbCBpbiB0aGUgd29ybGQgKG5vdCBldmljdGVkKT8gKi9cbiAgcHJpdmF0ZSBzbGljZUluV29ybGQoaXRlbTogT3NkVGlsZWRJbWFnZUxpa2UpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLmhvc3Qudmlld2VyKCk/LndvcmxkLmdldEluZGV4T2ZJdGVtKGl0ZW0pID8/IC0xKSA+PSAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNYXJrIHogYXMgbW9zdC1yZWNlbnRseS11c2VkLiAqL1xuICBwcml2YXRlIHRvdWNoU2xpY2VMcnUoejogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaSA9IHRoaXMuc2xpY2VMcnUuaW5kZXhPZih6KTtcbiAgICBpZiAoaSA+PSAwKSB0aGlzLnNsaWNlTHJ1LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLnNsaWNlTHJ1LnB1c2goeik7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZWQgc2xpY2VzIGJleW9uZCB0aGUgY2FwIChuZXZlciB0aGVcbiAgICogIGN1cnJlbnQgb25lKSwgcmVtb3ZpbmcgdGhlaXIgdGlsZWQgaW1hZ2VzIHNvIG1lbW9yeSBzdGF5cyBib3VuZGVkLiAqL1xuICBwcml2YXRlIGV2aWN0U2xpY2VMcnUoKTogdm9pZCB7XG4gICAgd2hpbGUgKHRoaXMuc2xpY2VMcnUubGVuZ3RoID4gdGhpcy5tYXhDYWNoZWRTbGljZXMpIHtcbiAgICAgIGNvbnN0IGN1ciA9IHRoaXMuaG9zdC5jdXJyZW50WigpO1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5zbGljZUxydS5maW5kSW5kZXgoKHopID0+IHogIT09IGN1cik7XG4gICAgICBpZiAoaWR4IDwgMCkgYnJlYWs7XG4gICAgICBjb25zdCB6ID0gdGhpcy5zbGljZUxydS5zcGxpY2UoaWR4LCAxKVswXTtcbiAgICAgIHRoaXMucmVtb3ZlQ2FjaGVkU2xpY2Uoeik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBjYWNoZSAob24gdGVhcmRvd24gLyBpbWFnZSBzd2l0Y2gpLiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlSXRlbXMuY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5uZWxTbGljZUl0ZW1zLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFsZVNsaWNlcy5jbGVhcigpO1xuICAgIHRoaXMuc2xpY2VMcnUgPSBbXTtcbiAgICB0aGlzLnNsaWNlc0xvYWRpbmcuY2xlYXIoKTtcbiAgICB0aGlzLmJnTG9hZGluZ1ogPSBudWxsO1xuICAgIHRoaXMuYmdBdHRlbXB0ZWQuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { firstValueFrom } from 'rxjs';
|
|
2
2
|
import { timeout } from 'rxjs/operators';
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Single source of truth for jit-service `/tile` access from the OSD backend
|
|
5
|
+
* (refactoring plan, Step 2). Before this module the tile URL was string-built
|
|
6
|
+
* in four places and the fetch→decode pipeline copy-pasted in three — every
|
|
7
|
+
* query-param change had to be repeated per site. The URL itself now lives in
|
|
8
|
+
* the shared `tile-server/` client.
|
|
9
|
+
*
|
|
10
|
+
* Error handling is deliberately left to the CALL SITES: these helpers
|
|
11
|
+
* propagate failures so each caller keeps its own tagged catch
|
|
12
|
+
* (`[viz:histogram]`, `[viz:window]`, `[viz:export]`) and its own
|
|
13
|
+
* skip/fallback semantics.
|
|
14
|
+
*/
|
|
15
|
+
/** The `/tile` URL shape moved to the backend-neutral jit-service client
|
|
16
|
+
* (`implementations/tile-server/`), shared with napari-js; re-exported so the OSD
|
|
17
|
+
* modules keep importing it from here. */
|
|
18
|
+
export { buildTileUrl } from '../tile-server/tile-protocol';
|
|
8
19
|
/** Fetch a tile PNG and decode it to an ImageBitmap. The caller owns the
|
|
9
20
|
* bitmap (call `close()` when done). Throws on network/decode failure. */
|
|
10
21
|
export async function fetchTileBitmap(http, url, timeoutMs) {
|
|
@@ -16,14 +27,24 @@ export async function fetchTileBitmap(http, url, timeoutMs) {
|
|
|
16
27
|
* network/decode failure (the caller's tagged catch handles it). */
|
|
17
28
|
export async function fetchTileRgba(http, url, timeoutMs) {
|
|
18
29
|
const bmp = await fetchTileBitmap(http, url, timeoutMs);
|
|
30
|
+
try {
|
|
31
|
+
return readRgba(bmp, bmp.width, bmp.height);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
bmp.close?.();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Draw a decoded image (bitmap, `<img>`, canvas) onto a scratch canvas and
|
|
38
|
+
* read its pixels back as RGBA ImageData. Null when a 2d context can't be
|
|
39
|
+
* created. */
|
|
40
|
+
export function readRgba(src, width, height) {
|
|
19
41
|
const cv = document.createElement('canvas');
|
|
20
|
-
cv.width =
|
|
21
|
-
cv.height =
|
|
42
|
+
cv.width = width;
|
|
43
|
+
cv.height = height;
|
|
22
44
|
const ctx = cv.getContext('2d', { willReadFrequently: true });
|
|
23
45
|
if (!ctx)
|
|
24
46
|
return null;
|
|
25
|
-
ctx.drawImage(
|
|
26
|
-
|
|
27
|
-
return ctx.getImageData(0, 0, cv.width, cv.height);
|
|
47
|
+
ctx.drawImage(src, 0, 0);
|
|
48
|
+
return ctx.getImageData(0, 0, width, height);
|
|
28
49
|
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2QvdGlsZS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekM7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7MkNBRTJDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc1RDsyRUFDMkU7QUFDM0UsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsSUFBZ0IsRUFBRSxHQUFXLEVBQUUsU0FBaUI7SUFDcEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRyxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7cUVBRXFFO0FBQ3JFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLElBQWdCLEVBQUUsR0FBVyxFQUFFLFNBQWlCO0lBQ2xGLE1BQU0sR0FBRyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7WUFBUyxDQUFDO1FBQ1QsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRDs7ZUFFZTtBQUNmLE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBc0IsRUFBRSxLQUFhLEVBQUUsTUFBYztJQUM1RSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QixPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBqaXQtc2VydmljZSBgL3RpbGVgIGFjY2VzcyBmcm9tIHRoZSBPU0QgYmFja2VuZFxuICogKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgMikuIEJlZm9yZSB0aGlzIG1vZHVsZSB0aGUgdGlsZSBVUkwgd2FzIHN0cmluZy1idWlsdFxuICogaW4gZm91ciBwbGFjZXMgYW5kIHRoZSBmZXRjaOKGkmRlY29kZSBwaXBlbGluZSBjb3B5LXBhc3RlZCBpbiB0aHJlZSDigJQgZXZlcnlcbiAqIHF1ZXJ5LXBhcmFtIGNoYW5nZSBoYWQgdG8gYmUgcmVwZWF0ZWQgcGVyIHNpdGUuIFRoZSBVUkwgaXRzZWxmIG5vdyBsaXZlcyBpblxuICogdGhlIHNoYXJlZCBgdGlsZS1zZXJ2ZXIvYCBjbGllbnQuXG4gKlxuICogRXJyb3IgaGFuZGxpbmcgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgdG8gdGhlIENBTEwgU0lURVM6IHRoZXNlIGhlbHBlcnNcbiAqIHByb3BhZ2F0ZSBmYWlsdXJlcyBzbyBlYWNoIGNhbGxlciBrZWVwcyBpdHMgb3duIHRhZ2dlZCBjYXRjaFxuICogKGBbdml6Omhpc3RvZ3JhbV1gLCBgW3Zpejp3aW5kb3ddYCwgYFt2aXo6ZXhwb3J0XWApIGFuZCBpdHMgb3duXG4gKiBza2lwL2ZhbGxiYWNrIHNlbWFudGljcy5cbiAqL1xuXG4vKiogVGhlIGAvdGlsZWAgVVJMIHNoYXBlIG1vdmVkIHRvIHRoZSBiYWNrZW5kLW5ldXRyYWwgaml0LXNlcnZpY2UgY2xpZW50XG4gKiAgKGBpbXBsZW1lbnRhdGlvbnMvdGlsZS1zZXJ2ZXIvYCksIHNoYXJlZCB3aXRoIG5hcGFyaS1qczsgcmUtZXhwb3J0ZWQgc28gdGhlIE9TRFxuICogIG1vZHVsZXMga2VlcCBpbXBvcnRpbmcgaXQgZnJvbSBoZXJlLiAqL1xuZXhwb3J0IHsgYnVpbGRUaWxlVXJsIH0gZnJvbSAnLi4vdGlsZS1zZXJ2ZXIvdGlsZS1wcm90b2NvbCc7XG5leHBvcnQgdHlwZSB7IFRpbGVDb29yZHMgfSBmcm9tICcuLi90aWxlLXNlcnZlci90aWxlLXByb3RvY29sJztcblxuLyoqIEZldGNoIGEgdGlsZSBQTkcgYW5kIGRlY29kZSBpdCB0byBhbiBJbWFnZUJpdG1hcC4gVGhlIGNhbGxlciBvd25zIHRoZVxuICogIGJpdG1hcCAoY2FsbCBgY2xvc2UoKWAgd2hlbiBkb25lKS4gVGhyb3dzIG9uIG5ldHdvcmsvZGVjb2RlIGZhaWx1cmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hUaWxlQml0bWFwKGh0dHA6IEh0dHBDbGllbnQsIHVybDogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8SW1hZ2VCaXRtYXA+IHtcbiAgY29uc3QgYmxvYiA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKHRpbWVvdXQodGltZW91dE1zKSkpO1xuICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYmxvYik7XG59XG5cbi8qKiBGZXRjaCBhIHRpbGUgYW5kIHJlYWQgaXRzIHBpeGVscyBiYWNrIGFzIFJHQkEgSW1hZ2VEYXRhICh2aWEgYW4gb2Zmc2NyZWVuXG4gKiAgY2FudmFzKS4gUmV0dXJucyBudWxsIG9ubHkgd2hlbiBhIDJkIGNvbnRleHQgY2FuJ3QgYmUgY3JlYXRlZDsgdGhyb3dzIG9uXG4gKiAgbmV0d29yay9kZWNvZGUgZmFpbHVyZSAodGhlIGNhbGxlcidzIHRhZ2dlZCBjYXRjaCBoYW5kbGVzIGl0KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFRpbGVSZ2JhKGh0dHA6IEh0dHBDbGllbnQsIHVybDogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8SW1hZ2VEYXRhIHwgbnVsbD4ge1xuICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGVCaXRtYXAoaHR0cCwgdXJsLCB0aW1lb3V0TXMpO1xuICB0cnkge1xuICAgIHJldHVybiByZWFkUmdiYShibXAsIGJtcC53aWR0aCwgYm1wLmhlaWdodCk7XG4gIH0gZmluYWxseSB7XG4gICAgYm1wLmNsb3NlPy4oKTtcbiAgfVxufVxuXG4vKiogRHJhdyBhIGRlY29kZWQgaW1hZ2UgKGJpdG1hcCwgYDxpbWc+YCwgY2FudmFzKSBvbnRvIGEgc2NyYXRjaCBjYW52YXMgYW5kXG4gKiAgcmVhZCBpdHMgcGl4ZWxzIGJhY2sgYXMgUkdCQSBJbWFnZURhdGEuIE51bGwgd2hlbiBhIDJkIGNvbnRleHQgY2FuJ3QgYmVcbiAqICBjcmVhdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZ2JhKHNyYzogQ2FudmFzSW1hZ2VTb3VyY2UsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSW1hZ2VEYXRhIHwgbnVsbCB7XG4gIGNvbnN0IGN2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIGN2LndpZHRoID0gd2lkdGg7XG4gIGN2LmhlaWdodCA9IGhlaWdodDtcbiAgY29uc3QgY3R4ID0gY3YuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuICBjdHguZHJhd0ltYWdlKHNyYywgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xufVxuIl19
|