@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,3 +1,4 @@
1
+ import { pointInRing as ringContainsPoint, ringBounds } from '../geometry/ring';
1
2
  /** An empty selection over `count` observations. */
2
3
  export function emptySelection(count = 0) {
3
4
  return { mask: new Uint8Array(count), count: 0 };
@@ -32,35 +33,14 @@ export function mutedFromSelection(selection) {
32
33
  muted[i] = selection.mask[i] ? 0 : 1;
33
34
  return muted;
34
35
  }
35
- /** Even-odd ray cast: is (px, py) inside the closed ring xs/ys? */
36
+ /**
37
+ * Even-odd ray cast: is (px, py) inside the closed ring xs/ys?
38
+ *
39
+ * Public API kept with its (ring, point) argument order; the test itself is
40
+ * the shared `geometry/ring` one the region overlays and tools use.
41
+ */
36
42
  export function pointInRing(xs, ys, px, py) {
37
- let inside = false;
38
- const n = xs.length;
39
- for (let i = 0, j = n - 1; i < n; j = i++) {
40
- const yi = ys[i];
41
- const yj = ys[j];
42
- // Half-open comparison so a vertex on the ray is counted once, not twice.
43
- if ((yi > py) !== (yj > py)) {
44
- const t = (py - yi) / (yj - yi);
45
- if (px < xs[i] + t * (xs[j] - xs[i]))
46
- inside = !inside;
47
- }
48
- }
49
- return inside;
50
- }
51
- function ringBounds(xs, ys) {
52
- let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
53
- for (let i = 0; i < xs.length; i++) {
54
- if (xs[i] < minX)
55
- minX = xs[i];
56
- if (xs[i] > maxX)
57
- maxX = xs[i];
58
- if (ys[i] < minY)
59
- minY = ys[i];
60
- if (ys[i] > maxY)
61
- maxY = ys[i];
62
- }
63
- return { minX, minY, maxX, maxY };
43
+ return ringContainsPoint(px, py, xs, ys);
64
44
  }
65
45
  function inBounds(b, px, py) {
66
46
  return px >= b.minX && px <= b.maxX && py >= b.minY && py <= b.maxY;
@@ -70,6 +50,15 @@ function polygonShape(xs, ys, holes) {
70
50
  if (xs.length < 3)
71
51
  return null;
72
52
  const bounds = ringBounds(xs, ys);
53
+ // Split and bounded ONCE per shape: the hit test runs for every candidate point
54
+ // inside the exterior — up to millions of cells per selection.
55
+ const holeRings = (holes ?? [])
56
+ .filter((ring) => ring.length >= 3)
57
+ .map((ring) => {
58
+ const hx = ring.map((p) => p[0]);
59
+ const hy = ring.map((p) => p[1]);
60
+ return { xs: hx, ys: hy, bounds: ringBounds(hx, hy) };
61
+ });
73
62
  return {
74
63
  bounds,
75
64
  hit: (px, py) => {
@@ -77,11 +66,9 @@ function polygonShape(xs, ys, holes) {
77
66
  return false;
78
67
  // The region model is explicit: a point inside the exterior AND inside a
79
68
  // hole is OUTSIDE the region.
80
- for (const ring of holes ?? []) {
81
- if (ring.length >= 3
82
- && pointInRing(ring.map((p) => p[0]), ring.map((p) => p[1]), px, py)) {
69
+ for (const hole of holeRings) {
70
+ if (inBounds(hole.bounds, px, py) && pointInRing(hole.xs, hole.ys, px, py))
83
71
  return false;
84
- }
85
72
  }
86
73
  return true;
87
74
  },
@@ -123,18 +110,6 @@ export function regionShapes(region) {
123
110
  }
124
111
  return [];
125
112
  }
126
- /**
127
- * Observations inside ANY of `regions` (union). Coordinates are transformed by
128
- * `imageRef` first, so the test happens in the same world space the regions were
129
- * drawn in.
130
- *
131
- * `candidates`, when given, restricts the test to those observation indices — how
132
- * a 2D view of a 3D dataset keeps a drawn region meaning what it looks like it
133
- * means: the shape was drawn over ONE section, so it selects that section's cells
134
- * rather than the whole depth of the specimen behind them. The returned mask stays
135
- * indexed by observation, so every consumer (charts, legend, the 3D cloud) reads it
136
- * the same way.
137
- */
138
113
  /**
139
114
  * A selection from an explicit list of observation indices.
140
115
  *
@@ -157,6 +132,18 @@ export function selectByIndices(indices, observationCount) {
157
132
  }
158
133
  return { mask, count };
159
134
  }
135
+ /**
136
+ * Observations inside ANY of `regions` (union). Coordinates are transformed by
137
+ * `imageRef` first, so the test happens in the same world space the regions were
138
+ * drawn in.
139
+ *
140
+ * `candidates`, when given, restricts the test to those observation indices — how
141
+ * a 2D view of a 3D dataset keeps a drawn region meaning what it looks like it
142
+ * means: the shape was drawn over ONE section, so it selects that section's cells
143
+ * rather than the whole depth of the specimen behind them. The returned mask stays
144
+ * indexed by observation, so every consumer (charts, legend, the 3D cloud) reads it
145
+ * the same way.
146
+ */
160
147
  export function selectInRegions(observations, imageRef, regions, candidates) {
161
148
  const n = observations.count;
162
149
  const mask = new Uint8Array(n);
@@ -228,7 +215,6 @@ export function selectInRegionsProjected(screen, count, regions) {
228
215
  }
229
216
  return { mask, count: hits };
230
217
  }
231
- /** Every observation whose categorical code equals `code` — the legend click. */
232
218
  /**
233
219
  * Whether two selections hold exactly the same observations.
234
220
  *
@@ -250,6 +236,7 @@ export function sameSelection(a, b) {
250
236
  }
251
237
  return true;
252
238
  }
239
+ /** Every observation whose categorical code equals `code` — the legend click. */
253
240
  export function selectByCategory(codes, code) {
254
241
  const mask = new Uint8Array(codes.length);
255
242
  let count = 0;
@@ -261,4 +248,4 @@ export function selectByCategory(codes, code) {
261
248
  }
262
249
  return { mask, count };
263
250
  }
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNkJBLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUErQjtJQUNoRSxJQUFJ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b3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5cbi8qKlxuICogV2hpY2ggb2JzZXJ2YXRpb25zIGZhbGwgaW5zaWRlIGEgc2V0IG9mIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogUHVyZSwgbGlrZSBgc3BhdGlhbC1lbmNvZGluZy50c2Ag4oCUIG5vIHN0b3JlLCBubyByZW5kZXJlciDigJQgc28gdGhlIGdlb21ldHJ5IGlzXG4gKiB0ZXN0YWJsZSBvbiBpdHMgb3duLlxuICpcbiAqIFdIWSBUSElTIElTIFRIRSBXSE9MRSBTRUxFQ1RJT04gTUVDSEFOSVNNXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogUmVnaW9ucyBhbHJlYWR5IGNvbWUgZnJvbSBldmVyeSBvbi1jYW52YXMgdG9vbCB0aGUgbGlicmFyeSBoYXM6IHJlY3RhbmdsZSxcbiAqIHBvbHlnb24sIGZyZWVoYW5kLCBtYWdpYyB3YW5kLCBicnVzaC4gVGVzdGluZyBvYnNlcnZhdGlvbnMgYWdhaW5zdCB0aGVtIHR1cm5zXG4gKiBhbGwgb2YgdGhvc2UgaW50byBzcGF0aWFsLW9taWNzIHNlbGVjdGlvbiB0b29scyB3aXRob3V0IGFkZGluZyBhIHNpbmdsZSBuZXdcbiAqIGNhbnZhcyBpbnRlcmFjdGlvbiDigJQgd2hpY2ggaXMgd2h5IHRoZXJlIGlzIG5vIGJlc3Bva2UgbWFycXVlZSBoZXJlLlxuICpcbiAqIENPT1JESU5BVEUgRlJBTUVTXG4gKiAtLS0tLS0tLS0tLS0tLS0tLVxuICogUmVnaW9ucyBhcmUgZHJhd24gaW4gV09STEQgKGltYWdlKSBjb29yZGluYXRlcy4gT2JzZXJ2YXRpb25zIGxpdmUgaW4gdGhlXG4gKiBkYXRhc2V0J3Mgb3duIGZyYW1lIGFuZCByZWFjaCB0aGUgd29ybGQgdGhyb3VnaCBgaW1hZ2VSZWZgIOKAlCBzbyB0aGV5IGFyZVxuICogdHJhbnNmb3JtZWQgZm9yd2FyZCBiZWZvcmUgdGVzdGluZywgbWF0Y2hpbmcgZXhhY3RseSB3aGF0IHRoZSByZW5kZXJlciBkcmF3cy5cbiAqL1xuXG4vKiogQSBzZWxlY3Rpb24gb3ZlciBOIG9ic2VydmF0aW9uczogYG1hc2tbaV0gPT09IDFgIHdoZW4gaSBpcyBzZWxlY3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBtYXNrOiBVaW50OEFycmF5O1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqIEV2ZW4tb2RkIHJheSBjYXN0OiBpcyAocHgsIHB5KSBpbnNpZGUgdGhlIGNsb3NlZCByaW5nIHhzL3lzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBuIC0gMTsgaSA8IG47IGogPSBpKyspIHtcbiAgICBjb25zdCB5aSA9IHlzW2ldO1xuICAgIGNvbnN0IHlqID0geXNbal07XG4gICAgLy8gSGFsZi1vcGVuIGNvbXBhcmlzb24gc28gYSB2ZXJ0ZXggb24gdGhlIHJheSBpcyBjb3VudGVkIG9uY2UsIG5vdCB0d2ljZS5cbiAgICBpZiAoKHlpID4gcHkpICE9PSAoeWogPiBweSkpIHtcbiAgICAgIGNvbnN0IHQgPSAocHkgLSB5aSkgLyAoeWogLSB5aSk7XG4gICAgICBpZiAocHggPCB4c1tpXSArIHQgKiAoeHNbal0gLSB4c1tpXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnNpZGU7XG59XG5cbi8qKiBBeGlzLWFsaWduZWQgYm91bmRzIG9mIGEgcmluZywgZm9yIGEgY2hlYXAgcmVqZWN0IGJlZm9yZSB0aGUgcmF5IGNhc3QuICovXG5pbnRlcmZhY2UgQm91bmRzIHsgbWluWDogbnVtYmVyOyBtaW5ZOiBudW1iZXI7IG1heFg6IG51bWJlcjsgbWF4WTogbnVtYmVyIH1cblxuZnVuY3Rpb24gcmluZ0JvdW5kcyh4czogcmVhZG9ubHkgbnVtYmVyW10sIHlzOiByZWFkb25seSBudW1iZXJbXSk6IEJvdW5kcyB7XG4gIGxldCBtaW5YID0gSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4c1tpXSA8IG1pblgpIG1pblggPSB4c1tpXTtcbiAgICBpZiAoeHNbaV0gPiBtYXhYKSBtYXhYID0geHNbaV07XG4gICAgaWYgKHlzW2ldIDwgbWluWSkgbWluWSA9IHlzW2ldO1xuICAgIGlmICh5c1tpXSA+IG1heFkpIG1heFkgPSB5c1tpXTtcbiAgfVxuICByZXR1cm4geyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH07XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZShcbiAgeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGhvbGVzPzogbnVtYmVyW11bXVtdLFxuKTogU2hhcGUgfCBudWxsIHtcbiAgaWYgKHhzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICBjb25zdCBib3VuZHMgPSByaW5nQm91bmRzKHhzLCB5cyk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCByaW5nIG9mIGhvbGVzID8/IFtdKSB7XG4gICAgICAgIGlmIChyaW5nLmxlbmd0aCA+PSAzXG4gICAgICAgICAgJiYgcG9pbnRJblJpbmcocmluZy5tYXAoKHApID0+IHBbMF0pLCByaW5nLm1hcCgocCkgPT4gcFsxXSksIHB4LCBweSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhcyB7XG4gICAgeD86IG51bWJlcjsgeT86IG51bWJlcjsgd2lkdGg/OiBudW1iZXI7IGhlaWdodD86IG51bWJlcjtcbiAgICB4cG9pbnRzPzogbnVtYmVyW107IHlwb2ludHM/OiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICB9IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBPYnNlcnZhdGlvbnMgaW5zaWRlIEFOWSBvZiBgcmVnaW9uc2AgKHVuaW9uKS4gQ29vcmRpbmF0ZXMgYXJlIHRyYW5zZm9ybWVkIGJ5XG4gKiBgaW1hZ2VSZWZgIGZpcnN0LCBzbyB0aGUgdGVzdCBoYXBwZW5zIGluIHRoZSBzYW1lIHdvcmxkIHNwYWNlIHRoZSByZWdpb25zIHdlcmVcbiAqIGRyYXduIGluLlxuICpcbiAqIGBjYW5kaWRhdGVzYCwgd2hlbiBnaXZlbiwgcmVzdHJpY3RzIHRoZSB0ZXN0IHRvIHRob3NlIG9ic2VydmF0aW9uIGluZGljZXMg4oCUIGhvd1xuICogYSAyRCB2aWV3IG9mIGEgM0QgZGF0YXNldCBrZWVwcyBhIGRyYXduIHJlZ2lvbiBtZWFuaW5nIHdoYXQgaXQgbG9va3MgbGlrZSBpdFxuICogbWVhbnM6IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkUgc2VjdGlvbiwgc28gaXQgc2VsZWN0cyB0aGF0IHNlY3Rpb24ncyBjZWxsc1xuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGRlcHRoIG9mIHRoZSBzcGVjaW1lbiBiZWhpbmQgdGhlbS4gVGhlIHJldHVybmVkIG1hc2sgc3RheXNcbiAqIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIHNvIGV2ZXJ5IGNvbnN1bWVyIChjaGFydHMsIGxlZ2VuZCwgdGhlIDNEIGNsb3VkKSByZWFkcyBpdFxuICogdGhlIHNhbWUgd2F5LlxuICovXG4vKipcbiAqIEEgc2VsZWN0aW9uIGZyb20gYW4gZXhwbGljaXQgbGlzdCBvZiBvYnNlcnZhdGlvbiBpbmRpY2VzLlxuICpcbiAqIFdoYXQgYSBsYXNzbyBpbiBhIGxpbmtlZCBwbG90IHByb2R1Y2VzOiB0aGUgcGxvdCBrbm93cyB3aGljaCBwb2ludHMgdGhlIHVzZXIgZHJld1xuICogYXJvdW5kLCBhbmQgdGhlIG1hcCBuZWVkcyB0aGF0IGFzIGEgbWFzayBvdmVyIEFMTCBvYnNlcnZhdGlvbnMuIE91dC1vZi1yYW5nZSBhbmRcbiAqIGR1cGxpY2F0ZSBpbmRpY2VzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkIOKAlCBhIHBsb3QgbWF5IGhhbmQgYmFjayB0aGUgc2FtZVxuICogcG9pbnQgdHdpY2UsIGFuZCBhIHN0YWxlIGluZGV4IGZyb20gYSBwbG90IGRyYXduIGJlZm9yZSBhIGRhdGFzZXQgY2hhbmdlIG11c3Qgbm90XG4gKiB0aHJvdyBpbiB0aGUgbWlkZGxlIG9mIGEgc2VsZWN0aW9uIGdlc3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUluZGljZXMoXG4gIGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUNhdGVnb3J5KGNvZGVzOiBVaW50MTZBcnJheSwgY29kZTogbnVtYmVyKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMubGVuZ3RoKTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjb2Rlc1tpXSA9PT0gY29kZSkge1xuICAgICAgbWFza1tpXSA9IDE7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuIl19
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF3QixXQUFXLElBQUksaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUEwQnRHLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUErQjtJQUNoRSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFxQixFQUFFLEVBQXFCLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDOUYsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxFQUFVO0lBQ2pELE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdEUsQ0FBQztBQVFELHNFQUFzRTtBQUN0RSxTQUFTLFlBQVksQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLEtBQW9CO0lBQ3BFLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxnRkFBZ0Y7SUFDaEYsK0RBQStEO0lBQy9ELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztTQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1NBQ2xDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ1osTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTztRQUNMLE1BQU07UUFDTixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMvQyx5RUFBeUU7WUFDekUsOEJBQThCO1lBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQzdCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMzRixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFjO0lBQ3pDLHNFQUFzRTtJQUN0RSxJQUFLLE1BQXVDLEVBQUUsSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM1RSxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFhTCxDQUFDO0lBQ2QsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUVsQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzlCLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDMUYsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUs7WUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztRQUNwRSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQiwrREFBK0Q7UUFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUF5QixFQUFFLGdCQUF3QjtJQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksZ0JBQWdCO1lBQUUsU0FBUztRQUNyRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLFlBQWlDLEVBQ2pDLFFBQXFDLEVBQ3JDLE9BQTBCLEVBQzFCLFVBQXdCO0lBRXhCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVuRCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDdkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQix3RUFBd0U7WUFDeEUsd0RBQXdEO1lBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUFFLFNBQVM7WUFDOUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLEtBQUssRUFBRSxDQUFDO2dCQUNSLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxNQUFvQixFQUNwQixLQUFhLEVBQ2IsT0FBMEI7SUFFMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVuRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUFFLFNBQVM7UUFDM0QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFBRSxTQUFTO1lBQzlDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDWixJQUFJLEVBQUUsQ0FBQztnQkFDUCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQXVCLEVBQUUsQ0FBdUI7SUFDNUUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QywwRUFBMEU7UUFDMUUsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFrQixFQUFFLElBQVk7SUFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zLCBTcGF0aWFsU2VsZWN0aW9uTWFzayB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZnVuY3Rpb24gaW5Cb3VuZHMoYjogQm91bmRzLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBweCA+PSBiLm1pblggJiYgcHggPD0gYi5tYXhYICYmIHB5ID49IGIubWluWSAmJiBweSA8PSBiLm1heFk7XG59XG5cbi8qKiBBIHJlZ2lvbiBmbGF0dGVuZWQgdG8gc29tZXRoaW5nIHRlc3RhYmxlOiBib3VuZHMgKyBhIGhpdCB0ZXN0LiAqL1xuaW50ZXJmYWNlIFNoYXBlIHtcbiAgYm91bmRzOiBCb3VuZHM7XG4gIGhpdChweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbjtcbn1cblxuLyoqIFBvbHlnb24td2l0aC1ob2xlczogaW5zaWRlIHRoZSBleHRlcmlvciBhbmQgb3V0c2lkZSBldmVyeSBob2xlLiAqL1xuZnVuY3Rpb24gcG9seWdvblNoYXBlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBob2xlcz86IG51bWJlcltdW11bXSk6IFNoYXBlIHwgbnVsbCB7XG4gIGlmICh4cy5sZW5ndGggPCAzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYm91bmRzID0gcmluZ0JvdW5kcyh4cywgeXMpO1xuICAvLyBTcGxpdCBhbmQgYm91bmRlZCBPTkNFIHBlciBzaGFwZTogdGhlIGhpdCB0ZXN0IHJ1bnMgZm9yIGV2ZXJ5IGNhbmRpZGF0ZSBwb2ludFxuICAvLyBpbnNpZGUgdGhlIGV4dGVyaW9yIOKAlCB1cCB0byBtaWxsaW9ucyBvZiBjZWxscyBwZXIgc2VsZWN0aW9uLlxuICBjb25zdCBob2xlUmluZ3MgPSAoaG9sZXMgPz8gW10pXG4gICAgLmZpbHRlcigocmluZykgPT4gcmluZy5sZW5ndGggPj0gMylcbiAgICAubWFwKChyaW5nKSA9PiB7XG4gICAgICBjb25zdCBoeCA9IHJpbmcubWFwKChwKSA9PiBwWzBdKTtcbiAgICAgIGNvbnN0IGh5ID0gcmluZy5tYXAoKHApID0+IHBbMV0pO1xuICAgICAgcmV0dXJuIHsgeHM6IGh4LCB5czogaHksIGJvdW5kczogcmluZ0JvdW5kcyhoeCwgaHkpIH07XG4gICAgfSk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCBob2xlIG9mIGhvbGVSaW5ncykge1xuICAgICAgICBpZiAoaW5Cb3VuZHMoaG9sZS5ib3VuZHMsIHB4LCBweSkgJiYgcG9pbnRJblJpbmcoaG9sZS54cywgaG9sZS55cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgcmVnaW9uIHRvIHRlc3RhYmxlIHNoYXBlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgYW55dGhpbmcgdGhhdFxuICogZW5jbG9zZXMgbm8gYXJlYSDigJQgYW4gb3BlbiBwb2x5bGluZSwgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSwgYSBkZWdlbmVyYXRlXG4gKiByZWN0YW5nbGUg4oCUIHNvIHRob3NlIG5ldmVyIGNvbnRyaWJ1dGUgdG8gYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25TaGFwZXMocmVnaW9uOiBSZWdpb24pOiBTaGFwZVtdIHtcbiAgLy8gUHJvZmlsZSBsaW5lcyBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGFubm90YXRpb24gc2V0LlxuICBpZiAoKHJlZ2lvbiBhcyB1bmtub3duIGFzIHsga2luZD86IHN0cmluZyB9KT8ua2luZCA9PT0gJ3Byb2ZpbGUnKSByZXR1cm4gW107XG4gIGNvbnN0IGIgPSByZWdpb24/LmJvdW5kcyBhcyB1bmtub3duIGFzXG4gICAgfCB7XG4gICAgICAgIHg/OiBudW1iZXI7XG4gICAgICAgIHk/OiBudW1iZXI7XG4gICAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgICAgICBjbG9zZWQ/OiBib29sZWFuO1xuICAgICAgICBob2xlcz86IG51bWJlcltdW11bXTtcbiAgICAgICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICAgICAgfVxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAoIWIpIHJldHVybiBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShiLnBvbHlnb25zKSkge1xuICAgIHJldHVybiBiLnBvbHlnb25zLmZsYXRNYXAoKHApID0+XG4gICAgICBwLmNsb3NlZCA9PT0gZmFsc2UgPyBbXSA6IChwb2x5Z29uU2hhcGUocC54cG9pbnRzID8/IFtdLCBwLnlwb2ludHMgPz8gW10sIHAuaG9sZXMpID8/IFtdKSxcbiAgICApO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdGlvbiBmcm9tIGFuIGV4cGxpY2l0IGxpc3Qgb2Ygb2JzZXJ2YXRpb24gaW5kaWNlcy5cbiAqXG4gKiBXaGF0IGEgbGFzc28gaW4gYSBsaW5rZWQgcGxvdCBwcm9kdWNlczogdGhlIHBsb3Qga25vd3Mgd2hpY2ggcG9pbnRzIHRoZSB1c2VyIGRyZXdcbiAqIGFyb3VuZCwgYW5kIHRoZSBtYXAgbmVlZHMgdGhhdCBhcyBhIG1hc2sgb3ZlciBBTEwgb2JzZXJ2YXRpb25zLiBPdXQtb2YtcmFuZ2UgYW5kXG4gKiBkdXBsaWNhdGUgaW5kaWNlcyBhcmUgaWdub3JlZCByYXRoZXIgdGhhbiByZWplY3RlZCDigJQgYSBwbG90IG1heSBoYW5kIGJhY2sgdGhlIHNhbWVcbiAqIHBvaW50IHR3aWNlLCBhbmQgYSBzdGFsZSBpbmRleCBmcm9tIGEgcGxvdCBkcmF3biBiZWZvcmUgYSBkYXRhc2V0IGNoYW5nZSBtdXN0IG5vdFxuICogdGhyb3cgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGlvbiBnZXN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlJbmRpY2VzKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSBBTlkgb2YgYHJlZ2lvbnNgICh1bmlvbikuIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBieVxuICogYGltYWdlUmVmYCBmaXJzdCwgc28gdGhlIHRlc3QgaGFwcGVucyBpbiB0aGUgc2FtZSB3b3JsZCBzcGFjZSB0aGUgcmVnaW9ucyB3ZXJlXG4gKiBkcmF3biBpbi5cbiAqXG4gKiBgY2FuZGlkYXRlc2AsIHdoZW4gZ2l2ZW4sIHJlc3RyaWN0cyB0aGUgdGVzdCB0byB0aG9zZSBvYnNlcnZhdGlvbiBpbmRpY2VzIOKAlCBob3dcbiAqIGEgMkQgdmlldyBvZiBhIDNEIGRhdGFzZXQga2VlcHMgYSBkcmF3biByZWdpb24gbWVhbmluZyB3aGF0IGl0IGxvb2tzIGxpa2UgaXRcbiAqIG1lYW5zOiB0aGUgc2hhcGUgd2FzIGRyYXduIG92ZXIgT05FIHNlY3Rpb24sIHNvIGl0IHNlbGVjdHMgdGhhdCBzZWN0aW9uJ3MgY2VsbHNcbiAqIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBkZXB0aCBvZiB0aGUgc3BlY2ltZW4gYmVoaW5kIHRoZW0uIFRoZSByZXR1cm5lZCBtYXNrIHN0YXlzXG4gKiBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBzbyBldmVyeSBjb25zdW1lciAoY2hhcnRzLCBsZWdlbmQsIHRoZSAzRCBjbG91ZCkgcmVhZHMgaXRcbiAqIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9ucyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBpbWFnZVJlZjogU3BhdGlhbEltYWdlUmVmIHwgdW5kZWZpbmVkLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbiAgY2FuZGlkYXRlcz86IFVpbnQzMkFycmF5LFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgY29uc3QgW3N4LCBzeV0gPSBpbWFnZVJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IGltYWdlUmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICBsZXQgY291bnQgPSAwO1xuICBjb25zdCB0b3RhbCA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzLmxlbmd0aCA6IG47XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdG90YWw7IGsrKykge1xuICAgIGNvbnN0IGkgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlc1trXSA6IGs7XG4gICAgY29uc3QgcHggPSBvYnNlcnZhdGlvbnMueFtpXSAqIHN4ICsgdHg7XG4gICAgY29uc3QgcHkgPSBvYnNlcnZhdGlvbnMueVtpXSAqIHN5ICsgdHk7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIC8vIEJvdW5kcyBmaXJzdDogYSByYXkgY2FzdCBwZXIgb2JzZXJ2YXRpb24gcGVyIHJlZ2lvbiB3b3VsZCBkb21pbmF0ZSBhdFxuICAgICAgLy8gMTBeNSBvYnNlcnZhdGlvbnMsIGFuZCBtb3N0IHBvaW50cyBtaXNzIG1vc3QgcmVnaW9ucy5cbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogU2VsZWN0IG9ic2VydmF0aW9ucyB3aG9zZSBTQ1JFRU4gcHJvamVjdGlvbiBmYWxscyBpbnNpZGUgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogVGhpcyBpcyBob3cgYSByZWdpb24gc2VsZWN0aW9uIHdvcmtzIGluIHRoZSAzRCBjbG91ZC4gVGhlcmUgaXMgbm8gZGF0YS1zcGFjZVxuICogYWZmaW5lIHRvIG1hcCBhIGRyYXduIHNoYXBlIHRocm91Z2gsIGJlY2F1c2UgdGhlIHNoYXBlIHdhcyBkcmF3biBvbiBhIDJEIHNjcmVlblxuICogYWdhaW5zdCBhIHBlcnNwZWN0aXZlIGNhbWVyYSDigJQgc28gdGhlIG9ic2VydmF0aW9ucyBjb21lIHRoZSBvdGhlciB3YXksIGFscmVhZHlcbiAqIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSwgYW5kIHRoZVxuICogcmVnaW9ucyBhcmUgdGVzdGVkIGluIHRoYXQgc2FtZSBzY3JlZW4gc3BhY2UuXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHdvcnRoIGJlaW5nIGV4cGxpY2l0IGFib3V0OiBhIHNjcmVlbi1zcGFjZSBsYXNzbyBzZWxlY3RzXG4gKiB0aHJvdWdoIHRoZSBXSE9MRSBERVBUSCBvZiB0aGUgY2xvdWQsIGxpa2UgYSBjb29raWUgY3V0dGVyLCBub3QgYSBzbGFiIGF0IHNvbWVcbiAqIGNob3NlbiB6LiBUaGF0IGlzIGluaGVyZW50IHRvIGRyYXdpbmcgb24gYSBmbGF0IHNjcmVlbiwgYW5kIGl0IGlzIHdoYXQgbmFwYXJpXG4gKiBhbmQgZXZlcnkgb3RoZXIgb3JiaXQtY2FtZXJhIHBvaW50IHBpY2tlciBkby4gT3JiaXQgYW5kIGRyYXcgYWdhaW4gdG8gY3V0IGZyb21cbiAqIGFub3RoZXIgYW5nbGUuXG4gKlxuICogYHNjcmVlbmAgaXMgYFt4MCwgeTAsIHgxLCB5MSwg4oCmXWAgaW4gY2FudmFzIHBpeGVscywgYGNvdW50YCBlbnRyaWVzIGxvbmcuIEFuXG4gKiBvYnNlcnZhdGlvbiB0aGUgY2FtZXJhIHB1dHMgYmVoaW5kIHRoZSBleWUgaXMgZ2l2ZW4gTmFOIGJ5IHRoZSBwcm9qZWN0b3IgYW5kXG4gKiBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZChcbiAgc2NyZWVuOiBGbG9hdDMyQXJyYXksXG4gIGNvdW50OiBudW1iZXIsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGxldCBoaXRzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgcHggPSBzY3JlZW5baSAqIDJdO1xuICAgIGNvbnN0IHB5ID0gc2NyZWVuW2kgKiAyICsgMV07XG4gICAgLy8gQmVoaW5kIHRoZSBjYW1lcmEsIG9yIG90aGVyd2lzZSB1bnByb2plY3RhYmxlLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHB4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHB5KSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgaGl0cysrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQ6IGhpdHMgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Merging and filtering of the spatial-tile wire format (observation ids, NO_CATEGORY): the
3
+ * pieces of the 2D view's tile loop that are pure — concatenating tiles, dropping hidden
4
+ * groups and genes, and the density-grid markers of a zoomed-out gene selection.
5
+ *
6
+ * These work on SIV's own tile contract, so they stay in SIV rather than moving to napari-js.
7
+ */
8
+ import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
9
+ /** Rings whose owning cell is in a switched-off group removed. */
10
+ export function filterRings(rings, hidden) {
11
+ if (!hidden)
12
+ return rings;
13
+ const keep = [];
14
+ let vertices = 0;
15
+ for (let i = 0; i < rings.count; i++) {
16
+ const code = hidden.codes[rings.observation[i]];
17
+ if (code !== NO_CATEGORY && hidden.hidden[code])
18
+ continue;
19
+ keep.push(i);
20
+ vertices += rings.offsets[i + 1] - rings.offsets[i];
21
+ }
22
+ if (keep.length === rings.count)
23
+ return rings;
24
+ const observation = new Uint32Array(keep.length);
25
+ const offsets = new Uint32Array(keep.length + 1);
26
+ const coords = new Float32Array(vertices * 2);
27
+ let v = 0;
28
+ keep.forEach((i, r) => {
29
+ observation[r] = rings.observation[i];
30
+ offsets[r] = v;
31
+ const a = rings.offsets[i] * 2;
32
+ const b = rings.offsets[i + 1] * 2;
33
+ coords.set(rings.coords.subarray(a, b), v * 2);
34
+ v += (b - a) / 2;
35
+ });
36
+ offsets[keep.length] = v;
37
+ return { count: keep.length, observation, offsets, coords };
38
+ }
39
+ /** Slots (indices into the selected genes) switched off with their eye toggle. */
40
+ export function hiddenGeneSlots(view) {
41
+ if (!view.transcriptHiddenGenes.length)
42
+ return null;
43
+ const off = new Set(view.transcriptHiddenGenes);
44
+ return Uint8Array.from(view.transcriptGenes, (g) => (off.has(g) ? 1 : 0));
45
+ }
46
+ /** Entries in a hidden group's cell, or of a hidden gene, removed (with their sizes). */
47
+ export function filterTranscripts(t, px, hidden, hiddenGenes) {
48
+ if (!hidden && !hiddenGenes)
49
+ return { merged: t, px };
50
+ const keep = [];
51
+ for (let i = 0; i < t.count; i++) {
52
+ if (hiddenGenes && hiddenGenes[t.gene[i]])
53
+ continue;
54
+ const o = t.observation[i];
55
+ if (hidden && o !== NO_OBSERVATION) {
56
+ const code = hidden.codes[o];
57
+ if (code !== NO_CATEGORY && hidden.hidden[code])
58
+ continue;
59
+ }
60
+ keep.push(i);
61
+ }
62
+ const pick = (a) => {
63
+ const out = new a.constructor(keep.length);
64
+ keep.forEach((i, k) => {
65
+ out[k] = a[i];
66
+ });
67
+ return out;
68
+ };
69
+ return {
70
+ merged: {
71
+ count: keep.length,
72
+ aggregated: t.aggregated,
73
+ x: pick(t.x),
74
+ y: pick(t.y),
75
+ z: pick(t.z),
76
+ weight: pick(t.weight),
77
+ observation: pick(t.observation),
78
+ gene: pick(t.gene),
79
+ },
80
+ px: pick(px),
81
+ };
82
+ }
83
+ /** The median of `v`, from a sample of about 1024 values. */
84
+ export function median(v) {
85
+ if (!v.length)
86
+ return 0;
87
+ const step = Math.max(1, Math.floor(v.length / 1024));
88
+ const sample = [];
89
+ for (let i = 0; i < v.length; i += step)
90
+ sample.push(v[i]);
91
+ sample.sort((a, b) => a - b);
92
+ return sample[sample.length >> 1];
93
+ }
94
+ /** Concatenate tiles' rings into one set, dropping rings already seen (a cell straddling
95
+ * two tiles may be listed by both). */
96
+ export function mergePolygonTiles(tiles) {
97
+ const seen = new Set();
98
+ let rings = 0;
99
+ let vertices = 0;
100
+ for (const t of tiles) {
101
+ for (let i = 0; i < t.count; i++) {
102
+ if (seen.has(t.observation[i]))
103
+ continue;
104
+ seen.add(t.observation[i]);
105
+ rings++;
106
+ vertices += t.offsets[i + 1] - t.offsets[i];
107
+ }
108
+ }
109
+ seen.clear();
110
+ const observation = new Uint32Array(rings);
111
+ const offsets = new Uint32Array(rings + 1);
112
+ const coords = new Float32Array(vertices * 2);
113
+ let r = 0;
114
+ let v = 0;
115
+ for (const t of tiles) {
116
+ for (let i = 0; i < t.count; i++) {
117
+ const o = t.observation[i];
118
+ if (seen.has(o))
119
+ continue;
120
+ seen.add(o);
121
+ observation[r] = o;
122
+ offsets[r] = v;
123
+ const a = t.offsets[i] * 2;
124
+ const b = t.offsets[i + 1] * 2;
125
+ coords.set(t.coords.subarray(a, b), v * 2);
126
+ v += (b - a) / 2;
127
+ r++;
128
+ }
129
+ }
130
+ offsets[rings] = v;
131
+ return { count: rings, observation, offsets, coords };
132
+ }
133
+ /** Concatenate transcript tiles, stopping at `limit` entries. */
134
+ export function mergeTranscriptTiles(tiles, limit = Infinity) {
135
+ let n = 0;
136
+ for (const t of tiles)
137
+ n += t.count;
138
+ n = Math.min(n, limit);
139
+ const out = {
140
+ count: n,
141
+ aggregated: tiles.some((t) => t.aggregated),
142
+ x: new Float32Array(n),
143
+ y: new Float32Array(n),
144
+ z: new Float32Array(n),
145
+ weight: new Uint32Array(n),
146
+ observation: new Uint32Array(n),
147
+ gene: new Uint16Array(n),
148
+ };
149
+ let o = 0;
150
+ for (const t of tiles) {
151
+ const k = Math.min(t.count, n - o);
152
+ if (k <= 0)
153
+ break;
154
+ for (const f of ['x', 'y', 'z', 'weight', 'observation', 'gene']) {
155
+ out[f].set(t[f].subarray(0, k), o);
156
+ }
157
+ o += k;
158
+ }
159
+ return out;
160
+ }
161
+ /**
162
+ * One marker per (cluster, `bin` square) from per-cluster density grids: the counts of the grid
163
+ * cells inside `area` summed per square, at their count-weighted centre. `slots[c]` is the gene
164
+ * slot whose icon cluster c's markers take.
165
+ */
166
+ export function clusterMarkers(rasters, slots, bin, area) {
167
+ const x = [];
168
+ const y = [];
169
+ const w = [];
170
+ const gene = [];
171
+ const group = [];
172
+ rasters.forEach((r, c) => {
173
+ const [cw, ch] = r.meta.gridSize;
174
+ const [ox, oy] = r.meta.origin;
175
+ const { rows, cols } = r.meta;
176
+ const c0 = Math.max(0, Math.floor((area.x0 - ox) / cw));
177
+ const c1 = Math.min(cols - 1, Math.floor((area.x1 - ox) / cw));
178
+ const r0 = Math.max(0, Math.floor((area.y0 - oy) / ch));
179
+ const r1 = Math.min(rows - 1, Math.floor((area.y1 - oy) / ch));
180
+ const squares = new Map();
181
+ for (let row = r0; row <= r1; row++) {
182
+ for (let col = c0; col <= c1; col++) {
183
+ const v = r.values[row * cols + col];
184
+ if (!(v > 0))
185
+ continue;
186
+ const cx = ox + (col + 0.5) * cw;
187
+ const cy = oy + (row + 0.5) * ch;
188
+ const key = Math.floor((cy - oy) / bin) * 1e6 + Math.floor((cx - ox) / bin);
189
+ const s = squares.get(key) ?? { n: 0, sx: 0, sy: 0 };
190
+ s.n += v;
191
+ s.sx += v * cx;
192
+ s.sy += v * cy;
193
+ squares.set(key, s);
194
+ }
195
+ }
196
+ for (const s of squares.values()) {
197
+ x.push(s.sx / s.n);
198
+ y.push(s.sy / s.n);
199
+ w.push(Math.round(s.n));
200
+ gene.push(slots[c]);
201
+ group.push(c);
202
+ }
203
+ });
204
+ const n = w.length;
205
+ return {
206
+ tile: {
207
+ count: n,
208
+ aggregated: true,
209
+ x: Float32Array.from(x),
210
+ y: Float32Array.from(y),
211
+ z: new Float32Array(n),
212
+ weight: Uint32Array.from(w),
213
+ observation: new Uint32Array(n).fill(NO_OBSERVATION),
214
+ gene: Uint16Array.from(gene),
215
+ },
216
+ group: Int32Array.from(group),
217
+ };
218
+ }
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FJZixNQUFNLHVDQUF1QyxDQUFDO0FBRy9DLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsV0FBVyxDQUN6QixLQUF5QixFQUN6QixNQUF5RDtJQUV6RCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FB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Q0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IERhdGFSZWN0IH0gZnJvbSAnLi9sb2QnO1xuXG4vKiogUmluZ3Mgd2hvc2Ugb3duaW5nIGNlbGwgaXMgaW4gYSBzd2l0Y2hlZC1vZmYgZ3JvdXAgcmVtb3ZlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSaW5ncyhcbiAgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgaWYgKCFoaWRkZW4pIHJldHVybiByaW5ncztcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tyaW5ncy5vYnNlcnZhdGlvbltpXV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGhpZGRlbi5oaWRkZW5bY29kZV0pIGNvbnRpbnVlO1xuICAgIGtlZXAucHVzaChpKTtcbiAgICB2ZXJ0aWNlcyArPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAtIHJpbmdzLm9mZnNldHNbaV07XG4gIH1cbiAgaWYgKGtlZXAubGVuZ3RoID09PSByaW5ncy5jb3VudCkgcmV0dXJuIHJpbmdzO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShrZWVwLmxlbmd0aCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGggKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgdiA9IDA7XG4gIGtlZXAuZm9yRWFjaCgoaSwgcikgPT4ge1xuICAgIG9ic2VydmF0aW9uW3JdID0gcmluZ3Mub2JzZXJ2YXRpb25baV07XG4gICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgY29uc3QgYSA9IHJpbmdzLm9mZnNldHNbaV0gKiAyO1xuICAgIGNvbnN0IGIgPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgY29vcmRzLnNldChyaW5ncy5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICB2ICs9IChiIC0gYSkgLyAyO1xuICB9KTtcbiAgb2Zmc2V0c1trZWVwLmxlbmd0aF0gPSB2O1xuICByZXR1cm4geyBjb3VudDoga2VlcC5sZW5ndGgsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIFNsb3RzIChpbmRpY2VzIGludG8gdGhlIHNlbGVjdGVkIGdlbmVzKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWUgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbkdlbmVTbG90cyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHZpZXcudHJhbnNjcmlwdEdlbmVzLCAoZykgPT4gKG9mZi5oYXMoZykgPyAxIDogMCkpO1xufVxuXG4vKiogRW50cmllcyBpbiBhIGhpZGRlbiBncm91cCdzIGNlbGwsIG9yIG9mIGEgaGlkZGVuIGdlbmUsIHJlbW92ZWQgKHdpdGggdGhlaXIgc2l6ZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRyYW5zY3JpcHRzKFxuICB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gIHB4OiBGbG9hdDMyQXJyYXksXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbiAgaGlkZGVuR2VuZXM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKCFoaWRkZW4gJiYgIWhpZGRlbkdlbmVzKSByZXR1cm4geyBtZXJnZWQ6IHQsIHB4IH07XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkdlbmVzICYmIGhpZGRlbkdlbmVzW3QuZ2VuZVtpXV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgIGlmIChoaWRkZW4gJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbb107XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjb2RlXSkgY29udGludWU7XG4gICAgfVxuICAgIGtlZXAucHVzaChpKTtcbiAgfVxuICBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBUKTogVCA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBUKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChpLCBrKSA9PiB7XG4gICAgICBvdXRba10gPSBhW2ldO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiB7XG4gICAgICBjb3VudDoga2VlcC5sZW5ndGgsXG4gICAgICBhZ2dyZWdhdGVkOiB0LmFnZ3JlZ2F0ZWQsXG4gICAgICB4OiBwaWNrKHQueCksXG4gICAgICB5OiBwaWNrKHQueSksXG4gICAgICB6OiBwaWNrKHQueiksXG4gICAgICB3ZWlnaHQ6IHBpY2sodC53ZWlnaHQpLFxuICAgICAgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksXG4gICAgICBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbi8qKiBUaGUgbWVkaWFuIG9mIGB2YCwgZnJvbSBhIHNhbXBsZSBvZiBhYm91dCAxMDI0IHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odjogRmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgaWYgKCF2Lmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHYubGVuZ3RoIC8gMTAyNCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgKz0gc3RlcCkgc2FtcGxlLnB1c2godltpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRpbGVzJyByaW5ncyBpbnRvIG9uZSBzZXQsIGRyb3BwaW5nIHJpbmdzIGFscmVhZHkgc2VlbiAoYSBjZWxsIHN0cmFkZGxpbmdcbiAqICB0d28gdGlsZXMgbWF5IGJlIGxpc3RlZCBieSBib3RoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25UaWxlcyh0aWxlczogU3BhdGlhbFBvbHlnb25UaWxlW10pOiBTcGF0aWFsUG9seWdvblRpbGUge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCByaW5ncyA9IDA7XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModC5vYnNlcnZhdGlvbltpXSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQodC5vYnNlcnZhdGlvbltpXSk7XG4gICAgICByaW5ncysrO1xuICAgICAgdmVydGljZXMgKz0gdC5vZmZzZXRzW2kgKyAxXSAtIHQub2Zmc2V0c1tpXTtcbiAgICB9XG4gIH1cbiAgc2Vlbi5jbGVhcigpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShyaW5ncyk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocmluZ3MgKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgciA9IDA7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKHNlZW4uaGFzKG8pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG8pO1xuICAgICAgb2JzZXJ2YXRpb25bcl0gPSBvO1xuICAgICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgICBjb25zdCBhID0gdC5vZmZzZXRzW2ldICogMjtcbiAgICAgIGNvbnN0IGIgPSB0Lm9mZnNldHNbaSArIDFdICogMjtcbiAgICAgIGNvb3Jkcy5zZXQodC5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICAgIHYgKz0gKGIgLSBhKSAvIDI7XG4gICAgICByKys7XG4gICAgfVxuICB9XG4gIG9mZnNldHNbcmluZ3NdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IHJpbmdzLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0cmFuc2NyaXB0IHRpbGVzLCBzdG9wcGluZyBhdCBgbGltaXRgIGVudHJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXM6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZVtdLCBsaW1pdCA9IEluZmluaXR5KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIG4gKz0gdC5jb3VudDtcbiAgbiA9IE1hdGgubWluKG4sIGxpbWl0KTtcbiAgY29uc3Qgb3V0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUgPSB7XG4gICAgY291bnQ6IG4sXG4gICAgYWdncmVnYXRlZDogdGlsZXMuc29tZSgodCkgPT4gdC5hZ2dyZWdhdGVkKSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSxcbiAgICBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sXG4gIHNsb3RzOiBudW1iZXJbXSxcbiAgYmluOiBudW1iZXIsXG4gIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbixcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHRydWUsXG4gICAgICB4OiBGbG9hdDMyQXJyYXkuZnJvbSh4KSxcbiAgICAgIHk6IEZsb2F0MzJBcnJheS5mcm9tKHkpLFxuICAgICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSxcbiAgICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobikuZmlsbChOT19PQlNFUlZBVElPTiksXG4gICAgICBnZW5lOiBVaW50MTZBcnJheS5mcm9tKGdlbmUpLFxuICAgIH0sXG4gICAgZ3JvdXA6IEludDMyQXJyYXkuZnJvbShncm91cCksXG4gIH07XG59XG4iXX0=