@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,4 +1,4 @@
1
- import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
1
+ import { NO_CATEGORY, NO_OBSERVATION, } from '../../contracts/spatial-dataset.contract';
2
2
  /**
3
3
  * The wire format the bundled example server speaks, and its decoders.
4
4
  *
@@ -23,6 +23,8 @@ import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
23
23
  *
24
24
  * ENDPOINTS (base = the server root)
25
25
  * ----------------------------------
26
+ * Every route `SpatialDataHttpService` calls. `{id}` is the dataset id; names and
27
+ * gene lists are URI-encoded.
26
28
  * ```
27
29
  * GET {base}/spatial/datasets -> { datasets: [{ id, name, count }] }
28
30
  * GET {base}/spatial/{id}/manifest -> SpatialManifest
@@ -32,19 +34,28 @@ import { NO_CATEGORY, } from '../../contracts/spatial-dataset.contract';
32
34
  * GET {base}/spatial/{id}/column/{name} -> u16[N] codes | f32[N] values
33
35
  * GET {base}/spatial/{id}/feature/{name} -> f32[N]
34
36
  * GET {base}/spatial/{id}/features?q=&limit= -> { names: string[] }
37
+ * GET {base}/spatial/{id}/embedding/{name} -> f32[N] per dimension, see decodeEmbedding
35
38
  * GET {base}/spatial/{id}/polygons -> u32 count, u32[count+1] offsets, f32[2*rings] coords
39
+ * GET {base}/spatial/{id}/volume -> u8[width*height*depth] (manifest.volume only)
36
40
  * GET {base}/spatial/{id}/polygon-tile/{set}/{level}/{gx}/{gy}
37
41
  * -> u32 count, u32[count] obs, u32[count+1] offsets, f32 coords
38
- * GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all
42
+ * GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all&box=
39
43
  * -> see decodeTranscriptTile
40
- * GET {base}/spatial/{id}/density?genes=A,B -> f32[rows*cols]
41
44
  * GET {base}/spatial/{id}/transcript-bins/{level}/{tx}/{ty}
42
45
  * -> transcript-tile layout, one entry per bin
46
+ * GET {base}/spatial/{id}/gene-bins/{level}/{tx}/{ty}?genes=A,B
47
+ * -> transcript-tile layout, per-gene bins
48
+ * GET {base}/spatial/{id}/density?genes=A,B&bin= -> see decodeDensity
49
+ * GET {base}/spatial/{id}/transcript-summary?box=&genes=&cells= -> SpatialTranscriptSummary
50
+ * GET {base}/spatial/{id}/transcript-counts?genes=A,B -> SpatialTranscriptCounts
51
+ * GET {base}/spatial/{id}/markers/{column}?n= -> SpatialMarkerGenes
52
+ * POST {base}/spatial/{id}/groups?name= (text/csv `cell_id,group`)
53
+ * -> { column: CategoricalColumnMeta, matched }
43
54
  * ```
44
55
  *
45
- * The three tiled routes are optional and advertised in the manifest
46
- * (`polygonTiles`, `transcriptTiles`, `density`); a server without them never
47
- * sees them requested.
56
+ * The optional routes are advertised in the manifest (`polygons`, `volume`,
57
+ * `polygonTiles`, `transcriptTiles`, `transcriptBins`, `transcriptGeneBins`,
58
+ * `density`); a server without them never sees them requested.
48
59
  */
49
60
  /** Bumped when the layout changes incompatibly; the client refuses anything else. */
50
61
  export const SPATIAL_WIRE_VERSION = 1;
@@ -66,12 +77,59 @@ function assertByteLength(buf, expected, what) {
66
77
  'Manifest count and served vector length disagree.');
67
78
  }
68
79
  }
69
- /** Reject a manifest this client cannot read, with a message naming the fix. */
80
+ /**
81
+ * Reject a manifest this client cannot read, with a message naming the fix.
82
+ *
83
+ * Besides the version, the values every decoder sizes its views from: an observation
84
+ * count that is not a non-negative integer, or an embedding that is not 2-D or 3-D, would
85
+ * otherwise surface later as a RangeError deep inside a renderer.
86
+ */
70
87
  export function assertManifestVersion(manifest) {
71
88
  if (manifest.version !== SPATIAL_WIRE_VERSION) {
72
89
  throw new Error(`[spatial] unsupported wire version ${manifest.version} ` +
73
90
  `(this client speaks ${SPATIAL_WIRE_VERSION}). Update the server or the library.`);
74
91
  }
92
+ if (!Number.isSafeInteger(manifest.count) || manifest.count < 0) {
93
+ throw new Error(`[spatial] manifest count ${manifest.count} is not a non-negative integer`);
94
+ }
95
+ for (const e of manifest.embeddings ?? [])
96
+ assertEmbeddingDims(e);
97
+ }
98
+ function assertEmbeddingDims(meta) {
99
+ if (meta.dims !== 2 && meta.dims !== 3) {
100
+ throw new Error(`[spatial] embedding "${meta.name}": dims ${meta.dims} is not 2 or 3`);
101
+ }
102
+ }
103
+ /**
104
+ * Ring offsets must start at 0 and never go backwards: a decreasing pair is a negative
105
+ * vertex count, which a renderer turns into `new Float32Array(negative)` on every frame.
106
+ * (That the last offset matches the coordinate block is the byte-length check's job.)
107
+ */
108
+ function assertRingOffsets(offsets, what) {
109
+ if (offsets[0] !== 0)
110
+ throw new Error(`[spatial] ${what}: offsets must start at 0`);
111
+ for (let i = 1; i < offsets.length; i++) {
112
+ if (offsets[i] < offsets[i - 1]) {
113
+ throw new Error(`[spatial] ${what}: offsets decrease at ring ${i - 1}`);
114
+ }
115
+ }
116
+ }
117
+ /** Every entry must name an observation below `count`, or {@link NO_OBSERVATION}. */
118
+ function assertObservations(observation, count, what) {
119
+ if (count === undefined)
120
+ return;
121
+ for (let i = 0; i < observation.length; i++) {
122
+ const o = observation[i];
123
+ if (o >= count && o !== NO_OBSERVATION) {
124
+ throw new Error(`[spatial] ${what}: observation ${o} is past the ${count} in the dataset`);
125
+ }
126
+ }
127
+ }
128
+ /** A header-sized prefix must be there before any view over it is made. */
129
+ function assertHeader(buf, bytes, what) {
130
+ if (buf.byteLength < bytes) {
131
+ throw new Error(`[spatial] ${what}: response too short for its header (${buf.byteLength} < ${bytes} bytes)`);
132
+ }
75
133
  }
76
134
  /**
77
135
  * `GET /coords` → x/y(/z). One request rather than two or three: the vectors
@@ -93,7 +151,6 @@ export function decodeRadius(buf, count) {
93
151
  assertByteLength(buf, count * 4, 'radius');
94
152
  return new Float32Array(buf, 0, count);
95
153
  }
96
- /** `GET /feature/{name}` → one gene's expression vector. */
97
154
  /**
98
155
  * `GET /spatial/{id}/embedding/{name}` — one plane per dimension, same layout as coords.
99
156
  *
@@ -102,6 +159,7 @@ export function decodeRadius(buf, count) {
102
159
  */
