@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,38 +1,5 @@
|
|
|
1
1
|
import { blurVolumeAxis } from './spatial-density';
|
|
2
|
-
|
|
3
|
-
function blurAxis(field, w, h, axis, sigma) {
|
|
4
|
-
if (!(sigma > 0.01))
|
|
5
|
-
return;
|
|
6
|
-
const radius = Math.max(1, Math.ceil(sigma * 3));
|
|
7
|
-
const kernel = new Float32Array(radius * 2 + 1);
|
|
8
|
-
let sum = 0;
|
|
9
|
-
for (let i = -radius; i <= radius; i++) {
|
|
10
|
-
const v = Math.exp(-(i * i) / (2 * sigma * sigma));
|
|
11
|
-
kernel[i + radius] = v;
|
|
12
|
-
sum += v;
|
|
13
|
-
}
|
|
14
|
-
for (let i = 0; i < kernel.length; i++)
|
|
15
|
-
kernel[i] /= sum;
|
|
16
|
-
const len = axis === 0 ? w : h;
|
|
17
|
-
const stride = axis === 0 ? 1 : w;
|
|
18
|
-
const lines = axis === 0 ? h : w;
|
|
19
|
-
const line = new Float32Array(len);
|
|
20
|
-
for (let l = 0; l < lines; l++) {
|
|
21
|
-
const base = axis === 0 ? l * w : l;
|
|
22
|
-
for (let i = 0; i < len; i++)
|
|
23
|
-
line[i] = field[base + i * stride];
|
|
24
|
-
for (let i = 0; i < len; i++) {
|
|
25
|
-
let acc = 0;
|
|
26
|
-
for (let k = -radius; k <= radius; k++) {
|
|
27
|
-
// Clamped edges: zero-padding would darken the specimen's own boundary,
|
|
28
|
-
// and the support channel already says where there is no data at all.
|
|
29
|
-
const j = Math.min(len - 1, Math.max(0, i + k));
|
|
30
|
-
acc += line[j] * kernel[k + radius];
|
|
31
|
-
}
|
|
32
|
-
field[base + i * stride] = acc;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
2
|
+
import { percentileWindow, quantile } from './stats';
|
|
36
3
|
/**
|
|
37
4
|
* Estimate a gene's expression field over the image the observations sit in.
|
|
38
5
|
*
|
|
@@ -67,21 +34,21 @@ export function expressionField(obs, opts) {
|
|
|
67
34
|
}
|
|
68
35
|
if (!placed)
|
|
69
36
|
return null;
|
|
37
|
+
// A plane is the one-deep volume: the same blur, so the 2-D and 3-D gene maps
|
|
38
|
+
// cannot smooth differently.
|
|
70
39
|
for (const axis of [0, 1]) {
|
|
71
|
-
|
|
72
|
-
|
|
40
|
+
blurVolumeAxis(num, w, h, 1, axis, sigma);
|
|
41
|
+
blurVolumeAxis(den, w, h, 1, axis, sigma);
|
|
73
42
|
}
|
|
74
43
|
const mean = new Float32Array(w * h);
|
|
75
44
|
let lo = Infinity;
|
|
76
45
|
let hi = -Infinity;
|
|
77
|
-
const positives = [];
|
|
78
46
|
for (let i = 0; i < mean.length; i++) {
|
|
79
47
|
const d = den[i];
|
|
80
48
|
if (d <= 0)
|
|
81
49
|
continue;
|
|
82
50
|
const m = num[i] / d;
|
|
83
51
|
mean[i] = m;
|
|
84
|
-
positives.push(d);
|
|
85
52
|
if (m < lo)
|
|
86
53
|
lo = m;
|
|
87
54
|
if (m > hi)
|
|
@@ -89,8 +56,7 @@ export function expressionField(obs, opts) {
|
|
|
89
56
|
}
|
|
90
57
|
if (!Number.isFinite(lo))
|
|
91
58
|
return null;
|
|
92
|
-
|
|
93
|
-
const supportScale = positives[positives.length >> 1] || 0;
|
|
59
|
+
const supportScale = quantile(den, 0.5, { filter: 'positive' }) || 0;
|
|
94
60
|
return {
|
|
95
61
|
width: w,
|
|
96
62
|
height: h,
|
|
@@ -100,6 +66,17 @@ export function expressionField(obs, opts) {
|
|
|
100
66
|
range: hi > lo ? [lo, hi] : [lo, lo + 1],
|
|
101
67
|
};
|
|
102
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Contrast window of a gene map (2-D or 3-D), from percentiles of the MEASURED pixels.
|
|
71
|
+
*
|
|
72
|
+
* `mean` is 0 wherever `support` is 0, and those zeros are not data: windowing the whole
|
|
73
|
+
* array pins the low percentile at 0 and slides the high one upward on any section the
|
|
74
|
+
* tissue does not fill, so the colours stop describing what was measured. `lo`/`hi` are
|
|
75
|
+
* fractions, as for `contrastWindow`; `[0, 1]` when nothing was measured.
|
|
76
|
+
*/
|
|
77
|
+
export function fieldContrastWindow(field, lo = 0.01, hi = 0.99) {
|
|
78
|
+
return percentileWindow(field.mean, lo, hi, { where: field.support });
|
|
79
|
+
}
|
|
103
80
|
/**
|
|
104
81
|
* Colour a field into RGBA8 for a `channels: 4` image source.
|
|
105
82
|
*
|
|
@@ -136,6 +113,28 @@ export function colorExpressionField(field, lut, window, opts = {}) {
|
|
|
136
113
|
}
|
|
137
114
|
return rgba;
|
|
138
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* The same estimator in 3D: a gene's expression over a serially sectioned
|
|
118
|
+
* specimen, on a {@link DensityGrid} lattice.
|
|
119
|
+
*
|
|
120
|
+
* Two modes, and the difference between them is the difference between a
|
|
121
|
+
* measurement and an estimate:
|
|
122
|
+
*
|
|
123
|
+
* - **sheets** (`interpolate` unset) blurs in-plane only, so exactly the z planes
|
|
124
|
+
* that hold cells are filled and the gaps between sections stay empty. This is
|
|
125
|
+
* the measured sections, stacked — the 2D gene map of each slide, at its own z.
|
|
126
|
+
* - **volume** (`interpolate` set) also smooths along z, so the planes between
|
|
127
|
+
* the sections carry an interpolated value. Smoothing the numerator and the
|
|
128
|
+
* denominator together is what makes that honest: it is Nadaraya-Watson, so an
|
|
129
|
+
* unimaged plane inherits its neighbours' MEAN rather than their sum thinned
|
|
130
|
+
* over a gap nobody sampled. Outside the sampled range the field is zeroed —
|
|
131
|
+
* "smoothed between the imaged sections" must not put expression in front of
|
|
132
|
+
* the first section or behind the last.
|
|
133
|
+
*
|
|
134
|
+
* Individual cells are still never interpolated: consecutive sections sample
|
|
135
|
+
* different cells, so there is nothing to interpolate along. What is interpolated
|
|
136
|
+
* is a field, which is legitimately defined between the planes.
|
|
137
|
+
*/
|
|
139
138
|
export function expressionVolume(obs, grid, opts) {
|
|
140
139
|
const { width: w, height: h, depth: d, voxelSize } = grid;
|
|
141
140
|
if (w <= 0 || h <= 0 || d <= 0)
|
|
@@ -173,7 +172,9 @@ export function expressionVolume(obs, grid, opts) {
|
|
|
173
172
|
if (!placed)
|
|
174
173
|
return null;
|
|
175
174
|
const sigmaVox = [
|
|
176
|
-
opts.sigma[0] / voxelSize[0],
|
|
175
|
+
opts.sigma[0] / voxelSize[0],
|
|
176
|
+
opts.sigma[1] / voxelSize[1],
|
|
177
|
+
opts.sigma[2] / voxelSize[2],
|
|
177
178
|
];
|
|
178
179
|
// In-plane always: a section's own gene map is a 2D field, whichever mode this is.
|
|
179
180
|
for (const axis of [0, 1]) {
|
|
@@ -254,4 +255,4 @@ export function encodeExpressionVolume(field, window, opts = {}) {
|
|
|
254
255
|
}
|
|
255
256
|
return out;
|
|
256
257
|
}
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1leHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUEwRGhFLHFFQUFxRTtBQUNyRSxTQUFTLFFBQVEsQ0FBQyxLQUFtQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsSUFBVyxFQUFFLEtBQWE7SUFDckYsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUFFLE9BQU87SUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FB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LENBQVUsRUFBRSxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNuQixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDckIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1osU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdEMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNo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RSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVMsQ0FBQyw4Q0FBOEM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBibHVyVm9sdW1lQXhpcywgRGVuc2l0eUdyaWQgfSBmcm9tICcuL3NwYXRpYWwtZGVuc2l0eSc7XG5cbi8qKlxuICogVHVybmluZyBwZXItY2VsbCBleHByZXNzaW9uIGludG8gYSAqKmdlbmUgbWFwKiog4oCUIGEgY29udGludW91cyBmaWVsZCBvdmVyIHRoZVxuICogdGlzc3VlLCBkcmF3biB1bmRlciB0aGUgY2VsbHMgcmF0aGVyIHRoYW4gaW5zdGVhZCBvZiB0aGVtLlxuICpcbiAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgYW5zd2VycyBcIndoaWNoIGNlbGxzIGV4cHJlc3MgaXRcIjsgaXQgZG9lcyBub3QgYW5zd2VyXG4gKiBcIndoZXJlIGlzIGl0IGV4cHJlc3NlZFwiLCBiZWNhdXNlIHRoZSBleWUgY2Fubm90IGludGVncmF0ZSB0aG91c2FuZHMgb2Ygc21hbGwgZG90c1xuICogaW50byBhIHRlcnJpdG9yeS4gQSBmaWVsZCBjYW4gYmUgZXN0aW1hdGVkIGJldHdlZW4gdGhlIGNlbGxzIGFuZCByZWFkIGFzIGFcbiAqIHJlZ2lvbiwgd2hpY2ggaXMgd2hhdCB0aGUgQ29zTXggZ3VpZGFuY2UgYW5kIFNwYXRpYWwtTGl2ZSdzIGhlYXQgbGF5ZXIgYm90aCBkby5cbiAqXG4gKiBUaGUgcXVhbnRpdHkgaXMgdGhlIGtlcm5lbC13ZWlnaHRlZCAqKk1FQU4gcGVyIGNlbGwqKiwgbm90IGEgc3VtOlxuICpcbiAqIGBgYFxuICogICBtZWFuKHApID0gzqPhtaIgdyhwLCB44bWiKcK3ZeG1oiAgLyAgzqPhtaIgdyhwLCB44bWiKVxuICogYGBgXG4gKlxuICogQSBzdW0gd291bGQgY29uZmxhdGUgXCJtYW55IGNlbGxzIGhlcmVcIiB3aXRoIFwiaGlnaCBleHByZXNzaW9uIGhlcmVcIiDigJQgYSBkZW5zZVxuICogcmVnaW9uIHdvdWxkIGdsb3cgd2hhdGV2ZXIgaXRzIGNlbGxzIHdlcmUgZG9pbmcsIHdoaWNoIGlzIHRoZSBzaW5nbGUgZWFzaWVzdCB3YXlcbiAqIHRvIHJlYWQgYSBnZW5lIG1hcCB3cm9uZ2x5LiBUaGUgZGVub21pbmF0b3IgaXMgYWxzbyB3aGF0IG1ha2VzIGVtcHRpbmVzc1xuICogZXhwcmVzc2libGU6IHdoZXJlIG5vIGNlbGwgd2FzIG1lYXN1cmVkIHRoZSBtZWFuIGlzICp1bmRlZmluZWQqLCBub3QgemVybywgc28gdGhlXG4gKiBjYWxsZXIgZ2V0cyBhIGBzdXBwb3J0YCBjaGFubmVsIGFuZCBjYW4gZHJhdyBub3RoaW5nIHRoZXJlIGluc3RlYWQgb2YgZHJhd2luZyB0aGVcbiAqIGNvbG9ybWFwJ3MgbG93IGVuZCBvdmVyIHVubWVhc3VyZWQgdGlzc3VlLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIEdQVSwgbm8gY29sb3VyIOKAlCBsaWtlIGBzcGF0aWFsLWRlbnNpdHkudHNgLCBhbmQgdGVzdGVkIHRoZVxuICogc2FtZSB3YXkuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBFeHByZXNzaW9uRmllbGRPcHRpb25zIHtcbiAgLyoqIERhdGHihpJpbWFnZSBhZmZpbmUsIHNvIHRoZSBmaWVsZCBsYW5kcyBpbiB0aGUgZGlzcGxheWVkIGltYWdlJ3MgcGl4ZWxzLiAqL1xuICByZWY/OiBTcGF0aWFsSW1hZ2VSZWY7XG4gIC8qKiBSYXN0ZXIgc2l6ZSBpbiBmaWVsZCBwaXhlbHMuICovXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogSW1hZ2UgcGl4ZWxzIHBlciBmaWVsZCBwaXhlbCDigJQgdGhlIGZpZWxkIGlzIGNvYXJzZXIgdGhhbiB0aGUgc2xpZGUgaXQgY292ZXJzLiAqL1xuICBzdGVwOiBudW1iZXI7XG4gIC8qKiBLZXJuZWwgz4MgaW4gRklFTEQgcGl4ZWxzLiAqL1xuICBzaWdtYTogbnVtYmVyO1xuICAvKiogT25lIGV4cHJlc3Npb24gdmFsdWUgcGVyIG9ic2VydmF0aW9uLiAqL1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgLyoqIE9ic2VydmF0aW9ucyB0byBpbmNsdWRlOyBldmVyeSBvbmUgd2hlbiBhYnNlbnQgKGEgcGxhbmUsIGEgc2VsZWN0aW9uKS4gKi9cbiAgaW5kaWNlcz86IFVpbnQzMkFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cHJlc3Npb25GaWVsZCB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogS2VybmVsLXdlaWdodGVkIG1lYW4gZXhwcmVzc2lvbiwgdmFsaWQgb25seSB3aGVyZSBgc3VwcG9ydCA+IDBgLiAqL1xuICBtZWFuOiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBLZXJuZWwtd2VpZ2h0ZWQgY2VsbCBjb3VudCBwZXIgZmllbGQgcGl4ZWwg4oCUIDAgd2hlcmUgbm90aGluZyB3YXMgbWVhc3VyZWQuICovXG4gIHN1cHBvcnQ6IEZsb2F0MzJBcnJheTtcbiAgLyoqIE1lZGlhbiBwb3NpdGl2ZSBzdXBwb3J0OiB0aGUgc2NhbGUgYXQgd2hpY2ggYSBwaXhlbCBpcyBcInByb3Blcmx5IHNhbXBsZWRcIixcbiAgICogIGFuZCBhIGRhdGEtZHJpdmVuIHNhdHVyYXRpb24gcG9pbnQgZm9yIGFuIG9wYWNpdHkgcmFtcC4gKi9cbiAgc3VwcG9ydFNjYWxlOiBudW1iZXI7XG4gIC8qKiBGaW5pdGUgcmFuZ2Ugb2YgYG1lYW5gIG92ZXIgdGhlIHN1cHBvcnRlZCBwaXhlbHMsIGZvciBhIGNvbnRyYXN0IHdpbmRvdy4gKi9cbiAgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKiBJbi1wbGFjZSBzZXBhcmFibGUgR2F1c3NpYW4gYWxvbmcgb25lIGF4aXMgb2YgYSBgdyDDlyBoYCBmaWVsZC4gKi9cbmZ1bmN0aW9uIGJsdXJBeGlzKGZpZWxkOiBGbG9hdDMyQXJyYXksIHc6IG51bWJlciwgaDogbnVtYmVyLCBheGlzOiAwIHwgMSwgc2lnbWE6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIShzaWdtYSA+IDAuMDEpKSByZXR1cm47XG4gIGNvbnN0IHJhZGl1cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChzaWdtYSAqIDMpKTtcbiAgY29uc3Qga2VybmVsID0gbmV3IEZsb2F0MzJBcnJheShyYWRpdXMgKiAyICsgMSk7XG4gIGxldCBzdW0gPSAwO1xuICBmb3IgKGxldCBpID0gLXJhZGl1czsgaSA8PSByYWRpdXM7IGkrKykge1xuICAgIGNvbnN0IHYgPSBNYXRoLmV4cCgtKGkgKiBpKSAvICgyICogc2lnbWEgKiBzaWdtYSkpO1xuICAgIGtlcm5lbFtpICsgcmFkaXVzXSA9IHY7XG4gICAgc3VtICs9IHY7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXJuZWwubGVuZ3RoOyBpKyspIGtlcm5lbFtpXSAvPSBzdW07XG5cbiAgY29uc3QgbGVuID0gYXhpcyA9PT0gMCA/IHcgOiBoO1xuICBjb25zdCBzdHJpZGUgPSBheGlzID09PSAwID8gMSA6IHc7XG4gIGNvbnN0IGxpbmVzID0gYXhpcyA9PT0gMCA/IGggOiB3O1xuICBjb25zdCBsaW5lID0gbmV3IEZsb2F0MzJBcnJheShsZW4pO1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxpbmVzOyBsKyspIHtcbiAgICBjb25zdCBiYXNlID0gYXhpcyA9PT0gMCA/IGwgKiB3IDogbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSBsaW5lW2ldID0gZmllbGRbYmFzZSArIGkgKiBzdHJpZGVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGxldCBhY2MgPSAwO1xuICAgICAgZm9yIChsZXQgayA9IC1yYWRpdXM7IGsgPD0gcmFkaXVzOyBrKyspIHtcbiAgICAgICAgLy8gQ2xhbXBlZCBlZGdlczogemVyby1wYWRkaW5nIHdvdWxkIGRhcmtlbiB0aGUgc3BlY2ltZW4ncyBvd24gYm91bmRhcnksXG4gICAgICAgIC8vIGFuZCB0aGUgc3VwcG9ydCBjaGFubmVsIGFscmVhZHkgc2F5cyB3aGVyZSB0aGVyZSBpcyBubyBkYXRhIGF0IGFsbC5cbiAgICAgICAgY29uc3QgaiA9IE1hdGgubWluKGxlbiAtIDEsIE1hdGgubWF4KDAsIGkgKyBrKSk7XG4gICAgICAgIGFjYyArPSBsaW5lW2pdICoga2VybmVsW2sgKyByYWRpdXNdO1xuICAgICAgfVxuICAgICAgZmllbGRbYmFzZSArIGkgKiBzdHJpZGVdID0gYWNjO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEVzdGltYXRlIGEgZ2VuZSdzIGV4cHJlc3Npb24gZmllbGQgb3ZlciB0aGUgaW1hZ2UgdGhlIG9ic2VydmF0aW9ucyBzaXQgaW4uXG4gKlxuICogTnVsbCB3aGVuIG5vdGhpbmcgbGFuZHMgb24gdGhlIHJhc3RlciDigJQgdGhlIGNhbGxlciB0aGVuIGRyYXdzIG5vIGxheWVyLCByYXRoZXJcbiAqIHRoYW4gYW4gZW1wdHkgb25lIHRoZSByZWFkZXIgaGFzIHRvIGludGVycHJldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cHJlc3Npb25GaWVsZChcbiAgb2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBvcHRzOiBFeHByZXNzaW9uRmllbGRPcHRpb25zLFxuKTogRXhwcmVzc2lvbkZpZWxkIHwgbnVsbCB7XG4gIGNvbnN0IHsgd2lkdGg6IHcsIGhlaWdodDogaCwgc3RlcCwgc2lnbWEsIHZhbHVlcywgaW5kaWNlcyB9ID0gb3B0cztcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybiBudWxsO1xuICBjb25zdCBbc3gsIHN5XSA9IG9wdHMucmVmPy5zY2FsZSA/PyBbMSwgMV07XG4gIGNvbnN0IFt0eCwgdHldID0gb3B0cy5yZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF07XG5cbiAgY29uc3QgbnVtID0gbmV3IEZsb2F0MzJBcnJheSh3ICogaCk7XG4gIGNvbnN0IGRlbiA9IG5ldyBGbG9hdDMyQXJyYXkodyAqIGgpO1xuICBjb25zdCBuID0gaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogb2JzLmNvdW50O1xuICBsZXQgcGxhY2VkID0gMDtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICBjb25zdCBpID0gaW5kaWNlcyA/IGluZGljZXNba10gOiBrO1xuICAgIGNvbnN0IGUgPSB2YWx1ZXNbaV07XG4gICAgLy8gQSBOYU4gaXMgXCJub3QgbWVhc3VyZWQgZm9yIHRoaXMgY2VsbFwiLCB3aGljaCBtdXN0IG5vdCBiZWNvbWUgYSB6ZXJvOiBpdFxuICAgIC8vIHdvdWxkIHB1bGwgdGhlIGxvY2FsIG1lYW4gZG93biBhcyBpZiB0aGUgZ2VuZSB3ZXJlIGFic2VudCB0aGVyZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShlKSkgY29udGludWU7XG4gICAgY29uc3QgcHggPSBNYXRoLmZsb29yKChvYnMueFtpXSAqIHN4ICsgdHgpIC8gc3RlcCk7XG4gICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKChvYnMueVtpXSAqIHN5ICsgdHkpIC8gc3RlcCk7XG4gICAgaWYgKHB4IDwgMCB8fCBweCA+PSB3IHx8IHB5IDwgMCB8fCBweSA+PSBoKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IHB5ICogdyArIHB4O1xuICAgIG51bVthdF0gKz0gZTtcbiAgICBkZW5bYXRdICs9IDE7XG4gICAgcGxhY2VkKys7XG4gIH1cbiAgaWYgKCFwbGFjZWQpIHJldHVybiBudWxsO1xuXG4gIGZvciAoY29uc3QgYXhpcyBvZiBbMCwgMV0gYXMgY29uc3QpIHtcbiAgICBibHVyQXhpcyhudW0sIHcsIGgsIGF4aXMsIHNpZ21hKTtcbiAgICBibHVyQXhpcyhkZW4sIHcsIGgsIGF4aXMsIHNpZ21hKTtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBuZXcgRmxvYXQzMkFycmF5KHcgKiBoKTtcbiAgbGV0IGxvID0gSW5maW5pdHk7XG4gIGxldCBoaSA9IC1JbmZpbml0eTtcbiAgY29uc3QgcG9zaXRpdmVzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkID0gZGVuW2ldO1xuICAgIGlmIChkIDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IG0gPSBudW1baV0gLyBkO1xuICAgIG1lYW5baV0gPSBtO1xuICAgIHBvc2l0aXZlcy5wdXNoKGQpO1xuICAgIGlmIChtIDwgbG8pIGxvID0gbTtcbiAgICBpZiAobSA+IGhpKSBoaSA9IG07XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobG8pKSByZXR1cm4gbnVsbDtcblxuICBwb3NpdGl2ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBzdXBwb3J0U2NhbGUgPSBwb3NpdGl2ZXNbcG9zaXRpdmVzLmxlbmd0aCA+PiAxXSB8fCAwO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBtZWFuLFxuICAgIHN1cHBvcnQ6IGRlbixcbiAgICBzdXBwb3J0U2NhbGUsXG4gICAgcmFuZ2U6IGhpID4gbG8gPyBbbG8sIGhpXSA6IFtsbywgbG8gKyAxXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb2xvdXIgYSBmaWVsZCBpbnRvIFJHQkE4IGZvciBhIGBjaGFubmVsczogNGAgaW1hZ2Ugc291cmNlLlxuICpcbiAqIEFscGhhIGNvbWVzIGZyb20gdGhlIFNVUFBPUlQsIHJhbXBlZCB0byB0aGUgZmllbGQncyBvd24gbWVkaWFuIHN1cHBvcnQgcmF0aGVyXG4gKiB0aGFuIGEgY29uc3RhbnQ6IGEgcGl4ZWwgYmFja2VkIGJ5IG9uZSBkaXN0YW50IGNlbGwgaXMgZmFpbnQsIGEgcHJvcGVybHkgc2FtcGxlZFxuICogb25lIGlzIHNvbGlkLCBhbmQgdW5tZWFzdXJlZCB0aXNzdWUgaXMgZnVsbHkgdHJhbnNwYXJlbnQg4oCUIHNvIHRoZSBtYXAgbmV2ZXJcbiAqIGFzc2VydHMgYSBtZWFzdXJlbWVudCB3aGVyZSB0aGVyZSB3YXMgbm9uZS4gYG9wYWNpdHlgIHNjYWxlcyB0aGUgd2hvbGUgbGF5ZXIgb25cbiAqIHRvcCBvZiB0aGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JFeHByZXNzaW9uRmllbGQoXG4gIGZpZWxkOiBFeHByZXNzaW9uRmllbGQsXG4gIGx1dDogcmVhZG9ubHkgKHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSlbXSxcbiAgd2luZG93OiBbbnVtYmVyLCBudW1iZXJdLFxuICBvcHRzOiB7IGxvZz86IGJvb2xlYW47IG9wYWNpdHk/OiBudW1iZXIgfSA9IHt9LFxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHsgbWVhbiwgc3VwcG9ydCwgc3VwcG9ydFNjYWxlIH0gPSBmaWVsZDtcbiAgY29uc3QgcmdiYSA9IG5ldyBVaW50OEFycmF5KG1lYW4ubGVuZ3RoICogNCk7XG4gIGNvbnN0IGxvZyA9ICEhb3B0cy5sb2c7XG4gIGNvbnN0IG9wYWNpdHkgPSBvcHRzLm9wYWNpdHkgPz8gMTtcbiAgY29uc3Qgbm9ybSA9ICh2OiBudW1iZXIpOiBudW1iZXIgPT4gKGxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgdikpIDogdik7XG4gIGNvbnN0IGxvID0gbm9ybSh3aW5kb3dbMF0pO1xuICBjb25zdCBoaSA9IG5vcm0od2luZG93WzFdKTtcbiAgY29uc3Qgc3BhbiA9IGhpID4gbG8gPyBoaSAtIGxvIDogMTtcbiAgY29uc3QgbGFzdCA9IGx1dC5sZW5ndGggLSAxO1xuICBjb25zdCBzYXQgPSBzdXBwb3J0U2NhbGUgPiAwID8gc3VwcG9ydFNjYWxlIDogMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZCA9IHN1cHBvcnRbaV07XG4gICAgaWYgKGQgPD0gMCkgY29udGludWU7IC8vIHVubWVhc3VyZWQg4oCUIGxlYXZlIGl0IHRyYW5zcGFyZW50XG4gICAgY29uc3QgdCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIChub3JtKG1lYW5baV0pIC0gbG8pIC8gc3BhbikpO1xuICAgIGNvbnN0IGMgPSBsdXRbTWF0aC5yb3VuZCh0ICogbGFzdCldID8/IGx1dFtsYXN0XTtcbiAgICBjb25zdCBhID0gTWF0aC5taW4oMSwgZCAvIHNhdCkgKiBvcGFjaXR5O1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICAvLyBQcmVtdWx0aXBsaWVkLCBtYXRjaGluZyB0aGUgY2FudmFzIGFscGhhIG1vZGUgdGhlIHJlbmRlcmVyIGNvbmZpZ3VyZXMuXG4gICAgcmdiYVtvXSA9IE1hdGgucm91bmQoY1swXSAqIGEpO1xuICAgIHJnYmFbbyArIDFdID0gTWF0aC5yb3VuZChjWzFdICogYSk7XG4gICAgcmdiYVtvICsgMl0gPSBNYXRoLnJvdW5kKGNbMl0gKiBhKTtcbiAgICByZ2JhW28gKyAzXSA9IE1hdGgucm91bmQoYSAqIDI1NSk7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogVGhlIHNhbWUgZXN0aW1hdG9yIGluIDNEOiBhIGdlbmUncyBleHByZXNzaW9uIG92ZXIgYSBzZXJpYWxseSBzZWN0aW9uZWRcbiAqIHNwZWNpbWVuLCBvbiBhIHtAbGluayBEZW5zaXR5R3JpZH0gbGF0dGljZS5cbiAqXG4gKiBUd28gbW9kZXMsIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhXG4gKiBtZWFzdXJlbWVudCBhbmQgYW4gZXN0aW1hdGU6XG4gKlxuICogIC0gKipzaGVldHMqKiAoYGludGVycG9sYXRlYCB1bnNldCkgYmx1cnMgaW4tcGxhbmUgb25seSwgc28gZXhhY3RseSB0aGUgeiBwbGFuZXNcbiAqICAgIHRoYXQgaG9sZCBjZWxscyBhcmUgZmlsbGVkIGFuZCB0aGUgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIHN0YXkgZW1wdHkuIFRoaXMgaXNcbiAqICAgIHRoZSBtZWFzdXJlZCBzZWN0aW9ucywgc3RhY2tlZCDigJQgdGhlIDJEIGdlbmUgbWFwIG9mIGVhY2ggc2xpZGUsIGF0IGl0cyBvd24gei5cbiAqICAtICoqdm9sdW1lKiogKGBpbnRlcnBvbGF0ZWAgc2V0KSBhbHNvIHNtb290aHMgYWxvbmcgeiwgc28gdGhlIHBsYW5lcyBiZXR3ZWVuXG4gKiAgICB0aGUgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBTbW9vdGhpbmcgdGhlIG51bWVyYXRvciBhbmQgdGhlXG4gKiAgICBkZW5vbWluYXRvciB0b2dldGhlciBpcyB3aGF0IG1ha2VzIHRoYXQgaG9uZXN0OiBpdCBpcyBOYWRhcmF5YS1XYXRzb24sIHNvIGFuXG4gKiAgICB1bmltYWdlZCBwbGFuZSBpbmhlcml0cyBpdHMgbmVpZ2hib3VycycgTUVBTiByYXRoZXIgdGhhbiB0aGVpciBzdW0gdGhpbm5lZFxuICogICAgb3ZlciBhIGdhcCBub2JvZHkgc2FtcGxlZC4gT3V0c2lkZSB0aGUgc2FtcGxlZCByYW5nZSB0aGUgZmllbGQgaXMgemVyb2VkIOKAlFxuICogICAgXCJzbW9vdGhlZCBiZXR3ZWVuIHRoZSBpbWFnZWQgc2VjdGlvbnNcIiBtdXN0IG5vdCBwdXQgZXhwcmVzc2lvbiBpbiBmcm9udCBvZlxuICogICAgdGhlIGZpcnN0IHNlY3Rpb24gb3IgYmVoaW5kIHRoZSBsYXN0LlxuICpcbiAqIEluZGl2aWR1YWwgY2VsbHMgYXJlIHN0aWxsIG5ldmVyIGludGVycG9sYXRlZDogY29uc2VjdXRpdmUgc2VjdGlvbnMgc2FtcGxlXG4gKiBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGUgYWxvbmcuIFdoYXQgaXMgaW50ZXJwb2xhdGVkXG4gKiBpcyBhIGZpZWxkLCB3aGljaCBpcyBsZWdpdGltYXRlbHkgZGVmaW5lZCBiZXR3ZWVuIHRoZSBwbGFuZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvblZvbHVtZU9wdGlvbnMge1xuICAvKiogS2VybmVsIM+DIHBlciBheGlzLCBpbiB0aGUgb2JzZXJ2YXRpb25zJyBvd24gdW5pdHMuIFRoZSB6IHRlcm0gaXMgdXNlZCBvbmx5XG4gICAqICB3aGVuIHtAbGluayBpbnRlcnBvbGF0ZX0gaXMgc2V0LiAqL1xuICBzaWdtYTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogT25lIGV4cHJlc3Npb24gdmFsdWUgcGVyIG9ic2VydmF0aW9uLiAqL1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgLyoqIE9ic2VydmF0aW9ucyB0byBpbmNsdWRlOyBldmVyeSBvbmUgd2hlbiBhYnNlbnQg4oCUIG9uZSBzZWN0aW9uLCBvciBhIHNlbGVjdGlvbi4gKi9cbiAgaW5kaWNlcz86IFVpbnQzMkFycmF5O1xuICAvKiogU21vb3RoIGFsb25nIHogaW50byBhIGNvbnRpbnVvdXMgZXN0aW1hdGUgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgbWVhc3VyZWRcbiAgICogIHNoZWV0cyBpc29sYXRlZCBhdCB0aGVpciBvd24gcGxhbmVzLiAqL1xuICBpbnRlcnBvbGF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvblZvbHVtZUZpZWxkIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKiBLZXJuZWwtd2VpZ2h0ZWQgbWVhbiBleHByZXNzaW9uLCB2YWxpZCBvbmx5IHdoZXJlIGBzdXBwb3J0ID4gMGAuICovXG4gIG1lYW46IEZsb2F0MzJBcnJheTtcbiAgLyoqIEtlcm5lbC13ZWlnaHRlZCBjZWxsIGNvdW50IHBlciB2b3hlbCDigJQgMCB3aGVyZSBub3RoaW5nIHdhcyBtZWFzdXJlZC4gKi9cbiAgc3VwcG9ydDogRmxvYXQzMkFycmF5O1xuICAvKiogRmluaXRlIHJhbmdlIG9mIGBtZWFuYCBvdmVyIHRoZSBzdXBwb3J0ZWQgdm94ZWxzLCBmb3IgYSBjb250cmFzdCB3aW5kb3cuICovXG4gIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwcmVzc2lvblZvbHVtZShcbiAgb2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBncmlkOiBEZW5zaXR5R3JpZCxcbiAgb3B0czogRXhwcmVzc2lvblZvbHVtZU9wdGlvbnMsXG4pOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsIHtcbiAgY29uc3QgeyB3aWR0aDogdywgaGVpZ2h0OiBoLCBkZXB0aDogZCwgdm94ZWxTaXplIH0gPSBncmlkO1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBkIDw9IDApIHJldHVybiBudWxsO1xuICBjb25zdCBudW0gPSBuZXcgRmxvYXQzMkFycmF5KHcgKiBoICogZCk7XG4gIGNvbnN0IGRlbiA9IG5ldyBGbG9hdDMyQXJyYXkodyAqIGggKiBkKTtcbiAgY29uc3QgaWR4ID0gb3B0cy5pbmRpY2VzO1xuICBjb25zdCBuID0gaWR4ID8gaWR4Lmxlbmd0aCA6IG9icy5jb3VudDtcbiAgY29uc3QgeiA9IG9icy56O1xuICBsZXQgcGxhY2VkID0gMDtcbiAgLy8gVGhlIGltYWdlZCByYW5nZSwgdGFrZW4gZnJvbSB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBhY3R1YWxseSBpbmNsdWRlZDpcbiAgLy8gdGhlIGVzdGltYXRlIG1heSBub3QgcmVhY2ggcGFzdCB0aGUgb3V0ZXJtb3N0IHNlY3Rpb24gaXQgd2FzIGJ1aWx0IGZyb20uXG4gIGxldCBmaXJzdCA9IGQ7XG4gIGxldCBsYXN0ID0gLTE7XG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICBjb25zdCBpID0gaWR4ID8gaWR4W2tdIDogaztcbiAgICBjb25zdCBlID0gb3B0cy52YWx1ZXNbaV07XG4gICAgLy8gTm90IG1lYXN1cmVkIGZvciB0aGlzIGNlbGwg4oCUIG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGUgZ2VuZSBpcyBhYnNlbnQgaGVyZVwiLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGUpKSBjb250aW51ZTtcbiAgICBjb25zdCB2eCA9IE1hdGguZmxvb3Iob2JzLnhbaV0gLyB2b3hlbFNpemVbMF0pO1xuICAgIGNvbnN0IHZ5ID0gTWF0aC5mbG9vcihvYnMueVtpXSAvIHZveGVsU2l6ZVsxXSk7XG4gICAgY29uc3QgdnogPSB6ID8gTWF0aC5mbG9vcih6W2ldIC8gdm94ZWxTaXplWzJdKSA6IDA7XG4gICAgaWYgKHZ4IDwgMCB8fCB2eCA+PSB3IHx8IHZ5IDwgMCB8fCB2eSA+PSBoIHx8IHZ6IDwgMCB8fCB2eiA+PSBkKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9ICh2eiAqIGggKyB2eSkgKiB3ICsgdng7XG4gICAgbnVtW2F0XSArPSBlO1xuICAgIGRlblthdF0gKz0gMTtcbiAgICBwbGFjZWQrKztcbiAgICBpZiAodnogPCBmaXJzdCkgZmlyc3QgPSB2ejtcbiAgICBpZiAodnogPiBsYXN0KSBsYXN0ID0gdno7XG4gIH1cbiAgaWYgKCFwbGFjZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNpZ21hVm94OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgb3B0cy5zaWdtYVswXSAvIHZveGVsU2l6ZVswXSwgb3B0cy5zaWdtYVsxXSAvIHZveGVsU2l6ZVsxXSwgb3B0cy5zaWdtYVsyXSAvIHZveGVsU2l6ZVsyXSxcbiAgXTtcbiAgLy8gSW4tcGxhbmUgYWx3YXlzOiBhIHNlY3Rpb24ncyBvd24gZ2VuZSBtYXAgaXMgYSAyRCBmaWVsZCwgd2hpY2hldmVyIG1vZGUgdGhpcyBpcy5cbiAgZm9yIChjb25zdCBheGlzIG9mIFswLCAxXSBhcyBjb25zdCkge1xuICAgIGJsdXJWb2x1bWVBeGlzKG51bSwgdywgaCwgZCwgYXhpcywgc2lnbWFWb3hbYXhpc10pO1xuICAgIGJsdXJWb2x1bWVBeGlzKGRlbiwgdywgaCwgZCwgYXhpcywgc2lnbWFWb3hbYXhpc10pO1xuICB9XG4gIGlmIChvcHRzLmludGVycG9sYXRlKSB7XG4gICAgYmx1clZvbHVtZUF4aXMobnVtLCB3LCBoLCBkLCAyLCBzaWdtYVZveFsyXSk7XG4gICAgYmx1clZvbHVtZUF4aXMoZGVuLCB3LCBoLCBkLCAyLCBzaWdtYVZveFsyXSk7XG4gICAgY29uc3QgcGxhbmUgPSB3ICogaDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGQ7IGsrKykge1xuICAgICAgaWYgKGsgPj0gZmlyc3QgJiYgayA8PSBsYXN0KSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBibHVyIGxlYXZlcyBhIHRhaWwgcGFzdCB0aGUgb3V0ZXJtb3N0IHNlY3Rpb25zOyBrZWVwaW5nIGl0IHdvdWxkIGRyYXdcbiAgICAgIC8vIGV4cHJlc3Npb24gd2hlcmUgdGhlIHNwZWNpbWVuIHdhcyBuZXZlciBzZWN0aW9uZWQuXG4gICAgICBudW0uZmlsbCgwLCBrICogcGxhbmUsIChrICsgMSkgKiBwbGFuZSk7XG4gICAgICBkZW4uZmlsbCgwLCBrICogcGxhbmUsIChrICsgMSkgKiBwbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVhbiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtLmxlbmd0aCk7XG4gIGxldCBsbyA9IEluZmluaXR5O1xuICBsZXQgaGkgPSAtSW5maW5pdHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWVhbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN1cHBvcnQgPSBkZW5baV07XG4gICAgaWYgKHN1cHBvcnQgPD0gMCkgY29udGludWU7XG4gICAgY29uc3QgbSA9IG51bVtpXSAvIHN1cHBvcnQ7XG4gICAgbWVhbltpXSA9IG07XG4gICAgaWYgKG0gPCBsbykgbG8gPSBtO1xuICAgIGlmIChtID4gaGkpIGhpID0gbTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShsbykpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHcsXG4gICAgaGVpZ2h0OiBoLFxuICAgIGRlcHRoOiBkLFxuICAgIG1lYW4sXG4gICAgc3VwcG9ydDogZGVuLFxuICAgIHJhbmdlOiBoaSA+IGxvID8gW2xvLCBoaV0gOiBbbG8sIGxvICsgMV0sXG4gIH07XG59XG5cbi8qKlxuICogRW5jb2RlIGEgZmllbGQgaW50byB0aGUgdWludDggc2NhbGFyIGEgYFZvbHVtZUxheWVyYCByZW5kZXJzLCB3aW5kb3dlZCB0aGUgc2FtZVxuICogd2F5IHRoZSAyRCBtYXAgYW5kIHRoZSBtYXJrZXJzIGFyZSBzbyB0aGUgdGhyZWUgY2Fubm90IGRpc2FncmVlLlxuICpcbiAqIGBmbG9vcmAgbGlmdHMgZXZlcnkgTUVBU1VSRUQgdm94ZWwgdG8gYXQgbGVhc3QgdGhpcyBmcmFjdGlvbiBvZiBmdWxsIHNjYWxlLCBzb1xuICogdGhhdCBcInRoZSBnZW5lIGlzIG5vdCBoZXJlXCIgY2FuIGJlIHRvbGQgZnJvbSBcIm5vYm9keSBzZWN0aW9uZWQgaGVyZVwiIOKAlCB0aGVcbiAqIGRpc3RpbmN0aW9uIHRoZSAyRCBtYXAga2VlcHMgd2l0aCBpdHMgc2VwYXJhdGUgc3VwcG9ydCBjaGFubmVsLCB3aGljaCBhIHNjYWxhclxuICogdm9sdW1lIGNhbm5vdCBleHByZXNzIGJlY2F1c2UgaXRzIHJheW1hcmNoIHRha2VzIGFscGhhIGZyb20gdGhlIHNhbWUgbnVtYmVyIGl0XG4gKiB0YWtlcyBjb2xvdXIgZnJvbS5cbiAqXG4gKiBJdCBkZWZhdWx0cyB0byBPRkYsIGJlY2F1c2UgaW4gYSB2b2x1bWUgdGhhdCB0cmFkZSBkb2VzIG5vdCBwYXkuIEEgcmF5IGNyb3NzZXNcbiAqIHRlbnMgb2YgbWVhc3VyZWQgcGxhbmVzIGFuZCB0aGUgRFZSIGNvbXBvc2l0ZXMgZXZlcnkgb25lIG9mIHRoZW0sIHNvIGEgZmxvb3JcbiAqIGxhcmdlIGVub3VnaCB0byBzZWUgb24gYSBzaW5nbGUgcGxhbmUgc2F0dXJhdGVzIHRvIGFuIG9wYXF1ZSBzaGVsbCBvdmVyIHRoZVxuICogd2hvbGUgc3BlY2ltZW4gYW5kIGJ1cmllcyB0aGUgc2lnbmFsIGl0IHdhcyBtZWFudCB0byBjb250ZXh0dWFsaXNlLCB3aGlsZSBvbmVcbiAqIHNtYWxsIGVub3VnaCB0byBzdGF5IGZhaW50IGlzIGFscmVhZHkgaW52aXNpYmxlIHBlciBwbGFuZS4gVGhlIG1lYXN1cmVkIGVudmVsb3BlXG4gKiBpcyBiZXR0ZXIgcmVhZCBmcm9tIHRoZSBhbmF0b215IGxheWVyIGFuZCB0aGUgb2JzZXJ2YXRpb25zLCB3aGljaCBhcmUgZHJhd24gaW5cbiAqIHRoZSBzYW1lIHNjZW5lIOKAlCBhbmQgdGhlIHN1cnJvdW5kaW5nIGRlbnNpdHkgdm9sdW1lcyB0YWtlIHRoZSBzYW1lIG5vLWZsb29yXG4gKiBhcHByb2FjaCwgc28gdGhlIHNjZW5lIHN0YXlzIGludGVybmFsbHkgY29uc2lzdGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoXG4gIGZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQsXG4gIHdpbmRvdzogW251bWJlciwgbnVtYmVyXSxcbiAgb3B0czogeyBsb2c/OiBib29sZWFuOyBmbG9vcj86IG51bWJlciB9ID0ge30sXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgeyBtZWFuLCBzdXBwb3J0IH0gPSBmaWVsZDtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkobWVhbi5sZW5ndGgpO1xuICBjb25zdCBsb2cgPSAhIW9wdHMubG9nO1xuICBjb25zdCBmbG9vciA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG9wdHMuZmxvb3IgPz8gMCkpO1xuICBjb25zdCBub3JtID0gKHY6IG51bWJlcik6IG51bWJlciA9PiAobG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCB2KSkgOiB2KTtcbiAgY29uc3QgbG8gPSBub3JtKHdpbmRvd1swXSk7XG4gIGNvbnN0IGhpID0gbm9ybSh3aW5kb3dbMV0pO1xuICBjb25zdCBzcGFuID0gaGkgPiBsbyA/IGhpIC0gbG8gOiAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3VwcG9ydFtpXSA8PSAwKSBjb250aW51ZTsgLy8gdW5tZWFzdXJlZCDigJQgemVybywgc28gdGhlIHJheW1hcmNoIHNraXBzIGl0XG4gICAgY29uc3QgdCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIChub3JtKG1lYW5baV0pIC0gbG8pIC8gc3BhbikpO1xuICAgIG91dFtpXSA9IE1hdGgucm91bmQoKGZsb29yICsgKDEgLSBmbG9vcikgKiB0KSAqIDI1NSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1leHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQThEckQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQXdCLEVBQUUsSUFBNEI7SUFDcEYsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBQy9DLElB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LENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsU0FBUztZQUN0Qyw0RUFBNEU7WUFDNUUscURBQXFEO1lBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUM7SUFDbEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxPQUFPLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXRDLE9BQU87UUFDTCxLQUFLLEVBQUUsQ0FBQztRQUNSLE1BQU0sRUFBRSxDQUFDO1FBQ1QsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJO1FBQ0osT0FBTyxFQUFFLEdBQUc7UUFDWixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDekMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxLQUE0QixFQUM1QixNQUF3QixFQUN4QixPQUEwQyxFQUFFO0lBRTVDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVMsQ0FBQyw4Q0FBOEM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBibHVyVm9sdW1lQXhpcywgRGVuc2l0eUdyaWQgfSBmcm9tICcuL3NwYXRpYWwtZGVuc2l0eSc7XG5pbXBvcnQgeyBwZXJjZW50aWxlV2luZG93LCBxdWFudGlsZSB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgcGVyLWNlbGwgZXhwcmVzc2lvbiBpbnRvIGEgKipnZW5lIG1hcCoqIOKAlCBhIGNvbnRpbnVvdXMgZmllbGQgb3ZlciB0aGVcbiAqIHRpc3N1ZSwgZHJhd24gdW5kZXIgdGhlIGNlbGxzIHJhdGhlciB0aGFuIGluc3RlYWQgb2YgdGhlbS5cbiAqXG4gKiBBIHNjYXR0ZXIgY29sb3VyZWQgYnkgYSBnZW5lIGFuc3dlcnMgXCJ3aGljaCBjZWxscyBleHByZXNzIGl0XCI7IGl0IGRvZXMgbm90IGFuc3dlclxuICogXCJ3aGVyZSBpcyBpdCBleHByZXNzZWRcIiwgYmVjYXVzZSB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgdGhvdXNhbmRzIG9mIHNtYWxsIGRvdHNcbiAqIGludG8gYSB0ZXJyaXRvcnkuIEEgZmllbGQgY2FuIGJlIGVzdGltYXRlZCBiZXR3ZWVuIHRoZSBjZWxscyBhbmQgcmVhZCBhcyBhXG4gKiByZWdpb24sIHdoaWNoIGlzIHdoYXQgdGhlIENvc014IGd1aWRhbmNlIGFuZCBTcGF0aWFsLUxpdmUncyBoZWF0IGxheWVyIGJvdGggZG8uXG4gKlxuICogVGhlIHF1YW50aXR5IGlzIHRoZSBrZXJuZWwtd2VpZ2h0ZWQgKipNRUFOIHBlciBjZWxsKiosIG5vdCBhIHN1bTpcbiAqXG4gKiBgYGBcbiAqICAgbWVhbihwKSA9IM6j4bWiIHcocCwgeOG1oinCt2XhtaIgIC8gIM6j4bWiIHcocCwgeOG1oilcbiAqIGBgYFxuICpcbiAqIEEgc3VtIHdvdWxkIGNvbmZsYXRlIFwibWFueSBjZWxscyBoZXJlXCIgd2l0aCBcImhpZ2ggZXhwcmVzc2lvbiBoZXJlXCIg4oCUIGEgZGVuc2VcbiAqIHJlZ2lvbiB3b3VsZCBnbG93IHdoYXRldmVyIGl0cyBjZWxscyB3ZXJlIGRvaW5nLCB3aGljaCBpcyB0aGUgc2luZ2xlIGVhc2llc3Qgd2F5XG4gKiB0byByZWFkIGEgZ2VuZSBtYXAgd3JvbmdseS4gVGhlIGRlbm9taW5hdG9yIGlzIGFsc28gd2hhdCBtYWtlcyBlbXB0aW5lc3NcbiAqIGV4cHJlc3NpYmxlOiB3aGVyZSBubyBjZWxsIHdhcyBtZWFzdXJlZCB0aGUgbWVhbiBpcyAqdW5kZWZpbmVkKiwgbm90IHplcm8sIHNvIHRoZVxuICogY2FsbGVyIGdldHMgYSBgc3VwcG9ydGAgY2hhbm5lbCBhbmQgY2FuIGRyYXcgbm90aGluZyB0aGVyZSBpbnN0ZWFkIG9mIGRyYXdpbmcgdGhlXG4gKiBjb2xvcm1hcCdzIGxvdyBlbmQgb3ZlciB1bm1lYXN1cmVkIHRpc3N1ZS5cbiAqXG4gKiBQdXJlIOKAlCBubyBBbmd1bGFyLCBubyBHUFUsIG5vIGNvbG91ciDigJQgbGlrZSBgc3BhdGlhbC1kZW5zaXR5LnRzYCwgYW5kIHRlc3RlZCB0aGVcbiAqIHNhbWUgd2F5LlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvbkZpZWxkT3B0aW9ucyB7XG4gIC8qKiBEYXRh4oaSaW1hZ2UgYWZmaW5lLCBzbyB0aGUgZmllbGQgbGFuZHMgaW4gdGhlIGRpc3BsYXllZCBpbWFnZSdzIHBpeGVscy4gKi9cbiAgcmVmPzogU3BhdGlhbEltYWdlUmVmO1xuICAvKiogUmFzdGVyIHNpemUgaW4gZmllbGQgcGl4ZWxzLiAqL1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgLyoqIEltYWdlIHBpeGVscyBwZXIgZmllbGQgcGl4ZWwg4oCUIHRoZSBmaWVsZCBpcyBjb2Fyc2VyIHRoYW4gdGhlIHNsaWRlIGl0IGNvdmVycy4gKi9cbiAgc3RlcDogbnVtYmVyO1xuICAvKiogS2VybmVsIM+DIGluIEZJRUxEIHBpeGVscy4gKi9cbiAgc2lnbWE6IG51bWJlcjtcbiAgLyoqIE9uZSBleHByZXNzaW9uIHZhbHVlIHBlciBvYnNlcnZhdGlvbi4gKi9cbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBPYnNlcnZhdGlvbnMgdG8gaW5jbHVkZTsgZXZlcnkgb25lIHdoZW4gYWJzZW50IChhIHBsYW5lLCBhIHNlbGVjdGlvbikuICovXG4gIGluZGljZXM/OiBVaW50MzJBcnJheTtcbn1cblxuLyoqXG4gKiBBIDJEIGZpZWxkIG9mIGtlcm5lbC13ZWlnaHRlZCBtZWFuIGV4cHJlc3Npb24gb24gYSBgd2lkdGggw5cgaGVpZ2h0YCBncmlkLCB3aXRoIHRoZVxuICogc3VwcG9ydCB0aGF0IHNheXMgd2hlcmUgaXQgd2FzIGFjdHVhbGx5IG1lYXN1cmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cHJlc3Npb25GaWVsZCB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogS2VybmVsLXdlaWdodGVkIG1lYW4gZXhwcmVzc2lvbiwgdmFsaWQgb25seSB3aGVyZSBgc3VwcG9ydCA+IDBgLiAqL1xuICBtZWFuOiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBLZXJuZWwtd2VpZ2h0ZWQgY2VsbCBjb3VudCBwZXIgZmllbGQgcGl4ZWwg4oCUIDAgd2hlcmUgbm90aGluZyB3YXMgbWVhc3VyZWQuICovXG4gIHN1cHBvcnQ6IEZsb2F0MzJBcnJheTtcbiAgLyoqIE1lZGlhbiBwb3NpdGl2ZSBzdXBwb3J0OiB0aGUgc2NhbGUgYXQgd2hpY2ggYSBwaXhlbCBpcyBcInByb3Blcmx5IHNhbXBsZWRcIixcbiAgICogIGFuZCBhIGRhdGEtZHJpdmVuIHNhdHVyYXRpb24gcG9pbnQgZm9yIGFuIG9wYWNpdHkgcmFtcC4gKi9cbiAgc3VwcG9ydFNjYWxlOiBudW1iZXI7XG4gIC8qKiBGaW5pdGUgcmFuZ2Ugb2YgYG1lYW5gIG92ZXIgdGhlIHN1cHBvcnRlZCBwaXhlbHMsIGZvciBhIGNvbnRyYXN0IHdpbmRvdy4gKi9cbiAgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKlxuICogRXN0aW1hdGUgYSBnZW5lJ3MgZXhwcmVzc2lvbiBmaWVsZCBvdmVyIHRoZSBpbWFnZSB0aGUgb2JzZXJ2YXRpb25zIHNpdCBpbi5cbiAqXG4gKiBOdWxsIHdoZW4gbm90aGluZyBsYW5kcyBvbiB0aGUgcmFzdGVyIOKAlCB0aGUgY2FsbGVyIHRoZW4gZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlclxuICogdGhhbiBhbiBlbXB0eSBvbmUgdGhlIHJlYWRlciBoYXMgdG8gaW50ZXJwcmV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwcmVzc2lvbkZpZWxkKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucywgb3B0czogRXhwcmVzc2lvbkZpZWxkT3B0aW9ucyk6IEV4cHJlc3Npb25GaWVsZCB8IG51bGwge1xuICBjb25zdCB7IHdpZHRoOiB3LCBoZWlnaHQ6IGgsIHN0ZXAsIHNpZ21hLCB2YWx1ZXMsIGluZGljZXMgfSA9IG9wdHM7XG4gIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgW3N4LCBzeV0gPSBvcHRzLnJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IG9wdHMucmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuXG4gIGNvbnN0IG51bSA9IG5ldyBGbG9hdDMyQXJyYXkodyAqIGgpO1xuICBjb25zdCBkZW4gPSBuZXcgRmxvYXQzMkFycmF5KHcgKiBoKTtcbiAgY29uc3QgbiA9IGluZGljZXMgPyBpbmRpY2VzLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgbGV0IHBsYWNlZCA9IDA7XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgY29uc3QgaSA9IGluZGljZXMgPyBpbmRpY2VzW2tdIDogaztcbiAgICBjb25zdCBlID0gdmFsdWVzW2ldO1xuICAgIC8vIEEgTmFOIGlzIFwibm90IG1lYXN1cmVkIGZvciB0aGlzIGNlbGxcIiwgd2hpY2ggbXVzdCBub3QgYmVjb21lIGEgemVybzogaXRcbiAgICAvLyB3b3VsZCBwdWxsIHRoZSBsb2NhbCBtZWFuIGRvd24gYXMgaWYgdGhlIGdlbmUgd2VyZSBhYnNlbnQgdGhlcmUuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHB4ID0gTWF0aC5mbG9vcigob2JzLnhbaV0gKiBzeCArIHR4KSAvIHN0ZXApO1xuICAgIGNvbnN0IHB5ID0gTWF0aC5mbG9vcigob2JzLnlbaV0gKiBzeSArIHR5KSAvIHN0ZXApO1xuICAgIGlmIChweCA8IDAgfHwgcHggPj0gdyB8fCBweSA8IDAgfHwgcHkgPj0gaCkgY29udGludWU7XG4gICAgY29uc3QgYXQgPSBweSAqIHcgKyBweDtcbiAgICBudW1bYXRdICs9IGU7XG4gICAgZGVuW2F0XSArPSAxO1xuICAgIHBsYWNlZCsrO1xuICB9XG4gIGlmICghcGxhY2VkKSByZXR1cm4gbnVsbDtcblxuICAvLyBBIHBsYW5lIGlzIHRoZSBvbmUtZGVlcCB2b2x1bWU6IHRoZSBzYW1lIGJsdXIsIHNvIHRoZSAyLUQgYW5kIDMtRCBnZW5lIG1hcHNcbiAgLy8gY2Fubm90IHNtb290aCBkaWZmZXJlbnRseS5cbiAgZm9yIChjb25zdCBheGlzIG9mIFswLCAxXSBhcyBjb25zdCkge1xuICAgIGJsdXJWb2x1bWVBeGlzKG51bSwgdywgaCwgMSwgYXhpcywgc2lnbWEpO1xuICAgIGJsdXJWb2x1bWVBeGlzKGRlbiwgdywgaCwgMSwgYXhpcywgc2lnbWEpO1xuICB9XG5cbiAgY29uc3QgbWVhbiA9IG5ldyBGbG9hdDMyQXJyYXkodyAqIGgpO1xuICBsZXQgbG8gPSBJbmZpbml0eTtcbiAgbGV0IGhpID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkID0gZGVuW2ldO1xuICAgIGlmIChkIDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IG0gPSBudW1baV0gLyBkO1xuICAgIG1lYW5baV0gPSBtO1xuICAgIGlmIChtIDwgbG8pIGxvID0gbTtcbiAgICBpZiAobSA+IGhpKSBoaSA9IG07XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobG8pKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBzdXBwb3J0U2NhbGUgPSBxdWFudGlsZShkZW4sIDAuNSwgeyBmaWx0ZXI6ICdwb3NpdGl2ZScgfSkgfHwgMDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogdyxcbiAgICBoZWlnaHQ6IGgsXG4gICAgbWVhbixcbiAgICBzdXBwb3J0OiBkZW4sXG4gICAgc3VwcG9ydFNjYWxlLFxuICAgIHJhbmdlOiBoaSA+IGxvID8gW2xvLCBoaV0gOiBbbG8sIGxvICsgMV0sXG4gIH07XG59XG5cbi8qKlxuICogQ29udHJhc3Qgd2luZG93IG9mIGEgZ2VuZSBtYXAgKDItRCBvciAzLUQpLCBmcm9tIHBlcmNlbnRpbGVzIG9mIHRoZSBNRUFTVVJFRCBwaXhlbHMuXG4gKlxuICogYG1lYW5gIGlzIDAgd2hlcmV2ZXIgYHN1cHBvcnRgIGlzIDAsIGFuZCB0aG9zZSB6ZXJvcyBhcmUgbm90IGRhdGE6IHdpbmRvd2luZyB0aGUgd2hvbGVcbiAqIGFycmF5IHBpbnMgdGhlIGxvdyBwZXJjZW50aWxlIGF0IDAgYW5kIHNsaWRlcyB0aGUgaGlnaCBvbmUgdXB3YXJkIG9uIGFueSBzZWN0aW9uIHRoZVxuICogdGlzc3VlIGRvZXMgbm90IGZpbGwsIHNvIHRoZSBjb2xvdXJzIHN0b3AgZGVzY3JpYmluZyB3aGF0IHdhcyBtZWFzdXJlZC4gYGxvYC9gaGlgIGFyZVxuICogZnJhY3Rpb25zLCBhcyBmb3IgYGNvbnRyYXN0V2luZG93YDsgYFswLCAxXWAgd2hlbiBub3RoaW5nIHdhcyBtZWFzdXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkQ29udHJhc3RXaW5kb3coXG4gIGZpZWxkOiBQaWNrPEV4cHJlc3Npb25GaWVsZCB8IEV4cHJlc3Npb25Wb2x1bWVGaWVsZCwgJ21lYW4nIHwgJ3N1cHBvcnQnPixcbiAgbG8gPSAwLjAxLFxuICBoaSA9IDAuOTksXG4pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIHBlcmNlbnRpbGVXaW5kb3coZmllbGQubWVhbiwgbG8sIGhpLCB7IHdoZXJlOiBmaWVsZC5zdXBwb3J0IH0pO1xufVxuXG4vKipcbiAqIENvbG91ciBhIGZpZWxkIGludG8gUkdCQTggZm9yIGEgYGNoYW5uZWxzOiA0YCBpbWFnZSBzb3VyY2UuXG4gKlxuICogQWxwaGEgY29tZXMgZnJvbSB0aGUgU1VQUE9SVCwgcmFtcGVkIHRvIHRoZSBmaWVsZCdzIG93biBtZWRpYW4gc3VwcG9ydCByYXRoZXJcbiAqIHRoYW4gYSBjb25zdGFudDogYSBwaXhlbCBiYWNrZWQgYnkgb25lIGRpc3RhbnQgY2VsbCBpcyBmYWludCwgYSBwcm9wZXJseSBzYW1wbGVkXG4gKiBvbmUgaXMgc29saWQsIGFuZCB1bm1lYXN1cmVkIHRpc3N1ZSBpcyBmdWxseSB0cmFuc3BhcmVudCDigJQgc28gdGhlIG1hcCBuZXZlclxuICogYXNzZXJ0cyBhIG1lYXN1cmVtZW50IHdoZXJlIHRoZXJlIHdhcyBub25lLiBgb3BhY2l0eWAgc2NhbGVzIHRoZSB3aG9sZSBsYXllciBvblxuICogdG9wIG9mIHRoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckV4cHJlc3Npb25GaWVsZChcbiAgZmllbGQ6IEV4cHJlc3Npb25GaWVsZCxcbiAgbHV0OiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKVtdLFxuICB3aW5kb3c6IFtudW1iZXIsIG51bWJlcl0sXG4gIG9wdHM6IHsgbG9nPzogYm9vbGVhbjsgb3BhY2l0eT86IG51bWJlciB9ID0ge30sXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgeyBtZWFuLCBzdXBwb3J0LCBzdXBwb3J0U2NhbGUgfSA9IGZpZWxkO1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkobWVhbi5sZW5ndGggKiA0KTtcbiAgY29uc3QgbG9nID0gISFvcHRzLmxvZztcbiAgY29uc3Qgb3BhY2l0eSA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBub3JtID0gKHY6IG51bWJlcik6IG51bWJlciA9PiAobG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCB2KSkgOiB2KTtcbiAgY29uc3QgbG8gPSBub3JtKHdpbmRvd1swXSk7XG4gIGNvbnN0IGhpID0gbm9ybSh3aW5kb3dbMV0pO1xuICBjb25zdCBzcGFuID0gaGkgPiBsbyA/IGhpIC0gbG8gOiAxO1xuICBjb25zdCBsYXN0ID0gbHV0Lmxlbmd0aCAtIDE7XG4gIGNvbnN0IHNhdCA9IHN1cHBvcnRTY2FsZSA+IDAgPyBzdXBwb3J0U2NhbGUgOiAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkID0gc3VwcG9ydFtpXTtcbiAgICBpZiAoZCA8PSAwKSBjb250aW51ZTsgLy8gdW5tZWFzdXJlZCDigJQgbGVhdmUgaXQgdHJhbnNwYXJlbnRcbiAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKG5vcm0obWVhbltpXSkgLSBsbykgLyBzcGFuKSk7XG4gICAgY29uc3QgYyA9IGx1dFtNYXRoLnJvdW5kKHQgKiBsYXN0KV0gPz8gbHV0W2xhc3RdO1xuICAgIGNvbnN0IGEgPSBNYXRoLm1pbigxLCBkIC8gc2F0KSAqIG9wYWNpdHk7XG4gICAgY29uc3QgbyA9IGkgKiA0O1xuICAgIC8vIFByZW11bHRpcGxpZWQsIG1hdGNoaW5nIHRoZSBjYW52YXMgYWxwaGEgbW9kZSB0aGUgcmVuZGVyZXIgY29uZmlndXJlcy5cbiAgICByZ2JhW29dID0gTWF0aC5yb3VuZChjWzBdICogYSk7XG4gICAgcmdiYVtvICsgMV0gPSBNYXRoLnJvdW5kKGNbMV0gKiBhKTtcbiAgICByZ2JhW28gKyAyXSA9IE1hdGgucm91bmQoY1syXSAqIGEpO1xuICAgIHJnYmFbbyArIDNdID0gTWF0aC5yb3VuZChhICogMjU1KTtcbiAgfVxuICByZXR1cm4gcmdiYTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBleHByZXNzaW9uVm9sdW1lfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvblZvbHVtZU9wdGlvbnMge1xuICAvKiogS2VybmVsIM+DIHBlciBheGlzLCBpbiB0aGUgb2JzZXJ2YXRpb25zJyBvd24gdW5pdHMuIFRoZSB6IHRlcm0gaXMgdXNlZCBvbmx5XG4gICAqICB3aGVuIHtAbGluayBpbnRlcnBvbGF0ZX0gaXMgc2V0LiAqL1xuICBzaWdtYTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogT25lIGV4cHJlc3Npb24gdmFsdWUgcGVyIG9ic2VydmF0aW9uLiAqL1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgLyoqIE9ic2VydmF0aW9ucyB0byBpbmNsdWRlOyBldmVyeSBvbmUgd2hlbiBhYnNlbnQg4oCUIG9uZSBzZWN0aW9uLCBvciBhIHNlbGVjdGlvbi4gKi9cbiAgaW5kaWNlcz86IFVpbnQzMkFycmF5O1xuICAvKiogU21vb3RoIGFsb25nIHogaW50byBhIGNvbnRpbnVvdXMgZXN0aW1hdGUgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgbWVhc3VyZWRcbiAgICogIHNoZWV0cyBpc29sYXRlZCBhdCB0aGVpciBvd24gcGxhbmVzLiAqL1xuICBpbnRlcnBvbGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIDNEIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBFeHByZXNzaW9uRmllbGR9OiBrZXJuZWwtd2VpZ2h0ZWQgbWVhbiBleHByZXNzaW9uIG9uIGFcbiAqIGB3aWR0aCDDlyBoZWlnaHQgw5cgZGVwdGhgIHZveGVsIGdyaWQsIHdpdGggaXRzIHN1cHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvblZvbHVtZUZpZWxkIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG4gIC8qKiBLZXJuZWwtd2VpZ2h0ZWQgbWVhbiBleHByZXNzaW9uLCB2YWxpZCBvbmx5IHdoZXJlIGBzdXBwb3J0ID4gMGAuICovXG4gIG1lYW46IEZsb2F0MzJBcnJheTtcbiAgLyoqIEtlcm5lbC13ZWlnaHRlZCBjZWxsIGNvdW50IHBlciB2b3hlbCDigJQgMCB3aGVyZSBub3RoaW5nIHdhcyBtZWFzdXJlZC4gKi9cbiAgc3VwcG9ydDogRmxvYXQzMkFycmF5O1xuICAvKiogRmluaXRlIHJhbmdlIG9mIGBtZWFuYCBvdmVyIHRoZSBzdXBwb3J0ZWQgdm94ZWxzLCBmb3IgYSBjb250cmFzdCB3aW5kb3cuICovXG4gIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xufVxuXG4vKipcbiAqIFRoZSBzYW1lIGVzdGltYXRvciBpbiAzRDogYSBnZW5lJ3MgZXhwcmVzc2lvbiBvdmVyIGEgc2VyaWFsbHkgc2VjdGlvbmVkXG4gKiBzcGVjaW1lbiwgb24gYSB7QGxpbmsgRGVuc2l0eUdyaWR9IGxhdHRpY2UuXG4gKlxuICogVHdvIG1vZGVzLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYVxuICogbWVhc3VyZW1lbnQgYW5kIGFuIGVzdGltYXRlOlxuICpcbiAqICAtICoqc2hlZXRzKiogKGBpbnRlcnBvbGF0ZWAgdW5zZXQpIGJsdXJzIGluLXBsYW5lIG9ubHksIHNvIGV4YWN0bHkgdGhlIHogcGxhbmVzXG4gKiAgICB0aGF0IGhvbGQgY2VsbHMgYXJlIGZpbGxlZCBhbmQgdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBzdGF5IGVtcHR5LiBUaGlzIGlzXG4gKiAgICB0aGUgbWVhc3VyZWQgc2VjdGlvbnMsIHN0YWNrZWQg4oCUIHRoZSAyRCBnZW5lIG1hcCBvZiBlYWNoIHNsaWRlLCBhdCBpdHMgb3duIHouXG4gKiAgLSAqKnZvbHVtZSoqIChgaW50ZXJwb2xhdGVgIHNldCkgYWxzbyBzbW9vdGhzIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlblxuICogICAgdGhlIHNlY3Rpb25zIGNhcnJ5IGFuIGludGVycG9sYXRlZCB2YWx1ZS4gU21vb3RoaW5nIHRoZSBudW1lcmF0b3IgYW5kIHRoZVxuICogICAgZGVub21pbmF0b3IgdG9nZXRoZXIgaXMgd2hhdCBtYWtlcyB0aGF0IGhvbmVzdDogaXQgaXMgTmFkYXJheWEtV2F0c29uLCBzbyBhblxuICogICAgdW5pbWFnZWQgcGxhbmUgaW5oZXJpdHMgaXRzIG5laWdoYm91cnMnIE1FQU4gcmF0aGVyIHRoYW4gdGhlaXIgc3VtIHRoaW5uZWRcbiAqICAgIG92ZXIgYSBnYXAgbm9ib2R5IHNhbXBsZWQuIE91dHNpZGUgdGhlIHNhbXBsZWQgcmFuZ2UgdGhlIGZpZWxkIGlzIHplcm9lZCDigJRcbiAqICAgIFwic21vb3RoZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHNlY3Rpb25zXCIgbXVzdCBub3QgcHV0IGV4cHJlc3Npb24gaW4gZnJvbnQgb2ZcbiAqICAgIHRoZSBmaXJzdCBzZWN0aW9uIG9yIGJlaGluZCB0aGUgbGFzdC5cbiAqXG4gKiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBzdGlsbCBuZXZlciBpbnRlcnBvbGF0ZWQ6IGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZVxuICogZGlmZmVyZW50IGNlbGxzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVycG9sYXRlIGFsb25nLiBXaGF0IGlzIGludGVycG9sYXRlZFxuICogaXMgYSBmaWVsZCwgd2hpY2ggaXMgbGVnaXRpbWF0ZWx5IGRlZmluZWQgYmV0d2VlbiB0aGUgcGxhbmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwcmVzc2lvblZvbHVtZShcbiAgb2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBncmlkOiBEZW5zaXR5R3JpZCxcbiAgb3B0czogRXhwcmVzc2lvblZvbHVtZU9wdGlvbnMsXG4pOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsIHtcbiAgY29uc3QgeyB3aWR0aDogdywgaGVpZ2h0OiBoLCBkZXB0aDogZCwgdm94ZWxTaXplIH0gPSBncmlkO1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBkIDw9IDApIHJldHVybiBudWxsO1xuICBjb25zdCBudW0gPSBuZXcgRmxvYXQzMkFycmF5KHcgKiBoICogZCk7XG4gIGNvbnN0IGRlbiA9IG5ldyBGbG9hdDMyQXJyYXkodyAqIGggKiBkKTtcbiAgY29uc3QgaWR4ID0gb3B0cy5pbmRpY2VzO1xuICBjb25zdCBuID0gaWR4ID8gaWR4Lmxlbmd0aCA6IG9icy5jb3VudDtcbiAgY29uc3QgeiA9IG9icy56O1xuICBsZXQgcGxhY2VkID0gMDtcbiAgLy8gVGhlIGltYWdlZCByYW5nZSwgdGFrZW4gZnJvbSB0aGUgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBhY3R1YWxseSBpbmNsdWRlZDpcbiAgLy8gdGhlIGVzdGltYXRlIG1heSBub3QgcmVhY2ggcGFzdCB0aGUgb3V0ZXJtb3N0IHNlY3Rpb24gaXQgd2FzIGJ1aWx0IGZyb20uXG4gIGxldCBmaXJzdCA9IGQ7XG4gIGxldCBsYXN0ID0gLTE7XG5cbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICBjb25zdCBpID0gaWR4ID8gaWR4W2tdIDogaztcbiAgICBjb25zdCBlID0gb3B0cy52YWx1ZXNbaV07XG4gICAgLy8gTm90IG1lYXN1cmVkIGZvciB0aGlzIGNlbGwg4oCUIG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGUgZ2VuZSBpcyBhYnNlbnQgaGVyZVwiLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGUpKSBjb250aW51ZTtcbiAgICBjb25zdCB2eCA9IE1hdGguZmxvb3Iob2JzLnhbaV0gLyB2b3hlbFNpemVbMF0pO1xuICAgIGNvbnN0IHZ5ID0gTWF0aC5mbG9vcihvYnMueVtpXSAvIHZveGVsU2l6ZVsxXSk7XG4gICAgY29uc3QgdnogPSB6ID8gTWF0aC5mbG9vcih6W2ldIC8gdm94ZWxTaXplWzJdKSA6IDA7XG4gICAgaWYgKHZ4IDwgMCB8fCB2eCA+PSB3IHx8IHZ5IDwgMCB8fCB2eSA+PSBoIHx8IHZ6IDwgMCB8fCB2eiA+PSBkKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9ICh2eiAqIGggKyB2eSkgKiB3ICsgdng7XG4gICAgbnVtW2F0XSArPSBlO1xuICAgIGRlblthdF0gKz0gMTtcbiAgICBwbGFjZWQrKztcbiAgICBpZiAodnogPCBmaXJzdCkgZmlyc3QgPSB2ejtcbiAgICBpZiAodnogPiBsYXN0KSBsYXN0ID0gdno7XG4gIH1cbiAgaWYgKCFwbGFjZWQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNpZ21hVm94OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgb3B0cy5zaWdtYVswXSAvIHZveGVsU2l6ZVswXSxcbiAgICBvcHRzLnNpZ21hWzFdIC8gdm94ZWxTaXplWzFdLFxuICAgIG9wdHMuc2lnbWFbMl0gLyB2b3hlbFNpemVbMl0sXG4gIF07XG4gIC8vIEluLXBsYW5lIGFsd2F5czogYSBzZWN0aW9uJ3Mgb3duIGdlbmUgbWFwIGlzIGEgMkQgZmllbGQsIHdoaWNoZXZlciBtb2RlIHRoaXMgaXMuXG4gIGZvciAoY29uc3QgYXhpcyBvZiBbMCwgMV0gYXMgY29uc3QpIHtcbiAgICBibHVyVm9sdW1lQXhpcyhudW0sIHcsIGgsIGQsIGF4aXMsIHNpZ21hVm94W2F4aXNdKTtcbiAgICBibHVyVm9sdW1lQXhpcyhkZW4sIHcsIGgsIGQsIGF4aXMsIHNpZ21hVm94W2F4aXNdKTtcbiAgfVxuICBpZiAob3B0cy5pbnRlcnBvbGF0ZSkge1xuICAgIGJsdXJWb2x1bWVBeGlzKG51bSwgdywgaCwgZCwgMiwgc2lnbWFWb3hbMl0pO1xuICAgIGJsdXJWb2x1bWVBeGlzKGRlbiwgdywgaCwgZCwgMiwgc2lnbWFWb3hbMl0pO1xuICAgIGNvbnN0IHBsYW5lID0gdyAqIGg7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBkOyBrKyspIHtcbiAgICAgIGlmIChrID49IGZpcnN0ICYmIGsgPD0gbGFzdCkgY29udGludWU7XG4gICAgICAvLyBUaGUgYmx1ciBsZWF2ZXMgYSB0YWlsIHBhc3QgdGhlIG91dGVybW9zdCBzZWN0aW9uczsga2VlcGluZyBpdCB3b3VsZCBkcmF3XG4gICAgICAvLyBleHByZXNzaW9uIHdoZXJlIHRoZSBzcGVjaW1lbiB3YXMgbmV2ZXIgc2VjdGlvbmVkLlxuICAgICAgbnVtLmZpbGwoMCwgayAqIHBsYW5lLCAoayArIDEpICogcGxhbmUpO1xuICAgICAgZGVuLmZpbGwoMCwgayAqIHBsYW5lLCAoayArIDEpICogcGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBuZXcgRmxvYXQzMkFycmF5KG51bS5sZW5ndGgpO1xuICBsZXQgbG8gPSBJbmZpbml0eTtcbiAgbGV0IGhpID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdXBwb3J0ID0gZGVuW2ldO1xuICAgIGlmIChzdXBwb3J0IDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IG0gPSBudW1baV0gLyBzdXBwb3J0O1xuICAgIG1lYW5baV0gPSBtO1xuICAgIGlmIChtIDwgbG8pIGxvID0gbTtcbiAgICBpZiAobSA+IGhpKSBoaSA9IG07XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobG8pKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3LFxuICAgIGhlaWdodDogaCxcbiAgICBkZXB0aDogZCxcbiAgICBtZWFuLFxuICAgIHN1cHBvcnQ6IGRlbixcbiAgICByYW5nZTogaGkgPiBsbyA/IFtsbywgaGldIDogW2xvLCBsbyArIDFdLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY29kZSBhIGZpZWxkIGludG8gdGhlIHVpbnQ4IHNjYWxhciBhIGBWb2x1bWVMYXllcmAgcmVuZGVycywgd2luZG93ZWQgdGhlIHNhbWVcbiAqIHdheSB0aGUgMkQgbWFwIGFuZCB0aGUgbWFya2VycyBhcmUgc28gdGhlIHRocmVlIGNhbm5vdCBkaXNhZ3JlZS5cbiAqXG4gKiBgZmxvb3JgIGxpZnRzIGV2ZXJ5IE1FQVNVUkVEIHZveGVsIHRvIGF0IGxlYXN0IHRoaXMgZnJhY3Rpb24gb2YgZnVsbCBzY2FsZSwgc29cbiAqIHRoYXQgXCJ0aGUgZ2VuZSBpcyBub3QgaGVyZVwiIGNhbiBiZSB0b2xkIGZyb20gXCJub2JvZHkgc2VjdGlvbmVkIGhlcmVcIiDigJQgdGhlXG4gKiBkaXN0aW5jdGlvbiB0aGUgMkQgbWFwIGtlZXBzIHdpdGggaXRzIHNlcGFyYXRlIHN1cHBvcnQgY2hhbm5lbCwgd2hpY2ggYSBzY2FsYXJcbiAqIHZvbHVtZSBjYW5ub3QgZXhwcmVzcyBiZWNhdXNlIGl0cyByYXltYXJjaCB0YWtlcyBhbHBoYSBmcm9tIHRoZSBzYW1lIG51bWJlciBpdFxuICogdGFrZXMgY29sb3VyIGZyb20uXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gT0ZGLCBiZWNhdXNlIGluIGEgdm9sdW1lIHRoYXQgdHJhZGUgZG9lcyBub3QgcGF5LiBBIHJheSBjcm9zc2VzXG4gKiB0ZW5zIG9mIG1lYXN1cmVkIHBsYW5lcyBhbmQgdGhlIERWUiBjb21wb3NpdGVzIGV2ZXJ5IG9uZSBvZiB0aGVtLCBzbyBhIGZsb29yXG4gKiBsYXJnZSBlbm91Z2ggdG8gc2VlIG9uIGEgc2luZ2xlIHBsYW5lIHNhdHVyYXRlcyB0byBhbiBvcGFxdWUgc2hlbGwgb3ZlciB0aGVcbiAqIHdob2xlIHNwZWNpbWVuIGFuZCBidXJpZXMgdGhlIHNpZ25hbCBpdCB3YXMgbWVhbnQgdG8gY29udGV4dHVhbGlzZSwgd2hpbGUgb25lXG4gKiBzbWFsbCBlbm91Z2ggdG8gc3RheSBmYWludCBpcyBhbHJlYWR5IGludmlzaWJsZSBwZXIgcGxhbmUuIFRoZSBtZWFzdXJlZCBlbnZlbG9wZVxuICogaXMgYmV0dGVyIHJlYWQgZnJvbSB0aGUgYW5hdG9teSBsYXllciBhbmQgdGhlIG9ic2VydmF0aW9ucywgd2hpY2ggYXJlIGRyYXduIGluXG4gKiB0aGUgc2FtZSBzY2VuZSDigJQgYW5kIHRoZSBzdXJyb3VuZGluZyBkZW5zaXR5IHZvbHVtZXMgdGFrZSB0aGUgc2FtZSBuby1mbG9vclxuICogYXBwcm9hY2gsIHNvIHRoZSBzY2VuZSBzdGF5cyBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVFeHByZXNzaW9uVm9sdW1lKFxuICBmaWVsZDogRXhwcmVzc2lvblZvbHVtZUZpZWxkLFxuICB3aW5kb3c6IFtudW1iZXIsIG51bWJlcl0sXG4gIG9wdHM6IHsgbG9nPzogYm9vbGVhbjsgZmxvb3I/OiBudW1iZXIgfSA9IHt9LFxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHsgbWVhbiwgc3VwcG9ydCB9ID0gZmllbGQ7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OEFycmF5KG1lYW4ubGVuZ3RoKTtcbiAgY29uc3QgbG9nID0gISFvcHRzLmxvZztcbiAgY29uc3QgZmxvb3IgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRzLmZsb29yID8/IDApKTtcbiAgY29uc3Qgbm9ybSA9ICh2OiBudW1iZXIpOiBudW1iZXIgPT4gKGxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgdikpIDogdik7XG4gIGNvbnN0IGxvID0gbm9ybSh3aW5kb3dbMF0pO1xuICBjb25zdCBoaSA9IG5vcm0od2luZG93WzFdKTtcbiAgY29uc3Qgc3BhbiA9IGhpID4gbG8gPyBoaSAtIGxvIDogMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFuLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1cHBvcnRbaV0gPD0gMCkgY29udGludWU7IC8vIHVubWVhc3VyZWQg4oCUIHplcm8sIHNvIHRoZSByYXltYXJjaCBza2lwcyBpdFxuICAgIGNvbnN0IHQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCAobm9ybShtZWFuW2ldKSAtIGxvKSAvIHNwYW4pKTtcbiAgICBvdXRbaV0gPSBNYXRoLnJvdW5kKChmbG9vciArICgxIC0gZmxvb3IpICogdCkgKiAyNTUpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
@@ -57,4 +57,4 @@ export function framePositions(positions, viewportW, viewportH, margin = SPATIAL
|
|
|
57
57
|
return { center, zoom: null };
|
|
58
58
|
return { center, zoom: margin * Math.min(viewportW / spanX, viewportH / spanY) };
|
|
59
59
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1mcmFtaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtZnJhbWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUg7a0VBQ2tFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQVV2Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixTQUF1QixFQUN2QixTQUFpQixFQUNqQixTQUFpQixFQUNqQixNQUFNLEdBQUcsa0JBQWtCO0lBRTNCLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNyQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw4RUFBOEU7UUFDOUUsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQ3pELElBQUksQ0FBQyxHQUFHLElBQUk7WUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUk7WUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUk7WUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUk7WUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFbEUsTUFBTSxNQUFNLEdBQXFCLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxFQUFFLFNBQVMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZyYW1pbmcgYSAyRCBzY2F0dGVyIG9uIGl0cyBvd24gY29vcmRpbmF0ZXMuXG4gKlxuICogVGhlIDJEIHNwYXRpYWwgY2FtZXJhIGlzIG5vcm1hbGx5IGZpdHRlZCB0byB0aGUgSU1BR0UsIGJlY2F1c2UgdGhlIG9ic2VydmF0aW9ucyBhcmUgcmVjb3JkZWQgaW5cbiAqIHRoYXQgaW1hZ2UncyBwaXhlbCBzcGFjZSDigJQgZnJhbWUgdGhlIGltYWdlIGFuZCB0aGV5IGNvbWUgd2l0aCBpdC4gQSBkYXRhc2V0IHdpdGggbm8gcmVmZXJlbmNlXG4gKiBpbWFnZSBoYXMgY29vcmRpbmF0ZXMgaW4gd2hhdGV2ZXIgdW5pdHMgaXRzIHNvdXJjZSB1c2VkOiBzZXFGSVNIJ3Mgc3BhbiBhYm91dCA1IHggNy4gTGVmdCB3aXRoXG4gKiB0aGUgcHJldmlvdXMgaW1hZ2UncyBmcmFtaW5nLCBzdWNoIGEgZGF0YXNldCBsYW5kcyBhcyBhIGhhbmRmdWwgb2YgcGl4ZWxzIGZhciBvZmYtY2VudHJlLCB3aGljaFxuICogbG9va3MgZXhhY3RseSBsaWtlIG5vdGhpbmcgaGF2aW5nIGxvYWRlZCByYXRoZXIgdGhhbiBsaWtlIGEgZnJhbWluZyBwcm9ibGVtLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZGVuc2l0eS50c2AgYW5kIHRoZSByZXN0IG9mIHRoaXMgZGlyZWN0b3J5IOKAlCB0aGUgcmVuZGVyZXIgYXBwbGllcyB0aGUgcmVzdWx0LlxuICovXG5cbi8qKiBGcmFjdGlvbiBvZiB0aGUgdmlld3BvcnQgdGhlIGNvb3JkaW5hdGVzIGFyZSBmaXR0ZWQgaW50bywgc28gdGhlIG91dGVybW9zdCBtYXJrZXJzIGFyZSBub3RcbiAqICBmbHVzaCBhZ2FpbnN0IHRoZSBlZGdlLiBNYXRjaGVzIG5hcGFyaS1qcydzIG93biBmaXQgbWFyZ2luLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfRklUX01BUkdJTiA9IDAuOTU7XG5cbi8qKiBBIDJEIGNhbWVyYSBmcmFtaW5nOiB3aGVyZSB0byBjZW50cmUsIGFuZCBob3cgZmFyIHRvIHpvb20uICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxGcmFtaW5nIHtcbiAgLyoqIFdvcmxkIHBvaW50IHRvIHB1dCBhdCB0aGUgY2VudHJlIG9mIHRoZSB2aWV3cG9ydC4gKi9cbiAgY2VudGVyOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogV29ybGQgdW5pdHMgcGVyIHBpeGVsLCBpbnZlcnRlZCDigJQgdGhlIGNhbWVyYSdzIGB6b29tYC4gKi9cbiAgem9vbTogbnVtYmVyO1xufVxuXG4vKipcbiAqIENhbWVyYSBjZW50cmUgYW5kIHpvb20gdGhhdCBmaXQgYHBvc2l0aW9uc2AgaW50byBhIGB2aWV3cG9ydFdgIHggYHZpZXdwb3J0SGAgYm94LlxuICpcbiAqIGBwb3NpdGlvbnNgIGlzIGludGVybGVhdmVkIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gLCB0aGUgbGF5b3V0IHRoZSBwb2ludHMgbGF5ZXIgdGFrZXMuXG4gKlxuICogTnVsbCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZml0IOKAlCBubyBwb2ludHMsIGEgdmlld3BvcnQgd2l0aCBubyBhcmVhLCBvciBjb29yZGluYXRlcyB0aGF0IGFyZVxuICogZW50aXJlbHkgbm9uLWZpbml0ZS4gTnVsbCBtZWFucyBMRUFWRSBUSEUgQ0FNRVJBIEFMT05FOiBhIGNhbGxlciB0aGF0IHN1YnN0aXR1dGVkIGEgZGVmYXVsdFxuICogd291bGQgbW92ZSB0aGUgdmlldyBmb3IgYSBkYXRhc2V0IGl0IGNhbm5vdCBmcmFtZSwgd2hpY2ggaXMgd29yc2UgdGhhbiBub3QgbW92aW5nIGl0LlxuICpcbiAqIEEgZGVnZW5lcmF0ZSBleHRlbnQg4oCUIG9uZSBwb2ludCwgb3IgZXZlcnkgcG9pbnQgb24gYSBsaW5lIOKAlCB5aWVsZHMgYSBjZW50cmUgYnV0IG5vIHpvb20sIHNpbmNlXG4gKiB0aGVyZSBpcyBubyBzcGFuIHRvIGRpdmlkZSBieS4gVGhlIGNhbGxlciBrZWVwcyBpdHMgY3VycmVudCB6b29tIGFuZCBqdXN0IHJlY2VudHJlcywgcmF0aGVyIHRoYW5cbiAqIGRpdmlkaW5nIGJ5IHplcm8gaW50byBhbiBpbmZpbml0ZSBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZVBvc2l0aW9ucyhcbiAgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXksXG4gIHZpZXdwb3J0VzogbnVtYmVyLFxuICB2aWV3cG9ydEg6IG51bWJlcixcbiAgbWFyZ2luID0gU1BBVElBTF9GSVRfTUFSR0lOLFxuKTogU3BhdGlhbEZyYW1pbmcgfCB7IGNlbnRlcjogW251bWJlciwgbnVtYmVyXTsgem9vbTogbnVsbCB9IHwgbnVsbCB7XG4gIGlmIChwb3NpdGlvbnMubGVuZ3RoIDwgMiB8fCB2aWV3cG9ydFcgPD0gMCB8fCB2aWV3cG9ydEggPD0gMCkgcmV0dXJuIG51bGw7XG5cbiAgbGV0IHhNaW4gPSBJbmZpbml0eTtcbiAgbGV0IHhNYXggPSAtSW5maW5pdHk7XG4gIGxldCB5TWluID0gSW5maW5pdHk7XG4gIGxldCB5TWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgIGNvbnN0IHkgPSBwb3NpdGlvbnNbaSArIDFdO1xuICAgIC8vIEEgTmFOIGNvb3JkaW5hdGUgaXMgYSBob2xlIGluIHRoZSBkYXRhLCBub3QgYSBwb3NpdGlvbiDigJQgaW5jbHVkaW5nIGl0IHdvdWxkXG4gICAgLy8gcG9pc29uIHRoZSBleHRlbnQgYW5kIGZyYW1lIG9uIG5vdGhpbmcuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkgY29udGludWU7XG4gICAgaWYgKHggPCB4TWluKSB4TWluID0geDtcbiAgICBpZiAoeCA+IHhNYXgpIHhNYXggPSB4O1xuICAgIGlmICh5IDwgeU1pbikgeU1pbiA9IHk7XG4gICAgaWYgKHkgPiB5TWF4KSB5TWF4ID0geTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4TWluKSB8fCAhTnVtYmVyLmlzRmluaXRlKHlNaW4pKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBjZW50ZXI6IFtudW1iZXIsIG51bWJlcl0gPSBbKHhNaW4gKyB4TWF4KSAvIDIsICh5TWluICsgeU1heCkgLyAyXTtcbiAgY29uc3Qgc3BhblggPSB4TWF4IC0geE1pbjtcbiAgY29uc3Qgc3BhblkgPSB5TWF4IC0geU1pbjtcbiAgaWYgKHNwYW5YIDw9IDAgfHwgc3BhblkgPD0gMCkgcmV0dXJuIHsgY2VudGVyLCB6b29tOiBudWxsIH07XG4gIHJldHVybiB7IGNlbnRlciwgem9vbTogbWFyZ2luICogTWF0aC5taW4odmlld3BvcnRXIC8gc3BhblgsIHZpZXdwb3J0SCAvIHNwYW5ZKSB9O1xufVxuIl19
|
|
@@ -77,8 +77,11 @@ export function heatmapMatrix(genes, groups, opts = {}) {
|
|
|
77
77
|
return { c, peak };
|
|
78
78
|
});
|
|
79
79
|
// Strongest first, then original order for ties, so the choice is stable.
|
|
80
|
-
strength.sort((a, b) =>
|
|
81
|
-
const picked = strength
|
|
80
|
+
strength.sort((a, b) => b.peak - a.peak || a.c - b.c);
|
|
81
|
+
const picked = strength
|
|
82
|
+
.slice(0, opts.maxCols)
|
|
83
|
+
.map((s) => s.c)
|
|
84
|
+
.sort((a, b) => a - b);
|
|
82
85
|
hiddenCols = cols.length - picked.length;
|
|
83
86
|
outCols = picked.map((c) => cols[c]);
|
|
84
87
|
outCounts = Uint32Array.from(picked, (c) => counts[c]);
|
|
@@ -182,4 +185,4 @@ export function cellsAsGroups(indices, observationCount, max = 200) {
|
|
|
182
185
|
}
|
|
183
186
|
return { groups: { codes, categories }, indices: picked };
|
|
184
187
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1oZWF0bWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtaGVhdG1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUEwRnBFLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixLQUE2QixFQUM3QixNQUFxQixFQUNyQixPQUE2QixFQUFFO0lBRS9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUV6RCx5RUFBeUU7SUFDekUsOERBQThEO0lBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksSUFBSSxPQUFPO1lBQUUsU0FBUztRQUN0RCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUVuQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxD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QyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFD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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOT19DQVRFR09SWSB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIE1lYW4gZXhwcmVzc2lvbiBwZXIgZ3JvdXAsIGZvciB0aGUgZ2VuZSDDlyBjbGFzcyBoZWF0bWFwLlxuICpcbiAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBvbmUgZ2VuZSBhbnN3ZXJzIFwid2hlcmUgaXMgdGhpcyBnZW5lXCIuIEl0IGNhbm5vdCBhbnN3ZXJcbiAqIFwid2hpY2ggY2xhc3NlcyBleHByZXNzIHdoaWNoIGdlbmVzXCIsIHdoaWNoIGlzIHRoZSBxdWVzdGlvbiBhIG1hcmtlciBwYW5lbCBpc1xuICogYWN0dWFsbHkgcmVhZCBmb3Ig4oCUIGFuZCB0aGUgc3RhbmRhcmQgb2JqZWN0IGZvciB0aGF0IGlzIHRoZSBtZWFuLWV4cHJlc3Npb25cbiAqIG1hdHJpeCBwZXIgY2x1c3RlciAoc2NhbnB5J3MgYG1hdHJpeHBsb3RgL2Bkb3RwbG90YCksIGdlbmVzIGFnYWluc3QgY2xhc3Nlcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGNlbGxzIMOXIGdlbmVzIGF0IHRoZSBmdWxsIGRhdGFzZXQ6IDM3NGsgY29sdW1ucyBpcyBub3QgYVxuICogaGVhdG1hcC4gQ2VsbHMgYmVjb21lIGNvbHVtbnMgb25seSBpbnNpZGUgYSBzZWxlY3Rpb24sIHdoZXJlIGEgZmV3IHRob3VzYW5kXG4gKiBvZiB0aGVtIHJlbmRlciBhbmQgdGhlIHF1ZXN0aW9uIGNoYW5nZXMgdG8gXCJ3aGF0IGlzIGluIHRoaXMgcmVnaW9uXCIuXG4gKlxuICogVHdvIHRoaW5ncyB0aGlzIGhhcyB0byBnZXQgcmlnaHQgdG8gYmUgcmVhZGFibGU6XG4gKlxuICogIC0gQSBjZWxsIHdpdGggbm8gbWVhc3VyZW1lbnQgZm9yIGEgZ2VuZSAoYE5hTmApIGlzIFNLSVBQRUQsIG5vdCBjb3VudGVkIGFzXG4gKiAgICB6ZXJvLiBDb3VudGluZyBpdCB3b3VsZCBkcmFnIGEgZ3JvdXAncyBtZWFuIHRvd2FyZHMgYWJzZW5jZSBmb3IgYSByZWFzb25cbiAqICAgIHRoYXQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgYmlvbG9neS5cbiAqICAtIFotc2NvcmluZyBpcyBwZXIgR0VORSwgYWNyb3NzIGdyb3Vwcy4gV2l0aG91dCBpdCBhIGdlbmUgZXhwcmVzc2VkIGFuIG9yZGVyXG4gKiAgICBvZiBtYWduaXR1ZGUgYWJvdmUgdGhlIG90aGVycyBzYXR1cmF0ZXMgdGhlIGNvbG91ciBzY2FsZSBhbmQgdGhlIHJlc3Qgb2ZcbiAqICAgIHRoZSBwYW5lbCByZWFkcyBhcyB1bmlmb3JtbHkgYmxhbmsg4oCUIHRoZSBtYXRyaXggd291bGQgc2hvdyB3aGljaCBnZW5lIGlzXG4gKiAgICBsb3VkZXN0IHJhdGhlciB0aGFuIHdoaWNoIGNsYXNzIGV4cHJlc3NlcyB3aGF0LlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFBsb3RseSwgbm8gcmVuZGVyZXIg4oCUIGxpa2UgYHNwYXRpYWwtZGVuc2l0eS50c2AsIGFuZFxuICogdGVzdGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuXG4vKiogT25lIGdlbmUncyB2YWx1ZXMsIHdpdGggdGhlIG5hbWUgdG8gbGFiZWwgaXRzIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhdG1hcEdlbmUge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBPbmUgdmFsdWUgcGVyIG9ic2VydmF0aW9uOyBgTmFOYCB3aGVyZSB0aGUgZ2VuZSB3YXMgbm90IG1lYXN1cmVkLiAqL1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbn1cblxuLyoqIFRoZSBjb2x1bW5zIHRvIGFnZ3JlZ2F0ZSBpbnRvOiBhIGNhdGVnb3JpY2FsIGNvbHVtbidzIGNhdGVnb3JpZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYXRtYXBHcm91cHMge1xuICAvKiogUGVyLW9ic2VydmF0aW9uIGNhdGVnb3J5IGluZGV4LCBvciB7QGxpbmsgTk9fQ0FURUdPUll9LiAqL1xuICBjb2RlczogVWludDE2QXJyYXk7XG4gIGNhdGVnb3JpZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYXRtYXBNYXRyaXhPcHRpb25zIHtcbiAgLyoqIE9ic2VydmF0aW9ucyB0byBpbmNsdWRlOyBldmVyeSBvbmUgd2hlbiBhYnNlbnQgKGFuIFJPSSBzZWxlY3Rpb24pLiAqL1xuICBpbmRpY2VzPzogVWludDMyQXJyYXk7XG4gIC8qKlxuICAgKiBaLXNjb3JlIGVhY2ggZ2VuZSBhY3Jvc3MgdGhlIGdyb3Vwcywgc28gb25lIGxvdWQgZ2VuZSBjYW5ub3QgZmxhdHRlbiB0aGVcbiAgICogcGFuZWwuIE9uIGJ5IGRlZmF1bHQg4oCUIHRoZSByYXcgbWVhbnMgYXJlIG9ubHkgcmVhZGFibGUgd2hlbiBldmVyeSBnZW5lIGlzXG4gICAqIG9uIGEgY29tcGFyYWJsZSBzY2FsZS5cbiAgICovXG4gIHpTY29yZT86IGJvb2xlYW47XG4gIC8qKiBEcm9wIGdyb3VwcyB3aXRoIGZld2VyIHRoYW4gdGhpcyBtYW55IG1lYXN1cmVkIGNlbGxzLiBBIG1lYW4gb3ZlciBvbmUgb3JcbiAgICogIHR3byBjZWxscyBpcyBub2lzZSBwcmVzZW50ZWQgd2l0aCB0aGUgc2FtZSB3ZWlnaHQgYXMgYSByZWFsIG9uZS4gKi9cbiAgbWluQ2VsbHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBLZWVwIGF0IG1vc3QgdGhpcyBtYW55IGNvbHVtbnMsIGNob3NlbiBieSB0aGUgU1RST05HRVNUIHNpZ25hbCBhbnkgcGlja2VkXG4gICAqIGdlbmUgc2hvd3MgaW4gdGhlbS5cbiAgICpcbiAgICogYHN1YmNsYXNzYCBoYXMgMzM4IGNhdGVnb3JpZXMuIERyYXduIGluIGZ1bGwgdGhhdCBpcyBhIHRleHR1cmUgcmF0aGVyIHRoYW4gYVxuICAgKiBwYW5lbCDigJQgZXZlcnkgY29sdW1uIGEgY291cGxlIG9mIHBpeGVscyB3aWRlLCBldmVyeSBsYWJlbCB1bnJlYWRhYmxlIOKAlCBhbmRcbiAgICogdGhlIHF1ZXN0aW9uIGJlaW5nIGFza2VkIChcIndoaWNoIGdyb3VwcyBleHByZXNzIG15IGdlbmVzXCIpIGlzIGFuc3dlcmVkIGJ5XG4gICAqIHRoZSBoYW5kZnVsIG9mIGdyb3VwcyB3aGVyZSBhIGdlbmUgYWN0dWFsbHkgc3RhbmRzIG91dC4gUmFua2luZyBieVxuICAgKiBtYXggfHZhbHVlfCBhY3Jvc3MgdGhlIHJvd3Mgc3VyZmFjZXMgZXhhY3RseSB0aG9zZTsgcmFua2luZyBieSBjZWxsIGNvdW50XG4gICAqIHdvdWxkIGluc3RlYWQgc3VyZmFjZSB0aGUgYmlnZ2VzdCBncm91cHMsIHdoaWNoIGlzIGEgZGlmZmVyZW50IHF1ZXN0aW9uLlxuICAgKlxuICAgKiBVbnNldCBrZWVwcyBldmVyeSBjb2x1bW4gdGhhdCBjbGVhcmVkIGBtaW5DZWxsc2AuXG4gICAqL1xuICBtYXhDb2xzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYXRtYXBNYXRyaXgge1xuICAvKiogR2VuZSBuYW1lcywgb25lIHBlciByb3csIGluIHRoZSBvcmRlciBnaXZlbi4gKi9cbiAgcm93czogc3RyaW5nW107XG4gIC8qKiBDb2x1bW5zIGRyb3BwZWQgYnkgYG1heENvbHNgLCBzbyB0aGUgY2FsbGVyIGNhbiBzYXkgaG93IG1hbnkgYXJlIGhpZGRlblxuICAgKiAgcmF0aGVyIHRoYW4gc2lsZW50bHkgc2hvd2luZyBhIHN1YnNldCBhcyBpZiBpdCB3ZXJlIGV2ZXJ5dGhpbmcuICovXG4gIGhpZGRlbkNvbHM6IG51bWJlcjtcbiAgLyoqIEdyb3VwIGxhYmVscywgb25lIHBlciBjb2x1bW4g4oCUIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHN1cnZpdmVkIGBtaW5DZWxsc2AuICovXG4gIGNvbHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogYHJvd3MubGVuZ3RoIMOXIGNvbHMubGVuZ3RoYCwgcm93LW1ham9yOiBgdmFsdWVzW3IgKiBjb2xzLmxlbmd0aCArIGNdYC5cbiAgICogYE5hTmAgd2hlcmUgYSBncm91cCBoYWQgbm90aGluZyBtZWFzdXJlZCBmb3IgdGhhdCBnZW5lLCB3aGljaCB0aGUgY2FsbGVyXG4gICAqIGRyYXdzIGFzIGEgZ2FwIHJhdGhlciB0aGFuIGFzIGEgemVyby5cbiAgICovXG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAvKiogTWVhc3VyZWQgY2VsbHMgYmVoaW5kIGVhY2ggY29sdW1uLCBpbmRleC1hbGlnbmVkIHdpdGgge0BsaW5rIGNvbHN9LiAqL1xuICBjb3VudHM6IFVpbnQzMkFycmF5O1xuICAvKiogRmluaXRlIHJhbmdlIG9mIGB2YWx1ZXNgLCBmb3IgYSBzeW1tZXRyaWMgb3IgYWJzb2x1dGUgY29sb3VyIHNjYWxlLiAqL1xuICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcbn1cblxuLyoqIERlZmF1bHQgZmxvb3IgZm9yIGEgZ3JvdXAgdG8gZWFybiBhIGNvbHVtbi4gKi9cbmV4cG9ydCBjb25zdCBIRUFUTUFQX01JTl9DRUxMUyA9IDM7XG5cbi8qKlxuICogTWVhbiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwLlxuICpcbiAqIE51bGwgd2hlbiBub3RoaW5nIHN1cnZpdmVzIOKAlCBubyBnZW5lcywgbm8gZ3JvdXBzLCBvciBldmVyeSBncm91cCBmaWx0ZXJlZFxuICogb3V0IOKAlCBzbyB0aGUgY2FsbGVyIGRyYXdzIG5vIGNoYXJ0IHJhdGhlciB0aGFuIGFuIGVtcHR5IGdyaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWF0bWFwTWF0cml4KFxuICBnZW5lczogcmVhZG9ubHkgSGVhdG1hcEdlbmVbXSxcbiAgZ3JvdXBzOiBIZWF0bWFwR3JvdXBzLFxuICBvcHRzOiBIZWF0bWFwTWF0cml4T3B0aW9ucyA9IHt9LFxuKTogSGVhdG1hcE1hdHJpeCB8IG51bGwge1xuICBjb25zdCBuR3JvdXBzID0gZ3JvdXBzLmNhdGVnb3JpZXMubGVuZ3RoO1xuICBpZiAoZ2VuZXMubGVuZ3RoID09PSAwIHx8IG5Hcm91cHMgPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBtaW5DZWxscyA9IG9wdHMubWluQ2VsbHMgPz8gSEVBVE1BUF9NSU5fQ0VMTFM7XG4gIGNvbnN0IGluZGljZXMgPSBvcHRzLmluZGljZXM7XG4gIGNvbnN0IG4gPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBncm91cHMuY29kZXMubGVuZ3RoO1xuXG4gIC8vIENlbGxzIHBlciBncm91cCwgY291bnRlZCBvbmNlIGZyb20gdGhlIGNvZGVzIHJhdGhlciB0aGFuIHBlciBnZW5lOiB0aGVcbiAgLy8gbWVtYmVyc2hpcCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggZ2VuZSBpcyBiZWluZyBhdmVyYWdlZC5cbiAgY29uc3QgZ3JvdXBDb3VudCA9IG5ldyBVaW50MzJBcnJheShuR3JvdXBzKTtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICBjb25zdCBpID0gaW5kaWNlcyA/IGluZGljZXNba10gOiBrO1xuICAgIGNvbnN0IGNvZGUgPSBncm91cHMuY29kZXNbaV07XG4gICAgaWYgKGNvZGUgPT09IE5PX0NBVEVHT1JZIHx8IGNvZGUgPj0gbkdyb3VwcykgY29udGludWU7XG4gICAgZ3JvdXBDb3VudFtjb2RlXSsrO1xuICB9XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGcgPSAwOyBnIDwgbkdyb3VwczsgZysrKSBpZiAoZ3JvdXBDb3VudFtnXSA+PSBtaW5DZWxscykga2VlcC5wdXNoKGcpO1xuICBpZiAoa2VlcC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJvd3MgPSBnZW5lcy5tYXAoKGcpID0+IGcubmFtZSk7XG4gIGNvbnN0IGNvbHMgPSBrZWVwLm1hcCgoZykgPT4gZ3JvdXBzLmNhdGVnb3JpZXNbZ10pO1xuICBjb25zdCBjb3VudHMgPSBVaW50MzJBcnJheS5mcm9tKGtlZXAsIChnKSA9PiBncm91cENvdW50W2ddKTtcbiAgY29uc3QgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShyb3dzLmxlbmd0aCAqIGNvbHMubGVuZ3RoKS5maWxsKE5hTik7XG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW5lcy5sZW5ndGg7IHIrKykge1xuICAgIGNvbnN0IGdlbmUgPSBnZW5lc1tyXTtcbiAgICBjb25zdCBzdW0gPSBuZXcgRmxvYXQ2NEFycmF5KG5Hcm91cHMpO1xuICAgIGNvbnN0IG1lYXN1cmVkID0gbmV3IFVpbnQzMkFycmF5KG5Hcm91cHMpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICBjb25zdCBpID0gaW5kaWNlcyA/IGluZGljZXNba10gOiBrO1xuICAgICAgY29uc3QgY29kZSA9IGdyb3Vwcy5jb2Rlc1tpXTtcbiAgICAgIGlmIChjb2RlID09PSBOT19DQVRFR09SWSB8fCBjb2RlID49IG5Hcm91cHMpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdiA9IGdlbmUudmFsdWVzW2ldO1xuICAgICAgLy8gTm90IG1lYXN1cmVkIGZvciB0aGlzIGNlbGwg4oCUIHNraXBwaW5nIGtlZXBzIHRoZSBtZWFuIGFib3V0IHRoZSBjZWxsc1xuICAgICAgLy8gdGhhdCB3ZXJlIGFjdHVhbGx5IGFzc2F5ZWQuXG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgY29udGludWU7XG4gICAgICBzdW1bY29kZV0gKz0gdjtcbiAgICAgIG1lYXN1cmVkW2NvZGVdKys7XG4gICAgfVxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwga2VlcC5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3QgZyA9IGtlZXBbY107XG4gICAgICBpZiAobWVhc3VyZWRbZ10gPT09IDApIGNvbnRpbnVlOyAvLyBzdGF5cyBOYU46IGEgZ2FwLCBub3QgYSB6ZXJvXG4gICAgICB2YWx1ZXNbciAqIGNvbHMubGVuZ3RoICsgY10gPSBzdW1bZ10gLyBtZWFzdXJlZFtnXTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy56U2NvcmUgIT09IGZhbHNlKSB6U2NvcmVSb3dzKHZhbHVlcywgcm93cy5sZW5ndGgsIGNvbHMubGVuZ3RoKTtcblxuICAvLyBSYW5rZWQgQUZURVIgc2NhbGluZywgc28gXCJzdHJvbmdlc3Qgc2lnbmFsXCIgbWVhbnMgc3Ryb25nZXN0IHJlbGF0aXZlIHRvIGVhY2hcbiAgLy8gZ2VuZSdzIG93biBzcHJlYWQgcmF0aGVyIHRoYW4gdG8gd2hpY2hldmVyIGdlbmUgaGFzIHRoZSBsYXJnZXN0IHVuaXRzLlxuICBsZXQgaGlkZGVuQ29scyA9IDA7XG4gIGxldCBvdXRDb2xzID0gY29scztcbiAgbGV0IG91dFZhbHVlcyA9IHZhbHVlcztcbiAgbGV0IG91dENvdW50cyA9IGNvdW50cztcbiAgaWYgKG9wdHMubWF4Q29scyAhPT0gdW5kZWZpbmVkICYmIGNvbHMubGVuZ3RoID4gb3B0cy5tYXhDb2xzKSB7XG4gICAgY29uc3Qgc3RyZW5ndGggPSBjb2xzLm1hcCgoXywgYykgPT4ge1xuICAgICAgbGV0IHBlYWsgPSAwO1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHYgPSBNYXRoLmFicyh2YWx1ZXNbciAqIGNvbHMubGVuZ3RoICsgY10pO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHYpICYmIHYgPiBwZWFrKSBwZWFrID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGMsIHBlYWsgfTtcbiAgICB9KTtcbiAgICAvLyBTdHJvbmdlc3QgZmlyc3QsIHRoZW4gb3JpZ2luYWwgb3JkZXIgZm9yIHRpZXMsIHNvIHRoZSBjaG9pY2UgaXMgc3RhYmxlLlxuICAgIHN0cmVuZ3RoLnNvcnQoKGEsIGIpID0+IChiLnBlYWsgLSBhLnBlYWspIHx8IChhLmMgLSBiLmMpKTtcbiAgICBjb25zdCBwaWNrZWQgPSBzdHJlbmd0aC5zbGljZSgwLCBvcHRzLm1heENvbHMpLm1hcCgocykgPT4gcy5jKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgaGlkZGVuQ29scyA9IGNvbHMubGVuZ3RoIC0gcGlja2VkLmxlbmd0aDtcbiAgICBvdXRDb2xzID0gcGlja2VkLm1hcCgoYykgPT4gY29sc1tjXSk7XG4gICAgb3V0Q291bnRzID0gVWludDMyQXJyYXkuZnJvbShwaWNrZWQsIChjKSA9PiBjb3VudHNbY10pO1xuICAgIG91dFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkocm93cy5sZW5ndGggKiBwaWNrZWQubGVuZ3RoKTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcGlja2VkLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIG91dFZhbHVlc1tyICogcGlja2VkLmxlbmd0aCArIGtdID0gdmFsdWVzW3IgKiBjb2xzLmxlbmd0aCArIHBpY2tlZFtrXV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IGxvID0gSW5maW5pdHk7XG4gIGxldCBoaSA9IC1JbmZpbml0eTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2ID0gb3V0VmFsdWVzW2ldO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICBpZiAodiA8IGxvKSBsbyA9IHY7XG4gICAgaWYgKHYgPiBoaSkgaGkgPSB2O1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGxvKSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICByb3dzLFxuICAgIGhpZGRlbkNvbHMsXG4gICAgY29sczogb3V0Q29scyxcbiAgICB2YWx1ZXM6IG91dFZhbHVlcyxcbiAgICBjb3VudHM6IG91dENvdW50cyxcbiAgICByYW5nZTogaGkgPiBsbyA/IFtsbywgaGldIDogW2xvLCBsbyArIDFdLFxuICB9O1xufVxuXG4vKipcbiAqIFotc2NvcmUgZWFjaCByb3cgaW4gcGxhY2UsIG92ZXIgaXRzIGZpbml0ZSBlbnRyaWVzIG9ubHkuXG4gKlxuICogQSByb3cgd2l0aCBubyBzcHJlYWQgYWNyb3NzIGdyb3VwcyDigJQgYSBnZW5lIGV4cHJlc3NlZCBldmVubHkgZXZlcnl3aGVyZSwgb3JcbiAqIG1lYXN1cmVkIGluIG9ubHkgb25lIGdyb3VwIOKAlCBiZWNvbWVzIGFsbCB6ZXJvcyByYXRoZXIgdGhhbiBkaXZpZGluZyBieSB6ZXJvOlxuICogXCJ0aGlzIGdlbmUgZGlzdGluZ3Vpc2hlcyBub3RoaW5nIGhlcmVcIiBpcyB0aGUgY29ycmVjdCByZWFkaW5nLCBhbmQgaXQgaXMgdGhlXG4gKiBvbmUgYSBOYU4gcm93IHdvdWxkIGhpZGUuXG4gKi9cbmZ1bmN0aW9uIHpTY29yZVJvd3ModmFsdWVzOiBGbG9hdDMyQXJyYXksIG5Sb3dzOiBudW1iZXIsIG5Db2xzOiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBuUm93czsgcisrKSB7XG4gICAgY29uc3QgYmFzZSA9IHIgKiBuQ29scztcbiAgICBsZXQgc3VtID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbkNvbHM7IGMrKykge1xuICAgICAgY29uc3QgdiA9IHZhbHVlc1tiYXNlICsgY107XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgY29udGludWU7XG4gICAgICBzdW0gKz0gdjtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgbWVhbiA9IHN1bSAvIGNvdW50O1xuICAgIGxldCB2YXJpYW5jZSA9IDA7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuQ29sczsgYysrKSB7XG4gICAgICBjb25zdCB2ID0gdmFsdWVzW2Jhc2UgKyBjXTtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICAgIHZhcmlhbmNlICs9ICh2IC0gbWVhbikgKiAodiAtIG1lYW4pO1xuICAgIH1cbiAgICAvLyBQb3B1bGF0aW9uIFNEOiB0aGVzZSBhcmUgYWxsIHRoZSBncm91cHMgdGhlcmUgYXJlLCBub3QgYSBzYW1wbGUgb2YgdGhlbS5cbiAgICBjb25zdCBzZCA9IE1hdGguc3FydCh2YXJpYW5jZSAvIGNvdW50KTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IG5Db2xzOyBjKyspIHtcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZXNbYmFzZSArIGNdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2Jhc2UgKyBjXSA9IHNkID4gMCA/ICh2IC0gbWVhbikgLyBzZCA6IDA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR3JvdXBzIHN0YW5kaW5nIGluIGZvciBpbmRpdmlkdWFsIGNlbGxzLCBmb3IgdGhlIGluLXNlbGVjdGlvbiB2aWV3LlxuICpcbiAqIEluc2lkZSBhbiBST0ksIFwid2hpY2ggY2xhc3NlcyBleHByZXNzIHdoYXRcIiBpcyBvZnRlbiB0aGUgd3JvbmcgcXVlc3Rpb24gYW5kXG4gKiBcIndoYXQgaXMgaW4gZnJvbnQgb2YgbWVcIiBpcyB0aGUgcmlnaHQgb25lIOKAlCBzbyBlYWNoIGNlbGwgYmVjb21lcyBpdHMgb3duXG4gKiBjb2x1bW4uIENhcHBlZDogcGFzdCBhIGZldyBodW5kcmVkIGNvbHVtbnMgYSBoZWF0bWFwIGlzIGEgdGV4dHVyZSwgbm90IGFcbiAqIHJlYWRhYmxlIHBhbmVsLCBhbmQgdGhlIGNhcCBpcyBhcHBsaWVkIGJ5IGV2ZW4gdGhpbm5pbmcgc28gdGhlIHNlbGVjdGlvbiBpc1xuICogc3RpbGwgcmVwcmVzZW50ZWQgYWNyb3NzIGl0cyB3aG9sZSBleHRlbnQgcmF0aGVyIHRoYW4gdHJ1bmNhdGVkIHRvIGl0cyBmaXJzdFxuICogY2VsbHMuXG4gKlxuICogTk9URTogZXZlcnkgY29sdW1uIGhlcmUgaG9sZHMgZXhhY3RseSBPTkUgY2VsbCwgc28gdGhlIGNhbGxlciBtdXN0IHBhc3NcbiAqIGBtaW5DZWxsczogMWAgdG8ge0BsaW5rIGhlYXRtYXBNYXRyaXh9LiBUaGUgZGVmYXVsdCBmbG9vciBvZlxuICoge0BsaW5rIEhFQVRNQVBfTUlOX0NFTExTfSBleGlzdHMgdG8gc3VwcHJlc3Mgbm9pc3kgZ3JvdXAgbWVhbnMgYW5kIHdvdWxkXG4gKiBmaWx0ZXIgb3V0IGV2ZXJ5IGNvbHVtbiBvZiB0aGlzIHZpZXcsIHJldHVybmluZyBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VsbHNBc0dyb3VwcyhcbiAgaW5kaWNlczogVWludDMyQXJyYXksXG4gIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcixcbiAgbWF4ID0gMjAwLFxuKTogeyBncm91cHM6IEhlYXRtYXBHcm91cHM7IGluZGljZXM6IFVpbnQzMkFycmF5IH0ge1xuICBjb25zdCBzdGVwID0gaW5kaWNlcy5sZW5ndGggPiBtYXggPyBpbmRpY2VzLmxlbmd0aCAvIG1heCA6IDE7XG4gIGNvbnN0IHRha2UgPSBpbmRpY2VzLmxlbmd0aCA+IG1heCA/IG1heCA6IGluZGljZXMubGVuZ3RoO1xuICBjb25zdCBwaWNrZWQgPSBuZXcgVWludDMyQXJyYXkodGFrZSk7XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdGFrZTsgaysrKSBwaWNrZWRba10gPSBpbmRpY2VzW01hdGguZmxvb3IoayAqIHN0ZXApXTtcblxuICAvLyBPbmUgY2F0ZWdvcnkgcGVyIHBpY2tlZCBjZWxsOiBjb2RlcyBhcmUgZGVuc2Ugb3ZlciB0aGUgcGlja2VkIG9yZGVyLCBzbyB0aGVcbiAgLy8gbWF0cml4IGNvbHVtbnMgbGluZSB1cCB3aXRoIGBwaWNrZWRgIHdpdGhvdXQgYSBsb29rdXAgdGFibGUuXG4gIGNvbnN0IGNvZGVzID0gbmV3IFVpbnQxNkFycmF5KG9ic2VydmF0aW9uQ291bnQpLmZpbGwoTk9fQ0FURUdPUlkpO1xuICBjb25zdCBjYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRha2U7IGsrKykge1xuICAgIGNvZGVzW3BpY2tlZFtrXV0gPSBrO1xuICAgIGNhdGVnb3JpZXMucHVzaChgIyR7cGlja2VkW2tdfWApO1xuICB9XG4gIHJldHVybiB7IGdyb3VwczogeyBjb2RlcywgY2F0ZWdvcmllcyB9LCBpbmRpY2VzOiBwaWNrZWQgfTtcbn1cbiJdfQ==
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1oZWF0bWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtaGVhdG1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUE0RnBFLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixLQUE2QixFQUM3QixNQUFxQixFQUNyQixPQUE2QixFQUFFO0lBRS9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUV6RCx5RUFBeUU7SUFDekUsOERBQThEO0lBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksSUFBSSxPQUFPO1lBQUUsU0FBUztRQUN0RCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUVuQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxD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QUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOT19DQVRFR09SWSB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIE1lYW4gZXhwcmVzc2lvbiBwZXIgZ3JvdXAsIGZvciB0aGUgZ2VuZSDDlyBjbGFzcyBoZWF0bWFwLlxuICpcbiAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBvbmUgZ2VuZSBhbnN3ZXJzIFwid2hlcmUgaXMgdGhpcyBnZW5lXCIuIEl0IGNhbm5vdCBhbnN3ZXJcbiAqIFwid2hpY2ggY2xhc3NlcyBleHByZXNzIHdoaWNoIGdlbmVzXCIsIHdoaWNoIGlzIHRoZSBxdWVzdGlvbiBhIG1hcmtlciBwYW5lbCBpc1xuICogYWN0dWFsbHkgcmVhZCBmb3Ig4oCUIGFuZCB0aGUgc3RhbmRhcmQgb2JqZWN0IGZvciB0aGF0IGlzIHRoZSBtZWFuLWV4cHJlc3Npb25cbiAqIG1hdHJpeCBwZXIgY2x1c3RlciAoc2NhbnB5J3MgYG1hdHJpeHBsb3RgL2Bkb3RwbG90YCksIGdlbmVzIGFnYWluc3QgY2xhc3Nlcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGNlbGxzIMOXIGdlbmVzIGF0IHRoZSBmdWxsIGRhdGFzZXQ6IDM3NGsgY29sdW1ucyBpcyBub3QgYVxuICogaGVhdG1hcC4gQ2VsbHMgYmVjb21lIGNvbHVtbnMgb25seSBpbnNpZGUgYSBzZWxlY3Rpb24sIHdoZXJlIGEgZmV3IHRob3VzYW5kXG4gKiBvZiB0aGVtIHJlbmRlciBhbmQgdGhlIHF1ZXN0aW9uIGNoYW5nZXMgdG8gXCJ3aGF0IGlzIGluIHRoaXMgcmVnaW9uXCIuXG4gKlxuICogVHdvIHRoaW5ncyB0aGlzIGhhcyB0byBnZXQgcmlnaHQgdG8gYmUgcmVhZGFibGU6XG4gKlxuICogIC0gQSBjZWxsIHdpdGggbm8gbWVhc3VyZW1lbnQgZm9yIGEgZ2VuZSAoYE5hTmApIGlzIFNLSVBQRUQsIG5vdCBjb3VudGVkIGFzXG4gKiAgICB6ZXJvLiBDb3VudGluZyBpdCB3b3VsZCBkcmFnIGEgZ3JvdXAncyBtZWFuIHRvd2FyZHMgYWJzZW5jZSBmb3IgYSByZWFzb25cbiAqICAgIHRoYXQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgYmlvbG9neS5cbiAqICAtIFotc2NvcmluZyBpcyBwZXIgR0VORSwgYWNyb3NzIGdyb3Vwcy4gV2l0aG91dCBpdCBhIGdlbmUgZXhwcmVzc2VkIGFuIG9yZGVyXG4gKiAgICBvZiBtYWduaXR1ZGUgYWJvdmUgdGhlIG90aGVycyBzYXR1cmF0ZXMgdGhlIGNvbG91ciBzY2FsZSBhbmQgdGhlIHJlc3Qgb2ZcbiAqICAgIHRoZSBwYW5lbCByZWFkcyBhcyB1bmlmb3JtbHkgYmxhbmsg4oCUIHRoZSBtYXRyaXggd291bGQgc2hvdyB3aGljaCBnZW5lIGlzXG4gKiAgICBsb3VkZXN0IHJhdGhlciB0aGFuIHdoaWNoIGNsYXNzIGV4cHJlc3NlcyB3aGF0LlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFBsb3RseSwgbm8gcmVuZGVyZXIg4oCUIGxpa2UgYHNwYXRpYWwtZGVuc2l0eS50c2AsIGFuZFxuICogdGVzdGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuXG4vKiogT25lIGdlbmUncyB2YWx1ZXMsIHdpdGggdGhlIG5hbWUgdG8gbGFiZWwgaXRzIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhdG1hcEdlbmUge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBPbmUgdmFsdWUgcGVyIG9ic2VydmF0aW9uOyBgTmFOYCB3aGVyZSB0aGUgZ2VuZSB3YXMgbm90IG1lYXN1cmVkLiAqL1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbn1cblxuLyoqIFRoZSBjb2x1bW5zIHRvIGFnZ3JlZ2F0ZSBpbnRvOiBhIGNhdGVnb3JpY2FsIGNvbHVtbidzIGNhdGVnb3JpZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYXRtYXBHcm91cHMge1xuICAvKiogUGVyLW9ic2VydmF0aW9uIGNhdGVnb3J5IGluZGV4LCBvciB7QGxpbmsgTk9fQ0FURUdPUll9LiAqL1xuICBjb2RlczogVWludDE2QXJyYXk7XG4gIGNhdGVnb3JpZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGhlYXRtYXBNYXRyaXh9OiB0aGUgb2JzZXJ2YXRpb25zLCBzY2FsaW5nIGFuZCBzaXplIGxpbWl0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhdG1hcE1hdHJpeE9wdGlvbnMge1xuICAvKiogT2JzZXJ2YXRpb25zIHRvIGluY2x1ZGU7IGV2ZXJ5IG9uZSB3aGVuIGFic2VudCAoYW4gUk9JIHNlbGVjdGlvbikuICovXG4gIGluZGljZXM/OiBVaW50MzJBcnJheTtcbiAgLyoqXG4gICAqIFotc2NvcmUgZWFjaCBnZW5lIGFjcm9zcyB0aGUgZ3JvdXBzLCBzbyBvbmUgbG91ZCBnZW5lIGNhbm5vdCBmbGF0dGVuIHRoZVxuICAgKiBwYW5lbC4gT24gYnkgZGVmYXVsdCDigJQgdGhlIHJhdyBtZWFucyBhcmUgb25seSByZWFkYWJsZSB3aGVuIGV2ZXJ5IGdlbmUgaXNcbiAgICogb24gYSBjb21wYXJhYmxlIHNjYWxlLlxuICAgKi9cbiAgelNjb3JlPzogYm9vbGVhbjtcbiAgLyoqIERyb3AgZ3JvdXBzIHdpdGggZmV3ZXIgdGhhbiB0aGlzIG1hbnkgbWVhc3VyZWQgY2VsbHMuIEEgbWVhbiBvdmVyIG9uZSBvclxuICAgKiAgdHdvIGNlbGxzIGlzIG5vaXNlIHByZXNlbnRlZCB3aXRoIHRoZSBzYW1lIHdlaWdodCBhcyBhIHJlYWwgb25lLiAqL1xuICBtaW5DZWxscz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEtlZXAgYXQgbW9zdCB0aGlzIG1hbnkgY29sdW1ucywgY2hvc2VuIGJ5IHRoZSBTVFJPTkdFU1Qgc2lnbmFsIGFueSBwaWNrZWRcbiAgICogZ2VuZSBzaG93cyBpbiB0aGVtLlxuICAgKlxuICAgKiBgc3ViY2xhc3NgIGhhcyAzMzggY2F0ZWdvcmllcy4gRHJhd24gaW4gZnVsbCB0aGF0IGlzIGEgdGV4dHVyZSByYXRoZXIgdGhhbiBhXG4gICAqIHBhbmVsIOKAlCBldmVyeSBjb2x1bW4gYSBjb3VwbGUgb2YgcGl4ZWxzIHdpZGUsIGV2ZXJ5IGxhYmVsIHVucmVhZGFibGUg4oCUIGFuZFxuICAgKiB0aGUgcXVlc3Rpb24gYmVpbmcgYXNrZWQgKFwid2hpY2ggZ3JvdXBzIGV4cHJlc3MgbXkgZ2VuZXNcIikgaXMgYW5zd2VyZWQgYnlcbiAgICogdGhlIGhhbmRmdWwgb2YgZ3JvdXBzIHdoZXJlIGEgZ2VuZSBhY3R1YWxseSBzdGFuZHMgb3V0LiBSYW5raW5nIGJ5XG4gICAqIG1heCB8dmFsdWV8IGFjcm9zcyB0aGUgcm93cyBzdXJmYWNlcyBleGFjdGx5IHRob3NlOyByYW5raW5nIGJ5IGNlbGwgY291bnRcbiAgICogd291bGQgaW5zdGVhZCBzdXJmYWNlIHRoZSBiaWdnZXN0IGdyb3Vwcywgd2hpY2ggaXMgYSBkaWZmZXJlbnQgcXVlc3Rpb24uXG4gICAqXG4gICAqIFVuc2V0IGtlZXBzIGV2ZXJ5IGNvbHVtbiB0aGF0IGNsZWFyZWQgYG1pbkNlbGxzYC5cbiAgICovXG4gIG1heENvbHM/OiBudW1iZXI7XG59XG5cbi8qKiBNZWFuIGV4cHJlc3Npb24gb2YgZ2VuZXMgKHJvd3MpIHBlciBncm91cCAoY29sdW1ucyksIHJlYWR5IGZvciBhIGhlYXRtYXAgdHJhY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYXRtYXBNYXRyaXgge1xuICAvKiogR2VuZSBuYW1lcywgb25lIHBlciByb3csIGluIHRoZSBvcmRlciBnaXZlbi4gKi9cbiAgcm93czogc3RyaW5nW107XG4gIC8qKiBDb2x1bW5zIGRyb3BwZWQgYnkgYG1heENvbHNgLCBzbyB0aGUgY2FsbGVyIGNhbiBzYXkgaG93IG1hbnkgYXJlIGhpZGRlblxuICAgKiAgcmF0aGVyIHRoYW4gc2lsZW50bHkgc2hvd2luZyBhIHN1YnNldCBhcyBpZiBpdCB3ZXJlIGV2ZXJ5dGhpbmcuICovXG4gIGhpZGRlbkNvbHM6IG51bWJlcjtcbiAgLyoqIEdyb3VwIGxhYmVscywgb25lIHBlciBjb2x1bW4g4oCUIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHN1cnZpdmVkIGBtaW5DZWxsc2AuICovXG4gIGNvbHM6IHN0cmluZ1tdO1xuICAvKipcbiAgICogYHJvd3MubGVuZ3RoIMOXIGNvbHMubGVuZ3RoYCwgcm93LW1ham9yOiBgdmFsdWVzW3IgKiBjb2xzLmxlbmd0aCArIGNdYC5cbiAgICogYE5hTmAgd2hlcmUgYSBncm91cCBoYWQgbm90aGluZyBtZWFzdXJlZCBmb3IgdGhhdCBnZW5lLCB3aGljaCB0aGUgY2FsbGVyXG4gICAqIGRyYXdzIGFzIGEgZ2FwIHJhdGhlciB0aGFuIGFzIGEgemVyby5cbiAgICovXG4gIHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAvKiogTWVhc3VyZWQgY2VsbHMgYmVoaW5kIGVhY2ggY29sdW1uLCBpbmRleC1hbGlnbmVkIHdpdGgge0BsaW5rIGNvbHN9LiAqL1xuICBjb3VudHM6IFVpbnQzMkFycmF5O1xuICAvKiogRmluaXRlIHJhbmdlIG9mIGB2YWx1ZXNgLCBmb3IgYSBzeW1tZXRyaWMgb3IgYWJzb2x1dGUgY29sb3VyIHNjYWxlLiAqL1xuICByYW5nZTogW251bWJlciwgbnVtYmVyXTtcbn1cblxuLyoqIERlZmF1bHQgZmxvb3IgZm9yIGEgZ3JvdXAgdG8gZWFybiBhIGNvbHVtbi4gKi9cbmV4cG9ydCBjb25zdCBIRUFUTUFQX01JTl9DRUxMUyA9IDM7XG5cbi8qKlxuICogTWVhbiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSBpbiBlYWNoIGdyb3VwLlxuICpcbiAqIE51bGwgd2hlbiBub3RoaW5nIHN1cnZpdmVzIOKAlCBubyBnZW5lcywgbm8gZ3JvdXBzLCBvciBldmVyeSBncm91cCBmaWx0ZXJlZFxuICogb3V0IOKAlCBzbyB0aGUgY2FsbGVyIGRyYXdzIG5vIGNoYXJ0IHJhdGhlciB0aGFuIGFuIGVtcHR5IGdyaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWF0bWFwTWF0cml4KFxuICBnZW5lczogcmVhZG9ubHkgSGVhdG1hcEdlbmVbXSxcbiAgZ3JvdXBzOiBIZWF0bWFwR3JvdXBzLFxuICBvcHRzOiBIZWF0bWFwTWF0cml4T3B0aW9ucyA9IHt9LFxuKTogSGVhdG1hcE1hdHJpeCB8IG51bGwge1xuICBjb25zdCBuR3JvdXBzID0gZ3JvdXBzLmNhdGVnb3JpZXMubGVuZ3RoO1xuICBpZiAoZ2VuZXMubGVuZ3RoID09PSAwIHx8IG5Hcm91cHMgPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBtaW5DZWxscyA9IG9wdHMubWluQ2VsbHMgPz8gSEVBVE1BUF9NSU5fQ0VMTFM7XG4gIGNvbnN0IGluZGljZXMgPSBvcHRzLmluZGljZXM7XG4gIGNvbnN0IG4gPSBpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBncm91cHMuY29kZXMubGVuZ3RoO1xuXG4gIC8vIENlbGxzIHBlciBncm91cCwgY291bnRlZCBvbmNlIGZyb20gdGhlIGNvZGVzIHJhdGhlciB0aGFuIHBlciBnZW5lOiB0aGVcbiAgLy8gbWVtYmVyc2hpcCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggZ2VuZSBpcyBiZWluZyBhdmVyYWdlZC5cbiAgY29uc3QgZ3JvdXBDb3VudCA9IG5ldyBVaW50MzJBcnJheShuR3JvdXBzKTtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICBjb25zdCBpID0gaW5kaWNlcyA/IGluZGljZXNba10gOiBrO1xuICAgIGNvbnN0IGNvZGUgPSBncm91cHMuY29kZXNbaV07XG4gICAgaWYgKGNvZGUgPT09IE5PX0NBVEVHT1JZIHx8IGNvZGUgPj0gbkdyb3VwcykgY29udGludWU7XG4gICAgZ3JvdXBDb3VudFtjb2RlXSsrO1xuICB9XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGcgPSAwOyBnIDwgbkdyb3VwczsgZysrKSBpZiAoZ3JvdXBDb3VudFtnXSA+PSBtaW5DZWxscykga2VlcC5wdXNoKGcpO1xuICBpZiAoa2VlcC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJvd3MgPSBnZW5lcy5tYXAoKGcpID0+IGcubmFtZSk7XG4gIGNvbnN0IGNvbHMgPSBrZWVwLm1hcCgoZykgPT4gZ3JvdXBzLmNhdGVnb3JpZXNbZ10pO1xuICBjb25zdCBjb3VudHMgPSBVaW50MzJBcnJheS5mcm9tKGtlZXAsIChnKSA9PiBncm91cENvdW50W2ddKTtcbiAgY29uc3QgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShyb3dzLmxlbmd0aCAqIGNvbHMubGVuZ3RoKS5maWxsKE5hTik7XG5cbiAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW5lcy5sZW5ndGg7IHIrKykge1xuICAgIGNvbnN0IGdlbmUgPSBnZW5lc1tyXTtcbiAgICBjb25zdCBzdW0gPSBuZXcgRmxvYXQ2NEFycmF5KG5Hcm91cHMpO1xuICAgIGNvbnN0IG1lYXN1cmVkID0gbmV3IFVpbnQzMkFycmF5KG5Hcm91cHMpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICBjb25zdCBpID0gaW5kaWNlcyA/IGluZGljZXNba10gOiBrO1xuICAgICAgY29uc3QgY29kZSA9IGdyb3Vwcy5jb2Rlc1tpXTtcbiAgICAgIGlmIChjb2RlID09PSBOT19DQVRFR09SWSB8fCBjb2RlID49IG5Hcm91cHMpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdiA9IGdlbmUudmFsdWVzW2ldO1xuICAgICAgLy8gTm90IG1lYXN1cmVkIGZvciB0aGlzIGNlbGwg4oCUIHNraXBwaW5nIGtlZXBzIHRoZSBtZWFuIGFib3V0IHRoZSBjZWxsc1xuICAgICAgLy8gdGhhdCB3ZXJlIGFjdHVhbGx5IGFzc2F5ZWQuXG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgY29udGludWU7XG4gICAgICBzdW1bY29kZV0gKz0gdjtcbiAgICAgIG1lYXN1cmVkW2NvZGVdKys7XG4gICAgfVxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwga2VlcC5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3QgZyA9IGtlZXBbY107XG4gICAgICBpZiAobWVhc3VyZWRbZ10gPT09IDApIGNvbnRpbnVlOyAvLyBzdGF5cyBOYU46IGEgZ2FwLCBub3QgYSB6ZXJvXG4gICAgICB2YWx1ZXNbciAqIGNvbHMubGVuZ3RoICsgY10gPSBzdW1bZ10gLyBtZWFzdXJlZFtnXTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy56U2NvcmUgIT09IGZhbHNlKSB6U2NvcmVSb3dzKHZhbHVlcywgcm93cy5sZW5ndGgsIGNvbHMubGVuZ3RoKTtcblxuICAvLyBSYW5rZWQgQUZURVIgc2NhbGluZywgc28gXCJzdHJvbmdlc3Qgc2lnbmFsXCIgbWVhbnMgc3Ryb25nZXN0IHJlbGF0aXZlIHRvIGVhY2hcbiAgLy8gZ2VuZSdzIG93biBzcHJlYWQgcmF0aGVyIHRoYW4gdG8gd2hpY2hldmVyIGdlbmUgaGFzIHRoZSBsYXJnZXN0IHVuaXRzLlxuICBsZXQgaGlkZGVuQ29scyA9IDA7XG4gIGxldCBvdXRDb2xzID0gY29scztcbiAgbGV0IG91dFZhbHVlcyA9IHZhbHVlcztcbiAgbGV0IG91dENvdW50cyA9IGNvdW50cztcbiAgaWYgKG9wdHMubWF4Q29scyAhPT0gdW5kZWZpbmVkICYmIGNvbHMubGVuZ3RoID4gb3B0cy5tYXhDb2xzKSB7XG4gICAgY29uc3Qgc3RyZW5ndGggPSBjb2xzLm1hcCgoXywgYykgPT4ge1xuICAgICAgbGV0IHBlYWsgPSAwO1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHYgPSBNYXRoLmFicyh2YWx1ZXNbciAqIGNvbHMubGVuZ3RoICsgY10pO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHYpICYmIHYgPiBwZWFrKSBwZWFrID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGMsIHBlYWsgfTtcbiAgICB9KTtcbiAgICAvLyBTdHJvbmdlc3QgZmlyc3QsIHRoZW4gb3JpZ2luYWwgb3JkZXIgZm9yIHRpZXMsIHNvIHRoZSBjaG9pY2UgaXMgc3RhYmxlLlxuICAgIHN0cmVuZ3RoLnNvcnQoKGEsIGIpID0+IGIucGVhayAtIGEucGVhayB8fCBhLmMgLSBiLmMpO1xuICAgIGNvbnN0IHBpY2tlZCA9IHN0cmVuZ3RoXG4gICAgICAuc2xpY2UoMCwgb3B0cy5tYXhDb2xzKVxuICAgICAgLm1hcCgocykgPT4gcy5jKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBoaWRkZW5Db2xzID0gY29scy5sZW5ndGggLSBwaWNrZWQubGVuZ3RoO1xuICAgIG91dENvbHMgPSBwaWNrZWQubWFwKChjKSA9PiBjb2xzW2NdKTtcbiAgICBvdXRDb3VudHMgPSBVaW50MzJBcnJheS5mcm9tKHBpY2tlZCwgKGMpID0+IGNvdW50c1tjXSk7XG4gICAgb3V0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShyb3dzLmxlbmd0aCAqIHBpY2tlZC5sZW5ndGgpO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBwaWNrZWQubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgb3V0VmFsdWVzW3IgKiBwaWNrZWQubGVuZ3RoICsga10gPSB2YWx1ZXNbciAqIGNvbHMubGVuZ3RoICsgcGlja2VkW2tdXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbG8gPSBJbmZpbml0eTtcbiAgbGV0IGhpID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHYgPSBvdXRWYWx1ZXNbaV07XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgIGlmICh2IDwgbG8pIGxvID0gdjtcbiAgICBpZiAodiA+IGhpKSBoaSA9IHY7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobG8pKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHJvd3MsXG4gICAgaGlkZGVuQ29scyxcbiAgICBjb2xzOiBvdXRDb2xzLFxuICAgIHZhbHVlczogb3V0VmFsdWVzLFxuICAgIGNvdW50czogb3V0Q291bnRzLFxuICAgIHJhbmdlOiBoaSA+IGxvID8gW2xvLCBoaV0gOiBbbG8sIGxvICsgMV0sXG4gIH07XG59XG5cbi8qKlxuICogWi1zY29yZSBlYWNoIHJvdyBpbiBwbGFjZSwgb3ZlciBpdHMgZmluaXRlIGVudHJpZXMgb25seS5cbiAqXG4gKiBBIHJvdyB3aXRoIG5vIHNwcmVhZCBhY3Jvc3MgZ3JvdXBzIOKAlCBhIGdlbmUgZXhwcmVzc2VkIGV2ZW5seSBldmVyeXdoZXJlLCBvclxuICogbWVhc3VyZWQgaW4gb25seSBvbmUgZ3JvdXAg4oCUIGJlY29tZXMgYWxsIHplcm9zIHJhdGhlciB0aGFuIGRpdmlkaW5nIGJ5IHplcm86XG4gKiBcInRoaXMgZ2VuZSBkaXN0aW5ndWlzaGVzIG5vdGhpbmcgaGVyZVwiIGlzIHRoZSBjb3JyZWN0IHJlYWRpbmcsIGFuZCBpdCBpcyB0aGVcbiAqIG9uZSBhIE5hTiByb3cgd291bGQgaGlkZS5cbiAqL1xuZnVuY3Rpb24gelNjb3JlUm93cyh2YWx1ZXM6IEZsb2F0MzJBcnJheSwgblJvd3M6IG51bWJlciwgbkNvbHM6IG51bWJlcik6IHZvaWQge1xuICBmb3IgKGxldCByID0gMDsgciA8IG5Sb3dzOyByKyspIHtcbiAgICBjb25zdCBiYXNlID0gciAqIG5Db2xzO1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBuQ29sczsgYysrKSB7XG4gICAgICBjb25zdCB2ID0gdmFsdWVzW2Jhc2UgKyBjXTtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICAgIHN1bSArPSB2O1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBtZWFuID0gc3VtIC8gY291bnQ7XG4gICAgbGV0IHZhcmlhbmNlID0gMDtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IG5Db2xzOyBjKyspIHtcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZXNbYmFzZSArIGNdO1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodikpIGNvbnRpbnVlO1xuICAgICAgdmFyaWFuY2UgKz0gKHYgLSBtZWFuKSAqICh2IC0gbWVhbik7XG4gICAgfVxuICAgIC8vIFBvcHVsYXRpb24gU0Q6IHRoZXNlIGFyZSBhbGwgdGhlIGdyb3VwcyB0aGVyZSBhcmUsIG5vdCBhIHNhbXBsZSBvZiB0aGVtLlxuICAgIGNvbnN0IHNkID0gTWF0aC5zcXJ0KHZhcmlhbmNlIC8gY291bnQpO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbkNvbHM7IGMrKykge1xuICAgICAgY29uc3QgdiA9IHZhbHVlc1tiYXNlICsgY107XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgY29udGludWU7XG4gICAgICB2YWx1ZXNbYmFzZSArIGNdID0gc2QgPiAwID8gKHYgLSBtZWFuKSAvIHNkIDogMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHcm91cHMgc3RhbmRpbmcgaW4gZm9yIGluZGl2aWR1YWwgY2VsbHMsIGZvciB0aGUgaW4tc2VsZWN0aW9uIHZpZXcuXG4gKlxuICogSW5zaWRlIGFuIFJPSSwgXCJ3aGljaCBjbGFzc2VzIGV4cHJlc3Mgd2hhdFwiIGlzIG9mdGVuIHRoZSB3cm9uZyBxdWVzdGlvbiBhbmRcbiAqIFwid2hhdCBpcyBpbiBmcm9udCBvZiBtZVwiIGlzIHRoZSByaWdodCBvbmUg4oCUIHNvIGVhY2ggY2VsbCBiZWNvbWVzIGl0cyBvd25cbiAqIGNvbHVtbi4gQ2FwcGVkOiBwYXN0IGEgZmV3IGh1bmRyZWQgY29sdW1ucyBhIGhlYXRtYXAgaXMgYSB0ZXh0dXJlLCBub3QgYVxuICogcmVhZGFibGUgcGFuZWwsIGFuZCB0aGUgY2FwIGlzIGFwcGxpZWQgYnkgZXZlbiB0aGlubmluZyBzbyB0aGUgc2VsZWN0aW9uIGlzXG4gKiBzdGlsbCByZXByZXNlbnRlZCBhY3Jvc3MgaXRzIHdob2xlIGV4dGVudCByYXRoZXIgdGhhbiB0cnVuY2F0ZWQgdG8gaXRzIGZpcnN0XG4gKiBjZWxscy5cbiAqXG4gKiBOT1RFOiBldmVyeSBjb2x1bW4gaGVyZSBob2xkcyBleGFjdGx5IE9ORSBjZWxsLCBzbyB0aGUgY2FsbGVyIG11c3QgcGFzc1xuICogYG1pbkNlbGxzOiAxYCB0byB7QGxpbmsgaGVhdG1hcE1hdHJpeH0uIFRoZSBkZWZhdWx0IGZsb29yIG9mXG4gKiB7QGxpbmsgSEVBVE1BUF9NSU5fQ0VMTFN9IGV4aXN0cyB0byBzdXBwcmVzcyBub2lzeSBncm91cCBtZWFucyBhbmQgd291bGRcbiAqIGZpbHRlciBvdXQgZXZlcnkgY29sdW1uIG9mIHRoaXMgdmlldywgcmV0dXJuaW5nIG51bGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc0FzR3JvdXBzKFxuICBpbmRpY2VzOiBVaW50MzJBcnJheSxcbiAgb2JzZXJ2YXRpb25Db3VudDogbnVtYmVyLFxuICBtYXggPSAyMDAsXG4pOiB7IGdyb3VwczogSGVhdG1hcEdyb3VwczsgaW5kaWNlczogVWludDMyQXJyYXkgfSB7XG4gIGNvbnN0IHN0ZXAgPSBpbmRpY2VzLmxlbmd0aCA+IG1heCA/IGluZGljZXMubGVuZ3RoIC8gbWF4IDogMTtcbiAgY29uc3QgdGFrZSA9IGluZGljZXMubGVuZ3RoID4gbWF4ID8gbWF4IDogaW5kaWNlcy5sZW5ndGg7XG4gIGNvbnN0IHBpY2tlZCA9IG5ldyBVaW50MzJBcnJheSh0YWtlKTtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCB0YWtlOyBrKyspIHBpY2tlZFtrXSA9IGluZGljZXNbTWF0aC5mbG9vcihrICogc3RlcCldO1xuXG4gIC8vIE9uZSBjYXRlZ29yeSBwZXIgcGlja2VkIGNlbGw6IGNvZGVzIGFyZSBkZW5zZSBvdmVyIHRoZSBwaWNrZWQgb3JkZXIsIHNvIHRoZVxuICAvLyBtYXRyaXggY29sdW1ucyBsaW5lIHVwIHdpdGggYHBpY2tlZGAgd2l0aG91dCBhIGxvb2t1cCB0YWJsZS5cbiAgY29uc3QgY29kZXMgPSBuZXcgVWludDE2QXJyYXkob2JzZXJ2YXRpb25Db3VudCkuZmlsbChOT19DQVRFR09SWSk7XG4gIGNvbnN0IGNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdGFrZTsgaysrKSB7XG4gICAgY29kZXNbcGlja2VkW2tdXSA9IGs7XG4gICAgY2F0ZWdvcmllcy5wdXNoKGAjJHtwaWNrZWRba119YCk7XG4gIH1cbiAgcmV0dXJuIHsgZ3JvdXBzOiB7IGNvZGVzLCBjYXRlZ29yaWVzIH0sIGluZGljZXM6IHBpY2tlZCB9O1xufVxuIl19
|
|
@@ -1,43 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What
|
|
2
|
+
* What to say about the observation under the cursor.
|
|
3
3
|
*
|
|
4
4
|
* A coloured cloud answers "how is this annotation distributed"; it cannot answer
|
|
5
5
|
* "which class is THAT" — the legend has 34 entries, several of them similar
|
|
6
6
|
* colours, and matching a dot to a swatch by eye is exactly the task a tooltip
|
|
7
7
|
* exists to remove.
|
|
8
8
|
*
|
|
9
|
-
* Pure — no DOM, no camera, no data access.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Pure — no DOM, no camera, no data access. Finding the observation is the
|
|
10
|
+
* renderer's (napari-js picks on the layers it drew); this is string formatting
|
|
11
|
+
* over the active colour source, so it is tested directly.
|
|
12
12
|
*/
|
|
13
|
-
/**
|
|
14
|
-
* Index of the drawn observation nearest `(x, y)` within `maxDist` screen pixels,
|
|
15
|
-
* or -1.
|
|
16
|
-
*
|
|
17
|
-
* `screen` is `[x0, y0, x1, y1, …]` indexed BY OBSERVATION, with NaN for anything
|
|
18
|
-
* not currently drawn — off screen, behind the eye, or on a hidden section. NaN
|
|
19
|
-
* fails every comparison, so those are skipped without a special case.
|
|
20
|
-
*
|
|
21
|
-
* Ties go to the LATER observation, which is the one drawn on top and therefore
|
|
22
|
-
* the one the user believes they are pointing at.
|
|
23
|
-
*/
|
|
24
|
-
export function nearestObservation(screen, x, y, maxDist) {
|
|
25
|
-
const limit = maxDist * maxDist;
|
|
26
|
-
let best = -1;
|
|
27
|
-
let bestDist = Infinity;
|
|
28
|
-
const n = screen.length >> 1;
|
|
29
|
-
for (let i = 0; i < n; i++) {
|
|
30
|
-
const dx = screen[i * 2] - x;
|
|
31
|
-
const dy = screen[i * 2 + 1] - y;
|
|
32
|
-
const d = dx * dx + dy * dy;
|
|
33
|
-
// `<=` so a later point at the same distance wins: it is drawn on top.
|
|
34
|
-
if (d <= bestDist && d <= limit) {
|
|
35
|
-
bestDist = d;
|
|
36
|
-
best = i;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return best;
|
|
40
|
-
}
|
|
41
13
|
/** A number for a tooltip: enough digits to distinguish, few enough to read. */
|
|
42
14
|
function formatValue(v) {
|
|
43
15
|
if (!Number.isFinite(v))
|
|
@@ -76,4 +48,4 @@ export function hoverText(source, index) {
|
|
|
76
48
|
const unit = source.unit ? ` ${source.unit}` : '';
|
|
77
49
|
return [`${formatValue(value)}${unit}`, source.name];
|
|
78
50
|
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ob3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWhvdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJILGdGQUFnRjtBQUNoRixTQUFTLFdBQVcsQ0FBQyxDQUFTO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBMEIsRUFBRSxLQUFhO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSw0QkFBNEI7SUFDNUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoYXQgdG8gc2F5IGFib3V0IHRoZSBvYnNlcnZhdGlvbiB1bmRlciB0aGUgY3Vyc29yLlxuICpcbiAqIEEgY29sb3VyZWQgY2xvdWQgYW5zd2VycyBcImhvdyBpcyB0aGlzIGFubm90YXRpb24gZGlzdHJpYnV0ZWRcIjsgaXQgY2Fubm90IGFuc3dlclxuICogXCJ3aGljaCBjbGFzcyBpcyBUSEFUXCIg4oCUIHRoZSBsZWdlbmQgaGFzIDM0IGVudHJpZXMsIHNldmVyYWwgb2YgdGhlbSBzaW1pbGFyXG4gKiBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgYSBkb3QgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgYSB0b29sdGlwXG4gKiBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIFB1cmUg4oCUIG5vIERPTSwgbm8gY2FtZXJhLCBubyBkYXRhIGFjY2Vzcy4gRmluZGluZyB0aGUgb2JzZXJ2YXRpb24gaXMgdGhlXG4gKiByZW5kZXJlcidzIChuYXBhcmktanMgcGlja3Mgb24gdGhlIGxheWVycyBpdCBkcmV3KTsgdGhpcyBpcyBzdHJpbmcgZm9ybWF0dGluZ1xuICogb3ZlciB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UsIHNvIGl0IGlzIHRlc3RlZCBkaXJlY3RseS5cbiAqL1xuXG4vKiogVGhlIGNvbG91ciBzb3VyY2UgYSB0b29sdGlwIGRlc2NyaWJlcywgYXMgdGhlIHJlbmRlcmVyIGFscmVhZHkgaGFzIGl0LiAqL1xuZXhwb3J0IHR5cGUgSG92ZXJTb3VyY2UgPVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCc7XG4gICAgICAvKiogQ29sdW1uIG5hbWUsIGZvciB0aGUgdG9vbHRpcCdzIGZpcnN0IGxpbmUuICovXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yaWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICAgIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gICAgICBjb2RlczogVWludDE2QXJyYXk7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjb250aW51b3VzJztcbiAgICAgIC8qKiBDb2x1bW4gb3IgZ2VuZSBuYW1lLiAqL1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICAvKiogVW5pdCBmb3IgdGhlIHZhbHVlLCB3aGVuIHRoZSBkYXRhc2V0IGRlY2xhcmVzIG9uZS4gKi9cbiAgICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgfTtcblxuLyoqIEEgbnVtYmVyIGZvciBhIHRvb2x0aXA6IGVub3VnaCBkaWdpdHMgdG8gZGlzdGluZ3Vpc2gsIGZldyBlbm91Z2ggdG8gcmVhZC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKHY6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7XG4gIGlmICh2ID09PSAwKSByZXR1cm4gJzAnO1xuICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLmFicyh2KTtcbiAgaWYgKG1hZ25pdHVkZSA+PSAxMDAwIHx8IG1hZ25pdHVkZSA8IDAuMDEpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoMik7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMCk7XG59XG5cbi8qKlxuICogVGhlIHRvb2x0aXAncyBsaW5lcyBmb3Igb25lIG9ic2VydmF0aW9uOiB3aGF0IGl0IGlzLCB0aGVuIHdoaWNoIGNvbHVtbiBzYWlkIHNvLlxuICpcbiAqIE51bGwgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBkZXNjcmliZSB0aGlzIG9ic2VydmF0aW9uIOKAlCBhIGNvZGUgb3V0c2lkZSB0aGVcbiAqIGNhdGVnb3J5IGxpc3QsIG9yIGEgdmFsdWUgdGhhdCB3YXMgbmV2ZXIgbWVhc3VyZWQuIFNheWluZyBub3RoaW5nIGlzIGJldHRlclxuICogdGhhbiBhIHRvb2x0aXAgdGhhdCByZWFkcyBcInVuZGVmaW5lZFwiLCBhbmQgYmV0dGVyIHRoYW4gaW52ZW50aW5nIGEgbGFiZWwgZm9yIGFcbiAqIGNlbGwgd2hvc2UgYW5ub3RhdGlvbiBpcyBnZW51aW5lbHkgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdmVyVGV4dChzb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghc291cmNlIHx8IGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGlmIChzb3VyY2Uua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXM/LltpbmRleF07XG4gICAgY29uc3QgbGFiZWwgPSBjb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzb3VyY2UuY2F0ZWdvcmllcz8uW2NvZGVdO1xuICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gW2xhYmVsLCBzb3VyY2UubmFtZV07XG4gIH1cbiAgLy8gR3VhcmRlZCByYXRoZXIgdGhhbiBpbmRleGVkIHN0cmFpZ2h0OiB0aGlzIHJ1bnMgZnJvbSBhIHBvaW50ZXJtb3ZlIGhhbmRsZXIsXG4gIC8vIHNvIGEgbWFsZm9ybWVkIHNvdXJjZSB3b3VsZCB0aHJvdyBvbiBldmVyeSBtb3VzZSBtb3ZlbWVudCDigJQgZmFyIHdvcnNlIHRoYW4gYVxuICAvLyB0b29sdGlwIHRoYXQgc3RheXMgcXVpZXQuXG4gIGNvbnN0IHZhbHVlID0gc291cmNlLnZhbHVlcz8uW2luZGV4XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICBjb25zdCB1bml0ID0gc291cmNlLnVuaXQgPyBgICR7c291cmNlLnVuaXR9YCA6ICcnO1xuICByZXR1cm4gW2Ake2Zvcm1hdFZhbHVlKHZhbHVlKX0ke3VuaXR9YCwgc291cmNlLm5hbWVdO1xufVxuIl19
|