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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -1,7 +1,12 @@
1
+ import { boxRadius, keepSceneInDepth } from './napari-camera-depth';
2
+ import { RegionMeshPointer } from './napari-region-mesh-pointer';
3
+ import { placeInWorker } from '../../region-source/worker-region-source';
4
+ import { cellTypeColumnFor } from '../../spatial/lod';
5
+ import { datasetRegionSet } from '../../visualizer/spatial-region-set';
1
6
  import { PointPicker, colormapFromLut } from 'napari-js';
2
7
  import { ScaleBarOverlay, formatLength } from 'napari-js/overlays';
3
8
  import { findColumnMeta, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
4
- import { DEFAULT_MUTED_OPACITY, resolveCategoryColors } from '../../spatial/spatial-encoding';
9
+ import { DEFAULT_MUTED_OPACITY, categoryColorsFor, groupColorsKey } from '../../spatial/spatial-encoding';
5
10
  import { emptySelection, maskToIndices } from '../../spatial/spatial-selection';
6
11
  import { defaultSigma, densityGrid } from '../../spatial/spatial-density';
7
12
  import { observationsInSection, sectionsOf } from '../../spatial/spatial-sections';
@@ -15,6 +20,12 @@ import { GENE_MAP_SIGMA, GENE_MAP_VOLUME_STRIDE, SPATIAL_3D_BASE_SIZE, SPATIAL_S
15
20
  import { HOVER_RADIUS_PX } from './napari-spatial-hover';
16
21
  import { Axes3dGizmo, surface3dControls } from './napari-axes-gizmo';
17
22
  import { NapariVolumeZHandle } from './napari-volume-z-handle';
23
+ import { Spatial3dTranscripts } from './napari-spatial-3d-transcripts';
24
+ import { Spatial3dCells } from './napari-spatial-3d-cells';
25
+ import { cellColorsFor, cellColorsRgba } from './spatial-tiles/cell-layers';
26
+ import { CategoricalLookup } from './spatial-tiles/categorical-lookup';
27
+ import { ContrastWindowCache } from './napari-spatial-encoding';
28
+ import { NO_CATEGORY } from '../../contracts/spatial-dataset.contract';
18
29
  import { SpatialSceneBase } from './napari-spatial-scene';
19
30
  /** The least Z stretch: a tenth of the true depth. */
20
31
  export const SPATIAL_Z_SCALE_MIN = 0.1;
@@ -22,6 +33,11 @@ export const SPATIAL_Z_SCALE_MIN = 0.1;
22
33
  const SPATIAL_Z_SCALE_MAX = 10;
23
34
  /** Nor more than this, however thin the cloud is. */
24
35
  const SPATIAL_Z_SCALE_CEILING = 1000;
36
+ /**
37
+ * In-plane voxels across the image when a region set's planes are reconstructed over the dataset's
38
+ * own image (see voxelStep): a step of about 5 px on a 5,700 px wide MERFISH section (0.6 µm).
39
+ */
40
+ export const REGION_PLANES_VOXELS = 1024;
25
41
  /**
26
42
  * The most a box's Z may be stretched: until it is twice as deep as it is wide, so even a section
27
43
  * microns thick and millimetres wide can be stood up into a block — but never less than the
@@ -95,6 +111,12 @@ export class Spatial3dScene extends SpatialSceneBase {
95
111
  /** The anatomical volume the cloud sits inside, when the dataset has one. */
96
112
  this.volume = null;
97
113
  this.volumeKey = null;
114
+ /**
115
+ * The reference volume on its way (its key and the load), shared by every rebuild that asks for
116
+ * it meanwhile: each one adding its own left one layer behind, which the view's toggle (bound to
117
+ * {@link volume}) then never hid.
118
+ */
119
+ this.volumeLoading = null;
98
120
  /** Per-cluster density volumes drawn alongside the cloud, and what they were
99
121
  * built from — rasterising is seconds of work, so it must not repeat for a
100
122
  * change that cannot affect the field. */
@@ -131,10 +153,121 @@ export class Spatial3dScene extends SpatialSceneBase {
131
153
  this.geneMapLoads = new Supersede();
132
154
  /** Whether the reference volume lets every region surface through (see setRegionsThroughVolume). */
133
155
  this.regionsThrough = false;
156
+ /**
157
+ * Each slice's z, in the observations' units, of the region set the surfaces are built from when
158
+ * it says where its slices are (a 3D segmentation's planes, see setRegionPlanes); else null.
159
+ */
160
+ this.regionPlanes = null;
134
161
  /** The store's invert setting, which the density volumes follow (no other subscription of
135
162
  * this scene carries it). */
136
163
  this.invertSub = null;
137
- this.regionMeshes = new VolumeRegionMeshes(ctx.viewer);
164
+ this.cellWindows = new ContrastWindowCache();
165
+ this.cellClasses = null;
166
+ /** What the cells were last coloured for, so a rebuild that changed none of it recolours nothing. */
167
+ this.cellStyleKey = null;
168
+ this.cellStyleRequest = 0;
169
+ this.lastCellSelection = null;
170
+ this.cellSelectionCount = 0;
171
+ this.meshPointer = null;
172
+ /** Gives the camera back napari-js's own depth range (see keepSceneInDepth). */
173
+ this.restoreDepth = null;
174
+ this.toolSub = null;
175
+ this.selecting = false;
176
+ this.muteRequest = 0;
177
+ // Placed in the cells' worker: placing every class's vertices here held the UI for seconds.
178
+ this.regionMeshes = new VolumeRegionMeshes(ctx.viewer, (v, f) => placeInWorker(v, f));
179
+ this.transcripts3d = new Spatial3dTranscripts(ctx.viewer, (message) => ctx.badge.beginTask(message));
180
+ this.cells3d = new Spatial3dCells({
181
+ viewer: ctx.viewer,
182
+ port: session.port,
183
+ beginTask: (label) => ctx.badge.begin(label),
184
+ status: (status) => session.reportCells3d(status),
185
+ });
186
+ this.cellLookup = session.port ? new CategoricalLookup(session.port) : null;
187
+ }
188
+ /**
189
+ * Draw these classes of the dataset's region set as individual cells, each its own surface in
190
+ * the panel's Cell Color (see Spatial3dCells); none: no cells.
191
+ */
192
+ setRegionCells(classes) {
193
+ this.cellClasses = classes?.length ? classes : null;
194
+ this.cells3d.setClasses(this.cellClasses ? new Set(this.cellClasses) : null);
195
+ this.cellStyleKey = null;
196
+ const latest = this.session.latest;
197
+ if (latest?.[0])
198
+ void this.styleCells(latest[0], latest[1], latest[2]);
199
+ }
200
+ /**
201
+ * The cells' colours (the panel's Cell Color, its selection muting), which are shown (its groups
202
+ * switched off and gene filter hide theirs; the Cells switch all), and their opacity.
203
+ */
204
+ async styleCells(dataset, view, selection) {
205
+ this.cells3d.setDataset(dataset);
206
+ const port = this.session.port;
207
+ if (!this.cellClasses || !port || !this.cellLookup)
208
+ return;
209
+ const key = JSON.stringify([
210
+ dataset.id,
211
+ view.cellColorMode,
212
+ view.cellColorGene,
213
+ view.cellColorMode === 'column' ? view.colorBy : null,
214
+ view.cellSingleColor,
215
+ view.cellTypeColumn,
216
+ view.logScale,
217
+ view.percentileClip,
218
+ view.continuousColormap,
219
+ view.groupColors,
220
+ view.hiddenGroups,
221
+ view.showCells,
222
+ view.cellOpacity,
223
+ geneFilterKey(view),
224
+ this.ctx.display.continuousColormapKey(view),
225
+ ]) + `|${selection.count}|${this.cellSelectionRev(selection)}`;
226
+ if (key === this.cellStyleKey)
227
+ return;
228
+ this.cellStyleKey = key;
229
+ const request = ++this.cellStyleRequest;
230
+ const count = dataset.observations.count;
231
+ try {
232
+ const owners = Uint32Array.from({ length: count }, (_, i) => i);
233
+ const [colors, hidden] = await Promise.all([
234
+ cellColorsFor({
235
+ port,
236
+ lookup: this.cellLookup,
237
+ contrastWindows: this.cellWindows,
238
+ continuousLut: (v) => this.ctx.display.spatialLut(v),
239
+ }, dataset, view,
240
+ // Colours as they are: a selection fades what it leaves out (see Spatial3dCells), not grey.
241
+ emptySelection(count), owners),
242
+ this.cellLookup.hiddenCodes(dataset, view),
243
+ ]);
244
+ if (request !== this.cellStyleRequest)
245
+ return;
246
+ let visible = null;
247
+ if (view.showCells === false) {
248
+ visible = new Uint8Array(count);
249
+ }
250
+ else if (hidden) {
251
+ visible = new Uint8Array(count);
252
+ for (let i = 0; i < count; i++) {
253
+ const c = hidden.codes[i];
254
+ visible[i] = c !== NO_CATEGORY && hidden.hidden[c] ? 0 : 1;
255
+ }
256
+ }
257
+ this.cells3d.setStyle(cellColorsRgba(colors, count), visible, view.cellOpacity ?? 1, selection.count ? selection.mask : null);
258
+ }
259
+ catch (err) {
260
+ if (request === this.cellStyleRequest)
261
+ this.cellStyleKey = null;
262
+ console.warn('[napari-js] the 3D cells could not be coloured', err);
263
+ }
264
+ }
265
+ cellSelectionRev(selection) {
266
+ if (selection !== this.lastCellSelection) {
267
+ this.lastCellSelection = selection;
268
+ this.cellSelectionCount++;
269
+ }
270
+ return this.cellSelectionCount;
138
271
  }
139
272
  /** Show these region reconstructions with the cloud (replacing the ones shown). */
140
273
  setRegionMeshes(meshes) {
@@ -145,6 +278,32 @@ export class Spatial3dScene extends SpatialSceneBase {
145
278
  }
146
279
  setRegionHidden(keys) {
147
280
  this.regionMeshes.setHidden(keys);
281
+ // A surface's key is its class's name: a hidden class's cells are hidden too.
282
+ this.cells3d.setHiddenClasses(keys);
283
+ }
284
+ /**
285
+ * Where the region set's slices are, in the observations' units (null: they are the plotted
286
+ * stack's slices): its surfaces then sit at their planes among the observations (see
287
+ * placeRegionMeshes), on an image of one plane too.
288
+ */
289
+ setRegionPlanes(z) {
290
+ const same = z === this.regionPlanes ||
291
+ (!!z &&
292
+ !!this.regionPlanes &&
293
+ z.length === this.regionPlanes.length &&
294
+ z.every((v, i) => v === this.regionPlanes?.[i]));
295
+ if (same)
296
+ return;
297
+ this.regionPlanes = z?.length ? [...z] : null;
298
+ const latest = this.session.latest;
299
+ const dataset = latest?.[0];
300
+ if (dataset)
301
+ this.placeRegionMeshes(dataset);
302
+ // The cells stand in for the markers only while the set is placed.
303
+ if (dataset && latest?.[1]) {
304
+ this.showPointsAsAsked(dataset, latest[1]);
305
+ this.ctx.viewer.requestRender();
306
+ }
148
307
  }
149
308
  /** As the Volume view: the reference volume hides the surfaces behind what it shows, or none. */
150
309
  setRegionsThroughVolume(through) {
@@ -160,17 +319,36 @@ export class Spatial3dScene extends SpatialSceneBase {
160
319
  * is offset to sit in it). Only when the plotted image IS that volume's stack: regions drawn on
161
320
  * another image (a tissue image) have no place in it, and are not shown - nor are surfaces
162
321
  * placed in a volume this one replaced.
322
+ *
323
+ * Unless the region set says where its slices are ({@link setRegionPlanes}: a 3D segmentation's
324
+ * planes) and the plotted image is the dataset's own (`imageRef`): image pixels are then taken
325
+ * back to the observations' units through `imageRef`, slice k to its plane's z, and both moved
326
+ * by the offset the cloud is, so each cell's surface sits around its observation.
163
327
  */
164
328
  placeRegionMeshes(dataset) {
329
+ // The individual cells sit where the region set's planes are, as its class surfaces do.
330
+ this.cells3d.setPlacement(this.planePlacement(dataset), this.zScale());
165
331
  const meta = dataset.volume;
166
332
  if (!meta || !this.isVolumeStack(meta)) {
167
- this.regionMeshes.clearFrame();
333
+ const planes = this.planePlacement(dataset);
334
+ if (planes) {
335
+ this.regionMeshes.setFrame({
336
+ size: [1, 1, planes.z.length],
337
+ world: [1, 1, 1],
338
+ zScale: this.zScale(),
339
+ planes,
340
+ });
341
+ }
342
+ else {
343
+ this.regionMeshes.clearFrame();
344
+ }
168
345
  return;
169
346
  }
170
347
  const [vx, vy, vz] = meta.voxelSize;
171
348
  this.regionMeshes.setFrame({
172
349
  size: [meta.width, meta.height, meta.depth],
173
350
  world: [meta.width * vx, meta.height * vy, meta.depth * vz * this.zScale()],
351
+ zScale: this.zScale(),
174
352
  });
175
353
  }
176
354
  /**
@@ -179,8 +357,34 @@ export class Spatial3dScene extends SpatialSceneBase {
179
357
  * share its cached surface). Null while there is no volume stack to place them in.
180
358
  */
181
359
  voxelStep() {
182
- const meta = this.session.latest?.[0]?.volume;
183
- return this.volume && meta && this.isVolumeStack(meta) ? 1 : null;
360
+ const dataset = this.session.latest?.[0];
361
+ const meta = dataset?.volume;
362
+ if (this.volume && meta && this.isVolumeStack(meta))
363
+ return 1;
364
+ // A region set's planes over the dataset's image: cells a few microns across, so a step that
365
+ // keeps every cell several voxels wide while a class's mask over the tissue stays small.
366
+ if (dataset && this.planePlacement(dataset)) {
367
+ const width = this.info?.trueImageSize?.[0] ?? 0;
368
+ return Math.max(1, width / REGION_PLANES_VOXELS);
369
+ }
370
+ return null;
371
+ }
372
+ /**
373
+ * Where the region set's slices go (see placeRegionMeshes): only with their planes known, on the
374
+ * dataset's own image (one with an `imageRef`, not the reference volume's stack), once the box
375
+ * the cloud is offset into is there.
376
+ */
377
+ planePlacement(dataset) {
378
+ const z = this.regionPlanes;
379
+ const ref = dataset.imageRef;
380
+ if (!z?.length || !ref || !this.info || !this.box)
381
+ return null;
382
+ const [sx, sy] = ref.scale ?? [1, 1];
383
+ const [tx, ty] = ref.translate ?? [0, 0];
384
+ if (!sx || !sy)
385
+ return null;
386
+ const [ox, oy, oz] = this.origin;
387
+ return { z, scale: [1 / sx, 1 / sy], offset: [ox - tx / sx, oy - ty / sy, oz] };
184
388
  }
185
389
  /** Whether the plotted image is the reference volume's stack: its size and slice count. */
186
390
  isVolumeStack(meta) {
@@ -197,9 +401,29 @@ export class Spatial3dScene extends SpatialSceneBase {
197
401
  this.ctx.viewer.requestRender();
198
402
  });
199
403
  this.ctx.tools.install3dInteraction(this.ctx.viewer, this.ctx.host);
404
+ // Zoomed close, the whole section stays drawn (napari-js's far plane follows the distance).
405
+ this.restoreDepth = keepSceneInDepth(this.ctx.viewer.camera3d, () => this.box ? boxRadius(this.box.width, this.box.height, this.box.depth * this.zScale()) : null);
200
406
  this.hover.install(this.ctx.host);
407
+ this.listenToRegionMeshes();
201
408
  this.subscribeSpatial();
202
409
  }
410
+ /**
411
+ * Picking the region surfaces (a cell type's, by type), as the Volume view does: with the selection
412
+ * tool armed, a click on one picks its class (null beside them), and the Region Editor highlights
413
+ * it, the others fading. Hovering is the spatial tooltip's (the type and its cells).
414
+ */
415
+ listenToRegionMeshes() {
416
+ const { ctx } = this;
417
+ if (this.meshPointer)
418
+ return;
419
+ this.toolSub = ctx.store.getActiveTool$().subscribe((tool) => (this.selecting = tool === 'select'));
420
+ this.meshPointer = ctx.outsideZone(() => new RegionMeshPointer(ctx.canvas, ctx.host, {
421
+ pickAt: (x, y) => this.regionMeshes.pickAt(x, y),
422
+ active: () => this.selecting && this.regionMeshes.shown.length > 0,
423
+ hoverable: () => false,
424
+ onPick: (key, additive) => ctx.inZone(() => ctx.regionMeshPicked(key, additive)),
425
+ }));
426
+ }
203
427
  /** The observations' own z is on screen: there is no plane to step. */
204
428
  setZ() {
205
429
  /* nothing to step */
@@ -233,6 +457,7 @@ export class Spatial3dScene extends SpatialSceneBase {
233
457
  const s = this.zScale();
234
458
  if (this.points)
235
459
  this.points.scale3d = [1, 1, s];
460
+ this.transcripts3d.setZScale(s);
236
461
  for (const layer of [this.volume, this.geneMapLayer, ...this.densityLayers]) {
237
462
  const base = layer && this.baseVoxels.get(layer);
238
463
  if (layer && base)
@@ -293,8 +518,56 @@ export class Spatial3dScene extends SpatialSceneBase {
293
518
  }
294
519
  return out;
295
520
  }
521
+ /** The region surface (a class) under a client position, or null. */
522
+ pickRegion(clientX, clientY) {
523
+ const rect = this.ctx.canvas.getBoundingClientRect();
524
+ const mesh = this.regionMeshes.pickAt(clientX - rect.left, clientY - rect.top);
525
+ return mesh ? { key: mesh.key, ...(mesh.label ? { label: mesh.label } : {}) } : null;
526
+ }
527
+ /**
528
+ * With a selection, grey out the class surfaces none of it is in (a class is a category of the
529
+ * cell-type column: a 3D segmentation's cell type), as the observations it leaves out are muted.
530
+ */
531
+ async muteRegions(dataset, view, selection) {
532
+ const request = ++this.muteRequest;
533
+ if (!selection.count || !this.cellLookup) {
534
+ this.regionMeshes.setMuted([]);
535
+ return;
536
+ }
537
+ const name = cellTypeColumnFor(dataset, view);
538
+ const col = name ? await this.cellLookup.codes(name).catch(() => null) : null;
539
+ if (request !== this.muteRequest)
540
+ return;
541
+ if (!col || col.meta.kind !== 'categorical') {
542
+ this.regionMeshes.setMuted([]);
543
+ return;
544
+ }
545
+ const selected = new Set();
546
+ for (let i = 0; i < selection.mask.length; i++)
547
+ if (selection.mask[i])
548
+ selected.add(col.codes[i]);
549
+ const categories = col.meta.categories;
550
+ const keys = this.regionMeshes.shown.map((m) => m.key);
551
+ this.regionMeshes.setMuted(keys.filter((k) => {
552
+ const code = categories.indexOf(k);
553
+ return code >= 0 && !selected.has(code);
554
+ }));
555
+ }
556
+ /** The observation of the individual cell drawn under a client position, or -1. */
557
+ pickCell(clientX, clientY) {
558
+ const rect = this.ctx.canvas.getBoundingClientRect();
559
+ return this.cells3d.pick(clientX - rect.left, clientY - rect.top);
560
+ }
296
561
  dispose() {
562
+ this.restoreDepth?.();
563
+ this.restoreDepth = null;
564
+ this.meshPointer?.destroy();
565
+ this.meshPointer = null;
566
+ this.toolSub?.unsubscribe();
567
+ this.toolSub = null;
568
+ this.cells3d.dispose();
297
569
  this.regionMeshes.clear();
570
+ this.transcripts3d.dispose();
298
571
  this.disposeSpatial();
299
572
  this.invertSub?.unsubscribe();
300
573
  this.invertSub = null;
@@ -317,10 +590,14 @@ export class Spatial3dScene extends SpatialSceneBase {
317
590
  * per-point `sizes`, so a selected marker, drawn larger, is as large to the pointer.
318
591
  */
319
592
  pickObservation(clientX, clientY, slackPx) {
593
+ const rect = this.ctx.canvas.getBoundingClientRect();
594
+ // A cell drawn by itself is what is under the pointer before any marker inside it.
595
+ const cell = this.cells3d.pick(clientX - rect.left, clientY - rect.top);
596
+ if (cell >= 0)
597
+ return cell;
320
598
  const picker = this.picker;
321
599
  if (!picker)
322
600
  return -1;
323
- const rect = this.ctx.canvas.getBoundingClientRect();
324
601
  const k = picker.pick(clientX - rect.left, clientY - rect.top, slackPx);
325
602
  if (k < 0)
326
603
  return -1;
@@ -440,6 +717,10 @@ export class Spatial3dScene extends SpatialSceneBase {
440
717
  this.volume.opacity = view.volumeOpacity;
441
718
  }
442
719
  this.drawCloud(viewer, dataset, view, selection, enc, geneShown);
720
+ void this.styleCells(dataset, view, selection);
721
+ void this.muteRegions(dataset, view, selection);
722
+ // The transcripts last: they sit in the box the cloud fixed, and their first read can take a while.
723
+ await this.transcripts3d.sync(dataset, view, this.session.port, { origin: this.origin, zScale: this.zScale() }, selection);
443
724
  }
444
725
  /**
445
726
  * Draw the point cloud: a new layer for new geometry (a dataset or a section), the colour
@@ -505,10 +786,21 @@ export class Spatial3dScene extends SpatialSceneBase {
505
786
  this.applySelection(cloud, selection, shown, obs.count);
506
787
  }
507
788
  // Last, so it also covers a layer this pass just created.
508
- if (this.points)
509
- this.points.visible = view.showPoints;
789
+ this.showPointsAsAsked(dataset, view);
510
790
  viewer.requestRender();
511
791
  }
792
+ /**
793
+ * The markers shown as the view asks, but not while the cells (a 3D segmentation's) stand in for
794
+ * them: the observations are shown as their markers or as their cells. Only once the set is placed
795
+ * here (its planes known): a set that could not be opened, has no planes or was not attached draws
796
+ * no cells, and the markers stay.
797
+ */
798
+ showPointsAsAsked(dataset, view) {
799
+ if (!this.points)
800
+ return;
801
+ const cells = !!this.regionPlanes && !!datasetRegionSet(dataset) && view.showCells !== false;
802
+ this.points.visible = view.showPoints && !cells;
803
+ }
512
804
  /** Interleaved x,y,z of the `shown` observations (null: all of them), offset by {@link origin}. */
513
805
  cloudPositions(obs, shown) {
514
806
  // rebuild() draws only a dataset whose observations have a z.
@@ -730,7 +1022,13 @@ export class Spatial3dScene extends SpatialSceneBase {
730
1022
  // holding the same number of cells would otherwise look like the same key and
731
1023
  // leave the previous ROI's fields on screen.
732
1024
  const key = on
733
- ? [dataset.id, column ?? 'all', smoothing, this.session.selectionRev(selection)].join('|')
1025
+ ? [
1026
+ dataset.id,
1027
+ column ?? 'all',
1028
+ smoothing,
1029
+ this.session.selectionRev(selection),
1030
+ groupColorsKey(column, view.groupColors),
1031
+ ].join('|')
734
1032
  : null;
735
1033
  if (key === this.densityKey)
736
1034
  return;
@@ -747,7 +1045,7 @@ export class Spatial3dScene extends SpatialSceneBase {
747
1045
  return;
748
1046
  let groups;
749
1047
  try {
750
- groups = await this.densityGroups(dataset, column, selection);
1048
+ groups = await this.densityGroups(dataset, column, selection, view);
751
1049
  }
752
1050
  catch (err) {
753
1051
  console.warn('[napari-js] density volumes: column unavailable', err);
@@ -806,7 +1104,7 @@ export class Spatial3dScene extends SpatialSceneBase {
806
1104
  * which is a real question on its own ("where is the tissue dense?") and the honest thing to
807
1105
  * show when the view is not encoding a taxonomy.
808
1106
  */
809
- async densityGroups(dataset, column, selection) {
1107
+ async densityGroups(dataset, column, selection, view) {
810
1108
  const port = this.session.port;
811
1109
  const meta = column ? findColumnMeta(dataset, column) : undefined;
812
1110
  if (!port || !column || !meta || meta.kind !== 'categorical')
@@ -814,7 +1112,7 @@ export class Spatial3dScene extends SpatialSceneBase {
814
1112
  const loaded = await port.getColumn(column);
815
1113
  if (!isCategoricalColumn(loaded))
816
1114
  return [];
817
- return rankDensityGroups(column, loaded, dataset.observations.count, selection);
1115
+ return rankDensityGroups(column, loaded, dataset.observations.count, selection, view.groupColors);
818
1116
  }
819
1117
  /**
820
1118
  * Add (or keep) the dataset's reference volume. The offset that sits the observations inside
@@ -829,6 +1127,10 @@ export class Spatial3dScene extends SpatialSceneBase {
829
1127
  const key = meta ? `${dataset.id}:${meta.width}x${meta.height}x${meta.depth}` : null;
830
1128
  if (key && key === this.volumeKey)
831
1129
  return;
1130
+ // Already on its way for an earlier rebuild: wait for that one, add none of our own.
1131
+ if (key && this.volumeLoading?.key === key)
1132
+ return this.volumeLoading.done;
1133
+ this.volumeLoading = null;
832
1134
  if (this.volume) {
833
1135
  viewer.layers.remove(this.volume);
834
1136
  this.volume = null;
@@ -836,17 +1138,30 @@ export class Spatial3dScene extends SpatialSceneBase {
836
1138
  }
837
1139
  // The surfaces sat in the volume just removed (or there was none): down until one is placed.
838
1140
  this.regionMeshes.clearFrame();
839
- if (!meta || !port?.getVolume)
1141
+ if (!meta || !port?.getVolume || !key)
840
1142
  return;
1143
+ const loading = { key, done: this.loadVolume(viewer, dataset, view, key) };
1144
+ this.volumeLoading = loading;
1145
+ try {
1146
+ await loading.done;
1147
+ }
1148
+ finally {
1149
+ if (this.volumeLoading === loading)
1150
+ this.volumeLoading = null;
1151
+ }
1152
+ }
1153
+ /** Fetch the reference volume and add it, unless another one was asked for meanwhile. */
1154
+ async loadVolume(viewer, dataset, view, key) {
1155
+ const meta = dataset.volume;
841
1156
  let voxels;
842
1157
  try {
843
- voxels = await port.getVolume();
1158
+ voxels = await this.session.port.getVolume();
844
1159
  }
845
1160
  catch (err) {
846
1161
  console.warn('[napari-js] reference volume unavailable — drawing the cloud alone', err);
847
1162
  return;
848
1163
  }
849
- if (this.ctx.signal.aborted)
1164
+ if (this.ctx.signal.aborted || this.volumeLoading?.key !== key)
850
1165
  return;
851
1166
  const [vx, vy, vz] = meta.voxelSize;
852
1167
  this.volumeKey = key;
@@ -941,6 +1256,7 @@ export class Spatial3dScene extends SpatialSceneBase {
941
1256
  /** Drop every layer of the cloud (the dataset went away, or has no z). */
942
1257
  removeLayers(viewer) {
943
1258
  this.regionMeshes.clearFrame();
1259
+ this.transcripts3d.remove();
944
1260
  for (const layer of [this.points, this.volume, this.geneMapLayer, ...this.densityLayers]) {
945
1261
  if (layer)
946
1262
  viewer.layers.remove(layer);
@@ -988,12 +1304,16 @@ export class Spatial3dScene extends SpatialSceneBase {
988
1304
  if (byGene)
989
1305
  return encodeSpatial3dCategorical(byGene.codes, byGene.colors);
990
1306
  const colorBy = view.colorBy;
1307
+ // One colour, the cells' too ("Single colour").
1308
+ if (!colorBy && view.cellColorMode === 'single') {
1309
+ return encodeSpatial3dCategorical(new Uint16Array(count), [view.cellSingleColor]);
1310
+ }
991
1311
  if (!port || !colorBy)
992
1312
  return null;
993
1313
  if (colorBy.kind === 'column') {
994
1314
  const column = await port.getColumn(colorBy.name);
995
1315
  if (isCategoricalColumn(column)) {
996
- return encodeSpatial3dCategorical(column.codes, resolveCategoryColors(column.meta));
1316
+ return encodeSpatial3dCategorical(column.codes, categoryColorsFor(colorBy.name, column.meta, view.groupColors));
997
1317
  }
998
1318
  return this.encodeContinuous(column.values, view);
999
1319
  }
@@ -1029,7 +1349,12 @@ function cloudSubset(dataset, view, geneShown = null) {
1029
1349
  const clip = view.percentileClip ?? [0.01, 0.99];
1030
1350
  const scalarKey = [
1031
1351
  key,
1032
- view.colorBy ? `${view.colorBy.kind}:${view.colorBy.name}` : 'flat',
1352
+ view.colorBy
1353
+ ? `${view.colorBy.kind}:${view.colorBy.name}`
1354
+ : view.cellColorMode === 'single'
1355
+ ? `single:${view.cellSingleColor}`
1356
+ : 'flat',
1357
+ groupColorsKey(view.colorBy?.kind === 'column' ? view.colorBy.name : null, view.groupColors),
1033
1358
  observationGeneStyleKey(view),
1034
1359
  view.logScale ? 'log' : 'lin',
1035
1360
  clip.join(','),
@@ -1052,4 +1377,4 @@ function keepShown(indices, shown, count) {
1052
1377
  }
1053
1378
  return out.subarray(0, n);
1054
1379
  }
1055
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRSxPQUFPLEVBSUwsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlGLE9BQU8sRUFBd0IsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25GLE9BQU8sRUFDTCxhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQix1QkFBdUIsR0FDeEIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFF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Q0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQVMsU0FBUyxDQUFDLE9BQTJCLEVBQUUsS0FBaUIsRUFBRSxLQUFhO0lBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTztZQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEQsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9pbnRQaWNrZXIsIGNvbG9ybWFwRnJvbUx1dCB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvaW50czNETGF5ZXIsIFZpZXdlciwgVm9sdW1lTGF5ZXIgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHsgU2NhbGVCYXJPdmVybGF5LCBmb3JtYXRMZW5ndGggfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuaW1wb3J0IHR5cGUgeyBBeGlzTGFiZWxTcGVjIH0gZnJvbSAnbmFwYXJpLWpzL292ZXJsYXlzJztcblxuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIGZpbmRDb2x1bW5NZXRhLFxuICBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX01VVEVEX09QQUNJVFksIHJlc29sdmVDYXRlZ29yeUNvbG9ycyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uTWFzaywgZW1wdHlTZWxlY3Rpb24sIG1hc2tUb0luZGljZXMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGRlZmF1bHRTaWdtYSwgZGVuc2l0eUdyaWQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eSc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNlY3Rpb24sIHNlY3Rpb25zT2YgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHtcbiAgZ2VuZUZpbHRlcktleSxcbiAgb2JzZXJ2YXRpb25HZW5lTWFzayxcbiAgb2JzZXJ2YXRpb25HZW5lU3R5bGUsXG4gIG9ic2VydmF0aW9uR2VuZVN0eWxlS2V5LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZ2VuZS1maWx0ZXInO1xuaW1wb3J0IHtcbiAgRXhwcmVzc2lvblZvbHVtZUZpZWxkLFxuICBlbmNvZGVFeHByZXNzaW9uVm9sdW1lLFxuICBmaWVsZENvbnRyYXN0V2luZG93LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBjb21wdXRlRXhwcmVzc2lvblZvbHVtZUFzeW5jLCByYXN0ZXJpemVEZW5zaXR5QXN5bmMgfSBmcm9tICcuLi8uLi93b3JrZXJzL3NwYXRpYWwtbWF0aCc7XG5pbXBvcnQgeyBTdXBlcnNlZGUgfSBmcm9tICcuLi8uLi91dGlsL3N1cGVyc2VkZSc7XG5pbXBvcnQgdHlwZSB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uTWVzaDNELCBWb2x1bWVSZWdpb25NZXNoZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5pbXBvcnQgeyBpc0Fib3J0RXJyb3IgfSBmcm9tICcuLi90aWxlLXNlcnZlcic7XG5pbXBvcnQge1xuICBEZW5zaXR5R3JvdXAsXG4gIEdFTkVfTUFQX1NJR01BLFxuICBHRU5FX01BUF9WT0xVTUVfU1RSSURFLFxuICBTUEFUSUFMXzNEX0JBU0VfU0laRSxcbiAgU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICBTcGF0aWFsM2RFbmNvZGluZyxcbiAgU3BhdGlhbDNkU2NhbGFycyxcbiAgZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwsXG4gIGVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMsXG4gIGdhdGhlckNvbG9ycyxcbiAgcmFua0RlbnNpdHlHcm91cHMsXG4gIHNwYXRpYWxGbGF0Q29sb3JtYXAsXG4gIHRvdGFsRGVuc2l0eUdyb3VwLFxufSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IEhPVkVSX1JBRElVU19QWCB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgQXhlczNkR2l6bW8sIEJveDMsIHN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi9uYXBhcmktYXhlcy1naXptbyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7IFNwYXRpYWxTY2VuZUJhc2UsIFNwYXRpYWxTZXNzaW9uIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC1zY2VuZSc7XG5pbXBvcnQgdHlwZSB7IE5hcGFyaVNjZW5lLCBTY2VuZUNvbnRleHQgfSBmcm9tICcuL25hcGFyaS1zY2VuZSc7XG5cbi8qKiBUaGUgbGVhc3QgWiBzdHJldGNoOiBhIHRlbnRoIG9mIHRoZSB0cnVlIGRlcHRoLiAqL1xuZXhwb3J0IGNvbnN0IFNQQVRJQUxfWl9TQ0FMRV9NSU4gPSAwLjE7XG4vKiogVGhlIG1vc3QgWiBzdHJldGNoIGEgY2xvdWQgYWxsb3dzLCBhdCBsZWFzdDogdGhlIFZvbHVtZSB2aWV3J3MuICovXG5jb25zdCBTUEFUSUFMX1pfU0NBTEVfTUFYID0gMTA7XG4vKiogTm9yIG1vcmUgdGhhbiB0aGlzLCBob3dldmVyIHRoaW4gdGhlIGNsb3VkIGlzLiAqL1xuY29uc3QgU1BBVElBTF9aX1NDQUxFX0NFSUxJTkcgPSAxMDAwO1xuXG4vKipcbiAqIFRoZSBtb3N0IGEgYm94J3MgWiBtYXkgYmUgc3RyZXRjaGVkOiB1bnRpbCBpdCBpcyB0d2ljZSBhcyBkZWVwIGFzIGl0IGlzIHdpZGUsIHNvIGV2ZW4gYSBzZWN0aW9uXG4gKiBtaWNyb25zIHRoaWNrIGFuZCBtaWxsaW1ldHJlcyB3aWRlIGNhbiBiZSBzdG9vZCB1cCBpbnRvIGEgYmxvY2sg4oCUIGJ1dCBuZXZlciBsZXNzIHRoYW4gdGhlXG4gKiBWb2x1bWUgdmlldydzIDEweCwgbm9yIG1vcmUgdGhhbiB7QGxpbmsgU1BBVElBTF9aX1NDQUxFX0NFSUxJTkd9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbFpTY2FsZU1heChib3g6IEJveDMpOiBudW1iZXIge1xuICBjb25zdCBmbGF0ID0gKDIgKiBNYXRoLm1heChib3gud2lkdGgsIGJveC5oZWlnaHQpKSAvIE1hdGgubWF4KGJveC5kZXB0aCwgMWUtOSk7XG4gIHJldHVybiBNYXRoLm1pbihTUEFUSUFMX1pfU0NBTEVfQ0VJTElORywgTWF0aC5tYXgoU1BBVElBTF9aX1NDQUxFX01BWCwgZmxhdCkpO1xufVxuXG4vKipcbiAqIFRoZSBaIGhhbmRsZSdzIGRyYWcgKHB4KSBwZXIgZG91Ymxpbmc6IHRoZSBWb2x1bWUgdmlldydzIDE4MCBweCwgbGVzcyB3aGVuIHRoZSByYW5nZSBpcyB3aWRlcixcbiAqIHNvIGdvaW5nIGZyb20gdGhlIHRydWUgZGVwdGggdG8gdGhlIG1vc3Qgc3RyZXRjaCBpcyBhYm91dCB0aGUgc2FtZSBkcmFnICh+NTQwIHB4KSBlaXRoZXIgd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbFpQaXhlbHNQZXJEb3VibGUobWF4U2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heCg2MCwgTWF0aC5taW4oMTgwLCA1NDAgLyBNYXRoLmxvZzIoTWF0aC5tYXgoMiwgbWF4U2NhbGUpKSkpO1xufVxuXG4vKipcbiAqIFRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbHMgZm9yIGEgYm94IChhcyBkcmF3bjogWiBzdHJldGNoZWQgYnkgYHpTY2FsZWApLCBpdHMgdHJ1ZSBsZW5ndGhzIGluIMK1bVxuICogd2hlbiB0aGUgZGF0YXNldCBkZWNsYXJlcyBgbWljcm9uc1BlclVuaXRgLCBlbHNlIGluIGl0cyBvd24gdW5pdHMuIEEgc3RyZXRjaGVkIFogc2F5cyBieSBob3cgbXVjaCxcbiAqIHNvIGl0cyBsZW5ndGggaXMgbmV2ZXIgcmVhZCBvZmYgdGhlIGRyYXdpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsQXhlc0xhYmVscyhkcmF3bjogQm94MywgelNjYWxlOiBudW1iZXIsIG1pY3JvbnNQZXJVbml0PzogbnVtYmVyKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgY29uc3QgaHggPSBkcmF3bi53aWR0aCAvIDI7XG4gIGNvbnN0IGh5ID0gZHJhd24uaGVpZ2h0IC8gMjtcbiAgY29uc3QgaHogPSBkcmF3bi5kZXB0aCAvIDI7XG4gIGNvbnN0IG1wdSA9IG1pY3JvbnNQZXJVbml0ICYmIG1pY3JvbnNQZXJVbml0ID4gMCA/IG1pY3JvbnNQZXJVbml0IDogMDtcbiAgY29uc3QgbGVuID0gKG46IG51bWJlcik6IHN0cmluZyA9PiAobXB1ID8gZm9ybWF0TGVuZ3RoKG4gKiBtcHUsICfCtW0nKSA6IGAkeytuLnRvUHJlY2lzaW9uKDMpfSB1bml0c2ApO1xuICBjb25zdCBzdHJldGNoID0gTWF0aC5hYnMoelNjYWxlIC0gMSkgPiAxZS0zID8gYCAow5ckeyt6U2NhbGUudG9QcmVjaXNpb24oMyl9KWAgOiAnJztcbiAgcmV0dXJuIFtcbiAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRyYXduLndpZHRoKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihkcmF3bi5oZWlnaHQpfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6IGBaIMK3ICR7bGVuKGRyYXduLmRlcHRoIC8gelNjYWxlKX0ke3N0cmV0Y2h9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICBdO1xufVxuXG4vKipcbiAqIFNQQVRJQUxfT01JQ1NfM0QgKHJldmlldyBBcHBlbmRpeCBCLCBjbHVzdGVyIEspOiBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCB1bmRlciB0aGVcbiAqIG9yYml0IGNhbWVyYSwgd2l0aCB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUgYXJvdW5kIGl0LCBwZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgYW5kIHRoZVxuICogM0QgZ2VuZSBtYXAuXG4gKlxuICogRXZlcnl0aGluZyBzaXRzIGluIG9uZSBib3ggY2VudHJlZCBvbiB0aGUgd29ybGQgb3JpZ2luIChzZWUge0BsaW5rIGVuc3VyZUZyYW1lfSk6IHRoZSByZWZlcmVuY2VcbiAqIHZvbHVtZSdzLCBlbHNlIHRoZSBkZW5zaXR5IGdyaWQncy4gVGhlIFZvbHVtZSB2aWV3J3MgYXhlcyBnaXptbyBhbmQgWi1oZWlnaHQgaGFuZGxlIGFyZSBkcmF3biBvblxuICogaXQsIGFuZCB0aGUgaGFuZGxlIHN0cmV0Y2hlcyBaOiB0aGUgY2xvdWQgdGhyb3VnaCBpdHMgYHNjYWxlM2RgLCBldmVyeSB2b2x1bWUgdGhyb3VnaCBpdHMgdm94ZWxcbiAqIHNpemUsIHNvIG5vdGhpbmcgaXMgcmUtdXBsb2FkZWQgd2hpbGUgZHJhZ2dpbmcgKHNlZSB7QGxpbmsgc2V0WlNjYWxlfSkuXG4gKlxuICogVGhpbm5lciB0aGFuIHRoZSAyRCBzY2VuZTogdGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkIHZvbHVtZSBsaWtlIHRoZVxuICogQWxsZW4gQ0NGIGhhcyBubyBzaW5nbGUgcmVmZXJlbmNlIHBsYW5lKSwgc28gbm8gcmVhZGJhY2sgYW5kIG5vIG5hdmlnYXRvcjsgdGhlIDNEIHNjYWxlIGJhclxuICogZm9sbG93cyB0aGUgZGF0YXNldCAoc2VlIHtAbGluayBpbnN0YWxsU2NhbGVCYXJ9KS4gVGhlIHJlZ2lvbiB0b29scyB3b3JrIGluIFNDUkVFTiBzcGFjZSB0aHJvdWdoXG4gKiB0aGUgdG9vbCBicmlkZ2UncyAzRCBpbnRlcmFjdGlvbiDigJQgYSBsYXNzbyBzZWxlY3RzIHRoZSBjZWxscyB1bmRlciBpdCwgYW5kIGFuIG9yYml0IGNsZWFycyB0aGVcbiAqIHNoYXBlIHdoaWxlIGtlZXBpbmcgdGhlIHNlbGVjdGlvbi4gVGhlIGZpcnN0IDNEIGxheWVyIGFkZGVkIGZyYW1lcyB0aGUgY2FtZXJhIChgZml0M2Q6ICdvbmNlJ2ApLlxuICovXG5leHBvcnQgY2xhc3MgU3BhdGlhbDNkU2NlbmUgZXh0ZW5kcyBTcGF0aWFsU2NlbmVCYXNlIGltcGxlbWVudHMgTmFwYXJpU2NlbmUge1xuICAvKiogVGhlIDNEIHBvaW50IGNsb3VkLiBPbmUgbGF5ZXI6IHNlbGVjdGlvbiBpcyBhIHBlci1wb2ludCBhbHBoYSBvbiBpdCwgbm90IGEgc2Vjb25kLiAqL1xuICBwcml2YXRlIHBvaW50czogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEludGVybGVhdmVkIHgseSx6LCBjYWNoZWQgc28gYSBjb2xvdXIgY2hhbmdlIGRvZXMgbm90IHJlLXdhbGsgMy43TSBvYnNlcnZhdGlvbnMuICovXG4gIHByaXZhdGUgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzY2FsYXJzIGN1cnJlbnRseSB1cGxvYWRlZCDigJQgc2VlIHtAbGluayByZWJ1aWxkfS4gKi9cbiAgcHJpdmF0ZSBzY2FsYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyOyBudWxsIHdoZW4gZXZlcnlcbiAgICogIG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZSBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTlxuICAgKiAgb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0byB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXNcbiAgICogIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIGRyYXduOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGFuYXRvbWljYWwgdm9sdW1lIHRoZSBjbG91ZCBzaXRzIGluc2lkZSwgd2hlbiB0aGUgZGF0YXNldCBoYXMgb25lLiAqL1xuICBwcml2YXRlIHZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBnZW5lIG1hcCdzIHZvbHVtZSBsYXllciBhbmQgdGhlIGlucHV0cyBpdCB3YXMgY29sb3VyZWQgZm9yIChpdHMgZmllbGQgaXMgY2FjaGVkIGluXG4gICAqICB0aGUgc2Vzc2lvbiwgb24gYSBjbG9jayBvZiBpdHMgb3duKS4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIG9yaWdpbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKiogVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGJlZm9yZSB0aGUgWiBzdHJldGNoLCBjZW50cmVkIG9uIHRoZSBvcmlnaW4gKHNlZSBlbnN1cmVGcmFtZSkuICovXG4gIHByaXZhdGUgYm94OiBCb3gzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm94S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBheGVzIGdpem1vIG9uIHtAbGluayBib3h9IGFuZCB0aGUgaGFuZGxlIHRoYXQgc3RyZXRjaGVzIGl0cyBaIChzZWUgc2V0WlNjYWxlKS4gKi9cbiAgcHJpdmF0ZSBnaXptbzogQXhlczNkR2l6bW8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB6SGFuZGxlOiBOYXBhcmlWb2x1bWVaSGFuZGxlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBFYWNoIHZvbHVtZSBsYXllcidzIG93biB2b3hlbCBzaXplLCBiZWZvcmUgdGhlIFogc3RyZXRjaC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVm94ZWxzID0gbmV3IFdlYWtNYXA8Vm9sdW1lTGF5ZXIsIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXT4oKTtcbiAgLyoqXG4gICAqIG5hcGFyaS1qcydzIGRlcHRoLWF3YXJlIHBpY2sgb3ZlciB0aGUgY2xvdWQsIGFuZCB0aGUgcHJvamVjdGlvbiB0aGUgUk9JIHNlbGVjdGlvbiByZWFkcy4gSXRcbiAgICogb3ducyB0aGUgY2FjaGluZyBwb2xpY3k6IHJlLXByb2plY3QgbGF6aWx5LCBvbiB0aGUgZmlyc3QgcGljayBhZnRlciB0aGUgY2FtZXJhLCB0aGUgY2FudmFzIG9yXG4gICAqIHRoZSBjbG91ZCdzIGRhdGEgbW92ZWQgKG5ldmVyIG9uIHRoZSBjYW1lcmEgZXZlbnQsIHNvIGFuIG9yYml0IGRyYWcgcGF5cyBub3RoaW5nKSwgaW50b1xuICAgKiByZXVzZWQgYnVmZmVycywgd2l0aCBhIHNjcmVlbiBpbmRleCBvbmNlIHRoZSBjbG91ZCBpcyBsYXJnZSBlbm91Z2guXG4gICAqL1xuICBwcml2YXRlIHBpY2tlcjogUG9pbnRQaWNrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogU2NhbGVCYXJPdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEYXRhc2V0IHRoZSBzY2FsZSBiYXIgd2FzIGJ1aWx0IGZvci4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZGVuc2l0eSByYXN0ZXJpc2F0aW9uIGFuZCB0aGUgM0QgZ2VuZS1tYXAgZXN0aW1hdGUgaW4gZmxpZ2h0IChvZmYgdGhlIG1haW4gdGhyZWFkXG4gICAqICBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkLCBTUEFUSUFMLTE5KTogYSBuZXcga2V5IHN1cGVyc2VkZXMg4oCUIGFuZCBhYm9ydHMg4oCUIHRoZSBwcmV2aW91c1xuICAgKiAgb25lOyBhIHJlYnVpbGQgdGhhdCBsZWF2ZXMgdGhlIGtleSBhbG9uZSBsZXRzIGl0IGZpbmlzaC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZW5zaXR5TG9hZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZU1hcExvYWRzID0gbmV3IFN1cGVyc2VkZSgpO1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgKGFuIGF0bGFzJ3Mgc3RydWN0dXJlcywgaW1wb3J0ZWQgb250byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGltYWdlXG4gICAqIHN0YWNrKSwgZHJhd24gYnkgdGhlIHNhbWUge0BsaW5rIFZvbHVtZVJlZ2lvbk1lc2hlc30gYXMgdGhlIFZvbHVtZSB2aWV3J3MsIHNvIGEgc3RydWN0dXJlIGlzIHRoZVxuICAgKiBzYW1lIHN1cmZhY2UgaW4gYm90aC4gUGxhY2VkIGluIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgYm94LCBvbmNlIGl0IGlzIHRoZXJlIGFuZCB0aGUgaW1hZ2UgdGhlXG4gICAqIHJlZ2lvbnMgd2VyZSBkcmF3biBvbiBpcyB0aGF0IHZvbHVtZSdzIHN0YWNrIChzZWUge0BsaW5rIHBsYWNlUmVnaW9uTWVzaGVzfSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbk1lc2hlczogVm9sdW1lUmVnaW9uTWVzaGVzO1xuICAvKiogV2hldGhlciB0aGUgcmVmZXJlbmNlIHZvbHVtZSBsZXRzIGV2ZXJ5IHJlZ2lvbiBzdXJmYWNlIHRocm91Z2ggKHNlZSBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSkuICovXG4gIHByaXZhdGUgcmVnaW9uc1Rocm91Z2ggPSBmYWxzZTtcbiAgLyoqIFRoZSBzdG9yZSdzIGludmVydCBzZXR0aW5nLCB3aGljaCB0aGUgZGVuc2l0eSB2b2x1bWVzIGZvbGxvdyAobm8gb3RoZXIgc3Vic2NyaXB0aW9uIG9mXG4gICAqICB0aGlzIHNjZW5lIGNhcnJpZXMgaXQpLiAqL1xuICBwcml2YXRlIGludmVydFN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbmZvIHRoZSBpbWFnZSBwbG90dGVkIHdpdGggdGhlIGNsb3VkOiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIHN0YWNrICh0aGUgMkQgdmlldydzXG4gICAqICAgICAgICBpbWFnZSwgc2VlIHNob3dWb2x1bWVBc0ltYWdlKSB3aGVuIHRoZSBkYXRhc2V0IGhhcyBhIHZvbHVtZSwgd2hpY2ggdGhlIHJlZ2lvbnMgYXJlIG9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBzZXNzaW9uOiBTcGF0aWFsU2Vzc2lvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluZm8/OiBJSW1hZ2VJbmZvLFxuICApIHtcbiAgICBzdXBlcihjdHgsIHNlc3Npb24sIHRydWUpO1xuICAgIHRoaXMucmVnaW9uTWVzaGVzID0gbmV3IFZvbHVtZVJlZ2lvbk1lc2hlcyhjdHgudmlld2VyKTtcbiAgfVxuXG4gIC8qKiBTaG93IHRoZXNlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgd2l0aCB0aGUgY2xvdWQgKHJlcGxhY2luZyB0aGUgb25lcyBzaG93bikuICovXG4gIHNldFJlZ2lvbk1lc2hlcyhtZXNoZXM6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0KG1lc2hlcyk7XG4gIH1cblxuICBzZXRSZWdpb25IaWdobGlnaHQoa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRIaWdobGlnaHQoa2V5cyk7XG4gIH1cblxuICBzZXRSZWdpb25IaWRkZW4oa2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRIaWRkZW4oa2V5cyk7XG4gIH1cblxuICAvKiogQXMgdGhlIFZvbHVtZSB2aWV3OiB0aGUgcmVmZXJlbmNlIHZvbHVtZSBoaWRlcyB0aGUgc3VyZmFjZXMgYmVoaW5kIHdoYXQgaXQgc2hvd3MsIG9yIG5vbmUuICovXG4gIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKHRocm91Z2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnNUaHJvdWdoID0gdGhyb3VnaDtcbiAgICBpZiAodGhpcy52b2x1bWUpIHRoaXMudm9sdW1lLmJsZW5kaW5nID0gdGhyb3VnaCA/ICd0cmFuc2x1Y2VudF9ub19kZXB0aCcgOiAndHJhbnNsdWNlbnQnO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2UgdGhlIHJlZ2lvbiBzdXJmYWNlcyBpbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGJveCwgYXMgdGhlIFZvbHVtZSB2aWV3IHBsYWNlcyB0aGVtIGluIGl0c1xuICAgKiBvd246IGltYWdlIHBpeGVsICh4LCB5KSBpcyB2b3hlbCAoeCwgeSksIHNsaWNlIGsgaXMgdm94ZWwgcGxhbmUgaywgYW5kIHRoZSBib3ggaXMgdGhlIHZvbHVtZSdzXG4gICAqIHZveGVscyB0aW1lcyBpdHMgdm94ZWwgc2l6ZSwgY2VudHJlZCBvbiB0aGUgb3JpZ2luIGFzIG5hcGFyaSBjZW50cmVzIHRoZSB2b2x1bWUgKGFuZCB0aGUgY2xvdWRcbiAgICogaXMgb2Zmc2V0IHRvIHNpdCBpbiBpdCkuIE9ubHkgd2hlbiB0aGUgcGxvdHRlZCBpbWFnZSBJUyB0aGF0IHZvbHVtZSdzIHN0YWNrOiByZWdpb25zIGRyYXduIG9uXG4gICAqIGFub3RoZXIgaW1hZ2UgKGEgdGlzc3VlIGltYWdlKSBoYXZlIG5vIHBsYWNlIGluIGl0LCBhbmQgYXJlIG5vdCBzaG93biAtIG5vciBhcmUgc3VyZmFjZXNcbiAgICogcGxhY2VkIGluIGEgdm9sdW1lIHRoaXMgb25lIHJlcGxhY2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFjZVJlZ2lvbk1lc2hlcyhkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBpZiAoIW1ldGEgfHwgIXRoaXMuaXNWb2x1bWVTdGFjayhtZXRhKSkge1xuICAgICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZSh7XG4gICAgICBzaXplOiBbbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGhdLFxuICAgICAgd29ybGQ6IFttZXRhLndpZHRoICogdngsIG1ldGEuaGVpZ2h0ICogdnksIG1ldGEuZGVwdGggKiB2eiAqIHRoaXMuelNjYWxlKCldLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzaXQgaW46IDEsIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGJlaW5nIHRoZSBzdGFjaydzXG4gICAqIG93biB2b3hlbHMsIGFzIHRoZSBWb2x1bWUgdmlldydzIGlzIGF0IGZ1bGwgcmVzb2x1dGlvbiwgc28gYm90aCByZWNvbnN0cnVjdCBhIGNsYXNzIGFsaWtlIChhbmRcbiAgICogc2hhcmUgaXRzIGNhY2hlZCBzdXJmYWNlKS4gTnVsbCB3aGlsZSB0aGVyZSBpcyBubyB2b2x1bWUgc3RhY2sgdG8gcGxhY2UgdGhlbSBpbi5cbiAgICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdPy52b2x1bWU7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lICYmIG1ldGEgJiYgdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpID8gMSA6IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgcGxvdHRlZCBpbWFnZSBpcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIHN0YWNrOiBpdHMgc2l6ZSBhbmQgc2xpY2UgY291bnQuICovXG4gIHByaXZhdGUgaXNWb2x1bWVTdGFjayhtZXRhOiBOb25OdWxsYWJsZTxTcGF0aWFsRGF0YXNldFsndm9sdW1lJ10+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuaW5mbztcbiAgICBjb25zdCBbdywgaF0gPSBpbmZvPy50cnVlSW1hZ2VTaXplID8/IFswLCAwXTtcbiAgICByZXR1cm4gISFpbmZvPy5pc1N0YWNrICYmIHcgPT09IG1ldGEud2lkdGggJiYgaCA9PT0gbWV0YS5oZWlnaHQgJiYgKGluZm8udXJscz8ubGVuZ3RoID8/IDApID09PSBtZXRhLmRlcHRoO1xuICB9XG5cbiAgYXN5bmMgbW91bnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQmVmb3JlIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiwgc28gdGhlIGZpcnN0IGJ1aWxkIGFscmVhZHkgcmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgdGhpcy5pbnZlcnRTdWIgPSB0aGlzLmN0eC5kaXNwbGF5LndhdGNoSW52ZXJ0KChpbnZlcnQpID0+IHtcbiAgICAgIC8vIEEgbGl2ZSBzZXR0ZXI6IHRoZSB2b2x1bWVzIHJlc3R5bGUsIG5vdGhpbmcgaXMgcmFzdGVyaXNlZCBhZ2Fpbi5cbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSBsYXllci5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICAgIHRoaXMuY3R4LnRvb2xzLmluc3RhbGwzZEludGVyYWN0aW9uKHRoaXMuY3R4LnZpZXdlciwgdGhpcy5jdHguaG9zdCk7XG4gICAgdGhpcy5ob3Zlci5pbnN0YWxsKHRoaXMuY3R4Lmhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIG93biB6IGlzIG9uIHNjcmVlbjogdGhlcmUgaXMgbm8gcGxhbmUgdG8gc3RlcC4gKi9cbiAgc2V0WigpOiB2b2lkIHtcbiAgICAvKiBub3RoaW5nIHRvIHN0ZXAgKi9cbiAgfVxuXG4gIC8qKiBBIGNsb3VkIGhhcyBubyBpbnRlbnNpdHkgZGlzdHJpYnV0aW9uIGZvciB0aGUgaGlzdG9ncmFtIHBhbmUuICovXG4gIGhpc3RvZ3JhbSgpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogVGhlIHRvb2xiYXIncyAzRCBjb250cm9scywgYXMgdGhlIFZvbHVtZSB2aWV3J3M6IGRyYWcgbW9kZSwgcmUtZnJhbWluZyBhbmQgdGhlIGF4ZXMuICovXG4gIHN1cmZhY2UzZENvbnRyb2xzKCk6IElTdXJmYWNlM2RDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBzdXJmYWNlM2RDb250cm9scyh0aGlzLmN0eCwgKCkgPT4gdGhpcy5naXptbyk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZXRjaCBaIGJ5IGBmYWN0b3JgICgxID0gdGhlIGRhdGEncyB0cnVlIHByb3BvcnRpb25zKSwgYXMgdGhlIFogaGFuZGxlIGRyYWdzIGl0OiB0aGUgY2xvdWRcbiAgICogdGhyb3VnaCBpdHMgYHNjYWxlM2RgLCBlYWNoIHZvbHVtZSB0aHJvdWdoIGl0cyB2b3hlbCBzaXplLCB0aGUgYXhlcyBhbmQgdGhlIHJlZ2lvbiBzdXJmYWNlc1xuICAgKiB3aXRoIHRoZW0g4oCUIGFsbCBhYm91dCB0aGUgd29ybGQgb3JpZ2luLCB3aGljaCB0aGUgYm94IGlzIGNlbnRyZWQgb24sIHNvIHRoZXkgc3RheSBhbGlnbmVkLlxuICAgKiBOb3RoaW5nIGlzIHJlLXVwbG9hZGVkLiBLZXB0IGluIHRoZSBzZXR0aW5ncywgc28gYSByZS1wbG90IGtlZXBzIGl0LlxuICAgKi9cbiAgc2V0WlNjYWxlKGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5ib3ggPyBzcGF0aWFsWlNjYWxlTWF4KHRoaXMuYm94KSA6IFNQQVRJQUxfWl9TQ0FMRV9NQVg7XG4gICAgdGhpcy5jdHguc2V0dGluZ3Muc3BhdGlhbFpTY2FsZSA9IE1hdGgubWluKG1heCwgTWF0aC5tYXgoU1BBVElBTF9aX1NDQUxFX01JTiwgZmFjdG9yKSk7XG4gICAgdGhpcy5hcHBseVpTY2FsZSgpO1xuICB9XG5cbiAgLyoqIFRoZSBaIHN0cmV0Y2ggaW4gZWZmZWN0OiB0aGUgc2V0dGluZywgd2l0aGluIHdoYXQgdGhpcyBib3ggYWxsb3dzLiAqL1xuICB6U2NhbGUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXggPSB0aGlzLmJveCA/IHNwYXRpYWxaU2NhbGVNYXgodGhpcy5ib3gpIDogU1BBVElBTF9aX1NDQUxFX01BWDtcbiAgICBjb25zdCBzID0gdGhpcy5jdHguc2V0dGluZ3Muc3BhdGlhbFpTY2FsZTtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChTUEFUSUFMX1pfU0NBTEVfTUlOLCBzID4gMCA/IHMgOiAxKSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5WlNjYWxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHMgPSB0aGlzLnpTY2FsZSgpO1xuICAgIGlmICh0aGlzLnBvaW50cykgdGhpcy5wb2ludHMuc2NhbGUzZCA9IFsxLCAxLCBzXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFt0aGlzLnZvbHVtZSwgdGhpcy5nZW5lTWFwTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVyc10pIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBsYXllciAmJiB0aGlzLmJhc2VWb3hlbHMuZ2V0KGxheWVyKTtcbiAgICAgIGlmIChsYXllciAmJiBiYXNlKSBsYXllci52b3hlbFNpemUgPSBbYmFzZVswXSwgYmFzZVsxXSwgYmFzZVsyXSAqIHNdO1xuICAgIH1cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdO1xuICAgIGlmICh0aGlzLmdpem1vICYmIHRoaXMuYm94KSB7XG4gICAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd25Cb3godGhpcy5ib3gpO1xuICAgICAgdGhpcy5naXptby5zZXREZXB0aChkcmF3bi5kZXB0aCwgc3BhdGlhbEF4ZXNMYWJlbHMoZHJhd24sIHMsIGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0KSk7XG4gICAgfVxuICAgIHRoaXMuekhhbmRsZT8ucmVwb3NpdGlvbigpO1xuICAgIGlmIChkYXRhc2V0KSB0aGlzLnBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQpO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogYGJveGAgd2l0aCBpdHMgWiBzdHJldGNoZWQgYXMgZHJhd24uICovXG4gIHByaXZhdGUgZHJhd25Cb3goYm94OiBCb3gzKTogQm94MyB7XG4gICAgcmV0dXJuIHsgd2lkdGg6IGJveC53aWR0aCwgaGVpZ2h0OiBib3guaGVpZ2h0LCBkZXB0aDogYm94LmRlcHRoICogdGhpcy56U2NhbGUoKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHZvbHVtZSBsYXllciB3aXRoIGl0cyBaIHN0cmV0Y2hlZCBhcyB0aGUgcmVzdCBvZiB0aGUgc2NlbmUgaXMsIHJlbWVtYmVyaW5nIGl0cyBvd25cbiAgICogdm94ZWwgc2l6ZSBzbyBhIGxhdGVyIHN0cmV0Y2ggY2FuIGJlIGFwcGxpZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFkZFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhOiBVaW50OEFycmF5LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGVwdGg6IG51bWJlcixcbiAgICBvcHRzOiBQYXJhbWV0ZXJzPFZpZXdlclsnYWRkVm9sdW1lJ10+WzRdICYgeyB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9LFxuICApOiBWb2x1bWVMYXllciB7XG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gb3B0cy52b3hlbFNpemU7XG4gICAgY29uc3QgbGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgdm94ZWxTaXplOiBbdngsIHZ5LCB2eiAqIHRoaXMuelNjYWxlKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYmFzZVZveGVscy5zZXQobGF5ZXIsIFt2eCwgdnksIHZ6XSk7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IG9ic2VydmF0aW9uJ3MgcG9zaXRpb24gb24gdGhlIGNhbnZhcyB1bmRlciB0aGUgY3VycmVudCAzRCBjYW1lcmEgKGZvciB0aGUgUk9JXG4gICAqIHNlbGVjdGlvbiksIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24gd2l0aCBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gTnVsbCBiZWZvcmUgdGhlIGNsb3VkXG4gICAqIGlzIGJ1aWx0LlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpcyB0aGUgcGlja2VyJ3MgKHNlZSB7QGxpbmsgcGlja2VyfSk7IHdoYXQgaXMgbGVmdCBpcyB0aGUgcGFydCB0aGF0IGlzXG4gICAqIGdlbnVpbmVseSB0aGlzIGFkYXB0ZXInczogU0NBVFRFUklORyB0aGUgZHJhd24gc3Vic2V0IGJhY2sgaW50byBvYnNlcnZhdGlvbiBvcmRlci4gVGhlIGNsb3VkXG4gICAqIGhvbGRzIG9ubHkgdGhlIHBvaW50cyBvZiB0aGUgZGlzcGxheWVkIHNlY3Rpb24sIGluIGl0cyBvd24gcGFja2luZzsgZXZlcnkgY29uc3VtZXIgaW5kZXhlcyBieVxuICAgKiBvYnNlcnZhdGlvbi4gTmFOIHN0YW5kcyBmb3IgXCJub3Qgb24gc2NyZWVuXCIsIHdoaWNoIGlzIGFsc28gdGhlIHJpZ2h0IGFuc3dlciBmb3IgYW5cbiAgICogb2JzZXJ2YXRpb24gd2hvc2Ugc2VjdGlvbiBpcyBoaWRkZW4uXG4gICAqL1xuICBzY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMucGlja2VyPy5wcm9qZWN0ZWQoKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZHJhd24gPSB0aGlzLmRyYXduO1xuICAgIGNvbnN0IHsgc2NyZWVuIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhcigpO1xuICAgIHRoaXMuZGlzcG9zZVNwYXRpYWwoKTtcbiAgICB0aGlzLmludmVydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmludmVydFN1YiA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5nZW5lTWFwTG9hZHMuY2FuY2VsKCk7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlQXhlcygpO1xuICAgIC8vIERyb3AgdGhlIGNhY2hlZCBpbnRlcmxlYXZlZCBjb29yZGluYXRlcyB0b286IGhvbGRpbmcgMy43TSB4IDMgZmxvYXRzIGFmdGVyXG4gICAgLy8gYSB0ZWFyZG93biBpcyB+NDVNQiBvZiByZXRhaW5lZCBoZWFwIGZvciBhIHNjZW5lIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5zZXRQaWNrZXIobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9ic2VydmF0aW9uIHVuZGVyIGEgY2xpZW50IHBvc2l0aW9uOiB0aGUgRlJPTlQtbW9zdCBtYXJrZXIgd2l0aGluIGBzbGFja1B4YCBvZiB0aGVcbiAgICogcG9pbnRlciAodGllcyBieSBkaXN0YW5jZSksIGFzIG5hcGFyaS1qcydzIHtAbGluayBQb2ludFBpY2tlcn0gcGlja3MgaXQuIFRoYXQgbWF0dGVycyBtb3JlXG4gICAqIHRoYW4gaXQgc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhIGNlbGwgdGhhdFxuICAgKiBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLiBUaGUgcGlja2VyIGFsc28gdGFrZXMgZWFjaCBwb2ludCdzIHJhZGl1cyBmcm9tIHRoZSBsYXllcidzXG4gICAqIHBlci1wb2ludCBgc2l6ZXNgLCBzbyBhIHNlbGVjdGVkIG1hcmtlciwgZHJhd24gbGFyZ2VyLCBpcyBhcyBsYXJnZSB0byB0aGUgcG9pbnRlci5cbiAgICovXG4gIHByb3RlY3RlZCBwaWNrT2JzZXJ2YXRpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIsIHNsYWNrUHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGlja2VyID0gdGhpcy5waWNrZXI7XG4gICAgaWYgKCFwaWNrZXIpIHJldHVybiAtMTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jdHguY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGsgPSBwaWNrZXIucGljayhjbGllbnRYIC0gcmVjdC5sZWZ0LCBjbGllbnRZIC0gcmVjdC50b3AsIHNsYWNrUHgpO1xuICAgIGlmIChrIDwgMCkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0aGlzLmRyYXduID8gdGhpcy5kcmF3bltrXSA6IGs7XG4gIH1cblxuICAvKiogUmVwbGFjZSB0aGUgY2xvdWQncyBwaWNrZXIgKG51bGw6IG5vIGNsb3VkKSwgcmVsZWFzaW5nIHRoZSBvbGQgb25lJ3MgY2FtZXJhIGxpc3RlbmVyLiAqL1xuICBwcml2YXRlIHNldFBpY2tlcihwb2ludHM6IFBvaW50czNETGF5ZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5waWNrZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tlciA9IHBvaW50c1xuICAgICAgPyBuZXcgUG9pbnRQaWNrZXIodGhpcy5jdHgudmlld2VyLCBwb2ludHMsIHtcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYSBwaWNrIGhlcmUgY2FuIGNsYWltOiB0aGUgaG92ZXIgc2xhY2sgdGltZXMgdGhlIHNjYWxlIGEgU0VMRUNURURcbiAgICAgICAgICAvLyBtYXJrZXIgaXMgZHJhd24gYXQuIEl0IGRlY2lkZXMgd2hldGhlciBhIG1hcmtlciBzdHJhZGRsaW5nIHRoZSBjYW52YXMgZWRnZSBpcyBmb3VuZC5cbiAgICAgICAgICBtYXhSZWFjaDogSE9WRVJfUkFESVVTX1BYICogU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBuYXBhcmktanMncyBgU2NhbGVCYXJPdmVybGF5YCBpbiBgJzNkJ2AgbW9kZSBtZWFzdXJlcyB0aGVyZTogQ1NTIHB4IHBlciB3b3JsZCB1bml0IGlzIHRoZVxuICAgKiByZWNpcHJvY2FsIG9mIGBDYW1lcmEzRC53b3JsZFBlclBpeGVsYCDigJQgdGhlIHNjYWxlIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci5cbiAgICogVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2ggYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lc1xuICAgKiBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYSBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhXG4gICAqIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1pY3JvbnNQZXJVbml0ID0gZGF0YXNldD8ubWljcm9uc1BlclVuaXQ7XG4gICAgaWYgKCFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2FsZUJhciA9IG5ldyBTY2FsZUJhck92ZXJsYXkodGhpcy5jdHguaG9zdCwgdGhpcy5jdHgudmlld2VyLCB7XG4gICAgICB1bml0UGVyV29ybGQ6IG1pY3JvbnNQZXJVbml0LFxuICAgICAgbW9kZTogJzNkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDNEIHBvaW50IGNsb3VkIGZvciB0aGUgY3VycmVudCBkYXRhc2V0ICsgdmlldyBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYnVpbGQoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuY3R4LnZpZXdlcjtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5yZWJ1aWxkcy5uZXh0KCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGRhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGVuZExvYWRpbmcgPSB0aGlzLmN0eC5iYWRnZS5iZWdpbignT2JzZXJ2YXRpb25zJyk7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGljaCBvYnNlcnZhdGlvbnMgdGhlIGdlbmUgZmlsdGVyIGtlZXBzLCBzZXR0bGVkIGFwYXJ0IGZyb20gdGhlaXIgY29sb3VyczogYSBjb2xvdXJcbiAgICAgICAgLy8gY2FuIGZhbGwgYmFjayB0byBhIGZsYXQgb25lLCB0aGUgZmlsdGVyIGNhbm5vdC4gRHJhd24gd2l0aG91dCBpdCwgZXZlcnkgb2JzZXJ2YXRpb25cbiAgICAgICAgLy8gd291bGQgc2hvdyBhcyBpZiBpdCBleHByZXNzZWQgdGhlIHBpY2tlZCBnZW5lcy4gU28gYSBmYWlsZWQgcmVhZCBrZWVwcyB0aGUgY2xvdWQgYXMgaXRcbiAgICAgICAgLy8gd2FzIGRyYXduLCBhbmQgdGhlIHBhbmVsIHNheXMgdGhlIGZpbHRlciBjb3VsZCBub3QgYmUgYXBwbGllZC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBnZW5lU2hvd24gPSBwb3J0XG4gICAgICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZU1hc2sodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQsIChnKSA9PiBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZykpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIOKAlCBrZWVwaW5nIHRoZSBjbG91ZCBhcyBkcmF3bicsXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGFzaygpKSB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcih0cnVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5jID0gYXdhaXQgdGhpcy5zY2FsYXJFbmNvZGluZyh2aWV3LCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5kTG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIHRoaXMuc2Vzc2lvbi5yZXBvcnRHZW5lRmlsdGVyKGZhbHNlKTtcblxuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQ/Lm9ic2VydmF0aW9ucztcbiAgICAvLyBObyB6IG1lYW5zIG5vdGhpbmcgdG8gZHJhdyBpbiAzRC4gVGhlIHBsb3QgdHlwZSBpcyBnYXRlZCBvbiBgcmVxdWlyZXNTcGF0aWFsM2RgXG4gICAgLy8gc28gdGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUksIGJ1dCBhIGhvc3QgY2FuIHNldCB0aGUgdHlwZSBkaXJlY3RseS5cbiAgICBpZiAoIWRhdGFzZXQgfHwgIW9icyB8fCBvYnMuY291bnQgPT09IDAgfHwgIW9icy56KSB7XG4gICAgICB0aGlzLnJlbW92ZUxheWVycyh2aWV3ZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFuYXRvbXkgZmlyc3Q6IG9uIGEgc2NlbmUncyBGSVJTVCBsYXllciBuYXBhcmkgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmEsIGFuZFxuICAgIC8vIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIHRoZSBmcmFtaW5nIHdlIHdhbnQg4oCUIHRoZSBicmFpbiwgbm90IHRoZSBvdXRlcm1vc3RcbiAgICAvLyBzdHJheSBzZWdtZW50YXRpb24uIEV2ZXJ5IGxhdGVyIGFkZCBrZWVwcyB0aGUgcG9zZSBpbnN0ZWFkIChuYXBhcmktanMgYGZpdDNkOiAnb25jZSdgKS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGJlZm9yZSBhbnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSBpdHMgY2VudHJpbmcgb2Zmc2V0LlxuICAgIHRoaXMuZW5zdXJlRnJhbWUoZGF0YXNldCk7XG4gICAgLy8gVGhlbiB0aGUgY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBnZW5lIG1hcCwgd2hpY2ggc2hhcmVzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgbGF0dGljZSDigJQgc28gaXQgZ29lc1xuICAgIC8vIGFmdGVyIGFueXRoaW5nIHRoYXQgY2FuIHN0aWxsIG1vdmUgdGhlIGNlbnRyaW5nIG9mZnNldC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gU2NhbGUgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCdzIGRlY2xhcmVkIHVuaXQsIHNvIGl0IHdhaXRzIGZvciB0aGUgZGF0YXNldFxuICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIHNldCB1cCBhdCBtb3VudCB0aW1lLlxuICAgIGlmIChkYXRhc2V0LmlkICE9PSB0aGlzLnNjYWxlQmFyS2V5KSB7XG4gICAgICB0aGlzLnNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKGRhdGFzZXQpO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWZlcmVuY2Ugdm9sdW1lIGlzIGhpZGRlbiwgbm90IHJlbW92ZWQ6IGl0IGFsc28gZml4ZXMgdGhlIGNlbnRyaW5nXG4gICAgLy8gb2Zmc2V0IGV2ZXJ5IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20sIGFuZCByZS1mZXRjaGluZyBhIDEwMCBNQiB0ZW1wbGF0ZVxuICAgIC8vIHRvIHVuLWhpZGUgaXQgd291bGQgbWFrZSBhIGNoZWNrYm94IGZlZWwgbGlrZSBhIGxvYWQuXG4gICAgaWYgKHRoaXMudm9sdW1lKSB7XG4gICAgICB0aGlzLnZvbHVtZS52aXNpYmxlID0gdmlldy5zaG93Vm9sdW1lO1xuICAgICAgdGhpcy52b2x1bWUub3BhY2l0eSA9IHZpZXcudm9sdW1lT3BhY2l0eTtcbiAgICB9XG4gICAgdGhpcy5kcmF3Q2xvdWQodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIGVuYywgZ2VuZVNob3duKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBwb2ludCBjbG91ZDogYSBuZXcgbGF5ZXIgZm9yIG5ldyBnZW9tZXRyeSAoYSBkYXRhc2V0IG9yIGEgc2VjdGlvbiksIHRoZSBjb2xvdXJcbiAgICogc291cmNlIHN3YXBwZWQgaW4gcGxhY2Ugb3RoZXJ3aXNlOyB0aGVuIHRoZSBzZWxlY3Rpb24gYW5kIHRoZSB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3Q2xvdWQoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICAgIGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsLFxuICAgIGdlbmVTaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICBjb25zdCBzY2FsZSA9IHZpZXcucG9pbnRTY2FsZSA+IDAgPyB2aWV3LnBvaW50U2NhbGUgOiAxO1xuICAgIGNvbnN0IHNpemUgPSBTUEFUSUFMXzNEX0JBU0VfU0laRSAqIHNjYWxlO1xuICAgIC8vIEEgY2F0ZWdvcmljYWwgY29sb3VyaW5nIGlzIHBlci1wb2ludCBSR0JBLCB3aGljaCB3aW5zIG92ZXIgdGhlIHNjYWxhcnM7IHRoZSBmbGF0IGNvbG9ybWFwXG4gICAgLy8gYW5kIHplcm8gc2NhbGFycyBzdGFuZCBiZWhpbmQgaXQsIGFzIHRoZXkgZG8gZm9yIFwibm90aGluZyB0byBjb2xvdXIgYnlcIi5cbiAgICBjb25zdCBzY2FsYXIgPSBlbmM/LmtpbmQgPT09ICdzY2FsYXJzJyA/IGVuYyA6IG51bGw7XG4gICAgY29uc3QgY29sb3JzID0gZW5jPy5raW5kID09PSAnY29sb3JzJyA/IGVuYy5jb2xvcnMgOiBudWxsO1xuICAgIGNvbnN0IHNjYWxhcnMgPSBzY2FsYXI/LnZhbHVlcyA/PyBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCk7XG4gICAgY29uc3QgY29sb3JtYXAgPSBzY2FsYXI/LmNvbG9ybWFwID8/IHNwYXRpYWxGbGF0Q29sb3JtYXAoKTtcbiAgICBjb25zdCBjb250cmFzdExpbWl0czogW251bWJlciwgbnVtYmVyXSA9IHNjYWxhcj8uY29udHJhc3RMaW1pdHMgPz8gWzAsIDFdO1xuICAgIGNvbnN0IHsgc2hvd24sIGtleSwgc2NhbGFyS2V5IH0gPSBjbG91ZFN1YnNldChkYXRhc2V0LCB2aWV3LCBnZW5lU2hvd24pO1xuXG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXllcktleSkge1xuICAgICAgLy8gTmV3IGdlb21ldHJ5OiBpbnRlcmxlYXZlIHgseSx6ICh0aGUgbGF5ZXIncyBkb2N1bWVudGVkIGxheW91dCwgeC1mYXN0ZXN0KVxuICAgICAgLy8gYW5kIGNhY2hlIGl0LCBzbyBsYXRlciBjb2xvdXIgY2hhbmdlcyByZWJ1aWxkIHRoZSBsYXllciB3aXRob3V0IHdhbGtpbmdcbiAgICAgIC8vIHRoZSBvYnNlcnZhdGlvbnMgYWdhaW4uXG4gICAgICB0aGlzLnBvc2l0aW9ucyA9IHRoaXMuY2xvdWRQb3NpdGlvbnMob2JzLCBzaG93bik7XG4gICAgICB0aGlzLmRyYXduID0gc2hvd247XG4gICAgfVxuXG4gICAgLy8gVGhlIHNjYWxhcnMgaGF2ZSB0byBmb2xsb3cgdGhlIGdlb21ldHJ5OiBhIHBlci1vYnNlcnZhdGlvbiB2ZWN0b3IgYWdhaW5zdCBvbmVcbiAgICAvLyBzZWN0aW9uJ3MgcG9zaXRpb25zIHdvdWxkIGNvbG91ciBlYWNoIGNlbGwgYnkgYSBzdHJhbmdlcidzIHZhbHVlLiBTbyBkbyB0aGUgY29sb3Vycy5cbiAgICBjb25zdCB2YWx1ZXNGb3IgPSAoKSA9PiAoc2hvd24gPyBGbG9hdDMyQXJyYXkuZnJvbShzaG93biwgKGkpID0+IHNjYWxhcnNbaV0pIDogc2NhbGFycyk7XG4gICAgY29uc3QgY29sb3JzRm9yID0gKCkgPT4gKGNvbG9ycyA/IChnYXRoZXJDb2xvcnMoY29sb3JzLCBzaG93biA/PyB1bmRlZmluZWQpIGFzIEZsb2F0MzJBcnJheSkgOiBudWxsKTtcblxuICAgIGlmICghdGhpcy5wb2ludHMgfHwga2V5ICE9PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICAvLyBOZXcgR0VPTUVUUlkg4oCUIGEgZGlmZmVyZW50IGRhdGFzZXQsIG9yIGEgZGlmZmVyZW50IHNlY3Rpb24g4oCUIHNvIGEgbmV3IGxheWVyLlxuICAgICAgaWYgKHRoaXMucG9pbnRzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnBvaW50cyk7XG4gICAgICB0aGlzLmxheWVyS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zY2FsYXJLZXkgPSBzY2FsYXJLZXk7XG4gICAgICB0aGlzLnBvaW50cyA9IHZpZXdlci5hZGRQb2ludHMzRCh0aGlzLnBvc2l0aW9ucyEsIHZhbHVlc0ZvcigpLCB7XG4gICAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgICBzY2FsZTNkOiBbMSwgMSwgdGhpcy56U2NhbGUoKV0sXG4gICAgICAgIGNvbG9ybWFwLFxuICAgICAgICBjb250cmFzdExpbWl0cyxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgY29sb3JzOiBjb2xvcnNGb3IoKSA/PyB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0UGlja2VyKHRoaXMucG9pbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjYWxhcktleSAhPT0gdGhpcy5zY2FsYXJLZXkpIHtcbiAgICAgICAgLy8gQSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSwgd2hpY2ggdXNlZCB0byBtZWFuIGRpc2NhcmRpbmcgdGhlIGxheWVyIGFuZCBidWlsZGluZ1xuICAgICAgICAvLyBhbm90aGVyIOKAlCBhbmQsIGJlY2F1c2UgYWRkaW5nIGEgM0QgbGF5ZXIgcmVmcmFtZXMsIGEgY2FtZXJhIGp1bXAgdG8gdW5kbyBhcyB3ZWxsLlxuICAgICAgICAvLyBuYXBhcmktanMg4omlIDAuMTQgbGV0cyB0aGUgc2NhbGFycyBiZSByZXBsYWNlZCBpbiBwbGFjZSDigJQgdGhlIHNldHRlciBidW1wcyB0aGVcbiAgICAgICAgLy8gbGF5ZXIncyBkYXRhVmVyc2lvbiBzbyB0aGUgdmlzdWFsIHJlLXVwbG9hZHMg4oCUIGFuZCB0aGUgcG9zaXRpb25zIGhhdmUgbm90IG1vdmVkLFxuICAgICAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgY2FtZXJhIHRvIHJlZnJhbWUuXG4gICAgICAgIHRoaXMuc2NhbGFyS2V5ID0gc2NhbGFyS2V5O1xuICAgICAgICB0aGlzLnBvaW50cy52YWx1ZXMgPSB2YWx1ZXNGb3IoKTtcbiAgICAgICAgdGhpcy5wb2ludHMuY29sb3JzID0gY29sb3JzRm9yKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBvaW50cy5jb2xvcm1hcCA9IGNvbG9ybWFwO1xuICAgICAgdGhpcy5wb2ludHMuY29udHJhc3RMaW1pdHMgPSBjb250cmFzdExpbWl0cztcbiAgICAgIHRoaXMucG9pbnRzLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIGNvbnN0IGNsb3VkID0gdGhpcy5wb2ludHM7XG4gICAgaWYgKGNsb3VkKSB7XG4gICAgICBjbG91ZC5vcGFjaXR5ID0gdmlldy5vcGFjaXR5O1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGlvbihjbG91ZCwgc2VsZWN0aW9uLCBzaG93biwgb2JzLmNvdW50KTtcbiAgICB9XG4gICAgLy8gTGFzdCwgc28gaXQgYWxzbyBjb3ZlcnMgYSBsYXllciB0aGlzIHBhc3MganVzdCBjcmVhdGVkLlxuICAgIGlmICh0aGlzLnBvaW50cykgdGhpcy5wb2ludHMudmlzaWJsZSA9IHZpZXcuc2hvd1BvaW50cztcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEludGVybGVhdmVkIHgseSx6IG9mIHRoZSBgc2hvd25gIG9ic2VydmF0aW9ucyAobnVsbDogYWxsIG9mIHRoZW0pLCBvZmZzZXQgYnkge0BsaW5rIG9yaWdpbn0uICovXG4gIHByaXZhdGUgY2xvdWRQb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBzaG93bjogVWludDMyQXJyYXkgfCBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICAvLyByZWJ1aWxkKCkgZHJhd3Mgb25seSBhIGRhdGFzZXQgd2hvc2Ugb2JzZXJ2YXRpb25zIGhhdmUgYSB6LlxuICAgIGNvbnN0IHogPSBvYnMueiE7XG4gICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5vcmlnaW47XG4gICAgY29uc3QgY291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMyk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBwb3NpdGlvbnNbayAqIDNdID0gb2JzLnhbaV0gKyBveDtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0geltpXSArIG96O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICpcbiAgICogSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgKiB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAqIGRyb3BwZWQgdG8gdGhlIG11dGVkIGxldmVsLiBUaGF0IHNlY29uZCBsYXllciBoYWQgdG8gYmUga2VwdCBpbiBzdGVwIHRocm91Z2ggZXZlcnlcbiAgICogY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgKiBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAqIHNlbGVjdGlvbiwgc2xpZ2h0bHkgbGFyZ2VyIHNvIGEgc21hbGwgb25lIGlzIGZpbmRhYmxlIGluc2lkZSAzLjdNIHBvaW50cyDigJQgaW4gb25lLlxuICAgKlxuICAgKiBgc2hvd25gIGlzIHRoZSBkcmF3biBzdWJzZXQgKG51bGw6IGV2ZXJ5IG9uZSBvZiB0aGUgYHRvdGFsYCBvYnNlcnZhdGlvbnMpLCBzbyB0aGUgYWxwaGFzXG4gICAqIGZvbGxvdyB0aGUgZHJhd24gb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5U2VsZWN0aW9uKFxuICAgIGNsb3VkOiBQb2ludHMzRExheWVyLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2hvd246IFVpbnQzMkFycmF5IHwgbnVsbCxcbiAgICB0b3RhbDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwIHx8IHNlbGVjdGlvbi5tYXNrLmxlbmd0aCAhPT0gdG90YWwpIHtcbiAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICBjbG91ZC5zaXplcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3duQ291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IHRvdGFsO1xuICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgYWxwaGFzW2tdID0gcGlja2VkID8gMSA6IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgIHNpemVzW2tdID0gcGlja2VkID8gU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICB9XG4gICAgY2xvdWQuYWxwaGFzID0gYWxwaGFzO1xuICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqM0QgZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBvdmVyIHRoZSB3aG9sZSBzZWN0aW9uZWRcbiAgICogc3BlY2ltZW4sIGFzIG9uZSByYXltYXJjaGVkIHZvbHVtZS5cbiAgICpcbiAgICogVHdvIHRoaW5ncyBpdCBjYW4gYmUsIGFuZCB0aGUgcGFuZWwncyBgVm9sdW1lIHJlbmRlcmluZ2AgdG9nZ2xlIHBpY2tzIHdoaWNoOlxuICAgKlxuICAgKiAgLSAqKnNoZWV0cyoqIOKAlCBleGFjdGx5IHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgZWFjaCBjYXJyeWluZyB0aGF0XG4gICAqICAgIHNsaWRlJ3Mgb3duIDJEIGdlbmUgbWFwLCB3aXRoIHRoZSBnYXBzIGJldHdlZW4gc2VjdGlvbnMgZW1wdHkuIEEgc3RhY2sgb2ZcbiAgICogICAgbWVhc3VyZWQgZmllbGRzLCBhdCB0aGVpciB0cnVlIHouXG4gICAqICAtICoqdm9sdW1lKiog4oCUIHRoZSBzYW1lIGZpZWxkcyBzbW9vdGhlZCBhbG9uZyB6LCBzbyB0aGUgcGxhbmVzIGJldHdlZW4gdGhlXG4gICAqICAgIHNlY3Rpb25zIGNhcnJ5IGFuIGludGVycG9sYXRlZCB2YWx1ZS4gQW4gZXN0aW1hdGUsIGFuZCBkcmF3biBhcyBhXG4gICAqICAgIHRyYW5zbHVjZW50IGNsb3VkIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGRlbnNpdHkgdm9sdW1lcyBhcmUuXG4gICAqXG4gICAqIE9uZSBgVm9sdW1lTGF5ZXJgIHJhdGhlciB0aGFuIGEgdGV4dHVyZWQgcXVhZCBwZXIgc2VjdGlvbjogYW4gYEltYWdlTGF5ZXJgXG4gICAqIHJlbmRlcnMgb25seSBhdCBgbmRpc3BsYXkgPT09IDJgLCBzbyA1MyBzaGVldHMgaW4gdGhlIG9yYml0IHZpZXcgd291bGQgbmVlZCBhXG4gICAqIG5ldyBsYXllciB0eXBlIHVwc3RyZWFtIOKAlCB3aGlsZSBhIHNjYWxhciB2b2x1bWUgd2hvc2UgeiBzYW1wbGluZyBhbHJlYWR5IElTXG4gICAqIHRoZSBzZWN0aW9uIHNwYWNpbmcgZXhwcmVzc2VzIHRoZSBzaGVldHMgZXhhY3RseSwgYW5kIHRoZSBzYW1lIGxhdHRpY2UgdGhlblxuICAgKiBnaXZlcyB0aGUgaW50ZXJwb2xhdGVkIHZlcnNpb24gZm9yIGZyZWUuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93biBsYXR0aWNlIChgZGVuc2l0eUdyaWRgIGF0IHN0cmlkZSAxKSxcbiAgICogc28gdGhlIGZpZWxkIGxhbmRzIHZveGVsLWZvci12b3hlbCBvbiB0aGUgYW5hdG9teSBhbmQgbmVlZHMgbm8gb2Zmc2V0IOKAlCBhXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZSwgYW5kIG5hcGFyaSBjZW50cmVzIGJvdGggYm94ZXMgb24gdGhlIHdvcmxkXG4gICAqIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICAgIGRhdGFzZXQuaWQsXG4gICAgICAgICAgZ2VuZSxcbiAgICAgICAgICBzbW9vdGhpbmcsXG4gICAgICAgICAgc2VjdGlvbiA/PyAnYWxsJyxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgICBmaWVsZEtleSxcbiAgICAgICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICAgICAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICAgICAgICB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICAgIHRoaXMuY3R4LmRpc3BsYXkuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcEtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgY2FjaGUuZmllbGQgPSBudWxsO1xuICAgICAgY2FjaGUua2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2Fyc2VuZWQgaW4tcGxhbmUgYnV0IE5PVCBhbG9uZyB6OiB0aGUgc2hlZXRzIG5lZWQgb25lIHBsYW5lIHBlciBpbWFnZWRcbiAgICAvLyBzZWN0aW9uLCB3aGlsZSB0aGUgZmllbGQgdGhleSBjYXJyeSBpcyBzbW9vdGggYnkgY29uc3RydWN0aW9uIGFuZCBnYWluc1xuICAgIC8vIG5vdGhpbmcgZnJvbSB0aGUgdGVtcGxhdGUncyA0MCDCtW0gZGV0YWlsLiBBdCBmdWxsIHJlc29sdXRpb24gdGhlIGVzdGltYXRlIGlzXG4gICAgLy8gYSA1LjdNLXZveGVsIHBhaXIgb2YgYmx1cnMg4oCUIHNlY29uZHMgb2Ygd29yayBmb3IgYSBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZVxuICAgIC8vIHZveGVscyBpcyBhbiBlaWdodGggb2YgdGhlIHdvcmsuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQsIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsIDEyOCwgMSk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IGNhY2hlLmtleSkge1xuICAgICAgY29uc3QgbG9hZCA9IHRoaXMuZ2VuZU1hcExvYWRzLm5leHQoKTtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIGxldCBmaWVsZDogRXhwcmVzc2lvblZvbHVtZUZpZWxkIHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpZWxkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25Wb2x1bWVBc3luYyhcbiAgICAgICAgICBvYnMsXG4gICAgICAgICAgZ3JpZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzaWdtYTogW1xuICAgICAgICAgICAgICBpblBsYW5lWzBdICogR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICAgIGluUGxhbmVbMV0gKiBHRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgICAgIGludGVycG9sYXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnIpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBtYXAsIG9yIHRoZSBzY2VuZSB3ZW50IGF3YXlcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNhY2hlLmZpZWxkID0gZmllbGQ7XG4gICAgICBjYWNoZS5rZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBjYWNoZS5maWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICAvLyBUaGUgaGlnaCBlbmQgb3ZlciB0aGUgTUVBU1VSRUQgdm94ZWxzIG9ubHkgKHRoZSB1bm1lYXN1cmVkIHplcm9zIHdvdWxkIHB1bGwgaXQgZG93biBhbmRcbiAgICAvLyBzYXR1cmF0ZSB0aGUgbWFwKSwgYnV0IHRoZSBsb3cgZW5kIHN0YXlzIDA6IGluIGEgdm9sdW1lIHRoZSB2YWx1ZSBpcyBhbHNvIHRoZSBvcGFjaXR5IGFuZFxuICAgIC8vIDAgcmVhZHMgYXMgXCJub3RoaW5nIGhlcmVcIiwgc28gc3RhcnRpbmcgYXQgdGhlIGxvd2VzdCBtZWFzdXJlZCB2YWx1ZSB3b3VsZCBlcmFzZSBpdC5cbiAgICBjb25zdCBbLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBsbyA9IDA7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBsdXQgPSB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB0aGlzLmFkZFZvbHVtZSh2aWV3ZXIsIGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLCB7XG4gICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dChgZ2VuZS1tYXAtJHtnZW5lfWAsIGx1dCksXG4gICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgY29udHJhc3RMaW1pdHM6IFswLCAyNTVdLFxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgLy8gaGF2ZSB0byByZWFkIFRIUk9VR0ggZWFjaCBvdGhlciBhbmQgdGhyb3VnaCB0aGUgYW5hdG9teSwgd2hpY2ggYVxuICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdCBgREVOU0lUWV9NQVhfQ0xVU1RFUlNgIGJ5IGNlbGxcbiAgICogY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtkYXRhc2V0LmlkLCBjb2x1bW4gPz8gJ2FsbCcsIHNtb290aGluZywgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmRlbnNpdHlLZXkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0ga2V5O1xuICAgIGNvbnN0IGxvYWQgPSB0aGlzLmRlbnNpdHlMb2Fkcy5uZXh0KCk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcblxuICAgIC8vIFRoZSBkZW5zaXR5IGJveCBpcyB0aGUgc2NlbmUncyBib3ggKGVuc3VyZUZyYW1lKSwgc28gdGhlIGNsb3VkIGFscmVhZHkgc2l0cyBpbiBpdC5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICBsZXQgZ3JvdXBzOiBEZW5zaXR5R3JvdXBbXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGxldCBmaWVsZHM6IChVaW50OEFycmF5IHwgbnVsbClbXTtcbiAgICB0cnkge1xuICAgICAgLy8gT2ZmIHRoZSBtYWluIHRocmVhZCBwYXN0IHRoZSB3b3JrZXIgdGhyZXNob2xkOyB0aGUgY2x1c3RlcnMgcXVldWUgb24gb25lIHdvcmtlci5cbiAgICAgIGZpZWxkcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgICByYXN0ZXJpemVEZW5zaXR5QXN5bmMoXG4gICAgICAgICAgICBkYXRhc2V0Lm9ic2VydmF0aW9ucyxcbiAgICAgICAgICAgIGdyaWQsXG4gICAgICAgICAgICB7IHNpZ21hLCBpbmRpY2VzOiBncm91cC5pbmRpY2VzIH0sXG4gICAgICAgICAgICB7IHNpZ25hbDogbG9hZC5zaWduYWwgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc0Fib3J0RXJyb3IoZXJyKSkgcmV0dXJuOyAvLyBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIga2V5LCBvciB0aGUgc2NlbmUgd2VudCBhd2F5XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZmllbGRzW2ldO1xuICAgICAgLy8gQSBjbHVzdGVyIHdpdGggbm90aGluZyBvbiB0aGUgZ3JpZCBkcmF3cyBubyBsYXllciwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYm94LlxuICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgICB0aGlzLmRlbnNpdHlMYXllcnMucHVzaChcbiAgICAgICAgdGhpcy5hZGRWb2x1bWUodmlld2VyLCBkYXRhLCBncmlkLndpZHRoLCBncmlkLmhlaWdodCwgZ3JpZC5kZXB0aCwge1xuICAgICAgICAgIG5hbWU6IGBkZW5zaXR5IMK3ICR7Z3JvdXAubmFtZX1gLFxuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmN0eC5kaXNwbGF5LmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgIGludmVydDogdGhpcy5jdHguZGlzcGxheS5pbnZlcnQsXG4gICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgLy8gd291bGQgZmxhdHRlbiBldmVyeSBjbG91ZCB0byBpdHMgYnJpZ2h0ZXN0IHNoZWxsLlxuICAgICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgIC8vIEFkZGl0aXZlLCBzbyB0d28gY2x1c3RlcnMgb3ZlcmxhcHBpbmcgcmVhZCBhcyBib3RoIGJlaW5nIHRoZXJlIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiB0aGUgbmVhcmVyIG9uZSBoaWRpbmcgdGhlIG90aGVyLlxuICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgIHZveGVsU2l6ZTogZ3JpZC52b3hlbFNpemUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVycyB0byByYXN0ZXJpc2U6IHRoZSBjYXRlZ29yaWVzIG9mIHRoZSBhY3RpdmUgY2F0ZWdvcmljYWwgY29sb3VyaW5nLFxuICAgKiBiaWdnZXN0IGZpcnN0IGFuZCBjYXBwZWQsIGVhY2ggd2l0aCBpdHMgbGVnZW5kIGNvbG91ciwgcmVzdHJpY3RlZCB0byB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICogd2hlbiB0aGVyZSBpcyBvbmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LFxuICAgKiB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93biAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0b1xuICAgKiBzaG93IHdoZW4gdGhlIHZpZXcgaXMgbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgY29sdW1uOiBzdHJpbmcgfCBudWxsLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8RGVuc2l0eUdyb3VwW10+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm4gW3RvdGFsRGVuc2l0eUdyb3VwKHNlbGVjdGlvbildO1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmFua0RlbnNpdHlHcm91cHMoY29sdW1uLCBsb2FkZWQsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCBzZWxlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLiBUaGUgb2Zmc2V0IHRoYXQgc2l0cyB0aGUgb2JzZXJ2YXRpb25zIGluc2lkZVxuICAgKiBpdCBpcyB7QGxpbmsgZW5zdXJlRnJhbWV9J3MuXG4gICAqXG4gICAqIEEgZmFpbGVkIG9yIGFic2VudCB2b2x1bWUgaXMgbm90IGZhdGFsOiB0aGUgY2xvdWQgcmVuZGVycyBvbiBpdHMgb3duLCBpbiB0aGUgc2FtZSBib3gsIGFuZFxuICAgKiB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVZvbHVtZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGtleSA9IG1ldGEgPyBgJHtkYXRhc2V0LmlkfToke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogbnVsbDtcbiAgICBpZiAoa2V5ICYmIGtleSA9PT0gdGhpcy52b2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy52b2x1bWUpO1xuICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGUgc3VyZmFjZXMgc2F0IGluIHRoZSB2b2x1bWUganVzdCByZW1vdmVkIChvciB0aGVyZSB3YXMgbm9uZSk6IGRvd24gdW50aWwgb25lIGlzIHBsYWNlZC5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUpIHJldHVybjtcblxuICAgIGxldCB2b3hlbHM6IFVpbnQ4QXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgIHZveGVscyA9IGF3YWl0IHBvcnQuZ2V0Vm9sdW1lKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHJlZmVyZW5jZSB2b2x1bWUgdW5hdmFpbGFibGUg4oCUIGRyYXdpbmcgdGhlIGNsb3VkIGFsb25lJywgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3R4LnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnZvbHVtZSA9IHRoaXMuYWRkVm9sdW1lKHZpZXdlciwgdm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaCkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSAndHJhbnNsdWNlbnRfbm9fZGVwdGgnO1xuICAgIHRoaXMucGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGNlbnRyZWQgb24gdGhlIHdvcmxkIG9yaWdpbiwgYW5kIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW4gaXQ7IHdpdGggdGhlIGF4ZXMgZ2l6bW8gYW5kIHRoZSBaIGhhbmRsZSBvbiBpdC5cbiAgICpcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlOiBuYXBhcmktanMgbWFwcyBhIHZvbHVtZSdzIHVuaXQgY3ViZSB0byBhIHdvcmxkIGJveCBjZW50cmVkIG9uXG4gICAqIHRoZSBvcmlnaW4sIHNpemVkIGBkaW1zIHggdm94ZWxTaXplYC4gVGhlIG9ic2VydmF0aW9ucywgYnkgY29udHJhY3QsIGFyZSBpbiB0aGUgcmVmZXJlbmNlXG4gICAqIHZvbHVtZSdzIGZyYW1lIHdpdGggaXRzIG5lYXIgY29ybmVyIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbiwgYW5kIHRoZSBkZW5zaXR5IGdyaWQgaXMgbWVhc3VyZWRcbiAgICogZnJvbSB0aGUgY29vcmRpbmF0ZSBvcmlnaW4gdGhlIHNhbWUgd2F5IChgZGVuc2l0eUdyaWRgKSwgc28gaXRzIGJveCBpcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzXG4gICAqIHdoZW4gdGhlcmUgaXMgb25lLiBTbyB0aGUgUE9JTlRTIG1vdmUgYnkgaGFsZiB0aGF0IGJveCDigJQge0BsaW5rIG9yaWdpbn0g4oCUIGFuZCBldmVyeSB2b2x1bWUsIHRoZVxuICAgKiByZWZlcmVuY2UsIHRoZSBkZW5zaXRpZXMgYW5kIHRoZSBnZW5lIG1hcCwgbGluZXMgdXAgd2l0aCB0aGVtIGFuZCB3aXRoIGVhY2ggb3RoZXIuIFdpdGhvdXQgYVxuICAgKiByZWZlcmVuY2Ugdm9sdW1lIHRoaXMgY2VudHJlcyB0aGUgY2xvdWQgdG9vLCB3aGljaCB0aGUgYXhlcyBhbmQgdGhlIFogc3RyZXRjaCBuZWVkOiBib3RoIHdvcmtcbiAgICogYWJvdXQgdGhlIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRnJhbWUoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudH06JHttZXRhID8gYCR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofWAgOiAnLSd9YDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmJveEtleSkgcmV0dXJuO1xuICAgIHRoaXMuYm94S2V5ID0ga2V5O1xuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0KTtcbiAgICB0aGlzLmJveCA9IGdyaWRcbiAgICAgID8ge1xuICAgICAgICAgIHdpZHRoOiBncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0sXG4gICAgICAgICAgaGVpZ2h0OiBncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdLFxuICAgICAgICAgIGRlcHRoOiBncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0sXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBib3ggPSB0aGlzLmJveDtcbiAgICB0aGlzLm9yaWdpbiA9IGJveCA/IFstYm94LndpZHRoIC8gMiwgLWJveC5oZWlnaHQgLyAyLCAtYm94LmRlcHRoIC8gMl0gOiBbMCwgMCwgMF07XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIHRoaXMuaW5zdGFsbEF4ZXMoZGF0YXNldCk7XG4gICAgLy8gQSBzdHJldGNoIGNob3NlbiBmb3IgYW5vdGhlciBib3ggbWF5IGJlIHBhc3Qgd2hhdCB0aGlzIG9uZSBhbGxvd3M6IGRyYXcgd2hhdCBpcyBpbiBlZmZlY3QuXG4gICAgdGhpcy5hcHBseVpTY2FsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBWb2x1bWUgdmlldydzIGF4ZXMgZ2l6bW8gYW5kIFotaGVpZ2h0IGhhbmRsZSwgb24ge0BsaW5rIGJveH0uIFRoZSBoYW5kbGUgZmxvYXRzIHBhc3QgdGhlXG4gICAqIHRvcCBvZiB0aGUgWiBheGlzICh0aGUgYm94J3MgbWluLVhZIGNvcm5lciwgd2hlcmUgdGhlIGJsdWUgYXhpcyBhbmQgaXRzIGxhYmVsIGFyZSksIGJ5IGEgc2hhcmVcbiAgICogb2YgdGhlIGJveCdzIGxhcmdlc3Qgc2lkZSByYXRoZXIgdGhhbiBvZiBpdHMgZGVwdGgsIHNvIGl0IGNsZWFycyB0aGUgbGFiZWwgZXZlbiB3aGlsZSBhIHRoaW5cbiAgICogc2VjdGlvbiBpcyBkcmF3biBmbGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsQXhlcyhkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQXhlcygpO1xuICAgIGNvbnN0IGJveCA9IHRoaXMuYm94O1xuICAgIGlmICghYm94KSByZXR1cm47XG4gICAgY29uc3QgeyB2aWV3ZXIsIGhvc3QsIHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd25Cb3goYm94KTtcbiAgICB0aGlzLmdpem1vID0gbmV3IEF4ZXMzZEdpem1vKFxuICAgICAgdmlld2VyLFxuICAgICAgaG9zdCxcbiAgICAgIGRyYXduLFxuICAgICAgc3BhdGlhbEF4ZXNMYWJlbHMoZHJhd24sIHRoaXMuelNjYWxlKCksIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgICAge1xuICAgICAgICB2aXNpYmxlOiBzZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBtYXhTY2FsZSA9IHNwYXRpYWxaU2NhbGVNYXgoYm94KTtcbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShob3N0LCB2aWV3ZXIuY2FtZXJhM2QsIHtcbiAgICAgIHRvcEFuY2hvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBkID0gdGhpcy5kcmF3bkJveChib3gpO1xuICAgICAgICByZXR1cm4gWy1kLndpZHRoIC8gMiwgLWQuaGVpZ2h0IC8gMiwgZC5kZXB0aCAvIDIgKyAwLjA4ICogTWF0aC5tYXgoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpXTtcbiAgICAgIH0sXG4gICAgICBnZXRTY2FsZTogKCkgPT4gdGhpcy56U2NhbGUoKSxcbiAgICAgIHNldFNjYWxlOiAocykgPT4gdGhpcy5zZXRaU2NhbGUocyksXG4gICAgICBtaW5TY2FsZTogU1BBVElBTF9aX1NDQUxFX01JTixcbiAgICAgIG1heFNjYWxlLFxuICAgICAgcGl4ZWxzUGVyRG91YmxlOiBzcGF0aWFsWlBpeGVsc1BlckRvdWJsZShtYXhTY2FsZSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUF4ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2l6bW8pIHtcbiAgICAgIHRoaXMuY3R4LnZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2l6bW8ubGF5ZXIpO1xuICAgICAgdGhpcy5naXptby5kZXN0cm95KCk7XG4gICAgICB0aGlzLmdpem1vID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy56SGFuZGxlPy5kZXN0cm95KCk7XG4gICAgdGhpcy56SGFuZGxlID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5IGxheWVyIG9mIHRoZSBjbG91ZCAodGhlIGRhdGFzZXQgd2VudCBhd2F5LCBvciBoYXMgbm8geikuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgW3RoaXMucG9pbnRzLCB0aGlzLnZvbHVtZSwgdGhpcy5nZW5lTWFwTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVyc10pIHtcbiAgICAgIGlmIChsYXllcikgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNlc3Npb24uZ2VuZU1hcFZvbHVtZS5maWVsZCA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWUua2V5ID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgIC8vIFRoZSBzY2VuZSBpcyBnb25lLCBzbyB0aGUgbmV4dCAzRCBsYXllciBzaG91bGQgZnJhbWUgaXRzZWxmIGFnYWluLiBUaGF0IHVzZWQgdG8gYmVcbiAgICAvLyBgc3BhdGlhbEZyYW1lZCA9IG51bGxgIG5leHQgdG8gYSBoYW5kLXJvbGxlZCBzYXZlL3Jlc3RvcmU7IHRoZSByZW5kZXJlciBvd25zIHRoZVxuICAgIC8vIHBvbGljeSBub3csIGFuZCB0aGlzIGlzIHRoZSBzYW1lIHN0YXRlbWVudCBhZGRyZXNzZWQgdG8gaXQuXG4gICAgdmlld2VyLnJlc2V0Rml0M0QoKTtcbiAgICB0aGlzLnZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMub3JpZ2luID0gWzAsIDAsIDBdO1xuICAgIHRoaXMuYm94ID0gbnVsbDtcbiAgICB0aGlzLmJveEtleSA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVBeGVzKCk7XG4gICAgdGhpcy5wb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc2V0UGlja2VyKG51bGwpO1xuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIHRoaXMuc2NhbGFyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5kcmF3biA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBjb2xvdXJzIHRoZSBjbG91ZC5cbiAgICpcbiAgICogQ29udGludW91cyBkYXRhIGdvZXMgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGhcbiAgICogdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBpcyBvbmUgUkdCQSBwZXIgcG9pbnQgZnJvbSB0aGUgY29sdW1uJ3MgcGFsZXR0ZSwgc28gYW55IG51bWJlciBvZlxuICAgKiBjYXRlZ29yaWVzIGtlZXBzIGl0cyBvd24gY29sb3VyIOKAlCBzZWUgYGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2NhbGFyRW5jb2RpbmcodmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgY291bnQ6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIC8vIENvbG91cmVkIGJ5IHRoZSBnZW5lIGZpbHRlcjogZWFjaCBvYnNlcnZhdGlvbiBpbiBpdHMgZ2VuZSdzIGNvbG91ci5cbiAgICAvLyBBIGNvbG91ciBsaWtlIGFueSBvdGhlcjogYSBmYWlsZWQgcmVhZCBmYWxscyBiYWNrIHRvIHRoZSB2aWV3J3MgY29sb3VyIHNvdXJjZS5cbiAgICBjb25zdCBieUdlbmUgPVxuICAgICAgcG9ydCAmJiBjb3VudFxuICAgICAgICA/IGF3YWl0IG9ic2VydmF0aW9uR2VuZVN0eWxlKHZpZXcsIGNvdW50LCAoZykgPT4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGcpKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdbbmFwYXJpLWpzXSBzcGF0aWFsIDNEIGNvbG91cmluZyBieSBnZW5lIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIHRoZSBjb2xvdXIgc291cmNlJyxcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0pXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoYnlHZW5lKSByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoYnlHZW5lLmNvZGVzLCBieUdlbmUuY29sb3JzKTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGNvbHVtbi52YWx1ZXMsIHZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVDb250aW51b3VzKGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpLCB2aWV3KTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgZW5jb2RlQ29udGludW91cyhzb3VyY2U6IEZsb2F0MzJBcnJheSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFNwYXRpYWwzZFNjYWxhcnMge1xuICAgIHJldHVybiBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgc291cmNlLFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuY3R4LmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KSxcbiAgICAgIHRoaXMuc2Vzc2lvbi5jb250cmFzdFdpbmRvd3MsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYnNlcnZhdGlvbnMgdGhlIGNsb3VkIGRyYXdzLCBhbmQgdGhlIGtleXMgb2YgaXRzIGdlb21ldHJ5IGFuZCBvZiBpdHMgY29sb3VyIHNvdXJjZS5cbiAqXG4gKiBPbmUgaW1hZ2VkIHNlY3Rpb24sIG9yIHRoZSB3aG9sZSBzdGFjayAoYHNob3duYCBudWxsKS4gVGhlIHN1YnNldCBJUyB0aGUgZ2VvbWV0cnksIHNvIGl0XG4gKiBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhbiBvdXQtb2YtcmFuZ2VcbiAqIGluZGV4IGlzIGNsYW1wZWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNsb3VkLCBiZWNhdXNlIHRoZSBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGVcbiAqIGRhdGFzZXQgd2hpbGUgdGhlIHZpZXcgc3RhdGUgcGVyc2lzdHMuIFRoZSBzY2FsYXJzJyBpZGVudGl0eSBpcyB0cmFja2VkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIGdlb21ldHJ5J3MgKGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nKTogYSBuZXcgY29sb3VyIHNvdXJjZSBzd2Fwc1xuICogYHZhbHVlc2AgaW4gcGxhY2UgKG5hcGFyaS1qcyDiiaUgMC4xNCksIHdoaWxlIGEgbmV3IGdlb21ldHJ5IG5lZWRzIGEgbmV3IGxheWVyLlxuICovXG5mdW5jdGlvbiBjbG91ZFN1YnNldChcbiAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gIGdlbmVTaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuKTogeyBzaG93bjogVWludDMyQXJyYXkgfCBudWxsOyBrZXk6IHN0cmluZzsgc2NhbGFyS2V5OiBzdHJpbmcgfSB7XG4gIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgY29uc3Qgc2VjdGlvbiA9XG4gICAgdmlldy5wb2ludFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICA6IG51bGw7XG4gIGxldCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgLy8gVGhlIGdlbmUgZmlsdGVyIGxlYXZlcyBpdHMgdW5tYXRjaGVkIG9ic2VydmF0aW9ucyBvdXQgb2YgdGhlIGdlb21ldHJ5LCBzbyB0aGV5IGFyZSBuZWl0aGVyXG4gIC8vIGRyYXduIG5vciBwaWNrZWQuXG4gIGlmIChnZW5lU2hvd24pIHNob3duID0ga2VlcFNob3duKHNob3duLCBnZW5lU2hvd24sIG9icy5jb3VudCk7XG4gIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NlY3Rpb24gPz8gJ2FsbCd9OiR7Z2VuZVNob3duID8gZ2VuZUZpbHRlcktleSh2aWV3KSA6ICcnfWA7XG4gIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgY29uc3Qgc2NhbGFyS2V5ID0gW1xuICAgIGtleSxcbiAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgIG9ic2VydmF0aW9uR2VuZVN0eWxlS2V5KHZpZXcpLFxuICAgIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLFxuICAgIGNsaXAuam9pbignLCcpLFxuICBdLmpvaW4oJ3wnKTtcbiAgcmV0dXJuIHsgc2hvd24sIGtleSwgc2NhbGFyS2V5IH07XG59XG5cbi8qKiBUaGUgb2JzZXJ2YXRpb25zIG9mIGBpbmRpY2VzYCAoZXZlcnkgb25lIHdoZW4gbnVsbCkgdGhhdCBgc2hvd25gIGtlZXBzLiAqL1xuZnVuY3Rpb24ga2VlcFNob3duKGluZGljZXM6IFVpbnQzMkFycmF5IHwgbnVsbCwgc2hvd246IFVpbnQ4QXJyYXksIGNvdW50OiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50MzJBcnJheShpbmRpY2VzID8gaW5kaWNlcy5sZW5ndGggOiBjb3VudCk7XG4gIGxldCBuID0gMDtcbiAgaWYgKGluZGljZXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgaWYgKHNob3duW2ldKSBvdXRbbisrXSA9IGk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBpZiAoc2hvd25baV0pIG91dFtuKytdID0gaTtcbiAgfVxuICByZXR1cm4gb3V0LnN1YmFycmF5KDAsIG4pO1xufVxuIl19
1380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBS25FLE9BQU8sRUFJTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFHLE9BQU8sRUFBd0IsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25GLE9BQU8sRUFDTCxhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQix1QkFBdUIsR0FDeEIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBRUwsc0JB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O0lBQzNCLE1BQU0sR0FBRyxHQUFHLGNBQWMsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkYsT0FBTztRQUNMLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDN0UsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUM5RSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FD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LEVBQUUsS0FBaUIsRUFBRSxLQUFhO0lBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTztZQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEQsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJveFJhZGl1cywga2VlcFNjZW5lSW5EZXB0aCB9IGZyb20gJy4vbmFwYXJpLWNhbWVyYS1kZXB0aCc7XG5pbXBvcnQgeyBSZWdpb25NZXNoUG9pbnRlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1tZXNoLXBvaW50ZXInO1xuaW1wb3J0IHsgcGxhY2VJbldvcmtlciB9IGZyb20gJy4uLy4uL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL2xvZCc7XG5pbXBvcnQgeyBkYXRhc2V0UmVnaW9uU2V0IH0gZnJvbSAnLi4vLi4vdmlzdWFsaXplci9zcGF0aWFsLXJlZ2lvbi1zZXQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludFBpY2tlciwgY29sb3JtYXBGcm9tTHV0IH0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB0eXBlIHsgUG9pbnRzM0RMYXllciwgVmlld2VyLCBWb2x1bWVMYXllciB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBTY2FsZUJhck92ZXJsYXksIGZvcm1hdExlbmd0aCB9IGZyb20gJ25hcGFyaS1qcy9vdmVybGF5cyc7XG5pbXBvcnQgdHlwZSB7IEF4aXNMYWJlbFNwZWMgfSBmcm9tICduYXBhcmktanMvb3ZlcmxheXMnO1xuXG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgZmluZENvbHVtbk1ldGEsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfTVVURURfT1BBQ0lUWSwgY2F0ZWdvcnlDb2xvcnNGb3IsIGdyb3VwQ29sb3JzS2V5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZGVmYXVsdFNpZ21hLCBkZW5zaXR5R3JpZCB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1kZW5zaXR5JztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2VjdGlvbiwgc2VjdGlvbnNPZiB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWN0aW9ucyc7XG5pbXBvcnQge1xuICBnZW5lRmlsdGVyS2V5LFxuICBvYnNlcnZhdGlvbkdlbmVNYXNrLFxuICBvYnNlcnZhdGlvbkdlbmVTdHlsZSxcbiAgb2JzZXJ2YXRpb25HZW5lU3R5bGVLZXksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1nZW5lLWZpbHRlcic7XG5pbXBvcnQge1xuICBFeHByZXNzaW9uVm9sdW1lRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsXG4gIGZpZWxkQ29udHJhc3RXaW5kb3csXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1leHByZXNzaW9uJztcbmltcG9ydCB7IGNvbXB1dGVFeHByZXNzaW9uVm9sdW1lQXN5bmMsIHJhc3Rlcml6ZURlbnNpdHlBc3luYyB9IGZyb20gJy4uLy4uL3dvcmtlcnMvc3BhdGlhbC1tYXRoJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcbmltcG9ydCB0eXBlIHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBQbGFuZVBsYWNlbWVudCwgUmVnaW9uTWVzaDNELCBWb2x1bWVSZWdpb25NZXNoZXMgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5pbXBvcnQgeyBpc0Fib3J0RXJyb3IgfSBmcm9tICcuLi90aWxlLXNlcnZlcic7XG5pbXBvcnQge1xuICBEZW5zaXR5R3JvdXAsXG4gIEdFTkVfTUFQX1NJR01BLFxuICBHRU5FX01BUF9WT0xVTUVfU1RSSURFLFxuICBTUEFUSUFMXzNEX0JBU0VfU0laRSxcbiAgU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFLFxuICBTcGF0aWFsM2RFbmNvZGluZyxcbiAgU3BhdGlhbDNkU2NhbGFycyxcbiAgZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwsXG4gIGVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMsXG4gIGdhdGhlckNvbG9ycyxcbiAgcmFua0RlbnNpdHlHcm91cHMsXG4gIHNwYXRpYWxGbGF0Q29sb3JtYXAsXG4gIHRvdGFsRGVuc2l0eUdyb3VwLFxufSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IEhPVkVSX1JBRElVU19QWCB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgQXhlczNkR2l6bW8sIEJveDMsIHN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi9uYXBhcmktYXhlcy1naXptbyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7IFNwYXRpYWwzZFRyYW5zY3JpcHRzIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC0zZC10cmFuc2NyaXB0cyc7XG5pbXBvcnQgeyBTcGF0aWFsM2RDZWxscyB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtM2QtY2VsbHMnO1xuaW1wb3J0IHsgY2VsbENvbG9yc0ZvciwgY2VsbENvbG9yc1JnYmEgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvY2VsbC1sYXllcnMnO1xuaW1wb3J0IHsgQ2F0ZWdvcmljYWxMb29rdXAgfSBmcm9tICcuL3NwYXRpYWwtdGlsZXMvY2F0ZWdvcmljYWwtbG9va3VwJztcbmltcG9ydCB7IENvbnRyYXN0V2luZG93Q2FjaGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IE5PX0NBVEVHT1JZIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsU2NlbmVCYXNlLCBTcGF0aWFsU2Vzc2lvbiB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHR5cGUgeyBOYXBhcmlTY2VuZSwgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuXG4vKiogVGhlIGxlYXN0IFogc3RyZXRjaDogYSB0ZW50aCBvZiB0aGUgdHJ1ZSBkZXB0aC4gKi9cbmV4cG9ydCBjb25zdCBTUEFUSUFMX1pfU0NBTEVfTUlOID0gMC4xO1xuLyoqIFRoZSBtb3N0IFogc3RyZXRjaCBhIGNsb3VkIGFsbG93cywgYXQgbGVhc3Q6IHRoZSBWb2x1bWUgdmlldydzLiAqL1xuY29uc3QgU1BBVElBTF9aX1NDQUxFX01BWCA9IDEwO1xuLyoqIE5vciBtb3JlIHRoYW4gdGhpcywgaG93ZXZlciB0aGluIHRoZSBjbG91ZCBpcy4gKi9cbmNvbnN0IFNQQVRJQUxfWl9TQ0FMRV9DRUlMSU5HID0gMTAwMDtcbi8qKlxuICogSW4tcGxhbmUgdm94ZWxzIGFjcm9zcyB0aGUgaW1hZ2Ugd2hlbiBhIHJlZ2lvbiBzZXQncyBwbGFuZXMgYXJlIHJlY29uc3RydWN0ZWQgb3ZlciB0aGUgZGF0YXNldCdzXG4gKiBvd24gaW1hZ2UgKHNlZSB2b3hlbFN0ZXApOiBhIHN0ZXAgb2YgYWJvdXQgNSBweCBvbiBhIDUsNzAwIHB4IHdpZGUgTUVSRklTSCBzZWN0aW9uICgwLjYgwrVtKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9QTEFORVNfVk9YRUxTID0gMTAyNDtcblxuLyoqXG4gKiBUaGUgbW9zdCBhIGJveCdzIFogbWF5IGJlIHN0cmV0Y2hlZDogdW50aWwgaXQgaXMgdHdpY2UgYXMgZGVlcCBhcyBpdCBpcyB3aWRlLCBzbyBldmVuIGEgc2VjdGlvblxuICogbWljcm9ucyB0aGljayBhbmQgbWlsbGltZXRyZXMgd2lkZSBjYW4gYmUgc3Rvb2QgdXAgaW50byBhIGJsb2NrIOKAlCBidXQgbmV2ZXIgbGVzcyB0aGFuIHRoZVxuICogVm9sdW1lIHZpZXcncyAxMHgsIG5vciBtb3JlIHRoYW4ge0BsaW5rIFNQQVRJQUxfWl9TQ0FMRV9DRUlMSU5HfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxaU2NhbGVNYXgoYm94OiBCb3gzKTogbnVtYmVyIHtcbiAgY29uc3QgZmxhdCA9ICgyICogTWF0aC5tYXgoYm94LndpZHRoLCBib3guaGVpZ2h0KSkgLyBNYXRoLm1heChib3guZGVwdGgsIDFlLTkpO1xuICByZXR1cm4gTWF0aC5taW4oU1BBVElBTF9aX1NDQUxFX0NFSUxJTkcsIE1hdGgubWF4KFNQQVRJQUxfWl9TQ0FMRV9NQVgsIGZsYXQpKTtcbn1cblxuLyoqXG4gKiBUaGUgWiBoYW5kbGUncyBkcmFnIChweCkgcGVyIGRvdWJsaW5nOiB0aGUgVm9sdW1lIHZpZXcncyAxODAgcHgsIGxlc3Mgd2hlbiB0aGUgcmFuZ2UgaXMgd2lkZXIsXG4gKiBzbyBnb2luZyBmcm9tIHRoZSB0cnVlIGRlcHRoIHRvIHRoZSBtb3N0IHN0cmV0Y2ggaXMgYWJvdXQgdGhlIHNhbWUgZHJhZyAofjU0MCBweCkgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXRpYWxaUGl4ZWxzUGVyRG91YmxlKG1heFNjYWxlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoNjAsIE1hdGgubWluKDE4MCwgNTQwIC8gTWF0aC5sb2cyKE1hdGgubWF4KDIsIG1heFNjYWxlKSkpKTtcbn1cblxuLyoqXG4gKiBUaGUgWC9ZL1ogYXhpcy1lbmQgbGFiZWxzIGZvciBhIGJveCAoYXMgZHJhd246IFogc3RyZXRjaGVkIGJ5IGB6U2NhbGVgKSwgaXRzIHRydWUgbGVuZ3RocyBpbiDCtW1cbiAqIHdoZW4gdGhlIGRhdGFzZXQgZGVjbGFyZXMgYG1pY3JvbnNQZXJVbml0YCwgZWxzZSBpbiBpdHMgb3duIHVuaXRzLiBBIHN0cmV0Y2hlZCBaIHNheXMgYnkgaG93IG11Y2gsXG4gKiBzbyBpdHMgbGVuZ3RoIGlzIG5ldmVyIHJlYWQgb2ZmIHRoZSBkcmF3aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbEF4ZXNMYWJlbHMoZHJhd246IEJveDMsIHpTY2FsZTogbnVtYmVyLCBtaWNyb25zUGVyVW5pdD86IG51bWJlcik6IEF4aXNMYWJlbFNwZWNbXSB7XG4gIGNvbnN0IGh4ID0gZHJhd24ud2lkdGggLyAyO1xuICBjb25zdCBoeSA9IGRyYXduLmhlaWdodCAvIDI7XG4gIGNvbnN0IGh6ID0gZHJhd24uZGVwdGggLyAyO1xuICBjb25zdCBtcHUgPSBtaWNyb25zUGVyVW5pdCAmJiBtaWNyb25zUGVyVW5pdCA+IDAgPyBtaWNyb25zUGVyVW5pdCA6IDA7XG4gIGNvbnN0IGxlbiA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wdSA/IGZvcm1hdExlbmd0aChuICogbXB1LCAnwrVtJykgOiBgJHsrbi50b1ByZWNpc2lvbigzKX0gdW5pdHNgKTtcbiAgY29uc3Qgc3RyZXRjaCA9IE1hdGguYWJzKHpTY2FsZSAtIDEpID4gMWUtMyA/IGAgKMOXJHsrelNjYWxlLnRvUHJlY2lzaW9uKDMpfSlgIDogJyc7XG4gIHJldHVybiBbXG4gICAgeyBhbmNob3I6IFtoeCwgLWh5LCAtaHpdLCB0ZXh0OiBgWCDCtyAke2xlbihkcmF3bi53aWR0aCl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4oZHJhd24uaGVpZ2h0KX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiBgWiDCtyAke2xlbihkcmF3bi5kZXB0aCAvIHpTY2FsZSl9JHtzdHJldGNofWAsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBTUEFUSUFMX09NSUNTXzNEIChyZXZpZXcgQXBwZW5kaXggQiwgY2x1c3RlciBLKTogb2JzZXJ2YXRpb25zIGFzIGEgM0QgcG9pbnQgY2xvdWQgdW5kZXIgdGhlXG4gKiBvcmJpdCBjYW1lcmEsIHdpdGggdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lIGFyb3VuZCBpdCwgcGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGFuZCB0aGVcbiAqIDNEIGdlbmUgbWFwLlxuICpcbiAqIEV2ZXJ5dGhpbmcgc2l0cyBpbiBvbmUgYm94IGNlbnRyZWQgb24gdGhlIHdvcmxkIG9yaWdpbiAoc2VlIHtAbGluayBlbnN1cmVGcmFtZX0pOiB0aGUgcmVmZXJlbmNlXG4gKiB2b2x1bWUncywgZWxzZSB0aGUgZGVuc2l0eSBncmlkJ3MuIFRoZSBWb2x1bWUgdmlldydzIGF4ZXMgZ2l6bW8gYW5kIFotaGVpZ2h0IGhhbmRsZSBhcmUgZHJhd24gb25cbiAqIGl0LCBhbmQgdGhlIGhhbmRsZSBzdHJldGNoZXMgWjogdGhlIGNsb3VkIHRocm91Z2ggaXRzIGBzY2FsZTNkYCwgZXZlcnkgdm9sdW1lIHRocm91Z2ggaXRzIHZveGVsXG4gKiBzaXplLCBzbyBub3RoaW5nIGlzIHJlLXVwbG9hZGVkIHdoaWxlIGRyYWdnaW5nIChzZWUge0BsaW5rIHNldFpTY2FsZX0pLlxuICpcbiAqIFRoaW5uZXIgdGhhbiB0aGUgMkQgc2NlbmU6IHRoZXJlIGlzIG5vIHRpc3N1ZSBpbWFnZSB0byByZW5kZXIgKGEgcmVnaXN0ZXJlZCB2b2x1bWUgbGlrZSB0aGVcbiAqIEFsbGVuIENDRiBoYXMgbm8gc2luZ2xlIHJlZmVyZW5jZSBwbGFuZSksIHNvIG5vIHJlYWRiYWNrIGFuZCBubyBuYXZpZ2F0b3I7IHRoZSAzRCBzY2FsZSBiYXJcbiAqIGZvbGxvd3MgdGhlIGRhdGFzZXQgKHNlZSB7QGxpbmsgaW5zdGFsbFNjYWxlQmFyfSkuIFRoZSByZWdpb24gdG9vbHMgd29yayBpbiBTQ1JFRU4gc3BhY2UgdGhyb3VnaFxuICogdGhlIHRvb2wgYnJpZGdlJ3MgM0QgaW50ZXJhY3Rpb24g4oCUIGEgbGFzc28gc2VsZWN0cyB0aGUgY2VsbHMgdW5kZXIgaXQsIGFuZCBhbiBvcmJpdCBjbGVhcnMgdGhlXG4gKiBzaGFwZSB3aGlsZSBrZWVwaW5nIHRoZSBzZWxlY3Rpb24uIFRoZSBmaXJzdCAzRCBsYXllciBhZGRlZCBmcmFtZXMgdGhlIGNhbWVyYSAoYGZpdDNkOiAnb25jZSdgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXRpYWwzZFNjZW5lIGV4dGVuZHMgU3BhdGlhbFNjZW5lQmFzZSBpbXBsZW1lbnRzIE5hcGFyaVNjZW5lIHtcbiAgLyoqIFRoZSAzRCBwb2ludCBjbG91ZC4gT25lIGxheWVyOiBzZWxlY3Rpb24gaXMgYSBwZXItcG9pbnQgYWxwaGEgb24gaXQsIG5vdCBhIHNlY29uZC4gKi9cbiAgcHJpdmF0ZSBwb2ludHM6IFBvaW50czNETGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXllcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbnRlcmxlYXZlZCB4LHkseiwgY2FjaGVkIHNvIGEgY29sb3VyIGNoYW5nZSBkb2VzIG5vdCByZS13YWxrIDMuN00gb2JzZXJ2YXRpb25zLiAqL1xuICBwcml2YXRlIHBvc2l0aW9uczogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc2NhbGFycyBjdXJyZW50bHkgdXBsb2FkZWQg4oCUIHNlZSB7QGxpbmsgcmVidWlsZH0uICovXG4gIHByaXZhdGUgc2NhbGFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9ic2VydmF0aW9uIGluZGljZXMgdGhlIGNhY2hlZCBwb3NpdGlvbnMgYmVsb25nIHRvLCBpbiB0aGUgc2FtZSBvcmRlcjsgbnVsbCB3aGVuIGV2ZXJ5XG4gICAqICBvYnNlcnZhdGlvbiBpcyBkcmF3bi4gV2l0aG91dCBpdCBhIHByb2plY3Rpb24gYnVpbHQgZnJvbSB0aGUgcG9zaXRpb25zIGlzIGluZGV4ZWQgYnkgRFJBV05cbiAgICogIG9yZGVyIGFuZCBzaWxlbnRseSBhdHRyaWJ1dGVzIGVhY2ggcG9pbnQgdG8gdGhlIHdyb25nIG9ic2VydmF0aW9uIGFzIHNvb24gYXMgYSBzZWN0aW9uIGlzXG4gICAqICBpc29sYXRlZC4gKi9cbiAgcHJpdmF0ZSBkcmF3bjogVWludDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBhbmF0b21pY2FsIHZvbHVtZSB0aGUgY2xvdWQgc2l0cyBpbnNpZGUsIHdoZW4gdGhlIGRhdGFzZXQgaGFzIG9uZS4gKi9cbiAgcHJpdmF0ZSB2b2x1bWU6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2Ugdm9sdW1lIG9uIGl0cyB3YXkgKGl0cyBrZXkgYW5kIHRoZSBsb2FkKSwgc2hhcmVkIGJ5IGV2ZXJ5IHJlYnVpbGQgdGhhdCBhc2tzIGZvclxuICAgKiBpdCBtZWFud2hpbGU6IGVhY2ggb25lIGFkZGluZyBpdHMgb3duIGxlZnQgb25lIGxheWVyIGJlaGluZCwgd2hpY2ggdGhlIHZpZXcncyB0b2dnbGUgKGJvdW5kIHRvXG4gICAqIHtAbGluayB2b2x1bWV9KSB0aGVuIG5ldmVyIGhpZC5cbiAgICovXG4gIHByaXZhdGUgdm9sdW1lTG9hZGluZzogeyBrZXk6IHN0cmluZzsgZG9uZTogUHJvbWlzZTx2b2lkPiB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXItY2x1c3RlciBkZW5zaXR5IHZvbHVtZXMgZHJhd24gYWxvbmdzaWRlIHRoZSBjbG91ZCwgYW5kIHdoYXQgdGhleSB3ZXJlXG4gICAqICBidWlsdCBmcm9tIOKAlCByYXN0ZXJpc2luZyBpcyBzZWNvbmRzIG9mIHdvcmssIHNvIGl0IG11c3Qgbm90IHJlcGVhdCBmb3IgYVxuICAgKiAgY2hhbmdlIHRoYXQgY2Fubm90IGFmZmVjdCB0aGUgZmllbGQuICovXG4gIHByaXZhdGUgZGVuc2l0eUxheWVyczogVm9sdW1lTGF5ZXJbXSA9IFtdO1xuICBwcml2YXRlIGRlbnNpdHlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIGdlbmUgbWFwJ3Mgdm9sdW1lIGxheWVyIGFuZCB0aGUgaW5wdXRzIGl0IHdhcyBjb2xvdXJlZCBmb3IgKGl0cyBmaWVsZCBpcyBjYWNoZWQgaW5cbiAgICogIHRoZSBzZXNzaW9uLCBvbiBhIGNsb2NrIG9mIGl0cyBvd24pLiAqL1xuICBwcml2YXRlIGdlbmVNYXBMYXllcjogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9mZnNldCBhcHBsaWVkIHRvIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzIHRvIHNpdCB0aGVtIGluIHRoZSB2b2x1bWUncyBib3guICovXG4gIHByaXZhdGUgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMF07XG4gIC8qKiBUaGUgYm94IGV2ZXJ5dGhpbmcgc2l0cyBpbiwgYmVmb3JlIHRoZSBaIHN0cmV0Y2gsIGNlbnRyZWQgb24gdGhlIG9yaWdpbiAoc2VlIGVuc3VyZUZyYW1lKS4gKi9cbiAgcHJpdmF0ZSBib3g6IEJveDMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBib3hLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGF4ZXMgZ2l6bW8gb24ge0BsaW5rIGJveH0gYW5kIHRoZSBoYW5kbGUgdGhhdCBzdHJldGNoZXMgaXRzIFogKHNlZSBzZXRaU2NhbGUpLiAqL1xuICBwcml2YXRlIGdpem1vOiBBeGVzM2RHaXptbyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIEVhY2ggdm9sdW1lIGxheWVyJ3Mgb3duIHZveGVsIHNpemUsIGJlZm9yZSB0aGUgWiBzdHJldGNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VWb3hlbHMgPSBuZXcgV2Vha01hcDxWb2x1bWVMYXllciwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdPigpO1xuICAvKipcbiAgICogbmFwYXJpLWpzJ3MgZGVwdGgtYXdhcmUgcGljayBvdmVyIHRoZSBjbG91ZCwgYW5kIHRoZSBwcm9qZWN0aW9uIHRoZSBST0kgc2VsZWN0aW9uIHJlYWRzLiBJdFxuICAgKiBvd25zIHRoZSBjYWNoaW5nIHBvbGljeTogcmUtcHJvamVjdCBsYXppbHksIG9uIHRoZSBmaXJzdCBwaWNrIGFmdGVyIHRoZSBjYW1lcmEsIHRoZSBjYW52YXMgb3JcbiAgICogdGhlIGNsb3VkJ3MgZGF0YSBtb3ZlZCAobmV2ZXIgb24gdGhlIGNhbWVyYSBldmVudCwgc28gYW4gb3JiaXQgZHJhZyBwYXlzIG5vdGhpbmcpLCBpbnRvXG4gICAqIHJldXNlZCBidWZmZXJzLCB3aXRoIGEgc2NyZWVuIGluZGV4IG9uY2UgdGhlIGNsb3VkIGlzIGxhcmdlIGVub3VnaC5cbiAgICovXG4gIHByaXZhdGUgcGlja2VyOiBQb2ludFBpY2tlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBTY2FsZUJhck92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgLyoqIERhdGFzZXQgdGhlIHNjYWxlIGJhciB3YXMgYnVpbHQgZm9yLiAqL1xuICBwcml2YXRlIHNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBkZW5zaXR5IHJhc3RlcmlzYXRpb24gYW5kIHRoZSAzRCBnZW5lLW1hcCBlc3RpbWF0ZSBpbiBmbGlnaHQgKG9mZiB0aGUgbWFpbiB0aHJlYWRcbiAgICogIHBhc3QgdGhlIHdvcmtlciB0aHJlc2hvbGQsIFNQQVRJQUwtMTkpOiBhIG5ldyBrZXkgc3VwZXJzZWRlcyDigJQgYW5kIGFib3J0cyDigJQgdGhlIHByZXZpb3VzXG4gICAqICBvbmU7IGEgcmVidWlsZCB0aGF0IGxlYXZlcyB0aGUga2V5IGFsb25lIGxldHMgaXQgZmluaXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbnNpdHlMb2FkcyA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lTWFwTG9hZHMgPSBuZXcgU3VwZXJzZWRlKCk7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyAoYW4gYXRsYXMncyBzdHJ1Y3R1cmVzLCBpbXBvcnRlZCBvbnRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3MgaW1hZ2VcbiAgICogc3RhY2spLCBkcmF3biBieSB0aGUgc2FtZSB7QGxpbmsgVm9sdW1lUmVnaW9uTWVzaGVzfSBhcyB0aGUgVm9sdW1lIHZpZXcncywgc28gYSBzdHJ1Y3R1cmUgaXMgdGhlXG4gICAqIHNhbWUgc3VyZmFjZSBpbiBib3RoLiBQbGFjZWQgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBib3gsIG9uY2UgaXQgaXMgdGhlcmUgYW5kIHRoZSBpbWFnZSB0aGVcbiAgICogcmVnaW9ucyB3ZXJlIGRyYXduIG9uIGlzIHRoYXQgdm9sdW1lJ3Mgc3RhY2sgKHNlZSB7QGxpbmsgcGxhY2VSZWdpb25NZXNoZXN9KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uTWVzaGVzOiBWb2x1bWVSZWdpb25NZXNoZXM7XG4gIC8qKiBUaGUgdHJhbnNjcmlwdHMgb2YgdGhlIGdlbmVzIHRoZSBUcmFuc2NyaXB0cyBwYW5lbCBkcmF3cywgYXQgdGhlaXIgb3duIHogKHNlZSBTcGF0aWFsM2RUcmFuc2NyaXB0cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNjcmlwdHMzZDogU3BhdGlhbDNkVHJhbnNjcmlwdHM7XG4gIC8qKiBXaGV0aGVyIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGxldHMgZXZlcnkgcmVnaW9uIHN1cmZhY2UgdGhyb3VnaCAoc2VlIHNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zVGhyb3VnaCA9IGZhbHNlO1xuICAvKipcbiAgICogRWFjaCBzbGljZSdzIHosIGluIHRoZSBvYnNlcnZhdGlvbnMnIHVuaXRzLCBvZiB0aGUgcmVnaW9uIHNldCB0aGUgc3VyZmFjZXMgYXJlIGJ1aWx0IGZyb20gd2hlblxuICAgKiBpdCBzYXlzIHdoZXJlIGl0cyBzbGljZXMgYXJlIChhIDNEIHNlZ21lbnRhdGlvbidzIHBsYW5lcywgc2VlIHNldFJlZ2lvblBsYW5lcyk7IGVsc2UgbnVsbC5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uUGxhbmVzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHN0b3JlJ3MgaW52ZXJ0IHNldHRpbmcsIHdoaWNoIHRoZSBkZW5zaXR5IHZvbHVtZXMgZm9sbG93IChubyBvdGhlciBzdWJzY3JpcHRpb24gb2ZcbiAgICogIHRoaXMgc2NlbmUgY2FycmllcyBpdCkuICovXG4gIHByaXZhdGUgaW52ZXJ0U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIGluZm8gdGhlIGltYWdlIHBsb3R0ZWQgd2l0aCB0aGUgY2xvdWQ6IHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgc3RhY2sgKHRoZSAyRCB2aWV3J3NcbiAgICogICAgICAgIGltYWdlLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGEgdm9sdW1lLCB3aGljaCB0aGUgcmVnaW9ucyBhcmUgb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGN0eDogU2NlbmVDb250ZXh0LFxuICAgIHNlc3Npb246IFNwYXRpYWxTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5mbz86IElJbWFnZUluZm8sXG4gICkge1xuICAgIHN1cGVyKGN0eCwgc2Vzc2lvbiwgdHJ1ZSk7XG4gICAgLy8gUGxhY2VkIGluIHRoZSBjZWxscycgd29ya2VyOiBwbGFjaW5nIGV2ZXJ5IGNsYXNzJ3MgdmVydGljZXMgaGVyZSBoZWxkIHRoZSBVSSBmb3Igc2Vjb25kcy5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcyA9IG5ldyBWb2x1bWVSZWdpb25NZXNoZXMoY3R4LnZpZXdlciwgKHYsIGYpID0+IHBsYWNlSW5Xb3JrZXIodiwgZikpO1xuICAgIHRoaXMudHJhbnNjcmlwdHMzZCA9IG5ldyBTcGF0aWFsM2RUcmFuc2NyaXB0cyhjdHgudmlld2VyLCAobWVzc2FnZSkgPT4gY3R4LmJhZGdlLmJlZ2luVGFzayhtZXNzYWdlKSk7XG4gICAgdGhpcy5jZWxsczNkID0gbmV3IFNwYXRpYWwzZENlbGxzKHtcbiAgICAgIHZpZXdlcjogY3R4LnZpZXdlcixcbiAgICAgIHBvcnQ6IHNlc3Npb24ucG9ydCxcbiAgICAgIGJlZ2luVGFzazogKGxhYmVsKSA9PiBjdHguYmFkZ2UuYmVnaW4obGFiZWwpLFxuICAgICAgc3RhdHVzOiAoc3RhdHVzKSA9PiBzZXNzaW9uLnJlcG9ydENlbGxzM2Qoc3RhdHVzKSxcbiAgICB9KTtcbiAgICB0aGlzLmNlbGxMb29rdXAgPSBzZXNzaW9uLnBvcnQgPyBuZXcgQ2F0ZWdvcmljYWxMb29rdXAoc2Vzc2lvbi5wb3J0KSA6IG51bGw7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbiBzZXQncyBjbGFzc2VzIGRyYXduIGFzIGluZGl2aWR1YWwgY2VsbHMgKG5vbmU6IHRoZSBjbGFzcyBzdXJmYWNlcyBvbmx5KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjZWxsczNkOiBTcGF0aWFsM2RDZWxscztcbiAgcHJpdmF0ZSByZWFkb25seSBjZWxsTG9va3VwOiBDYXRlZ29yaWNhbExvb2t1cCB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2VsbFdpbmRvd3MgPSBuZXcgQ29udHJhc3RXaW5kb3dDYWNoZSgpO1xuICBwcml2YXRlIGNlbGxDbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogV2hhdCB0aGUgY2VsbHMgd2VyZSBsYXN0IGNvbG91cmVkIGZvciwgc28gYSByZWJ1aWxkIHRoYXQgY2hhbmdlZCBub25lIG9mIGl0IHJlY29sb3VycyBub3RoaW5nLiAqL1xuICBwcml2YXRlIGNlbGxTdHlsZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2VsbFN0eWxlUmVxdWVzdCA9IDA7XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlc2UgY2xhc3NlcyBvZiB0aGUgZGF0YXNldCdzIHJlZ2lvbiBzZXQgYXMgaW5kaXZpZHVhbCBjZWxscywgZWFjaCBpdHMgb3duIHN1cmZhY2UgaW5cbiAgICogdGhlIHBhbmVsJ3MgQ2VsbCBDb2xvciAoc2VlIFNwYXRpYWwzZENlbGxzKTsgbm9uZTogbm8gY2VsbHMuXG4gICAqL1xuICBzZXRSZWdpb25DZWxscyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxDbGFzc2VzID0gY2xhc3Nlcz8ubGVuZ3RoID8gY2xhc3NlcyA6IG51bGw7XG4gICAgdGhpcy5jZWxsczNkLnNldENsYXNzZXModGhpcy5jZWxsQ2xhc3NlcyA/IG5ldyBTZXQodGhpcy5jZWxsQ2xhc3NlcykgOiBudWxsKTtcbiAgICB0aGlzLmNlbGxTdHlsZUtleSA9IG51bGw7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5zZXNzaW9uLmxhdGVzdDtcbiAgICBpZiAobGF0ZXN0Py5bMF0pIHZvaWQgdGhpcy5zdHlsZUNlbGxzKGxhdGVzdFswXSwgbGF0ZXN0WzFdLCBsYXRlc3RbMl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjZWxscycgY29sb3VycyAodGhlIHBhbmVsJ3MgQ2VsbCBDb2xvciwgaXRzIHNlbGVjdGlvbiBtdXRpbmcpLCB3aGljaCBhcmUgc2hvd24gKGl0cyBncm91cHNcbiAgICogc3dpdGNoZWQgb2ZmIGFuZCBnZW5lIGZpbHRlciBoaWRlIHRoZWlyczsgdGhlIENlbGxzIHN3aXRjaCBhbGwpLCBhbmQgdGhlaXIgb3BhY2l0eS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3R5bGVDZWxscyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2VsbHMzZC5zZXREYXRhc2V0KGRhdGFzZXQpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICBpZiAoIXRoaXMuY2VsbENsYXNzZXMgfHwgIXBvcnQgfHwgIXRoaXMuY2VsbExvb2t1cCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9XG4gICAgICBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIGRhdGFzZXQuaWQsXG4gICAgICAgIHZpZXcuY2VsbENvbG9yTW9kZSxcbiAgICAgICAgdmlldy5jZWxsQ29sb3JHZW5lLFxuICAgICAgICB2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5IDogbnVsbCxcbiAgICAgICAgdmlldy5jZWxsU2luZ2xlQ29sb3IsXG4gICAgICAgIHZpZXcuY2VsbFR5cGVDb2x1bW4sXG4gICAgICAgIHZpZXcubG9nU2NhbGUsXG4gICAgICAgIHZpZXcucGVyY2VudGlsZUNsaXAsXG4gICAgICAgIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICAgICB2aWV3Lmdyb3VwQ29sb3JzLFxuICAgICAgICB2aWV3LmhpZGRlbkdyb3VwcyxcbiAgICAgICAgdmlldy5zaG93Q2VsbHMsXG4gICAgICAgIHZpZXcuY2VsbE9wYWNpdHksXG4gICAgICAgIGdlbmVGaWx0ZXJLZXkodmlldyksXG4gICAgICAgIHRoaXMuY3R4LmRpc3BsYXkuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgXSkgKyBgfCR7c2VsZWN0aW9uLmNvdW50fXwke3RoaXMuY2VsbFNlbGVjdGlvblJldihzZWxlY3Rpb24pfWA7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5jZWxsU3R5bGVLZXkpIHJldHVybjtcbiAgICB0aGlzLmNlbGxTdHlsZUtleSA9IGtleTtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLmNlbGxTdHlsZVJlcXVlc3Q7XG4gICAgY29uc3QgY291bnQgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXJzID0gVWludDMyQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IGkpO1xuICAgICAgY29uc3QgW2NvbG9ycywgaGlkZGVuXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY2VsbENvbG9yc0ZvcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgbG9va3VwOiB0aGlzLmNlbGxMb29rdXAsXG4gICAgICAgICAgICBjb250cmFzdFdpbmRvd3M6IHRoaXMuY2VsbFdpbmRvd3MsXG4gICAgICAgICAgICBjb250aW51b3VzTHV0OiAodikgPT4gdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHYpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGF0YXNldCxcbiAgICAgICAgICB2aWV3LFxuICAgICAgICAgIC8vIENvbG91cnMgYXMgdGhleSBhcmU6IGEgc2VsZWN0aW9uIGZhZGVzIHdoYXQgaXQgbGVhdmVzIG91dCAoc2VlIFNwYXRpYWwzZENlbGxzKSwgbm90IGdyZXkuXG4gICAgICAgICAgZW1wdHlTZWxlY3Rpb24oY291bnQpLFxuICAgICAgICAgIG93bmVycyxcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5jZWxsTG9va3VwLmhpZGRlbkNvZGVzKGRhdGFzZXQsIHZpZXcpLFxuICAgICAgXSk7XG4gICAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5jZWxsU3R5bGVSZXF1ZXN0KSByZXR1cm47XG4gICAgICBsZXQgdmlzaWJsZTogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHZpZXcuc2hvd0NlbGxzID09PSBmYWxzZSkge1xuICAgICAgICB2aXNpYmxlID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xuICAgICAgfSBlbHNlIGlmIChoaWRkZW4pIHtcbiAgICAgICAgdmlzaWJsZSA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGhpZGRlbi5jb2Rlc1tpXTtcbiAgICAgICAgICB2aXNpYmxlW2ldID0gYyAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjXSA/IDAgOiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNlbGxzM2Quc2V0U3R5bGUoXG4gICAgICAgIGNlbGxDb2xvcnNSZ2JhKGNvbG9ycywgY291bnQpLFxuICAgICAgICB2aXNpYmxlLFxuICAgICAgICB2aWV3LmNlbGxPcGFjaXR5ID8/IDEsXG4gICAgICAgIHNlbGVjdGlvbi5jb3VudCA/IHNlbGVjdGlvbi5tYXNrIDogbnVsbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAocmVxdWVzdCA9PT0gdGhpcy5jZWxsU3R5bGVSZXF1ZXN0KSB0aGlzLmNlbGxTdHlsZUtleSA9IG51bGw7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRoZSAzRCBjZWxscyBjb3VsZCBub3QgYmUgY29sb3VyZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGFzdENlbGxTZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2VsbFNlbGVjdGlvbkNvdW50ID0gMDtcbiAgcHJpdmF0ZSBjZWxsU2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdENlbGxTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdENlbGxTZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICB0aGlzLmNlbGxTZWxlY3Rpb25Db3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jZWxsU2VsZWN0aW9uQ291bnQ7XG4gIH1cblxuICAvKiogU2hvdyB0aGVzZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHdpdGggdGhlIGNsb3VkIChyZXBsYWNpbmcgdGhlIG9uZXMgc2hvd24pLiAqL1xuICBzZXRSZWdpb25NZXNoZXMobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldChtZXNoZXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgc2V0UmVnaW9uSGlkZGVuKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0SGlkZGVuKGtleXMpO1xuICAgIC8vIEEgc3VyZmFjZSdzIGtleSBpcyBpdHMgY2xhc3MncyBuYW1lOiBhIGhpZGRlbiBjbGFzcydzIGNlbGxzIGFyZSBoaWRkZW4gdG9vLlxuICAgIHRoaXMuY2VsbHMzZC5zZXRIaWRkZW5DbGFzc2VzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSByZWdpb24gc2V0J3Mgc2xpY2VzIGFyZSwgaW4gdGhlIG9ic2VydmF0aW9ucycgdW5pdHMgKG51bGw6IHRoZXkgYXJlIHRoZSBwbG90dGVkXG4gICAqIHN0YWNrJ3Mgc2xpY2VzKTogaXRzIHN1cmZhY2VzIHRoZW4gc2l0IGF0IHRoZWlyIHBsYW5lcyBhbW9uZyB0aGUgb2JzZXJ2YXRpb25zIChzZWVcbiAgICogcGxhY2VSZWdpb25NZXNoZXMpLCBvbiBhbiBpbWFnZSBvZiBvbmUgcGxhbmUgdG9vLlxuICAgKi9cbiAgc2V0UmVnaW9uUGxhbmVzKHo6IHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNhbWUgPVxuICAgICAgeiA9PT0gdGhpcy5yZWdpb25QbGFuZXMgfHxcbiAgICAgICghIXogJiZcbiAgICAgICAgISF0aGlzLnJlZ2lvblBsYW5lcyAmJlxuICAgICAgICB6Lmxlbmd0aCA9PT0gdGhpcy5yZWdpb25QbGFuZXMubGVuZ3RoICYmXG4gICAgICAgIHouZXZlcnkoKHYsIGkpID0+IHYgPT09IHRoaXMucmVnaW9uUGxhbmVzPy5baV0pKTtcbiAgICBpZiAoc2FtZSkgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9uUGxhbmVzID0gej8ubGVuZ3RoID8gWy4uLnpdIDogbnVsbDtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLnNlc3Npb24ubGF0ZXN0O1xuICAgIGNvbnN0IGRhdGFzZXQgPSBsYXRlc3Q/LlswXTtcbiAgICBpZiAoZGF0YXNldCkgdGhpcy5wbGFjZVJlZ2lvbk1lc2hlcyhkYXRhc2V0KTtcbiAgICAvLyBUaGUgY2VsbHMgc3RhbmQgaW4gZm9yIHRoZSBtYXJrZXJzIG9ubHkgd2hpbGUgdGhlIHNldCBpcyBwbGFjZWQuXG4gICAgaWYgKGRhdGFzZXQgJiYgbGF0ZXN0Py5bMV0pIHtcbiAgICAgIHRoaXMuc2hvd1BvaW50c0FzQXNrZWQoZGF0YXNldCwgbGF0ZXN0WzFdKTtcbiAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFzIHRoZSBWb2x1bWUgdmlldzogdGhlIHJlZmVyZW5jZSB2b2x1bWUgaGlkZXMgdGhlIHN1cmZhY2VzIGJlaGluZCB3aGF0IGl0IHNob3dzLCBvciBub25lLiAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaCA9IHRocm91Z2g7XG4gICAgaWYgKHRoaXMudm9sdW1lKSB0aGlzLnZvbHVtZS5ibGVuZGluZyA9IHRocm91Z2ggPyAndHJhbnNsdWNlbnRfbm9fZGVwdGgnIDogJ3RyYW5zbHVjZW50JztcbiAgICB0aGlzLmN0eC52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYWNlIHRoZSByZWdpb24gc3VyZmFjZXMgaW4gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBib3gsIGFzIHRoZSBWb2x1bWUgdmlldyBwbGFjZXMgdGhlbSBpbiBpdHNcbiAgICogb3duOiBpbWFnZSBwaXhlbCAoeCwgeSkgaXMgdm94ZWwgKHgsIHkpLCBzbGljZSBrIGlzIHZveGVsIHBsYW5lIGssIGFuZCB0aGUgYm94IGlzIHRoZSB2b2x1bWUnc1xuICAgKiB2b3hlbHMgdGltZXMgaXRzIHZveGVsIHNpemUsIGNlbnRyZWQgb24gdGhlIG9yaWdpbiBhcyBuYXBhcmkgY2VudHJlcyB0aGUgdm9sdW1lIChhbmQgdGhlIGNsb3VkXG4gICAqIGlzIG9mZnNldCB0byBzaXQgaW4gaXQpLiBPbmx5IHdoZW4gdGhlIHBsb3R0ZWQgaW1hZ2UgSVMgdGhhdCB2b2x1bWUncyBzdGFjazogcmVnaW9ucyBkcmF3biBvblxuICAgKiBhbm90aGVyIGltYWdlIChhIHRpc3N1ZSBpbWFnZSkgaGF2ZSBubyBwbGFjZSBpbiBpdCwgYW5kIGFyZSBub3Qgc2hvd24gLSBub3IgYXJlIHN1cmZhY2VzXG4gICAqIHBsYWNlZCBpbiBhIHZvbHVtZSB0aGlzIG9uZSByZXBsYWNlZC5cbiAgICpcbiAgICogVW5sZXNzIHRoZSByZWdpb24gc2V0IHNheXMgd2hlcmUgaXRzIHNsaWNlcyBhcmUgKHtAbGluayBzZXRSZWdpb25QbGFuZXN9OiBhIDNEIHNlZ21lbnRhdGlvbidzXG4gICAqIHBsYW5lcykgYW5kIHRoZSBwbG90dGVkIGltYWdlIGlzIHRoZSBkYXRhc2V0J3Mgb3duIChgaW1hZ2VSZWZgKTogaW1hZ2UgcGl4ZWxzIGFyZSB0aGVuIHRha2VuXG4gICAqIGJhY2sgdG8gdGhlIG9ic2VydmF0aW9ucycgdW5pdHMgdGhyb3VnaCBgaW1hZ2VSZWZgLCBzbGljZSBrIHRvIGl0cyBwbGFuZSdzIHosIGFuZCBib3RoIG1vdmVkXG4gICAqIGJ5IHRoZSBvZmZzZXQgdGhlIGNsb3VkIGlzLCBzbyBlYWNoIGNlbGwncyBzdXJmYWNlIHNpdHMgYXJvdW5kIGl0cyBvYnNlcnZhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB2b2lkIHtcbiAgICAvLyBUaGUgaW5kaXZpZHVhbCBjZWxscyBzaXQgd2hlcmUgdGhlIHJlZ2lvbiBzZXQncyBwbGFuZXMgYXJlLCBhcyBpdHMgY2xhc3Mgc3VyZmFjZXMgZG8uXG4gICAgdGhpcy5jZWxsczNkLnNldFBsYWNlbWVudCh0aGlzLnBsYW5lUGxhY2VtZW50KGRhdGFzZXQpLCB0aGlzLnpTY2FsZSgpKTtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgaWYgKCFtZXRhIHx8ICF0aGlzLmlzVm9sdW1lU3RhY2sobWV0YSkpIHtcbiAgICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVQbGFjZW1lbnQoZGF0YXNldCk7XG4gICAgICBpZiAocGxhbmVzKSB7XG4gICAgICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldEZyYW1lKHtcbiAgICAgICAgICBzaXplOiBbMSwgMSwgcGxhbmVzLnoubGVuZ3RoXSxcbiAgICAgICAgICB3b3JsZDogWzEsIDEsIDFdLFxuICAgICAgICAgIHpTY2FsZTogdGhpcy56U2NhbGUoKSxcbiAgICAgICAgICBwbGFuZXMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5zZXRGcmFtZSh7XG4gICAgICBzaXplOiBbbWV0YS53aWR0aCwgbWV0YS5oZWlnaHQsIG1ldGEuZGVwdGhdLFxuICAgICAgd29ybGQ6IFttZXRhLndpZHRoICogdngsIG1ldGEuaGVpZ2h0ICogdnksIG1ldGEuZGVwdGggKiB2eiAqIHRoaXMuelNjYWxlKCldLFxuICAgICAgelNjYWxlOiB0aGlzLnpTY2FsZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIHRoZSBzdXJmYWNlcyBzaXQgaW46IDEsIHRoZSByZWZlcmVuY2Ugdm9sdW1lIGJlaW5nIHRoZSBzdGFjaydzXG4gICAqIG93biB2b3hlbHMsIGFzIHRoZSBWb2x1bWUgdmlldydzIGlzIGF0IGZ1bGwgcmVzb2x1dGlvbiwgc28gYm90aCByZWNvbnN0cnVjdCBhIGNsYXNzIGFsaWtlIChhbmRcbiAgICogc2hhcmUgaXRzIGNhY2hlZCBzdXJmYWNlKS4gTnVsbCB3aGlsZSB0aGVyZSBpcyBubyB2b2x1bWUgc3RhY2sgdG8gcGxhY2UgdGhlbSBpbi5cbiAgICovXG4gIHZveGVsU3RlcCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdO1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0Py52b2x1bWU7XG4gICAgaWYgKHRoaXMudm9sdW1lICYmIG1ldGEgJiYgdGhpcy5pc1ZvbHVtZVN0YWNrKG1ldGEpKSByZXR1cm4gMTtcbiAgICAvLyBBIHJlZ2lvbiBzZXQncyBwbGFuZXMgb3ZlciB0aGUgZGF0YXNldCdzIGltYWdlOiBjZWxscyBhIGZldyBtaWNyb25zIGFjcm9zcywgc28gYSBzdGVwIHRoYXRcbiAgICAvLyBrZWVwcyBldmVyeSBjZWxsIHNldmVyYWwgdm94ZWxzIHdpZGUgd2hpbGUgYSBjbGFzcydzIG1hc2sgb3ZlciB0aGUgdGlzc3VlIHN0YXlzIHNtYWxsLlxuICAgIGlmIChkYXRhc2V0ICYmIHRoaXMucGxhbmVQbGFjZW1lbnQoZGF0YXNldCkpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pbmZvPy50cnVlSW1hZ2VTaXplPy5bMF0gPz8gMDtcbiAgICAgIHJldHVybiBNYXRoLm1heCgxLCB3aWR0aCAvIFJFR0lPTl9QTEFORVNfVk9YRUxTKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgdGhlIHJlZ2lvbiBzZXQncyBzbGljZXMgZ28gKHNlZSBwbGFjZVJlZ2lvbk1lc2hlcyk6IG9ubHkgd2l0aCB0aGVpciBwbGFuZXMga25vd24sIG9uIHRoZVxuICAgKiBkYXRhc2V0J3Mgb3duIGltYWdlIChvbmUgd2l0aCBhbiBgaW1hZ2VSZWZgLCBub3QgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBzdGFjayksIG9uY2UgdGhlIGJveFxuICAgKiB0aGUgY2xvdWQgaXMgb2Zmc2V0IGludG8gaXMgdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIHBsYW5lUGxhY2VtZW50KGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0KTogUGxhbmVQbGFjZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB6ID0gdGhpcy5yZWdpb25QbGFuZXM7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBpZiAoIXo/Lmxlbmd0aCB8fCAhcmVmIHx8ICF0aGlzLmluZm8gfHwgIXRoaXMuYm94KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbc3gsIHN5XSA9IHJlZi5zY2FsZSA/PyBbMSwgMV07XG4gICAgY29uc3QgW3R4LCB0eV0gPSByZWYudHJhbnNsYXRlID8/IFswLCAwXTtcbiAgICBpZiAoIXN4IHx8ICFzeSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5vcmlnaW47XG4gICAgcmV0dXJuIHsgeiwgc2NhbGU6IFsxIC8gc3gsIDEgLyBzeV0sIG9mZnNldDogW294IC0gdHggLyBzeCwgb3kgLSB0eSAvIHN5LCBvel0gfTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBwbG90dGVkIGltYWdlIGlzIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgc3RhY2s6IGl0cyBzaXplIGFuZCBzbGljZSBjb3VudC4gKi9cbiAgcHJpdmF0ZSBpc1ZvbHVtZVN0YWNrKG1ldGE6IE5vbk51bGxhYmxlPFNwYXRpYWxEYXRhc2V0Wyd2b2x1bWUnXT4pOiBib29sZWFuIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5pbmZvO1xuICAgIGNvbnN0IFt3LCBoXSA9IGluZm8/LnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIHJldHVybiAhIWluZm8/LmlzU3RhY2sgJiYgdyA9PT0gbWV0YS53aWR0aCAmJiBoID09PSBtZXRhLmhlaWdodCAmJiAoaW5mby51cmxzPy5sZW5ndGggPz8gMCkgPT09IG1ldGEuZGVwdGg7XG4gIH1cblxuICBhc3luYyBtb3VudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCZWZvcmUgdGhlIHNwYXRpYWwgc3Vic2NyaXB0aW9uLCBzbyB0aGUgZmlyc3QgYnVpbGQgYWxyZWFkeSByZWFkcyB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICB0aGlzLmludmVydFN1YiA9IHRoaXMuY3R4LmRpc3BsYXkud2F0Y2hJbnZlcnQoKGludmVydCkgPT4ge1xuICAgICAgLy8gQSBsaXZlIHNldHRlcjogdGhlIHZvbHVtZXMgcmVzdHlsZSwgbm90aGluZyBpcyByYXN0ZXJpc2VkIGFnYWluLlxuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmRlbnNpdHlMYXllcnMpIGxheWVyLmludmVydCA9IGludmVydDtcbiAgICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jdHgudG9vbHMuaW5zdGFsbDNkSW50ZXJhY3Rpb24odGhpcy5jdHgudmlld2VyLCB0aGlzLmN0eC5ob3N0KTtcbiAgICAvLyBab29tZWQgY2xvc2UsIHRoZSB3aG9sZSBzZWN0aW9uIHN0YXlzIGRyYXduIChuYXBhcmktanMncyBmYXIgcGxhbmUgZm9sbG93cyB0aGUgZGlzdGFuY2UpLlxuICAgIHRoaXMucmVzdG9yZURlcHRoID0ga2VlcFNjZW5lSW5EZXB0aCh0aGlzLmN0eC52aWV3ZXIuY2FtZXJhM2QsICgpID0+XG4gICAgICB0aGlzLmJveCA/IGJveFJhZGl1cyh0aGlzLmJveC53aWR0aCwgdGhpcy5ib3guaGVpZ2h0LCB0aGlzLmJveC5kZXB0aCAqIHRoaXMuelNjYWxlKCkpIDogbnVsbCxcbiAgICApO1xuICAgIHRoaXMuaG92ZXIuaW5zdGFsbCh0aGlzLmN0eC5ob3N0KTtcbiAgICB0aGlzLmxpc3RlblRvUmVnaW9uTWVzaGVzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gIH1cblxuICAvKipcbiAgICogUGlja2luZyB0aGUgcmVnaW9uIHN1cmZhY2VzIChhIGNlbGwgdHlwZSdzLCBieSB0eXBlKSwgYXMgdGhlIFZvbHVtZSB2aWV3IGRvZXM6IHdpdGggdGhlIHNlbGVjdGlvblxuICAgKiB0b29sIGFybWVkLCBhIGNsaWNrIG9uIG9uZSBwaWNrcyBpdHMgY2xhc3MgKG51bGwgYmVzaWRlIHRoZW0pLCBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IgaGlnaGxpZ2h0c1xuICAgKiBpdCwgdGhlIG90aGVycyBmYWRpbmcuIEhvdmVyaW5nIGlzIHRoZSBzcGF0aWFsIHRvb2x0aXAncyAodGhlIHR5cGUgYW5kIGl0cyBjZWxscykuXG4gICAqL1xuICBwcml2YXRlIGxpc3RlblRvUmVnaW9uTWVzaGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLm1lc2hQb2ludGVyKSByZXR1cm47XG4gICAgdGhpcy50b29sU3ViID0gY3R4LnN0b3JlLmdldEFjdGl2ZVRvb2wkKCkuc3Vic2NyaWJlKCh0b29sKSA9PiAodGhpcy5zZWxlY3RpbmcgPSB0b29sID09PSAnc2VsZWN0JykpO1xuICAgIHRoaXMubWVzaFBvaW50ZXIgPSBjdHgub3V0c2lkZVpvbmUoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUmVnaW9uTWVzaFBvaW50ZXIoY3R4LmNhbnZhcywgY3R4Lmhvc3QsIHtcbiAgICAgICAgICBwaWNrQXQ6ICh4LCB5KSA9PiB0aGlzLnJlZ2lvbk1lc2hlcy5waWNrQXQoeCwgeSksXG4gICAgICAgICAgYWN0aXZlOiAoKSA9PiB0aGlzLnNlbGVjdGluZyAmJiB0aGlzLnJlZ2lvbk1lc2hlcy5zaG93bi5sZW5ndGggPiAwLFxuICAgICAgICAgIGhvdmVyYWJsZTogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgb25QaWNrOiAoa2V5LCBhZGRpdGl2ZSkgPT4gY3R4LmluWm9uZSgoKSA9PiBjdHgucmVnaW9uTWVzaFBpY2tlZChrZXksIGFkZGl0aXZlKSksXG4gICAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBtZXNoUG9pbnRlcjogUmVnaW9uTWVzaFBvaW50ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEdpdmVzIHRoZSBjYW1lcmEgYmFjayBuYXBhcmktanMncyBvd24gZGVwdGggcmFuZ2UgKHNlZSBrZWVwU2NlbmVJbkRlcHRoKS4gKi9cbiAgcHJpdmF0ZSByZXN0b3JlRGVwdGg6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRvb2xTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbGVjdGluZyA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgb2JzZXJ2YXRpb25zJyBvd24geiBpcyBvbiBzY3JlZW46IHRoZXJlIGlzIG5vIHBsYW5lIHRvIHN0ZXAuICovXG4gIHNldFooKTogdm9pZCB7XG4gICAgLyogbm90aGluZyB0byBzdGVwICovXG4gIH1cblxuICAvKiogQSBjbG91ZCBoYXMgbm8gaW50ZW5zaXR5IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGhpc3RvZ3JhbSBwYW5lLiAqL1xuICBoaXN0b2dyYW0oKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSB0b29sYmFyJ3MgM0QgY29udHJvbHMsIGFzIHRoZSBWb2x1bWUgdmlldydzOiBkcmFnIG1vZGUsIHJlLWZyYW1pbmcgYW5kIHRoZSBheGVzLiAqL1xuICBzdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gc3VyZmFjZTNkQ29udHJvbHModGhpcy5jdHgsICgpID0+IHRoaXMuZ2l6bW8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmV0Y2ggWiBieSBgZmFjdG9yYCAoMSA9IHRoZSBkYXRhJ3MgdHJ1ZSBwcm9wb3J0aW9ucyksIGFzIHRoZSBaIGhhbmRsZSBkcmFncyBpdDogdGhlIGNsb3VkXG4gICAqIHRocm91Z2ggaXRzIGBzY2FsZTNkYCwgZWFjaCB2b2x1bWUgdGhyb3VnaCBpdHMgdm94ZWwgc2l6ZSwgdGhlIGF4ZXMgYW5kIHRoZSByZWdpb24gc3VyZmFjZXNcbiAgICogd2l0aCB0aGVtIOKAlCBhbGwgYWJvdXQgdGhlIHdvcmxkIG9yaWdpbiwgd2hpY2ggdGhlIGJveCBpcyBjZW50cmVkIG9uLCBzbyB0aGV5IHN0YXkgYWxpZ25lZC5cbiAgICogTm90aGluZyBpcyByZS11cGxvYWRlZC4gS2VwdCBpbiB0aGUgc2V0dGluZ3MsIHNvIGEgcmUtcGxvdCBrZWVwcyBpdC5cbiAgICovXG4gIHNldFpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1heCA9IHRoaXMuYm94ID8gc3BhdGlhbFpTY2FsZU1heCh0aGlzLmJveCkgOiBTUEFUSUFMX1pfU0NBTEVfTUFYO1xuICAgIHRoaXMuY3R4LnNldHRpbmdzLnNwYXRpYWxaU2NhbGUgPSBNYXRoLm1pbihtYXgsIE1hdGgubWF4KFNQQVRJQUxfWl9TQ0FMRV9NSU4sIGZhY3RvcikpO1xuICAgIHRoaXMuYXBwbHlaU2NhbGUoKTtcbiAgfVxuXG4gIC8qKiBUaGUgWiBzdHJldGNoIGluIGVmZmVjdDogdGhlIHNldHRpbmcsIHdpdGhpbiB3aGF0IHRoaXMgYm94IGFsbG93cy4gKi9cbiAgelNjYWxlKCk6IG51bWJlciB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5ib3ggPyBzcGF0aWFsWlNjYWxlTWF4KHRoaXMuYm94KSA6IFNQQVRJQUxfWl9TQ0FMRV9NQVg7XG4gICAgY29uc3QgcyA9IHRoaXMuY3R4LnNldHRpbmdzLnNwYXRpYWxaU2NhbGU7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgoU1BBVElBTF9aX1NDQUxFX01JTiwgcyA+IDAgPyBzIDogMSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVpTY2FsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzID0gdGhpcy56U2NhbGUoKTtcbiAgICBpZiAodGhpcy5wb2ludHMpIHRoaXMucG9pbnRzLnNjYWxlM2QgPSBbMSwgMSwgc107XG4gICAgdGhpcy50cmFuc2NyaXB0czNkLnNldFpTY2FsZShzKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFt0aGlzLnZvbHVtZSwgdGhpcy5nZW5lTWFwTGF5ZXIsIC4uLnRoaXMuZGVuc2l0eUxheWVyc10pIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBsYXllciAmJiB0aGlzLmJhc2VWb3hlbHMuZ2V0KGxheWVyKTtcbiAgICAgIGlmIChsYXllciAmJiBiYXNlKSBsYXllci52b3hlbFNpemUgPSBbYmFzZVswXSwgYmFzZVsxXSwgYmFzZVsyXSAqIHNdO1xuICAgIH1cbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zZXNzaW9uLmxhdGVzdD8uWzBdO1xuICAgIGlmICh0aGlzLmdpem1vICYmIHRoaXMuYm94KSB7XG4gICAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd25Cb3godGhpcy5ib3gpO1xuICAgICAgdGhpcy5naXptby5zZXREZXB0aChkcmF3bi5kZXB0aCwgc3BhdGlhbEF4ZXNMYWJlbHMoZHJhd24sIHMsIGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0KSk7XG4gICAgfVxuICAgIHRoaXMuekhhbmRsZT8ucmVwb3NpdGlvbigpO1xuICAgIGlmIChkYXRhc2V0KSB0aGlzLnBsYWNlUmVnaW9uTWVzaGVzKGRhdGFzZXQpO1xuICAgIHRoaXMuY3R4LnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogYGJveGAgd2l0aCBpdHMgWiBzdHJldGNoZWQgYXMgZHJhd24uICovXG4gIHByaXZhdGUgZHJhd25Cb3goYm94OiBCb3gzKTogQm94MyB7XG4gICAgcmV0dXJuIHsgd2lkdGg6IGJveC53aWR0aCwgaGVpZ2h0OiBib3guaGVpZ2h0LCBkZXB0aDogYm94LmRlcHRoICogdGhpcy56U2NhbGUoKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHZvbHVtZSBsYXllciB3aXRoIGl0cyBaIHN0cmV0Y2hlZCBhcyB0aGUgcmVzdCBvZiB0aGUgc2NlbmUgaXMsIHJlbWVtYmVyaW5nIGl0cyBvd25cbiAgICogdm94ZWwgc2l6ZSBzbyBhIGxhdGVyIHN0cmV0Y2ggY2FuIGJlIGFwcGxpZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFkZFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhOiBVaW50OEFycmF5LFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGVwdGg6IG51bWJlcixcbiAgICBvcHRzOiBQYXJhbWV0ZXJzPFZpZXdlclsnYWRkVm9sdW1lJ10+WzRdICYgeyB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9LFxuICApOiBWb2x1bWVMYXllciB7XG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gb3B0cy52b3hlbFNpemU7XG4gICAgY29uc3QgbGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgdm94ZWxTaXplOiBbdngsIHZ5LCB2eiAqIHRoaXMuelNjYWxlKCldLFxuICAgIH0pO1xuICAgIHRoaXMuYmFzZVZveGVscy5zZXQobGF5ZXIsIFt2eCwgdnksIHZ6XSk7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IG9ic2VydmF0aW9uJ3MgcG9zaXRpb24gb24gdGhlIGNhbnZhcyB1bmRlciB0aGUgY3VycmVudCAzRCBjYW1lcmEgKGZvciB0aGUgUk9JXG4gICAqIHNlbGVjdGlvbiksIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24gd2l0aCBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gTnVsbCBiZWZvcmUgdGhlIGNsb3VkXG4gICAqIGlzIGJ1aWx0LlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpcyB0aGUgcGlja2VyJ3MgKHNlZSB7QGxpbmsgcGlja2VyfSk7IHdoYXQgaXMgbGVmdCBpcyB0aGUgcGFydCB0aGF0IGlzXG4gICAqIGdlbnVpbmVseSB0aGlzIGFkYXB0ZXInczogU0NBVFRFUklORyB0aGUgZHJhd24gc3Vic2V0IGJhY2sgaW50byBvYnNlcnZhdGlvbiBvcmRlci4gVGhlIGNsb3VkXG4gICAqIGhvbGRzIG9ubHkgdGhlIHBvaW50cyBvZiB0aGUgZGlzcGxheWVkIHNlY3Rpb24sIGluIGl0cyBvd24gcGFja2luZzsgZXZlcnkgY29uc3VtZXIgaW5kZXhlcyBieVxuICAgKiBvYnNlcnZhdGlvbi4gTmFOIHN0YW5kcyBmb3IgXCJub3Qgb24gc2NyZWVuXCIsIHdoaWNoIGlzIGFsc28gdGhlIHJpZ2h0IGFuc3dlciBmb3IgYW5cbiAgICogb2JzZXJ2YXRpb24gd2hvc2Ugc2VjdGlvbiBpcyBoaWRkZW4uXG4gICAqL1xuICBzY3JlZW5Qcm9qZWN0aW9uKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHByb2plY3RlZCA9IHRoaXMucGlja2VyPy5wcm9qZWN0ZWQoKTtcbiAgICBpZiAoIXByb2plY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZHJhd24gPSB0aGlzLmRyYXduO1xuICAgIGNvbnN0IHsgc2NyZWVuIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBpZiAoaSA+PSBvYnMuY291bnQpIGNvbnRpbnVlO1xuICAgICAgb3V0W2kgKiAyXSA9IHNjcmVlbltrICogMl07XG4gICAgICBvdXRbaSAqIDIgKyAxXSA9IHNjcmVlbltrICogMiArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSByZWdpb24gc3VyZmFjZSAoYSBjbGFzcykgdW5kZXIgYSBjbGllbnQgcG9zaXRpb24sIG9yIG51bGwuICovXG4gIG92ZXJyaWRlIHBpY2tSZWdpb24oY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IGtleTogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuY3R4LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtZXNoID0gdGhpcy5yZWdpb25NZXNoZXMucGlja0F0KGNsaWVudFggLSByZWN0LmxlZnQsIGNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgcmV0dXJuIG1lc2ggPyB7IGtleTogbWVzaC5rZXksIC4uLihtZXNoLmxhYmVsID8geyBsYWJlbDogbWVzaC5sYWJlbCB9IDoge30pIH0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggYSBzZWxlY3Rpb24sIGdyZXkgb3V0IHRoZSBjbGFzcyBzdXJmYWNlcyBub25lIG9mIGl0IGlzIGluIChhIGNsYXNzIGlzIGEgY2F0ZWdvcnkgb2YgdGhlXG4gICAqIGNlbGwtdHlwZSBjb2x1bW46IGEgM0Qgc2VnbWVudGF0aW9uJ3MgY2VsbCB0eXBlKSwgYXMgdGhlIG9ic2VydmF0aW9ucyBpdCBsZWF2ZXMgb3V0IGFyZSBtdXRlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbXV0ZVJlZ2lvbnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLm11dGVSZXF1ZXN0O1xuICAgIGlmICghc2VsZWN0aW9uLmNvdW50IHx8ICF0aGlzLmNlbGxMb29rdXApIHtcbiAgICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldE11dGVkKFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IGNvbCA9IG5hbWUgPyBhd2FpdCB0aGlzLmNlbGxMb29rdXAuY29kZXMobmFtZSkuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLm11dGVSZXF1ZXN0KSByZXR1cm47XG4gICAgaWYgKCFjb2wgfHwgY29sLm1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgdGhpcy5yZWdpb25NZXNoZXMuc2V0TXV0ZWQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLm1hc2subGVuZ3RoOyBpKyspIGlmIChzZWxlY3Rpb24ubWFza1tpXSkgc2VsZWN0ZWQuYWRkKGNvbC5jb2Rlc1tpXSk7XG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IGNvbC5tZXRhLmNhdGVnb3JpZXM7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMucmVnaW9uTWVzaGVzLnNob3duLm1hcCgobSkgPT4gbS5rZXkpO1xuICAgIHRoaXMucmVnaW9uTWVzaGVzLnNldE11dGVkKFxuICAgICAga2V5cy5maWx0ZXIoKGspID0+IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNhdGVnb3JpZXMuaW5kZXhPZihrKTtcbiAgICAgICAgcmV0dXJuIGNvZGUgPj0gMCAmJiAhc2VsZWN0ZWQuaGFzKGNvZGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIG11dGVSZXF1ZXN0ID0gMDtcblxuICAvKiogVGhlIG9ic2VydmF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGNlbGwgZHJhd24gdW5kZXIgYSBjbGllbnQgcG9zaXRpb24sIG9yIC0xLiAqL1xuICBvdmVycmlkZSBwaWNrQ2VsbChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuY3R4LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gdGhpcy5jZWxsczNkLnBpY2soY2xpZW50WCAtIHJlY3QubGVmdCwgY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZXN0b3JlRGVwdGg/LigpO1xuICAgIHRoaXMucmVzdG9yZURlcHRoID0gbnVsbDtcbiAgICB0aGlzLm1lc2hQb2ludGVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5tZXNoUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy50b29sU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudG9vbFN1YiA9IG51bGw7XG4gICAgdGhpcy5jZWxsczNkLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhcigpO1xuICAgIHRoaXMudHJhbnNjcmlwdHMzZC5kaXNwb3NlKCk7XG4gICAgdGhpcy5kaXNwb3NlU3BhdGlhbCgpO1xuICAgIHRoaXMuaW52ZXJ0U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW52ZXJ0U3ViID0gbnVsbDtcbiAgICB0aGlzLmRlbnNpdHlMb2Fkcy5jYW5jZWwoKTtcbiAgICB0aGlzLmdlbmVNYXBMb2Fkcy5jYW5jZWwoKTtcbiAgICB0aGlzLnNjYWxlQmFyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVBeGVzKCk7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMucG9zaXRpb25zID0gbnVsbDtcbiAgICB0aGlzLnNldFBpY2tlcihudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YXRpb24gdW5kZXIgYSBjbGllbnQgcG9zaXRpb246IHRoZSBGUk9OVC1tb3N0IG1hcmtlciB3aXRoaW4gYHNsYWNrUHhgIG9mIHRoZVxuICAgKiBwb2ludGVyICh0aWVzIGJ5IGRpc3RhbmNlKSwgYXMgbmFwYXJpLWpzJ3Mge0BsaW5rIFBvaW50UGlja2VyfSBwaWNrcyBpdC4gVGhhdCBtYXR0ZXJzIG1vcmVcbiAgICogdGhhbiBpdCBzb3VuZHM6IHRoZSByZW5kZXJlciBkZXB0aC10ZXN0cyB0aGUgYmlsbGJvYXJkcywgYW5kIGluIGEgMy43TS1wb2ludCBjbG91ZCB0aGUgY3Vyc29yXG4gICAqIGNvdmVycyBtYW55IG9mIHRoZW0g4oCUIHBpY2tpbmcgdGhlIG9uZSBuZWFyZXN0IHRoZSBjdXJzb3IncyBjZW50cmUgcmVndWxhcmx5IG5hbWVzIGEgY2VsbCB0aGF0XG4gICAqIHNvbWV0aGluZyBlbHNlIGlzIGRyYXduIG92ZXIuIFRoZSBwaWNrZXIgYWxzbyB0YWtlcyBlYWNoIHBvaW50J3MgcmFkaXVzIGZyb20gdGhlIGxheWVyJ3NcbiAgICogcGVyLXBvaW50IGBzaXplc2AsIHNvIGEgc2VsZWN0ZWQgbWFya2VyLCBkcmF3biBsYXJnZXIsIGlzIGFzIGxhcmdlIHRvIHRoZSBwb2ludGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBpY2tPYnNlcnZhdGlvbihjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlciwgc2xhY2tQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5jdHguY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vIEEgY2VsbCBkcmF3biBieSBpdHNlbGYgaXMgd2hhdCBpcyB1bmRlciB0aGUgcG9pbnRlciBiZWZvcmUgYW55IG1hcmtlciBpbnNpZGUgaXQuXG4gICAgY29uc3QgY2VsbCA9IHRoaXMuY2VsbHMzZC5waWNrKGNsaWVudFggLSByZWN0LmxlZnQsIGNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgaWYgKGNlbGwgPj0gMCkgcmV0dXJuIGNlbGw7XG4gICAgY29uc3QgcGlja2VyID0gdGhpcy5waWNrZXI7XG4gICAgaWYgKCFwaWNrZXIpIHJldHVybiAtMTtcbiAgICBjb25zdCBrID0gcGlja2VyLnBpY2soY2xpZW50WCAtIHJlY3QubGVmdCwgY2xpZW50WSAtIHJlY3QudG9wLCBzbGFja1B4KTtcbiAgICBpZiAoayA8IDApIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy5kcmF3biA/IHRoaXMuZHJhd25ba10gOiBrO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIGNsb3VkJ3MgcGlja2VyIChudWxsOiBubyBjbG91ZCksIHJlbGVhc2luZyB0aGUgb2xkIG9uZSdzIGNhbWVyYSBsaXN0ZW5lci4gKi9cbiAgcHJpdmF0ZSBzZXRQaWNrZXIocG9pbnRzOiBQb2ludHMzRExheWVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VyPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5waWNrZXIgPSBwb2ludHNcbiAgICAgID8gbmV3IFBvaW50UGlja2VyKHRoaXMuY3R4LnZpZXdlciwgcG9pbnRzLCB7XG4gICAgICAgICAgLy8gVGhlIGxhcmdlc3QgcmFkaXVzIGEgcGljayBoZXJlIGNhbiBjbGFpbTogdGhlIGhvdmVyIHNsYWNrIHRpbWVzIHRoZSBzY2FsZSBhIFNFTEVDVEVEXG4gICAgICAgICAgLy8gbWFya2VyIGlzIGRyYXduIGF0LiBJdCBkZWNpZGVzIHdoZXRoZXIgYSBtYXJrZXIgc3RyYWRkbGluZyB0aGUgY2FudmFzIGVkZ2UgaXMgZm91bmQuXG4gICAgICAgICAgbWF4UmVhY2g6IEhPVkVSX1JBRElVU19QWCAqIFNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSxcbiAgICAgICAgfSlcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSBiYXIgZm9yIHRoZSBjbG91ZCwgbWVhc3VyZWQgYXQgdGhlIE9SQklUIFBJVk9ULlxuICAgKlxuICAgKiBBIHBlcnNwZWN0aXZlIGNhbWVyYSBoYXMgbm8gc2luZ2xlIHNjYWxlIOKAlCB0aGluZ3MgZmFydGhlciBhd2F5IGFyZSBzbWFsbGVyIOKAlCBzbyBhIGJhciBjYW5cbiAgICogb25seSBiZSB0cnVlIGF0IG9uZSBkZXB0aC4gVGhlIHBpdm90IGlzIHRoZSBob25lc3QgY2hvaWNlOiBpdCBpcyB3aGF0IHRoZSBjYW1lcmEgaXMgZnJhbWluZyxcbiAgICogd2hhdCBhIHpvb20gbW92ZXMgdG93YXJkcywgYW5kIHdoZXJlIHRoZSBleWUgaXMgYW55d2F5LiBuYXBhcmkncyBvd24gM0Qgc2NhbGUgYmFyIHdvcmtzIHRoZVxuICAgKiBzYW1lIHdheS5cbiAgICpcbiAgICogbmFwYXJpLWpzJ3MgYFNjYWxlQmFyT3ZlcmxheWAgaW4gYCczZCdgIG1vZGUgbWVhc3VyZXMgdGhlcmU6IENTUyBweCBwZXIgd29ybGQgdW5pdCBpcyB0aGVcbiAgICogcmVjaXByb2NhbCBvZiBgQ2FtZXJhM0Qud29ybGRQZXJQaXhlbGAg4oCUIHRoZSBzY2FsZSBgQ2FtZXJhM0QucGFuYCB1c2VzIHRvIHRyYWNrIHRoZSBjdXJzb3IuXG4gICAqIFRoZSBiYXIgdGhlbiBjb252ZXJ0cyB0aHJvdWdoIGBtaWNyb25zUGVyVW5pdGAsIGFuZCBkcmF3cyBub3RoaW5nIGF0IGFsbCB3aGVuIHRoZSBkYXRhc2V0IGRvZXNcbiAgICogbm90IGRlY2xhcmUgb25lLCBiZWNhdXNlIGEgYmFyIGxhYmVsbGVkIGluIG1pY3JvbnMgb3ZlciB1bmtub3duIHVuaXRzIHdvdWxkIHJlYWQgYXMgYVxuICAgKiBtZWFzdXJlbWVudC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNjYWxlQmFyKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICBjb25zdCBtaWNyb25zUGVyVW5pdCA9IGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0O1xuICAgIGlmICghbWljcm9uc1BlclVuaXQgfHwgbWljcm9uc1BlclVuaXQgPD0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgU2NhbGVCYXJPdmVybGF5KHRoaXMuY3R4Lmhvc3QsIHRoaXMuY3R4LnZpZXdlciwge1xuICAgICAgdW5pdFBlcldvcmxkOiBtaWNyb25zUGVyVW5pdCxcbiAgICAgIG1vZGU6ICczZCcsXG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSAzRCBwb2ludCBjbG91ZCBmb3IgdGhlIGN1cnJlbnQgZGF0YXNldCArIHZpZXcgc3RhdGUuICovXG4gIHByb3RlY3RlZCBhc3luYyByZWJ1aWxkKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLmN0eC52aWV3ZXI7XG4gICAgY29uc3QgdGFzayA9IHRoaXMucmVidWlsZHMubmV4dCgpO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgc2NhbGFyIGVuY29kaW5nIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmUsIGZvciB0aGUgc2FtZSByZWFzb25cbiAgICAvLyB0aGUgMkQgcGF0aCBkb2VzOiBhIGdlbmUgZmV0Y2ggY2FuIGZhaWwgb3IgYmUgc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZVxuICAgIC8vIGxheWVyIGZpcnN0IHdvdWxkIGJsYW5rIHRoZSB2aWV3LlxuICAgIGxldCBlbmM6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGdlbmVTaG93bjogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChkYXRhc2V0KSB7XG4gICAgICBjb25zdCBlbmRMb2FkaW5nID0gdGhpcy5jdHguYmFkZ2UuYmVnaW4oJ09ic2VydmF0aW9ucycpO1xuICAgICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV2hpY2ggb2JzZXJ2YXRpb25zIHRoZSBnZW5lIGZpbHRlciBrZWVwcywgc2V0dGxlZCBhcGFydCBmcm9tIHRoZWlyIGNvbG91cnM6IGEgY29sb3VyXG4gICAgICAgIC8vIGNhbiBmYWxsIGJhY2sgdG8gYSBmbGF0IG9uZSwgdGhlIGZpbHRlciBjYW5ub3QuIERyYXduIHdpdGhvdXQgaXQsIGV2ZXJ5IG9ic2VydmF0aW9uXG4gICAgICAgIC8vIHdvdWxkIHNob3cgYXMgaWYgaXQgZXhwcmVzc2VkIHRoZSBwaWNrZWQgZ2VuZXMuIFNvIGEgZmFpbGVkIHJlYWQga2VlcHMgdGhlIGNsb3VkIGFzIGl0XG4gICAgICAgIC8vIHdhcyBkcmF3biwgYW5kIHRoZSBwYW5lbCBzYXlzIHRoZSBmaWx0ZXIgY291bGQgbm90IGJlIGFwcGxpZWQuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZ2VuZVNob3duID0gcG9ydFxuICAgICAgICAgICAgPyBhd2FpdCBvYnNlcnZhdGlvbkdlbmVNYXNrKHZpZXcsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCAoZykgPT4gcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGcpKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW25hcGFyaS1qc10gc3BhdGlhbCAzRCBnZW5lIGZpbHRlciBjb3VsZCBub3QgYmUgYXBwbGllZCDigJQga2VlcGluZyB0aGUgY2xvdWQgYXMgZHJhd24nLFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHRhc2soKSkgdGhpcy5zZXNzaW9uLnJlcG9ydEdlbmVGaWx0ZXIodHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVuYyA9IGF3YWl0IHRoaXMuc2NhbGFyRW5jb2RpbmcodmlldywgZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGVuZExvYWRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0YXNrKCkpIHJldHVybjtcbiAgICB0aGlzLnNlc3Npb24ucmVwb3J0R2VuZUZpbHRlcihmYWxzZSk7XG5cbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgLy8gTm8geiBtZWFucyBub3RoaW5nIHRvIGRyYXcgaW4gM0QuIFRoZSBwbG90IHR5cGUgaXMgZ2F0ZWQgb24gYHJlcXVpcmVzU3BhdGlhbDNkYFxuICAgIC8vIHNvIHRoaXMgc2hvdWxkIGJlIHVucmVhY2hhYmxlIGZyb20gdGhlIFVJLCBidXQgYSBob3N0IGNhbiBzZXQgdGhlIHR5cGUgZGlyZWN0bHkuXG4gICAgaWYgKCFkYXRhc2V0IHx8ICFvYnMgfHwgb2JzLmNvdW50ID09PSAwIHx8ICFvYnMueikge1xuICAgICAgdGhpcy5yZW1vdmVMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbmF0b215IGZpcnN0OiBvbiBhIHNjZW5lJ3MgRklSU1QgbGF5ZXIgbmFwYXJpIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhLCBhbmRcbiAgICAvLyB0aGUgcmVmZXJlbmNlIHZvbHVtZSBpcyB0aGUgZnJhbWluZyB3ZSB3YW50IOKAlCB0aGUgYnJhaW4sIG5vdCB0aGUgb3V0ZXJtb3N0XG4gICAgLy8gc3RyYXkgc2VnbWVudGF0aW9uLiBFdmVyeSBsYXRlciBhZGQga2VlcHMgdGhlIHBvc2UgaW5zdGVhZCAobmFwYXJpLWpzIGBmaXQzZDogJ29uY2UnYCkuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVWb2x1bWUodmlld2VyLCBkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIC8vIFRoZSBib3ggZXZlcnl0aGluZyBzaXRzIGluLCBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20gaXRzIGNlbnRyaW5nIG9mZnNldC5cbiAgICB0aGlzLmVuc3VyZUZyYW1lKGRhdGFzZXQpO1xuICAgIC8vIFRoZW4gdGhlIGNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGVuc2l0eVZvbHVtZXModmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pO1xuICAgIGlmICghdGFzaygpKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgZ2VuZSBtYXAsIHdoaWNoIHNoYXJlcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGxhdHRpY2Ug4oCUIHNvIGl0IGdvZXNcbiAgICAvLyBhZnRlciBhbnl0aGluZyB0aGF0IGNhbiBzdGlsbCBtb3ZlIHRoZSBjZW50cmluZyBvZmZzZXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBpZiAoIXRhc2soKSkgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zY2FsZUJhcktleSkge1xuICAgICAgdGhpcy5zY2FsZUJhcktleSA9IGRhdGFzZXQuaWQ7XG4gICAgICB0aGlzLmluc3RhbGxTY2FsZUJhcihkYXRhc2V0KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVmZXJlbmNlIHZvbHVtZSBpcyBoaWRkZW4sIG5vdCByZW1vdmVkOiBpdCBhbHNvIGZpeGVzIHRoZSBjZW50cmluZ1xuICAgIC8vIG9mZnNldCBldmVyeSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tLCBhbmQgcmUtZmV0Y2hpbmcgYSAxMDAgTUIgdGVtcGxhdGVcbiAgICAvLyB0byB1bi1oaWRlIGl0IHdvdWxkIG1ha2UgYSBjaGVja2JveCBmZWVsIGxpa2UgYSBsb2FkLlxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdGhpcy52b2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMudm9sdW1lLm9wYWNpdHkgPSB2aWV3LnZvbHVtZU9wYWNpdHk7XG4gICAgfVxuICAgIHRoaXMuZHJhd0Nsb3VkKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBlbmMsIGdlbmVTaG93bik7XG4gICAgdm9pZCB0aGlzLnN0eWxlQ2VsbHMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICB2b2lkIHRoaXMubXV0ZVJlZ2lvbnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICAvLyBUaGUgdHJhbnNjcmlwdHMgbGFzdDogdGhleSBzaXQgaW4gdGhlIGJveCB0aGUgY2xvdWQgZml4ZWQsIGFuZCB0aGVpciBmaXJzdCByZWFkIGNhbiB0YWtlIGEgd2hpbGUuXG4gICAgYXdhaXQgdGhpcy50cmFuc2NyaXB0czNkLnN5bmMoXG4gICAgICBkYXRhc2V0LFxuICAgICAgdmlldyxcbiAgICAgIHRoaXMuc2Vzc2lvbi5wb3J0LFxuICAgICAgeyBvcmlnaW46IHRoaXMub3JpZ2luLCB6U2NhbGU6IHRoaXMuelNjYWxlKCkgfSxcbiAgICAgIHNlbGVjdGlvbixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHBvaW50IGNsb3VkOiBhIG5ldyBsYXllciBmb3IgbmV3IGdlb21ldHJ5IChhIGRhdGFzZXQgb3IgYSBzZWN0aW9uKSwgdGhlIGNvbG91clxuICAgKiBzb3VyY2Ugc3dhcHBlZCBpbiBwbGFjZSBvdGhlcndpc2U7IHRoZW4gdGhlIHNlbGVjdGlvbiBhbmQgdGhlIHZpc2liaWxpdHkuXG4gICAqL1xuICBwcml2YXRlIGRyYXdDbG91ZChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgZW5jOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwsXG4gICAgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IFNQQVRJQUxfM0RfQkFTRV9TSVpFICogc2NhbGU7XG4gICAgLy8gQSBjYXRlZ29yaWNhbCBjb2xvdXJpbmcgaXMgcGVyLXBvaW50IFJHQkEsIHdoaWNoIHdpbnMgb3ZlciB0aGUgc2NhbGFyczsgdGhlIGZsYXQgY29sb3JtYXBcbiAgICAvLyBhbmQgemVybyBzY2FsYXJzIHN0YW5kIGJlaGluZCBpdCwgYXMgdGhleSBkbyBmb3IgXCJub3RoaW5nIHRvIGNvbG91ciBieVwiLlxuICAgIGNvbnN0IHNjYWxhciA9IGVuYz8ua2luZCA9PT0gJ3NjYWxhcnMnID8gZW5jIDogbnVsbDtcbiAgICBjb25zdCBjb2xvcnMgPSBlbmM/LmtpbmQgPT09ICdjb2xvcnMnID8gZW5jLmNvbG9ycyA6IG51bGw7XG4gICAgY29uc3Qgc2NhbGFycyA9IHNjYWxhcj8udmFsdWVzID8/IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KTtcbiAgICBjb25zdCBjb2xvcm1hcCA9IHNjYWxhcj8uY29sb3JtYXAgPz8gc3BhdGlhbEZsYXRDb2xvcm1hcCgpO1xuICAgIGNvbnN0IGNvbnRyYXN0TGltaXRzOiBbbnVtYmVyLCBudW1iZXJdID0gc2NhbGFyPy5jb250cmFzdExpbWl0cyA/PyBbMCwgMV07XG4gICAgY29uc3QgeyBzaG93biwga2V5LCBzY2FsYXJLZXkgfSA9IGNsb3VkU3Vic2V0KGRhdGFzZXQsIHZpZXcsIGdlbmVTaG93bik7XG5cbiAgICBpZiAoa2V5ICE9PSB0aGlzLmxheWVyS2V5KSB7XG4gICAgICAvLyBOZXcgZ2VvbWV0cnk6IGludGVybGVhdmUgeCx5LHogKHRoZSBsYXllcidzIGRvY3VtZW50ZWQgbGF5b3V0LCB4LWZhc3Rlc3QpXG4gICAgICAvLyBhbmQgY2FjaGUgaXQsIHNvIGxhdGVyIGNvbG91ciBjaGFuZ2VzIHJlYnVpbGQgdGhlIGxheWVyIHdpdGhvdXQgd2Fsa2luZ1xuICAgICAgLy8gdGhlIG9ic2VydmF0aW9ucyBhZ2Fpbi5cbiAgICAgIHRoaXMucG9zaXRpb25zID0gdGhpcy5jbG91ZFBvc2l0aW9ucyhvYnMsIHNob3duKTtcbiAgICAgIHRoaXMuZHJhd24gPSBzaG93bjtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2NhbGFycyBoYXZlIHRvIGZvbGxvdyB0aGUgZ2VvbWV0cnk6IGEgcGVyLW9ic2VydmF0aW9uIHZlY3RvciBhZ2FpbnN0IG9uZVxuICAgIC8vIHNlY3Rpb24ncyBwb3NpdGlvbnMgd291bGQgY29sb3VyIGVhY2ggY2VsbCBieSBhIHN0cmFuZ2VyJ3MgdmFsdWUuIFNvIGRvIHRoZSBjb2xvdXJzLlxuICAgIGNvbnN0IHZhbHVlc0ZvciA9ICgpID0+IChzaG93biA/IEZsb2F0MzJBcnJheS5mcm9tKHNob3duLCAoaSkgPT4gc2NhbGFyc1tpXSkgOiBzY2FsYXJzKTtcbiAgICBjb25zdCBjb2xvcnNGb3IgPSAoKSA9PiAoY29sb3JzID8gKGdhdGhlckNvbG9ycyhjb2xvcnMsIHNob3duID8/IHVuZGVmaW5lZCkgYXMgRmxvYXQzMkFycmF5KSA6IG51bGwpO1xuXG4gICAgaWYgKCF0aGlzLnBvaW50cyB8fCBrZXkgIT09IHRoaXMubGF5ZXJLZXkpIHtcbiAgICAgIC8vIE5ldyBHRU9NRVRSWSDigJQgYSBkaWZmZXJlbnQgZGF0YXNldCwgb3IgYSBkaWZmZXJlbnQgc2VjdGlvbiDigJQgc28gYSBuZXcgbGF5ZXIuXG4gICAgICBpZiAodGhpcy5wb2ludHMpIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMucG9pbnRzKTtcbiAgICAgIHRoaXMubGF5ZXJLZXkgPSBrZXk7XG4gICAgICB0aGlzLnNjYWxhcktleSA9IHNjYWxhcktleTtcbiAgICAgIHRoaXMucG9pbnRzID0gdmlld2VyLmFkZFBvaW50czNEKHRoaXMucG9zaXRpb25zISwgdmFsdWVzRm9yKCksIHtcbiAgICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICAgIHNjYWxlM2Q6IFsxLCAxLCB0aGlzLnpTY2FsZSgpXSxcbiAgICAgICAgY29sb3JtYXAsXG4gICAgICAgIGNvbnRyYXN0TGltaXRzLFxuICAgICAgICBzaXplLFxuICAgICAgICBjb2xvcnM6IGNvbG9yc0ZvcigpID8/IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRQaWNrZXIodGhpcy5wb2ludHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NhbGFyS2V5ICE9PSB0aGlzLnNjYWxhcktleSkge1xuICAgICAgICAvLyBBIGNoYW5nZSBvZiBjb2xvdXIgU09VUkNFLCB3aGljaCB1c2VkIHRvIG1lYW4gZGlzY2FyZGluZyB0aGUgbGF5ZXIgYW5kIGJ1aWxkaW5nXG4gICAgICAgIC8vIGFub3RoZXIg4oCUIGFuZCwgYmVjYXVzZSBhZGRpbmcgYSAzRCBsYXllciByZWZyYW1lcywgYSBjYW1lcmEganVtcCB0byB1bmRvIGFzIHdlbGwuXG4gICAgICAgIC8vIG5hcGFyaS1qcyDiiaUgMC4xNCBsZXRzIHRoZSBzY2FsYXJzIGJlIHJlcGxhY2VkIGluIHBsYWNlIOKAlCB0aGUgc2V0dGVyIGJ1bXBzIHRoZVxuICAgICAgICAvLyBsYXllcidzIGRhdGFWZXJzaW9uIHNvIHRoZSB2aXN1YWwgcmUtdXBsb2FkcyDigJQgYW5kIHRoZSBwb3NpdGlvbnMgaGF2ZSBub3QgbW92ZWQsXG4gICAgICAgIC8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgZm9yIHRoZSBjYW1lcmEgdG8gcmVmcmFtZS5cbiAgICAgICAgdGhpcy5zY2FsYXJLZXkgPSBzY2FsYXJLZXk7XG4gICAgICAgIHRoaXMucG9pbnRzLnZhbHVlcyA9IHZhbHVlc0ZvcigpO1xuICAgICAgICB0aGlzLnBvaW50cy5jb2xvcnMgPSBjb2xvcnNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucG9pbnRzLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnBvaW50cy5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5wb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvdWQgPSB0aGlzLnBvaW50cztcbiAgICBpZiAoY2xvdWQpIHtcbiAgICAgIGNsb3VkLm9wYWNpdHkgPSB2aWV3Lm9wYWNpdHk7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0aW9uKGNsb3VkLCBzZWxlY3Rpb24sIHNob3duLCBvYnMuY291bnQpO1xuICAgIH1cbiAgICAvLyBMYXN0LCBzbyBpdCBhbHNvIGNvdmVycyBhIGxheWVyIHRoaXMgcGFzcyBqdXN0IGNyZWF0ZWQuXG4gICAgdGhpcy5zaG93UG9pbnRzQXNBc2tlZChkYXRhc2V0LCB2aWV3KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXJrZXJzIHNob3duIGFzIHRoZSB2aWV3IGFza3MsIGJ1dCBub3Qgd2hpbGUgdGhlIGNlbGxzIChhIDNEIHNlZ21lbnRhdGlvbidzKSBzdGFuZCBpbiBmb3JcbiAgICogdGhlbTogdGhlIG9ic2VydmF0aW9ucyBhcmUgc2hvd24gYXMgdGhlaXIgbWFya2VycyBvciBhcyB0aGVpciBjZWxscy4gT25seSBvbmNlIHRoZSBzZXQgaXMgcGxhY2VkXG4gICAqIGhlcmUgKGl0cyBwbGFuZXMga25vd24pOiBhIHNldCB0aGF0IGNvdWxkIG5vdCBiZSBvcGVuZWQsIGhhcyBubyBwbGFuZXMgb3Igd2FzIG5vdCBhdHRhY2hlZCBkcmF3c1xuICAgKiBubyBjZWxscywgYW5kIHRoZSBtYXJrZXJzIHN0YXkuXG4gICAqL1xuICBwcml2YXRlIHNob3dQb2ludHNBc0Fza2VkKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50cykgcmV0dXJuO1xuICAgIGNvbnN0IGNlbGxzID0gISF0aGlzLnJlZ2lvblBsYW5lcyAmJiAhIWRhdGFzZXRSZWdpb25TZXQoZGF0YXNldCkgJiYgdmlldy5zaG93Q2VsbHMgIT09IGZhbHNlO1xuICAgIHRoaXMucG9pbnRzLnZpc2libGUgPSB2aWV3LnNob3dQb2ludHMgJiYgIWNlbGxzO1xuICB9XG5cbiAgLyoqIEludGVybGVhdmVkIHgseSx6IG9mIHRoZSBgc2hvd25gIG9ic2VydmF0aW9ucyAobnVsbDogYWxsIG9mIHRoZW0pLCBvZmZzZXQgYnkge0BsaW5rIG9yaWdpbn0uICovXG4gIHByaXZhdGUgY2xvdWRQb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBzaG93bjogVWludDMyQXJyYXkgfCBudWxsKTogRmxvYXQzMkFycmF5IHtcbiAgICAvLyByZWJ1aWxkKCkgZHJhd3Mgb25seSBhIGRhdGFzZXQgd2hvc2Ugb2JzZXJ2YXRpb25zIGhhdmUgYSB6LlxuICAgIGNvbnN0IHogPSBvYnMueiE7XG4gICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5vcmlnaW47XG4gICAgY29uc3QgY291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMyk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBwb3NpdGlvbnNbayAqIDNdID0gb2JzLnhbaV0gKyBveDtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgIHBvc2l0aW9uc1trICogMyArIDJdID0geltpXSArIG96O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdGlvbiBpcyBhIFBFUi1QT0lOVCBhbHBoYSwgaW4gdGhlIG9uZSBsYXllci5cbiAgICpcbiAgICogSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgKiB0byBoaWdobGlnaHQgYSBzdWJzZXQgd2FzIHRvIGRyYXcgaXQgYWdhaW4gb24gdG9wIGF0IGZ1bGwgb3BhY2l0eSB3aGlsZSB0aGUgcGFyZW50XG4gICAqIGRyb3BwZWQgdG8gdGhlIG11dGVkIGxldmVsLiBUaGF0IHNlY29uZCBsYXllciBoYWQgdG8gYmUga2VwdCBpbiBzdGVwIHRocm91Z2ggZXZlcnlcbiAgICogY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgKiBzZXBhcmF0ZSBkcmF3cy4gUGVyLXBvaW50IGFscGhhcyBhbmQgc2l6ZXMgZ2l2ZSB0aGUgc2FtZSByZWFkaW5nIOKAlCBtdXRlZCBjbG91ZCwgYnJpZ2h0XG4gICAqIHNlbGVjdGlvbiwgc2xpZ2h0bHkgbGFyZ2VyIHNvIGEgc21hbGwgb25lIGlzIGZpbmRhYmxlIGluc2lkZSAzLjdNIHBvaW50cyDigJQgaW4gb25lLlxuICAgKlxuICAgKiBgc2hvd25gIGlzIHRoZSBkcmF3biBzdWJzZXQgKG51bGw6IGV2ZXJ5IG9uZSBvZiB0aGUgYHRvdGFsYCBvYnNlcnZhdGlvbnMpLCBzbyB0aGUgYWxwaGFzXG4gICAqIGZvbGxvdyB0aGUgZHJhd24gb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5U2VsZWN0aW9uKFxuICAgIGNsb3VkOiBQb2ludHMzRExheWVyLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgc2hvd246IFVpbnQzMkFycmF5IHwgbnVsbCxcbiAgICB0b3RhbDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwIHx8IHNlbGVjdGlvbi5tYXNrLmxlbmd0aCAhPT0gdG90YWwpIHtcbiAgICAgIGNsb3VkLmFscGhhcyA9IG51bGw7XG4gICAgICBjbG91ZC5zaXplcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3duQ291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IHRvdGFsO1xuICAgIGNvbnN0IGFscGhhcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICBjb25zdCBpID0gc2hvd24gPyBzaG93bltrXSA6IGs7XG4gICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgYWxwaGFzW2tdID0gcGlja2VkID8gMSA6IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgIHNpemVzW2tdID0gcGlja2VkID8gU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFIDogMTtcbiAgICB9XG4gICAgY2xvdWQuYWxwaGFzID0gYWxwaGFzO1xuICAgIGNsb3VkLnNpemVzID0gc2l6ZXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqM0QgZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBvdmVyIHRoZSB3aG9sZSBzZWN0aW9uZWRcbiAgICogc3BlY2ltZW4sIGFzIG9uZSByYXltYXJjaGVkIHZvbHVtZS5cbiAgICpcbiAgICogVHdvIHRoaW5ncyBpdCBjYW4gYmUsIGFuZCB0aGUgcGFuZWwncyBgVm9sdW1lIHJlbmRlcmluZ2AgdG9nZ2xlIHBpY2tzIHdoaWNoOlxuICAgKlxuICAgKiAgLSAqKnNoZWV0cyoqIOKAlCBleGFjdGx5IHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgZWFjaCBjYXJyeWluZyB0aGF0XG4gICAqICAgIHNsaWRlJ3Mgb3duIDJEIGdlbmUgbWFwLCB3aXRoIHRoZSBnYXBzIGJldHdlZW4gc2VjdGlvbnMgZW1wdHkuIEEgc3RhY2sgb2ZcbiAgICogICAgbWVhc3VyZWQgZmllbGRzLCBhdCB0aGVpciB0cnVlIHouXG4gICAqICAtICoqdm9sdW1lKiog4oCUIHRoZSBzYW1lIGZpZWxkcyBzbW9vdGhlZCBhbG9uZyB6LCBzbyB0aGUgcGxhbmVzIGJldHdlZW4gdGhlXG4gICAqICAgIHNlY3Rpb25zIGNhcnJ5IGFuIGludGVycG9sYXRlZCB2YWx1ZS4gQW4gZXN0aW1hdGUsIGFuZCBkcmF3biBhcyBhXG4gICAqICAgIHRyYW5zbHVjZW50IGNsb3VkIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGRlbnNpdHkgdm9sdW1lcyBhcmUuXG4gICAqXG4gICAqIE9uZSBgVm9sdW1lTGF5ZXJgIHJhdGhlciB0aGFuIGEgdGV4dHVyZWQgcXVhZCBwZXIgc2VjdGlvbjogYW4gYEltYWdlTGF5ZXJgXG4gICAqIHJlbmRlcnMgb25seSBhdCBgbmRpc3BsYXkgPT09IDJgLCBzbyA1MyBzaGVldHMgaW4gdGhlIG9yYml0IHZpZXcgd291bGQgbmVlZCBhXG4gICAqIG5ldyBsYXllciB0eXBlIHVwc3RyZWFtIOKAlCB3aGlsZSBhIHNjYWxhciB2b2x1bWUgd2hvc2UgeiBzYW1wbGluZyBhbHJlYWR5IElTXG4gICAqIHRoZSBzZWN0aW9uIHNwYWNpbmcgZXhwcmVzc2VzIHRoZSBzaGVldHMgZXhhY3RseSwgYW5kIHRoZSBzYW1lIGxhdHRpY2UgdGhlblxuICAgKiBnaXZlcyB0aGUgaW50ZXJwb2xhdGVkIHZlcnNpb24gZm9yIGZyZWUuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93biBsYXR0aWNlIChgZGVuc2l0eUdyaWRgIGF0IHN0cmlkZSAxKSxcbiAgICogc28gdGhlIGZpZWxkIGxhbmRzIHZveGVsLWZvci12b3hlbCBvbiB0aGUgYW5hdG9teSBhbmQgbmVlZHMgbm8gb2Zmc2V0IOKAlCBhXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZSwgYW5kIG5hcGFyaSBjZW50cmVzIGJvdGggYm94ZXMgb24gdGhlIHdvcmxkXG4gICAqIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgICB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICAgIGRhdGFzZXQuaWQsXG4gICAgICAgICAgZ2VuZSxcbiAgICAgICAgICBzbW9vdGhpbmcsXG4gICAgICAgICAgc2VjdGlvbiA/PyAnYWxsJyxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA/ICd2b2wnIDogJ3NoZWV0cycsXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgICBmaWVsZEtleSxcbiAgICAgICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICAgICAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICAgICAgICB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICAgIHRoaXMuY3R4LmRpc3BsYXkuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcEtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgY2FjaGUuZmllbGQgPSBudWxsO1xuICAgICAgY2FjaGUua2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2Fyc2VuZWQgaW4tcGxhbmUgYnV0IE5PVCBhbG9uZyB6OiB0aGUgc2hlZXRzIG5lZWQgb25lIHBsYW5lIHBlciBpbWFnZWRcbiAgICAvLyBzZWN0aW9uLCB3aGlsZSB0aGUgZmllbGQgdGhleSBjYXJyeSBpcyBzbW9vdGggYnkgY29uc3RydWN0aW9uIGFuZCBnYWluc1xuICAgIC8vIG5vdGhpbmcgZnJvbSB0aGUgdGVtcGxhdGUncyA0MCDCtW0gZGV0YWlsLiBBdCBmdWxsIHJlc29sdXRpb24gdGhlIGVzdGltYXRlIGlzXG4gICAgLy8gYSA1LjdNLXZveGVsIHBhaXIgb2YgYmx1cnMg4oCUIHNlY29uZHMgb2Ygd29yayBmb3IgYSBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZVxuICAgIC8vIHZveGVscyBpcyBhbiBlaWdodGggb2YgdGhlIHdvcmsuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQsIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsIDEyOCwgMSk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IGNhY2hlLmtleSkge1xuICAgICAgY29uc3QgbG9hZCA9IHRoaXMuZ2VuZU1hcExvYWRzLm5leHQoKTtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIDNEIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIEluLXBsYW5lIM+DIGlzIGEgUEhZU0lDQUwgYmFuZHdpZHRoLCBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93blxuICAgICAgLy8gdm94ZWwg4oCUIHRoZSByZXNvbHV0aW9uIHRoZSAyRCBtYXAgZXN0aW1hdGVzIGF0IOKAlCBzbyBhIHNoZWV0IGFuZCB0aGUgMkRcbiAgICAgIC8vIHZpZXcgb2YgdGhlIHNhbWUgc2VjdGlvbiBhcmUgdGhlIHNhbWUgZmllbGQgd2hhdGV2ZXIgbGF0dGljZSB0aGlzIGlzXG4gICAgICAvLyByYXN0ZXJpc2VkIG9uLiBBbG9uZyB6IGl0IGlzIHRoZSBkZW5zaXR5IHBhdGgncyAxLjUgdm94ZWxzOiB0aGUgc21hbGxlc3Qgz4NcbiAgICAgIC8vIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICBjb25zdCBpblBsYW5lID0gZGF0YXNldC52b2x1bWU/LnZveGVsU2l6ZSA/PyBncmlkLnZveGVsU2l6ZTtcbiAgICAgIGxldCBmaWVsZDogRXhwcmVzc2lvblZvbHVtZUZpZWxkIHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpZWxkID0gYXdhaXQgY29tcHV0ZUV4cHJlc3Npb25Wb2x1bWVBc3luYyhcbiAgICAgICAgICBvYnMsXG4gICAgICAgICAgZ3JpZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzaWdtYTogW1xuICAgICAgICAgICAgICBpblBsYW5lWzBdICogR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICAgIGluUGxhbmVbMV0gKiBHRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgICAgIGludGVycG9sYXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGlzQWJvcnRFcnJvcihlcnIpKSByZXR1cm47IC8vIHN1cGVyc2VkZWQgYnkgYSBuZXdlciBtYXAsIG9yIHRoZSBzY2VuZSB3ZW50IGF3YXlcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2FkKCkgfHwgdGhpcy5nZW5lTWFwS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNhY2hlLmZpZWxkID0gZmllbGQ7XG4gICAgICBjYWNoZS5rZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBjYWNoZS5maWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICAvLyBUaGUgaGlnaCBlbmQgb3ZlciB0aGUgTUVBU1VSRUQgdm94ZWxzIG9ubHkgKHRoZSB1bm1lYXN1cmVkIHplcm9zIHdvdWxkIHB1bGwgaXQgZG93biBhbmRcbiAgICAvLyBzYXR1cmF0ZSB0aGUgbWFwKSwgYnV0IHRoZSBsb3cgZW5kIHN0YXlzIDA6IGluIGEgdm9sdW1lIHRoZSB2YWx1ZSBpcyBhbHNvIHRoZSBvcGFjaXR5IGFuZFxuICAgIC8vIDAgcmVhZHMgYXMgXCJub3RoaW5nIGhlcmVcIiwgc28gc3RhcnRpbmcgYXQgdGhlIGxvd2VzdCBtZWFzdXJlZCB2YWx1ZSB3b3VsZCBlcmFzZSBpdC5cbiAgICBjb25zdCBbLCBoaV0gPSBmaWVsZENvbnRyYXN0V2luZG93KGZpZWxkLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBsbyA9IDA7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZUV4cHJlc3Npb25Wb2x1bWUoZmllbGQsIFtsbywgaGldLCB7IGxvZzogdmlldy5sb2dTY2FsZSB9KTtcbiAgICBjb25zdCBsdXQgPSB0aGlzLmN0eC5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyk7XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSB0aGlzLmFkZFZvbHVtZSh2aWV3ZXIsIGRhdGEsIGZpZWxkLndpZHRoLCBmaWVsZC5oZWlnaHQsIGZpZWxkLmRlcHRoLCB7XG4gICAgICBuYW1lOiBgZ2VuZSBtYXAgwrcgJHtnZW5lfSR7aW50ZXJwb2xhdGUgPyAnIMK3IHZvbHVtZScgOiAnJ31gLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dChgZ2VuZS1tYXAtJHtnZW5lfWAsIGx1dCksXG4gICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAvLyBzZWNvbmQgb25lOiAwLi4yNTUgaXMgdGhlIHdob2xlIG9mIHdoYXQgaXQgd2FzIGdpdmVuLlxuICAgICAgY29udHJhc3RMaW1pdHM6IFswLCAyNTVdLFxuICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgLy8gQWRkaXRpdmUgbGlrZSB0aGUgZGVuc2l0eSB2b2x1bWVzLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogdGhlIHNoZWV0c1xuICAgICAgLy8gaGF2ZSB0byByZWFkIFRIUk9VR0ggZWFjaCBvdGhlciBhbmQgdGhyb3VnaCB0aGUgYW5hdG9teSwgd2hpY2ggYVxuICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICB9KTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdCBgREVOU0lUWV9NQVhfQ0xVU1RFUlNgIGJ5IGNlbGxcbiAgICogY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb24gPSAhIXZpZXcuZGVuc2l0eVZvbHVtZSAmJiAhIWRhdGFzZXQub2JzZXJ2YXRpb25zLno7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5kZW5zaXR5U21vb3RoaW5nID4gMCA/IHZpZXcuZGVuc2l0eVNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY29sdW1uID0gdmlldy5jb2xvckJ5Py5raW5kID09PSAnY29sdW1uJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICAvLyBUaGUgc2VsZWN0aW9uIGVudGVycyB0aGUga2V5IGJ5IElERU5USVRZLCBub3QgYnkgY291bnQ6IHR3byBkaWZmZXJlbnQgUk9Jc1xuICAgIC8vIGhvbGRpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGNlbGxzIHdvdWxkIG90aGVyd2lzZSBsb29rIGxpa2UgdGhlIHNhbWUga2V5IGFuZFxuICAgIC8vIGxlYXZlIHRoZSBwcmV2aW91cyBST0kncyBmaWVsZHMgb24gc2NyZWVuLlxuICAgIGNvbnN0IGtleSA9IG9uXG4gICAgICA/IFtcbiAgICAgICAgICBkYXRhc2V0LmlkLFxuICAgICAgICAgIGNvbHVtbiA/PyAnYWxsJyxcbiAgICAgICAgICBzbW9vdGhpbmcsXG4gICAgICAgICAgdGhpcy5zZXNzaW9uLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLFxuICAgICAgICAgIGdyb3VwQ29sb3JzS2V5KGNvbHVtbiwgdmlldy5ncm91cENvbG9ycyksXG4gICAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5kZW5zaXR5S2V5KSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuZGVuc2l0eUxheWVycykgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IGtleTtcbiAgICBjb25zdCBsb2FkID0gdGhpcy5kZW5zaXR5TG9hZHMubmV4dCgpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG5cbiAgICAvLyBUaGUgZGVuc2l0eSBib3ggaXMgdGhlIHNjZW5lJ3MgYm94IChlbnN1cmVGcmFtZSksIHNvIHRoZSBjbG91ZCBhbHJlYWR5IHNpdHMgaW4gaXQuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuXG4gICAgbGV0IGdyb3VwczogRGVuc2l0eUdyb3VwW107XG4gICAgdHJ5IHtcbiAgICAgIGdyb3VwcyA9IGF3YWl0IHRoaXMuZGVuc2l0eUdyb3VwcyhkYXRhc2V0LCBjb2x1bW4sIHNlbGVjdGlvbiwgdmlldyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIGRlbnNpdHkgdm9sdW1lczogY29sdW1uIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbG9hZCgpIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaWdtYSA9IGRlZmF1bHRTaWdtYShncmlkLCBzbW9vdGhpbmcpO1xuICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nIFNVTVMsIHNvIGEgZml4ZWQgcGVyLWxheWVyIG9wYWNpdHkgYmxvd3Mgb3V0IHRvIHdoaXRlIGFzXG4gICAgLy8gc29vbiBhcyBzZXZlcmFsIGJyb2FkIGNsdXN0ZXJzIG92ZXJsYXAg4oCUIHNpeCBzdWJjbGFzc2VzIGF0IDAuNTUgZWFjaCB0dXJuZWRcbiAgICAvLyB0aGUgYnJhaW4gaW50byBvbmUgY3lhbiBtYXNzLiBTcGxpdHRpbmcgdGhlIGJ1ZGdldCBrZWVwcyBuIGZ1bGx5IG92ZXJsYXBwaW5nXG4gICAgLy8gcGVha3MgaW5zaWRlIHRoZSBkaXNwbGF5J3MgcmFuZ2UsIHNvIG92ZXJsYXAgcmVhZHMgYXMgb3ZlcmxhcDsgYSBzaW5nbGVcbiAgICAvLyBjbHVzdGVyIHN0aWxsIGdldHMgdGhlIGZ1bGwgMC41NS4gSXQgb25seSBtaXRpZ2F0ZXM6IGEgdHJhbnNsdWNlbnQgcmF5bWFyY2hcbiAgICAvLyBpbnRlZ3JhdGVzIGFsb25nIHRoZSByYXksIHNvIGNsdXN0ZXJzIHRoYXQgYXJlIHViaXF1aXRvdXMgcmF0aGVyIHRoYW5cbiAgICAvLyByZWdpb25hbCAodGhlIGxhcmdlc3Qgc3ViY2xhc3NlcyBhcmUgZ2xpYSwgd2hpY2ggYXJlIGV2ZXJ5d2hlcmUpIHN0aWxsIHBpbGVcbiAgICAvLyB1cCwgYW5kIG9uZSBjbHVzdGVyIGF0IGEgdGltZSBpcyB0aGUgcmVhZGFibGUgd2F5IHRvIGxvb2sgYXQgdGhvc2UuXG4gICAgY29uc3Qgb3BhY2l0eSA9IE1hdGgubWluKDAuNTUsIDAuOSAvIE1hdGgubWF4KDEsIGdyb3Vwcy5sZW5ndGgpKTtcbiAgICBsZXQgZmllbGRzOiAoVWludDhBcnJheSB8IG51bGwpW107XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9mZiB0aGUgbWFpbiB0aHJlYWQgcGFzdCB0aGUgd29ya2VyIHRocmVzaG9sZDsgdGhlIGNsdXN0ZXJzIHF1ZXVlIG9uIG9uZSB3b3JrZXIuXG4gICAgICBmaWVsZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZ3JvdXBzLm1hcCgoZ3JvdXApID0+XG4gICAgICAgICAgcmFzdGVyaXplRGVuc2l0eUFzeW5jKFxuICAgICAgICAgICAgZGF0YXNldC5vYnNlcnZhdGlvbnMsXG4gICAgICAgICAgICBncmlkLFxuICAgICAgICAgICAgeyBzaWdtYSwgaW5kaWNlczogZ3JvdXAuaW5kaWNlcyB9LFxuICAgICAgICAgICAgeyBzaWduYWw6IGxvYWQuc2lnbmFsIH0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNBYm9ydEVycm9yKGVycikpIHJldHVybjsgLy8gc3VwZXJzZWRlZCBieSBhIG5ld2VyIGtleSwgb3IgdGhlIHNjZW5lIHdlbnQgYXdheVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBpZiAoIWxvYWQoKSB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cCwgaSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGZpZWxkc1tpXTtcbiAgICAgIC8vIEEgY2x1c3RlciB3aXRoIG5vdGhpbmcgb24gdGhlIGdyaWQgZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgICAgdGhpcy5kZW5zaXR5TGF5ZXJzLnB1c2goXG4gICAgICAgIHRoaXMuYWRkVm9sdW1lKHZpZXdlciwgZGF0YSwgZ3JpZC53aWR0aCwgZ3JpZC5oZWlnaHQsIGdyaWQuZGVwdGgsIHtcbiAgICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke2dyb3VwLm5hbWV9YCxcbiAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jdHguZGlzcGxheS5jaGFubmVsVGludENvbG9ybWFwKGdyb3VwLmNvbG9yKSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuY3R4LmRpc3BsYXkuaW52ZXJ0LFxuICAgICAgICAgIC8vIFRyYW5zbHVjZW50LCBub3QgTUlQOiBhIGNsdXN0ZXIncyBpbnRlcmlvciBpcyB0aGUgcmVhZGFibGUgcGFydCwgYW5kIE1JUFxuICAgICAgICAgIC8vIHdvdWxkIGZsYXR0ZW4gZXZlcnkgY2xvdWQgdG8gaXRzIGJyaWdodGVzdCBzaGVsbC5cbiAgICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgICAvLyBBZGRpdGl2ZSwgc28gdHdvIGNsdXN0ZXJzIG92ZXJsYXBwaW5nIHJlYWQgYXMgYm90aCBiZWluZyB0aGVyZSBpbnN0ZWFkXG4gICAgICAgICAgLy8gb2YgdGhlIG5lYXJlciBvbmUgaGlkaW5nIHRoZSBvdGhlci5cbiAgICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlcnMgdG8gcmFzdGVyaXNlOiB0aGUgY2F0ZWdvcmllcyBvZiB0aGUgYWN0aXZlIGNhdGVnb3JpY2FsIGNvbG91cmluZyxcbiAgICogYmlnZ2VzdCBmaXJzdCBhbmQgY2FwcGVkLCBlYWNoIHdpdGggaXRzIGxlZ2VuZCBjb2xvdXIsIHJlc3RyaWN0ZWQgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAqIHdoZW4gdGhlcmUgaXMgb25lLiBXaXRoIG5vIGNhdGVnb3JpY2FsIGNvbG91cmluZyB0aGVyZSBpcyBvbmUgZ3JvdXAg4oCUIHRvdGFsIGNlbGwgZGVuc2l0eSxcbiAgICogd2hpY2ggaXMgYSByZWFsIHF1ZXN0aW9uIG9uIGl0cyBvd24gKFwid2hlcmUgaXMgdGhlIHRpc3N1ZSBkZW5zZT9cIikgYW5kIHRoZSBob25lc3QgdGhpbmcgdG9cbiAgICogc2hvdyB3aGVuIHRoZSB2aWV3IGlzIG5vdCBlbmNvZGluZyBhIHRheG9ub215LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZW5zaXR5R3JvdXBzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICAgIGNvbHVtbjogc3RyaW5nIHwgbnVsbCxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8RGVuc2l0eUdyb3VwW10+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zZXNzaW9uLnBvcnQ7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm4gW3RvdGFsRGVuc2l0eUdyb3VwKHNlbGVjdGlvbildO1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmFua0RlbnNpdHlHcm91cHMoY29sdW1uLCBsb2FkZWQsIGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50LCBzZWxlY3Rpb24sIHZpZXcuZ3JvdXBDb2xvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCAob3Iga2VlcCkgdGhlIGRhdGFzZXQncyByZWZlcmVuY2Ugdm9sdW1lLiBUaGUgb2Zmc2V0IHRoYXQgc2l0cyB0aGUgb2JzZXJ2YXRpb25zIGluc2lkZVxuICAgKiBpdCBpcyB7QGxpbmsgZW5zdXJlRnJhbWV9J3MuXG4gICAqXG4gICAqIEEgZmFpbGVkIG9yIGFic2VudCB2b2x1bWUgaXMgbm90IGZhdGFsOiB0aGUgY2xvdWQgcmVuZGVycyBvbiBpdHMgb3duLCBpbiB0aGUgc2FtZSBib3gsIGFuZFxuICAgKiB0aGUgY2FtZXJhIGZyYW1lcyB0aGUgcG9pbnRzIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVZvbHVtZSh2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc2Vzc2lvbi5wb3J0O1xuICAgIGNvbnN0IGtleSA9IG1ldGEgPyBgJHtkYXRhc2V0LmlkfToke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogbnVsbDtcbiAgICBpZiAoa2V5ICYmIGtleSA9PT0gdGhpcy52b2x1bWVLZXkpIHJldHVybjtcbiAgICAvLyBBbHJlYWR5IG9uIGl0cyB3YXkgZm9yIGFuIGVhcmxpZXIgcmVidWlsZDogd2FpdCBmb3IgdGhhdCBvbmUsIGFkZCBub25lIG9mIG91ciBvd24uXG4gICAgaWYgKGtleSAmJiB0aGlzLnZvbHVtZUxvYWRpbmc/LmtleSA9PT0ga2V5KSByZXR1cm4gdGhpcy52b2x1bWVMb2FkaW5nLmRvbmU7XG4gICAgdGhpcy52b2x1bWVMb2FkaW5nID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy52b2x1bWUpO1xuICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuICAgICAgdGhpcy52b2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGUgc3VyZmFjZXMgc2F0IGluIHRoZSB2b2x1bWUganVzdCByZW1vdmVkIChvciB0aGVyZSB3YXMgbm9uZSk6IGRvd24gdW50aWwgb25lIGlzIHBsYWNlZC5cbiAgICB0aGlzLnJlZ2lvbk1lc2hlcy5jbGVhckZyYW1lKCk7XG4gICAgaWYgKCFtZXRhIHx8ICFwb3J0Py5nZXRWb2x1bWUgfHwgIWtleSkgcmV0dXJuO1xuICAgIGNvbnN0IGxvYWRpbmcgPSB7IGtleSwgZG9uZTogdGhpcy5sb2FkVm9sdW1lKHZpZXdlciwgZGF0YXNldCwgdmlldywga2V5KSB9O1xuICAgIHRoaXMudm9sdW1lTG9hZGluZyA9IGxvYWRpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxvYWRpbmcuZG9uZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMudm9sdW1lTG9hZGluZyA9PT0gbG9hZGluZykgdGhpcy52b2x1bWVMb2FkaW5nID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggdGhlIHJlZmVyZW5jZSB2b2x1bWUgYW5kIGFkZCBpdCwgdW5sZXNzIGFub3RoZXIgb25lIHdhcyBhc2tlZCBmb3IgbWVhbndoaWxlLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBrZXk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lITtcbiAgICBsZXQgdm94ZWxzOiBVaW50OEFycmF5O1xuICAgIHRyeSB7XG4gICAgICB2b3hlbHMgPSBhd2FpdCB0aGlzLnNlc3Npb24ucG9ydCEuZ2V0Vm9sdW1lISgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSByZWZlcmVuY2Ugdm9sdW1lIHVuYXZhaWxhYmxlIOKAlCBkcmF3aW5nIHRoZSBjbG91ZCBhbG9uZScsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN0eC5zaWduYWwuYWJvcnRlZCB8fCB0aGlzLnZvbHVtZUxvYWRpbmc/LmtleSAhPT0ga2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnZvbHVtZUtleSA9IGtleTtcbiAgICB0aGlzLnZvbHVtZSA9IHRoaXMuYWRkVm9sdW1lKHZpZXdlciwgdm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICB2b3hlbFNpemU6IFt2eCwgdnksIHZ6XSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5yZWdpb25zVGhyb3VnaCkgdGhpcy52b2x1bWUuYmxlbmRpbmcgPSAndHJhbnNsdWNlbnRfbm9fZGVwdGgnO1xuICAgIHRoaXMucGxhY2VSZWdpb25NZXNoZXMoZGF0YXNldCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJveCBldmVyeXRoaW5nIHNpdHMgaW4sIGNlbnRyZWQgb24gdGhlIHdvcmxkIG9yaWdpbiwgYW5kIHRoZSBvZmZzZXQgdGhhdCBzaXRzIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgaW4gaXQ7IHdpdGggdGhlIGF4ZXMgZ2l6bW8gYW5kIHRoZSBaIGhhbmRsZSBvbiBpdC5cbiAgICpcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlOiBuYXBhcmktanMgbWFwcyBhIHZvbHVtZSdzIHVuaXQgY3ViZSB0byBhIHdvcmxkIGJveCBjZW50cmVkIG9uXG4gICAqIHRoZSBvcmlnaW4sIHNpemVkIGBkaW1zIHggdm94ZWxTaXplYC4gVGhlIG9ic2VydmF0aW9ucywgYnkgY29udHJhY3QsIGFyZSBpbiB0aGUgcmVmZXJlbmNlXG4gICAqIHZvbHVtZSdzIGZyYW1lIHdpdGggaXRzIG5lYXIgY29ybmVyIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbiwgYW5kIHRoZSBkZW5zaXR5IGdyaWQgaXMgbWVhc3VyZWRcbiAgICogZnJvbSB0aGUgY29vcmRpbmF0ZSBvcmlnaW4gdGhlIHNhbWUgd2F5IChgZGVuc2l0eUdyaWRgKSwgc28gaXRzIGJveCBpcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzXG4gICAqIHdoZW4gdGhlcmUgaXMgb25lLiBTbyB0aGUgUE9JTlRTIG1vdmUgYnkgaGFsZiB0aGF0IGJveCDigJQge0BsaW5rIG9yaWdpbn0g4oCUIGFuZCBldmVyeSB2b2x1bWUsIHRoZVxuICAgKiByZWZlcmVuY2UsIHRoZSBkZW5zaXRpZXMgYW5kIHRoZSBnZW5lIG1hcCwgbGluZXMgdXAgd2l0aCB0aGVtIGFuZCB3aXRoIGVhY2ggb3RoZXIuIFdpdGhvdXQgYVxuICAgKiByZWZlcmVuY2Ugdm9sdW1lIHRoaXMgY2VudHJlcyB0aGUgY2xvdWQgdG9vLCB3aGljaCB0aGUgYXhlcyBhbmQgdGhlIFogc3RyZXRjaCBuZWVkOiBib3RoIHdvcmtcbiAgICogYWJvdXQgdGhlIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRnJhbWUoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC52b2x1bWU7XG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudH06JHttZXRhID8gYCR7bWV0YS53aWR0aH14JHttZXRhLmhlaWdodH14JHttZXRhLmRlcHRofWAgOiAnLSd9YDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmJveEtleSkgcmV0dXJuO1xuICAgIHRoaXMuYm94S2V5ID0ga2V5O1xuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0KTtcbiAgICB0aGlzLmJveCA9IGdyaWRcbiAgICAgID8ge1xuICAgICAgICAgIHdpZHRoOiBncmlkLndpZHRoICogZ3JpZC52b3hlbFNpemVbMF0sXG4gICAgICAgICAgaGVpZ2h0OiBncmlkLmhlaWdodCAqIGdyaWQudm94ZWxTaXplWzFdLFxuICAgICAgICAgIGRlcHRoOiBncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0sXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBib3ggPSB0aGlzLmJveDtcbiAgICB0aGlzLm9yaWdpbiA9IGJveCA/IFstYm94LndpZHRoIC8gMiwgLWJveC5oZWlnaHQgLyAyLCAtYm94LmRlcHRoIC8gMl0gOiBbMCwgMCwgMF07XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMubGF5ZXJLZXkgPSBudWxsO1xuICAgIHRoaXMuaW5zdGFsbEF4ZXMoZGF0YXNldCk7XG4gICAgLy8gQSBzdHJldGNoIGNob3NlbiBmb3IgYW5vdGhlciBib3ggbWF5IGJlIHBhc3Qgd2hhdCB0aGlzIG9uZSBhbGxvd3M6IGRyYXcgd2hhdCBpcyBpbiBlZmZlY3QuXG4gICAgdGhpcy5hcHBseVpTY2FsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBWb2x1bWUgdmlldydzIGF4ZXMgZ2l6bW8gYW5kIFotaGVpZ2h0IGhhbmRsZSwgb24ge0BsaW5rIGJveH0uIFRoZSBoYW5kbGUgZmxvYXRzIHBhc3QgdGhlXG4gICAqIHRvcCBvZiB0aGUgWiBheGlzICh0aGUgYm94J3MgbWluLVhZIGNvcm5lciwgd2hlcmUgdGhlIGJsdWUgYXhpcyBhbmQgaXRzIGxhYmVsIGFyZSksIGJ5IGEgc2hhcmVcbiAgICogb2YgdGhlIGJveCdzIGxhcmdlc3Qgc2lkZSByYXRoZXIgdGhhbiBvZiBpdHMgZGVwdGgsIHNvIGl0IGNsZWFycyB0aGUgbGFiZWwgZXZlbiB3aGlsZSBhIHRoaW5cbiAgICogc2VjdGlvbiBpcyBkcmF3biBmbGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsQXhlcyhkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQXhlcygpO1xuICAgIGNvbnN0IGJveCA9IHRoaXMuYm94O1xuICAgIGlmICghYm94KSByZXR1cm47XG4gICAgY29uc3QgeyB2aWV3ZXIsIGhvc3QsIHNldHRpbmdzIH0gPSB0aGlzLmN0eDtcbiAgICBjb25zdCBkcmF3biA9IHRoaXMuZHJhd25Cb3goYm94KTtcbiAgICB0aGlzLmdpem1vID0gbmV3IEF4ZXMzZEdpem1vKFxuICAgICAgdmlld2VyLFxuICAgICAgaG9zdCxcbiAgICAgIGRyYXduLFxuICAgICAgc3BhdGlhbEF4ZXNMYWJlbHMoZHJhd24sIHRoaXMuelNjYWxlKCksIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgICAge1xuICAgICAgICB2aXNpYmxlOiBzZXR0aW5ncy5heGVzVmlzaWJsZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBtYXhTY2FsZSA9IHNwYXRpYWxaU2NhbGVNYXgoYm94KTtcbiAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZShob3N0LCB2aWV3ZXIuY2FtZXJhM2QsIHtcbiAgICAgIHRvcEFuY2hvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBkID0gdGhpcy5kcmF3bkJveChib3gpO1xuICAgICAgICByZXR1cm4gWy1kLndpZHRoIC8gMiwgLWQuaGVpZ2h0IC8gMiwgZC5kZXB0aCAvIDIgKyAwLjA4ICogTWF0aC5tYXgoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpXTtcbiAgICAgIH0sXG4gICAgICBnZXRTY2FsZTogKCkgPT4gdGhpcy56U2NhbGUoKSxcbiAgICAgIHNldFNjYWxlOiAocykgPT4gdGhpcy5zZXRaU2NhbGUocyksXG4gICAgICBtaW5TY2FsZTogU1BBVElBTF9aX1NDQUxFX01JTixcbiAgICAgIG1heFNjYWxlLFxuICAgICAgcGl4ZWxzUGVyRG91YmxlOiBzcGF0aWFsWlBpeGVsc1BlckRvdWJsZShtYXhTY2FsZSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUF4ZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2l6bW8pIHtcbiAgICAgIHRoaXMuY3R4LnZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2l6bW8ubGF5ZXIpO1xuICAgICAgdGhpcy5naXptby5kZXN0cm95KCk7XG4gICAgICB0aGlzLmdpem1vID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy56SGFuZGxlPy5kZXN0cm95KCk7XG4gICAgdGhpcy56SGFuZGxlID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5IGxheWVyIG9mIHRoZSBjbG91ZCAodGhlIGRhdGFzZXQgd2VudCBhd2F5LCBvciBoYXMgbm8geikuICovXG4gIHByaXZhdGUgcmVtb3ZlTGF5ZXJzKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMuY2xlYXJGcmFtZSgpO1xuICAgIHRoaXMudHJhbnNjcmlwdHMzZC5yZW1vdmUoKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFt0aGlzLnBvaW50cywgdGhpcy52b2x1bWUsIHRoaXMuZ2VuZU1hcExheWVyLCAuLi50aGlzLmRlbnNpdHlMYXllcnNdKSB7XG4gICAgICBpZiAobGF5ZXIpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgdGhpcy5zZXNzaW9uLmdlbmVNYXBWb2x1bWUuZmllbGQgPSBudWxsO1xuICAgIHRoaXMuc2Vzc2lvbi5nZW5lTWFwVm9sdW1lLmtleSA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAvLyBUaGUgc2NlbmUgaXMgZ29uZSwgc28gdGhlIG5leHQgM0QgbGF5ZXIgc2hvdWxkIGZyYW1lIGl0c2VsZiBhZ2Fpbi4gVGhhdCB1c2VkIHRvIGJlXG4gICAgLy8gYHNwYXRpYWxGcmFtZWQgPSBudWxsYCBuZXh0IHRvIGEgaGFuZC1yb2xsZWQgc2F2ZS9yZXN0b3JlOyB0aGUgcmVuZGVyZXIgb3ducyB0aGVcbiAgICAvLyBwb2xpY3kgbm93LCBhbmQgdGhpcyBpcyB0aGUgc2FtZSBzdGF0ZW1lbnQgYWRkcmVzc2VkIHRvIGl0LlxuICAgIHZpZXdlci5yZXNldEZpdDNEKCk7XG4gICAgdGhpcy52b2x1bWUgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpbiA9IFswLCAwLCAwXTtcbiAgICB0aGlzLmJveCA9IG51bGw7XG4gICAgdGhpcy5ib3hLZXkgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlQXhlcygpO1xuICAgIHRoaXMucG9pbnRzID0gbnVsbDtcbiAgICB0aGlzLnNldFBpY2tlcihudWxsKTtcbiAgICB0aGlzLmxheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNjYWxhcktleSA9IG51bGw7XG4gICAgdGhpcy5wb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuZHJhd24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgY29sb3VycyB0aGUgY2xvdWQuXG4gICAqXG4gICAqIENvbnRpbnVvdXMgZGF0YSBnb2VzIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIHRoZSBzYW1lIHBlcmNlbnRpbGUgd2luZG93IHRoZSAyRCBwYXRoXG4gICAqIHVzZXMuIENhdGVnb3JpY2FsIGRhdGEgaXMgb25lIFJHQkEgcGVyIHBvaW50IGZyb20gdGhlIGNvbHVtbidzIHBhbGV0dGUsIHNvIGFueSBudW1iZXIgb2ZcbiAgICogY2F0ZWdvcmllcyBrZWVwcyBpdHMgb3duIGNvbG91ciDigJQgc2VlIGBlbmNvZGVTcGF0aWFsM2RDYXRlZ29yaWNhbGAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNjYWxhckVuY29kaW5nKHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGNvdW50OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNlc3Npb24ucG9ydDtcbiAgICAvLyBDb2xvdXJlZCBieSB0aGUgZ2VuZSBmaWx0ZXI6IGVhY2ggb2JzZXJ2YXRpb24gaW4gaXRzIGdlbmUncyBjb2xvdXIuXG4gICAgLy8gQSBjb2xvdXIgbGlrZSBhbnkgb3RoZXI6IGEgZmFpbGVkIHJlYWQgZmFsbHMgYmFjayB0byB0aGUgdmlldydzIGNvbG91ciBzb3VyY2UuXG4gICAgY29uc3QgYnlHZW5lID1cbiAgICAgIHBvcnQgJiYgY291bnRcbiAgICAgICAgPyBhd2FpdCBvYnNlcnZhdGlvbkdlbmVTdHlsZSh2aWV3LCBjb3VudCwgKGcpID0+IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAnW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgYnkgZ2VuZSBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byB0aGUgY29sb3VyIHNvdXJjZScsXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9KVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKGJ5R2VuZSkgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGJ5R2VuZS5jb2RlcywgYnlHZW5lLmNvbG9ycyk7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAvLyBPbmUgY29sb3VyLCB0aGUgY2VsbHMnIHRvbyAoXCJTaW5nbGUgY29sb3VyXCIpLlxuICAgIGlmICghY29sb3JCeSAmJiB2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwobmV3IFVpbnQxNkFycmF5KGNvdW50KSwgW3ZpZXcuY2VsbFNpbmdsZUNvbG9yXSk7XG4gICAgfVxuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKFxuICAgICAgICAgIGNvbHVtbi5jb2RlcyxcbiAgICAgICAgICBjYXRlZ29yeUNvbG9yc0Zvcihjb2xvckJ5Lm5hbWUsIGNvbHVtbi5tZXRhLCB2aWV3Lmdyb3VwQ29sb3JzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXMoY29sdW1uLnZhbHVlcywgdmlldyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVuY29kZUNvbnRpbnVvdXMoYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSksIHZpZXcpO1xuICB9XG5cbiAgLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiB0aGUgYWN0aXZlIGNvbG9ybWFwIG92ZXIgYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LiAqL1xuICBlbmNvZGVDb250aW51b3VzKHNvdXJjZTogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogU3BhdGlhbDNkU2NhbGFycyB7XG4gICAgcmV0dXJuIGVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgICBzb3VyY2UsXG4gICAgICB2aWV3LFxuICAgICAgdGhpcy5jdHguZGlzcGxheS5zcGF0aWFsTHV0KHZpZXcpLFxuICAgICAgdGhpcy5zZXNzaW9uLmNvbnRyYXN0V2luZG93cyxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9ic2VydmF0aW9ucyB0aGUgY2xvdWQgZHJhd3MsIGFuZCB0aGUga2V5cyBvZiBpdHMgZ2VvbWV0cnkgYW5kIG9mIGl0cyBjb2xvdXIgc291cmNlLlxuICpcbiAqIE9uZSBpbWFnZWQgc2VjdGlvbiwgb3IgdGhlIHdob2xlIHN0YWNrIChgc2hvd25gIG51bGwpLiBUaGUgc3Vic2V0IElTIHRoZSBnZW9tZXRyeSwgc28gaXRcbiAqIGJlbG9uZ3MgaW4gdGhlIGdlb21ldHJ5IGtleSByYXRoZXIgdGhhbiBiZWluZyByZS1kZXJpdmVkIHBlciBmcmFtZSDigJQgYW5kIGFuIG91dC1vZi1yYW5nZVxuICogaW5kZXggaXMgY2xhbXBlZCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGUgY2xvdWQsIGJlY2F1c2UgdGhlIHNlY3Rpb24gY291bnQgY2hhbmdlcyB3aXRoIHRoZVxuICogZGF0YXNldCB3aGlsZSB0aGUgdmlldyBzdGF0ZSBwZXJzaXN0cy4gVGhlIHNjYWxhcnMnIGlkZW50aXR5IGlzIHRyYWNrZWQgc2VwYXJhdGVseSBmcm9tIHRoZVxuICogZ2VvbWV0cnkncyAoYGNvbG9yQnlgIHBsdXMgdGhlIHRyYW5zZm9ybXMgZmVlZGluZyB0aGUgZW5jb2RpbmcpOiBhIG5ldyBjb2xvdXIgc291cmNlIHN3YXBzXG4gKiBgdmFsdWVzYCBpbiBwbGFjZSAobmFwYXJpLWpzIOKJpSAwLjE0KSwgd2hpbGUgYSBuZXcgZ2VvbWV0cnkgbmVlZHMgYSBuZXcgbGF5ZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb3VkU3Vic2V0KFxuICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgZ2VuZVNob3duOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4pOiB7IHNob3duOiBVaW50MzJBcnJheSB8IG51bGw7IGtleTogc3RyaW5nOyBzY2FsYXJLZXk6IHN0cmluZyB9IHtcbiAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICBjb25zdCBzZWN0aW9uID1cbiAgICB2aWV3LnBvaW50U2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5wb2ludFNlY3Rpb24pKV1cbiAgICAgIDogbnVsbDtcbiAgbGV0IHNob3duID0gc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBudWxsO1xuICAvLyBUaGUgZ2VuZSBmaWx0ZXIgbGVhdmVzIGl0cyB1bm1hdGNoZWQgb2JzZXJ2YXRpb25zIG91dCBvZiB0aGUgZ2VvbWV0cnksIHNvIHRoZXkgYXJlIG5laXRoZXJcbiAgLy8gZHJhd24gbm9yIHBpY2tlZC5cbiAgaWYgKGdlbmVTaG93bikgc2hvd24gPSBrZWVwU2hvd24oc2hvd24sIGdlbmVTaG93biwgb2JzLmNvdW50KTtcbiAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2VjdGlvbiA/PyAnYWxsJ306JHtnZW5lU2hvd24gPyBnZW5lRmlsdGVyS2V5KHZpZXcpIDogJyd9YDtcbiAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICBjb25zdCBzY2FsYXJLZXkgPSBbXG4gICAga2V5LFxuICAgIHZpZXcuY29sb3JCeVxuICAgICAgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gXG4gICAgICA6IHZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3NpbmdsZSdcbiAgICAgICAgPyBgc2luZ2xlOiR7dmlldy5jZWxsU2luZ2xlQ29sb3J9YFxuICAgICAgICA6ICdmbGF0JyxcbiAgICBncm91cENvbG9yc0tleSh2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsLCB2aWV3Lmdyb3VwQ29sb3JzKSxcbiAgICBvYnNlcnZhdGlvbkdlbmVTdHlsZUtleSh2aWV3KSxcbiAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICBjbGlwLmpvaW4oJywnKSxcbiAgXS5qb2luKCd8Jyk7XG4gIHJldHVybiB7IHNob3duLCBrZXksIHNjYWxhcktleSB9O1xufVxuXG4vKiogVGhlIG9ic2VydmF0aW9ucyBvZiBgaW5kaWNlc2AgKGV2ZXJ5IG9uZSB3aGVuIG51bGwpIHRoYXQgYHNob3duYCBrZWVwcy4gKi9cbmZ1bmN0aW9uIGtlZXBTaG93bihpbmRpY2VzOiBVaW50MzJBcnJheSB8IG51bGwsIHNob3duOiBVaW50OEFycmF5LCBjb3VudDogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoaW5kaWNlcyA/IGluZGljZXMubGVuZ3RoIDogY291bnQpO1xuICBsZXQgbiA9IDA7XG4gIGlmIChpbmRpY2VzKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIGlmIChzaG93bltpXSkgb3V0W24rK10gPSBpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaWYgKHNob3duW2ldKSBvdXRbbisrXSA9IGk7XG4gIH1cbiAgcmV0dXJuIG91dC5zdWJhcnJheSgwLCBuKTtcbn1cbiJdfQ==