@jax-data-science/sci-image-visualizer 0.16.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 (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -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 +86 -18
  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 +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -1,29 +1,25 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
- import { CheckboxModule } from 'primeng/checkbox';
5
4
  import { InputSwitchModule } from 'primeng/inputswitch';
6
- import { DropdownModule } from 'primeng/dropdown';
7
5
  import { InputNumberModule } from 'primeng/inputnumber';
8
6
  import { SelectButtonModule } from 'primeng/selectbutton';
9
7
  import { SliderModule } from 'primeng/slider';
10
8
  import { DEFAULT_SPATIAL_VIEW } from '../../contracts/display-types';
11
9
  import { cellsShown, drawnCellSets } from '../../spatial/lod';
12
- import { densityColorBarCss, tileOptions } from '../../spatial/spatial-panel-model';
13
- import { SpatialGroupsPanelComponent } from '../spatial-groups-panel/spatial-groups-panel.component';
10
+ import { tileOptions } from '../../spatial/spatial-panel-model';
14
11
  import * as i0 from "@angular/core";
15
12
  import * as i1 from "@angular/common";
16
13
  import * as i2 from "@angular/forms";
17
- import * as i3 from "primeng/checkbox";
18
- import * as i4 from "primeng/dropdown";
19
- import * as i5 from "primeng/inputswitch";
20
- import * as i6 from "primeng/inputnumber";
21
- import * as i7 from "primeng/selectbutton";
22
- import * as i8 from "primeng/slider";
14
+ import * as i3 from "primeng/inputswitch";
15
+ import * as i4 from "primeng/inputnumber";
16
+ import * as i5 from "primeng/selectbutton";
17
+ import * as i6 from "primeng/slider";
23
18
  /**
24
- * The Cells section, as Xenium Explorer's: the outlines' on/off switch, which boundary set
25
- * is drawn, how cells are coloured (with the gene, the colour, or the colour bar that
26
- * goes with it), the {@link SpatialGroupsPanelComponent groups}, and how cells are drawn.
19
+ * The Observations section's "Cell segmentations" part (projected into it), shown while the
20
+ * observations are shown as cells: which boundary sets are drawn and how the cells are drawn (fill,
21
+ * outline, opacity), or in 3D, by cell type or each by itself. Their colour is the section's
22
+ * shared "Colour by", the markers' too.
27
23
  *
28
24
  * Writes only through `controls.setViewState`.
29
25
  */
@@ -35,19 +31,18 @@ export class SpatialCellsPanelComponent {
35
31
  this.dataset = null;
36
32
  /** The current spatial view state: what is drawn, and how. */
37
33
  this.view = DEFAULT_SPATIAL_VIEW;
38
- /** The gene list the "Gene Expression" colouring picks from, shared with the other
39
- * gene dropdowns. */
40
- this.genes = null;
41
- /** The observations' continuous colour bar, shown for the gene colouring while it has one. */
42
- this.colorBarCss = null;
43
- /** Whether the section is expanded. */
44
- this.open = true;
45
- /** Asks to open or close it; two-way with `open`. */
46
- this.openChange = new EventEmitter();
47
- /** Virtual-scrolled only past this many options: the scroller earns its complexity for
48
- * a few thousand names, and for eight it adds only overhead — a virtual viewport that
49
- * short swallows the clicks it is meant to forward. */
50
- this.geneVirtualScrollFrom = 200;
34
+ /**
35
+ * In the 3D view: the cells are a 3D segmentation's, drawn by cell type or each by itself, and
36
+ * the 2D boundaries and draw mode do not apply.
37
+ */
38
+ this.is3d = false;
39
+ /** The 3D view's individual cells as they stand (null: none drawn). */
40
+ this.cells3dStatus = null;
41
+ /** How the 3D view draws the cells: one surface per cell type, or each cell by itself. */
42
+ this.cells3dOptions = [
43
+ { label: 'By cell type', value: 'types' },
44
+ { label: 'Individual cells', value: 'cells' },
45
+ ];
51
46
  this.cellDrawOptions = [
52
47
  { label: 'Fill', value: 'fill' },
53
48
  { label: 'Outline', value: 'outline' },
@@ -65,11 +60,21 @@ export class SpatialCellsPanelComponent {
65
60
  * More sets keep the one-of choice.
66
61
  */
67
62
  this.boundarySets = [];
68
- /** Cell colour modes on offer (Xenium Explorer's "Cell Color"). */
69
- this.cellColorOptions = [];
70
- /** The density colour bar, rebuilt only when its colormap changes (a 256-entry LUT). */
71
- this.densityColorBarCss = '';
72
- this.densityBarFor = undefined;
63
+ }
64
+ onCells3d(mode) {
65
+ this.controls?.setViewState({ cells3d: mode });
66
+ }
67
+ /** What the 3D cells' status line says, or null. */
68
+ get cells3dHint() {
69
+ const s = this.cells3dStatus;
70
+ if (!s)
71
+ return null;
72
+ const n = s.shown.toLocaleString();
73
+ if (s.building)
74
+ return s.shown ? `Building cells… ${n} shown so far` : 'Building cells…';
75
+ if (s.capped)
76
+ return `${n} cells shown, nearest the centre of the view. Zoom in or move to see the others.`;
77
+ return `${n} cells shown, each by itself.`;
73
78
  }
74
79
  ngOnChanges(changes) {
75
80
  if (changes['dataset']) {
@@ -78,11 +83,6 @@ export class SpatialCellsPanelComponent {
78
83
  this.boundarySets = [...(this.dataset?.polygonTiles?.sets ?? [])]
79
84
  .sort((a, b) => (a.name === 'cell' ? -1 : b.name === 'cell' ? 1 : 0))
80
85
  .map((set) => ({ name: set.name, label: set.label }));
81
- this.cellColorOptions = options.cellColorOptions;
82
- }
83
- if (this.densityBarFor !== this.view.densityColormap || !this.densityColorBarCss) {
84
- this.densityBarFor = this.view.densityColormap;
85
- this.densityColorBarCss = densityColorBarCss(this.view.densityColormap);
86
86
  }
87
87
  }
88
88
  /** Whether outlines are on — the explicit choice, or automatically for data that has them. */
@@ -144,44 +144,21 @@ export class SpatialCellsPanelComponent {
144
144
  return;
145
145
  this.controls?.setViewState({ cellOpacity: Math.min(1, Math.max(0.05, v / 100)) });
146
146
  }
147
- onCellColorMode(mode) {
148
- this.controls?.setViewState({ cellColorMode: mode });
149
- }
150
- onCellColorGene(gene) {
151
- this.controls?.setViewState({ cellColorGene: gene });
152
- }
153
- onCellSingleColor(hex) {
154
- this.controls?.setViewState({ cellSingleColor: hex });
155
- }
156
147
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
157
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", colorBarCss: "colorBarCss", open: "open" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "component", type: i5.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i8.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
148
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", is3d: "is3d", cells3dStatus: "cells3dStatus" }, usesOnChanges: true, ngImport: i0, template: "<!-- Cell segmentations: how the cells are drawn while the observations are shown as them. Their\n colour is the Observations section's \"Colour by\", the markers' too. -->\n<div class=\"sc-subhead\">Cell segmentations</div>\n\n<!-- 3D: the cells as one surface per cell type, or each its own surface in the colouring. -->\n<ng-container *ngIf=\"is3d\">\n <span class=\"sc-lbl\">In 3D</span>\n <p-selectButton\n [options]=\"cells3dOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cells3d\"\n (ngModelChange)=\"onCells3d($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <small class=\"sc-hint\" *ngIf=\"view.cells3d === 'types'\">\n Each cell type is one surface. A type can be shown as its cells in the Region Editor.\n </small>\n <small class=\"sc-hint\" *ngIf=\"cells3dHint\">{{ cells3dHint }}</small>\n</ng-container>\n\n<ng-container *ngIf=\"!is3d && boundarySets.length && boundarySets.length <= 2\">\n <span class=\"sc-lbl\">Boundaries</span>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n</ng-container>\n<ng-container *ngIf=\"!is3d && boundarySets.length > 2\">\n <span class=\"sc-lbl\">Boundaries</span>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n</ng-container>\n\n<span class=\"sc-lbl\" *ngIf=\"!is3d\">View cells as</span>\n<p-selectButton\n *ngIf=\"!is3d\"\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n></p-selectButton>\n<ng-container *ngIf=\"is3d || view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">{{ is3d ? 'Cell opacity' : 'Cell fill opacity' }}</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "component", type: i3.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i4.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i5.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i6.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
158
149
  }
159
150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, decorators: [{
160
151
  type: Component,
161
- args: [{ selector: 'spatial-cells-panel', standalone: true, imports: [
162
- CommonModule,
163
- FormsModule,
164
- CheckboxModule,
165
- DropdownModule,
166
- InputSwitchModule,
167
- InputNumberModule,
168
- SelectButtonModule,
169
- SliderModule,
170
- SpatialGroupsPanelComponent,
171
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"] }]
152
+ args: [{ selector: 'spatial-cells-panel', standalone: true, imports: [CommonModule, FormsModule, InputSwitchModule, InputNumberModule, SelectButtonModule, SliderModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Cell segmentations: how the cells are drawn while the observations are shown as them. Their\n colour is the Observations section's \"Colour by\", the markers' too. -->\n<div class=\"sc-subhead\">Cell segmentations</div>\n\n<!-- 3D: the cells as one surface per cell type, or each its own surface in the colouring. -->\n<ng-container *ngIf=\"is3d\">\n <span class=\"sc-lbl\">In 3D</span>\n <p-selectButton\n [options]=\"cells3dOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cells3d\"\n (ngModelChange)=\"onCells3d($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <small class=\"sc-hint\" *ngIf=\"view.cells3d === 'types'\">\n Each cell type is one surface. A type can be shown as its cells in the Region Editor.\n </small>\n <small class=\"sc-hint\" *ngIf=\"cells3dHint\">{{ cells3dHint }}</small>\n</ng-container>\n\n<ng-container *ngIf=\"!is3d && boundarySets.length && boundarySets.length <= 2\">\n <span class=\"sc-lbl\">Boundaries</span>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n</ng-container>\n<ng-container *ngIf=\"!is3d && boundarySets.length > 2\">\n <span class=\"sc-lbl\">Boundaries</span>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n</ng-container>\n\n<span class=\"sc-lbl\" *ngIf=\"!is3d\">View cells as</span>\n<p-selectButton\n *ngIf=\"!is3d\"\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n></p-selectButton>\n<ng-container *ngIf=\"is3d || view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">{{ is3d ? 'Cell opacity' : 'Cell fill opacity' }}</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}\n"] }]
172
153
  }], propDecorators: { controls: [{
173
154
  type: Input
174
155
  }], dataset: [{
175
156
  type: Input
176
157
  }], view: [{
177
158
  type: Input
178
- }], genes: [{
179
- type: Input
180
- }], colorBarCss: [{
159
+ }], is3d: [{
181
160
  type: Input
182
- }], open: [{
161
+ }], cells3dStatus: [{
183
162
  type: Input
184
- }], openChange: [{
185
- type: Output
186
163
  }] } });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakcsT0FBTyxFQUFF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c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFYSxVQUFVO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcbmltcG9ydCB7IElucHV0U3dpdGNoTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHN3aXRjaCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duLCBkcmF3bkNlbGxTZXRzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgUGFuZWxPcHRpb24sIGRlbnNpdHlDb2xvckJhckNzcywgdGlsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGFuZWwtbW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBHZW5lUGlja2VyTW9kZWwgfSBmcm9tICcuLi9zcGF0aWFsLWdlbmUtcGlja2VyJztcbmltcG9ydCB7IFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVGhlIENlbGxzIHNlY3Rpb24sIGFzIFhlbml1bSBFeHBsb3JlcidzOiB0aGUgb3V0bGluZXMnIG9uL29mZiBzd2l0Y2gsIHdoaWNoIGJvdW5kYXJ5IHNldFxuICogaXMgZHJhd24sIGhvdyBjZWxscyBhcmUgY29sb3VyZWQgKHdpdGggdGhlIGdlbmUsIHRoZSBjb2xvdXIsIG9yIHRoZSBjb2xvdXIgYmFyIHRoYXRcbiAqIGdvZXMgd2l0aCBpdCksIHRoZSB7QGxpbmsgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50IGdyb3Vwc30sIGFuZCBob3cgY2VsbHMgYXJlIGRyYXduLlxuICpcbiAqIFdyaXRlcyBvbmx5IHRocm91Z2ggYGNvbnRyb2xzLnNldFZpZXdTdGF0ZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwtY2VsbHMtcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIElucHV0U3dpdGNoTW9kdWxlLFxuICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgIFNlbGVjdEJ1dHRvbk1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNwYXRpYWxDZWxsc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBnZW5lIGxpc3QgdGhlIFwiR2VuZSBFeHByZXNzaW9uXCIgY29sb3VyaW5nIHBpY2tzIGZyb20sIHNoYXJlZCB3aXRoIHRoZSBvdGhlclxuICAgKiAgZ2VuZSBkcm9wZG93bnMuICovXG4gIEBJbnB1dCgpIGdlbmVzOiBHZW5lUGlja2VyTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIGNvbnRpbnVvdXMgY29sb3VyIGJhciwgc2hvd24gZm9yIHRoZSBnZW5lIGNvbG91cmluZyB3aGlsZSBpdCBoYXMgb25lLiAqL1xuICBASW5wdXQoKSBjb2xvckJhckNzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZWN0aW9uIGlzIGV4cGFuZGVkLiAqL1xuICBASW5wdXQoKSBvcGVuID0gdHJ1ZTtcbiAgLyoqIEFza3MgdG8gb3BlbiBvciBjbG9zZSBpdDsgdHdvLXdheSB3aXRoIGBvcGVuYC4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIFZpcnR1YWwtc2Nyb2xsZWQgb25seSBwYXN0IHRoaXMgbWFueSBvcHRpb25zOiB0aGUgc2Nyb2xsZXIgZWFybnMgaXRzIGNvbXBsZXhpdHkgZm9yXG4gICAqICBhIGZldyB0aG91c2FuZCBuYW1lcywgYW5kIGZvciBlaWdodCBpdCBhZGRzIG9ubHkgb3ZlcmhlYWQg4oCUIGEgdmlydHVhbCB2aWV3cG9ydCB0aGF0XG4gICAqICBzaG9ydCBzd2FsbG93cyB0aGUgY2xpY2tzIGl0IGlzIG1lYW50IHRvIGZvcndhcmQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lVmlydHVhbFNjcm9sbEZyb20gPSAyMDA7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxEcmF3T3B0aW9uczogUGFuZWxPcHRpb248U3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXT5bXSA9IFtcbiAgICB7IGxhYmVsOiAnRmlsbCcsIHZhbHVlOiAnZmlsbCcgfSxcbiAgICB7IGxhYmVsOiAnT3V0bGluZScsIHZhbHVlOiAnb3V0bGluZScgfSxcbiAgICB7IGxhYmVsOiAnQm90aCcsIHZhbHVlOiAnYm90aCcgfSxcbiAgXTtcblxuICAvKipcbiAgICogT3B0aW9uIGxpc3RzIGZvciB0aGUgY2VsbCBjb250cm9scy4gQnVpbHQgb25jZSBwZXIgZGF0YXNldCByYXRoZXIgdGhhbiBpbiBnZXR0ZXJzOiBhXG4gICAqIGdldHRlciByZXR1cm5zIGEgZnJlc2ggYXJyYXkgb24gZXZlcnkgY2hhbmdlLWRldGVjdGlvbiBwYXNzLCBhbmQgUHJpbWVORyByZS1yZW5kZXJzXG4gICAqIGl0cyBidXR0b25zIHdoZW5ldmVyIHRoZSBhcnJheSBpZGVudGl0eSBjaGFuZ2VzIOKAlCB3aGljaCBtYWRlIHRoZW0gaW1wb3NzaWJsZSB0byBjbGljay5cbiAgICovXG4gIHByb3RlY3RlZCBjZWxsU2V0T3B0aW9uczogUGFuZWxPcHRpb248c3RyaW5nPltdID0gW107XG4gIC8qKlxuICAgKiBUaGUgYm91bmRhcnkgc2V0cywgdGhlIGNlbGxzJyBmaXJzdCwgZWFjaCB3aXRoIGEgc3dpdGNoIHdoZW4gdGhlcmUgYXJlIGF0IG1vc3QgdHdvIChhc1xuICAgKiBDeXRvQ2FudmFzJ3MgXCJDZWxsIEJvdW5kYXJpZXNcIiBhbmQgXCJOdWNsZWFyIEJvdW5kYXJpZXNcIik6IGVpdGhlciwgYm90aCBvciBuZWl0aGVyIGRyYXduLlxuICAgKiBNb3JlIHNldHMga2VlcCB0aGUgb25lLW9mIGNob2ljZS5cbiAgICovXG4gIHByb3RlY3RlZCBib3VuZGFyeVNldHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogQ2VsbCBjb2xvdXIgbW9kZXMgb24gb2ZmZXIgKFhlbml1bSBFeHBsb3JlcidzIFwiQ2VsbCBDb2xvclwiKS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxDb2xvck9wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxDb2xvck1vZGUnXT5bXSA9IFtdO1xuICAvKiogVGhlIGRlbnNpdHkgY29sb3VyIGJhciwgcmVidWlsdCBvbmx5IHdoZW4gaXRzIGNvbG9ybWFwIGNoYW5nZXMgKGEgMjU2LWVudHJ5IExVVCkuICovXG4gIHByb3RlY3RlZCBkZW5zaXR5Q29sb3JCYXJDc3MgPSAnJztcbiAgcHJpdmF0ZSBkZW5zaXR5QmFyRm9yOiBTcGF0aWFsVmlld1N0YXRlWydkZW5zaXR5Q29sb3JtYXAnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRpbGVPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICB0aGlzLmNlbGxTZXRPcHRpb25zID0gb3B0aW9ucy5jZWxsU2V0T3B0aW9ucztcbiAgICAgIHRoaXMuYm91bmRhcnlTZXRzID0gWy4uLih0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcz8uc2V0cyA/PyBbXSldXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lID09PSAnY2VsbCcgPyAtMSA6IGIubmFtZSA9PT0gJ2NlbGwnID8gMSA6IDApKVxuICAgICAgICAubWFwKChzZXQpID0+ICh7IG5hbWU6IHNldC5uYW1lLCBsYWJlbDogc2V0LmxhYmVsIH0pKTtcbiAgICAgIHRoaXMuY2VsbENvbG9yT3B0aW9ucyA9IG9wdGlvbnMuY2VsbENvbG9yT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVuc2l0eUJhckZvciAhPT0gdGhpcy52aWV3LmRlbnNpdHlDb2xvcm1hcCB8fCAhdGhpcy5kZW5zaXR5Q29sb3JCYXJDc3MpIHtcbiAgICAgIHRoaXMuZGVuc2l0eUJhckZvciA9IHRoaXMudmlldy5kZW5zaXR5Q29sb3JtYXA7XG4gICAgICB0aGlzLmRlbnNpdHlDb2xvckJhckNzcyA9IGRlbnNpdHlDb2xvckJhckNzcyh0aGlzLnZpZXcuZGVuc2l0eUNvbG9ybWFwKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBvdXRsaW5lcyBhcmUgb24g4oCUIHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGF1dG9tYXRpY2FsbHkgZm9yIGRhdGEgdGhhdCBoYXMgdGhlbS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsc09uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjZWxsc1Nob3duKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KTtcbiAgfVxuXG4gIC8qKiBUaGUgYm91bmRhcnkgc2V0IGRyYXduLCBvciBcImJvdGhcIiwgYXMgdGhlIHJlbmRlcmVyIHJlc29sdmVzIHRoZSB2aWV3J3MgY2hvaWNlOiBhIHNldCB0aGlzXG4gICAqICBkYXRhc2V0IGhhcywgZWxzZSBpdHMgZGVmYXVsdCwgZWxzZSBpdHMgZmlyc3QuICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2VsbFNldCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkcmF3biA9IGRyYXduQ2VsbFNldHModGhpcy5kYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHRoaXMudmlldy5jZWxsU2V0KTtcbiAgICByZXR1cm4gZHJhd24/Lm51Y2xldXNTZXQgPyAnYm90aCcgOiAoZHJhd24/LnNldCA/PyBudWxsKTtcbiAgfVxuXG4gIC8qKiBGaWxsIG9wYWNpdHkgYXMgYSAw4oCTMTAwIG51bWJlciwgZm9yIHRoZSBib3ggYmVzaWRlIHRoZSBzbGlkZXIuICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbE9wYWNpdHlQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3LmNlbGxPcGFjaXR5ICogMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNob3dDZWxscyhvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2V0KHNldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogc2V0IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYm91bmRhcnkgc2V0IGBuYW1lYCBpcyBkcmF3bjogb3V0bGluZXMgb24sIGFuZCB0aGF0IHNldCBvciBib3RoLiAqL1xuICBwcm90ZWN0ZWQgYm91bmRhcnlPbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2VsbHNPbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRyYXduID0gZHJhd25DZWxsU2V0cyh0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcywgdGhpcy52aWV3LmNlbGxTZXQpO1xuICAgIHJldHVybiBkcmF3bj8uc2V0ID09PSBuYW1lIHx8IGRyYXduPy5udWNsZXVzU2V0ID09PSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0J3Mgc3dpdGNoOiBvbiBkcmF3cyBpdCB3aXRoIHRoZSBvdGhlciB3aGVuIHRoYXQgb25lIGlzIGRyYXduIChcImJvdGhcIiksIGVsc2UgYWxvbmU7XG4gICAqIG9mZiBsZWF2ZXMgdGhlIG90aGVyIGRyYXduLCBvciBubyBvdXRsaW5lcyBhdCBhbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Cb3VuZGFyeShuYW1lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgb3RoZXIgPSB0aGlzLmJvdW5kYXJ5U2V0cy5maW5kKChzKSA9PiBzLm5hbWUgIT09IG5hbWUpPy5uYW1lO1xuICAgIGNvbnN0IG90aGVyT24gPSAhIW90aGVyICYmIHRoaXMuYm91bmRhcnlPbihvdGhlcik7XG4gICAgaWYgKG9uKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBzaG93Q2VsbHM6IHRydWUsIGNlbGxTZXQ6IG90aGVyT24gPyAnYm90aCcgOiBuYW1lIH0pO1xuICAgIH0gZWxzZSBpZiAob3RoZXJPbikge1xuICAgICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogb3RoZXIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbERyYXcoZHJhdzogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxEcmF3OiBkcmF3IH0pO1xuICB9XG5cbiAgLy8gUHJpbWVORydzIHNsaWRlciByZXBvcnRzIGBudW1iZXIgfCB1bmRlZmluZWRgOyBpZ25vcmUgdGhlIGVtcHR5IGNhc2UgcmF0aGVyIHRoYW5cbiAgLy8gd3JpdGluZyBgdW5kZWZpbmVkYCBpbnRvIHRoZSBzdG9yZS5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHlQZXJjZW50KHY6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IE1hdGgubWluKDEsIE1hdGgubWF4KDAuMDUsIHYgLyAxMDApKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvck1vZGUobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbENvbG9yTW9kZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbENvbG9yTW9kZTogbW9kZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvckdlbmUoZ2VuZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxDb2xvckdlbmU6IGdlbmUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2luZ2xlQ29sb3IoaGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsU2luZ2xlQ29sb3I6IGhleCB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLXBhbmVsXCIgW2NsYXNzLm9wZW5dPVwib3BlblwiPlxuICA8ZGl2IGNsYXNzPVwic2MtcGFuZWwtaGVhZFwiIChjbGljayk9XCJvcGVuQ2hhbmdlLmVtaXQoIW9wZW4pXCI+XG4gICAgPHAtY2hlY2tib3hcbiAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJjZWxsc09uXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uU2hvd0NlbGxzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPjwvcC1jaGVja2JveD5cbiAgICA8c3BhbiBjbGFzcz1cInNjLXBhbmVsLXRpdGxlXCI+Q2VsbHM8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaVwiIFtjbGFzcy5waS1jaGV2cm9uLWRvd25dPVwib3BlblwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFvcGVuXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLXBhbmVsLWJvZHlcIiAqbmdJZj1cIm9wZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCAmJiBib3VuZGFyeVNldHMubGVuZ3RoIDw9IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0Zvcj1cImxldCBzZXQgb2YgYm91bmRhcnlTZXRzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+e3sgc2V0LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8cC1pbnB1dFN3aXRjaFxuICAgICAgICAgIFtuZ01vZGVsXT1cImJvdW5kYXJ5T24oc2V0Lm5hbWUpXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Cb3VuZGFyeShzZXQubmFtZSwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNldC5sYWJlbFwiXG4gICAgICAgID48L3AtaW5wdXRTd2l0Y2g+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCA+IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxTZXRPcHRpb25zXCJcbiAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVDZWxsU2V0XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsU2V0KCRldmVudClcIlxuICAgICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgICAgID48L3Atc2VsZWN0QnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5Db2xvcmluZzwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q2VsbCBDb2xvcjwvc3Bhbj5cbiAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxDb2xvck9wdGlvbnNcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yTW9kZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbENvbG9yTW9kZSgkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgID48L3AtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gICAgPHNtYWxsIGNsYXNzPVwic2MtaGludFwiICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ3JvdXAnXCI+XG4gICAgICBBZGp1c3QgY2VsbCBjb2xvciBpbiB0aGUgZ3JvdXBzIHNlY3Rpb24gYmVsb3cuXG4gICAgPC9zbWFsbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2VuZXM/LnN0YXRlJCB8IGFzeW5jIGFzIGdlbmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnICYmIGRhdGFzZXQ/LmZlYXR1cmVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+R2VuZTwvc3Bhbj5cbiAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBbb3B0aW9uc109XCJnZW5lLm9wdGlvbnNcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yR2VuZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsQ29sb3JHZW5lKCRldmVudClcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgZmlsdGVyQnk9XCJsYWJlbFwiXG4gICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgIChvbkZpbHRlcik9XCJnZW5lcz8ub25GaWx0ZXIoJGV2ZW50LmZpbHRlcilcIlxuICAgICAgICAgIChvblNob3cpPVwiZ2VuZXM/LmVuc3VyZUxpc3QoKVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2VuZS5vcHRpb25zLmxlbmd0aCA+IGdlbmVWaXJ0dWFsU2Nyb2xsRnJvbVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzMFwiXG4gICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBnZW5lc+KAplwiXG4gICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtcm93XCIgKm5nSWY9XCJ2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdzaW5nbGUnXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkNvbG9yPC9zcGFuPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgIGNsYXNzPVwic2MtY29sb3ItaW5wdXRcIlxuICAgICAgICBbdmFsdWVdPVwidmlldy5jZWxsU2luZ2xlQ29sb3JcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uQ2VsbFNpbmdsZUNvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnIHx8IHZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3RyYW5zY3JpcHREZW5zaXR5J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLWNvbG9yYmFyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JCYXJDc3MgfHwgZGVuc2l0eUNvbG9yQmFyQ3NzXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8c3BhdGlhbC1ncm91cHMtcGFuZWwgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCIgW2RhdGFzZXRdPVwiZGF0YXNldFwiIFt2aWV3XT1cInZpZXdcIj48L3NwYXRpYWwtZ3JvdXBzLXBhbmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5WaXNpYmlsaXR5PC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5WaWV3IGNlbGxzIGFzPC9zcGFuPlxuICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgW29wdGlvbnNdPVwiY2VsbERyYXdPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxEcmF3XCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbERyYXcoJGV2ZW50KVwiXG4gICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICBzdHlsZUNsYXNzPVwic2MtYnV0dG9uc1wiXG4gICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXcuY2VsbERyYXcgIT09ICdvdXRsaW5lJ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5DZWxsIGZpbGwgb3BhY2l0eTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3cgc2Mtcm93LW51bWJlclwiPlxuICAgICAgICA8cC1zbGlkZXJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxPcGFjaXR5XCJcbiAgICAgICAgICBbbWluXT1cIjAuMDVcIlxuICAgICAgICAgIFttYXhdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBdPVwiMC4wNVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2VsbE9wYWNpdHkoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgID48L3Atc2xpZGVyPlxuICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgIFtuZ01vZGVsXT1cImNlbGxPcGFjaXR5UGVyY2VudFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsT3BhY2l0eVBlcmNlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW21pbl09XCI1XCJcbiAgICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJzYy1udW1cIlxuICAgICAgICA+PC9wLWlucHV0TnVtYmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBbUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7QUFFN0U7Ozs7Ozs7R0FPRztBQVNILE1BQU0sT0FBTywwQkFBMEI7SUFSdkM7UUFTRSxvR0FBb0c7UUFDM0YsYUFBUSxHQUE0QixJQUFJLENBQUM7UUFDbEQscUNBQXFDO1FBQzVCLFlBQU8sR0FBMEIsSUFBSSxDQUFDO1FB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Q0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDOzhHQTlIVSwwQkFBMEI7a0dBQTFCLDBCQUEwQixzTkM5QnZDLHlxRkE2RUEsNHRORHBEWSxZQUFZLCtQQUFFLFdBQVcsOFZBQUUsaUJBQWlCLDRSQUFFLGlCQUFpQix5dkJBQUUsa0JBQWtCLHdWQUFFLFlBQVk7OzJGQUtoRywwQkFBMEI7a0JBUnRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLG1CQUczRix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl0QyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbnB1dFN3aXRjaE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXRzd2l0Y2gnO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUsIENlbGxzM2RTdGF0dXMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duLCBkcmF3bkNlbGxTZXRzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgUGFuZWxPcHRpb24sIHRpbGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsJztcblxuLyoqXG4gKiBUaGUgT2JzZXJ2YXRpb25zIHNlY3Rpb24ncyBcIkNlbGwgc2VnbWVudGF0aW9uc1wiIHBhcnQgKHByb2plY3RlZCBpbnRvIGl0KSwgc2hvd24gd2hpbGUgdGhlXG4gKiBvYnNlcnZhdGlvbnMgYXJlIHNob3duIGFzIGNlbGxzOiB3aGljaCBib3VuZGFyeSBzZXRzIGFyZSBkcmF3biBhbmQgaG93IHRoZSBjZWxscyBhcmUgZHJhd24gKGZpbGwsXG4gKiBvdXRsaW5lLCBvcGFjaXR5KSwgb3IgaW4gM0QsIGJ5IGNlbGwgdHlwZSBvciBlYWNoIGJ5IGl0c2VsZi4gVGhlaXIgY29sb3VyIGlzIHRoZSBzZWN0aW9uJ3NcbiAqIHNoYXJlZCBcIkNvbG91ciBieVwiLCB0aGUgbWFya2VycycgdG9vLlxuICpcbiAqIFdyaXRlcyBvbmx5IHRocm91Z2ggYGNvbnRyb2xzLnNldFZpZXdTdGF0ZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwtY2VsbHMtcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgSW5wdXRTd2l0Y2hNb2R1bGUsIElucHV0TnVtYmVyTW9kdWxlLCBTZWxlY3RCdXR0b25Nb2R1bGUsIFNsaWRlck1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbENlbGxzUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogVGhlIHNwYXRpYWwgY29udHJvbHMgdGhpcyBwYW5lbCByZWFkcyBhbmQgd3JpdGVzIHRocm91Z2g7IG51bGwgd2l0aG91dCBhIGBTUEFUSUFMX0RBVEFfUE9SVGAuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xzOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCBvbiBvZmZlciwgb3IgbnVsbC4gKi9cbiAgQElucHV0KCkgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNwYXRpYWwgdmlldyBzdGF0ZTogd2hhdCBpcyBkcmF3biwgYW5kIGhvdy4gKi9cbiAgQElucHV0KCkgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSA9IERFRkFVTFRfU1BBVElBTF9WSUVXO1xuICAvKipcbiAgICogSW4gdGhlIDNEIHZpZXc6IHRoZSBjZWxscyBhcmUgYSAzRCBzZWdtZW50YXRpb24ncywgZHJhd24gYnkgY2VsbCB0eXBlIG9yIGVhY2ggYnkgaXRzZWxmLCBhbmRcbiAgICogdGhlIDJEIGJvdW5kYXJpZXMgYW5kIGRyYXcgbW9kZSBkbyBub3QgYXBwbHkuXG4gICAqL1xuICBASW5wdXQoKSBpczNkID0gZmFsc2U7XG4gIC8qKiBUaGUgM0QgdmlldydzIGluZGl2aWR1YWwgY2VsbHMgYXMgdGhleSBzdGFuZCAobnVsbDogbm9uZSBkcmF3bikuICovXG4gIEBJbnB1dCgpIGNlbGxzM2RTdGF0dXM6IENlbGxzM2RTdGF0dXMgfCBudWxsID0gbnVsbDtcblxuICAvKiogSG93IHRoZSAzRCB2aWV3IGRyYXdzIHRoZSBjZWxsczogb25lIHN1cmZhY2UgcGVyIGNlbGwgdHlwZSwgb3IgZWFjaCBjZWxsIGJ5IGl0c2VsZi4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzM2RPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWydjZWxsczNkJ10+W10gPSBbXG4gICAgeyBsYWJlbDogJ0J5IGNlbGwgdHlwZScsIHZhbHVlOiAndHlwZXMnIH0sXG4gICAgeyBsYWJlbDogJ0luZGl2aWR1YWwgY2VsbHMnLCB2YWx1ZTogJ2NlbGxzJyB9LFxuICBdO1xuXG4gIHByb3RlY3RlZCBvbkNlbGxzM2QobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbHMzZCddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbHMzZDogbW9kZSB9KTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSAzRCBjZWxscycgc3RhdHVzIGxpbmUgc2F5cywgb3IgbnVsbC4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsczNkSGludCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzID0gdGhpcy5jZWxsczNkU3RhdHVzO1xuICAgIGlmICghcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbiA9IHMuc2hvd24udG9Mb2NhbGVTdHJpbmcoKTtcbiAgICBpZiAocy5idWlsZGluZykgcmV0dXJuIHMuc2hvd24gPyBgQnVpbGRpbmcgY2VsbHPigKYgJHtufSBzaG93biBzbyBmYXJgIDogJ0J1aWxkaW5nIGNlbGxz4oCmJztcbiAgICBpZiAocy5jYXBwZWQpIHJldHVybiBgJHtufSBjZWxscyBzaG93biwgbmVhcmVzdCB0aGUgY2VudHJlIG9mIHRoZSB2aWV3LiBab29tIGluIG9yIG1vdmUgdG8gc2VlIHRoZSBvdGhlcnMuYDtcbiAgICByZXR1cm4gYCR7bn0gY2VsbHMgc2hvd24sIGVhY2ggYnkgaXRzZWxmLmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbERyYXdPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWydjZWxsRHJhdyddPltdID0gW1xuICAgIHsgbGFiZWw6ICdGaWxsJywgdmFsdWU6ICdmaWxsJyB9LFxuICAgIHsgbGFiZWw6ICdPdXRsaW5lJywgdmFsdWU6ICdvdXRsaW5lJyB9LFxuICAgIHsgbGFiZWw6ICdCb3RoJywgdmFsdWU6ICdib3RoJyB9LFxuICBdO1xuXG4gIC8qKlxuICAgKiBPcHRpb24gbGlzdHMgZm9yIHRoZSBjZWxsIGNvbnRyb2xzLiBCdWlsdCBvbmNlIHBlciBkYXRhc2V0IHJhdGhlciB0aGFuIGluIGdldHRlcnM6IGFcbiAgICogZ2V0dGVyIHJldHVybnMgYSBmcmVzaCBhcnJheSBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MsIGFuZCBQcmltZU5HIHJlLXJlbmRlcnNcbiAgICogaXRzIGJ1dHRvbnMgd2hlbmV2ZXIgdGhlIGFycmF5IGlkZW50aXR5IGNoYW5nZXMg4oCUIHdoaWNoIG1hZGUgdGhlbSBpbXBvc3NpYmxlIHRvIGNsaWNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNlbGxTZXRPcHRpb25zOiBQYW5lbE9wdGlvbjxzdHJpbmc+W10gPSBbXTtcbiAgLyoqXG4gICAqIFRoZSBib3VuZGFyeSBzZXRzLCB0aGUgY2VsbHMnIGZpcnN0LCBlYWNoIHdpdGggYSBzd2l0Y2ggd2hlbiB0aGVyZSBhcmUgYXQgbW9zdCB0d28gKGFzXG4gICAqIEN5dG9DYW52YXMncyBcIkNlbGwgQm91bmRhcmllc1wiIGFuZCBcIk51Y2xlYXIgQm91bmRhcmllc1wiKTogZWl0aGVyLCBib3RoIG9yIG5laXRoZXIgZHJhd24uXG4gICAqIE1vcmUgc2V0cyBrZWVwIHRoZSBvbmUtb2YgY2hvaWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGJvdW5kYXJ5U2V0czogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhc2V0J10pIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aWxlT3B0aW9ucyh0aGlzLmRhdGFzZXQpO1xuICAgICAgdGhpcy5jZWxsU2V0T3B0aW9ucyA9IG9wdGlvbnMuY2VsbFNldE9wdGlvbnM7XG4gICAgICB0aGlzLmJvdW5kYXJ5U2V0cyA9IFsuLi4odGhpcy5kYXRhc2V0Py5wb2x5Z29uVGlsZXM/LnNldHMgPz8gW10pXVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA9PT0gJ2NlbGwnID8gLTEgOiBiLm5hbWUgPT09ICdjZWxsJyA/IDEgOiAwKSlcbiAgICAgICAgLm1hcCgoc2V0KSA9PiAoeyBuYW1lOiBzZXQubmFtZSwgbGFiZWw6IHNldC5sYWJlbCB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgb3V0bGluZXMgYXJlIG9uIOKAlCB0aGUgZXhwbGljaXQgY2hvaWNlLCBvciBhdXRvbWF0aWNhbGx5IGZvciBkYXRhIHRoYXQgaGFzIHRoZW0uICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbHNPbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2VsbHNTaG93bih0aGlzLmRhdGFzZXQsIHRoaXMudmlldyk7XG4gIH1cblxuICAvKiogVGhlIGJvdW5kYXJ5IHNldCBkcmF3biwgb3IgXCJib3RoXCIsIGFzIHRoZSByZW5kZXJlciByZXNvbHZlcyB0aGUgdmlldydzIGNob2ljZTogYSBzZXQgdGhpc1xuICAgKiAgZGF0YXNldCBoYXMsIGVsc2UgaXRzIGRlZmF1bHQsIGVsc2UgaXRzIGZpcnN0LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNlbGxTZXQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgZHJhd24gPSBkcmF3bkNlbGxTZXRzKHRoaXMuZGF0YXNldD8ucG9seWdvblRpbGVzLCB0aGlzLnZpZXcuY2VsbFNldCk7XG4gICAgcmV0dXJuIGRyYXduPy5udWNsZXVzU2V0ID8gJ2JvdGgnIDogKGRyYXduPy5zZXQgPz8gbnVsbCk7XG4gIH1cblxuICAvKiogRmlsbCBvcGFjaXR5IGFzIGEgMOKAkzEwMCBudW1iZXIsIGZvciB0aGUgYm94IGJlc2lkZSB0aGUgc2xpZGVyLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNlbGxPcGFjaXR5UGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMudmlldy5jZWxsT3BhY2l0eSAqIDEwMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TaG93Q2VsbHMob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBzaG93Q2VsbHM6IG9uIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbFNldChzZXQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxTZXQ6IHNldCB9KTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGJvdW5kYXJ5IHNldCBgbmFtZWAgaXMgZHJhd246IG91dGxpbmVzIG9uLCBhbmQgdGhhdCBzZXQgb3IgYm90aC4gKi9cbiAgcHJvdGVjdGVkIGJvdW5kYXJ5T24obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNlbGxzT24pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkcmF3biA9IGRyYXduQ2VsbFNldHModGhpcy5kYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHRoaXMudmlldy5jZWxsU2V0KTtcbiAgICByZXR1cm4gZHJhd24/LnNldCA9PT0gbmFtZSB8fCBkcmF3bj8ubnVjbGV1c1NldCA9PT0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCdzIHN3aXRjaDogb24gZHJhd3MgaXQgd2l0aCB0aGUgb3RoZXIgd2hlbiB0aGF0IG9uZSBpcyBkcmF3biAoXCJib3RoXCIpLCBlbHNlIGFsb25lO1xuICAgKiBvZmYgbGVhdmVzIHRoZSBvdGhlciBkcmF3biwgb3Igbm8gb3V0bGluZXMgYXQgYWxsLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQm91bmRhcnkobmFtZTogc3RyaW5nLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG90aGVyID0gdGhpcy5ib3VuZGFyeVNldHMuZmluZCgocykgPT4gcy5uYW1lICE9PSBuYW1lKT8ubmFtZTtcbiAgICBjb25zdCBvdGhlck9uID0gISFvdGhlciAmJiB0aGlzLmJvdW5kYXJ5T24ob3RoZXIpO1xuICAgIGlmIChvbikge1xuICAgICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgc2hvd0NlbGxzOiB0cnVlLCBjZWxsU2V0OiBvdGhlck9uID8gJ2JvdGgnIDogbmFtZSB9KTtcbiAgICB9IGVsc2UgaWYgKG90aGVyT24pIHtcbiAgICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxTZXQ6IG90aGVyIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBzaG93Q2VsbHM6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxEcmF3KGRyYXc6IFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxEcmF3J10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsRHJhdzogZHJhdyB9KTtcbiAgfVxuXG4gIC8vIFByaW1lTkcncyBzbGlkZXIgcmVwb3J0cyBgbnVtYmVyIHwgdW5kZWZpbmVkYDsgaWdub3JlIHRoZSBlbXB0eSBjYXNlIHJhdGhlciB0aGFuXG4gIC8vIHdyaXRpbmcgYHVuZGVmaW5lZGAgaW50byB0aGUgc3RvcmUuXG4gIHByb3RlY3RlZCBvbkNlbGxPcGFjaXR5KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxPcGFjaXR5OiB2YWx1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxPcGFjaXR5UGVyY2VudCh2OiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHYgPT09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZSh2KSkgcmV0dXJuO1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxPcGFjaXR5OiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLjA1LCB2IC8gMTAwKSkgfSk7XG4gIH1cbn1cbiIsIjwhLS0gQ2VsbCBzZWdtZW50YXRpb25zOiBob3cgdGhlIGNlbGxzIGFyZSBkcmF3biB3aGlsZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBzaG93biBhcyB0aGVtLiBUaGVpclxuICAgICBjb2xvdXIgaXMgdGhlIE9ic2VydmF0aW9ucyBzZWN0aW9uJ3MgXCJDb2xvdXIgYnlcIiwgdGhlIG1hcmtlcnMnIHRvby4gLS0+XG48ZGl2IGNsYXNzPVwic2Mtc3ViaGVhZFwiPkNlbGwgc2VnbWVudGF0aW9uczwvZGl2PlxuXG48IS0tIDNEOiB0aGUgY2VsbHMgYXMgb25lIHN1cmZhY2UgcGVyIGNlbGwgdHlwZSwgb3IgZWFjaCBpdHMgb3duIHN1cmZhY2UgaW4gdGhlIGNvbG91cmluZy4gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwiaXMzZFwiPlxuICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkluIDNEPC9zcGFuPlxuICA8cC1zZWxlY3RCdXR0b25cbiAgICBbb3B0aW9uc109XCJjZWxsczNkT3B0aW9uc1wiXG4gICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgW25nTW9kZWxdPVwidmlldy5jZWxsczNkXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxzM2QoJGV2ZW50KVwiXG4gICAgW2FsbG93RW1wdHldPVwiZmFsc2VcIlxuICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgPjwvcC1zZWxlY3RCdXR0b24+XG4gIDxzbWFsbCBjbGFzcz1cInNjLWhpbnRcIiAqbmdJZj1cInZpZXcuY2VsbHMzZCA9PT0gJ3R5cGVzJ1wiPlxuICAgIEVhY2ggY2VsbCB0eXBlIGlzIG9uZSBzdXJmYWNlLiBBIHR5cGUgY2FuIGJlIHNob3duIGFzIGl0cyBjZWxscyBpbiB0aGUgUmVnaW9uIEVkaXRvci5cbiAgPC9zbWFsbD5cbiAgPHNtYWxsIGNsYXNzPVwic2MtaGludFwiICpuZ0lmPVwiY2VsbHMzZEhpbnRcIj57eyBjZWxsczNkSGludCB9fTwvc21hbGw+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpczNkICYmIGJvdW5kYXJ5U2V0cy5sZW5ndGggJiYgYm91bmRhcnlTZXRzLmxlbmd0aCA8PSAyXCI+XG4gIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Qm91bmRhcmllczwvc3Bhbj5cbiAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0Zvcj1cImxldCBzZXQgb2YgYm91bmRhcnlTZXRzXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj57eyBzZXQubGFiZWwgfX08L3NwYW4+XG4gICAgPHAtaW5wdXRTd2l0Y2hcbiAgICAgIFtuZ01vZGVsXT1cImJvdW5kYXJ5T24oc2V0Lm5hbWUpXCJcbiAgICAgIChvbkNoYW5nZSk9XCJvbkJvdW5kYXJ5KHNldC5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzZXQubGFiZWxcIlxuICAgID48L3AtaW5wdXRTd2l0Y2g+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzM2QgJiYgYm91bmRhcnlTZXRzLmxlbmd0aCA+IDJcIj5cbiAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5Cb3VuZGFyaWVzPC9zcGFuPlxuICA8cC1zZWxlY3RCdXR0b25cbiAgICBbb3B0aW9uc109XCJjZWxsU2V0T3B0aW9uc1wiXG4gICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgW25nTW9kZWxdPVwiYWN0aXZlQ2VsbFNldFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsU2V0KCRldmVudClcIlxuICAgIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgICBzdHlsZUNsYXNzPVwic2MtYnV0dG9uc1wiXG4gID48L3Atc2VsZWN0QnV0dG9uPlxuPC9uZy1jb250YWluZXI+XG5cbjxzcGFuIGNsYXNzPVwic2MtbGJsXCIgKm5nSWY9XCIhaXMzZFwiPlZpZXcgY2VsbHMgYXM8L3NwYW4+XG48cC1zZWxlY3RCdXR0b25cbiAgKm5nSWY9XCIhaXMzZFwiXG4gIFtvcHRpb25zXT1cImNlbGxEcmF3T3B0aW9uc1wiXG4gIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgW25nTW9kZWxdPVwidmlldy5jZWxsRHJhd1wiXG4gIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbERyYXcoJGV2ZW50KVwiXG4gIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgc3R5bGVDbGFzcz1cInNjLWJ1dHRvbnNcIlxuPjwvcC1zZWxlY3RCdXR0b24+XG48bmctY29udGFpbmVyICpuZ0lmPVwiaXMzZCB8fCB2aWV3LmNlbGxEcmF3ICE9PSAnb3V0bGluZSdcIj5cbiAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj57eyBpczNkID8gJ0NlbGwgb3BhY2l0eScgOiAnQ2VsbCBmaWxsIG9wYWNpdHknIH19PC9zcGFuPlxuICA8ZGl2IGNsYXNzPVwic2Mtcm93IHNjLXJvdy1udW1iZXJcIj5cbiAgICA8cC1zbGlkZXJcbiAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbE9wYWNpdHlcIlxuICAgICAgW21pbl09XCIwLjA1XCJcbiAgICAgIFttYXhdPVwiMVwiXG4gICAgICBbc3RlcF09XCIwLjA1XCJcbiAgICAgIChvbkNoYW5nZSk9XCJvbkNlbGxPcGFjaXR5KCRldmVudC52YWx1ZSlcIlxuICAgID48L3Atc2xpZGVyPlxuICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICBbbmdNb2RlbF09XCJjZWxsT3BhY2l0eVBlcmNlbnRcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsT3BhY2l0eVBlcmNlbnQoJGV2ZW50KVwiXG4gICAgICBbbWluXT1cIjVcIlxuICAgICAgW21heF09XCIxMDBcIlxuICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgIGlucHV0U3R5bGVDbGFzcz1cInNjLW51bVwiXG4gICAgPjwvcC1pbnB1dE51bWJlcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==