@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,96 @@
1
+ import { PIXEL_WORLD_QUANTUM, snapToWorldGrid } from '../../../spatial/world-grid';
2
+ import { applyAffine } from '../../../region-overlay/svg-region-renderer';
3
+ /**
4
+ * The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
5
+ * units, through the viewer's own transforms (see {@link OverlayViewer}).
6
+ *
7
+ * World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
8
+ * drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
9
+ * client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
10
+ * per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
11
+ * vertex (review NAPARI-BOUNDARY-10).
12
+ */
13
+ export class OverlayProjection {
14
+ constructor(svg, viewer) {
15
+ this.svg = svg;
16
+ this.viewer = viewer;
17
+ /**
18
+ * How finely a drawn vertex may be placed, in world units.
19
+ *
20
+ * One by default, because for an image the world IS pixels and a region should align to
21
+ * them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
22
+ * sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
23
+ * placeable positions and no ROI can be drawn at all.
24
+ */
25
+ this.worldQuantum = PIXEL_WORLD_QUANTUM;
26
+ /** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
27
+ this.origin = null;
28
+ this.camera = null;
29
+ /** {@link toLocal} as the shared region geometry takes it. */
30
+ this.toScreen = (x, y) => this.toLocal(x, y);
31
+ }
32
+ setWorldQuantum(quantum) {
33
+ this.worldQuantum = Number.isFinite(quantum) && quantum > 0 ? quantum : PIXEL_WORLD_QUANTUM;
34
+ }
35
+ /** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
36
+ toImage(clientX, clientY) {
37
+ const [wx, wy] = this.viewer.canvasToWorld(clientX, clientY);
38
+ return [snapToWorldGrid(wx, this.worldQuantum), snapToWorldGrid(wy, this.worldQuantum)];
39
+ }
40
+ /** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
41
+ toWorld(clientX, clientY) {
42
+ return this.viewer.canvasToWorld(clientX, clientY);
43
+ }
44
+ /**
45
+ * World units spanned by one screen pixel, measured through the viewer's own transform.
46
+ *
47
+ * Read from the transform rather than from the camera, so it holds for both the 2D and
48
+ * the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
49
+ * if the transform gives nothing usable, which keeps the established pixel behaviour
50
+ * rather than collapsing the threshold to zero and recording a point per event.
51
+ */
52
+ worldPerCanvasPixel() {
53
+ const [x0] = this.viewer.canvasToWorld(0, 0);
54
+ const [x1] = this.viewer.canvasToWorld(1, 0);
55
+ const per = Math.abs(x1 - x0);
56
+ return Number.isFinite(per) && per > 0 ? per : 1;
57
+ }
58
+ /** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
59
+ withOrigin(fn) {
60
+ if (this.origin)
61
+ return fn();
62
+ const r = this.svg.getBoundingClientRect();
63
+ this.origin = { left: r.left, top: r.top };
64
+ this.camera = this.viewer.canvasTransform();
65
+ try {
66
+ return fn();
67
+ }
68
+ finally {
69
+ this.origin = null;
70
+ this.camera = null;
71
+ }
72
+ }
73
+ /** Client px → SVG-local px. */
74
+ clientToLocal(clientX, clientY) {
75
+ const o = this.origin ?? this.svg.getBoundingClientRect();
76
+ return [clientX - o.left, clientY - o.top];
77
+ }
78
+ /** World coords → SVG-local px, through the camera affine: no layout read. */
79
+ toLocal(imgX, imgY) {
80
+ return applyAffine(this.affine(), imgX, imgY);
81
+ }
82
+ /** Screen distance (px) between a client point and a world point. */
83
+ screenDist(clientX, clientY, imgX, imgY) {
84
+ const [lx, ly] = this.toLocal(imgX, imgY);
85
+ const [px, py] = this.clientToLocal(clientX, clientY);
86
+ return Math.hypot(px - lx, py - ly);
87
+ }
88
+ /**
89
+ * The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
90
+ * reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
91
+ */
92
+ affine() {
93
+ return this.camera ?? this.viewer.canvasTransform();
94
+ }
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wcm9qZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3JlZ2lvbi1vdmVybGF5L292ZXJsYXktcHJvamVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsT0FBTyxFQUFVLFdBQVcsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBR2xGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFjNUIsWUFDbUIsR0FBa0IsRUFDbEIsTUFBcUI7UUFEckIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBZnhDOzs7Ozs7O1dBT0c7UUFDSyxpQkFBWSxHQUFHLG1CQUFtQixDQUFDO1FBQzNDLG1HQUFtRztRQUMzRixXQUFNLEdBQXlDLElBQUksQ0FBQztRQUNwRCxXQUFNLEdBQWtCLElBQUksQ0FBQztRQThEckMsOERBQThEO1FBQ3JELGFBQVEsR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBMUR4RCxDQUFDO0lBRUosZUFBZSxDQUFDLE9BQWU7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFDOUYsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxPQUFPLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDdEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFB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QU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3RELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBJWEVMX1dPUkxEX1FVQU5UVU0sIHNuYXBUb1dvcmxkR3JpZCB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvd29ybGQtZ3JpZCc7XG5pbXBvcnQgdHlwZSB7IFRvU2NyZWVuIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWdlb21ldHJ5JztcbmltcG9ydCB7IEFmZmluZSwgYXBwbHlBZmZpbmUgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9zdmctcmVnaW9uLXJlbmRlcmVyJztcbmltcG9ydCB0eXBlIHsgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4uL25hcGFyaS1yZWdpb24tb3ZlcmxheSc7XG5cbi8qKlxuICogVGhlIHJlZ2lvbiBvdmVybGF5J3MgY29vcmRpbmF0ZSBzcGFjZXM6IHBvaW50ZXIgQ0xJRU5UIHBpeGVscywgc3ZnLUxPQ0FMIHBpeGVscyBhbmQgV09STERcbiAqIHVuaXRzLCB0aHJvdWdoIHRoZSB2aWV3ZXIncyBvd24gdHJhbnNmb3JtcyAoc2VlIHtAbGluayBPdmVybGF5Vmlld2VyfSkuXG4gKlxuICogV29ybGQg4oaSIHN2Zy1sb2NhbCBpcyB0aGUgdmlld2VyJ3MgY2FtZXJhIGFmZmluZSAoYGNhbnZhc1RyYW5zZm9ybWApLCB3aGljaCByZWFkcyBubyBsYXlvdXQsIHNvXG4gKiBkcmF3aW5nIGFuZCBmb2xsb3dpbmcgdGhlIGNhbWVyYSByZWFkIG5vbmUuIE9ubHkgYSBwb2ludGVyLCBpbiBjbGllbnQgcGl4ZWxzLCBuZWVkcyB0aGUgc3ZnJ3NcbiAqIGNsaWVudCBvcmlnaW46IHJlYWQgb25jZSBwZXIge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIChhIGdlc3R1cmUgZXZlbnQpLCBhcyBhbiB1bmNhY2hlZCByZWFkXG4gKiBwZXIgdmVydGV4IOKAlCBpbnRlcmxlYXZlZCB3aXRoIHRoZSBlbGVtZW50cyBhIHJlZHJhdyBhcHBlbmRzIOKAlCBmb3JjZWQgYSBzeW5jaHJvbm91cyBsYXlvdXQgcGVyXG4gKiB2ZXJ0ZXggKHJldmlldyBOQVBBUkktQk9VTkRBUlktMTApLlxuICovXG5leHBvcnQgY2xhc3MgT3ZlcmxheVByb2plY3Rpb24ge1xuICAvKipcbiAgICogSG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLCBpbiB3b3JsZCB1bml0cy5cbiAgICpcbiAgICogT25lIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZm9yIGFuIGltYWdlIHRoZSB3b3JsZCBJUyBwaXhlbHMgYW5kIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0b1xuICAgKiB0aGVtLiBBIGRhdGFzZXQgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwaXhlbHMgc2V0cyBpdCBmaW5lciDigJQgc2VxRklTSCdzIHdob2xlXG4gICAqIHNhbXBsZSBzcGFucyBhYm91dCA1IHggNyB1bml0cywgd2hlcmUgd2hvbGUtdW5pdCB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodFxuICAgKiBwbGFjZWFibGUgcG9zaXRpb25zIGFuZCBubyBST0kgY2FuIGJlIGRyYXduIGF0IGFsbC5cbiAgICovXG4gIHByaXZhdGUgd29ybGRRdWFudHVtID0gUElYRUxfV09STERfUVVBTlRVTTtcbiAgLyoqIFRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSwgY2FjaGVkIHdoaWxlIGEge0BsaW5rIHdpdGhPcmlnaW59IGJsb2NrIHJ1bnMuICovXG4gIHByaXZhdGUgb3JpZ2luOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYTogQWZmaW5lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IE92ZXJsYXlWaWV3ZXIsXG4gICkge31cblxuICBzZXRXb3JsZFF1YW50dW0ocXVhbnR1bTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy53b3JsZFF1YW50dW0gPSBOdW1iZXIuaXNGaW5pdGUocXVhbnR1bSkgJiYgcXVhbnR1bSA+IDAgPyBxdWFudHVtIDogUElYRUxfV09STERfUVVBTlRVTTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3Jkcywgc25hcHBlZCB0byB0aGUgd29ybGQgcXVhbnR1bSAoZm9yIHBsYWNpbmcgdmVydGljZXMpLiAqL1xuICB0b0ltYWdlKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgW3d4LCB3eV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBbc25hcFRvV29ybGRHcmlkKHd4LCB0aGlzLndvcmxkUXVhbnR1bSksIHNuYXBUb1dvcmxkR3JpZCh3eSwgdGhpcy53b3JsZFF1YW50dW0pXTtcbiAgfVxuXG4gIC8qKiBQb2ludGVyIGNsaWVudCBjb29yZHMg4oaSIHdvcmxkIGNvb3JkcywgZXhhY3QgKGZvciBwaWNraW5nOiBzbmFwcGluZyBpcyBmb3IgcGxhY2luZykuICovXG4gIHRvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXb3JsZCB1bml0cyBzcGFubmVkIGJ5IG9uZSBzY3JlZW4gcGl4ZWwsIG1lYXN1cmVkIHRocm91Z2ggdGhlIHZpZXdlcidzIG93biB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgdHJhbnNmb3JtIHJhdGhlciB0aGFuIGZyb20gdGhlIGNhbWVyYSwgc28gaXQgaG9sZHMgZm9yIGJvdGggdGhlIDJEIGFuZFxuICAgKiB0aGUgM0Qgc2NyZWVuLXNwYWNlIGFkYXB0ZXJzIHdpdGhvdXQgZWl0aGVyIGhhdmluZyB0byBleHBvc2UgYSB6b29tLiBGYWxscyBiYWNrIHRvIDFcbiAgICogaWYgdGhlIHRyYW5zZm9ybSBnaXZlcyBub3RoaW5nIHVzYWJsZSwgd2hpY2gga2VlcHMgdGhlIGVzdGFibGlzaGVkIHBpeGVsIGJlaGF2aW91clxuICAgKiByYXRoZXIgdGhhbiBjb2xsYXBzaW5nIHRoZSB0aHJlc2hvbGQgdG8gemVybyBhbmQgcmVjb3JkaW5nIGEgcG9pbnQgcGVyIGV2ZW50LlxuICAgKi9cbiAgd29ybGRQZXJDYW52YXNQaXhlbCgpOiBudW1iZXIge1xuICAgIGNvbnN0IFt4MF0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDAsIDApO1xuICAgIGNvbnN0IFt4MV0gPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKDEsIDApO1xuICAgIGNvbnN0IHBlciA9IE1hdGguYWJzKHgxIC0geDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGVyKSAmJiBwZXIgPiAwID8gcGVyIDogMTtcbiAgfVxuXG4gIC8qKiBSdW4gYGZuYCB3aXRoIHRoZSBzdmcncyBjbGllbnQgb3JpZ2luIGFuZCB0aGUgY2FtZXJhIGFmZmluZSByZWFkIG9uY2UgKG5lc3RlZCBjYWxscyByZXVzZSB0aGVtKS4gKi9cbiAgd2l0aE9yaWdpbjxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIGlmICh0aGlzLm9yaWdpbikgcmV0dXJuIGZuKCk7XG4gICAgY29uc3QgciA9IHRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMub3JpZ2luID0geyBsZWZ0OiByLmxlZnQsIHRvcDogci50b3AgfTtcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbGllbnQgcHgg4oaSIFNWRy1sb2NhbCBweC4gKi9cbiAgY2xpZW50VG9Mb2NhbChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IG8gPSB0aGlzLm9yaWdpbiA/PyB0aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gW2NsaWVudFggLSBvLmxlZnQsIGNsaWVudFkgLSBvLnRvcF07XG4gIH1cblxuICAvKiogV29ybGQgY29vcmRzIOKGkiBTVkctbG9jYWwgcHgsIHRocm91Z2ggdGhlIGNhbWVyYSBhZmZpbmU6IG5vIGxheW91dCByZWFkLiAqL1xuICB0b0xvY2FsKGltZ1g6IG51bWJlciwgaW1nWTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIGFwcGx5QWZmaW5lKHRoaXMuYWZmaW5lKCksIGltZ1gsIGltZ1kpO1xuICB9XG5cbiAgLyoqIHtAbGluayB0b0xvY2FsfSBhcyB0aGUgc2hhcmVkIHJlZ2lvbiBnZW9tZXRyeSB0YWtlcyBpdC4gKi9cbiAgcmVhZG9ubHkgdG9TY3JlZW46IFRvU2NyZWVuID0gKHgsIHkpID0+IHRoaXMudG9Mb2NhbCh4LCB5KTtcblxuICAvKiogU2NyZWVuIGRpc3RhbmNlIChweCkgYmV0d2VlbiBhIGNsaWVudCBwb2ludCBhbmQgYSB3b3JsZCBwb2ludC4gKi9cbiAgc2NyZWVuRGlzdChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgaW1nWDogbnVtYmVyLCBpbWdZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IFtseCwgbHldID0gdGhpcy50b0xvY2FsKGltZ1gsIGltZ1kpO1xuICAgIGNvbnN0IFtweCwgcHldID0gdGhpcy5jbGllbnRUb0xvY2FsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybiBNYXRoLmh5cG90KHB4IC0gbHgsIHB5IC0gbHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCDihpIgc3ZnLWxvY2FsIGFmZmluZSBmb3IgdGhlIGN1cnJlbnQgY2FtZXJhOiB0aGUgdmlld2VyJ3MgYGNhbnZhc1RyYW5zZm9ybWAsIHdoaWNoXG4gICAqIHJlYWRzIG5vIGxheW91dC4gVGhlIHN2ZyBhbmQgdGhlIGNhbnZhcyBzaGFyZSBhbiBvcmlnaW4gKHNlZSB7QGxpbmsgT3ZlcmxheVZpZXdlcn0pLlxuICAgKi9cbiAgYWZmaW5lKCk6IEFmZmluZSB7XG4gICAgcmV0dXJuIHRoaXMuY2FtZXJhID8/IHRoaXMudmlld2VyLmNhbnZhc1RyYW5zZm9ybSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { Rectangle } from '../../../models/region';
2
+ /** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
3
+ export function applyRegionEdit(store, edit, x, y) {
4
+ switch (edit.kind) {
5
+ case 'body': {
6
+ const [lx, ly] = edit.last;
7
+ store.moveRegion(edit.id, x - lx, y - ly);
8
+ edit.last = [x, y];
9
+ return;
10
+ }
11
+ case 'corner': {
12
+ const [ax, ay] = edit.anchor;
13
+ const rect = new Rectangle();
14
+ rect.x = Math.min(ax, x);
15
+ rect.y = Math.min(ay, y);
16
+ rect.width = Math.abs(x - ax);
17
+ rect.height = Math.abs(y - ay);
18
+ store.updateBounds(edit.id, rect);
19
+ return;
20
+ }
21
+ case 'vertex':
22
+ if (edit.ring < 0)
23
+ store.moveVertex(edit.id, edit.index, x, y);
24
+ else
25
+ store.moveHoleVertex(edit.id, edit.ring, edit.index, x, y);
26
+ return;
27
+ case 'bezier':
28
+ if (edit.ring < 0)
29
+ store.moveBezierHandle(edit.id, edit.index, edit.side, x, y);
30
+ else
31
+ store.moveHoleBezierHandle(edit.id, edit.ring, edit.index, edit.side, x, y);
32
+ return;
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvcmVnaW9uLW92ZXJsYXkvcmVnaW9uLWVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBV25ELHFHQUFxRztBQUNyRyxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWtCLEVBQUUsSUFBZ0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN4RixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssUUFBUTtZQUNYLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Z0JBQzFELEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU87UUFDVCxLQUFLLFFBQVE7WUFDWCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztnQkFDM0UsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87SUFDWCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVIaXQgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBBIGxpdmUgZHJhZyBvZiB0aGUgc2VsZWN0L21vdmUgdG9vbHM6IHRoZSByZWdpb24ncyBib2R5LCBvciBvbmUgb2YgaXRzIGhhbmRsZXMgYXMgdGhlXG4gKiBzaGFyZWQgYGhpdEhhbmRsZWAgbmFtZXMgaXQgKGEgcmVjdGFuZ2xlIGNvcm5lciB3aXRoIGl0cyBmaXhlZCBvcHBvc2l0ZSBgYW5jaG9yYCwgb3IgYVxuICogdmVydGV4IC8gYsOpemllciBjb250cm9sIHBvaW50IG9uIGByaW5nYCAtMSBmb3IgdGhlIGV4dGVyaW9yLCBlbHNlIGEgaG9sZSkuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lvbkVkaXQgPSB7IGlkOiBudW1iZXI7IGxhc3Q6IFtudW1iZXIsIG51bWJlcl0gfSAmICh7IGtpbmQ6ICdib2R5JyB9IHwgSGFuZGxlSGl0KTtcblxuLyoqIEFwcGx5IHRoZSBkcmFnIG9mIGBlZGl0YCB0byB0aGUgcG9pbnRlciBhdCB3b3JsZCBwb2ludCBgKHgsIHkpYCwgdGhyb3VnaCB0aGUgc3RvcmUncyBlZGl0IG9wcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJlZ2lvbkVkaXQoc3RvcmU6IFJlZ2lvblN0b3JlLCBlZGl0OiBSZWdpb25FZGl0LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICBzd2l0Y2ggKGVkaXQua2luZCkge1xuICAgIGNhc2UgJ2JvZHknOiB7XG4gICAgICBjb25zdCBbbHgsIGx5XSA9IGVkaXQubGFzdDtcbiAgICAgIHN0b3JlLm1vdmVSZWdpb24oZWRpdC5pZCwgeCAtIGx4LCB5IC0gbHkpO1xuICAgICAgZWRpdC5sYXN0ID0gW3gsIHldO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICdjb3JuZXInOiB7XG4gICAgICBjb25zdCBbYXgsIGF5XSA9IGVkaXQuYW5jaG9yO1xuICAgICAgY29uc3QgcmVjdCA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgIHJlY3QueCA9IE1hdGgubWluKGF4LCB4KTtcbiAgICAgIHJlY3QueSA9IE1hdGgubWluKGF5LCB5KTtcbiAgICAgIHJlY3Qud2lkdGggPSBNYXRoLmFicyh4IC0gYXgpO1xuICAgICAgcmVjdC5oZWlnaHQgPSBNYXRoLmFicyh5IC0gYXkpO1xuICAgICAgc3RvcmUudXBkYXRlQm91bmRzKGVkaXQuaWQsIHJlY3QpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYXNlICd2ZXJ0ZXgnOlxuICAgICAgaWYgKGVkaXQucmluZyA8IDApIHN0b3JlLm1vdmVWZXJ0ZXgoZWRpdC5pZCwgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlVmVydGV4KGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgeCwgeSk7XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnYmV6aWVyJzpcbiAgICAgIGlmIChlZGl0LnJpbmcgPCAwKSBzdG9yZS5tb3ZlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQuaW5kZXgsIGVkaXQuc2lkZSwgeCwgeSk7XG4gICAgICBlbHNlIHN0b3JlLm1vdmVIb2xlQmV6aWVySGFuZGxlKGVkaXQuaWQsIGVkaXQucmluZywgZWRpdC5pbmRleCwgZWRpdC5zaWRlLCB4LCB5KTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuIl19
@@ -0,0 +1,182 @@
1
+ import { Polygon, Rectangle } from '../../../models/region';
2
+ import { regionBBox, ringHandles, ringOf } from '../../../region-overlay/region-geometry';
3
+ import { SvgRegionRenderer, svgEl } from '../../../region-overlay/svg-region-renderer';
4
+ const SVG_NS = 'http://www.w3.org/2000/svg';
5
+ /** Rendered handle size (screen px). */
6
+ export const HANDLE_SIZE = 7;
7
+ /**
8
+ * What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
9
+ * in world coordinates (styled from the store's colours, labelled when labels are on), and in
10
+ * screen space the selected regions' grab handles (corners, vertices, bézier control points),
11
+ * the draft being drawn and the rubber-band marquee.
12
+ */
13
+ export class NapariRegionSvgRenderer {
14
+ constructor(svg, store) {
15
+ this.svg = svg;
16
+ this.store = store;
17
+ /** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
18
+ this.marqueeEl = null;
19
+ this.renderer = new SvgRegionRenderer(svg, {
20
+ rectElement: 'rect',
21
+ styleShape: (el, region, selected) => this.style(el, this.strokeOf(region), selected),
22
+ decorate: (region, _i, _selected, layer) => this.drawLabel(region, layer),
23
+ skip: (region) => !!region.isProfile?.(),
24
+ });
25
+ }
26
+ /** Follow the camera: one transform attribute plus the screen-space elements. */
27
+ setCamera(affine) {
28
+ this.renderer.setCamera(affine);
29
+ }
30
+ /** Rebuild the regions (world space) and their labels. */
31
+ render(regions, selected) {
32
+ this.renderer.render(regions, selected);
33
+ }
34
+ /** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
35
+ renderOverlay(regions, selected, draft) {
36
+ this.renderer.renderOverlay((layer) => {
37
+ for (const i of selected) {
38
+ const region = regions[i];
39
+ if (region && !region.isProfile?.())
40
+ this.drawHandles(region, layer);
41
+ }
42
+ this.drawDraft(draft, layer);
43
+ });
44
+ }
45
+ /** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
46
+ showMarquee(lx, ly, rx, ry) {
47
+ if (!this.marqueeEl || !this.marqueeEl.parentNode) {
48
+ this.marqueeEl = document.createElementNS(SVG_NS, 'rect');
49
+ this.marqueeEl.setAttribute('stroke', '#4da3ff');
50
+ this.marqueeEl.setAttribute('stroke-width', '1');
51
+ this.marqueeEl.setAttribute('stroke-dasharray', '4 3');
52
+ this.marqueeEl.setAttribute('fill', '#4da3ff');
53
+ this.marqueeEl.setAttribute('fill-opacity', '0.12');
54
+ this.marqueeEl.setAttribute('vector-effect', 'non-scaling-stroke');
55
+ this.svg.appendChild(this.marqueeEl);
56
+ }
57
+ this.marqueeEl.setAttribute('x', `${lx}`);
58
+ this.marqueeEl.setAttribute('y', `${ly}`);
59
+ this.marqueeEl.setAttribute('width', `${Math.abs(rx - lx)}`);
60
+ this.marqueeEl.setAttribute('height', `${Math.abs(ry - ly)}`);
61
+ }
62
+ /** Remove the marquee element from the SVG. */
63
+ clearMarquee() {
64
+ if (this.marqueeEl?.parentNode)
65
+ this.marqueeEl.parentNode.removeChild(this.marqueeEl);
66
+ this.marqueeEl = null;
67
+ }
68
+ /** A region's outline colour. */
69
+ strokeOf(region) {
70
+ return region.color || this.store.getShapeColor() || '#00ffff';
71
+ }
72
+ /** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
73
+ drawLabel(region, layer) {
74
+ if (!this.store.getShowShapeLabel() || region.isProfile?.())
75
+ return;
76
+ const label = region.label;
77
+ const bb = label ? regionBBox(region) : null;
78
+ if (!label || !bb)
79
+ return;
80
+ const text = svgEl('text');
81
+ text.setAttribute('fill', '#fff');
82
+ text.setAttribute('stroke', '#000');
83
+ text.setAttribute('stroke-width', '3');
84
+ text.setAttribute('paint-order', 'stroke');
85
+ text.setAttribute('font', '12px sans-serif');
86
+ text.setAttribute('pointer-events', 'none');
87
+ text.textContent = label;
88
+ layer.at(text, bb.x0, bb.y0, { dy: -4 });
89
+ }
90
+ /** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
91
+ drawHandles(region, layer) {
92
+ const b = region.bounds;
93
+ if (!b)
94
+ return;
95
+ const stroke = this.strokeOf(region);
96
+ const handle = (imgX, imgY) => {
97
+ const el = svgEl('rect');
98
+ el.setAttribute('width', `${HANDLE_SIZE}`);
99
+ el.setAttribute('height', `${HANDLE_SIZE}`);
100
+ el.setAttribute('fill', '#fff');
101
+ el.setAttribute('stroke', stroke);
102
+ el.setAttribute('stroke-width', '1.5');
103
+ layer.at(el, imgX, imgY, { dx: -HANDLE_SIZE / 2, dy: -HANDLE_SIZE / 2 });
104
+ };
105
+ if (b instanceof Rectangle) {
106
+ handle(b.x, b.y);
107
+ handle(b.x + b.width, b.y);
108
+ handle(b.x, b.y + b.height);
109
+ handle(b.x + b.width, b.y + b.height);
110
+ }
111
+ else if (b instanceof Polygon) {
112
+ for (let i = 0; i < b.npoints; i++)
113
+ handle(b.xpoints[i], b.ypoints[i]);
114
+ for (const ring of b.holes ?? [])
115
+ for (const [hx, hy] of ring)
116
+ handle(hx, hy);
117
+ // Bezier regions also expose their tangent control points (circles) joined to the anchor
118
+ // by a thin line, matching the OSD overlay's editable bezier handles. Stored handles when
119
+ // present, else the Catmull-Rom default the curve is drawn with.
120
+ if (b.bezier) {
121
+ for (let ring = -1; ring < (b.holes?.length ?? 0); ring++) {
122
+ const { xs, ys } = ringOf(b, ring);
123
+ ringHandles(b, ring).forEach((h, i) => {
124
+ if (h.hasOut)
125
+ this.drawBezierHandle(xs[i], ys[i], h.out, stroke, layer);
126
+ if (h.hasIn)
127
+ this.drawBezierHandle(xs[i], ys[i], h.in, stroke, layer);
128
+ });
129
+ }
130
+ }
131
+ }
132
+ }
133
+ /** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
134
+ * `handle` is the control point's absolute position in image space. */
135
+ drawBezierHandle(ax, ay, handle, stroke, layer) {
136
+ if (handle[0] === ax && handle[1] === ay)
137
+ return;
138
+ const line = layer.line(ax, ay, handle[0], handle[1]);
139
+ line.setAttribute('stroke', stroke);
140
+ line.setAttribute('stroke-width', '1');
141
+ line.setAttribute('stroke-opacity', '0.7');
142
+ const dot = svgEl('circle');
143
+ dot.setAttribute('r', `${HANDLE_SIZE / 2}`);
144
+ dot.setAttribute('fill', stroke);
145
+ dot.setAttribute('stroke', '#fff');
146
+ dot.setAttribute('stroke-width', '1');
147
+ layer.at(dot, handle[0], handle[1], { x: 'cx', y: 'cy' });
148
+ }
149
+ style(el, stroke, isSelected) {
150
+ el.setAttribute('stroke', stroke);
151
+ el.setAttribute('stroke-width', isSelected ? '4' : '2');
152
+ el.setAttribute('fill', isSelected ? stroke : 'none');
153
+ el.setAttribute('fill-opacity', isSelected ? '0.35' : '0');
154
+ }
155
+ /** Draw the in-progress rectangle / path preview. */
156
+ drawDraft(draft, layer) {
157
+ if (draft.rect) {
158
+ const { x0, y0, x1, y1 } = draft.rect;
159
+ const el = svgEl('rect');
160
+ layer.place(el, (e, project) => {
161
+ const [lx, ly] = project(Math.min(x0, x1), Math.min(y0, y1));
162
+ const [rx, ry] = project(Math.max(x0, x1), Math.max(y0, y1));
163
+ e.setAttribute('x', `${lx}`);
164
+ e.setAttribute('y', `${ly}`);
165
+ e.setAttribute('width', `${Math.abs(rx - lx)}`);
166
+ e.setAttribute('height', `${Math.abs(ry - ly)}`);
167
+ });
168
+ this.styleDraft(el);
169
+ }
170
+ if (draft.path && draft.path.length) {
171
+ this.styleDraft(layer.poly('polyline', draft.path.map(([x, y]) => ({ x, y }))));
172
+ }
173
+ }
174
+ styleDraft(el) {
175
+ el.setAttribute('stroke', this.store.getShapeColor() || '#00ffff');
176
+ el.setAttribute('stroke-width', '2');
177
+ el.setAttribute('stroke-dasharray', '4 3');
178
+ el.setAttribute('fill', 'none');
179
+ el.setAttribute('vector-effect', 'non-scaling-stroke');
180
+ }
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN2Zy1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9yZWdpb24tb3ZlcmxheS9yZWdpb24tc3ZnLXJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUYsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxLQUFLLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU1RyxNQUFNLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQztBQUM1Qyx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQWdCN0I7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBS2xDLFlBQ21CLEdBQWtCLEVBQ2xCLEtBQWtCO1FBRGxCLFFBQUcsR0FBSCxHQUFHLENBQWU7UUFDbEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUxyQyxnR0FBZ0c7UUFDeEYsY0FBUyxHQUEwQixJQUFJLENBQUM7UUFNOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN6QyxXQUFXLEVBQUUsTUFBTTtZQUNuQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7WUFDckYsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDekUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsU0FBUyxDQUFDLE1BQWM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsT0FBMEIsRUFBRSxRQUEyQjtRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELDBGQUEwRjtJQUMxRixhQUFhLENBQUMsT0FBMEIsRUFBRSxRQUEyQixFQUFFLEtBQWtCO1FBQ3ZGLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLFdBQVcsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsaUNBQWlDO0lBQ3pCLFFBQVEsQ0FBQyxNQUFjO1FBQzdCLE9BQU8sTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsbUdBQW1HO0lBQzNGLFNBQVMsQ0FBQyxNQUFjLEVBQUUsS0FBa0I7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFBRSxPQUFPO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxzRkFBc0Y7SUFDOUUsV0FBVyxDQUFDLE1BQWMsRUFBRSxLQUFrQjtRQUNwRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFRLEVBQUU7WUFDbEQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDNUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDbEMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLElBQUksQ0FBQyxZQUFZLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQkFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUk7b0JBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5RSx5RkFBeUY7WUFDekYsMEZBQTBGO1lBQzFGLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDYixLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQzFELE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU07NEJBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3hFLElBQUksQ0FBQyxDQUFDLEtBQUs7NEJBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3hFLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs0RUFDd0U7SUFDaEUsZ0JBQWdCLENBQ3RCLEVBQVUsRUFDVixFQUFVLEVBQ1YsTUFBd0IsRUFDeEIsTUFBYyxFQUNkLEtBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUFFLE9BQU87UUFDakQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxLQUFLLENBQUMsRUFBYyxFQUFFLE1BQWMsRUFBRSxVQUFtQjtRQUMvRCxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQscURBQXFEO0lBQzdDLFNBQVMsQ0FBQyxLQUFrQixFQUFFLEtBQWtCO1FBQ3RELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDdEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUM3QixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FDYixLQUFLLENBQUMsSUFBSSxDQUNSLFVBQVUsRUFDVixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkMsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsRUFBYztRQUMvQixFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2x5Z29uLCBSZWN0YW5nbGUsIFJlZ2lvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IHJlZ2lvbkJCb3gsIHJpbmdIYW5kbGVzLCByaW5nT2YgfSBmcm9tICcuLi8uLi8uLi9yZWdpb24tb3ZlcmxheS9yZWdpb24tZ2VvbWV0cnknO1xuaW1wb3J0IHsgQWZmaW5lLCBTY3JlZW5MYXllciwgU3ZnUmVnaW9uUmVuZGVyZXIsIHN2Z0VsIH0gZnJvbSAnLi4vLi4vLi4vcmVnaW9uLW92ZXJsYXkvc3ZnLXJlZ2lvbi1yZW5kZXJlcic7XG5cbmNvbnN0IFNWR19OUyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4vKiogUmVuZGVyZWQgaGFuZGxlIHNpemUgKHNjcmVlbiBweCkuICovXG5leHBvcnQgY29uc3QgSEFORExFX1NJWkUgPSA3O1xuXG4vKiogQW4gYXhpcy1hbGlnbmVkIGJveCBmcm9tIGEgZHJhZydzIHN0YXJ0IHRvIGl0cyBjdXJyZW50IHBvaW50IChhbnkgb3JkZXIpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcmFnQm94IHtcbiAgeDA6IG51bWJlcjtcbiAgeTA6IG51bWJlcjtcbiAgeDE6IG51bWJlcjtcbiAgeTE6IG51bWJlcjtcbn1cblxuLyoqIEEgcmVnaW9uIGJlaW5nIGRyYXduOiBhIHJlY3RhbmdsZSBkcmFnLCBvciBhIGZyZWVoYW5kIC8gY2xpY2stcGxhY2VkIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lvbkRyYWZ0IHtcbiAgcmVjdDogRHJhZ0JveCB8IG51bGw7XG4gIHBhdGg6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+IHwgbnVsbDtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBuYXBhcmkgcmVnaW9uIG92ZXJsYXkgZHJhd3MsIG92ZXIgdGhlIHNoYXJlZCB7QGxpbmsgU3ZnUmVnaW9uUmVuZGVyZXJ9OiB0aGUgcmVnaW9uc1xuICogaW4gd29ybGQgY29vcmRpbmF0ZXMgKHN0eWxlZCBmcm9tIHRoZSBzdG9yZSdzIGNvbG91cnMsIGxhYmVsbGVkIHdoZW4gbGFiZWxzIGFyZSBvbiksIGFuZCBpblxuICogc2NyZWVuIHNwYWNlIHRoZSBzZWxlY3RlZCByZWdpb25zJyBncmFiIGhhbmRsZXMgKGNvcm5lcnMsIHZlcnRpY2VzLCBiw6l6aWVyIGNvbnRyb2wgcG9pbnRzKSxcbiAqIHRoZSBkcmFmdCBiZWluZyBkcmF3biBhbmQgdGhlIHJ1YmJlci1iYW5kIG1hcnF1ZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXBhcmlSZWdpb25TdmdSZW5kZXJlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFN2Z1JlZ2lvblJlbmRlcmVyO1xuICAvKiogRGVkaWNhdGVkIG1hcnF1ZWUgcmVjdCBlbGVtZW50LCB1cGRhdGVkIGRpcmVjdGx5IGR1cmluZyB0aGUgZHJhZyAobm8gZnVsbCByZWdpb24gcmVkcmF3KS4gKi9cbiAgcHJpdmF0ZSBtYXJxdWVlRWw6IFNWR1JlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdmc6IFNWR1NWR0VsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogUmVnaW9uU3RvcmUsXG4gICkge1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3ZnUmVnaW9uUmVuZGVyZXIoc3ZnLCB7XG4gICAgICByZWN0RWxlbWVudDogJ3JlY3QnLFxuICAgICAgc3R5bGVTaGFwZTogKGVsLCByZWdpb24sIHNlbGVjdGVkKSA9PiB0aGlzLnN0eWxlKGVsLCB0aGlzLnN0cm9rZU9mKHJlZ2lvbiksIHNlbGVjdGVkKSxcbiAgICAgIGRlY29yYXRlOiAocmVnaW9uLCBfaSwgX3NlbGVjdGVkLCBsYXllcikgPT4gdGhpcy5kcmF3TGFiZWwocmVnaW9uLCBsYXllciksXG4gICAgICBza2lwOiAocmVnaW9uKSA9PiAhIXJlZ2lvbi5pc1Byb2ZpbGU/LigpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEZvbGxvdyB0aGUgY2FtZXJhOiBvbmUgdHJhbnNmb3JtIGF0dHJpYnV0ZSBwbHVzIHRoZSBzY3JlZW4tc3BhY2UgZWxlbWVudHMuICovXG4gIHNldENhbWVyYShhZmZpbmU6IEFmZmluZSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2FtZXJhKGFmZmluZSk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgcmVnaW9ucyAod29ybGQgc3BhY2UpIGFuZCB0aGVpciBsYWJlbHMuICovXG4gIHJlbmRlcihyZWdpb25zOiByZWFkb25seSBSZWdpb25bXSwgc2VsZWN0ZWQ6IHJlYWRvbmx5IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIocmVnaW9ucywgc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHNjcmVlbi1zcGFjZSBvdmVybGF5IG9ubHk6IHRoZSBzZWxlY3RlZCByZWdpb25zJyBoYW5kbGVzIGFuZCB0aGUgZHJhZnQuICovXG4gIHJlbmRlck92ZXJsYXkocmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sIHNlbGVjdGVkOiByZWFkb25seSBudW1iZXJbXSwgZHJhZnQ6IFJlZ2lvbkRyYWZ0KTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXJPdmVybGF5KChsYXllcikgPT4ge1xuICAgICAgZm9yIChjb25zdCBpIG9mIHNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlZ2lvbnNbaV07XG4gICAgICAgIGlmIChyZWdpb24gJiYgIXJlZ2lvbi5pc1Byb2ZpbGU/LigpKSB0aGlzLmRyYXdIYW5kbGVzKHJlZ2lvbiwgbGF5ZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5kcmF3RHJhZnQoZHJhZnQsIGxheWVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZSBtYXJxdWVlIG92ZXIgc3ZnLWxvY2FsIGNvcm5lcnMgYChseCwgbHkpYOKAk2AocngsIHJ5KWAsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gKi9cbiAgc2hvd01hcnF1ZWUobHg6IG51bWJlciwgbHk6IG51bWJlciwgcng6IG51bWJlciwgcnk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXJxdWVlRWwgfHwgIXRoaXMubWFycXVlZUVsLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMubWFycXVlZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgJ3JlY3QnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJyM0ZGEzZmYnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgJzEnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsICc0IDMnKTtcbiAgICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjNGRhM2ZmJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjEyJyk7XG4gICAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ3ZlY3Rvci1lZmZlY3QnLCAnbm9uLXNjYWxpbmctc3Ryb2tlJyk7XG4gICAgICB0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0aGlzLm1hcnF1ZWVFbCk7XG4gICAgfVxuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgneCcsIGAke2x4fWApO1xuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgneScsIGAke2x5fWApO1xuICAgIHRoaXMubWFycXVlZUVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtNYXRoLmFicyhyeCAtIGx4KX1gKTtcbiAgICB0aGlzLm1hcnF1ZWVFbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke01hdGguYWJzKHJ5IC0gbHkpfWApO1xuICB9XG5cbiAgLyoqIFJlbW92ZSB0aGUgbWFycXVlZSBlbGVtZW50IGZyb20gdGhlIFNWRy4gKi9cbiAgY2xlYXJNYXJxdWVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcnF1ZWVFbD8ucGFyZW50Tm9kZSkgdGhpcy5tYXJxdWVlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1hcnF1ZWVFbCk7XG4gICAgdGhpcy5tYXJxdWVlRWwgPSBudWxsO1xuICB9XG5cbiAgLyoqIEEgcmVnaW9uJ3Mgb3V0bGluZSBjb2xvdXIuICovXG4gIHByaXZhdGUgc3Ryb2tlT2YocmVnaW9uOiBSZWdpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiByZWdpb24uY29sb3IgfHwgdGhpcy5zdG9yZS5nZXRTaGFwZUNvbG9yKCkgfHwgJyMwMGZmZmYnO1xuICB9XG5cbiAgLyoqIERyYXcgYSByZWdpb24ncyBjbGFzc2lmaWNhdGlvbiBsYWJlbCBhdCBpdHMgdG9wLWxlZnQsIHdoZW4gbGFiZWxzIGFyZSBlbmFibGVkIChtYXRjaGVzIE9TRCkuICovXG4gIHByaXZhdGUgZHJhd0xhYmVsKHJlZ2lvbjogUmVnaW9uLCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U2hvd1NoYXBlTGFiZWwoKSB8fCByZWdpb24uaXNQcm9maWxlPy4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IGxhYmVsID0gcmVnaW9uLmxhYmVsO1xuICAgIGNvbnN0IGJiID0gbGFiZWwgPyByZWdpb25CQm94KHJlZ2lvbikgOiBudWxsO1xuICAgIGlmICghbGFiZWwgfHwgIWJiKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IHN2Z0VsKCd0ZXh0Jyk7XG4gICAgdGV4dC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2ZmZicpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnIzAwMCcpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMycpO1xuICAgIHRleHQuc2V0QXR0cmlidXRlKCdwYWludC1vcmRlcicsICdzdHJva2UnKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgnZm9udCcsICcxMnB4IHNhbnMtc2VyaWYnKTtcbiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgIHRleHQudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICBsYXllci5hdCh0ZXh0LCBiYi54MCwgYmIueTAsIHsgZHk6IC00IH0pO1xuICB9XG5cbiAgLyoqIERyYXcgZ3JhYiBoYW5kbGVzIGZvciBhIHNlbGVjdGVkIHJlZ2lvbjogcmVjdGFuZ2xlIGNvcm5lcnMgb3IgcG9seWdvbiB2ZXJ0aWNlcy4gKi9cbiAgcHJpdmF0ZSBkcmF3SGFuZGxlcyhyZWdpb246IFJlZ2lvbiwgbGF5ZXI6IFNjcmVlbkxheWVyKTogdm9pZCB7XG4gICAgY29uc3QgYiA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgaWYgKCFiKSByZXR1cm47XG4gICAgY29uc3Qgc3Ryb2tlID0gdGhpcy5zdHJva2VPZihyZWdpb24pO1xuICAgIGNvbnN0IGhhbmRsZSA9IChpbWdYOiBudW1iZXIsIGltZ1k6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZWwgPSBzdmdFbCgncmVjdCcpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke0hBTkRMRV9TSVpFfWApO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtIQU5ETEVfU0laRX1gKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsICcjZmZmJyk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxLjUnKTtcbiAgICAgIGxheWVyLmF0KGVsLCBpbWdYLCBpbWdZLCB7IGR4OiAtSEFORExFX1NJWkUgLyAyLCBkeTogLUhBTkRMRV9TSVpFIC8gMiB9KTtcbiAgICB9O1xuICAgIGlmIChiIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7XG4gICAgICBoYW5kbGUoYi54LCBiLnkpO1xuICAgICAgaGFuZGxlKGIueCArIGIud2lkdGgsIGIueSk7XG4gICAgICBoYW5kbGUoYi54LCBiLnkgKyBiLmhlaWdodCk7XG4gICAgICBoYW5kbGUoYi54ICsgYi53aWR0aCwgYi55ICsgYi5oZWlnaHQpO1xuICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYi5ucG9pbnRzOyBpKyspIGhhbmRsZShiLnhwb2ludHNbaV0sIGIueXBvaW50c1tpXSk7XG4gICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgYi5ob2xlcyA/PyBbXSkgZm9yIChjb25zdCBbaHgsIGh5XSBvZiByaW5nKSBoYW5kbGUoaHgsIGh5KTtcbiAgICAgIC8vIEJlemllciByZWdpb25zIGFsc28gZXhwb3NlIHRoZWlyIHRhbmdlbnQgY29udHJvbCBwb2ludHMgKGNpcmNsZXMpIGpvaW5lZCB0byB0aGUgYW5jaG9yXG4gICAgICAvLyBieSBhIHRoaW4gbGluZSwgbWF0Y2hpbmcgdGhlIE9TRCBvdmVybGF5J3MgZWRpdGFibGUgYmV6aWVyIGhhbmRsZXMuIFN0b3JlZCBoYW5kbGVzIHdoZW5cbiAgICAgIC8vIHByZXNlbnQsIGVsc2UgdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgdGhlIGN1cnZlIGlzIGRyYXduIHdpdGguXG4gICAgICBpZiAoYi5iZXppZXIpIHtcbiAgICAgICAgZm9yIChsZXQgcmluZyA9IC0xOyByaW5nIDwgKGIuaG9sZXM/Lmxlbmd0aCA/PyAwKTsgcmluZysrKSB7XG4gICAgICAgICAgY29uc3QgeyB4cywgeXMgfSA9IHJpbmdPZihiLCByaW5nKTtcbiAgICAgICAgICByaW5nSGFuZGxlcyhiLCByaW5nKS5mb3JFYWNoKChoLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaC5oYXNPdXQpIHRoaXMuZHJhd0JlemllckhhbmRsZSh4c1tpXSwgeXNbaV0sIGgub3V0LCBzdHJva2UsIGxheWVyKTtcbiAgICAgICAgICAgIGlmIChoLmhhc0luKSB0aGlzLmRyYXdCZXppZXJIYW5kbGUoeHNbaV0sIHlzW2ldLCBoLmluLCBzdHJva2UsIGxheWVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBEcmF3IG9uZSBiZXppZXIgY29udHJvbCBwb2ludCBhcyBhIHNtYWxsIGNpcmNsZSBjb25uZWN0ZWQgdG8gaXRzIGFuY2hvciBieSBhIHRhbmdlbnQgbGluZS5cbiAgICogIGBoYW5kbGVgIGlzIHRoZSBjb250cm9sIHBvaW50J3MgYWJzb2x1dGUgcG9zaXRpb24gaW4gaW1hZ2Ugc3BhY2UuICovXG4gIHByaXZhdGUgZHJhd0JlemllckhhbmRsZShcbiAgICBheDogbnVtYmVyLFxuICAgIGF5OiBudW1iZXIsXG4gICAgaGFuZGxlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cm9rZTogc3RyaW5nLFxuICAgIGxheWVyOiBTY3JlZW5MYXllcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKGhhbmRsZVswXSA9PT0gYXggJiYgaGFuZGxlWzFdID09PSBheSkgcmV0dXJuO1xuICAgIGNvbnN0IGxpbmUgPSBsYXllci5saW5lKGF4LCBheSwgaGFuZGxlWzBdLCBoYW5kbGVbMV0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2UnLCBzdHJva2UpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMScpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utb3BhY2l0eScsICcwLjcnKTtcbiAgICBjb25zdCBkb3QgPSBzdmdFbCgnY2lyY2xlJyk7XG4gICAgZG90LnNldEF0dHJpYnV0ZSgncicsIGAke0hBTkRMRV9TSVpFIC8gMn1gKTtcbiAgICBkb3Quc2V0QXR0cmlidXRlKCdmaWxsJywgc3Ryb2tlKTtcbiAgICBkb3Quc2V0QXR0cmlidXRlKCdzdHJva2UnLCAnI2ZmZicpO1xuICAgIGRvdC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICcxJyk7XG4gICAgbGF5ZXIuYXQoZG90LCBoYW5kbGVbMF0sIGhhbmRsZVsxXSwgeyB4OiAnY3gnLCB5OiAnY3knIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZShlbDogU1ZHRWxlbWVudCwgc3Ryb2tlOiBzdHJpbmcsIGlzU2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0cm9rZSk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBpc1NlbGVjdGVkID8gJzQnIDogJzInKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBpc1NlbGVjdGVkID8gc3Ryb2tlIDogJ25vbmUnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsIGlzU2VsZWN0ZWQgPyAnMC4zNScgOiAnMCcpO1xuICB9XG5cbiAgLyoqIERyYXcgdGhlIGluLXByb2dyZXNzIHJlY3RhbmdsZSAvIHBhdGggcHJldmlldy4gKi9cbiAgcHJpdmF0ZSBkcmF3RHJhZnQoZHJhZnQ6IFJlZ2lvbkRyYWZ0LCBsYXllcjogU2NyZWVuTGF5ZXIpOiB2b2lkIHtcbiAgICBpZiAoZHJhZnQucmVjdCkge1xuICAgICAgY29uc3QgeyB4MCwgeTAsIHgxLCB5MSB9ID0gZHJhZnQucmVjdDtcbiAgICAgIGNvbnN0IGVsID0gc3ZnRWwoJ3JlY3QnKTtcbiAgICAgIGxheWVyLnBsYWNlKGVsLCAoZSwgcHJvamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBbbHgsIGx5XSA9IHByb2plY3QoTWF0aC5taW4oeDAsIHgxKSwgTWF0aC5taW4oeTAsIHkxKSk7XG4gICAgICAgIGNvbnN0IFtyeCwgcnldID0gcHJvamVjdChNYXRoLm1heCh4MCwgeDEpLCBNYXRoLm1heCh5MCwgeTEpKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHtseH1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3knLCBgJHtseX1gKTtcbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgYCR7TWF0aC5hYnMocnggLSBseCl9YCk7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtNYXRoLmFicyhyeSAtIGx5KX1gKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdHlsZURyYWZ0KGVsKTtcbiAgICB9XG4gICAgaWYgKGRyYWZ0LnBhdGggJiYgZHJhZnQucGF0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3R5bGVEcmFmdChcbiAgICAgICAgbGF5ZXIucG9seShcbiAgICAgICAgICAncG9seWxpbmUnLFxuICAgICAgICAgIGRyYWZ0LnBhdGgubWFwKChbeCwgeV0pID0+ICh7IHgsIHkgfSkpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0eWxlRHJhZnQoZWw6IFNWR0VsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuc3RvcmUuZ2V0U2hhcGVDb2xvcigpIHx8ICcjMDBmZmZmJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsICc0IDMnKTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgndmVjdG9yLWVmZmVjdCcsICdub24tc2NhbGluZy1zdHJva2UnKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,30 @@
1
+ import { isCategoricalColumn } from '../../../contracts/spatial-dataset.contract';
2
+ import { cellTypeColumnFor } from '../../../spatial/lod';
3
+ /**
4
+ * The categorical columns the cells, the transcripts and the hover all read: the cell-type
5
+ * column's codes, and which of its groups the user switched off. A failed request rejects;
6
+ * the caller decides whether that fails its group of the plan or degrades to "no types".
7
+ */
8
+ export class CategoricalLookup {
9
+ constructor(port) {
10
+ this.port = port;
11
+ }
12
+ /** Codes of the column `name`, or null when it is not categorical. */
13
+ async codes(name) {
14
+ const column = await this.port.getColumn(name);
15
+ return isCategoricalColumn(column) ? { codes: column.codes, meta: column.meta } : null;
16
+ }
17
+ /** Codes of the group column that are switched off, or null when none are. */
18
+ async hiddenCodes(dataset, view) {
19
+ if (!view.hiddenGroups.length)
20
+ return null;
21
+ const name = cellTypeColumnFor(dataset, view);
22
+ const col = name ? await this.codes(name) : null;
23
+ if (!col || col.meta.kind !== 'categorical')
24
+ return null;
25
+ const off = new Set(view.hiddenGroups);
26
+ const hidden = Uint8Array.from(col.meta.categories, (c) => (off.has(c) ? 1 : 0));
27
+ return { codes: col.codes, hidden };
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcmljYWwtbG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL3NwYXRpYWwtdGlsZXMvY2F0ZWdvcmljYWwtbG9va3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBaUMsbUJBQW1CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNqSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWN6RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUE2QixJQUFxQjtRQUFyQixTQUFJLEdBQUosSUFBSSxDQUFpQjtJQUFHLENBQUM7SUFFdEQsc0VBQXNFO0lBQ3RFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBWTtRQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pGLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUF1QixFQUFFLElBQXNCO1FBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBpc0NhdGVnb3JpY2FsQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uLy4uL3NwYXRpYWwvbG9kJztcblxuLyoqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgcGVyLW9ic2VydmF0aW9uIGNvZGVzIGFuZCBpdHMgbWV0YWRhdGEgKGNhdGVnb3JpZXMsIGNvbG91cnMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWNhbENvZGVzIHtcbiAgY29kZXM6IFVpbnQxNkFycmF5O1xuICBtZXRhOiBTcGF0aWFsQ29sdW1uWydtZXRhJ107XG59XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gZ3JvdXAgY29kZXMsIGFuZCB3aGljaCBjb2RlcyBhcmUgc3dpdGNoZWQgb2ZmICgxKSBpbiB0aGUgZ3JvdXAgbGlzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlkZGVuQ29kZXMge1xuICBjb2RlczogVWludDE2QXJyYXk7XG4gIGhpZGRlbjogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBUaGUgY2F0ZWdvcmljYWwgY29sdW1ucyB0aGUgY2VsbHMsIHRoZSB0cmFuc2NyaXB0cyBhbmQgdGhlIGhvdmVyIGFsbCByZWFkOiB0aGUgY2VsbC10eXBlXG4gKiBjb2x1bW4ncyBjb2RlcywgYW5kIHdoaWNoIG9mIGl0cyBncm91cHMgdGhlIHVzZXIgc3dpdGNoZWQgb2ZmLiBBIGZhaWxlZCByZXF1ZXN0IHJlamVjdHM7XG4gKiB0aGUgY2FsbGVyIGRlY2lkZXMgd2hldGhlciB0aGF0IGZhaWxzIGl0cyBncm91cCBvZiB0aGUgcGxhbiBvciBkZWdyYWRlcyB0byBcIm5vIHR5cGVzXCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbExvb2t1cCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0KSB7fVxuXG4gIC8qKiBDb2RlcyBvZiB0aGUgY29sdW1uIGBuYW1lYCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5vdCBjYXRlZ29yaWNhbC4gKi9cbiAgYXN5bmMgY29kZXMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxDYXRlZ29yaWNhbENvZGVzIHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRoaXMucG9ydC5nZXRDb2x1bW4obmFtZSk7XG4gICAgcmV0dXJuIGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSA/IHsgY29kZXM6IGNvbHVtbi5jb2RlcywgbWV0YTogY29sdW1uLm1ldGEgfSA6IG51bGw7XG4gIH1cblxuICAvKiogQ29kZXMgb2YgdGhlIGdyb3VwIGNvbHVtbiB0aGF0IGFyZSBzd2l0Y2hlZCBvZmYsIG9yIG51bGwgd2hlbiBub25lIGFyZS4gKi9cbiAgYXN5bmMgaGlkZGVuQ29kZXMoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPEhpZGRlbkNvZGVzIHwgbnVsbD4ge1xuICAgIGlmICghdmlldy5oaWRkZW5Hcm91cHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBuYW1lID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgY29uc3QgY29sID0gbmFtZSA/IGF3YWl0IHRoaXMuY29kZXMobmFtZSkgOiBudWxsO1xuICAgIGlmICghY29sIHx8IGNvbC5tZXRhLmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy5oaWRkZW5Hcm91cHMpO1xuICAgIGNvbnN0IGhpZGRlbiA9IFVpbnQ4QXJyYXkuZnJvbShjb2wubWV0YS5jYXRlZ29yaWVzLCAoYykgPT4gKG9mZi5oYXMoYykgPyAxIDogMCkpO1xuICAgIHJldHVybiB7IGNvZGVzOiBjb2wuY29kZXMsIGhpZGRlbiB9O1xuICB9XG59XG4iXX0=