@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +3 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
  24. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
  26. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  27. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  28. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  29. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  30. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  31. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  32. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  33. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  34. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  35. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  36. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  37. package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
  38. package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
  39. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  40. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  41. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  42. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  43. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  44. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  45. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  46. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
  47. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
  48. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
  49. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  50. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  51. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  52. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  53. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  54. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  55. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  56. package/esm2022/lib/store/region-store.service.mjs +33 -2
  57. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  58. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  59. package/esm2022/lib/visualizer.component.mjs +40 -4
  60. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  62. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  64. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  65. package/fesm2022/region-source.worker.js +84 -2
  66. package/lib/contracts/display-types.d.ts +90 -4
  67. package/lib/contracts/image.contract.d.ts +6 -0
  68. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  69. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  70. package/lib/contracts/region-store.contract.d.ts +6 -0
  71. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  72. package/lib/contracts/visualizer.contract.d.ts +43 -1
  73. package/lib/geometry/cell-meshes.d.ts +27 -0
  74. package/lib/geometry/place.d.ts +45 -0
  75. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  76. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  77. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  78. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  79. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  80. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
  81. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
  82. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  83. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  84. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
  85. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  86. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
  87. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  88. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
  89. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  90. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  91. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  92. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  93. package/lib/region-editor/region-editor.component.d.ts +4 -0
  94. package/lib/region-source/region-source-ops.d.ts +12 -0
  95. package/lib/region-source/region-tiles.d.ts +8 -0
  96. package/lib/region-source/worker-region-source.d.ts +18 -0
  97. package/lib/routing-visualizer.service.d.ts +140 -1
  98. package/lib/spatial/observations-in-selection.d.ts +43 -0
  99. package/lib/spatial/plane-cells.d.ts +37 -0
  100. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  101. package/lib/spatial/spatial-encoding.d.ts +14 -1
  102. package/lib/spatial/spatial-hover.d.ts +23 -0
  103. package/lib/spatial/spatial-planes.d.ts +22 -0
  104. package/lib/spatial/spatial-selection.d.ts +2 -1
  105. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  106. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  107. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  108. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  109. package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
  110. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
  111. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  112. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  113. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  114. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  115. package/lib/store/region-source-scope.d.ts +4 -0
  116. package/lib/store/region-store.service.d.ts +21 -0
  117. package/lib/toolbar/toolbar.component.d.ts +6 -1
  118. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  119. package/lib/visualizer.component.d.ts +14 -0
  120. package/package.json +1 -1
  121. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { buildColormapLut } from '../contracts/colormap-lut';
2
2
  import { parseCssColor } from '../contracts/color';
3
3
  import { fallbackColorFor } from '../store/class-color.util';
4
- import { NO_CATEGORY } from '../contracts/spatial-dataset.contract';
4
+ import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
5
5
  import { percentileWindow } from './stats';
6
6
  /** Neutral grey for observations with no value (NaN, or {@link NO_CATEGORY}). */
7
7
  export const MISSING_COLOR = [150, 150, 150];
@@ -11,7 +11,10 @@ export const DEFAULT_MUTED_OPACITY = 0.15;
11
11
  * Fallback categorical palette. Colour-blind-safe and stable, so a category
12
12
  * without an authored colour still lands somewhere sensible and lands there
13
13
  * every run (`fallbackColorFor` hashes the name — same name, same colour).
