@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 +34 -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/image.contract.mjs +1 -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/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- 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/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -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 +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -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 +270 -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 +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -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 +194 -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 +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- 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 +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -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/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -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 +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -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/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- 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 +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- 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 +120 -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 +121 -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 +84 -119
- 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 +123 -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/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -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-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.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/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -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/image.contract.d.ts +4 -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 +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -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 +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -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 +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -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 +91 -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 +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -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 +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- 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 +83 -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 +25 -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 +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -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/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -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 +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -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 +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- 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 +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -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 +62 -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 +51 -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 +55 -84
- 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 +46 -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/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -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/assets/slice.svg +23 -0
- 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,103 @@
|
|
|
1
|
+
import { parseColor } from 'napari-js';
|
|
2
|
+
import { SlicePlanesWidget } from 'napari-js/overlays';
|
|
3
|
+
/** Each plane's colour: its axis's, as the axes gizmo draws them. */
|
|
4
|
+
export const SLICE_PLANE_COLORS = {
|
|
5
|
+
x: '#ff5c5c',
|
|
6
|
+
y: '#4cd964',
|
|
7
|
+
z: '#668cff',
|
|
8
|
+
};
|
|
9
|
+
/** A plane's opacity: enough to read where it is, not to hide the volume behind it … */
|
|
10
|
+
export const SLICE_PLANE_OPACITY = 0.22;
|
|
11
|
+
/** … and while it is dragged. */
|
|
12
|
+
export const SLICE_PLANE_DRAG_OPACITY = 0.4;
|
|
13
|
+
const AXES = ['x', 'y', 'z'];
|
|
14
|
+
/**
|
|
15
|
+
* The planes of the sections shown beside a volume view: napari-js's {@link SlicePlanesWidget}
|
|
16
|
+
* (translucent quads in their axis's colour, each with a grip that drags it along its axis) over
|
|
17
|
+
* the stack's frame. It works in the frame's image px and slices: the widget's box is the image,
|
|
18
|
+
* one voxel per px, so a px position is the widget's shifted by half a pixel (pixel i spans
|
|
19
|
+
* [i, i + 1) here, is centred on i there); a slice is the same in both.
|
|
20
|
+
*/
|
|
21
|
+
export class VolumeSlicePlanes {
|
|
22
|
+
constructor(viewer, host, opts) {
|
|
23
|
+
this.viewer = viewer;
|
|
24
|
+
this.host = host;
|
|
25
|
+
this.opts = opts;
|
|
26
|
+
this.widget = null;
|
|
27
|
+
this.frame = null;
|
|
28
|
+
this.planes = { x: null, y: null, z: null };
|
|
29
|
+
/** Set while the planes are moved from here, so the widget's echo is not reported as a drag. */
|
|
30
|
+
this.applying = false;
|
|
31
|
+
}
|
|
32
|
+
/** Follow the volume's frame (it opened, or its Z was stretched). */
|
|
33
|
+
setFrame(frame) {
|
|
34
|
+
this.frame = frame;
|
|
35
|
+
this.rebuild();
|
|
36
|
+
}
|
|
37
|
+
/** Show the planes where they are now (null: hide one). */
|
|
38
|
+
set(planes) {
|
|
39
|
+
this.planes = { ...planes };
|
|
40
|
+
if (this.widget)
|
|
41
|
+
this.apply();
|
|
42
|
+
else
|
|
43
|
+
this.rebuild();
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
this.widget?.dispose();
|
|
47
|
+
this.widget = null;
|
|
48
|
+
this.planes = { x: null, y: null, z: null };
|
|
49
|
+
}
|
|
50
|
+
destroy() {
|
|
51
|
+
this.clear();
|
|
52
|
+
}
|
|
53
|
+
/** The widget over the current frame, made when there is one and a plane to show. */
|
|
54
|
+
rebuild() {
|
|
55
|
+
this.widget?.dispose();
|
|
56
|
+
this.widget = null;
|
|
57
|
+
const frame = this.frame;
|
|
58
|
+
if (!frame || AXES.every((a) => this.planes[a] === null))
|
|
59
|
+
return;
|
|
60
|
+
const [w, h, d] = frame.size;
|
|
61
|
+
const [ww, wh, wd] = frame.world;
|
|
62
|
+
const widget = new SlicePlanesWidget(this.host, this.viewer, {
|
|
63
|
+
volume: { shape: [w, h, d], voxelSize: [ww / w, wh / h, wd / d] },
|
|
64
|
+
colors: { x: rgb(SLICE_PLANE_COLORS.x), y: rgb(SLICE_PLANE_COLORS.y), z: rgb(SLICE_PLANE_COLORS.z) },
|
|
65
|
+
opacity: SLICE_PLANE_OPACITY,
|
|
66
|
+
dragOpacity: SLICE_PLANE_DRAG_OPACITY,
|
|
67
|
+
});
|
|
68
|
+
widget.changed.connect(({ axis, value }) => {
|
|
69
|
+
if (!this.applying)
|
|
70
|
+
this.opts.onMove(axis, fromWidget(axis, value));
|
|
71
|
+
});
|
|
72
|
+
this.widget = widget;
|
|
73
|
+
this.apply();
|
|
74
|
+
}
|
|
75
|
+
apply() {
|
|
76
|
+
const widget = this.widget;
|
|
77
|
+
this.applying = true;
|
|
78
|
+
try {
|
|
79
|
+
for (const axis of AXES) {
|
|
80
|
+
const at = this.planes[axis];
|
|
81
|
+
widget.setVisible(axis, at !== null);
|
|
82
|
+
if (at !== null)
|
|
83
|
+
widget.setPosition(axis, toWidget(axis, at));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this.applying = false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Image px (pixel i spanning [i, i + 1)) → the widget's data coordinates (centred on i); slices as is. */
|
|
92
|
+
function toWidget(axis, v) {
|
|
93
|
+
return axis === 'z' ? v : v - 0.5;
|
|
94
|
+
}
|
|
95
|
+
function fromWidget(axis, v) {
|
|
96
|
+
return axis === 'z' ? v : v + 0.5;
|
|
97
|
+
}
|
|
98
|
+
/** `#rrggbb` → 0..1 RGB. */
|
|
99
|
+
function rgb(css) {
|
|
100
|
+
const [r, g, b] = parseColor(css) ?? [1, 1, 1, 1];
|
|
101
|
+
return [r, g, b];
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1zbGljZS1wbGFuZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXZvbHVtZS1zbGljZS1wbGFuZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVV2RCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXdDO0lBQ3JFLENBQUMsRUFBRSxTQUFTO0lBQ1osQ0FBQyxFQUFFLFNBQVM7SUFDWixDQUFDLEVBQUUsU0FBUztDQUNiLENBQUM7QUFDRix3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLGlDQUFpQztBQUNqQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFFNUMsTUFBTSxJQUFJLEdBQXlCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQU9uRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCLFlBQ21CLE1BQWMsRUFDZCxJQUFpQixFQUNqQixJQUF3QjtRQUZ4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQVRuQyxXQUFNLEdBQTZCLElBQUksQ0FBQztRQUN4QyxVQUFLLEdBQXVCLElBQUksQ0FBQztRQUNqQyxXQUFNLEdBQWdCLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM1RCxnR0FBZ0c7UUFDeEYsYUFBUSxHQUFHLEtBQUssQ0FBQztJQU10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aS1qcyc7XG5pbXBvcnQgdHlwZSB7IFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBTbGljZVBsYW5lc1dpZGdldCB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5cbmltcG9ydCB0eXBlIHsgVm9sdW1lRnJhbWUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5cbi8qKiBBIHBsYW5lIGFjcm9zcyB0aGUgdm9sdW1lOiB4ID0gY29uc3QsIHkgPSBjb25zdCAoaW1hZ2UgcHgpIG9yIHogPSBjb25zdCAoYSBzbGljZSkuICovXG5leHBvcnQgdHlwZSBQbGFuZUF4aXMgPSAneCcgfCAneScgfCAneic7XG5cbi8qKiBXaGVyZSBlYWNoIHBsYW5lIGlzIChpbWFnZSBweCBmb3IgeCBhbmQgeSwgdGhlIHNsaWNlIGZvciB6KTsgbnVsbDogbm90IHNob3duLiAqL1xuZXhwb3J0IHR5cGUgU2xpY2VQbGFuZXMgPSBSZWNvcmQ8UGxhbmVBeGlzLCBudW1iZXIgfCBudWxsPjtcblxuLyoqIEVhY2ggcGxhbmUncyBjb2xvdXI6IGl0cyBheGlzJ3MsIGFzIHRoZSBheGVzIGdpem1vIGRyYXdzIHRoZW0uICovXG5leHBvcnQgY29uc3QgU0xJQ0VfUExBTkVfQ09MT1JTOiBSZWFkb25seTxSZWNvcmQ8UGxhbmVBeGlzLCBzdHJpbmc+PiA9IHtcbiAgeDogJyNmZjVjNWMnLFxuICB5OiAnIzRjZDk2NCcsXG4gIHo6ICcjNjY4Y2ZmJyxcbn07XG4vKiogQSBwbGFuZSdzIG9wYWNpdHk6IGVub3VnaCB0byByZWFkIHdoZXJlIGl0IGlzLCBub3QgdG8gaGlkZSB0aGUgdm9sdW1lIGJlaGluZCBpdCDigKYgKi9cbmV4cG9ydCBjb25zdCBTTElDRV9QTEFORV9PUEFDSVRZID0gMC4yMjtcbi8qKiDigKYgYW5kIHdoaWxlIGl0IGlzIGRyYWdnZWQuICovXG5leHBvcnQgY29uc3QgU0xJQ0VfUExBTkVfRFJBR19PUEFDSVRZID0gMC40O1xuXG5jb25zdCBBWEVTOiByZWFkb25seSBQbGFuZUF4aXNbXSA9IFsneCcsICd5JywgJ3onXTtcblxuZXhwb3J0IGludGVyZmFjZSBTbGljZVBsYW5lc09wdGlvbnMge1xuICAvKiogQSBwbGFuZSBkcmFnZ2VkIHRvIGB2YWx1ZWAgYWxvbmcgaXRzIGF4aXMgKGltYWdlIHB4LCBvciBhIGZyYWN0aW9uYWwgc2xpY2UpLiAqL1xuICBvbk1vdmUoYXhpczogUGxhbmVBeGlzLCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgcGxhbmVzIG9mIHRoZSBzZWN0aW9ucyBzaG93biBiZXNpZGUgYSB2b2x1bWUgdmlldzogbmFwYXJpLWpzJ3Mge0BsaW5rIFNsaWNlUGxhbmVzV2lkZ2V0fVxuICogKHRyYW5zbHVjZW50IHF1YWRzIGluIHRoZWlyIGF4aXMncyBjb2xvdXIsIGVhY2ggd2l0aCBhIGdyaXAgdGhhdCBkcmFncyBpdCBhbG9uZyBpdHMgYXhpcykgb3ZlclxuICogdGhlIHN0YWNrJ3MgZnJhbWUuIEl0IHdvcmtzIGluIHRoZSBmcmFtZSdzIGltYWdlIHB4IGFuZCBzbGljZXM6IHRoZSB3aWRnZXQncyBib3ggaXMgdGhlIGltYWdlLFxuICogb25lIHZveGVsIHBlciBweCwgc28gYSBweCBwb3NpdGlvbiBpcyB0aGUgd2lkZ2V0J3Mgc2hpZnRlZCBieSBoYWxmIGEgcGl4ZWwgKHBpeGVsIGkgc3BhbnNcbiAqIFtpLCBpICsgMSkgaGVyZSwgaXMgY2VudHJlZCBvbiBpIHRoZXJlKTsgYSBzbGljZSBpcyB0aGUgc2FtZSBpbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lU2xpY2VQbGFuZXMge1xuICBwcml2YXRlIHdpZGdldDogU2xpY2VQbGFuZXNXaWRnZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmcmFtZTogVm9sdW1lRnJhbWUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwbGFuZXM6IFNsaWNlUGxhbmVzID0geyB4OiBudWxsLCB5OiBudWxsLCB6OiBudWxsIH07XG4gIC8qKiBTZXQgd2hpbGUgdGhlIHBsYW5lcyBhcmUgbW92ZWQgZnJvbSBoZXJlLCBzbyB0aGUgd2lkZ2V0J3MgZWNobyBpcyBub3QgcmVwb3J0ZWQgYXMgYSBkcmFnLiAqL1xuICBwcml2YXRlIGFwcGx5aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IFZpZXdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2xpY2VQbGFuZXNPcHRpb25zLFxuICApIHt9XG5cbiAgLyoqIEZvbGxvdyB0aGUgdm9sdW1lJ3MgZnJhbWUgKGl0IG9wZW5lZCwgb3IgaXRzIFogd2FzIHN0cmV0Y2hlZCkuICovXG4gIHNldEZyYW1lKGZyYW1lOiBWb2x1bWVGcmFtZSk6IHZvaWQge1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICB0aGlzLnJlYnVpbGQoKTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBwbGFuZXMgd2hlcmUgdGhleSBhcmUgbm93IChudWxsOiBoaWRlIG9uZSkuICovXG4gIHNldChwbGFuZXM6IFNsaWNlUGxhbmVzKTogdm9pZCB7XG4gICAgdGhpcy5wbGFuZXMgPSB7IC4uLnBsYW5lcyB9O1xuICAgIGlmICh0aGlzLndpZGdldCkgdGhpcy5hcHBseSgpO1xuICAgIGVsc2UgdGhpcy5yZWJ1aWxkKCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLndpZGdldD8uZGlzcG9zZSgpO1xuICAgIHRoaXMud2lkZ2V0ID0gbnVsbDtcbiAgICB0aGlzLnBsYW5lcyA9IHsgeDogbnVsbCwgeTogbnVsbCwgejogbnVsbCB9O1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKiogVGhlIHdpZGdldCBvdmVyIHRoZSBjdXJyZW50IGZyYW1lLCBtYWRlIHdoZW4gdGhlcmUgaXMgb25lIGFuZCBhIHBsYW5lIHRvIHNob3cuICovXG4gIHByaXZhdGUgcmVidWlsZCgpOiB2b2lkIHtcbiAgICB0aGlzLndpZGdldD8uZGlzcG9zZSgpO1xuICAgIHRoaXMud2lkZ2V0ID0gbnVsbDtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgaWYgKCFmcmFtZSB8fCBBWEVTLmV2ZXJ5KChhKSA9PiB0aGlzLnBsYW5lc1thXSA9PT0gbnVsbCkpIHJldHVybjtcbiAgICBjb25zdCBbdywgaCwgZF0gPSBmcmFtZS5zaXplO1xuICAgIGNvbnN0IFt3dywgd2gsIHdkXSA9IGZyYW1lLndvcmxkO1xuICAgIGNvbnN0IHdpZGdldCA9IG5ldyBTbGljZVBsYW5lc1dpZGdldCh0aGlzLmhvc3QsIHRoaXMudmlld2VyLCB7XG4gICAgICB2b2x1bWU6IHsgc2hhcGU6IFt3LCBoLCBkXSwgdm94ZWxTaXplOiBbd3cgLyB3LCB3aCAvIGgsIHdkIC8gZF0gfSxcbiAgICAgIGNvbG9yczogeyB4OiByZ2IoU0xJQ0VfUExBTkVfQ09MT1JTLngpLCB5OiByZ2IoU0xJQ0VfUExBTkVfQ09MT1JTLnkpLCB6OiByZ2IoU0xJQ0VfUExBTkVfQ09MT1JTLnopIH0sXG4gICAgICBvcGFjaXR5OiBTTElDRV9QTEFORV9PUEFDSVRZLFxuICAgICAgZHJhZ09wYWNpdHk6IFNMSUNFX1BMQU5FX0RSQUdfT1BBQ0lUWSxcbiAgICB9KTtcbiAgICB3aWRnZXQuY2hhbmdlZC5jb25uZWN0KCh7IGF4aXMsIHZhbHVlIH0pID0+IHtcbiAgICAgIGlmICghdGhpcy5hcHBseWluZykgdGhpcy5vcHRzLm9uTW92ZShheGlzLCBmcm9tV2lkZ2V0KGF4aXMsIHZhbHVlKSk7XG4gICAgfSk7XG4gICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgdGhpcy5hcHBseSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseSgpOiB2b2lkIHtcbiAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldCBhcyBTbGljZVBsYW5lc1dpZGdldDtcbiAgICB0aGlzLmFwcGx5aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBheGlzIG9mIEFYRVMpIHtcbiAgICAgICAgY29uc3QgYXQgPSB0aGlzLnBsYW5lc1theGlzXTtcbiAgICAgICAgd2lkZ2V0LnNldFZpc2libGUoYXhpcywgYXQgIT09IG51bGwpO1xuICAgICAgICBpZiAoYXQgIT09IG51bGwpIHdpZGdldC5zZXRQb3NpdGlvbihheGlzLCB0b1dpZGdldChheGlzLCBhdCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcGx5aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8qKiBJbWFnZSBweCAocGl4ZWwgaSBzcGFubmluZyBbaSwgaSArIDEpKSDihpIgdGhlIHdpZGdldCdzIGRhdGEgY29vcmRpbmF0ZXMgKGNlbnRyZWQgb24gaSk7IHNsaWNlcyBhcyBpcy4gKi9cbmZ1bmN0aW9uIHRvV2lkZ2V0KGF4aXM6IFBsYW5lQXhpcywgdjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd6JyA/IHYgOiB2IC0gMC41O1xufVxuXG5mdW5jdGlvbiBmcm9tV2lkZ2V0KGF4aXM6IFBsYW5lQXhpcywgdjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd6JyA/IHYgOiB2ICsgMC41O1xufVxuXG4vKiogYCNycmdnYmJgIOKGkiAwLi4xIFJHQi4gKi9cbmZ1bmN0aW9uIHJnYihjc3M6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IFtyLCBnLCBiXSA9IHBhcnNlQ29sb3IoY3NzKSA/PyBbMSwgMSwgMSwgMV07XG4gIHJldHVybiBbciwgZywgYl07XG59XG4iXX0=
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Draggable Z-height handle for the napari-js WebGPU volume (jit-ui#102). A small DOM grip is drawn
|
|
3
|
-
* over the 3D canvas at the projected top-face centre of the volume box (
|
|
4
|
-
* {@link projectPoint}
|
|
3
|
+
* over the 3D canvas at the projected top-face centre of the volume box (projected with napari-js's
|
|
4
|
+
* {@link projectPoint}, as the axes labels are, so it tracks the box as the volume orbits). Dragging it up makes
|
|
5
5
|
* the volume taller, down makes it flatter — the host maps the drag to a Z-scale factor and
|
|
6
6
|
* restretches the volume + axes live (only the model matrix changes; the voxel texture is untouched).
|
|
7
7
|
*
|
|
8
|
-
* Direct-manipulation counterpart of
|
|
9
|
-
* updated on every `camera3d.changed`, but this one accepts pointer input.
|
|
8
|
+
* Direct-manipulation counterpart of napari-js's `AxesLabelsOverlay`: both are absolute-positioned
|
|
9
|
+
* overlays updated on every `camera3d.changed`, but this one accepts pointer input.
|
|
10
10
|
*/
|
|
11
|
-
import { projectPoint } from '
|
|
11
|
+
import { projectPoint } from 'napari-js';
|
|
12
12
|
const DEFAULTS = { pixelsPerDouble: 180, minScale: 0.1, maxScale: 10 };
|
|
13
13
|
export class NapariVolumeZHandle {
|
|
14
14
|
constructor(host, camera3d, opts) {
|
|
@@ -123,4 +123,4 @@ export class NapariVolumeZHandle {
|
|
|
123
123
|
this.el.parentNode?.removeChild(this.el);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS16LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXotaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILE9BQU8sRUFBcUIsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFnQnZFLE1BQU0sUUFBUSxHQUFHLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUV2RSxNQUFNLE9BQU8sbUJBQW1CO0lBVTlCLFlBQ21CLElBQWlCLEVBQ2pCLFFBQTJCLEVBQzVDLElBQTBCO1FBRlQsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQVB0QyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQXlFTixrQkFBYSxHQUFHLENBQUMsQ0FBZSxFQUFRLEVBQUU7WUFDekQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBRWUsa0JBQWEsR0FBRyxDQUFDLENBQWUs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QUM7UUFDL0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEcmFnZ2FibGUgWi1oZWlnaHQgaGFuZGxlIGZvciB0aGUgbmFwYXJpLWpzIFdlYkdQVSB2b2x1bWUgKGppdC11aSMxMDIpLiBBIHNtYWxsIERPTSBncmlwIGlzIGRyYXduXG4gKiBvdmVyIHRoZSAzRCBjYW52YXMgYXQgdGhlIHByb2plY3RlZCB0b3AtZmFjZSBjZW50cmUgb2YgdGhlIHZvbHVtZSBib3ggKHJldXNpbmcgdGhlIGF4ZXMtbGFiZWxcbiAqIHtAbGluayBwcm9qZWN0UG9pbnR9IHByb2plY3Rpb24sIHNvIGl0IHRyYWNrcyB0aGUgYm94IGFzIHRoZSB2b2x1bWUgb3JiaXRzKS4gRHJhZ2dpbmcgaXQgdXAgbWFrZXNcbiAqIHRoZSB2b2x1bWUgdGFsbGVyLCBkb3duIG1ha2VzIGl0IGZsYXR0ZXIg4oCUIHRoZSBob3N0IG1hcHMgdGhlIGRyYWcgdG8gYSBaLXNjYWxlIGZhY3RvciBhbmRcbiAqIHJlc3RyZXRjaGVzIHRoZSB2b2x1bWUgKyBheGVzIGxpdmUgKG9ubHkgdGhlIG1vZGVsIG1hdHJpeCBjaGFuZ2VzOyB0aGUgdm94ZWwgdGV4dHVyZSBpcyB1bnRvdWNoZWQpLlxuICpcbiAqIERpcmVjdC1tYW5pcHVsYXRpb24gY291bnRlcnBhcnQgb2Yge0BsaW5rIE5hcGFyaUF4ZXNMYWJlbHN9OiBib3RoIGFyZSBhYnNvbHV0ZS1wb3NpdGlvbmVkIG92ZXJsYXlzXG4gKiB1cGRhdGVkIG9uIGV2ZXJ5IGBjYW1lcmEzZC5jaGFuZ2VkYCwgYnV0IHRoaXMgb25lIGFjY2VwdHMgcG9pbnRlciBpbnB1dC5cbiAqL1xuaW1wb3J0IHsgQXhlc0xhYmVsQ2FtZXJhM0QsIHByb2plY3RQb2ludCB9IGZyb20gJy4vbmFwYXJpLWF4ZXMtbGFiZWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVaSGFuZGxlT3B0aW9ucyB7XG4gIC8qKiBDdXJyZW50IHRvcC1mYWNlLWNlbnRyZSB3b3JsZCBwb2ludCAodGhlIGJveCBpcyBjZW50cmVkIGF0IHRoZSBvcmlnaW4sIHNvIGBbMCwgMCwgK2hhbGZaXWApLiAqL1xuICB0b3BBbmNob3I6ICgpID0+IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgLyoqIFRoZSBjdXJyZW50IFotc2NhbGUgZmFjdG9yICgxID0gdGhlIHZvbHVtZSdzIGRlZmF1bHQgcHJvcG9ydGlvbnMpLiAqL1xuICBnZXRTY2FsZTogKCkgPT4gbnVtYmVyO1xuICAvKiogQXBwbHkgYSBuZXcgWi1zY2FsZSBmYWN0b3Ig4oCUIHRoZSBob3N0IHJlc3RyZXRjaGVzIHRoZSB2b2x1bWUgKyBheGVzIGFuZCByZXBvc2l0aW9ucyBvdmVybGF5cy4gKi9cbiAgc2V0U2NhbGU6IChzY2FsZTogbnVtYmVyKSA9PiB2b2lkO1xuICAvKiogVmVydGljYWwgZHJhZyAocHgpIGZvciBvbmUgZG91YmxpbmcvaGFsdmluZyBvZiB0aGUgWiBoZWlnaHQuIExhcmdlciA9IGxlc3Mgc2Vuc2l0aXZlLiAqL1xuICBwaXhlbHNQZXJEb3VibGU/OiBudW1iZXI7XG4gIC8qKiBDbGFtcCBmb3IgdGhlIFotc2NhbGUgZmFjdG9yLiAqL1xuICBtaW5TY2FsZT86IG51bWJlcjtcbiAgbWF4U2NhbGU/OiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRTID0geyBwaXhlbHNQZXJEb3VibGU6IDE4MCwgbWluU2NhbGU6IDAuMSwgbWF4U2NhbGU6IDEwIH07XG5cbmV4cG9ydCBjbGFzcyBOYXBhcmlWb2x1bWVaSGFuZGxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY29ubmVjdENhbWVyYTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IFJlcXVpcmVkPFZvbHVtZVpIYW5kbGVPcHRpb25zPjtcbiAgcHJpdmF0ZSB2aXNpYmxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkcmFnZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0WSA9IDA7XG4gIHByaXZhdGUgc3RhcnRTY2FsZSA9IDE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbWVyYTNkOiBBeGVzTGFiZWxDYW1lcmEzRCxcbiAgICBvcHRzOiBWb2x1bWVaSGFuZGxlT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5vcHRzID0geyAuLi5ERUZBVUxUUywgLi4ub3B0cyB9O1xuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhvc3QpLnBvc2l0aW9uID09PSAnc3RhdGljJykgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmVsLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHpJbmRleDogJzMxJyxcbiAgICAgIHdpZHRoOiAnMjJweCcsXG4gICAgICBoZWlnaHQ6ICcyMnB4JyxcbiAgICAgIG1hcmdpbkxlZnQ6ICctMTFweCcsXG4gICAgICBtYXJnaW5Ub3A6ICctMTFweCcsXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMTAyLDE0MCwyNTUsMC44NSknLCAvLyBtYXRjaGVzIHRoZSBaIGF4aXMgY29sb3VyICgjNjY4Y2ZmKVxuICAgICAgYm9yZGVyOiAnMS41cHggc29saWQgI2ZmZicsXG4gICAgICBib3hTaGFkb3c6ICcwIDAgNHB4IHJnYmEoMCwwLDAsMC42KScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzEzcHggc2Fucy1zZXJpZicsXG4gICAgICBsaW5lSGVpZ2h0OiAnMjBweCcsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgY3Vyc29yOiAnbnMtcmVzaXplJyxcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmVsLnRleHRDb250ZW50ID0gJ+KGlSc7XG4gICAgdGhpcy5lbC50aXRsZSA9ICdEcmFnIHRvIGNoYW5nZSB0aGUgdm9sdW1lIGhlaWdodCAoWikuIERvdWJsZS1jbGljayB0byByZXNldC4nO1xuICAgIHRoaXMuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pO1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25Eb3VibGVDbGljayk7XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEgPSB0aGlzLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLnJlcG9zaXRpb24oKSk7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5yZXBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdCk7XG4gICAgfVxuICAgIHRoaXMucmVwb3NpdGlvbigpO1xuICB9XG5cbiAgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLnJlcG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKiBSZXByb2plY3QgdGhlIGhhbmRsZSB0byB0aGUgY3VycmVudCB0b3AtZmFjZSBhbmNob3IuIENhbGxlZCBvbiBjYW1lcmEgbW92ZSwgcmVzaXplLCBhbmQgYWZ0ZXJcbiAgICogIHRoZSBob3N0IGFwcGxpZXMgYSBuZXcgc2NhbGUgKHNvIHRoZSBncmlwIGZvbGxvd3MgdGhlIGdyb3dpbmcvc2hyaW5raW5nIGJveCkuICovXG4gIHJlcG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdncgPSB0aGlzLmhvc3QuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgdmggPSB0aGlzLmhvc3QuY2xpZW50SGVpZ2h0O1xuICAgIGlmICghdGhpcy52aXNpYmxlIHx8IHZ3IDw9IDAgfHwgdmggPD0gMCkge1xuICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdnAgPSB0aGlzLmNhbWVyYTNkLnZpZXdQcm9qZWN0aW9uKHZ3LCB2aCk7XG4gICAgY29uc3QgcyA9IHByb2plY3RQb2ludChtdnAsIHRoaXMub3B0cy50b3BBbmNob3IoKSwgdncsIHZoKTtcbiAgICBpZiAoIXMudmlzaWJsZSkge1xuICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB0aGlzLmVsLnN0eWxlLmxlZnQgPSBgJHtzLnh9cHhgO1xuICAgIHRoaXMuZWwuc3R5bGUudG9wID0gYCR7cy55fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyRG93biA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICB0aGlzLnN0YXJ0U2NhbGUgPSB0aGlzLm9wdHMuZ2V0U2NhbGUoKTtcbiAgICB0aGlzLmVsLnNldFBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBVcCAobmVnYXRpdmUgZHkpIOKGkiB0YWxsZXIuIEV4cG9uZW50aWFsIHNvIGVhY2ggYHBpeGVsc1BlckRvdWJsZWAgcHggZG91Ymxlcy9oYWx2ZXMgdGhlIGhlaWdodC5cbiAgICBjb25zdCBkeSA9IGUuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucG93KDIsIC1keSAvIHRoaXMub3B0cy5waXhlbHNQZXJEb3VibGUpO1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMub3B0cy5tYXhTY2FsZSxcbiAgICAgIE1hdGgubWF4KHRoaXMub3B0cy5taW5TY2FsZSwgdGhpcy5zdGFydFNjYWxlICogZmFjdG9yKSxcbiAgICApO1xuICAgIHRoaXMub3B0cy5zZXRTY2FsZShuZXh0KTtcbiAgICB0aGlzLnJlcG9zaXRpb24oKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uUG9pbnRlclVwID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5lbC5oYXNQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKSkgdGhpcy5lbC5yZWxlYXNlUG9pbnRlckNhcHR1cmU/LihlLnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkRvdWJsZUNsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm9wdHMuc2V0U2NhbGUoMSk7XG4gICAgdGhpcy5yZXBvc2l0aW9uKCk7XG4gIH07XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bik7XG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSk7XG4gICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbkRvdWJsZUNsaWNrKTtcbiAgICB0aGlzLmVsLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZWwpO1xuICB9XG59XG4iXX0=
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS16LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdm9sdW1lLXotaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFzQnpDLE1BQU0sUUFBUSxHQUFHLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUV2RSxNQUFNLE9BQU8sbUJBQW1CO0lBVTlCLFlBQ21CLElBQWlCLEVBQ2pCLFFBQXlCLEVBQzFDLElBQTBCO1FBRlQsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQVBwQyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQXlFTixrQkFBYSxHQUFHLENBQUMsQ0FBZSxFQUFRLEVBQUU7WUFDekQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBRWUsa0JBQWEsR0FBRyxDQUFDLENBQWUsRUFB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Qy9ELElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRHJhZ2dhYmxlIFotaGVpZ2h0IGhhbmRsZSBmb3IgdGhlIG5hcGFyaS1qcyBXZWJHUFUgdm9sdW1lIChqaXQtdWkjMTAyKS4gQSBzbWFsbCBET00gZ3JpcCBpcyBkcmF3blxuICogb3ZlciB0aGUgM0QgY2FudmFzIGF0IHRoZSBwcm9qZWN0ZWQgdG9wLWZhY2UgY2VudHJlIG9mIHRoZSB2b2x1bWUgYm94IChwcm9qZWN0ZWQgd2l0aCBuYXBhcmktanMnc1xuICoge0BsaW5rIHByb2plY3RQb2ludH0sIGFzIHRoZSBheGVzIGxhYmVscyBhcmUsIHNvIGl0IHRyYWNrcyB0aGUgYm94IGFzIHRoZSB2b2x1bWUgb3JiaXRzKS4gRHJhZ2dpbmcgaXQgdXAgbWFrZXNcbiAqIHRoZSB2b2x1bWUgdGFsbGVyLCBkb3duIG1ha2VzIGl0IGZsYXR0ZXIg4oCUIHRoZSBob3N0IG1hcHMgdGhlIGRyYWcgdG8gYSBaLXNjYWxlIGZhY3RvciBhbmRcbiAqIHJlc3RyZXRjaGVzIHRoZSB2b2x1bWUgKyBheGVzIGxpdmUgKG9ubHkgdGhlIG1vZGVsIG1hdHJpeCBjaGFuZ2VzOyB0aGUgdm94ZWwgdGV4dHVyZSBpcyB1bnRvdWNoZWQpLlxuICpcbiAqIERpcmVjdC1tYW5pcHVsYXRpb24gY291bnRlcnBhcnQgb2YgbmFwYXJpLWpzJ3MgYEF4ZXNMYWJlbHNPdmVybGF5YDogYm90aCBhcmUgYWJzb2x1dGUtcG9zaXRpb25lZFxuICogb3ZlcmxheXMgdXBkYXRlZCBvbiBldmVyeSBgY2FtZXJhM2QuY2hhbmdlZGAsIGJ1dCB0aGlzIG9uZSBhY2NlcHRzIHBvaW50ZXIgaW5wdXQuXG4gKi9cbmltcG9ydCB7IHByb2plY3RQb2ludCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbi8qKiBUaGUgc2xpY2Ugb2YgbmFwYXJpJ3MgQ2FtZXJhM0QgdGhlIGhhbmRsZSByZWFkcy4gYHZpZXdQcm9qZWN0aW9uYCBpcyBjb2x1bW4tbWFqb3IgKGdsLW1hdHJpeCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFpIYW5kbGVDYW1lcmEzRCB7XG4gIHZpZXdQcm9qZWN0aW9uKHZ3OiBudW1iZXIsIHZoOiBudW1iZXIpOiBBcnJheUxpa2U8bnVtYmVyPjtcbiAgcmVhZG9ubHkgY2hhbmdlZDogeyBjb25uZWN0KGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZVpIYW5kbGVPcHRpb25zIHtcbiAgLyoqIEN1cnJlbnQgdG9wLWZhY2UtY2VudHJlIHdvcmxkIHBvaW50ICh0aGUgYm94IGlzIGNlbnRyZWQgYXQgdGhlIG9yaWdpbiwgc28gYFswLCAwLCAraGFsZlpdYCkuICovXG4gIHRvcEFuY2hvcjogKCkgPT4gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIGN1cnJlbnQgWi1zY2FsZSBmYWN0b3IgKDEgPSB0aGUgdm9sdW1lJ3MgZGVmYXVsdCBwcm9wb3J0aW9ucykuICovXG4gIGdldFNjYWxlOiAoKSA9PiBudW1iZXI7XG4gIC8qKiBBcHBseSBhIG5ldyBaLXNjYWxlIGZhY3RvciDigJQgdGhlIGhvc3QgcmVzdHJldGNoZXMgdGhlIHZvbHVtZSArIGF4ZXMgYW5kIHJlcG9zaXRpb25zIG92ZXJsYXlzLiAqL1xuICBzZXRTY2FsZTogKHNjYWxlOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBWZXJ0aWNhbCBkcmFnIChweCkgZm9yIG9uZSBkb3VibGluZy9oYWx2aW5nIG9mIHRoZSBaIGhlaWdodC4gTGFyZ2VyID0gbGVzcyBzZW5zaXRpdmUuICovXG4gIHBpeGVsc1BlckRvdWJsZT86IG51bWJlcjtcbiAgLyoqIENsYW1wIGZvciB0aGUgWi1zY2FsZSBmYWN0b3IuICovXG4gIG1pblNjYWxlPzogbnVtYmVyO1xuICBtYXhTY2FsZT86IG51bWJlcjtcbn1cblxuY29uc3QgREVGQVVMVFMgPSB7IHBpeGVsc1BlckRvdWJsZTogMTgwLCBtaW5TY2FsZTogMC4xLCBtYXhTY2FsZTogMTAgfTtcblxuZXhwb3J0IGNsYXNzIE5hcGFyaVZvbHVtZVpIYW5kbGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVsOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNjb25uZWN0Q2FtZXJhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0czogUmVxdWlyZWQ8Vm9sdW1lWkhhbmRsZU9wdGlvbnM+O1xuICBwcml2YXRlIHZpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIGRyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhcnRZID0gMDtcbiAgcHJpdmF0ZSBzdGFydFNjYWxlID0gMTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FtZXJhM2Q6IFpIYW5kbGVDYW1lcmEzRCxcbiAgICBvcHRzOiBWb2x1bWVaSGFuZGxlT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5vcHRzID0geyAuLi5ERUZBVUxUUywgLi4ub3B0cyB9O1xuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhvc3QpLnBvc2l0aW9uID09PSAnc3RhdGljJykgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmVsLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHpJbmRleDogJzMxJyxcbiAgICAgIHdpZHRoOiAnMjJweCcsXG4gICAgICBoZWlnaHQ6ICcyMnB4JyxcbiAgICAgIG1hcmdpbkxlZnQ6ICctMTFweCcsXG4gICAgICBtYXJnaW5Ub3A6ICctMTFweCcsXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMTAyLDE0MCwyNTUsMC44NSknLCAvLyBtYXRjaGVzIHRoZSBaIGF4aXMgY29sb3VyICgjNjY4Y2ZmKVxuICAgICAgYm9yZGVyOiAnMS41cHggc29saWQgI2ZmZicsXG4gICAgICBib3hTaGFkb3c6ICcwIDAgNHB4IHJnYmEoMCwwLDAsMC42KScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzEzcHggc2Fucy1zZXJpZicsXG4gICAgICBsaW5lSGVpZ2h0OiAnMjBweCcsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgY3Vyc29yOiAnbnMtcmVzaXplJyxcbiAgICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmVsLnRleHRDb250ZW50ID0gJ+KGlSc7XG4gICAgdGhpcy5lbC50aXRsZSA9ICdEcmFnIHRvIGNoYW5nZSB0aGUgdm9sdW1lIGhlaWdodCAoWikuIERvdWJsZS1jbGljayB0byByZXNldC4nO1xuICAgIHRoaXMuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcblxuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pO1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25Eb3VibGVDbGljayk7XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEgPSB0aGlzLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLnJlcG9zaXRpb24oKSk7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5yZXBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdCk7XG4gICAgfVxuICAgIHRoaXMucmVwb3NpdGlvbigpO1xuICB9XG5cbiAgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZTtcbiAgICB0aGlzLnJlcG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKiBSZXByb2plY3QgdGhlIGhhbmRsZSB0byB0aGUgY3VycmVudCB0b3AtZmFjZSBhbmNob3IuIENhbGxlZCBvbiBjYW1lcmEgbW92ZSwgcmVzaXplLCBhbmQgYWZ0ZXJcbiAgICogIHRoZSBob3N0IGFwcGxpZXMgYSBuZXcgc2NhbGUgKHNvIHRoZSBncmlwIGZvbGxvd3MgdGhlIGdyb3dpbmcvc2hyaW5raW5nIGJveCkuICovXG4gIHJlcG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdncgPSB0aGlzLmhvc3QuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgdmggPSB0aGlzLmhvc3QuY2xpZW50SGVpZ2h0O1xuICAgIGlmICghdGhpcy52aXNpYmxlIHx8IHZ3IDw9IDAgfHwgdmggPD0gMCkge1xuICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdnAgPSB0aGlzLmNhbWVyYTNkLnZpZXdQcm9qZWN0aW9uKHZ3LCB2aCk7XG4gICAgY29uc3QgcyA9IHByb2plY3RQb2ludChtdnAsIHRoaXMub3B0cy50b3BBbmNob3IoKSwgdncsIHZoKTtcbiAgICBpZiAoIXMudmlzaWJsZSkge1xuICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB0aGlzLmVsLnN0eWxlLmxlZnQgPSBgJHtzLnh9cHhgO1xuICAgIHRoaXMuZWwuc3R5bGUudG9wID0gYCR7cy55fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyRG93biA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICB0aGlzLnN0YXJ0U2NhbGUgPSB0aGlzLm9wdHMuZ2V0U2NhbGUoKTtcbiAgICB0aGlzLmVsLnNldFBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyBVcCAobmVnYXRpdmUgZHkpIOKGkiB0YWxsZXIuIEV4cG9uZW50aWFsIHNvIGVhY2ggYHBpeGVsc1BlckRvdWJsZWAgcHggZG91Ymxlcy9oYWx2ZXMgdGhlIGhlaWdodC5cbiAgICBjb25zdCBkeSA9IGUuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucG93KDIsIC1keSAvIHRoaXMub3B0cy5waXhlbHNQZXJEb3VibGUpO1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbih0aGlzLm9wdHMubWF4U2NhbGUsIE1hdGgubWF4KHRoaXMub3B0cy5taW5TY2FsZSwgdGhpcy5zdGFydFNjYWxlICogZmFjdG9yKSk7XG4gICAgdGhpcy5vcHRzLnNldFNjYWxlKG5leHQpO1xuICAgIHRoaXMucmVwb3NpdGlvbigpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qb2ludGVyVXAgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmVsLmhhc1BvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpKSB0aGlzLmVsLnJlbGVhc2VQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uRG91YmxlQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMub3B0cy5zZXRTY2FsZSgxKTtcbiAgICB0aGlzLnJlcG9zaXRpb24oKTtcbiAgfTtcblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSgpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vblBvaW50ZXJEb3duKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uRG91YmxlQ2xpY2spO1xuICAgIHRoaXMuZWwucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5lbCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { PIXEL_WORLD_QUANTUM, snapToWorldGrid } from '../../../spatial/world-grid';
|
|
2
|
+
import { applyAffine } from '../../../region-overlay/svg-region-renderer';
|
|
3
|
+
/**
|
|
4
|
+
* The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
|
|
5
|
+
* units, through the viewer's own transforms (see {@link OverlayViewer}).
|
|
6
|
+
*
|
|
7
|
+
* World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
|
|
8
|
+
* drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
|
|
9
|
+
* client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
|
|
10
|
+
* per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
|
|
11
|
+
* vertex (review NAPARI-BOUNDARY-10).
|
|
12
|
+
*/
|
|
13
|
+
export class OverlayProjection {
|
|
14
|
+
constructor(svg, viewer) {
|
|
15
|
+
this.svg = svg;
|
|
16
|
+
this.viewer = viewer;
|
|
17
|
+
/**
|
|
18
|
+
* How finely a drawn vertex may be placed, in world units.
|
|
19
|
+
*
|
|
20
|
+
* One by default, because for an image the world IS pixels and a region should align to
|
|
21
|
+
* them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
|
|
22
|
+
* sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
|
|
23
|
+
* placeable positions and no ROI can be drawn at all.
|
|
24
|
+
*/
|
|
25
|
+
this.worldQuantum = PIXEL_WORLD_QUANTUM;
|
|
26
|
+
/** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
|
|
27
|
+
this.origin = null;
|
|
28
|
+
this.camera = null;
|
|
29
|
+
/** {@link toLocal} as the shared region geometry takes it. */
|
|
30
|
+
this.toScreen = (x, y) => this.toLocal(x, y);
|
|
31
|
+
}
|
|
32
|
+
setWorldQuantum(quantum) {
|
|
33
|
+
this.worldQuantum = Number.isFinite(quantum) && quantum > 0 ? quantum : PIXEL_WORLD_QUANTUM;
|
|
34
|
+
}
|
|
35
|
+
/** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
|
|
36
|
+
toImage(clientX, clientY) {
|
|
37
|
+
const [wx, wy] = this.viewer.canvasToWorld(clientX, clientY);
|
|
38
|
+
return [snapToWorldGrid(wx, this.worldQuantum), snapToWorldGrid(wy, this.worldQuantum)];
|
|
39
|
+
}
|
|
40
|
+
/** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
|
|
41
|
+
toWorld(clientX, clientY) {
|
|
42
|
+
return this.viewer.canvasToWorld(clientX, clientY);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* World units spanned by one screen pixel, measured through the viewer's own transform.
|
|
46
|
+
*
|
|
47
|
+
* Read from the transform rather than from the camera, so it holds for both the 2D and
|
|
48
|
+
* the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
|
|
49
|
+
* if the transform gives nothing usable, which keeps the established pixel behaviour
|
|
50
|
+
* rather than collapsing the threshold to zero and recording a point per event.
|
|
51
|
+
*/
|
|
52
|
+
worldPerCanvasPixel() {
|
|
53
|
+
const [x0] = this.viewer.canvasToWorld(0, 0);
|
|
54
|
+
const [x1] = this.viewer.canvasToWorld(1, 0);
|
|
55
|
+
const per = Math.abs(x1 - x0);
|
|
56
|
+
return Number.isFinite(per) && per > 0 ? per : 1;
|
|
57
|
+
}
|
|
58
|
+
/** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
|
|
59
|
+
withOrigin(fn) {
|
|
60
|
+
if (this.origin)
|
|
61
|
+
return fn();
|
|
62
|
+
const r = this.svg.getBoundingClientRect();
|
|
63
|
+
this.origin = { left: r.left, top: r.top };
|
|
64
|
+
this.camera = this.viewer.canvasTransform();
|
|
65
|
+
try {
|
|
66
|
+
return fn();
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
this.origin = null;
|
|
70
|
+
this.camera = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Client px → SVG-local px. */
|
|
74
|
+
clientToLocal(clientX, clientY) {
|
|
75
|
+
const o = this.origin ?? this.svg.getBoundingClientRect();
|
|
76
|
+
return [clientX - o.left, clientY - o.top];
|
|
77
|
+
}
|
|
78
|
+
/** World coords → SVG-local px, through the camera affine: no layout read. */
|
|
79
|
+
toLocal(imgX, imgY) {
|
|
80
|
+
return applyAffine(this.affine(), imgX, imgY);
|
|
81
|
+
}
|
|
82
|
+
/** Screen distance (px) between a client point and a world point. */
|
|
83
|
+
screenDist(clientX, clientY, imgX, imgY) {
|
|
84
|
+
const [lx, ly] = this.toLocal(imgX, imgY);
|
|
85
|
+
const [px, py] = this.clientToLocal(clientX, clientY);
|
|
86
|
+
return Math.hypot(px - lx, py - ly);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
|
|
90
|
+
* reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
|
|
91
|
+
*/
|
|
92
|
+
affine() {
|
|
93
|
+
return this.camera ?? this.viewer.canvasTransform();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wcm9qZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3JlZ2lvbi1vdmVybGF5L292ZXJsYXktcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBR2xGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFjNUIsWUFDbUIsR0FBa0IsRUFDbEIsTUFBcUI7UUFEckIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBZnhDOzs7Ozs7O1dBT0c7UUFDSyxpQkFBWSxHQUFHLG1CQUFtQixDQUFDO1FBQzNDLG1HQUFtRztRQUMzRixXQUFNLEdBQXlDLElBQUksQ0FBQztRQUNwRCxXQUFNLEdBQWtCLElBQUksQ0FBQztRQThEckMsOERBQThEO1FBQ3JELGFBQVEsR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBMUR4RCxDQUFDO0lBRUosZUFBZSxDQUFDLE9BQWU7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDOUYsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxPQUFPLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDdEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFB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QU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHNuYXBUb1dvcmxkR3JpZCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgdHlwZSB7IFRvU2NyZWVuIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IEFmZmluZSwgYXBwbHlBZmZpbmUgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9zdmctcmVnaW9uLXJlbmRlcmVyJztcbmltcG9ydCB0eXBlIHsgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4uL25hcGFyaS1yZWdpb24tb3ZlcmxheSc7XG5cbi8qKlxuICogVGhlIHJlZ2lvbiBvdmVybGF5J3MgY29vcmRpbmF0ZSBzcGFjZXM6IHBvaW50ZXIgQ0xJRU5UIHBpeGVscywgc3ZnLUxPQ0FMIHBpeGVscyBhbmQgV09STERcbiAqIHVuaXRzLCB0aHJvdWdoIHRoZSB2aWV3ZXIncyBvd24gdHJhbnNmb3JtcyAoc2VlIHtAbGluayBPdmVybGF5Vmlld2VyfSkuXG4gKlxuICogV29ybGQg4oaSIHN2Zy1sb2NhbCBpcyB0aGUgdmlld2VyJ3MgY2FtZXJhIGFmZmluZSAoYGNhbnZhc1RyYW5zZm9ybWApLCB3aGljaCByZWFkcyBubyBsYXlvdXQsIHNvXG4gKiBkcmF3aW5nIGFuZCBmb2xsb3dpbmcgdGhlIGNhbWVyYSByZWFkIG5vbmUuIE9ubHkgYSBwb2ludGVyLCBpbiBjbGllbnQgcGl4ZWxzLCBuZWVkcyB0aGUgc3ZnJ3NcbiAqIGNsaWVudCBvcmlnaW46IHJlYWQgb25jZSBwZXIge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIChhIGdlc3R1cmUgZXZlbnQpLCBhcyBhbiB1bmNhY2hlZCByZWFkXG4gKiBwZXIgdmVydGV4IOKAlCBpbnRlcmxlYXZlZCB3aXRoIHRoZSBlbGVtZW50cyBhIHJlZHJhdyBhcHBlbmRzIOKAlCBmb3JjZWQgYSBzeW5jaHJvbm91cyBsYXlvdXQgcGVyXG4gKiB2ZXJ0ZXggKHJldmlldyBOQVBBUkktQk9VTkRBUlktMTApLlxuICovXG5leHBvcnQgY2xhc3MgT3ZlcmxheVByb2plY3Rpb24ge1xuICAvKipcbiAgICogSG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLCBpbiB3b3JsZCB1bml0cy5cbiAgICpcbiAgICogT25lIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZm9yIGFuIGltYWdlIHRoZSB3b3JsZCBJUyBwaXhlbHMgYW5kIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0b1xuICAgKiB0aGVtLiBBIGRhdGFzZXQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwaXhlbHMgc2V0cyBpdCBmaW5lciDigJQgc2VxRklTSCdzIHdob2xlXG4gICAqIHNhbXBsZSBzcGFucyBhYm91dCA1IHggNyB1bml0cywgd2hlcmUgd2hvbGUtdW5pdCB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodFxuICAgKiBwbGFjZWFibGUgcG9zaXRpb25zIGFuZCBubyBST0kgY2FuIGJlIGRyYXduIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgd29ybGRRdWFudHVtID0gUElYRUxfV09STERfUVVBTlRVTTtcbiAgLyoqIFRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSwgY2FjaGVkIHdoaWxlIGEge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIHJ1bnMuICovXG4gIHByaXZhdGUgb3JpZ2luOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYTogQWZmaW5lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IE92ZXJsYXlWaWV3ZXIsXG4gICkge31cblxuICBzZXRXb3JsZFF1YW50dW0ocXVhbnR1bTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy53b3JsZFF1YW50dW0gPSBOdW1iZXIuaXNGaW5pdGUocXVhbnR1bSkgJiYgcXVhbnR1bSA+IDAgPyBxdWFudHVtIDogUElYRUxfV09STERfUVVBTlRVTTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3Jkcywgc25hcHBlZCB0byB0aGUgd29ybGQgcXVhbnR1bSAoZm9yIHBsYWNpbmcgdmVydGljZXMpLiAqL1xuICB0b0ltYWdlKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgW3d4LCB3eV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBbc25hcFRvV29ybGRHcmlkKHd4LCB0aGlzLndvcmxkUXVhbnR1bSksIHNuYXBUb1dvcmxkR3JpZCh3eSwgdGhpcy53b3JsZFF1YW50dW0pXTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3JkcywgZXhhY3QgKGZvciBwaWNraW5nOiBzbmFwcGluZyBpcyBmb3IgcGxhY2luZykuICovXG4gIHRvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXb3JsZCB1bml0cyBzcGFubmVkIGJ5IG9uZSBzY3JlZW4gcGl4ZWwsIG1lYXN1cmVkIHRocm91Z2ggdGhlIHZpZXdlcidzIG93biB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgdHJhbnNmb3JtIHJhdGhlciB0aGFuIGZyb20gdGhlIGNhbWVyYSwgc28gaXQgaG9sZHMgZm9yIGJvdGggdGhlIDJEIGFuZFxuICAgKiB0aGUgM0Qgc2NyZWVuLXNwYWNlIGFkYXB0ZXJzIHdpdGhvdXQgZWl0aGVyIGhhdmluZyB0byBleHBvc2UgYSB6b29tLiBGYWxscyBiYWNrIHRvIDFcbiAgICogaWYgdGhlIHRyYW5zZm9ybSBnaXZlcyBub3RoaW5nIHVzYWJsZSwgd2hpY2gga2VlcHMgdGhlIGVzdGFibGlzaGVkIHBpeGVsIGJlaGF2aW91clxuICAgKiByYXRoZXIgdGhhbiBjb2xsYXBzaW5nIHRoZSB0aHJlc2hvbGQgdG8gemVybyBhbmQgcmVjb3JkaW5nIGEgcG9pbnQgcGVyIGV2ZW50LlxuICAgKi9cbiAgd29ybGRQZXJDYW52YXNQaXhlbCgpOiBudW1iZXIge1xuICAgIGNvbnN0IFt4MF0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDAsIDApO1xuICAgIGNvbnN0IFt4MV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDEsIDApO1xuICAgIGNvbnN0IHBlciA9IE1hdGguYWJzKHgxIC0geDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGVyKSAmJiBwZXIgPiAwID8gcGVyIDogMTtcbiAgfVxuXG4gIC8qKiBSdW4gYGZuYCB3aXRoIHRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSByZWFkIG9uY2UgKG5lc3RlZCBjYWxscyByZXVzZSB0aGVtKS4gKi9cbiAgd2l0aE9yaWdpbjxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIGlmICh0aGlzLm9yaWdpbikgcmV0dXJuIGZuKCk7XG4gICAgY29uc3QgciA9IHRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMub3JpZ2luID0geyBsZWZ0OiByLmxlZnQsIHRvcDogci50b3AgfTtcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGllbnQgcHgg4oaSIFNWRy1sb2NhbCBweC4gKi9cbiAgY2xpZW50VG9Mb2NhbChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IG8gPSB0aGlzLm9yaWdpbiA/PyB0aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gW2NsaWVudFggLSBvLmxlZnQsIGNsaWVudFkgLSBvLnRvcF07XG4gIH1cblxuICAvKiogV29ybGQgY29vcmRzIOKGkiBTVkctbG9jYWwgcHgsIHRocm91Z2ggdGhlIGNhbWVyYSBhZmZpbmU6IG5vIGxheW91dCByZWFkLiAqL1xuICB0b0xvY2FsKGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGFwcGx5QWZmaW5lKHRoaXMuYWZmaW5lKCksIGltZ1gsIGltZ1kpO1xuICB9XG5cbiAgLyoqIHtAbGluayB0b0xvY2FsfSBhcyB0aGUgc2hhcmVkIHJlZ2lvbiBnZW9tZXRyeSB0YWtlcyBpdC4gKi9cbiAgcmVhZG9ubHkgdG9TY3JlZW46IFRvU2NyZWVuID0gKHgsIHkpID0+IHRoaXMudG9Mb2NhbCh4LCB5KTtcblxuICAvKiogU2NyZWVuIGRpc3RhbmNlIChweCkgYmV0d2VlbiBhIGNsaWVudCBwb2ludCBhbmQgYSB3b3JsZCBwb2ludC4gKi9cbiAgc2NyZWVuRGlzdChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgaW1nWDogbnVtYmVyLCBpbWdZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IFtseCwgbHldID0gdGhpcy50b0xvY2FsKGltZ1gsIGltZ1kpO1xuICAgIGNvbnN0IFtweCwgcHldID0gdGhpcy5jbGllbnRUb0xvY2FsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBNYXRoLmh5cG90KHB4IC0gbHgsIHB5IC0gbHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCDihpIgc3ZnLWxvY2FsIGFmZmluZSBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhOiB0aGUgdmlld2VyJ3MgYGNhbnZhc1RyYW5zZm9ybWAsIHdoaWNoXG4gICAqIHJlYWRzIG5vIGxheW91dC4gVGhlIHN2ZyBhbmQgdGhlIGNhbnZhcyBzaGFyZSBhbiBvcmlnaW4gKHNlZSB7QGxpbmsgT3ZlcmxheVZpZXdlcn0pLlxuICAgKi9cbiAgYWZmaW5lKCk6IEFmZmluZSB7XG4gICAgcmV0dXJuIHRoaXMuY2FtZXJhID8/IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Rectangle } from '../../../models/region';
|
|
2
|
+
/** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
|
|
3
|
+
export function applyRegionEdit(store, edit, x, y) {
|
|
4
|
+
switch (edit.kind) {
|
|
5
|
+
case 'body': {
|
|
6
|
+
const [lx, ly] = edit.last;
|
|
7
|
+
store.moveRegion(edit.id, x - lx, y - ly);
|
|
8
|
+
edit.last = [x, y];
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
case 'corner': {
|
|
12
|
+
const [ax, ay] = edit.anchor;
|
|
13
|
+
const rect = new Rectangle();
|
|
14
|
+
rect.x = Math.min(ax, x);
|
|
15
|
+
rect.y = Math.min(ay, y);
|
|
16
|
+
rect.width = Math.abs(x - ax);
|
|
17
|
+
rect.height = Math.abs(y - ay);
|
|
18
|
+
store.updateBounds(edit.id, rect);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
case 'vertex':
|
|
22
|
+
if (edit.ring < 0)
|
|
23
|
+
store.moveVertex(edit.id, edit.index, x, y);
|
|
24
|
+
else
|
|
25
|
+
store.moveHoleVertex(edit.id, edit.ring, edit.index, x, y);
|
|
26
|
+
return;
|
|
27
|
+
case 'bezier':
|
|
28
|
+
if (edit.ring < 0)
|
|
29
|
+
store.moveBezierHandle(edit.id, edit.index, edit.side, x, y);
|
|
30
|
+
else
|
|
31
|
+
store.moveHoleBezierHandle(edit.id, edit.ring, edit.index, edit.side, x, y);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBV25ELHFHQUFxRztBQUNyRyxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWtCLEVBQUUsSUFBZ0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN4RixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssUUFBUTtZQUNYLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Z0JBQzFELEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU87UUFDVCxLQUFLLFFBQVE7WUFDWCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztnQkFDM0UsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87SUFDWCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVIaXQgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBBIGxpdmUgZHJhZyBvZiB0aGUgc2VsZWN0L21vdmUgdG9vbHM6IHRoZSByZWdpb24ncyBib2R5LCBvciBvbmUgb2YgaXRzIGhhbmRsZXMgYXMgdGhlXG4gKiBzaGFyZWQgYGhpdEhhbmRsZWAgbmFtZXMgaXQgKGEgcmVjdGFuZ2xlIGNvcm5lciB3aXRoIGl0cyBmaXhlZCBvcHBvc2l0ZSBgYW5jaG9yYCwgb3IgYVxuICogdmVydGV4IC8gYsOpemllciBjb250cm9sIHBvaW50IG9uIGByaW5nYCAtMSBmb3IgdGhlIGV4dGVyaW9yLCBlbHNlIGEgaG9sZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lvbkVkaXQgPSB7IGlkOiBudW1iZXI7IGxhc3Q6IFtudW1iZXIsIG51bWJlcl0gfSAmICh7IGtpbmQ6ICdib2R5JyB9IHwgSGFuZGxlSGl0KTtcblxuLyoqIEFwcGx5IHRoZSBkcmFnIG9mIGBlZGl0YCB0byB0aGUgcG9pbnRlciBhdCB3b3JsZCBwb2ludCBgKHgsIHkpYCwgdGhyb3VnaCB0aGUgc3RvcmUncyBlZGl0IG9wcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJlZ2lvbkVkaXQoc3RvcmU6IFJlZ2lvblN0b3JlLCBlZGl0OiBSZWdpb25FZGl0LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICBzd2l0Y2ggKGVkaXQua2luZCkge1xuICAgIGNhc2UgJ2JvZHknOiB7XG4gICAgICBjb25zdCBbbHgsIGx5XSA9IGVkaXQubGFzdDtcbiAgICAgIHN0b3JlLm1vdmVSZWdpb24oZWRpdC5pZCwgeCAtIGx4LCB5IC0gbHkpO1xuICAgICAgZWRpdC5sYXN0ID0gW3gsIHldO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICdjb3JuZXInOiB7XG4gICAgICBjb25zdCBbYXgsIGF5XSA9IGVkaXQuYW5jaG9yO1xuICAgICAgY29uc3QgcmVjdCA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgIHJlY3QueCA9IE1hdGgubWluKGF4LCB4KTtcbiAgICAgIHJlY3QueSA9IE1hdGgubWluKGF5LCB5KTtcbiAgICAgIHJlY3Qud2lkdGggPSBNYXRoLmFicyh4IC0gYXgpO1xuICAgICAgcmVjdC5oZWlnaHQgPSBNYXRoLmFicyh5IC0gYXkpO1xuICAgICAgc3RvcmUudXBkYXRlQm91bmRzKGVkaXQuaWQsIHJlY3QpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICd2ZXJ0ZXgnOlxuICAgICAgaWYgKGVkaXQucmluZyA8IDApIHN0b3JlLm1vdmVWZXJ0ZXgoZWRpdC5pZCwgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlVmVydGV4KGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGlmIChlZGl0LnJpbmcgPCAwKSBzdG9yZS5tb3ZlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQuaW5kZXgsIGVkaXQuc2lkZSwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgZWRpdC5zaWRlLCB4LCB5KTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Polygon, Rectangle } from '../../../models/region';
|
|
2
|
+
import { regionBBox, ringHandles, ringOf } from '../../../region-overlay/region-geometry';
|
|
3
|
+
import { SvgRegionRenderer, svgEl } from '../../../region-overlay/svg-region-renderer';
|
|
4
|
+
import { applyPaint, isFilled, placeInsideLabel, regionLabelSpots, shapePaint, } from '../../../region-overlay/region-style';
|
|
5
|
+
const SVG_NS = 'http://www.w3.org/2000/svg';
|
|
6
|
+
/** Rendered handle size (screen px). */
|
|
7
|
+
export const HANDLE_SIZE = 7;
|
|
8
|
+
/**
|
|
9
|
+
* What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
|
|
10
|
+
* in world coordinates (styled from the store's colours, labelled when labels are on), and in
|
|
11
|
+
* screen space the selected regions' grab handles (corners, vertices, bézier control points),
|
|
12
|
+
* the draft being drawn and the rubber-band marquee.
|
|
13
|
+
*/
|
|
14
|
+
export class NapariRegionSvgRenderer {
|
|
15
|
+
constructor(svg, store) {
|
|
16
|
+
this.svg = svg;
|
|
17
|
+
this.store = store;
|
|
18
|
+
/** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
|
|
19
|
+
this.marqueeEl = null;
|
|
20
|
+
this.renderer = new SvgRegionRenderer(svg, {
|
|
21
|
+
rectElement: 'rect',
|
|
22
|
+
styleShape: (el, region, selected) => this.style(el, this.strokeOf(region), selected),
|
|
23
|
+
decorate: (region, _i, _selected, layer) => this.drawLabel(region, layer),
|
|
24
|
+
skip: (region) => !!region.isProfile?.() || store.isClassHidden(region.label),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Follow the camera: one transform attribute plus the screen-space elements. */
|
|
28
|
+
setCamera(affine) {
|
|
29
|
+
this.renderer.setCamera(affine);
|
|
30
|
+
}
|
|
31
|
+
/** Rebuild the regions (world space) and their labels. */
|
|
32
|
+
render(regions, selected) {
|
|
33
|
+
this.renderer.render(regions, selected);
|
|
34
|
+
}
|
|
35
|
+
/** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
|
|
36
|
+
renderOverlay(regions, selected, draft) {
|
|
37
|
+
this.renderer.renderOverlay((layer) => {
|
|
38
|
+
for (const i of selected) {
|
|
39
|
+
const region = regions[i];
|
|
40
|
+
if (region && !region.isProfile?.())
|
|
41
|
+
this.drawHandles(region, layer);
|
|
42
|
+
}
|
|
43
|
+
this.drawDraft(draft, layer);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
|
|
47
|
+
showMarquee(lx, ly, rx, ry) {
|
|
48
|
+
if (!this.marqueeEl || !this.marqueeEl.parentNode) {
|
|
49
|
+
this.marqueeEl = document.createElementNS(SVG_NS, 'rect');
|
|
50
|
+
this.marqueeEl.setAttribute('stroke', '#4da3ff');
|
|
51
|
+
this.marqueeEl.setAttribute('stroke-width', '1');
|
|
52
|
+
this.marqueeEl.setAttribute('stroke-dasharray', '4 3');
|
|
53
|
+
this.marqueeEl.setAttribute('fill', '#4da3ff');
|
|
54
|
+
this.marqueeEl.setAttribute('fill-opacity', '0.12');
|
|
55
|
+
this.marqueeEl.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
56
|
+
this.svg.appendChild(this.marqueeEl);
|
|
57
|
+
}
|
|
58
|
+
this.marqueeEl.setAttribute('x', `${lx}`);
|
|
59
|
+
this.marqueeEl.setAttribute('y', `${ly}`);
|
|
60
|
+
this.marqueeEl.setAttribute('width', `${Math.abs(rx - lx)}`);
|
|
61
|
+
this.marqueeEl.setAttribute('height', `${Math.abs(ry - ly)}`);
|
|
62
|
+
}
|
|
63
|
+
/** Remove the marquee element from the SVG. */
|
|
64
|
+
clearMarquee() {
|
|
65
|
+
if (this.marqueeEl?.parentNode)
|
|
66
|
+
this.marqueeEl.parentNode.removeChild(this.marqueeEl);
|
|
67
|
+
this.marqueeEl = null;
|
|
68
|
+
}
|
|
69
|
+
/** A region's outline colour. */
|
|
70
|
+
strokeOf(region) {
|
|
71
|
+
return region.color || this.store.getShapeColor() || '#00ffff';
|
|
72
|
+
}
|
|
73
|
+
/** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
|
|
74
|
+
drawLabel(region, layer) {
|
|
75
|
+
if (!this.store.getShowShapeLabel() || region.isProfile?.() || this.store.isLabelCovered(region.label))
|
|
76
|
+
return;
|
|
77
|
+
const label = region.label;
|
|
78
|
+
// The filled (atlas) look labels each part inside it, where it fits.
|
|
79
|
+
if (label && isFilled(this.store.getRegionStyle())) {
|
|
80
|
+
for (const spot of regionLabelSpots(region))
|
|
81
|
+
placeInsideLabel(layer, label, spot);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const bb = label ? regionBBox(region) : null;
|
|
85
|
+
if (!label || !bb)
|
|
86
|
+
return;
|
|
87
|
+
const text = svgEl('text');
|
|
88
|
+
text.setAttribute('fill', '#fff');
|
|
89
|
+
text.setAttribute('stroke', '#000');
|
|
90
|
+
text.setAttribute('stroke-width', '3');
|
|
91
|
+
text.setAttribute('paint-order', 'stroke');
|
|
92
|
+
text.setAttribute('font', '12px sans-serif');
|
|
93
|
+
text.setAttribute('pointer-events', 'none');
|
|
94
|
+
text.textContent = label;
|
|
95
|
+
layer.at(text, bb.x0, bb.y0, { dy: -4 });
|
|
96
|
+
}
|
|
97
|
+
/** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
|
|
98
|
+
drawHandles(region, layer) {
|
|
99
|
+
const b = region.bounds;
|
|
100
|
+
if (!b)
|
|
101
|
+
return;
|
|
102
|
+
const stroke = this.strokeOf(region);
|
|
103
|
+
const handle = (imgX, imgY) => {
|
|
104
|
+
const el = svgEl('rect');
|
|
105
|
+
el.setAttribute('width', `${HANDLE_SIZE}`);
|
|
106
|
+
el.setAttribute('height', `${HANDLE_SIZE}`);
|
|
107
|
+
el.setAttribute('fill', '#fff');
|
|
108
|
+
el.setAttribute('stroke', stroke);
|
|
109
|
+
el.setAttribute('stroke-width', '1.5');
|
|
110
|
+
layer.at(el, imgX, imgY, { dx: -HANDLE_SIZE / 2, dy: -HANDLE_SIZE / 2 });
|
|
111
|
+
};
|
|
112
|
+
if (b instanceof Rectangle) {
|
|
113
|
+
handle(b.x, b.y);
|
|
114
|
+
handle(b.x + b.width, b.y);
|
|
115
|
+
handle(b.x, b.y + b.height);
|
|
116
|
+
handle(b.x + b.width, b.y + b.height);
|
|
117
|
+
}
|
|
118
|
+
else if (b instanceof Polygon) {
|
|
119
|
+
for (let i = 0; i < b.npoints; i++)
|
|
120
|
+
handle(b.xpoints[i], b.ypoints[i]);
|
|
121
|
+
for (const ring of b.holes ?? [])
|
|
122
|
+
for (const [hx, hy] of ring)
|
|
123
|
+
handle(hx, hy);
|
|
124
|
+
// Bezier regions also expose their tangent control points (circles) joined to the anchor
|
|
125
|
+
// by a thin line, matching the OSD overlay's editable bezier handles. Stored handles when
|
|
126
|
+
// present, else the Catmull-Rom default the curve is drawn with.
|
|
127
|
+
if (b.bezier) {
|
|
128
|
+
for (let ring = -1; ring < (b.holes?.length ?? 0); ring++) {
|
|
129
|
+
const { xs, ys } = ringOf(b, ring);
|
|
130
|
+
ringHandles(b, ring).forEach((h, i) => {
|
|
131
|
+
if (h.hasOut)
|
|
132
|
+
this.drawBezierHandle(xs[i], ys[i], h.out, stroke, layer);
|
|
133
|
+
if (h.hasIn)
|
|
134
|
+
this.drawBezierHandle(xs[i], ys[i], h.in, stroke, layer);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
|
|
141
|
+
* `handle` is the control point's absolute position in image space. */
|
|
142
|
+
drawBezierHandle(ax, ay, handle, stroke, layer) {
|
|
143
|
+
if (handle[0] === ax && handle[1] === ay)
|
|
144
|
+
return;
|
|
145
|
+
const line = layer.line(ax, ay, handle[0], handle[1]);
|
|
146
|
+
line.setAttribute('stroke', stroke);
|
|
147
|
+
line.setAttribute('stroke-width', '1');
|
|
148
|
+
line.setAttribute('stroke-opacity', '0.7');
|
|
149
|
+
const dot = svgEl('circle');
|
|
150
|
+
dot.setAttribute('r', `${HANDLE_SIZE / 2}`);
|
|
151
|
+
dot.setAttribute('fill', stroke);
|
|
152
|
+
dot.setAttribute('stroke', '#fff');
|
|
153
|
+
dot.setAttribute('stroke-width', '1');
|
|
154
|
+
layer.at(dot, handle[0], handle[1], { x: 'cx', y: 'cy' });
|
|
155
|
+
}
|
|
156
|
+
style(el, stroke, isSelected) {
|
|
157
|
+
const style = this.store.getRegionStyle();
|
|
158
|
+
if (isFilled(style)) {
|
|
159
|
+
applyPaint(el, shapePaint(stroke, isSelected, style));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
el.setAttribute('stroke', stroke);
|
|
163
|
+
el.setAttribute('stroke-width', isSelected ? '4' : '2');
|
|
164
|
+
el.setAttribute('fill', isSelected ? stroke : 'none');
|
|
165
|
+
el.setAttribute('fill-opacity', isSelected ? '0.35' : '0');
|
|
166
|
+
}
|
|
167
|
+
/** Draw the in-progress rectangle / path preview. */
|
|
168
|
+
drawDraft(draft, layer) {
|
|
169
|
+
if (draft.rect) {
|
|
170
|
+
const { x0, y0, x1, y1 } = draft.rect;
|
|
171
|
+
const el = svgEl('rect');
|
|
172
|
+
layer.place(el, (e, project) => {
|
|
173
|
+
const [lx, ly] = project(Math.min(x0, x1), Math.min(y0, y1));
|
|
174
|
+
const [rx, ry] = project(Math.max(x0, x1), Math.max(y0, y1));
|
|
175
|
+
e.setAttribute('x', `${lx}`);
|
|
176
|
+
e.setAttribute('y', `${ly}`);
|
|
177
|
+
e.setAttribute('width', `${Math.abs(rx - lx)}`);
|
|
178
|
+
e.setAttribute('height', `${Math.abs(ry - ly)}`);
|
|
179
|
+
});
|
|
180
|
+
this.styleDraft(el);
|
|
181
|
+
}
|
|
182
|
+
if (draft.path && draft.path.length) {
|
|
183
|
+
this.styleDraft(layer.poly('polyline', draft.path.map(([x, y]) => ({ x, y }))));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
styleDraft(el) {
|
|
187
|
+
el.setAttribute('stroke', this.store.getShapeColor() || '#00ffff');
|
|
188
|
+
el.setAttribute('stroke-width', '2');
|
|
189
|
+
el.setAttribute('stroke-dasharray', '4 3');
|
|
190
|
+
el.setAttribute('fill', 'none');
|
|
191
|
+
el.setAttribute('vector-effect', 'non-scaling-stroke');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN2Zy1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3ZnLXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUYsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxLQUFLLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM1RyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFVBQVUsR0FDWCxNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLDRCQUE0QixDQUFDO0FBQzVDLHdDQUF3QztBQUN4QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBZ0I3Qjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFLbEMsWUFDbUIsR0FBa0IsRUFDbEIsS0FBa0I7UUFEbEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixVQUFLLEdBQUwsS0FBSyxDQUFhO1FBTHJDLGdHQUFnRztRQUN4RixjQUFTLEdBQTBCLElBQUksQ0FBQztRQU05QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3pDLFdBQVcsRUFBRSxNQUFNO1lBQ25CLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEs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Q0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxTQUFTLENBQUMsQ0FBQztRQUNuRSxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxFQUFFLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9seWdvbiwgUmVjdGFuZ2xlLCBSZWdpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyByZWdpb25CQm94LCByaW5nSGFuZGxlcywgcmluZ09mIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IEFmZmluZSwgU2NyZWVuTGF5ZXIsIFN2Z1JlZ2lvblJlbmRlcmVyLCBzdmdFbCB9IGZyb20gJy4uLy4uLy4uL3JlZ2lvbi1vdmVybGF5L3N2Zy1yZWdpb24tcmVuZGVyZXInO1xuaW1wb3J0IHtcbiAgYXBwbHlQYWludCxcbiAgaXNGaWxsZWQsXG4gIHBsYWNlSW5zaWRlTGFiZWwsXG4gIHJlZ2lvbkxhYmVsU3BvdHMsXG4gIHNoYXBlUGFpbnQsXG59IGZyb20gJy4uLy4uLy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5cbmNvbnN0IFNWR19OUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4vKiogUmVuZGVyZWQgaGFuZGxlIHNpemUgKHNjcmVlbiBweCkuICovXG5leHBvcnQgY29uc3QgSEFORExFX1NJWkUgPSA3O1xuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCBmcm9tIGEgZHJhZydzIHN0YXJ0IHRvIGl0cyBjdXJyZW50IHBvaW50IChhbnkgb3JkZXIpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcmFnQm94IHtcbiAgeDA6IG51bWJlcjtcbiAgeTA6IG51bWJlcjtcbiAgeDE6IG51bWJlcjtcbiAgeTE6IG51bWJlcjtcbn1cblxuLyoqIEEgcmVnaW9uIGJlaW5nIGRyYXduOiBhIHJlY3RhbmdsZSBkcmFnLCBvciBhIGZyZWVoYW5kIC8gY2xpY2stcGxhY2VkIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvbkRyYWZ0IHtcbiAgcmVjdDogRHJhZ0JveCB8IG51bGw7XG4gIHBhdGg6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBuYXBhcmkgcmVnaW9uIG92ZXJsYXkgZHJhd3MsIG92ZXIgdGhlIHNoYXJlZCB7QGxpbmsgU3ZnUmVnaW9uUmVuZGVyZXJ9OiB0aGUgcmVnaW9uc1xuICogaW4gd29ybGQgY29vcmRpbmF0ZXMgKHN0eWxlZCBmcm9tIHRoZSBzdG9yZSdzIGNvbG91cnMsIGxhYmVsbGVkIHdoZW4gbGFiZWxzIGFyZSBvbiksIGFuZCBpblxuICogc2NyZWVuIHNwYWNlIHRoZSBzZWxlY3RlZCByZWdpb25zJyBncmFiIGhhbmRsZXMgKGNvcm5lcnMsIHZlcnRpY2VzLCBiw6l6aWVyIGNvbnRyb2wgcG9pbnRzKSxcbiAqIHRoZSBkcmFmdCBiZWluZyBkcmF3biBhbmQgdGhlIHJ1YmJlci1iYW5kIG1hcnF1ZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlSZWdpb25TdmdSZW5kZXJlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFN2Z1JlZ2lvblJlbmRlcmVyO1xuICAvKiogRGVkaWNhdGVkIG1hcnF1ZWUgcmVjdCBlbGVtZW50LCB1cGRhdGVkIGRpcmVjdGx5IGR1cmluZyB0aGUgZHJhZyAobm8gZnVsbCByZWdpb24gcmVkcmF3KS4gKi9cbiAgcHJpdmF0ZSBtYXJxdWVlRWw6IFNWR1JlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogUmVnaW9uU3RvcmUsXG4gICkge1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3ZnUmVnaW9uUmVuZGVyZXIoc3ZnLCB7XG4gICAgICByZWN0RWxlbWVudDogJ3JlY3QnLFxuICAgICAgc3R5bGVTaGFwZTogKGVsLCByZWdpb24sIHNlbGVjdGVkKSA9PiB0aGlzLnN0eWxlKGVsLCB0aGlzLnN0cm9rZU9mKHJlZ2lvbiksIHNlbGVjdGVkKSxcbiAgICAgIGRlY29yYXRlOiAocmVnaW9uLCBfaSwgX3NlbGVjdGVkLCBsYXllcikgPT4gdGhpcy5kcmF3TGFiZWwocmVnaW9uLCBsYXllciksXG4gICAgICBza2lwOiAocmVnaW9uKSA9PiAhIXJlZ2lvbi5pc1Byb2ZpbGU/LigpIHx8IHN0b3JlLmlzQ2xhc3NIaWRkZW4ocmVnaW9uLmxhYmVsKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBGb2xsb3cgdGhlIGNhbWVyYTogb25lIHRyYW5zZm9ybSBhdHRyaWJ1dGUgcGx1cyB0aGUgc2NyZWVuLXNwYWNlIGVsZW1lbnRzLiAqL1xuICBzZXRDYW1lcmEoYWZmaW5lOiBBZmZpbmUpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENhbWVyYShhZmZpbmUpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHJlZ2lvbnMgKHdvcmxkIHNwYWNlKSBhbmQgdGhlaXIgbGFiZWxzLiAqL1xuICByZW5kZXIocmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sIHNlbGVjdGVkOiByZWFkb25seSBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHJlZ2lvbnMsIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBzY3JlZW4tc3BhY2Ugb3ZlcmxheSBvbmx5OiB0aGUgc2VsZWN0ZWQgcmVnaW9ucycgaGFuZGxlcyBhbmQgdGhlIGRyYWZ0LiAqL1xuICByZW5kZXJPdmVybGF5KHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLCBzZWxlY3RlZDogcmVhZG9ubHkgbnVtYmVyW10sIGRyYWZ0OiBSZWdpb25EcmFmdCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyT3ZlcmxheSgobGF5ZXIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCByZWdpb24gPSByZWdpb25zW2ldO1xuICAgICAgICBpZiAocmVnaW9uICYmICFyZWdpb24uaXNQcm9maWxlPy4oKSkgdGhpcy5kcmF3SGFuZGxlcyhyZWdpb24sIGxheWVyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhd0RyYWZ0KGRyYWZ0LCBsYXllcik7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2hvdyB0aGUgbWFycXVlZSBvdmVyIHN2Zy1sb2NhbCBjb3JuZXJzIGAobHgsIGx5KWDigJNgKHJ4LCByeSlgLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuICovXG4gIHNob3dNYXJxdWVlKGx4OiBudW1iZXIsIGx5OiBudW1iZXIsIHJ4OiBudW1iZXIsIHJ5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFycXVlZUVsIHx8ICF0aGlzLm1hcnF1ZWVFbC5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLm1hcnF1ZWVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsICdyZWN0Jyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjNGRhM2ZmJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNCAzJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnIzRkYTNmZicpO1xuICAgICAgdGhpcy5tYXJxdWVlRWwuc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCAnMC4xMicpO1xuICAgICAgdGhpcy5tYXJxdWVlRWwuc2V0QXR0cmlidXRlKCd2ZWN0b3ItZWZmZWN0JywgJ25vbi1zY2FsaW5nLXN0cm9rZScpO1xuICAgICAgdGhpcy5zdmcuYXBwZW5kQ2hpbGQodGhpcy5tYXJxdWVlRWwpO1xuICAgIH1cbiAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHtseH1gKTtcbiAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3knLCBgJHtseX1gKTtcbiAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7TWF0aC5hYnMocnggLSBseCl9YCk7XG4gICAgdGhpcy5tYXJxdWVlRWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtNYXRoLmFicyhyeSAtIGx5KX1gKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgdGhlIG1hcnF1ZWUgZWxlbWVudCBmcm9tIHRoZSBTVkcuICovXG4gIGNsZWFyTWFycXVlZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tYXJxdWVlRWw/LnBhcmVudE5vZGUpIHRoaXMubWFycXVlZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tYXJxdWVlRWwpO1xuICAgIHRoaXMubWFycXVlZUVsID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBBIHJlZ2lvbidzIG91dGxpbmUgY29sb3VyLiAqL1xuICBwcml2YXRlIHN0cm9rZU9mKHJlZ2lvbjogUmVnaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVnaW9uLmNvbG9yIHx8IHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpIHx8ICcjMDBmZmZmJztcbiAgfVxuXG4gIC8qKiBEcmF3IGEgcmVnaW9uJ3MgY2xhc3NpZmljYXRpb24gbGFiZWwgYXQgaXRzIHRvcC1sZWZ0LCB3aGVuIGxhYmVscyBhcmUgZW5hYmxlZCAobWF0Y2hlcyBPU0QpLiAqL1xuICBwcml2YXRlIGRyYXdMYWJlbChyZWdpb246IFJlZ2lvbiwgbGF5ZXI6IFNjcmVlbkxheWVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0b3JlLmdldFNob3dTaGFwZUxhYmVsKCkgfHwgcmVnaW9uLmlzUHJvZmlsZT8uKCkgfHwgdGhpcy5zdG9yZS5pc0xhYmVsQ292ZXJlZChyZWdpb24ubGFiZWwpKSByZXR1cm47XG4gICAgY29uc3QgbGFiZWwgPSByZWdpb24ubGFiZWw7XG4gICAgLy8gVGhlIGZpbGxlZCAoYXRsYXMpIGxvb2sgbGFiZWxzIGVhY2ggcGFydCBpbnNpZGUgaXQsIHdoZXJlIGl0IGZpdHMuXG4gICAgaWYgKGxhYmVsICYmIGlzRmlsbGVkKHRoaXMuc3RvcmUuZ2V0UmVnaW9uU3R5bGUoKSkpIHtcbiAgICAgIGZvciAoY29uc3Qgc3BvdCBvZiByZWdpb25MYWJlbFNwb3RzKHJlZ2lvbikpIHBsYWNlSW5zaWRlTGFiZWwobGF5ZXIsIGxhYmVsLCBzcG90KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmIgPSBsYWJlbCA/IHJlZ2lvbkJCb3gocmVnaW9uKSA6IG51bGw7XG4gICAgaWYgKCFsYWJlbCB8fCAhYmIpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gc3ZnRWwoJ3RleHQnKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjZmZmJyk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjMDAwJyk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICczJyk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ3BhaW50LW9yZGVyJywgJ3N0cm9rZScpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdmb250JywgJzEycHggc2Fucy1zZXJpZicpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG4gICAgdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgIGxheWVyLmF0KHRleHQsIGJiLngwLCBiYi55MCwgeyBkeTogLTQgfSk7XG4gIH1cblxuICAvKiogRHJhdyBncmFiIGhhbmRsZXMgZm9yIGEgc2VsZWN0ZWQgcmVnaW9uOiByZWN0YW5nbGUgY29ybmVycyBvciBwb2x5Z29uIHZlcnRpY2VzLiAqL1xuICBwcml2YXRlIGRyYXdIYW5kbGVzKHJlZ2lvbjogUmVnaW9uLCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBiID0gcmVnaW9uLmJvdW5kcztcbiAgICBpZiAoIWIpIHJldHVybjtcbiAgICBjb25zdCBzdHJva2UgPSB0aGlzLnN0cm9rZU9mKHJlZ2lvbik7XG4gICAgY29uc3QgaGFuZGxlID0gKGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbCA9IHN2Z0VsKCdyZWN0Jyk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7SEFORExFX1NJWkV9YCk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke0hBTkRMRV9TSVpFfWApO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdmaWxsJywgJyNmZmYnKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgc3Ryb2tlKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzEuNScpO1xuICAgICAgbGF5ZXIuYXQoZWwsIGltZ1gsIGltZ1ksIHsgZHg6IC1IQU5ETEVfU0laRSAvIDIsIGR5OiAtSEFORExFX1NJWkUgLyAyIH0pO1xuICAgIH07XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIGhhbmRsZShiLngsIGIueSk7XG4gICAgICBoYW5kbGUoYi54ICsgYi53aWR0aCwgYi55KTtcbiAgICAgIGhhbmRsZShiLngsIGIueSArIGIuaGVpZ2h0KTtcbiAgICAgIGhhbmRsZShiLnggKyBiLndpZHRoLCBiLnkgKyBiLmhlaWdodCk7XG4gICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiLm5wb2ludHM7IGkrKykgaGFuZGxlKGIueHBvaW50c1tpXSwgYi55cG9pbnRzW2ldKTtcbiAgICAgIGZvciAoY29uc3QgcmluZyBvZiBiLmhvbGVzID8/IFtdKSBmb3IgKGNvbnN0IFtoeCwgaHldIG9mIHJpbmcpIGhhbmRsZShoeCwgaHkpO1xuICAgICAgLy8gQmV6aWVyIHJlZ2lvbnMgYWxzbyBleHBvc2UgdGhlaXIgdGFuZ2VudCBjb250cm9sIHBvaW50cyAoY2lyY2xlcykgam9pbmVkIHRvIHRoZSBhbmNob3JcbiAgICAgIC8vIGJ5IGEgdGhpbiBsaW5lLCBtYXRjaGluZyB0aGUgT1NEIG92ZXJsYXkncyBlZGl0YWJsZSBiZXppZXIgaGFuZGxlcy4gU3RvcmVkIGhhbmRsZXMgd2hlblxuICAgICAgLy8gcHJlc2VudCwgZWxzZSB0aGUgQ2F0bXVsbC1Sb20gZGVmYXVsdCB0aGUgY3VydmUgaXMgZHJhd24gd2l0aC5cbiAgICAgIGlmIChiLmJlemllcikge1xuICAgICAgICBmb3IgKGxldCByaW5nID0gLTE7IHJpbmcgPCAoYi5ob2xlcz8ubGVuZ3RoID8/IDApOyByaW5nKyspIHtcbiAgICAgICAgICBjb25zdCB7IHhzLCB5cyB9ID0gcmluZ09mKGIsIHJpbmcpO1xuICAgICAgICAgIHJpbmdIYW5kbGVzKGIsIHJpbmcpLmZvckVhY2goKGgsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChoLmhhc091dCkgdGhpcy5kcmF3QmV6aWVySGFuZGxlKHhzW2ldLCB5c1tpXSwgaC5vdXQsIHN0cm9rZSwgbGF5ZXIpO1xuICAgICAgICAgICAgaWYgKGguaGFzSW4pIHRoaXMuZHJhd0JlemllckhhbmRsZSh4c1tpXSwgeXNbaV0sIGguaW4sIHN0cm9rZSwgbGF5ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIERyYXcgb25lIGJlemllciBjb250cm9sIHBvaW50IGFzIGEgc21hbGwgY2lyY2xlIGNvbm5lY3RlZCB0byBpdHMgYW5jaG9yIGJ5IGEgdGFuZ2VudCBsaW5lLlxuICAgKiAgYGhhbmRsZWAgaXMgdGhlIGNvbnRyb2wgcG9pbnQncyBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBpbWFnZSBzcGFjZS4gKi9cbiAgcHJpdmF0ZSBkcmF3QmV6aWVySGFuZGxlKFxuICAgIGF4OiBudW1iZXIsXG4gICAgYXk6IG51bWJlcixcbiAgICBoYW5kbGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgc3Ryb2tlOiBzdHJpbmcsXG4gICAgbGF5ZXI6IFNjcmVlbkxheWVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaGFuZGxlWzBdID09PSBheCAmJiBoYW5kbGVbMV0gPT09IGF5KSByZXR1cm47XG4gICAgY29uc3QgbGluZSA9IGxheWVyLmxpbmUoYXgsIGF5LCBoYW5kbGVbMF0sIGhhbmRsZVsxXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxJyk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNycpO1xuICAgIGNvbnN0IGRvdCA9IHN2Z0VsKCdjaXJjbGUnKTtcbiAgICBkb3Quc2V0QXR0cmlidXRlKCdyJywgYCR7SEFORExFX1NJWkUgLyAyfWApO1xuICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzdHJva2UpO1xuICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICcjZmZmJyk7XG4gICAgZG90LnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzEnKTtcbiAgICBsYXllci5hdChkb3QsIGhhbmRsZVswXSwgaGFuZGxlWzFdLCB7IHg6ICdjeCcsIHk6ICdjeScgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0eWxlKGVsOiBTVkdFbGVtZW50LCBzdHJva2U6IHN0cmluZywgaXNTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5zdG9yZS5nZXRSZWdpb25TdHlsZSgpO1xuICAgIGlmIChpc0ZpbGxlZChzdHlsZSkpIHtcbiAgICAgIGFwcGx5UGFpbnQoZWwsIHNoYXBlUGFpbnQoc3Ryb2tlLCBpc1NlbGVjdGVkLCBzdHlsZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBpc1NlbGVjdGVkID8gJzQnIDogJzInKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBpc1NlbGVjdGVkID8gc3Ryb2tlIDogJ25vbmUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsIGlzU2VsZWN0ZWQgPyAnMC4zNScgOiAnMCcpO1xuICB9XG5cbiAgLyoqIERyYXcgdGhlIGluLXByb2dyZXNzIHJlY3RhbmdsZSAvIHBhdGggcHJldmlldy4gKi9cbiAgcHJpdmF0ZSBkcmF3RHJhZnQoZHJhZnQ6IFJlZ2lvbkRyYWZ0LCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoZHJhZnQucmVjdCkge1xuICAgICAgY29uc3QgeyB4MCwgeTAsIHgxLCB5MSB9ID0gZHJhZnQucmVjdDtcbiAgICAgIGNvbnN0IGVsID0gc3ZnRWwoJ3JlY3QnKTtcbiAgICAgIGxheWVyLnBsYWNlKGVsLCAoZSwgcHJvamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBbbHgsIGx5XSA9IHByb2plY3QoTWF0aC5taW4oeDAsIHgxKSwgTWF0aC5taW4oeTAsIHkxKSk7XG4gICAgICAgIGNvbnN0IFtyeCwgcnldID0gcHJvamVjdChNYXRoLm1heCh4MCwgeDEpLCBNYXRoLm1heCh5MCwgeTEpKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHtseH1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3knLCBgJHtseX1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7TWF0aC5hYnMocnggLSBseCl9YCk7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtNYXRoLmFicyhyeSAtIGx5KX1gKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdHlsZURyYWZ0KGVsKTtcbiAgICB9XG4gICAgaWYgKGRyYWZ0LnBhdGggJiYgZHJhZnQucGF0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3R5bGVEcmFmdChcbiAgICAgICAgbGF5ZXIucG9seShcbiAgICAgICAgICAncG9seWxpbmUnLFxuICAgICAgICAgIGRyYWZ0LnBhdGgubWFwKChbeCwgeV0pID0+ICh7IHgsIHkgfSkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0eWxlRHJhZnQoZWw6IFNWR0VsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpIHx8ICcjMDBmZmZmJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsICc0IDMnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndmVjdG9yLWVmZmVjdCcsICdub24tc2NhbGluZy1zdHJva2UnKTtcbiAgfVxufVxuIl19
|