@jax-data-science/sci-image-visualizer 0.15.0 → 0.17.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 (47) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +2 -1
  2. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  3. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  4. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +10 -8
  5. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +226 -39
  6. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +269 -0
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +6 -7
  9. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -1
  10. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +33 -8
  11. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +6 -2
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +10 -6
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +9 -5
  14. package/esm2022/lib/spatial/spatial-controls.facade.mjs +7 -4
  15. package/esm2022/lib/spatial/spatial-encoding.mjs +18 -1
  16. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  17. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +7 -3
  18. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  19. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +67 -19
  20. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +61 -8
  21. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +3 -3
  22. package/esm2022/lib/toolbar/toolbar.component.mjs +13 -4
  23. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +7 -7
  24. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs} +795 -165
  25. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +1 -0
  26. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs} +2 -2
  27. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map} +1 -1
  28. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  29. package/lib/contracts/display-types.d.ts +9 -2
  30. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  31. package/lib/implementations/napari-js/napari-scene.d.ts +2 -0
  32. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +3 -3
  33. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +82 -9
  34. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +62 -0
  35. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  36. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +5 -6
  37. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +16 -3
  38. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +1 -1
  39. package/lib/spatial/spatial-encoding.d.ts +10 -0
  40. package/lib/spatial-controls/spatial-controls.component.d.ts +2 -0
  41. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  42. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +25 -0
  43. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +14 -3
  44. package/lib/toolbar/toolbar.component.d.ts +6 -0
  45. package/lib/toolbar/view-controls/view-controls.component.d.ts +3 -3
  46. package/package.json +2 -2
  47. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { PointPicker, colormapFromLut } from 'napari-js';
2
- import { ScaleBarOverlay } from 'napari-js/overlays';
2
+ import { ScaleBarOverlay, formatLength } from 'napari-js/overlays';
3
3
  import { findColumnMeta, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
4
- import { DEFAULT_MUTED_OPACITY, resolveCategoryColors } from '../../spatial/spatial-encoding';
4
+ import { DEFAULT_MUTED_OPACITY, categoryColorsFor, groupColorsKey } from '../../spatial/spatial-encoding';
5
5
  import { emptySelection, maskToIndices } from '../../spatial/spatial-selection';
6
6
  import { defaultSigma, densityGrid } from '../../spatial/spatial-density';
7
7
  import { observationsInSection, sectionsOf } from '../../spatial/spatial-sections';
@@ -13,12 +13,60 @@ import { VolumeRegionMeshes } from './napari-volume-region-meshes';
13
13
  import { isAbortError } from '../tile-server';
14
14
  import { GENE_MAP_SIGMA, GENE_MAP_VOLUME_STRIDE, SPATIAL_3D_BASE_SIZE, SPATIAL_SELECTED_SIZE_SCALE, encodeSpatial3dCategorical, encodeSpatial3dContinuous, gatherColors, rankDensityGroups, spatialFlatColormap, totalDensityGroup, } from './napari-spatial-encoding';
15
15
  import { HOVER_RADIUS_PX } from './napari-spatial-hover';
16
+ import { Axes3dGizmo, surface3dControls } from './napari-axes-gizmo';
17
+ import { NapariVolumeZHandle } from './napari-volume-z-handle';
18
+ import { Spatial3dTranscripts } from './napari-spatial-3d-transcripts';
16
19
  import { SpatialSceneBase } from './napari-spatial-scene';
20
+ /** The least Z stretch: a tenth of the true depth. */
21
+ export const SPATIAL_Z_SCALE_MIN = 0.1;
22
+ /** The most Z stretch a cloud allows, at least: the Volume view's. */
23
+ const SPATIAL_Z_SCALE_MAX = 10;
24
+ /** Nor more than this, however thin the cloud is. */
25
+ const SPATIAL_Z_SCALE_CEILING = 1000;
26
+ /**
27
+ * The most a box's Z may be stretched: until it is twice as deep as it is wide, so even a section
28
+ * microns thick and millimetres wide can be stood up into a block — but never less than the
29
+ * Volume view's 10x, nor more than {@link SPATIAL_Z_SCALE_CEILING}.
30
+ */
31
+ export function spatialZScaleMax(box) {
32
+ const flat = (2 * Math.max(box.width, box.height)) / Math.max(box.depth, 1e-9);
33
+ return Math.min(SPATIAL_Z_SCALE_CEILING, Math.max(SPATIAL_Z_SCALE_MAX, flat));
34
+ }
35
+ /**
36
+ * The Z handle's drag (px) per doubling: the Volume view's 180 px, less when the range is wider,
37
+ * so going from the true depth to the most stretch is about the same drag (~540 px) either way.
38
+ */
39
+ export function spatialZPixelsPerDouble(maxScale) {
40
+ return Math.max(60, Math.min(180, 540 / Math.log2(Math.max(2, maxScale))));
41
+ }
42
+ /**
43
+ * The X/Y/Z axis-end labels for a box (as drawn: Z stretched by `zScale`), its true lengths in µm
44
+ * when the dataset declares `micronsPerUnit`, else in its own units. A stretched Z says by how much,
45
+ * so its length is never read off the drawing.
46
+ */
47
+ export function spatialAxesLabels(drawn, zScale, micronsPerUnit) {
48
+ const hx = drawn.width / 2;
49
+ const hy = drawn.height / 2;
50
+ const hz = drawn.depth / 2;
51
+ const mpu = micronsPerUnit && micronsPerUnit > 0 ? micronsPerUnit : 0;
52
+ const len = (n) => (mpu ? formatLength(n * mpu, 'µm') : `${+n.toPrecision(3)} units`);
53
+ const stretch = Math.abs(zScale - 1) > 1e-3 ? ` (×${+zScale.toPrecision(3)})` : '';
54
+ return [
55
+ { anchor: [hx, -hy, -hz], text: `X · ${len(drawn.width)}`, color: '#ed4545' },
56
+ { anchor: [-hx, hy, -hz], text: `Y · ${len(drawn.height)}`, color: '#4dd959' },
57
+ { anchor: [-hx, -hy, hz], text: `Z · ${len(drawn.depth / zScale)}${stretch}`, color: '#668cff' },
58
+ ];
59
+ }
17
60
  /**
18
61
  * SPATIAL_OMICS_3D (review Appendix B, cluster K): observations as a 3D point cloud under the
19
62
  * orbit camera, with the dataset's reference volume around it, per-cluster density volumes and the
20
63
  * 3D gene map.
21
64
  *
65
+ * Everything sits in one box centred on the world origin (see {@link ensureFrame}): the reference
66
+ * volume's, else the density grid's. The Volume view's axes gizmo and Z-height handle are drawn on
67
+ * it, and the handle stretches Z: the cloud through its `scale3d`, every volume through its voxel
68
+ * size, so nothing is re-uploaded while dragging (see {@link setZScale}).
69
+ *
22
70
  * Thinner than the 2D scene: there is no tissue image to render (a registered volume like the
23
71
  * Allen CCF has no single reference plane), so no readback and no navigator; the 3D scale bar
24
72
  * follows the dataset (see {@link installScaleBar}). The region tools work in SCREEN space through
@@ -59,6 +107,14 @@ export class Spatial3dScene extends SpatialSceneBase {
59
107
  this.geneMapKey = null;
60
108
  /** Offset applied to observation coordinates to sit them in the volume's box. */
61
109
  this.origin = [0, 0, 0];
110
+ /** The box everything sits in, before the Z stretch, centred on the origin (see ensureFrame). */
111
+ this.box = null;
112
+ this.boxKey = null;
113
+ /** The axes gizmo on {@link box} and the handle that stretches its Z (see setZScale). */
114
+ this.gizmo = null;
115
+ this.zHandle = null;
116
+ /** Each volume layer's own voxel size, before the Z stretch. */
117
+ this.baseVoxels = new WeakMap();
62
118
  /**
63
119
  * napari-js's depth-aware pick over the cloud, and the projection the ROI selection reads. It
64
120
  * owns the caching policy: re-project lazily, on the first pick after the camera, the canvas or
@@ -80,6 +136,7 @@ export class Spatial3dScene extends SpatialSceneBase {
80
136
  * this scene carries it). */
81
137
  this.invertSub = null;
82
138
  this.regionMeshes = new VolumeRegionMeshes(ctx.viewer);
139
+ this.transcripts3d = new Spatial3dTranscripts(ctx.viewer, (label) => ctx.badge.begin(label));
83
140
  }
84
141
  /** Show these region reconstructions with the cloud (replacing the ones shown). */
