@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
|
@@ -59,4 +59,4 @@ export function cropImage(image, opts = {}) {
|
|
|
59
59
|
const final = downsampleRgba(cropped.data, cropped.width, cropped.height, factor);
|
|
60
60
|
return new ProcessingImage(final.width, final.height, 4, final.data);
|
|
61
61
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9pbWFnZS1jcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVlyRCxzRkFBc0Y7QUFDdEYsU0FBUyxRQUFRLENBQ2YsR0FBc0IsRUFBRSxRQUFnQixFQUFFLFNBQWlCLEVBQzNELENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFFMUMsMEVBQTBFO0lBQzFFLG9DQUFvQztJQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDM0IsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFPLEdBQUcsQ0FBQyxFQUFFLENBQWUsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsY0FBYyxDQUNyQixHQUFzQixFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxNQUFjO0lBRTNFLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQU8sR0FBRyxDQUFDLEVBQUUsQ0FBZSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQXNCLEVBQUUsT0FBeUIsRUFBRTtJQUMzRSxzREFBc0Q7SUFDdEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUN0QixHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FDdkUsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsT0FBTyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvY2Vzc2luZ0ltYWdlIH0gZnJvbSAnLi9wcm9jZXNzaW5nLWltYWdlJztcblxuLyoqIENyb3Agb3B0aW9ucyBpbiBzb3VyY2UtaW1hZ2UgcGl4ZWxzLiBPdXQtb2YtcmFuZ2UgdmFsdWVzIGFyZSBjbGFtcGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcm9wSW1hZ2VPcHRpb25zIHtcbiAgeD86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgLyoqIFBvd2VyLW9mLXR3byBkb3duc2FtcGxlIGxldmVsIGFwcGxpZWQgdG8gdGhlIGNyb3AgKDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuICBsZXZlbD86IG51bWJlcjtcbn1cblxuLyoqIENvcHkgYSBjbGFtcGVkIHJlY3RhbmdsZSBvZiBhbiBSR0JBIHNvdXJjZSBpbnRvIGEgZnJlc2gsIHRpZ2h0bHktcGFja2VkIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGNyb3BSZ2JhKFxuICBzcmM6IFVpbnQ4Q2xhbXBlZEFycmF5LCBzcmNXaWR0aDogbnVtYmVyLCBzcmNIZWlnaHQ6IG51bWJlcixcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuKTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIC8vIENsYW1wIHRoZSByZWN0YW5nbGUgdG8gdGhlIGltYWdlIHNvIGJhZCBwYXJhbXMgc25hcCB0byB0aGUgdmFsaWQgcmVnaW9uXG4gIC8vIGluc3RlYWQgb2YgcmVhZGluZyBvdXQgb2YgYm91bmRzLlxuICBjb25zdCB4MCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNyY1dpZHRoIC0gMSwgTWF0aC5mbG9vcih4KSkpO1xuICBjb25zdCB5MCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNyY0hlaWdodCAtIDEsIE1hdGguZmxvb3IoeSkpKTtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzcmNXaWR0aCAtIHgwLCBNYXRoLmZsb29yKHcpKSk7XG4gIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHNyY0hlaWdodCAtIHkwLCBNYXRoLmZsb29yKGgpKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjUm93ID0gKHkwICsgcm93KSAqIHNyY1dpZHRoICsgeDA7XG4gICAgY29uc3QgZHN0Um93ID0gcm93ICogd2lkdGg7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBjb25zdCBzaSA9IChzcmNSb3cgKyBjb2wpICogNDtcbiAgICAgIGNvbnN0IGRpID0gKGRzdFJvdyArIGNvbCkgKiA0O1xuICAgICAgb3V0W2RpXSAgICAgPSBzcmNbc2ldICAgICBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKiogTmVhcmVzdC1uZWlnaGJvdXIgZG93bnNhbXBsZSBieSBhbiBpbnRlZ2VyIGZhY3RvciAo4omlMSkuIGZhY3Rvcj0xIGlzIGEgbm8tb3AuICovXG5mdW5jdGlvbiBkb3duc2FtcGxlUmdiYShcbiAgc3JjOiBVaW50OENsYW1wZWRBcnJheSwgc3JjV2lkdGg6IG51bWJlciwgc3JjSGVpZ2h0OiBudW1iZXIsIGZhY3RvcjogbnVtYmVyLFxuKTogeyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gIGlmIChmYWN0b3IgPD0gMSkgcmV0dXJuIHsgZGF0YTogc3JjLCB3aWR0aDogc3JjV2lkdGgsIGhlaWdodDogc3JjSGVpZ2h0IH07XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihzcmNXaWR0aCAvIGZhY3RvcikpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNyY0hlaWdodCAvIGZhY3RvcikpO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHN5ID0gTWF0aC5taW4oc3JjSGVpZ2h0IC0gMSwgcm93ICogZmFjdG9yKTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHtcbiAgICAgIGNvbnN0IHN4ID0gTWF0aC5taW4oc3JjV2lkdGggLSAxLCBjb2wgKiBmYWN0b3IpO1xuICAgICAgY29uc3Qgc2kgPSAoc3kgKiBzcmNXaWR0aCArIHN4KSAqIDQ7XG4gICAgICBjb25zdCBkaSA9IChyb3cgKiB3aWR0aCArIGNvbCkgKiA0O1xuICAgICAgb3V0W2RpXSAgICAgPSBzcmNbc2ldICAgICBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKipcbiAqIENyb3AgYSByZWN0YW5ndWxhciByZWdpb24gb3V0IG9mIGEge0BsaW5rIFByb2Nlc3NpbmdJbWFnZX0gKGJyb3dzZXItc2lkZSwgdGhlXG4gKiBjb3VudGVycGFydCBvZiB0aGUgSklUIHNlcnZlcidzIFNsaWRlIENyb3ApLCBvcHRpb25hbGx5IGRvd25zYW1wbGluZyB0aGUgY3JvcFxuICogYnkgYDJebGV2ZWxgLiBUaGUgcmVjdGFuZ2xlIGlzIGluIHNvdXJjZSBwaXhlbHMgYW5kIGNsYW1wZWQgdG8gdGhlIGltYWdlLCBzb1xuICogb3V0LW9mLXJhbmdlIHZhbHVlcyBzbmFwIHRvIHRoZSB2YWxpZCByZWdpb24gcmF0aGVyIHRoYW4gdGhyb3dpbmcuIEFsd2F5c1xuICogcmV0dXJucyBhIDQtY2hhbm5lbCAoUkdCQSkgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9wSW1hZ2UoaW1hZ2U6IFByb2Nlc3NpbmdJbWFnZSwgb3B0czogQ3JvcEltYWdlT3B0aW9ucyA9IHt9KTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgLy8gV29yayBvbiBSR0JBIHNvIHRoZSBjcm9wIGlzIGNoYW5uZWwtY291bnQgYWdub3N0aWMuXG4gIGNvbnN0IHNyYyA9IGltYWdlLmNoYW5uZWxzID09PSA0ID8gaW1hZ2UuZGF0YSA6IGltYWdlLnRvSW1hZ2VEYXRhKCkuZGF0YTtcbiAgY29uc3QgY3JvcHBlZCA9IGNyb3BSZ2JhKFxuICAgIHNyYywgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCxcbiAgICBOdW1iZXIob3B0cy54ID8/IDApLCBOdW1iZXIob3B0cy55ID8/IDApLFxuICAgIE51bWJlcihvcHRzLndpZHRoID8/IGltYWdlLndpZHRoKSwgTnVtYmVyKG9wdHMuaGVpZ2h0ID8/IGltYWdlLmhlaWdodCksXG4gICk7XG4gIGNvbnN0IGxldmVsID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihOdW1iZXIob3B0cy5sZXZlbCA/PyAwKSkpO1xuICBjb25zdCBmYWN0b3IgPSBsZXZlbCA+IDAgPyAyICoqIGxldmVsIDogMTtcbiAgY29uc3QgZmluYWwgPSBkb3duc2FtcGxlUmdiYShjcm9wcGVkLmRhdGEsIGNyb3BwZWQud2lkdGgsIGNyb3BwZWQuaGVpZ2h0LCBmYWN0b3IpO1xuICByZXR1cm4gbmV3IFByb2Nlc3NpbmdJbWFnZShmaW5hbC53aWR0aCwgZmluYWwuaGVpZ2h0LCA0LCBmaW5hbC5kYXRhKTtcbn1cbiJdfQ==
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9pbWFnZS1jcm9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVlyRCxzRkFBc0Y7QUFDdEYsU0FBUyxRQUFRLENBQ2YsR0FBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsQ0FBUyxFQUNULENBQVMsRUFDVCxDQUFTLEVBQ1QsQ0FBUztJQUVULDBFQUEwRTtJQUMxRSxvQ0FBb0M7SUFDcEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQWlCLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQzNCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFXLENBQUM7WUFDNUIsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDdEMsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixTQUFTLGNBQWMsQ0FDckIsR0FBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsTUFBYztJQUVkLElBQUksTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBVyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQVcsQ0FBQztZQUNwQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFXLENBQUM7WUFDcEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQXNCLEVBQUUsT0FBeUIsRUFBRTtJQUMzRSxzREFBc0Q7SUFDdEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUN0QixHQUFHLEVBQ0gsS0FBSyxDQUFDLEtBQUssRUFDWCxLQUFLLENBQUMsTUFBTSxFQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUM7SUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vcHJvY2Vzc2luZy1pbWFnZSc7XG5cbi8qKiBDcm9wIG9wdGlvbnMgaW4gc291cmNlLWltYWdlIHBpeGVscy4gT3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgY2xhbXBlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcEltYWdlT3B0aW9ucyB7XG4gIHg/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIC8qKiBQb3dlci1vZi10d28gZG93bnNhbXBsZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBjcm9wICgwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbiAgbGV2ZWw/OiBudW1iZXI7XG59XG5cbi8qKiBDb3B5IGEgY2xhbXBlZCByZWN0YW5nbGUgb2YgYW4gUkdCQSBzb3VyY2UgaW50byBhIGZyZXNoLCB0aWdodGx5LXBhY2tlZCBidWZmZXIuICovXG5mdW5jdGlvbiBjcm9wUmdiYShcbiAgc3JjOiBVaW50OENsYW1wZWRBcnJheSxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgc3JjSGVpZ2h0OiBudW1iZXIsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAvLyBDbGFtcCB0aGUgcmVjdGFuZ2xlIHRvIHRoZSBpbWFnZSBzbyBiYWQgcGFyYW1zIHNuYXAgdG8gdGhlIHZhbGlkIHJlZ2lvblxuICAvLyBpbnN0ZWFkIG9mIHJlYWRpbmcgb3V0IG9mIGJvdW5kcy5cbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzcmNXaWR0aCAtIDEsIE1hdGguZmxvb3IoeCkpKTtcbiAgY29uc3QgeTAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzcmNIZWlnaHQgLSAxLCBNYXRoLmZsb29yKHkpKSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oc3JjV2lkdGggLSB4MCwgTWF0aC5mbG9vcih3KSkpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzcmNIZWlnaHQgLSB5MCwgTWF0aC5mbG9vcihoKSkpO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHNyY1JvdyA9ICh5MCArIHJvdykgKiBzcmNXaWR0aCArIHgwO1xuICAgIGNvbnN0IGRzdFJvdyA9IHJvdyAqIHdpZHRoO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgY29uc3Qgc2kgPSAoc3JjUm93ICsgY29sKSAqIDQ7XG4gICAgICBjb25zdCBkaSA9IChkc3RSb3cgKyBjb2wpICogNDtcbiAgICAgIG91dFtkaV0gPSBzcmNbc2ldIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDFdID0gc3JjW3NpICsgMV0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgMl0gPSBzcmNbc2kgKyAyXSBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAzXSA9IHNyY1tzaSArIDNdIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZGF0YTogb3V0LCB3aWR0aCwgaGVpZ2h0IH07XG59XG5cbi8qKiBOZWFyZXN0LW5laWdoYm91ciBkb3duc2FtcGxlIGJ5IGFuIGludGVnZXIgZmFjdG9yICjiiaUxKS4gZmFjdG9yPTEgaXMgYSBuby1vcC4gKi9cbmZ1bmN0aW9uIGRvd25zYW1wbGVSZ2JhKFxuICBzcmM6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICBzcmNXaWR0aDogbnVtYmVyLFxuICBzcmNIZWlnaHQ6IG51bWJlcixcbiAgZmFjdG9yOiBudW1iZXIsXG4pOiB7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgaWYgKGZhY3RvciA8PSAxKSByZXR1cm4geyBkYXRhOiBzcmMsIHdpZHRoOiBzcmNXaWR0aCwgaGVpZ2h0OiBzcmNIZWlnaHQgfTtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHNyY1dpZHRoIC8gZmFjdG9yKSk7XG4gIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Ioc3JjSGVpZ2h0IC8gZmFjdG9yKSk7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgc3kgPSBNYXRoLm1pbihzcmNIZWlnaHQgLSAxLCByb3cgKiBmYWN0b3IpO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgY29uc3Qgc3ggPSBNYXRoLm1pbihzcmNXaWR0aCAtIDEsIGNvbCAqIGZhY3Rvcik7XG4gICAgICBjb25zdCBzaSA9IChzeSAqIHNyY1dpZHRoICsgc3gpICogNDtcbiAgICAgIGNvbnN0IGRpID0gKHJvdyAqIHdpZHRoICsgY29sKSAqIDQ7XG4gICAgICBvdXRbZGldID0gc3JjW3NpXSBhcyBudW1iZXI7XG4gICAgICBvdXRbZGkgKyAxXSA9IHNyY1tzaSArIDFdIGFzIG51bWJlcjtcbiAgICAgIG91dFtkaSArIDJdID0gc3JjW3NpICsgMl0gYXMgbnVtYmVyO1xuICAgICAgb3V0W2RpICsgM10gPSBzcmNbc2kgKyAzXSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGRhdGE6IG91dCwgd2lkdGgsIGhlaWdodCB9O1xufVxuXG4vKipcbiAqIENyb3AgYSByZWN0YW5ndWxhciByZWdpb24gb3V0IG9mIGEge0BsaW5rIFByb2Nlc3NpbmdJbWFnZX0gKGJyb3dzZXItc2lkZSwgdGhlXG4gKiBjb3VudGVycGFydCBvZiB0aGUgSklUIHNlcnZlcidzIFNsaWRlIENyb3ApLCBvcHRpb25hbGx5IGRvd25zYW1wbGluZyB0aGUgY3JvcFxuICogYnkgYDJebGV2ZWxgLiBUaGUgcmVjdGFuZ2xlIGlzIGluIHNvdXJjZSBwaXhlbHMgYW5kIGNsYW1wZWQgdG8gdGhlIGltYWdlLCBzb1xuICogb3V0LW9mLXJhbmdlIHZhbHVlcyBzbmFwIHRvIHRoZSB2YWxpZCByZWdpb24gcmF0aGVyIHRoYW4gdGhyb3dpbmcuIEFsd2F5c1xuICogcmV0dXJucyBhIDQtY2hhbm5lbCAoUkdCQSkgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9wSW1hZ2UoaW1hZ2U6IFByb2Nlc3NpbmdJbWFnZSwgb3B0czogQ3JvcEltYWdlT3B0aW9ucyA9IHt9KTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgLy8gV29yayBvbiBSR0JBIHNvIHRoZSBjcm9wIGlzIGNoYW5uZWwtY291bnQgYWdub3N0aWMuXG4gIGNvbnN0IHNyYyA9IGltYWdlLmNoYW5uZWxzID09PSA0ID8gaW1hZ2UuZGF0YSA6IGltYWdlLnRvSW1hZ2VEYXRhKCkuZGF0YTtcbiAgY29uc3QgY3JvcHBlZCA9IGNyb3BSZ2JhKFxuICAgIHNyYyxcbiAgICBpbWFnZS53aWR0aCxcbiAgICBpbWFnZS5oZWlnaHQsXG4gICAgTnVtYmVyKG9wdHMueCA/PyAwKSxcbiAgICBOdW1iZXIob3B0cy55ID8/IDApLFxuICAgIE51bWJlcihvcHRzLndpZHRoID8/IGltYWdlLndpZHRoKSxcbiAgICBOdW1iZXIob3B0cy5oZWlnaHQgPz8gaW1hZ2UuaGVpZ2h0KSxcbiAgKTtcbiAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKE51bWJlcihvcHRzLmxldmVsID8/IDApKSk7XG4gIGNvbnN0IGZhY3RvciA9IGxldmVsID4gMCA/IDIgKiogbGV2ZWwgOiAxO1xuICBjb25zdCBmaW5hbCA9IGRvd25zYW1wbGVSZ2JhKGNyb3BwZWQuZGF0YSwgY3JvcHBlZC53aWR0aCwgY3JvcHBlZC5oZWlnaHQsIGZhY3Rvcik7XG4gIHJldHVybiBuZXcgUHJvY2Vzc2luZ0ltYWdlKGZpbmFsLndpZHRoLCBmaW5hbC5oZWlnaHQsIDQsIGZpbmFsLmRhdGEpO1xufVxuIl19
|
|
@@ -13,38 +13,51 @@ export class ProcessingImage {
|
|
|
13
13
|
this.channels = channels;
|
|
14
14
|
this.data = data;
|
|
15
15
|
}
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Convert to browser-native ImageData (RGBA). Gray (1), gray+alpha (2) and
|
|
18
|
+
* RGB (3) are expanded; other channel counts throw.
|
|
19
|
+
*/
|
|
17
20
|
toImageData() {
|
|
18
21
|
if (this.channels === 4) {
|
|
19
22
|
return new ImageData(this.data, this.width, this.height);
|
|
20
23
|
}
|
|
21
|
-
|
|
24
|
+
const c = this.channels;
|
|
25
|
+
if (c < 1 || c > 3) {
|
|
26
|
+
throw new Error(`ProcessingImage: cannot convert ${c} channels to RGBA (expected 1–4).`);
|
|
27
|
+
}
|
|
22
28
|
const rgba = new Uint8ClampedArray(this.width * this.height * 4);
|
|
23
29
|
for (let i = 0; i < this.width * this.height; i++) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
rgba[
|
|
30
|
+
const src = i * c;
|
|
31
|
+
const dst = i * 4;
|
|
32
|
+
if (c === 3) {
|
|
33
|
+
rgba[dst] = this.data[src];
|
|
34
|
+
rgba[dst + 1] = this.data[src + 1];
|
|
35
|
+
rgba[dst + 2] = this.data[src + 2];
|
|
28
36
|
}
|
|
29
|
-
else
|
|
30
|
-
rgba[
|
|
31
|
-
rgba[i * 4 + 1] = this.data[i * 3 + 1];
|
|
32
|
-
rgba[i * 4 + 2] = this.data[i * 3 + 2];
|
|
37
|
+
else {
|
|
38
|
+
rgba[dst] = rgba[dst + 1] = rgba[dst + 2] = this.data[src];
|
|
33
39
|
}
|
|
34
|
-
rgba[
|
|
40
|
+
rgba[dst + 3] = c === 2 ? this.data[src + 1] : 255;
|
|
35
41
|
}
|
|
36
42
|
return new ImageData(rgba, this.width, this.height);
|
|
37
43
|
}
|
|
38
|
-
/** Convert to Blob for saving/downloading. */
|
|
44
|
+
/** Convert to Blob for saving/downloading. Rejects when the browser can't encode it. */
|
|
39
45
|
async toBlob(mime = 'image/png') {
|
|
40
46
|
const canvas = document.createElement('canvas');
|
|
41
47
|
canvas.width = this.width;
|
|
42
48
|
canvas.height = this.height;
|
|
43
49
|
const ctx = canvas.getContext('2d');
|
|
50
|
+
if (!ctx)
|
|
51
|
+
throw new Error('ProcessingImage: no 2D canvas context available.');
|
|
44
52
|
ctx.putImageData(this.toImageData(), 0, 0);
|
|
45
|
-
return new Promise((resolve) => {
|
|
46
|
-
canvas.toBlob((blob) =>
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
canvas.toBlob((blob) => {
|
|
55
|
+
if (blob)
|
|
56
|
+
resolve(blob);
|
|
57
|
+
else
|
|
58
|
+
reject(new Error(`ProcessingImage: the browser could not encode the image as ${mime}.`));
|
|
59
|
+
}, mime);
|
|
47
60
|
});
|
|
48
61
|
}
|
|
49
62
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc2luZy1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvY2Vzc2luZy9wcm9jZXNzaW5nLWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBTTFCLHFDQUFxQztJQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQW9CO1FBQ3ZDLE9BQU8sSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxZQUFZLEtBQWEsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxJQUF1QjtRQUNsRixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBZSxXQUFXO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQzlFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJO29CQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7b0JBQ25CLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw4REFBOEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmlmaWVkIGltYWdlIGNvbnRhaW5lciB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUuXG4gKiBEZWNvdXBsZXMgcGlwZWxpbmUgbG9naWMgZnJvbSBhbnkgc3BlY2lmaWMgbGlicmFyeSdzIGltYWdlIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NpbmdJbWFnZSB7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuICByZWFkb25seSBjaGFubmVsczogbnVtYmVyO1xuICByZWFkb25seSBkYXRhOiBVaW50OENsYW1wZWRBcnJheTtcblxuICAvKiogQ3JlYXRlIGZyb20gYnJvd3NlciBJbWFnZURhdGEuICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvY2Vzc2luZ0ltYWdlIHtcbiAgICByZXR1cm4gbmV3IFByb2Nlc3NpbmdJbWFnZShpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQsIDQsIG5ldyBVaW50OENsYW1wZWRBcnJheShpbWFnZURhdGEuZGF0YSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNoYW5uZWxzOiBudW1iZXIsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuY2hhbm5lbHMgPSBjaGFubmVscztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gYnJvd3Nlci1uYXRpdmUgSW1hZ2VEYXRhIChSR0JBKS4gR3JheSAoMSksIGdyYXkrYWxwaGEgKDIpIGFuZFxuICAgKiBSR0IgKDMpIGFyZSBleHBhbmRlZDsgb3RoZXIgY2hhbm5lbCBjb3VudHMgdGhyb3cuXG4gICAqL1xuICB0b0ltYWdlRGF0YSgpOiBJbWFnZURhdGEge1xuICAgIGlmICh0aGlzLmNoYW5uZWxzID09PSA0KSB7XG4gICAgICByZXR1cm4gbmV3IEltYWdlRGF0YSh0aGlzLmRhdGEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHRoaXMuY2hhbm5lbHM7XG4gICAgaWYgKGMgPCAxIHx8IGMgPiAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3NpbmdJbWFnZTogY2Fubm90IGNvbnZlcnQgJHtjfSBjaGFubmVscyB0byBSR0JBIChleHBlY3RlZCAx4oCTNCkuYCk7XG4gICAgfVxuICAgIGNvbnN0IHJnYmEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkrKykge1xuICAgICAgY29uc3Qgc3JjID0gaSAqIGM7XG4gICAgICBjb25zdCBkc3QgPSBpICogNDtcbiAgICAgIGlmIChjID09PSAzKSB7XG4gICAgICAgIHJnYmFbZHN0XSA9IHRoaXMuZGF0YVtzcmNdO1xuICAgICAgICByZ2JhW2RzdCArIDFdID0gdGhpcy5kYXRhW3NyYyArIDFdO1xuICAgICAgICByZ2JhW2RzdCArIDJdID0gdGhpcy5kYXRhW3NyYyArIDJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmdiYVtkc3RdID0gcmdiYVtkc3QgKyAxXSA9IHJnYmFbZHN0ICsgMl0gPSB0aGlzLmRhdGFbc3JjXTtcbiAgICAgIH1cbiAgICAgIHJnYmFbZHN0ICsgM10gPSBjID09PSAyID8gdGhpcy5kYXRhW3NyYyArIDFdIDogMjU1O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltYWdlRGF0YShyZ2JhLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gIH1cblxuICAvKiogQ29udmVydCB0byBCbG9iIGZvciBzYXZpbmcvZG93bmxvYWRpbmcuIFJlamVjdHMgd2hlbiB0aGUgYnJvd3NlciBjYW4ndCBlbmNvZGUgaXQuICovXG4gIGFzeW5jIHRvQmxvYihtaW1lOiBzdHJpbmcgPSAnaW1hZ2UvcG5nJyk6IFByb21pc2U8QmxvYj4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3NpbmdJbWFnZTogbm8gMkQgY2FudmFzIGNvbnRleHQgYXZhaWxhYmxlLicpO1xuICAgIGN0eC5wdXRJbWFnZURhdGEodGhpcy50b0ltYWdlRGF0YSgpLCAwLCAwKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICBpZiAoYmxvYikgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgZWxzZSByZWplY3QobmV3IEVycm9yKGBQcm9jZXNzaW5nSW1hZ2U6IHRoZSBicm93c2VyIGNvdWxkIG5vdCBlbmNvZGUgdGhlIGltYWdlIGFzICR7bWltZX0uYCkpO1xuICAgICAgfSwgbWltZSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -4,12 +4,25 @@ import { OpenSeadragonVisualizerService } from './implementations/osd/openseadra
|
|
|
4
4
|
import { NapariVisualizerService } from './implementations/napari-js/napari-visualizer.service';
|
|
5
5
|
import { VisualizerStore } from './store/visualizer-store.service';
|
|
6
6
|
import { RegionStore } from './store/region-store.service';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { SamToolService } from './toolbar/segmentation/sam-tool.service';
|
|
8
|
+
import { SamPointToolService } from './toolbar/segmentation/sam-point-tool.service';
|
|
9
|
+
import { CellSegmentToolService } from './toolbar/segmentation/cell-segment-tool.service';
|
|
10
|
+
import { SpatialSelectionStore } from './store/spatial-selection.service';
|
|
11
|
+
import { IntensityProfileService } from './intensity/intensity-profile.service';
|
|
10
12
|
import { VISUALIZER } from './contracts/visualizer.contract';
|
|
11
13
|
import { REGION_EDITOR_API } from './contracts/region-editor-api.contract';
|
|
12
14
|
import { CHANNEL_HISTOGRAM_API } from './contracts/channel-histogram-api.contract';
|
|
15
|
+
/**
|
|
16
|
+
* The three host-facing contracts, all served by the router. Shared by
|
|
17
|
+
* {@link provideVisualization} (component scope) and `VisualizationModule` (root),
|
|
18
|
+
* so both bind them the same way; at each scope they resolve to that scope's router.
|
|
19
|
+
* Package-internal (not exported from the public API).
|
|
20
|
+
*/
|
|
21
|
+
export const VISUALIZER_TOKEN_BINDINGS = [
|
|
22
|
+
{ provide: VISUALIZER, useExisting: RoutingVisualizerService },
|
|
23
|
+
{ provide: REGION_EDITOR_API, useExisting: RoutingVisualizerService },
|
|
24
|
+
{ provide: CHANNEL_HISTOGRAM_API, useExisting: RoutingVisualizerService },
|
|
25
|
+
];
|
|
13
26
|
/**
|
|
14
27
|
* A self-contained, isolated visualization backend chain for a component subtree.
|
|
15
28
|
*
|
|
@@ -37,10 +50,20 @@ import { CHANNEL_HISTOGRAM_API } from './contracts/channel-histogram-api.contrac
|
|
|
37
50
|
* embedded viewer gets its own router/Plotly/OSD/stores/tools while the rest of the
|
|
38
51
|
* app keeps the default root instance.
|
|
39
52
|
*
|
|
53
|
+
* In an application's own providers (`bootstrapApplication(App, { providers: [
|
|
54
|
+
* provideVisualization(), …] })`) it binds the one app-wide chain instead — the
|
|
55
|
+
* standalone counterpart of importing the deprecated `VisualizationModule`.
|
|
56
|
+
*
|
|
40
57
|
* Lists EVERY stateful service in the chain. Stateless collaborators (HttpClient,
|
|
41
58
|
* MessageService, WandService) deliberately resolve to root — they hold no
|
|
42
|
-
* per-viewer state, so sharing them is correct and keeps this list minimal.
|
|
43
|
-
*
|
|
59
|
+
* per-viewer state, so sharing them is correct and keeps this list minimal. The
|
|
60
|
+
* SAM model session (`SamSessionService`) is also root on purpose: every viewer's
|
|
61
|
+
* SAM tools share one model download and Worker/GPU session (see its doc; a host
|
|
62
|
+
* can provide it at a viewer component to get a per-viewer session that is
|
|
63
|
+
* disposed with the viewer). When a
|
|
64
|
+
* new stateful service joins the rendering chain, add it here too —
|
|
65
|
+
* `provide-visualization.spec.ts` fails until it is listed (or allow-listed there as
|
|
66
|
+
* deliberately shared).
|
|
44
67
|
*/
|
|
45
68
|
export function provideVisualization() {
|
|
46
69
|
return [
|
|
@@ -50,14 +73,17 @@ export function provideVisualization() {
|
|
|
50
73
|
NapariVisualizerService,
|
|
51
74
|
VisualizerStore,
|
|
52
75
|
RegionStore,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
76
|
+
SpatialSelectionStore,
|
|
77
|
+
IntensityProfileService,
|
|
78
|
+
// The canvas tools (wand, brush, eraser, zoom-to-box, SAM point) are not here:
|
|
79
|
+
// each backend above builds its own instances in its CanvasToolManager. The
|
|
80
|
+
// SAM point tools report through the chain's SamPointToolService.
|
|
81
|
+
SamToolService,
|
|
82
|
+
SamPointToolService,
|
|
83
|
+
CellSegmentToolService,
|
|
84
|
+
// The host-facing contracts, bound here at the SAME (component) scope so they
|
|
85
|
+
// resolve to the isolated router instance, not root.
|
|
86
|
+
...VISUALIZER_TOKEN_BINDINGS,
|
|
61
87
|
];
|
|
62
88
|
}
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS12aXN1YWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wcm92aWRlLXZpc3VhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFlO0lBQ25ELEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUU7SUFDOUQsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFO0lBQ3JFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRTtDQUMxRSxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPO1FBQ0wsd0JBQXdCO1FBQ3hCLGFBQWE7UUFDYiw4QkFBOEI7UUFDOUIsdUJBQXVCO1FBQ3ZCLGVBQWU7UUFDZixXQUFXO1FBQ1gscUJBQXFCO1FBQ3JCLHVCQUF1QjtRQUN2QiwrRUFBK0U7UUFDL0UsNEVBQTRFO1FBQzVFLGtFQUFrRTtRQUNsRSxjQUFjO1FBQ2QsbUJBQW1CO1FBQ25CLHNCQUFzQjtRQUN0Qiw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3JELEdBQUcseUJBQXlCO0tBQzdCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yb3V0aW5nLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQbG90bHlTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvcGxvdGx5L3Bsb3RseS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL29zZC9vcGVuc2VhZHJhZ29uLXZpc3VhbGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlbnNpdHkvaW50ZW5zaXR5LXByb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBWSVNVQUxJWkVSIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IENIQU5ORUxfSElTVE9HUkFNX0FQSSB9IGZyb20gJy4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5cbi8qKlxuICogVGhlIHRocmVlIGhvc3QtZmFjaW5nIGNvbnRyYWN0cywgYWxsIHNlcnZlZCBieSB0aGUgcm91dGVyLiBTaGFyZWQgYnlcbiAqIHtAbGluayBwcm92aWRlVmlzdWFsaXphdGlvbn0gKGNvbXBvbmVudCBzY29wZSkgYW5kIGBWaXN1YWxpemF0aW9uTW9kdWxlYCAocm9vdCksXG4gKiBzbyBib3RoIGJpbmQgdGhlbSB0aGUgc2FtZSB3YXk7IGF0IGVhY2ggc2NvcGUgdGhleSByZXNvbHZlIHRvIHRoYXQgc2NvcGUncyByb3V0ZXIuXG4gKiBQYWNrYWdlLWludGVybmFsIChub3QgZXhwb3J0ZWQgZnJvbSB0aGUgcHVibGljIEFQSSkuXG4gKi9cbmV4cG9ydCBjb25zdCBWSVNVQUxJWkVSX1RPS0VOX0JJTkRJTkdTOiBQcm92aWRlcltdID0gW1xuICB7IHByb3ZpZGU6IFZJU1VBTElaRVIsIHVzZUV4aXN0aW5nOiBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UgfSxcbiAgeyBwcm92aWRlOiBSRUdJT05fRURJVE9SX0FQSSwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuICB7IHByb3ZpZGU6IENIQU5ORUxfSElTVE9HUkFNX0FQSSwgdXNlRXhpc3Rpbmc6IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9LFxuXTtcblxuLyoqXG4gKiBBIHNlbGYtY29udGFpbmVkLCBpc29sYXRlZCB2aXN1YWxpemF0aW9uIGJhY2tlbmQgY2hhaW4gZm9yIGEgY29tcG9uZW50IHN1YnRyZWUuXG4gKlxuICogVGhlIGNoYWluIHNlcnZpY2VzIGFyZSBgcHJvdmlkZWRJbjogJ3Jvb3QnYCBzaW5nbGV0b25zLCBzbyBieSBkZWZhdWx0IHRoZSB3aG9sZVxuICogYXBwIHNoYXJlcyBvbmUgdmlld2VyJ3Mgc3RhdGUgKHJlZ2lvbnMsIGltYWdlLCBjaGFubmVscywgcmVuZGVyIGhhbmRsZXMpIOKAlCB3aGljaFxuICogaXMgY29ycmVjdCBmb3IgdGhlIHNpbmdsZSBtYWluIHZpZXdlci4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgU0VDT05ELCBpbmRlcGVuZGVudFxuICogdmlld2VyIChlLmcuIGEgbW9kYWwgdGhhdCBtb3VudHMgYDx2aXN1YWxpemVyPmAgb3ZlciB0aGUgbGl2ZSBtYWluIHZpZXdcbiAqIGFuZCBtdXN0IG5vdCBjbG9iYmVyIGl0cyByZWdpb25zL2ltYWdlKSBkcm9wcyB0aGlzIGludG8gaXRzIGNvbXBvbmVudCBgcHJvdmlkZXJzYDpcbiAqXG4gKiBgYGB0c1xuICogQENvbXBvbmVudCh7XG4gKiAgIC4uLixcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgLi4ucHJvdmlkZVZpc3VhbGl6YXRpb24oKSwgICAgICAgICAgICAgICAgIC8vIGlzb2xhdGVkIGNoYWluIGluc3RhbmNlXG4gKiAgICAgLy8gcGx1cyB0aGUgaG9zdCBwb3J0cyArIGNvbmZpZyBmb3IgVEhJUyB2aWV3ZXI6XG4gKiAgICAgeyBwcm92aWRlOiBJTUFHRV9TVEFURV9QT1JULCB1c2VDbGFzczogTXlJbWFnZVN0YXRlQWRhcHRlciB9LFxuICogICAgIHsgcHJvdmlkZTogVElMRV9BQ0NFU1NfUE9SVCwgdXNlQ2xhc3M6IE15VGlsZUFjY2Vzc0FkYXB0ZXIgfSxcbiAqICAgICB7IHByb3ZpZGU6IFJFR0lPTl9JT19QT1JULCAgIHVzZUNsYXNzOiBNeVJlZ2lvbklvQWRhcHRlciB9LFxuICogICAgIHsgcHJvdmlkZTogVklaX0NPTkZJRywgICAgICAgdXNlVmFsdWU6IHsgc2xpZGVDcm9wU2VydmVyOiAnJyB9IH0sXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQ29tcG9uZW50LXNjb3BlZCBwcm92aWRlcnMgc2hhZG93IHRoZSByb290IHNpbmdsZXRvbnMgZm9yIHRoYXQgc3VidHJlZSwgc28gdGhlXG4gKiBlbWJlZGRlZCB2aWV3ZXIgZ2V0cyBpdHMgb3duIHJvdXRlci9QbG90bHkvT1NEL3N0b3Jlcy90b29scyB3aGlsZSB0aGUgcmVzdCBvZiB0aGVcbiAqIGFwcCBrZWVwcyB0aGUgZGVmYXVsdCByb290IGluc3RhbmNlLlxuICpcbiAqIEluIGFuIGFwcGxpY2F0aW9uJ3Mgb3duIHByb3ZpZGVycyAoYGJvb3RzdHJhcEFwcGxpY2F0aW9uKEFwcCwgeyBwcm92aWRlcnM6IFtcbiAqIHByb3ZpZGVWaXN1YWxpemF0aW9uKCksIOKApl0gfSlgKSBpdCBiaW5kcyB0aGUgb25lIGFwcC13aWRlIGNoYWluIGluc3RlYWQg4oCUIHRoZVxuICogc3RhbmRhbG9uZSBjb3VudGVycGFydCBvZiBpbXBvcnRpbmcgdGhlIGRlcHJlY2F0ZWQgYFZpc3VhbGl6YXRpb25Nb2R1bGVgLlxuICpcbiAqIExpc3RzIEVWRVJZIHN0YXRlZnVsIHNlcnZpY2UgaW4gdGhlIGNoYWluLiBTdGF0ZWxlc3MgY29sbGFib3JhdG9ycyAoSHR0cENsaWVudCxcbiAqIE1lc3NhZ2VTZXJ2aWNlLCBXYW5kU2VydmljZSkgZGVsaWJlcmF0ZWx5IHJlc29sdmUgdG8gcm9vdCDigJQgdGhleSBob2xkIG5vXG4gKiBwZXItdmlld2VyIHN0YXRlLCBzbyBzaGFyaW5nIHRoZW0gaXMgY29ycmVjdCBhbmQga2VlcHMgdGhpcyBsaXN0IG1pbmltYWwuIFRoZVxuICogU0FNIG1vZGVsIHNlc3Npb24gKGBTYW1TZXNzaW9uU2VydmljZWApIGlzIGFsc28gcm9vdCBvbiBwdXJwb3NlOiBldmVyeSB2aWV3ZXInc1xuICogU0FNIHRvb2xzIHNoYXJlIG9uZSBtb2RlbCBkb3dubG9hZCBhbmQgV29ya2VyL0dQVSBzZXNzaW9uIChzZWUgaXRzIGRvYzsgYSBob3N0XG4gKiBjYW4gcHJvdmlkZSBpdCBhdCBhIHZpZXdlciBjb21wb25lbnQgdG8gZ2V0IGEgcGVyLXZpZXdlciBzZXNzaW9uIHRoYXQgaXNcbiAqIGRpc3Bvc2VkIHdpdGggdGhlIHZpZXdlcikuIFdoZW4gYVxuICogbmV3IHN0YXRlZnVsIHNlcnZpY2Ugam9pbnMgdGhlIHJlbmRlcmluZyBjaGFpbiwgYWRkIGl0IGhlcmUgdG9vIOKAlFxuICogYHByb3ZpZGUtdmlzdWFsaXphdGlvbi5zcGVjLnRzYCBmYWlscyB1bnRpbCBpdCBpcyBsaXN0ZWQgKG9yIGFsbG93LWxpc3RlZCB0aGVyZSBhc1xuICogZGVsaWJlcmF0ZWx5IHNoYXJlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmlzdWFsaXphdGlvbigpOiBQcm92aWRlcltdIHtcbiAgcmV0dXJuIFtcbiAgICBSb3V0aW5nVmlzdWFsaXplclNlcnZpY2UsXG4gICAgUGxvdGx5U2VydmljZSxcbiAgICBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UsXG4gICAgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgVmlzdWFsaXplclN0b3JlLFxuICAgIFJlZ2lvblN0b3JlLFxuICAgIFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICAvLyBUaGUgY2FudmFzIHRvb2xzICh3YW5kLCBicnVzaCwgZXJhc2VyLCB6b29tLXRvLWJveCwgU0FNIHBvaW50KSBhcmUgbm90IGhlcmU6XG4gICAgLy8gZWFjaCBiYWNrZW5kIGFib3ZlIGJ1aWxkcyBpdHMgb3duIGluc3RhbmNlcyBpbiBpdHMgQ2FudmFzVG9vbE1hbmFnZXIuIFRoZVxuICAgIC8vIFNBTSBwb2ludCB0b29scyByZXBvcnQgdGhyb3VnaCB0aGUgY2hhaW4ncyBTYW1Qb2ludFRvb2xTZXJ2aWNlLlxuICAgIFNhbVRvb2xTZXJ2aWNlLFxuICAgIFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICAvLyBUaGUgaG9zdC1mYWNpbmcgY29udHJhY3RzLCBib3VuZCBoZXJlIGF0IHRoZSBTQU1FIChjb21wb25lbnQpIHNjb3BlIHNvIHRoZXlcbiAgICAvLyByZXNvbHZlIHRvIHRoZSBpc29sYXRlZCByb3V0ZXIgaW5zdGFuY2UsIG5vdCByb290LlxuICAgIC4uLlZJU1VBTElaRVJfVE9LRU5fQklORElOR1MsXG4gIF07XG59XG4iXX0=
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { InputTextModule } from 'primeng/inputtext';
|
|
5
|
+
import { TooltipModule } from 'primeng/tooltip';
|
|
6
|
+
import { HexColorPickerComponent } from '../../hex-color-picker/hex-color-picker.component';
|
|
7
|
+
import { ancestors, buildClassTree, subtree, visibleRows } from './class-tree';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
import * as i2 from "@angular/forms";
|
|
11
|
+
import * as i3 from "primeng/inputtext";
|
|
12
|
+
import * as i4 from "primeng/tooltip";
|
|
13
|
+
/**
|
|
14
|
+
* The Region Editor's classes as a hierarchy (a brain atlas's ontology), as the Allen atlas viewer
|
|
15
|
+
* shows it: collapsible, each class with its colour, name and long name, and the regions it and
|
|
16
|
+
* its subclasses have on this slice; a class with none is greyed. Picking a class selects all its
|
|
17
|
+
* regions and its subclasses' (the editor does the selecting). Search by name or long name. A
|
|
18
|
+
* class's swatch recolours it, as the class list's does; its eye hides it and its subclasses.
|
|
19
|
+
*/
|
|
20
|
+
export class ClassTreeComponent {
|
|
21
|
+
constructor(el) {
|
|
22
|
+
this.el = el;
|
|
23
|
+
/** The hierarchy. */
|
|
24
|
+
this.nodes = [];
|
|
25
|
+
/** Regions per class on this slice (the regions and the region source's). */
|
|
26
|
+
this.counts = new Map();
|
|
27
|
+
/** A class's colour (a new function when the colours change, so the rows repaint). */
|
|
28
|
+
this.colorOf = () => '#999999';
|
|
29
|
+
/** The class picked last (highlighted, its path expanded, scrolled into view). */
|
|
30
|
+
this.picked = null;
|
|
31
|
+
/** Classes with a selected region (marked). */
|
|
32
|
+
this.marked = new Set();
|
|
33
|
+
/** Whether a volume view is on screen: each class can then be shown in 3D. */
|
|
34
|
+
this.volume = false;
|
|
35
|
+
/** The classes shown in 3D. */
|
|
36
|
+
this.shown3d = new Set();
|
|
37
|
+
/** The classes hidden from view. */
|
|
38
|
+
this.hidden = new Set();
|
|
39
|
+
this.pick = new EventEmitter();
|
|
40
|
+
/** A class's swatch picked a new colour. */
|
|
41
|
+
this.recolor = new EventEmitter();
|
|
42
|
+
/** A class's 3D toggle: it with every class under it. */
|
|
43
|
+
this.toggle3d = new EventEmitter();
|
|
44
|
+
/** A class's eye: hide (or show) it with every class under it. */
|
|
45
|
+
this.toggleHidden = new EventEmitter();
|
|
46
|
+
this.tree = buildClassTree([], new Map());
|
|
47
|
+
this.rows = [];
|
|
48
|
+
/** Each row's visibility (a row absent: shown). */
|
|
49
|
+
this.visibility = new Map();
|
|
50
|
+
this.query = '';
|
|
51
|
+
this.expanded = new Set();
|
|
52
|
+
this.trackRow = (_, r) => r.name;
|
|
53
|
+
}
|
|
54
|
+
ngOnChanges(changes) {
|
|
55
|
+
const fresh = !!changes['nodes'];
|
|
56
|
+
if (fresh || changes['counts'])
|
|
57
|
+
this.tree = buildClassTree(this.nodes, this.counts);
|
|
58
|
+
// A new hierarchy opens with its roots expanded, as the atlas viewer does.
|
|
59
|
+
if (fresh)
|
|
60
|
+
this.expanded = new Set(this.tree.roots);
|
|
61
|
+
if (changes['picked'] && this.picked)
|
|
62
|
+
for (const a of ancestors(this.tree, this.picked))
|
|
63
|
+
this.expanded.add(a);
|
|
64
|
+
this.refresh();
|
|
65
|
+
// A pick from elsewhere (a surface clicked in 3D) may be off screen: bring its row into view.
|
|
66
|
+
if (changes['picked'] && this.picked)
|
|
67
|
+
setTimeout(() => scrollToPicked(this.el.nativeElement, '.tree-row.picked'));
|
|
68
|
+
}
|
|
69
|
+
node(name) {
|
|
70
|
+
return this.tree.node.get(name);
|
|
71
|
+
}
|
|
72
|
+
total(name) {
|
|
73
|
+
return this.tree.total.get(name) ?? 0;
|
|
74
|
+
}
|
|
75
|
+
toggle(row, event) {
|
|
76
|
+
event.stopPropagation();
|
|
77
|
+
if (this.expanded.has(row.name))
|
|
78
|
+
this.expanded.delete(row.name);
|
|
79
|
+
else
|
|
80
|
+
this.expanded.add(row.name);
|
|
81
|
+
this.refresh();
|
|
82
|
+
}
|
|
83
|
+
choose(name, event) {
|
|
84
|
+
const e = event;
|
|
85
|
+
this.pick.emit({ name, classes: subtree(this.tree, name), additive: e.shiftKey || e.metaKey || e.ctrlKey });
|
|
86
|
+
}
|
|
87
|
+
/** The eye: a class hidden (wholly) is shown again with its subclasses; otherwise they are hidden. */
|
|
88
|
+
flipHidden(name, event) {
|
|
89
|
+
event.stopPropagation();
|
|
90
|
+
const hidden = this.visibility.get(name) !== 'hidden';
|
|
91
|
+
this.toggleHidden.emit({ classes: subtree(this.tree, name), hidden });
|
|
92
|
+
}
|
|
93
|
+
flip3d(name, event) {
|
|
94
|
+
event.stopPropagation();
|
|
95
|
+
this.toggle3d.emit({ name, classes: subtree(this.tree, name) });
|
|
96
|
+
}
|
|
97
|
+
onQuery(value) {
|
|
98
|
+
this.query = value;
|
|
99
|
+
this.refresh();
|
|
100
|
+
}
|
|
101
|
+
/** Enter in the search box picks the first match. */
|
|
102
|
+
pickFirstMatch(event) {
|
|
103
|
+
const q = this.query.trim().toLowerCase();
|
|
104
|
+
const hit = this.rows.find((r) => r.name.toLowerCase().includes(q) || (this.node(r.name)?.title ?? '').toLowerCase().includes(q));
|
|
105
|
+
if (hit)
|
|
106
|
+
this.choose(hit.name, event);
|
|
107
|
+
}
|
|
108
|
+
refresh() {
|
|
109
|
+
this.rows = visibleRows(this.tree, this.expanded, this.query);
|
|
110
|
+
this.visibility = new Map();
|
|
111
|
+
if (!this.hidden.size)
|
|
112
|
+
return;
|
|
113
|
+
for (const row of this.rows) {
|
|
114
|
+
const classes = subtree(this.tree, row.name);
|
|
115
|
+
const off = classes.filter((c) => this.hidden.has(c)).length;
|
|
116
|
+
if (off)
|
|
117
|
+
this.visibility.set(row.name, off === classes.length ? 'hidden' : 'partial');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassTreeComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
121
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassTreeComponent, isStandalone: true, selector: "region-class-tree", inputs: { nodes: "nodes", counts: "counts", colorOf: "colorOf", picked: "picked", marked: "marked", volume: "volume", shown3d: "shown3d", hidden: "hidden" }, outputs: { pick: "pick", recolor: "recolor", toggle3d: "toggle3d", toggleHidden: "toggleHidden" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
122
|
+
}
|
|
123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassTreeComponent, decorators: [{
|
|
124
|
+
type: Component,
|
|
125
|
+
args: [{ selector: 'region-class-tree', standalone: true, imports: [CommonModule, FormsModule, InputTextModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"] }]
|
|
126
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { nodes: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], counts: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], colorOf: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], picked: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], marked: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], volume: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], shown3d: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], hidden: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], pick: [{
|
|
143
|
+
type: Output
|
|
144
|
+
}], recolor: [{
|
|
145
|
+
type: Output
|
|
146
|
+
}], toggle3d: [{
|
|
147
|
+
type: Output
|
|
148
|
+
}], toggleHidden: [{
|
|
149
|
+
type: Output
|
|
150
|
+
}] } });
|
|
151
|
+
/** Scroll the row matching `selector` inside `host` into view, if it is out of it. */
|
|
152
|
+
export function scrollToPicked(host, selector) {
|
|
153
|
+
const row = host.querySelector(selector);
|
|
154
|
+
row?.scrollIntoView?.({ block: 'nearest' });
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzcy10cmVlL2NsYXNzLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQTJCLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7O0FBWXhHOzs7Ozs7R0FNRztBQVNILE1BQU0sT0FBTyxrQkFBa0I7SUFpQzdCLFlBQTZCLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBaEN4RCxxQkFBcUI7UUFDWixVQUFLLEdBQStCLEVBQUUsQ0FBQztRQUNoRCw2RUFBNkU7UUFDcEUsV0FBTSxHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pELHNGQUFzRjtRQUM3RSxZQUFPLEdBQTZCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUM3RCxrRkFBa0Y7UUFDekUsV0FBTSxHQUFrQixJQUFJLENB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QUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7OEdBeEdVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLG1XQzVDL0IscTFHQW1GQSw0N0RENUNZLFlBQVksNlZBQUUsV0FBVyw4bUJBQUUsZUFBZSx3SEFBRSxhQUFhLHNYQUFFLHVCQUF1Qjs7MkZBS2pGLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLG1CQUc1RSx1QkFBdUIsQ0FBQyxNQUFNOytFQUl0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTs7QUFtRlQsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUIsRUFBRSxRQUFnQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBdUIsQ0FBQztJQUMvRCxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5cbmltcG9ydCB0eXBlIHsgUmVnaW9uQ2xhc3NOb2RlIH0gZnJvbSAnLi4vLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZSwgQ2xhc3NUcmVlUm93LCBhbmNlc3RvcnMsIGJ1aWxkQ2xhc3NUcmVlLCBzdWJ0cmVlLCB2aXNpYmxlUm93cyB9IGZyb20gJy4vY2xhc3MtdHJlZSc7XG5cbi8qKiBBIHBpY2sgaW4gdGhlIHRyZWU6IHRoZSBjbGFzcywgYW5kIGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzVHJlZVBpY2sge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICBhZGRpdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIFdoZXRoZXIgYSBjbGFzcyBpcyBzaG93bjogaXQgYW5kIGl0cyBzdWJjbGFzc2VzIGFsbCwgbm9uZSAoJ2hpZGRlbicpLCBvciBvbmx5IHNvbWUgKCdwYXJ0aWFsJykuICovXG5leHBvcnQgdHlwZSBDbGFzc1Zpc2liaWxpdHkgPSAnc2hvd24nIHwgJ2hpZGRlbicgfCAncGFydGlhbCc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IncyBjbGFzc2VzIGFzIGEgaGllcmFyY2h5IChhIGJyYWluIGF0bGFzJ3Mgb250b2xvZ3kpLCBhcyB0aGUgQWxsZW4gYXRsYXMgdmlld2VyXG4gKiBzaG93cyBpdDogY29sbGFwc2libGUsIGVhY2ggY2xhc3Mgd2l0aCBpdHMgY29sb3VyLCBuYW1lIGFuZCBsb25nIG5hbWUsIGFuZCB0aGUgcmVnaW9ucyBpdCBhbmRcbiAqIGl0cyBzdWJjbGFzc2VzIGhhdmUgb24gdGhpcyBzbGljZTsgYSBjbGFzcyB3aXRoIG5vbmUgaXMgZ3JleWVkLiBQaWNraW5nIGEgY2xhc3Mgc2VsZWN0cyBhbGwgaXRzXG4gKiByZWdpb25zIGFuZCBpdHMgc3ViY2xhc3NlcycgKHRoZSBlZGl0b3IgZG9lcyB0aGUgc2VsZWN0aW5nKS4gU2VhcmNoIGJ5IG5hbWUgb3IgbG9uZyBuYW1lLiBBXG4gKiBjbGFzcydzIHN3YXRjaCByZWNvbG91cnMgaXQsIGFzIHRoZSBjbGFzcyBsaXN0J3MgZG9lczsgaXRzIGV5ZSBoaWRlcyBpdCBhbmQgaXRzIHN1YmNsYXNzZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1jbGFzcy10cmVlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgSGV4Q29sb3JQaWNrZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2xhc3MtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsYXNzLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENsYXNzVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgaGllcmFyY2h5LiAqL1xuICBASW5wdXQoKSBub2RlczogcmVhZG9ubHkgUmVnaW9uQ2xhc3NOb2RlW10gPSBbXTtcbiAgLyoqIFJlZ2lvbnMgcGVyIGNsYXNzIG9uIHRoaXMgc2xpY2UgKHRoZSByZWdpb25zIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzKS4gKi9cbiAgQElucHV0KCkgY291bnRzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyIChhIG5ldyBmdW5jdGlvbiB3aGVuIHRoZSBjb2xvdXJzIGNoYW5nZSwgc28gdGhlIHJvd3MgcmVwYWludCkuICovXG4gIEBJbnB1dCgpIGNvbG9yT2Y6IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICgpID0+ICcjOTk5OTk5JztcbiAgLyoqIFRoZSBjbGFzcyBwaWNrZWQgbGFzdCAoaGlnaGxpZ2h0ZWQsIGl0cyBwYXRoIGV4cGFuZGVkLCBzY3JvbGxlZCBpbnRvIHZpZXcpLiAqL1xuICBASW5wdXQoKSBwaWNrZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQ2xhc3NlcyB3aXRoIGEgc2VsZWN0ZWQgcmVnaW9uIChtYXJrZWQpLiAqL1xuICBASW5wdXQoKSBtYXJrZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuOiBlYWNoIGNsYXNzIGNhbiB0aGVuIGJlIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSB2b2x1bWUgPSBmYWxzZTtcbiAgLyoqIFRoZSBjbGFzc2VzIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSBzaG93bjNkOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogVGhlIGNsYXNzZXMgaGlkZGVuIGZyb20gdmlldy4gKi9cbiAgQElucHV0KCkgaGlkZGVuOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIEBPdXRwdXQoKSBwaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxDbGFzc1RyZWVQaWNrPigpO1xuICAvKiogQSBjbGFzcydzIHN3YXRjaCBwaWNrZWQgYSBuZXcgY29sb3VyLiAqL1xuICBAT3V0cHV0KCkgcmVjb2xvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEEgY2xhc3MncyAzRCB0b2dnbGU6IGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG4gIEBPdXRwdXQoKSB0b2dnbGUzZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBBIGNsYXNzJ3MgZXllOiBoaWRlIChvciBzaG93KSBpdCB3aXRoIGV2ZXJ5IGNsYXNzIHVuZGVyIGl0LiAqL1xuICBAT3V0cHV0KCkgdG9nZ2xlSGlkZGVuID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNsYXNzZXM6IHN0cmluZ1tdOyBoaWRkZW46IGJvb2xlYW4gfT4oKTtcblxuICBwcm90ZWN0ZWQgdHJlZTogQ2xhc3NUcmVlID0gYnVpbGRDbGFzc1RyZWUoW10sIG5ldyBNYXAoKSk7XG4gIHByb3RlY3RlZCByb3dzOiBDbGFzc1RyZWVSb3dbXSA9IFtdO1xuICAvKiogRWFjaCByb3cncyB2aXNpYmlsaXR5IChhIHJvdyBhYnNlbnQ6IHNob3duKS4gKi9cbiAgcHJvdGVjdGVkIHZpc2liaWxpdHkgPSBuZXcgTWFwPHN0cmluZywgQ2xhc3NWaXNpYmlsaXR5PigpO1xuICBwcm90ZWN0ZWQgcXVlcnkgPSAnJztcbiAgcHJpdmF0ZSBleHBhbmRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBmcmVzaCA9ICEhY2hhbmdlc1snbm9kZXMnXTtcbiAgICBpZiAoZnJlc2ggfHwgY2hhbmdlc1snY291bnRzJ10pIHRoaXMudHJlZSA9IGJ1aWxkQ2xhc3NUcmVlKHRoaXMubm9kZXMsIHRoaXMuY291bnRzKTtcbiAgICAvLyBBIG5ldyBoaWVyYXJjaHkgb3BlbnMgd2l0aCBpdHMgcm9vdHMgZXhwYW5kZWQsIGFzIHRoZSBhdGxhcyB2aWV3ZXIgZG9lcy5cbiAgICBpZiAoZnJlc2gpIHRoaXMuZXhwYW5kZWQgPSBuZXcgU2V0KHRoaXMudHJlZS5yb290cyk7XG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKSBmb3IgKGNvbnN0IGEgb2YgYW5jZXN0b3JzKHRoaXMudHJlZSwgdGhpcy5waWNrZWQpKSB0aGlzLmV4cGFuZGVkLmFkZChhKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAvLyBBIHBpY2sgZnJvbSBlbHNld2hlcmUgKGEgc3VyZmFjZSBjbGlja2VkIGluIDNEKSBtYXkgYmUgb2ZmIHNjcmVlbjogYnJpbmcgaXRzIHJvdyBpbnRvIHZpZXcuXG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzY3JvbGxUb1BpY2tlZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICcudHJlZS1yb3cucGlja2VkJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5vZGUobmFtZTogc3RyaW5nKTogUmVnaW9uQ2xhc3NOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmVlLm5vZGUuZ2V0KG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvdGFsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudHJlZS50b3RhbC5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUocm93OiBDbGFzc1RyZWVSb3csIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmV4cGFuZGVkLmhhcyhyb3cubmFtZSkpIHRoaXMuZXhwYW5kZWQuZGVsZXRlKHJvdy5uYW1lKTtcbiAgICBlbHNlIHRoaXMuZXhwYW5kZWQuYWRkKHJvdy5uYW1lKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaG9vc2UobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlID0gZXZlbnQgYXMgTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ7XG4gICAgdGhpcy5waWNrLmVtaXQoeyBuYW1lLCBjbGFzc2VzOiBzdWJ0cmVlKHRoaXMudHJlZSwgbmFtZSksIGFkZGl0aXZlOiBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfSk7XG4gIH1cblxuICAvKiogVGhlIGV5ZTogYSBjbGFzcyBoaWRkZW4gKHdob2xseSkgaXMgc2hvd24gYWdhaW4gd2l0aCBpdHMgc3ViY2xhc3Nlczsgb3RoZXJ3aXNlIHRoZXkgYXJlIGhpZGRlbi4gKi9cbiAgcHJvdGVjdGVkIGZsaXBIaWRkZW4obmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBoaWRkZW4gPSB0aGlzLnZpc2liaWxpdHkuZ2V0KG5hbWUpICE9PSAnaGlkZGVuJztcbiAgICB0aGlzLnRvZ2dsZUhpZGRlbi5lbWl0KHsgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpLCBoaWRkZW4gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmxpcDNkKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGUzZC5lbWl0KHsgbmFtZSwgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUXVlcnkodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucXVlcnkgPSB2YWx1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKiBFbnRlciBpbiB0aGUgc2VhcmNoIGJveCBwaWNrcyB0aGUgZmlyc3QgbWF0Y2guICovXG4gIHByb3RlY3RlZCBwaWNrRmlyc3RNYXRjaChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBxID0gdGhpcy5xdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJvd3MuZmluZChcbiAgICAgIChyKSA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCAodGhpcy5ub2RlKHIubmFtZSk/LnRpdGxlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpLFxuICAgICk7XG4gICAgaWYgKGhpdCkgdGhpcy5jaG9vc2UoaGl0Lm5hbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja1JvdyA9IChfOiBudW1iZXIsIHI6IENsYXNzVHJlZVJvdykgPT4gci5uYW1lO1xuXG4gIHByaXZhdGUgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3MgPSB2aXNpYmxlUm93cyh0aGlzLnRyZWUsIHRoaXMuZXhwYW5kZWQsIHRoaXMucXVlcnkpO1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IG5ldyBNYXAoKTtcbiAgICBpZiAoIXRoaXMuaGlkZGVuLnNpemUpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBzdWJ0cmVlKHRoaXMudHJlZSwgcm93Lm5hbWUpO1xuICAgICAgY29uc3Qgb2ZmID0gY2xhc3Nlcy5maWx0ZXIoKGMpID0+IHRoaXMuaGlkZGVuLmhhcyhjKSkubGVuZ3RoO1xuICAgICAgaWYgKG9mZikgdGhpcy52aXNpYmlsaXR5LnNldChyb3cubmFtZSwgb2ZmID09PSBjbGFzc2VzLmxlbmd0aCA/ICdoaWRkZW4nIDogJ3BhcnRpYWwnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFNjcm9sbCB0aGUgcm93IG1hdGNoaW5nIGBzZWxlY3RvcmAgaW5zaWRlIGBob3N0YCBpbnRvIHZpZXcsIGlmIGl0IGlzIG91dCBvZiBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUb1BpY2tlZChob3N0OiBIVE1MRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByb3cgPSBob3N0LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcm93Py5zY3JvbGxJbnRvVmlldz8uKHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJjbGFzcy10cmVlXCI+XG4gIDxkaXYgY2xhc3M9XCJ0cmVlLWhlYWRlclwiICpuZ0lmPVwicGlja2VkIGFzIHBcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRyZWUtcGlja2VkXCI+XG4gICAgICA8Yj57eyBwIH19PC9iXG4gICAgICA+PHNwYW4gKm5nSWY9XCJub2RlKHApPy50aXRsZSBhcyB0XCI+IMK3IHt7IHQgfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIHBJbnB1dFRleHRcbiAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtIHRyZWUtc2VhcmNoXCJcbiAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBuYW1lXCJcbiAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIHRoZSBjbGFzc2VzXCJcbiAgICBbbmdNb2RlbF09XCJxdWVyeVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVyeSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCJwaWNrRmlyc3RNYXRjaCgkZXZlbnQpXCJcbiAgLz5cbiAgPGRpdiBjbGFzcz1cInRyZWUtYm9keVwiIHJvbGU9XCJ0cmVlXCI+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja1Jvd1wiXG4gICAgICBjbGFzcz1cInRyZWUtcm93XCJcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyb3cuaGFzQ2hpbGRyZW4gPyByb3cuZXhwYW5kZWQgOiBudWxsXCJcbiAgICAgIFtjbGFzcy5hYnNlbnRdPVwidG90YWwocm93Lm5hbWUpID09PSAwXCJcbiAgICAgIFtjbGFzcy5waWNrZWRdPVwicm93Lm5hbWUgPT09IHBpY2tlZFwiXG4gICAgICBbY2xhc3MubWFya2VkXT1cIm1hcmtlZC5oYXMocm93Lm5hbWUpXCJcbiAgICAgIFtjbGFzcy5oaWRkZW4tY2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJ1wiXG4gICAgICBbc3R5bGUucGFkZGluZy1sZWZ0LnJlbV09XCIwLjM1ICsgcm93LmRlcHRoICogMC45XCJcbiAgICAgIFtwVG9vbHRpcF09XCJub2RlKHJvdy5uYW1lKT8udGl0bGUgfHwgcm93Lm5hbWVcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICBbc2hvd0RlbGF5XT1cIjYwMFwiXG4gICAgICAoY2xpY2spPVwiY2hvb3NlKHJvdy5uYW1lLCAkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImNob29zZShyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaSB0cmVlLXRvZ2dsZVwiXG4gICAgICAgIFtjbGFzcy5waS1taW51cy1jaXJjbGVdPVwicm93Lmhhc0NoaWxkcmVuICYmIHJvdy5leHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy5waS1wbHVzLWNpcmNsZV09XCJyb3cuaGFzQ2hpbGRyZW4gJiYgIXJvdy5leHBhbmRlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicm93LmV4cGFuZGVkID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnXCJcbiAgICAgICAgKGNsaWNrKT1cInJvdy5oYXNDaGlsZHJlbiAmJiB0b2dnbGUocm93LCAkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgICA8aVxuICAgICAgICBjbGFzcz1cInBpIHRyZWUtZXllXCJcbiAgICAgICAgW25nQ2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdwaS1leWUtc2xhc2gnIDogJ3BpLWV5ZSdcIlxuICAgICAgICBbY2xhc3MucGFydGlhbF09XCJ2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJ1wiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpICE9PSAnaGlkZGVuJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKHZpc2liaWxpdHkuZ2V0KHJvdy5uYW1lKSA9PT0gJ2hpZGRlbicgPyAnU2hvdyAnIDogJ0hpZGUgJykgKyByb3cubmFtZVwiXG4gICAgICAgIFtwVG9vbHRpcF09XCJcbiAgICAgICAgICAodmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdTaG93JyA6ICdIaWRlJykgK1xuICAgICAgICAgIChyb3cuaGFzQ2hpbGRyZW4gPyAnIGl0IGFuZCBpdHMgc3ViY2xhc3NlcycgOiAnJykgK1xuICAgICAgICAgICh2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJyA/ICcgKHNvbWUgYXJlIGhpZGRlbiknIDogJycpXG4gICAgICAgIFwiXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAoY2xpY2spPVwiZmxpcEhpZGRlbihyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImZsaXBIaWRkZW4ocm93Lm5hbWUsICRldmVudClcIlxuICAgICAgPjwvaT5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1zd2F0Y2hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZXgtY29sb3ItcGlja2VyXG4gICAgICAgICAgW2NvbG9yXT1cImNvbG9yT2Yocm93Lm5hbWUpXCJcbiAgICAgICAgICAoY29sb3JDaGFuZ2UpPVwicmVjb2xvci5lbWl0KHsgbmFtZTogcm93Lm5hbWUsIGNvbG9yOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgIDwvaGV4LWNvbG9yLXBpY2tlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1uYW1lXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInRyZWUtbG9uZ1wiPnt7IG5vZGUocm93Lm5hbWUpPy50aXRsZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1jb3VudFwiICpuZ0lmPVwidG90YWwocm93Lm5hbWUpID4gMFwiPnt7IHRvdGFsKHJvdy5uYW1lKSB9fTwvc3Bhbj5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwidm9sdW1lXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1ib3ggdHJlZS0zZFwiXG4gICAgICAgIFtjbGFzcy5vbl09XCJzaG93bjNkLmhhcyhyb3cubmFtZSlcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInNob3duM2QuaGFzKHJvdy5uYW1lKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1Nob3cgJyArIHJvdy5uYW1lICsgJyBpbiAzRCdcIlxuICAgICAgICBwVG9vbHRpcD1cIlNob3cgaW4gdGhlIHZvbHVtZSwgaW4gM0RcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgKGNsaWNrKT1cImZsaXAzZChyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhcm93cy5sZW5ndGhcIiBjbGFzcz1cInRyZWUtZW1wdHlcIj5ObyBjbGFzcyBtYXRjaGVzLjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the tree of `nodes`, counting `counts` (regions per class) up through it. A node whose
|
|
3
|
+
* parent is not in the hierarchy is a root; siblings sort by `order`, then as listed.
|
|
4
|
+
*/
|
|
5
|
+
export function buildClassTree(nodes, counts) {
|
|
6
|
+
const node = new Map();
|
|
7
|
+
for (const n of nodes)
|
|
8
|
+
if (!node.has(n.name))
|
|
9
|
+
node.set(n.name, n);
|
|
10
|
+
const children = new Map();
|
|
11
|
+
const parent = new Map();
|
|
12
|
+
const roots = [];
|
|
13
|
+
const position = new Map(nodes.map((n, i) => [n.name, i]));
|
|
14
|
+
for (const n of node.values()) {
|
|
15
|
+
const p = n.parent && node.has(n.parent) && n.parent !== n.name ? n.parent : null;
|
|
16
|
+
parent.set(n.name, p);
|
|
17
|
+
if (p) {
|
|
18
|
+
const list = children.get(p);
|
|
19
|
+
if (list)
|
|
20
|
+
list.push(n.name);
|
|
21
|
+
else
|
|
22
|
+
children.set(p, [n.name]);
|
|
23
|
+
}
|
|
24
|
+
else
|
|
25
|
+
roots.push(n.name);
|
|
26
|
+
}
|
|
27
|
+
const byOrder = (a, b) => (node.get(a)?.order ?? Infinity) - (node.get(b)?.order ?? Infinity) ||
|
|
28
|
+
(position.get(a) ?? 0) - (position.get(b) ?? 0);
|
|
29
|
+
roots.sort(byOrder);
|
|
30
|
+
for (const list of children.values())
|
|
31
|
+
list.sort(byOrder);
|
|
32
|
+
const total = new Map();
|
|
33
|
+
const visit = (name, seen) => {
|
|
34
|
+
const known = total.get(name);
|
|
35
|
+
if (known !== undefined)
|
|
36
|
+
return known;
|
|
37
|
+
if (seen.has(name))
|
|
38
|
+
return 0; // a cycle in a malformed file
|
|
39
|
+
seen.add(name);
|
|
40
|
+
let sum = counts.get(name) ?? 0;
|
|
41
|
+
for (const c of children.get(name) ?? [])
|
|
42
|
+
sum += visit(c, seen);
|
|
43
|
+
total.set(name, sum);
|
|
44
|
+
return sum;
|
|
45
|
+
};
|
|
46
|
+
for (const name of node.keys())
|
|
47
|
+
visit(name, new Set());
|
|
48
|
+
return { roots, node, children, parent, total };
|
|
49
|
+
}
|
|
50
|
+
/** `name` and every class under it. */
|
|
51
|
+
export function subtree(tree, name) {
|
|
52
|
+
const out = [];
|
|
53
|
+
const stack = [name];
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
while (stack.length) {
|
|
56
|
+
const n = stack.pop();
|
|
57
|
+
if (seen.has(n))
|
|
58
|
+
continue;
|
|
59
|
+
seen.add(n);
|
|
60
|
+
out.push(n);
|
|
61
|
+
for (const c of tree.children.get(n) ?? [])
|
|
62
|
+
stack.push(c);
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** The classes from the root down to `name`'s parent. */
|
|
67
|
+
export function ancestors(tree, name) {
|
|
68
|
+
const out = [];
|
|
69
|
+
let p = tree.parent.get(name) ?? null;
|
|
70
|
+
while (p && !out.includes(p)) {
|
|
71
|
+
out.unshift(p);
|
|
72
|
+
p = tree.parent.get(p) ?? null;
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The rows to draw: depth-first through the expanded nodes. With a `query`, only the nodes whose
|
|
78
|
+
* name or title contains it and their ancestors, all expanded.
|
|
79
|
+
*/
|
|
80
|
+
export function visibleRows(tree, expanded, query = '') {
|
|
81
|
+
const q = query.trim().toLowerCase();
|
|
82
|
+
let keep = null;
|
|
83
|
+
if (q) {
|
|
84
|
+
keep = new Set();
|
|
85
|
+
for (const [name, n] of tree.node) {
|
|
86
|
+
if (name.toLowerCase().includes(q) || (n.title ?? '').toLowerCase().includes(q)) {
|
|
87
|
+
keep.add(name);
|
|
88
|
+
for (const a of ancestors(tree, name))
|
|
89
|
+
keep.add(a);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const rows = [];
|
|
94
|
+
const walk = (name, depth) => {
|
|
95
|
+
if (keep && !keep.has(name))
|
|
96
|
+
return;
|
|
97
|
+
const kids = tree.children.get(name) ?? [];
|
|
98
|
+
const open = keep ? true : expanded.has(name);
|
|
99
|
+
rows.push({ name, depth, hasChildren: kids.length > 0, expanded: open && kids.length > 0 });
|
|
100
|
+
if (open)
|
|
101
|
+
for (const c of kids)
|
|
102
|
+
walk(c, depth + 1);
|
|
103
|
+
};
|
|
104
|
+
for (const r of tree.roots)
|
|
105
|
+
walk(r, 0);
|
|
106
|
+
return rows;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtdHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzcy10cmVlL2NsYXNzLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFpQyxFQUFFLE1BQW1DO0lBQ25HLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO0lBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksS0FBSztRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRixNQUFNLENBQUMsR0FB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LENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7SUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLO1FBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlZ2lvbkNsYXNzTm9kZSB9IGZyb20gJy4uLy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcblxuLyoqIEEgY2xhc3MgaGllcmFyY2h5IGFzIGEgdHJlZTogY2hpbGRyZW4gaW4gb3JkZXIsIHN1YnRyZWUgY291bnRzLCBkZXB0aHMuIFB1cmUuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzVHJlZSB7XG4gIHJvb3RzOiBzdHJpbmdbXTtcbiAgbm9kZTogTWFwPHN0cmluZywgUmVnaW9uQ2xhc3NOb2RlPjtcbiAgY2hpbGRyZW46IE1hcDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgcGFyZW50OiBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFJlZ2lvbnMgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBjbGFzcyB1bmRlciBpdC4gKi9cbiAgdG90YWw6IE1hcDxzdHJpbmcsIG51bWJlcj47XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHRyZWUgb2YgYG5vZGVzYCwgY291bnRpbmcgYGNvdW50c2AgKHJlZ2lvbnMgcGVyIGNsYXNzKSB1cCB0aHJvdWdoIGl0LiBBIG5vZGUgd2hvc2VcbiAqIHBhcmVudCBpcyBub3QgaW4gdGhlIGhpZXJhcmNoeSBpcyBhIHJvb3Q7IHNpYmxpbmdzIHNvcnQgYnkgYG9yZGVyYCwgdGhlbiBhcyBsaXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENsYXNzVHJlZShub2RlczogcmVhZG9ubHkgUmVnaW9uQ2xhc3NOb2RlW10sIGNvdW50czogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+KTogQ2xhc3NUcmVlIHtcbiAgY29uc3Qgbm9kZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpb25DbGFzc05vZGU+KCk7XG4gIGZvciAoY29uc3QgbiBvZiBub2RlcykgaWYgKCFub2RlLmhhcyhuLm5hbWUpKSBub2RlLnNldChuLm5hbWUsIG4pO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcGFyZW50ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG4gIGNvbnN0IHJvb3RzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwb3NpdGlvbiA9IG5ldyBNYXAobm9kZXMubWFwKChuLCBpKSA9PiBbbi5uYW1lLCBpXSkpO1xuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZS52YWx1ZXMoKSkge1xuICAgIGNvbnN0IHAgPSBuLnBhcmVudCAmJiBub2RlLmhhcyhuLnBhcmVudCkgJiYgbi5wYXJlbnQgIT09IG4ubmFtZSA/IG4ucGFyZW50IDogbnVsbDtcbiAgICBwYXJlbnQuc2V0KG4ubmFtZSwgcCk7XG4gICAgaWYgKHApIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBjaGlsZHJlbi5nZXQocCk7XG4gICAgICBpZiAobGlzdCkgbGlzdC5wdXNoKG4ubmFtZSk7XG4gICAgICBlbHNlIGNoaWxkcmVuLnNldChwLCBbbi5uYW1lXSk7XG4gICAgfSBlbHNlIHJvb3RzLnB1c2gobi5uYW1lKTtcbiAgfVxuICBjb25zdCBieU9yZGVyID0gKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PlxuICAgIChub2RlLmdldChhKT8ub3JkZXIgPz8gSW5maW5pdHkpIC0gKG5vZGUuZ2V0KGIpPy5vcmRlciA/PyBJbmZpbml0eSkgfHxcbiAgICAocG9zaXRpb24uZ2V0KGEpID8/IDApIC0gKHBvc2l0aW9uLmdldChiKSA/PyAwKTtcbiAgcm9vdHMuc29ydChieU9yZGVyKTtcbiAgZm9yIChjb25zdCBsaXN0IG9mIGNoaWxkcmVuLnZhbHVlcygpKSBsaXN0LnNvcnQoYnlPcmRlcik7XG5cbiAgY29uc3QgdG90YWwgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBjb25zdCB2aXNpdCA9IChuYW1lOiBzdHJpbmcsIHNlZW46IFNldDxzdHJpbmc+KTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBrbm93biA9IHRvdGFsLmdldChuYW1lKTtcbiAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgIGlmIChzZWVuLmhhcyhuYW1lKSkgcmV0dXJuIDA7IC8vIGEgY3ljbGUgaW4gYSBtYWxmb3JtZWQgZmlsZVxuICAgIHNlZW4uYWRkKG5hbWUpO1xuICAgIGxldCBzdW0gPSBjb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuLmdldChuYW1lKSA/PyBbXSkgc3VtICs9IHZpc2l0KGMsIHNlZW4pO1xuICAgIHRvdGFsLnNldChuYW1lLCBzdW0pO1xuICAgIHJldHVybiBzdW07XG4gIH07XG4gIGZvciAoY29uc3QgbmFtZSBvZiBub2RlLmtleXMoKSkgdmlzaXQobmFtZSwgbmV3IFNldCgpKTtcbiAgcmV0dXJuIHsgcm9vdHMsIG5vZGUsIGNoaWxkcmVuLCBwYXJlbnQsIHRvdGFsIH07XG59XG5cbi8qKiBgbmFtZWAgYW5kIGV2ZXJ5IGNsYXNzIHVuZGVyIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyZWUodHJlZTogQ2xhc3NUcmVlLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RhY2sgPSBbbmFtZV07XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKSBhcyBzdHJpbmc7XG4gICAgaWYgKHNlZW4uaGFzKG4pKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChuKTtcbiAgICBvdXQucHVzaChuKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdHJlZS5jaGlsZHJlbi5nZXQobikgPz8gW10pIHN0YWNrLnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBjbGFzc2VzIGZyb20gdGhlIHJvb3QgZG93biB0byBgbmFtZWAncyBwYXJlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gYW5jZXN0b3JzKHRyZWU6IENsYXNzVHJlZSwgbmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBwID0gdHJlZS5wYXJlbnQuZ2V0KG5hbWUpID8/IG51bGw7XG4gIHdoaWxlIChwICYmICFvdXQuaW5jbHVkZXMocCkpIHtcbiAgICBvdXQudW5zaGlmdChwKTtcbiAgICBwID0gdHJlZS5wYXJlbnQuZ2V0KHApID8/IG51bGw7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIE9uZSB2aXNpYmxlIHJvdyBvZiB0aGUgdHJlZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NUcmVlUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXB0aDogbnVtYmVyO1xuICBoYXNDaGlsZHJlbjogYm9vbGVhbjtcbiAgZXhwYW5kZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHJvd3MgdG8gZHJhdzogZGVwdGgtZmlyc3QgdGhyb3VnaCB0aGUgZXhwYW5kZWQgbm9kZXMuIFdpdGggYSBgcXVlcnlgLCBvbmx5IHRoZSBub2RlcyB3aG9zZVxuICogbmFtZSBvciB0aXRsZSBjb250YWlucyBpdCBhbmQgdGhlaXIgYW5jZXN0b3JzLCBhbGwgZXhwYW5kZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlUm93cyh0cmVlOiBDbGFzc1RyZWUsIGV4cGFuZGVkOiBSZWFkb25seVNldDxzdHJpbmc+LCBxdWVyeSA9ICcnKTogQ2xhc3NUcmVlUm93W10ge1xuICBjb25zdCBxID0gcXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBrZWVwOiBTZXQ8c3RyaW5nPiB8IG51bGwgPSBudWxsO1xuICBpZiAocSkge1xuICAgIGtlZXAgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgbl0gb2YgdHJlZS5ub2RlKSB7XG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IChuLnRpdGxlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSB7XG4gICAgICAgIGtlZXAuYWRkKG5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYW5jZXN0b3JzKHRyZWUsIG5hbWUpKSBrZWVwLmFkZChhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgcm93czogQ2xhc3NUcmVlUm93W10gPSBbXTtcbiAgY29uc3Qgd2FsayA9IChuYW1lOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIpID0+IHtcbiAgICBpZiAoa2VlcCAmJiAha2VlcC5oYXMobmFtZSkpIHJldHVybjtcbiAgICBjb25zdCBraWRzID0gdHJlZS5jaGlsZHJlbi5nZXQobmFtZSkgPz8gW107XG4gICAgY29uc3Qgb3BlbiA9IGtlZXAgPyB0cnVlIDogZXhwYW5kZWQuaGFzKG5hbWUpO1xuICAgIHJvd3MucHVzaCh7IG5hbWUsIGRlcHRoLCBoYXNDaGlsZHJlbjoga2lkcy5sZW5ndGggPiAwLCBleHBhbmRlZDogb3BlbiAmJiBraWRzLmxlbmd0aCA+IDAgfSk7XG4gICAgaWYgKG9wZW4pIGZvciAoY29uc3QgYyBvZiBraWRzKSB3YWxrKGMsIGRlcHRoICsgMSk7XG4gIH07XG4gIGZvciAoY29uc3QgciBvZiB0cmVlLnJvb3RzKSB3YWxrKHIsIDApO1xuICByZXR1cm4gcm93cztcbn1cbiJdfQ==
|