103
160
  export function decodeEmbedding(buf, meta, count) {
104
161
  assertLittleEndian();
162
+ assertEmbeddingDims(meta);
105
163
  assertByteLength(buf, count * meta.dims * 4, `embedding "${meta.name}"`);
106
164
  return {
107
165
  meta,
@@ -110,6 +168,7 @@ export function decodeEmbedding(buf, meta, count) {
110
168
  ...(meta.dims === 3 ? { z: new Float32Array(buf, count * 8, count) } : {}),
111
169
  };
112
170
  }
171
+ /** `GET /feature/{name}` → one gene's expression vector. */
113
172
  export function decodeFeatureVector(buf, count) {
114
173
  assertLittleEndian();
115
174
  assertByteLength(buf, count * 4, 'feature vector');
@@ -147,9 +206,11 @@ export function decodePolygons(buf) {
147
206
  throw new Error('[spatial] polygons: response too short for a header');
148
207
  }
149
208
  const count = new Uint32Array(buf, 0, 1)[0];
209
+ const coordsByteOffset = 4 + (count + 1) * 4;
210
+ assertHeader(buf, coordsByteOffset, 'polygons');
150
211
  const offsets = new Uint32Array(buf, 4, count + 1);
212
+ assertRingOffsets(offsets, 'polygons');
151
213
  const vertexCount = offsets[count];
152
- const coordsByteOffset = 4 + (count + 1) * 4;
153
214
  assertByteLength(buf, coordsByteOffset + vertexCount * 2 * 4, 'polygons');
154
215
  const coords = new Float32Array(buf, coordsByteOffset, vertexCount * 2);
155
216
  return { coords, offsets, count };
@@ -157,20 +218,27 @@ export function decodePolygons(buf) {
157
218
  /**
158
219
  * `GET /polygon-tile/...` → one tile of rings with their owning observations. Layout
159
220
  * `[u32 count][u32 obs × count][u32 offsets × (count+1)][f32 coords × 2·offsets[count]]`.
221
+ *
222
+ * `observations` is the dataset's N; when given, every owner must be below it.
160
223
  */
161
- export function decodePolygonTile(buf) {
224
+ export function decodePolygonTile(buf, observations) {
162
225
  assertLittleEndian();
163
226
  if (buf.byteLength < 8) {
164
227
  throw new Error('[spatial] polygon tile: response too short for a header');
165
228
  }
166
229
  const count = new Uint32Array(buf, 0, 1)[0];
230
+ const coordsByteOffset = 4 + count * 4 + (count + 1) * 4;
231
+ assertHeader(buf, coordsByteOffset, 'polygon tile');
167
232
  const observation = new Uint32Array(buf, 4, count);
168
233
  const offsets = new Uint32Array(buf, 4 + count * 4, count + 1);
234
+ assertRingOffsets(offsets, 'polygon tile');
169
235
  const vertexCount = offsets[count];
170
- const coordsByteOffset = 4 + count * 4 + (count + 1) * 4;
171
236
  assertByteLength(buf, coordsByteOffset + vertexCount * 8, 'polygon tile');
237
+ assertObservations(observation, observations, 'polygon tile');
172
238
  return {
173
- count, observation, offsets,
239
+ count,
240
+ observation,
241
+ offsets,
174
242
  coords: new Float32Array(buf, coordsByteOffset, vertexCount * 2),
175
243
  };
176
244
  }
@@ -178,8 +246,11 @@ export function decodePolygonTile(buf) {
178
246
  * `GET /transcript-tile/...` → transcripts or aggregates. Layout, 4-byte aligned:
179
247
  * `[u32 n][u32 flags][f32 x·n][f32 y·n][f32 z·n][u32 weight·n][u32 obs·n][u16 gene·n, padded]`;
180
248
  * flags bit 0 marks an aggregated level.
249
+ *
250
+ * `limits` bounds the indices when the caller knows them: `observations` is the dataset's
251
+ * N, and `genes` the length of the gene list the codes index (omit it for `ALL_GENES`).
181
252
  */
182
- export function decodeTranscriptTile(buf) {
253
+ export function decodeTranscriptTile(buf, limits = {}) {
183
254
  assertLittleEndian();
184
255
  if (buf.byteLength < 8) {
185
256
  throw new Error('[spatial] transcript tile: response too short for a header');
@@ -187,6 +258,16 @@ export function decodeTranscriptTile(buf) {
187
258
  const [n, flags] = new Uint32Array(buf, 0, 2);
188
259
  const genePad = Math.ceil((n * 2) / 4) * 4;
189
260
  assertByteLength(buf, 8 + n * 20 + genePad, 'transcript tile');
261
+ const observation = new Uint32Array(buf, 8 + n * 16, n);
262
+ const gene = new Uint16Array(buf, 8 + n * 20, n);
263
+ assertObservations(observation, limits.observations, 'transcript tile');
264
+ if (limits.genes !== undefined) {
265
+ for (let i = 0; i < n; i++) {
266
+ if (gene[i] >= limits.genes) {
267
+ throw new Error(`[spatial] transcript tile: gene code ${gene[i]} is past the ${limits.genes} asked for`);
268
+ }
269
+ }
270
+ }
190
271
  return {
191
272
  count: n,
192
273
  aggregated: (flags & 1) === 1,
@@ -194,8 +275,8 @@ export function decodeTranscriptTile(buf) {
194
275
  y: new Float32Array(buf, 8 + n * 4, n),
195
276
  z: new Float32Array(buf, 8 + n * 8, n),
196
277
  weight: new Uint32Array(buf, 8 + n * 12, n),
197
- observation: new Uint32Array(buf, 8 + n * 16, n),
198
- gene: new Uint16Array(buf, 8 + n * 20, n),
278
+ observation,
279
+ gene,
199
280
  };
200
281
  }
201
282
  /**
@@ -209,6 +290,10 @@ export function decodeDensity(buf, genes) {
209
290
  throw new Error('[spatial] density: response too short for a header');
210
291
  const [rows, cols] = new Uint32Array(buf, 0, 2);
211
292
  const [cw, ch, ox, oy] = new Float32Array(buf, 8, 4);
293
+ // The cell size divides every downstream position; zero, negative or NaN is unusable.
294
+ if (!(cw > 0 && ch > 0 && Number.isFinite(cw) && Number.isFinite(ch))) {
295
+ throw new Error(`[spatial] density: grid size ${cw} x ${ch} is not positive and finite`);
296
+ }
212
297
  assertByteLength(buf, 24 + rows * cols * 4, 'density');
213
298
  const meta = { rows, cols, gridSize: [cw, ch], origin: [ox, oy] };
214
299
  return { meta, genes, values: new Float32Array(buf, 24, rows * cols) };
@@ -220,9 +305,7 @@ export function decodeDensity(buf, genes) {
220
305
  */
221
306
  export function datasetFromManifest(manifest, coords, extras = {}) {
222
307
  assertManifestVersion(manifest);
223
- const radius = manifest.radius?.mode === 'uniform'
224
- ? manifest.radius.value
225
- : extras.radius;
308
+ const radius = manifest.radius?.mode === 'uniform' ? manifest.radius.value : extras.radius;
226
309
  const observations = {
227
310
  count: manifest.count,
228
311
  x: coords.x,
@@ -241,9 +324,7 @@ export function datasetFromManifest(manifest, coords, extras = {}) {
241
324
  ...(manifest.imageRef ? { imageRef: manifest.imageRef } : {}),
242
325
  ...(manifest.volume ? { volume: manifest.volume } : {}),
243
326
  ...(manifest.embeddings?.length ? { embeddings: manifest.embeddings } : {}),
244
- ...(manifest.micronsPerUnit !== undefined
245
- ? { micronsPerUnit: manifest.micronsPerUnit }
246
- : {}),
327
+ ...(manifest.micronsPerUnit !== undefined ? { micronsPerUnit: manifest.micronsPerUnit } : {}),
247
328
  ...(manifest.polygonTiles ? { polygonTiles: manifest.polygonTiles } : {}),
248
329
  ...(manifest.transcriptTiles ? { transcriptTiles: manifest.transcriptTiles } : {}),
249
330
  ...(manifest.density ? { density: manifest.density } : {}),
@@ -252,4 +333,4 @@ export function datasetFromManifest(manifest, coords, extras = {}) {
252
333
  ...(manifest.transcriptBinsStatus ? { transcriptBinsStatus: manifest.transcriptBinsStatus } : {}),
253
334
  };
254
335
  }
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEdBbUJaLE1BQU0sMENBQTBDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBdUN0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDdkUsdUVBQXVFLENBQ3hFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3hFLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFFBQXlC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ZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRixHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9FLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRixHQUFHLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDbEcsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIENvbnRpbnVvdXNDb2x1bW5NZXRhLFxuICBOT19DQVRFR09SWSxcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsRGVuc2l0eU1ldGEsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsRW1iZWRkaW5nLFxuICBTcGF0aWFsRW1iZWRkaW5nTWV0YSxcbiAgU3BhdGlhbEZlYXR1cmVNZXRhLFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEsXG4gIFNwYXRpYWxQb2x5Z29ucyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YSwgU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGEsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YSxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZCBleGFtcGxlIHNlcnZlciBzcGVha3MsIGFuZCBpdHMgZGVjb2RlcnMuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIEhUVFAg4oCUIHNvIHRoZSBmb3JtYXQgaXMgdGVzdGFibGUgb25cbiAqIGl0cyBvd24gYW5kIHJldXNhYmxlIGJ5IGFueSB0cmFuc3BvcnQgKGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBpcyBvbmUpLlxuICogTWlycm9ycyB0aGUgc3BsaXQgaW4gYHBsb3RseS10cmFjZS1idWlsZGVycy50c2A6IHRoZSBzaGFwZSBsaXZlcyBpbiBhIHB1cmVcbiAqIG1vZHVsZSwgdGhlIHNlcnZpY2UganVzdCBtb3ZlcyBieXRlcy5cbiAqXG4gKiBXSFkgQklOQVJZXG4gKiAtLS0tLS0tLS0tXG4gKiBWZWN0b3JzIGFyZSBvbmUgYEZsb2F0MzJBcnJheWAvYFVpbnQxNkFycmF5YCBwZXIgcmVxdWVzdCwgZGVsaXZlcmVkIGFzIHJhd1xuICogbGl0dGxlLWVuZGlhbiBieXRlcy4gSlNPTiB3b3VsZCBjb3N0IH444oCTMTLDlyB0aGUgc2l6ZSBhbmQgYSBwYXJzZSB0aGF0XG4gKiBhbGxvY2F0ZXMgb25lIEpTIG51bWJlciBwZXIgdmFsdWU7IGEgdHlwZWQtYXJyYXkgdmlldyBvdmVyIHRoZSByZXNwb25zZVxuICogYnVmZmVyIGlzIHplcm8tY29weSBhbmQgdXBsb2FkcyB0byB0aGUgR1BVIGRpcmVjdGx5LlxuICpcbiAqIEVORElBTk5FU1NcbiAqIC0tLS0tLS0tLS1cbiAqIExpdHRsZS1lbmRpYW4sIGFzc2VydGVkIGF0IGRlY29kZS4gRXZlcnkgcGxhdGZvcm0gYSBicm93c2VyIHJ1bnMgb24gdG9kYXkgaXNcbiAqIGxpdHRsZS1lbmRpYW4sIHNvIGEgYERhdGFWaWV3YCBieXRlLWJ5LWJ5dGUgcmVhZCB3b3VsZCBjb3N0IHJlYWwgdGltZSBmb3IgYVxuICogY2FzZSB0aGF0IGRvZXMgbm90IG9jY3VyIOKAlCBidXQgZmFpbGluZyBsb3VkbHkgYmVhdHMgcmVuZGVyaW5nIHRyYW5zcG9zZWRcbiAqIGdhcmJhZ2UgaWYgaXQgZXZlciBkb2VzLlxuICpcbiAqIEVORFBPSU5UUyAoYmFzZSA9IHRoZSBzZXJ2ZXIgcm9vdClcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIGBgYFxuICogR0VUIHtiYXNlfS9zcGF0aWFsL2RhdGFzZXRzICAgICAgICAgICAgICAtPiB7IGRhdGFzZXRzOiBbeyBpZCwgbmFtZSwgY291bnQgfV0gfVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vbWFuaWZlc3QgICAgICAgICAtPiBTcGF0aWFsTWFuaWZlc3RcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2Nvb3JkcyAgICAgICAgICAgLT4gZjMyW05dIHgsIGYzMltOXSB5LCBmMzJbTl0gej9cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3JhZGl1cyAgICAgICAgICAgLT4gZjMyW05dICAgICAgICAgICAocGVyLW9ic2VydmF0aW9uIHJhZGl1cyBvbmx5KVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vaWRzICAgICAgICAgICAgICAtPiB7IGlkczogc3RyaW5nW10gfSAoaGFzSWRzIG9ubHkpXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9jb2x1bW4ve25hbWV9ICAgIC0+IHUxNltOXSBjb2RlcyB8IGYzMltOXSB2YWx1ZXNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2ZlYXR1cmUve25hbWV9ICAgLT4gZjMyW05dXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9mZWF0dXJlcz9xPSZsaW1pdD0gLT4geyBuYW1lczogc3RyaW5nW10gfVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcG9seWdvbnMgICAgICAgICAtPiB1MzIgY291bnQsIHUzMltjb3VudCsxXSBvZmZzZXRzLCBmMzJbMipyaW5nc10gY29vcmRzXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9wb2x5Z29uLXRpbGUve3NldH0ve2xldmVsfS97Z3h9L3tneX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdTMyIGNvdW50LCB1MzJbY291bnRdIG9icywgdTMyW2NvdW50KzFdIG9mZnNldHMsIGYzMiBjb29yZHNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3RyYW5zY3JpcHQtdGlsZS97bGV2ZWx9L3tneH0ve2d5fT9nZW5lcz1BLEImcXVhbGl0eT1oaWdofGFsbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBzZWUgZGVjb2RlVHJhbnNjcmlwdFRpbGVcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2RlbnNpdHk/Z2VuZXM9QSxCIC0+IGYzMltyb3dzKmNvbHNdXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS90cmFuc2NyaXB0LWJpbnMve2xldmVsfS97dHh9L3t0eX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgb25lIGVudHJ5IHBlciBiaW5cbiAqIGBgYFxuICpcbiAqIFRoZSB0aHJlZSB0aWxlZCByb3V0ZXMgYXJlIG9wdGlvbmFsIGFuZCBhZHZlcnRpc2VkIGluIHRoZSBtYW5pZmVzdFxuICogKGBwb2x5Z29uVGlsZXNgLCBgdHJhbnNjcmlwdFRpbGVzYCwgYGRlbnNpdHlgKTsgYSBzZXJ2ZXIgd2l0aG91dCB0aGVtIG5ldmVyXG4gKiBzZWVzIHRoZW0gcmVxdWVzdGVkLlxuICovXG5cbi8qKiBCdW1wZWQgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMgaW5jb21wYXRpYmx5OyB0aGUgY2xpZW50IHJlZnVzZXMgYW55dGhpbmcgZWxzZS4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1dJUkVfVkVSU0lPTiA9IDE7XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbWFya2VyIHJhZGl1czogb25lIHNoYXJlZCB2YWx1ZSwgb3IgYSBzZXJ2ZWQgZjMyIHZlY3Rvci4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxSYWRpdXNTcGVjID1cbiAgfCB7IG1vZGU6ICd1bmlmb3JtJzsgdmFsdWU6IG51bWJlciB9XG4gIHwgeyBtb2RlOiAncGVyLW9ic2VydmF0aW9uJyB9O1xuXG4vKiogYEdFVCAvc3BhdGlhbC97aWR9L21hbmlmZXN0YCDigJQgZXZlcnl0aGluZyBjaGVhcCBlbm91Z2ggdG8gc2VuZCB1cCBmcm9udC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbE1hbmlmZXN0IHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBOIOKAlCBvYnNlcnZhdGlvbiBjb3VudDsgZXZlcnkgc2VydmVkIHZlY3RvciBoYXMgZXhhY3RseSB0aGlzIGxlbmd0aC4gKi9cbiAgY291bnQ6IG51bWJlcjtcbiAgaGFzWj86IGJvb2xlYW47XG4gIGhhc0lkcz86IGJvb2xlYW47XG4gIHJhZGl1cz86IFNwYXRpYWxSYWRpdXNTcGVjO1xuICBjb2x1bW5zOiBTcGF0aWFsQ29sdW1uTWV0YVtdO1xuICBmZWF0dXJlcz86IFNwYXRpYWxGZWF0dXJlTWV0YTtcbiAgcG9seWdvbnM/OiB7IGNvdW50OiBudW1iZXIgfTtcbiAgaW1hZ2VSZWY/OiBTcGF0aWFsSW1hZ2VSZWY7XG4gIHZvbHVtZT86IFNwYXRpYWxWb2x1bWVNZXRhO1xuICBlbWJlZGRpbmdzPzogU3BhdGlhbEVtYmVkZGluZ01ldGFbXTtcbiAgbWljcm9uc1BlclVuaXQ/OiBudW1iZXI7XG4gIHBvbHlnb25UaWxlcz86IFNwYXRpYWxQb2x5Z29uVGlsZXNNZXRhO1xuICB0cmFuc2NyaXB0VGlsZXM/OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YTtcbiAgZGVuc2l0eT86IFNwYXRpYWxEZW5zaXR5TWV0YTtcbiAgdHJhbnNjcmlwdEJpbnM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNNZXRhO1xuICB0cmFuc2NyaXB0Qmluc1N0YXR1cz86IFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cztcbiAgdHJhbnNjcmlwdEdlbmVCaW5zPzogU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGE7XG59XG5cbi8qKiBgR0VUIC9zcGF0aWFsL2RhdGFzZXRzYCAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsRGF0YXNldFN1bW1hcnkge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8qKiBUcnVlIG9uIGEgbGl0dGxlLWVuZGlhbiBob3N0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCk6IGJvb2xlYW4ge1xuICBjb25zdCBwcm9iZSA9IG5ldyBVaW50MTZBcnJheShbMV0pO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocHJvYmUuYnVmZmVyKVswXSA9PT0gMTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0TGl0dGxlRW5kaWFuKCk6IHZvaWQge1xuICBpZiAoIWlzTGl0dGxlRW5kaWFuKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnW3NwYXRpYWxdIHdpcmUgZm9ybWF0IGlzIGxpdHRsZS1lbmRpYW47IHRoaXMgcGxhdGZvcm0gaXMgYmlnLWVuZGlhbi4gJyArXG4gICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgJ01hbmlmZXN0IGNvdW50IGFuZCBzZXJ2ZWQgdmVjdG9yIGxlbmd0aCBkaXNhZ3JlZS4nLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCk6IHZvaWQge1xuICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gU1BBVElBTF9XSVJFX1ZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdIHVuc3VwcG9ydGVkIHdpcmUgdmVyc2lvbiAke21hbmlmZXN0LnZlcnNpb259IGAgK1xuICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBgR0VUIC9jb29yZHNgIOKGkiB4L3koL3opLiBPbmUgcmVxdWVzdCByYXRoZXIgdGhhbiB0d28gb3IgdGhyZWU6IHRoZSB2ZWN0b3JzXG4gKiBhcmUgYWx3YXlzIGZldGNoZWQgdG9nZXRoZXIsIGFuZCBhIHNpbmdsZSByZXNwb25zZSBrZWVwcyB0aGVtIGNvbnNpc3RlbnQgaWZcbiAqIHRoZSBkYXRhc2V0IGNoYW5nZXMgdW5kZXJuZWF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNvb3JkcyhcbiAgYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlciwgaGFzWiA9IGZhbHNlLFxuKTogUGljazxTcGF0aWFsT2JzZXJ2YXRpb25zLCAneCcgfCAneScgfCAneic+IHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGNvbnN0IGF4ZXMgPSBoYXNaID8gMyA6IDI7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIGF4ZXMgKiA0LCAnY29vcmRzJyk7XG4gIGNvbnN0IHggPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xuICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpO1xuICBjb25zdCB6ID0gaGFzWiA/IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgeCwgeSwgeiB9O1xufVxuXG4vKiogYEdFVCAvcmFkaXVzYCDihpIgcGVyLW9ic2VydmF0aW9uIHJhZGlpIGluIGltYWdlIHBpeGVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVSYWRpdXMoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAncmFkaXVzJyk7XG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpO1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKFxuICBidWY6IEFycmF5QnVmZmVyLCBtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSwgY291bnQ6IG51bWJlcixcbik6IFNwYXRpYWxFbWJlZGRpbmcge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogbWV0YS5kaW1zICogNCwgYGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7XG4gICAgbWV0YSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgMCwgY291bnQpLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KSxcbiAgICAuLi4obWV0YS5kaW1zID09PSAzID8geyB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oXG4gIGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxDb2x1bW5NZXRhLCBjb3VudDogbnVtYmVyLFxuKTogU3BhdGlhbENvbHVtbiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAobWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogMiwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gICAgY29uc3QgY29kZXMgPSBuZXcgVWludDE2QXJyYXkoYnVmLCAwLCBjb3VudCk7XG4gICAgY29uc3QgbiA9IChtZXRhIGFzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSkuY2F0ZWdvcmllcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNvZGVzW2ldID49IG4pIGNvZGVzW2ldID0gTk9fQ0FURUdPUlk7XG4gICAgfVxuICAgIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLCBjb2RlcyB9O1xuICB9XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb3VudCAqIDQsIGBjb2x1bW4gXCIke21ldGEubmFtZX1cImApO1xuICByZXR1cm4geyBtZXRhOiBtZXRhIGFzIENvbnRpbnVvdXNDb2x1bW5NZXRhLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCkgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9wb2x5Z29uc2Ag4oaSIGJvdW5kYXJ5IHJpbmdzLiBMYXlvdXQgaXNcbiAqIGBbdTMyIGNvdW50XVt1MzIgb2Zmc2V0cyDDlyAoY291bnQrMSldW2YzMiBjb29yZHMgw5cgMsK3b2Zmc2V0c1tjb3VudF1dYDsgZXZlcnlcbiAqIGZpZWxkIGlzIDQtYnl0ZSB3aWRlIHNvIGVhY2ggdHlwZWQtYXJyYXkgdmlldyBzdGF5cyBhbGlnbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUG9seWdvbnMoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxQb2x5Z29ucyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbnM6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgNCwgY291bnQgKyAxKTtcbiAgY29uc3QgdmVydGV4Q291bnQgPSBvZmZzZXRzW2NvdW50XTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiAyICogNCwgJ3BvbHlnb25zJyk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpO1xuICByZXR1cm4geyBjb29yZHMsIG9mZnNldHMsIGNvdW50IH07XG59XG5cbi8qKlxuICogYEdFVCAvcG9seWdvbi10aWxlLy4uLmAg4oaSIG9uZSB0aWxlIG9mIHJpbmdzIHdpdGggdGhlaXIgb3duaW5nIG9ic2VydmF0aW9ucy4gTGF5b3V0XG4gKiBgW3UzMiBjb3VudF1bdTMyIG9icyDDlyBjb3VudF1bdTMyIG9mZnNldHMgw5cgKGNvdW50KzEpXVtmMzIgY29vcmRzIMOXIDLCt29mZnNldHNbY291bnRdXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb2x5Z29uVGlsZShidWY6IEFycmF5QnVmZmVyKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBwb2x5Z29uIHRpbGU6IHJlc3BvbnNlIHRvbyBzaG9ydCBmb3IgYSBoZWFkZXInKTtcbiAgfVxuICBjb25zdCBjb3VudCA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDEpWzBdO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShidWYsIDQsIGNvdW50KTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShidWYsIDQgKyBjb3VudCAqIDQsIGNvdW50ICsgMSk7XG4gIGNvbnN0IHZlcnRleENvdW50ID0gb2Zmc2V0c1tjb3VudF07XG4gIGNvbnN0IGNvb3Jkc0J5dGVPZmZzZXQgPSA0ICsgY291bnQgKiA0ICsgKGNvdW50ICsgMSkgKiA0O1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCArIHZlcnRleENvdW50ICogOCwgJ3BvbHlnb24gdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50LCBvYnNlcnZhdGlvbiwgb2Zmc2V0cyxcbiAgICBjb29yZHM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpLFxuICB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3RyYW5zY3JpcHQtdGlsZS8uLi5gIOKGkiB0cmFuc2NyaXB0cyBvciBhZ2dyZWdhdGVzLiBMYXlvdXQsIDQtYnl0ZSBhbGlnbmVkOlxuICogYFt1MzIgbl1bdTMyIGZsYWdzXVtmMzIgeMK3bl1bZjMyIHnCt25dW2YzMiB6wrduXVt1MzIgd2VpZ2h0wrduXVt1MzIgb2JzwrduXVt1MTYgZ2VuZcK3biwgcGFkZGVkXWA7XG4gKiBmbGFncyBiaXQgMCBtYXJrcyBhbiBhZ2dyZWdhdGVkIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVHJhbnNjcmlwdFRpbGUoYnVmOiBBcnJheUJ1ZmZlcik6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gdHJhbnNjcmlwdCB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgW24sIGZsYWdzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBnZW5lUGFkID0gTWF0aC5jZWlsKChuICogMikgLyA0KSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCA4ICsgbiAqIDIwICsgZ2VuZVBhZCwgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICByZXR1cm4ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IChmbGFncyAmIDEpID09PSAxLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCBuKSxcbiAgICB5OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA0LCBuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA4LCBuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTIsIG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkoYnVmLCA4ICsgbiAqIDE2LCBuKSxcbiAgICBnZW5lOiBuZXcgVWludDE2QXJyYXkoYnVmLCA4ICsgbiAqIDIwLCBuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgR0VUIC9kZW5zaXR5P2dlbmVzPSZiaW49YCDihpIgdGhlIHN1bW1lZCByYXN0ZXIuIExheW91dFxuICogYFt1MzIgcm93c11bdTMyIGNvbHNdW2YzMiBjZWxsV11bZjMyIGNlbGxIXVtmMzIgb3JpZ2luWF1bZjMyIG9yaWdpblldW2YzMiByb3dzwrdjb2xzXWA6XG4gKiB0aGUgZ2VvbWV0cnkgdHJhdmVscyB3aXRoIHRoZSB2YWx1ZXMgYmVjYXVzZSByZS1iaW5uaW5nIGNoYW5nZXMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVEZW5zaXR5KGJ1ZjogQXJyYXlCdWZmZXIsIGdlbmVzOiBzdHJpbmdbXSk6IFNwYXRpYWxEZW5zaXR5UmFzdGVyIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBkZW5zaXR5OiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIGNvbnN0IFtyb3dzLCBjb2xzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBbY3csIGNoLCBveCwgb3ldID0gbmV3IEZsb2F0MzJBcnJheShidWYsIDgsIDQpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgMjQgKyByb3dzICogY29scyAqIDQsICdkZW5zaXR5Jyk7XG4gIGNvbnN0IG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YSA9IHsgcm93cywgY29scywgZ3JpZFNpemU6IFtjdywgY2hdLCBvcmlnaW46IFtveCwgb3ldIH07XG4gIHJldHVybiB7IG1ldGEsIGdlbmVzLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAyNCwgcm93cyAqIGNvbHMpIH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybSdcbiAgICA/IG1hbmlmZXN0LnJhZGl1cy52YWx1ZVxuICAgIDogZXh0cmFzLnJhZGl1cztcbiAgY29uc3Qgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zID0ge1xuICAgIGNvdW50OiBtYW5pZmVzdC5jb3VudCxcbiAgICB4OiBjb29yZHMueCxcbiAgICB5OiBjb29yZHMueSxcbiAgICAuLi4oY29vcmRzLnogPyB7IHo6IGNvb3Jkcy56IH0gOiB7fSksXG4gICAgLi4uKGV4dHJhcy5pZHMgPyB7IGlkczogZXh0cmFzLmlkcyB9IDoge30pLFxuICAgIC4uLihyYWRpdXMgIT09IHVuZGVmaW5lZCA/IHsgcmFkaXVzIH0gOiB7fSksXG4gIH07XG4gIHJldHVybiB7XG4gICAgaWQ6IG1hbmlmZXN0LmlkLFxuICAgIG5hbWU6IG1hbmlmZXN0Lm5hbWUsXG4gICAgb2JzZXJ2YXRpb25zLFxuICAgIGNvbHVtbnM6IG1hbmlmZXN0LmNvbHVtbnMgPz8gW10sXG4gICAgLi4uKG1hbmlmZXN0LmZlYXR1cmVzID8geyBmZWF0dXJlczogbWFuaWZlc3QuZmVhdHVyZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QucG9seWdvbnMgPyB7IHBvbHlnb25zOiBtYW5pZmVzdC5wb2x5Z29ucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5pbWFnZVJlZiA/IHsgaW1hZ2VSZWY6IG1hbmlmZXN0LmltYWdlUmVmIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnZvbHVtZSA/IHsgdm9sdW1lOiBtYW5pZmVzdC52b2x1bWUgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QuZW1iZWRkaW5ncz8ubGVuZ3RoID8geyBlbWJlZGRpbmdzOiBtYW5pZmVzdC5lbWJlZGRpbmdzIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBtaWNyb25zUGVyVW5pdDogbWFuaWZlc3QubWljcm9uc1BlclVuaXQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnBvbHlnb25UaWxlcyA/IHsgcG9seWdvblRpbGVzOiBtYW5pZmVzdC5wb2x5Z29uVGlsZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdFRpbGVzID8geyB0cmFuc2NyaXB0VGlsZXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRUaWxlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5kZW5zaXR5ID8geyBkZW5zaXR5OiBtYW5pZmVzdC5kZW5zaXR5IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zID8geyB0cmFuc2NyaXB0QmluczogbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdEdlbmVCaW5zID8geyB0cmFuc2NyaXB0R2VuZUJpbnM6IG1hbmlmZXN0LnRyYW5zY3JpcHRHZW5lQmlucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC50cmFuc2NyaXB0Qmluc1N0YXR1cyA/IHsgdHJhbnNjcmlwdEJpbnNTdGF0dXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zU3RhdHVzIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC13aXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvc3BhdGlhbC1kYXRhLWh0dHAvc3BhdGlhbC13aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxXQUFXLEVBQ1gsY0FBYyxHQW9CZixNQUFNLDBDQUEwQyxDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5REc7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBcUN0QyxvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLGNBQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7WUFDckUsdUVBQXVFLENBQzFFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEdBQWdCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ3hFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsSUFBSSxjQUFjLFFBQVEsZUFBZSxHQUFHLENBQUMsVUFBVSxJQUFJO1lBQ3RFLG1EQUFtRCxDQUN0RCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFN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Q0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xGLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRCxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0UsR0FBRyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNGLEdBQUcsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNsRyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgQ29udGludW91c0NvbHVtbk1ldGEsXG4gIE5PX0NBVEVHT1JZLFxuICBOT19PQlNFUlZBVElPTixcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsRGVuc2l0eU1ldGEsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsRW1iZWRkaW5nLFxuICBTcGF0aWFsRW1iZWRkaW5nTWV0YSxcbiAgU3BhdGlhbEZlYXR1cmVNZXRhLFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEsXG4gIFNwYXRpYWxQb2x5Z29ucyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YSxcbiAgU3BhdGlhbFRyYW5zY3JpcHRHZW5lQmluc01ldGEsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Qmluc1N0YXR1cyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGVzTWV0YSxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSB3aXJlIGZvcm1hdCB0aGUgYnVuZGxlZCBleGFtcGxlIHNlcnZlciBzcGVha3MsIGFuZCBpdHMgZGVjb2RlcnMuXG4gKlxuICogUHVyZSBieSBkZXNpZ24g4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIEhUVFAg4oCUIHNvIHRoZSBmb3JtYXQgaXMgdGVzdGFibGUgb25cbiAqIGl0cyBvd24gYW5kIHJldXNhYmxlIGJ5IGFueSB0cmFuc3BvcnQgKGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBpcyBvbmUpLlxuICogTWlycm9ycyB0aGUgc3BsaXQgaW4gYHBsb3RseS10cmFjZS1idWlsZGVycy50c2A6IHRoZSBzaGFwZSBsaXZlcyBpbiBhIHB1cmVcbiAqIG1vZHVsZSwgdGhlIHNlcnZpY2UganVzdCBtb3ZlcyBieXRlcy5cbiAqXG4gKiBXSFkgQklOQVJZXG4gKiAtLS0tLS0tLS0tXG4gKiBWZWN0b3JzIGFyZSBvbmUgYEZsb2F0MzJBcnJheWAvYFVpbnQxNkFycmF5YCBwZXIgcmVxdWVzdCwgZGVsaXZlcmVkIGFzIHJhd1xuICogbGl0dGxlLWVuZGlhbiBieXRlcy4gSlNPTiB3b3VsZCBjb3N0IH444oCTMTLDlyB0aGUgc2l6ZSBhbmQgYSBwYXJzZSB0aGF0XG4gKiBhbGxvY2F0ZXMgb25lIEpTIG51bWJlciBwZXIgdmFsdWU7IGEgdHlwZWQtYXJyYXkgdmlldyBvdmVyIHRoZSByZXNwb25zZVxuICogYnVmZmVyIGlzIHplcm8tY29weSBhbmQgdXBsb2FkcyB0byB0aGUgR1BVIGRpcmVjdGx5LlxuICpcbiAqIEVORElBTk5FU1NcbiAqIC0tLS0tLS0tLS1cbiAqIExpdHRsZS1lbmRpYW4sIGFzc2VydGVkIGF0IGRlY29kZS4gRXZlcnkgcGxhdGZvcm0gYSBicm93c2VyIHJ1bnMgb24gdG9kYXkgaXNcbiAqIGxpdHRsZS1lbmRpYW4sIHNvIGEgYERhdGFWaWV3YCBieXRlLWJ5LWJ5dGUgcmVhZCB3b3VsZCBjb3N0IHJlYWwgdGltZSBmb3IgYVxuICogY2FzZSB0aGF0IGRvZXMgbm90IG9jY3VyIOKAlCBidXQgZmFpbGluZyBsb3VkbHkgYmVhdHMgcmVuZGVyaW5nIHRyYW5zcG9zZWRcbiAqIGdhcmJhZ2UgaWYgaXQgZXZlciBkb2VzLlxuICpcbiAqIEVORFBPSU5UUyAoYmFzZSA9IHRoZSBzZXJ2ZXIgcm9vdClcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IHJvdXRlIGBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlYCBjYWxscy4gYHtpZH1gIGlzIHRoZSBkYXRhc2V0IGlkOyBuYW1lcyBhbmRcbiAqIGdlbmUgbGlzdHMgYXJlIFVSSS1lbmNvZGVkLlxuICogYGBgXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwvZGF0YXNldHMgICAgICAgICAgICAgIC0+IHsgZGF0YXNldHM6IFt7IGlkLCBuYW1lLCBjb3VudCB9XSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9tYW5pZmVzdCAgICAgICAgIC0+IFNwYXRpYWxNYW5pZmVzdFxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vY29vcmRzICAgICAgICAgICAtPiBmMzJbTl0geCwgZjMyW05dIHksIGYzMltOXSB6P1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vcmFkaXVzICAgICAgICAgICAtPiBmMzJbTl0gICAgICAgICAgIChwZXItb2JzZXJ2YXRpb24gcmFkaXVzIG9ubHkpXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9pZHMgICAgICAgICAgICAgIC0+IHsgaWRzOiBzdHJpbmdbXSB9IChoYXNJZHMgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2NvbHVtbi97bmFtZX0gICAgLT4gdTE2W05dIGNvZGVzIHwgZjMyW05dIHZhbHVlc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZmVhdHVyZS97bmFtZX0gICAtPiBmMzJbTl1cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2ZlYXR1cmVzP3E9JmxpbWl0PSAtPiB7IG5hbWVzOiBzdHJpbmdbXSB9XG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9lbWJlZGRpbmcve25hbWV9IC0+IGYzMltOXSBwZXIgZGltZW5zaW9uLCBzZWUgZGVjb2RlRW1iZWRkaW5nXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS9wb2x5Z29ucyAgICAgICAgIC0+IHUzMiBjb3VudCwgdTMyW2NvdW50KzFdIG9mZnNldHMsIGYzMlsyKnJpbmdzXSBjb29yZHNcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3ZvbHVtZSAgICAgICAgICAgLT4gdThbd2lkdGgqaGVpZ2h0KmRlcHRoXSAgIChtYW5pZmVzdC52b2x1bWUgb25seSlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3BvbHlnb24tdGlsZS97c2V0fS97bGV2ZWx9L3tneH0ve2d5fVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB1MzIgY291bnQsIHUzMltjb3VudF0gb2JzLCB1MzJbY291bnQrMV0gb2Zmc2V0cywgZjMyIGNvb3Jkc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vdHJhbnNjcmlwdC10aWxlL3tsZXZlbH0ve2d4fS97Z3l9P2dlbmVzPUEsQiZxdWFsaXR5PWhpZ2h8YWxsJmJveD1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gc2VlIGRlY29kZVRyYW5zY3JpcHRUaWxlXG4gKiBHRVQge2Jhc2V9L3NwYXRpYWwve2lkfS90cmFuc2NyaXB0LWJpbnMve2xldmVsfS97dHh9L3t0eX1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgb25lIGVudHJ5IHBlciBiaW5cbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L2dlbmUtYmlucy97bGV2ZWx9L3t0eH0ve3R5fT9nZW5lcz1BLEJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gdHJhbnNjcmlwdC10aWxlIGxheW91dCwgcGVyLWdlbmUgYmluc1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZGVuc2l0eT9nZW5lcz1BLEImYmluPSAtPiBzZWUgZGVjb2RlRGVuc2l0eVxuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vdHJhbnNjcmlwdC1zdW1tYXJ5P2JveD0mZ2VuZXM9JmNlbGxzPSAtPiBTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnlcbiAqIEdFVCB7YmFzZX0vc3BhdGlhbC97aWR9L3RyYW5zY3JpcHQtY291bnRzP2dlbmVzPUEsQiAtPiBTcGF0aWFsVHJhbnNjcmlwdENvdW50c1xuICogR0VUIHtiYXNlfS9zcGF0aWFsL3tpZH0vbWFya2Vycy97Y29sdW1ufT9uPSAgLT4gU3BhdGlhbE1hcmtlckdlbmVzXG4gKiBQT1NUIHtiYXNlfS9zcGF0aWFsL3tpZH0vZ3JvdXBzP25hbWU9ICAgICh0ZXh0L2NzdiBgY2VsbF9pZCxncm91cGApXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIG1hdGNoZWQgfVxuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbmFsIHJvdXRlcyBhcmUgYWR2ZXJ0aXNlZCBpbiB0aGUgbWFuaWZlc3QgKGBwb2x5Z29uc2AsIGB2b2x1bWVgLFxuICogYHBvbHlnb25UaWxlc2AsIGB0cmFuc2NyaXB0VGlsZXNgLCBgdHJhbnNjcmlwdEJpbnNgLCBgdHJhbnNjcmlwdEdlbmVCaW5zYCxcbiAqIGBkZW5zaXR5YCk7IGEgc2VydmVyIHdpdGhvdXQgdGhlbSBuZXZlciBzZWVzIHRoZW0gcmVxdWVzdGVkLlxuICovXG5cbi8qKiBCdW1wZWQgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZXMgaW5jb21wYXRpYmx5OyB0aGUgY2xpZW50IHJlZnVzZXMgYW55dGhpbmcgZWxzZS4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1dJUkVfVkVSU0lPTiA9IDE7XG5cbi8qKiBQZXItb2JzZXJ2YXRpb24gbWFya2VyIHJhZGl1czogb25lIHNoYXJlZCB2YWx1ZSwgb3IgYSBzZXJ2ZWQgZjMyIHZlY3Rvci4gKi9cbmV4cG9ydCB0eXBlIFNwYXRpYWxSYWRpdXNTcGVjID0geyBtb2RlOiAndW5pZm9ybSc7IHZhbHVlOiBudW1iZXIgfSB8IHsgbW9kZTogJ3Blci1vYnNlcnZhdGlvbicgfTtcblxuLyoqIGBHRVQgL3NwYXRpYWwve2lkfS9tYW5pZmVzdGAg4oCUIGV2ZXJ5dGhpbmcgY2hlYXAgZW5vdWdoIHRvIHNlbmQgdXAgZnJvbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxNYW5pZmVzdCB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTiDigJQgb2JzZXJ2YXRpb24gY291bnQ7IGV2ZXJ5IHNlcnZlZCB2ZWN0b3IgaGFzIGV4YWN0bHkgdGhpcyBsZW5ndGguICovXG4gIGNvdW50OiBudW1iZXI7XG4gIGhhc1o/OiBib29sZWFuO1xuICBoYXNJZHM/OiBib29sZWFuO1xuICByYWRpdXM/OiBTcGF0aWFsUmFkaXVzU3BlYztcbiAgY29sdW1uczogU3BhdGlhbENvbHVtbk1ldGFbXTtcbiAgZmVhdHVyZXM/OiBTcGF0aWFsRmVhdHVyZU1ldGE7XG4gIHBvbHlnb25zPzogeyBjb3VudDogbnVtYmVyIH07XG4gIGltYWdlUmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICB2b2x1bWU/OiBTcGF0aWFsVm9sdW1lTWV0YTtcbiAgZW1iZWRkaW5ncz86IFNwYXRpYWxFbWJlZGRpbmdNZXRhW107XG4gIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyO1xuICBwb2x5Z29uVGlsZXM/OiBTcGF0aWFsUG9seWdvblRpbGVzTWV0YTtcbiAgdHJhbnNjcmlwdFRpbGVzPzogU3BhdGlhbFRyYW5zY3JpcHRUaWxlc01ldGE7XG4gIGRlbnNpdHk/OiBTcGF0aWFsRGVuc2l0eU1ldGE7XG4gIHRyYW5zY3JpcHRCaW5zPzogU3BhdGlhbFRyYW5zY3JpcHRCaW5zTWV0YTtcbiAgdHJhbnNjcmlwdEJpbnNTdGF0dXM/OiBTcGF0aWFsVHJhbnNjcmlwdEJpbnNTdGF0dXM7XG4gIHRyYW5zY3JpcHRHZW5lQmlucz86IFNwYXRpYWxUcmFuc2NyaXB0R2VuZUJpbnNNZXRhO1xufVxuXG4vKiogYEdFVCAvc3BhdGlhbC9kYXRhc2V0c2AgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbERhdGFzZXRTdW1tYXJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG4vKiogVHJ1ZSBvbiBhIGxpdHRsZS1lbmRpYW4gaG9zdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpOiBib29sZWFuIHtcbiAgY29uc3QgcHJvYmUgPSBuZXcgVWludDE2QXJyYXkoWzFdKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHByb2JlLmJ1ZmZlcilbMF0gPT09IDE7XG59XG5cbmZ1bmN0aW9uIGFzc2VydExpdHRsZUVuZGlhbigpOiB2b2lkIHtcbiAgaWYgKCFpc0xpdHRsZUVuZGlhbigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tzcGF0aWFsXSB3aXJlIGZvcm1hdCBpcyBsaXR0bGUtZW5kaWFuOyB0aGlzIHBsYXRmb3JtIGlzIGJpZy1lbmRpYW4uICcgK1xuICAgICAgICAnU2VydmUgSlNPTiB2ZWN0b3JzLCBvciBieXRlLXN3YXAgaW4gYSBjdXN0b20gU3BhdGlhbERhdGFQb3J0IGFkYXB0ZXIuJyxcbiAgICApO1xuICB9XG59XG5cbi8qKiBHdWFyZCBhIGRlY29kZSBhZ2FpbnN0IGEgdHJ1bmNhdGVkIG9yIG92ZXJzaXplZCByZXNwb25zZS4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ5dGVMZW5ndGgoYnVmOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCAhPT0gZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgW3NwYXRpYWxdICR7d2hhdH06IGV4cGVjdGVkICR7ZXhwZWN0ZWR9IGJ5dGVzLCBnb3QgJHtidWYuYnl0ZUxlbmd0aH0uIGAgK1xuICAgICAgICAnTWFuaWZlc3QgY291bnQgYW5kIHNlcnZlZCB2ZWN0b3IgbGVuZ3RoIGRpc2FncmVlLicsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlamVjdCBhIG1hbmlmZXN0IHRoaXMgY2xpZW50IGNhbm5vdCByZWFkLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIGZpeC5cbiAqXG4gKiBCZXNpZGVzIHRoZSB2ZXJzaW9uLCB0aGUgdmFsdWVzIGV2ZXJ5IGRlY29kZXIgc2l6ZXMgaXRzIHZpZXdzIGZyb206IGFuIG9ic2VydmF0aW9uXG4gKiBjb3VudCB0aGF0IGlzIG5vdCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBvciBhbiBlbWJlZGRpbmcgdGhhdCBpcyBub3QgMi1EIG9yIDMtRCwgd291bGRcbiAqIG90aGVyd2lzZSBzdXJmYWNlIGxhdGVyIGFzIGEgUmFuZ2VFcnJvciBkZWVwIGluc2lkZSBhIHJlbmRlcmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0OiBTcGF0aWFsTWFuaWZlc3QpOiB2b2lkIHtcbiAgaWYgKG1hbmlmZXN0LnZlcnNpb24gIT09IFNQQVRJQUxfV0lSRV9WRVJTSU9OKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFtzcGF0aWFsXSB1bnN1cHBvcnRlZCB3aXJlIHZlcnNpb24gJHttYW5pZmVzdC52ZXJzaW9ufSBgICtcbiAgICAgICAgYCh0aGlzIGNsaWVudCBzcGVha3MgJHtTUEFUSUFMX1dJUkVfVkVSU0lPTn0pLiBVcGRhdGUgdGhlIHNlcnZlciBvciB0aGUgbGlicmFyeS5gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihtYW5pZmVzdC5jb3VudCkgfHwgbWFuaWZlc3QuY291bnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gbWFuaWZlc3QgY291bnQgJHttYW5pZmVzdC5jb3VudH0gaXMgbm90IGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGUgb2YgbWFuaWZlc3QuZW1iZWRkaW5ncyA/PyBbXSkgYXNzZXJ0RW1iZWRkaW5nRGltcyhlKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RW1iZWRkaW5nRGltcyhtZXRhOiBTcGF0aWFsRW1iZWRkaW5nTWV0YSk6IHZvaWQge1xuICBpZiAobWV0YS5kaW1zICE9PSAyICYmIG1ldGEuZGltcyAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIGVtYmVkZGluZyBcIiR7bWV0YS5uYW1lfVwiOiBkaW1zICR7bWV0YS5kaW1zfSBpcyBub3QgMiBvciAzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSaW5nIG9mZnNldHMgbXVzdCBzdGFydCBhdCAwIGFuZCBuZXZlciBnbyBiYWNrd2FyZHM6IGEgZGVjcmVhc2luZyBwYWlyIGlzIGEgbmVnYXRpdmVcbiAqIHZlcnRleCBjb3VudCwgd2hpY2ggYSByZW5kZXJlciB0dXJucyBpbnRvIGBuZXcgRmxvYXQzMkFycmF5KG5lZ2F0aXZlKWAgb24gZXZlcnkgZnJhbWUuXG4gKiAoVGhhdCB0aGUgbGFzdCBvZmZzZXQgbWF0Y2hlcyB0aGUgY29vcmRpbmF0ZSBibG9jayBpcyB0aGUgYnl0ZS1sZW5ndGggY2hlY2sncyBqb2IuKVxuICovXG5mdW5jdGlvbiBhc3NlcnRSaW5nT2Zmc2V0cyhvZmZzZXRzOiBVaW50MzJBcnJheSwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChvZmZzZXRzWzBdICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSAke3doYXR9OiBvZmZzZXRzIG11c3Qgc3RhcnQgYXQgMGApO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2Zmc2V0c1tpXSA8IG9mZnNldHNbaSAtIDFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtzcGF0aWFsXSAke3doYXR9OiBvZmZzZXRzIGRlY3JlYXNlIGF0IHJpbmcgJHtpIC0gMX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEV2ZXJ5IGVudHJ5IG11c3QgbmFtZSBhbiBvYnNlcnZhdGlvbiBiZWxvdyBgY291bnRgLCBvciB7QGxpbmsgTk9fT0JTRVJWQVRJT059LiAqL1xuZnVuY3Rpb24gYXNzZXJ0T2JzZXJ2YXRpb25zKG9ic2VydmF0aW9uOiBVaW50MzJBcnJheSwgY291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JzZXJ2YXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvID0gb2JzZXJ2YXRpb25baV07XG4gICAgaWYgKG8gPj0gY291bnQgJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdICR7d2hhdH06IG9ic2VydmF0aW9uICR7b30gaXMgcGFzdCB0aGUgJHtjb3VudH0gaW4gdGhlIGRhdGFzZXRgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEEgaGVhZGVyLXNpemVkIHByZWZpeCBtdXN0IGJlIHRoZXJlIGJlZm9yZSBhbnkgdmlldyBvdmVyIGl0IGlzIG1hZGUuICovXG5mdW5jdGlvbiBhc3NlcnRIZWFkZXIoYnVmOiBBcnJheUJ1ZmZlciwgYnl0ZXM6IG51bWJlciwgd2hhdDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IGJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gJHt3aGF0fTogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBpdHMgaGVhZGVyICgke2J1Zi5ieXRlTGVuZ3RofSA8ICR7Ynl0ZXN9IGJ5dGVzKWApO1xuICB9XG59XG5cbi8qKlxuICogYEdFVCAvY29vcmRzYCDihpIgeC95KC96KS4gT25lIHJlcXVlc3QgcmF0aGVyIHRoYW4gdHdvIG9yIHRocmVlOiB0aGUgdmVjdG9yc1xuICogYXJlIGFsd2F5cyBmZXRjaGVkIHRvZ2V0aGVyLCBhbmQgYSBzaW5nbGUgcmVzcG9uc2Uga2VlcHMgdGhlbSBjb25zaXN0ZW50IGlmXG4gKiB0aGUgZGF0YXNldCBjaGFuZ2VzIHVuZGVybmVhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb29yZHMoXG4gIGJ1ZjogQXJyYXlCdWZmZXIsXG4gIGNvdW50OiBudW1iZXIsXG4gIGhhc1ogPSBmYWxzZSxcbik6IFBpY2s8U3BhdGlhbE9ic2VydmF0aW9ucywgJ3gnIHwgJ3knIHwgJ3onPiB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBjb25zdCBheGVzID0gaGFzWiA/IDMgOiAyO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiBheGVzICogNCwgJ2Nvb3JkcycpO1xuICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KTtcbiAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDQsIGNvdW50KTtcbiAgY29uc3QgeiA9IGhhc1ogPyBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY291bnQgKiA4LCBjb3VudCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHgsIHksIHogfTtcbn1cblxuLyoqIGBHRVQgL3JhZGl1c2Ag4oaSIHBlci1vYnNlcnZhdGlvbiByYWRpaSBpbiBpbWFnZSBwaXhlbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUmFkaXVzKGJ1ZjogQXJyYXlCdWZmZXIsIGNvdW50OiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBhc3NlcnRMaXR0bGVFbmRpYW4oKTtcbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogNCwgJ3JhZGl1cycpO1xuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KTtcbn1cblxuLyoqXG4gKiBgR0VUIC9zcGF0aWFsL3tpZH0vZW1iZWRkaW5nL3tuYW1lfWAg4oCUIG9uZSBwbGFuZSBwZXIgZGltZW5zaW9uLCBzYW1lIGxheW91dCBhcyBjb29yZHMuXG4gKlxuICogU3RydWN0IG9mIGFycmF5cywgbm90IGludGVybGVhdmVkOiBldmVyeSBkaW1lbnNpb24gaXMgY29udGlndW91cywgc28gYW4gYXhpcyBjYW4gYmUgaGFuZGVkIHRvXG4gKiB0aGUgcmVuZGVyZXIgYXMgYSB2aWV3IHdpdGggbm8gY29weSBhbmQgbm8gc3RyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRW1iZWRkaW5nKGJ1ZjogQXJyYXlCdWZmZXIsIG1ldGE6IFNwYXRpYWxFbWJlZGRpbmdNZXRhLCBjb3VudDogbnVtYmVyKTogU3BhdGlhbEVtYmVkZGluZyB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRFbWJlZGRpbmdEaW1zKG1ldGEpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiBtZXRhLmRpbXMgKiA0LCBgZW1iZWRkaW5nIFwiJHttZXRhLm5hbWV9XCJgKTtcbiAgcmV0dXJuIHtcbiAgICBtZXRhLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCksXG4gICAgeTogbmV3IEZsb2F0MzJBcnJheShidWYsIGNvdW50ICogNCwgY291bnQpLFxuICAgIC4uLihtZXRhLmRpbXMgPT09IDMgPyB7IHo6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb3VudCAqIDgsIGNvdW50KSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogYEdFVCAvZmVhdHVyZS97bmFtZX1gIOKGkiBvbmUgZ2VuZSdzIGV4cHJlc3Npb24gdmVjdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZlYXR1cmVWZWN0b3IoYnVmOiBBcnJheUJ1ZmZlciwgY291bnQ6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiA0LCAnZmVhdHVyZSB2ZWN0b3InKTtcbiAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAwLCBjb3VudCk7XG59XG5cbi8qKlxuICogYEdFVCAvY29sdW1uL3tuYW1lfWAg4oaSIGEgbG9hZGVkIGNvbHVtbiwgdHlwZWQgYnkgaXRzIGRlc2NyaXB0b3I6IGB1MTZgIGNvZGVzXG4gKiBmb3IgYSBjYXRlZ29yaWNhbCwgYGYzMmAgdmFsdWVzIGZvciBhIGNvbnRpbnVvdXMuIENvZGVzIG91dHNpZGUgdGhlIGNhdGVnb3J5XG4gKiBsaXN0IGFyZSBub3JtYWxpc2VkIHRvIHtAbGluayBOT19DQVRFR09SWX0gc28gYSByZW5kZXJlciBjYW4gdHJ1c3QgdGhlXG4gKiBpbnZhcmlhbnQgaW5zdGVhZCBvZiBib3VuZHMtY2hlY2tpbmcgZXZlcnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW4oYnVmOiBBcnJheUJ1ZmZlciwgbWV0YTogU3BhdGlhbENvbHVtbk1ldGEsIGNvdW50OiBudW1iZXIpOiBTcGF0aWFsQ29sdW1uIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChtZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY291bnQgKiAyLCBgY29sdW1uIFwiJHttZXRhLm5hbWV9XCJgKTtcbiAgICBjb25zdCBjb2RlcyA9IG5ldyBVaW50MTZBcnJheShidWYsIDAsIGNvdW50KTtcbiAgICBjb25zdCBuID0gKG1ldGEgYXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhKS5jYXRlZ29yaWVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY29kZXNbaV0gPj0gbikgY29kZXNbaV0gPSBOT19DQVRFR09SWTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWV0YTogbWV0YSBhcyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIGNvZGVzIH07XG4gIH1cbiAgYXNzZXJ0Qnl0ZUxlbmd0aChidWYsIGNvdW50ICogNCwgYGNvbHVtbiBcIiR7bWV0YS5uYW1lfVwiYCk7XG4gIHJldHVybiB7IG1ldGE6IG1ldGEgYXMgQ29udGludW91c0NvbHVtbk1ldGEsIHZhbHVlczogbmV3IEZsb2F0MzJBcnJheShidWYsIDAsIGNvdW50KSB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3BvbHlnb25zYCDihpIgYm91bmRhcnkgcmluZ3MuIExheW91dCBpc1xuICogYFt1MzIgY291bnRdW3UzMiBvZmZzZXRzIMOXIChjb3VudCsxKV1bZjMyIGNvb3JkcyDDlyAywrdvZmZzZXRzW2NvdW50XV1gOyBldmVyeVxuICogZmllbGQgaXMgNC1ieXRlIHdpZGUgc28gZWFjaCB0eXBlZC1hcnJheSB2aWV3IHN0YXlzIGFsaWduZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQb2x5Z29ucyhidWY6IEFycmF5QnVmZmVyKTogU3BhdGlhbFBvbHlnb25zIHtcbiAgYXNzZXJ0TGl0dGxlRW5kaWFuKCk7XG4gIGlmIChidWYuYnl0ZUxlbmd0aCA8IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tzcGF0aWFsXSBwb2x5Z29uczogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBhIGhlYWRlcicpO1xuICB9XG4gIGNvbnN0IGNvdW50ID0gbmV3IFVpbnQzMkFycmF5KGJ1ZiwgMCwgMSlbMF07XG4gIGNvbnN0IGNvb3Jkc0J5dGVPZmZzZXQgPSA0ICsgKGNvdW50ICsgMSkgKiA0O1xuICBhc3NlcnRIZWFkZXIoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCAncG9seWdvbnMnKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShidWYsIDQsIGNvdW50ICsgMSk7XG4gIGFzc2VydFJpbmdPZmZzZXRzKG9mZnNldHMsICdwb2x5Z29ucycpO1xuICBjb25zdCB2ZXJ0ZXhDb3VudCA9IG9mZnNldHNbY291bnRdO1xuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCArIHZlcnRleENvdW50ICogMiAqIDQsICdwb2x5Z29ucycpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgY29vcmRzQnl0ZU9mZnNldCwgdmVydGV4Q291bnQgKiAyKTtcbiAgcmV0dXJuIHsgY29vcmRzLCBvZmZzZXRzLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3BvbHlnb24tdGlsZS8uLi5gIOKGkiBvbmUgdGlsZSBvZiByaW5ncyB3aXRoIHRoZWlyIG93bmluZyBvYnNlcnZhdGlvbnMuIExheW91dFxuICogYFt1MzIgY291bnRdW3UzMiBvYnMgw5cgY291bnRdW3UzMiBvZmZzZXRzIMOXIChjb3VudCsxKV1bZjMyIGNvb3JkcyDDlyAywrdvZmZzZXRzW2NvdW50XV1gLlxuICpcbiAqIGBvYnNlcnZhdGlvbnNgIGlzIHRoZSBkYXRhc2V0J3MgTjsgd2hlbiBnaXZlbiwgZXZlcnkgb3duZXIgbXVzdCBiZSBiZWxvdyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBvbHlnb25UaWxlKGJ1ZjogQXJyYXlCdWZmZXIsIG9ic2VydmF0aW9ucz86IG51bWJlcik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gcG9seWdvbiB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgY291bnQgPSBuZXcgVWludDMyQXJyYXkoYnVmLCAwLCAxKVswXTtcbiAgY29uc3QgY29vcmRzQnl0ZU9mZnNldCA9IDQgKyBjb3VudCAqIDQgKyAoY291bnQgKyAxKSAqIDQ7XG4gIGFzc2VydEhlYWRlcihidWYsIGNvb3Jkc0J5dGVPZmZzZXQsICdwb2x5Z29uIHRpbGUnKTtcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoYnVmLCA0LCBjb3VudCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoYnVmLCA0ICsgY291bnQgKiA0LCBjb3VudCArIDEpO1xuICBhc3NlcnRSaW5nT2Zmc2V0cyhvZmZzZXRzLCAncG9seWdvbiB0aWxlJyk7XG4gIGNvbnN0IHZlcnRleENvdW50ID0gb2Zmc2V0c1tjb3VudF07XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCBjb29yZHNCeXRlT2Zmc2V0ICsgdmVydGV4Q291bnQgKiA4LCAncG9seWdvbiB0aWxlJyk7XG4gIGFzc2VydE9ic2VydmF0aW9ucyhvYnNlcnZhdGlvbiwgb2JzZXJ2YXRpb25zLCAncG9seWdvbiB0aWxlJyk7XG4gIHJldHVybiB7XG4gICAgY291bnQsXG4gICAgb2JzZXJ2YXRpb24sXG4gICAgb2Zmc2V0cyxcbiAgICBjb29yZHM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCBjb29yZHNCeXRlT2Zmc2V0LCB2ZXJ0ZXhDb3VudCAqIDIpLFxuICB9O1xufVxuXG4vKipcbiAqIGBHRVQgL3RyYW5zY3JpcHQtdGlsZS8uLi5gIOKGkiB0cmFuc2NyaXB0cyBvciBhZ2dyZWdhdGVzLiBMYXlvdXQsIDQtYnl0ZSBhbGlnbmVkOlxuICogYFt1MzIgbl1bdTMyIGZsYWdzXVtmMzIgeMK3bl1bZjMyIHnCt25dW2YzMiB6wrduXVt1MzIgd2VpZ2h0wrduXVt1MzIgb2JzwrduXVt1MTYgZ2VuZcK3biwgcGFkZGVkXWA7XG4gKiBmbGFncyBiaXQgMCBtYXJrcyBhbiBhZ2dyZWdhdGVkIGxldmVsLlxuICpcbiAqIGBsaW1pdHNgIGJvdW5kcyB0aGUgaW5kaWNlcyB3aGVuIHRoZSBjYWxsZXIga25vd3MgdGhlbTogYG9ic2VydmF0aW9uc2AgaXMgdGhlIGRhdGFzZXQnc1xuICogTiwgYW5kIGBnZW5lc2AgdGhlIGxlbmd0aCBvZiB0aGUgZ2VuZSBsaXN0IHRoZSBjb2RlcyBpbmRleCAob21pdCBpdCBmb3IgYEFMTF9HRU5FU2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVHJhbnNjcmlwdFRpbGUoXG4gIGJ1ZjogQXJyYXlCdWZmZXIsXG4gIGxpbWl0czogeyBvYnNlcnZhdGlvbnM/OiBudW1iZXI7IGdlbmVzPzogbnVtYmVyIH0gPSB7fSxcbik6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCA4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gdHJhbnNjcmlwdCB0aWxlOiByZXNwb25zZSB0b28gc2hvcnQgZm9yIGEgaGVhZGVyJyk7XG4gIH1cbiAgY29uc3QgW24sIGZsYWdzXSA9IG5ldyBVaW50MzJBcnJheShidWYsIDAsIDIpO1xuICBjb25zdCBnZW5lUGFkID0gTWF0aC5jZWlsKChuICogMikgLyA0KSAqIDQ7XG4gIGFzc2VydEJ5dGVMZW5ndGgoYnVmLCA4ICsgbiAqIDIwICsgZ2VuZVBhZCwgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTYsIG4pO1xuICBjb25zdCBnZW5lID0gbmV3IFVpbnQxNkFycmF5KGJ1ZiwgOCArIG4gKiAyMCwgbik7XG4gIGFzc2VydE9ic2VydmF0aW9ucyhvYnNlcnZhdGlvbiwgbGltaXRzLm9ic2VydmF0aW9ucywgJ3RyYW5zY3JpcHQgdGlsZScpO1xuICBpZiAobGltaXRzLmdlbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYgKGdlbmVbaV0gPj0gbGltaXRzLmdlbmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3NwYXRpYWxdIHRyYW5zY3JpcHQgdGlsZTogZ2VuZSBjb2RlICR7Z2VuZVtpXX0gaXMgcGFzdCB0aGUgJHtsaW1pdHMuZ2VuZXN9IGFza2VkIGZvcmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IChmbGFncyAmIDEpID09PSAxLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCBuKSxcbiAgICB5OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA0LCBuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KGJ1ZiwgOCArIG4gKiA4LCBuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShidWYsIDggKyBuICogMTIsIG4pLFxuICAgIG9ic2VydmF0aW9uLFxuICAgIGdlbmUsXG4gIH07XG59XG5cbi8qKlxuICogYEdFVCAvZGVuc2l0eT9nZW5lcz0mYmluPWAg4oaSIHRoZSBzdW1tZWQgcmFzdGVyLiBMYXlvdXRcbiAqIGBbdTMyIHJvd3NdW3UzMiBjb2xzXVtmMzIgY2VsbFddW2YzMiBjZWxsSF1bZjMyIG9yaWdpblhdW2YzMiBvcmlnaW5ZXVtmMzIgcm93c8K3Y29sc11gOlxuICogdGhlIGdlb21ldHJ5IHRyYXZlbHMgd2l0aCB0aGUgdmFsdWVzIGJlY2F1c2UgcmUtYmlubmluZyBjaGFuZ2VzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGVuc2l0eShidWY6IEFycmF5QnVmZmVyLCBnZW5lczogc3RyaW5nW10pOiBTcGF0aWFsRGVuc2l0eVJhc3RlciB7XG4gIGFzc2VydExpdHRsZUVuZGlhbigpO1xuICBpZiAoYnVmLmJ5dGVMZW5ndGggPCAyNCkgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gZGVuc2l0eTogcmVzcG9uc2UgdG9vIHNob3J0IGZvciBhIGhlYWRlcicpO1xuICBjb25zdCBbcm93cywgY29sc10gPSBuZXcgVWludDMyQXJyYXkoYnVmLCAwLCAyKTtcbiAgY29uc3QgW2N3LCBjaCwgb3gsIG95XSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCA4LCA0KTtcbiAgLy8gVGhlIGNlbGwgc2l6ZSBkaXZpZGVzIGV2ZXJ5IGRvd25zdHJlYW0gcG9zaXRpb247IHplcm8sIG5lZ2F0aXZlIG9yIE5hTiBpcyB1bnVzYWJsZS5cbiAgaWYgKCEoY3cgPiAwICYmIGNoID4gMCAmJiBOdW1iZXIuaXNGaW5pdGUoY3cpICYmIE51bWJlci5pc0Zpbml0ZShjaCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbc3BhdGlhbF0gZGVuc2l0eTogZ3JpZCBzaXplICR7Y3d9IHggJHtjaH0gaXMgbm90IHBvc2l0aXZlIGFuZCBmaW5pdGVgKTtcbiAgfVxuICBhc3NlcnRCeXRlTGVuZ3RoKGJ1ZiwgMjQgKyByb3dzICogY29scyAqIDQsICdkZW5zaXR5Jyk7XG4gIGNvbnN0IG1ldGE6IFNwYXRpYWxEZW5zaXR5TWV0YSA9IHsgcm93cywgY29scywgZ3JpZFNpemU6IFtjdywgY2hdLCBvcmlnaW46IFtveCwgb3ldIH07XG4gIHJldHVybiB7IG1ldGEsIGdlbmVzLCB2YWx1ZXM6IG5ldyBGbG9hdDMyQXJyYXkoYnVmLCAyNCwgcm93cyAqIGNvbHMpIH07XG59XG5cbi8qKlxuICogRm9sZCBhIG1hbmlmZXN0IHBsdXMgaXRzIGZldGNoZWQgY29vcmRpbmF0ZS9pZC9yYWRpdXMgdmVjdG9ycyBpbnRvIHRoZVxuICogbGlicmFyeS1mYWNpbmcge0BsaW5rIFNwYXRpYWxEYXRhc2V0fS4gQ29sdW1uIGFuZCBmZWF0dXJlICp2YWx1ZXMqIGFyZSBub3RcbiAqIHBhcnQgb2YgdGhpcyDigJQgdGhleSBzdGF5IGxhenkgYmVoaW5kIHRoZSBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21NYW5pZmVzdChcbiAgbWFuaWZlc3Q6IFNwYXRpYWxNYW5pZmVzdCxcbiAgY29vcmRzOiBQaWNrPFNwYXRpYWxPYnNlcnZhdGlvbnMsICd4JyB8ICd5JyB8ICd6Jz4sXG4gIGV4dHJhczogeyBpZHM/OiBzdHJpbmdbXTsgcmFkaXVzPzogRmxvYXQzMkFycmF5IH0gPSB7fSxcbik6IFNwYXRpYWxEYXRhc2V0IHtcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uKG1hbmlmZXN0KTtcbiAgY29uc3QgcmFkaXVzID0gbWFuaWZlc3QucmFkaXVzPy5tb2RlID09PSAndW5pZm9ybScgPyBtYW5pZmVzdC5yYWRpdXMudmFsdWUgOiBleHRyYXMucmFkaXVzO1xuICBjb25zdCBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMgPSB7XG4gICAgY291bnQ6IG1hbmlmZXN0LmNvdW50LFxuICAgIHg6IGNvb3Jkcy54LFxuICAgIHk6IGNvb3Jkcy55LFxuICAgIC4uLihjb29yZHMueiA/IHsgejogY29vcmRzLnogfSA6IHt9KSxcbiAgICAuLi4oZXh0cmFzLmlkcyA/IHsgaWRzOiBleHRyYXMuaWRzIH0gOiB7fSksXG4gICAgLi4uKHJhZGl1cyAhPT0gdW5kZWZpbmVkID8geyByYWRpdXMgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWFuaWZlc3QuaWQsXG4gICAgbmFtZTogbWFuaWZlc3QubmFtZSxcbiAgICBvYnNlcnZhdGlvbnMsXG4gICAgY29sdW1uczogbWFuaWZlc3QuY29sdW1ucyA/PyBbXSxcbiAgICAuLi4obWFuaWZlc3QuZmVhdHVyZXMgPyB7IGZlYXR1cmVzOiBtYW5pZmVzdC5mZWF0dXJlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5wb2x5Z29ucyA/IHsgcG9seWdvbnM6IG1hbmlmZXN0LnBvbHlnb25zIH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LmltYWdlUmVmID8geyBpbWFnZVJlZjogbWFuaWZlc3QuaW1hZ2VSZWYgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3Qudm9sdW1lID8geyB2b2x1bWU6IG1hbmlmZXN0LnZvbHVtZSB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5lbWJlZGRpbmdzPy5sZW5ndGggPyB7IGVtYmVkZGluZ3M6IG1hbmlmZXN0LmVtYmVkZGluZ3MgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QubWljcm9uc1BlclVuaXQgIT09IHVuZGVmaW5lZCA/IHsgbWljcm9uc1BlclVuaXQ6IG1hbmlmZXN0Lm1pY3JvbnNQZXJVbml0IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnBvbHlnb25UaWxlcyA/IHsgcG9seWdvblRpbGVzOiBtYW5pZmVzdC5wb2x5Z29uVGlsZXMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdFRpbGVzID8geyB0cmFuc2NyaXB0VGlsZXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRUaWxlcyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC5kZW5zaXR5ID8geyBkZW5zaXR5OiBtYW5pZmVzdC5kZW5zaXR5IH0gOiB7fSksXG4gICAgLi4uKG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zID8geyB0cmFuc2NyaXB0QmluczogbWFuaWZlc3QudHJhbnNjcmlwdEJpbnMgfSA6IHt9KSxcbiAgICAuLi4obWFuaWZlc3QudHJhbnNjcmlwdEdlbmVCaW5zID8geyB0cmFuc2NyaXB0R2VuZUJpbnM6IG1hbmlmZXN0LnRyYW5zY3JpcHRHZW5lQmlucyB9IDoge30pLFxuICAgIC4uLihtYW5pZmVzdC50cmFuc2NyaXB0Qmluc1N0YXR1cyA/IHsgdHJhbnNjcmlwdEJpbnNTdGF0dXM6IG1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zU3RhdHVzIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /** Shared jit-service tile client (OSD-PLOTLY-15 / NAPARI-SVC-20). */
2
+ export * from './tile-protocol';
3
+ export * from './transport';
4
+ export * from './poll-descriptor';
5
+ export * from './native-histogram';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy90aWxlLXNlcnZlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRUFBc0U7QUFDdEUsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2hhcmVkIGppdC1zZXJ2aWNlIHRpbGUgY2xpZW50IChPU0QtUExPVExZLTE1IC8gTkFQQVJJLVNWQy0yMCkuICovXG5leHBvcnQgKiBmcm9tICcuL3RpbGUtcHJvdG9jb2wnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3BvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wb2xsLWRlc2NyaXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9uYXRpdmUtaGlzdG9ncmFtJztcbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { nativeHistogramUrl } from './tile-protocol';
2
+ /** Map the server's HistogramInfo to an {@link IHistogram} with native bin left-edges
3
+ * (`rangeMin + i * binWidth`). */
4
+ export function toNativeHistogram(hi) {
5
+ return {
6
+ bins: hi.counts.map((_, i) => hi.rangeMin + i * hi.binWidth),
7
+ counts: hi.counts,
8
+ max: hi.counts.reduce((m, c) => (c > m ? c : m), 0),
9
+ bitDepth: hi.bitDepth,
10
+ rangeMin: hi.rangeMin,
11
+ rangeMax: hi.rangeMax,
12
+ observedMin: hi.observedMin,
13
+ observedMax: hi.observedMax,
14
+ };
15
+ }
16
+ /**
17
+ * One channel's native-bit-depth histogram from `GET /histogram` (>8-bit images: the 8-bit display
18
+ * tiles cannot carry 16-bit values). The URL carries the per-app-load cache-buster.
19
+ *
20
+ * Resolves null when the server has no answer yet (202 while caching, or another status, or no
21
+ * counts) — the caller's pane retries. Transport failures propagate, so each backend keeps its
22
+ * own tagged catch; caching is the caller's too.
23
+ */
24
+ export async function nativeHistogram(fetchJson, api, infoB64, req, signal) {
25
+ const resp = await fetchJson(nativeHistogramUrl(api, infoB64, req), signal);
26
+ if (resp.status !== 200 || !resp.body?.counts)
27
+ return null;
28
+ return toNativeHistogram(resp.body);
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLWhpc3RvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3RpbGUtc2VydmVyL25hdGl2ZS1oaXN0b2dyYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUEwQixrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBYzdFO21DQUNtQztBQUNuQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBdUI7SUFDdkQsT0FBTztRQUNMLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDNUQsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1FBQ2pCLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1FBQ3JCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtRQUNyQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7UUFDckIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1FBQzNCLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztLQUM1QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsU0FBb0IsRUFDcEIsR0FBVyxFQUNYLE9BQWUsRUFDZixHQUEyQixFQUMzQixNQUFvQjtJQUVwQixNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBc0Isa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3QsIG5hdGl2ZUhpc3RvZ3JhbVVybCB9IGZyb20gJy4vdGlsZS1wcm90b2NvbCc7XG5pbXBvcnQgeyBGZXRjaEpzb24gfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5cbi8qKiBUaGUgc2VydmVyJ3MgYC9oaXN0b2dyYW1gIGFuc3dlciAoSGlzdG9ncmFtSW5mbykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZUhpc3RvZ3JhbVdpcmUge1xuICBiaXREZXB0aDogbnVtYmVyO1xuICByYW5nZU1pbjogbnVtYmVyO1xuICByYW5nZU1heDogbnVtYmVyO1xuICBvYnNlcnZlZE1pbjogbnVtYmVyO1xuICBvYnNlcnZlZE1heDogbnVtYmVyO1xuICBiaW5XaWR0aDogbnVtYmVyO1xuICBjb3VudHM6IG51bWJlcltdO1xufVxuXG4vKiogTWFwIHRoZSBzZXJ2ZXIncyBIaXN0b2dyYW1JbmZvIHRvIGFuIHtAbGluayBJSGlzdG9ncmFtfSB3aXRoIG5hdGl2ZSBiaW4gbGVmdC1lZGdlc1xuICogIChgcmFuZ2VNaW4gKyBpICogYmluV2lkdGhgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b05hdGl2ZUhpc3RvZ3JhbShoaTogTmF0aXZlSGlzdG9ncmFtV2lyZSk6IElIaXN0b2dyYW0ge1xuICByZXR1cm4ge1xuICAgIGJpbnM6IGhpLmNvdW50cy5tYXAoKF8sIGkpID0+IGhpLnJhbmdlTWluICsgaSAqIGhpLmJpbldpZHRoKSxcbiAgICBjb3VudHM6IGhpLmNvdW50cyxcbiAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgYml0RGVwdGg6IGhpLmJpdERlcHRoLFxuICAgIHJhbmdlTWluOiBoaS5yYW5nZU1pbixcbiAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgb2JzZXJ2ZWRNaW46IGhpLm9ic2VydmVkTWluLFxuICAgIG9ic2VydmVkTWF4OiBoaS5vYnNlcnZlZE1heCxcbiAgfTtcbn1cblxuLyoqXG4gKiBPbmUgY2hhbm5lbCdzIG5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGZyb20gYEdFVCAvaGlzdG9ncmFtYCAoPjgtYml0IGltYWdlczogdGhlIDgtYml0IGRpc3BsYXlcbiAqIHRpbGVzIGNhbm5vdCBjYXJyeSAxNi1iaXQgdmFsdWVzKS4gVGhlIFVSTCBjYXJyaWVzIHRoZSBwZXItYXBwLWxvYWQgY2FjaGUtYnVzdGVyLlxuICpcbiAqIFJlc29sdmVzIG51bGwgd2hlbiB0aGUgc2VydmVyIGhhcyBubyBhbnN3ZXIgeWV0ICgyMDIgd2hpbGUgY2FjaGluZywgb3IgYW5vdGhlciBzdGF0dXMsIG9yIG5vXG4gKiBjb3VudHMpIOKAlCB0aGUgY2FsbGVyJ3MgcGFuZSByZXRyaWVzLiBUcmFuc3BvcnQgZmFpbHVyZXMgcHJvcGFnYXRlLCBzbyBlYWNoIGJhY2tlbmQga2VlcHMgaXRzXG4gKiBvd24gdGFnZ2VkIGNhdGNoOyBjYWNoaW5nIGlzIHRoZSBjYWxsZXIncyB0b28uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYXRpdmVIaXN0b2dyYW0oXG4gIGZldGNoSnNvbjogRmV0Y2hKc29uLFxuICBhcGk6IHN0cmluZyxcbiAgaW5mb0I2NDogc3RyaW5nLFxuICByZXE6IE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3QsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2hKc29uPE5hdGl2ZUhpc3RvZ3JhbVdpcmU+KG5hdGl2ZUhpc3RvZ3JhbVVybChhcGksIGluZm9CNjQsIHJlcSksIHNpZ25hbCk7XG4gIGlmIChyZXNwLnN0YXR1cyAhPT0gMjAwIHx8ICFyZXNwLmJvZHk/LmNvdW50cykgcmV0dXJuIG51bGw7XG4gIHJldHVybiB0b05hdGl2ZUhpc3RvZ3JhbShyZXNwLmJvZHkpO1xufVxuIl19
@@ -0,0 +1,65 @@
1
+ import { abortError, abortableDelay, timeoutSignal } from './transport';
2
+ /** Default per-request timeout of {@link pollDescriptor}. */
3
+ export const DESCRIPTOR_REQUEST_TIMEOUT_MS = 45000;
4
+ /**
5
+ * Poll `GET /tiles/info` until the server describes the source.
6
+ *
7
+ * The server answers 202 while it is still caching the source (GCS → PVC, which can take minutes
8
+ * for a cold whole-slide image) and 200 with the descriptor once ready. So:
9
+ * - **202** → wait `intervalMs` and poll again, until `deadlineMs`;
10
+ * - **200 with levels** → the descriptor;
11
+ * - **any other status**, or a 200 without levels → `null` at once: this server will not describe
12
+ * the source, and polling it for minutes only delays the caller's fallback (NAPARI-SVC-3);
13
+ * - a **transport failure** (network error, per-request timeout) → retried like a 202: a large
14
+ * image always passes through a busy window, and one bad poll must not abandon it;
15
+ * - the **deadline** passing → `null`.
16
+ *
17
+ * The first request is issued synchronously, before the returned promise first awaits. Rejects
18
+ * with an `AbortError` as soon as `signal` aborts (between polls, or mid-request when the
19
+ * transport honours the signal).
20
+ *
21
+ * These are the napari-js backend's hardened semantics; the OpenSeadragon backend used to throw on
22
+ * the deadline and to retry every error status. It now shares this answer and turns `null` into
23
+ * its own load failure (see `OpenSeadragonVisualizerService.load`).
24
+ */
25
+ export async function pollDescriptor(fetchJson, url, opts) {
26
+ const { signal } = opts;
27
+ const tag = opts.tag ?? '[tiles]';
28
+ const requestTimeoutMs = opts.requestTimeoutMs ?? DESCRIPTOR_REQUEST_TIMEOUT_MS;
29
+ const deadline = Date.now() + opts.deadlineMs;
30
+ for (;;) {
31
+ if (signal?.aborted)
32
+ throw abortError();
33
+ const req = timeoutSignal(signal, requestTimeoutMs);
34
+ try {
35
+ const resp = await fetchJson(url, req.signal);
36
+ if (signal?.aborted)
37
+ throw abortError();
38
+ if (resp.status === 200) {
39
+ if (resp.body?.levels?.length)
40
+ return resp.body;
41
+ console.warn(`${tag} tiles/info answered without levels`);
42
+ return null;
43
+ }
44
+ if (resp.status !== 202) {
45
+ console.warn(`${tag} tiles/info → ${resp.status}`);
46
+ return null;
47
+ }
48
+ // 202: still caching → re-poll until the deadline.
49
+ }
50
+ catch (err) {
51
+ if (signal?.aborted)
52
+ throw abortError();
53
+ console.warn(`${tag} tiles/info poll retry`, err);
54
+ }
55
+ finally {
56
+ req.done();
57
+ }
58
+ if (Date.now() > deadline) {
59
+ console.warn(`${tag} tiles/info not ready before the deadline — file still caching`);
60
+ return null;
61
+ }
62
+ await abortableDelay(opts.intervalMs, signal);
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbC1kZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvdGlsZS1zZXJ2ZXIvcG9sbC1kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYSxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWdCbkYsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsU0FBb0IsRUFDcEIsR0FBVyxFQUNYLElBQTJCO0lBRTNCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUM7SUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksNkJBQTZCLENBQUM7SUFDaEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDOUMsU0FBUyxDQUFDO1FBQ1IsSUFBSSxNQUFNLEVBQUUsT0FBTztZQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFpQixHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlELElBQUksTUFBTSxFQUFFLE9BQU87Z0JBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTTtvQkFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLHFDQUFxQyxDQUFDLENBQUM7Z0JBQzFELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxtREFBbUQ7UUFDckQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLE1BQU0sRUFBRSxPQUFPO2dCQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLGdFQUFnRSxDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRpbGVEZXNjcmlwdG9yIH0gZnJvbSAnLi90aWxlLXByb3RvY29sJztcbmltcG9ydCB7IEZldGNoSnNvbiwgYWJvcnRFcnJvciwgYWJvcnRhYmxlRGVsYXksIHRpbWVvdXRTaWduYWwgfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5cbi8qKiBUaW1pbmcgb2Ygb25lIHtAbGluayBwb2xsRGVzY3JpcHRvcn0gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xsRGVzY3JpcHRvck9wdGlvbnMge1xuICAvKiogR2l2ZSB1cCAocmVzb2x2ZSBudWxsKSBvbmNlIHRoaXMgbG9uZyBoYXMgcGFzc2VkIHdpdGhvdXQgYSBkZXNjcmlwdG9yLiAqL1xuICBkZWFkbGluZU1zOiBudW1iZXI7XG4gIC8qKiBXYWl0IGJldHdlZW4gdHdvIHBvbGxzIHdoaWxlIHRoZSBzZXJ2ZXIgYW5zd2VycyAyMDIuICovXG4gIGludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFBlci1yZXF1ZXN0IHRpbWVvdXQsIHNvIGEgaHVuZyByZXF1ZXN0IGNhbm5vdCBvdXRsaXZlIHRoZSBkZWFkbGluZS4gRGVmYXVsdCA0NSBzLiAqL1xuICByZXF1ZXN0VGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQWJvcnQgdGhlIHdob2xlIHBvbGw6IGl0IHRoZW4gcmVqZWN0cyB3aXRoIGFuIGBBYm9ydEVycm9yYC4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBMb2cgcHJlZml4IGZvciB0aGUgcG9sbCdzIHdhcm5pbmdzLCBlLmcuIGBbT1NEXWAuICovXG4gIHRhZz86IHN0cmluZztcbn1cblxuLyoqIERlZmF1bHQgcGVyLXJlcXVlc3QgdGltZW91dCBvZiB7QGxpbmsgcG9sbERlc2NyaXB0b3J9LiAqL1xuZXhwb3J0IGNvbnN0IERFU0NSSVBUT1JfUkVRVUVTVF9USU1FT1VUX01TID0gNDUwMDA7XG5cbi8qKlxuICogUG9sbCBgR0VUIC90aWxlcy9pbmZvYCB1bnRpbCB0aGUgc2VydmVyIGRlc2NyaWJlcyB0aGUgc291cmNlLlxuICpcbiAqIFRoZSBzZXJ2ZXIgYW5zd2VycyAyMDIgd2hpbGUgaXQgaXMgc3RpbGwgY2FjaGluZyB0aGUgc291cmNlIChHQ1Mg4oaSIFBWQywgd2hpY2ggY2FuIHRha2UgbWludXRlc1xuICogZm9yIGEgY29sZCB3aG9sZS1zbGlkZSBpbWFnZSkgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgcmVhZHkuIFNvOlxuICogIC0gKioyMDIqKiDihpIgd2FpdCBgaW50ZXJ2YWxNc2AgYW5kIHBvbGwgYWdhaW4sIHVudGlsIGBkZWFkbGluZU1zYDtcbiAqICAtICoqMjAwIHdpdGggbGV2ZWxzKiog4oaSIHRoZSBkZXNjcmlwdG9yO1xuICogIC0gKiphbnkgb3RoZXIgc3RhdHVzKiosIG9yIGEgMjAwIHdpdGhvdXQgbGV2ZWxzIOKGkiBgbnVsbGAgYXQgb25jZTogdGhpcyBzZXJ2ZXIgd2lsbCBub3QgZGVzY3JpYmVcbiAqICAgIHRoZSBzb3VyY2UsIGFuZCBwb2xsaW5nIGl0IGZvciBtaW51dGVzIG9ubHkgZGVsYXlzIHRoZSBjYWxsZXIncyBmYWxsYmFjayAoTkFQQVJJLVNWQy0zKTtcbiAqICAtIGEgKip0cmFuc3BvcnQgZmFpbHVyZSoqIChuZXR3b3JrIGVycm9yLCBwZXItcmVxdWVzdCB0aW1lb3V0KSDihpIgcmV0cmllZCBsaWtlIGEgMjAyOiBhIGxhcmdlXG4gKiAgICBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggYSBidXN5IHdpbmRvdywgYW5kIG9uZSBiYWQgcG9sbCBtdXN0IG5vdCBhYmFuZG9uIGl0O1xuICogIC0gdGhlICoqZGVhZGxpbmUqKiBwYXNzaW5nIOKGkiBgbnVsbGAuXG4gKlxuICogVGhlIGZpcnN0IHJlcXVlc3QgaXMgaXNzdWVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSB0aGUgcmV0dXJuZWQgcHJvbWlzZSBmaXJzdCBhd2FpdHMuIFJlamVjdHNcbiAqIHdpdGggYW4gYEFib3J0RXJyb3JgIGFzIHNvb24gYXMgYHNpZ25hbGAgYWJvcnRzIChiZXR3ZWVuIHBvbGxzLCBvciBtaWQtcmVxdWVzdCB3aGVuIHRoZVxuICogdHJhbnNwb3J0IGhvbm91cnMgdGhlIHNpZ25hbCkuXG4gKlxuICogVGhlc2UgYXJlIHRoZSBuYXBhcmktanMgYmFja2VuZCdzIGhhcmRlbmVkIHNlbWFudGljczsgdGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCB1c2VkIHRvIHRocm93IG9uXG4gKiB0aGUgZGVhZGxpbmUgYW5kIHRvIHJldHJ5IGV2ZXJ5IGVycm9yIHN0YXR1cy4gSXQgbm93IHNoYXJlcyB0aGlzIGFuc3dlciBhbmQgdHVybnMgYG51bGxgIGludG9cbiAqIGl0cyBvd24gbG9hZCBmYWlsdXJlIChzZWUgYE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZS5sb2FkYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsRGVzY3JpcHRvcihcbiAgZmV0Y2hKc29uOiBGZXRjaEpzb24sXG4gIHVybDogc3RyaW5nLFxuICBvcHRzOiBQb2xsRGVzY3JpcHRvck9wdGlvbnMsXG4pOiBQcm9taXNlPFRpbGVEZXNjcmlwdG9yIHwgbnVsbD4ge1xuICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0cztcbiAgY29uc3QgdGFnID0gb3B0cy50YWcgPz8gJ1t0aWxlc10nO1xuICBjb25zdCByZXF1ZXN0VGltZW91dE1zID0gb3B0cy5yZXF1ZXN0VGltZW91dE1zID8/IERFU0NSSVBUT1JfUkVRVUVTVF9USU1FT1VUX01TO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBvcHRzLmRlYWRsaW5lTXM7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKCk7XG4gICAgY29uc3QgcmVxID0gdGltZW91dFNpZ25hbChzaWduYWwsIHJlcXVlc3RUaW1lb3V0TXMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2hKc29uPFRpbGVEZXNjcmlwdG9yPih1cmwsIHJlcS5zaWduYWwpO1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcigpO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgaWYgKHJlc3AuYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHJldHVybiByZXNwLmJvZHk7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0YWd9IHRpbGVzL2luZm8gYW5zd2VyZWQgd2l0aG91dCBsZXZlbHNgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocmVzcC5zdGF0dXMgIT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIOKGkiAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIDIwMjogc3RpbGwgY2FjaGluZyDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKCk7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIHBvbGwgcmV0cnlgLCBlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXEuZG9uZSgpO1xuICAgIH1cbiAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7dGFnfSB0aWxlcy9pbmZvIG5vdCByZWFkeSBiZWZvcmUgdGhlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBhYm9ydGFibGVEZWxheShvcHRzLmludGVydmFsTXMsIHNpZ25hbCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The jit-service tile protocol, shared by the OpenSeadragon and napari-js backends: the
3
+ * `/tiles/info` descriptor, and the URLs of `/tiles/info`, `/tile`, `/histogram` and
4
+ * `/export/tiff`. Each URL shape lives here once — the backends used to string-build them
5
+ * separately and had already drifted (napari's `/histogram` lacked the cache-buster).
6
+ */
7
+ /** The `/tiles/info` descriptor URL for one source. */
8
+ export function tilesInfoUrl(api, infoB64) {
9
+ return `${api}tiles/info?info=${infoB64}`;
10
+ }
11
+ /** Build the `/tile` request URL — the one place its query shape lives (the
12
+ * server caches on the exact parameter order). */
13
+ export function buildTileUrl(api, infoB64, c) {
14
+ const ch = c.channel == null ? '' : `&channel=${c.channel}`;
15
+ return `${api}tile?info=${infoB64}&res=${c.res}&col=${c.col}&row=${c.row}&z=${c.z}&tileSize=${c.tileSize}${ch}`;
16
+ }
17
+ /**
18
+ * Per-app-load cache-buster for `/histogram`. The server marks the response
19
+ * cacheable for 24 h, and a hard refresh can't bust a post-load XHR. A token
20
+ * stable within a session (so the backends' in-session caches still dedupe) but
21
+ * new on each full load always reflects the live backend after a reload.
22
+ */
23
+ export const HISTOGRAM_CACHE_BUSTER = Date.now();
24
+ /** The `/histogram` URL, with the cache-buster (see {@link HISTOGRAM_CACHE_BUSTER}). */
25
+ export function nativeHistogramUrl(api, infoB64, r, cacheBuster = HISTOGRAM_CACHE_BUSTER) {
26
+ return `${api}histogram?info=${infoB64}&channel=${r.channel}&z=${r.z}&bins=${r.bins}&_=${cacheBuster}`;
27
+ }
28
+ /**
29
+ * The `/export/tiff` URL for slice `z`. `visible` are the channel indices to
30
+ * export; the `channels` param is omitted when every one of the `channelCount`
31
+ * channels is visible (or none is), which is the server default (all).
32
+ */
33
+ export function exportTiffUrl(api, infoB64, z, visible, channelCount) {
34
+ const ch = visible.length && visible.length < channelCount ? `&channels=${visible.join(',')}` : '';
35
+ return `${api}export/tiff?info=${infoB64}&z=${z}${ch}`;
36
+ }
37
+ /** The saved name of a native-bit-depth TIFF export of `fileName`. */
38
+ export function exportTiffFilename(fileName) {
39
+ const stem = (fileName || 'image').replace(/\.[^.]+$/, '');
40
+ return `${stem}_16bit.ome.tif`;
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3RpbGUtc2VydmVyL3RpbGUtcHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFzREgsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBVyxFQUFFLE9BQWU7SUFDdkQsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLE9BQU8sRUFBRSxDQUFDO0FBQzVDLENBQUM7QUFFRDttREFDbUQ7QUFDbkQsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXLEVBQUUsT0FBZSxFQUFFLENBQWE7SUFDdEUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUQsT0FBTyxHQUFHLEdBQUcsYUFBYSxPQUFPLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ2xILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQVNqRCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxHQUFXLEVBQ1gsT0FBZSxFQUNmLENBQXlCLEVBQ3pCLGNBQXNCLHNCQUFzQjtJQUU1QyxPQUFPLEdBQUcsR0FBRyxrQkFBa0IsT0FBTyxZQUFZLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLFdBQVcsRUFBRSxDQUFDO0FBQ3pHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsR0FBVyxFQUNYLE9BQWUsRUFDZixDQUFTLEVBQ1QsT0FBMEIsRUFDMUIsWUFBb0I7SUFFcEIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRyxPQUFPLEdBQUcsR0FBRyxvQkFBb0IsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxRQUFtQztJQUNwRSxNQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBqaXQtc2VydmljZSB0aWxlIHByb3RvY29sLCBzaGFyZWQgYnkgdGhlIE9wZW5TZWFkcmFnb24gYW5kIG5hcGFyaS1qcyBiYWNrZW5kczogdGhlXG4gKiBgL3RpbGVzL2luZm9gIGRlc2NyaXB0b3IsIGFuZCB0aGUgVVJMcyBvZiBgL3RpbGVzL2luZm9gLCBgL3RpbGVgLCBgL2hpc3RvZ3JhbWAgYW5kXG4gKiBgL2V4cG9ydC90aWZmYC4gRWFjaCBVUkwgc2hhcGUgbGl2ZXMgaGVyZSBvbmNlIOKAlCB0aGUgYmFja2VuZHMgdXNlZCB0byBzdHJpbmctYnVpbGQgdGhlbVxuICogc2VwYXJhdGVseSBhbmQgaGFkIGFscmVhZHkgZHJpZnRlZCAobmFwYXJpJ3MgYC9oaXN0b2dyYW1gIGxhY2tlZCB0aGUgY2FjaGUtYnVzdGVyKS5cbiAqL1xuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIHogc2xpY2VzIGluIMK1bSAoMCBvciBhYnNlbnQgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KTogd2hhdFxuICAgKiAgbGV0cyBhIHotc3RhY2sgYmUgZHJhd24gYXMgYSB2b2x1bWUgdG8gc2NhbGUuICovXG4gIG1wcFo/OiBudW1iZXI7XG59XG5cbi8qKiBUaWxlIGNvb3JkaW5hdGVzIGZvciBvbmUgYC90aWxlYCByZXF1ZXN0LiBgY2hhbm5lbCA9PSBudWxsYCAob3Igb21pdHRlZClcbiAqICByZXF1ZXN0cyB0aGUgc2VydmVyLWNvbXBvc2l0ZWQgdGlsZTsgYW4gaW5kZXggKGluY2x1ZGluZyAwKSByZXF1ZXN0cyB0aGF0XG4gKiAgc2luZ2xlIGNoYW5uZWwgYXMgZ3JheXNjYWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWxlQ29vcmRzIHtcbiAgcmVzOiBudW1iZXI7XG4gIGNvbDogbnVtYmVyO1xuICByb3c6IG51bWJlcjtcbiAgejogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICBjaGFubmVsPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqIFRoZSBgL3RpbGVzL2luZm9gIGRlc2NyaXB0b3IgVVJMIGZvciBvbmUgc291cmNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5mb1VybChhcGk6IHN0cmluZywgaW5mb0I2NDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2FwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG59XG5cbi8qKiBCdWlsZCB0aGUgYC90aWxlYCByZXF1ZXN0IFVSTCDigJQgdGhlIG9uZSBwbGFjZSBpdHMgcXVlcnkgc2hhcGUgbGl2ZXMgKHRoZVxuICogIHNlcnZlciBjYWNoZXMgb24gdGhlIGV4YWN0IHBhcmFtZXRlciBvcmRlcikuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUaWxlVXJsKGFwaTogc3RyaW5nLCBpbmZvQjY0OiBzdHJpbmcsIGM6IFRpbGVDb29yZHMpOiBzdHJpbmcge1xuICBjb25zdCBjaCA9IGMuY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjLmNoYW5uZWx9YDtcbiAgcmV0dXJuIGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtjLnJlc30mY29sPSR7Yy5jb2x9JnJvdz0ke2Mucm93fSZ6PSR7Yy56fSZ0aWxlU2l6ZT0ke2MudGlsZVNpemV9JHtjaH1gO1xufVxuXG4vKipcbiAqIFBlci1hcHAtbG9hZCBjYWNoZS1idXN0ZXIgZm9yIGAvaGlzdG9ncmFtYC4gVGhlIHNlcnZlciBtYXJrcyB0aGUgcmVzcG9uc2VcbiAqIGNhY2hlYWJsZSBmb3IgMjQgaCwgYW5kIGEgaGFyZCByZWZyZXNoIGNhbid0IGJ1c3QgYSBwb3N0LWxvYWQgWEhSLiBBIHRva2VuXG4gKiBzdGFibGUgd2l0aGluIGEgc2Vzc2lvbiAoc28gdGhlIGJhY2tlbmRzJyBpbi1zZXNzaW9uIGNhY2hlcyBzdGlsbCBkZWR1cGUpIGJ1dFxuICogbmV3IG9uIGVhY2ggZnVsbCBsb2FkIGFsd2F5cyByZWZsZWN0cyB0aGUgbGl2ZSBiYWNrZW5kIGFmdGVyIGEgcmVsb2FkLlxuICovXG5leHBvcnQgY29uc3QgSElTVE9HUkFNX0NBQ0hFX0JVU1RFUiA9IERhdGUubm93KCk7XG5cbi8qKiBXaGVyZSBvbmUgY2hhbm5lbCdzIG5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtIGlzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZUhpc3RvZ3JhbVJlcXVlc3Qge1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWw6IG51bWJlcjtcbiAgYmluczogbnVtYmVyO1xufVxuXG4vKiogVGhlIGAvaGlzdG9ncmFtYCBVUkwsIHdpdGggdGhlIGNhY2hlLWJ1c3RlciAoc2VlIHtAbGluayBISVNUT0dSQU1fQ0FDSEVfQlVTVEVSfSkuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlSGlzdG9ncmFtVXJsKFxuICBhcGk6IHN0cmluZyxcbiAgaW5mb0I2NDogc3RyaW5nLFxuICByOiBOYXRpdmVIaXN0b2dyYW1SZXF1ZXN0LFxuICBjYWNoZUJ1c3RlcjogbnVtYmVyID0gSElTVE9HUkFNX0NBQ0hFX0JVU1RFUixcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHthcGl9aGlzdG9ncmFtP2luZm89JHtpbmZvQjY0fSZjaGFubmVsPSR7ci5jaGFubmVsfSZ6PSR7ci56fSZiaW5zPSR7ci5iaW5zfSZfPSR7Y2FjaGVCdXN0ZXJ9YDtcbn1cblxuLyoqXG4gKiBUaGUgYC9leHBvcnQvdGlmZmAgVVJMIGZvciBzbGljZSBgemAuIGB2aXNpYmxlYCBhcmUgdGhlIGNoYW5uZWwgaW5kaWNlcyB0b1xuICogZXhwb3J0OyB0aGUgYGNoYW5uZWxzYCBwYXJhbSBpcyBvbWl0dGVkIHdoZW4gZXZlcnkgb25lIG9mIHRoZSBgY2hhbm5lbENvdW50YFxuICogY2hhbm5lbHMgaXMgdmlzaWJsZSAob3Igbm9uZSBpcyksIHdoaWNoIGlzIHRoZSBzZXJ2ZXIgZGVmYXVsdCAoYWxsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRpZmZVcmwoXG4gIGFwaTogc3RyaW5nLFxuICBpbmZvQjY0OiBzdHJpbmcsXG4gIHo6IG51bWJlcixcbiAgdmlzaWJsZTogcmVhZG9ubHkgbnVtYmVyW10sXG4gIGNoYW5uZWxDb3VudDogbnVtYmVyLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY2ggPSB2aXNpYmxlLmxlbmd0aCAmJiB2aXNpYmxlLmxlbmd0aCA8IGNoYW5uZWxDb3VudCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gIHJldHVybiBgJHthcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2h9YDtcbn1cblxuLyoqIFRoZSBzYXZlZCBuYW1lIG9mIGEgbmF0aXZlLWJpdC1kZXB0aCBUSUZGIGV4cG9ydCBvZiBgZmlsZU5hbWVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRpZmZGaWxlbmFtZShmaWxlTmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHN0ZW0gPSAoZmlsZU5hbWUgfHwgJ2ltYWdlJykucmVwbGFjZSgvXFwuW14uXSskLywgJycpO1xuICByZXR1cm4gYCR7c3RlbX1fMTZiaXQub21lLnRpZmA7XG59XG4iXX0=