@jax-data-science/sci-image-visualizer 0.8.3 → 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 +358 -4218
- 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 -34467
- 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 -883
- 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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { WORLD, boundsKind, regionHasHoles, regionPathD } from './region-geometry';
|
|
2
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
3
|
+
export const IDENTITY_AFFINE = [1, 0, 0, 1, 0, 0];
|
|
4
|
+
/**
|
|
5
|
+
* The affine of a projection that is affine (pan/zoom/rotate/flip), read from
|
|
6
|
+
* where it sends (0,0), (1,0) and (0,1) — how the OSD overlay gets its matrix
|
|
7
|
+
* from the viewport transform without depending on viewer internals. (napari-js
|
|
8
|
+
* hands the napari overlay its matrix directly: `Viewer.canvasTransform()`.)
|
|
9
|
+
*/
|
|
10
|
+
export function affineFromProjection(project) {
|
|
11
|
+
const [ox, oy] = project(0, 0);
|
|
12
|
+
const [ux, uy] = project(1, 0);
|
|
13
|
+
const [vx, vy] = project(0, 1);
|
|
14
|
+
return [ux - ox, uy - oy, vx - ox, vy - oy, ox, oy];
|
|
15
|
+
}
|
|
16
|
+
/** Apply an affine to a point. */
|
|
17
|
+
export function applyAffine(m, x, y) {
|
|
18
|
+
return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A screen-space layer: elements positioned from world anchors through the
|
|
22
|
+
* current camera, re-positioned (not rebuilt) on every camera change.
|
|
23
|
+
*/
|
|
24
|
+
export class ScreenLayer {
|
|
25
|
+
constructor(group, project) {
|
|
26
|
+
this.group = group;
|
|
27
|
+
this.project = project;
|
|
28
|
+
this.placed = [];
|
|
29
|
+
}
|
|
30
|
+
/** Append `el`, positioned by `place` now and after every camera change. */
|
|
31
|
+
place(el, place) {
|
|
32
|
+
place(el, this.project);
|
|
33
|
+
this.group.appendChild(el);
|
|
34
|
+
this.placed.push({ el, place: place });
|
|
35
|
+
return el;
|
|
36
|
+
}
|
|
37
|
+
/** Append `el` with attributes `x`/`y` (e.g. `'cx'`/`'cy'`) at a world point, offset in pixels. */
|
|
38
|
+
at(el, wx, wy, attrs = {}) {
|
|
39
|
+
const { x = 'x', y = 'y', dx = 0, dy = 0 } = attrs;
|
|
40
|
+
return this.place(el, (e, project) => {
|
|
41
|
+
const [sx, sy] = project(wx, wy);
|
|
42
|
+
e.setAttribute(x, `${sx + dx}`);
|
|
43
|
+
e.setAttribute(y, `${sy + dy}`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** A `<line>` between two world points. */
|
|
47
|
+
line(ax, ay, bx, by) {
|
|
48
|
+
return this.place(svgEl('line'), (e, project) => {
|
|
49
|
+
const [x1, y1] = project(ax, ay);
|
|
50
|
+
const [x2, y2] = project(bx, by);
|
|
51
|
+
e.setAttribute('x1', `${x1}`);
|
|
52
|
+
e.setAttribute('y1', `${y1}`);
|
|
53
|
+
e.setAttribute('x2', `${x2}`);
|
|
54
|
+
e.setAttribute('y2', `${y2}`);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** A `<polygon>` / `<polyline>` through world points. */
|
|
58
|
+
poly(tag, pts) {
|
|
59
|
+
return this.place(svgEl(tag), (e, project) => {
|
|
60
|
+
e.setAttribute('points', pts.map((p) => project(p.x, p.y).join(',')).join(' '));
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Re-position every element for the current camera. */
|
|
64
|
+
reproject() {
|
|
65
|
+
for (const { el, place } of this.placed)
|
|
66
|
+
place(el, this.project);
|
|
67
|
+
}
|
|
68
|
+
get isEmpty() {
|
|
69
|
+
return !this.group.firstChild;
|
|
70
|
+
}
|
|
71
|
+
clear() {
|
|
72
|
+
this.placed.length = 0;
|
|
73
|
+
while (this.group.firstChild)
|
|
74
|
+
this.group.removeChild(this.group.firstChild);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Create an SVG element. */
|
|
78
|
+
export function svgEl(tag) {
|
|
79
|
+
return document.createElementNS(SVG_NS, tag);
|
|
80
|
+
}
|
|
81
|
+
export class SvgRegionRenderer {
|
|
82
|
+
constructor(svg, opts) {
|
|
83
|
+
this.svg = svg;
|
|
84
|
+
this.opts = opts;
|
|
85
|
+
this.camera = IDENTITY_AFFINE;
|
|
86
|
+
this.world = svgEl('g');
|
|
87
|
+
/** World → svg-local pixels through the current camera. */
|
|
88
|
+
this.project = (x, y) => applyAffine(this.camera, x, y);
|
|
89
|
+
this.world.setAttribute('data-layer', 'regions');
|
|
90
|
+
this.labels = new ScreenLayer(svgEl('g'), this.project);
|
|
91
|
+
this.labels.group.setAttribute('data-layer', 'labels');
|
|
92
|
+
this.overlay = new ScreenLayer(svgEl('g'), this.project);
|
|
93
|
+
this.overlay.group.setAttribute('data-layer', 'overlay');
|
|
94
|
+
this.applyCamera();
|
|
95
|
+
}
|
|
96
|
+
/** The current world → svg-local affine. */
|
|
97
|
+
get affine() {
|
|
98
|
+
return this.camera;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Move the camera: rewrite the world group's transform and re-position the
|
|
102
|
+
* screen-space elements. No element is created or removed. Returns false
|
|
103
|
+
* (and touches nothing) when the affine did not change.
|
|
104
|
+
*/
|
|
105
|
+
setCamera(affine) {
|
|
106
|
+
if (!affine.every(Number.isFinite))
|
|
107
|
+
return false;
|
|
108
|
+
if (affine.every((v, i) => v === this.camera[i]))
|
|
109
|
+
return false;
|
|
110
|
+
this.camera = affine;
|
|
111
|
+
this.applyCamera();
|
|
112
|
+
this.labels.reproject();
|
|
113
|
+
this.overlay.reproject();
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
/** Rebuild the region shapes (world space) and their decorations. */
|
|
117
|
+
render(regions, selected) {
|
|
118
|
+
const shapes = document.createDocumentFragment();
|
|
119
|
+
this.labels.clear();
|
|
120
|
+
const sel = new Set(selected);
|
|
121
|
+
regions.forEach((region, i) => {
|
|
122
|
+
if (this.opts.skip?.(region))
|
|
123
|
+
return;
|
|
124
|
+
const isSel = sel.has(i);
|
|
125
|
+
const el = this.shapeOf(region);
|
|
126
|
+
if (el) {
|
|
127
|
+
el.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
128
|
+
this.opts.styleShape(el, region, isSel);
|
|
129
|
+
shapes.appendChild(el);
|
|
130
|
+
}
|
|
131
|
+
this.opts.decorate?.(region, i, isSel, this.labels);
|
|
132
|
+
});
|
|
133
|
+
while (this.world.firstChild)
|
|
134
|
+
this.world.removeChild(this.world.firstChild);
|
|
135
|
+
this.world.appendChild(shapes);
|
|
136
|
+
this.sync();
|
|
137
|
+
}
|
|
138
|
+
/** Rebuild the overlay layer (the selected region's handles, drafts). */
|
|
139
|
+
renderOverlay(build) {
|
|
140
|
+
this.overlay.clear();
|
|
141
|
+
build(this.overlay);
|
|
142
|
+
this.sync();
|
|
143
|
+
}
|
|
144
|
+
/** Remove every layer from the svg. */
|
|
145
|
+
destroy() {
|
|
146
|
+
for (const g of [this.world, this.labels.group, this.overlay.group])
|
|
147
|
+
g.parentNode?.removeChild(g);
|
|
148
|
+
}
|
|
149
|
+
applyCamera() {
|
|
150
|
+
this.world.setAttribute('transform', `matrix(${this.camera.join(' ')})`);
|
|
151
|
+
}
|
|
152
|
+
/** Attach the layers that have content (in order) and detach the empty ones. */
|
|
153
|
+
sync() {
|
|
154
|
+
const layers = [
|
|
155
|
+
[this.world, !!this.world.firstChild],
|
|
156
|
+
[this.labels.group, !this.labels.isEmpty],
|
|
157
|
+
[this.overlay.group, !this.overlay.isEmpty],
|
|
158
|
+
];
|
|
159
|
+
let before = null;
|
|
160
|
+
for (let i = layers.length - 1; i >= 0; i--) {
|
|
161
|
+
const [g, show] = layers[i];
|
|
162
|
+
if (!show) {
|
|
163
|
+
g.parentNode?.removeChild(g);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (g.parentNode !== this.svg || g.nextSibling !== before) {
|
|
167
|
+
if (before)
|
|
168
|
+
this.svg.insertBefore(g, before);
|
|
169
|
+
else if (g.parentNode !== this.svg)
|
|
170
|
+
this.svg.appendChild(g);
|
|
171
|
+
}
|
|
172
|
+
before = g;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** The world-space element for a region's geometry, or null when it has none. */
|
|
176
|
+
shapeOf(region) {
|
|
177
|
+
const b = region.bounds;
|
|
178
|
+
switch (boundsKind(b)) {
|
|
179
|
+
case 'rect': {
|
|
180
|
+
const r = b;
|
|
181
|
+
const x0 = Math.min(r.x, r.x + r.width), y0 = Math.min(r.y, r.y + r.height);
|
|
182
|
+
const w = Math.abs(r.width), h = Math.abs(r.height);
|
|
183
|
+
if (this.opts.rectElement === 'rect') {
|
|
184
|
+
const el = svgEl('rect');
|
|
185
|
+
el.setAttribute('x', `${x0}`);
|
|
186
|
+
el.setAttribute('y', `${y0}`);
|
|
187
|
+
el.setAttribute('width', `${w}`);
|
|
188
|
+
el.setAttribute('height', `${h}`);
|
|
189
|
+
return el;
|
|
190
|
+
}
|
|
191
|
+
const el = svgEl('polygon');
|
|
192
|
+
el.setAttribute('points', `${x0},${y0} ${x0 + w},${y0} ${x0 + w},${y0 + h} ${x0},${y0 + h}`);
|
|
193
|
+
return el;
|
|
194
|
+
}
|
|
195
|
+
case 'poly': {
|
|
196
|
+
const p = b;
|
|
197
|
+
const n = p.xpoints?.length ?? 0;
|
|
198
|
+
if (n === 0)
|
|
199
|
+
return null;
|
|
200
|
+
const holes = regionHasHoles(region);
|
|
201
|
+
if ((p.bezier && n >= 2) || holes)
|
|
202
|
+
return pathEl(regionPathD(region, WORLD), holes);
|
|
203
|
+
const el = svgEl(p.closed === false ? 'polyline' : 'polygon');
|
|
204
|
+
let pts = '';
|
|
205
|
+
for (let i = 0; i < n; i++)
|
|
206
|
+
pts += `${i ? ' ' : ''}${p.xpoints[i]},${p.ypoints[i]}`;
|
|
207
|
+
el.setAttribute('points', pts);
|
|
208
|
+
return el;
|
|
209
|
+
}
|
|
210
|
+
case 'multi': {
|
|
211
|
+
const parts = b.polygons;
|
|
212
|
+
if (!parts.some((p) => (p.xpoints?.length ?? 0) >= 3))
|
|
213
|
+
return null;
|
|
214
|
+
return pathEl(regionPathD(region, WORLD), true);
|
|
215
|
+
}
|
|
216
|
+
default:
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function pathEl(d, evenOdd) {
|
|
222
|
+
const el = svgEl('path');
|
|
223
|
+
el.setAttribute('d', d);
|
|
224
|
+
if (evenOdd)
|
|
225
|
+
el.setAttribute('fill-rule', 'evenodd');
|
|
226
|
+
return el;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLXJlZ2lvbi1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxQkEsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5GLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDO0FBUTVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBNEQ7SUFDL0YsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxrQ0FBa0M7QUFDbEMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDekQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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RUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUNuRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRDtnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxNQUFNLENBQUMsQ0FBUyxFQUFFLE9BQWdCO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFJLE9BQU87UUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmxkLXNwYWNlIFNWRyByZWdpb24gcmVuZGVyZXIgc2hhcmVkIGJ5IHRoZSBPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmlcbiAqIG92ZXJsYXlzIChyZXZpZXcgTkFQQVJJLUJPVU5EQVJZLTEwLCBPU0QtUExPVExZLTExKS5cbiAqXG4gKiBUaGUgb3ZlcmxheXMgdXNlZCB0byBkZWxldGUgYW5kIHJlYnVpbGQgZXZlcnkgcmVnaW9uIGVsZW1lbnQgb24gZXZlcnkgY2FtZXJhXG4gKiBmcmFtZSwgcHJvamVjdGluZyBldmVyeSB2ZXJ0ZXggdG8gc2NyZWVuIHBpeGVscyAobmFwYXJpIGFsc28gcmVhZCB0aGUgbGF5b3V0XG4gKiBvbmNlIHBlciB2ZXJ0ZXgpLiBIZXJlIHJlZ2lvbiBnZW9tZXRyeSBpcyBkcmF3biBPTkNFLCBpbiB3b3JsZCBjb29yZGluYXRlcyxcbiAqIGluc2lkZSBhIHNpbmdsZSBgPGcgdHJhbnNmb3JtPVwibWF0cml4KGEgYiBjIGQgZSBmKVwiPmAsIHdpdGhcbiAqIGB2ZWN0b3ItZWZmZWN0OiBub24tc2NhbGluZy1zdHJva2VgIHNvIHN0cm9rZXMga2VlcCB0aGVpciBwaXhlbCB3aWR0aC4gQVxuICogY2FtZXJhIGNoYW5nZSByZXdyaXRlcyB0aGF0IG9uZSBhdHRyaWJ1dGUgYW5kIHJlLXBvc2l0aW9ucyB0aGUgZmV3XG4gKiBzY3JlZW4tc2l6ZWQgZWxlbWVudHMgKGxhYmVscywgdGhlIHNlbGVjdGVkIHJlZ2lvbidzIGhhbmRsZXMsIGEgZHJhZnQpIOKAlFxuICogbm90aGluZyBpcyBjcmVhdGVkIG9yIHJlbW92ZWQuIFJlZ2lvbiBub2RlcyBhcmUgcmVidWlsdCBvbmx5IHdoZW4gdGhlXG4gKiByZWdpb25zIG9yIHRoZSBzZWxlY3Rpb24gY2hhbmdlICh7QGxpbmsgcmVuZGVyfSkuXG4gKlxuICogTGF5ZXJzLCBib3R0b20gdG8gdG9wLCBlYWNoIGF0dGFjaGVkIG9ubHkgd2hpbGUgaXQgaGFzIGNvbnRlbnQ6XG4gKiAgMS4gd29ybGQgICDigJQgcmVnaW9uIHNoYXBlcywgaW4gd29ybGQgY29vcmRpbmF0ZXMgKHRyYW5zZm9ybWVkIGdyb3VwKTtcbiAqICAyLiBsYWJlbHMgIOKAlCBzY3JlZW4tc3BhY2UgdGV4dCBwaW5uZWQgdG8gd29ybGQgYW5jaG9ycywgcmVidWlsdCB3aXRoIHRoZSByZWdpb25zO1xuICogIDMuIG92ZXJsYXkg4oCUIHNjcmVlbi1zcGFjZSBoYW5kbGVzL2RyYWZ0cywgcmVidWlsdCBieSB0aGUgb3ZlcmxheSBvbiBkZW1hbmRcbiAqICAgICAoe0BsaW5rIHJlbmRlck92ZXJsYXl9KS5cbiAqL1xuaW1wb3J0IHsgTXVsdGlQb2x5Z29uLCBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgV09STEQsIGJvdW5kc0tpbmQsIHJlZ2lvbkhhc0hvbGVzLCByZWdpb25QYXRoRCB9IGZyb20gJy4vcmVnaW9uLWdlb21ldHJ5JztcblxuY29uc3QgU1ZHX05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcblxuLyoqIEFuIFNWRyBhZmZpbmUgYG1hdHJpeChhIGIgYyBkIGUgZilgOiB4JyA9IGHCt3ggKyBjwrd5ICsgZSwgeScgPSBiwrd4ICsgZMK3eSArIGYuICovXG5leHBvcnQgdHlwZSBBZmZpbmUgPSByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBXb3JsZCDihpIgc3ZnLWxvY2FsIHBpeGVsIHByb2plY3Rpb24uICovXG5leHBvcnQgdHlwZSBQcm9qZWN0ID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgSURFTlRJVFlfQUZGSU5FOiBBZmZpbmUgPSBbMSwgMCwgMCwgMSwgMCwgMF07XG5cbi8qKlxuICogVGhlIGFmZmluZSBvZiBhIHByb2plY3Rpb24gdGhhdCBpcyBhZmZpbmUgKHBhbi96b29tL3JvdGF0ZS9mbGlwKSwgcmVhZCBmcm9tXG4gKiB3aGVyZSBpdCBzZW5kcyAoMCwwKSwgKDEsMCkgYW5kICgwLDEpIOKAlCBob3cgdGhlIE9TRCBvdmVybGF5IGdldHMgaXRzIG1hdHJpeFxuICogZnJvbSB0aGUgdmlld3BvcnQgdHJhbnNmb3JtIHdpdGhvdXQgZGVwZW5kaW5nIG9uIHZpZXdlciBpbnRlcm5hbHMuIChuYXBhcmktanNcbiAqIGhhbmRzIHRoZSBuYXBhcmkgb3ZlcmxheSBpdHMgbWF0cml4IGRpcmVjdGx5OiBgVmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpYC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZmZpbmVGcm9tUHJvamVjdGlvbihwcm9qZWN0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBBZmZpbmUge1xuICBjb25zdCBbb3gsIG95XSA9IHByb2plY3QoMCwgMCk7XG4gIGNvbnN0IFt1eCwgdXldID0gcHJvamVjdCgxLCAwKTtcbiAgY29uc3QgW3Z4LCB2eV0gPSBwcm9qZWN0KDAsIDEpO1xuICByZXR1cm4gW3V4IC0gb3gsIHV5IC0gb3ksIHZ4IC0gb3gsIHZ5IC0gb3ksIG94LCBveV07XG59XG5cbi8qKiBBcHBseSBhbiBhZmZpbmUgdG8gYSBwb2ludC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFmZmluZShtOiBBZmZpbmUsIHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbbVswXSAqIHggKyBtWzJdICogeSArIG1bNF0sIG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdXTtcbn1cblxuLyoqIEhvdyBhIHBsYWNlZCBzY3JlZW4gZWxlbWVudCBpcyAocmUpcG9zaXRpb25lZCBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhLiAqL1xuZXhwb3J0IHR5cGUgUGxhY2VtZW50PFQgZXh0ZW5kcyBTVkdFbGVtZW50PiA9IChlbDogVCwgcHJvamVjdDogUHJvamVjdCkgPT4gdm9pZDtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTdmdSZWdpb25SZW5kZXJlcn0uICovXG5leHBvcnQgaW50ZXJmYWNlIFN2Z1JlZ2lvblJlbmRlcmVyT3B0aW9ucyB7XG4gIC8qKiBEcmF3IGEge0BsaW5rIFJlY3RhbmdsZX0gYXMgYSBgPHJlY3Q+YCBvciBhcyBhIGZvdXItcG9pbnQgYDxwb2x5Z29uPmAuIERlZmF1bHQgcG9seWdvbi4gKi9cbiAgcmVjdEVsZW1lbnQ/OiAncmVjdCcgfCAncG9seWdvbic7XG4gIC8qKiBTdHJva2UgYW5kIGZpbGwgZm9yIG9uZSByZWdpb24ncyBzaGFwZSBlbGVtZW50LiAqL1xuICBzdHlsZVNoYXBlKGVsOiBTVkdFbGVtZW50LCByZWdpb246IFJlZ2lvbiwgc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQWRkIGEgcmVnaW9uJ3Mgc2NyZWVuLXNwYWNlIGRlY29yYXRpb25zIChpdHMgbGFiZWwpIOKAlCBvbmNlIHBlciB7QGxpbmsgcmVuZGVyfS4gKi9cbiAgZGVjb3JhdGU/KHJlZ2lvbjogUmVnaW9uLCBpbmRleDogbnVtYmVyLCBzZWxlY3RlZDogYm9vbGVhbiwgbGF5ZXI6IFNjcmVlbkxheWVyKTogdm9pZDtcbiAgLyoqIExlYXZlIGEgcmVnaW9uIG91dCBlbnRpcmVseSAoaXQga2VlcHMgaXRzIGluZGV4KS4gKi9cbiAgc2tpcD8ocmVnaW9uOiBSZWdpb24pOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgc2NyZWVuLXNwYWNlIGxheWVyOiBlbGVtZW50cyBwb3NpdGlvbmVkIGZyb20gd29ybGQgYW5jaG9ycyB0aHJvdWdoIHRoZVxuICogY3VycmVudCBjYW1lcmEsIHJlLXBvc2l0aW9uZWQgKG5vdCByZWJ1aWx0KSBvbiBldmVyeSBjYW1lcmEgY2hhbmdlLlxuICovXG5leHBvcnQgY2xhc3MgU2NyZWVuTGF5ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYWNlZDogQXJyYXk8eyBlbDogU1ZHRWxlbWVudDsgcGxhY2U6IFBsYWNlbWVudDxTVkdFbGVtZW50PiB9PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGdyb3VwOiBTVkdHRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3Q6IFByb2plY3QsXG4gICkge31cblxuICAvKiogQXBwZW5kIGBlbGAsIHBvc2l0aW9uZWQgYnkgYHBsYWNlYCBub3cgYW5kIGFmdGVyIGV2ZXJ5IGNhbWVyYSBjaGFuZ2UuICovXG4gIHBsYWNlPFQgZXh0ZW5kcyBTVkdFbGVtZW50PihlbDogVCwgcGxhY2U6IFBsYWNlbWVudDxUPik6IFQge1xuICAgIHBsYWNlKGVsLCB0aGlzLnByb2plY3QpO1xuICAgIHRoaXMuZ3JvdXAuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucGxhY2VkLnB1c2goeyBlbCwgcGxhY2U6IHBsYWNlIGFzIFBsYWNlbWVudDxTVkdFbGVtZW50PiB9KTtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICAvKiogQXBwZW5kIGBlbGAgd2l0aCBhdHRyaWJ1dGVzIGB4YC9geWAgKGUuZy4gYCdjeCdgL2AnY3knYCkgYXQgYSB3b3JsZCBwb2ludCwgb2Zmc2V0IGluIHBpeGVscy4gKi9cbiAgYXQ8VCBleHRlbmRzIFNWR0VsZW1lbnQ+KFxuICAgIGVsOiBULFxuICAgIHd4OiBudW1iZXIsXG4gICAgd3k6IG51bWJlcixcbiAgICBhdHRyczogeyB4Pzogc3RyaW5nOyB5Pzogc3RyaW5nOyBkeD86IG51bWJlcjsgZHk/OiBudW1iZXIgfSA9IHt9LFxuICApOiBUIHtcbiAgICBjb25zdCB7IHggPSAneCcsIHkgPSAneScsIGR4ID0gMCwgZHkgPSAwIH0gPSBhdHRycztcbiAgICByZXR1cm4gdGhpcy5wbGFjZShlbCwgKGUsIHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IFtzeCwgc3ldID0gcHJvamVjdCh3eCwgd3kpO1xuICAgICAgZS5zZXRBdHRyaWJ1dGUoeCwgYCR7c3ggKyBkeH1gKTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKHksIGAke3N5ICsgZHl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQSBgPGxpbmU+YCBiZXR3ZWVuIHR3byB3b3JsZCBwb2ludHMuICovXG4gIGxpbmUoYXg6IG51bWJlciwgYXk6IG51bWJlciwgYng6IG51bWJlciwgYnk6IG51bWJlcik6IFNWR0xpbmVFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wbGFjZShzdmdFbCgnbGluZScpLCAoZSwgcHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgW3gxLCB5MV0gPSBwcm9qZWN0KGF4LCBheSk7XG4gICAgICBjb25zdCBbeDIsIHkyXSA9IHByb2plY3QoYngsIGJ5KTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKCd4MScsIGAke3gxfWApO1xuICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3kxJywgYCR7eTF9YCk7XG4gICAgICBlLnNldEF0dHJpYnV0ZSgneDInLCBgJHt4Mn1gKTtcbiAgICAgIGUuc2V0QXR0cmlidXRlKCd5MicsIGAke3kyfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEEgYDxwb2x5Z29uPmAgLyBgPHBvbHlsaW5lPmAgdGhyb3VnaCB3b3JsZCBwb2ludHMuICovXG4gIHBvbHkodGFnOiAncG9seWdvbicgfCAncG9seWxpbmUnLCBwdHM6IFJlYWRvbmx5QXJyYXk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9Pik6IFNWR0VsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnBsYWNlKHN2Z0VsKHRhZyksIChlLCBwcm9qZWN0KSA9PiB7XG4gICAgICBlLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgcHRzLm1hcCgocCkgPT4gcHJvamVjdChwLngsIHAueSkuam9pbignLCcpKS5qb2luKCcgJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlLXBvc2l0aW9uIGV2ZXJ5IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IGNhbWVyYS4gKi9cbiAgcmVwcm9qZWN0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBlbCwgcGxhY2UgfSBvZiB0aGlzLnBsYWNlZCkgcGxhY2UoZWwsIHRoaXMucHJvamVjdCk7XG4gIH1cblxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZ3JvdXAuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2VkLmxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKHRoaXMuZ3JvdXAuZmlyc3RDaGlsZCkgdGhpcy5ncm91cC5yZW1vdmVDaGlsZCh0aGlzLmdyb3VwLmZpcnN0Q2hpbGQpO1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYW4gU1ZHIGVsZW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gc3ZnRWw8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEspOiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSB7XG4gIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCB0YWcpO1xufVxuXG5leHBvcnQgY2xhc3MgU3ZnUmVnaW9uUmVuZGVyZXIge1xuICBwcml2YXRlIGNhbWVyYTogQWZmaW5lID0gSURFTlRJVFlfQUZGSU5FO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmxkID0gc3ZnRWwoJ2cnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbHM6IFNjcmVlbkxheWVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXk6IFNjcmVlbkxheWVyO1xuXG4gIC8qKiBXb3JsZCDihpIgc3ZnLWxvY2FsIHBpeGVscyB0aHJvdWdoIHRoZSBjdXJyZW50IGNhbWVyYS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogUHJvamVjdCA9ICh4LCB5KSA9PiBhcHBseUFmZmluZSh0aGlzLmNhbWVyYSwgeCwgeSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRzOiBTdmdSZWdpb25SZW5kZXJlck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMud29ybGQuc2V0QXR0cmlidXRlKCdkYXRhLWxheWVyJywgJ3JlZ2lvbnMnKTtcbiAgICB0aGlzLmxhYmVscyA9IG5ldyBTY3JlZW5MYXllcihzdmdFbCgnZycpLCB0aGlzLnByb2plY3QpO1xuICAgIHRoaXMubGFiZWxzLmdyb3VwLnNldEF0dHJpYnV0ZSgnZGF0YS1sYXllcicsICdsYWJlbHMnKTtcbiAgICB0aGlzLm92ZXJsYXkgPSBuZXcgU2NyZWVuTGF5ZXIoc3ZnRWwoJ2cnKSwgdGhpcy5wcm9qZWN0KTtcbiAgICB0aGlzLm92ZXJsYXkuZ3JvdXAuc2V0QXR0cmlidXRlKCdkYXRhLWxheWVyJywgJ292ZXJsYXknKTtcbiAgICB0aGlzLmFwcGx5Q2FtZXJhKCk7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgd29ybGQg4oaSIHN2Zy1sb2NhbCBhZmZpbmUuICovXG4gIGdldCBhZmZpbmUoKTogQWZmaW5lIHtcbiAgICByZXR1cm4gdGhpcy5jYW1lcmE7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgY2FtZXJhOiByZXdyaXRlIHRoZSB3b3JsZCBncm91cCdzIHRyYW5zZm9ybSBhbmQgcmUtcG9zaXRpb24gdGhlXG4gICAqIHNjcmVlbi1zcGFjZSBlbGVtZW50cy4gTm8gZWxlbWVudCBpcyBjcmVhdGVkIG9yIHJlbW92ZWQuIFJldHVybnMgZmFsc2VcbiAgICogKGFuZCB0b3VjaGVzIG5vdGhpbmcpIHdoZW4gdGhlIGFmZmluZSBkaWQgbm90IGNoYW5nZS5cbiAgICovXG4gIHNldENhbWVyYShhZmZpbmU6IEFmZmluZSk6IGJvb2xlYW4ge1xuICAgIGlmICghYWZmaW5lLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYWZmaW5lLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSB0aGlzLmNhbWVyYVtpXSkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmNhbWVyYSA9IGFmZmluZTtcbiAgICB0aGlzLmFwcGx5Q2FtZXJhKCk7XG4gICAgdGhpcy5sYWJlbHMucmVwcm9qZWN0KCk7XG4gICAgdGhpcy5vdmVybGF5LnJlcHJvamVjdCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHJlZ2lvbiBzaGFwZXMgKHdvcmxkIHNwYWNlKSBhbmQgdGhlaXIgZGVjb3JhdGlvbnMuICovXG4gIHJlbmRlcihyZWdpb25zOiBSZWFkb25seUFycmF5PFJlZ2lvbj4sIHNlbGVjdGVkOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBzaGFwZXMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy5sYWJlbHMuY2xlYXIoKTtcbiAgICBjb25zdCBzZWwgPSBuZXcgU2V0KHNlbGVjdGVkKTtcbiAgICByZWdpb25zLmZvckVhY2goKHJlZ2lvbiwgaSkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0cy5za2lwPy4ocmVnaW9uKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNTZWwgPSBzZWwuaGFzKGkpO1xuICAgICAgY29uc3QgZWwgPSB0aGlzLnNoYXBlT2YocmVnaW9uKTtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3ZlY3Rvci1lZmZlY3QnLCAnbm9uLXNjYWxpbmctc3Ryb2tlJyk7XG4gICAgICAgIHRoaXMub3B0cy5zdHlsZVNoYXBlKGVsLCByZWdpb24sIGlzU2VsKTtcbiAgICAgICAgc2hhcGVzLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0cy5kZWNvcmF0ZT8uKHJlZ2lvbiwgaSwgaXNTZWwsIHRoaXMubGFiZWxzKTtcbiAgICB9KTtcbiAgICB3aGlsZSAodGhpcy53b3JsZC5maXJzdENoaWxkKSB0aGlzLndvcmxkLnJlbW92ZUNoaWxkKHRoaXMud29ybGQuZmlyc3RDaGlsZCk7XG4gICAgdGhpcy53b3JsZC5hcHBlbmRDaGlsZChzaGFwZXMpO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG92ZXJsYXkgbGF5ZXIgKHRoZSBzZWxlY3RlZCByZWdpb24ncyBoYW5kbGVzLCBkcmFmdHMpLiAqL1xuICByZW5kZXJPdmVybGF5KGJ1aWxkOiAobGF5ZXI6IFNjcmVlbkxheWVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vdmVybGF5LmNsZWFyKCk7XG4gICAgYnVpbGQodGhpcy5vdmVybGF5KTtcbiAgICB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgZXZlcnkgbGF5ZXIgZnJvbSB0aGUgc3ZnLiAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZyBvZiBbdGhpcy53b3JsZCwgdGhpcy5sYWJlbHMuZ3JvdXAsIHRoaXMub3ZlcmxheS5ncm91cF0pIGcucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQoZyk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q2FtZXJhKCk6IHZvaWQge1xuICAgIHRoaXMud29ybGQuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgbWF0cml4KCR7dGhpcy5jYW1lcmEuam9pbignICcpfSlgKTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIGxheWVycyB0aGF0IGhhdmUgY29udGVudCAoaW4gb3JkZXIpIGFuZCBkZXRhY2ggdGhlIGVtcHR5IG9uZXMuICovXG4gIHByaXZhdGUgc3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXllcnM6IEFycmF5PFtTVkdHRWxlbWVudCwgYm9vbGVhbl0+ID0gW1xuICAgICAgW3RoaXMud29ybGQsICEhdGhpcy53b3JsZC5maXJzdENoaWxkXSxcbiAgICAgIFt0aGlzLmxhYmVscy5ncm91cCwgIXRoaXMubGFiZWxzLmlzRW1wdHldLFxuICAgICAgW3RoaXMub3ZlcmxheS5ncm91cCwgIXRoaXMub3ZlcmxheS5pc0VtcHR5XSxcbiAgICBdO1xuICAgIGxldCBiZWZvcmU6IENoaWxkTm9kZSB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IFtnLCBzaG93XSA9IGxheWVyc1tpXTtcbiAgICAgIGlmICghc2hvdykge1xuICAgICAgICBnLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKGcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnLnBhcmVudE5vZGUgIT09IHRoaXMuc3ZnIHx8IGcubmV4dFNpYmxpbmcgIT09IGJlZm9yZSkge1xuICAgICAgICBpZiAoYmVmb3JlKSB0aGlzLnN2Zy5pbnNlcnRCZWZvcmUoZywgYmVmb3JlKTtcbiAgICAgICAgZWxzZSBpZiAoZy5wYXJlbnROb2RlICE9PSB0aGlzLnN2ZykgdGhpcy5zdmcuYXBwZW5kQ2hpbGQoZyk7XG4gICAgICB9XG4gICAgICBiZWZvcmUgPSBnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgd29ybGQtc3BhY2UgZWxlbWVudCBmb3IgYSByZWdpb24ncyBnZW9tZXRyeSwgb3IgbnVsbCB3aGVuIGl0IGhhcyBub25lLiAqL1xuICBwcml2YXRlIHNoYXBlT2YocmVnaW9uOiBSZWdpb24pOiBTVkdFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgc3dpdGNoIChib3VuZHNLaW5kKGIpKSB7XG4gICAgICBjYXNlICdyZWN0Jzoge1xuICAgICAgICBjb25zdCByID0gYiBhcyBSZWN0YW5nbGU7XG4gICAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oci54LCByLnggKyByLndpZHRoKSxcbiAgICAgICAgICB5MCA9IE1hdGgubWluKHIueSwgci55ICsgci5oZWlnaHQpO1xuICAgICAgICBjb25zdCB3ID0gTWF0aC5hYnMoci53aWR0aCksXG4gICAgICAgICAgaCA9IE1hdGguYWJzKHIuaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5yZWN0RWxlbWVudCA9PT0gJ3JlY3QnKSB7XG4gICAgICAgICAgY29uc3QgZWwgPSBzdmdFbCgncmVjdCcpO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgneCcsIGAke3gwfWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgneScsIGAke3kwfWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHt3fWApO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7aH1gKTtcbiAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWwgPSBzdmdFbCgncG9seWdvbicpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGAke3gwfSwke3kwfSAke3gwICsgd30sJHt5MH0gJHt4MCArIHd9LCR7eTAgKyBofSAke3gwfSwke3kwICsgaH1gKTtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuICAgICAgY2FzZSAncG9seSc6IHtcbiAgICAgICAgY29uc3QgcCA9IGIgYXMgUG9seWdvbjtcbiAgICAgICAgY29uc3QgbiA9IHAueHBvaW50cz8ubGVuZ3RoID8/IDA7XG4gICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgaG9sZXMgPSByZWdpb25IYXNIb2xlcyhyZWdpb24pO1xuICAgICAgICBpZiAoKHAuYmV6aWVyICYmIG4gPj0gMikgfHwgaG9sZXMpIHJldHVybiBwYXRoRWwocmVnaW9uUGF0aEQocmVnaW9uLCBXT1JMRCksIGhvbGVzKTtcbiAgICAgICAgY29uc3QgZWwgPSBzdmdFbChwLmNsb3NlZCA9PT0gZmFsc2UgPyAncG9seWxpbmUnIDogJ3BvbHlnb24nKTtcbiAgICAgICAgbGV0IHB0cyA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgcHRzICs9IGAke2kgPyAnICcgOiAnJ30ke3AueHBvaW50c1tpXX0sJHtwLnlwb2ludHNbaV19YDtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBwdHMpO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG4gICAgICBjYXNlICdtdWx0aSc6IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSAoYiBhcyBNdWx0aVBvbHlnb24pLnBvbHlnb25zO1xuICAgICAgICBpZiAoIXBhcnRzLnNvbWUoKHApID0+IChwLnhwb2ludHM/Lmxlbmd0aCA/PyAwKSA+PSAzKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwYXRoRWwocmVnaW9uUGF0aEQocmVnaW9uLCBXT1JMRCksIHRydWUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhdGhFbChkOiBzdHJpbmcsIGV2ZW5PZGQ6IGJvb2xlYW4pOiBTVkdQYXRoRWxlbWVudCB7XG4gIGNvbnN0IGVsID0gc3ZnRWwoJ3BhdGgnKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdkJywgZCk7XG4gIGlmIChldmVuT2RkKSBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtcnVsZScsICdldmVub2RkJyk7XG4gIHJldHVybiBlbDtcbn1cbiJdfQ==
|
|
@@ -8,11 +8,12 @@ export class RenderOrchestrator {
|
|
|
8
8
|
if (!smallInfo) {
|
|
9
9
|
try {
|
|
10
10
|
await this.host.renderPhase(info, false);
|
|
11
|
-
this.host.finished(false
|
|
11
|
+
this.host.finished(false);
|
|
12
12
|
}
|
|
13
13
|
catch (err) {
|
|
14
14
|
console.error('Preview failed', err);
|
|
15
|
-
this.host.finished(false
|
|
15
|
+
this.host.finished(false);
|
|
16
|
+
this.host.renderFailed(err);
|
|
16
17
|
}
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
@@ -21,7 +22,6 @@ export class RenderOrchestrator {
|
|
|
21
22
|
await this.host.renderPhase(smallInfo, false);
|
|
22
23
|
this.host.smallShown();
|
|
23
24
|
smallReleasedOverlay = true;
|
|
24
|
-
console.log('multi-tier: small tier rendered, starting large');
|
|
25
25
|
}
|
|
26
26
|
catch (err) {
|
|
27
27
|
// Small-tier render failed (older backend without tier support, transient
|
|
@@ -31,17 +31,20 @@ export class RenderOrchestrator {
|
|
|
31
31
|
try {
|
|
32
32
|
await this.renderLargeWithRetry(info);
|
|
33
33
|
this.host.sharpenSettled();
|
|
34
|
-
|
|
35
|
-
this.host.finished(true, 'multi-tier: large tier rendered, sharpening complete');
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
this.host.finished(false, 'finished plotting (large only after small fallback)');
|
|
39
|
-
}
|
|
34
|
+
this.host.finished(smallReleasedOverlay);
|
|
40
35
|
}
|
|
41
36
|
catch (err) {
|
|
42
37
|
this.host.sharpenSettled();
|
|
43
38
|
console.error('Large-tier preview failed after retry', err);
|
|
44
|
-
|
|
39
|
+
if (smallReleasedOverlay) {
|
|
40
|
+
this.host.sharpenFailed(err);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// The small tier never made it either: there is no preview to fall back
|
|
44
|
+
// on, and the overlay is still up.
|
|
45
|
+
this.host.finished(false);
|
|
46
|
+
this.host.renderFailed(err);
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
/** One retry after a brief delay before giving up on the large tier. */
|
|
@@ -84,4 +87,4 @@ export class SliceScrubber {
|
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQ0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUNuRixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsb0JBQW9CLENBQUMsSUFBZ0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1RSxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFDVSxLQUEwQixFQUMxQixVQUFVLEdBQUc7UUFEYixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFNO1FBSmYsVUFBSyxHQUF5QyxJQUFJLENBQUM7SUFLeEQsQ0FBQztJQUVKLGlEQUFpRDtJQUNqRCxLQUFLLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixNQUFNLENBQUMsQ0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuXG4vKipcbiAqIFR3by1wYXNzIChzbWFsbOKGkmxhcmdlKSByZW5kZXIgc2VxdWVuY2luZywgZXh0cmFjdGVkIGZyb21cbiAqIFZpc3VhbGl6ZXJDb21wb25lbnQgKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgNyDigJQgYSBwdXJlIG1vdmUgb2YgdGhlXG4gKiBvcmNoZXN0cmF0aW9uOyB0aGUgY29tcG9uZW50IGtlZXBzIHRoZSBVSSBmbGFncyBhbmQgc3VwcGxpZXMgdGhlbSB0aHJvdWdoXG4gKiB0aGUgaG9zdCBjYWxsYmFja3MpLlxuICpcbiAqIFdoZW4gdGhlIGZpbGUgaGFzIHNtYWxsLXRpZXIgVVJMcyB3ZSByZW5kZXIgdGhlIHNtYWxsIHRpZXIgZmlyc3QgZm9yIGEgZmFzdFxuICogYmx1cnJ5IHByZXZpZXcsIHJlbGVhc2UgdGhlIGxvYWRpbmcgb3ZlcmxheSAoa2VlcGluZyBhIHRyYW5zbHVjZW50XG4gKiBcInNoYXJwZW5pbmdcIiBzcGlubmVyKSwgdGhlbiBzaGFycGVuIGJ5IHJlLXJlbmRlcmluZyB0aGUgY2Fub25pY2FsIGxhcmdlIHRpZXJcbiAqIGluIHBsYWNlLiBXaXRob3V0IGEgc21hbGwgdGllciBpdCdzIHRoZSBvcmlnaW5hbCBzaW5nbGUgcGFzcy4gVGhlIGxhcmdlIHBhc3NcbiAqIHJldHJpZXMgb25jZSBhZnRlciBhIHNob3J0IGRlbGF5IOKAlCB0aGUgcHJldmlldyBlbmRwb2ludCBjYW4gaGl0IGEgdHJhbnNpZW50XG4gKiA1MDMgb3IgYSBsb2NrLWNvbnRlbnRpb24gd2luZG93LCBhbmQgdGhlIHNlY29uZCBhdHRlbXB0IHVzdWFsbHkgbGFuZHMgb25cbiAqIGZyZXNoIHByZS1nZW4tY2FjaGVkIFBOR3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHdvUGFzc1JlbmRlckhvc3Qge1xuICAvKiogTG9hZCArIHBsb3Qgb25lIHBoYXNlICh0aGUgY29tcG9uZW50IG93bnMgZGl2L3NjcmVlbi9wbG90LXR5cGUveiBhbmQgdGhlXG4gICAqICBuZXdlci1jbGljayBmaWxlbmFtZSBndWFyZCkuIGBpblBsYWNlYCB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgc28gdGhlXG4gICAqICBjYW52YXMgZG9lc24ndCBibGFuayBkdXJpbmcgdGhlIHNtYWxs4oaSbGFyZ2Ugc3dhcC4gKi9cbiAgcmVuZGVyUGhhc2UoaW5mbzogSUltYWdlSW5mbywgaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBUaGUgc21hbGwgdGllciBpcyBvbiBzY3JlZW4g4oCUIGRyb3AgdGhlIGZ1bGwgbG9hZGluZyBvdmVybGF5IHNvIHRoZSB1c2VyXG4gICAqICBzZWVzIHRoZSBibHVycnkgcHJldmlldywgYW5kIHNob3cgdGhlIHNoYXJwZW5pbmcgc3Bpbm5lci4gKi9cbiAgc21hbGxTaG93bigpOiB2b2lkO1xuICAvKiogVGhlIGxhcmdlIHJlbmRlciBzZXR0bGVkIChlaXRoZXIgd2F5KSDigJQgc2hhcnBlbmluZyBzcGlubmVyIG9mZi4gKi9cbiAgc2hhcnBlblNldHRsZWQoKTogdm9pZDtcbiAgLyoqIFJlbmRlcmluZyBmaW5pc2hlZC4gYHZpYVNtYWxsYCA9IHRoZSBvdmVybGF5IHdhcyBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZVxuICAgKiAgc21hbGwgdGllciAoc28gb25seSByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgYXBwbHkgdGhlIFJPSSk7IG90aGVyd2lzZVxuICAgKiAgZG8gdGhlIGZ1bGwgZmluYWxpemUgKG92ZXJsYXkgKyBydW5uaW5nICsgUk9JKS4gKi9cbiAgZmluaXNoZWQodmlhU21hbGw6IGJvb2xlYW4sIGxvZ1RhZzogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJPcmNoZXN0cmF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3Q6IFR3b1Bhc3NSZW5kZXJIb3N0LFxuICAgIHByaXZhdGUgcmV0cnlEZWxheU1zID0gMTAwMCxcbiAgKSB7fVxuXG4gIC8qKiBSdW4gdGhlIHJlbmRlcjogc2luZ2xlLXBhc3Mgd2hlbiBgc21hbGxJbmZvYCBpcyBudWxsLCB0d28tcGFzcyBvdGhlcndpc2UuICovXG4gIGFzeW5jIHJlbmRlcihpbmZvOiBJSW1hZ2VJbmZvLCBzbWFsbEluZm86IElJbWFnZUluZm8gfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzbWFsbEluZm8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSwgJ2ZpbmlzaGVkIHBsb3R0aW5nJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignUHJldmlldyBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UsICdwbG90dGluZyBhYm9ydGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNtYWxsUmVsZWFzZWRPdmVybGF5ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShzbWFsbEluZm8sIGZhbHNlKTtcbiAgICAgIHRoaXMuaG9zdC5zbWFsbFNob3duKCk7XG4gICAgICBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnbXVsdGktdGllcjogc21hbGwgdGllciByZW5kZXJlZCwgc3RhcnRpbmcgbGFyZ2UnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFNtYWxsLXRpZXIgcmVuZGVyIGZhaWxlZCAob2xkZXIgYmFja2VuZCB3aXRob3V0IHRpZXIgc3VwcG9ydCwgdHJhbnNpZW50XG4gICAgICAvLyBlcnJvciwg4oCmKS4gQ29udGludWUgd2l0aCBsYXJnZSBvbmx5OyB0aGUgb3ZlcmxheSBzdGF5cyB1cCB1bnRpbCBpdCBsYW5kcy5cbiAgICAgIGNvbnNvbGUud2FybignU21hbGwtdGllciBwcmV2aWV3IGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGxhcmdlJywgZXJyKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvKTtcbiAgICAgIHRoaXMuaG9zdC5zaGFycGVuU2V0dGxlZCgpO1xuICAgICAgaWYgKHNtYWxsUmVsZWFzZWRPdmVybGF5KSB7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZCh0cnVlLCAnbXVsdGktdGllcjogbGFyZ2UgdGllciByZW5kZXJlZCwgc2hhcnBlbmluZyBjb21wbGV0ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlLCAnZmluaXNoZWQgcGxvdHRpbmcgKGxhcmdlIG9ubHkgYWZ0ZXIgc21hbGwgZmFsbGJhY2spJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmhvc3Quc2hhcnBlblNldHRsZWQoKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgYWZ0ZXIgcmV0cnknLCBlcnIpO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5GYWlsZWQoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1Q0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLG9CQUFvQixDQUFDLElBQWdCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUUsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3RGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FDbEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBR3hCLFlBQ1UsS0FBMEIsRUFDMUIsVUFBVSxHQUFHO1FBRGIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBTTtRQUpmLFVBQUssR0FBeUMsSUFBSSxDQUFDO0lBS3hELENBQUM7SUFFSixpREFBaUQ7SUFDakQsS0FBSyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsTUFBTSxDQUFDLENBQVM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcblxuLyoqXG4gKiBUd28tcGFzcyAoc21hbGzihpJsYXJnZSkgcmVuZGVyIHNlcXVlbmNpbmcsIGV4dHJhY3RlZCBmcm9tXG4gKiBWaXN1YWxpemVyQ29tcG9uZW50IChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDcg4oCUIGEgcHVyZSBtb3ZlIG9mIHRoZVxuICogb3JjaGVzdHJhdGlvbjsgdGhlIGNvbXBvbmVudCBrZWVwcyB0aGUgVUkgZmxhZ3MgYW5kIHN1cHBsaWVzIHRoZW0gdGhyb3VnaFxuICogdGhlIGhvc3QgY2FsbGJhY2tzKS5cbiAqXG4gKiBXaGVuIHRoZSBmaWxlIGhhcyBzbWFsbC10aWVyIFVSTHMgd2UgcmVuZGVyIHRoZSBzbWFsbCB0aWVyIGZpcnN0IGZvciBhIGZhc3RcbiAqIGJsdXJyeSBwcmV2aWV3LCByZWxlYXNlIHRoZSBsb2FkaW5nIG92ZXJsYXkgKGtlZXBpbmcgYSB0cmFuc2x1Y2VudFxuICogXCJzaGFycGVuaW5nXCIgc3Bpbm5lciksIHRoZW4gc2hhcnBlbiBieSByZS1yZW5kZXJpbmcgdGhlIGNhbm9uaWNhbCBsYXJnZSB0aWVyXG4gKiBpbiBwbGFjZS4gV2l0aG91dCBhIHNtYWxsIHRpZXIgaXQncyB0aGUgb3JpZ2luYWwgc2luZ2xlIHBhc3MuIFRoZSBsYXJnZSBwYXNzXG4gKiByZXRyaWVzIG9uY2UgYWZ0ZXIgYSBzaG9ydCBkZWxheSDigJQgdGhlIHByZXZpZXcgZW5kcG9pbnQgY2FuIGhpdCBhIHRyYW5zaWVudFxuICogNTAzIG9yIGEgbG9jay1jb250ZW50aW9uIHdpbmRvdywgYW5kIHRoZSBzZWNvbmQgYXR0ZW1wdCB1c3VhbGx5IGxhbmRzIG9uXG4gKiBmcmVzaCBwcmUtZ2VuLWNhY2hlZCBQTkdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR3b1Bhc3NSZW5kZXJIb3N0IHtcbiAgLyoqIExvYWQgKyBwbG90IG9uZSBwaGFzZSAodGhlIGNvbXBvbmVudCBvd25zIGRpdi9zY3JlZW4vcGxvdC10eXBlL3ogYW5kIHRoZVxuICAgKiAgbmV3ZXItY2xpY2sgZmlsZW5hbWUgZ3VhcmQpLiBgaW5QbGFjZWAgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcmVuZGVyIHNvIHRoZVxuICAgKiAgY2FudmFzIGRvZXNuJ3QgYmxhbmsgZHVyaW5nIHRoZSBzbWFsbOKGkmxhcmdlIHN3YXAuIFJlamVjdHMgd2hlbiB0aGUgcGhhc2VcbiAgICogIGNvdWxkIG5vdCBiZSBkcmF3biAoaW5jbHVkaW5nIGEgYmFja2VuZCdzIGBwbG90KClgIHJlc29sdmluZyBmYWxzZSkuICovXG4gIHJlbmRlclBoYXNlKGluZm86IElJbWFnZUluZm8sIGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogVGhlIHNtYWxsIHRpZXIgaXMgb24gc2NyZWVuIOKAlCBkcm9wIHRoZSBmdWxsIGxvYWRpbmcgb3ZlcmxheSBzbyB0aGUgdXNlclxuICAgKiAgc2VlcyB0aGUgYmx1cnJ5IHByZXZpZXcsIGFuZCBzaG93IHRoZSBzaGFycGVuaW5nIHNwaW5uZXIuICovXG4gIHNtYWxsU2hvd24oKTogdm9pZDtcbiAgLyoqIFRoZSBsYXJnZSByZW5kZXIgc2V0dGxlZCAoZWl0aGVyIHdheSkg4oCUIHNoYXJwZW5pbmcgc3Bpbm5lciBvZmYuICovXG4gIHNoYXJwZW5TZXR0bGVkKCk6IHZvaWQ7XG4gIC8qKiBSZW5kZXJpbmcgZmluaXNoZWQuIGB2aWFTbWFsbGAgPSB0aGUgb3ZlcmxheSB3YXMgYWxyZWFkeSByZWxlYXNlZCBieSB0aGVcbiAgICogIHNtYWxsIHRpZXIgKHNvIG9ubHkgcmVsZWFzZSB0aGUgcnVubmluZyBndWFyZCArIGFwcGx5IHRoZSBST0kpOyBvdGhlcndpc2VcbiAgICogIGRvIHRoZSBmdWxsIGZpbmFsaXplIChvdmVybGF5ICsgcnVubmluZyArIFJPSSkuICovXG4gIGZpbmlzaGVkKHZpYVNtYWxsOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG4gIC8qKiBOb3RoaW5nIGNvdWxkIGJlIGRyYXduOiB0aGUgc2luZ2xlIHBhc3MgZmFpbGVkLCBvciBib3RoIHRpZXJzIGRpZC4gQ2FsbGVkXG4gICAqICBhZnRlciB7QGxpbmsgZmluaXNoZWR9ICh3aGljaCByZWxlYXNlcyB0aGUgb3ZlcmxheSksIHRvIHRlbGwgdGhlIHVzZXIuICovXG4gIHJlbmRlckZhaWxlZChlcnI6IHVua25vd24pOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVuZGVyT3JjaGVzdHJhdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0OiBUd29QYXNzUmVuZGVySG9zdCxcbiAgICBwcml2YXRlIHJldHJ5RGVsYXlNcyA9IDEwMDAsXG4gICkge31cblxuICAvKiogUnVuIHRoZSByZW5kZXI6IHNpbmdsZS1wYXNzIHdoZW4gYHNtYWxsSW5mb2AgaXMgbnVsbCwgdHdvLXBhc3Mgb3RoZXJ3aXNlLiAqL1xuICBhc3luYyByZW5kZXIoaW5mbzogSUltYWdlSW5mbywgc21hbGxJbmZvOiBJSW1hZ2VJbmZvIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc21hbGxJbmZvKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2UoaW5mbywgZmFsc2UpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXZpZXcgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ob3N0LnJlbmRlckZhaWxlZChlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2Uoc21hbGxJbmZvLCBmYWxzZSk7XG4gICAgICB0aGlzLmhvc3Quc21hbGxTaG93bigpO1xuICAgICAgc21hbGxSZWxlYXNlZE92ZXJsYXkgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gU21hbGwtdGllciByZW5kZXIgZmFpbGVkIChvbGRlciBiYWNrZW5kIHdpdGhvdXQgdGllciBzdXBwb3J0LCB0cmFuc2llbnRcbiAgICAgIC8vIGVycm9yLCDigKYpLiBDb250aW51ZSB3aXRoIGxhcmdlIG9ubHk7IHRoZSBvdmVybGF5IHN0YXlzIHVwIHVudGlsIGl0IGxhbmRzLlxuICAgICAgY29uc29sZS53YXJuKCdTbWFsbC10aWVyIHByZXZpZXcgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbGFyZ2UnLCBlcnIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckxhcmdlV2l0aFJldHJ5KGluZm8pO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICB0aGlzLmhvc3QuZmluaXNoZWQoc21hbGxSZWxlYXNlZE92ZXJsYXkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICBjb25zb2xlLmVycm9yKCdMYXJnZS10aWVyIHByZXZpZXcgZmFpbGVkIGFmdGVyIHJldHJ5JywgZXJyKTtcbiAgICAgIGlmIChzbWFsbFJlbGVhc2VkT3ZlcmxheSkge1xuICAgICAgICB0aGlzLmhvc3Quc2hhcnBlbkZhaWxlZChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIHNtYWxsIHRpZXIgbmV2ZXIgbWFkZSBpdCBlaXRoZXI6IHRoZXJlIGlzIG5vIHByZXZpZXcgdG8gZmFsbCBiYWNrXG4gICAgICAgIC8vIG9uLCBhbmQgdGhlIG92ZXJsYXkgaXMgc3RpbGwgdXAuXG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJGYWlsZWQoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { RenderOrchestrator } from './render-orchestrator';
|
|
2
|
+
import { Supersede } from './util/supersede';
|
|
3
|
+
/** A user-facing message for a failure: an HttpErrorResponse's server message, an
|
|
4
|
+
* Error's message, or the status text, else the value itself. */
|
|
5
|
+
export function errorMessage(err) {
|
|
6
|
+
const e = err;
|
|
7
|
+
return e?.error?.message || e?.message || e?.statusText || String(err);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The viewer's render pipeline: one image (or image-less dataset) at a time, the newest
|
|
11
|
+
* always winning.
|
|
12
|
+
*
|
|
13
|
+
* Every render takes a task from a {@link Supersede}: a newer render, a Cancel or
|
|
14
|
+
* teardown makes the older one stale — its callbacks return early instead of painting,
|
|
15
|
+
* releasing the newer render's overlay or applying its ROIs — and aborts the signal its
|
|
16
|
+
* loads were given, so superseded network work stops at the source. Sequencing of the
|
|
17
|
+
* small→large tiers lives in {@link RenderOrchestrator}; this owns the UI flags it
|
|
18
|
+
* drives ({@link running}, {@link sharpening}).
|
|
19
|
+
*/
|
|
20
|
+
export class ImageRenderSession {
|
|
21
|
+
constructor(host) {
|
|
22
|
+
this.host = host;
|
|
23
|
+
/** A render is in flight. */
|
|
24
|
+
this.running = false;
|
|
25
|
+
/** The small tier is on screen and the large one is still loading. */
|
|
26
|
+
this.sharpening = false;
|
|
27
|
+
/** Set once the plot div exists; an image-less draw before then waits for it. */
|
|
28
|
+
this.viewReady = false;
|
|
29
|
+
this.pendingDraw = null;
|
|
30
|
+
this.supersede = new Supersede();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Render `info` (which has urls), preempting whatever is in flight. A newer image
|
|
34
|
+
* ALWAYS preempts: dropping it while the old one finished reported image B as loaded
|
|
35
|
+
* while image A stayed on screen, and a cold image held the slot for its whole
|
|
36
|
+
* server-side cache fill.
|
|
37
|
+
*/
|
|
38
|
+
render(info) {
|
|
39
|
+
const host = this.host;
|
|
40
|
+
const viz = host.visualizer;
|
|
41
|
+
const urls = info.urls;
|
|
42
|
+
const task = this.supersede.next();
|
|
43
|
+
if (this.running) {
|
|
44
|
+
// Stop the previous render's frame streaming (napari volume/surface preload keeps
|
|
45
|
+
// fetching otherwise) and clear its sharpen flag. Its callbacks are already inert.
|
|
46
|
+
viz.cancelLoading?.();
|
|
47
|
+
this.sharpening = false;
|
|
48
|
+
}
|
|
49
|
+
// Measure the plot div directly so the toolbar height is excluded.
|
|
50
|
+
const screenHeight = document.getElementById(host.plotDivName)?.offsetHeight || 500;
|
|
51
|
+
host.beforeReset();
|
|
52
|
+
viz.reset();
|
|
53
|
+
host.prepare(info);
|
|
54
|
+
this.running = true;
|
|
55
|
+
const smallCount = info.smallUrls?.length ?? 0;
|
|
56
|
+
const small = host.isHeatmap() && smallCount > 0 && smallCount === urls.length
|
|
57
|
+
? { ...info, urls: info.smallUrls }
|
|
58
|
+
: null;
|
|
59
|
+
let overlayReleased = false;
|
|
60
|
+
const releaseOverlay = () => {
|
|
61
|
+
if (overlayReleased)
|
|
62
|
+
return;
|
|
63
|
+
overlayReleased = true;
|
|
64
|
+
host.releaseOverlay(info);
|
|
65
|
+
};
|
|
66
|
+
const settle = () => {
|
|
67
|
+
this.running = false;
|
|
68
|
+
host.landed(info);
|
|
69
|
+
};
|
|
70
|
+
new RenderOrchestrator({
|
|
71
|
+
// inPlace=true updates the existing render instead of rebuilding it, so the
|
|
72
|
+
// canvas doesn't blank during the small→large swap.
|
|
73
|
+
renderPhase: (phaseInfo, inPlace) => {
|
|
74
|
+
const phase = (rebuild) => {
|
|
75
|
+
// Superseded BEFORE this phase started — don't even issue the load (the
|
|
76
|
+
// orchestrator calls this per tier and retries the sharpen pass).
|
|
77
|
+
if (!task.isCurrent())
|
|
78
|
+
return Promise.resolve(null);
|
|
79
|
+
// The backend that loads is the one for the type selected NOW (see RoutingVisualizerService).
|
|
80
|
+
const plotType = host.plotType();
|
|
81
|
+
return viz.load(phaseInfo, host.zIndex(), task.signal).then((loaded) => {
|
|
82
|
+
if (!task.isCurrent())
|
|
83
|
+
return null;
|
|
84
|
+
// Guard against a newer click reaching us mid-render.
|
|
85
|
+
if (phaseInfo.fileName !== loaded.filename)
|
|
86
|
+
return null;
|
|
87
|
+
// The type changed while this loaded (a spatial dataset cleared mid-switch falls
|
|
88
|
+
// back to Image): the loaded image is the old backend's, so load for the new one.
|
|
89
|
+
if (host.plotType() !== plotType)
|
|
90
|
+
return phase(true);
|
|
91
|
+
return viz
|
|
92
|
+
.plot(host.plotDivName, loaded, phaseInfo, screenHeight, plotType, inPlace && !rebuild)
|
|
93
|
+
.then((drawn) => {
|
|
94
|
+
// A backend that cannot draw (no plot target, no WebGPU, no tile descriptor)
|
|
95
|
+
// resolves false: a failed phase, so the retry/failure paths run.
|
|
96
|
+
if (drawn === false && task.isCurrent())
|
|
97
|
+
throw new Error('the renderer could not draw the image');
|
|
98
|
+
return drawn;
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
return phase(false);
|
|
103
|
+
},
|
|
104
|
+
smallShown: () => {
|
|
105
|
+
if (!task.isCurrent())
|
|
106
|
+
return;
|
|
107
|
+
// Still caching server-side: keep the full cache-progress overlay up rather than
|
|
108
|
+
// a translucent spinner over a blank canvas; finished() releases it.
|
|
109
|
+
if (host.isCaching())
|
|
110
|
+
return;
|
|
111
|
+
// Small tier on screen: drop the full overlay, keep a translucent spinner so the
|
|
112
|
+
// blurry render isn't mistaken for the final image.
|
|
113
|
+
releaseOverlay();
|
|
114
|
+
this.sharpening = true;
|
|
115
|
+
},
|
|
116
|
+
sharpenSettled: () => {
|
|
117
|
+
if (task.isCurrent())
|
|
118
|
+
this.sharpening = false;
|
|
119
|
+
},
|
|
120
|
+
finished: () => {
|
|
121
|
+
if (!task.isCurrent())
|
|
122
|
+
return;
|
|
123
|
+
releaseOverlay(); // idempotent: now if smallShown deferred it or was skipped
|
|
124
|
+
settle();
|
|
125
|
+
},
|
|
126
|
+
sharpenFailed: (err) => {
|
|
127
|
+
if (!task.isCurrent())
|
|
128
|
+
return;
|
|
129
|
+
// The small tier stays on screen as the fallback.
|
|
130
|
+
host.alert('warn', 'Preview not sharpened', `The full-resolution preview did not load (${errorMessage(err)}). ` +
|
|
131
|
+
'The low-resolution preview is still shown. Try clicking the image again.');
|
|
132
|
+
settle();
|
|
133
|
+
},
|
|
134
|
+
renderFailed: (err) => {
|
|
135
|
+
if (!task.isCurrent())
|
|
136
|
+
return;
|
|
137
|
+
host.alert('error', 'Could not draw the image', `${info.fileName ?? 'The image'}: ${errorMessage(err)}. Try opening it again.`);
|
|
138
|
+
},
|
|
139
|
+
}).render(info, small);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Draw a spatial mode with no image behind it: the observations alone, framed on their
|
|
143
|
+
* own extent. The image info is a placeholder naming the dataset, so regions drawn here
|
|
144
|
+
* are kept per dataset like any image's. Supersedes (and is superseded by) image renders.
|
|
145
|
+
*/
|
|
146
|
+
async plotWithoutImage(dataset) {
|
|
147
|
+
if (!this.viewReady) {
|
|
148
|
+
// A host that creates the viewer AFTER publishing the dataset has it replayed before
|
|
149
|
+
// the plot div exists; drawing now finds no target. Draw once the view is ready.
|
|
150
|
+
this.pendingDraw = dataset;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const host = this.host;
|
|
154
|
+
const task = this.supersede.next();
|
|
155
|
+
const info = {
|
|
156
|
+
isGrayscale: false,
|
|
157
|
+
trueImageSize: [0, 0],
|
|
158
|
+
urls: [],
|
|
159
|
+
isStack: false,
|
|
160
|
+
showStack: false,
|
|
161
|
+
scaleRatio: true,
|
|
162
|
+
fileName: `spatial:${dataset.id}`,
|
|
163
|
+
imageMeta: [],
|
|
164
|
+
};
|
|
165
|
+
const height = document.getElementById(host.plotDivName)?.offsetHeight || 500;
|
|
166
|
+
let failure = null;
|
|
167
|
+
try {
|
|
168
|
+
// A backend that cannot draw (no WebGPU, no plot target) resolves false rather than throwing.
|
|
169
|
+
if (!(await host.visualizer.plot(host.plotDivName, null, info, height, host.plotType()))) {
|
|
170
|
+
failure = 'the renderer could not start';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
failure = err;
|
|
175
|
+
}
|
|
176
|
+
// Superseded: a newer render owns the loading state now.
|
|
177
|
+
if (!task.isCurrent())
|
|
178
|
+
return;
|
|
179
|
+
if (failure) {
|
|
180
|
+
console.warn('[visualizer] could not draw the spatial dataset', failure);
|
|
181
|
+
const e = failure;
|
|
182
|
+
// An image-less dataset has no tissue image to fall back on, so say so rather than
|
|
183
|
+
// leave an empty canvas that looks finished.
|
|
184
|
+
host.alert('error', 'Could not draw the dataset', `${dataset.name ?? dataset.id}: ${e?.message ?? String(failure)}.`);
|
|
185
|
+
}
|
|
186
|
+
host.setImageLoading(false);
|
|
187
|
+
host.detectChanges();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The plot div exists now: run an image-less draw that arrived before it did — only if
|
|
191
|
+
* its dataset is still the one on offer (by id: the port may re-emit the same dataset
|
|
192
|
+
* as a new object, and the current object is the one to draw) and no image has arrived.
|
|
193
|
+
*/
|
|
194
|
+
viewIsReady(current, hasImage) {
|
|
195
|
+
this.viewReady = true;
|
|
196
|
+
const pending = this.pendingDraw;
|
|
197
|
+
this.pendingDraw = null;
|
|
198
|
+
if (pending && current && current.id === pending.id && !hasImage)
|
|
199
|
+
void this.plotWithoutImage(current);
|
|
200
|
+
}
|
|
201
|
+
/** Cancel the render in flight: abort its loads and make its callbacks inert. */
|
|
202
|
+
cancel() {
|
|
203
|
+
this.supersede.cancel();
|
|
204
|
+
this.running = false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci1zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QztrRUFDa0U7QUFDbEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFZO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEdBQXFGLENBQUM7SUFDaEcsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUEyQkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFVN0IsWUFBNkIsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFUcEQsNkJBQTZCO1FBQzdCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0VBQXNFO1FBQ3RFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUZBQWlGO1FBQ3pFLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBMEIsSUFBSSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBRVUsQ0FBQztJQUV4RDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxJQUFnQjtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFD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QixJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUFFLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IElWaXN1YWxpemVyIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZW5kZXJPcmNoZXN0cmF0b3IgfSBmcm9tICcuL3JlbmRlci1vcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi91dGlsL3N1cGVyc2VkZSc7XG5cbi8qKiBBIHVzZXItZmFjaW5nIG1lc3NhZ2UgZm9yIGEgZmFpbHVyZTogYW4gSHR0cEVycm9yUmVzcG9uc2UncyBzZXJ2ZXIgbWVzc2FnZSwgYW5cbiAqICBFcnJvcidzIG1lc3NhZ2UsIG9yIHRoZSBzdGF0dXMgdGV4dCwgZWxzZSB0aGUgdmFsdWUgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBlID0gZXJyIGFzIHsgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfTsgbWVzc2FnZT86IHN0cmluZzsgc3RhdHVzVGV4dD86IHN0cmluZyB9IHwgbnVsbDtcbiAgcmV0dXJuIGU/LmVycm9yPy5tZXNzYWdlIHx8IGU/Lm1lc3NhZ2UgfHwgZT8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbn1cblxuLyoqIFRoZSB2aWV3ZXIgYSByZW5kZXIgc2Vzc2lvbiBkcmF3cyBpbnRvLCBhbmQgd2hhdCBpdCB0ZWxscyB0aGUgdmlld2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJTZXNzaW9uSG9zdCB7XG4gIHJlYWRvbmx5IHBsb3REaXZOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpc3VhbGl6ZXI6IElWaXN1YWxpemVyO1xuICAvKiogVGhlIHNsaWNlIHRvIGxvYWQsIHJlYWQgd2hlbiBlYWNoIHBoYXNlIHN0YXJ0cy4gKi9cbiAgekluZGV4KCk6IG51bWJlcjtcbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBBIDJEIHZpZXc6IG9ubHkgaXQgcmVuZGVycyB0aGUgc21hbGwgdGllciBmaXJzdCAodGhlIGluLXBsYWNlIHNoYXJwZW4gcGFzcyBkb2VzXG4gICAqICBub3QgcmVidWlsZCBhIDNEIHNjZW5lLCBzbyBpdCBibGFua2VkIG9uZSkuICovXG4gIGlzSGVhdG1hcCgpOiBib29sZWFuO1xuICAvKiogQSBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsIGlzIGluIHByb2dyZXNzIChrZWVwcyB0aGUgZnVsbCBvdmVybGF5IHVwKS4gKi9cbiAgaXNDYWNoaW5nKCk6IGJvb2xlYW47XG4gIC8qKiBUaGUgdmlldyBpcyBhYm91dCB0byBiZSB0b3JuIGRvd246IGVuZCB3aGF0IHdhcyBib3VuZCB0byBpdCAoY29udHJpYnV0ZWQgc2Vzc2lvbnMpLiAqL1xuICBiZWZvcmVSZXNldCgpOiB2b2lkO1xuICAvKiogTGF5IHRoZSBuZXcgaW1hZ2Ugb3V0IChzdGFjayBmbGFnLCBzbGljZSBib3VuZHMsIGluaXRpYWwgc2xpY2UpIG9uY2UgdGhlIG9sZCB2aWV3IGlzIGdvbmUuICovXG4gIHByZXBhcmUoaW5mbzogSUltYWdlSW5mbyk6IHZvaWQ7XG4gIC8qKiBEcm9wIHRoZSBsb2FkaW5nIG92ZXJsYXkgdGhlIHJlbmRlciBvd25zIChvbmNlIHBlciByZW5kZXIpLiAqL1xuICByZWxlYXNlT3ZlcmxheShpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZDtcbiAgLyoqIFRoZSByZW5kZXIgbGFuZGVkLCBzaGFycCBvciBhcyBhIGZhbGxiYWNrOiBhcHBseSBST0lzLCBzdGFydCBzZXNzaW9ucy4gKi9cbiAgbGFuZGVkKGluZm86IElJbWFnZUluZm8pOiB2b2lkO1xuICBzZXRJbWFnZUxvYWRpbmcobG9hZGluZzogYm9vbGVhbik6IHZvaWQ7XG4gIGFsZXJ0KHNldmVyaXR5OiAnd2FybicgfCAnZXJyb3InLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZDtcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSB2aWV3ZXIncyByZW5kZXIgcGlwZWxpbmU6IG9uZSBpbWFnZSAob3IgaW1hZ2UtbGVzcyBkYXRhc2V0KSBhdCBhIHRpbWUsIHRoZSBuZXdlc3RcbiAqIGFsd2F5cyB3aW5uaW5nLlxuICpcbiAqIEV2ZXJ5IHJlbmRlciB0YWtlcyBhIHRhc2sgZnJvbSBhIHtAbGluayBTdXBlcnNlZGV9OiBhIG5ld2VyIHJlbmRlciwgYSBDYW5jZWwgb3JcbiAqIHRlYXJkb3duIG1ha2VzIHRoZSBvbGRlciBvbmUgc3RhbGUg4oCUIGl0cyBjYWxsYmFja3MgcmV0dXJuIGVhcmx5IGluc3RlYWQgb2YgcGFpbnRpbmcsXG4gKiByZWxlYXNpbmcgdGhlIG5ld2VyIHJlbmRlcidzIG92ZXJsYXkgb3IgYXBwbHlpbmcgaXRzIFJPSXMg4oCUIGFuZCBhYm9ydHMgdGhlIHNpZ25hbCBpdHNcbiAqIGxvYWRzIHdlcmUgZ2l2ZW4sIHNvIHN1cGVyc2VkZWQgbmV0d29yayB3b3JrIHN0b3BzIGF0IHRoZSBzb3VyY2UuIFNlcXVlbmNpbmcgb2YgdGhlXG4gKiBzbWFsbOKGkmxhcmdlIHRpZXJzIGxpdmVzIGluIHtAbGluayBSZW5kZXJPcmNoZXN0cmF0b3J9OyB0aGlzIG93bnMgdGhlIFVJIGZsYWdzIGl0XG4gKiBkcml2ZXMgKHtAbGluayBydW5uaW5nfSwge0BsaW5rIHNoYXJwZW5pbmd9KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlUmVuZGVyU2Vzc2lvbiB7XG4gIC8qKiBBIHJlbmRlciBpcyBpbiBmbGlnaHQuICovXG4gIHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzbWFsbCB0aWVyIGlzIG9uIHNjcmVlbiBhbmQgdGhlIGxhcmdlIG9uZSBpcyBzdGlsbCBsb2FkaW5nLiAqL1xuICBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBTZXQgb25jZSB0aGUgcGxvdCBkaXYgZXhpc3RzOyBhbiBpbWFnZS1sZXNzIGRyYXcgYmVmb3JlIHRoZW4gd2FpdHMgZm9yIGl0LiAqL1xuICBwcml2YXRlIHZpZXdSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdEcmF3OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cGVyc2VkZSA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFJlbmRlclNlc3Npb25Ib3N0KSB7fVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYGluZm9gICh3aGljaCBoYXMgdXJscyksIHByZWVtcHRpbmcgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LiBBIG5ld2VyIGltYWdlXG4gICAqIEFMV0FZUyBwcmVlbXB0czogZHJvcHBpbmcgaXQgd2hpbGUgdGhlIG9sZCBvbmUgZmluaXNoZWQgcmVwb3J0ZWQgaW1hZ2UgQiBhcyBsb2FkZWRcbiAgICogd2hpbGUgaW1hZ2UgQSBzdGF5ZWQgb24gc2NyZWVuLCBhbmQgYSBjb2xkIGltYWdlIGhlbGQgdGhlIHNsb3QgZm9yIGl0cyB3aG9sZVxuICAgKiBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsLlxuICAgKi9cbiAgcmVuZGVyKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHZpeiA9IGhvc3QudmlzdWFsaXplcjtcbiAgICBjb25zdCB1cmxzID0gaW5mby51cmxzO1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgcmVuZGVyJ3MgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmkgdm9sdW1lL3N1cmZhY2UgcHJlbG9hZCBrZWVwc1xuICAgICAgLy8gZmV0Y2hpbmcgb3RoZXJ3aXNlKSBhbmQgY2xlYXIgaXRzIHNoYXJwZW4gZmxhZy4gSXRzIGNhbGxiYWNrcyBhcmUgYWxyZWFkeSBpbmVydC5cbiAgICAgIHZpei5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBNZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWQuXG4gICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaG9zdC5wbG90RGl2TmFtZSk/Lm9mZnNldEhlaWdodCB8fCA1MDA7XG4gICAgaG9zdC5iZWZvcmVSZXNldCgpO1xuICAgIHZpei5yZXNldCgpO1xuICAgIGhvc3QucHJlcGFyZShpbmZvKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHNtYWxsQ291bnQgPSBpbmZvLnNtYWxsVXJscz8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3Qgc21hbGwgPVxuICAgICAgaG9zdC5pc0hlYXRtYXAoKSAmJiBzbWFsbENvdW50ID4gMCAmJiBzbWFsbENvdW50ID09PSB1cmxzLmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5mbywgdXJsczogaW5mby5zbWFsbFVybHMgYXMgc3RyaW5nW10gfVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IG92ZXJsYXlSZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2VPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgb3ZlcmxheVJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgIGhvc3QucmVsZWFzZU92ZXJsYXkoaW5mbyk7XG4gICAgfTtcbiAgICBjb25zdCBzZXR0bGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIGhvc3QubGFuZGVkKGluZm8pO1xuICAgIH07XG5cbiAgICBuZXcgUmVuZGVyT3JjaGVzdHJhdG9yKHtcbiAgICAgIC8vIGluUGxhY2U9dHJ1ZSB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgaW5zdGVhZCBvZiByZWJ1aWxkaW5nIGl0LCBzbyB0aGVcbiAgICAgIC8vIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgcmVuZGVyUGhhc2U6IChwaGFzZUluZm8sIGluUGxhY2UpID0+IHtcbiAgICAgICAgY29uc3QgcGhhc2UgPSAocmVidWlsZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+ID0+IHtcbiAgICAgICAgICAvLyBTdXBlcnNlZGVkIEJFRk9SRSB0aGlzIHBoYXNlIHN0YXJ0ZWQg4oCUIGRvbid0IGV2ZW4gaXNzdWUgdGhlIGxvYWQgKHRoZVxuICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBjYWxscyB0aGlzIHBlciB0aWVyIGFuZCByZXRyaWVzIHRoZSBzaGFycGVuIHBhc3MpLlxuICAgICAgICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAvLyBUaGUgYmFja2VuZCB0aGF0IGxvYWRzIGlzIHRoZSBvbmUgZm9yIHRoZSB0eXBlIHNlbGVjdGVkIE5PVyAoc2VlIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSkuXG4gICAgICAgICAgY29uc3QgcGxvdFR5cGUgPSBob3N0LnBsb3RUeXBlKCk7XG4gICAgICAgICAgcmV0dXJuIHZpei5sb2FkKHBoYXNlSW5mbywgaG9zdC56SW5kZXgoKSwgdGFzay5zaWduYWwpLnRoZW4oKGxvYWRlZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgaWYgKHBoYXNlSW5mby5maWxlTmFtZSAhPT0gbG9hZGVkLmZpbGVuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIFRoZSB0eXBlIGNoYW5nZWQgd2hpbGUgdGhpcyBsb2FkZWQgKGEgc3BhdGlhbCBkYXRhc2V0IGNsZWFyZWQgbWlkLXN3aXRjaCBmYWxsc1xuICAgICAgICAgICAgLy8gYmFjayB0byBJbWFnZSk6IHRoZSBsb2FkZWQgaW1hZ2UgaXMgdGhlIG9sZCBiYWNrZW5kJ3MsIHNvIGxvYWQgZm9yIHRoZSBuZXcgb25lLlxuICAgICAgICAgICAgaWYgKGhvc3QucGxvdFR5cGUoKSAhPT0gcGxvdFR5cGUpIHJldHVybiBwaGFzZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB2aXpcbiAgICAgICAgICAgICAgLnBsb3QoaG9zdC5wbG90RGl2TmFtZSwgbG9hZGVkLCBwaGFzZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UgJiYgIXJlYnVpbGQpXG4gICAgICAgICAgICAgIC50aGVuKChkcmF3bikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCBubyB0aWxlIGRlc2NyaXB0b3IpXG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXMgZmFsc2U6IGEgZmFpbGVkIHBoYXNlLCBzbyB0aGUgcmV0cnkvZmFpbHVyZSBwYXRocyBydW4uXG4gICAgICAgICAgICAgICAgaWYgKGRyYXduID09PSBmYWxzZSAmJiB0YXNrLmlzQ3VycmVudCgpKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZSByZW5kZXJlciBjb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhd247XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGhhc2UoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFN0aWxsIGNhY2hpbmcgc2VydmVyLXNpZGU6IGtlZXAgdGhlIGZ1bGwgY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCByYXRoZXIgdGhhblxuICAgICAgICAvLyBhIHRyYW5zbHVjZW50IHNwaW5uZXIgb3ZlciBhIGJsYW5rIGNhbnZhczsgZmluaXNoZWQoKSByZWxlYXNlcyBpdC5cbiAgICAgICAgaWYgKGhvc3QuaXNDYWNoaW5nKCkpIHJldHVybjtcbiAgICAgICAgLy8gU21hbGwgdGllciBvbiBzY3JlZW46IGRyb3AgdGhlIGZ1bGwgb3ZlcmxheSwga2VlcCBhIHRyYW5zbHVjZW50IHNwaW5uZXIgc28gdGhlXG4gICAgICAgIC8vIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBzaGFycGVuU2V0dGxlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnQoKSkgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZmluaXNoZWQ6ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIHJlbGVhc2VPdmVybGF5KCk7IC8vIGlkZW1wb3RlbnQ6IG5vdyBpZiBzbWFsbFNob3duIGRlZmVycmVkIGl0IG9yIHdhcyBza2lwcGVkXG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHNoYXJwZW5GYWlsZWQ6IChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2suXG4gICAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICdQcmV2aWV3IG5vdCBzaGFycGVuZWQnLFxuICAgICAgICAgIGBUaGUgZnVsbC1yZXNvbHV0aW9uIHByZXZpZXcgZGlkIG5vdCBsb2FkICgke2Vycm9yTWVzc2FnZShlcnIpfSkuIGAgK1xuICAgICAgICAgICAgJ1RoZSBsb3ctcmVzb2x1dGlvbiBwcmV2aWV3IGlzIHN0aWxsIHNob3duLiBUcnkgY2xpY2tpbmcgdGhlIGltYWdlIGFnYWluLicsXG4gICAgICAgICk7XG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHJlbmRlckZhaWxlZDogKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICAgICAgaG9zdC5hbGVydChcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnLFxuICAgICAgICAgIGAke2luZm8uZmlsZU5hbWUgPz8gJ1RoZSBpbWFnZSd9OiAke2Vycm9yTWVzc2FnZShlcnIpfS4gVHJ5IG9wZW5pbmcgaXQgYWdhaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSkucmVuZGVyKGluZm8sIHNtYWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGEgc3BhdGlhbCBtb2RlIHdpdGggbm8gaW1hZ2UgYmVoaW5kIGl0OiB0aGUgb2JzZXJ2YXRpb25zIGFsb25lLCBmcmFtZWQgb24gdGhlaXJcbiAgICogb3duIGV4dGVudC4gVGhlIGltYWdlIGluZm8gaXMgYSBwbGFjZWhvbGRlciBuYW1pbmcgdGhlIGRhdGFzZXQsIHNvIHJlZ2lvbnMgZHJhd24gaGVyZVxuICAgKiBhcmUga2VwdCBwZXIgZGF0YXNldCBsaWtlIGFueSBpbWFnZSdzLiBTdXBlcnNlZGVzIChhbmQgaXMgc3VwZXJzZWRlZCBieSkgaW1hZ2UgcmVuZGVycy5cbiAgICovXG4gIGFzeW5jIHBsb3RXaXRob3V0SW1hZ2UoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMudmlld1JlYWR5KSB7XG4gICAgICAvLyBBIGhvc3QgdGhhdCBjcmVhdGVzIHRoZSB2aWV3ZXIgQUZURVIgcHVibGlzaGluZyB0aGUgZGF0YXNldCBoYXMgaXQgcmVwbGF5ZWQgYmVmb3JlXG4gICAgICAvLyB0aGUgcGxvdCBkaXYgZXhpc3RzOyBkcmF3aW5nIG5vdyBmaW5kcyBubyB0YXJnZXQuIERyYXcgb25jZSB0aGUgdmlldyBpcyByZWFkeS5cbiAgICAgIHRoaXMucGVuZGluZ0RyYXcgPSBkYXRhc2V0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgY29uc3QgaW5mbzogSUltYWdlSW5mbyA9IHtcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIHRydWVJbWFnZVNpemU6IFswLCAwXSxcbiAgICAgIHVybHM6IFtdLFxuICAgICAgaXNTdGFjazogZmFsc2UsXG4gICAgICBzaG93U3RhY2s6IGZhbHNlLFxuICAgICAgc2NhbGVSYXRpbzogdHJ1ZSxcbiAgICAgIGZpbGVOYW1lOiBgc3BhdGlhbDoke2RhdGFzZXQuaWR9YCxcbiAgICAgIGltYWdlTWV0YTogW10sXG4gICAgfTtcbiAgICBjb25zdCBoZWlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChob3N0LnBsb3REaXZOYW1lKT8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICBsZXQgZmFpbHVyZTogdW5rbm93biA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBXZWJHUFUsIG5vIHBsb3QgdGFyZ2V0KSByZXNvbHZlcyBmYWxzZSByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICAgIGlmICghKGF3YWl0IGhvc3QudmlzdWFsaXplci5wbG90KGhvc3QucGxvdERpdk5hbWUsIG51bGwsIGluZm8sIGhlaWdodCwgaG9zdC5wbG90VHlwZSgpKSkpIHtcbiAgICAgICAgZmFpbHVyZSA9ICd0aGUgcmVuZGVyZXIgY291bGQgbm90IHN0YXJ0JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGZhaWx1cmUgPSBlcnI7XG4gICAgfVxuICAgIC8vIFN1cGVyc2VkZWQ6IGEgbmV3ZXIgcmVuZGVyIG93bnMgdGhlIGxvYWRpbmcgc3RhdGUgbm93LlxuICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuO1xuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBjb3VsZCBub3QgZHJhdyB0aGUgc3BhdGlhbCBkYXRhc2V0JywgZmFpbHVyZSk7XG4gICAgICBjb25zdCBlID0gZmFpbHVyZSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICAgIC8vIEFuIGltYWdlLWxlc3MgZGF0YXNldCBoYXMgbm8gdGlzc3VlIGltYWdlIHRvIGZhbGwgYmFjayBvbiwgc28gc2F5IHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBsZWF2ZSBhbiBlbXB0eSBjYW52YXMgdGhhdCBsb29rcyBmaW5pc2hlZC5cbiAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgZGF0YXNldCcsXG4gICAgICAgIGAke2RhdGFzZXQubmFtZSA/PyBkYXRhc2V0LmlkfTogJHtlPy5tZXNzYWdlID8/IFN0cmluZyhmYWlsdXJlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGhvc3Quc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICBob3N0LmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxvdCBkaXYgZXhpc3RzIG5vdzogcnVuIGFuIGltYWdlLWxlc3MgZHJhdyB0aGF0IGFycml2ZWQgYmVmb3JlIGl0IGRpZCDigJQgb25seSBpZlxuICAgKiBpdHMgZGF0YXNldCBpcyBzdGlsbCB0aGUgb25lIG9uIG9mZmVyIChieSBpZDogdGhlIHBvcnQgbWF5IHJlLWVtaXQgdGhlIHNhbWUgZGF0YXNldFxuICAgKiBhcyBhIG5ldyBvYmplY3QsIGFuZCB0aGUgY3VycmVudCBvYmplY3QgaXMgdGhlIG9uZSB0byBkcmF3KSBhbmQgbm8gaW1hZ2UgaGFzIGFycml2ZWQuXG4gICAqL1xuICB2aWV3SXNSZWFkeShjdXJyZW50OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIGhhc0ltYWdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UmVhZHkgPSB0cnVlO1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdEcmF3O1xuICAgIHRoaXMucGVuZGluZ0RyYXcgPSBudWxsO1xuICAgIGlmIChwZW5kaW5nICYmIGN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gcGVuZGluZy5pZCAmJiAhaGFzSW1hZ2UpIHZvaWQgdGhpcy5wbG90V2l0aG91dEltYWdlKGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqIENhbmNlbCB0aGUgcmVuZGVyIGluIGZsaWdodDogYWJvcnQgaXRzIGxvYWRzIGFuZCBtYWtlIGl0cyBjYWxsYmFja3MgaW5lcnQuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1cGVyc2VkZS5jYW5jZWwoKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxufVxuIl19
|