14
- * Okabe–Ito, plus two greys for long tails.
14
+ * Okabe–Ito and three greys, then twelve more (Tol's muted, a few of Paired), so a grouping of up
15
+ * to 22 groups (the MERFISH ileum's 20 cell types) has no two alike; the first ten come first, so a
16
+ * grouping of ten or fewer keeps its colours. jit-bioformats' `SegmentationRegionSet.PALETTE` (a 3D
17
+ * segmentation's region set, coloured at conversion) must stay this, colour for colour.
15
18
  */
16
19
  export const DEFAULT_CATEGORICAL_PALETTE = [
17
20
  '#0072B2',
@@ -24,6 +27,18 @@ export const DEFAULT_CATEGORICAL_PALETTE = [
24
27
  '#000000',
25
28
  '#7F7F7F',
26
29
  '#BFBFBF',
30
+ '#882255',
31
+ '#44AA99',
32
+ '#332288',
33
+ '#DDCC77',
34
+ '#117733',
35
+ '#AA4499',
36
+ '#661100',
37
+ '#999933',
38
+ '#E31A1C',
39
+ '#FB9A99',
40
+ '#B2DF8A',
41
+ '#6A3D9A',
27
42
  ];
28
43
  /** Parse a CSS colour (`#rgb` / `#rrggbb`, see {@link parseCssColor}) to 0–255 RGB; unparseable
29
44
  * input falls back to grey. Exported so the tile layers parse palettes exactly as the markers do. */
@@ -190,4 +205,21 @@ export function spatialContinuousLut(colormapValue, reverse = false, override) {
190
205
  const lut = lutFor(colormapValue, reverse);
191
206
  return isGrayscaleLut(lut) ? buildColormapLut('Viridis', reverse) : lut;
192
207
  }
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQXlCLFdBQVcsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUE0QjNDLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxELHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFFMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBYTtJQUNuRCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQWdDRjtzR0FDc0c7QUFDdEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLElBQWlCO0lBQzNDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLENB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RixJQUFJLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJnYiwgYnVpbGRDb2xvcm1hcEx1dCB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgcGFyc2VDc3NDb2xvciB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcic7XG5pbXBvcnQgeyBmYWxsYmFja0NvbG9yRm9yIH0gZnJvbSAnLi4vc3RvcmUvY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBDYXRlZ29yaWNhbENvbHVtbk1ldGEsIE5PX0NBVEVHT1JZLCBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcFZhbHVlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcGVyY2VudGlsZVdpbmRvdyB9IGZyb20gJy4vc3RhdHMnO1xuXG4vKipcbiAqIFR1cm5pbmcgc3BhdGlhbC1vbWljcyBjb2x1bW5zIGludG8gcGVyLXBvaW50IHZpc3VhbCBhdHRyaWJ1dGVzLlxuICpcbiAqIFB1cmUg4oCUIG5vIEFuZ3VsYXIsIG5vIFJ4SlMsIG5vIHJlbmRlcmVyIOKAlCBsaWtlIGBwbG90bHktdHJhY2UtYnVpbGRlcnMudHNgLCBzb1xuICogdGhlIGVuY29kaW5ncyBhcmUgdGVzdGFibGUgb24gdGhlaXIgb3duIGFuZCBzaGFyZWQgYnkgYW55IGJhY2tlbmQgdGhhdCBncm93c1xuICogYSBzcGF0aWFsIG1vZGUuXG4gKlxuICogVGhlIHJ1bGVzIGhlcmUgYXJlIHRoZSBvbmVzIHRoZSBDb3NNeCBhbmFseXNpcyBndWlkYW5jZSBwcmVzY3JpYmVzLCBtYWRlXG4gKiBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGVhY2ggY2FsbCBzaXRlOlxuICogIC0gY291bnQtbGlrZSBjb2x1bW5zIHJlYWQgb24gYSAqKmxvZyoqIHNjYWxlIChsaW5lYXIgY29sbGFwc2VzIHRoZW0gYWdhaW5zdCBhXG4gKiAgICBmZXcgYnJpZ2h0IG91dGxpZXJzKTtcbiAqICAtIGNvbnRyYXN0IHdpbmRvd3MgY29tZSBmcm9tICoqcGVyY2VudGlsZXMqKiwgbm90IG1pbi9tYXgsIHNvIGEgc2luZ2xlXG4gKiAgICBzYXR1cmF0ZWQgc3BvdCBkb2Vzbid0IGZsYXR0ZW4gZXZlcnl0aGluZyBlbHNlO1xuICogIC0gY29udGV4dCBpcyBrZXB0IGJ5ICoqbXV0aW5nKiogcmF0aGVyIHRoYW4gaGlkaW5nIOKAlCBiYWNrZ3JvdW5kIHBvaW50cyBzdGF5XG4gKiAgICB2aXNpYmxlIGF0IGxvdyBhbHBoYSBzbyB0aGUgdGlzc3VlIHNoYXBlIHN1cnZpdmVzLlxuICpcbiAqIENPTE9VUiBSRVBSRVNFTlRBVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVyeXRoaW5nIGlzIGEgZmxhdCBgRmxvYXQzMkFycmF5YCBvZiBgW3IsZyxiLGEsIOKApl1gIGluIDAuLjEg4oCUIG9uZVxuICogYWxsb2NhdGlvbiBmb3IgTiBwb2ludHMsIEdQVS11cGxvYWQgc2hhcGVkLiBuYXBhcmktanMgKOKJpSAwLjE1KVxuICogYFBvaW50c0xheWVyLmZhY2VDb2xvcmAgYW5kIGBQb2ludHMzRExheWVyLmNvbG9yc2AgdGFrZSBpdCBhcyBpcy5cbiAqL1xuXG4vKiogT25lIFJHQkEgY29sb3VyLCByLCBnLCBiLCBhIGluIDAuLjEgKG5hcGFyaS1qcydzIGJyb2FkY2FzdCBjb2xvdXIpLiAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogTmV1dHJhbCBncmV5IGZvciBvYnNlcnZhdGlvbnMgd2l0aCBubyB2YWx1ZSAoTmFOLCBvciB7QGxpbmsgTk9fQ0FURUdPUll9KS4gKi9cbmV4cG9ydCBjb25zdCBNSVNTSU5HX0NPTE9SOiBSZ2IgPSBbMTUwLCAxNTAsIDE1MF07XG5cbi8qKiBEZWZhdWx0IGFscGhhIGZvciBtdXRlZCAoYmFja2dyb3VuZCAvIHVuc2VsZWN0ZWQpIHBvaW50cyDigJQgQ29zTXgtc3R5bGUgY29udGV4dC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01VVEVEX09QQUNJVFkgPSAwLjE1O1xuXG4vKipcbiAqIEZhbGxiYWNrIGNhdGVnb3JpY2FsIHBhbGV0dGUuIENvbG91ci1ibGluZC1zYWZlIGFuZCBzdGFibGUsIHNvIGEgY2F0ZWdvcnlcbiAqIHdpdGhvdXQgYW4gYXV0aG9yZWQgY29sb3VyIHN0aWxsIGxhbmRzIHNvbWV3aGVyZSBzZW5zaWJsZSBhbmQgbGFuZHMgdGhlcmVcbiAqIGV2ZXJ5IHJ1biAoYGZhbGxiYWNrQ29sb3JGb3JgIGhhc2hlcyB0aGUgbmFtZSDigJQgc2FtZSBuYW1lLCBzYW1lIGNvbG91cikuXG4gKiBPa2FiZeKAk0l0bywgcGx1cyB0d28gZ3JleXMgZm9yIGxvbmcgdGFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEU6IHN0cmluZ1tdID0gW1xuICAnIzAwNzJCMicsXG4gICcjRTY5RjAwJyxcbiAgJyMwMDlFNzMnLFxuICAnI0NDNzlBNycsXG4gICcjNTZCNEU5JyxcbiAgJyNENTVFMDAnLFxuICAnI0YwRTQ0MicsXG4gICcjMDAwMDAwJyxcbiAgJyM3RjdGN0YnLFxuICAnI0JGQkZCRicsXG5dO1xuXG5pbnRlcmZhY2UgTXV0ZU9wdGlvbnMge1xuICAvKiogQWxwaGEgZm9yIHBvaW50cyB0aGF0IGFyZSBub3QgbXV0ZWQuIERlZmF1bHQgMS4gKi9cbiAgb3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIEFscGhhIGZvciBtdXRlZCBwb2ludHMuIERlZmF1bHQge0BsaW5rIERFRkFVTFRfTVVURURfT1BBQ0lUWX0uICovXG4gIG11dGVkT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqIGAxYCBhdCBpbmRleCBpIG11dGVzIG9ic2VydmF0aW9uIGkuIEFic2VudCDih5Igbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgbXV0ZWQ/OiBVaW50OEFycmF5IHwgbnVsbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbmNvZGVDYXRlZ29yaWNhbH06IGEgY29sb3VyIHBlciBjYXRlZ29yeSwgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zIGV4dGVuZHMgTXV0ZU9wdGlvbnMge1xuICAvKiogUGVyLWNhdGVnb3J5IGAjcnJnZ2JiYCwgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSBjb2x1bW4ncyBjYXRlZ29yaWVzLiAqL1xuICBjb2xvcnM6IHN0cmluZ1tdO1xuICAvKiogQ29sb3VyIGZvciB7QGxpbmsgTk9fQ0FURUdPUll9LiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNvbnRpbnVvdXN9OiBhIGNvbG9ybWFwLCBhIGNvbnRyYXN0IHdpbmRvdyBhbmQgc2NhbGluZywgcGx1cyBtdXRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVvdXNFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiAyNTYtZW50cnkgUkdCIHRhYmxlIGZyb20ge0BsaW5rIGJ1aWxkQ29sb3JtYXBMdXR9LiAqL1xuICBsdXQ6IFJnYltdO1xuICAvKiogQ29udHJhc3Qgd2luZG93IGluIFZBTFVFIHVuaXRzIChwcmUtbG9nKS4gKi9cbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICAvKiogQXBwbHkgYGxvZzFwYCB0byB0aGUgdmFsdWUgYW5kIHRoZSB3aW5kb3cgYmVmb3JlIG5vcm1hbGlzaW5nLiAqL1xuICBsb2c/OiBib29sZWFuO1xuICAvKiogQ29sb3VyIGZvciBgTmFOYC4gRGVmYXVsdCB7QGxpbmsgTUlTU0lOR19DT0xPUn0uICovXG4gIG1pc3NpbmdDb2xvcj86IFJnYjtcbn1cblxuLyoqIFBhcnNlIGEgQ1NTIGNvbG91ciAoYCNyZ2JgIC8gYCNycmdnYmJgLCBzZWUge0BsaW5rIHBhcnNlQ3NzQ29sb3J9KSB0byAw4oCTMjU1IFJHQjsgdW5wYXJzZWFibGVcbiAqICBpbnB1dCBmYWxscyBiYWNrIHRvIGdyZXkuIEV4cG9ydGVkIHNvIHRoZSB0aWxlIGxheWVycyBwYXJzZSBwYWxldHRlcyBleGFjdGx5IGFzIHRoZSBtYXJrZXJzIGRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGV4KGhleDogc3RyaW5nKTogUmdiIHtcbiAgcmV0dXJuIHBhcnNlQ3NzQ29sb3IoaGV4KSA/PyBNSVNTSU5HX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBhbHBoYUF0KGk6IG51bWJlciwgb3B0czogTXV0ZU9wdGlvbnMpOiBudW1iZXIge1xuICBjb25zdCBvbiA9IG9wdHMub3BhY2l0eSA/PyAxO1xuICBjb25zdCBvZmYgPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gIHJldHVybiBvcHRzLm11dGVkICYmIG9wdHMubXV0ZWRbaV0gPyBvZmYgOiBvbjtcbn1cblxuLyoqXG4gKiBQZXItY2F0ZWdvcnkgY29sb3VyczogdGhlIGNvbHVtbidzIGF1dGhvcmVkIGBjb2xvcnNgIHdoZXJlIHByZXNlbnQgKHNvIHRoZVxuICogdmlld2VyIG1hdGNoZXMgdGhlIGZpZ3VyZXMgdGhlIHNhbWUgYW5hbHlzaXMgcHJvZHVjZWQgZWxzZXdoZXJlKSwgb3RoZXJ3aXNlXG4gKiB0aGUgcGFsZXR0ZSBieSBwb3NpdGlvbiwgd3JhcHBpbmcgdGhyb3VnaCBhIG5hbWUtaGFzaCBwYXN0IGl0cyBlbmQgc28gYVxuICogNDAtY2x1c3RlciBjb2x1bW4gc3RpbGwgZ2V0cyBzdGFibGUsIGRpc3RpbmN0LWlzaCBjb2xvdXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKFxuICBtZXRhOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIHBhbGV0dGU6IHN0cmluZ1tdID0gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhdXRob3JlZCA9IG1ldGEuY29sb3JzO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4ge1xuICAgIGNvbnN0IGdpdmVuID0gYXV0aG9yZWQ/LltpXTtcbiAgICBpZiAoZ2l2ZW4pIHJldHVybiBnaXZlbjtcbiAgICBpZiAoaSA8IHBhbGV0dGUubGVuZ3RoKSByZXR1cm4gcGFsZXR0ZVtpXTtcbiAgICByZXR1cm4gZmFsbGJhY2tDb2xvckZvcihuYW1lLCBwYWxldHRlKTtcbiAgfSk7XG59XG5cbi8qKiBUaGUgdXNlcidzIGdyb3VwIGNvbG91cnM6IGJ5IGNvbHVtbiBuYW1lLCB0aGVuIGNhdGVnb3J5IChzZWUgYFNwYXRpYWxWaWV3U3RhdGUuZ3JvdXBDb2xvcnNgKS4gKi9cbmV4cG9ydCB0eXBlIEdyb3VwQ29sb3JPdmVycmlkZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4+O1xuXG4vKipcbiAqIENhdGVnb3JpY2FsIGNvbHVtbiBgY29sdW1uYCdzIGNvbG91cnMgKHtAbGluayByZXNvbHZlQ2F0ZWdvcnlDb2xvcnN9KSB3aXRoIHRoZSB1c2VyJ3MgY2hvaWNlc1xuICogZm9yIGl0cyBncm91cHMgb3ZlciB0aGVtLiBFdmVyeSBwbGFjZSBhIGdyb3VwaW5nIGlzIGNvbG91cmVkIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGdyb3VwXG4gKiByZWNvbG91cmVkIGluIHRoZSBsaXN0IGlzIHRoYXQgY29sb3VyIG9uIHRoZSBjZWxscywgdGhlIG1hcmtlcnMsIHRoZSBsZWdlbmQgYW5kIHRoZSBjaGFydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeUNvbG9yc0ZvcihcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG1ldGE6IENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgb3ZlcnJpZGVzPzogR3JvdXBDb2xvck92ZXJyaWRlcyB8IG51bGwsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJhc2UgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobWV0YSk7XG4gIGNvbnN0IG93biA9IG92ZXJyaWRlcz8uW2NvbHVtbl07XG4gIGlmICghb3duKSByZXR1cm4gYmFzZTtcbiAgcmV0dXJuIG1ldGEuY2F0ZWdvcmllcy5tYXAoKG5hbWUsIGkpID0+IG93bltuYW1lXSB8fCBiYXNlW2ldKTtcbn1cblxuLyoqIFdoYXQgYSBjYWNoZSBrZXllZCBvbiBhIGdyb3VwaW5nJ3MgY29sb3VycyBtdXN0IGluY2x1ZGUgb2YgdGhlIHVzZXIncyBjaG9pY2VzIGZvciBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cENvbG9yc0tleShjb2x1bW46IHN0cmluZyB8IG51bGwsIG92ZXJyaWRlcz86IEdyb3VwQ29sb3JPdmVycmlkZXMgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3Qgb3duID0gY29sdW1uID8gb3ZlcnJpZGVzPy5bY29sdW1uXSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG93biA/IEpTT04uc3RyaW5naWZ5KG93bikgOiAnJztcbn1cblxuLyoqIENhdGVnb3JpY2FsIGNvbHVtbiDihpIgZmxhdCBwZXItcG9pbnQgUkdCQSAobGVuZ3RoIGA0ICogY29kZXMubGVuZ3RoYCkuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ2F0ZWdvcmljYWwoY29kZXM6IFVpbnQxNkFycmF5LCBvcHRzOiBDYXRlZ29yaWNhbEVuY29kaW5nT3B0aW9ucyk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG4gPSBjb2Rlcy5sZW5ndGg7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDQpO1xuICAvLyBSZXNvbHZlIGVhY2ggY2F0ZWdvcnkgb25jZSDigJQgcGFyc2luZyBhIGhleCBzdHJpbmcgcGVyIHBvaW50IHdvdWxkIGRvbWluYXRlLlxuICBjb25zdCByZ2IgPSBvcHRzLmNvbG9ycy5tYXAocGFyc2VIZXgpO1xuICBjb25zdCBtaXNzaW5nID0gb3B0cy5taXNzaW5nQ29sb3IgPz8gTUlTU0lOR19DT0xPUjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBjb2RlID0gY29kZXNbaV07XG4gICAgY29uc3QgYyA9IGNvZGUgPT09IE5PX0NBVEVHT1JZIHx8IGNvZGUgPj0gcmdiLmxlbmd0aCA/IG1pc3NpbmcgOiByZ2JbY29kZV07XG4gICAgY29uc3QgbyA9IGkgKiA0O1xuICAgIG91dFtvXSA9IGNbMF0gLyAyNTU7XG4gICAgb3V0W28gKyAxXSA9IGNbMV0gLyAyNTU7XG4gICAgb3V0W28gKyAyXSA9IGNbMl0gLyAyNTU7XG4gICAgLy8gQSBwb2ludCB3aXRoIG5vIGNhdGVnb3J5IGlzIGJhY2tncm91bmQgYnkgZGVmaW5pdGlvbiDigJQgbmV2ZXIgZW1waGFzaXNlZC5cbiAgICBvdXRbbyArIDNdID1cbiAgICAgIGNvZGUgPT09IE5PX0NBVEVHT1JZXG4gICAgICAgID8gTWF0aC5taW4oYWxwaGFBdChpLCBvcHRzKSwgb3B0cy5tdXRlZE9wYWNpdHkgPz8gREVGQVVMVF9NVVRFRF9PUEFDSVRZKVxuICAgICAgICA6IGFscGhhQXQoaSwgb3B0cyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIENvbnRpbnVvdXMgY29sdW1uIC8gZ2VuZSB2ZWN0b3Ig4oaSIGZsYXQgcGVyLXBvaW50IFJHQkEuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQ29udGludW91cyh2YWx1ZXM6IEZsb2F0MzJBcnJheSwgb3B0czogQ29udGludW91c0VuY29kaW5nT3B0aW9ucyk6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG4gKiA0KTtcbiAgY29uc3QgbWlzc2luZyA9IG9wdHMubWlzc2luZ0NvbG9yID8/IE1JU1NJTkdfQ09MT1I7XG4gIGNvbnN0IGx1dCA9IG9wdHMubHV0O1xuICBjb25zdCBsbyA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBvcHRzLm1pbikpIDogb3B0cy5taW47XG4gIGNvbnN0IGhpID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIG9wdHMubWF4KSkgOiBvcHRzLm1heDtcbiAgLy8gQSBkZWdlbmVyYXRlIHdpbmRvdyAoYWxsIHZhbHVlcyBlcXVhbCkgbWFwcyBldmVyeXRoaW5nIHRvIHRoZSBMVVQgbWlkcG9pbnRcbiAgLy8gcmF0aGVyIHRoYW4gZGl2aWRpbmcgYnkgemVyby5cbiAgY29uc3Qgc3BhbiA9IGhpIC0gbG87XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgcmF3ID0gdmFsdWVzW2ldO1xuICAgIGNvbnN0IG8gPSBpICogNDtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyYXcpKSB7XG4gICAgICBvdXRbb10gPSBtaXNzaW5nWzBdIC8gMjU1O1xuICAgICAgb3V0W28gKyAxXSA9IG1pc3NpbmdbMV0gLyAyNTU7XG4gICAgICBvdXRbbyArIDJdID0gbWlzc2luZ1syXSAvIDI1NTtcbiAgICAgIG91dFtvICsgM10gPSBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdiA9IG9wdHMubG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCByYXcpKSA6IHJhdztcbiAgICBjb25zdCB0ID0gc3BhbiA+IDAgPyAodiAtIGxvKSAvIHNwYW4gOiAwLjU7XG4gICAgY29uc3QgaWR4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHQgKiAyNTUpKSk7XG4gICAgY29uc3QgYyA9IGx1dFtpZHhdID8/IG1pc3Npbmc7XG4gICAgb3V0W29dID0gY1swXSAvIDI1NTtcbiAgICBvdXRbbyArIDFdID0gY1sxXSAvIDI1NTtcbiAgICBvdXRbbyArIDJdID0gY1syXSAvIDI1NTtcbiAgICBvdXRbbyArIDNdID0gYWxwaGFBdChpLCBvcHRzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbnRyYXN0IHdpbmRvdyBmcm9tIHBlcmNlbnRpbGVzIG9mIHRoZSBmaW5pdGUgdmFsdWVzIOKAlCB0aGUgQ29zTXhcbiAqIFwiY2FwIG91dGxpZXJzIGF0IHBlcmNlbnRpbGVzIHRvIGltcHJvdmUgY29udHJhc3RcIiBydWxlLiBgbG9gL2BoaWAgYXJlXG4gKiBmcmFjdGlvbnMgKDAuMDEgLyAwLjk5IGNsaXBzIHRoZSBleHRyZW1lIDElIGF0IGVhY2ggZW5kKS5cbiAqXG4gKiBSZXR1cm5zIGBbMCwgMV1gIGZvciBhbiBlbXB0eSBvciBhbGwtbWlzc2luZyB2ZWN0b3Igc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAqIHVzYWJsZSB3aW5kb3cuIEEgbGFyZ2UgdmVjdG9yIGlzIHdpbmRvd2VkIGZyb20gYW4gZXZlbiBzYW1wbGUgb2YgaXQg4oCUIHNlZVxuICogYHNwYXRpYWwvc3RhdHMudHNgIOKAlCBiZWNhdXNlIHRoaXMgcnVucyBvbiBldmVyeSByZWNvbG91ciwgYW5kIHNvcnRpbmcgbWlsbGlvbnNcbiAqIG9mIHZhbHVlcyBlYWNoIHRpbWUgY29zdCBtb3N0IG9mIGEgc2Vjb25kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJhc3RXaW5kb3codmFsdWVzOiBGbG9hdDMyQXJyYXksIGxvID0gMC4wMSwgaGkgPSAwLjk5KTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBwZXJjZW50aWxlV2luZG93KHZhbHVlcywgbG8sIGhpKTtcbn1cblxuLyoqXG4gKiBNYXJrZXIgc2l6ZXMgZm9yIHRoZSBwb2ludHMgbGF5ZXIuIG5hcGFyaS1qcyBgUG9pbnRzTGF5ZXIuc2l6ZWAgaXMgYVxuICogKipkaWFtZXRlcioqIGluIGRhdGEgdW5pdHMgd2hpbGUgYFNwYXRpYWxPYnNlcnZhdGlvbnMucmFkaXVzYCBpcyBhIHJhZGl1cyDigJRcbiAqIHRoZSBkb3VibGluZyBsaXZlcyBoZXJlIHNvIG5vIGNhbGwgc2l0ZSBoYXMgdG8gcmVtZW1iZXIgaXQuXG4gKlxuICogYGZhbGxiYWNrUmFkaXVzYCBjb3ZlcnMgYSBkYXRhc2V0IHRoYXQgZGVjbGFyZXMgbm8gcmFkaXVzIChzZWdtZW50ZWQgY2VsbHNcbiAqIG9mdGVuIGRvbid0KTsgaXQgaXMgaW4gaW1hZ2UgcGl4ZWxzLCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGlzIHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyRGlhbWV0ZXJzKG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucywgZmFsbGJhY2tSYWRpdXMgPSA0KTogbnVtYmVyIHwgRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgciA9IG9ic2VydmF0aW9ucy5yYWRpdXM7XG4gIGlmICh0eXBlb2YgciA9PT0gJ251bWJlcicpIHJldHVybiByICogMjtcbiAgaWYgKHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KHIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIG91dFtpXSA9IHJbaV0gKiAyO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrUmFkaXVzICogMjtcbn1cblxuLyoqIENvbnZlbmllbmNlOiBhIDI1Ni1lbnRyeSBMVVQgZm9yIGEgY29sb3JtYXAgdmFsdWUsIGZhbGxpbmcgYmFjayB0byBWaXJpZGlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx1dEZvcihjb2xvcm1hcFZhbHVlOiB1bmtub3duLCByZXZlcnNlID0gZmFsc2UpOiBSZ2JbXSB7XG4gIHJldHVybiBidWlsZENvbG9ybWFwTHV0KGNvbG9ybWFwVmFsdWUsIHJldmVyc2UpID8/IGJ1aWxkQ29sb3JtYXBMdXQoJ1ZpcmlkaXMnLCByZXZlcnNlKSE7XG59XG5cbi8qKiBUcnVlIHdoZW4gZXZlcnkgZW50cnkgb2YgYSBMVVQgaXMgYSBuZXV0cmFsIGdyZXkuIFRlc3RlZCBvbiB0aGUgVkFMVUVTIHJhdGhlclxuICogIHRoYW4gdGhlIGNvbG9ybWFwJ3MgbmFtZSwgc28gYSByZXZlcnNlZCBvciByZW5hbWVkIGdyZXkgcmFtcCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmF5c2NhbGVMdXQobHV0OiByZWFkb25seSBSZ2JbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbHV0LmV2ZXJ5KChbciwgZywgYl0pID0+IHIgPT09IGcgJiYgZyA9PT0gYik7XG59XG5cbi8qKlxuICogTFVUIGZvciBhIHNwYXRpYWwgQ09OVElOVU9VUyBlbmNvZGluZyDigJQgYSBnZW5lLCBhIG51bWVyaWMgY29sdW1uLlxuICpcbiAqIGBvdmVycmlkZWAgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSBhbmQgd2lucyBvdXRyaWdodCwgZ3JleSBpbmNsdWRlZDogYVxuICogZ3JleSByYW1wIHBpY2tlZCBGT1IgdGhlIGRhdGEgaXMgYSBkZWNpc2lvbiwgbm90IHRoZSBpbWFnZSdzIGNvbG9ybWFwIGxlYWtpbmdcbiAqIGluLlxuICpcbiAqIFdpdGhvdXQgb25lLCB0aGUgZGlzcGxheSBjb2xvcm1hcCDigJQgdW5sZXNzIHRoYXQgY29sb3JtYXAgaXMgZ3JheXNjYWxlLiBUaGVcbiAqIHRpc3N1ZSB1bmRlcm5lYXRoIGlzIGdyYXlzY2FsZSwgc28gYSBncmV5IG92ZXJsYXkgb2YgYSBtZWFzdXJlbWVudCBpc1xuICogaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgYW5hdG9teSBpdCBpcyBkcmF3biBvdmVyLCBhbmQgdGhlIHJlYWRlciBjYW5ub3QgdGVsbFxuICogd2hpY2ggY2hhbm5lbCBhIGJyaWdodCBwaXhlbCBiZWxvbmdzIHRvLiBWaXJpZGlzIGlzIHRoZW4gdGhlIGZhbGxiYWNrLCB3aGljaCBpc1xuICogd2hhdCB0aGUgQ29zTXggZ3VpZGFuY2UgcHJlc2NyaWJlcyBmb3IgY29udGludW91cyB2YWx1ZXMgYW55d2F5LlxuICpcbiAqIFNoYXJlZCBieSB0aGUgbWFya2VycywgYm90aCBnZW5lIG1hcHMgYW5kIHRoZSBwYW5lbCdzIGNvbG91ciBiYXIsIHNvIG5vbmUgb2ZcbiAqIHRoZW0gY2FuIGRpc2FncmVlIGFib3V0IHdoYXQgYSBjb2xvdXIgbWVhbnMsIHdoaWNoZXZlciB3YXkgdGhlIGNob2ljZSBmYWxscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxDb250aW51b3VzTHV0KFxuICBjb2xvcm1hcFZhbHVlOiB1bmtub3duLFxuICByZXZlcnNlID0gZmFsc2UsXG4gIG92ZXJyaWRlPzogQ29sb3JtYXBWYWx1ZSB8IG51bGwsXG4pOiBSZ2JbXSB7XG4gIC8vIEFuIGlubGluZSBzY2FsZSBpcyBhbiBhcnJheSwgc28gZW1wdGluZXNzIGhhcyB0byBiZSBjaGVja2VkIGFzIHdlbGwgYXNcbiAgLy8gcHJlc2VuY2U6IGBbXWAgaXMgdHJ1dGh5IGFuZCB3b3VsZCByZXNvbHZlIHRvIHRoZSBmYWxsYmFjayBMVVQgc2lsZW50bHkuXG4gIGNvbnN0IGNob3NlbiA9IEFycmF5LmlzQXJyYXkob3ZlcnJpZGUpID8gKG92ZXJyaWRlLmxlbmd0aCA/IG92ZXJyaWRlIDogbnVsbCkgOiBvdmVycmlkZTtcbiAgaWYgKGNob3NlbikgcmV0dXJuIGx1dEZvcihjaG9zZW4sIHJldmVyc2UpO1xuICBjb25zdCBsdXQgPSBsdXRGb3IoY29sb3JtYXBWYWx1ZSwgcmV2ZXJzZSk7XG4gIHJldHVybiBpc0dyYXlzY2FsZUx1dChsdXQpID8gYnVpbGRDb2xvcm1hcEx1dCgnVmlyaWRpcycsIHJldmVyc2UpISA6IGx1dDtcbn1cbiJdfQ==
208
+ /**
209
+ * Fade the transcripts outside a selection, as the cells and markers are: while `selected` (an
210
+ * observation mask) selects any cell, every packed-RGBA entry of `rgba` whose cell (`ownerOf(i)`)
211
+ * is not selected, or that is in no cell, has its alpha scaled to {@link DEFAULT_MUTED_OPACITY}.
212
+ * The selection's own transcripts keep their colour. Nothing changes without a selection.
213
+ */
214
+ export function fadeOutsideSelection(rgba, count, ownerOf, selected) {
215
+ if (!selected || selected.count === 0)
216
+ return;
217
+ const mask = selected.mask;
218
+ for (let i = 0; i < count; i++) {
219
+ const o = ownerOf(i);
220
+ if (o !== NO_OBSERVATION && o >= 0 && o < mask.length && mask[o])
221
+ continue;
222
+ rgba[4 * i + 3] *= DEFAULT_MUTED_OPACITY;
223
+ }
224
+ }
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1lbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBRUwsV0FBVyxFQUNYLGNBQWMsR0FFZixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQTRCM0MsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFbEQsc0ZBQXNGO0FBQ3RGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUUxQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFhO0lBQ25ELFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBZ0NGO3NHQUNzRztBQUN0RyxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQVc7SUFDbEMsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxDQUFTLEVBQUUsSUFBaUI7SUFDM0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxxQkFBcUIsQ0FBQztJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxJQUEyQixFQUMzQixVQUFvQiwyQkFBMkI7SUFFL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBS0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsTUFBYyxFQUNkLElBQTJCLEVBQzNCLFNBQXNDO0lBRXRDLE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsNEZBQTRGO0FBQzVGLE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBcUIsRUFBRSxTQUFzQztJQUMxRixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckQsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFrQixFQUFFLElBQWdDO0lBQ3BGLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLDhFQUE4RTtJQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDcEIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QiwyRUFBMkU7UUFDM0UsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDUixJQUFJLEtBQUssV0FBVztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDO2dCQUN4RSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFvQixFQUFFLElBQStCO0lBQ3BGLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksYUFBYSxDQUFDO0lBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNuRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ25FLDZFQUE2RTtJQUM3RSxnQ0FBZ0M7SUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUMxQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxxQkFBcUIsQ0FBQztZQUN4RCxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW9CLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUN2RSxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFlBQWlDLEVBQUUsY0FBYyxHQUFHLENBQUM7SUFDbkYsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLFlBQVksWUFBWSxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxNQUFNLENBQUMsYUFBc0IsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUM1RCxPQUFPLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFFLENBQUM7QUFDM0YsQ0FBQztBQUVEO2lGQUNpRjtBQUNqRixNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQW1CO0lBQ2hELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsYUFBc0IsRUFDdEIsT0FBTyxHQUFHLEtBQUssRUFDZixRQUErQjtJQUUvQix5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3hGLElBQUksTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMzRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLElBQWtCLEVBQ2xCLEtBQWEsRUFDYixPQUE4QixFQUM5QixRQUFvRDtJQUVwRCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDOUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzNFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLHFCQUFxQixDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmdiLCBidWlsZENvbG9ybWFwTHV0IH0gZnJvbSAnLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBwYXJzZUNzc0NvbG9yIH0gZnJvbSAnLi4vY29udHJhY3RzL2NvbG9yJztcbmltcG9ydCB7IGZhbGxiYWNrQ29sb3JGb3IgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IENvbG9ybWFwVmFsdWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBwZXJjZW50aWxlV2luZG93IH0gZnJvbSAnLi9zdGF0cyc7XG5cbi8qKlxuICogVHVybmluZyBzcGF0aWFsLW9taWNzIGNvbHVtbnMgaW50byBwZXItcG9pbnQgdmlzdWFsIGF0dHJpYnV0ZXMuXG4gKlxuICogUHVyZSDigJQgbm8gQW5ndWxhciwgbm8gUnhKUywgbm8gcmVuZGVyZXIg4oCUIGxpa2UgYHBsb3RseS10cmFjZS1idWlsZGVycy50c2AsIHNvXG4gKiB0aGUgZW5jb2RpbmdzIGFyZSB0ZXN0YWJsZSBvbiB0aGVpciBvd24gYW5kIHNoYXJlZCBieSBhbnkgYmFja2VuZCB0aGF0IGdyb3dzXG4gKiBhIHNwYXRpYWwgbW9kZS5cbiAqXG4gKiBUaGUgcnVsZXMgaGVyZSBhcmUgdGhlIG9uZXMgdGhlIENvc014IGFuYWx5c2lzIGd1aWRhbmNlIHByZXNjcmliZXMsIG1hZGVcbiAqIGV4cGxpY2l0IHJhdGhlciB0aGFuIGxlZnQgdG8gZWFjaCBjYWxsIHNpdGU6XG4gKiAgLSBjb3VudC1saWtlIGNvbHVtbnMgcmVhZCBvbiBhICoqbG9nKiogc2NhbGUgKGxpbmVhciBjb2xsYXBzZXMgdGhlbSBhZ2FpbnN0IGFcbiAqICAgIGZldyBicmlnaHQgb3V0bGllcnMpO1xuICogIC0gY29udHJhc3Qgd2luZG93cyBjb21lIGZyb20gKipwZXJjZW50aWxlcyoqLCBub3QgbWluL21heCwgc28gYSBzaW5nbGVcbiAqICAgIHNhdHVyYXRlZCBzcG90IGRvZXNuJ3QgZmxhdHRlbiBldmVyeXRoaW5nIGVsc2U7XG4gKiAgLSBjb250ZXh0IGlzIGtlcHQgYnkgKiptdXRpbmcqKiByYXRoZXIgdGhhbiBoaWRpbmcg4oCUIGJhY2tncm91bmQgcG9pbnRzIHN0YXlcbiAqICAgIHZpc2libGUgYXQgbG93IGFscGhhIHNvIHRoZSB0aXNzdWUgc2hhcGUgc3Vydml2ZXMuXG4gKlxuICogQ09MT1VSIFJFUFJFU0VOVEFUSU9OXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5dGhpbmcgaXMgYSBmbGF0IGBGbG9hdDMyQXJyYXlgIG9mIGBbcixnLGIsYSwg4oCmXWAgaW4gMC4uMSDigJQgb25lXG4gKiBhbGxvY2F0aW9uIGZvciBOIHBvaW50cywgR1BVLXVwbG9hZCBzaGFwZWQuIG5hcGFyaS1qcyAo4omlIDAuMTUpXG4gKiBgUG9pbnRzTGF5ZXIuZmFjZUNvbG9yYCBhbmQgYFBvaW50czNETGF5ZXIuY29sb3JzYCB0YWtlIGl0IGFzIGlzLlxuICovXG5cbi8qKiBPbmUgUkdCQSBjb2xvdXIsIHIsIGcsIGIsIGEgaW4gMC4uMSAobmFwYXJpLWpzJ3MgYnJvYWRjYXN0IGNvbG91cikuICovXG5leHBvcnQgdHlwZSBSR0JBID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbi8qKiBOZXV0cmFsIGdyZXkgZm9yIG9ic2VydmF0aW9ucyB3aXRoIG5vIHZhbHVlIChOYU4sIG9yIHtAbGluayBOT19DQVRFR09SWX0pLiAqL1xuZXhwb3J0IGNvbnN0IE1JU1NJTkdfQ09MT1I6IFJnYiA9IFsxNTAsIDE1MCwgMTUwXTtcblxuLyoqIERlZmF1bHQgYWxwaGEgZm9yIG11dGVkIChiYWNrZ3JvdW5kIC8gdW5zZWxlY3RlZCkgcG9pbnRzIOKAlCBDb3NNeC1zdHlsZSBjb250ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTVVURURfT1BBQ0lUWSA9IDAuMTU7XG5cbi8qKlxuICogRmFsbGJhY2sgY2F0ZWdvcmljYWwgcGFsZXR0ZS4gQ29sb3VyLWJsaW5kLXNhZmUgYW5kIHN0YWJsZSwgc28gYSBjYXRlZ29yeVxuICogd2l0aG91dCBhbiBhdXRob3JlZCBjb2xvdXIgc3RpbGwgbGFuZHMgc29tZXdoZXJlIHNlbnNpYmxlIGFuZCBsYW5kcyB0aGVyZVxuICogZXZlcnkgcnVuIChgZmFsbGJhY2tDb2xvckZvcmAgaGFzaGVzIHRoZSBuYW1lIOKAlCBzYW1lIG5hbWUsIHNhbWUgY29sb3VyKS5cbiAqIE9rYWJl4oCTSXRvIGFuZCB0aHJlZSBncmV5cywgdGhlbiB0d2VsdmUgbW9yZSAoVG9sJ3MgbXV0ZWQsIGEgZmV3IG9mIFBhaXJlZCksIHNvIGEgZ3JvdXBpbmcgb2YgdXBcbiAqIHRvIDIyIGdyb3VwcyAodGhlIE1FUkZJU0ggaWxldW0ncyAyMCBjZWxsIHR5cGVzKSBoYXMgbm8gdHdvIGFsaWtlOyB0aGUgZmlyc3QgdGVuIGNvbWUgZmlyc3QsIHNvIGFcbiAqIGdyb3VwaW5nIG9mIHRlbiBvciBmZXdlciBrZWVwcyBpdHMgY29sb3Vycy4gaml0LWJpb2Zvcm1hdHMnIGBTZWdtZW50YXRpb25SZWdpb25TZXQuUEFMRVRURWAgKGEgM0RcbiAqIHNlZ21lbnRhdGlvbidzIHJlZ2lvbiBzZXQsIGNvbG91cmVkIGF0IGNvbnZlcnNpb24pIG11c3Qgc3RheSB0aGlzLCBjb2xvdXIgZm9yIGNvbG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURTogc3RyaW5nW10gPSBbXG4gICcjMDA3MkIyJyxcbiAgJyNFNjlGMDAnLFxuICAnIzAwOUU3MycsXG4gICcjQ0M3OUE3JyxcbiAgJyM1NkI0RTknLFxuICAnI0Q1NUUwMCcsXG4gICcjRjBFNDQyJyxcbiAgJyMwMDAwMDAnLFxuICAnIzdGN0Y3RicsXG4gICcjQkZCRkJGJyxcbiAgJyM4ODIyNTUnLFxuICAnIzQ0QUE5OScsXG4gICcjMzMyMjg4JyxcbiAgJyNERENDNzcnLFxuICAnIzExNzczMycsXG4gICcjQUE0NDk5JyxcbiAgJyM2NjExMDAnLFxuICAnIzk5OTkzMycsXG4gICcjRTMxQTFDJyxcbiAgJyNGQjlBOTknLFxuICAnI0IyREY4QScsXG4gICcjNkEzRDlBJyxcbl07XG5cbmludGVyZmFjZSBNdXRlT3B0aW9ucyB7XG4gIC8qKiBBbHBoYSBmb3IgcG9pbnRzIHRoYXQgYXJlIG5vdCBtdXRlZC4gRGVmYXVsdCAxLiAqL1xuICBvcGFjaXR5PzogbnVtYmVyO1xuICAvKiogQWxwaGEgZm9yIG11dGVkIHBvaW50cy4gRGVmYXVsdCB7QGxpbmsgREVGQVVMVF9NVVRFRF9PUEFDSVRZfS4gKi9cbiAgbXV0ZWRPcGFjaXR5PzogbnVtYmVyO1xuICAvKiogYDFgIGF0IGluZGV4IGkgbXV0ZXMgb2JzZXJ2YXRpb24gaS4gQWJzZW50IOKHkiBub3RoaW5nIGlzIG11dGVkLiAqL1xuICBtdXRlZD86IFVpbnQ4QXJyYXkgfCBudWxsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuY29kZUNhdGVnb3JpY2FsfTogYSBjb2xvdXIgcGVyIGNhdGVnb3J5LCBwbHVzIG11dGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxFbmNvZGluZ09wdGlvbnMgZXh0ZW5kcyBNdXRlT3B0aW9ucyB7XG4gIC8qKiBQZXItY2F0ZWdvcnkgYCNycmdnYmJgLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIGNvbHVtbidzIGNhdGVnb3JpZXMuICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBDb2xvdXIgZm9yIHtAbGluayBOT19DQVRFR09SWX0uIERlZmF1bHQge0BsaW5rIE1JU1NJTkdfQ09MT1J9LiAqL1xuICBtaXNzaW5nQ29sb3I/OiBSZ2I7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgZW5jb2RlQ29udGludW91c306IGEgY29sb3JtYXAsIGEgY29udHJhc3Qgd2luZG93IGFuZCBzY2FsaW5nLCBwbHVzIG11dGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludW91c0VuY29kaW5nT3B0aW9ucyBleHRlbmRzIE11dGVPcHRpb25zIHtcbiAgLyoqIDI1Ni1lbnRyeSBSR0IgdGFibGUgZnJvbSB7QGxpbmsgYnVpbGRDb2xvcm1hcEx1dH0uICovXG4gIGx1dDogUmdiW107XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgaW4gVkFMVUUgdW5pdHMgKHByZS1sb2cpLiAqL1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG4gIC8qKiBBcHBseSBgbG9nMXBgIHRvIHRoZSB2YWx1ZSBhbmQgdGhlIHdpbmRvdyBiZWZvcmUgbm9ybWFsaXNpbmcuICovXG4gIGxvZz86IGJvb2xlYW47XG4gIC8qKiBDb2xvdXIgZm9yIGBOYU5gLiBEZWZhdWx0IHtAbGluayBNSVNTSU5HX0NPTE9SfS4gKi9cbiAgbWlzc2luZ0NvbG9yPzogUmdiO1xufVxuXG4vKiogUGFyc2UgYSBDU1MgY29sb3VyIChgI3JnYmAgLyBgI3JyZ2diYmAsIHNlZSB7QGxpbmsgcGFyc2VDc3NDb2xvcn0pIHRvIDDigJMyNTUgUkdCOyB1bnBhcnNlYWJsZVxuICogIGlucHV0IGZhbGxzIGJhY2sgdG8gZ3JleS4gRXhwb3J0ZWQgc28gdGhlIHRpbGUgbGF5ZXJzIHBhcnNlIHBhbGV0dGVzIGV4YWN0bHkgYXMgdGhlIG1hcmtlcnMgZG8uICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZXgoaGV4OiBzdHJpbmcpOiBSZ2Ige1xuICByZXR1cm4gcGFyc2VDc3NDb2xvcihoZXgpID8/IE1JU1NJTkdfQ09MT1I7XG59XG5cbmZ1bmN0aW9uIGFscGhhQXQoaTogbnVtYmVyLCBvcHRzOiBNdXRlT3B0aW9ucyk6IG51bWJlciB7XG4gIGNvbnN0IG9uID0gb3B0cy5vcGFjaXR5ID8/IDE7XG4gIGNvbnN0IG9mZiA9IG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgcmV0dXJuIG9wdHMubXV0ZWQgJiYgb3B0cy5tdXRlZFtpXSA/IG9mZiA6IG9uO1xufVxuXG4vKipcbiAqIFBlci1jYXRlZ29yeSBjb2xvdXJzOiB0aGUgY29sdW1uJ3MgYXV0aG9yZWQgYGNvbG9yc2Agd2hlcmUgcHJlc2VudCAoc28gdGhlXG4gKiB2aWV3ZXIgbWF0Y2hlcyB0aGUgZmlndXJlcyB0aGUgc2FtZSBhbmFseXNpcyBwcm9kdWNlZCBlbHNld2hlcmUpLCBvdGhlcndpc2VcbiAqIHRoZSBwYWxldHRlIGJ5IHBvc2l0aW9uLCB3cmFwcGluZyB0aHJvdWdoIGEgbmFtZS1oYXNoIHBhc3QgaXRzIGVuZCBzbyBhXG4gKiA0MC1jbHVzdGVyIGNvbHVtbiBzdGlsbCBnZXRzIHN0YWJsZSwgZGlzdGluY3QtaXNoIGNvbG91cnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoXG4gIG1ldGE6IENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgcGFsZXR0ZTogc3RyaW5nW10gPSBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGF1dGhvcmVkID0gbWV0YS5jb2xvcnM7XG4gIHJldHVybiBtZXRhLmNhdGVnb3JpZXMubWFwKChuYW1lLCBpKSA9PiB7XG4gICAgY29uc3QgZ2l2ZW4gPSBhdXRob3JlZD8uW2ldO1xuICAgIGlmIChnaXZlbikgcmV0dXJuIGdpdmVuO1xuICAgIGlmIChpIDwgcGFsZXR0ZS5sZW5ndGgpIHJldHVybiBwYWxldHRlW2ldO1xuICAgIHJldHVybiBmYWxsYmFja0NvbG9yRm9yKG5hbWUsIHBhbGV0dGUpO1xuICB9KTtcbn1cblxuLyoqIFRoZSB1c2VyJ3MgZ3JvdXAgY29sb3VyczogYnkgY29sdW1uIG5hbWUsIHRoZW4gY2F0ZWdvcnkgKHNlZSBgU3BhdGlhbFZpZXdTdGF0ZS5ncm91cENvbG9yc2ApLiAqL1xuZXhwb3J0IHR5cGUgR3JvdXBDb2xvck92ZXJyaWRlcyA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+Pj47XG5cbi8qKlxuICogQ2F0ZWdvcmljYWwgY29sdW1uIGBjb2x1bW5gJ3MgY29sb3VycyAoe0BsaW5rIHJlc29sdmVDYXRlZ29yeUNvbG9yc30pIHdpdGggdGhlIHVzZXIncyBjaG9pY2VzXG4gKiBmb3IgaXRzIGdyb3VwcyBvdmVyIHRoZW0uIEV2ZXJ5IHBsYWNlIGEgZ3JvdXBpbmcgaXMgY29sb3VyZWQgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgZ3JvdXBcbiAqIHJlY29sb3VyZWQgaW4gdGhlIGxpc3QgaXMgdGhhdCBjb2xvdXIgb24gdGhlIGNlbGxzLCB0aGUgbWFya2VycywgdGhlIGxlZ2VuZCBhbmQgdGhlIGNoYXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5Q29sb3JzRm9yKFxuICBjb2x1bW46IHN0cmluZyxcbiAgbWV0YTogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBvdmVycmlkZXM/OiBHcm91cENvbG9yT3ZlcnJpZGVzIHwgbnVsbCxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhtZXRhKTtcbiAgY29uc3Qgb3duID0gb3ZlcnJpZGVzPy5bY29sdW1uXTtcbiAgaWYgKCFvd24pIHJldHVybiBiYXNlO1xuICByZXR1cm4gbWV0YS5jYXRlZ29yaWVzLm1hcCgobmFtZSwgaSkgPT4gb3duW25hbWVdIHx8IGJhc2VbaV0pO1xufVxuXG4vKiogV2hhdCBhIGNhY2hlIGtleWVkIG9uIGEgZ3JvdXBpbmcncyBjb2xvdXJzIG11c3QgaW5jbHVkZSBvZiB0aGUgdXNlcidzIGNob2ljZXMgZm9yIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQ29sb3JzS2V5KGNvbHVtbjogc3RyaW5nIHwgbnVsbCwgb3ZlcnJpZGVzPzogR3JvdXBDb2xvck92ZXJyaWRlcyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCBvd24gPSBjb2x1bW4gPyBvdmVycmlkZXM/Lltjb2x1bW5dIDogdW5kZWZpbmVkO1xuICByZXR1cm4gb3duID8gSlNPTi5zdHJpbmdpZnkob3duKSA6ICcnO1xufVxuXG4vKiogQ2F0ZWdvcmljYWwgY29sdW1uIOKGkiBmbGF0IHBlci1wb2ludCBSR0JBIChsZW5ndGggYDQgKiBjb2Rlcy5sZW5ndGhgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDYXRlZ29yaWNhbChjb2RlczogVWludDE2QXJyYXksIG9wdHM6IENhdGVnb3JpY2FsRW5jb2RpbmdPcHRpb25zKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbiA9IGNvZGVzLmxlbmd0aDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShuICogNCk7XG4gIC8vIFJlc29sdmUgZWFjaCBjYXRlZ29yeSBvbmNlIOKAlCBwYXJzaW5nIGEgaGV4IHN0cmluZyBwZXIgcG9pbnQgd291bGQgZG9taW5hdGUuXG4gIGNvbnN0IHJnYiA9IG9wdHMuY29sb3JzLm1hcChwYXJzZUhleCk7XG4gIGNvbnN0IG1pc3NpbmcgPSBvcHRzLm1pc3NpbmdDb2xvciA/PyBNSVNTSU5HX0NPTE9SO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBjb2Rlc1tpXTtcbiAgICBjb25zdCBjID0gY29kZSA9PT0gTk9fQ0FURUdPUlkgfHwgY29kZSA+PSByZ2IubGVuZ3RoID8gbWlzc2luZyA6IHJnYltjb2RlXTtcbiAgICBjb25zdCBvID0gaSAqIDQ7XG4gICAgb3V0W29dID0gY1swXSAvIDI1NTtcbiAgICBvdXRbbyArIDFdID0gY1sxXSAvIDI1NTtcbiAgICBvdXRbbyArIDJdID0gY1syXSAvIDI1NTtcbiAgICAvLyBBIHBvaW50IHdpdGggbm8gY2F0ZWdvcnkgaXMgYmFja2dyb3VuZCBieSBkZWZpbml0aW9uIOKAlCBuZXZlciBlbXBoYXNpc2VkLlxuICAgIG91dFtvICsgM10gPVxuICAgICAgY29kZSA9PT0gTk9fQ0FURUdPUllcbiAgICAgICAgPyBNYXRoLm1pbihhbHBoYUF0KGksIG9wdHMpLCBvcHRzLm11dGVkT3BhY2l0eSA/PyBERUZBVUxUX01VVEVEX09QQUNJVFkpXG4gICAgICAgIDogYWxwaGFBdChpLCBvcHRzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29udGludW91cyBjb2x1bW4gLyBnZW5lIHZlY3RvciDihpIgZmxhdCBwZXItcG9pbnQgUkdCQS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDb250aW51b3VzKHZhbHVlczogRmxvYXQzMkFycmF5LCBvcHRzOiBDb250aW51b3VzRW5jb2RpbmdPcHRpb25zKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIDQpO1xuICBjb25zdCBtaXNzaW5nID0gb3B0cy5taXNzaW5nQ29sb3IgPz8gTUlTU0lOR19DT0xPUjtcbiAgY29uc3QgbHV0ID0gb3B0cy5sdXQ7XG4gIGNvbnN0IGxvID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIG9wdHMubWluKSkgOiBvcHRzLm1pbjtcbiAgY29uc3QgaGkgPSBvcHRzLmxvZyA/IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgb3B0cy5tYXgpKSA6IG9wdHMubWF4O1xuICAvLyBBIGRlZ2VuZXJhdGUgd2luZG93IChhbGwgdmFsdWVzIGVxdWFsKSBtYXBzIGV2ZXJ5dGhpbmcgdG8gdGhlIExVVCBtaWRwb2ludFxuICAvLyByYXRoZXIgdGhhbiBkaXZpZGluZyBieSB6ZXJvLlxuICBjb25zdCBzcGFuID0gaGkgLSBsbztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCByYXcgPSB2YWx1ZXNbaV07XG4gICAgY29uc3QgbyA9IGkgKiA0O1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJhdykpIHtcbiAgICAgIG91dFtvXSA9IG1pc3NpbmdbMF0gLyAyNTU7XG4gICAgICBvdXRbbyArIDFdID0gbWlzc2luZ1sxXSAvIDI1NTtcbiAgICAgIG91dFtvICsgMl0gPSBtaXNzaW5nWzJdIC8gMjU1O1xuICAgICAgb3V0W28gKyAzXSA9IG9wdHMubXV0ZWRPcGFjaXR5ID8/IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ID0gb3B0cy5sb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHJhdykpIDogcmF3O1xuICAgIGNvbnN0IHQgPSBzcGFuID4gMCA/ICh2IC0gbG8pIC8gc3BhbiA6IDAuNTtcbiAgICBjb25zdCBpZHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodCAqIDI1NSkpKTtcbiAgICBjb25zdCBjID0gbHV0W2lkeF0gPz8gbWlzc2luZztcbiAgICBvdXRbb10gPSBjWzBdIC8gMjU1O1xuICAgIG91dFtvICsgMV0gPSBjWzFdIC8gMjU1O1xuICAgIG91dFtvICsgMl0gPSBjWzJdIC8gMjU1O1xuICAgIG91dFtvICsgM10gPSBhbHBoYUF0KGksIG9wdHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udHJhc3Qgd2luZG93IGZyb20gcGVyY2VudGlsZXMgb2YgdGhlIGZpbml0ZSB2YWx1ZXMg4oCUIHRoZSBDb3NNeFxuICogXCJjYXAgb3V0bGllcnMgYXQgcGVyY2VudGlsZXMgdG8gaW1wcm92ZSBjb250cmFzdFwiIHJ1bGUuIGBsb2AvYGhpYCBhcmVcbiAqIGZyYWN0aW9ucyAoMC4wMSAvIDAuOTkgY2xpcHMgdGhlIGV4dHJlbWUgMSUgYXQgZWFjaCBlbmQpLlxuICpcbiAqIFJldHVybnMgYFswLCAxXWAgZm9yIGFuIGVtcHR5IG9yIGFsbC1taXNzaW5nIHZlY3RvciBzbyBjYWxsZXJzIGFsd2F5cyBnZXQgYVxuICogdXNhYmxlIHdpbmRvdy4gQSBsYXJnZSB2ZWN0b3IgaXMgd2luZG93ZWQgZnJvbSBhbiBldmVuIHNhbXBsZSBvZiBpdCDigJQgc2VlXG4gKiBgc3BhdGlhbC9zdGF0cy50c2Ag4oCUIGJlY2F1c2UgdGhpcyBydW5zIG9uIGV2ZXJ5IHJlY29sb3VyLCBhbmQgc29ydGluZyBtaWxsaW9uc1xuICogb2YgdmFsdWVzIGVhY2ggdGltZSBjb3N0IG1vc3Qgb2YgYSBzZWNvbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFdpbmRvdyh2YWx1ZXM6IEZsb2F0MzJBcnJheSwgbG8gPSAwLjAxLCBoaSA9IDAuOTkpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIHBlcmNlbnRpbGVXaW5kb3codmFsdWVzLCBsbywgaGkpO1xufVxuXG4vKipcbiAqIE1hcmtlciBzaXplcyBmb3IgdGhlIHBvaW50cyBsYXllci4gbmFwYXJpLWpzIGBQb2ludHNMYXllci5zaXplYCBpcyBhXG4gKiAqKmRpYW1ldGVyKiogaW4gZGF0YSB1bml0cyB3aGlsZSBgU3BhdGlhbE9ic2VydmF0aW9ucy5yYWRpdXNgIGlzIGEgcmFkaXVzIOKAlFxuICogdGhlIGRvdWJsaW5nIGxpdmVzIGhlcmUgc28gbm8gY2FsbCBzaXRlIGhhcyB0byByZW1lbWJlciBpdC5cbiAqXG4gKiBgZmFsbGJhY2tSYWRpdXNgIGNvdmVycyBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBubyByYWRpdXMgKHNlZ21lbnRlZCBjZWxsc1xuICogb2Z0ZW4gZG9uJ3QpOyBpdCBpcyBpbiBpbWFnZSBwaXhlbHMsIGxpa2UgZXZlcnl0aGluZyBlbHNlIGluIHRoaXMgc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJEaWFtZXRlcnMob2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBmYWxsYmFja1JhZGl1cyA9IDQpOiBudW1iZXIgfCBGbG9hdDMyQXJyYXkge1xuICBjb25zdCByID0gb2JzZXJ2YXRpb25zLnJhZGl1cztcbiAgaWYgKHR5cGVvZiByID09PSAnbnVtYmVyJykgcmV0dXJuIHIgKiAyO1xuICBpZiAociBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoci5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgb3V0W2ldID0gcltpXSAqIDI7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tSYWRpdXMgKiAyO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IGEgMjU2LWVudHJ5IExVVCBmb3IgYSBjb2xvcm1hcCB2YWx1ZSwgZmFsbGluZyBiYWNrIHRvIFZpcmlkaXMuICovXG5leHBvcnQgZnVuY3Rpb24gbHV0Rm9yKGNvbG9ybWFwVmFsdWU6IHVua25vd24sIHJldmVyc2UgPSBmYWxzZSk6IFJnYltdIHtcbiAgcmV0dXJuIGJ1aWxkQ29sb3JtYXBMdXQoY29sb3JtYXBWYWx1ZSwgcmV2ZXJzZSkgPz8gYnVpbGRDb2xvcm1hcEx1dCgnVmlyaWRpcycsIHJldmVyc2UpITtcbn1cblxuLyoqIFRydWUgd2hlbiBldmVyeSBlbnRyeSBvZiBhIExVVCBpcyBhIG5ldXRyYWwgZ3JleS4gVGVzdGVkIG9uIHRoZSBWQUxVRVMgcmF0aGVyXG4gKiAgdGhhbiB0aGUgY29sb3JtYXAncyBuYW1lLCBzbyBhIHJldmVyc2VkIG9yIHJlbmFtZWQgZ3JleSByYW1wIHN0aWxsIGNvdW50cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyYXlzY2FsZUx1dChsdXQ6IHJlYWRvbmx5IFJnYltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBsdXQuZXZlcnkoKFtyLCBnLCBiXSkgPT4gciA9PT0gZyAmJiBnID09PSBiKTtcbn1cblxuLyoqXG4gKiBMVVQgZm9yIGEgc3BhdGlhbCBDT05USU5VT1VTIGVuY29kaW5nIOKAlCBhIGdlbmUsIGEgbnVtZXJpYyBjb2x1bW4uXG4gKlxuICogYG92ZXJyaWRlYCBpcyB0aGUgY2FsbGVyJ3MgZXhwbGljaXQgY2hvaWNlIGFuZCB3aW5zIG91dHJpZ2h0LCBncmV5IGluY2x1ZGVkOiBhXG4gKiBncmV5IHJhbXAgcGlja2VkIEZPUiB0aGUgZGF0YSBpcyBhIGRlY2lzaW9uLCBub3QgdGhlIGltYWdlJ3MgY29sb3JtYXAgbGVha2luZ1xuICogaW4uXG4gKlxuICogV2l0aG91dCBvbmUsIHRoZSBkaXNwbGF5IGNvbG9ybWFwIOKAlCB1bmxlc3MgdGhhdCBjb2xvcm1hcCBpcyBncmF5c2NhbGUuIFRoZVxuICogdGlzc3VlIHVuZGVybmVhdGggaXMgZ3JheXNjYWxlLCBzbyBhIGdyZXkgb3ZlcmxheSBvZiBhIG1lYXN1cmVtZW50IGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBhbmF0b215IGl0IGlzIGRyYXduIG92ZXIsIGFuZCB0aGUgcmVhZGVyIGNhbm5vdCB0ZWxsXG4gKiB3aGljaCBjaGFubmVsIGEgYnJpZ2h0IHBpeGVsIGJlbG9uZ3MgdG8uIFZpcmlkaXMgaXMgdGhlbiB0aGUgZmFsbGJhY2ssIHdoaWNoIGlzXG4gKiB3aGF0IHRoZSBDb3NNeCBndWlkYW5jZSBwcmVzY3JpYmVzIGZvciBjb250aW51b3VzIHZhbHVlcyBhbnl3YXkuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSBtYXJrZXJzLCBib3RoIGdlbmUgbWFwcyBhbmQgdGhlIHBhbmVsJ3MgY29sb3VyIGJhciwgc28gbm9uZSBvZlxuICogdGhlbSBjYW4gZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNvbG91ciBtZWFucywgd2hpY2hldmVyIHdheSB0aGUgY2hvaWNlIGZhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gIGNvbG9ybWFwVmFsdWU6IHVua25vd24sXG4gIHJldmVyc2UgPSBmYWxzZSxcbiAgb3ZlcnJpZGU/OiBDb2xvcm1hcFZhbHVlIHwgbnVsbCxcbik6IFJnYltdIHtcbiAgLy8gQW4gaW5saW5lIHNjYWxlIGlzIGFuIGFycmF5LCBzbyBlbXB0aW5lc3MgaGFzIHRvIGJlIGNoZWNrZWQgYXMgd2VsbCBhc1xuICAvLyBwcmVzZW5jZTogYFtdYCBpcyB0cnV0aHkgYW5kIHdvdWxkIHJlc29sdmUgdG8gdGhlIGZhbGxiYWNrIExVVCBzaWxlbnRseS5cbiAgY29uc3QgY2hvc2VuID0gQXJyYXkuaXNBcnJheShvdmVycmlkZSkgPyAob3ZlcnJpZGUubGVuZ3RoID8gb3ZlcnJpZGUgOiBudWxsKSA6IG92ZXJyaWRlO1xuICBpZiAoY2hvc2VuKSByZXR1cm4gbHV0Rm9yKGNob3NlbiwgcmV2ZXJzZSk7XG4gIGNvbnN0IGx1dCA9IGx1dEZvcihjb2xvcm1hcFZhbHVlLCByZXZlcnNlKTtcbiAgcmV0dXJuIGlzR3JheXNjYWxlTHV0KGx1dCkgPyBidWlsZENvbG9ybWFwTHV0KCdWaXJpZGlzJywgcmV2ZXJzZSkhIDogbHV0O1xufVxuXG4vKipcbiAqIEZhZGUgdGhlIHRyYW5zY3JpcHRzIG91dHNpZGUgYSBzZWxlY3Rpb24sIGFzIHRoZSBjZWxscyBhbmQgbWFya2VycyBhcmU6IHdoaWxlIGBzZWxlY3RlZGAgKGFuXG4gKiBvYnNlcnZhdGlvbiBtYXNrKSBzZWxlY3RzIGFueSBjZWxsLCBldmVyeSBwYWNrZWQtUkdCQSBlbnRyeSBvZiBgcmdiYWAgd2hvc2UgY2VsbCAoYG93bmVyT2YoaSlgKVxuICogaXMgbm90IHNlbGVjdGVkLCBvciB0aGF0IGlzIGluIG5vIGNlbGwsIGhhcyBpdHMgYWxwaGEgc2NhbGVkIHRvIHtAbGluayBERUZBVUxUX01VVEVEX09QQUNJVFl9LlxuICogVGhlIHNlbGVjdGlvbidzIG93biB0cmFuc2NyaXB0cyBrZWVwIHRoZWlyIGNvbG91ci4gTm90aGluZyBjaGFuZ2VzIHdpdGhvdXQgYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWRlT3V0c2lkZVNlbGVjdGlvbihcbiAgcmdiYTogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICBvd25lck9mOiAoaTogbnVtYmVyKSA9PiBudW1iZXIsXG4gIHNlbGVjdGVkOiB7IG1hc2s6IFVpbnQ4QXJyYXk7IGNvdW50OiBudW1iZXIgfSB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKCFzZWxlY3RlZCB8fCBzZWxlY3RlZC5jb3VudCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBtYXNrID0gc2VsZWN0ZWQubWFzaztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbyA9IG93bmVyT2YoaSk7XG4gICAgaWYgKG8gIT09IE5PX09CU0VSVkFUSU9OICYmIG8gPj0gMCAmJiBvIDwgbWFzay5sZW5ndGggJiYgbWFza1tvXSkgY29udGludWU7XG4gICAgcmdiYVs0ICogaSArIDNdICo9IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgfVxufVxuIl19
@@ -48,4 +48,37 @@ export function hoverText(source, index) {
48
48
  const unit = source.unit ? ` ${source.unit}` : '';
49
49
  return [`${formatValue(value)}${unit}`, source.name];
50
50
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ob3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWhvdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJILGdGQUFnRjtBQUNoRixTQUFTLFdBQVcsQ0FBQyxDQUFTO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBMEIsRUFBRSxLQUFhO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSw0QkFBNEI7SUFDNUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoYXQgdG8gc2F5IGFib3V0IHRoZSBvYnNlcnZhdGlvbiB1bmRlciB0aGUgY3Vyc29yLlxuICpcbiAqIEEgY29sb3VyZWQgY2xvdWQgYW5zd2VycyBcImhvdyBpcyB0aGlzIGFubm90YXRpb24gZGlzdHJpYnV0ZWRcIjsgaXQgY2Fubm90IGFuc3dlclxuICogXCJ3aGljaCBjbGFzcyBpcyBUSEFUXCIg4oCUIHRoZSBsZWdlbmQgaGFzIDM0IGVudHJpZXMsIHNldmVyYWwgb2YgdGhlbSBzaW1pbGFyXG4gKiBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgYSBkb3QgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgYSB0b29sdGlwXG4gKiBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIFB1cmUg4oCUIG5vIERPTSwgbm8gY2FtZXJhLCBubyBkYXRhIGFjY2Vzcy4gRmluZGluZyB0aGUgb2JzZXJ2YXRpb24gaXMgdGhlXG4gKiByZW5kZXJlcidzIChuYXBhcmktanMgcGlja3Mgb24gdGhlIGxheWVycyBpdCBkcmV3KTsgdGhpcyBpcyBzdHJpbmcgZm9ybWF0dGluZ1xuICogb3ZlciB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UsIHNvIGl0IGlzIHRlc3RlZCBkaXJlY3RseS5cbiAqL1xuXG4vKiogVGhlIGNvbG91ciBzb3VyY2UgYSB0b29sdGlwIGRlc2NyaWJlcywgYXMgdGhlIHJlbmRlcmVyIGFscmVhZHkgaGFzIGl0LiAqL1xuZXhwb3J0IHR5cGUgSG92ZXJTb3VyY2UgPVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCc7XG4gICAgICAvKiogQ29sdW1uIG5hbWUsIGZvciB0aGUgdG9vbHRpcCdzIGZpcnN0IGxpbmUuICovXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yaWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICAgIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gICAgICBjb2RlczogVWludDE2QXJyYXk7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjb250aW51b3VzJztcbiAgICAgIC8qKiBDb2x1bW4gb3IgZ2VuZSBuYW1lLiAqL1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICAvKiogVW5pdCBmb3IgdGhlIHZhbHVlLCB3aGVuIHRoZSBkYXRhc2V0IGRlY2xhcmVzIG9uZS4gKi9cbiAgICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgfTtcblxuLyoqIEEgbnVtYmVyIGZvciBhIHRvb2x0aXA6IGVub3VnaCBkaWdpdHMgdG8gZGlzdGluZ3Vpc2gsIGZldyBlbm91Z2ggdG8gcmVhZC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKHY6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7XG4gIGlmICh2ID09PSAwKSByZXR1cm4gJzAnO1xuICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLmFicyh2KTtcbiAgaWYgKG1hZ25pdHVkZSA+PSAxMDAwIHx8IG1hZ25pdHVkZSA8IDAuMDEpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoMik7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMCk7XG59XG5cbi8qKlxuICogVGhlIHRvb2x0aXAncyBsaW5lcyBmb3Igb25lIG9ic2VydmF0aW9uOiB3aGF0IGl0IGlzLCB0aGVuIHdoaWNoIGNvbHVtbiBzYWlkIHNvLlxuICpcbiAqIE51bGwgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBkZXNjcmliZSB0aGlzIG9ic2VydmF0aW9uIOKAlCBhIGNvZGUgb3V0c2lkZSB0aGVcbiAqIGNhdGVnb3J5IGxpc3QsIG9yIGEgdmFsdWUgdGhhdCB3YXMgbmV2ZXIgbWVhc3VyZWQuIFNheWluZyBub3RoaW5nIGlzIGJldHRlclxuICogdGhhbiBhIHRvb2x0aXAgdGhhdCByZWFkcyBcInVuZGVmaW5lZFwiLCBhbmQgYmV0dGVyIHRoYW4gaW52ZW50aW5nIGEgbGFiZWwgZm9yIGFcbiAqIGNlbGwgd2hvc2UgYW5ub3RhdGlvbiBpcyBnZW51aW5lbHkgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdmVyVGV4dChzb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghc291cmNlIHx8IGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGlmIChzb3VyY2Uua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXM/LltpbmRleF07XG4gICAgY29uc3QgbGFiZWwgPSBjb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzb3VyY2UuY2F0ZWdvcmllcz8uW2NvZGVdO1xuICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gW2xhYmVsLCBzb3VyY2UubmFtZV07XG4gIH1cbiAgLy8gR3VhcmRlZCByYXRoZXIgdGhhbiBpbmRleGVkIHN0cmFpZ2h0OiB0aGlzIHJ1bnMgZnJvbSBhIHBvaW50ZXJtb3ZlIGhhbmRsZXIsXG4gIC8vIHNvIGEgbWFsZm9ybWVkIHNvdXJjZSB3b3VsZCB0aHJvdyBvbiBldmVyeSBtb3VzZSBtb3ZlbWVudCDigJQgZmFyIHdvcnNlIHRoYW4gYVxuICAvLyB0b29sdGlwIHRoYXQgc3RheXMgcXVpZXQuXG4gIGNvbnN0IHZhbHVlID0gc291cmNlLnZhbHVlcz8uW2luZGV4XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICBjb25zdCB1bml0ID0gc291cmNlLnVuaXQgPyBgICR7c291cmNlLnVuaXR9YCA6ICcnO1xuICByZXR1cm4gW2Ake2Zvcm1hdFZhbHVlKHZhbHVlKX0ke3VuaXR9YCwgc291cmNlLm5hbWVdO1xufVxuIl19
51
+ /** The tooltip of cell `index`: its type, its id, the colouring's value (when not the type), measurements. */
52
+ export function cellText(info, index, color) {
53
+ if (!info || index < 0)
54
+ return null;
55
+ const code = info.codes?.[index];
56
+ const type = code === undefined ? undefined : info.categories[code];
57
+ const lines = [
58
+ type ?? 'Cell',
59
+ info.ids?.[index] !== undefined ? `Cell ${info.ids[index]}` : `Cell #${index + 1}`,
60
+ ];
61
+ if (color && color.name !== info.typeName) {
62
+ const said = hoverText(color, index);
63
+ if (said)
64
+ lines.push(`${said[1]}: ${said[0]}`);
65
+ }
66
+ for (const m of info.measures) {
67
+ if (m.name === color?.name)
68
+ continue;
69
+ const v = m.values[index];
70
+ if (v !== undefined && Number.isFinite(v))
71
+ lines.push(`${m.name}: ${formatValue(v)}${m.unit ? ` ${m.unit}` : ''}`);
72
+ }
73
+ return lines;
74
+ }
75
+ /** The tooltip of a cell type's surface: its name (and title), and how many cells it has. */
76
+ export function cellTypeText(info, key, label) {
77
+ const lines = [label ?? key];
78
+ const code = info ? info.categories.indexOf(key) : -1;
79
+ const n = code >= 0 ? info?.counts?.[code] : undefined;
80
+ if (n !== undefined)
81
+ lines.push(`${n.toLocaleString()} cells${info?.typeName ? ` · ${info.typeName}` : ''}`);
82
+ return lines;
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ob3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLWhvdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJILGdGQUFnRjtBQUNoRixTQUFTLFdBQVcsQ0FBQyxDQUFTO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBMEIsRUFBRSxLQUFhO0lBQ2pFLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxL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QUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RCxJQUFJLENBQUMsS0FBSyxTQUFTO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoYXQgdG8gc2F5IGFib3V0IHRoZSBvYnNlcnZhdGlvbiB1bmRlciB0aGUgY3Vyc29yLlxuICpcbiAqIEEgY29sb3VyZWQgY2xvdWQgYW5zd2VycyBcImhvdyBpcyB0aGlzIGFubm90YXRpb24gZGlzdHJpYnV0ZWRcIjsgaXQgY2Fubm90IGFuc3dlclxuICogXCJ3aGljaCBjbGFzcyBpcyBUSEFUXCIg4oCUIHRoZSBsZWdlbmQgaGFzIDM0IGVudHJpZXMsIHNldmVyYWwgb2YgdGhlbSBzaW1pbGFyXG4gKiBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgYSBkb3QgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgYSB0b29sdGlwXG4gKiBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIFB1cmUg4oCUIG5vIERPTSwgbm8gY2FtZXJhLCBubyBkYXRhIGFjY2Vzcy4gRmluZGluZyB0aGUgb2JzZXJ2YXRpb24gaXMgdGhlXG4gKiByZW5kZXJlcidzIChuYXBhcmktanMgcGlja3Mgb24gdGhlIGxheWVycyBpdCBkcmV3KTsgdGhpcyBpcyBzdHJpbmcgZm9ybWF0dGluZ1xuICogb3ZlciB0aGUgYWN0aXZlIGNvbG91ciBzb3VyY2UsIHNvIGl0IGlzIHRlc3RlZCBkaXJlY3RseS5cbiAqL1xuXG4vKiogVGhlIGNvbG91ciBzb3VyY2UgYSB0b29sdGlwIGRlc2NyaWJlcywgYXMgdGhlIHJlbmRlcmVyIGFscmVhZHkgaGFzIGl0LiAqL1xuZXhwb3J0IHR5cGUgSG92ZXJTb3VyY2UgPVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCc7XG4gICAgICAvKiogQ29sdW1uIG5hbWUsIGZvciB0aGUgdG9vbHRpcCdzIGZpcnN0IGxpbmUuICovXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjYXRlZ29yaWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICAgIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gICAgICBjb2RlczogVWludDE2QXJyYXk7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdjb250aW51b3VzJztcbiAgICAgIC8qKiBDb2x1bW4gb3IgZ2VuZSBuYW1lLiAqL1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICAvKiogVW5pdCBmb3IgdGhlIHZhbHVlLCB3aGVuIHRoZSBkYXRhc2V0IGRlY2xhcmVzIG9uZS4gKi9cbiAgICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgfTtcblxuLyoqIEEgbnVtYmVyIGZvciBhIHRvb2x0aXA6IGVub3VnaCBkaWdpdHMgdG8gZGlzdGluZ3Vpc2gsIGZldyBlbm91Z2ggdG8gcmVhZC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKHY6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7XG4gIGlmICh2ID09PSAwKSByZXR1cm4gJzAnO1xuICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLmFicyh2KTtcbiAgaWYgKG1hZ25pdHVkZSA+PSAxMDAwIHx8IG1hZ25pdHVkZSA8IDAuMDEpIHJldHVybiB2LnRvRXhwb25lbnRpYWwoMik7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5yb3VuZCh2ICogMTAwKSAvIDEwMCk7XG59XG5cbi8qKlxuICogVGhlIHRvb2x0aXAncyBsaW5lcyBmb3Igb25lIG9ic2VydmF0aW9uOiB3aGF0IGl0IGlzLCB0aGVuIHdoaWNoIGNvbHVtbiBzYWlkIHNvLlxuICpcbiAqIE51bGwgd2hlbiB0aGUgc291cmNlIGNhbm5vdCBkZXNjcmliZSB0aGlzIG9ic2VydmF0aW9uIOKAlCBhIGNvZGUgb3V0c2lkZSB0aGVcbiAqIGNhdGVnb3J5IGxpc3QsIG9yIGEgdmFsdWUgdGhhdCB3YXMgbmV2ZXIgbWVhc3VyZWQuIFNheWluZyBub3RoaW5nIGlzIGJldHRlclxuICogdGhhbiBhIHRvb2x0aXAgdGhhdCByZWFkcyBcInVuZGVmaW5lZFwiLCBhbmQgYmV0dGVyIHRoYW4gaW52ZW50aW5nIGEgbGFiZWwgZm9yIGFcbiAqIGNlbGwgd2hvc2UgYW5ub3RhdGlvbiBpcyBnZW51aW5lbHkgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvdmVyVGV4dChzb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghc291cmNlIHx8IGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gIGlmIChzb3VyY2Uua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgIGNvbnN0IGNvZGUgPSBzb3VyY2UuY29kZXM/LltpbmRleF07XG4gICAgY29uc3QgbGFiZWwgPSBjb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzb3VyY2UuY2F0ZWdvcmllcz8uW2NvZGVdO1xuICAgIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gW2xhYmVsLCBzb3VyY2UubmFtZV07XG4gIH1cbiAgLy8gR3VhcmRlZCByYXRoZXIgdGhhbiBpbmRleGVkIHN0cmFpZ2h0OiB0aGlzIHJ1bnMgZnJvbSBhIHBvaW50ZXJtb3ZlIGhhbmRsZXIsXG4gIC8vIHNvIGEgbWFsZm9ybWVkIHNvdXJjZSB3b3VsZCB0aHJvdyBvbiBldmVyeSBtb3VzZSBtb3ZlbWVudCDigJQgZmFyIHdvcnNlIHRoYW4gYVxuICAvLyB0b29sdGlwIHRoYXQgc3RheXMgcXVpZXQuXG4gIGNvbnN0IHZhbHVlID0gc291cmNlLnZhbHVlcz8uW2luZGV4XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICBjb25zdCB1bml0ID0gc291cmNlLnVuaXQgPyBgICR7c291cmNlLnVuaXR9YCA6ICcnO1xuICByZXR1cm4gW2Ake2Zvcm1hdFZhbHVlKHZhbHVlKX0ke3VuaXR9YCwgc291cmNlLm5hbWVdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIDNEIHZpZXcgc2F5cyBvZiBhIGNlbGwgdW5kZXIgdGhlIHBvaW50ZXIgKGEgM0Qgc2VnbWVudGF0aW9uJ3MsIGRyYXduIGJ5IGl0c2VsZiBvciBhc1xuICogaXRzIHR5cGUncyBzdXJmYWNlKTogaXRzIHR5cGUgKHRoZSBjZWxsLXR5cGUgY29sdW1uKSwgaXRzIGlkLCBhbmQgYSBmZXcgb2YgaXRzIG1lYXN1cmVtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZWxsSW5mbyB7XG4gIC8qKiBUaGUgY2VsbC10eXBlIGNvbHVtbiwgaXRzIGNhdGVnb3JpZXMgYW5kIGVhY2ggb2JzZXJ2YXRpb24ncyBjb2RlIChudWxsIHdpdGhvdXQgb25lKS4gKi9cbiAgdHlwZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGNhdGVnb3JpZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBjb2RlczogVWludDE2QXJyYXkgfCBudWxsO1xuICAvKiogQ2VsbHMgcGVyIGNhdGVnb3J5LCBieSBjb2RlLiAqL1xuICBjb3VudHM6IFVpbnQzMkFycmF5IHwgbnVsbDtcbiAgaWRzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBNZWFzdXJlbWVudHMgc2hvd24gKHRoZSBkYXRhc2V0J3MgY29udGludW91cyBjb2x1bW5zLCBhIGZldykuICovXG4gIG1lYXN1cmVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdmFsdWVzOiBGbG9hdDMyQXJyYXk7IHVuaXQ/OiBzdHJpbmcgfVtdO1xufVxuXG4vKiogVGhlIHRvb2x0aXAgb2YgY2VsbCBgaW5kZXhgOiBpdHMgdHlwZSwgaXRzIGlkLCB0aGUgY29sb3VyaW5nJ3MgdmFsdWUgKHdoZW4gbm90IHRoZSB0eXBlKSwgbWVhc3VyZW1lbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlbGxUZXh0KGluZm86IENlbGxJbmZvIHwgbnVsbCwgaW5kZXg6IG51bWJlciwgY29sb3I6IEhvdmVyU291cmNlIHwgbnVsbCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGlmICghaW5mbyB8fCBpbmRleCA8IDApIHJldHVybiBudWxsO1xuICBjb25zdCBjb2RlID0gaW5mby5jb2Rlcz8uW2luZGV4XTtcbiAgY29uc3QgdHlwZSA9IGNvZGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGluZm8uY2F0ZWdvcmllc1tjb2RlXTtcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgdHlwZSA/PyAnQ2VsbCcsXG4gICAgaW5mby5pZHM/LltpbmRleF0gIT09IHVuZGVmaW5lZCA/IGBDZWxsICR7aW5mby5pZHNbaW5kZXhdfWAgOiBgQ2VsbCAjJHtpbmRleCArIDF9YCxcbiAgXTtcbiAgaWYgKGNvbG9yICYmIGNvbG9yLm5hbWUgIT09IGluZm8udHlwZU5hbWUpIHtcbiAgICBjb25zdCBzYWlkID0gaG92ZXJUZXh0KGNvbG9yLCBpbmRleCk7XG4gICAgaWYgKHNhaWQpIGxpbmVzLnB1c2goYCR7c2FpZFsxXX06ICR7c2FpZFswXX1gKTtcbiAgfVxuICBmb3IgKGNvbnN0IG0gb2YgaW5mby5tZWFzdXJlcykge1xuICAgIGlmIChtLm5hbWUgPT09IGNvbG9yPy5uYW1lKSBjb250aW51ZTtcbiAgICBjb25zdCB2ID0gbS52YWx1ZXNbaW5kZXhdO1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICAgbGluZXMucHVzaChgJHttLm5hbWV9OiAke2Zvcm1hdFZhbHVlKHYpfSR7bS51bml0ID8gYCAke20udW5pdH1gIDogJyd9YCk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vKiogVGhlIHRvb2x0aXAgb2YgYSBjZWxsIHR5cGUncyBzdXJmYWNlOiBpdHMgbmFtZSAoYW5kIHRpdGxlKSwgYW5kIGhvdyBtYW55IGNlbGxzIGl0IGhhcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsVHlwZVRleHQoaW5mbzogQ2VsbEluZm8gfCBudWxsLCBrZXk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbmVzID0gW2xhYmVsID8/IGtleV07XG4gIGNvbnN0IGNvZGUgPSBpbmZvID8gaW5mby5jYXRlZ29yaWVzLmluZGV4T2Yoa2V5KSA6IC0xO1xuICBjb25zdCBuID0gY29kZSA+PSAwID8gaW5mbz8uY291bnRzPy5bY29kZV0gOiB1bmRlZmluZWQ7XG4gIGlmIChuICE9PSB1bmRlZmluZWQpIGxpbmVzLnB1c2goYCR7bi50b0xvY2FsZVN0cmluZygpfSBjZWxscyR7aW5mbz8udHlwZU5hbWUgPyBgIMK3ICR7aW5mby50eXBlTmFtZX1gIDogJyd9YCk7XG4gIHJldHVybiBsaW5lcztcbn1cbiJdfQ==
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The planes a spatial dataset's region set was outlined on (its `sliceZ`, in observation units,
3
+ * one per slice in slice order), as the 2D view slices them over an image of one plane: plane `k`
4
+ * holds whatever lies nearer to it than to its neighbours, so each z belongs to exactly one plane
5
+ * and the planes together hold the whole depth.
6
+ *
7
+ * Pure, like `spatial-sections.ts` (which offers a sectioned dataset's own z values; these are the
8
+ * planes its segmentation was imaged at).
9
+ */
10
+ /**
11
+ * The z band of plane `k`: from halfway to the plane before to halfway to the one after (open
12
+ * ended past the first and the last). The planes may run either way; `[lo, hi)` comes out ordered.
13
+ */
14
+ export function planeBand(planes, k) {
15
+ const n = planes.length;
16
+ if (!n)
17
+ return [-Infinity, Infinity];
18
+ const i = Math.max(0, Math.min(n - 1, k));
19
+ const z = planes[i];
20
+ const before = i > 0 ? (planes[i - 1] + z) / 2 : null;
21
+ const after = i < n - 1 ? (z + planes[i + 1]) / 2 : null;
22
+ // Ascending planes: the one before is below. Descending: above.
23
+ const ascending = n < 2 || planes[n - 1] >= planes[0];
24
+ const lo = ascending ? before : after;
25
+ const hi = ascending ? after : before;
26
+ return [lo ?? -Infinity, hi ?? Infinity];
27
+ }
28
+ /** Whether `z` lies in `band` (`[lo, hi)`; a non-finite z lies in none). */
29
+ export function inBand(z, band) {
30
+ return Number.isFinite(z) && z >= band[0] && z < band[1];
31
+ }
32
+ /**
33
+ * Indices of the observations on plane `k` (see {@link planeBand}). Every observation is when the
34
+ * dataset carries no z: a flat dataset has nothing to slice.
35
+ */
36
+ export function observationsOnPlane(obs, planes, k) {
37
+ const z = obs.z;
38
+ if (!z)
39
+ return Uint32Array.from({ length: obs.count }, (_, i) => i);
40
+ const band = planeBand(planes, k);
41
+ const out = new Uint32Array(obs.count);
42
+ let n = 0;
43
+ for (let i = 0; i < obs.count; i++) {
44
+ if (inBand(z[i], band))
45
+ out[n++] = i;
46
+ }
47
+ return out.subarray(0, n);
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1wbGFuZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1wbGFuZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQXlCLEVBQUUsQ0FBUztJQUM1RCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RCxnRUFBZ0U7SUFDaEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQVMsRUFBRSxJQUErQjtJQUMvRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBd0IsRUFBRSxNQUF5QixFQUFFLENBQVM7SUFDaEcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGUgcGxhbmVzIGEgc3BhdGlhbCBkYXRhc2V0J3MgcmVnaW9uIHNldCB3YXMgb3V0bGluZWQgb24gKGl0cyBgc2xpY2VaYCwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsXG4gKiBvbmUgcGVyIHNsaWNlIGluIHNsaWNlIG9yZGVyKSwgYXMgdGhlIDJEIHZpZXcgc2xpY2VzIHRoZW0gb3ZlciBhbiBpbWFnZSBvZiBvbmUgcGxhbmU6IHBsYW5lIGBrYFxuICogaG9sZHMgd2hhdGV2ZXIgbGllcyBuZWFyZXIgdG8gaXQgdGhhbiB0byBpdHMgbmVpZ2hib3Vycywgc28gZWFjaCB6IGJlbG9uZ3MgdG8gZXhhY3RseSBvbmUgcGxhbmVcbiAqIGFuZCB0aGUgcGxhbmVzIHRvZ2V0aGVyIGhvbGQgdGhlIHdob2xlIGRlcHRoLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtc2VjdGlvbnMudHNgICh3aGljaCBvZmZlcnMgYSBzZWN0aW9uZWQgZGF0YXNldCdzIG93biB6IHZhbHVlczsgdGhlc2UgYXJlIHRoZVxuICogcGxhbmVzIGl0cyBzZWdtZW50YXRpb24gd2FzIGltYWdlZCBhdCkuXG4gKi9cblxuLyoqXG4gKiBUaGUgeiBiYW5kIG9mIHBsYW5lIGBrYDogZnJvbSBoYWxmd2F5IHRvIHRoZSBwbGFuZSBiZWZvcmUgdG8gaGFsZndheSB0byB0aGUgb25lIGFmdGVyIChvcGVuXG4gKiBlbmRlZCBwYXN0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QpLiBUaGUgcGxhbmVzIG1heSBydW4gZWl0aGVyIHdheTsgYFtsbywgaGkpYCBjb21lcyBvdXQgb3JkZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5lQmFuZChwbGFuZXM6IHJlYWRvbmx5IG51bWJlcltdLCBrOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgbiA9IHBsYW5lcy5sZW5ndGg7XG4gIGlmICghbikgcmV0dXJuIFstSW5maW5pdHksIEluZmluaXR5XTtcbiAgY29uc3QgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBrKSk7XG4gIGNvbnN0IHogPSBwbGFuZXNbaV07XG4gIGNvbnN0IGJlZm9yZSA9IGkgPiAwID8gKHBsYW5lc1tpIC0gMV0gKyB6KSAvIDIgOiBudWxsO1xuICBjb25zdCBhZnRlciA9IGkgPCBuIC0gMSA/ICh6ICsgcGxhbmVzW2kgKyAxXSkgLyAyIDogbnVsbDtcbiAgLy8gQXNjZW5kaW5nIHBsYW5lczogdGhlIG9uZSBiZWZvcmUgaXMgYmVsb3cuIERlc2NlbmRpbmc6IGFib3ZlLlxuICBjb25zdCBhc2NlbmRpbmcgPSBuIDwgMiB8fCBwbGFuZXNbbiAtIDFdID49IHBsYW5lc1swXTtcbiAgY29uc3QgbG8gPSBhc2NlbmRpbmcgPyBiZWZvcmUgOiBhZnRlcjtcbiAgY29uc3QgaGkgPSBhc2NlbmRpbmcgPyBhZnRlciA6IGJlZm9yZTtcbiAgcmV0dXJuIFtsbyA/PyAtSW5maW5pdHksIGhpID8/IEluZmluaXR5XTtcbn1cblxuLyoqIFdoZXRoZXIgYHpgIGxpZXMgaW4gYGJhbmRgIChgW2xvLCBoaSlgOyBhIG5vbi1maW5pdGUgeiBsaWVzIGluIG5vbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluQmFuZCh6OiBudW1iZXIsIGJhbmQ6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh6KSAmJiB6ID49IGJhbmRbMF0gJiYgeiA8IGJhbmRbMV07XG59XG5cbi8qKlxuICogSW5kaWNlcyBvZiB0aGUgb2JzZXJ2YXRpb25zIG9uIHBsYW5lIGBrYCAoc2VlIHtAbGluayBwbGFuZUJhbmR9KS4gRXZlcnkgb2JzZXJ2YXRpb24gaXMgd2hlbiB0aGVcbiAqIGRhdGFzZXQgY2FycmllcyBubyB6OiBhIGZsYXQgZGF0YXNldCBoYXMgbm90aGluZyB0byBzbGljZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmF0aW9uc09uUGxhbmUob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBwbGFuZXM6IHJlYWRvbmx5IG51bWJlcltdLCBrOiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IHogPSBvYnMuejtcbiAgaWYgKCF6KSByZXR1cm4gVWludDMyQXJyYXkuZnJvbSh7IGxlbmd0aDogb2JzLmNvdW50IH0sIChfLCBpKSA9PiBpKTtcbiAgY29uc3QgYmFuZCA9IHBsYW5lQmFuZChwbGFuZXMsIGspO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkob2JzLmNvdW50KTtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9icy5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGluQmFuZCh6W2ldLCBiYW5kKSkgb3V0W24rK10gPSBpO1xuICB9XG4gIHJldHVybiBvdXQuc3ViYXJyYXkoMCwgbik7XG59XG4iXX0=
@@ -43,7 +43,7 @@ export function mutedFromSelection(selection) {
43
43
  export function pointInRing(xs, ys, px, py) {
44
44
  return ringContainsPoint(px, py, xs, ys);
45
45
  }
46
- function inBounds(b, px, py) {
46
+ export function inBounds(b, px, py) {
47
47
  return px >= b.minX && px <= b.maxX && py >= b.minY && py <= b.maxY;
48
48
  }
49
49
  /** Polygon-with-holes: inside the exterior and outside every hole. */
@@ -317,4 +317,4 @@ export function selectByCategory(codes, code) {
317
317
  }
318
318
  return { mask, count };
319
319
  }
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVB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TSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdFLE1BQU0sS0FB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QUFDLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBmaWxsT3V0bGluZXMgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyBSaW5nQm91bmRzIGFzIEJvdW5kcywgcG9pbnRJblJpbmcgYXMgcmluZ0NvbnRhaW5zUG9pbnQsIHJpbmdCb3VuZHMgfSBmcm9tICcuLi9nZW9tZXRyeS9yaW5nJztcbmltcG9ydCB7XG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxWb2x1bWVNZXRhLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBXaGljaCBvYnNlcnZhdGlvbnMgZmFsbCBpbnNpZGUgYSBzZXQgb2YgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBQdXJlLCBsaWtlIGBzcGF0aWFsLWVuY29kaW5nLnRzYCDigJQgbm8gc3RvcmUsIG5vIHJlbmRlcmVyIOKAlCBzbyB0aGUgZ2VvbWV0cnkgaXNcbiAqIHRlc3RhYmxlIG9uIGl0cyBvd24uXG4gKlxuICogV0hZIFRISVMgSVMgVEhFIFdIT0xFIFNFTEVDVElPTiBNRUNIQU5JU01cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFscmVhZHkgY29tZSBmcm9tIGV2ZXJ5IG9uLWNhbnZhcyB0b29sIHRoZSBsaWJyYXJ5IGhhczogcmVjdGFuZ2xlLFxuICogcG9seWdvbiwgZnJlZWhhbmQsIG1hZ2ljIHdhbmQsIGJydXNoLiBUZXN0aW5nIG9ic2VydmF0aW9ucyBhZ2FpbnN0IHRoZW0gdHVybnNcbiAqIGFsbCBvZiB0aG9zZSBpbnRvIHNwYXRpYWwtb21pY3Mgc2VsZWN0aW9uIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGEgc2luZ2xlIG5ld1xuICogY2FudmFzIGludGVyYWN0aW9uIOKAlCB3aGljaCBpcyB3aHkgdGhlcmUgaXMgbm8gYmVzcG9rZSBtYXJxdWVlIGhlcmUuXG4gKlxuICogQ09PUkRJTkFURSBGUkFNRVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFyZSBkcmF3biBpbiBXT1JMRCAoaW1hZ2UpIGNvb3JkaW5hdGVzLiBPYnNlcnZhdGlvbnMgbGl2ZSBpbiB0aGVcbiAqIGRhdGFzZXQncyBvd24gZnJhbWUgYW5kIHJlYWNoIHRoZSB3b3JsZCB0aHJvdWdoIGBpbWFnZVJlZmAg4oCUIHNvIHRoZXkgYXJlXG4gKiB0cmFuc2Zvcm1lZCBmb3J3YXJkIGJlZm9yZSB0ZXN0aW5nLCBtYXRjaGluZyBleGFjdGx5IHdoYXQgdGhlIHJlbmRlcmVyIGRyYXdzLlxuICovXG5cbi8qKiBNb3ZlZCB0byB0aGUgZGF0YXNldCBjb250cmFjdCAoYSBwdXJlIGRhdGEgdHlwZSk7IHJlLWV4cG9ydGVkIGhlcmUgZm9yIGV4aXN0aW5nIGltcG9ydGVycy4gKi9cbmV4cG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfTtcblxuLyoqIEFuIGVtcHR5IHNlbGVjdGlvbiBvdmVyIGBjb3VudGAgb2JzZXJ2YXRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U2VsZWN0aW9uKGNvdW50ID0gMCk6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkoY291bnQpLCBjb3VudDogMCB9O1xufVxuXG4vKiogTnVtYmVyIG9mIHNldCBlbnRyaWVzIGluIGEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE1hc2sobWFzazogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgbisrO1xuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlbGVjdGVkIGluZGljZXMsIGZvciBleHBvcnQgb3IgYSBkb3duc3RyZWFtIHF1ZXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0luZGljZXMobWFzazogVWludDhBcnJheSk6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KGNvdW50TWFzayhtYXNrKSk7XG4gIGxldCBhdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFzay5sZW5ndGg7IGkrKykgaWYgKG1hc2tbaV0pIG91dFthdCsrXSA9IGk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVuZGVyZXItZmFjaW5nIGludmVyc2U6IHdoaWNoIG9ic2VydmF0aW9ucyB0byBNVVRFLiBXaXRoIG5vdGhpbmcgc2VsZWN0ZWRcbiAqIG5vdGhpbmcgaXMgbXV0ZWQgKHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkpOyB3aXRoIGEgc2VsZWN0aW9uLCBldmVyeVxuICogdW5zZWxlY3RlZCBvYnNlcnZhdGlvbiBpcyBtdXRlZCDigJQgdGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKHNlbGVjdGlvbi5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG11dGVkID0gbmV3IFVpbnQ4QXJyYXkoc2VsZWN0aW9uLm1hc2subGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRlZC5sZW5ndGg7IGkrKykgbXV0ZWRbaV0gPSBzZWxlY3Rpb24ubWFza1tpXSA/IDAgOiAxO1xuICByZXR1cm4gbXV0ZWQ7XG59XG5cbi8qKlxuICogRXZlbi1vZGQgcmF5IGNhc3Q6IGlzIChweCwgcHkpIGluc2lkZSB0aGUgY2xvc2VkIHJpbmcgeHMveXM/XG4gKlxuICogUHVibGljIEFQSSBrZXB0IHdpdGggaXRzIChyaW5nLCBwb2ludCkgYXJndW1lbnQgb3JkZXI7IHRoZSB0ZXN0IGl0c2VsZiBpc1xuICogdGhlIHNoYXJlZCBgZ2VvbWV0cnkvcmluZ2Agb25lIHRoZSByZWdpb24gb3ZlcmxheXMgYW5kIHRvb2xzIHVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiByaW5nQ29udGFpbnNQb2ludChweCwgcHksIHhzLCB5cyk7XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZSh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgaG9sZXM/OiBudW1iZXJbXVtdW10pOiBTaGFwZSB8IG51bGwge1xuICBpZiAoeHMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJvdW5kcyA9IHJpbmdCb3VuZHMoeHMsIHlzKTtcbiAgLy8gU3BsaXQgYW5kIGJvdW5kZWQgT05DRSBwZXIgc2hhcGU6IHRoZSBoaXQgdGVzdCBydW5zIGZvciBldmVyeSBjYW5kaWRhdGUgcG9pbnRcbiAgLy8gaW5zaWRlIHRoZSBleHRlcmlvciDigJQgdXAgdG8gbWlsbGlvbnMgb2YgY2VsbHMgcGVyIHNlbGVjdGlvbi5cbiAgY29uc3QgaG9sZVJpbmdzID0gKGhvbGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHJpbmcpID0+IHJpbmcubGVuZ3RoID49IDMpXG4gICAgLm1hcCgocmluZykgPT4ge1xuICAgICAgY29uc3QgaHggPSByaW5nLm1hcCgocCkgPT4gcFswXSk7XG4gICAgICBjb25zdCBoeSA9IHJpbmcubWFwKChwKSA9PiBwWzFdKTtcbiAgICAgIHJldHVybiB7IHhzOiBoeCwgeXM6IGh5LCBib3VuZHM6IHJpbmdCb3VuZHMoaHgsIGh5KSB9O1xuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIGJvdW5kcyxcbiAgICBoaXQ6IChweCwgcHkpID0+IHtcbiAgICAgIGlmICghcG9pbnRJblJpbmcoeHMsIHlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgcmVnaW9uIG1vZGVsIGlzIGV4cGxpY2l0OiBhIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgQU5EIGluc2lkZSBhXG4gICAgICAvLyBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvbi5cbiAgICAgIGZvciAoY29uc3QgaG9sZSBvZiBob2xlUmluZ3MpIHtcbiAgICAgICAgaWYgKGluQm91bmRzKGhvbGUuYm91bmRzLCBweCwgcHkpICYmIHBvaW50SW5SaW5nKGhvbGUueHMsIGhvbGUueXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhc1xuICAgIHwge1xuICAgICAgICB4PzogbnVtYmVyO1xuICAgICAgICB5PzogbnVtYmVyO1xuICAgICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgY2xvc2VkPzogYm9vbGVhbjtcbiAgICAgICAgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgICAgIHBvbHlnb25zPzogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW107IGNsb3NlZD86IGJvb2xlYW47IGhvbGVzPzogbnVtYmVyW11bXVtdIH1bXTtcbiAgICAgIH1cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSksXG4gICAgKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiLnhwb2ludHMpKSB7XG4gICAgaWYgKGIuY2xvc2VkID09PSBmYWxzZSkgcmV0dXJuIFtdOyAvLyBvcGVuIHBvbHlsaW5lIGVuY2xvc2VzIG5vdGhpbmdcbiAgICBjb25zdCBzaGFwZSA9IHBvbHlnb25TaGFwZShiLnhwb2ludHMsIGIueXBvaW50cyA/PyBbXSwgYi5ob2xlcyk7XG4gICAgcmV0dXJuIHNoYXBlID8gW3NoYXBlXSA6IFtdO1xuICB9XG4gIGlmICh0eXBlb2YgYi53aWR0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGIuaGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHggPSBiLnggPz8gMDtcbiAgICBjb25zdCB5ID0gYi55ID8/IDA7XG4gICAgLy8gTm9ybWFsaXNlIGEgcmVjdGFuZ2xlIGRyYWdnZWQgcmlnaHQtdG8tbGVmdCAvIGJvdHRvbS10by10b3AuXG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGlmIChtYXhYID09PSBtaW5YIHx8IG1heFkgPT09IG1pblkpIHJldHVybiBbXTtcbiAgICBjb25zdCBib3VuZHMgPSB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfTtcbiAgICByZXR1cm4gW3sgYm91bmRzLCBoaXQ6IChweCwgcHkpID0+IGluQm91bmRzKGJvdW5kcywgcHgsIHB5KSB9XTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIG9ic2VydmF0aW9uIGluZGljZXMuXG4gKlxuICogV2hhdCBhIGxhc3NvIGluIGEgbGlua2VkIHBsb3QgcHJvZHVjZXM6IHRoZSBwbG90IGtub3dzIHdoaWNoIHBvaW50cyB0aGUgdXNlciBkcmV3XG4gKiBhcm91bmQsIGFuZCB0aGUgbWFwIG5lZWRzIHRoYXQgYXMgYSBtYXNrIG92ZXIgQUxMIG9ic2VydmF0aW9ucy4gT3V0LW9mLXJhbmdlIGFuZFxuICogZHVwbGljYXRlIGluZGljZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQg4oCUIGEgcGxvdCBtYXkgaGFuZCBiYWNrIHRoZSBzYW1lXG4gKiBwb2ludCB0d2ljZSwgYW5kIGEgc3RhbGUgaW5kZXggZnJvbSBhIHBsb3QgZHJhd24gYmVmb3JlIGEgZGF0YXNldCBjaGFuZ2UgbXVzdCBub3RcbiAqIHRocm93IGluIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3Rpb24gZ2VzdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+LCBvYnNlcnZhdGlvbkNvdW50OiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShvYnNlcnZhdGlvbkNvdW50KTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaSkgfHwgaSA8IDAgfHwgaSA+PSBvYnNlcnZhdGlvbkNvdW50KSBjb250aW51ZTtcbiAgICBpZiAobWFza1tpXSkgY29udGludWU7XG4gICAgbWFza1tpXSA9IDE7XG4gICAgY291bnQrKztcbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgQU5ZIG9mIGByZWdpb25zYCAodW5pb24pLiBDb29yZGluYXRlcyBhcmUgdHJhbnNmb3JtZWQgYnlcbiAqIGBpbWFnZVJlZmAgZmlyc3QsIHNvIHRoZSB0ZXN0IGhhcHBlbnMgaW4gdGhlIHNhbWUgd29ybGQgc3BhY2UgdGhlIHJlZ2lvbnMgd2VyZVxuICogZHJhd24gaW4uXG4gKlxuICogYGNhbmRpZGF0ZXNgLCB3aGVuIGdpdmVuLCByZXN0cmljdHMgdGhlIHRlc3QgdG8gdGhvc2Ugb2JzZXJ2YXRpb24gaW5kaWNlcyDigJQgaG93XG4gKiBhIDJEIHZpZXcgb2YgYSAzRCBkYXRhc2V0IGtlZXBzIGEgZHJhd24gcmVnaW9uIG1lYW5pbmcgd2hhdCBpdCBsb29rcyBsaWtlIGl0XG4gKiBtZWFuczogdGhlIHNoYXBlIHdhcyBkcmF3biBvdmVyIE9ORSBzZWN0aW9uLCBzbyBpdCBzZWxlY3RzIHRoYXQgc2VjdGlvbidzIGNlbGxzXG4gKiByYXRoZXIgdGhhbiB0aGUgd2hvbGUgZGVwdGggb2YgdGhlIHNwZWNpbWVuIGJlaGluZCB0aGVtLiBUaGUgcmV0dXJuZWQgbWFzayBzdGF5c1xuICogaW5kZXhlZCBieSBvYnNlcnZhdGlvbiwgc28gZXZlcnkgY29uc3VtZXIgKGNoYXJ0cywgbGVnZW5kLCB0aGUgM0QgY2xvdWQpIHJlYWRzIGl0XG4gKiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSB0aGUgVk9MVU1FIGEgc3RhY2sgb2Ygb3V0bGluZXMgZW5jbG9zZXM6IGEgcmVnaW9uIGNsYXNzIChhblxuICogYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpIHRocm91Z2ggZXZlcnkgc2VjdGlvbiBvZiB0aGUgZGF0YXNldCdzXG4gKiByZWZlcmVuY2Ugdm9sdW1lLCBhcyBpdHMgM0QgcmVjb25zdHJ1Y3Rpb24gc2hvd3MgaXQuXG4gKlxuICogVGhlIG91dGxpbmVzIGFyZSBpbiB0aGUgdm9sdW1lJ3Mgb3duIGdyaWQg4oCUIHgsIHkgaW4gdm94ZWxzLCB6IHRoZSBzbGljZSDigJQgd2hpY2hcbiAqIGlzIHdoZXJlIHJlZ2lvbnMgaW1wb3J0ZWQgb250byB0aGUgdm9sdW1lJ3Mgc3RhY2sgc2l0LiBBbiBvYnNlcnZhdGlvbiBpcyBpbiB2b3hlbFxuICogYCjijIp4IC8gdnjijIssIOKMinkgLyB2eeKMiywg4oyKeiAvIHZ64oyLKWAgKHNlZSBgdm9sdW1lSW1hZ2VSZWZgKSwgYW5kIHNlbGVjdGVkIHdoZW4gaXRzXG4gKiBzbGljZSdzIG91dGxpbmVzIGNvdmVyIHRoYXQgdm94ZWwsIGZpbGxlZCBhcyB0aGUgcmVjb25zdHJ1Y3Rpb24gZmlsbHMgdGhlbS4gT25lXG4gKiBzbGljZSBpcyByYXN0ZXJpc2VkIGF0IGEgdGltZSwgc28gYSBzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgd2hvbGUgYnJhaW4gY29zdHMgb25lXG4gKiBzbGljZSdzIG1hc2ssIG5vdCB0aGUgdm9sdW1lJ3MuIEFuIG9ic2VydmF0aW9uIG91dHNpZGUgdGhlIHZvbHVtZSwgb3Igd2l0aG91dCBhXG4gKiB6LCBpcyBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluQ2xhc3NWb2x1bWVzKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIHZvbHVtZTogU3BhdGlhbFZvbHVtZU1ldGEsXG4gIHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHogPSBvYnNlcnZhdGlvbnMuejtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sdW1lO1xuICBjb25zdCBbdngsIHZ5LCB2el0gPSB2b2x1bWUudm94ZWxTaXplO1xuICBjb25zdCBieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFNsaWNlT3V0bGluZXNbXT4oKTtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykge1xuICAgIGlmICghcy5yaW5ncy5sZW5ndGggfHwgcy56IDwgMCB8fCBzLnogPj0gZGVwdGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBieVNsaWNlLmdldChzLnopO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2gocyk7XG4gICAgZWxzZSBieVNsaWNlLnNldChzLnosIFtzXSk7XG4gIH1cbiAgaWYgKCF6IHx8ICFieVNsaWNlLnNpemUpIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgLy8gVGhlIG9ic2VydmF0aW9ucyBvZiBlYWNoIG91dGxpbmVkIHNsaWNlIChhIGNvdW50aW5nIHNvcnQgYnkgc2xpY2UpLlxuICBjb25zdCBzbGljZU9mID0gbmV3IEludDMyQXJyYXkobikuZmlsbCgtMSk7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShkZXB0aCArIDEpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKHpbaV0gLyB2eik7XG4gICAgaWYgKCFieVNsaWNlLmhhcyhrKSkgY29udGludWU7XG4gICAgc2xpY2VPZltpXSA9IGs7XG4gICAgY291bnRzW2sgKyAxXSsrO1xuICB9XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgZGVwdGg7IGsrKykgY291bnRzW2sgKyAxXSArPSBjb3VudHNba107XG4gIGNvbnN0IG9yZGVyID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tkZXB0aF0pO1xuICBjb25zdCBhdCA9IGNvdW50cy5zbGljZSgwLCBkZXB0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBpZiAoc2xpY2VPZltpXSA+PSAwKSBvcmRlclthdFtzbGljZU9mW2ldXSsrXSA9IGk7XG5cbiAgY29uc3QgcGxhbmUgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgW2ssIG91dGxpbmVzXSBvZiBieVNsaWNlKSB7XG4gICAgcGxhbmUuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygb3V0bGluZXMpIGZpbGxPdXRsaW5lcyhwbGFuZSwgd2lkdGgsIGhlaWdodCwgcyk7XG4gICAgZm9yIChsZXQgbyA9IGNvdW50c1trXTsgbyA8IGNvdW50c1trICsgMV07IG8rKykge1xuICAgICAgY29uc3QgaSA9IG9yZGVyW29dO1xuICAgICAgY29uc3QgcHggPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy54W2ldIC8gdngpO1xuICAgICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy55W2ldIC8gdnkpO1xuICAgICAgaWYgKHB4IDwgMCB8fCBweSA8IDAgfHwgcHggPj0gd2lkdGggfHwgcHkgPj0gaGVpZ2h0KSBjb250aW51ZTtcbiAgICAgIGlmIChwbGFuZVtweSAqIHdpZHRoICsgcHhdKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlDYXRlZ29yeShjb2RlczogVWludDE2QXJyYXksIGNvZGU6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvZGVzLmxlbmd0aCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29kZXNbaV0gPT09IGNvZGUpIHtcbiAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cbiJdfQ==
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVB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QUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsK0RBQStEO1FBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0s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QUFHLENBQUMsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFNsaWNlT3V0bGluZXMsIGZpbGxPdXRsaW5lcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JlY29uc3RydWN0JztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbEltYWdlUmVmLFxuICBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgU3BhdGlhbFZvbHVtZU1ldGEsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcGUge1xuICBib3VuZHM6IEJvdW5kcztcbiAgaGl0KHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuO1xufVxuXG4vKiogUG9seWdvbi13aXRoLWhvbGVzOiBpbnNpZGUgdGhlIGV4dGVyaW9yIGFuZCBvdXRzaWRlIGV2ZXJ5IGhvbGUuICovXG5mdW5jdGlvbiBwb2x5Z29uU2hhcGUoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGhvbGVzPzogbnVtYmVyW11bXVtdKTogU2hhcGUgfCBudWxsIHtcbiAgaWYgKHhzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICBjb25zdCBib3VuZHMgPSByaW5nQm91bmRzKHhzLCB5cyk7XG4gIC8vIFNwbGl0IGFuZCBib3VuZGVkIE9OQ0UgcGVyIHNoYXBlOiB0aGUgaGl0IHRlc3QgcnVucyBmb3IgZXZlcnkgY2FuZGlkYXRlIHBvaW50XG4gIC8vIGluc2lkZSB0aGUgZXh0ZXJpb3Ig4oCUIHVwIHRvIG1pbGxpb25zIG9mIGNlbGxzIHBlciBzZWxlY3Rpb24uXG4gIGNvbnN0IGhvbGVSaW5ncyA9IChob2xlcyA/PyBbXSlcbiAgICAuZmlsdGVyKChyaW5nKSA9PiByaW5nLmxlbmd0aCA+PSAzKVxuICAgIC5tYXAoKHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGh4ID0gcmluZy5tYXAoKHApID0+IHBbMF0pO1xuICAgICAgY29uc3QgaHkgPSByaW5nLm1hcCgocCkgPT4gcFsxXSk7XG4gICAgICByZXR1cm4geyB4czogaHgsIHlzOiBoeSwgYm91bmRzOiByaW5nQm91bmRzKGh4LCBoeSkgfTtcbiAgICB9KTtcbiAgcmV0dXJuIHtcbiAgICBib3VuZHMsXG4gICAgaGl0OiAocHgsIHB5KSA9PiB7XG4gICAgICBpZiAoIXBvaW50SW5SaW5nKHhzLCB5cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVGhlIHJlZ2lvbiBtb2RlbCBpcyBleHBsaWNpdDogYSBwb2ludCBpbnNpZGUgdGhlIGV4dGVyaW9yIEFORCBpbnNpZGUgYVxuICAgICAgLy8gaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb24uXG4gICAgICBmb3IgKGNvbnN0IGhvbGUgb2YgaG9sZVJpbmdzKSB7XG4gICAgICAgIGlmIChpbkJvdW5kcyhob2xlLmJvdW5kcywgcHgsIHB5KSAmJiBwb2ludEluUmluZyhob2xlLnhzLCBob2xlLnlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSByZWdpb24gdG8gdGVzdGFibGUgc2hhcGVzLiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhbnl0aGluZyB0aGF0XG4gKiBlbmNsb3NlcyBubyBhcmVhIOKAlCBhbiBvcGVuIHBvbHlsaW5lLCBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lLCBhIGRlZ2VuZXJhdGVcbiAqIHJlY3RhbmdsZSDigJQgc28gdGhvc2UgbmV2ZXIgY29udHJpYnV0ZSB0byBhIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lvblNoYXBlcyhyZWdpb246IFJlZ2lvbik6IFNoYXBlW10ge1xuICAvLyBQcm9maWxlIGxpbmVzIGJlbG9uZyB0byB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgYW5ub3RhdGlvbiBzZXQuXG4gIGlmICgocmVnaW9uIGFzIHVua25vd24gYXMgeyBraW5kPzogc3RyaW5nIH0pPy5raW5kID09PSAncHJvZmlsZScpIHJldHVybiBbXTtcbiAgY29uc3QgYiA9IHJlZ2lvbj8uYm91bmRzIGFzIHVua25vd24gYXNcbiAgICB8IHtcbiAgICAgICAgeD86IG51bWJlcjtcbiAgICAgICAgeT86IG51bWJlcjtcbiAgICAgICAgd2lkdGg/OiBudW1iZXI7XG4gICAgICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAgICAgeHBvaW50cz86IG51bWJlcltdO1xuICAgICAgICB5cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIGNsb3NlZD86IGJvb2xlYW47XG4gICAgICAgIGhvbGVzPzogbnVtYmVyW11bXVtdO1xuICAgICAgICBwb2x5Z29ucz86IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdOyBjbG9zZWQ/OiBib29sZWFuOyBob2xlcz86IG51bWJlcltdW11bXSB9W107XG4gICAgICB9XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghYikgcmV0dXJuIFtdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGIucG9seWdvbnMpKSB7XG4gICAgcmV0dXJuIGIucG9seWdvbnMuZmxhdE1hcCgocCkgPT5cbiAgICAgIHAuY2xvc2VkID09PSBmYWxzZSA/IFtdIDogKHBvbHlnb25TaGFwZShwLnhwb2ludHMgPz8gW10sIHAueXBvaW50cyA/PyBbXSwgcC5ob2xlcykgPz8gW10pLFxuICAgICk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi54cG9pbnRzKSkge1xuICAgIGlmIChiLmNsb3NlZCA9PT0gZmFsc2UpIHJldHVybiBbXTsgLy8gb3BlbiBwb2x5bGluZSBlbmNsb3NlcyBub3RoaW5nXG4gICAgY29uc3Qgc2hhcGUgPSBwb2x5Z29uU2hhcGUoYi54cG9pbnRzLCBiLnlwb2ludHMgPz8gW10sIGIuaG9sZXMpO1xuICAgIHJldHVybiBzaGFwZSA/IFtzaGFwZV0gOiBbXTtcbiAgfVxuICBpZiAodHlwZW9mIGIud2lkdGggPT09ICdudW1iZXInICYmIHR5cGVvZiBiLmhlaWdodCA9PT0gJ251bWJlcicpIHtcbiAgICBjb25zdCB4ID0gYi54ID8/IDA7XG4gICAgY29uc3QgeSA9IGIueSA/PyAwO1xuICAgIC8vIE5vcm1hbGlzZSBhIHJlY3RhbmdsZSBkcmFnZ2VkIHJpZ2h0LXRvLWxlZnQgLyBib3R0b20tdG8tdG9wLlxuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeSwgeSArIGIuaGVpZ2h0KTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeSwgeSArIGIuaGVpZ2h0KTtcbiAgICBpZiAobWF4WCA9PT0gbWluWCB8fCBtYXhZID09PSBtaW5ZKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRzID0geyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH07XG4gICAgcmV0dXJuIFt7IGJvdW5kcywgaGl0OiAocHgsIHB5KSA9PiBpbkJvdW5kcyhib3VuZHMsIHB4LCBweSkgfV07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIEEgc2VsZWN0aW9uIGZyb20gYW4gZXhwbGljaXQgbGlzdCBvZiBvYnNlcnZhdGlvbiBpbmRpY2VzLlxuICpcbiAqIFdoYXQgYSBsYXNzbyBpbiBhIGxpbmtlZCBwbG90IHByb2R1Y2VzOiB0aGUgcGxvdCBrbm93cyB3aGljaCBwb2ludHMgdGhlIHVzZXIgZHJld1xuICogYXJvdW5kLCBhbmQgdGhlIG1hcCBuZWVkcyB0aGF0IGFzIGEgbWFzayBvdmVyIEFMTCBvYnNlcnZhdGlvbnMuIE91dC1vZi1yYW5nZSBhbmRcbiAqIGR1cGxpY2F0ZSBpbmRpY2VzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkIOKAlCBhIHBsb3QgbWF5IGhhbmQgYmFjayB0aGUgc2FtZVxuICogcG9pbnQgdHdpY2UsIGFuZCBhIHN0YWxlIGluZGV4IGZyb20gYSBwbG90IGRyYXduIGJlZm9yZSBhIGRhdGFzZXQgY2hhbmdlIG11c3Qgbm90XG4gKiB0aHJvdyBpbiB0aGUgbWlkZGxlIG9mIGEgc2VsZWN0aW9uIGdlc3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RCeUluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPiwgb2JzZXJ2YXRpb25Db3VudDogbnVtYmVyKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkob2JzZXJ2YXRpb25Db3VudCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgaSBvZiBpbmRpY2VzKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGkpIHx8IGkgPCAwIHx8IGkgPj0gb2JzZXJ2YXRpb25Db3VudCkgY29udGludWU7XG4gICAgaWYgKG1hc2tbaV0pIGNvbnRpbnVlO1xuICAgIG1hc2tbaV0gPSAxO1xuICAgIGNvdW50Kys7XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBPYnNlcnZhdGlvbnMgaW5zaWRlIEFOWSBvZiBgcmVnaW9uc2AgKHVuaW9uKS4gQ29vcmRpbmF0ZXMgYXJlIHRyYW5zZm9ybWVkIGJ5XG4gKiBgaW1hZ2VSZWZgIGZpcnN0LCBzbyB0aGUgdGVzdCBoYXBwZW5zIGluIHRoZSBzYW1lIHdvcmxkIHNwYWNlIHRoZSByZWdpb25zIHdlcmVcbiAqIGRyYXduIGluLlxuICpcbiAqIGBjYW5kaWRhdGVzYCwgd2hlbiBnaXZlbiwgcmVzdHJpY3RzIHRoZSB0ZXN0IHRvIHRob3NlIG9ic2VydmF0aW9uIGluZGljZXMg4oCUIGhvd1xuICogYSAyRCB2aWV3IG9mIGEgM0QgZGF0YXNldCBrZWVwcyBhIGRyYXduIHJlZ2lvbiBtZWFuaW5nIHdoYXQgaXQgbG9va3MgbGlrZSBpdFxuICogbWVhbnM6IHRoZSBzaGFwZSB3YXMgZHJhd24gb3ZlciBPTkUgc2VjdGlvbiwgc28gaXQgc2VsZWN0cyB0aGF0IHNlY3Rpb24ncyBjZWxsc1xuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGRlcHRoIG9mIHRoZSBzcGVjaW1lbiBiZWhpbmQgdGhlbS4gVGhlIHJldHVybmVkIG1hc2sgc3RheXNcbiAqIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIHNvIGV2ZXJ5IGNvbnN1bWVyIChjaGFydHMsIGxlZ2VuZCwgdGhlIDNEIGNsb3VkKSByZWFkcyBpdFxuICogdGhlIHNhbWUgd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5SZWdpb25zKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGltYWdlUmVmOiBTcGF0aWFsSW1hZ2VSZWYgfCB1bmRlZmluZWQsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuICBjYW5kaWRhdGVzPzogVWludDMyQXJyYXksXG4pOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG4gPSBvYnNlcnZhdGlvbnMuY291bnQ7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShuKTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBjb25zdCBbc3gsIHN5XSA9IGltYWdlUmVmPy5zY2FsZSA/PyBbMSwgMV07XG4gIGNvbnN0IFt0eCwgdHldID0gaW1hZ2VSZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF07XG4gIGxldCBjb3VudCA9IDA7XG4gIGNvbnN0IHRvdGFsID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXMubGVuZ3RoIDogbjtcbiAgZm9yIChsZXQgayA9IDA7IGsgPCB0b3RhbDsgaysrKSB7XG4gICAgY29uc3QgaSA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzW2tdIDogaztcbiAgICBjb25zdCBweCA9IG9ic2VydmF0aW9ucy54W2ldICogc3ggKyB0eDtcbiAgICBjb25zdCBweSA9IG9ic2VydmF0aW9ucy55W2ldICogc3kgKyB0eTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIHNoYXBlcykge1xuICAgICAgLy8gQm91bmRzIGZpcnN0OiBhIHJheSBjYXN0IHBlciBvYnNlcnZhdGlvbiBwZXIgcmVnaW9uIHdvdWxkIGRvbWluYXRlIGF0XG4gICAgICAvLyAxMF41IG9ic2VydmF0aW9ucywgYW5kIG1vc3QgcG9pbnRzIG1pc3MgbW9zdCByZWdpb25zLlxuICAgICAgaWYgKCFpbkJvdW5kcyhzaGFwZS5ib3VuZHMsIHB4LCBweSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNoYXBlLmhpdChweCwgcHkpKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBTZWxlY3Qgb2JzZXJ2YXRpb25zIHdob3NlIFNDUkVFTiBwcm9qZWN0aW9uIGZhbGxzIGluc2lkZSB0aGUgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBUaGlzIGlzIGhvdyBhIHJlZ2lvbiBzZWxlY3Rpb24gd29ya3MgaW4gdGhlIDNEIGNsb3VkLiBUaGVyZSBpcyBubyBkYXRhLXNwYWNlXG4gKiBhZmZpbmUgdG8gbWFwIGEgZHJhd24gc2hhcGUgdGhyb3VnaCwgYmVjYXVzZSB0aGUgc2hhcGUgd2FzIGRyYXduIG9uIGEgMkQgc2NyZWVuXG4gKiBhZ2FpbnN0IGEgcGVyc3BlY3RpdmUgY2FtZXJhIOKAlCBzbyB0aGUgb2JzZXJ2YXRpb25zIGNvbWUgdGhlIG90aGVyIHdheSwgYWxyZWFkeVxuICogcHJvamVjdGVkIHRvIGNhbnZhcyBwaXhlbHMgYnkgdGhlIHJlbmRlcmVyICh3aGljaCBvd25zIHRoZSBjYW1lcmEpLCBhbmQgdGhlXG4gKiByZWdpb25zIGFyZSB0ZXN0ZWQgaW4gdGhhdCBzYW1lIHNjcmVlbiBzcGFjZS5cbiAqXG4gKiBUaGUgY29uc2VxdWVuY2UgaXMgd29ydGggYmVpbmcgZXhwbGljaXQgYWJvdXQ6IGEgc2NyZWVuLXNwYWNlIGxhc3NvIHNlbGVjdHNcbiAqIHRocm91Z2ggdGhlIFdIT0xFIERFUFRIIG9mIHRoZSBjbG91ZCwgbGlrZSBhIGNvb2tpZSBjdXR0ZXIsIG5vdCBhIHNsYWIgYXQgc29tZVxuICogY2hvc2VuIHouIFRoYXQgaXMgaW5oZXJlbnQgdG8gZHJhd2luZyBvbiBhIGZsYXQgc2NyZWVuLCBhbmQgaXQgaXMgd2hhdCBuYXBhcmlcbiAqIGFuZCBldmVyeSBvdGhlciBvcmJpdC1jYW1lcmEgcG9pbnQgcGlja2VyIGRvLiBPcmJpdCBhbmQgZHJhdyBhZ2FpbiB0byBjdXQgZnJvbVxuICogYW5vdGhlciBhbmdsZS5cbiAqXG4gKiBgc2NyZWVuYCBpcyBgW3gwLCB5MCwgeDEsIHkxLCDigKZdYCBpbiBjYW52YXMgcGl4ZWxzLCBgY291bnRgIGVudHJpZXMgbG9uZy4gQW5cbiAqIG9ic2VydmF0aW9uIHRoZSBjYW1lcmEgcHV0cyBiZWhpbmQgdGhlIGV5ZSBpcyBnaXZlbiBOYU4gYnkgdGhlIHByb2plY3RvciBhbmRcbiAqIG5ldmVyIHNlbGVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5SZWdpb25zUHJvamVjdGVkKFxuICBzY3JlZW46IEZsb2F0MzJBcnJheSxcbiAgY291bnQ6IG51bWJlcixcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4pOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb3VudCk7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgbGV0IGhpdHMgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBjb25zdCBweCA9IHNjcmVlbltpICogMl07XG4gICAgY29uc3QgcHkgPSBzY3JlZW5baSAqIDIgKyAxXTtcbiAgICAvLyBCZWhpbmQgdGhlIGNhbWVyYSwgb3Igb3RoZXJ3aXNlIHVucHJvamVjdGFibGUuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUocHkpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIHNoYXBlcykge1xuICAgICAgaWYgKCFpbkJvdW5kcyhzaGFwZS5ib3VuZHMsIHB4LCBweSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNoYXBlLmhpdChweCwgcHkpKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBoaXRzKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudDogaGl0cyB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgdGhlIFZPTFVNRSBhIHN0YWNrIG9mIG91dGxpbmVzIGVuY2xvc2VzOiBhIHJlZ2lvbiBjbGFzcyAoYW5cbiAqIGF0bGFzIHN0cnVjdHVyZSB3aXRoIGl0cyBzdWJzdHJ1Y3R1cmVzKSB0aHJvdWdoIGV2ZXJ5IHNlY3Rpb24gb2YgdGhlIGRhdGFzZXQnc1xuICogcmVmZXJlbmNlIHZvbHVtZSwgYXMgaXRzIDNEIHJlY29uc3RydWN0aW9uIHNob3dzIGl0LlxuICpcbiAqIFRoZSBvdXRsaW5lcyBhcmUgaW4gdGhlIHZvbHVtZSdzIG93biBncmlkIOKAlCB4LCB5IGluIHZveGVscywgeiB0aGUgc2xpY2Ug4oCUIHdoaWNoXG4gKiBpcyB3aGVyZSByZWdpb25zIGltcG9ydGVkIG9udG8gdGhlIHZvbHVtZSdzIHN0YWNrIHNpdC4gQW4gb2JzZXJ2YXRpb24gaXMgaW4gdm94ZWxcbiAqIGAo4oyKeCAvIHZ44oyLLCDijIp5IC8gdnnijIssIOKMinogLyB2euKMiylgIChzZWUgYHZvbHVtZUltYWdlUmVmYCksIGFuZCBzZWxlY3RlZCB3aGVuIGl0c1xuICogc2xpY2UncyBvdXRsaW5lcyBjb3ZlciB0aGF0IHZveGVsLCBmaWxsZWQgYXMgdGhlIHJlY29uc3RydWN0aW9uIGZpbGxzIHRoZW0uIE9uZVxuICogc2xpY2UgaXMgcmFzdGVyaXNlZCBhdCBhIHRpbWUsIHNvIGEgc3RydWN0dXJlIHRocm91Z2ggdGhlIHdob2xlIGJyYWluIGNvc3RzIG9uZVxuICogc2xpY2UncyBtYXNrLCBub3QgdGhlIHZvbHVtZSdzLiBBbiBvYnNlcnZhdGlvbiBvdXRzaWRlIHRoZSB2b2x1bWUsIG9yIHdpdGhvdXQgYVxuICogeiwgaXMgbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbkNsYXNzVm9sdW1lcyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICB2b2x1bWU6IFNwYXRpYWxWb2x1bWVNZXRhLFxuICBzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCB6ID0gb2JzZXJ2YXRpb25zLno7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgZGVwdGggfSA9IHZvbHVtZTtcbiAgY29uc3QgW3Z4LCB2eSwgdnpdID0gdm9sdW1lLnZveGVsU2l6ZTtcbiAgY29uc3QgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBTbGljZU91dGxpbmVzW10+KCk7XG4gIGZvciAoY29uc3QgcyBvZiBzbGljZXMpIHtcbiAgICBpZiAoIXMucmluZ3MubGVuZ3RoIHx8IHMueiA8IDAgfHwgcy56ID49IGRlcHRoKSBjb250aW51ZTtcbiAgICBjb25zdCBsaXN0ID0gYnlTbGljZS5nZXQocy56KTtcbiAgICBpZiAobGlzdCkgbGlzdC5wdXNoKHMpO1xuICAgIGVsc2UgYnlTbGljZS5zZXQocy56LCBbc10pO1xuICB9XG4gIGlmICgheiB8fCAhYnlTbGljZS5zaXplKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIC8vIFRoZSBvYnNlcnZhdGlvbnMgb2YgZWFjaCBvdXRsaW5lZCBzbGljZSAoYSBjb3VudGluZyBzb3J0IGJ5IHNsaWNlKS5cbiAgY29uc3Qgc2xpY2VPZiA9IG5ldyBJbnQzMkFycmF5KG4pLmZpbGwoLTEpO1xuICBjb25zdCBjb3VudHMgPSBuZXcgVWludDMyQXJyYXkoZGVwdGggKyAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCBrID0gTWF0aC5mbG9vcih6W2ldIC8gdnopO1xuICAgIGlmICghYnlTbGljZS5oYXMoaykpIGNvbnRpbnVlO1xuICAgIHNsaWNlT2ZbaV0gPSBrO1xuICAgIGNvdW50c1trICsgMV0rKztcbiAgfVxuICBmb3IgKGxldCBrID0gMDsgayA8IGRlcHRoOyBrKyspIGNvdW50c1trICsgMV0gKz0gY291bnRzW2tdO1xuICBjb25zdCBvcmRlciA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbZGVwdGhdKTtcbiAgY29uc3QgYXQgPSBjb3VudHMuc2xpY2UoMCwgZGVwdGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgaWYgKHNsaWNlT2ZbaV0gPj0gMCkgb3JkZXJbYXRbc2xpY2VPZltpXV0rK10gPSBpO1xuXG4gIGNvbnN0IHBsYW5lID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IFtrLCBvdXRsaW5lc10gb2YgYnlTbGljZSkge1xuICAgIHBsYW5lLmZpbGwoMCk7XG4gICAgZm9yIChjb25zdCBzIG9mIG91dGxpbmVzKSBmaWxsT3V0bGluZXMocGxhbmUsIHdpZHRoLCBoZWlnaHQsIHMpO1xuICAgIGZvciAobGV0IG8gPSBjb3VudHNba107IG8gPCBjb3VudHNbayArIDFdOyBvKyspIHtcbiAgICAgIGNvbnN0IGkgPSBvcmRlcltvXTtcbiAgICAgIGNvbnN0IHB4ID0gTWF0aC5mbG9vcihvYnNlcnZhdGlvbnMueFtpXSAvIHZ4KTtcbiAgICAgIGNvbnN0IHB5ID0gTWF0aC5mbG9vcihvYnNlcnZhdGlvbnMueVtpXSAvIHZ5KTtcbiAgICAgIGlmIChweCA8IDAgfHwgcHkgPCAwIHx8IHB4ID49IHdpZHRoIHx8IHB5ID49IGhlaWdodCkgY29udGludWU7XG4gICAgICBpZiAocGxhbmVbcHkgKiB3aWR0aCArIHB4XSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=