85
142
  setRegionMeshes(meshes) {
@@ -115,7 +172,8 @@ export class Spatial3dScene extends SpatialSceneBase {
115
172
  const [vx, vy, vz] = meta.voxelSize;
116
173
  this.regionMeshes.setFrame({
117
174
  size: [meta.width, meta.height, meta.depth],
118
- world: [meta.width * vx, meta.height * vy, meta.depth * vz],
175
+ world: [meta.width * vx, meta.height * vy, meta.depth * vz * this.zScale()],
176
+ zScale: this.zScale(),
119
177
  });
120
178
  }
121
179
  /**
@@ -153,6 +211,64 @@ export class Spatial3dScene extends SpatialSceneBase {
153
211
  histogram() {
154
212
  return null;
155
213
  }
214
+ /** The toolbar's 3D controls, as the Volume view's: drag mode, re-framing and the axes. */
215
+ surface3dControls() {
216
+ return surface3dControls(this.ctx, () => this.gizmo);
217
+ }
218
+ /**
219
+ * Stretch Z by `factor` (1 = the data's true proportions), as the Z handle drags it: the cloud
220
+ * through its `scale3d`, each volume through its voxel size, the axes and the region surfaces
221
+ * with them — all about the world origin, which the box is centred on, so they stay aligned.
222
+ * Nothing is re-uploaded. Kept in the settings, so a re-plot keeps it.
223
+ */
224
+ setZScale(factor) {
225
+ const max = this.box ? spatialZScaleMax(this.box) : SPATIAL_Z_SCALE_MAX;
226
+ this.ctx.settings.spatialZScale = Math.min(max, Math.max(SPATIAL_Z_SCALE_MIN, factor));
227
+ this.applyZScale();
228
+ }
229
+ /** The Z stretch in effect: the setting, within what this box allows. */
230
+ zScale() {
231
+ const max = this.box ? spatialZScaleMax(this.box) : SPATIAL_Z_SCALE_MAX;
232
+ const s = this.ctx.settings.spatialZScale;
233
+ return Math.min(max, Math.max(SPATIAL_Z_SCALE_MIN, s > 0 ? s : 1));
234
+ }
235
+ applyZScale() {
236
+ const s = this.zScale();
237
+ if (this.points)
238
+ this.points.scale3d = [1, 1, s];
239
+ this.transcripts3d.setZScale(s);
240
+ for (const layer of [this.volume, this.geneMapLayer, ...this.densityLayers]) {
241
+ const base = layer && this.baseVoxels.get(layer);
242
+ if (layer && base)
243
+ layer.voxelSize = [base[0], base[1], base[2] * s];
244
+ }
245
+ const dataset = this.session.latest?.[0];
246
+ if (this.gizmo && this.box) {
247
+ const drawn = this.drawnBox(this.box);
248
+ this.gizmo.setDepth(drawn.depth, spatialAxesLabels(drawn, s, dataset?.micronsPerUnit));
249
+ }
250
+ this.zHandle?.reposition();
251
+ if (dataset)
252
+ this.placeRegionMeshes(dataset);
253
+ this.ctx.viewer.requestRender();
254
+ }
255
+ /** `box` with its Z stretched as drawn. */
256
+ drawnBox(box) {
257
+ return { width: box.width, height: box.height, depth: box.depth * this.zScale() };
258
+ }
259
+ /**
260
+ * Add a volume layer with its Z stretched as the rest of the scene is, remembering its own
261
+ * voxel size so a later stretch can be applied to it.
262
+ */
263
+ addVolume(viewer, data, width, height, depth, opts) {
264
+ const [vx, vy, vz] = opts.voxelSize;
265
+ const layer = viewer.addVolume(data, width, height, depth, {
266
+ ...opts,
267
+ voxelSize: [vx, vy, vz * this.zScale()],
268
+ });
269
+ this.baseVoxels.set(layer, [vx, vy, vz]);
270
+ return layer;
271
+ }
156
272
  /**
157
273
  * Every observation's position on the canvas under the current 3D camera (for the ROI
158
274
  * selection), indexed by observation with NaN for anything not drawn. Null before the cloud
@@ -183,6 +299,7 @@ export class Spatial3dScene extends SpatialSceneBase {
183
299
  }
184
300
  dispose() {
185
301
  this.regionMeshes.clear();
302
+ this.transcripts3d.remove();
186
303
  this.disposeSpatial();
187
304
  this.invertSub?.unsubscribe();
188
305
  this.invertSub = null;
@@ -190,6 +307,7 @@ export class Spatial3dScene extends SpatialSceneBase {
190
307
  this.geneMapLoads.cancel();
191
308
  this.scaleBar?.dispose();
192
309
  this.scaleBar = null;
310
+ this.removeAxes();
193
311
  // Drop the cached interleaved coordinates too: holding 3.7M x 3 floats after
194
312
  // a teardown is ~45MB of retained heap for a scene that no longer exists.
195
313
  this.positions = null;
@@ -302,8 +420,9 @@ export class Spatial3dScene extends SpatialSceneBase {
302
420
  await this.ensureVolume(viewer, dataset, view);
303
421
  if (!task())
304
422
  return;
305
- // Then the cluster density volumes, which can set the centring offset when
306
- // there is no reference volume — so before any position is computed from it.
423
+ // The box everything sits in, before any position is computed from its centring offset.
424
+ this.ensureFrame(dataset);
425
+ // Then the cluster density volumes.
307
426
  await this.ensureDensityVolumes(viewer, dataset, view, selection);
308
427
  if (!task())
309
428
  return;
@@ -326,6 +445,11 @@ export class Spatial3dScene extends SpatialSceneBase {
326
445
  this.volume.opacity = view.volumeOpacity;
327
446
  }
328
447
  this.drawCloud(viewer, dataset, view, selection, enc, geneShown);
448
+ // The transcripts last: they sit in the box the cloud fixed, and their first read can take a while.
449
+ await this.transcripts3d.sync(dataset, view, this.session.port, {
450
+ origin: this.origin,
451
+ zScale: this.zScale(),
452
+ });
329
453
  }
330
454
  /**
331
455
  * Draw the point cloud: a new layer for new geometry (a dataset or a section), the colour
@@ -362,6 +486,7 @@ export class Spatial3dScene extends SpatialSceneBase {
362
486
  this.scalarKey = scalarKey;
363
487
  this.points = viewer.addPoints3D(this.positions, valuesFor(), {
364
488
  name: 'observations',
489
+ scale3d: [1, 1, this.zScale()],
365
490
  colormap,
366
491
  contrastLimits,
367
492
  size,
@@ -570,7 +695,7 @@ export class Spatial3dScene extends SpatialSceneBase {
570
695
  const lo = 0;
571
696
  const data = encodeExpressionVolume(field, [lo, hi], { log: view.logScale });
572
697
  const lut = this.ctx.display.spatialLut(view);
573
- this.geneMapLayer = viewer.addVolume(data, field.width, field.height, field.depth, {
698
+ this.geneMapLayer = this.addVolume(viewer, data, field.width, field.height, field.depth, {
574
699
  name: `gene map · ${gene}${interpolate ? ' · volume' : ''}`,
575
700
  colormap: colormapFromLut(`gene-map-${gene}`, lut),
576
701
  // The encoding already applied the window, so the layer must not apply a
@@ -615,7 +740,13 @@ export class Spatial3dScene extends SpatialSceneBase {
615
740
  // holding the same number of cells would otherwise look like the same key and
616
741
  // leave the previous ROI's fields on screen.
617
742
  const key = on
618
- ? [dataset.id, column ?? 'all', smoothing, this.session.selectionRev(selection)].join('|')
743
+ ? [
744
+ dataset.id,
745
+ column ?? 'all',
746
+ smoothing,
747
+ this.session.selectionRev(selection),
748
+ groupColorsKey(column, view.groupColors),
749
+ ].join('|')
619
750
  : null;
620
751
  if (key === this.densityKey)
621
752
  return;
@@ -626,24 +757,13 @@ export class Spatial3dScene extends SpatialSceneBase {
626
757
  const load = this.densityLoads.next();
627
758
  if (!key)
628
759
  return;
760
+ // The density box is the scene's box (ensureFrame), so the cloud already sits in it.
629
761
  const grid = densityGrid(dataset);
630
762
  if (!grid)
631
763
  return;
632
- // With no reference volume there is no offset yet, and a VolumeLayer has no
633
- // translate — napari centres its box on the world origin. So the POINTS move by
634
- // half the density box, exactly as they do for a reference volume, and the
635
- // cached geometry is invalidated because that offset just changed.
636
- if (!this.volume) {
637
- this.origin = [
638
- -(grid.width * grid.voxelSize[0]) / 2,
639
- -(grid.height * grid.voxelSize[1]) / 2,
640
- -(grid.depth * grid.voxelSize[2]) / 2,
641
- ];
642
- this.layerKey = null;
643
- }
644
764
  let groups;
645
765
  try {
646
- groups = await this.densityGroups(dataset, column, selection);
766
+ groups = await this.densityGroups(dataset, column, selection, view);
647
767
  }
648
768
  catch (err) {
649
769
  console.warn('[napari-js] density volumes: column unavailable', err);
@@ -679,7 +799,7 @@ export class Spatial3dScene extends SpatialSceneBase {
679
799
  // A cluster with nothing on the grid draws no layer, rather than an empty box.
680
800
  if (!data)
681
801
  return;
682
- this.densityLayers.push(viewer.addVolume(data, grid.width, grid.height, grid.depth, {
802
+ this.densityLayers.push(this.addVolume(viewer, data, grid.width, grid.height, grid.depth, {
683
803
  name: `density · ${group.name}`,
684
804
  colormap: this.ctx.display.channelTintColormap(group.color),
685
805
  invert: this.ctx.display.invert,
@@ -702,7 +822,7 @@ export class Spatial3dScene extends SpatialSceneBase {
702
822
  * which is a real question on its own ("where is the tissue dense?") and the honest thing to
703
823
  * show when the view is not encoding a taxonomy.
704
824
  */
705
- async densityGroups(dataset, column, selection) {
825
+ async densityGroups(dataset, column, selection, view) {
706
826
  const port = this.session.port;
707
827
  const meta = column ? findColumnMeta(dataset, column) : undefined;
708
828
  if (!port || !column || !meta || meta.kind !== 'categorical')
@@ -710,19 +830,14 @@ export class Spatial3dScene extends SpatialSceneBase {
710
830
  const loaded = await port.getColumn(column);
711
831
  if (!isCategoricalColumn(loaded))
712
832
  return [];
713
- return rankDensityGroups(column, loaded, dataset.observations.count, selection);
833
+ return rankDensityGroups(column, loaded, dataset.observations.count, selection, view.groupColors);
714
834
  }
715
835
  /**
716
- * Add (or keep) the dataset's reference volume, and derive the offset that sits the
717
- * observations inside it.
718
- *
719
- * `VolumeLayer` has no translate: napari-js maps the volume's unit cube to a world box
720
- * **centred on the origin**, sized `dims x voxelSize`. The observations, by contract, are in
721
- * the volume's own frame with its near corner at the coordinate origin. So the two only line
722
- * up if the POINTS move — by half the box — which is what {@link origin} is.
836
+ * Add (or keep) the dataset's reference volume. The offset that sits the observations inside
837
+ * it is {@link ensureFrame}'s.
723
838
  *
724
- * A failed or absent volume is not fatal: the cloud renders on its own, at its own
725
- * coordinates, and the camera frames the points instead.
839
+ * A failed or absent volume is not fatal: the cloud renders on its own, in the same box, and
840
+ * the camera frames the points instead.
726
841
  */
727
842
  async ensureVolume(viewer, dataset, view) {
728
843
  const meta = dataset.volume;
@@ -737,7 +852,6 @@ export class Spatial3dScene extends SpatialSceneBase {
737
852
  }
738
853
  // The surfaces sat in the volume just removed (or there was none): down until one is placed.
739
854
  this.regionMeshes.clearFrame();
740
- this.origin = [0, 0, 0];
741
855
  if (!meta || !port?.getVolume)
742
856
  return;
743
857
  let voxels;
@@ -752,7 +866,7 @@ export class Spatial3dScene extends SpatialSceneBase {
752
866
  return;
753
867
  const [vx, vy, vz] = meta.voxelSize;
754
868
  this.volumeKey = key;
755
- this.volume = viewer.addVolume(voxels, meta.width, meta.height, meta.depth, {
869
+ this.volume = this.addVolume(viewer, voxels, meta.width, meta.height, meta.depth, {
756
870
  name: 'reference volume',
757
871
  colormap: 'gray',
758
872
  // MIP would draw the brightest voxel along each ray, which for an averaged
@@ -765,16 +879,85 @@ export class Spatial3dScene extends SpatialSceneBase {
765
879
  });
766
880
  if (this.regionsThrough)
767
881
  this.volume.blending = 'translucent_no_depth';
768
- // Half the box, negated: the observations' origin is the box's near corner,
769
- // and the box is centred on the world origin.
770
- this.origin = [-(meta.width * vx) / 2, -(meta.height * vy) / 2, -(meta.depth * vz) / 2];
771
882
  this.placeRegionMeshes(dataset);
883
+ }
884
+ /**
885
+ * The box everything sits in, centred on the world origin, and the offset that sits the
886
+ * observations in it; with the axes gizmo and the Z handle on it.
887
+ *
888
+ * `VolumeLayer` has no translate: napari-js maps a volume's unit cube to a world box centred on
889
+ * the origin, sized `dims x voxelSize`. The observations, by contract, are in the reference
890
+ * volume's frame with its near corner at the coordinate origin, and the density grid is measured
891
+ * from the coordinate origin the same way (`densityGrid`), so its box is the reference volume's
892
+ * when there is one. So the POINTS move by half that box — {@link origin} — and every volume, the
893
+ * reference, the densities and the gene map, lines up with them and with each other. Without a
894
+ * reference volume this centres the cloud too, which the axes and the Z stretch need: both work
895
+ * about the origin.
896
+ */
897
+ ensureFrame(dataset) {
898
+ const meta = dataset.volume;
899
+ const key = `${dataset.id}:${dataset.observations.count}:${meta ? `${meta.width}x${meta.height}x${meta.depth}` : '-'}`;
900
+ if (key === this.boxKey)
901
+ return;
902
+ this.boxKey = key;
903
+ const grid = densityGrid(dataset);
904
+ this.box = grid
905
+ ? {
906
+ width: grid.width * grid.voxelSize[0],
907
+ height: grid.height * grid.voxelSize[1],
908
+ depth: grid.depth * grid.voxelSize[2],
909
+ }
910
+ : null;
911
+ const box = this.box;
912
+ this.origin = box ? [-box.width / 2, -box.height / 2, -box.depth / 2] : [0, 0, 0];
772
913
  // Force a geometry rebuild: the offset changed, so cached positions are stale.
773
914
  this.layerKey = null;
915
+ this.installAxes(dataset);
916
+ // A stretch chosen for another box may be past what this one allows: draw what is in effect.
917
+ this.applyZScale();
918
+ }
919
+ /**
920
+ * The Volume view's axes gizmo and Z-height handle, on {@link box}. The handle floats past the
921
+ * top of the Z axis (the box's min-XY corner, where the blue axis and its label are), by a share
922
+ * of the box's largest side rather than of its depth, so it clears the label even while a thin
923
+ * section is drawn flat.
924
+ */
925
+ installAxes(dataset) {
926
+ this.removeAxes();
927
+ const box = this.box;
928
+ if (!box)
929
+ return;
930
+ const { viewer, host, settings } = this.ctx;
931
+ const drawn = this.drawnBox(box);
932
+ this.gizmo = new Axes3dGizmo(viewer, host, drawn, spatialAxesLabels(drawn, this.zScale(), dataset.micronsPerUnit), {
933
+ visible: settings.axesVisible,
934
+ });
935
+ const maxScale = spatialZScaleMax(box);
936
+ this.zHandle = new NapariVolumeZHandle(host, viewer.camera3d, {
937
+ topAnchor: () => {
938
+ const d = this.drawnBox(box);
939
+ return [-d.width / 2, -d.height / 2, d.depth / 2 + 0.08 * Math.max(d.width, d.height, d.depth)];
940
+ },
941
+ getScale: () => this.zScale(),
942
+ setScale: (s) => this.setZScale(s),
943
+ minScale: SPATIAL_Z_SCALE_MIN,
944
+ maxScale,
945
+ pixelsPerDouble: spatialZPixelsPerDouble(maxScale),
946
+ });
947
+ }
948
+ removeAxes() {
949
+ if (this.gizmo) {
950
+ this.ctx.viewer.layers.remove(this.gizmo.layer);
951
+ this.gizmo.destroy();
952
+ this.gizmo = null;
953
+ }
954
+ this.zHandle?.destroy();
955
+ this.zHandle = null;
774
956
  }
775
957
  /** Drop every layer of the cloud (the dataset went away, or has no z). */
776
958
  removeLayers(viewer) {
777
959
  this.regionMeshes.clearFrame();
960
+ this.transcripts3d.remove();
778
961
  for (const layer of [this.points, this.volume, this.geneMapLayer, ...this.densityLayers]) {
779
962
  if (layer)
780
963
  viewer.layers.remove(layer);
@@ -792,6 +975,9 @@ export class Spatial3dScene extends SpatialSceneBase {
792
975
  this.volume = null;
793
976
  this.volumeKey = null;
794
977
  this.origin = [0, 0, 0];
978
+ this.box = null;
979
+ this.boxKey = null;
980
+ this.removeAxes();
795
981
  this.points = null;
796
982
  this.setPicker(null);
797
983
  this.layerKey = null;
@@ -824,7 +1010,7 @@ export class Spatial3dScene extends SpatialSceneBase {
824
1010
  if (colorBy.kind === 'column') {
825
1011
  const column = await port.getColumn(colorBy.name);
826
1012
  if (isCategoricalColumn(column)) {
827
- return encodeSpatial3dCategorical(column.codes, resolveCategoryColors(column.meta));
1013
+ return encodeSpatial3dCategorical(column.codes, categoryColorsFor(colorBy.name, column.meta, view.groupColors));
828
1014
  }
829
1015
  return this.encodeContinuous(column.values, view);
830
1016
  }
@@ -861,6 +1047,7 @@ function cloudSubset(dataset, view, geneShown = null) {
861
1047
  const scalarKey = [
862
1048
  key,
863
1049
  view.colorBy ? `${view.colorBy.kind}:${view.colorBy.name}` : 'flat',
1050
+ groupColorsKey(view.colorBy?.kind === 'column' ? view.colorBy.name : null, view.groupColors),
864
1051
  observationGeneStyleKey(view),
865
1052
  view.logScale ? 'log' : 'lin',
866
1053
  clip.join(','),
@@ -883,4 +1070,4 @@ function keepShown(indices, shown, count) {
883
1070
  }
884
1071
  return out.subarray(0, n);
885
1072
  }
886
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JELE9BQU8sRUFJTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUYsT0FBTyxFQUF3QixjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkYsT0FBTyxFQUNMLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHVCQUF1QixHQUN4QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFFTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUVMLGNBQWMsRUFD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Q0FBQztJQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludFBpY2tlciwgY29sb3JtYXBGcm9tTHV0IH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVmlld2VyLCBWb2x1bWVMYXllciB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBTY2FsZUJhck92ZXJsYXkgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgZmluZENvbHVtbk1ldGEsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfTVVURURfT1BBQ0lUWSwgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFNpZ21hLCBkZW5zaXR5R3JpZCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1kZW5zaXR5JztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2VjdGlvbiwgc2VjdGlvbnNPZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWN0aW9ucyc7XG5pbXBvcnQge1xuICBnZW5lRmlsdGVyS2V5LFxuICBvYnNlcnZhdGlvbkdlbmVNYXNrLFxuICBvYnNlcnZhdGlvbkdlbmVTdHlsZSxcbiAgb2JzZXJ2YXRpb25HZW5lU3R5bGVLZXksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQge1xuICBFeHByZXNzaW9uVm9sdW1lRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsXG4gIGZpZWxkQ29udHJhc3RXaW5kb3csXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uVm9sdW1lQXN5bmMsIHJhc3Rlcml6ZURlbnNpdHlBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB0eXBlIHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb25NZXNoM0QsIFZvbHVtZVJlZ2lvbk1lc2hlcyB9IGZyb20gJy4vbmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7XG4gIERlbnNpdHlHcm91cCxcbiAgR0VORV9NQVBfU0lHTUEsXG4gIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsXG4gIFNQQVRJQUxfM0RfQkFTRV9TSVpFLFxuICBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gIFNwYXRpYWwzZEVuY29kaW5nLFxuICBTcGF0aWFsM2RTY2FsYXJzLFxuICBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbCxcbiAgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICByYW5rRGVuc2l0eUdyb3VwcyxcbiAgc3BhdGlhbEZsYXRDb2xvcm1hcCxcbiAgdG90YWxEZW5zaXR5R3JvdXAsXG59IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgSE9WRVJfUkFESVVTX1BYIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1ob3Zlcic7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKipcbiAqIFNQQVRJQUxfT01JQ1NfM0QgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEspOiBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCB1bmRlciB0aGVcbiAqIG9yYml0IGNhbWVyYSwgd2l0aCB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUgYXJvdW5kIGl0LCBwZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgYW5kIHRoZVxuICogM0QgZ2VuZSBtYXAuXG4gKlxuICogVGhpbm5lciB0aGFuIHRoZSAyRCBzY2VuZTogdGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkIHZvbHVtZSBsaWtlIHRoZVxuICogQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gcmVhZGJhY2sgYW5kIG5vIG5hdmlnYXRvcjsgdGhlIDNEIHNjYWxlIGJhclxuICogZm9sbG93cyB0aGUgZGF0YXNldCAoc2VlIHtAbGluayBpbnN0YWxsU2NhbGVCYXJ9KS4gVGhlIHJlZ2lvbiB0b29scyB3b3JrIGluIFNDUkVFTiBzcGFjZSB0aHJvdWdoXG4gKiB0aGUgdG9vbCBicmlkZ2UncyAzRCBpbnRlcmFjdGlvbiDigJQgYSBsYXNzbyBzZWxlY3RzIHRoZSBjZWxscyB1bmRlciBpdCwgYW5kIGFuIG9yYml0IGNsZWFycyB0aGVcbiAqIHNoYXBlIHdoaWxlIGtlZXBpbmcgdGhlIHNlbGVjdGlvbi4gVGhlIGZpcnN0IDNEIGxheWVyIGFkZGVkIGZyYW1lcyB0aGUgY2FtZXJhIChgZml0M2Q6ICdvbmNlJ2ApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDNkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogVGhlIDNEIHBvaW50IGNsb3VkLiBPbmUgbGF5ZXI6IHNlbGVjdGlvbiBpcyBhIHBlci1wb2ludCBhbHBoYSBvbiBpdCwgbm90IGEgc2Vjb25kLiAqL1xuICBwcml2YXRlIHBvaW50czogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEludGVybGVhdmVkIHgseSx6LCBjYWNoZWQgc28gYSBjb2xvdXIgY2hhbmdlIGRvZXMgbm90IHJlLXdhbGsgMy43TSBvYnNlcnZhdGlvbnMuICovXG4gIHByaXZhdGUgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzY2FsYXJzIGN1cnJlbnRseSB1cGxvYWRlZCDigJQgc2VlIHtAbGluayByZWJ1aWxkfS4gKi9cbiAgcHJpdmF0ZSBzY2FsYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyOyBudWxsIHdoZW4gZXZlcnlcbiAgICogIG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZSBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTlxuICAgKiAgb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0byB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXNcbiAgICogIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFuYXRvbWljYWwgdm9sdW1lIHRoZSBjbG91ZCBzaXRzIGluc2lkZSwgd2hlbiB0aGUgZGF0YXNldCBoYXMgb25lLiAqL1xuICBwcml2YXRlIHZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcCdzIHZvbHVtZSBsYXllciBhbmQgdGhlIGlucHV0cyBpdCB3YXMgY29sb3VyZWQgZm9yIChpdHMgZmllbGQgaXMgY2FjaGVkIGluXG4gICAqICB0aGUgc2Vzc2lvbiwgb24gYSBjbG9jayBvZiBpdHMgb3duKS4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIG9yaWdpbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKipcbiAgICogbmFwYXJpLWpzJ3MgZGVwdGgtYXdhcmUgcGljayBvdmVyIHRoZSBjbG91ZCwgYW5kIHRoZSBwcm9qZWN0aW9uIHRoZSBST0kgc2VsZWN0aW9uIHJlYWRzLiBJdFxuICAgKiBvd25zIHRoZSBjYWNoaW5nIHBvbGljeTogcmUtcHJvamVjdCBsYXppbHksIG9uIHRoZSBmaXJzdCBwaWNrIGFmdGVyIHRoZSBjYW1lcmEsIHRoZSBjYW52YXMgb3JcbiAgICogdGhlIGNsb3VkJ3MgZGF0YSBtb3ZlZCAobmV2ZXIgb24gdGhlIGNhbWVyYSBldmVudCwgc28gYW4gb3JiaXQgZHJhZyBwYXlzIG5vdGhpbmcpLCBpbnRvXG4gICAqIHJldXNlZCBidWZmZXJzLCB3aXRoIGEgc2NyZWVuIGluZGV4IG9uY2UgdGhlIGNsb3VkIGlzIGxhcmdlIGVub3VnaC5cbiAgICovXG4gIHByaXZhdGUgcGlja2VyOiBQb2ludFBpY2tlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBTY2FsZUJhck92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIERhdGFzZXQgdGhlIHNjYWxlIGJhciB3YXMgYnVpbHQgZm9yLiAqL1xuICBwcml2YXRlIHNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBkZW5zaXR5IHJhc3RlcmlzYXRpb24gYW5kIHRoZSAzRCBnZW5lLW1hcCBlc3RpbWF0ZSBpbiBmbGlnaHQgKG9mZiB0aGUgbWFpbiB0aHJlYWRcbiAgICogIHBhc3QgdGhlIHdvcmtlciB0aHJlc2hvbGQsIFNQQVRJQUwtMTkpOiBhIG5ldyBrZXkgc3VwZXJzZWRlcyDigJQgYW5kIGFib3J0cyDigJQgdGhlIHByZXZpb3VzXG4gICAqICBvbmU7IGEgcmVidWlsZCB0aGF0IGxlYXZlcyB0aGUga2V5IGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbnNpdHlMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lTWFwTG9hZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyAoYW4gYXRsYXMncyBzdHJ1Y3R1cmVzLCBpbXBvcnRlZCBvbnRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgaW1hZ2VcbiAgICogc3RhY2spLCBkcmF3biBieSB0aGUgc2FtZSB7QGxpbmsgVm9sdW1lUmVnaW9uTWVzaGVzfSBhcyB0aGUgVm9sdW1lIHZpZXcncywgc28gYSBzdHJ1Y3R1cmUgaXMgdGhlXG4gICAqIHNhbWUgc3VyZmFjZSBpbiBib3RoLiBQbGFjZWQgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBib3gsIG9uY2UgaXQgaXMgdGhlcmUgYW5kIHRoZSBpbWFnZSB0aGVcbiAgICogcmVnaW9ucyB3ZXJlIGRyYXduIG9uIGlzIHRoYXQgdm9sdW1lJ3Mgc3RhY2sgKHNlZSB7QGxpbmsgcGxhY2VSZWdpb25NZXNoZXN9KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uTWVzaGVzOiBWb2x1bWVSZWdpb25NZXNoZXM7XG4gIC8qKiBXaGV0aGVyIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGxldHMgZXZlcnkgcmVnaW9uIHN1cmZhY2UgdGhyb3VnaCAoc2VlIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVGhyb3VnaCA9IGZhbHNlO1xuICAvKiogVGhlIHN0b3JlJ3MgaW52ZXJ0IHNldHRpbmcsIHdoaWNoIHRoZSBkZW5zaXR5IHZvbHVtZXMgZm9sbG93IChubyBvdGhlciBzdWJzY3JpcHRpb24gb2ZcbiAgICogIHRoaXMgc2NlbmUgY2FycmllcyBpdCkuICovXG4gIHByaXZhdGUgaW52ZXJ0U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIGluZm8gdGhlIGltYWdlIHBsb3R0ZWQgd2l0aCB0aGUgY2xvdWQ6IHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgc3RhY2sgKHRoZSAyRCB2aWV3J3NcbiAgICogICAgICAgIGltYWdlLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGEgdm9sdW1lLCB3aGljaCB0aGUgcmVnaW9ucyBhcmUgb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHNlc3Npb246IFNwYXRpYWxTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5mbz86IElJbWFnZUluZm8sXG4gICkge1xuICAgIHN1cGVyKGN0eCwgc2Vzc2lvbiwgdHJ1ZSk7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMgPSBuZXcgVm9sdW1lUmVnaW9uTWVzaGVzKGN0eC52aWV3ZXIpO1xuICB9XG5cbiAgLyoqIFNob3cgdGhlc2UgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB3aXRoIHRoZSBjbG91ZCAocmVwbGFjaW5nIHRoZSBvbmVzIHNob3duKS4gKi9cbiAgc2V0UmVnaW9uTWVzaGVzKG1lc2hlczogcmVhZG9ubHkgUmVnaW9uTWVzaDNEW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXQobWVzaGVzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZ2hsaWdodChrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZ2hsaWdodChrZXlzKTtcbiAgfVxuXG4gIHNldFJlZ2lvbkhpZGRlbihrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEhpZGRlbihrZXlzKTtcbiAgfVxuXG4gIC8qKiBBcyB0aGUgVm9sdW1lIHZpZXc6IHRoZSByZWZlcmVuY2Ugdm9sdW1lIGhpZGVzIHRoZSBzdXJmYWNlcyBiZWhpbmQgd2hhdCBpdCBzaG93cywgb3Igbm9uZS4gKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2ggPSB0aHJvdWdoO1xuICAgIGlmICh0aGlzLnZvbHVtZSkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSB0aHJvdWdoID8gJ3RyYW5zbHVjZW50X25vX2RlcHRoJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGFjZSB0aGUgcmVnaW9uIHN1cmZhY2VzIGluIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgYm94LCBhcyB0aGUgVm9sdW1lIHZpZXcgcGxhY2VzIHRoZW0gaW4gaXRzXG4gICAqIG93bjogaW1hZ2UgcGl4ZWwgKHgsIHkpIGlzIHZveGVsICh4LCB5KSwgc2xpY2UgayBpcyB2b3hlbCBwbGFuZSBrLCBhbmQgdGhlIGJveCBpcyB0aGUgdm9sdW1lJ3NcbiAgICogdm94ZWxzIHRpbWVzIGl0cyB2b3hlbCBzaXplLCBjZW50cmVkIG9uIHRoZSBvcmlnaW4gYXMgbmFwYXJpIGNlbnRyZXMgdGhlIHZvbHVtZSAoYW5kIHRoZSBjbG91ZFxuICAgKiBpcyBvZmZzZXQgdG8gc2l0IGluIGl0KS4gT25seSB3aGVuIHRoZSBwbG90dGVkIGltYWdlIElTIHRoYXQgdm9sdW1lJ3Mgc3RhY2s6IHJlZ2lvbnMgZHJhd24gb25cbiAgICogYW5vdGhlciBpbWFnZSAoYSB0aXNzdWUgaW1hZ2UpIGhhdmUgbm8gcGxhY2UgaW4gaXQsIGFuZCBhcmUgbm90IHNob3duIC0gbm9yIGFyZSBzdXJmYWNlc1xuICAgKiBwbGFjZWQgaW4gYSB2b2x1bWUgdGhpcyBvbmUgcmVwbGFjZWQuXG4gICAqL1xuICBwcml2YXRlIHBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0KTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGlmICghbWV0YSB8fCAhdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpKSB7XG4gICAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFt2eCwgdnksIHZ6XSA9IG1ldGEudm94ZWxTaXplO1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEZyYW1lKHtcbiAgICAgIHNpemU6IFttZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aF0sXG4gICAgICB3b3JsZDogW21ldGEud2lkdGggKiB2eCwgbWV0YS5oZWlnaHQgKiB2eSwgbWV0YS5kZXB0aCAqIHZ6XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbWFnZSBweCBwZXIgdm94ZWwgb2YgdGhlIHZvbHVtZSB0aGUgc3VyZmFjZXMgc2l0IGluOiAxLCB0aGUgcmVmZXJlbmNlIHZvbHVtZSBiZWluZyB0aGUgc3RhY2snc1xuICAgKiBvd24gdm94ZWxzLCBhcyB0aGUgVm9sdW1lIHZpZXcncyBpcyBhdCBmdWxsIHJlc29sdXRpb24sIHNvIGJvdGggcmVjb25zdHJ1Y3QgYSBjbGFzcyBhbGlrZSAoYW5kXG4gICAqIHNoYXJlIGl0cyBjYWNoZWQgc3VyZmFjZSkuIE51bGwgd2hpbGUgdGhlcmUgaXMgbm8gdm9sdW1lIHN0YWNrIHRvIHBsYWNlIHRoZW0gaW4uXG4gICAqL1xuICB2b3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuc2Vzc2lvbi5sYXRlc3Q/LlswXT8udm9sdW1lO1xuICAgIHJldHVybiB0aGlzLnZvbHVtZSAmJiBtZXRhICYmIHRoaXMuaXNWb2x1bWVTdGFjayhtZXRhKSA/IDEgOiBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHBsb3R0ZWQgaW1hZ2UgaXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBzdGFjazogaXRzIHNpemUgYW5kIHNsaWNlIGNvdW50LiAqL1xuICBwcml2YXRlIGlzVm9sdW1lU3RhY2sobWV0YTogTm9uTnVsbGFibGU8U3BhdGlhbERhdGFzZXRbJ3ZvbHVtZSddPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmluZm87XG4gICAgY29uc3QgW3csIGhdID0gaW5mbz8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgcmV0dXJuICEhaW5mbz8uaXNTdGFjayAmJiB3ID09PSBtZXRhLndpZHRoICYmIGggPT09IG1ldGEuaGVpZ2h0ICYmIChpbmZvLnVybHM/Lmxlbmd0aCA/PyAwKSA9PT0gbWV0YS5kZXB0aDtcbiAgfVxuXG4gIGFzeW5jIG1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24sIHNvIHRoZSBmaXJzdCBidWlsZCBhbHJlYWR5IHJlYWRzIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgIHRoaXMuaW52ZXJ0U3ViID0gdGhpcy5jdHguZGlzcGxheS53YXRjaEludmVydCgoaW52ZXJ0KSA9PiB7XG4gICAgICAvLyBBIGxpdmUgc2V0dGVyOiB0aGUgdm9sdW1lcyByZXN0eWxlLCBub3RoaW5nIGlzIHJhc3RlcmlzZWQgYWdhaW4uXG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgbGF5ZXIuaW52ZXJ0ID0gaW52ZXJ0O1xuICAgICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgICB0aGlzLmN0eC50b29scy5pbnN0YWxsM2RJbnRlcmFjdGlvbih0aGlzLmN0eC52aWV3ZXIsIHRoaXMuY3R4Lmhvc3QpO1xuICAgIHRoaXMuaG92ZXIuaW5zdGFsbCh0aGlzLmN0eC5ob3N0KTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgfVxuXG4gIC8qKiBUaGUgb2JzZXJ2YXRpb25zJyBvd24geiBpcyBvbiBzY3JlZW46IHRoZXJlIGlzIG5vIHBsYW5lIHRvIHN0ZXAuICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogQSBjbG91ZCBoYXMgbm8gaW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGhpc3RvZ3JhbSBwYW5lLiAqL1xuICBoaXN0b2dyYW0oKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IG9ic2VydmF0aW9uJ3MgcG9zaXRpb24gb24gdGhlIGNhbnZhcyB1bmRlciB0aGUgY3VycmVudCAzRCBjYW1lcmEgKGZvciB0aGUgUk9JXG4gICAqIHNlbGVjdGlvbiksIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24gd2l0aCBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gTnVsbCBiZWZvcmUgdGhlIGNsb3VkXG4gICAqIGlzIGJ1aWx0LlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpcyB0aGUgcGlja2VyJ3MgKHNlZSB7QGxpbmsgcGlja2VyfSk7IHdoYXQgaXMgbGVmdCBpcyB0aGUgcGFydCB0aGF0IGlzXG4gICAqIGdlbnVpbmVseSB0aGlzIGFkYXB0ZXInczogU0NBVFRFUklORyB0aGUgZHJhd24gc3Vic2V0IGJhY2sgaW50byBvYnNlcnZhdGlvbiBvcmRlci4gVGhlIGNsb3VkXG4gICAqIGhvbGRzIG9ubHkgdGhlIHBvaW50cyBvZiB0aGUgZGlzcGxheWVkIHNlY3Rpb24sIGluIGl0cyBvd24gcGFja2luZzsgZXZlcnkgY29uc3VtZXIgaW5kZXhlcyBieVxuICAgKiBvYnNlcnZhdGlvbi4gTmFOIHN0YW5kcyBmb3IgXCJub3Qgb24gc2NyZWVuXCIsIHdoaWNoIGlzIGFsc28gdGhlIHJpZ2h0IGFuc3dlciBmb3IgYW5cbiAgICogb2JzZXJ2YXRpb24gd2hvc2Ugc2VjdGlvbiBpcyBoaWRkZW4uXG4gICAqL1xuICBzY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMucGlja2VyPy5wcm9qZWN0ZWQoKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZHJhd24gPSB0aGlzLmRyYXduO1xuICAgIGNvbnN0IHsgc2NyZWVuIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhcigpO1xuICAgIHRoaXMuZGlzcG9zZVNwYXRpYWwoKTtcbiAgICB0aGlzLmludmVydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmludmVydFN1YiA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5nZW5lTWFwTG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIC8vIERyb3AgdGhlIGNhY2hlZCBpbnRlcmxlYXZlZCBjb29yZGluYXRlcyB0b286IGhvbGRpbmcgMy43TSB4IDMgZmxvYXRzIGFmdGVyXG4gICAgLy8gYSB0ZWFyZG93biBpcyB+NDVNQiBvZiByZXRhaW5lZCBoZWFwIGZvciBhIHNjZW5lIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5zZXRQaWNrZXIobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9ic2VydmF0aW9uIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uOiB0aGUgRlJPTlQtbW9zdCBtYXJrZXIgd2l0aGluIGBzbGFja1B4YCBvZiB0aGVcbiAgICogcG9pbnRlciAodGllcyBieSBkaXN0YW5jZSksIGFzIG5hcGFyaS1qcydzIHtAbGluayBQb2ludFBpY2tlcn0gcGlja3MgaXQuIFRoYXQgbWF0dGVycyBtb3JlXG4gICAqIHRoYW4gaXQgc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhIGNlbGwgdGhhdFxuICAgKiBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLiBUaGUgcGlja2VyIGFsc28gdGFrZXMgZWFjaCBwb2ludCdzIHJhZGl1cyBmcm9tIHRoZSBsYXllcidzXG4gICAqIHBlci1wb2ludCBgc2l6ZXNgLCBzbyBhIHNlbGVjdGVkIG1hcmtlciwgZHJhd24gbGFyZ2VyLCBpcyBhcyBsYXJnZSB0byB0aGUgcG9pbnRlci5cbiAgICovXG4gIHByb3RlY3RlZCBwaWNrT2JzZXJ2YXRpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGlja2VyID0gdGhpcy5waWNrZXI7XG4gICAgaWYgKCFwaWNrZXIpIHJldHVybiAtMTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jdHguY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGsgPSBwaWNrZXIucGljayhjbGllbnRYIC0gcmVjdC5sZWZ0LCBjbGllbnRZIC0gcmVjdC50b3AsIHNsYWNrUHgpO1xuICAgIGlmIChrIDwgMCkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0aGlzLmRyYXduID8gdGhpcy5kcmF3bltrXSA6IGs7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgY2xvdWQncyBwaWNrZXIgKG51bGw6IG5vIGNsb3VkKSwgcmVsZWFzaW5nIHRoZSBvbGQgb25lJ3MgY2FtZXJhIGxpc3RlbmVyLiAqL1xuICBwcml2YXRlIHNldFBpY2tlcihwb2ludHM6IFBvaW50czNETGF5ZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tlciA9IHBvaW50c1xuICAgICAgPyBuZXcgUG9pbnRQaWNrZXIodGhpcy5jdHgudmlld2VyLCBwb2ludHMsIHtcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgaG92ZXIgc2xhY2sgdGltZXMgdGhlIHNjYWxlIGEgU0VMRUNURURcbiAgICAgICAgICAvLyBtYXJrZXIgaXMgZHJhd24gYXQuIEl0IGRlY2lkZXMgd2hldGhlciBhIG1hcmtlciBzdHJhZGRsaW5nIHRoZSBjYW52YXMgZWRnZSBpcyBmb3VuZC5cbiAgICAgICAgICBtYXhSZWFjaDogSE9WRVJfUkFESVVTX1BYICogU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBuYXBhcmktanMncyBgU2NhbGVCYXJPdmVybGF5YCBpbiBgJzNkJ2AgbW9kZSBtZWFzdXJlcyB0aGVyZTogQ1NTIHB4IHBlciB3b3JsZCB1bml0IGlzIHRoZVxuICAgKiByZWNpcHJvY2FsIG9mIGBDYW1lcmEzRC53b3JsZFBlclBpeGVsYCDigJQgdGhlIHNjYWxlIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci5cbiAgICogVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2ggYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lc1xuICAgKiBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYSBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhXG4gICAqIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1pY3JvbnNQZXJVbml0ID0gZGF0YXNldD8ubWljcm9uc1BlclVuaXQ7XG4gICAgaWYgKCFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBTY2FsZUJhck92ZXJsYXkodGhpcy5jdHguaG9zdCwgdGhpcy5jdHgudmlld2VyLCB7XG4gICAgICB1bml0UGVyV29ybGQ6IG1pY3JvbnNQZXJVbml0LFxuICAgICAgbW9kZTogJzNkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGljaCBvYnNlcnZhdGlvbnMgdGhlIGdlbmUgZmlsdGVyIGtlZXBzLCBzZXR0bGVkIGFwYXJ0IGZyb20gdGhlaXIgY29sb3VyczogYSBjb2xvdXJcbiAgICAgICAgLy8gY2FuIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb25cbiAgICAgICAgLy8gd291bGQgc2hvdyBhcyBpZiBpdCBleHByZXNzZWQgdGhlIHBpY2tlZCBnZW5lcy4gU28gYSBmYWlsZWQgcmVhZCBrZWVwcyB0aGUgY2xvdWQgYXMgaXRcbiAgICAgICAgLy8gd2FzIGRyYXduLCBhbmQgdGhlIHBhbmVsIHNheXMgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgYXBwbGllZC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBnZW5lU2hvd24gPSBwb3J0XG4gICAgICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIOKAlCBrZWVwaW5nIHRoZSBjbG91ZCBhcyBkcmF3bicsXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGFzaygpKSB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcih0cnVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5jID0gYXdhaXQgdGhpcy5zY2FsYXJFbmNvZGluZyh2aWV3LCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5kTG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKGZhbHNlKTtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZUxheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMsIHdoaWNoIGNhbiBzZXQgdGhlIGNlbnRyaW5nIG9mZnNldCB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHZvbHVtZSDigJQgc28gYmVmb3JlIGFueSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tIGl0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgZ2VuZSBtYXAsIHdoaWNoIHNoYXJlcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGxhdHRpY2Ug4oCUIHNvIGl0IGdvZXNcbiAgICAvLyBhZnRlciBhbnl0aGluZyB0aGF0IGNhbiBzdGlsbCBtb3ZlIHRoZSBjZW50cmluZyBvZmZzZXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zY2FsZUJhcktleSkge1xuICAgICAgdGhpcy5zY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcihkYXRhc2V0KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVmZXJlbmNlIHZvbHVtZSBpcyBoaWRkZW4sIG5vdCByZW1vdmVkOiBpdCBhbHNvIGZpeGVzIHRoZSBjZW50cmluZ1xuICAgIC8vIG9mZnNldCBldmVyeSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tLCBhbmQgcmUtZmV0Y2hpbmcgYSAxMDAgTUIgdGVtcGxhdGVcbiAgICAvLyB0byB1bi1oaWRlIGl0IHdvdWxkIG1ha2UgYSBjaGVja2JveCBmZWVsIGxpa2UgYSBsb2FkLlxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdGhpcy52b2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMudm9sdW1lLm9wYWNpdHkgPSB2aWV3LnZvbHVtZU9wYWNpdHk7XG4gICAgfVxuICAgIHRoaXMuZHJhd0Nsb3VkKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBlbmMsIGdlbmVTaG93bik7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcG9pbnQgY2xvdWQ6IGEgbmV3IGxheWVyIGZvciBuZXcgZ2VvbWV0cnkgKGEgZGF0YXNldCBvciBhIHNlY3Rpb24pLCB0aGUgY29sb3VyXG4gICAqIHNvdXJjZSBzd2FwcGVkIGluIHBsYWNlIG90aGVyd2lzZTsgdGhlbiB0aGUgc2VsZWN0aW9uIGFuZCB0aGUgdmlzaWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZHJhd0Nsb3VkKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCxcbiAgICBnZW5lU2hvd246IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBzaXplID0gU1BBVElBTF8zRF9CQVNFX1NJWkUgKiBzY2FsZTtcbiAgICAvLyBBIGNhdGVnb3JpY2FsIGNvbG91cmluZyBpcyBwZXItcG9pbnQgUkdCQSwgd2hpY2ggd2lucyBvdmVyIHRoZSBzY2FsYXJzOyB0aGUgZmxhdCBjb2xvcm1hcFxuICAgIC8vIGFuZCB6ZXJvIHNjYWxhcnMgc3RhbmQgYmVoaW5kIGl0LCBhcyB0aGV5IGRvIGZvciBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIuXG4gICAgY29uc3Qgc2NhbGFyID0gZW5jPy5raW5kID09PSAnc2NhbGFycycgPyBlbmMgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGVuYz8ua2luZCA9PT0gJ2NvbG9ycycgPyBlbmMuY29sb3JzIDogbnVsbDtcbiAgICBjb25zdCBzY2FsYXJzID0gc2NhbGFyPy52YWx1ZXMgPz8gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpO1xuICAgIGNvbnN0IGNvbG9ybWFwID0gc2NhbGFyPy5jb2xvcm1hcCA/PyBzcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBzY2FsYXI/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcbiAgICBjb25zdCB7IHNob3duLCBrZXksIHNjYWxhcktleSB9ID0gY2xvdWRTdWJzZXQoZGF0YXNldCwgdmlldywgZ2VuZVNob3duKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLmNsb3VkUG9zaXRpb25zKG9icywgc2hvd24pO1xuICAgICAgdGhpcy5kcmF3biA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS4gU28gZG8gdGhlIGNvbG91cnMuXG4gICAgY29uc3QgdmFsdWVzRm9yID0gKCkgPT4gKHNob3duID8gRmxvYXQzMkFycmF5LmZyb20oc2hvd24sIChpKSA9PiBzY2FsYXJzW2ldKSA6IHNjYWxhcnMpO1xuICAgIGNvbnN0IGNvbG9yc0ZvciA9ICgpID0+IChjb2xvcnMgPyAoZ2F0aGVyQ29sb3JzKGNvbG9ycywgc2hvd24gPz8gdW5kZWZpbmVkKSBhcyBGbG9hdDMyQXJyYXkpIDogbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMucG9pbnRzIHx8IGtleSAhPT0gdGhpcy5sYXllcktleSkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnBvaW50cykgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5sYXllcktleSA9IGtleTtcbiAgICAgIHRoaXMuc2NhbGFyS2V5ID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5wb3NpdGlvbnMhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgICBjb2xvcnM6IGNvbG9yc0ZvcigpID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRQaWNrZXIodGhpcy5wb2ludHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NhbGFyS2V5ICE9PSB0aGlzLnNjYWxhcktleSkge1xuICAgICAgICAvLyBBIGNoYW5nZSBvZiBjb2xvdXIgU09VUkNFLCB3aGljaCB1c2VkIHRvIG1lYW4gZGlzY2FyZGluZyB0aGUgbGF5ZXIgYW5kIGJ1aWxkaW5nXG4gICAgICAgIC8vIGFub3RoZXIg4oCUIGFuZCwgYmVjYXVzZSBhZGRpbmcgYSAzRCBsYXllciByZWZyYW1lcywgYSBjYW1lcmEganVtcCB0byB1bmRvIGFzIHdlbGwuXG4gICAgICAgIC8vIG5hcGFyaS1qcyDiiaUgMC4xNCBsZXRzIHRoZSBzY2FsYXJzIGJlIHJlcGxhY2VkIGluIHBsYWNlIOKAlCB0aGUgc2V0dGVyIGJ1bXBzIHRoZVxuICAgICAgICAvLyBsYXllcidzIGRhdGFWZXJzaW9uIHNvIHRoZSB2aXN1YWwgcmUtdXBsb2FkcyDigJQgYW5kIHRoZSBwb3NpdGlvbnMgaGF2ZSBub3QgbW92ZWQsXG4gICAgICAgIC8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgZm9yIHRoZSBjYW1lcmEgdG8gcmVmcmFtZS5cbiAgICAgICAgdGhpcy5zY2FsYXJLZXkgPSBzY2FsYXJLZXk7XG4gICAgICAgIHRoaXMucG9pbnRzLnZhbHVlcyA9IHZhbHVlc0ZvcigpO1xuICAgICAgICB0aGlzLnBvaW50cy5jb2xvcnMgPSBjb2xvcnNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9pbnRzLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnBvaW50cy5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5wb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvdWQgPSB0aGlzLnBvaW50cztcbiAgICBpZiAoY2xvdWQpIHtcbiAgICAgIGNsb3VkLm9wYWNpdHkgPSB2aWV3Lm9wYWNpdHk7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0aW9uKGNsb3VkLCBzZWxlY3Rpb24sIHNob3duLCBvYnMuY291bnQpO1xuICAgIH1cbiAgICAvLyBMYXN0LCBzbyBpdCBhbHNvIGNvdmVycyBhIGxheWVyIHRoaXMgcGFzcyBqdXN0IGNyZWF0ZWQuXG4gICAgaWYgKHRoaXMucG9pbnRzKSB0aGlzLnBvaW50cy52aXNpYmxlID0gdmlldy5zaG93UG9pbnRzO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHogb2YgdGhlIGBzaG93bmAgb2JzZXJ2YXRpb25zIChudWxsOiBhbGwgb2YgdGhlbSksIG9mZnNldCBieSB7QGxpbmsgb3JpZ2lufS4gKi9cbiAgcHJpdmF0ZSBjbG91ZFBvc2l0aW9ucyhvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHNob3duOiBVaW50MzJBcnJheSB8IG51bGwpOiBGbG9hdDMyQXJyYXkge1xuICAgIC8vIHJlYnVpbGQoKSBkcmF3cyBvbmx5IGEgZGF0YXNldCB3aG9zZSBvYnNlcnZhdGlvbnMgaGF2ZSBhIHouXG4gICAgY29uc3QgeiA9IG9icy56ITtcbiAgICBjb25zdCBbb3gsIG95LCBvel0gPSB0aGlzLm9yaWdpbjtcbiAgICBjb25zdCBjb3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAzKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgIHBvc2l0aW9uc1trICogM10gPSBvYnMueFtpXSArIG94O1xuICAgICAgcG9zaXRpb25zW2sgKiAzICsgMV0gPSBvYnMueVtpXSArIG95O1xuICAgICAgcG9zaXRpb25zW2sgKiAzICsgMl0gPSB6W2ldICsgb3o7XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0aW9uIGlzIGEgUEVSLVBPSU5UIGFscGhhLCBpbiB0aGUgb25lIGxheWVyLlxuICAgKlxuICAgKiBJdCB1c2VkIHRvIGJlIGEgc2Vjb25kIGxheWVyOiB3aXRoIGEgc2luZ2xlIG9wYWNpdHkgZm9yIHRoZSB3aG9sZSBjbG91ZCwgdGhlIG9ubHkgd2F5XG4gICAqIHRvIGhpZ2hsaWdodCBhIHN1YnNldCB3YXMgdG8gZHJhdyBpdCBhZ2FpbiBvbiB0b3AgYXQgZnVsbCBvcGFjaXR5IHdoaWxlIHRoZSBwYXJlbnRcbiAgICogZHJvcHBlZCB0byB0aGUgbXV0ZWQgbGV2ZWwuIFRoYXQgc2Vjb25kIGxheWVyIGhhZCB0byBiZSBrZXB0IGluIHN0ZXAgdGhyb3VnaCBldmVyeVxuICAgKiBjb2xvcm1hcCwgd2luZG93IGFuZCBzaXplIGNoYW5nZSwgYW5kIHRoZSB0d28gdGhlbiBkZXB0aC1zb3J0ZWQgYWdhaW5zdCBlYWNoIG90aGVyIGFzXG4gICAqIHNlcGFyYXRlIGRyYXdzLiBQZXItcG9pbnQgYWxwaGFzIGFuZCBzaXplcyBnaXZlIHRoZSBzYW1lIHJlYWRpbmcg4oCUIG11dGVkIGNsb3VkLCBicmlnaHRcbiAgICogc2VsZWN0aW9uLCBzbGlnaHRseSBsYXJnZXIgc28gYSBzbWFsbCBvbmUgaXMgZmluZGFibGUgaW5zaWRlIDMuN00gcG9pbnRzIOKAlCBpbiBvbmUuXG4gICAqXG4gICAqIGBzaG93bmAgaXMgdGhlIGRyYXduIHN1YnNldCAobnVsbDogZXZlcnkgb25lIG9mIHRoZSBgdG90YWxgIG9ic2VydmF0aW9ucyksIHNvIHRoZSBhbHBoYXNcbiAgICogZm9sbG93IHRoZSBkcmF3biBvcmRlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlTZWxlY3Rpb24oXG4gICAgY2xvdWQ6IFBvaW50czNETGF5ZXIsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzaG93bjogVWludDMyQXJyYXkgfCBudWxsLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGlmIChzZWxlY3Rpb24uY291bnQgPT09IDAgfHwgc2VsZWN0aW9uLm1hc2subGVuZ3RoICE9PSB0b3RhbCkge1xuICAgICAgY2xvdWQuYWxwaGFzID0gbnVsbDtcbiAgICAgIGNsb3VkLnNpemVzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvd25Db3VudCA9IHNob3duID8gc2hvd24ubGVuZ3RoIDogdG90YWw7XG4gICAgY29uc3QgYWxwaGFzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICBjb25zdCBzaXplcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgIGNvbnN0IHBpY2tlZCA9ICEhc2VsZWN0aW9uLm1hc2tbaV07XG4gICAgICBhbHBoYXNba10gPSBwaWNrZWQgPyAxIDogREVGQVVMVF9NVVRFRF9PUEFDSVRZO1xuICAgICAgc2l6ZXNba10gPSBwaWNrZWQgPyBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgOiAxO1xuICAgIH1cbiAgICBjbG91ZC5hbHBoYXMgPSBhbHBoYXM7XG4gICAgY2xvdWQuc2l6ZXMgPSBzaXplcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKiozRCBnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIG92ZXIgdGhlIHdob2xlIHNlY3Rpb25lZFxuICAgKiBzcGVjaW1lbiwgYXMgb25lIHJheW1hcmNoZWQgdm9sdW1lLlxuICAgKlxuICAgKiBUd28gdGhpbmdzIGl0IGNhbiBiZSwgYW5kIHRoZSBwYW5lbCdzIGBWb2x1bWUgcmVuZGVyaW5nYCB0b2dnbGUgcGlja3Mgd2hpY2g6XG4gICAqXG4gICAqICAtICoqc2hlZXRzKiog4oCUIGV4YWN0bHkgdGhlIHBsYW5lcyB0aGF0IHdlcmUgaW1hZ2VkLCBlYWNoIGNhcnJ5aW5nIHRoYXRcbiAgICogICAgc2xpZGUncyBvd24gMkQgZ2VuZSBtYXAsIHdpdGggdGhlIGdhcHMgYmV0d2VlbiBzZWN0aW9ucyBlbXB0eS4gQSBzdGFjayBvZlxuICAgKiAgICBtZWFzdXJlZCBmaWVsZHMsIGF0IHRoZWlyIHRydWUgei5cbiAgICogIC0gKip2b2x1bWUqKiDigJQgdGhlIHNhbWUgZmllbGRzIHNtb290aGVkIGFsb25nIHosIHNvIHRoZSBwbGFuZXMgYmV0d2VlbiB0aGVcbiAgICogICAgc2VjdGlvbnMgY2FycnkgYW4gaW50ZXJwb2xhdGVkIHZhbHVlLiBBbiBlc3RpbWF0ZSwgYW5kIGRyYXduIGFzIGFcbiAgICogICAgdHJhbnNsdWNlbnQgY2xvdWQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgZGVuc2l0eSB2b2x1bWVzIGFyZS5cbiAgICpcbiAgICogT25lIGBWb2x1bWVMYXllcmAgcmF0aGVyIHRoYW4gYSB0ZXh0dXJlZCBxdWFkIHBlciBzZWN0aW9uOiBhbiBgSW1hZ2VMYXllcmBcbiAgICogcmVuZGVycyBvbmx5IGF0IGBuZGlzcGxheSA9PT0gMmAsIHNvIDUzIHNoZWV0cyBpbiB0aGUgb3JiaXQgdmlldyB3b3VsZCBuZWVkIGFcbiAgICogbmV3IGxheWVyIHR5cGUgdXBzdHJlYW0g4oCUIHdoaWxlIGEgc2NhbGFyIHZvbHVtZSB3aG9zZSB6IHNhbXBsaW5nIGFscmVhZHkgSVNcbiAgICogdGhlIHNlY3Rpb24gc3BhY2luZyBleHByZXNzZXMgdGhlIHNoZWV0cyBleGFjdGx5LCBhbmQgdGhlIHNhbWUgbGF0dGljZSB0aGVuXG4gICAqIGdpdmVzIHRoZSBpbnRlcnBvbGF0ZWQgdmVyc2lvbiBmb3IgZnJlZS5cbiAgICpcbiAgICogRXN0aW1hdGVkIG9uIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duIGxhdHRpY2UgKGBkZW5zaXR5R3JpZGAgYXQgc3RyaWRlIDEpLFxuICAgKiBzbyB0aGUgZmllbGQgbGFuZHMgdm94ZWwtZm9yLXZveGVsIG9uIHRoZSBhbmF0b215IGFuZCBuZWVkcyBubyBvZmZzZXQg4oCUIGFcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlLCBhbmQgbmFwYXJpIGNlbnRyZXMgYm90aCBib3hlcyBvbiB0aGUgd29ybGRcbiAgICogb3JpZ2luLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSB2b2x1bWUgYnVpbHQgZnJvbSBPTkUgc2VjdGlvbiB3b3VsZCBzbWVhciB0aGF0IHNsaWRlIHRocm91Z2ggdGhlIHdob2xlXG4gICAgLy8gZGVwdGgsIHNvIHRoZSBzZWN0aW9uIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2hlZXRzLlxuICAgIGNvbnN0IGludGVycG9sYXRlID0gISF2aWV3LmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICAhaW50ZXJwb2xhdGUgJiYgdmlldy5nZW5lTWFwU2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LmdlbmVNYXBTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbXG4gICAgICAgICAgZGF0YXNldC5pZCxcbiAgICAgICAgICBnZW5lLFxuICAgICAgICAgIHNtb290aGluZyxcbiAgICAgICAgICBzZWN0aW9uID8/ICdhbGwnLFxuICAgICAgICAgIGludGVycG9sYXRlID8gJ3ZvbCcgOiAnc2hlZXRzJyxcbiAgICAgICAgICB0aGlzLnNlc3Npb24uc2VsZWN0aW9uUmV2KHNlbGVjdGlvbiksXG4gICAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICAgIGZpZWxkS2V5LFxuICAgICAgICAgIGNsaXAuam9pbignLCcpLFxuICAgICAgICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgICAgICAgIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgICAgdGhpcy5jdHguZGlzcGxheS5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcExheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICBjYWNoZS5maWVsZCA9IG51bGw7XG4gICAgICBjYWNoZS5rZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvYXJzZW5lZCBpbi1wbGFuZSBidXQgTk9UIGFsb25nIHo6IHRoZSBzaGVldHMgbmVlZCBvbmUgcGxhbmUgcGVyIGltYWdlZFxuICAgIC8vIHNlY3Rpb24sIHdoaWxlIHRoZSBmaWVsZCB0aGV5IGNhcnJ5IGlzIHNtb290aCBieSBjb25zdHJ1Y3Rpb24gYW5kIGdhaW5zXG4gICAgLy8gbm90aGluZyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIDQwIMK1bSBkZXRhaWwuIEF0IGZ1bGwgcmVzb2x1dGlvbiB0aGUgZXN0aW1hdGUgaXNcbiAgICAvLyBhIDUuN00tdm94ZWwgcGFpciBvZiBibHVycyDigJQgc2Vjb25kcyBvZiB3b3JrIGZvciBhIGNoZWNrYm94OyBhbiBlaWdodGggb2YgdGhlXG4gICAgLy8gdm94ZWxzIGlzIGFuIGVpZ2h0aCBvZiB0aGUgd29yay5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCwgR0VORV9NQVBfVk9MVU1FX1NUUklERSwgMTI4LCAxKTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gY2FjaGUua2V5KSB7XG4gICAgICBjb25zdCBsb2FkID0gdGhpcy5nZW5lTWFwTG9hZHMubmV4dCgpO1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gM0QgZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgLy8gSW4tcGxhbmUgz4MgaXMgYSBQSFlTSUNBTCBiYW5kd2lkdGgsIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duXG4gICAgICAvLyB2b3hlbCDigJQgdGhlIHJlc29sdXRpb24gdGhlIDJEIG1hcCBlc3RpbWF0ZXMgYXQg4oCUIHNvIGEgc2hlZXQgYW5kIHRoZSAyRFxuICAgICAgLy8gdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZCB3aGF0ZXZlciBsYXR0aWNlIHRoaXMgaXNcbiAgICAgIC8vIHJhc3RlcmlzZWQgb24uIEFsb25nIHogaXQgaXMgdGhlIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHM6IHRoZSBzbWFsbGVzdCDPg1xuICAgICAgLy8gdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIGNvbnN0IGluUGxhbmUgPSBkYXRhc2V0LnZvbHVtZT8udm94ZWxTaXplID8/IGdyaWQudm94ZWxTaXplO1xuICAgICAgbGV0IGZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmllbGQgPSBhd2FpdCBjb21wdXRlRXhwcmVzc2lvblZvbHVtZUFzeW5jKFxuICAgICAgICAgIG9icyxcbiAgICAgICAgICBncmlkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNpZ21hOiBbXG4gICAgICAgICAgICAgIGluUGxhbmVbMF0gKiBHRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICAgICAgaW5QbGFuZVsxXSAqIEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgICBncmlkLnZveGVsU2l6ZVsyXSAqIDEuNSAqIHNtb290aGluZyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICBpbmRpY2VzOiBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IGluU2VsZWN0aW9uLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHNpZ25hbDogbG9hZC5zaWduYWwgfSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoaXNBYm9ydEVycm9yKGVycikpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIG1hcCwgb3IgdGhlIHNjZW5lIHdlbnQgYXdheVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY2FjaGUuZmllbGQgPSBmaWVsZDtcbiAgICAgIGNhY2hlLmtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGNhY2hlLmZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIC8vIFRoZSBoaWdoIGVuZCBvdmVyIHRoZSBNRUFTVVJFRCB2b3hlbHMgb25seSAodGhlIHVubWVhc3VyZWQgemVyb3Mgd291bGQgcHVsbCBpdCBkb3duIGFuZFxuICAgIC8vIHNhdHVyYXRlIHRoZSBtYXApLCBidXQgdGhlIGxvdyBlbmQgc3RheXMgMDogaW4gYSB2b2x1bWUgdGhlIHZhbHVlIGlzIGFsc28gdGhlIG9wYWNpdHkgYW5kXG4gICAgLy8gMCByZWFkcyBhcyBcIm5vdGhpbmcgaGVyZVwiLCBzbyBzdGFydGluZyBhdCB0aGUgbG93ZXN0IG1lYXN1cmVkIHZhbHVlIHdvdWxkIGVyYXNlIGl0LlxuICAgIGNvbnN0IFssIGhpXSA9IGZpZWxkQ29udHJhc3RXaW5kb3coZmllbGQsIGNsaXBbMF0sIGNsaXBbMV0pO1xuICAgIGNvbnN0IGxvID0gMDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRXhwcmVzc2lvblZvbHVtZShmaWVsZCwgW2xvLCBoaV0sIHsgbG9nOiB2aWV3LmxvZ1NjYWxlIH0pO1xuICAgIGNvbnN0IGx1dCA9IHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRWb2x1bWUoZGF0YSwgZmllbGQud2lkdGgsIGZpZWxkLmhlaWdodCwgZmllbGQuZGVwdGgsIHtcbiAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9JHtpbnRlcnBvbGF0ZSA/ICcgwrcgdm9sdW1lJyA6ICcnfWAsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KGBnZW5lLW1hcC0ke2dlbmV9YCwgbHV0KSxcbiAgICAgIC8vIFRoZSBlbmNvZGluZyBhbHJlYWR5IGFwcGxpZWQgdGhlIHdpbmRvdywgc28gdGhlIGxheWVyIG11c3Qgbm90IGFwcGx5IGFcbiAgICAgIC8vIHNlY29uZCBvbmU6IDAuLjI1NSBpcyB0aGUgd2hvbGUgb2Ygd2hhdCBpdCB3YXMgZ2l2ZW4uXG4gICAgICBjb250cmFzdExpbWl0czogWzAsIDI1NV0sXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAvLyBBZGRpdGl2ZSBsaWtlIHRoZSBkZW5zaXR5IHZvbHVtZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGUgc2hlZXRzXG4gICAgICAvLyBoYXZlIHRvIHJlYWQgVEhST1VHSCBlYWNoIG90aGVyIGFuZCB0aHJvdWdoIHRoZSBhbmF0b215LCB3aGljaCBhXG4gICAgICAvLyB0cmFuc2x1Y2VudCBibGVuZCB3b3VsZCBvY2NsdWRlIG9uZSBzaGVldCBhdCBhIHRpbWUuXG4gICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgIG9wYWNpdHk6IHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgIH0pO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2x1c3RlciBkZW5zaXR5IHZvbHVtZXM6IGVhY2ggY2x1c3RlciByYXN0ZXJpc2VkIGludG8gYSBzbW9vdGggc2NhbGFyIGZpZWxkIGFuZFxuICAgKiByYXltYXJjaGVkIGFsb25nc2lkZSB0aGUgY2xvdWQsIHRpbnRlZCB3aXRoIHRoZSBjbHVzdGVyJ3Mgb3duIGxlZ2VuZCBjb2xvdXIuXG4gICAqXG4gICAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIHNlcmlhbGx5IHNlY3Rpb25lZCBkYXRhc2V0IHJlYWRhYmxlIGFzIGFuIGFuYXRvbWljYWxcbiAgICogZGlzdHJpYnV0aW9uLiBUaGUgY2xvdWQgc2hvd3MgbWVhc3VyZWQgY2VsbHMgYW5kIG5vdGhpbmcgZWxzZSDigJQgYnV0IGF0IDIwMCDCtW1cbiAgICogc2VjdGlvbiBzcGFjaW5nIHRoZSBleWUgY2Fubm90IGludGVncmF0ZSBhIHN0YWNrIG9mIGRpc2NzIGludG8gYSBzaGFwZSwgYW5kXG4gICAqIGV2ZXJ5IGdhcCByZWFkcyBhcyBhYnNlbmNlLiBBIGRlbnNpdHkgZmllbGQgaXMgYSBkaWZmZXJlbnQgb2JqZWN0IGZyb20gYSBjZWxsOlxuICAgKiBhbiBlc3RpbWF0ZSwgZGVmaW5lZCBiZXR3ZWVuIHRoZSBpbWFnZWQgcGxhbmVzLCBkcmF3biBhcyBhIHRyYW5zbHVjZW50IGNsb3VkIHNvXG4gICAqIGl0IGNhbm5vdCBiZSBtaXN0YWtlbiBmb3IgbWVhc3VyZW1lbnQuIEluZGl2aWR1YWwgY2VsbHMgYXJlIG5ldmVyIGludGVycG9sYXRlZCDigJRcbiAgICogY29uc2VjdXRpdmUgc2VjdGlvbnMgc2FtcGxlIGRpZmZlcmVudCBjZWxscywgc28gdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnBvbGF0ZVxuICAgKiBhbG9uZy5cbiAgICpcbiAgICogT25lIHZvbHVtZSBwZXIgY2x1c3RlciByYXRoZXIgdGhhbiBvbmUgZm9yIGV2ZXJ5dGhpbmc6IGFkZGl0aXZlIGJsZW5kaW5nIGlzIHdoYXRcbiAgICogbWFrZXMgdHdvIGNsdXN0ZXJzJyB0ZXJyaXRvcmllcyBjb21wYXJhYmxlLCBhbmQgYSBzaW5nbGUgYmxlbmRlZCBmaWVsZCB3b3VsZFxuICAgKiBhbnN3ZXIgbm8gcXVlc3Rpb24gYW55b25lIGFza3Mgb2YgYSB0YXhvbm9teS4gQ2FwcGVkIGF0IGBERU5TSVRZX01BWF9DTFVTVEVSU2AgYnkgY2VsbFxuICAgKiBjb3VudC5cbiAgICpcbiAgICogS2V5ZWQgc28gaXQgcmVidWlsZHMgb25seSB3aGVuIHRoZSBmaWVsZCB3b3VsZCBhY3R1YWxseSBkaWZmZXIg4oCUIHRoZSBkYXRhc2V0LFxuICAgKiB0aGUgY29sb3VyIGNvbHVtbiwgdGhlIGJhbmR3aWR0aCwgb3IgdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGVuc2l0eVZvbHVtZXMoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbiA9ICEhdmlldy5kZW5zaXR5Vm9sdW1lICYmICEhZGF0YXNldC5vYnNlcnZhdGlvbnMuejtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgPiAwID8gdmlldy5kZW5zaXR5U21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjb2x1bW4gPSB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIC8vIFRoZSBzZWxlY3Rpb24gZW50ZXJzIHRoZSBrZXkgYnkgSURFTlRJVFksIG5vdCBieSBjb3VudDogdHdvIGRpZmZlcmVudCBST0lzXG4gICAgLy8gaG9sZGluZyB0aGUgc2FtZSBudW1iZXIgb2YgY2VsbHMgd291bGQgb3RoZXJ3aXNlIGxvb2sgbGlrZSB0aGUgc2FtZSBrZXkgYW5kXG4gICAgLy8gbGVhdmUgdGhlIHByZXZpb3VzIFJPSSdzIGZpZWxkcyBvbiBzY3JlZW4uXG4gICAgY29uc3Qga2V5ID0gb25cbiAgICAgID8gW2RhdGFzZXQuaWQsIGNvbHVtbiA/PyAnYWxsJywgc21vb3RoaW5nLCB0aGlzLnNlc3Npb24uc2VsZWN0aW9uUmV2KHNlbGVjdGlvbildLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZGVuc2l0eUtleSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmRlbnNpdHlMYXllcnMpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBrZXk7XG4gICAgY29uc3QgbG9hZCA9IHRoaXMuZGVuc2l0eUxvYWRzLm5leHQoKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIFdpdGggbm8gcmVmZXJlbmNlIHZvbHVtZSB0aGVyZSBpcyBubyBvZmZzZXQgeWV0LCBhbmQgYSBWb2x1bWVMYXllciBoYXMgbm9cbiAgICAvLyB0cmFuc2xhdGUg4oCUIG5hcGFyaSBjZW50cmVzIGl0cyBib3ggb24gdGhlIHdvcmxkIG9yaWdpbi4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5XG4gICAgLy8gaGFsZiB0aGUgZGVuc2l0eSBib3gsIGV4YWN0bHkgYXMgdGhleSBkbyBmb3IgYSByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgdGhlXG4gICAgLy8gY2FjaGVkIGdlb21ldHJ5IGlzIGludmFsaWRhdGVkIGJlY2F1c2UgdGhhdCBvZmZzZXQganVzdCBjaGFuZ2VkLlxuICAgIGlmICghdGhpcy52b2x1bWUpIHtcbiAgICAgIHRoaXMub3JpZ2luID0gW1xuICAgICAgICAtKGdyaWQud2lkdGggKiBncmlkLnZveGVsU2l6ZVswXSkgLyAyLFxuICAgICAgICAtKGdyaWQuaGVpZ2h0ICogZ3JpZC52b3hlbFNpemVbMV0pIC8gMixcbiAgICAgICAgLShncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0pIC8gMixcbiAgICAgIF07XG4gICAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXBzOiBEZW5zaXR5R3JvdXBbXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGxldCBmaWVsZHM6IChVaW50OEFycmF5IHwgbnVsbClbXTtcbiAgICB0cnkge1xuICAgICAgLy8gT2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkOyB0aGUgY2x1c3RlcnMgcXVldWUgb24gb25lIHdvcmtlci5cbiAgICAgIGZpZWxkcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgICByYXN0ZXJpemVEZW5zaXR5QXN5bmMoXG4gICAgICAgICAgICBkYXRhc2V0Lm9ic2VydmF0aW9ucyxcbiAgICAgICAgICAgIGdyaWQsXG4gICAgICAgICAgICB7IHNpZ21hLCBpbmRpY2VzOiBncm91cC5pbmRpY2VzIH0sXG4gICAgICAgICAgICB7IHNpZ25hbDogbG9hZC5zaWduYWwgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIga2V5LCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZmllbGRzW2ldO1xuICAgICAgLy8gQSBjbHVzdGVyIHdpdGggbm90aGluZyBvbiB0aGUgZ3JpZCBkcmF3cyBubyBsYXllciwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYm94LlxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICB0aGlzLmRlbnNpdHlMYXllcnMucHVzaChcbiAgICAgICAgdmlld2VyLmFkZFZvbHVtZShkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgIG5hbWU6IGBkZW5zaXR5IMK3ICR7Z3JvdXAubmFtZX1gLFxuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgIGludmVydDogdGhpcy5jdHguZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiB0aGUgbmVhcmVyIG9uZSBoaWRpbmcgdGhlIG90aGVyLlxuICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ciwgcmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICogd2hlbiB0aGVyZSBpcyBvbmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LFxuICAgKiB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93biAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0b1xuICAgKiBzaG93IHdoZW4gdGhlIHZpZXcgaXMgbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBudWxsLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8RGVuc2l0eUdyb3VwW10+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm4gW3RvdGFsRGVuc2l0eUdyb3VwKHNlbGVjdGlvbildO1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmFua0RlbnNpdHlHcm91cHMoY29sdW1uLCBsb2FkZWQsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCBzZWxlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLCBhbmQgZGVyaXZlIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW5zaWRlIGl0LlxuICAgKlxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGU6IG5hcGFyaS1qcyBtYXBzIHRoZSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3hcbiAgICogKipjZW50cmVkIG9uIHRoZSBvcmlnaW4qKiwgc2l6ZWQgYGRpbXMgeCB2b3hlbFNpemVgLiBUaGUgb2JzZXJ2YXRpb25zLCBieSBjb250cmFjdCwgYXJlIGluXG4gICAqIHRoZSB2b2x1bWUncyBvd24gZnJhbWUgd2l0aCBpdHMgbmVhciBjb3JuZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luLiBTbyB0aGUgdHdvIG9ubHkgbGluZVxuICAgKiB1cCBpZiB0aGUgUE9JTlRTIG1vdmUg4oCUIGJ5IGhhbGYgdGhlIGJveCDigJQgd2hpY2ggaXMgd2hhdCB7QGxpbmsgb3JpZ2lufSBpcy5cbiAgICpcbiAgICogQSBmYWlsZWQgb3IgYWJzZW50IHZvbHVtZSBpcyBub3QgZmF0YWw6IHRoZSBjbG91ZCByZW5kZXJzIG9uIGl0cyBvd24sIGF0IGl0cyBvd25cbiAgICogY29vcmRpbmF0ZXMsIGFuZCB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVZvbHVtZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGtleSA9IG1ldGEgPyBgJHtkYXRhc2V0LmlkfToke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogbnVsbDtcbiAgICBpZiAoa2V5ICYmIGtleSA9PT0gdGhpcy52b2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy52b2x1bWUpO1xuICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGUgc3VyZmFjZXMgc2F0IGluIHRoZSB2b2x1bWUganVzdCByZW1vdmVkIChvciB0aGVyZSB3YXMgbm9uZSk6IGRvd24gdW50aWwgb25lIGlzIHBsYWNlZC5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgdGhpcy5vcmlnaW4gPSBbMCwgMCwgMF07XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnZvbHVtZSA9IHZpZXdlci5hZGRWb2x1bWUodm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaCkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSAndHJhbnNsdWNlbnRfbm9fZGVwdGgnO1xuICAgIC8vIEhhbGYgdGhlIGJveCwgbmVnYXRlZDogdGhlIG9ic2VydmF0aW9ucycgb3JpZ2luIGlzIHRoZSBib3gncyBuZWFyIGNvcm5lcixcbiAgICAvLyBhbmQgdGhlIGJveCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4uXG4gICAgdGhpcy5vcmlnaW4gPSBbLShtZXRhLndpZHRoICogdngpIC8gMiwgLShtZXRhLmhlaWdodCAqIHZ5KSAvIDIsIC0obWV0YS5kZXB0aCAqIHZ6KSAvIDJdO1xuICAgIHRoaXMucGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldCk7XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICB9XG5cbiAgLyoqIERyb3AgZXZlcnkgbGF5ZXIgb2YgdGhlIGNsb3VkICh0aGUgZGF0YXNldCB3ZW50IGF3YXksIG9yIGhhcyBubyB6KS4gKi9cbiAgcHJpdmF0ZSByZW1vdmVMYXllcnModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbdGhpcy5wb2ludHMsIHRoaXMudm9sdW1lLCB0aGlzLmdlbmVNYXBMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzXSkge1xuICAgICAgaWYgKGxheWVyKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5nZW5lTWFwVm9sdW1lLmZpZWxkID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZS5rZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMudm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW4gPSBbMCwgMCwgMF07XG4gICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2V0UGlja2VyKG51bGwpO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIHRoaXMuc2NhbGFyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5kcmF3biA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBjb2xvdXJzIHRoZSBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGdvZXMgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGhcbiAgICogdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBpcyBvbmUgUkdCQSBwZXIgcG9pbnQgZnJvbSB0aGUgY29sdW1uJ3MgcGFsZXR0ZSwgc28gYW55IG51bWJlciBvZlxuICAgKiBjYXRlZ29yaWVzIGtlZXBzIGl0cyBvd24gY29sb3VyIOKAlCBzZWUgYGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NhbGFyRW5jb2RpbmcodmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgY291bnQ6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIC8vIENvbG91cmVkIGJ5IHRoZSBnZW5lIGZpbHRlcjogZWFjaCBvYnNlcnZhdGlvbiBpbiBpdHMgZ2VuZSdzIGNvbG91ci5cbiAgICAvLyBBIGNvbG91ciBsaWtlIGFueSBvdGhlcjogYSBmYWlsZWQgcmVhZCBmYWxscyBiYWNrIHRvIHRoZSB2aWV3J3MgY29sb3VyIHNvdXJjZS5cbiAgICBjb25zdCBieUdlbmUgPVxuICAgICAgcG9ydCAmJiBjb3VudFxuICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZVN0eWxlKHZpZXcsIGNvdW50LCAoZykgPT4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGcpKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGNvbG91cmluZyBieSBnZW5lIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIHRoZSBjb2xvdXIgc291cmNlJyxcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoYnlHZW5lKSByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoYnlHZW5lLmNvZGVzLCBieUdlbmUuY29sb3JzKTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGNvbHVtbi52YWx1ZXMsIHZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpLCB2aWV3KTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgZW5jb2RlQ29udGludW91cyhzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFNwYXRpYWwzZFNjYWxhcnMge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgc291cmNlLFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KSxcbiAgICAgIHRoaXMuc2Vzc2lvbi5jb250cmFzdFdpbmRvd3MsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIGNsb3VkIGRyYXdzLCBhbmQgdGhlIGtleXMgb2YgaXRzIGdlb21ldHJ5IGFuZCBvZiBpdHMgY29sb3VyIHNvdXJjZS5cbiAqXG4gKiBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjayAoYHNob3duYCBudWxsKS4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gKiBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhbiBvdXQtb2YtcmFuZ2VcbiAqIGluZGV4IGlzIGNsYW1wZWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNsb3VkLCBiZWNhdXNlIHRoZSBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGVcbiAqIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuIFRoZSBzY2FsYXJzJyBpZGVudGl0eSBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIGdlb21ldHJ5J3MgKGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nKTogYSBuZXcgY29sb3VyIHNvdXJjZSBzd2Fwc1xuICogYHZhbHVlc2AgaW4gcGxhY2UgKG5hcGFyaS1qcyDiiaUgMC4xNCksIHdoaWxlIGEgbmV3IGdlb21ldHJ5IG5lZWRzIGEgbmV3IGxheWVyLlxuICovXG5mdW5jdGlvbiBjbG91ZFN1YnNldChcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGdlbmVTaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuKTogeyBzaG93bjogVWludDMyQXJyYXkgfCBudWxsOyBrZXk6IHN0cmluZzsgc2NhbGFyS2V5OiBzdHJpbmcgfSB7XG4gIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgY29uc3Qgc2VjdGlvbiA9XG4gICAgdmlldy5wb2ludFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICA6IG51bGw7XG4gIGxldCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgLy8gVGhlIGdlbmUgZmlsdGVyIGxlYXZlcyBpdHMgdW5tYXRjaGVkIG9ic2VydmF0aW9ucyBvdXQgb2YgdGhlIGdlb21ldHJ5LCBzbyB0aGV5IGFyZSBuZWl0aGVyXG4gIC8vIGRyYXduIG5vciBwaWNrZWQuXG4gIGlmIChnZW5lU2hvd24pIHNob3duID0ga2VlcFNob3duKHNob3duLCBnZW5lU2hvd24sIG9icy5jb3VudCk7XG4gIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NlY3Rpb24gPz8gJ2FsbCd9OiR7Z2VuZVNob3duID8gZ2VuZUZpbHRlcktleSh2aWV3KSA6ICcnfWA7XG4gIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgIGtleSxcbiAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgIG9ic2VydmF0aW9uR2VuZVN0eWxlS2V5KHZpZXcpLFxuICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgIGNsaXAuam9pbignLCcpLFxuICBdLmpvaW4oJ3wnKTtcbiAgcmV0dXJuIHsgc2hvd24sIGtleSwgc2NhbGFyS2V5IH07XG59XG5cbi8qKiBUaGUgb2JzZXJ2YXRpb25zIG9mIGBpbmRpY2VzYCAoZXZlcnkgb25lIHdoZW4gbnVsbCkgdGhhdCBgc2hvd25gIGtlZXBzLiAqL1xuZnVuY3Rpb24ga2VlcFNob3duKGluZGljZXM6IFVpbnQzMkFycmF5IHwgbnVsbCwgc2hvd246IFVpbnQ4QXJyYXksIGNvdW50OiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50MzJBcnJheShpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBjb3VudCk7XG4gIGxldCBuID0gMDtcbiAgaWYgKGluZGljZXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgaWYgKHNob3duW2ldKSBvdXRbbisrXSA9IGk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBpZiAoc2hvd25baV0pIG91dFtuKytdID0gaTtcbiAgfVxuICByZXR1cm4gb3V0LnN1YmFycmF5KDAsIG4pO1xufVxuIl19
1073
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRSxPQUFPLEVBSUwsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRyxPQUFPLEVBQXdCLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRixPQUFPLEVBQ0wsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsdUJBQXVCLEdBQ3hCLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUVMLHNCQUFzQixFQUN0QixtQkFBbUIsR0FDcEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5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Q25DLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsU0FBUyxTQUFTLENBQUMsT0FBMkIsRUFBRSxLQUFpQixFQUFFLEtBQWE7SUFDOUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludFBpY2tlciwgY29sb3JtYXBGcm9tTHV0IH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVmlld2VyLCBWb2x1bWVMYXllciB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBTY2FsZUJhck92ZXJsYXksIGZvcm1hdExlbmd0aCB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5pbXBvcnQgdHlwZSB7IEF4aXNMYWJlbFNwZWMgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgZmluZENvbHVtbk1ldGEsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfTVVURURfT1BBQ0lUWSwgY2F0ZWdvcnlDb2xvcnNGb3IsIGdyb3VwQ29sb3JzS2V5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFNpZ21hLCBkZW5zaXR5R3JpZCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1kZW5zaXR5JztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2VjdGlvbiwgc2VjdGlvbnNPZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWN0aW9ucyc7XG5pbXBvcnQge1xuICBnZW5lRmlsdGVyS2V5LFxuICBvYnNlcnZhdGlvbkdlbmVNYXNrLFxuICBvYnNlcnZhdGlvbkdlbmVTdHlsZSxcbiAgb2JzZXJ2YXRpb25HZW5lU3R5bGVLZXksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQge1xuICBFeHByZXNzaW9uVm9sdW1lRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsXG4gIGZpZWxkQ29udHJhc3RXaW5kb3csXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uVm9sdW1lQXN5bmMsIHJhc3Rlcml6ZURlbnNpdHlBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB0eXBlIHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb25NZXNoM0QsIFZvbHVtZVJlZ2lvbk1lc2hlcyB9IGZyb20gJy4vbmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzJztcbmltcG9ydCB7IGlzQWJvcnRFcnJvciB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7XG4gIERlbnNpdHlHcm91cCxcbiAgR0VORV9NQVBfU0lHTUEsXG4gIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsXG4gIFNQQVRJQUxfM0RfQkFTRV9TSVpFLFxuICBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gIFNwYXRpYWwzZEVuY29kaW5nLFxuICBTcGF0aWFsM2RTY2FsYXJzLFxuICBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbCxcbiAgZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyxcbiAgZ2F0aGVyQ29sb3JzLFxuICByYW5rRGVuc2l0eUdyb3VwcyxcbiAgc3BhdGlhbEZsYXRDb2xvcm1hcCxcbiAgdG90YWxEZW5zaXR5R3JvdXAsXG59IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgSE9WRVJfUkFESVVTX1BYIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1ob3Zlcic7XG5pbXBvcnQgeyBBeGVzM2RHaXptbywgQm94Mywgc3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuL25hcGFyaS1heGVzLWdpem1vJztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHsgU3BhdGlhbDNkVHJhbnNjcmlwdHMgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLTNkLXRyYW5zY3JpcHRzJztcbmltcG9ydCB7IFNwYXRpYWxTY2VuZUJhc2UsIFNwYXRpYWxTZXNzaW9uIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1zY2VuZSc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKiBUaGUgbGVhc3QgWiBzdHJldGNoOiBhIHRlbnRoIG9mIHRoZSB0cnVlIGRlcHRoLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfWl9TQ0FMRV9NSU4gPSAwLjE7XG4vKiogVGhlIG1vc3QgWiBzdHJldGNoIGEgY2xvdWQgYWxsb3dzLCBhdCBsZWFzdDogdGhlIFZvbHVtZSB2aWV3J3MuICovXG5jb25zdCBTUEFUSUFMX1pfU0NBTEVfTUFYID0gMTA7XG4vKiogTm9yIG1vcmUgdGhhbiB0aGlzLCBob3dldmVyIHRoaW4gdGhlIGNsb3VkIGlzLiAqL1xuY29uc3QgU1BBVElBTF9aX1NDQUxFX0NFSUxJTkcgPSAxMDAwO1xuXG4vKipcbiAqIFRoZSBtb3N0IGEgYm94J3MgWiBtYXkgYmUgc3RyZXRjaGVkOiB1bnRpbCBpdCBpcyB0d2ljZSBhcyBkZWVwIGFzIGl0IGlzIHdpZGUsIHNvIGV2ZW4gYSBzZWN0aW9uXG4gKiBtaWNyb25zIHRoaWNrIGFuZCBtaWxsaW1ldHJlcyB3aWRlIGNhbiBiZSBzdG9vZCB1cCBpbnRvIGEgYmxvY2sg4oCUIGJ1dCBuZXZlciBsZXNzIHRoYW4gdGhlXG4gKiBWb2x1bWUgdmlldydzIDEweCwgbm9yIG1vcmUgdGhhbiB7QGxpbmsgU1BBVElBTF9aX1NDQUxFX0NFSUxJTkd9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbFpTY2FsZU1heChib3g6IEJveDMpOiBudW1iZXIge1xuICBjb25zdCBmbGF0ID0gKDIgKiBNYXRoLm1heChib3gud2lkdGgsIGJveC5oZWlnaHQpKSAvIE1hdGgubWF4KGJveC5kZXB0aCwgMWUtOSk7XG4gIHJldHVybiBNYXRoLm1pbihTUEFUSUFMX1pfU0NBTEVfQ0VJTElORywgTWF0aC5tYXgoU1BBVElBTF9aX1NDQUxFX01BWCwgZmxhdCkpO1xufVxuXG4vKipcbiAqIFRoZSBaIGhhbmRsZSdzIGRyYWcgKHB4KSBwZXIgZG91Ymxpbmc6IHRoZSBWb2x1bWUgdmlldydzIDE4MCBweCwgbGVzcyB3aGVuIHRoZSByYW5nZSBpcyB3aWRlcixcbiAqIHNvIGdvaW5nIGZyb20gdGhlIHRydWUgZGVwdGggdG8gdGhlIG1vc3Qgc3RyZXRjaCBpcyBhYm91dCB0aGUgc2FtZSBkcmFnICh+NTQwIHB4KSBlaXRoZXIgd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbFpQaXhlbHNQZXJEb3VibGUobWF4U2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCg2MCwgTWF0aC5taW4oMTgwLCA1NDAgLyBNYXRoLmxvZzIoTWF0aC5tYXgoMiwgbWF4U2NhbGUpKSkpO1xufVxuXG4vKipcbiAqIFRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbHMgZm9yIGEgYm94IChhcyBkcmF3bjogWiBzdHJldGNoZWQgYnkgYHpTY2FsZWApLCBpdHMgdHJ1ZSBsZW5ndGhzIGluIMK1bVxuICogd2hlbiB0aGUgZGF0YXNldCBkZWNsYXJlcyBgbWljcm9uc1BlclVuaXRgLCBlbHNlIGluIGl0cyBvd24gdW5pdHMuIEEgc3RyZXRjaGVkIFogc2F5cyBieSBob3cgbXVjaCxcbiAqIHNvIGl0cyBsZW5ndGggaXMgbmV2ZXIgcmVhZCBvZmYgdGhlIGRyYXdpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsQXhlc0xhYmVscyhkcmF3bjogQm94MywgelNjYWxlOiBudW1iZXIsIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgY29uc3QgaHggPSBkcmF3bi53aWR0aCAvIDI7XG4gIGNvbnN0IGh5ID0gZHJhd24uaGVpZ2h0IC8gMjtcbiAgY29uc3QgaHogPSBkcmF3bi5kZXB0aCAvIDI7XG4gIGNvbnN0IG1wdSA9IG1pY3JvbnNQZXJVbml0ICYmIG1pY3JvbnNQZXJVbml0ID4gMCA/IG1pY3JvbnNQZXJVbml0IDogMDtcbiAgY29uc3QgbGVuID0gKG46IG51bWJlcik6IHN0cmluZyA9PiAobXB1ID8gZm9ybWF0TGVuZ3RoKG4gKiBtcHUsICfCtW0nKSA6IGAkeytuLnRvUHJlY2lzaW9uKDMpfSB1bml0c2ApO1xuICBjb25zdCBzdHJldGNoID0gTWF0aC5hYnMoelNjYWxlIC0gMSkgPiAxZS0zID8gYCAow5ckeyt6U2NhbGUudG9QcmVjaXNpb24oMyl9KWAgOiAnJztcbiAgcmV0dXJuIFtcbiAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRyYXduLndpZHRoKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkcmF3bi5oZWlnaHQpfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKGRyYXduLmRlcHRoIC8gelNjYWxlKX0ke3N0cmV0Y2h9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICBdO1xufVxuXG4vKipcbiAqIFNQQVRJQUxfT01JQ1NfM0QgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEspOiBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCB1bmRlciB0aGVcbiAqIG9yYml0IGNhbWVyYSwgd2l0aCB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUgYXJvdW5kIGl0LCBwZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgYW5kIHRoZVxuICogM0QgZ2VuZSBtYXAuXG4gKlxuICogRXZlcnl0aGluZyBzaXRzIGluIG9uZSBib3ggY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luIChzZWUge0BsaW5rIGVuc3VyZUZyYW1lfSk6IHRoZSByZWZlcmVuY2VcbiAqIHZvbHVtZSdzLCBlbHNlIHRoZSBkZW5zaXR5IGdyaWQncy4gVGhlIFZvbHVtZSB2aWV3J3MgYXhlcyBnaXptbyBhbmQgWi1oZWlnaHQgaGFuZGxlIGFyZSBkcmF3biBvblxuICogaXQsIGFuZCB0aGUgaGFuZGxlIHN0cmV0Y2hlcyBaOiB0aGUgY2xvdWQgdGhyb3VnaCBpdHMgYHNjYWxlM2RgLCBldmVyeSB2b2x1bWUgdGhyb3VnaCBpdHMgdm94ZWxcbiAqIHNpemUsIHNvIG5vdGhpbmcgaXMgcmUtdXBsb2FkZWQgd2hpbGUgZHJhZ2dpbmcgKHNlZSB7QGxpbmsgc2V0WlNjYWxlfSkuXG4gKlxuICogVGhpbm5lciB0aGFuIHRoZSAyRCBzY2VuZTogdGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkIHZvbHVtZSBsaWtlIHRoZVxuICogQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gcmVhZGJhY2sgYW5kIG5vIG5hdmlnYXRvcjsgdGhlIDNEIHNjYWxlIGJhclxuICogZm9sbG93cyB0aGUgZGF0YXNldCAoc2VlIHtAbGluayBpbnN0YWxsU2NhbGVCYXJ9KS4gVGhlIHJlZ2lvbiB0b29scyB3b3JrIGluIFNDUkVFTiBzcGFjZSB0aHJvdWdoXG4gKiB0aGUgdG9vbCBicmlkZ2UncyAzRCBpbnRlcmFjdGlvbiDigJQgYSBsYXNzbyBzZWxlY3RzIHRoZSBjZWxscyB1bmRlciBpdCwgYW5kIGFuIG9yYml0IGNsZWFycyB0aGVcbiAqIHNoYXBlIHdoaWxlIGtlZXBpbmcgdGhlIHNlbGVjdGlvbi4gVGhlIGZpcnN0IDNEIGxheWVyIGFkZGVkIGZyYW1lcyB0aGUgY2FtZXJhIChgZml0M2Q6ICdvbmNlJ2ApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDNkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogVGhlIDNEIHBvaW50IGNsb3VkLiBPbmUgbGF5ZXI6IHNlbGVjdGlvbiBpcyBhIHBlci1wb2ludCBhbHBoYSBvbiBpdCwgbm90IGEgc2Vjb25kLiAqL1xuICBwcml2YXRlIHBvaW50czogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEludGVybGVhdmVkIHgseSx6LCBjYWNoZWQgc28gYSBjb2xvdXIgY2hhbmdlIGRvZXMgbm90IHJlLXdhbGsgMy43TSBvYnNlcnZhdGlvbnMuICovXG4gIHByaXZhdGUgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzY2FsYXJzIGN1cnJlbnRseSB1cGxvYWRlZCDigJQgc2VlIHtAbGluayByZWJ1aWxkfS4gKi9cbiAgcHJpdmF0ZSBzY2FsYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyOyBudWxsIHdoZW4gZXZlcnlcbiAgICogIG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZSBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTlxuICAgKiAgb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0byB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXNcbiAgICogIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFuYXRvbWljYWwgdm9sdW1lIHRoZSBjbG91ZCBzaXRzIGluc2lkZSwgd2hlbiB0aGUgZGF0YXNldCBoYXMgb25lLiAqL1xuICBwcml2YXRlIHZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcCdzIHZvbHVtZSBsYXllciBhbmQgdGhlIGlucHV0cyBpdCB3YXMgY29sb3VyZWQgZm9yIChpdHMgZmllbGQgaXMgY2FjaGVkIGluXG4gICAqICB0aGUgc2Vzc2lvbiwgb24gYSBjbG9jayBvZiBpdHMgb3duKS4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIG9yaWdpbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKiogVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGJlZm9yZSB0aGUgWiBzdHJldGNoLCBjZW50cmVkIG9uIHRoZSBvcmlnaW4gKHNlZSBlbnN1cmVGcmFtZSkuICovXG4gIHByaXZhdGUgYm94OiBCb3gzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm94S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBheGVzIGdpem1vIG9uIHtAbGluayBib3h9IGFuZCB0aGUgaGFuZGxlIHRoYXQgc3RyZXRjaGVzIGl0cyBaIChzZWUgc2V0WlNjYWxlKS4gKi9cbiAgcHJpdmF0ZSBnaXptbzogQXhlczNkR2l6bW8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB6SGFuZGxlOiBOYXBhcmlWb2x1bWVaSGFuZGxlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBFYWNoIHZvbHVtZSBsYXllcidzIG93biB2b3hlbCBzaXplLCBiZWZvcmUgdGhlIFogc3RyZXRjaC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVm94ZWxzID0gbmV3IFdlYWtNYXA8Vm9sdW1lTGF5ZXIsIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXT4oKTtcbiAgLyoqXG4gICAqIG5hcGFyaS1qcydzIGRlcHRoLWF3YXJlIHBpY2sgb3ZlciB0aGUgY2xvdWQsIGFuZCB0aGUgcHJvamVjdGlvbiB0aGUgUk9JIHNlbGVjdGlvbiByZWFkcy4gSXRcbiAgICogb3ducyB0aGUgY2FjaGluZyBwb2xpY3k6IHJlLXByb2plY3QgbGF6aWx5LCBvbiB0aGUgZmlyc3QgcGljayBhZnRlciB0aGUgY2FtZXJhLCB0aGUgY2FudmFzIG9yXG4gICAqIHRoZSBjbG91ZCdzIGRhdGEgbW92ZWQgKG5ldmVyIG9uIHRoZSBjYW1lcmEgZXZlbnQsIHNvIGFuIG9yYml0IGRyYWcgcGF5cyBub3RoaW5nKSwgaW50b1xuICAgKiByZXVzZWQgYnVmZmVycywgd2l0aCBhIHNjcmVlbiBpbmRleCBvbmNlIHRoZSBjbG91ZCBpcyBsYXJnZSBlbm91Z2guXG4gICAqL1xuICBwcml2YXRlIHBpY2tlcjogUG9pbnRQaWNrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogU2NhbGVCYXJPdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEYXRhc2V0IHRoZSBzY2FsZSBiYXIgd2FzIGJ1aWx0IGZvci4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZGVuc2l0eSByYXN0ZXJpc2F0aW9uIGFuZCB0aGUgM0QgZ2VuZS1tYXAgZXN0aW1hdGUgaW4gZmxpZ2h0IChvZmYgdGhlIG1haW4gdGhyZWFkXG4gICAqICBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLCBTUEFUSUFMLTE5KTogYSBuZXcga2V5IHN1cGVyc2VkZXMg4oCUIGFuZCBhYm9ydHMg4oCUIHRoZSBwcmV2aW91c1xuICAgKiAgb25lOyBhIHJlYnVpbGQgdGhhdCBsZWF2ZXMgdGhlIGtleSBhbG9uZSBsZXRzIGl0IGZpbmlzaC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZW5zaXR5TG9hZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZU1hcExvYWRzID0gbmV3IFN1cGVyc2VkZSgpO1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgKGFuIGF0bGFzJ3Mgc3RydWN0dXJlcywgaW1wb3J0ZWQgb250byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGltYWdlXG4gICAqIHN0YWNrKSwgZHJhd24gYnkgdGhlIHNhbWUge0BsaW5rIFZvbHVtZVJlZ2lvbk1lc2hlc30gYXMgdGhlIFZvbHVtZSB2aWV3J3MsIHNvIGEgc3RydWN0dXJlIGlzIHRoZVxuICAgKiBzYW1lIHN1cmZhY2UgaW4gYm90aC4gUGxhY2VkIGluIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgYm94LCBvbmNlIGl0IGlzIHRoZXJlIGFuZCB0aGUgaW1hZ2UgdGhlXG4gICAqIHJlZ2lvbnMgd2VyZSBkcmF3biBvbiBpcyB0aGF0IHZvbHVtZSdzIHN0YWNrIChzZWUge0BsaW5rIHBsYWNlUmVnaW9uTWVzaGVzfSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbk1lc2hlczogVm9sdW1lUmVnaW9uTWVzaGVzO1xuICAvKiogVGhlIHRyYW5zY3JpcHRzIG9mIHRoZSBnZW5lcyB0aGUgVHJhbnNjcmlwdHMgcGFuZWwgZHJhd3MsIGF0IHRoZWlyIG93biB6IChzZWUgU3BhdGlhbDNkVHJhbnNjcmlwdHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zY3JpcHRzM2Q6IFNwYXRpYWwzZFRyYW5zY3JpcHRzO1xuICAvKiogV2hldGhlciB0aGUgcmVmZXJlbmNlIHZvbHVtZSBsZXRzIGV2ZXJ5IHJlZ2lvbiBzdXJmYWNlIHRocm91Z2ggKHNlZSBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSkuICovXG4gIHByaXZhdGUgcmVnaW9uc1Rocm91Z2ggPSBmYWxzZTtcbiAgLyoqIFRoZSBzdG9yZSdzIGludmVydCBzZXR0aW5nLCB3aGljaCB0aGUgZGVuc2l0eSB2b2x1bWVzIGZvbGxvdyAobm8gb3RoZXIgc3Vic2NyaXB0aW9uIG9mXG4gICAqICB0aGlzIHNjZW5lIGNhcnJpZXMgaXQpLiAqL1xuICBwcml2YXRlIGludmVydFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbmZvIHRoZSBpbWFnZSBwbG90dGVkIHdpdGggdGhlIGNsb3VkOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIHN0YWNrICh0aGUgMkQgdmlldydzXG4gICAqICAgICAgICBpbWFnZSwgc2VlIHNob3dWb2x1bWVBc0ltYWdlKSB3aGVuIHRoZSBkYXRhc2V0IGhhcyBhIHZvbHVtZSwgd2hpY2ggdGhlIHJlZ2lvbnMgYXJlIG9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm8/OiBJSW1hZ2VJbmZvLFxuICApIHtcbiAgICBzdXBlcihjdHgsIHNlc3Npb24sIHRydWUpO1xuICAgIHRoaXMucmVnaW9uTWVzaGVzID0gbmV3IFZvbHVtZVJlZ2lvbk1lc2hlcyhjdHgudmlld2VyKTtcbiAgICB0aGlzLnRyYW5zY3JpcHRzM2QgPSBuZXcgU3BhdGlhbDNkVHJhbnNjcmlwdHMoY3R4LnZpZXdlciwgKGxhYmVsKSA9PiBjdHguYmFkZ2UuYmVnaW4obGFiZWwpKTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZXNlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgd2l0aCB0aGUgY2xvdWQgKHJlcGxhY2luZyB0aGUgb25lcyBzaG93bikuICovXG4gIHNldFJlZ2lvbk1lc2hlcyhtZXNoZXM6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0KG1lc2hlcyk7XG4gIH1cblxuICBzZXRSZWdpb25IaWdobGlnaHQoa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRIaWdobGlnaHQoa2V5cyk7XG4gIH1cblxuICBzZXRSZWdpb25IaWRkZW4oa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRIaWRkZW4oa2V5cyk7XG4gIH1cblxuICAvKiogQXMgdGhlIFZvbHVtZSB2aWV3OiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoaWRlcyB0aGUgc3VyZmFjZXMgYmVoaW5kIHdoYXQgaXQgc2hvd3MsIG9yIG5vbmUuICovXG4gIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnNUaHJvdWdoID0gdGhyb3VnaDtcbiAgICBpZiAodGhpcy52b2x1bWUpIHRoaXMudm9sdW1lLmJsZW5kaW5nID0gdGhyb3VnaCA/ICd0cmFuc2x1Y2VudF9ub19kZXB0aCcgOiAndHJhbnNsdWNlbnQnO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgdGhlIHJlZ2lvbiBzdXJmYWNlcyBpbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGJveCwgYXMgdGhlIFZvbHVtZSB2aWV3IHBsYWNlcyB0aGVtIGluIGl0c1xuICAgKiBvd246IGltYWdlIHBpeGVsICh4LCB5KSBpcyB2b3hlbCAoeCwgeSksIHNsaWNlIGsgaXMgdm94ZWwgcGxhbmUgaywgYW5kIHRoZSBib3ggaXMgdGhlIHZvbHVtZSdzXG4gICAqIHZveGVscyB0aW1lcyBpdHMgdm94ZWwgc2l6ZSwgY2VudHJlZCBvbiB0aGUgb3JpZ2luIGFzIG5hcGFyaSBjZW50cmVzIHRoZSB2b2x1bWUgKGFuZCB0aGUgY2xvdWRcbiAgICogaXMgb2Zmc2V0IHRvIHNpdCBpbiBpdCkuIE9ubHkgd2hlbiB0aGUgcGxvdHRlZCBpbWFnZSBJUyB0aGF0IHZvbHVtZSdzIHN0YWNrOiByZWdpb25zIGRyYXduIG9uXG4gICAqIGFub3RoZXIgaW1hZ2UgKGEgdGlzc3VlIGltYWdlKSBoYXZlIG5vIHBsYWNlIGluIGl0LCBhbmQgYXJlIG5vdCBzaG93biAtIG5vciBhcmUgc3VyZmFjZXNcbiAgICogcGxhY2VkIGluIGEgdm9sdW1lIHRoaXMgb25lIHJlcGxhY2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFjZVJlZ2lvbk1lc2hlcyhkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBpZiAoIW1ldGEgfHwgIXRoaXMuaXNWb2x1bWVTdGFjayhtZXRhKSkge1xuICAgICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZSh7XG4gICAgICBzaXplOiBbbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGhdLFxuICAgICAgd29ybGQ6IFttZXRhLndpZHRoICogdngsIG1ldGEuaGVpZ2h0ICogdnksIG1ldGEuZGVwdGggKiB2eiAqIHRoaXMuelNjYWxlKCldLFxuICAgICAgelNjYWxlOiB0aGlzLnpTY2FsZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzaXQgaW46IDEsIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGJlaW5nIHRoZSBzdGFjaydzXG4gICAqIG93biB2b3hlbHMsIGFzIHRoZSBWb2x1bWUgdmlldydzIGlzIGF0IGZ1bGwgcmVzb2x1dGlvbiwgc28gYm90aCByZWNvbnN0cnVjdCBhIGNsYXNzIGFsaWtlIChhbmRcbiAgICogc2hhcmUgaXRzIGNhY2hlZCBzdXJmYWNlKS4gTnVsbCB3aGlsZSB0aGVyZSBpcyBubyB2b2x1bWUgc3RhY2sgdG8gcGxhY2UgdGhlbSBpbi5cbiAgICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdPy52b2x1bWU7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lICYmIG1ldGEgJiYgdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpID8gMSA6IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgcGxvdHRlZCBpbWFnZSBpcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIHN0YWNrOiBpdHMgc2l6ZSBhbmQgc2xpY2UgY291bnQuICovXG4gIHByaXZhdGUgaXNWb2x1bWVTdGFjayhtZXRhOiBOb25OdWxsYWJsZTxTcGF0aWFsRGF0YXNldFsndm9sdW1lJ10+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mbztcbiAgICBjb25zdCBbdywgaF0gPSBpbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICByZXR1cm4gISFpbmZvPy5pc1N0YWNrICYmIHcgPT09IG1ldGEud2lkdGggJiYgaCA9PT0gbWV0YS5oZWlnaHQgJiYgKGluZm8udXJscz8ubGVuZ3RoID8/IDApID09PSBtZXRhLmRlcHRoO1xuICB9XG5cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiwgc28gdGhlIGZpcnN0IGJ1aWxkIGFscmVhZHkgcmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgdGhpcy5pbnZlcnRTdWIgPSB0aGlzLmN0eC5kaXNwbGF5LndhdGNoSW52ZXJ0KChpbnZlcnQpID0+IHtcbiAgICAgIC8vIEEgbGl2ZSBzZXR0ZXI6IHRoZSB2b2x1bWVzIHJlc3R5bGUsIG5vdGhpbmcgaXMgcmFzdGVyaXNlZCBhZ2Fpbi5cbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSBsYXllci5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuY3R4LnRvb2xzLmluc3RhbGwzZEludGVyYWN0aW9uKHRoaXMuY3R4LnZpZXdlciwgdGhpcy5jdHguaG9zdCk7XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKHRoaXMuY3R4Lmhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIG93biB6IGlzIG9uIHNjcmVlbjogdGhlcmUgaXMgbm8gcGxhbmUgdG8gc3RlcC4gKi9cbiAgc2V0WigpOiB2b2lkIHtcbiAgICAvKiBub3RoaW5nIHRvIHN0ZXAgKi9cbiAgfVxuXG4gIC8qKiBBIGNsb3VkIGhhcyBubyBpbnRlbnNpdHkgZGlzdHJpYnV0aW9uIGZvciB0aGUgaGlzdG9ncmFtIHBhbmUuICovXG4gIGhpc3RvZ3JhbSgpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGhlIHRvb2xiYXIncyAzRCBjb250cm9scywgYXMgdGhlIFZvbHVtZSB2aWV3J3M6IGRyYWcgbW9kZSwgcmUtZnJhbWluZyBhbmQgdGhlIGF4ZXMuICovXG4gIHN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gdGhpcy5naXptbyk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZXRjaCBaIGJ5IGBmYWN0b3JgICgxID0gdGhlIGRhdGEncyB0cnVlIHByb3BvcnRpb25zKSwgYXMgdGhlIFogaGFuZGxlIGRyYWdzIGl0OiB0aGUgY2xvdWRcbiAgICogdGhyb3VnaCBpdHMgYHNjYWxlM2RgLCBlYWNoIHZvbHVtZSB0aHJvdWdoIGl0cyB2b3hlbCBzaXplLCB0aGUgYXhlcyBhbmQgdGhlIHJlZ2lvbiBzdXJmYWNlc1xuICAgKiB3aXRoIHRoZW0g4oCUIGFsbCBhYm91dCB0aGUgd29ybGQgb3JpZ2luLCB3aGljaCB0aGUgYm94IGlzIGNlbnRyZWQgb24sIHNvIHRoZXkgc3RheSBhbGlnbmVkLlxuICAgKiBOb3RoaW5nIGlzIHJlLXVwbG9hZGVkLiBLZXB0IGluIHRoZSBzZXR0aW5ncywgc28gYSByZS1wbG90IGtlZXBzIGl0LlxuICAgKi9cbiAgc2V0WlNjYWxlKGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5ib3ggPyBzcGF0aWFsWlNjYWxlTWF4KHRoaXMuYm94KSA6IFNQQVRJQUxfWl9TQ0FMRV9NQVg7XG4gICAgdGhpcy5jdHguc2V0dGluZ3Muc3BhdGlhbFpTY2FsZSA9IE1hdGgubWluKG1heCwgTWF0aC5tYXgoU1BBVElBTF9aX1NDQUxFX01JTiwgZmFjdG9yKSk7XG4gICAgdGhpcy5hcHBseVpTY2FsZSgpO1xuICB9XG5cbiAgLyoqIFRoZSBaIHN0cmV0Y2ggaW4gZWZmZWN0OiB0aGUgc2V0dGluZywgd2l0aGluIHdoYXQgdGhpcyBib3ggYWxsb3dzLiAqL1xuICB6U2NhbGUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXggPSB0aGlzLmJveCA/IHNwYXRpYWxaU2NhbGVNYXgodGhpcy5ib3gpIDogU1BBVElBTF9aX1NDQUxFX01BWDtcbiAgICBjb25zdCBzID0gdGhpcy5jdHguc2V0dGluZ3Muc3BhdGlhbFpTY2FsZTtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChTUEFUSUFMX1pfU0NBTEVfTUlOLCBzID4gMCA/IHMgOiAxKSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5WlNjYWxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHMgPSB0aGlzLnpTY2FsZSgpO1xuICAgIGlmICh0aGlzLnBvaW50cykgdGhpcy5wb2ludHMuc2NhbGUzZCA9IFsxLCAxLCBzXTtcbiAgICB0aGlzLnRyYW5zY3JpcHRzM2Quc2V0WlNjYWxlKHMpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgW3RoaXMudm9sdW1lLCB0aGlzLmdlbmVNYXBMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzXSkge1xuICAgICAgY29uc3QgYmFzZSA9IGxheWVyICYmIHRoaXMuYmFzZVZveGVscy5nZXQobGF5ZXIpO1xuICAgICAgaWYgKGxheWVyICYmIGJhc2UpIGxheWVyLnZveGVsU2l6ZSA9IFtiYXNlWzBdLCBiYXNlWzFdLCBiYXNlWzJdICogc107XG4gICAgfVxuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNlc3Npb24ubGF0ZXN0Py5bMF07XG4gICAgaWYgKHRoaXMuZ2l6bW8gJiYgdGhpcy5ib3gpIHtcbiAgICAgIGNvbnN0IGRyYXduID0gdGhpcy5kcmF3bkJveCh0aGlzLmJveCk7XG4gICAgICB0aGlzLmdpem1vLnNldERlcHRoKGRyYXduLmRlcHRoLCBzcGF0aWFsQXhlc0xhYmVscyhkcmF3biwgcywgZGF0YXNldD8ubWljcm9uc1BlclVuaXQpKTtcbiAgICB9XG4gICAgdGhpcy56SGFuZGxlPy5yZXBvc2l0aW9uKCk7XG4gICAgaWYgKGRhdGFzZXQpIHRoaXMucGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldCk7XG4gICAgdGhpcy5jdHgudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBgYm94YCB3aXRoIGl0cyBaIHN0cmV0Y2hlZCBhcyBkcmF3bi4gKi9cbiAgcHJpdmF0ZSBkcmF3bkJveChib3g6IEJveDMpOiBCb3gzIHtcbiAgICByZXR1cm4geyB3aWR0aDogYm94LndpZHRoLCBoZWlnaHQ6IGJveC5oZWlnaHQsIGRlcHRoOiBib3guZGVwdGggKiB0aGlzLnpTY2FsZSgpIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdm9sdW1lIGxheWVyIHdpdGggaXRzIFogc3RyZXRjaGVkIGFzIHRoZSByZXN0IG9mIHRoZSBzY2VuZSBpcywgcmVtZW1iZXJpbmcgaXRzIG93blxuICAgKiB2b3hlbCBzaXplIHNvIGEgbGF0ZXIgc3RyZXRjaCBjYW4gYmUgYXBwbGllZCB0byBpdC5cbiAgICovXG4gIHByaXZhdGUgYWRkVm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGE6IFVpbnQ4QXJyYXksXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBkZXB0aDogbnVtYmVyLFxuICAgIG9wdHM6IFBhcmFtZXRlcnM8Vmlld2VyWydhZGRWb2x1bWUnXT5bNF0gJiB7IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0sXG4gICk6IFZvbHVtZUxheWVyIHtcbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBvcHRzLnZveGVsU2l6ZTtcbiAgICBjb25zdCBsYXllciA9IHZpZXdlci5hZGRWb2x1bWUoZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6ICogdGhpcy56U2NhbGUoKV0sXG4gICAgfSk7XG4gICAgdGhpcy5iYXNlVm94ZWxzLnNldChsYXllciwgW3Z4LCB2eSwgdnpdKTtcbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgb2JzZXJ2YXRpb24ncyBwb3NpdGlvbiBvbiB0aGUgY2FudmFzIHVuZGVyIHRoZSBjdXJyZW50IDNEIGNhbWVyYSAoZm9yIHRoZSBST0lcbiAgICogc2VsZWN0aW9uKSwgaW5kZXhlZCBieSBvYnNlcnZhdGlvbiB3aXRoIE5hTiBmb3IgYW55dGhpbmcgbm90IGRyYXduLiBOdWxsIGJlZm9yZSB0aGUgY2xvdWRcbiAgICogaXMgYnVpbHQuXG4gICAqXG4gICAqIFRoZSBwcm9qZWN0aW9uIGlzIHRoZSBwaWNrZXIncyAoc2VlIHtAbGluayBwaWNrZXJ9KTsgd2hhdCBpcyBsZWZ0IGlzIHRoZSBwYXJ0IHRoYXQgaXNcbiAgICogZ2VudWluZWx5IHRoaXMgYWRhcHRlcidzOiBTQ0FUVEVSSU5HIHRoZSBkcmF3biBzdWJzZXQgYmFjayBpbnRvIG9ic2VydmF0aW9uIG9yZGVyLiBUaGUgY2xvdWRcbiAgICogaG9sZHMgb25seSB0aGUgcG9pbnRzIG9mIHRoZSBkaXNwbGF5ZWQgc2VjdGlvbiwgaW4gaXRzIG93biBwYWNraW5nOyBldmVyeSBjb25zdW1lciBpbmRleGVzIGJ5XG4gICAqIG9ic2VydmF0aW9uLiBOYU4gc3RhbmRzIGZvciBcIm5vdCBvbiBzY3JlZW5cIiwgd2hpY2ggaXMgYWxzbyB0aGUgcmlnaHQgYW5zd2VyIGZvciBhblxuICAgKiBvYnNlcnZhdGlvbiB3aG9zZSBzZWN0aW9uIGlzIGhpZGRlbi5cbiAgICovXG4gIHNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3QgcHJvamVjdGVkID0gdGhpcy5waWNrZXI/LnByb2plY3RlZCgpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd247XG4gICAgY29uc3QgeyBzY3JlZW4gfSA9IHByb2plY3RlZDtcbiAgICBjb25zdCBjb3VudCA9IHNjcmVlbi5sZW5ndGggPj4gMTtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCAqIDIpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLmNsZWFyKCk7XG4gICAgdGhpcy50cmFuc2NyaXB0czNkLnJlbW92ZSgpO1xuICAgIHRoaXMuZGlzcG9zZVNwYXRpYWwoKTtcbiAgICB0aGlzLmludmVydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmludmVydFN1YiA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5nZW5lTWFwTG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlQXhlcygpO1xuICAgIC8vIERyb3AgdGhlIGNhY2hlZCBpbnRlcmxlYXZlZCBjb29yZGluYXRlcyB0b286IGhvbGRpbmcgMy43TSB4IDMgZmxvYXRzIGFmdGVyXG4gICAgLy8gYSB0ZWFyZG93biBpcyB+NDVNQiBvZiByZXRhaW5lZCBoZWFwIGZvciBhIHNjZW5lIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5zZXRQaWNrZXIobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9ic2VydmF0aW9uIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uOiB0aGUgRlJPTlQtbW9zdCBtYXJrZXIgd2l0aGluIGBzbGFja1B4YCBvZiB0aGVcbiAgICogcG9pbnRlciAodGllcyBieSBkaXN0YW5jZSksIGFzIG5hcGFyaS1qcydzIHtAbGluayBQb2ludFBpY2tlcn0gcGlja3MgaXQuIFRoYXQgbWF0dGVycyBtb3JlXG4gICAqIHRoYW4gaXQgc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhIGNlbGwgdGhhdFxuICAgKiBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLiBUaGUgcGlja2VyIGFsc28gdGFrZXMgZWFjaCBwb2ludCdzIHJhZGl1cyBmcm9tIHRoZSBsYXllcidzXG4gICAqIHBlci1wb2ludCBgc2l6ZXNgLCBzbyBhIHNlbGVjdGVkIG1hcmtlciwgZHJhd24gbGFyZ2VyLCBpcyBhcyBsYXJnZSB0byB0aGUgcG9pbnRlci5cbiAgICovXG4gIHByb3RlY3RlZCBwaWNrT2JzZXJ2YXRpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGlja2VyID0gdGhpcy5waWNrZXI7XG4gICAgaWYgKCFwaWNrZXIpIHJldHVybiAtMTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jdHguY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGsgPSBwaWNrZXIucGljayhjbGllbnRYIC0gcmVjdC5sZWZ0LCBjbGllbnRZIC0gcmVjdC50b3AsIHNsYWNrUHgpO1xuICAgIGlmIChrIDwgMCkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0aGlzLmRyYXduID8gdGhpcy5kcmF3bltrXSA6IGs7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgY2xvdWQncyBwaWNrZXIgKG51bGw6IG5vIGNsb3VkKSwgcmVsZWFzaW5nIHRoZSBvbGQgb25lJ3MgY2FtZXJhIGxpc3RlbmVyLiAqL1xuICBwcml2YXRlIHNldFBpY2tlcihwb2ludHM6IFBvaW50czNETGF5ZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tlciA9IHBvaW50c1xuICAgICAgPyBuZXcgUG9pbnRQaWNrZXIodGhpcy5jdHgudmlld2VyLCBwb2ludHMsIHtcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgaG92ZXIgc2xhY2sgdGltZXMgdGhlIHNjYWxlIGEgU0VMRUNURURcbiAgICAgICAgICAvLyBtYXJrZXIgaXMgZHJhd24gYXQuIEl0IGRlY2lkZXMgd2hldGhlciBhIG1hcmtlciBzdHJhZGRsaW5nIHRoZSBjYW52YXMgZWRnZSBpcyBmb3VuZC5cbiAgICAgICAgICBtYXhSZWFjaDogSE9WRVJfUkFESVVTX1BYICogU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBuYXBhcmktanMncyBgU2NhbGVCYXJPdmVybGF5YCBpbiBgJzNkJ2AgbW9kZSBtZWFzdXJlcyB0aGVyZTogQ1NTIHB4IHBlciB3b3JsZCB1bml0IGlzIHRoZVxuICAgKiByZWNpcHJvY2FsIG9mIGBDYW1lcmEzRC53b3JsZFBlclBpeGVsYCDigJQgdGhlIHNjYWxlIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci5cbiAgICogVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2ggYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lc1xuICAgKiBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYSBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhXG4gICAqIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1pY3JvbnNQZXJVbml0ID0gZGF0YXNldD8ubWljcm9uc1BlclVuaXQ7XG4gICAgaWYgKCFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBTY2FsZUJhck92ZXJsYXkodGhpcy5jdHguaG9zdCwgdGhpcy5jdHgudmlld2VyLCB7XG4gICAgICB1bml0UGVyV29ybGQ6IG1pY3JvbnNQZXJVbml0LFxuICAgICAgbW9kZTogJzNkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGljaCBvYnNlcnZhdGlvbnMgdGhlIGdlbmUgZmlsdGVyIGtlZXBzLCBzZXR0bGVkIGFwYXJ0IGZyb20gdGhlaXIgY29sb3VyczogYSBjb2xvdXJcbiAgICAgICAgLy8gY2FuIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb25cbiAgICAgICAgLy8gd291bGQgc2hvdyBhcyBpZiBpdCBleHByZXNzZWQgdGhlIHBpY2tlZCBnZW5lcy4gU28gYSBmYWlsZWQgcmVhZCBrZWVwcyB0aGUgY2xvdWQgYXMgaXRcbiAgICAgICAgLy8gd2FzIGRyYXduLCBhbmQgdGhlIHBhbmVsIHNheXMgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgYXBwbGllZC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBnZW5lU2hvd24gPSBwb3J0XG4gICAgICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIOKAlCBrZWVwaW5nIHRoZSBjbG91ZCBhcyBkcmF3bicsXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGFzaygpKSB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcih0cnVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5jID0gYXdhaXQgdGhpcy5zY2FsYXJFbmNvZGluZyh2aWV3LCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5kTG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKGZhbHNlKTtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZUxheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGJlZm9yZSBhbnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSBpdHMgY2VudHJpbmcgb2Zmc2V0LlxuICAgIHRoaXMuZW5zdXJlRnJhbWUoZGF0YXNldCk7XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gU2NhbGUgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCdzIGRlY2xhcmVkIHVuaXQsIHNvIGl0IHdhaXRzIGZvciB0aGUgZGF0YXNldFxuICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIHNldCB1cCBhdCBtb3VudCB0aW1lLlxuICAgIGlmIChkYXRhc2V0LmlkICE9PSB0aGlzLnNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMudm9sdW1lKSB7XG4gICAgICB0aGlzLnZvbHVtZS52aXNpYmxlID0gdmlldy5zaG93Vm9sdW1lO1xuICAgICAgdGhpcy52b2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG4gICAgdGhpcy5kcmF3Q2xvdWQodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIGVuYywgZ2VuZVNob3duKTtcbiAgICAvLyBUaGUgdHJhbnNjcmlwdHMgbGFzdDogdGhleSBzaXQgaW4gdGhlIGJveCB0aGUgY2xvdWQgZml4ZWQsIGFuZCB0aGVpciBmaXJzdCByZWFkIGNhbiB0YWtlIGEgd2hpbGUuXG4gICAgYXdhaXQgdGhpcy50cmFuc2NyaXB0czNkLnN5bmMoZGF0YXNldCwgdmlldywgdGhpcy5zZXNzaW9uLnBvcnQsIHtcbiAgICAgIG9yaWdpbjogdGhpcy5vcmlnaW4sXG4gICAgICB6U2NhbGU6IHRoaXMuelNjYWxlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcG9pbnQgY2xvdWQ6IGEgbmV3IGxheWVyIGZvciBuZXcgZ2VvbWV0cnkgKGEgZGF0YXNldCBvciBhIHNlY3Rpb24pLCB0aGUgY29sb3VyXG4gICAqIHNvdXJjZSBzd2FwcGVkIGluIHBsYWNlIG90aGVyd2lzZTsgdGhlbiB0aGUgc2VsZWN0aW9uIGFuZCB0aGUgdmlzaWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZHJhd0Nsb3VkKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCxcbiAgICBnZW5lU2hvd246IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBzaXplID0gU1BBVElBTF8zRF9CQVNFX1NJWkUgKiBzY2FsZTtcbiAgICAvLyBBIGNhdGVnb3JpY2FsIGNvbG91cmluZyBpcyBwZXItcG9pbnQgUkdCQSwgd2hpY2ggd2lucyBvdmVyIHRoZSBzY2FsYXJzOyB0aGUgZmxhdCBjb2xvcm1hcFxuICAgIC8vIGFuZCB6ZXJvIHNjYWxhcnMgc3RhbmQgYmVoaW5kIGl0LCBhcyB0aGV5IGRvIGZvciBcIm5vdGhpbmcgdG8gY29sb3VyIGJ5XCIuXG4gICAgY29uc3Qgc2NhbGFyID0gZW5jPy5raW5kID09PSAnc2NhbGFycycgPyBlbmMgOiBudWxsO1xuICAgIGNvbnN0IGNvbG9ycyA9IGVuYz8ua2luZCA9PT0gJ2NvbG9ycycgPyBlbmMuY29sb3JzIDogbnVsbDtcbiAgICBjb25zdCBzY2FsYXJzID0gc2NhbGFyPy52YWx1ZXMgPz8gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpO1xuICAgIGNvbnN0IGNvbG9ybWFwID0gc2NhbGFyPy5jb2xvcm1hcCA/PyBzcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBzY2FsYXI/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcbiAgICBjb25zdCB7IHNob3duLCBrZXksIHNjYWxhcktleSB9ID0gY2xvdWRTdWJzZXQoZGF0YXNldCwgdmlldywgZ2VuZVNob3duKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLmNsb3VkUG9zaXRpb25zKG9icywgc2hvd24pO1xuICAgICAgdGhpcy5kcmF3biA9IHNob3duO1xuICAgIH1cblxuICAgIC8vIFRoZSBzY2FsYXJzIGhhdmUgdG8gZm9sbG93IHRoZSBnZW9tZXRyeTogYSBwZXItb2JzZXJ2YXRpb24gdmVjdG9yIGFnYWluc3Qgb25lXG4gICAgLy8gc2VjdGlvbidzIHBvc2l0aW9ucyB3b3VsZCBjb2xvdXIgZWFjaCBjZWxsIGJ5IGEgc3RyYW5nZXIncyB2YWx1ZS4gU28gZG8gdGhlIGNvbG91cnMuXG4gICAgY29uc3QgdmFsdWVzRm9yID0gKCkgPT4gKHNob3duID8gRmxvYXQzMkFycmF5LmZyb20oc2hvd24sIChpKSA9PiBzY2FsYXJzW2ldKSA6IHNjYWxhcnMpO1xuICAgIGNvbnN0IGNvbG9yc0ZvciA9ICgpID0+IChjb2xvcnMgPyAoZ2F0aGVyQ29sb3JzKGNvbG9ycywgc2hvd24gPz8gdW5kZWZpbmVkKSBhcyBGbG9hdDMyQXJyYXkpIDogbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMucG9pbnRzIHx8IGtleSAhPT0gdGhpcy5sYXllcktleSkge1xuICAgICAgLy8gTmV3IEdFT01FVFJZIOKAlCBhIGRpZmZlcmVudCBkYXRhc2V0LCBvciBhIGRpZmZlcmVudCBzZWN0aW9uIOKAlCBzbyBhIG5ldyBsYXllci5cbiAgICAgIGlmICh0aGlzLnBvaW50cykgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5wb2ludHMpO1xuICAgICAgdGhpcy5sYXllcktleSA9IGtleTtcbiAgICAgIHRoaXMuc2NhbGFyS2V5ID0gc2NhbGFyS2V5O1xuICAgICAgdGhpcy5wb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzM0QodGhpcy5wb3NpdGlvbnMhLCB2YWx1ZXNGb3IoKSwge1xuICAgICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgICAgc2NhbGUzZDogWzEsIDEsIHRoaXMuelNjYWxlKCldLFxuICAgICAgICBjb2xvcm1hcCxcbiAgICAgICAgY29udHJhc3RMaW1pdHMsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGNvbG9yczogY29sb3JzRm9yKCkgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFBpY2tlcih0aGlzLnBvaW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY2FsYXJLZXkgIT09IHRoaXMuc2NhbGFyS2V5KSB7XG4gICAgICAgIC8vIEEgY2hhbmdlIG9mIGNvbG91ciBTT1VSQ0UsIHdoaWNoIHVzZWQgdG8gbWVhbiBkaXNjYXJkaW5nIHRoZSBsYXllciBhbmQgYnVpbGRpbmdcbiAgICAgICAgLy8gYW5vdGhlciDigJQgYW5kLCBiZWNhdXNlIGFkZGluZyBhIDNEIGxheWVyIHJlZnJhbWVzLCBhIGNhbWVyYSBqdW1wIHRvIHVuZG8gYXMgd2VsbC5cbiAgICAgICAgLy8gbmFwYXJpLWpzIOKJpSAwLjE0IGxldHMgdGhlIHNjYWxhcnMgYmUgcmVwbGFjZWQgaW4gcGxhY2Ug4oCUIHRoZSBzZXR0ZXIgYnVtcHMgdGhlXG4gICAgICAgIC8vIGxheWVyJ3MgZGF0YVZlcnNpb24gc28gdGhlIHZpc3VhbCByZS11cGxvYWRzIOKAlCBhbmQgdGhlIHBvc2l0aW9ucyBoYXZlIG5vdCBtb3ZlZCxcbiAgICAgICAgLy8gc28gdGhlcmUgaXMgbm90aGluZyBmb3IgdGhlIGNhbWVyYSB0byByZWZyYW1lLlxuICAgICAgICB0aGlzLnNjYWxhcktleSA9IHNjYWxhcktleTtcbiAgICAgICAgdGhpcy5wb2ludHMudmFsdWVzID0gdmFsdWVzRm9yKCk7XG4gICAgICAgIHRoaXMucG9pbnRzLmNvbG9ycyA9IGNvbG9yc0ZvcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5wb2ludHMuY29sb3JtYXAgPSBjb2xvcm1hcDtcbiAgICAgIHRoaXMucG9pbnRzLmNvbnRyYXN0TGltaXRzID0gY29udHJhc3RMaW1pdHM7XG4gICAgICB0aGlzLnBvaW50cy5zaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjbG91ZCA9IHRoaXMucG9pbnRzO1xuICAgIGlmIChjbG91ZCkge1xuICAgICAgY2xvdWQub3BhY2l0eSA9IHZpZXcub3BhY2l0eTtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3Rpb24oY2xvdWQsIHNlbGVjdGlvbiwgc2hvd24sIG9icy5jb3VudCk7XG4gICAgfVxuICAgIC8vIExhc3QsIHNvIGl0IGFsc28gY292ZXJzIGEgbGF5ZXIgdGhpcyBwYXNzIGp1c3QgY3JlYXRlZC5cbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnZpc2libGUgPSB2aWV3LnNob3dQb2ludHM7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKiBJbnRlcmxlYXZlZCB4LHkseiBvZiB0aGUgYHNob3duYCBvYnNlcnZhdGlvbnMgKG51bGw6IGFsbCBvZiB0aGVtKSwgb2Zmc2V0IGJ5IHtAbGluayBvcmlnaW59LiAqL1xuICBwcml2YXRlIGNsb3VkUG9zaXRpb25zKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucywgc2hvd246IFVpbnQzMkFycmF5IHwgbnVsbCk6IEZsb2F0MzJBcnJheSB7XG4gICAgLy8gcmVidWlsZCgpIGRyYXdzIG9ubHkgYSBkYXRhc2V0IHdob3NlIG9ic2VydmF0aW9ucyBoYXZlIGEgei5cbiAgICBjb25zdCB6ID0gb2JzLnohO1xuICAgIGNvbnN0IFtveCwgb3ksIG96XSA9IHRoaXMub3JpZ2luO1xuICAgIGNvbnN0IGNvdW50ID0gc2hvd24gPyBzaG93bi5sZW5ndGggOiBvYnMuY291bnQ7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDMpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY291bnQ7IGsrKykge1xuICAgICAgY29uc3QgaSA9IHNob3duID8gc2hvd25ba10gOiBrO1xuICAgICAgcG9zaXRpb25zW2sgKiAzXSA9IG9icy54W2ldICsgb3g7XG4gICAgICBwb3NpdGlvbnNbayAqIDMgKyAxXSA9IG9icy55W2ldICsgb3k7XG4gICAgICBwb3NpdGlvbnNbayAqIDMgKyAyXSA9IHpbaV0gKyBvejtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gaXMgYSBQRVItUE9JTlQgYWxwaGEsIGluIHRoZSBvbmUgbGF5ZXIuXG4gICAqXG4gICAqIEl0IHVzZWQgdG8gYmUgYSBzZWNvbmQgbGF5ZXI6IHdpdGggYSBzaW5nbGUgb3BhY2l0eSBmb3IgdGhlIHdob2xlIGNsb3VkLCB0aGUgb25seSB3YXlcbiAgICogdG8gaGlnaGxpZ2h0IGEgc3Vic2V0IHdhcyB0byBkcmF3IGl0IGFnYWluIG9uIHRvcCBhdCBmdWxsIG9wYWNpdHkgd2hpbGUgdGhlIHBhcmVudFxuICAgKiBkcm9wcGVkIHRvIHRoZSBtdXRlZCBsZXZlbC4gVGhhdCBzZWNvbmQgbGF5ZXIgaGFkIHRvIGJlIGtlcHQgaW4gc3RlcCB0aHJvdWdoIGV2ZXJ5XG4gICAqIGNvbG9ybWFwLCB3aW5kb3cgYW5kIHNpemUgY2hhbmdlLCBhbmQgdGhlIHR3byB0aGVuIGRlcHRoLXNvcnRlZCBhZ2FpbnN0IGVhY2ggb3RoZXIgYXNcbiAgICogc2VwYXJhdGUgZHJhd3MuIFBlci1wb2ludCBhbHBoYXMgYW5kIHNpemVzIGdpdmUgdGhlIHNhbWUgcmVhZGluZyDigJQgbXV0ZWQgY2xvdWQsIGJyaWdodFxuICAgKiBzZWxlY3Rpb24sIHNsaWdodGx5IGxhcmdlciBzbyBhIHNtYWxsIG9uZSBpcyBmaW5kYWJsZSBpbnNpZGUgMy43TSBwb2ludHMg4oCUIGluIG9uZS5cbiAgICpcbiAgICogYHNob3duYCBpcyB0aGUgZHJhd24gc3Vic2V0IChudWxsOiBldmVyeSBvbmUgb2YgdGhlIGB0b3RhbGAgb2JzZXJ2YXRpb25zKSwgc28gdGhlIGFscGhhc1xuICAgKiBmb2xsb3cgdGhlIGRyYXduIG9yZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVNlbGVjdGlvbihcbiAgICBjbG91ZDogUG9pbnRzM0RMYXllcixcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICAgIHNob3duOiBVaW50MzJBcnJheSB8IG51bGwsXG4gICAgdG90YWw6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHNlbGVjdGlvbi5jb3VudCA9PT0gMCB8fCBzZWxlY3Rpb24ubWFzay5sZW5ndGggIT09IHRvdGFsKSB7XG4gICAgICBjbG91ZC5hbHBoYXMgPSBudWxsO1xuICAgICAgY2xvdWQuc2l6ZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93bkNvdW50ID0gc2hvd24gPyBzaG93bi5sZW5ndGggOiB0b3RhbDtcbiAgICBjb25zdCBhbHBoYXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgIGNvbnN0IHNpemVzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgY29uc3QgaSA9IHNob3duID8gc2hvd25ba10gOiBrO1xuICAgICAgY29uc3QgcGlja2VkID0gISFzZWxlY3Rpb24ubWFza1tpXTtcbiAgICAgIGFscGhhc1trXSA9IHBpY2tlZCA/IDEgOiBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICBzaXplc1trXSA9IHBpY2tlZCA/IFNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSA6IDE7XG4gICAgfVxuICAgIGNsb3VkLmFscGhhcyA9IGFscGhhcztcbiAgICBjbG91ZC5zaXplcyA9IHNpemVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKjNEIGdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gb3ZlciB0aGUgd2hvbGUgc2VjdGlvbmVkXG4gICAqIHNwZWNpbWVuLCBhcyBvbmUgcmF5bWFyY2hlZCB2b2x1bWUuXG4gICAqXG4gICAqIFR3byB0aGluZ3MgaXQgY2FuIGJlLCBhbmQgdGhlIHBhbmVsJ3MgYFZvbHVtZSByZW5kZXJpbmdgIHRvZ2dsZSBwaWNrcyB3aGljaDpcbiAgICpcbiAgICogIC0gKipzaGVldHMqKiDigJQgZXhhY3RseSB0aGUgcGxhbmVzIHRoYXQgd2VyZSBpbWFnZWQsIGVhY2ggY2FycnlpbmcgdGhhdFxuICAgKiAgICBzbGlkZSdzIG93biAyRCBnZW5lIG1hcCwgd2l0aCB0aGUgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIGVtcHR5LiBBIHN0YWNrIG9mXG4gICAqICAgIG1lYXN1cmVkIGZpZWxkcywgYXQgdGhlaXIgdHJ1ZSB6LlxuICAgKiAgLSAqKnZvbHVtZSoqIOKAlCB0aGUgc2FtZSBmaWVsZHMgc21vb3RoZWQgYWxvbmcgeiwgc28gdGhlIHBsYW5lcyBiZXR3ZWVuIHRoZVxuICAgKiAgICBzZWN0aW9ucyBjYXJyeSBhbiBpbnRlcnBvbGF0ZWQgdmFsdWUuIEFuIGVzdGltYXRlLCBhbmQgZHJhd24gYXMgYVxuICAgKiAgICB0cmFuc2x1Y2VudCBjbG91ZCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBkZW5zaXR5IHZvbHVtZXMgYXJlLlxuICAgKlxuICAgKiBPbmUgYFZvbHVtZUxheWVyYCByYXRoZXIgdGhhbiBhIHRleHR1cmVkIHF1YWQgcGVyIHNlY3Rpb246IGFuIGBJbWFnZUxheWVyYFxuICAgKiByZW5kZXJzIG9ubHkgYXQgYG5kaXNwbGF5ID09PSAyYCwgc28gNTMgc2hlZXRzIGluIHRoZSBvcmJpdCB2aWV3IHdvdWxkIG5lZWQgYVxuICAgKiBuZXcgbGF5ZXIgdHlwZSB1cHN0cmVhbSDigJQgd2hpbGUgYSBzY2FsYXIgdm9sdW1lIHdob3NlIHogc2FtcGxpbmcgYWxyZWFkeSBJU1xuICAgKiB0aGUgc2VjdGlvbiBzcGFjaW5nIGV4cHJlc3NlcyB0aGUgc2hlZXRzIGV4YWN0bHksIGFuZCB0aGUgc2FtZSBsYXR0aWNlIHRoZW5cbiAgICogZ2l2ZXMgdGhlIGludGVycG9sYXRlZCB2ZXJzaW9uIGZvciBmcmVlLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd24gbGF0dGljZSAoYGRlbnNpdHlHcmlkYCBhdCBzdHJpZGUgMSksXG4gICAqIHNvIHRoZSBmaWVsZCBsYW5kcyB2b3hlbC1mb3Itdm94ZWwgb24gdGhlIGFuYXRvbXkgYW5kIG5lZWRzIG5vIG9mZnNldCDigJQgYVxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGUsIGFuZCBuYXBhcmkgY2VudHJlcyBib3RoIGJveGVzIG9uIHRoZSB3b3JsZFxuICAgKiBvcmlnaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXAoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW5lID0gdmlldy5nZW5lTWFwICYmIHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuc2Vzc2lvbi5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZ2VuZU1hcFNtb290aGluZyA+IDAgPyB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICAvLyBBIHZvbHVtZSBidWlsdCBmcm9tIE9ORSBzZWN0aW9uIHdvdWxkIHNtZWFyIHRoYXQgc2xpZGUgdGhyb3VnaCB0aGUgd2hvbGVcbiAgICAvLyBkZXB0aCwgc28gdGhlIHNlY3Rpb24gcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBzaGVldHMuXG4gICAgY29uc3QgaW50ZXJwb2xhdGUgPSAhIXZpZXcuZ2VuZU1hcFZvbHVtZTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgICFpbnRlcnBvbGF0ZSAmJiB2aWV3LmdlbmVNYXBTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcuZ2VuZU1hcFNlY3Rpb24pKV1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtcbiAgICAgICAgICBkYXRhc2V0LmlkLFxuICAgICAgICAgIGdlbmUsXG4gICAgICAgICAgc21vb3RoaW5nLFxuICAgICAgICAgIHNlY3Rpb24gPz8gJ2FsbCcsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPyAndm9sJyA6ICdzaGVldHMnLFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgY2xpcC5qb2luKCcsJyksXG4gICAgICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICAgICAgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgICB0aGlzLmN0eC5kaXNwbGF5LmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIGNhY2hlLmZpZWxkID0gbnVsbDtcbiAgICAgIGNhY2hlLmtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29hcnNlbmVkIGluLXBsYW5lIGJ1dCBOT1QgYWxvbmcgejogdGhlIHNoZWV0cyBuZWVkIG9uZSBwbGFuZSBwZXIgaW1hZ2VkXG4gICAgLy8gc2VjdGlvbiwgd2hpbGUgdGhlIGZpZWxkIHRoZXkgY2FycnkgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbiBhbmQgZ2FpbnNcbiAgICAvLyBub3RoaW5nIGZyb20gdGhlIHRlbXBsYXRlJ3MgNDAgwrVtIGRldGFpbC4gQXQgZnVsbCByZXNvbHV0aW9uIHRoZSBlc3RpbWF0ZSBpc1xuICAgIC8vIGEgNS43TS12b3hlbCBwYWlyIG9mIGJsdXJzIOKAlCBzZWNvbmRzIG9mIHdvcmsgZm9yIGEgY2hlY2tib3g7IGFuIGVpZ2h0aCBvZiB0aGVcbiAgICAvLyB2b3hlbHMgaXMgYW4gZWlnaHRoIG9mIHRoZSB3b3JrLlxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0LCBHRU5FX01BUF9WT0xVTUVfU1RSSURFLCAxMjgsIDEpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSBjYWNoZS5rZXkpIHtcbiAgICAgIGNvbnN0IGxvYWQgPSB0aGlzLmdlbmVNYXBMb2Fkcy5uZXh0KCk7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSAzRCBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBJbi1wbGFuZSDPgyBpcyBhIFBIWVNJQ0FMIGJhbmR3aWR0aCwgYW5jaG9yZWQgdG8gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd25cbiAgICAgIC8vIHZveGVsIOKAlCB0aGUgcmVzb2x1dGlvbiB0aGUgMkQgbWFwIGVzdGltYXRlcyBhdCDigJQgc28gYSBzaGVldCBhbmQgdGhlIDJEXG4gICAgICAvLyB2aWV3IG9mIHRoZSBzYW1lIHNlY3Rpb24gYXJlIHRoZSBzYW1lIGZpZWxkIHdoYXRldmVyIGxhdHRpY2UgdGhpcyBpc1xuICAgICAgLy8gcmFzdGVyaXNlZCBvbi4gQWxvbmcgeiBpdCBpcyB0aGUgZGVuc2l0eSBwYXRoJ3MgMS41IHZveGVsczogdGhlIHNtYWxsZXN0IM+DXG4gICAgICAvLyB0aGF0IGJyaWRnZXMgb25lIHNlY3Rpb24gZ2FwLlxuICAgICAgY29uc3QgaW5QbGFuZSA9IGRhdGFzZXQudm9sdW1lPy52b3hlbFNpemUgPz8gZ3JpZC52b3hlbFNpemU7XG4gICAgICBsZXQgZmllbGQ6IEV4cHJlc3Npb25Wb2x1bWVGaWVsZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZCA9IGF3YWl0IGNvbXB1dGVFeHByZXNzaW9uVm9sdW1lQXN5bmMoXG4gICAgICAgICAgb2JzLFxuICAgICAgICAgIGdyaWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2lnbWE6IFtcbiAgICAgICAgICAgICAgaW5QbGFuZVswXSAqIEdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgICAgICBpblBsYW5lWzFdICogR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICAgIGdyaWQudm94ZWxTaXplWzJdICogMS41ICogc21vb3RoaW5nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIGluZGljZXM6IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogaW5TZWxlY3Rpb24sXG4gICAgICAgICAgICBpbnRlcnBvbGF0ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgbWFwLCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjYWNoZS5maWVsZCA9IGZpZWxkO1xuICAgICAgY2FjaGUua2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gY2FjaGUuZmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgLy8gVGhlIGhpZ2ggZW5kIG92ZXIgdGhlIE1FQVNVUkVEIHZveGVscyBvbmx5ICh0aGUgdW5tZWFzdXJlZCB6ZXJvcyB3b3VsZCBwdWxsIGl0IGRvd24gYW5kXG4gICAgLy8gc2F0dXJhdGUgdGhlIG1hcCksIGJ1dCB0aGUgbG93IGVuZCBzdGF5cyAwOiBpbiBhIHZvbHVtZSB0aGUgdmFsdWUgaXMgYWxzbyB0aGUgb3BhY2l0eSBhbmRcbiAgICAvLyAwIHJlYWRzIGFzIFwibm90aGluZyBoZXJlXCIsIHNvIHN0YXJ0aW5nIGF0IHRoZSBsb3dlc3QgbWVhc3VyZWQgdmFsdWUgd291bGQgZXJhc2UgaXQuXG4gICAgY29uc3QgWywgaGldID0gZmllbGRDb250cmFzdFdpbmRvdyhmaWVsZCwgY2xpcFswXSwgY2xpcFsxXSk7XG4gICAgY29uc3QgbG8gPSAwO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVFeHByZXNzaW9uVm9sdW1lKGZpZWxkLCBbbG8sIGhpXSwgeyBsb2c6IHZpZXcubG9nU2NhbGUgfSk7XG4gICAgY29uc3QgbHV0ID0gdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpO1xuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gdGhpcy5hZGRWb2x1bWUodmlld2VyLCBkYXRhLCBmaWVsZC53aWR0aCwgZmllbGQuaGVpZ2h0LCBmaWVsZC5kZXB0aCwge1xuICAgICAgbmFtZTogYGdlbmUgbWFwIMK3ICR7Z2VuZX0ke2ludGVycG9sYXRlID8gJyDCtyB2b2x1bWUnIDogJyd9YCxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoYGdlbmUtbWFwLSR7Z2VuZX1gLCBsdXQpLFxuICAgICAgLy8gVGhlIGVuY29kaW5nIGFscmVhZHkgYXBwbGllZCB0aGUgd2luZG93LCBzbyB0aGUgbGF5ZXIgbXVzdCBub3QgYXBwbHkgYVxuICAgICAgLy8gc2Vjb25kIG9uZTogMC4uMjU1IGlzIHRoZSB3aG9sZSBvZiB3aGF0IGl0IHdhcyBnaXZlbi5cbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbMCwgMjU1XSxcbiAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIC8vIEFkZGl0aXZlIGxpa2UgdGhlIGRlbnNpdHkgdm9sdW1lcywgYW5kIGZvciB0aGUgc2FtZSByZWFzb246IHRoZSBzaGVldHNcbiAgICAgIC8vIGhhdmUgdG8gcmVhZCBUSFJPVUdIIGVhY2ggb3RoZXIgYW5kIHRocm91Z2ggdGhlIGFuYXRvbXksIHdoaWNoIGFcbiAgICAgIC8vIHRyYW5zbHVjZW50IGJsZW5kIHdvdWxkIG9jY2x1ZGUgb25lIHNoZWV0IGF0IGEgdGltZS5cbiAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgfSk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbHVzdGVyIGRlbnNpdHkgdm9sdW1lczogZWFjaCBjbHVzdGVyIHJhc3RlcmlzZWQgaW50byBhIHNtb290aCBzY2FsYXIgZmllbGQgYW5kXG4gICAqIHJheW1hcmNoZWQgYWxvbmdzaWRlIHRoZSBjbG91ZCwgdGludGVkIHdpdGggdGhlIGNsdXN0ZXIncyBvd24gbGVnZW5kIGNvbG91ci5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgc2VyaWFsbHkgc2VjdGlvbmVkIGRhdGFzZXQgcmVhZGFibGUgYXMgYW4gYW5hdG9taWNhbFxuICAgKiBkaXN0cmlidXRpb24uIFRoZSBjbG91ZCBzaG93cyBtZWFzdXJlZCBjZWxscyBhbmQgbm90aGluZyBlbHNlIOKAlCBidXQgYXQgMjAwIMK1bVxuICAgKiBzZWN0aW9uIHNwYWNpbmcgdGhlIGV5ZSBjYW5ub3QgaW50ZWdyYXRlIGEgc3RhY2sgb2YgZGlzY3MgaW50byBhIHNoYXBlLCBhbmRcbiAgICogZXZlcnkgZ2FwIHJlYWRzIGFzIGFic2VuY2UuIEEgZGVuc2l0eSBmaWVsZCBpcyBhIGRpZmZlcmVudCBvYmplY3QgZnJvbSBhIGNlbGw6XG4gICAqIGFuIGVzdGltYXRlLCBkZWZpbmVkIGJldHdlZW4gdGhlIGltYWdlZCBwbGFuZXMsIGRyYXduIGFzIGEgdHJhbnNsdWNlbnQgY2xvdWQgc29cbiAgICogaXQgY2Fubm90IGJlIG1pc3Rha2VuIGZvciBtZWFzdXJlbWVudC4gSW5kaXZpZHVhbCBjZWxscyBhcmUgbmV2ZXIgaW50ZXJwb2xhdGVkIOKAlFxuICAgKiBjb25zZWN1dGl2ZSBzZWN0aW9ucyBzYW1wbGUgZGlmZmVyZW50IGNlbGxzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVycG9sYXRlXG4gICAqIGFsb25nLlxuICAgKlxuICAgKiBPbmUgdm9sdW1lIHBlciBjbHVzdGVyIHJhdGhlciB0aGFuIG9uZSBmb3IgZXZlcnl0aGluZzogYWRkaXRpdmUgYmxlbmRpbmcgaXMgd2hhdFxuICAgKiBtYWtlcyB0d28gY2x1c3RlcnMnIHRlcnJpdG9yaWVzIGNvbXBhcmFibGUsIGFuZCBhIHNpbmdsZSBibGVuZGVkIGZpZWxkIHdvdWxkXG4gICAqIGFuc3dlciBubyBxdWVzdGlvbiBhbnlvbmUgYXNrcyBvZiBhIHRheG9ub215LiBDYXBwZWQgYXQgYERFTlNJVFlfTUFYX0NMVVNURVJTYCBieSBjZWxsXG4gICAqIGNvdW50LlxuICAgKlxuICAgKiBLZXllZCBzbyBpdCByZWJ1aWxkcyBvbmx5IHdoZW4gdGhlIGZpZWxkIHdvdWxkIGFjdHVhbGx5IGRpZmZlciDigJQgdGhlIGRhdGFzZXQsXG4gICAqIHRoZSBjb2xvdXIgY29sdW1uLCB0aGUgYmFuZHdpZHRoLCBvciB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZW5zaXR5Vm9sdW1lcyhcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9uID0gISF2aWV3LmRlbnNpdHlWb2x1bWUgJiYgISFkYXRhc2V0Lm9ic2VydmF0aW9ucy56O1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZGVuc2l0eVNtb290aGluZyA+IDAgPyB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNvbHVtbiA9IHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2NvbHVtbicgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgLy8gVGhlIHNlbGVjdGlvbiBlbnRlcnMgdGhlIGtleSBieSBJREVOVElUWSwgbm90IGJ5IGNvdW50OiB0d28gZGlmZmVyZW50IFJPSXNcbiAgICAvLyBob2xkaW5nIHRoZSBzYW1lIG51bWJlciBvZiBjZWxscyB3b3VsZCBvdGhlcndpc2UgbG9vayBsaWtlIHRoZSBzYW1lIGtleSBhbmRcbiAgICAvLyBsZWF2ZSB0aGUgcHJldmlvdXMgUk9JJ3MgZmllbGRzIG9uIHNjcmVlbi5cbiAgICBjb25zdCBrZXkgPSBvblxuICAgICAgPyBbXG4gICAgICAgICAgZGF0YXNldC5pZCxcbiAgICAgICAgICBjb2x1bW4gPz8gJ2FsbCcsXG4gICAgICAgICAgc21vb3RoaW5nLFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSxcbiAgICAgICAgICBncm91cENvbG9yc0tleShjb2x1bW4sIHZpZXcuZ3JvdXBDb2xvcnMpLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZGVuc2l0eUtleSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmRlbnNpdHlMYXllcnMpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBrZXk7XG4gICAgY29uc3QgbG9hZCA9IHRoaXMuZGVuc2l0eUxvYWRzLm5leHQoKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgLy8gVGhlIGRlbnNpdHkgYm94IGlzIHRoZSBzY2VuZSdzIGJveCAoZW5zdXJlRnJhbWUpLCBzbyB0aGUgY2xvdWQgYWxyZWFkeSBzaXRzIGluIGl0LlxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0KTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcblxuICAgIGxldCBncm91cHM6IERlbnNpdHlHcm91cFtdO1xuICAgIHRyeSB7XG4gICAgICBncm91cHMgPSBhd2FpdCB0aGlzLmRlbnNpdHlHcm91cHMoZGF0YXNldCwgY29sdW1uLCBzZWxlY3Rpb24sIHZpZXcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBkZW5zaXR5IHZvbHVtZXM6IGNvbHVtbiB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2lnbWEgPSBkZWZhdWx0U2lnbWEoZ3JpZCwgc21vb3RoaW5nKTtcbiAgICAvLyBBZGRpdGl2ZSBibGVuZGluZyBTVU1TLCBzbyBhIGZpeGVkIHBlci1sYXllciBvcGFjaXR5IGJsb3dzIG91dCB0byB3aGl0ZSBhc1xuICAgIC8vIHNvb24gYXMgc2V2ZXJhbCBicm9hZCBjbHVzdGVycyBvdmVybGFwIOKAlCBzaXggc3ViY2xhc3NlcyBhdCAwLjU1IGVhY2ggdHVybmVkXG4gICAgLy8gdGhlIGJyYWluIGludG8gb25lIGN5YW4gbWFzcy4gU3BsaXR0aW5nIHRoZSBidWRnZXQga2VlcHMgbiBmdWxseSBvdmVybGFwcGluZ1xuICAgIC8vIHBlYWtzIGluc2lkZSB0aGUgZGlzcGxheSdzIHJhbmdlLCBzbyBvdmVybGFwIHJlYWRzIGFzIG92ZXJsYXA7IGEgc2luZ2xlXG4gICAgLy8gY2x1c3RlciBzdGlsbCBnZXRzIHRoZSBmdWxsIDAuNTUuIEl0IG9ubHkgbWl0aWdhdGVzOiBhIHRyYW5zbHVjZW50IHJheW1hcmNoXG4gICAgLy8gaW50ZWdyYXRlcyBhbG9uZyB0aGUgcmF5LCBzbyBjbHVzdGVycyB0aGF0IGFyZSB1YmlxdWl0b3VzIHJhdGhlciB0aGFuXG4gICAgLy8gcmVnaW9uYWwgKHRoZSBsYXJnZXN0IHN1YmNsYXNzZXMgYXJlIGdsaWEsIHdoaWNoIGFyZSBldmVyeXdoZXJlKSBzdGlsbCBwaWxlXG4gICAgLy8gdXAsIGFuZCBvbmUgY2x1c3RlciBhdCBhIHRpbWUgaXMgdGhlIHJlYWRhYmxlIHdheSB0byBsb29rIGF0IHRob3NlLlxuICAgIGNvbnN0IG9wYWNpdHkgPSBNYXRoLm1pbigwLjU1LCAwLjkgLyBNYXRoLm1heCgxLCBncm91cHMubGVuZ3RoKSk7XG4gICAgbGV0IGZpZWxkczogKFVpbnQ4QXJyYXkgfCBudWxsKVtdO1xuICAgIHRyeSB7XG4gICAgICAvLyBPZmYgdGhlIG1haW4gdGhyZWFkIHBhc3QgdGhlIHdvcmtlciB0aHJlc2hvbGQ7IHRoZSBjbHVzdGVycyBxdWV1ZSBvbiBvbmUgd29ya2VyLlxuICAgICAgZmllbGRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGdyb3Vwcy5tYXAoKGdyb3VwKSA9PlxuICAgICAgICAgIHJhc3Rlcml6ZURlbnNpdHlBc3luYyhcbiAgICAgICAgICAgIGRhdGFzZXQub2JzZXJ2YXRpb25zLFxuICAgICAgICAgICAgZ3JpZCxcbiAgICAgICAgICAgIHsgc2lnbWEsIGluZGljZXM6IGdyb3VwLmluZGljZXMgfSxcbiAgICAgICAgICAgIHsgc2lnbmFsOiBsb2FkLnNpZ25hbCB9LFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnIpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBrZXksIG9yIHRoZSBzY2VuZSB3ZW50IGF3YXlcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICBncm91cHMuZm9yRWFjaCgoZ3JvdXAsIGkpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBmaWVsZHNbaV07XG4gICAgICAvLyBBIGNsdXN0ZXIgd2l0aCBub3RoaW5nIG9uIHRoZSBncmlkIGRyYXdzIG5vIGxheWVyLCByYXRoZXIgdGhhbiBhbiBlbXB0eSBib3guXG4gICAgICBpZiAoIWRhdGEpIHJldHVybjtcbiAgICAgIHRoaXMuZGVuc2l0eUxheWVycy5wdXNoKFxuICAgICAgICB0aGlzLmFkZFZvbHVtZSh2aWV3ZXIsIGRhdGEsIGdyaWQud2lkdGgsIGdyaWQuaGVpZ2h0LCBncmlkLmRlcHRoLCB7XG4gICAgICAgICAgbmFtZTogYGRlbnNpdHkgwrcgJHtncm91cC5uYW1lfWAsXG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuY3R4LmRpc3BsYXkuY2hhbm5lbFRpbnRDb2xvcm1hcChncm91cC5jb2xvciksXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmN0eC5kaXNwbGF5LmludmVydCxcbiAgICAgICAgICAvLyBUcmFuc2x1Y2VudCwgbm90IE1JUDogYSBjbHVzdGVyJ3MgaW50ZXJpb3IgaXMgdGhlIHJlYWRhYmxlIHBhcnQsIGFuZCBNSVBcbiAgICAgICAgICAvLyB3b3VsZCBmbGF0dGVuIGV2ZXJ5IGNsb3VkIHRvIGl0cyBicmlnaHRlc3Qgc2hlbGwuXG4gICAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAgIG9wYWNpdHksXG4gICAgICAgICAgLy8gQWRkaXRpdmUsIHNvIHR3byBjbHVzdGVycyBvdmVybGFwcGluZyByZWFkIGFzIGJvdGggYmVpbmcgdGhlcmUgaW5zdGVhZFxuICAgICAgICAgIC8vIG9mIHRoZSBuZWFyZXIgb25lIGhpZGluZyB0aGUgb3RoZXIuXG4gICAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsdXN0ZXJzIHRvIHJhc3RlcmlzZTogdGhlIGNhdGVnb3JpZXMgb2YgdGhlIGFjdGl2ZSBjYXRlZ29yaWNhbCBjb2xvdXJpbmcsXG4gICAqIGJpZ2dlc3QgZmlyc3QgYW5kIGNhcHBlZCwgZWFjaCB3aXRoIGl0cyBsZWdlbmQgY29sb3VyLCByZXN0cmljdGVkIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgKiB3aGVuIHRoZXJlIGlzIG9uZS4gV2l0aCBubyBjYXRlZ29yaWNhbCBjb2xvdXJpbmcgdGhlcmUgaXMgb25lIGdyb3VwIOKAlCB0b3RhbCBjZWxsIGRlbnNpdHksXG4gICAqIHdoaWNoIGlzIGEgcmVhbCBxdWVzdGlvbiBvbiBpdHMgb3duIChcIndoZXJlIGlzIHRoZSB0aXNzdWUgZGVuc2U/XCIpIGFuZCB0aGUgaG9uZXN0IHRoaW5nIHRvXG4gICAqIHNob3cgd2hlbiB0aGUgdmlldyBpcyBub3QgZW5jb2RpbmcgYSB0YXhvbm9teS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVuc2l0eUdyb3VwcyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICBjb2x1bW46IHN0cmluZyB8IG51bGwsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPERlbnNpdHlHcm91cFtdPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IG1ldGEgPSBjb2x1bW4gPyBmaW5kQ29sdW1uTWV0YShkYXRhc2V0LCBjb2x1bW4pIDogdW5kZWZpbmVkO1xuICAgIGlmICghcG9ydCB8fCAhY29sdW1uIHx8ICFtZXRhIHx8IG1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuIFt0b3RhbERlbnNpdHlHcm91cChzZWxlY3Rpb24pXTtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2x1bW4pO1xuICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihsb2FkZWQpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHJhbmtEZW5zaXR5R3JvdXBzKGNvbHVtbiwgbG9hZGVkLCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCwgc2VsZWN0aW9uLCB2aWV3Lmdyb3VwQ29sb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgKG9yIGtlZXApIHRoZSBkYXRhc2V0J3MgcmVmZXJlbmNlIHZvbHVtZS4gVGhlIG9mZnNldCB0aGF0IHNpdHMgdGhlIG9ic2VydmF0aW9ucyBpbnNpZGVcbiAgICogaXQgaXMge0BsaW5rIGVuc3VyZUZyYW1lfSdzLlxuICAgKlxuICAgKiBBIGZhaWxlZCBvciBhYnNlbnQgdm9sdW1lIGlzIG5vdCBmYXRhbDogdGhlIGNsb3VkIHJlbmRlcnMgb24gaXRzIG93biwgaW4gdGhlIHNhbWUgYm94LCBhbmRcbiAgICogdGhlIGNhbWVyYSBmcmFtZXMgdGhlIHBvaW50cyBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVWb2x1bWUodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBjb25zdCBrZXkgPSBtZXRhID8gYCR7ZGF0YXNldC5pZH06JHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9YCA6IG51bGw7XG4gICAgaWYgKGtleSAmJiBrZXkgPT09IHRoaXMudm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy52b2x1bWUpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMudm9sdW1lKTtcbiAgICAgIHRoaXMudm9sdW1lID0gbnVsbDtcbiAgICAgIHRoaXMudm9sdW1lS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlIHN1cmZhY2VzIHNhdCBpbiB0aGUgdm9sdW1lIGp1c3QgcmVtb3ZlZCAob3IgdGhlcmUgd2FzIG5vbmUpOiBkb3duIHVudGlsIG9uZSBpcyBwbGFjZWQuXG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgIGlmICghbWV0YSB8fCAhcG9ydD8uZ2V0Vm9sdW1lKSByZXR1cm47XG5cbiAgICBsZXQgdm94ZWxzOiBVaW50OEFycmF5O1xuICAgIHRyeSB7XG4gICAgICB2b3hlbHMgPSBhd2FpdCBwb3J0LmdldFZvbHVtZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSByZWZlcmVuY2Ugdm9sdW1lIHVuYXZhaWxhYmxlIOKAlCBkcmF3aW5nIHRoZSBjbG91ZCBhbG9uZScsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN0eC5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy52b2x1bWVLZXkgPSBrZXk7XG4gICAgdGhpcy52b2x1bWUgPSB0aGlzLmFkZFZvbHVtZSh2aWV3ZXIsIHZveGVscywgbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGgsIHtcbiAgICAgIG5hbWU6ICdyZWZlcmVuY2Ugdm9sdW1lJyxcbiAgICAgIGNvbG9ybWFwOiAnZ3JheScsXG4gICAgICAvLyBNSVAgd291bGQgZHJhdyB0aGUgYnJpZ2h0ZXN0IHZveGVsIGFsb25nIGVhY2ggcmF5LCB3aGljaCBmb3IgYW4gYXZlcmFnZWRcbiAgICAgIC8vIHRlbXBsYXRlIG1lYW5zIGEgZmxhdCB3aGl0ZSBzaGVsbCB0aGF0IGhpZGVzIHRoZSBjbG91ZC4gVHJhbnNsdWNlbnQgbGV0c1xuICAgICAgLy8gdGhlIHBvaW50cyByZWFkIHRocm91Z2ggdGhlIHRpc3N1ZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBkcmF3aW5nXG4gICAgICAvLyB0aGVtIHRvZ2V0aGVyLlxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgb3BhY2l0eTogdmlldy52b2x1bWVPcGFjaXR5LFxuICAgICAgdm94ZWxTaXplOiBbdngsIHZ5LCB2el0sXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2gpIHRoaXMudm9sdW1lLmJsZW5kaW5nID0gJ3RyYW5zbHVjZW50X25vX2RlcHRoJztcbiAgICB0aGlzLnBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBib3ggZXZlcnl0aGluZyBzaXRzIGluLCBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4sIGFuZCB0aGUgb2Zmc2V0IHRoYXQgc2l0cyB0aGVcbiAgICogb2JzZXJ2YXRpb25zIGluIGl0OyB3aXRoIHRoZSBheGVzIGdpem1vIGFuZCB0aGUgWiBoYW5kbGUgb24gaXQuXG4gICAqXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZTogbmFwYXJpLWpzIG1hcHMgYSB2b2x1bWUncyB1bml0IGN1YmUgdG8gYSB3b3JsZCBib3ggY2VudHJlZCBvblxuICAgKiB0aGUgb3JpZ2luLCBzaXplZCBgZGltcyB4IHZveGVsU2l6ZWAuIFRoZSBvYnNlcnZhdGlvbnMsIGJ5IGNvbnRyYWN0LCBhcmUgaW4gdGhlIHJlZmVyZW5jZVxuICAgKiB2b2x1bWUncyBmcmFtZSB3aXRoIGl0cyBuZWFyIGNvcm5lciBhdCB0aGUgY29vcmRpbmF0ZSBvcmlnaW4sIGFuZCB0aGUgZGVuc2l0eSBncmlkIGlzIG1lYXN1cmVkXG4gICAqIGZyb20gdGhlIGNvb3JkaW5hdGUgb3JpZ2luIHRoZSBzYW1lIHdheSAoYGRlbnNpdHlHcmlkYCksIHNvIGl0cyBib3ggaXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUnc1xuICAgKiB3aGVuIHRoZXJlIGlzIG9uZS4gU28gdGhlIFBPSU5UUyBtb3ZlIGJ5IGhhbGYgdGhhdCBib3gg4oCUIHtAbGluayBvcmlnaW59IOKAlCBhbmQgZXZlcnkgdm9sdW1lLCB0aGVcbiAgICogcmVmZXJlbmNlLCB0aGUgZGVuc2l0aWVzIGFuZCB0aGUgZ2VuZSBtYXAsIGxpbmVzIHVwIHdpdGggdGhlbSBhbmQgd2l0aCBlYWNoIG90aGVyLiBXaXRob3V0IGFcbiAgICogcmVmZXJlbmNlIHZvbHVtZSB0aGlzIGNlbnRyZXMgdGhlIGNsb3VkIHRvbywgd2hpY2ggdGhlIGF4ZXMgYW5kIHRoZSBaIHN0cmV0Y2ggbmVlZDogYm90aCB3b3JrXG4gICAqIGFib3V0IHRoZSBvcmlnaW4uXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUZyYW1lKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0KTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7ZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnR9OiR7bWV0YSA/IGAke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogJy0nfWA7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5ib3hLZXkpIHJldHVybjtcbiAgICB0aGlzLmJveEtleSA9IGtleTtcbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCk7XG4gICAgdGhpcy5ib3ggPSBncmlkXG4gICAgICA/IHtcbiAgICAgICAgICB3aWR0aDogZ3JpZC53aWR0aCAqIGdyaWQudm94ZWxTaXplWzBdLFxuICAgICAgICAgIGhlaWdodDogZ3JpZC5oZWlnaHQgKiBncmlkLnZveGVsU2l6ZVsxXSxcbiAgICAgICAgICBkZXB0aDogZ3JpZC5kZXB0aCAqIGdyaWQudm94ZWxTaXplWzJdLFxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgYm94ID0gdGhpcy5ib3g7XG4gICAgdGhpcy5vcmlnaW4gPSBib3ggPyBbLWJveC53aWR0aCAvIDIsIC1ib3guaGVpZ2h0IC8gMiwgLWJveC5kZXB0aCAvIDJdIDogWzAsIDAsIDBdO1xuICAgIC8vIEZvcmNlIGEgZ2VvbWV0cnkgcmVidWlsZDogdGhlIG9mZnNldCBjaGFuZ2VkLCBzbyBjYWNoZWQgcG9zaXRpb25zIGFyZSBzdGFsZS5cbiAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbGxBeGVzKGRhdGFzZXQpO1xuICAgIC8vIEEgc3RyZXRjaCBjaG9zZW4gZm9yIGFub3RoZXIgYm94IG1heSBiZSBwYXN0IHdoYXQgdGhpcyBvbmUgYWxsb3dzOiBkcmF3IHdoYXQgaXMgaW4gZWZmZWN0LlxuICAgIHRoaXMuYXBwbHlaU2NhbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgVm9sdW1lIHZpZXcncyBheGVzIGdpem1vIGFuZCBaLWhlaWdodCBoYW5kbGUsIG9uIHtAbGluayBib3h9LiBUaGUgaGFuZGxlIGZsb2F0cyBwYXN0IHRoZVxuICAgKiB0b3Agb2YgdGhlIFogYXhpcyAodGhlIGJveCdzIG1pbi1YWSBjb3JuZXIsIHdoZXJlIHRoZSBibHVlIGF4aXMgYW5kIGl0cyBsYWJlbCBhcmUpLCBieSBhIHNoYXJlXG4gICAqIG9mIHRoZSBib3gncyBsYXJnZXN0IHNpZGUgcmF0aGVyIHRoYW4gb2YgaXRzIGRlcHRoLCBzbyBpdCBjbGVhcnMgdGhlIGxhYmVsIGV2ZW4gd2hpbGUgYSB0aGluXG4gICAqIHNlY3Rpb24gaXMgZHJhd24gZmxhdC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbEF4ZXMoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUF4ZXMoKTtcbiAgICBjb25zdCBib3ggPSB0aGlzLmJveDtcbiAgICBpZiAoIWJveCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgdmlld2VyLCBob3N0LCBzZXR0aW5ncyB9ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZHJhd24gPSB0aGlzLmRyYXduQm94KGJveCk7XG4gICAgdGhpcy5naXptbyA9IG5ldyBBeGVzM2RHaXptbyhcbiAgICAgIHZpZXdlcixcbiAgICAgIGhvc3QsXG4gICAgICBkcmF3bixcbiAgICAgIHNwYXRpYWxBeGVzTGFiZWxzKGRyYXduLCB0aGlzLnpTY2FsZSgpLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICAgIHtcbiAgICAgICAgdmlzaWJsZTogc2V0dGluZ3MuYXhlc1Zpc2libGUsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgbWF4U2NhbGUgPSBzcGF0aWFsWlNjYWxlTWF4KGJveCk7XG4gICAgdGhpcy56SGFuZGxlID0gbmV3IE5hcGFyaVZvbHVtZVpIYW5kbGUoaG9zdCwgdmlld2VyLmNhbWVyYTNkLCB7XG4gICAgICB0b3BBbmNob3I6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IHRoaXMuZHJhd25Cb3goYm94KTtcbiAgICAgICAgcmV0dXJuIFstZC53aWR0aCAvIDIsIC1kLmhlaWdodCAvIDIsIGQuZGVwdGggLyAyICsgMC4wOCAqIE1hdGgubWF4KGQud2lkdGgsIGQuaGVpZ2h0LCBkLmRlcHRoKV07XG4gICAgICB9LFxuICAgICAgZ2V0U2NhbGU6ICgpID0+IHRoaXMuelNjYWxlKCksXG4gICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0WlNjYWxlKHMpLFxuICAgICAgbWluU2NhbGU6IFNQQVRJQUxfWl9TQ0FMRV9NSU4sXG4gICAgICBtYXhTY2FsZSxcbiAgICAgIHBpeGVsc1BlckRvdWJsZTogc3BhdGlhbFpQaXhlbHNQZXJEb3VibGUobWF4U2NhbGUpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBeGVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdpem1vKSB7XG4gICAgICB0aGlzLmN0eC52aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdpem1vLmxheWVyKTtcbiAgICAgIHRoaXMuZ2l6bW8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5naXptbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gIH1cblxuICAvKiogRHJvcCBldmVyeSBsYXllciBvZiB0aGUgY2xvdWQgKHRoZSBkYXRhc2V0IHdlbnQgYXdheSwgb3IgaGFzIG5vIHopLiAqL1xuICBwcml2YXRlIHJlbW92ZUxheWVycyh2aWV3ZXI6IFZpZXdlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLmNsZWFyRnJhbWUoKTtcbiAgICB0aGlzLnRyYW5zY3JpcHRzM2QucmVtb3ZlKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBbdGhpcy5wb2ludHMsIHRoaXMudm9sdW1lLCB0aGlzLmdlbmVNYXBMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzXSkge1xuICAgICAgaWYgKGxheWVyKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5nZW5lTWFwVm9sdW1lLmZpZWxkID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZS5rZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMudm9sdW1lID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW4gPSBbMCwgMCwgMF07XG4gICAgdGhpcy5ib3ggPSBudWxsO1xuICAgIHRoaXMuYm94S2V5ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZUF4ZXMoKTtcbiAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zZXRQaWNrZXIobnVsbCk7XG4gICAgdGhpcy5sYXllcktleSA9IG51bGw7XG4gICAgdGhpcy5zY2FsYXJLZXkgPSBudWxsO1xuICAgIHRoaXMucG9zaXRpb25zID0gbnVsbDtcbiAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGNvbG91cnMgdGhlIGNsb3VkLlxuICAgKlxuICAgKiBDb250aW51b3VzIGRhdGEgZ29lcyB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCB0aGUgc2FtZSBwZXJjZW50aWxlIHdpbmRvdyB0aGUgMkQgcGF0aFxuICAgKiB1c2VzLiBDYXRlZ29yaWNhbCBkYXRhIGlzIG9uZSBSR0JBIHBlciBwb2ludCBmcm9tIHRoZSBjb2x1bW4ncyBwYWxldHRlLCBzbyBhbnkgbnVtYmVyIG9mXG4gICAqIGNhdGVnb3JpZXMga2VlcHMgaXRzIG93biBjb2xvdXIg4oCUIHNlZSBgZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWxgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzY2FsYXJFbmNvZGluZyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxTcGF0aWFsM2RFbmNvZGluZyB8IG51bGw+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgLy8gQ29sb3VyZWQgYnkgdGhlIGdlbmUgZmlsdGVyOiBlYWNoIG9ic2VydmF0aW9uIGluIGl0cyBnZW5lJ3MgY29sb3VyLlxuICAgIC8vIEEgY29sb3VyIGxpa2UgYW55IG90aGVyOiBhIGZhaWxlZCByZWFkIGZhbGxzIGJhY2sgdG8gdGhlIHZpZXcncyBjb2xvdXIgc291cmNlLlxuICAgIGNvbnN0IGJ5R2VuZSA9XG4gICAgICBwb3J0ICYmIGNvdW50XG4gICAgICAgID8gYXdhaXQgb2JzZXJ2YXRpb25HZW5lU3R5bGUodmlldywgY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGJ5IGdlbmUgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gdGhlIGNvbG91ciBzb3VyY2UnLFxuICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBudWxsO1xuICAgIGlmIChieUdlbmUpIHJldHVybiBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbChieUdlbmUuY29kZXMsIGJ5R2VuZS5jb2xvcnMpO1xuICAgIGNvbnN0IGNvbG9yQnkgPSB2aWV3LmNvbG9yQnk7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICBjb25zdCBjb2x1bW46IFNwYXRpYWxDb2x1bW4gPSBhd2FpdCBwb3J0LmdldENvbHVtbihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoXG4gICAgICAgICAgY29sdW1uLmNvZGVzLFxuICAgICAgICAgIGNhdGVnb3J5Q29sb3JzRm9yKGNvbG9yQnkubmFtZSwgY29sdW1uLm1ldGEsIHZpZXcuZ3JvdXBDb2xvcnMpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyhjb2x1bW4udmFsdWVzLCB2aWV3KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlQ29udGludW91cyhhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKSwgdmlldyk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIHRoZSBhY3RpdmUgY29sb3JtYXAgb3ZlciBhIHBlcmNlbnRpbGUtY2xpcHBlZCB3aW5kb3cuICovXG4gIGVuY29kZUNvbnRpbnVvdXMoc291cmNlOiBGbG9hdDMyQXJyYXksIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBTcGF0aWFsM2RTY2FsYXJzIHtcbiAgICByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgIHNvdXJjZSxcbiAgICAgIHZpZXcsXG4gICAgICB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyksXG4gICAgICB0aGlzLnNlc3Npb24uY29udHJhc3RXaW5kb3dzLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgb2JzZXJ2YXRpb25zIHRoZSBjbG91ZCBkcmF3cywgYW5kIHRoZSBrZXlzIG9mIGl0cyBnZW9tZXRyeSBhbmQgb2YgaXRzIGNvbG91ciBzb3VyY2UuXG4gKlxuICogT25lIGltYWdlZCBzZWN0aW9uLCBvciB0aGUgd2hvbGUgc3RhY2sgKGBzaG93bmAgbnVsbCkuIFRoZSBzdWJzZXQgSVMgdGhlIGdlb21ldHJ5LCBzbyBpdFxuICogYmVsb25ncyBpbiB0aGUgZ2VvbWV0cnkga2V5IHJhdGhlciB0aGFuIGJlaW5nIHJlLWRlcml2ZWQgcGVyIGZyYW1lIOKAlCBhbmQgYW4gb3V0LW9mLXJhbmdlXG4gKiBpbmRleCBpcyBjbGFtcGVkIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjbG91ZCwgYmVjYXVzZSB0aGUgc2VjdGlvbiBjb3VudCBjaGFuZ2VzIHdpdGggdGhlXG4gKiBkYXRhc2V0IHdoaWxlIHRoZSB2aWV3IHN0YXRlIHBlcnNpc3RzLiBUaGUgc2NhbGFycycgaWRlbnRpdHkgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IGZyb20gdGhlXG4gKiBnZW9tZXRyeSdzIChgY29sb3JCeWAgcGx1cyB0aGUgdHJhbnNmb3JtcyBmZWVkaW5nIHRoZSBlbmNvZGluZyk6IGEgbmV3IGNvbG91ciBzb3VyY2Ugc3dhcHNcbiAqIGB2YWx1ZXNgIGluIHBsYWNlIChuYXBhcmktanMg4omlIDAuMTQpLCB3aGlsZSBhIG5ldyBnZW9tZXRyeSBuZWVkcyBhIG5ldyBsYXllci5cbiAqL1xuZnVuY3Rpb24gY2xvdWRTdWJzZXQoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICBnZW5lU2hvd246IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbik6IHsgc2hvd246IFVpbnQzMkFycmF5IHwgbnVsbDsga2V5OiBzdHJpbmc7IHNjYWxhcktleTogc3RyaW5nIH0ge1xuICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gIGNvbnN0IHNlY3Rpb24gPVxuICAgIHZpZXcucG9pbnRTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LnBvaW50U2VjdGlvbikpXVxuICAgICAgOiBudWxsO1xuICBsZXQgc2hvd24gPSBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IG51bGw7XG4gIC8vIFRoZSBnZW5lIGZpbHRlciBsZWF2ZXMgaXRzIHVubWF0Y2hlZCBvYnNlcnZhdGlvbnMgb3V0IG9mIHRoZSBnZW9tZXRyeSwgc28gdGhleSBhcmUgbmVpdGhlclxuICAvLyBkcmF3biBub3IgcGlja2VkLlxuICBpZiAoZ2VuZVNob3duKSBzaG93biA9IGtlZXBTaG93bihzaG93biwgZ2VuZVNob3duLCBvYnMuY291bnQpO1xuICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzZWN0aW9uID8/ICdhbGwnfToke2dlbmVTaG93biA/IGdlbmVGaWx0ZXJLZXkodmlldykgOiAnJ31gO1xuICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gIGNvbnN0IHNjYWxhcktleSA9IFtcbiAgICBrZXksXG4gICAgdmlldy5jb2xvckJ5ID8gYCR7dmlldy5jb2xvckJ5LmtpbmR9OiR7dmlldy5jb2xvckJ5Lm5hbWV9YCA6ICdmbGF0JyxcbiAgICBncm91cENvbG9yc0tleSh2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsLCB2aWV3Lmdyb3VwQ29sb3JzKSxcbiAgICBvYnNlcnZhdGlvbkdlbmVTdHlsZUtleSh2aWV3KSxcbiAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICBjbGlwLmpvaW4oJywnKSxcbiAgXS5qb2luKCd8Jyk7XG4gIHJldHVybiB7IHNob3duLCBrZXksIHNjYWxhcktleSB9O1xufVxuXG4vKiogVGhlIG9ic2VydmF0aW9ucyBvZiBgaW5kaWNlc2AgKGV2ZXJ5IG9uZSB3aGVuIG51bGwpIHRoYXQgYHNob3duYCBrZWVwcy4gKi9cbmZ1bmN0aW9uIGtlZXBTaG93bihpbmRpY2VzOiBVaW50MzJBcnJheSB8IG51bGwsIHNob3duOiBVaW50OEFycmF5LCBjb3VudDogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogY291bnQpO1xuICBsZXQgbiA9IDA7XG4gIGlmIChpbmRpY2VzKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIGlmIChzaG93bltpXSkgb3V0W24rK10gPSBpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKHNob3duW2ldKSBvdXRbbisrXSA9IGk7XG4gIH1cbiAgcmV0dXJuIG91dC5zdWJhcnJheSgwLCBuKTtcbn1cbiJdfQ==