@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
@@ -6,6 +6,7 @@ import { PlotlyService } from './implementations/plotly/plotly.service';
6
6
  import { OpenSeadragonVisualizerService } from './implementations/osd/openseadragon-visualizer.service';
7
7
  import { PlotType, isNapari3d, isNapariScatter, isSpatialOmics, isSpatialOmics3d, isNapariIsosurface, isNapariVolume, } from './contracts/plot-type';
8
8
  import { SPATIAL_DATA_PORT } from './contracts/ports/spatial-data.port';
9
+ import { drawnCellSets } from './spatial/lod';
9
10
  import { SpatialControlsFacade } from './spatial/spatial-controls.facade';
10
11
  import { RegionStore } from './store/region-store.service';
11
12
  import { RegionScopeCache } from './store/region-scope-cache';
@@ -102,6 +103,36 @@ export class RoutingVisualizerService {
102
103
  this.meshRequest = 0;
103
104
  /** The class groups shown in 3D, and the image they belong to. */
104
105
  this.classes3d$ = new BehaviorSubject([]);
106
+ /**
107
+ * The spatial dataset's region set attached to its image (see attachDatasetRegionSet): the image
108
+ * (its region scope key), the set's key, and where its slices are when it says (its `sliceZ`),
109
+ * which places its surfaces in spatial 3D on an image of one plane. `shown3d` once its classes
110
+ * were shown in 3D by themselves, which happens once per image.
111
+ */
112
+ this.datasetRegionSet = null;
113
+ /**
114
+ * Each image's attached region set, kept across image switches: coming back to the image finds
115
+ * its source still in the store (with what was taken from it, or deleted) and restores the set
116
+ * rather than attaching it again, which would start the source afresh.
117
+ */
118
+ this.attachedRegionSets = new Map();
119
+ /** The spatial dataset on offer (the port's), for the boundary set its region set is. */
120
+ this.spatialDataset = null;
121
+ /**
122
+ * Whether the Annotations switch last hid every class in a spatial view (see syncAnnotations), so
123
+ * a change of it, not every view emission, hides or shows them.
124
+ */
125
+ this.annotationsHidden = false;
126
+ /** The 3D view's global cells switch as last applied (see updateCells3d). */
127
+ this.cells3dMode = 'types';
128
+ /** Classes set the other way than the global switch in the Region Editor. */
129
+ this.cells3dOverrides = new Map();
130
+ /** The classes drawn as individual cells in spatial 3D, as last applied. */
131
+ this.individual3d$ = new BehaviorSubject(new Set());
132
+ /** The classes that can be drawn as individual cells now (see getCellableClasses3d$). */
133
+ this.cellable3d$ = new BehaviorSubject(new Set());
134
+ /** The dataset region set's planes while they slice the plotted image (see getDatasetPlanes$). */
135
+ this.datasetPlanes$ = new BehaviorSubject(null);
105
136
  /** The groups last asked for in 3D, with their colours: what an edit's rebuild shows again. */
106
137
  this.shown3d = [];
107
138
  /**
@@ -142,6 +173,8 @@ export class RoutingVisualizerService {
142
173
  /** Displayed slice. Only a volume-backed spatial dataset reads it, to keep a
143
174
  * region drawn over one section from selecting the whole depth behind it. */
144
175
  this.currentZIndex = 0;
176
+ /** The slice shown, the plot type or the dataset's planes changed (the spatial controls recount). */
177
+ this.spatialViewChanged$ = new Subject();
145
178
  this.intensitySampling = {
146
179
  // Load the displayed slice's pixels for a backend that has no frames of its own
147
180
  // (OpenSeadragon, napari-js; Plotly feeds its frames to the service when it plots).
@@ -157,6 +190,14 @@ export class RoutingVisualizerService {
157
190
  getViewportChange$: () => merge(...this.backends().map((b) => b.getIntensitySampling()?.getViewportChange$() ?? EMPTY)),
158
191
  };
159
192
  this.regionUpdates = this.regionStore.getRegionUpdateEvent().subscribe(() => this.onRegionsChanged());
193
+ this.planeCellsSub = this.spatialData
194
+ ? combineLatest([this.spatialData.getDataset$(), this.store.getSpatialView$()]).subscribe(([dataset]) => {
195
+ this.spatialDataset = dataset ?? null;
196
+ this.updatePlaneCells();
197
+ this.syncAnnotations();
198
+ this.updateCells3d();
199
+ })
200
+ : null;
160
201
  this.sections = new VolumeSections({
161
202
  volume: () => this.napari.volumeVoxels(),
162
203
  image: () => this.plottedFileName,
@@ -276,6 +317,8 @@ export class RoutingVisualizerService {
276
317
  // A stack can open away from slice 0 (`initialZIndex` — a volume opens
277
318
  // mid-specimen), and that arrives here rather than through setZIndex.
278
319
  this.currentZIndex = zIndex;
320
+ this.spatialViewChanged$.next();
321
+ zIndex = this.imageSlice(zIndex, imageInfo);
279
322
  const backend = this.imageBackend();
280
323
  if (backend === this.napari) {
281
324
  try {
@@ -317,6 +360,7 @@ export class RoutingVisualizerService {
317
360
  }
318
361
  plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace) {
319
362
  this.currentPlotType = plotType;
363
+ this.spatialViewChanged$.next();
320
364
  this.plottedFileName = imageInfo?.fileName;
321
365
  this.plottedInfo = imageInfo ?? null;
322
366
  this.plottedHeight = screenHeight;
@@ -328,6 +372,19 @@ export class RoutingVisualizerService {
328
372
  // Region surfaces belong to the image they were built from: another image drops them.
329
373
  if (this.classes3d$.value.length && this.plottedFileName !== this.classes3dImage)
330
374
  this.clearRegionClasses3d();
375
+ // So does a dataset's region set: where its planes are is no other image's. Its attachment is
376
+ // kept (attachedRegionSets), to be restored when its image is back.
377
+ if (this.datasetRegionSet && this.datasetRegionSet.image !== this.importImageKey()) {
378
+ this.datasetRegionSet = null;
379
+ this.napari.setRegionPlanes(null);
380
+ this.datasetPlanes$.next(null);
381
+ this.spatialViewChanged$.next();
382
+ this.updateVolumeView(plotType);
383
+ this.updateCells3d();
384
+ }
385
+ this.updatePlaneCells();
386
+ this.syncAnnotations();
387
+ this.updateCells3d();
331
388
  this.plotDiv = plotDiv;
332
389
  // Apply the per-image region cache (snapshot old regions, restore the new
333
390
  // image's, clear selection) for whichever backend renders — Plotly does
@@ -345,7 +402,15 @@ export class RoutingVisualizerService {
345
402
  this.lastRendered.reset();
346
403
  }
347
404
  this.lastRendered = next;
348
- const plotted = next.plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace);
405
+ const drawn = next.plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace);
406
+ // A dataset's region set is shown in 3D once the cloud's scene is up: its voxel step is the scene's.
407
+ const plotted = this.datasetRegionSet?.planes
408
+ ? drawn.then((ok) => {
409
+ if (ok)
410
+ this.showDatasetRegionSet3d();
411
+ return ok;
412
+ })
413
+ : drawn;
349
414
  if (!this.sliceDiv || !this.imageVolumeView)
350
415
  return plotted;
351
416
  // The split volume view: the slice pane follows the image (a new one, or its sharper pass).
@@ -474,12 +539,32 @@ export class RoutingVisualizerService {
474
539
  }
475
540
  setZIndex(zIndex) {
476
541
  this.currentZIndex = zIndex;
477
- this.renderer().setZIndex(zIndex);
542
+ this.spatialViewChanged$.next();
543
+ const slice = this.imageSlice(zIndex);
544
+ this.renderer().setZIndex(slice);
545
+ if (this.datasetRegionSet?.planes)
546
+ this.napari.setRegionPlane(zIndex);
478
547
  if (this.sliceMounted) {
479
- this.osd.setZIndex(zIndex);
548
+ this.osd.setZIndex(slice);
480
549
  this.sections.schedule();
481
550
  }
482
551
  }
552
+ /**
553
+ * The image's own slice for slider position `z`: 0 while the dataset region set's planes slice an
554
+ * image of one plane (the slider then picks the plane, see getDatasetPlanes$), else `z`.
555
+ */
556
+ imageSlice(z, info = this.plottedInfo) {
557
+ return this.datasetRegionSet?.planes && !info?.isStack ? 0 : z;
558
+ }
559
+ /**
560
+ * The planes of the spatial dataset's region set (its `sliceZ`, in observation units) while they
561
+ * slice the plotted image, an image of one plane; null otherwise. The host's slice slider then
562
+ * runs over them: each position shows that plane's regions and, in the 2D spatial view, the
563
+ * observations and transcripts nearest it, over the same image.
564
+ */
565
+ getDatasetPlanes$() {
566
+ return this.datasetPlanes$.asObservable();
567
+ }
483
568
  getTrueImageSize() {
484
569
  return this.renderer().getTrueImageSize();
485
570
  }
@@ -500,7 +585,11 @@ export class RoutingVisualizerService {
500
585
  }
501
586
  setPlotType(plotType) {
502
587
  this.currentPlotType = plotType;
588
+ this.spatialViewChanged$.next();
503
589
  this.updateVolumeView(plotType);
590
+ this.updatePlaneCells();
591
+ this.syncAnnotations();
592
+ this.updateCells3d();
504
593
  this.plotly.setPlotType(plotType);
505
594
  }
506
595
  /** @deprecated Use `getSurface3dControls()`. */
@@ -775,6 +864,278 @@ export class RoutingVisualizerService {
775
864
  this.regionStore.attachRegionSource(reuse, { slice: this.regionStore.getDisplaySlice() }, true);
776
865
  return true;
777
866
  }
867
+ /**
868
+ * Attach a spatial dataset's region set (a 3D segmentation's cells, outlined on every plane they
869
+ * span) to its image, the image plotted now, as the image's own regions are: over every slice
870
+ * from the set's planes (`'planes'`), not marked imported (it is the dataset's, nothing to save),
871
+ * leaving the image's drawn regions as they are. Once per image and set: called again (the
872
+ * dataset re-emitted, the image re-plotted) it changes nothing. Where the set's slices are (its
873
+ * `sliceZ`) places its surfaces among the observations in spatial 3D, where the region editor then
874
+ * offers its classes in 3D; there, every class is shown once by itself (see showDatasetRegionSet3d).
875
+ * Back on an image the set was attached to, with its source still the store's, it is restored as
876
+ * it was (what was taken from the source, or deleted, stays so), not attached again.
877
+ * Resolves false, changing nothing (the source disposed), when another image was plotted or
878
+ * another set attached while it opened, it could not be opened, or the image has region sources
879
+ * of its own (which it would replace, see keepsOwnSources).
880
+ */
881
+ async attachDatasetRegionSet(open, key) {
882
+ const image = this.importImageKey();
883
+ if (!image)
884
+ return false;
885
+ const current = this.datasetRegionSet;
886
+ if (current?.image === image && current.key === key) {
887
+ this.showDatasetRegionSet3d();
888
+ return true;
889
+ }
890
+ // Back on an image whose set is attached: its source is still the store's, with what was taken
891
+ // from it. Restored, not attached again.
892
+ const known = this.attachedRegionSets.get(image);
893
+ if (known?.key === key && known.opener && known.opener === this.regionStore.getPlanesSourceOpener()) {
894
+ this.useDatasetRegionSet(known);
895
+ return true;
896
+ }
897
+ if (this.keepsOwnSources(key))
898
+ return false;
899
+ // Claimed before the source opens: a second call meanwhile changes nothing.
900
+ const claim = { image, key, planes: null, groups: [], shown3d: false, opener: null };
901
+ this.datasetRegionSet = claim;
902
+ let first;
903
+ try {
904
+ first = await open();
905
+ }
906
+ catch (err) {
907
+ if (this.datasetRegionSet === claim)
908
+ this.datasetRegionSet = null;
909
+ console.warn("[visualizer] the dataset's region set could not be opened", err);
910
+ return false;
911
+ }
912
+ if (this.datasetRegionSet !== claim || this.importImageKey() !== image || this.keepsOwnSources(key)) {
913
+ if (this.datasetRegionSet === claim)
914
+ this.datasetRegionSet = null;
915
+ first.dispose();
916
+ return false;
917
+ }
918
+ const info = first.info;
919
+ const reuse = () => {
920
+ const source = first;
921
+ first = null;
922
+ return source ? Promise.resolve(source) : open();
923
+ };
924
+ const planes = info.sliceZ?.length && info.sliceZ.length === info.planes.length ? info.sliceZ : null;
925
+ // Sliced by its planes, the image's regions are held per plane (see useDatasetRegionSet): stack
926
+ // mode first, so the source is laid out on the plane shown.
927
+ if (planes && planes.length > 1 && !this.plottedInfo?.isStack && !this.regionStore.isStackMode()) {
928
+ const z = this.currentZIndex < planes.length ? this.currentZIndex : 0;
929
+ this.regionStore.enterStackMode(new Map([[z, this.regionStore.getRegions()]]), z, 'combined');
930
+ }
931
+ this.regionStore.attachRegionSource(reuse, 'planes');
932
+ const set = { ...claim, planes, groups: regionSetGroups(info), opener: reuse };
933
+ this.attachedRegionSets.set(image, set);
934
+ this.useDatasetRegionSet(set);
935
+ return true;
936
+ }
937
+ /**
938
+ * Whether the plotted image has region sources of its own (a served set, large saved ROIs, an
939
+ * annotation folder's slices), which attaching the dataset's set over every plane would replace,
940
+ * dropping them and what was taken from them: they are kept, and the set is not attached.
941
+ */
942
+ keepsOwnSources(key) {
943
+ if (!this.regionStore.hasAnyRegionSource())
944
+ return false;
945
+ console.warn(`[visualizer] the image has region sources of its own: the dataset's region set (${key}) is not attached over them`);
946
+ return true;
947
+ }
948
+ /**
949
+ * Make `set` the plotted image's region set: its planes slice the image (its regions per plane,
950
+ * as a stack's per slice: those drawn before go to the plane shown), place its surfaces in
951
+ * spatial 3D and drive the slider.
952
+ */
953
+ useDatasetRegionSet(set) {
954
+ this.datasetRegionSet = set;
955
+ const planes = set.planes;
956
+ const sliced = !!planes && planes.length > 1 && !this.plottedInfo?.isStack;
957
+ if (sliced && !this.regionStore.isStackMode()) {
958
+ const z = this.currentZIndex < planes.length ? this.currentZIndex : 0;
959
+ this.regionStore.enterStackMode(new Map([[z, this.regionStore.getRegions()]]), z, 'combined');
960
+ }
961
+ this.napari.setRegionPlanes(planes);
962
+ if (planes)
963
+ this.napari.setRegionPlane(this.currentZIndex);
964
+ this.datasetPlanes$.next(sliced ? planes : null);
965
+ this.spatialViewChanged$.next();
966
+ // Regions switched off in a spatial view before the set came: its classes are hidden as the
967
+ // rest are.
968
+ if (this.annotationsHidden &&
969
+ (isSpatialOmics(this.currentPlotType) || isSpatialOmics3d(this.currentPlotType))) {
970
+ this.setClassesHidden(set.groups.flatMap((g) => g.classes), true);
971
+ }
972
+ this.updateVolumeView(this.currentPlotType);
973
+ this.showDatasetRegionSet3d();
974
+ this.updatePlaneCells();
975
+ this.updateCells3d();
976
+ }
977
+ /**
978
+ * The dataset no longer names the attached set while its image is still plotted (see
979
+ * IVisualizer.releaseDatasetRegionSet): its planes, its surfaces and cells in 3D go, as on another
980
+ * image. Its attachment is kept (attachedRegionSets): the same set asked for again is restored.
981
+ */
982
+ releaseDatasetRegionSet(keep) {
983
+ const set = this.datasetRegionSet;
984
+ if (!set || set.key === keep)
985
+ return;
986
+ // One still opening (the claim) is dropped when it opens.
987
+ this.datasetRegionSet = null;
988
+ if (set.planes && this.classes3d$.value.length && this.classes3dImage === this.plottedFileName) {
989
+ this.clearRegionClasses3d();
990
+ }
991
+ this.napari.setRegionPlanes(null);
992
+ this.datasetPlanes$.next(null);
993
+ this.spatialViewChanged$.next();
994
+ this.updateVolumeView(this.currentPlotType);
995
+ this.updateCells3d();
996
+ this.updatePlaneCells();
997
+ }
998
+ /** The dataset region set's classes while in spatial 3D: those that can be drawn as cells. */
999
+ getCellableClasses3d$() {
1000
+ return this.cellable3d$.asObservable();
1001
+ }
1002
+ /** The classes the spatial 3D view draws as individual cells (see updateCells3d). */
1003
+ getIndividualClasses3d$() {
1004
+ return this.individual3d$.asObservable();
1005
+ }
1006
+ /** Draw these classes as individual cells in spatial 3D, or merged again (the global switch aside). */
1007
+ setClassesIndividual3d(classes, individual) {
1008
+ const global = this.cells3dMode === 'cells';
1009
+ for (const c of classes) {
1010
+ if (individual === global)
1011
+ this.cells3dOverrides.delete(c);
1012
+ else
1013
+ this.cells3dOverrides.set(c, individual);
1014
+ }
1015
+ this.updateCells3d(true);
1016
+ }
1017
+ /**
1018
+ * Which of the dataset region set's classes the spatial 3D view draws as individual cells: every
1019
+ * one with the panel's global switch on "cells", none on "types", each class the Region Editor
1020
+ * set the other way excepted. Turning the global switch resets those. The individual classes'
1021
+ * merged surfaces are left out (see showRegionClasses3d); their cells are drawn instead.
1022
+ */
1023
+ updateCells3d(force = false) {
1024
+ const mode = this.store.currentSpatialView().cells3d ?? 'types';
1025
+ if (mode !== this.cells3dMode) {
1026
+ this.cells3dMode = mode;
1027
+ this.cells3dOverrides.clear();
1028
+ force = true;
1029
+ }
1030
+ const classes = new Set();
1031
+ for (const g of this.datasetRegionSet?.planes ? this.datasetRegionSet.groups : []) {
1032
+ for (const c of g.classes) {
1033
+ if (this.cells3dOverrides.get(c) ?? mode === 'cells')
1034
+ classes.add(c);
1035
+ }
1036
+ }
1037
+ const cellable = new Set(isSpatialOmics3d(this.currentPlotType) && this.datasetRegionSet?.planes
1038
+ ? this.datasetRegionSet.groups.flatMap((g) => g.classes)
1039
+ : []);
1040
+ const had = this.cellable3d$.value;
1041
+ if (had.size !== cellable.size || [...cellable].some((c) => !had.has(c)))
1042
+ this.cellable3d$.next(cellable);
1043
+ const before = this.individual3d$.value;
1044
+ const same = before.size === classes.size && [...classes].every((c) => before.has(c));
1045
+ if (same && !force)
1046
+ return;
1047
+ if (!same)
1048
+ this.individual3d$.next(classes);
1049
+ this.napari.setRegionCells(classes.size ? [...classes] : null);
1050
+ // The merged surfaces follow: an individual class's leaves them, a merged one's comes back.
1051
+ if (!same && this.shown3d.length && this.classes3dImage === this.plottedFileName) {
1052
+ void this.showRegionClasses3d(this.shown3d);
1053
+ }
1054
+ }
1055
+ /**
1056
+ * In the spatial views (2D and 3D), the spatial panel's Regions switch (`showAnnotations`, off by
1057
+ * default) is every class's in the Region Editor's list, as their eyes are: off, every class is
1058
+ * hidden (the drawn regions' and the dataset region set's cell types alike: their regions in 2D,
1059
+ * their surfaces in 3D, and the eyes show it); on again, every class is shown. Applied when the
1060
+ * switch changes, or on entering a spatial view with it off (so by default), so a class hidden or
1061
+ * shown by its own eye meanwhile stays as it was set.
1062
+ */
1063
+ syncAnnotations() {
1064
+ if (!isSpatialOmics(this.currentPlotType) && !isSpatialOmics3d(this.currentPlotType))
1065
+ return;
1066
+ const hide = this.store.currentSpatialView().showAnnotations === false;
1067
+ if (hide === this.annotationsHidden)
1068
+ return;
1069
+ this.annotationsHidden = hide;
1070
+ const classes = this.knownClasses();
1071
+ if (classes.length)
1072
+ this.setClassesHidden(classes, hide);
1073
+ }
1074
+ /**
1075
+ * Every class the Region Editor lists for the image: the dataset region set's, those shown in 3D,
1076
+ * the drawn regions', and any hidden now.
1077
+ */
1078
+ knownClasses() {
1079
+ const out = new Set(this.regionStore.getHiddenClasses());
1080
+ for (const g of this.datasetRegionSet?.groups ?? [])
1081
+ g.classes.forEach((c) => out.add(c));
1082
+ for (const g of this.shown3d)
1083
+ g.classes.forEach((c) => out.add(c));
1084
+ for (const r of this.regionStore.getRegions())
1085
+ if (r.label)
1086
+ out.add(r.label);
1087
+ return [...out];
1088
+ }
1089
+ /**
1090
+ * The Cells panel's boundary set that is the dataset's region set (the one naming it as its
1091
+ * `regionSource`), while its planes are shown on the plotted image with its source still the
1092
+ * store's; null otherwise.
1093
+ */
1094
+ planeCellSet() {
1095
+ const set = this.datasetRegionSet;
1096
+ if (!set?.planes || !set.opener || set.opener !== this.regionStore.getPlanesSourceOpener())
1097
+ return null;
1098
+ return this.spatialDataset?.polygonTiles?.sets.find((s) => s.regionSource === set.key)?.name ?? null;
1099
+ }
1100
+ /**
1101
+ * While the dataset region set's planes are shown, the Cells panel draws each plane's cells from
1102
+ * it (its boundary set, see `CellLayers.setPlane`):
1103
+ * - that set is the panel's boundaries by default: a view that has not chosen a set (none yet, or
1104
+ * after a reset) is given it;
1105
+ * - in the 2D spatial view, while the panel draws them, the overlays do not draw the same
1106
+ * outlines a second time (`RegionStore.setRegionSourceDrawn`). They stay listed and editable
1107
+ * in the Region Editor, and are drawn by the overlays everywhere else.
1108
+ */
1109
+ updatePlaneCells() {
1110
+ const name = this.planeCellSet();
1111
+ const view = this.store.currentSpatialView();
1112
+ if (name && view.cellSet == null) {
1113
+ // Emits the view, which comes back here with the set chosen.
1114
+ this.store.setSpatialView({ cellSet: name });
1115
+ return;
1116
+ }
1117
+ const drawn = drawnCellSets(this.spatialDataset?.polygonTiles, view.cellSet);
1118
+ const byCells = !!name &&
1119
+ isSpatialOmics(this.currentPlotType) &&
1120
+ (view.showCells ?? true) &&
1121
+ drawn?.set === name &&
1122
+ !drawn.nucleusSet;
1123
+ this.regionStore.setRegionSourceDrawn(!byCells);
1124
+ }
1125
+ /**
1126
+ * In spatial 3D, with the dataset's region set placed there: show each of its classes in 3D, in
1127
+ * its colour, once per image, unless classes are shown already (the region editor's choice
1128
+ * stands, and hiding them all stays hidden).
1129
+ */
1130
+ showDatasetRegionSet3d() {
1131
+ const set = this.datasetRegionSet;
1132
+ if (!set?.planes || set.shown3d || !set.groups.length)
1133
+ return;
1134
+ if (!isSpatialOmics3d(this.currentPlotType) || this.classes3d$.value.length)
1135
+ return;
1136
+ set.shown3d = true;
1137
+ this.showRegionClasses3d(set.groups).catch((err) => console.warn('[visualizer] the cells could not be shown in 3D', err));
1138
+ }
778
1139
  /** Empty every slice of a stack (its regions and undo history) for regions imported over it. */
779
1140
  enterImportedStack(info) {
780
1141
  const layout = this.regionStore.isStackMode()
@@ -806,7 +1167,9 @@ export class RoutingVisualizerService {
806
1167
  /** Recompute which 3D view is on screen for `plotType` (see {@link volumeView$}). */
807
1168
  updateVolumeView(plotType) {
808
1169
  this.imageVolumeView = isNapariVolume(plotType) || isNapariIsosurface(plotType);
809
- const regions3d = this.imageVolumeView || (isSpatialOmics3d(plotType) && !!this.plottedInfo?.isStack);
1170
+ // The spatial cloud places the surfaces of a stack's slices, or of a region set's planes.
1171
+ const placed = !!this.plottedInfo?.isStack || !!this.datasetRegionSet?.planes;
1172
+ const regions3d = this.imageVolumeView || (isSpatialOmics3d(plotType) && placed);
810
1173
  // Every plot, as before: the Region Editor drops its per-class volumes on each (a new image).
811
1174
  this.volumeView$.next(regions3d);
812
1175
  }
@@ -870,7 +1233,10 @@ export class RoutingVisualizerService {
870
1233
  const step = this.napari.regionVoxelStep() ?? Math.max(1, width / 256);
871
1234
  const image = this.plottedFileName ?? '';
872
1235
  const cacheKey = (g) => `${image}|${step.toFixed(3)}|${g.classes.join(',')}`;
873
- const missing = groups.filter((g) => !this.meshCache.has(cacheKey(g)));
1236
+ // A group of classes drawn as individual cells has no merged surface (its cells are drawn).
1237
+ const individual = this.individual3d$.value;
1238
+ const merged = groups.filter((g) => !g.classes.length || !g.classes.every((c) => individual.has(c)));
1239
+ const missing = merged.filter((g) => !this.meshCache.has(cacheKey(g)));
874
1240
  if (missing.length) {
875
1241
  const names = missing.map((g) => g.key);
876
1242
  const what = names.length > 3 ? `${names.length} regions` : names.join(', ');
@@ -887,7 +1253,7 @@ export class RoutingVisualizerService {
887
1253
  }
888
1254
  if (request !== this.meshRequest)
889
1255
  return;
890
- this.napari.setRegionMeshes(groups.map((g) => {
1256
+ this.napari.setRegionMeshes(merged.map((g) => {
891
1257
  const mesh = this.meshCache.get(cacheKey(g)).mesh;
892
1258
  return { key: g.key, color: g.color, label: g.label, vertices: mesh.vertices, faces: mesh.faces };
893
1259
  }), this.plottedFileName);
@@ -1237,6 +1603,9 @@ export class RoutingVisualizerService {
1237
1603
  napari: this.napari,
1238
1604
  plotType: () => this.currentPlotType,
1239
1605
  zIndex: () => this.currentZIndex,
1606
+ planes: () => (this.plottedInfo?.isStack ? null : (this.datasetRegionSet?.planes ?? null)),
1607
+ slicePlanes: () => this.datasetRegionSet?.planes ?? null,
1608
+ viewChanged$: this.spatialViewChanged$.asObservable(),
1240
1609
  });
1241
1610
  return this.spatialFacade.controls;
1242
1611
  }
@@ -1248,6 +1617,7 @@ export class RoutingVisualizerService {
1248
1617
  this.spatialFacade?.dispose();
1249
1618
  this.spatialFacade = null;
1250
1619
  this.regionUpdates.unsubscribe();
1620
+ this.planeCellsSub?.unsubscribe();
1251
1621
  this.sectionSubs.unsubscribe();
1252
1622
  this.sections.stop();
1253
1623
  if (this.rebuildTimer)
@@ -1312,4 +1682,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1312
1682
  type: Inject,
1313
1683
  args: [SPATIAL_DATA_PORT]
1314
1684
  }] }] });
1315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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LE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRiw4QkFBOEIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsTUFBYztRQUNoRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7OzZGQUd5RjtJQUN6RixNQUFNO1FBQ0osSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7OEdBL3lDVSx3QkFBd0IsbUtBMEV6QixVQUFVLG9IQU9WLGlCQUFpQjtrSEFqRmhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkEyRTdCLE1BQU07MkJBQUMsVUFBVTs7MEJBTWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHJlc29sdmVDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQgfSBmcm9tICcuL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUGxvdGx5U2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHkuc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVZvbHVtZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaWV3ZXJCYWNrZW5kLFxuICBJVmlzdWFsaXplcixcbiAgTG9hZGVkSW1hZ2UsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG4gIElTcGF0aWFsQ29udHJvbHMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbn0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnkgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKipcbiAgICogV2hldGhlciByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRCBvbiBzY3JlZW46IGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldywgb3IgdGhlIDNEXG4gICAqIHNwYXRpYWwgY2xvdWQgb3ZlciBhIHN0YWNrIGltYWdlIChpdHMgcmVmZXJlbmNlIHZvbHVtZSdzLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpLiBCb3RoIGRyYXcgdGhlXG4gICAqIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhlIHNhbWUgd2F5IChWb2x1bWVSZWdpb25NZXNoZXMpLCBpbiB0aGUgdm9sdW1lJ3MgYm94LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgdGhlIGN1cnJlbnQgcGxvdCB0eXBlOiB0aGUgc2xpY2UgcGFuZSdzLiAqL1xuICBwcml2YXRlIGltYWdlVm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoc2VlIHtAbGluayBzZXRTbGljZUVkaXRvcn0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRWRpdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbnNUaHJvdWdoVm9sdW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogUmVnaW9uIHJlY29uc3RydWN0aW9ucyBidWlsdCBzbyBmYXIsIGJ5IGltYWdlLCByZXNvbHV0aW9uIGFuZCBjbGFzc2VzICh3aXRoIHRob3NlIGNsYXNzZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IE1lc2g7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBCdW1wZWQgcGVyIHtAbGluayBzaG93UmVnaW9uQ2xhc3NlczNkfSAoYW5kIHBlciBuZXcgaW1hZ2UpLCBzbyBvbmx5IHRoZSBsYXRlc3Qgb25lIHNob3dzLiAqL1xuICBwcml2YXRlIG1lc2hSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0QsIGFuZCB0aGUgaW1hZ2UgdGhleSBiZWxvbmcgdG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3NlczNkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4oXG4gICAgW10sXG4gICk7XG4gIHByaXZhdGUgY2xhc3NlczNkSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBncm91cHMgbGFzdCBhc2tlZCBmb3IgaW4gM0QsIHdpdGggdGhlaXIgY29sb3Vyczogd2hhdCBhbiBlZGl0J3MgcmVidWlsZCBzaG93cyBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSBzaG93bjNkOiBSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PiA9IFtdO1xuICAvKipcbiAgICogRWFjaCBjbGFzcydzIGZpbmdlcnByaW50IG9uIHRoZSBsaXZlIHNsaWNlIChzZWUgY2xhc3NTaWduYXR1cmVzKSwgd2hpY2ggaW1hZ2UgYW5kIHNsaWNlLCBhbmRcbiAgICogd2hhdCB0aGUgcmVnaW9uIHNvdXJjZXMgaG9sZCAoc2VlIFJlZ2lvblN0b3JlLmdldFNvdXJjZVN0YXRlS2V5KS4gTnVsbCB3aGlsZSBub3RoaW5nIGZvbGxvd3NcbiAgICogdGhlIGVkaXRzIChubyBzdXJmYWNlIGJ1aWx0LCBubyBzZWN0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIGxpdmVDbGFzc2VzOiB7IGF0OiBzdHJpbmc7IHNpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47IHNvdXJjZXM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgcGVuZGluZyByZWJ1aWxkIG9mIHRoZSBzdXJmYWNlcyBhbiBlZGl0IHRvdWNoZWQuICovXG4gIHByaXZhdGUgcmVidWlsZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZXM6IFN1YnNjcmlwdGlvbjtcblxuICAvLyDilIDilIAgVGhlIHNsaWNlIHBhbmUgKHRoZSB2b2x1bWUgdmlldydzIHNwbGl0KTogT1NEIGVkaXRpbmcgb25lIHNsaWNlIGJlc2lkZSB0aGUgM0QgdmlldyDilIDilIBcbiAgLyoqIFRoZSBkaXYgdGhlIHNsaWNlIHBhbmUgcmVuZGVycyBpbnRvIHdoaWxlIGl0IGlzIHdhbnRlZCAobnVsbDogbm8gc3BsaXQpLiAqL1xuICBwcml2YXRlIHNsaWNlRGl2OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZXRoZXIgT1NEIGlzIG1vdW50ZWQgaW4gdGhlIHNsaWNlIHBhbmU6IHJlZ2lvbiwgdG9vbCBhbmQgb3ZlcmxheSBjYWxscyBnbyB0byBpdC4gKi9cbiAgcHJpdmF0ZSBzbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBpbWFnZSB0aGUgc2xpY2UgcGFuZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBzbGljZUZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEJ1bXBlZCBwZXIgc2xpY2UtcGFuZSBtb3VudCBvciB0ZWFyZG93biwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBsYW5kcy4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcXVlc3QgPSAwO1xuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKHRoZSBwbGFuZXMgeCBhbmQgeSB0aHJvdWdoIHRoZSBzdGFjaykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbnM6IFZvbHVtZVNlY3Rpb25zO1xuICAvKiogVGhlIHogcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgc2xpY2UgdG8gc2hvdyAoc2VlIHtAbGluayBnZXRTbGljZURyYWckfSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2xpY2VEcmFnJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWN0aW9uU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFRoZSBpbWFnZSBpbmZvIGFuZCBzY3JlZW4gaGVpZ2h0IG9mIHRoZSBsYXN0IHBsb3QgKHdoYXQgdGhlIHNsaWNlIHBhbmUgbW91bnRzKS4gKi9cbiAgcHJpdmF0ZSBwbG90dGVkSW5mbzogSUltYWdlSW5mbyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9uIGltcG9ydCAoc2VlIHJlZ2lvbkltcG9ydFRpY2tldCk6IGl0cyBpZCBhbmQgdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0OiB7IGlkOiBudW1iZXI7IGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHsgaWQ6IDAsIGltYWdlOiB1bmRlZmluZWQgfTtcbiAgcHJpdmF0ZSBwbG90dGVkSGVpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsb3RseTogUGxvdGx5U2VydmljZSxcbiAgICBwcml2YXRlIG9zZDogT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmFwYXJpOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBhIGhvc3QgdGhhdCBzZXJ2ZXMgbm8gc3BhdGlhbC1vbWljcyBkYXRhIGJpbmRzIG5vdGhpbmcsXG4gICAgLy8gYW5kIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgdGhlbiByZXR1cm5zIG51bGwuXG4gICAgcHJpdmF0ZSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdG9yZTogU3BhdGlhbFNlbGVjdGlvblN0b3JlLFxuICAgIHByaXZhdGUgaW50ZW5zaXR5OiBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpXG4gICAgcHJpdmF0ZSBzcGF0aWFsRGF0YTogU3BhdGlhbERhdGFQb3J0IHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblJlZ2lvbnNDaGFuZ2VkKCkpO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBuZXcgVm9sdW1lU2VjdGlvbnMoe1xuICAgICAgdm9sdW1lOiAoKSA9PiB0aGlzLm5hcGFyaS52b2x1bWVWb3hlbHMoKSxcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICAgIHNob3dQbGFuZXM6IChwbGFuZXMpID0+IHRoaXMubmFwYXJpLnNldFNsaWNlUGxhbmVzKHBsYW5lcyksXG4gICAgICBvdXRsaW5lc0J5Q2xhc3M6IChsZXZlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5vdXRsaW5lc0J5Q2xhc3MobGV2ZWwpLFxuICAgICAgaXNDbGFzc0hpZGRlbjogKGxhYmVsKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmlzQ2xhc3NIaWRkZW4obGFiZWwpLFxuICAgICAgY29sb3JPZjogKGxhYmVsKSA9PiB0aGlzLmNsYXNzQ29sb3IobGFiZWwpLFxuICAgICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgY29sb3JtYXA6IChzdCwgbXVsdGljaGFubmVsKSA9PiB7XG4gICAgICAgIC8vIEFzIHRoZSB2b2x1bWUgc2NlbmUgY29sb3VycyB0aGUgY2hhbm5lbCAoaW52ZXJ0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjb2xvcm1hcCkuXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCksXG4gICAgICAgICAgcmV2ZXJzZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xvcm1hcChcbiAgICAgICAgICBtdWx0aWNoYW5uZWwgPyBjaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicsIGRpc3BsYXkpIDogdm9sdW1lQ29sb3JtYXAoc3QsIGRpc3BsYXkpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGludmVydDogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50SW52ZXJ0KCksXG4gICAgICBzbGljZTogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIC8vIEEgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgeiBwbGFuZSBwaWNrcyB0aGUgc2xpY2UgKHRocm91Z2ggdGhlIGhvc3QncyBzbGlkZXIsIHNvXG4gICAgLy8gdGhlIHN0b3JlIGFuZCB0aGUgc2xpY2UgcGFuZSBmb2xsb3cpLCB0aGUgb3RoZXJzIG1vdmUgdGhlaXIgc2VjdGlvbi5cbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZChcbiAgICAgIHRoaXMubmFwYXJpLmdldFNsaWNlUGxhbmVNb3ZlJCgpLnN1YnNjcmliZSgoeyBheGlzLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChheGlzID09PSAneicpIHRoaXMuc2xpY2VEcmFnJC5uZXh0KE1hdGgucm91bmQodmFsdWUpKTtcbiAgICAgICAgZWxzZSB0aGlzLnNlY3Rpb25zLnNldFBsYW5lKGF4aXMsIHZhbHVlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gIH1cblxuICAvKiogQSBjbGFzcydzIGNvbG91cjogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciwgZWxzZSBpdHMgcmVnaW9uIHNvdXJjZSdzLCBlbHNlIGEgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBjbGFzc0NvbG9yKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCkuZ2V0KGxhYmVsKSA/P1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3KCk/LmNvbG9yT2YoeyBsYWJlbCwgY29sb3I6IG51bGwgfSkgPz9cbiAgICAgICcjZmZjYzAwJ1xuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKG51bGxzIHdoaWxlIGl0IGlzIG5vdCBzcGxpdCkuICovXG4gIGdldFNlY3Rpb25WaWV3cyQoKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5nZXRWaWV3cyQoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgc2VjdGlvbidzIHBsYW5lIHRvIGBhdGAgKGltYWdlIHB4KS4gKi9cbiAgc2V0U2VjdGlvblBsYW5lKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCBhdCk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lOiB0aGUgaG9zdCBzaG93cyBpdCAoaXRzIHNsaWRlcikuICovXG4gIGdldFNsaWNlRHJhZyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZURyYWckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgMkQgbmFwYXJpIHR5cGVzIChpbWFnZSwgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIsIHNwYXRpYWwgb21pY3MpIOKAlCBhIDJEIGZhbGxiYWNrIGNoYWluXG4gICAqICAoT1NELCB0aGVuIFBsb3RseSkuXG4gICAqXG4gICAqICBOT1RFIGZvciBTUEFUSUFMX09NSUNTOiBvbmx5IG5hcGFyaS1qcyBkcmF3cyB0aGUgb2JzZXJ2YXRpb24gbWFya2Vycy4gSWYgaXQgZmFpbHMgKG5vIFdlYkdQVSxcbiAgICogIGRldmljZSBsb3NzKSB0aGUgZmFsbGJhY2sgcmVuZGVycyB0aGUgdGlzc3VlIGltYWdlIEFMT05FIOKAlCB0aGUgc3BhdGlhbCBsYXllciBpcyBhYnNlbnQsIG5vdFxuICAgKiAgZGVncmFkZWQuIFRoYXQgaXMgZGVsaWJlcmF0ZSBmb3Igbm93OiBzaG93aW5nIHRoZSBzbGlkZSBiZWF0cyBzaG93aW5nIG5vdGhpbmcsIGFuZCBhIFBsb3RseVxuICAgKiAgYHNjYXR0ZXJnbGAgc3BhdGlhbCBtb2RlIGlzIHRoZSBwbGFubmVkIHJlYWwgZmFsbGJhY2sgKHNlZSB0aGUgcGxvdC1tb2RlIGRlc2lnbiBkb2MpLiAqL1xuICBwcml2YXRlIGlzTmFwYXJpSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaVNjYXR0ZXIodCkgfHwgaXNTcGF0aWFsT21pY3ModCk7XG4gIH1cblxuICAvKiogVGhlIDNEIG5hcGFyaSB0eXBlcyAodm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZS9zY2F0dGVyLCBwbHVzIHRoZSAzRCBzcGF0aWFsIGNsb3VkKSDigJQgbm8gMkRcbiAgICogIGZhbGxiYWNrIGV4aXN0cyAoT1NEIGlzIGltYWdlLW9ubHkpLCBzbyB0aGV5IGZhbGwgc3RyYWlnaHQgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIGlzTmFwYXJpM2RUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpM2QodCkgfHwgaXNTcGF0aWFsT21pY3MzZCh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZW5kIHRvIGF0dGVtcHQgZm9yIHRoZSBjdXJyZW50IHBsb3QgdHlwZSB0aGlzIHJlbmRlci4gVGhlIGZhbGxiYWNrIGNoYWlucyBiZWxvdyBhcmVcbiAgICogbWlycm9yZWQgZXhhY3RseSBieSB7QGxpbmsgbG9hZH0gc28gdGhlIGhhbmRsZSBgcGxvdCgpYCByZWNlaXZlcyBhbHdheXMgY29tZXMgZnJvbSB0aGVcbiAgICogYmFja2VuZCBgcGxvdCgpYCBzZWxlY3RzIChubyBsb2FkL3Bsb3QgYmFja2VuZCBtaXNtYXRjaCk6XG4gICAqICAtIDJEIGltYWdlIChleHBsaWNpdCBgTkFQQVJJX0lNQUdFYCwgb3IgYElNQUdFYCB3aXRoIHRoZSBXZWJHUFUgb3B0LWluKTogbmFwYXJpLWpzIOKGkiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gcGxhaW4gYElNQUdFYCAobm8gb3B0LWluKTogT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIDNEIG5hcGFyaSAoYE5BUEFSSV9WT0xVTUVgL2BOQVBBUklfSVNPU1VSRkFDRWApOiBuYXBhcmktanMg4oaSIFBsb3RseSAoT1NEIGNhbid0IHJlbmRlciAzRCkuXG4gICAqL1xuICBwcml2YXRlIGltYWdlQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFBsb3RUeXBlO1xuICAgIC8vIDJEIGltYWdlIHdpdGggYSBuYXBhcmktanMgYXR0ZW1wdCAoZXhwbGljaXQgbmFwYXJpIGltYWdlLCBvciBvcHQtaW4gb24gdGhlIEltYWdlIHR5cGUpLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpSW1hZ2VUeXBlKHQpIHx8ICh0aGlzLmlzSW1hZ2VUeXBlKHQpICYmIHRoaXMuY29uZmlnLnVzZU5hcGFyaVJlbmRlcmVyKSkge1xuICAgICAgaWYgKCF0aGlzLm5hcGFyaUZlbGxCYWNrKSByZXR1cm4gdGhpcy5uYXBhcmk7XG4gICAgICBpZiAoIXRoaXMub3NkRmVsbEJhY2spIHJldHVybiB0aGlzLm9zZDtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgICB9XG4gICAgLy8gUGxhaW4gSW1hZ2UgdHlwZSAobm8gbmFwYXJpIG9wdC1pbik6IE9TRCwgdGhlbiBQbG90bHkuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZEZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm9zZDtcbiAgICB9XG4gICAgLy8gM0QgbmFwYXJpIHR5cGVzOiBuYXBhcmktanMsIHdpdGggUGxvdGx5IGFzIHRoZSBvbmx5IHZpYWJsZSBmYWxsYmFjay5cbiAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMubmFwYXJpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKiogQmFja2VuZCBjdXJyZW50bHkgb24gc2NyZWVuIOKAlCB3aGF0IG9uZ29pbmcgem9vbS90b29sL3JlZ2lvbiBvcHMgYWN0IG9uLiAqL1xuICBwcml2YXRlIHJlbmRlcmVyKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVuZGVyZWQgPz8gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgYWN0IG9uOiB0aGUgc2xpY2UgcGFuZSdzIE9TRCB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXNcbiAgICogc3BsaXQgKHJlZ2lvbnMgYXJlIGVkaXRlZCB0aGVyZSksIGVsc2UgdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBWaWV3IGNhbGxzICh6b29tLCBmaXQsIGNvbG91cixcbiAgICogZXhwb3J0KSBzdGF5IHdpdGgge0BsaW5rIHJlbmRlcmVyfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VNb3VudGVkID8gdGhpcy5vc2QgOiB0aGlzLnJlbmRlcmVyKCk7XG4gIH1cblxuICAvLyBTeXN0ZW0gY2FwYWJpbGl0aWVzIGFyZSBQbG90bHkncyAodGhlIGZ1bGwtZmVhdHVyZWQgYmFja2VuZCkgc28gdGhlIFVJXG4gIC8vIGtlZXBzIG9mZmVyaW5nIGV2ZXJ5IHBsb3QgdHlwZSByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyBvbiBzY3JlZW4uXG4gIGdldCBjYXBhYmlsaXRpZXMoKTogVmlld2VyQ2FwYWJpbGl0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuaW1hZ2VCYWNrZW5kKCk7XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5uYXBhcmkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBYm9ydGVkOiBub2JvZHkgd2FudHMgdGhpcyBpbWFnZSBhbnkgbW9yZSwgc28gZG9uJ3QgZ28gb24gdG8gbG9hZCBpdCBlbHNld2hlcmUuXG4gICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IHRydWU7XG4gICAgICAgIC8vIE1pcnJvciBpbWFnZUJhY2tlbmQoKSdzIGZhbGxiYWNrIHNvIGxvYWQgKyBwbG90IHBpY2sgdGhlIHNhbWUgYmFja2VuZDpcbiAgICAgICAgLy8gIC0gM0QgbmFwYXJpIHR5cGVzIGhhdmUgbm8gMkQgZmFsbGJhY2sg4oaSIHN0cmFpZ2h0IHRvIFBsb3RseS5cbiAgICAgICAgLy8gIC0gMkQgaW1hZ2Ug4oaSIE9TRCwgdGhlbiBQbG90bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHRoaXMuY3VycmVudFBsb3RUeXBlKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseS4nLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIE9wZW5TZWFkcmFnb24uJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyeSBPU0Q7IG9uIGZhaWx1cmUgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSAobm90IHBlcm1hbmVudCDigJQgc2VlIHJlc2V0KCkpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRWaWFPc2RUaGVuUGxvdGx5KFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5vc2QubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIE9wZW5TZWFkcmFnb24gbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHRoaXMub3NkRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICB9XG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiB1bmtub3duLFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlKTtcbiAgICAvLyBUaGUgc2xpY2UgcGFuZSBiZWxvbmdzIHRvIHRoZSB2b2x1bWUgdmlldzogYW5vdGhlciBwbG90IHR5cGUgdGFrZXMgaXQgZG93biAoT1NEIG1heSBiZVxuICAgIC8vIGFib3V0IHRvIGRyYXcgdGhlIG1haW4gdmlldywgd2hpY2ggbXVzdCBub3QgZmluZCB0aGUgcGFuZSdzIHZpZXdlciBzdGlsbCBtb3VudGVkKS5cbiAgICBpZiAoIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IHBsb3R0ZWQgPSBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gICAgaWYgKCF0aGlzLnNsaWNlRGl2IHx8ICF0aGlzLmltYWdlVm9sdW1lVmlldykgcmV0dXJuIHBsb3R0ZWQ7XG4gICAgLy8gVGhlIHNwbGl0IHZvbHVtZSB2aWV3OiB0aGUgc2xpY2UgcGFuZSBmb2xsb3dzIHRoZSBpbWFnZSAoYSBuZXcgb25lLCBvciBpdHMgc2hhcnBlciBwYXNzKS5cbiAgICByZXR1cm4gcGxvdHRlZC50aGVuKChvaykgPT4ge1xuICAgICAgaWYgKG9rICYmICghdGhpcy5zbGljZU1vdW50ZWQgfHwgdGhpcy5zbGljZUZpbGUgIT09IGltYWdlSW5mbz8uZmlsZU5hbWUgfHwgaW5QbGFjZSkpIHtcbiAgICAgICAgdm9pZCB0aGlzLm1vdW50U2xpY2UoISFpblBsYWNlICYmIHRoaXMuc2xpY2VNb3VudGVkICYmIHRoaXMuc2xpY2VGaWxlID09PSBpbWFnZUluZm8/LmZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB2b2x1bWUgd2FzIGFzc2VtYmxlZCBhZ2FpbiAoYW5vdGhlciBpbWFnZSwgb3IgcmVzb2x1dGlvbik6IGN1dCB0aGUgc2VjdGlvbnMgZnJvbSBpdC5cbiAgICAgIGlmIChvaykgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgICAgcmV0dXJuIG9rO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoZSB2b2x1bWUgdmlldzogc2hvdyB0aGUgc2xpY2UgYmVpbmcgZWRpdGVkIGluIGBkaXZgIChPcGVuU2VhZHJhZ29uLCB3aXRoIGV2ZXJ5IHJlZ2lvblxuICAgKiB0b29sKSBiZXNpZGUgdGhlIDNEIHZpZXcsIG9yIHN0b3AgKG51bGwpLiBLZXB0IGFjcm9zcyByZS1wbG90cyBvZiBhIHZvbHVtZSB2aWV3OyBhbm90aGVyIHBsb3RcbiAgICogdHlwZSB0YWtlcyB0aGUgcGFuZSBkb3duIGFuZCBhIHZvbHVtZSB2aWV3IGJyaW5ncyBpdCBiYWNrLiBSZXNvbHZlcyB3aGV0aGVyIHRoZSBwYW5lIHNob3dzLlxuICAgKi9cbiAgYXN5bmMgc2V0U2xpY2VFZGl0b3IoZGl2OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zbGljZURpdiA9IGRpdjtcbiAgICBpZiAodGhpcy5zbGljZUVkaXRvciQudmFsdWUgIT09ICEhZGl2KSB0aGlzLnNsaWNlRWRpdG9yJC5uZXh0KCEhZGl2KTtcbiAgICBpZiAoIWRpdikge1xuICAgICAgdGhpcy51bm1vdW50U2xpY2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW91bnRTbGljZShmYWxzZSk7XG4gIH1cblxuICAvKiogTW91bnQgKG9yIHJlZnJlc2ggaW4gcGxhY2UpIE9TRCBpbiB0aGUgc2xpY2UgcGFuZSBvbiB0aGUgZGlzcGxheWVkIHNsaWNlLiAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2xpY2UoaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuc2xpY2VEaXY7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgaWYgKCFkaXYgfHwgIWluZm8/LnVybHM/Lmxlbmd0aCB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnNsaWNlUmVxdWVzdDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5vc2QubG9hZChpbmZvLCB0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMub3NkLnBsb3QoZGl2LCBsb2FkZWQsIGluZm8sIHRoaXMucGxvdHRlZEhlaWdodCwgUGxvdFR5cGUuSU1BR0UsIGluUGxhY2UpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNsaWNlTW91bnRlZCA9IG9rO1xuICAgICAgdGhpcy5zbGljZUZpbGUgPSBpbmZvLmZpbGVOYW1lO1xuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIC8vIFRoZSBzbGljZSBtYXkgaGF2ZSBtb3ZlZCB3aGlsZSB0aGUgcGFuZSBsb2FkZWQuXG4gICAgICAgIHRoaXMub3NkLnNldFpJbmRleCh0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucy5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHJlcXVlc3QgPT09IHRoaXMuc2xpY2VSZXF1ZXN0KVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBUaGUgc2xpY2UgcGFuZSBjb3VsZCBub3Qgc2hvdyB0aGUgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGFrZSB0aGUgc2xpY2UgcGFuZSdzIHZpZXdlciBkb3duICh0aGUgc3BsaXQgc3RheXMgd2FudGVkIHdoaWxlIHtAbGluayBzbGljZURpdn0gaXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSB1bm1vdW50U2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVJlcXVlc3QrKztcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnJlc2V0KCk7XG4gICAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICB9XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRmlsZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuICByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCBvZiBhIHJlbmRlciBjeWNsZTogcmUtZW5hYmxlIG5hcGFyaS1qcy9PU0QgYXR0ZW1wdHMgKGNsZWFyIGFueSBwcmlvclxuICAgIC8vIHBlci1pbWFnZSBmYWxsYmFjaykgYW5kIHRlYXIgZG93biB3aGF0ZXZlcidzIG9uIHNjcmVlbi5cbiAgICB0aGlzLm9zZEZlbGxCYWNrID0gZmFsc2U7XG4gICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldCgpO1xuICB9XG4gIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZWxheW91dCh0cnVlSW1hZ2VTaXplKTtcbiAgfVxuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlc2V0QXhlcygpO1xuICB9XG4gIGZpdFRvVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZml0VG9WaWV3KCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZml0VG9WaWV3fS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0VG9WaWV3KCk7XG4gIH1cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tSW4oKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tT3V0KCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0RHJhZ01vZGUobW9kZSk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLm9zZC5zZXREcmFnTW9kZShtb2RlKTtcbiAgfVxuICAvKiogRXZlcnkgYmFja2VuZCwgb24gc2NyZWVuIG9yIG5vdC4gKi9cbiAgcHJpdmF0ZSBiYWNrZW5kcygpOiBJVmlld2VyQmFja2VuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYXZpZ2F0b3IgLyBzbW9vdGhpbmcgb3B0aW9ucywgYXBwbGllZCB0byBFVkVSWSBiYWNrZW5kIHRoYXQgaGFzIHRoZW0gKG5vdFxuICAgKiBqdXN0IHRoZSBhY3RpdmUgcmVuZGVyZXIpOiBjb25zdW1lcnMgc2V0IHRoZW0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHdoZW5cbiAgICogYHJlbmRlcmVyKClgIGlzIHN0aWxsIHRoZSBQbG90bHkgZGVmYXVsdCwgYW5kIE9TRC9uYXBhcmktanMgbXVzdCByZWNlaXZlIHRoZW1cbiAgICogdG8gaG9ub3VyIHRoZW0gYXQgdmlld2VyIGNyZWF0aW9uLlxuICAgKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy52aWV3T3B0aW9ucztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdPcHRpb25zOiBJT3NkVmlld09wdGlvbnMgPSB7XG4gICAgc2V0TmF2aWdhdG9yVmlzaWJsZTogKHZpc2libGUpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9LFxuICAgIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZDogKGVuYWJsZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgIH0sXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3T3B0aW9ucy5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKClgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICB9XG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRaSW5kZXgoekluZGV4KTtcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnNldFpJbmRleCh6SW5kZXgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgIH1cbiAgfVxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICB9XG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Q3VycmVudEltYWdlKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk7XG4gIH1cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZG93bmxvYWRJbWFnZSgpO1xuICB9XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0Q29tcG9zaXRlKCk7XG4gIH1cblxuICBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgdGhpcy5wbG90bHkuc2V0UGxvdFR5cGUocGxvdFR5cGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAobmFwYXJpLWpzKSwgZWxzZSBudWxsLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRWb2x1bWVSZXNvbHV0aW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LnNldChzY2FsZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KCkgPz8gMTtcbiAgfVxuICAvKiogVGhlIHZpZXdwb3J0IG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgZm9yIGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlLiBOdWxsXG4gICAqICB3aGVuIHRoYXQgYmFja2VuZCBjYW5ub3QgcHJvdmlkZSBvbmUgKGUuZy4gT1NEIGZlbGwgYmFjayB0byBQbG90bHkpLiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFBsb3RNb2RlVmlld3BvcnQ/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gUGxvdGx5IGVudW1lcmF0ZXMgdGhlIGZ1bGwgUExPVF9UWVBFX0RFU0NSSVBUT1JTIG1hcCwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB0aGVcbiAgICAvLyBuYXBhcmktanMgV2ViR1BVIHR5cGVzIChqaXQtdWkjMTAyKSDigJQgc28gdGhpcyBzaW5nbGUgc291cmNlIGNvdmVycyB0aGVtIChubyBkdXBsaWNhdGVzKS5cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgKyBzdGFjayBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2V0U3RhY2tMb2FkaW5nKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRTdGFja0xvYWRpbmcoYik7XG4gIH1cbiAgLy8gQ2FuY2VsIGluLWZsaWdodCBsb2FkaW5nIG9uIGV2ZXJ5IGJhY2tlbmQg4oCUIHRoZSB1c2VyJ3MgQ2FuY2VsIHNob3VsZG4ndCBkZXBlbmQgb24gd2hpY2ggb25lIGlzXG4gIC8vIGFjdGl2ZS4gT25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBmcmFtZXMgKG5hcGFyaS1qcykgZG8gcmVhbCB3b3JrOyB0aGUgcmVzdCBuby1vcC4gVGhlIGNvbmNyZXRlXG4gIC8vIGJhY2tlbmQgY2xhc3NlcyBkb24ndCBhbGwgZGVjbGFyZSB0aGUgb3B0aW9uYWwgY29udHJhY3QgbWV0aG9kLCBzbyBjYWxsIGl0IHZpYSBJVmlld2VyQmFja2VuZC5cbiAgY2FuY2VsTG9hZGluZygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJhY2tlbmQgb2YgW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldIGFzIElWaWV3ZXJCYWNrZW5kW10pIHtcbiAgICAgIGJhY2tlbmQuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgfVxuICB9XG4gIC8vIExvYWRpbmcgc3RhdGUgaXMgc3VyZmFjZWQgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBkb2luZyB0aGUgd29yazogT1NEIGFuZCBuYXBhcmktanMgKHZvbHVtZVxuICAvLyBhc3NlbWJseSkgZHJpdmUgdGhlaXIgb3duIHN1YmplY3RzLCBzbyBtZXJnZSBhbGwgdGhyZWUgaW50byBvbmUgc3RhYmxlIHN0cmVhbSB0aGUgaG9zdFxuICAvLyBzdWJzY3JpYmVzIHRvIG9uY2UuIChQcmV2aW91c2x5IGhhcmRjb2RlZCB0byBQbG90bHksIHNvIG5hcGFyaS9PU0QgcHJvZ3Jlc3MgbmV2ZXIgc2hvd2VkLilcbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wbG90bHkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMub3NkLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm5hcGFyaS5pc1N0YWNrTG9hZGluZygpLFxuICAgIF0pLnBpcGUobWFwKChmbGFncykgPT4gZmxhZ3Muc29tZShCb29sZWFuKSkpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLy8gUmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB3aGljaGV2ZXIgYmFja2VuZCBpcyBBQ1RJVkVMWSBsb2FkaW5nIChtYXggYWNyb3NzIGFjdGl2ZSBvbmVzKS4gQSBwbGFpblxuICAgIC8vIG1lcmdlIGxldCBhbiBpZGxlIGJhY2tlbmQncyBzdGFsZSB2YWx1ZSB3aW4gdGhlIHN0cmVhbSBvbiBhIHJlLWxvYWQg4oCUIGxlYXZpbmcgdGhlIGJhciBiZWxvdyB0aGVcbiAgICAvLyBhY3RpdmUgYmFja2VuZCdzIHJlYWwgcHJvZ3Jlc3MgKGUuZy4gc3R1Y2sgfuKFkyB3aGlsZSB0aGUgJSByZWFkIDEwMCkuIEdhdGluZyBieSB0aGUgbG9hZGluZyBmbGFnXG4gICAgLy8gaWdub3JlcyBpZGxlIGJhY2tlbmRzLCBzbyB0aGUgYmFyIHRyYWNrcyB0aGUgb25lIGRvaW5nIHRoZSB3b3JrIGFuZCByZWFjaGVzIDEwMCUuXG4gICAgY29uc3QgdHJhY2sgPSAodjogSVZpZXdlckJhY2tlbmQpOiBPYnNlcnZhYmxlPFtudW1iZXIsIGJvb2xlYW5dPiA9PlxuICAgICAgY29tYmluZUxhdGVzdChbdi5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLCB2LmlzU3RhY2tMb2FkaW5nKCldKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdHJhY2sodGhpcy5wbG90bHkpLCB0cmFjayh0aGlzLm9zZCksIHRyYWNrKHRoaXMubmFwYXJpKV0pLnBpcGUoXG4gICAgICBtYXAoKHBhaXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHBhaXJzLmZpbHRlcigoWywgbG9hZGluZ10pID0+IGxvYWRpbmcpLm1hcCgoW3BdKSA9PiBwKTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5sZW5ndGggPyBNYXRoLm1heCguLi5hY3RpdmUpIDogMDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLy8gRXZlcnkgYmFja2VuZCBmaXRzIHRvIHZpZXcgb24gaXRzIG93biAoUGxvdGx5J3MgYXV0b3NjYWxlLCBPU0QncyBnb0hvbWUsIG5hcGFyaSdzIGNhbWVyYVxuICAvLyBmaXQpIGFuZCBlYWNoIGVtaXRzIGZyb20gaXRzIG93biBzdWJqZWN0LCBzbyBtZXJnZSBhbGwgdGhyZWU6IGxpc3RlbmluZyB0byBQbG90bHkgYWxvbmVcbiAgLy8gbWlzc2VkIHRoZSBjb250ZXh0LW1lbnUgQXV0b3NjYWxlIG9uIHRoZSBJbWFnZSBhbmQgbmFwYXJpIHZpZXdzLlxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aGlzLnBsb3RseS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICAgdGhpcy5vc2QuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMubmFwYXJpLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgKS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuICAvKiogVGhlIGxpbmUtUk9JIHByb2ZpbGVzOiBzYW1wbGVkIGJ5IHRoZSBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UuICovXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmdldEludGVuc2l0eVByb2ZpbGUkKCk7XG4gIH1cbiAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIFBsb3RseSBMSU5FIGNoYXJ0IOKAlCByZW5kZXIgaXQgdGhyb3VnaCBQbG90bHkgd2hpY2hldmVyXG4gIC8vIGJhY2tlbmQgZHJhd3MgdGhlIG1haW4gaW1hZ2UuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZCwgcHJvZmlsZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlZ2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyBldmVyeSByZWFkIGFuZCB3cml0ZSBnb2VzXG4gIC8vIHN0cmFpZ2h0IHRvIGl0LiBFdmVyeSBiYWNrZW5kIGRyYXdzIGZyb20gdGhlIHN0b3JlJ3MgZXZlbnRzOiB0aGUgT1NEIGFuZFxuICAvLyBuYXBhcmktanMgb3ZlcmxheXMgYW5kIFBsb3RseSdzIHNoYXBlIHByb2plY3Rpb24gcmVkcmF3IG9uIGl0cyByZWdpb24tdXBkYXRlXG4gIC8vIGFuZCBzZWxlY3Rpb24gc3RyZWFtcywgYW5kIHRoZSBjYW52YXMgdG9vbHMgcmVzZXQgb24gZ2V0UmVnaW9uU2V0UmVwbGFjZWQkXG4gIC8vICh1bmRvLCByZWRvLCBhIHNsaWNlIHN3aXRjaCkuXG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gIH1cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgfVxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpO1xuICB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCk7XG4gIH1cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQkKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVtb3ZlQ2xhc3MobmFtZSk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7XG4gIH1cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTtcbiAgfVxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVkbygpO1xuICB9XG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpO1xuICB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpO1xuICB9XG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7XG4gIH1cbiAgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTtcbiAgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cik7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciB0aGUgaW1hZ2UgbGFzdCBwbG90dGVkLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leHBvcnRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucGxvdHRlZEZpbGVOYW1lKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnMpO1xuICB9XG5cbiAgLyoqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSAoc2VlIFJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSkuICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlLCBzbGljZXMpO1xuICB9XG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZShnZW9Kc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZ2VvSnNvblN0ci5sZW5ndGggPCAodGhpcy5jb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzID8/IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvcGVuZWQ6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShnZW9Kc29uU3RyKTtcbiAgICAvLyBUaGUgZmlyc3Qgb3BlbiBpcyB0aGUgb25lIGp1c3QgbWFkZTsgYSBzb3VyY2UgY2xvc2VkIHRvIHNhdmUgbWVtb3J5IHBhcnNlcyBhZ2Fpbi5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSgoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvcGVuZWQ7XG4gICAgICBvcGVuZWQgPSBudWxsO1xuICAgICAgcmV0dXJuIHNvdXJjZSA/IFByb21pc2UucmVzb2x2ZShzb3VyY2UpIDogb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJvcFJlZ2lvblNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5kcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRpY2tldCBmb3IgYSByZWdpb24gaW1wb3J0IHRoYXQgaXMgYWJvdXQgdG8gcmVhZCBvciBkZWNvZGUgaXRzIGZpbGVzOiB0aGUgaW1wb3J0IG1ldGhvZHNcbiAgICogZ2l2ZW4gaXQgY2hhbmdlIG5vdGhpbmcgb25jZSBpdCBpcyBzdGFsZSDigJQgYW5vdGhlciBpbXBvcnQgdG9vayBhIHRpY2tldCBzaW5jZSwgYW5vdGhlciBpbWFnZVxuICAgKiB3YXMgcGxvdHRlZCwgb3IgdGhlIHNlcnZpY2Ugd2FzIGRlc3Ryb3llZCDigJQgc28gYW4gaW1wb3J0IHRoYXQgZmluaXNoZXMgbGF0ZSBuZXZlciBsYW5kcyBvbiBhblxuICAgKiBpbWFnZSBpdCB3YXMgbm90IHN0YXJ0ZWQgZm9yLlxuICAgKi9cbiAgcmVnaW9uSW1wb3J0VGlja2V0KCk6IG51bWJlciB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB0aGlzLmltcG9ydEltYWdlS2V5KCkgfTtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRUaWNrZXQuaWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgdGlja2V0YCBpcyBzdGlsbCB0aGUgY3VycmVudCBpbXBvcnQncywgb24gdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0VmFsaWQodGlja2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGlja2V0ID09PSB0aGlzLmltcG9ydFRpY2tldC5pZCAmJiB0aGlzLmltcG9ydFRpY2tldC5pbWFnZSA9PT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRJbWFnZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KHRoaXMucGxvdHRlZEluZm8gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIHNvdXJjZSBwZXIgc2xpY2UsIGFzIGFuIGltcG9ydGVkIGxhYmVsXG4gICAqIHZvbHVtZSBvciBmb2xkZXIgb2YgcGVyLXNsaWNlIHJlZ2lvbiBmaWxlcyBnaXZlcyB0aGVtOiBgb3BlbmVyc2AgYnkgc2xpY2UgaW5kZXgsIGVhY2ggb3BlbmVkXG4gICAqIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93bi4gQSBzaW5nbGUgaW1hZ2UgdGFrZXMgc2xpY2UgMCdzLiBSZXR1cm5zIGhvdyBtYW55IHNsaWNlc1xuICAgKiBoYXZlIGEgc291cmNlLCBvciBudWxsIChjaGFuZ2luZyBub3RoaW5nKSB3aGVuIGB0aWNrZXRgIGlzIHN0YWxlIChzZWVcbiAgICoge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH0pLiBUaGUgc291cmNlcyBhcmUgbWFya2VkIGltcG9ydGVkLCBzbyBhIHNhdmUgd3JpdGVzIGV2ZXJ5IHNsaWNlLlxuICAgKi9cbiAgaW1wb3J0U2xpY2VSZWdpb25Tb3VyY2VzKG9wZW5lcnM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVnaW9uU291cmNlT3BlbmVyPiwgdGlja2V0PzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHRpY2tldCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmltcG9ydFRpY2tldFZhbGlkKHRpY2tldCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7IC8vIHN1cGVyc2VkZXMgYW55IGltcG9ydCBzdGlsbCBpbiBmbGlnaHRcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoIWluZm8/LmlzU3RhY2spIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3BlbmVycy5nZXQoMCkgPz8gb3BlbmVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKGZpcnN0LCB7IHNsaWNlOiAwIH0sIHRydWUpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8pO1xuICAgIGZvciAoY29uc3QgW3osIG9wZW5dIG9mIG9wZW5lcnMpIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKG9wZW4sIHsgc2xpY2U6IHogfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9wZW5lcnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIGltcG9ydGVkIHNvdXJjZSAoYSByZWdpb24gc2V0IHRoZVxuICAgKiBob3N0J3Mgc2VydmVyIHNlcnZlcyk6IG92ZXIgZXZlcnkgc2xpY2Ugb2YgYSBzdGFjayB3aGVuIGl0IGlzIHotaW5kZXhlZCwgZWxzZSBvbiB0aGUgc2xpY2VcbiAgICogc2hvd24sIGFzIHtAbGluayBhcHBseUltYWdlUm9pc30gbGF5cyBvdXQgYW4gaW1hZ2UncyBvd24uIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nXG4gICAqIChhbmQgZGlzcG9zaW5nIHRoZSBzb3VyY2UpLCB3aGVuIHRoZSBpbXBvcnQgd2VudCBzdGFsZSB3aGlsZSBpdCBvcGVuZWQ6IGFub3RoZXIgaW1wb3J0LCBvclxuICAgKiBhbm90aGVyIGltYWdlIChzZWUge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH07IG9uZSBpcyB0YWtlbiBoZXJlIHdoZW4gYHRpY2tldGAgaXMgbm90IGdpdmVuKS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcihvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsIHRpY2tldD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1pbmUgPSB0aWNrZXQgPz8gdGhpcy5yZWdpb25JbXBvcnRUaWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuaW1wb3J0VGlja2V0VmFsaWQobWluZSkpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZmlyc3Q6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuKCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSB7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGNvbnN0IHBsYW5lcyA9IGZpcnN0LmluZm8ucGxhbmVzO1xuICAgIGNvbnN0IHpJbmRleGVkID0gISFpbmZvPy5pc1N0YWNrICYmIHBsYW5lcy5zb21lKChwKSA9PiBwICE9PSAwKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8gYXMgSUltYWdlSW5mbyk7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgJ3BsYW5lcycsIFsuLi5wbGFuZXNdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCB7IHNsaWNlOiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpIH0sIHRydWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEVtcHR5IGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgKGl0cyByZWdpb25zIGFuZCB1bmRvIGhpc3RvcnkpIGZvciByZWdpb25zIGltcG9ydGVkIG92ZXIgaXQuICovXG4gIHByaXZhdGUgZW50ZXJJbXBvcnRlZFN0YWNrKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKClcbiAgICAgID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKVxuICAgICAgOiBpbmZvLnRpbGVkID09PSBmYWxzZVxuICAgICAgICA/ICdwZXItc2xpY2UtZmlsZSdcbiAgICAgICAgOiAnY29tYmluZWQnO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpLCBsYXlvdXQpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5KTtcbiAgfVxuICBzZWxlY3RTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzKTtcbiAgfVxuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblN0eWxlJCgpO1xuICB9XG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9uU3R5bGUocGF0Y2gpO1xuICB9XG4gIC8vIOKUgOKUgCBSZWdpb25zIGluIDNEOiB0aGVpciByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSB2aWV3IOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWNvbXB1dGUgd2hpY2ggM0QgdmlldyBpcyBvbiBzY3JlZW4gZm9yIGBwbG90VHlwZWAgKHNlZSB7QGxpbmsgdm9sdW1lVmlldyR9KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWb2x1bWVWaWV3ID0gaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSk7XG4gICAgY29uc3QgcmVnaW9uczNkID0gdGhpcy5pbWFnZVZvbHVtZVZpZXcgfHwgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpICYmICEhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjayk7XG4gICAgLy8gRXZlcnkgcGxvdCwgYXMgYmVmb3JlOiB0aGUgUmVnaW9uIEVkaXRvciBkcm9wcyBpdHMgcGVyLWNsYXNzIHZvbHVtZXMgb24gZWFjaCAoYSBuZXcgaW1hZ2UpLlxuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChyZWdpb25zM2QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIG9uIHNjcmVlbjogcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0QuICovXG4gIGdldFZvbHVtZVZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKGl0IHNob3dzIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuKS4gKi9cbiAgZ2V0U2xpY2VFZGl0b3IkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlRWRpdG9yJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldyBkcmF3cyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuICovXG4gIGdldFJlZ2lvbnNUaHJvdWdoVm9sdW1lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUgKGl0IGhpZGVzIG5vbmUgb2YgdGhlbTogc3VyZmFjZXMgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcykgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzICh0aGUgZGVmYXVsdCkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLnZhbHVlID09PSB0aHJvdWdoKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQubmV4dCh0aHJvdWdoKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNEIG9uIHRoaXMgaW1hZ2UgKFtdIGFmdGVyIGEgc3dpdGNoIHRvIGFub3RoZXIgaW1hZ2UpLiAqL1xuICBnZXRSZWdpb25DbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXMzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogSGlkZSBldmVyeSByZWdpb24gc3VyZmFjZSBhbmQgZm9yZ2V0IHRoZW0gKGEgYnVpbGQgc3RpbGwgcnVubmluZyBpcyBkcm9wcGVkKS4gKi9cbiAgcHJpdmF0ZSBjbGVhclJlZ2lvbkNsYXNzZXMzZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc2hSZXF1ZXN0Kys7XG4gICAgdGhpcy5zaG93bjNkID0gW107XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoW10pO1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFtdLCB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChbXSk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBncm91cCBrZXlzIGluIHRoZSB2b2x1bWUgdmlldyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCAoaXRzIGdyb3VwIGtleSksIG9yIG5vbmUgKG51bGwpLiAqL1xuICBnZXRSZWdpb25QaWNrZWQzZCQoKTogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nIHwgbnVsbDsgYWRkaXRpdmU6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25NZXNoUGljayQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZXNlIGdyb3VwcyBvZiBjbGFzc2VzIGluIHRoZSB2b2x1bWUgdmlldyBhcyAzRCByZWNvbnN0cnVjdGlvbnMgKGVhY2ggZ3JvdXAgb25lIHN1cmZhY2VcbiAgICogaW4gaXRzIGNvbG91cjogYW4gYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpLCBhbmQgb25seSB0aGVzZTsgW10gaGlkZXMgdGhlbS5cbiAgICogUmVjb25zdHJ1Y3RlZCBmcm9tIGV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgYXQgdGhlIHZvbHVtZSdzIHJlc29sdXRpb24sIGNhY2hlZCBwZXIgaW1hZ2UuXG4gICAqL1xuICBhc3luYyBzaG93UmVnaW9uQ2xhc3NlczNkKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMubWVzaFJlcXVlc3Q7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lO1xuICAgIHRoaXMuc2hvd24zZCA9IGdyb3VwcztcbiAgICAvLyBXaGF0IGFuIGVkaXQgZnJvbSBub3cgb24gaXMgY29tcGFyZWQgd2l0aCAodGhlIGxpdmUgc2xpY2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQgeWV0KS5cbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChncm91cHMubWFwKChnKSA9PiAoeyBrZXk6IGcua2V5LCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpKTtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpPy53aWR0aCA/PyAxMDI0O1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSA/PyBNYXRoLm1heCgxLCB3aWR0aCAvIDI1Nik7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJztcbiAgICBjb25zdCBjYWNoZUtleSA9IChnOiB7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0pID0+IGAke2ltYWdlfXwke3N0ZXAudG9GaXhlZCgzKX18JHtnLmNsYXNzZXMuam9pbignLCcpfWA7XG4gICAgY29uc3QgbWlzc2luZyA9IGdyb3Vwcy5maWx0ZXIoKGcpID0+ICF0aGlzLm1lc2hDYWNoZS5oYXMoY2FjaGVLZXkoZykpKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbWlzc2luZy5tYXAoKGcpID0+IGcua2V5KTtcbiAgICAgIGNvbnN0IHdoYXQgPSBuYW1lcy5sZW5ndGggPiAzID8gYCR7bmFtZXMubGVuZ3RofSByZWdpb25zYCA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBkb25lID0gdGhpcy5uYXBhcmkuYmVnaW5UYXNrKGBCdWlsZGluZyAke3doYXR9IGluIDNE4oCmYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidWlsdCA9IGF3YWl0IHRoaXMucmVnaW9uU3RvcmUucmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgICAgICAgIG1pc3NpbmcubWFwKChnKSA9PiAoeyBrZXk6IGNhY2hlS2V5KGcpLCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNsYXNzZXNPZiA9IG5ldyBNYXAobWlzc2luZy5tYXAoKGcpID0+IFtjYWNoZUtleShnKSwgZy5jbGFzc2VzXSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnVpbHQpIHRoaXMubWVzaENhY2hlLnNldChiLmtleSwgeyBtZXNoOiBiLm1lc2gsIGNsYXNzZXM6IGNsYXNzZXNPZi5nZXQoYi5rZXkpID8/IFtdIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5tZXNoUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhcbiAgICAgIGdyb3Vwcy5tYXAoKGcpID0+IHtcbiAgICAgICAgY29uc3QgbWVzaCA9IHRoaXMubWVzaENhY2hlLmdldChjYWNoZUtleShnKSkhLm1lc2g7XG4gICAgICAgIHJldHVybiB7IGtleTogZy5rZXksIGNvbG9yOiBnLmNvbG9yLCBsYWJlbDogZy5sYWJlbCwgdmVydGljZXM6IG1lc2gudmVydGljZXMsIGZhY2VzOiBtZXNoLmZhY2VzIH07XG4gICAgICB9KSxcbiAgICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgY2hhbmdlZDogd2hlbiB0aGUgbGl2ZSBzbGljZSdzIHJlZ2lvbnMgb2Ygc29tZSBjbGFzc2VzIGRpZCAoYW4gZWRpdCwgYW4gdW5kbywgbm90XG4gICAqIGEgc2xpY2Ugb3IgaW1hZ2Ugc3dpdGNoKSwgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGFyZSBzdGFsZS4gVGhleSBhcmUgZHJvcHBlZCwgYW5kIHRob3NlIHNob3duXG4gICAqIGluIDNEIGFyZSByZWJ1aWx0IG9uY2UgdGhlIGVkaXRzIHBhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlZ2lvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgZm9sbG93cyB0aGUgZWRpdHMgKG5vIHN1cmZhY2UgYnVpbHQgb3Igc2hvd24sIG5vIHNlY3Rpb25zKTogc2tpcCB0aGUgZmluZ2VycHJpbnRzLlxuICAgIGlmICghdGhpcy5zbGljZU1vdW50ZWQgJiYgIXRoaXMuc2hvd24zZC5sZW5ndGggJiYgIXRoaXMubWVzaENhY2hlLnNpemUpIHtcbiAgICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmxpdmVDbGFzc2VzO1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIGNvbnN0IG5vdyA9IHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIC8vIEFub3RoZXIgc2xpY2Ugb3IgaW1hZ2UgY2FtZSB1cDogbm8gcmVnaW9uIGNoYW5nZWQgKHRoZSBzZWN0aW9ucyByZWN1dCBmb3IgdGhlIHNsaWNlKS5cbiAgICBpZiAoIWJlZm9yZSB8fCBiZWZvcmUuYXQgIT09IG5vdy5hdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBjaGFuZ2VkQ2xhc3NlcyhiZWZvcmUuc2lnbmF0dXJlcywgbm93LnNpZ25hdHVyZXMpO1xuICAgIC8vIFNvdXJjZSBmZWF0dXJlcyBkZWxldGVkIChvciB0aGF0IHVuZG9uZSkgY2hhbmdlIG5vIGxpdmUgcmVnaW9uLCBhbmQgd2hpY2ggY2xhc3NlcyB0aGV5IHdlcmVcbiAgICAvLyBpcyBub3Qga25vd24gaGVyZTogZXZlcnkgY2xhc3MgaXMgc3RhbGUuIEEgZmVhdHVyZSB0YWtlbiBzaG93cyBhcyBpdHMgY2xhc3MncyBjaGFuZ2UuXG4gICAgY29uc3QgZXZlcnlDbGFzcyA9ICFjaGFuZ2VkLnNpemUgJiYgYmVmb3JlLnNvdXJjZXMgIT09IG5vdy5zb3VyY2VzO1xuICAgIGlmICghY2hhbmdlZC5zaXplICYmICFldmVyeUNsYXNzKSByZXR1cm47XG4gICAgY29uc3QgdG91Y2hlZCA9IChjOiBzdHJpbmcpID0+IGV2ZXJ5Q2xhc3MgfHwgY2hhbmdlZC5oYXMoYyk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLnNlY3Rpb25zLnJlZ2lvbnNDaGFuZ2VkKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgWy4uLnRoaXMubWVzaENhY2hlXSkge1xuICAgICAgaWYgKGVudHJ5LmNsYXNzZXMuc29tZSh0b3VjaGVkKSkgdGhpcy5tZXNoQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93bjNkLnNvbWUoKGcpID0+IGcuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgICB0aGlzLnJlYnVpbGRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc2hvd24zZC5sZW5ndGggJiYgdGhpcy5jbGFzc2VzM2RJbWFnZSA9PT0gdGhpcy5wbG90dGVkRmlsZU5hbWUpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICAgIH1cbiAgICB9LCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TKTtcbiAgfVxuXG4gIC8qKiBGaW5nZXJwcmludCB0aGUgbGl2ZSBzbGljZSdzIGNsYXNzZXMsIHVubGVzcyBhbHJlYWR5OiB3aGF0IHRoZSBuZXh0IGVkaXQgaXMgY29tcGFyZWQgd2l0aC4gKi9cbiAgcHJpdmF0ZSB0cmFja0xpdmVDbGFzc2VzKCk6IHsgYXQ6IHN0cmluZzsgc2lnbmF0dXJlczogTWFwPHN0cmluZywgbnVtYmVyPjsgc291cmNlczogc3RyaW5nIH0ge1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPz89IHtcbiAgICAgIGF0OiB0aGlzLmxpdmVTbGljZUtleSgpLFxuICAgICAgc2lnbmF0dXJlczogY2xhc3NTaWduYXR1cmVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSxcbiAgICAgIHNvdXJjZXM6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U291cmNlU3RhdGVLZXkoKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpdmVDbGFzc2VzO1xuICB9XG5cbiAgLyoqIFdoaWNoIHNsaWNlIG9mIHdoaWNoIGltYWdlIHRoZSBsaXZlIHJlZ2lvbnMgYXJlLiAqL1xuICBwcml2YXRlIGxpdmVTbGljZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpfVxcbiR7dGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyd9YDtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBpbiBweMKyIMOXIHNsaWNlcyAoc2VlIFJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcykuICovXG4gIGFzeW5jIGdldENsYXNzVm9sdW1lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMoY2xhc3NlcykpO1xuICB9XG5cbiAgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2s/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2spO1xuICB9XG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMkKCk7XG4gIH1cbiAgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGRlbik7XG4gICAgLy8gQSBzdXJmYWNlIGlzIGl0cyBjbGFzcydzIChpdHMgZ3JvdXAga2V5IGlzIHRoZSBjbGFzcyBuYW1lKS5cbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWRkZW4oWy4uLnRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcygpXSk7XG4gICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICB9XG4gIGFzeW5jIHNlbGVjdFJlZ2lvbkNsYXNzZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0Q2xhc3NlcyhjbGFzc2VzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZ1dpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uV2l0aFNvdXJjZShyZWdpb25zLCBzbGljZSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyAoaml0LXVpIzkzKSwgZnJvbSB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLiDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7XG4gIH1cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTtcbiAgfVxuICAvKiogVGhlIHNsaWNlIHRoZSByZWdpb25zIGFyZSBzaG93biBmb3IgKHJlY29yZGVkIG91dHNpZGUgc3RhY2sgbW9kZSB0b28pLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfVxuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpO1xuICB9XG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpO1xuICB9XG4gIC8qKiBBbGwgc2xpY2VzJyBBTk5PVEFUSU9OIHJlZ2lvbnMgZm9yIGEgei1zdGFjayBzYXZlIChqaXQtdWkjOTMpLCBlYWNoIHRhZ2dlZFxuICAgKiAgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24uejsgcHJvZmlsZSBsaW5lcyBleGNsdWRlZC4gRmxhdCBhbm5vdGF0aW9uIHNldFxuICAgKiAgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCkpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIHJlZ3MuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQXV0aG9yaXRhdGl2ZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ugc2l6ZSBmb3IgbWFzayBleHBvcnQuIFByZWZlcnMgdGhlXG4gICAqICBhY3RpdmUgcmVuZGVyZXIncyByZXBvcnRlZCBzaXplLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhICh4L3lcbiAgICogIGFyZSB0aGUgZnVsbC1yZXMgcGl4ZWwgZGltZW5zaW9ucyB1c2VkIGFjcm9zcyB0aGUgYXBwKS4gUmVqZWN0cyBub24tZmluaXRlXG4gICAqICBvciBub24tcG9zaXRpdmUgc2l6ZXMg4oCUIHRoZSBQbG90bHkgYm91bmRzIGNhbiB5aWVsZCBOYU4gYmVmb3JlIGEgcGxvdCBpc1xuICAgKiAgZnVsbHkgbGFpZCBvdXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjcmFzaCBtYXNrIGNyZWF0aW9uLiAqL1xuICBnZXRNYXNrSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZhbGlkID0gKHM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICBzICYmIE51bWJlci5pc0Zpbml0ZShzLndpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUocy5oZWlnaHQpICYmIHMud2lkdGggPj0gMSAmJiBzLmhlaWdodCA+PSAxXG4gICAgICAgID8geyB3aWR0aDogTWF0aC5yb3VuZChzLndpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKHMuaGVpZ2h0KSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZyb21SZW5kZXJlciA9IHZhbGlkKHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpKTtcbiAgICBpZiAoZnJvbVJlbmRlcmVyKSByZXR1cm4gZnJvbVJlbmRlcmVyO1xuXG4gICAgbGV0IG1ldGE6IElJbWFnZU1ldGFkYXRhW10gPSBbXTtcbiAgICB0aGlzLmdldEltYWdlTWV0YSgpXG4gICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKVxuICAgICAgLnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgcmV0dXJuIG0wID8gdmFsaWQoeyB3aWR0aDogbTAueCwgaGVpZ2h0OiBtMC55IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdG9yQXBpOiBhbm5vdGF0aW9uLW9ubHkgc3VyZmFjZSBmb3IgdGhlIFJlZ2lvbiBFZGl0b3Ig4pSA4pSA4pSAXG4gIC8vIEludGVuc2l0eS1wcm9maWxlIGxpbmVzIChraW5kPSdwcm9maWxlJykgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90XG4gIC8vIHRoZSBlZGl0b3IuIFRoZXNlIG1ldGhvZHMgZ2l2ZSBleHRlcm5hbCBjb25zdW1lcnMgYW4gYW5ub3RhdGlvbi1vbmx5IHZpZXdcbiAgLy8gYW5kIGd1YXJhbnRlZSBwcm9maWxlIGxpbmVzIGFyZSBwcmVzZXJ2ZWQuIFRoZSB3cml0ZXMgbGFuZCBpbiB0aGUgc3RvcmUgbGlrZVxuICAvLyBhbnkgb3RoZXIsIGFuZCBldmVyeSBiYWNrZW5kIHJlZHJhd3MgZnJvbSBpdHMgZXZlbnRzLlxuXG4gIGdldEFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlLWFwcGVuZCB0aGUgc3RvcmUncyBwcm9maWxlIGxpbmVzIHNvIGFuIGVkaXRvciBzYXZlL2RlbGV0ZSBjYW4ndCBkcm9wIHRoZW0uXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgICAgIHJldHVybiBpZHhzLm1hcCgoaSkgPT4gcmVnc1tpXSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyICYmICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBzZXRTZWxlY3RlZFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IChyZWdpb25zIHx8IFtdKS5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvLyDilIDilIAgdG9vbHMg4oaSIGFjdGl2ZSByZW5kZXJlciAocnVuIG9uIGVpdGhlciBiYWNrZW5kKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gVGhlIHdhbmQsIHZlcnRleCBlcmFzZXIgYW5kIHpvb20tdG8tYm94IGFyZSBpbXBsZW1lbnRlZCBvbiBib3RoIGJhY2tlbmRzXG4gIC8vIHZpYSBJQ29vcmRpbmF0ZVRyYW5zZm9ybSAoKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrIGZvciB0aGUgd2FuZCksIHNvIHRoZXlcbiAgLy8gZm9sbG93IHRoZSBhY3RpdmUgcmVuZGVyZXIg4oCUIHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0LlxuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRBY3RpdmVUb29sKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJTYW1Qb2ludHMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCByZWFkcyBnbyBzdHJhaWdodCB0byBpdC5cbiAgLy8gVGhlIHR3byBTRVRURVJTIHN0aWxsIHJvdXRlIHRocm91Z2ggUGxvdGx5IGJlY2F1c2UgaXRzIGltcGxlbWVudGF0aW9uc1xuICAvLyBjYXJyeSByZW5kZXIgZ2x1ZSBiZXlvbmQgdGhlIHN0b3JlIHdyaXRlIChhIGxpdmUgUGxvdGx5LnJlc3R5bGUgb2ZcbiAgLy8gY29sb3JzY2FsZS9yZXZlcnNlc2NhbGUgb24gdGhlIG1vdW50ZWQgaGVhdG1hcCk7IE9TRCByZWNvbG9ycyB2aWEgaXRzIG93blxuICAvLyBzdG9yZSBzdWJzY3JpcHRpb24gZWl0aGVyIHdheS5cbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogQ29sb3JtYXBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICB9XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2UpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhLCBpbWFnZUtleSk7XG4gIH1cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElDaGFubmVsSGlzdG9ncmFtQXBpOiBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHN1cmZhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENoYW5uZWwvZ3JheXNjYWxlL2ludmVydCBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZTsgYm90aFxuICAvLyBiYWNrZW5kcyBzdWJzY3JpYmUgYW5kIHJlY29sb3IgbGl2ZSwgc28gc2V0dGVycyBqdXN0IHdyaXRlIHRoZSBzdG9yZS4gVGhlXG4gIC8vIGhpc3RvZ3JhbSBjb21lcyBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbiAoaXRzIG5hdGl2ZSBwaXhlbHMpLlxuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICAvKiogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGEgKDE2LWJpdCBtdWx0aS1iYW5kIFRJRkYpIHZpYSB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTtcbiAgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkQ2hhbm5lbChpbmRleCk7XG4gIH1cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpbmRleCwgcGFydGlhbCk7XG4gIH1cbiAgcmVzZXRDb250cmFzdChpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIC8vIEZ1bGwgcmVzZXQ6IHdpbmRvdyAoMC4uMjU1KSwgZ2FtbWEgKDEpIEFORCB0aGUgY2hhbm5lbCdzIGRlZmF1bHQgdGludC5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgdGhpcy5zdG9yZS5yZXNldENoYW5uZWxTdGF0ZShpKTtcbiAgfVxuICAvKiogQXV0by13aW5kb3cgZWFjaCBjaGFubmVsIGJ5IHNhdHVyYXRpbmcgYHNhdHVyYXRpb25gICgwLi4xKSBvZiBwaXhlbHMgYXQgZWFjaFxuICAgKiAgZW5kIG9mIGl0cyBoaXN0b2dyYW0gKHNraXBwaW5nIG91dGxpZXIgZmlyc3QvbGFzdCBiaW5zKS4gKi9cbiAgYXV0b0NvbnRyYXN0KGluZGljZXM6IG51bWJlcltdLCBzYXR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oaSwgMjU2KTtcbiAgICAgIGlmICghaCkgY29udGludWU7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gYXV0b1dpbmRvd0Zyb21IaXN0b2dyYW0oaCwgc2F0dXJhdGlvbiwgWzAsIDI1NV0pO1xuICAgICAgaWYgKG1heCA+IG1pbikgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaSwgeyBtaW4sIG1heCB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0R3JheXNjYWxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRHcmF5c2NhbGUoKTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7XG4gIH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbnZlcnQoKTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEludmVydChvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdGl2ZSBiYWNrZW5kJ3MgcmVnaW9uIG92ZXJsYXkgKHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0KS4gRmFsbHNcbiAgICogYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZWdpb25CYWNrZW5kKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbEZhY2FkZS5jb250cm9scztcbiAgfVxuXG4gIC8qKiBDcmVhdGVkIG9uIGZpcnN0IHVzZTsgb3ducyB0aGUgZGF0YXNldCBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3BhdGlhbEZhY2FkZTogU3BhdGlhbENvbnRyb2xzRmFjYWRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEaXNwbGF5ZWQgc2xpY2UuIE9ubHkgYSB2b2x1bWUtYmFja2VkIHNwYXRpYWwgZGF0YXNldCByZWFkcyBpdCwgdG8ga2VlcCBhXG4gICAqICByZWdpb24gZHJhd24gb3ZlciBvbmUgc2VjdGlvbiBmcm9tIHNlbGVjdGluZyB0aGUgd2hvbGUgZGVwdGggYmVoaW5kIGl0LiAqL1xuICBwcml2YXRlIGN1cnJlbnRaSW5kZXggPSAwO1xuXG4gIC8qKiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSByb3V0ZXIgaXMgZGVzdHJveWVkIOKAlCB0aGUgaG9zdFxuICAgKiAgY29tcG9uZW50IGZvciBhIGBwcm92aWRlVmlzdWFsaXphdGlvbigpYCBjaGFpbi4gVGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uIHdvdWxkXG4gICAqICBvdGhlcndpc2Uga2VlcCB0aGUgd2hvbGUgaXNvbGF0ZWQgY2hhaW4gcmVhY2hhYmxlIGZyb20gdGhlIHJvb3QgZGF0YSBwb3J0LiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydFRpY2tldCA9IHsgaWQ6IHRoaXMuaW1wb3J0VGlja2V0LmlkICsgMSwgaW1hZ2U6IHVuZGVmaW5lZCB9OyAvLyBhIGxhdGUgaW1wb3J0IGNoYW5nZXMgbm90aGluZ1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25VcGRhdGVzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZywgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuOiB0aGUgc2FtcGxpbmcgaXMgdGhlXG4gICAqIGJhY2tlbmQtbmV1dHJhbCBJbnRlbnNpdHlQcm9maWxlU2VydmljZSdzOyB0aGUgdmlld3BvcnQgY2hhbmdlcyBjb21lIGZyb20gZXZlcnlcbiAgICogYmFja2VuZCB0aGF0IHJlcG9ydHMgdGhlbSAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKSwgbWVyZ2VkIGludG8gb25lIHN0YWJsZVxuICAgKiBzdHJlYW0gdGhlIGluc2V0IHN1YnNjcmliZXMgdG8gb25jZS5cbiAgICovXG4gIGdldEludGVuc2l0eVNhbXBsaW5nKCk6IElJbnRlbnNpdHlTYW1wbGluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmc7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlTYW1wbGluZzogSUludGVuc2l0eVNhbXBsaW5nID0ge1xuICAgIC8vIExvYWQgdGhlIGRpc3BsYXllZCBzbGljZSdzIHBpeGVscyBmb3IgYSBiYWNrZW5kIHRoYXQgaGFzIG5vIGZyYW1lcyBvZiBpdHMgb3duXG4gICAgLy8gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qczsgUGxvdGx5IGZlZWRzIGl0cyBmcmFtZXMgdG8gdGhlIHNlcnZpY2Ugd2hlbiBpdCBwbG90cykuXG4gICAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmc6IChpbWFnZUluZm8sIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH0sXG4gICAgLy8gUmUtc2FtcGxlIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBpbWFnZS1waXhlbCBST0kgYXQgZGlzcGxheSByZXNvbHV0aW9uLlxuICAgIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaTogKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICB0aGlzLmludGVuc2l0eS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgICB9LFxuICAgIGdldFZpZXdwb3J0Q2hhbmdlJDogKCkgPT5cbiAgICAgIG1lcmdlKC4uLnRoaXMuYmFja2VuZHMoKS5tYXAoKGIpID0+IGIuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKT8uZ2V0Vmlld3BvcnRDaGFuZ2UkKCkgPz8gRU1QVFkpKSxcbiAgfTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZygpYC4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbywgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBDcm9wcyBmb3Igc2FtcGxpbmcgYXJlIHNpemVkIGZyb20gdGhlIHBsb3QgZGl2ICh3aGljaGV2ZXIgYmFja2VuZCByZW5kZXJzIGludG8gaXQpLiAqL1xuICBwcml2YXRlIHBvaW50U2FtcGxpbmdBdFBsb3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxvdERpdikgdGhpcy5pbnRlbnNpdHkuc2V0U2FtcGxpbmdFbGVtZW50KHRoaXMucGxvdERpdik7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmdldFZpZXdwb3J0Q2hhbmdlJCgpYC4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmdldFZpZXdwb3J0Q2hhbmdlJCgpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlzdWFsaXplciB2aWV3IGlzIGdvaW5nIGF3YXk6IGRldGFjaCBldmVyeSBiYWNrZW5kIOKAlCBkcm9wcGluZyB0aGVpciB2aWV3LWJvdW5kXG4gICAqICBzdWJzY3JpcHRpb25zIGFuZCBkaXNwb3NpbmcgdGhlIG5hcGFyaS1qcyB2aWV3ZXIsIHdob3NlIGNhbnZhcywgcmVuZGVyIGxvb3AgYW5kIEdQVVxuICAgKiAgYnVmZmVycyB3b3VsZCBvdGhlcndpc2Ugb3V0bGl2ZSB0aGUgdmlldyAoZm9yIGEgY29tcG9uZW50LXNjb3BlZCBjaGFpbiwgZm9yZXZlcikuXG4gICAqICBOb3RoaW5nIGlzIG9uIHNjcmVlbiBhZnRlcndhcmRzLCBzbyB0aGUgbmV4dCBwbG90IHN0YXJ0cyBmcm9tIHRoZSBkZWZhdWx0IGJhY2tlbmQuICovXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUmVxdWVzdCsrO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZURpdiA9IG51bGw7XG4gICAgdGhpcy5wbG90bHkuZGV0YWNoKCk7XG4gICAgdGhpcy5vc2QuZGV0YWNoKCk7XG4gICAgdGhpcy5uYXBhcmkuZGV0YWNoKCk7XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBudWxsO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZGV0YWNofS4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgfVxufVxuIl19
1685
+ /**
1686
+ * A region set's classes as 3D groups, as the region editor's class tree shows them: one per root of
1687
+ * its hierarchy with every class under it (one per class of a flat one), in the hierarchy's order;
1688
+ * without a hierarchy, one per class its features have. Each in the colour the set gives it (its
1689
+ * hierarchy's, else its features').
1690
+ */
1691
+ export function regionSetGroups(info) {
1692
+ const colors = new Map(Object.entries(info.classColors ?? {}));
1693
+ const nodes = [...(info.hierarchy ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
1694
+ if (!nodes.length) {
1695
+ return [...colors.entries()].map(([name, color]) => ({ key: name, classes: [name], color }));
1696
+ }
1697
+ for (const n of nodes)
1698
+ if (n.color)
1699
+ colors.set(n.name, n.color);
1700
+ const names = new Set(nodes.map((n) => n.name));
1701
+ const children = new Map();
1702
+ for (const n of nodes) {
1703
+ if (!n.parent || !names.has(n.parent))
1704
+ continue;
1705
+ children.set(n.parent, [...(children.get(n.parent) ?? []), n.name]);
1706
+ }
1707
+ const subtree = (name) => [name, ...(children.get(name) ?? []).flatMap(subtree)];
1708
+ return nodes
1709
+ .filter((n) => !n.parent || !names.has(n.parent))
1710
+ .map((n) => ({ key: n.name, classes: subtree(n.name), color: colors.get(n.name) ?? '#cccccc' }));
1711
+ }
1712
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFrQyxNQUFNLCtCQUErQixDQUFDO0FBSXhHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9F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QUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNuRyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdpbWFnZS1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQ29sb3JtYXAgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBsb3RseVNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvb3NkL29wZW5zZWFkcmFnb24tdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlWb2x1bWUsXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgSVZpc3VhbGl6ZXIsXG4gIExvYWRlZEltYWdlLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxuICBJU3BhdGlhbENvbnRyb2xzLFxuICBJSW50ZW5zaXR5U2FtcGxpbmcsXG4gIElPc2RWaWV3T3B0aW9ucyxcbiAgSVZvbHVtZVJlc29sdXRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU1BBVElBTF9EQVRBX1BPUlQsIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFzZXQgfSBmcm9tICcuL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgZHJhd25DZWxsU2V0cyB9IGZyb20gJy4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnksIFJlZ2lvblNvdXJjZUluZm8gfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKipcbiAgICogV2hldGhlciByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRCBvbiBzY3JlZW46IGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldywgb3IgdGhlIDNEXG4gICAqIHNwYXRpYWwgY2xvdWQgb3ZlciBhIHN0YWNrIGltYWdlIChpdHMgcmVmZXJlbmNlIHZvbHVtZSdzLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpLiBCb3RoIGRyYXcgdGhlXG4gICAqIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhlIHNhbWUgd2F5IChWb2x1bWVSZWdpb25NZXNoZXMpLCBpbiB0aGUgdm9sdW1lJ3MgYm94LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgdGhlIGN1cnJlbnQgcGxvdCB0eXBlOiB0aGUgc2xpY2UgcGFuZSdzLiAqL1xuICBwcml2YXRlIGltYWdlVm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoc2VlIHtAbGluayBzZXRTbGljZUVkaXRvcn0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRWRpdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbnNUaHJvdWdoVm9sdW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogUmVnaW9uIHJlY29uc3RydWN0aW9ucyBidWlsdCBzbyBmYXIsIGJ5IGltYWdlLCByZXNvbHV0aW9uIGFuZCBjbGFzc2VzICh3aXRoIHRob3NlIGNsYXNzZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IE1lc2g7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBCdW1wZWQgcGVyIHtAbGluayBzaG93UmVnaW9uQ2xhc3NlczNkfSAoYW5kIHBlciBuZXcgaW1hZ2UpLCBzbyBvbmx5IHRoZSBsYXRlc3Qgb25lIHNob3dzLiAqL1xuICBwcml2YXRlIG1lc2hSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0QsIGFuZCB0aGUgaW1hZ2UgdGhleSBiZWxvbmcgdG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3NlczNkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4oXG4gICAgW10sXG4gICk7XG4gIHByaXZhdGUgY2xhc3NlczNkSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzcGF0aWFsIGRhdGFzZXQncyByZWdpb24gc2V0IGF0dGFjaGVkIHRvIGl0cyBpbWFnZSAoc2VlIGF0dGFjaERhdGFzZXRSZWdpb25TZXQpOiB0aGUgaW1hZ2VcbiAgICogKGl0cyByZWdpb24gc2NvcGUga2V5KSwgdGhlIHNldCdzIGtleSwgYW5kIHdoZXJlIGl0cyBzbGljZXMgYXJlIHdoZW4gaXQgc2F5cyAoaXRzIGBzbGljZVpgKSxcbiAgICogd2hpY2ggcGxhY2VzIGl0cyBzdXJmYWNlcyBpbiBzcGF0aWFsIDNEIG9uIGFuIGltYWdlIG9mIG9uZSBwbGFuZS4gYHNob3duM2RgIG9uY2UgaXRzIGNsYXNzZXNcbiAgICogd2VyZSBzaG93biBpbiAzRCBieSB0aGVtc2VsdmVzLCB3aGljaCBoYXBwZW5zIG9uY2UgcGVyIGltYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBkYXRhc2V0UmVnaW9uU2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIEVhY2ggaW1hZ2UncyBhdHRhY2hlZCByZWdpb24gc2V0LCBrZXB0IGFjcm9zcyBpbWFnZSBzd2l0Y2hlczogY29taW5nIGJhY2sgdG8gdGhlIGltYWdlIGZpbmRzXG4gICAqIGl0cyBzb3VyY2Ugc3RpbGwgaW4gdGhlIHN0b3JlICh3aXRoIHdoYXQgd2FzIHRha2VuIGZyb20gaXQsIG9yIGRlbGV0ZWQpIGFuZCByZXN0b3JlcyB0aGUgc2V0XG4gICAqIHJhdGhlciB0aGFuIGF0dGFjaGluZyBpdCBhZ2Fpbiwgd2hpY2ggd291bGQgc3RhcnQgdGhlIHNvdXJjZSBhZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFjaGVkUmVnaW9uU2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhc2V0UmVnaW9uU2V0U3RhdGU+KCk7XG4gIC8qKiBUaGUgc3BhdGlhbCBkYXRhc2V0IG9uIG9mZmVyICh0aGUgcG9ydCdzKSwgZm9yIHRoZSBib3VuZGFyeSBzZXQgaXRzIHJlZ2lvbiBzZXQgaXMuICovXG4gIHByaXZhdGUgc3BhdGlhbERhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBBbm5vdGF0aW9ucyBzd2l0Y2ggbGFzdCBoaWQgZXZlcnkgY2xhc3MgaW4gYSBzcGF0aWFsIHZpZXcgKHNlZSBzeW5jQW5ub3RhdGlvbnMpLCBzb1xuICAgKiBhIGNoYW5nZSBvZiBpdCwgbm90IGV2ZXJ5IHZpZXcgZW1pc3Npb24sIGhpZGVzIG9yIHNob3dzIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFubm90YXRpb25zSGlkZGVuID0gZmFsc2U7XG4gIC8qKiBUaGUgM0QgdmlldydzIGdsb2JhbCBjZWxscyBzd2l0Y2ggYXMgbGFzdCBhcHBsaWVkIChzZWUgdXBkYXRlQ2VsbHMzZCkuICovXG4gIHByaXZhdGUgY2VsbHMzZE1vZGU6ICd0eXBlcycgfCAnY2VsbHMnID0gJ3R5cGVzJztcbiAgLyoqIENsYXNzZXMgc2V0IHRoZSBvdGhlciB3YXkgdGhhbiB0aGUgZ2xvYmFsIHN3aXRjaCBpbiB0aGUgUmVnaW9uIEVkaXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjZWxsczNkT3ZlcnJpZGVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIC8qKiBUaGUgY2xhc3NlcyBkcmF3biBhcyBpbmRpdmlkdWFsIGNlbGxzIGluIHNwYXRpYWwgM0QsIGFzIGxhc3QgYXBwbGllZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpdmlkdWFsM2QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICAvKiogVGhlIGNsYXNzZXMgdGhhdCBjYW4gYmUgZHJhd24gYXMgaW5kaXZpZHVhbCBjZWxscyBub3cgKHNlZSBnZXRDZWxsYWJsZUNsYXNzZXMzZCQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbGxhYmxlM2QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICAvKiogRm9sbG93cyB0aGUgZGF0YXNldCBhbmQgdGhlIHNwYXRpYWwgdmlldyBmb3Ige0BsaW5rIHVwZGF0ZVBsYW5lQ2VsbHN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYW5lQ2VsbHNTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCByZWdpb24gc2V0J3MgcGxhbmVzIHdoaWxlIHRoZXkgc2xpY2UgdGhlIHBsb3R0ZWQgaW1hZ2UgKHNlZSBnZXREYXRhc2V0UGxhbmVzJCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNldFBsYW5lcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnBsYW5lQ2VsbHNTdWIgPSB0aGlzLnNwYXRpYWxEYXRhXG4gICAgICA/IGNvbWJpbmVMYXRlc3QoW3RoaXMuc3BhdGlhbERhdGEuZ2V0RGF0YXNldCQoKSwgdGhpcy5zdG9yZS5nZXRTcGF0aWFsVmlldyQoKV0pLnN1YnNjcmliZSgoW2RhdGFzZXRdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zcGF0aWFsRGF0YXNldCA9IGRhdGFzZXQgPz8gbnVsbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBsYW5lQ2VsbHMoKTtcbiAgICAgICAgICB0aGlzLnN5bmNBbm5vdGF0aW9ucygpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbHMzZCgpO1xuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBuZXcgVm9sdW1lU2VjdGlvbnMoe1xuICAgICAgdm9sdW1lOiAoKSA9PiB0aGlzLm5hcGFyaS52b2x1bWVWb3hlbHMoKSxcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICAgIHNob3dQbGFuZXM6IChwbGFuZXMpID0+IHRoaXMubmFwYXJpLnNldFNsaWNlUGxhbmVzKHBsYW5lcyksXG4gICAgICBvdXRsaW5lc0J5Q2xhc3M6IChsZXZlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5vdXRsaW5lc0J5Q2xhc3MobGV2ZWwpLFxuICAgICAgaXNDbGFzc0hpZGRlbjogKGxhYmVsKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmlzQ2xhc3NIaWRkZW4obGFiZWwpLFxuICAgICAgY29sb3JPZjogKGxhYmVsKSA9PiB0aGlzLmNsYXNzQ29sb3IobGFiZWwpLFxuICAgICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgY29sb3JtYXA6IChzdCwgbXVsdGljaGFubmVsKSA9PiB7XG4gICAgICAgIC8vIEFzIHRoZSB2b2x1bWUgc2NlbmUgY29sb3VycyB0aGUgY2hhbm5lbCAoaW52ZXJ0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjb2xvcm1hcCkuXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCksXG4gICAgICAgICAgcmV2ZXJzZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xvcm1hcChcbiAgICAgICAgICBtdWx0aWNoYW5uZWwgPyBjaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicsIGRpc3BsYXkpIDogdm9sdW1lQ29sb3JtYXAoc3QsIGRpc3BsYXkpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGludmVydDogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50SW52ZXJ0KCksXG4gICAgICBzbGljZTogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIC8vIEEgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgeiBwbGFuZSBwaWNrcyB0aGUgc2xpY2UgKHRocm91Z2ggdGhlIGhvc3QncyBzbGlkZXIsIHNvXG4gICAgLy8gdGhlIHN0b3JlIGFuZCB0aGUgc2xpY2UgcGFuZSBmb2xsb3cpLCB0aGUgb3RoZXJzIG1vdmUgdGhlaXIgc2VjdGlvbi5cbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZChcbiAgICAgIHRoaXMubmFwYXJpLmdldFNsaWNlUGxhbmVNb3ZlJCgpLnN1YnNjcmliZSgoeyBheGlzLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChheGlzID09PSAneicpIHRoaXMuc2xpY2VEcmFnJC5uZXh0KE1hdGgucm91bmQodmFsdWUpKTtcbiAgICAgICAgZWxzZSB0aGlzLnNlY3Rpb25zLnNldFBsYW5lKGF4aXMsIHZhbHVlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gIH1cblxuICAvKiogQSBjbGFzcydzIGNvbG91cjogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciwgZWxzZSBpdHMgcmVnaW9uIHNvdXJjZSdzLCBlbHNlIGEgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBjbGFzc0NvbG9yKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCkuZ2V0KGxhYmVsKSA/P1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3KCk/LmNvbG9yT2YoeyBsYWJlbCwgY29sb3I6IG51bGwgfSkgPz9cbiAgICAgICcjZmZjYzAwJ1xuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKG51bGxzIHdoaWxlIGl0IGlzIG5vdCBzcGxpdCkuICovXG4gIGdldFNlY3Rpb25WaWV3cyQoKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5nZXRWaWV3cyQoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgc2VjdGlvbidzIHBsYW5lIHRvIGBhdGAgKGltYWdlIHB4KS4gKi9cbiAgc2V0U2VjdGlvblBsYW5lKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCBhdCk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lOiB0aGUgaG9zdCBzaG93cyBpdCAoaXRzIHNsaWRlcikuICovXG4gIGdldFNsaWNlRHJhZyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZURyYWckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgMkQgbmFwYXJpIHR5cGVzIChpbWFnZSwgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIsIHNwYXRpYWwgb21pY3MpIOKAlCBhIDJEIGZhbGxiYWNrIGNoYWluXG4gICAqICAoT1NELCB0aGVuIFBsb3RseSkuXG4gICAqXG4gICAqICBOT1RFIGZvciBTUEFUSUFMX09NSUNTOiBvbmx5IG5hcGFyaS1qcyBkcmF3cyB0aGUgb2JzZXJ2YXRpb24gbWFya2Vycy4gSWYgaXQgZmFpbHMgKG5vIFdlYkdQVSxcbiAgICogIGRldmljZSBsb3NzKSB0aGUgZmFsbGJhY2sgcmVuZGVycyB0aGUgdGlzc3VlIGltYWdlIEFMT05FIOKAlCB0aGUgc3BhdGlhbCBsYXllciBpcyBhYnNlbnQsIG5vdFxuICAgKiAgZGVncmFkZWQuIFRoYXQgaXMgZGVsaWJlcmF0ZSBmb3Igbm93OiBzaG93aW5nIHRoZSBzbGlkZSBiZWF0cyBzaG93aW5nIG5vdGhpbmcsIGFuZCBhIFBsb3RseVxuICAgKiAgYHNjYXR0ZXJnbGAgc3BhdGlhbCBtb2RlIGlzIHRoZSBwbGFubmVkIHJlYWwgZmFsbGJhY2sgKHNlZSB0aGUgcGxvdC1tb2RlIGRlc2lnbiBkb2MpLiAqL1xuICBwcml2YXRlIGlzTmFwYXJpSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaVNjYXR0ZXIodCkgfHwgaXNTcGF0aWFsT21pY3ModCk7XG4gIH1cblxuICAvKiogVGhlIDNEIG5hcGFyaSB0eXBlcyAodm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZS9zY2F0dGVyLCBwbHVzIHRoZSAzRCBzcGF0aWFsIGNsb3VkKSDigJQgbm8gMkRcbiAgICogIGZhbGxiYWNrIGV4aXN0cyAoT1NEIGlzIGltYWdlLW9ubHkpLCBzbyB0aGV5IGZhbGwgc3RyYWlnaHQgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIGlzTmFwYXJpM2RUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpM2QodCkgfHwgaXNTcGF0aWFsT21pY3MzZCh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZW5kIHRvIGF0dGVtcHQgZm9yIHRoZSBjdXJyZW50IHBsb3QgdHlwZSB0aGlzIHJlbmRlci4gVGhlIGZhbGxiYWNrIGNoYWlucyBiZWxvdyBhcmVcbiAgICogbWlycm9yZWQgZXhhY3RseSBieSB7QGxpbmsgbG9hZH0gc28gdGhlIGhhbmRsZSBgcGxvdCgpYCByZWNlaXZlcyBhbHdheXMgY29tZXMgZnJvbSB0aGVcbiAgICogYmFja2VuZCBgcGxvdCgpYCBzZWxlY3RzIChubyBsb2FkL3Bsb3QgYmFja2VuZCBtaXNtYXRjaCk6XG4gICAqICAtIDJEIGltYWdlIChleHBsaWNpdCBgTkFQQVJJX0lNQUdFYCwgb3IgYElNQUdFYCB3aXRoIHRoZSBXZWJHUFUgb3B0LWluKTogbmFwYXJpLWpzIOKGkiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gcGxhaW4gYElNQUdFYCAobm8gb3B0LWluKTogT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIDNEIG5hcGFyaSAoYE5BUEFSSV9WT0xVTUVgL2BOQVBBUklfSVNPU1VSRkFDRWApOiBuYXBhcmktanMg4oaSIFBsb3RseSAoT1NEIGNhbid0IHJlbmRlciAzRCkuXG4gICAqL1xuICBwcml2YXRlIGltYWdlQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFBsb3RUeXBlO1xuICAgIC8vIDJEIGltYWdlIHdpdGggYSBuYXBhcmktanMgYXR0ZW1wdCAoZXhwbGljaXQgbmFwYXJpIGltYWdlLCBvciBvcHQtaW4gb24gdGhlIEltYWdlIHR5cGUpLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpSW1hZ2VUeXBlKHQpIHx8ICh0aGlzLmlzSW1hZ2VUeXBlKHQpICYmIHRoaXMuY29uZmlnLnVzZU5hcGFyaVJlbmRlcmVyKSkge1xuICAgICAgaWYgKCF0aGlzLm5hcGFyaUZlbGxCYWNrKSByZXR1cm4gdGhpcy5uYXBhcmk7XG4gICAgICBpZiAoIXRoaXMub3NkRmVsbEJhY2spIHJldHVybiB0aGlzLm9zZDtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgICB9XG4gICAgLy8gUGxhaW4gSW1hZ2UgdHlwZSAobm8gbmFwYXJpIG9wdC1pbik6IE9TRCwgdGhlbiBQbG90bHkuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZEZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm9zZDtcbiAgICB9XG4gICAgLy8gM0QgbmFwYXJpIHR5cGVzOiBuYXBhcmktanMsIHdpdGggUGxvdGx5IGFzIHRoZSBvbmx5IHZpYWJsZSBmYWxsYmFjay5cbiAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMubmFwYXJpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKiogQmFja2VuZCBjdXJyZW50bHkgb24gc2NyZWVuIOKAlCB3aGF0IG9uZ29pbmcgem9vbS90b29sL3JlZ2lvbiBvcHMgYWN0IG9uLiAqL1xuICBwcml2YXRlIHJlbmRlcmVyKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVuZGVyZWQgPz8gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgYWN0IG9uOiB0aGUgc2xpY2UgcGFuZSdzIE9TRCB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXNcbiAgICogc3BsaXQgKHJlZ2lvbnMgYXJlIGVkaXRlZCB0aGVyZSksIGVsc2UgdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBWaWV3IGNhbGxzICh6b29tLCBmaXQsIGNvbG91cixcbiAgICogZXhwb3J0KSBzdGF5IHdpdGgge0BsaW5rIHJlbmRlcmVyfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VNb3VudGVkID8gdGhpcy5vc2QgOiB0aGlzLnJlbmRlcmVyKCk7XG4gIH1cblxuICAvLyBTeXN0ZW0gY2FwYWJpbGl0aWVzIGFyZSBQbG90bHkncyAodGhlIGZ1bGwtZmVhdHVyZWQgYmFja2VuZCkgc28gdGhlIFVJXG4gIC8vIGtlZXBzIG9mZmVyaW5nIGV2ZXJ5IHBsb3QgdHlwZSByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyBvbiBzY3JlZW4uXG4gIGdldCBjYXBhYmlsaXRpZXMoKTogVmlld2VyQ2FwYWJpbGl0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB6SW5kZXggPSB0aGlzLmltYWdlU2xpY2UoekluZGV4LCBpbWFnZUluZm8pO1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMuc3BhdGlhbFZpZXdDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlKTtcbiAgICAvLyBUaGUgc2xpY2UgcGFuZSBiZWxvbmdzIHRvIHRoZSB2b2x1bWUgdmlldzogYW5vdGhlciBwbG90IHR5cGUgdGFrZXMgaXQgZG93biAoT1NEIG1heSBiZVxuICAgIC8vIGFib3V0IHRvIGRyYXcgdGhlIG1haW4gdmlldywgd2hpY2ggbXVzdCBub3QgZmluZCB0aGUgcGFuZSdzIHZpZXdlciBzdGlsbCBtb3VudGVkKS5cbiAgICBpZiAoIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICAvLyBTbyBkb2VzIGEgZGF0YXNldCdzIHJlZ2lvbiBzZXQ6IHdoZXJlIGl0cyBwbGFuZXMgYXJlIGlzIG5vIG90aGVyIGltYWdlJ3MuIEl0cyBhdHRhY2htZW50IGlzXG4gICAgLy8ga2VwdCAoYXR0YWNoZWRSZWdpb25TZXRzKSwgdG8gYmUgcmVzdG9yZWQgd2hlbiBpdHMgaW1hZ2UgaXMgYmFjay5cbiAgICBpZiAodGhpcy5kYXRhc2V0UmVnaW9uU2V0ICYmIHRoaXMuZGF0YXNldFJlZ2lvblNldC5pbWFnZSAhPT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpKSB7XG4gICAgICB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBudWxsO1xuICAgICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmVzKG51bGwpO1xuICAgICAgdGhpcy5kYXRhc2V0UGxhbmVzJC5uZXh0KG51bGwpO1xuICAgICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgICB0aGlzLnVwZGF0ZUNlbGxzM2QoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQbGFuZUNlbGxzKCk7XG4gICAgdGhpcy5zeW5jQW5ub3RhdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IGRyYXduID0gbmV4dC5wbG90KHBsb3REaXYsIGltYWdlTG9hZGVkLCBpbWFnZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UpO1xuICAgIC8vIEEgZGF0YXNldCdzIHJlZ2lvbiBzZXQgaXMgc2hvd24gaW4gM0Qgb25jZSB0aGUgY2xvdWQncyBzY2VuZSBpcyB1cDogaXRzIHZveGVsIHN0ZXAgaXMgdGhlIHNjZW5lJ3MuXG4gICAgY29uc3QgcGxvdHRlZCA9IHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzXG4gICAgICA/IGRyYXduLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgICAgaWYgKG9rKSB0aGlzLnNob3dEYXRhc2V0UmVnaW9uU2V0M2QoKTtcbiAgICAgICAgICByZXR1cm4gb2s7XG4gICAgICAgIH0pXG4gICAgICA6IGRyYXduO1xuICAgIGlmICghdGhpcy5zbGljZURpdiB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBwbG90dGVkO1xuICAgIC8vIFRoZSBzcGxpdCB2b2x1bWUgdmlldzogdGhlIHNsaWNlIHBhbmUgZm9sbG93cyB0aGUgaW1hZ2UgKGEgbmV3IG9uZSwgb3IgaXRzIHNoYXJwZXIgcGFzcykuXG4gICAgcmV0dXJuIHBsb3R0ZWQudGhlbigob2spID0+IHtcbiAgICAgIGlmIChvayAmJiAoIXRoaXMuc2xpY2VNb3VudGVkIHx8IHRoaXMuc2xpY2VGaWxlICE9PSBpbWFnZUluZm8/LmZpbGVOYW1lIHx8IGluUGxhY2UpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5tb3VudFNsaWNlKCEhaW5QbGFjZSAmJiB0aGlzLnNsaWNlTW91bnRlZCAmJiB0aGlzLnNsaWNlRmlsZSA9PT0gaW1hZ2VJbmZvPy5maWxlTmFtZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdm9sdW1lIHdhcyBhc3NlbWJsZWQgYWdhaW4gKGFub3RoZXIgaW1hZ2UsIG9yIHJlc29sdXRpb24pOiBjdXQgdGhlIHNlY3Rpb25zIGZyb20gaXQuXG4gICAgICBpZiAob2spIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGUgdm9sdW1lIHZpZXc6IHNob3cgdGhlIHNsaWNlIGJlaW5nIGVkaXRlZCBpbiBgZGl2YCAoT3BlblNlYWRyYWdvbiwgd2l0aCBldmVyeSByZWdpb25cbiAgICogdG9vbCkgYmVzaWRlIHRoZSAzRCB2aWV3LCBvciBzdG9wIChudWxsKS4gS2VwdCBhY3Jvc3MgcmUtcGxvdHMgb2YgYSB2b2x1bWUgdmlldzsgYW5vdGhlciBwbG90XG4gICAqIHR5cGUgdGFrZXMgdGhlIHBhbmUgZG93biBhbmQgYSB2b2x1bWUgdmlldyBicmluZ3MgaXQgYmFjay4gUmVzb2x2ZXMgd2hldGhlciB0aGUgcGFuZSBzaG93cy5cbiAgICovXG4gIGFzeW5jIHNldFNsaWNlRWRpdG9yKGRpdjogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2xpY2VEaXYgPSBkaXY7XG4gICAgaWYgKHRoaXMuc2xpY2VFZGl0b3IkLnZhbHVlICE9PSAhIWRpdikgdGhpcy5zbGljZUVkaXRvciQubmV4dCghIWRpdik7XG4gICAgaWYgKCFkaXYpIHtcbiAgICAgIHRoaXMudW5tb3VudFNsaWNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vdW50U2xpY2UoZmFsc2UpO1xuICB9XG5cbiAgLyoqIE1vdW50IChvciByZWZyZXNoIGluIHBsYWNlKSBPU0QgaW4gdGhlIHNsaWNlIHBhbmUgb24gdGhlIGRpc3BsYXllZCBzbGljZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNsaWNlKGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLnNsaWNlRGl2O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGlmICghZGl2IHx8ICFpbmZvPy51cmxzPy5sZW5ndGggfHwgIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnNwYXRpYWxWaWV3Q2hhbmdlZCQubmV4dCgpO1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5pbWFnZVNsaWNlKHpJbmRleCk7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFpJbmRleChzbGljZSk7XG4gICAgaWYgKHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzKSB0aGlzLm5hcGFyaS5zZXRSZWdpb25QbGFuZSh6SW5kZXgpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkge1xuICAgICAgdGhpcy5vc2Quc2V0WkluZGV4KHNsaWNlKTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3Mgb3duIHNsaWNlIGZvciBzbGlkZXIgcG9zaXRpb24gYHpgOiAwIHdoaWxlIHRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncyBwbGFuZXMgc2xpY2UgYW5cbiAgICogaW1hZ2Ugb2Ygb25lIHBsYW5lICh0aGUgc2xpZGVyIHRoZW4gcGlja3MgdGhlIHBsYW5lLCBzZWUgZ2V0RGF0YXNldFBsYW5lcyQpLCBlbHNlIGB6YC5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VTbGljZSh6OiBudW1iZXIsIGluZm86IElJbWFnZUluZm8gfCBudWxsIHwgdW5kZWZpbmVkID0gdGhpcy5wbG90dGVkSW5mbyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzICYmICFpbmZvPy5pc1N0YWNrID8gMCA6IHo7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYW5lcyBvZiB0aGUgc3BhdGlhbCBkYXRhc2V0J3MgcmVnaW9uIHNldCAoaXRzIGBzbGljZVpgLCBpbiBvYnNlcnZhdGlvbiB1bml0cykgd2hpbGUgdGhleVxuICAgKiBzbGljZSB0aGUgcGxvdHRlZCBpbWFnZSwgYW4gaW1hZ2Ugb2Ygb25lIHBsYW5lOyBudWxsIG90aGVyd2lzZS4gVGhlIGhvc3QncyBzbGljZSBzbGlkZXIgdGhlblxuICAgKiBydW5zIG92ZXIgdGhlbTogZWFjaCBwb3NpdGlvbiBzaG93cyB0aGF0IHBsYW5lJ3MgcmVnaW9ucyBhbmQsIGluIHRoZSAyRCBzcGF0aWFsIHZpZXcsIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgYW5kIHRyYW5zY3JpcHRzIG5lYXJlc3QgaXQsIG92ZXIgdGhlIHNhbWUgaW1hZ2UuXG4gICAqL1xuICBnZXREYXRhc2V0UGxhbmVzJCgpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFzZXRQbGFuZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRDdXJyZW50SW1hZ2UoKTtcbiAgfVxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRQaXhlbERhdGEoKTtcbiAgfVxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFNvdXJjZVJlY3QoKTtcbiAgfVxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5kb3dubG9hZEltYWdlKCk7XG4gIH1cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5leHBvcnRDb21wb3NpdGUoKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcocGxvdFR5cGUpO1xuICAgIHRoaXMudXBkYXRlUGxhbmVDZWxscygpO1xuICAgIHRoaXMuc3luY0Fubm90YXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVDZWxsczNkKCk7XG4gICAgdGhpcy5wbG90bHkuc2V0UGxvdFR5cGUocGxvdFR5cGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAobmFwYXJpLWpzKSwgZWxzZSBudWxsLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRWb2x1bWVSZXNvbHV0aW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LnNldChzY2FsZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KCkgPz8gMTtcbiAgfVxuICAvKiogVGhlIHZpZXdwb3J0IG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgZm9yIGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlLiBOdWxsXG4gICAqICB3aGVuIHRoYXQgYmFja2VuZCBjYW5ub3QgcHJvdmlkZSBvbmUgKGUuZy4gT1NEIGZlbGwgYmFjayB0byBQbG90bHkpLiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFBsb3RNb2RlVmlld3BvcnQ/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gUGxvdGx5IGVudW1lcmF0ZXMgdGhlIGZ1bGwgUExPVF9UWVBFX0RFU0NSSVBUT1JTIG1hcCwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB0aGVcbiAgICAvLyBuYXBhcmktanMgV2ViR1BVIHR5cGVzIChqaXQtdWkjMTAyKSDigJQgc28gdGhpcyBzaW5nbGUgc291cmNlIGNvdmVycyB0aGVtIChubyBkdXBsaWNhdGVzKS5cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgKyBzdGFjayBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2V0U3RhY2tMb2FkaW5nKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRTdGFja0xvYWRpbmcoYik7XG4gIH1cbiAgLy8gQ2FuY2VsIGluLWZsaWdodCBsb2FkaW5nIG9uIGV2ZXJ5IGJhY2tlbmQg4oCUIHRoZSB1c2VyJ3MgQ2FuY2VsIHNob3VsZG4ndCBkZXBlbmQgb24gd2hpY2ggb25lIGlzXG4gIC8vIGFjdGl2ZS4gT25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBmcmFtZXMgKG5hcGFyaS1qcykgZG8gcmVhbCB3b3JrOyB0aGUgcmVzdCBuby1vcC4gVGhlIGNvbmNyZXRlXG4gIC8vIGJhY2tlbmQgY2xhc3NlcyBkb24ndCBhbGwgZGVjbGFyZSB0aGUgb3B0aW9uYWwgY29udHJhY3QgbWV0aG9kLCBzbyBjYWxsIGl0IHZpYSBJVmlld2VyQmFja2VuZC5cbiAgY2FuY2VsTG9hZGluZygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJhY2tlbmQgb2YgW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldIGFzIElWaWV3ZXJCYWNrZW5kW10pIHtcbiAgICAgIGJhY2tlbmQuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgfVxuICB9XG4gIC8vIExvYWRpbmcgc3RhdGUgaXMgc3VyZmFjZWQgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBkb2luZyB0aGUgd29yazogT1NEIGFuZCBuYXBhcmktanMgKHZvbHVtZVxuICAvLyBhc3NlbWJseSkgZHJpdmUgdGhlaXIgb3duIHN1YmplY3RzLCBzbyBtZXJnZSBhbGwgdGhyZWUgaW50byBvbmUgc3RhYmxlIHN0cmVhbSB0aGUgaG9zdFxuICAvLyBzdWJzY3JpYmVzIHRvIG9uY2UuIChQcmV2aW91c2x5IGhhcmRjb2RlZCB0byBQbG90bHksIHNvIG5hcGFyaS9PU0QgcHJvZ3Jlc3MgbmV2ZXIgc2hvd2VkLilcbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wbG90bHkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMub3NkLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm5hcGFyaS5pc1N0YWNrTG9hZGluZygpLFxuICAgIF0pLnBpcGUobWFwKChmbGFncykgPT4gZmxhZ3Muc29tZShCb29sZWFuKSkpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLy8gUmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB3aGljaGV2ZXIgYmFja2VuZCBpcyBBQ1RJVkVMWSBsb2FkaW5nIChtYXggYWNyb3NzIGFjdGl2ZSBvbmVzKS4gQSBwbGFpblxuICAgIC8vIG1lcmdlIGxldCBhbiBpZGxlIGJhY2tlbmQncyBzdGFsZSB2YWx1ZSB3aW4gdGhlIHN0cmVhbSBvbiBhIHJlLWxvYWQg4oCUIGxlYXZpbmcgdGhlIGJhciBiZWxvdyB0aGVcbiAgICAvLyBhY3RpdmUgYmFja2VuZCdzIHJlYWwgcHJvZ3Jlc3MgKGUuZy4gc3R1Y2sgfuKFkyB3aGlsZSB0aGUgJSByZWFkIDEwMCkuIEdhdGluZyBieSB0aGUgbG9hZGluZyBmbGFnXG4gICAgLy8gaWdub3JlcyBpZGxlIGJhY2tlbmRzLCBzbyB0aGUgYmFyIHRyYWNrcyB0aGUgb25lIGRvaW5nIHRoZSB3b3JrIGFuZCByZWFjaGVzIDEwMCUuXG4gICAgY29uc3QgdHJhY2sgPSAodjogSVZpZXdlckJhY2tlbmQpOiBPYnNlcnZhYmxlPFtudW1iZXIsIGJvb2xlYW5dPiA9PlxuICAgICAgY29tYmluZUxhdGVzdChbdi5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLCB2LmlzU3RhY2tMb2FkaW5nKCldKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdHJhY2sodGhpcy5wbG90bHkpLCB0cmFjayh0aGlzLm9zZCksIHRyYWNrKHRoaXMubmFwYXJpKV0pLnBpcGUoXG4gICAgICBtYXAoKHBhaXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHBhaXJzLmZpbHRlcigoWywgbG9hZGluZ10pID0+IGxvYWRpbmcpLm1hcCgoW3BdKSA9PiBwKTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5sZW5ndGggPyBNYXRoLm1heCguLi5hY3RpdmUpIDogMDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLy8gRXZlcnkgYmFja2VuZCBmaXRzIHRvIHZpZXcgb24gaXRzIG93biAoUGxvdGx5J3MgYXV0b3NjYWxlLCBPU0QncyBnb0hvbWUsIG5hcGFyaSdzIGNhbWVyYVxuICAvLyBmaXQpIGFuZCBlYWNoIGVtaXRzIGZyb20gaXRzIG93biBzdWJqZWN0LCBzbyBtZXJnZSBhbGwgdGhyZWU6IGxpc3RlbmluZyB0byBQbG90bHkgYWxvbmVcbiAgLy8gbWlzc2VkIHRoZSBjb250ZXh0LW1lbnUgQXV0b3NjYWxlIG9uIHRoZSBJbWFnZSBhbmQgbmFwYXJpIHZpZXdzLlxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aGlzLnBsb3RseS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICAgdGhpcy5vc2QuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMubmFwYXJpLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgKS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuICAvKiogVGhlIGxpbmUtUk9JIHByb2ZpbGVzOiBzYW1wbGVkIGJ5IHRoZSBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UuICovXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmdldEludGVuc2l0eVByb2ZpbGUkKCk7XG4gIH1cbiAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIFBsb3RseSBMSU5FIGNoYXJ0IOKAlCByZW5kZXIgaXQgdGhyb3VnaCBQbG90bHkgd2hpY2hldmVyXG4gIC8vIGJhY2tlbmQgZHJhd3MgdGhlIG1haW4gaW1hZ2UuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZCwgcHJvZmlsZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlZ2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyBldmVyeSByZWFkIGFuZCB3cml0ZSBnb2VzXG4gIC8vIHN0cmFpZ2h0IHRvIGl0LiBFdmVyeSBiYWNrZW5kIGRyYXdzIGZyb20gdGhlIHN0b3JlJ3MgZXZlbnRzOiB0aGUgT1NEIGFuZFxuICAvLyBuYXBhcmktanMgb3ZlcmxheXMgYW5kIFBsb3RseSdzIHNoYXBlIHByb2plY3Rpb24gcmVkcmF3IG9uIGl0cyByZWdpb24tdXBkYXRlXG4gIC8vIGFuZCBzZWxlY3Rpb24gc3RyZWFtcywgYW5kIHRoZSBjYW52YXMgdG9vbHMgcmVzZXQgb24gZ2V0UmVnaW9uU2V0UmVwbGFjZWQkXG4gIC8vICh1bmRvLCByZWRvLCBhIHNsaWNlIHN3aXRjaCkuXG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gIH1cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgfVxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpO1xuICB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCk7XG4gIH1cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQkKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVtb3ZlQ2xhc3MobmFtZSk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7XG4gIH1cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTtcbiAgfVxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVkbygpO1xuICB9XG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpO1xuICB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpO1xuICB9XG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7XG4gIH1cbiAgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTtcbiAgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cik7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciB0aGUgaW1hZ2UgbGFzdCBwbG90dGVkLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leHBvcnRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucGxvdHRlZEZpbGVOYW1lKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnMpO1xuICB9XG5cbiAgLyoqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSAoc2VlIFJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSkuICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlLCBzbGljZXMpO1xuICB9XG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZShnZW9Kc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZ2VvSnNvblN0ci5sZW5ndGggPCAodGhpcy5jb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzID8/IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvcGVuZWQ6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShnZW9Kc29uU3RyKTtcbiAgICAvLyBUaGUgZmlyc3Qgb3BlbiBpcyB0aGUgb25lIGp1c3QgbWFkZTsgYSBzb3VyY2UgY2xvc2VkIHRvIHNhdmUgbWVtb3J5IHBhcnNlcyBhZ2Fpbi5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSgoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvcGVuZWQ7XG4gICAgICBvcGVuZWQgPSBudWxsO1xuICAgICAgcmV0dXJuIHNvdXJjZSA/IFByb21pc2UucmVzb2x2ZShzb3VyY2UpIDogb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJvcFJlZ2lvblNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5kcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRpY2tldCBmb3IgYSByZWdpb24gaW1wb3J0IHRoYXQgaXMgYWJvdXQgdG8gcmVhZCBvciBkZWNvZGUgaXRzIGZpbGVzOiB0aGUgaW1wb3J0IG1ldGhvZHNcbiAgICogZ2l2ZW4gaXQgY2hhbmdlIG5vdGhpbmcgb25jZSBpdCBpcyBzdGFsZSDigJQgYW5vdGhlciBpbXBvcnQgdG9vayBhIHRpY2tldCBzaW5jZSwgYW5vdGhlciBpbWFnZVxuICAgKiB3YXMgcGxvdHRlZCwgb3IgdGhlIHNlcnZpY2Ugd2FzIGRlc3Ryb3llZCDigJQgc28gYW4gaW1wb3J0IHRoYXQgZmluaXNoZXMgbGF0ZSBuZXZlciBsYW5kcyBvbiBhblxuICAgKiBpbWFnZSBpdCB3YXMgbm90IHN0YXJ0ZWQgZm9yLlxuICAgKi9cbiAgcmVnaW9uSW1wb3J0VGlja2V0KCk6IG51bWJlciB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB0aGlzLmltcG9ydEltYWdlS2V5KCkgfTtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRUaWNrZXQuaWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgdGlja2V0YCBpcyBzdGlsbCB0aGUgY3VycmVudCBpbXBvcnQncywgb24gdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0VmFsaWQodGlja2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGlja2V0ID09PSB0aGlzLmltcG9ydFRpY2tldC5pZCAmJiB0aGlzLmltcG9ydFRpY2tldC5pbWFnZSA9PT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRJbWFnZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KHRoaXMucGxvdHRlZEluZm8gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIHNvdXJjZSBwZXIgc2xpY2UsIGFzIGFuIGltcG9ydGVkIGxhYmVsXG4gICAqIHZvbHVtZSBvciBmb2xkZXIgb2YgcGVyLXNsaWNlIHJlZ2lvbiBmaWxlcyBnaXZlcyB0aGVtOiBgb3BlbmVyc2AgYnkgc2xpY2UgaW5kZXgsIGVhY2ggb3BlbmVkXG4gICAqIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93bi4gQSBzaW5nbGUgaW1hZ2UgdGFrZXMgc2xpY2UgMCdzLiBSZXR1cm5zIGhvdyBtYW55IHNsaWNlc1xuICAgKiBoYXZlIGEgc291cmNlLCBvciBudWxsIChjaGFuZ2luZyBub3RoaW5nKSB3aGVuIGB0aWNrZXRgIGlzIHN0YWxlIChzZWVcbiAgICoge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH0pLiBUaGUgc291cmNlcyBhcmUgbWFya2VkIGltcG9ydGVkLCBzbyBhIHNhdmUgd3JpdGVzIGV2ZXJ5IHNsaWNlLlxuICAgKi9cbiAgaW1wb3J0U2xpY2VSZWdpb25Tb3VyY2VzKG9wZW5lcnM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVnaW9uU291cmNlT3BlbmVyPiwgdGlja2V0PzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHRpY2tldCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmltcG9ydFRpY2tldFZhbGlkKHRpY2tldCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7IC8vIHN1cGVyc2VkZXMgYW55IGltcG9ydCBzdGlsbCBpbiBmbGlnaHRcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoIWluZm8/LmlzU3RhY2spIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3BlbmVycy5nZXQoMCkgPz8gb3BlbmVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKGZpcnN0LCB7IHNsaWNlOiAwIH0sIHRydWUpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8pO1xuICAgIGZvciAoY29uc3QgW3osIG9wZW5dIG9mIG9wZW5lcnMpIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKG9wZW4sIHsgc2xpY2U6IHogfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9wZW5lcnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIGltcG9ydGVkIHNvdXJjZSAoYSByZWdpb24gc2V0IHRoZVxuICAgKiBob3N0J3Mgc2VydmVyIHNlcnZlcyk6IG92ZXIgZXZlcnkgc2xpY2Ugb2YgYSBzdGFjayB3aGVuIGl0IGlzIHotaW5kZXhlZCwgZWxzZSBvbiB0aGUgc2xpY2VcbiAgICogc2hvd24sIGFzIHtAbGluayBhcHBseUltYWdlUm9pc30gbGF5cyBvdXQgYW4gaW1hZ2UncyBvd24uIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nXG4gICAqIChhbmQgZGlzcG9zaW5nIHRoZSBzb3VyY2UpLCB3aGVuIHRoZSBpbXBvcnQgd2VudCBzdGFsZSB3aGlsZSBpdCBvcGVuZWQ6IGFub3RoZXIgaW1wb3J0LCBvclxuICAgKiBhbm90aGVyIGltYWdlIChzZWUge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH07IG9uZSBpcyB0YWtlbiBoZXJlIHdoZW4gYHRpY2tldGAgaXMgbm90IGdpdmVuKS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcihvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsIHRpY2tldD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1pbmUgPSB0aWNrZXQgPz8gdGhpcy5yZWdpb25JbXBvcnRUaWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuaW1wb3J0VGlja2V0VmFsaWQobWluZSkpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZmlyc3Q6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuKCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSB7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGNvbnN0IHBsYW5lcyA9IGZpcnN0LmluZm8ucGxhbmVzO1xuICAgIGNvbnN0IHpJbmRleGVkID0gISFpbmZvPy5pc1N0YWNrICYmIHBsYW5lcy5zb21lKChwKSA9PiBwICE9PSAwKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8gYXMgSUltYWdlSW5mbyk7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgJ3BsYW5lcycsIFsuLi5wbGFuZXNdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCB7IHNsaWNlOiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpIH0sIHRydWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNwYXRpYWwgZGF0YXNldCdzIHJlZ2lvbiBzZXQgKGEgM0Qgc2VnbWVudGF0aW9uJ3MgY2VsbHMsIG91dGxpbmVkIG9uIGV2ZXJ5IHBsYW5lIHRoZXlcbiAgICogc3BhbikgdG8gaXRzIGltYWdlLCB0aGUgaW1hZ2UgcGxvdHRlZCBub3csIGFzIHRoZSBpbWFnZSdzIG93biByZWdpb25zIGFyZTogb3ZlciBldmVyeSBzbGljZVxuICAgKiBmcm9tIHRoZSBzZXQncyBwbGFuZXMgKGAncGxhbmVzJ2ApLCBub3QgbWFya2VkIGltcG9ydGVkIChpdCBpcyB0aGUgZGF0YXNldCdzLCBub3RoaW5nIHRvIHNhdmUpLFxuICAgKiBsZWF2aW5nIHRoZSBpbWFnZSdzIGRyYXduIHJlZ2lvbnMgYXMgdGhleSBhcmUuIE9uY2UgcGVyIGltYWdlIGFuZCBzZXQ6IGNhbGxlZCBhZ2FpbiAodGhlXG4gICAqIGRhdGFzZXQgcmUtZW1pdHRlZCwgdGhlIGltYWdlIHJlLXBsb3R0ZWQpIGl0IGNoYW5nZXMgbm90aGluZy4gV2hlcmUgdGhlIHNldCdzIHNsaWNlcyBhcmUgKGl0c1xuICAgKiBgc2xpY2VaYCkgcGxhY2VzIGl0cyBzdXJmYWNlcyBhbW9uZyB0aGUgb2JzZXJ2YXRpb25zIGluIHNwYXRpYWwgM0QsIHdoZXJlIHRoZSByZWdpb24gZWRpdG9yIHRoZW5cbiAgICogb2ZmZXJzIGl0cyBjbGFzc2VzIGluIDNEOyB0aGVyZSwgZXZlcnkgY2xhc3MgaXMgc2hvd24gb25jZSBieSBpdHNlbGYgKHNlZSBzaG93RGF0YXNldFJlZ2lvblNldDNkKS5cbiAgICogQmFjayBvbiBhbiBpbWFnZSB0aGUgc2V0IHdhcyBhdHRhY2hlZCB0bywgd2l0aCBpdHMgc291cmNlIHN0aWxsIHRoZSBzdG9yZSdzLCBpdCBpcyByZXN0b3JlZCBhc1xuICAgKiBpdCB3YXMgKHdoYXQgd2FzIHRha2VuIGZyb20gdGhlIHNvdXJjZSwgb3IgZGVsZXRlZCwgc3RheXMgc28pLCBub3QgYXR0YWNoZWQgYWdhaW4uXG4gICAqIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nICh0aGUgc291cmNlIGRpc3Bvc2VkKSwgd2hlbiBhbm90aGVyIGltYWdlIHdhcyBwbG90dGVkIG9yXG4gICAqIGFub3RoZXIgc2V0IGF0dGFjaGVkIHdoaWxlIGl0IG9wZW5lZCwgaXQgY291bGQgbm90IGJlIG9wZW5lZCwgb3IgdGhlIGltYWdlIGhhcyByZWdpb24gc291cmNlc1xuICAgKiBvZiBpdHMgb3duICh3aGljaCBpdCB3b3VsZCByZXBsYWNlLCBzZWUga2VlcHNPd25Tb3VyY2VzKS5cbiAgICovXG4gIGFzeW5jIGF0dGFjaERhdGFzZXRSZWdpb25TZXQob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICAgIGlmICghaW1hZ2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kYXRhc2V0UmVnaW9uU2V0O1xuICAgIGlmIChjdXJyZW50Py5pbWFnZSA9PT0gaW1hZ2UgJiYgY3VycmVudC5rZXkgPT09IGtleSkge1xuICAgICAgdGhpcy5zaG93RGF0YXNldFJlZ2lvblNldDNkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQmFjayBvbiBhbiBpbWFnZSB3aG9zZSBzZXQgaXMgYXR0YWNoZWQ6IGl0cyBzb3VyY2UgaXMgc3RpbGwgdGhlIHN0b3JlJ3MsIHdpdGggd2hhdCB3YXMgdGFrZW5cbiAgICAvLyBmcm9tIGl0LiBSZXN0b3JlZCwgbm90IGF0dGFjaGVkIGFnYWluLlxuICAgIGNvbnN0IGtub3duID0gdGhpcy5hdHRhY2hlZFJlZ2lvblNldHMuZ2V0KGltYWdlKTtcbiAgICBpZiAoa25vd24/LmtleSA9PT0ga2V5ICYmIGtub3duLm9wZW5lciAmJiBrbm93bi5vcGVuZXIgPT09IHRoaXMucmVnaW9uU3RvcmUuZ2V0UGxhbmVzU291cmNlT3BlbmVyKCkpIHtcbiAgICAgIHRoaXMudXNlRGF0YXNldFJlZ2lvblNldChrbm93bik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMua2VlcHNPd25Tb3VyY2VzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDbGFpbWVkIGJlZm9yZSB0aGUgc291cmNlIG9wZW5zOiBhIHNlY29uZCBjYWxsIG1lYW53aGlsZSBjaGFuZ2VzIG5vdGhpbmcuXG4gICAgY29uc3QgY2xhaW06IERhdGFzZXRSZWdpb25TZXRTdGF0ZSA9IHsgaW1hZ2UsIGtleSwgcGxhbmVzOiBudWxsLCBncm91cHM6IFtdLCBzaG93bjNkOiBmYWxzZSwgb3BlbmVyOiBudWxsIH07XG4gICAgdGhpcy5kYXRhc2V0UmVnaW9uU2V0ID0gY2xhaW07XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsO1xuICAgIHRyeSB7XG4gICAgICBmaXJzdCA9IGF3YWl0IG9wZW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFzZXRSZWdpb25TZXQgPT09IGNsYWltKSB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBudWxsO1xuICAgICAgY29uc29sZS53YXJuKFwiW3Zpc3VhbGl6ZXJdIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCBjb3VsZCBub3QgYmUgb3BlbmVkXCIsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFzZXRSZWdpb25TZXQgIT09IGNsYWltIHx8IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKSAhPT0gaW1hZ2UgfHwgdGhpcy5rZWVwc093blNvdXJjZXMoa2V5KSkge1xuICAgICAgaWYgKHRoaXMuZGF0YXNldFJlZ2lvblNldCA9PT0gY2xhaW0pIHRoaXMuZGF0YXNldFJlZ2lvblNldCA9IG51bGw7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSBmaXJzdC5pbmZvO1xuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IHBsYW5lcyA9IGluZm8uc2xpY2VaPy5sZW5ndGggJiYgaW5mby5zbGljZVoubGVuZ3RoID09PSBpbmZvLnBsYW5lcy5sZW5ndGggPyBpbmZvLnNsaWNlWiA6IG51bGw7XG4gICAgLy8gU2xpY2VkIGJ5IGl0cyBwbGFuZXMsIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYXJlIGhlbGQgcGVyIHBsYW5lIChzZWUgdXNlRGF0YXNldFJlZ2lvblNldCk6IHN0YWNrXG4gICAgLy8gbW9kZSBmaXJzdCwgc28gdGhlIHNvdXJjZSBpcyBsYWlkIG91dCBvbiB0aGUgcGxhbmUgc2hvd24uXG4gICAgaWYgKHBsYW5lcyAmJiBwbGFuZXMubGVuZ3RoID4gMSAmJiAhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjayAmJiAhdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpKSB7XG4gICAgICBjb25zdCB6ID0gdGhpcy5jdXJyZW50WkluZGV4IDwgcGxhbmVzLmxlbmd0aCA/IHRoaXMuY3VycmVudFpJbmRleCA6IDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoW1t6LCB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKV1dKSwgeiwgJ2NvbWJpbmVkJyk7XG4gICAgfVxuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCAncGxhbmVzJyk7XG4gICAgY29uc3Qgc2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUgPSB7IC4uLmNsYWltLCBwbGFuZXMsIGdyb3VwczogcmVnaW9uU2V0R3JvdXBzKGluZm8pLCBvcGVuZXI6IHJldXNlIH07XG4gICAgdGhpcy5hdHRhY2hlZFJlZ2lvblNldHMuc2V0KGltYWdlLCBzZXQpO1xuICAgIHRoaXMudXNlRGF0YXNldFJlZ2lvblNldChzZXQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsb3R0ZWQgaW1hZ2UgaGFzIHJlZ2lvbiBzb3VyY2VzIG9mIGl0cyBvd24gKGEgc2VydmVkIHNldCwgbGFyZ2Ugc2F2ZWQgUk9JcywgYW5cbiAgICogYW5ub3RhdGlvbiBmb2xkZXIncyBzbGljZXMpLCB3aGljaCBhdHRhY2hpbmcgdGhlIGRhdGFzZXQncyBzZXQgb3ZlciBldmVyeSBwbGFuZSB3b3VsZCByZXBsYWNlLFxuICAgKiBkcm9wcGluZyB0aGVtIGFuZCB3aGF0IHdhcyB0YWtlbiBmcm9tIHRoZW06IHRoZXkgYXJlIGtlcHQsIGFuZCB0aGUgc2V0IGlzIG5vdCBhdHRhY2hlZC5cbiAgICovXG4gIHByaXZhdGUga2VlcHNPd25Tb3VyY2VzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvblN0b3JlLmhhc0FueVJlZ2lvblNvdXJjZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFt2aXN1YWxpemVyXSB0aGUgaW1hZ2UgaGFzIHJlZ2lvbiBzb3VyY2VzIG9mIGl0cyBvd246IHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCAoJHtrZXl9KSBpcyBub3QgYXR0YWNoZWQgb3ZlciB0aGVtYCxcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYHNldGAgdGhlIHBsb3R0ZWQgaW1hZ2UncyByZWdpb24gc2V0OiBpdHMgcGxhbmVzIHNsaWNlIHRoZSBpbWFnZSAoaXRzIHJlZ2lvbnMgcGVyIHBsYW5lLFxuICAgKiBhcyBhIHN0YWNrJ3MgcGVyIHNsaWNlOiB0aG9zZSBkcmF3biBiZWZvcmUgZ28gdG8gdGhlIHBsYW5lIHNob3duKSwgcGxhY2UgaXRzIHN1cmZhY2VzIGluXG4gICAqIHNwYXRpYWwgM0QgYW5kIGRyaXZlIHRoZSBzbGlkZXIuXG4gICAqL1xuICBwcml2YXRlIHVzZURhdGFzZXRSZWdpb25TZXQoc2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBzZXQ7XG4gICAgY29uc3QgcGxhbmVzID0gc2V0LnBsYW5lcztcbiAgICBjb25zdCBzbGljZWQgPSAhIXBsYW5lcyAmJiBwbGFuZXMubGVuZ3RoID4gMSAmJiAhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjaztcbiAgICBpZiAoc2xpY2VkICYmICF0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKCkpIHtcbiAgICAgIGNvbnN0IHogPSB0aGlzLmN1cnJlbnRaSW5kZXggPCBwbGFuZXMubGVuZ3RoID8gdGhpcy5jdXJyZW50WkluZGV4IDogMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcChbW3osIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpXV0pLCB6LCAnY29tYmluZWQnKTtcbiAgICB9XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmVzKHBsYW5lcyk7XG4gICAgaWYgKHBsYW5lcykgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmUodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICB0aGlzLmRhdGFzZXRQbGFuZXMkLm5leHQoc2xpY2VkID8gcGxhbmVzIDogbnVsbCk7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICAvLyBSZWdpb25zIHN3aXRjaGVkIG9mZiBpbiBhIHNwYXRpYWwgdmlldyBiZWZvcmUgdGhlIHNldCBjYW1lOiBpdHMgY2xhc3NlcyBhcmUgaGlkZGVuIGFzIHRoZVxuICAgIC8vIHJlc3QgYXJlLlxuICAgIGlmIChcbiAgICAgIHRoaXMuYW5ub3RhdGlvbnNIaWRkZW4gJiZcbiAgICAgIChpc1NwYXRpYWxPbWljcyh0aGlzLmN1cnJlbnRQbG90VHlwZSkgfHwgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLnNldENsYXNzZXNIaWRkZW4oXG4gICAgICAgIHNldC5ncm91cHMuZmxhdE1hcCgoZykgPT4gZy5jbGFzc2VzKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyh0aGlzLmN1cnJlbnRQbG90VHlwZSk7XG4gICAgdGhpcy5zaG93RGF0YXNldFJlZ2lvblNldDNkKCk7XG4gICAgdGhpcy51cGRhdGVQbGFuZUNlbGxzKCk7XG4gICAgdGhpcy51cGRhdGVDZWxsczNkKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRhdGFzZXQgbm8gbG9uZ2VyIG5hbWVzIHRoZSBhdHRhY2hlZCBzZXQgd2hpbGUgaXRzIGltYWdlIGlzIHN0aWxsIHBsb3R0ZWQgKHNlZVxuICAgKiBJVmlzdWFsaXplci5yZWxlYXNlRGF0YXNldFJlZ2lvblNldCk6IGl0cyBwbGFuZXMsIGl0cyBzdXJmYWNlcyBhbmQgY2VsbHMgaW4gM0QgZ28sIGFzIG9uIGFub3RoZXJcbiAgICogaW1hZ2UuIEl0cyBhdHRhY2htZW50IGlzIGtlcHQgKGF0dGFjaGVkUmVnaW9uU2V0cyk6IHRoZSBzYW1lIHNldCBhc2tlZCBmb3IgYWdhaW4gaXMgcmVzdG9yZWQuXG4gICAqL1xuICByZWxlYXNlRGF0YXNldFJlZ2lvblNldChrZWVwOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5kYXRhc2V0UmVnaW9uU2V0O1xuICAgIGlmICghc2V0IHx8IHNldC5rZXkgPT09IGtlZXApIHJldHVybjtcbiAgICAvLyBPbmUgc3RpbGwgb3BlbmluZyAodGhlIGNsYWltKSBpcyBkcm9wcGVkIHdoZW4gaXQgb3BlbnMuXG4gICAgdGhpcy5kYXRhc2V0UmVnaW9uU2V0ID0gbnVsbDtcbiAgICBpZiAoc2V0LnBsYW5lcyAmJiB0aGlzLmNsYXNzZXMzZCQudmFsdWUubGVuZ3RoICYmIHRoaXMuY2xhc3NlczNkSW1hZ2UgPT09IHRoaXMucGxvdHRlZEZpbGVOYW1lKSB7XG4gICAgICB0aGlzLmNsZWFyUmVnaW9uQ2xhc3NlczNkKCk7XG4gICAgfVxuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvblBsYW5lcyhudWxsKTtcbiAgICB0aGlzLmRhdGFzZXRQbGFuZXMkLm5leHQobnVsbCk7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIHRoaXMudXBkYXRlQ2VsbHMzZCgpO1xuICAgIHRoaXMudXBkYXRlUGxhbmVDZWxscygpO1xuICB9XG5cbiAgLyoqIFRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncyBjbGFzc2VzIHdoaWxlIGluIHNwYXRpYWwgM0Q6IHRob3NlIHRoYXQgY2FuIGJlIGRyYXduIGFzIGNlbGxzLiAqL1xuICBnZXRDZWxsYWJsZUNsYXNzZXMzZCQoKTogT2JzZXJ2YWJsZTxSZWFkb25seVNldDxzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbGFibGUzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzZXMgdGhlIHNwYXRpYWwgM0QgdmlldyBkcmF3cyBhcyBpbmRpdmlkdWFsIGNlbGxzIChzZWUgdXBkYXRlQ2VsbHMzZCkuICovXG4gIGdldEluZGl2aWR1YWxDbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLmluZGl2aWR1YWwzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogRHJhdyB0aGVzZSBjbGFzc2VzIGFzIGluZGl2aWR1YWwgY2VsbHMgaW4gc3BhdGlhbCAzRCwgb3IgbWVyZ2VkIGFnYWluICh0aGUgZ2xvYmFsIHN3aXRjaCBhc2lkZSkuICovXG4gIHNldENsYXNzZXNJbmRpdmlkdWFsM2QoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGluZGl2aWR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmNlbGxzM2RNb2RlID09PSAnY2VsbHMnO1xuICAgIGZvciAoY29uc3QgYyBvZiBjbGFzc2VzKSB7XG4gICAgICBpZiAoaW5kaXZpZHVhbCA9PT0gZ2xvYmFsKSB0aGlzLmNlbGxzM2RPdmVycmlkZXMuZGVsZXRlKGMpO1xuICAgICAgZWxzZSB0aGlzLmNlbGxzM2RPdmVycmlkZXMuc2V0KGMsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNlbGxzM2QodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hpY2ggb2YgdGhlIGRhdGFzZXQgcmVnaW9uIHNldCdzIGNsYXNzZXMgdGhlIHNwYXRpYWwgM0QgdmlldyBkcmF3cyBhcyBpbmRpdmlkdWFsIGNlbGxzOiBldmVyeVxuICAgKiBvbmUgd2l0aCB0aGUgcGFuZWwncyBnbG9iYWwgc3dpdGNoIG9uIFwiY2VsbHNcIiwgbm9uZSBvbiBcInR5cGVzXCIsIGVhY2ggY2xhc3MgdGhlIFJlZ2lvbiBFZGl0b3JcbiAgICogc2V0IHRoZSBvdGhlciB3YXkgZXhjZXB0ZWQuIFR1cm5pbmcgdGhlIGdsb2JhbCBzd2l0Y2ggcmVzZXRzIHRob3NlLiBUaGUgaW5kaXZpZHVhbCBjbGFzc2VzJ1xuICAgKiBtZXJnZWQgc3VyZmFjZXMgYXJlIGxlZnQgb3V0IChzZWUgc2hvd1JlZ2lvbkNsYXNzZXMzZCk7IHRoZWlyIGNlbGxzIGFyZSBkcmF3biBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDZWxsczNkKGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKS5jZWxsczNkID8/ICd0eXBlcyc7XG4gICAgaWYgKG1vZGUgIT09IHRoaXMuY2VsbHMzZE1vZGUpIHtcbiAgICAgIHRoaXMuY2VsbHMzZE1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5jZWxsczNkT3ZlcnJpZGVzLmNsZWFyKCk7XG4gICAgICBmb3JjZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXMgPyB0aGlzLmRhdGFzZXRSZWdpb25TZXQuZ3JvdXBzIDogW10pIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBnLmNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbHMzZE92ZXJyaWRlcy5nZXQoYykgPz8gbW9kZSA9PT0gJ2NlbGxzJykgY2xhc3Nlcy5hZGQoYyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNlbGxhYmxlID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkgJiYgdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXNcbiAgICAgICAgPyB0aGlzLmRhdGFzZXRSZWdpb25TZXQuZ3JvdXBzLmZsYXRNYXAoKGcpID0+IGcuY2xhc3NlcylcbiAgICAgICAgOiBbXSxcbiAgICApO1xuICAgIGNvbnN0IGhhZCA9IHRoaXMuY2VsbGFibGUzZCQudmFsdWU7XG4gICAgaWYgKGhhZC5zaXplICE9PSBjZWxsYWJsZS5zaXplIHx8IFsuLi5jZWxsYWJsZV0uc29tZSgoYykgPT4gIWhhZC5oYXMoYykpKSB0aGlzLmNlbGxhYmxlM2QkLm5leHQoY2VsbGFibGUpO1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMuaW5kaXZpZHVhbDNkJC52YWx1ZTtcbiAgICBjb25zdCBzYW1lID0gYmVmb3JlLnNpemUgPT09IGNsYXNzZXMuc2l6ZSAmJiBbLi4uY2xhc3Nlc10uZXZlcnkoKGMpID0+IGJlZm9yZS5oYXMoYykpO1xuICAgIGlmIChzYW1lICYmICFmb3JjZSkgcmV0dXJuO1xuICAgIGlmICghc2FtZSkgdGhpcy5pbmRpdmlkdWFsM2QkLm5leHQoY2xhc3Nlcyk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uQ2VsbHMoY2xhc3Nlcy5zaXplID8gWy4uLmNsYXNzZXNdIDogbnVsbCk7XG4gICAgLy8gVGhlIG1lcmdlZCBzdXJmYWNlcyBmb2xsb3c6IGFuIGluZGl2aWR1YWwgY2xhc3MncyBsZWF2ZXMgdGhlbSwgYSBtZXJnZWQgb25lJ3MgY29tZXMgYmFjay5cbiAgICBpZiAoIXNhbWUgJiYgdGhpcy5zaG93bjNkLmxlbmd0aCAmJiB0aGlzLmNsYXNzZXMzZEltYWdlID09PSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSkge1xuICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIHNwYXRpYWwgdmlld3MgKDJEIGFuZCAzRCksIHRoZSBzcGF0aWFsIHBhbmVsJ3MgUmVnaW9ucyBzd2l0Y2ggKGBzaG93QW5ub3RhdGlvbnNgLCBvZmYgYnlcbiAgICogZGVmYXVsdCkgaXMgZXZlcnkgY2xhc3MncyBpbiB0aGUgUmVnaW9uIEVkaXRvcidzIGxpc3QsIGFzIHRoZWlyIGV5ZXMgYXJlOiBvZmYsIGV2ZXJ5IGNsYXNzIGlzXG4gICAqIGhpZGRlbiAodGhlIGRyYXduIHJlZ2lvbnMnIGFuZCB0aGUgZGF0YXNldCByZWdpb24gc2V0J3MgY2VsbCB0eXBlcyBhbGlrZTogdGhlaXIgcmVnaW9ucyBpbiAyRCxcbiAgICogdGhlaXIgc3VyZmFjZXMgaW4gM0QsIGFuZCB0aGUgZXllcyBzaG93IGl0KTsgb24gYWdhaW4sIGV2ZXJ5IGNsYXNzIGlzIHNob3duLiBBcHBsaWVkIHdoZW4gdGhlXG4gICAqIHN3aXRjaCBjaGFuZ2VzLCBvciBvbiBlbnRlcmluZyBhIHNwYXRpYWwgdmlldyB3aXRoIGl0IG9mZiAoc28gYnkgZGVmYXVsdCksIHNvIGEgY2xhc3MgaGlkZGVuIG9yXG4gICAqIHNob3duIGJ5IGl0cyBvd24gZXllIG1lYW53aGlsZSBzdGF5cyBhcyBpdCB3YXMgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jQW5ub3RhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NwYXRpYWxPbWljcyh0aGlzLmN1cnJlbnRQbG90VHlwZSkgJiYgIWlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSByZXR1cm47XG4gICAgY29uc3QgaGlkZSA9IHRoaXMuc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCkuc2hvd0Fubm90YXRpb25zID09PSBmYWxzZTtcbiAgICBpZiAoaGlkZSA9PT0gdGhpcy5hbm5vdGF0aW9uc0hpZGRlbikgcmV0dXJuO1xuICAgIHRoaXMuYW5ub3RhdGlvbnNIaWRkZW4gPSBoaWRlO1xuICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmtub3duQ2xhc3NlcygpO1xuICAgIGlmIChjbGFzc2VzLmxlbmd0aCkgdGhpcy5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGNsYXNzIHRoZSBSZWdpb24gRWRpdG9yIGxpc3RzIGZvciB0aGUgaW1hZ2U6IHRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncywgdGhvc2Ugc2hvd24gaW4gM0QsXG4gICAqIHRoZSBkcmF3biByZWdpb25zJywgYW5kIGFueSBoaWRkZW4gbm93LlxuICAgKi9cbiAgcHJpdmF0ZSBrbm93bkNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMoKSk7XG4gICAgZm9yIChjb25zdCBnIG9mIHRoaXMuZGF0YXNldFJlZ2lvblNldD8uZ3JvdXBzID8/IFtdKSBnLmNsYXNzZXMuZm9yRWFjaCgoYykgPT4gb3V0LmFkZChjKSk7XG4gICAgZm9yIChjb25zdCBnIG9mIHRoaXMuc2hvd24zZCkgZy5jbGFzc2VzLmZvckVhY2goKGMpID0+IG91dC5hZGQoYykpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSkgaWYgKHIubGFiZWwpIG91dC5hZGQoci5sYWJlbCk7XG4gICAgcmV0dXJuIFsuLi5vdXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBDZWxscyBwYW5lbCdzIGJvdW5kYXJ5IHNldCB0aGF0IGlzIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCAodGhlIG9uZSBuYW1pbmcgaXQgYXMgaXRzXG4gICAqIGByZWdpb25Tb3VyY2VgKSwgd2hpbGUgaXRzIHBsYW5lcyBhcmUgc2hvd24gb24gdGhlIHBsb3R0ZWQgaW1hZ2Ugd2l0aCBpdHMgc291cmNlIHN0aWxsIHRoZVxuICAgKiBzdG9yZSdzOyBudWxsIG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgcGxhbmVDZWxsU2V0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNldCA9IHRoaXMuZGF0YXNldFJlZ2lvblNldDtcbiAgICBpZiAoIXNldD8ucGxhbmVzIHx8ICFzZXQub3BlbmVyIHx8IHNldC5vcGVuZXIgIT09IHRoaXMucmVnaW9uU3RvcmUuZ2V0UGxhbmVzU291cmNlT3BlbmVyKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxEYXRhc2V0Py5wb2x5Z29uVGlsZXM/LnNldHMuZmluZCgocykgPT4gcy5yZWdpb25Tb3VyY2UgPT09IHNldC5rZXkpPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hpbGUgdGhlIGRhdGFzZXQgcmVnaW9uIHNldCdzIHBsYW5lcyBhcmUgc2hvd24sIHRoZSBDZWxscyBwYW5lbCBkcmF3cyBlYWNoIHBsYW5lJ3MgY2VsbHMgZnJvbVxuICAgKiBpdCAoaXRzIGJvdW5kYXJ5IHNldCwgc2VlIGBDZWxsTGF5ZXJzLnNldFBsYW5lYCk6XG4gICAqICAtIHRoYXQgc2V0IGlzIHRoZSBwYW5lbCdzIGJvdW5kYXJpZXMgYnkgZGVmYXVsdDogYSB2aWV3IHRoYXQgaGFzIG5vdCBjaG9zZW4gYSBzZXQgKG5vbmUgeWV0LCBvclxuICAgKiAgICBhZnRlciBhIHJlc2V0KSBpcyBnaXZlbiBpdDtcbiAgICogIC0gaW4gdGhlIDJEIHNwYXRpYWwgdmlldywgd2hpbGUgdGhlIHBhbmVsIGRyYXdzIHRoZW0sIHRoZSBvdmVybGF5cyBkbyBub3QgZHJhdyB0aGUgc2FtZVxuICAgKiAgICBvdXRsaW5lcyBhIHNlY29uZCB0aW1lIChgUmVnaW9uU3RvcmUuc2V0UmVnaW9uU291cmNlRHJhd25gKS4gVGhleSBzdGF5IGxpc3RlZCBhbmQgZWRpdGFibGVcbiAgICogICAgaW4gdGhlIFJlZ2lvbiBFZGl0b3IsIGFuZCBhcmUgZHJhd24gYnkgdGhlIG92ZXJsYXlzIGV2ZXJ5d2hlcmUgZWxzZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlUGxhbmVDZWxscygpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wbGFuZUNlbGxTZXQoKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKTtcbiAgICBpZiAobmFtZSAmJiB2aWV3LmNlbGxTZXQgPT0gbnVsbCkge1xuICAgICAgLy8gRW1pdHMgdGhlIHZpZXcsIHdoaWNoIGNvbWVzIGJhY2sgaGVyZSB3aXRoIHRoZSBzZXQgY2hvc2VuLlxuICAgICAgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNlbGxTZXQ6IG5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRyYXduID0gZHJhd25DZWxsU2V0cyh0aGlzLnNwYXRpYWxEYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHZpZXcuY2VsbFNldCk7XG4gICAgY29uc3QgYnlDZWxscyA9XG4gICAgICAhIW5hbWUgJiZcbiAgICAgIGlzU3BhdGlhbE9taWNzKHRoaXMuY3VycmVudFBsb3RUeXBlKSAmJlxuICAgICAgKHZpZXcuc2hvd0NlbGxzID8/IHRydWUpICYmXG4gICAgICBkcmF3bj8uc2V0ID09PSBuYW1lICYmXG4gICAgICAhZHJhd24ubnVjbGV1c1NldDtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblNvdXJjZURyYXduKCFieUNlbGxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBzcGF0aWFsIDNELCB3aXRoIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCBwbGFjZWQgdGhlcmU6IHNob3cgZWFjaCBvZiBpdHMgY2xhc3NlcyBpbiAzRCwgaW5cbiAgICogaXRzIGNvbG91ciwgb25jZSBwZXIgaW1hZ2UsIHVubGVzcyBjbGFzc2VzIGFyZSBzaG93biBhbHJlYWR5ICh0aGUgcmVnaW9uIGVkaXRvcidzIGNob2ljZVxuICAgKiBzdGFuZHMsIGFuZCBoaWRpbmcgdGhlbSBhbGwgc3RheXMgaGlkZGVuKS5cbiAgICovXG4gIHByaXZhdGUgc2hvd0RhdGFzZXRSZWdpb25TZXQzZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSB0aGlzLmRhdGFzZXRSZWdpb25TZXQ7XG4gICAgaWYgKCFzZXQ/LnBsYW5lcyB8fCBzZXQuc2hvd24zZCB8fCAhc2V0Lmdyb3Vwcy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoIWlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpIHx8IHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGgpIHJldHVybjtcbiAgICBzZXQuc2hvd24zZCA9IHRydWU7XG4gICAgdGhpcy5zaG93UmVnaW9uQ2xhc3NlczNkKHNldC5ncm91cHMpLmNhdGNoKChlcnIpID0+XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSB0aGUgY2VsbHMgY291bGQgbm90IGJlIHNob3duIGluIDNEJywgZXJyKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtcHR5IGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgKGl0cyByZWdpb25zIGFuZCB1bmRvIGhpc3RvcnkpIGZvciByZWdpb25zIGltcG9ydGVkIG92ZXIgaXQuICovXG4gIHByaXZhdGUgZW50ZXJJbXBvcnRlZFN0YWNrKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKClcbiAgICAgID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKVxuICAgICAgOiBpbmZvLnRpbGVkID09PSBmYWxzZVxuICAgICAgICA/ICdwZXItc2xpY2UtZmlsZSdcbiAgICAgICAgOiAnY29tYmluZWQnO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpLCBsYXlvdXQpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5KTtcbiAgfVxuICBzZWxlY3RTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzKTtcbiAgfVxuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblN0eWxlJCgpO1xuICB9XG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9uU3R5bGUocGF0Y2gpO1xuICB9XG4gIC8vIOKUgOKUgCBSZWdpb25zIGluIDNEOiB0aGVpciByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSB2aWV3IOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWNvbXB1dGUgd2hpY2ggM0QgdmlldyBpcyBvbiBzY3JlZW4gZm9yIGBwbG90VHlwZWAgKHNlZSB7QGxpbmsgdm9sdW1lVmlldyR9KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWb2x1bWVWaWV3ID0gaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSk7XG4gICAgLy8gVGhlIHNwYXRpYWwgY2xvdWQgcGxhY2VzIHRoZSBzdXJmYWNlcyBvZiBhIHN0YWNrJ3Mgc2xpY2VzLCBvciBvZiBhIHJlZ2lvbiBzZXQncyBwbGFuZXMuXG4gICAgY29uc3QgcGxhY2VkID0gISF0aGlzLnBsb3R0ZWRJbmZvPy5pc1N0YWNrIHx8ICEhdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXM7XG4gICAgY29uc3QgcmVnaW9uczNkID0gdGhpcy5pbWFnZVZvbHVtZVZpZXcgfHwgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpICYmIHBsYWNlZCk7XG4gICAgLy8gRXZlcnkgcGxvdCwgYXMgYmVmb3JlOiB0aGUgUmVnaW9uIEVkaXRvciBkcm9wcyBpdHMgcGVyLWNsYXNzIHZvbHVtZXMgb24gZWFjaCAoYSBuZXcgaW1hZ2UpLlxuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChyZWdpb25zM2QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIG9uIHNjcmVlbjogcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0QuICovXG4gIGdldFZvbHVtZVZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKGl0IHNob3dzIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuKS4gKi9cbiAgZ2V0U2xpY2VFZGl0b3IkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlRWRpdG9yJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldyBkcmF3cyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuICovXG4gIGdldFJlZ2lvbnNUaHJvdWdoVm9sdW1lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUgKGl0IGhpZGVzIG5vbmUgb2YgdGhlbTogc3VyZmFjZXMgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcykgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzICh0aGUgZGVmYXVsdCkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLnZhbHVlID09PSB0aHJvdWdoKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQubmV4dCh0aHJvdWdoKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNEIG9uIHRoaXMgaW1hZ2UgKFtdIGFmdGVyIGEgc3dpdGNoIHRvIGFub3RoZXIgaW1hZ2UpLiAqL1xuICBnZXRSZWdpb25DbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXMzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogSGlkZSBldmVyeSByZWdpb24gc3VyZmFjZSBhbmQgZm9yZ2V0IHRoZW0gKGEgYnVpbGQgc3RpbGwgcnVubmluZyBpcyBkcm9wcGVkKS4gKi9cbiAgcHJpdmF0ZSBjbGVhclJlZ2lvbkNsYXNzZXMzZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc2hSZXF1ZXN0Kys7XG4gICAgdGhpcy5zaG93bjNkID0gW107XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoW10pO1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFtdLCB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChbXSk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBncm91cCBrZXlzIGluIHRoZSB2b2x1bWUgdmlldyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCAoaXRzIGdyb3VwIGtleSksIG9yIG5vbmUgKG51bGwpLiAqL1xuICBnZXRSZWdpb25QaWNrZWQzZCQoKTogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nIHwgbnVsbDsgYWRkaXRpdmU6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25NZXNoUGljayQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZXNlIGdyb3VwcyBvZiBjbGFzc2VzIGluIHRoZSB2b2x1bWUgdmlldyBhcyAzRCByZWNvbnN0cnVjdGlvbnMgKGVhY2ggZ3JvdXAgb25lIHN1cmZhY2VcbiAgICogaW4gaXRzIGNvbG91cjogYW4gYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpLCBhbmQgb25seSB0aGVzZTsgW10gaGlkZXMgdGhlbS5cbiAgICogUmVjb25zdHJ1Y3RlZCBmcm9tIGV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgYXQgdGhlIHZvbHVtZSdzIHJlc29sdXRpb24sIGNhY2hlZCBwZXIgaW1hZ2UuXG4gICAqL1xuICBhc3luYyBzaG93UmVnaW9uQ2xhc3NlczNkKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMubWVzaFJlcXVlc3Q7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lO1xuICAgIHRoaXMuc2hvd24zZCA9IGdyb3VwcztcbiAgICAvLyBXaGF0IGFuIGVkaXQgZnJvbSBub3cgb24gaXMgY29tcGFyZWQgd2l0aCAodGhlIGxpdmUgc2xpY2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQgeWV0KS5cbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChncm91cHMubWFwKChnKSA9PiAoeyBrZXk6IGcua2V5LCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpKTtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpPy53aWR0aCA/PyAxMDI0O1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSA/PyBNYXRoLm1heCgxLCB3aWR0aCAvIDI1Nik7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJztcbiAgICBjb25zdCBjYWNoZUtleSA9IChnOiB7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0pID0+IGAke2ltYWdlfXwke3N0ZXAudG9GaXhlZCgzKX18JHtnLmNsYXNzZXMuam9pbignLCcpfWA7XG4gICAgLy8gQSBncm91cCBvZiBjbGFzc2VzIGRyYXduIGFzIGluZGl2aWR1YWwgY2VsbHMgaGFzIG5vIG1lcmdlZCBzdXJmYWNlIChpdHMgY2VsbHMgYXJlIGRyYXduKS5cbiAgICBjb25zdCBpbmRpdmlkdWFsID0gdGhpcy5pbmRpdmlkdWFsM2QkLnZhbHVlO1xuICAgIGNvbnN0IG1lcmdlZCA9IGdyb3Vwcy5maWx0ZXIoKGcpID0+ICFnLmNsYXNzZXMubGVuZ3RoIHx8ICFnLmNsYXNzZXMuZXZlcnkoKGMpID0+IGluZGl2aWR1YWwuaGFzKGMpKSk7XG4gICAgY29uc3QgbWlzc2luZyA9IG1lcmdlZC5maWx0ZXIoKGcpID0+ICF0aGlzLm1lc2hDYWNoZS5oYXMoY2FjaGVLZXkoZykpKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbWlzc2luZy5tYXAoKGcpID0+IGcua2V5KTtcbiAgICAgIGNvbnN0IHdoYXQgPSBuYW1lcy5sZW5ndGggPiAzID8gYCR7bmFtZXMubGVuZ3RofSByZWdpb25zYCA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBkb25lID0gdGhpcy5uYXBhcmkuYmVnaW5UYXNrKGBCdWlsZGluZyAke3doYXR9IGluIDNE4oCmYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidWlsdCA9IGF3YWl0IHRoaXMucmVnaW9uU3RvcmUucmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgICAgICAgIG1pc3NpbmcubWFwKChnKSA9PiAoeyBrZXk6IGNhY2hlS2V5KGcpLCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNsYXNzZXNPZiA9IG5ldyBNYXAobWlzc2luZy5tYXAoKGcpID0+IFtjYWNoZUtleShnKSwgZy5jbGFzc2VzXSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnVpbHQpIHRoaXMubWVzaENhY2hlLnNldChiLmtleSwgeyBtZXNoOiBiLm1lc2gsIGNsYXNzZXM6IGNsYXNzZXNPZi5nZXQoYi5rZXkpID8/IFtdIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5tZXNoUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhcbiAgICAgIG1lcmdlZC5tYXAoKGcpID0+IHtcbiAgICAgICAgY29uc3QgbWVzaCA9IHRoaXMubWVzaENhY2hlLmdldChjYWNoZUtleShnKSkhLm1lc2g7XG4gICAgICAgIHJldHVybiB7IGtleTogZy5rZXksIGNvbG9yOiBnLmNvbG9yLCBsYWJlbDogZy5sYWJlbCwgdmVydGljZXM6IG1lc2gudmVydGljZXMsIGZhY2VzOiBtZXNoLmZhY2VzIH07XG4gICAgICB9KSxcbiAgICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgY2hhbmdlZDogd2hlbiB0aGUgbGl2ZSBzbGljZSdzIHJlZ2lvbnMgb2Ygc29tZSBjbGFzc2VzIGRpZCAoYW4gZWRpdCwgYW4gdW5kbywgbm90XG4gICAqIGEgc2xpY2Ugb3IgaW1hZ2Ugc3dpdGNoKSwgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGFyZSBzdGFsZS4gVGhleSBhcmUgZHJvcHBlZCwgYW5kIHRob3NlIHNob3duXG4gICAqIGluIDNEIGFyZSByZWJ1aWx0IG9uY2UgdGhlIGVkaXRzIHBhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlZ2lvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgZm9sbG93cyB0aGUgZWRpdHMgKG5vIHN1cmZhY2UgYnVpbHQgb3Igc2hvd24sIG5vIHNlY3Rpb25zKTogc2tpcCB0aGUgZmluZ2VycHJpbnRzLlxuICAgIGlmICghdGhpcy5zbGljZU1vdW50ZWQgJiYgIXRoaXMuc2hvd24zZC5sZW5ndGggJiYgIXRoaXMubWVzaENhY2hlLnNpemUpIHtcbiAgICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmxpdmVDbGFzc2VzO1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIGNvbnN0IG5vdyA9IHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIC8vIEFub3RoZXIgc2xpY2Ugb3IgaW1hZ2UgY2FtZSB1cDogbm8gcmVnaW9uIGNoYW5nZWQgKHRoZSBzZWN0aW9ucyByZWN1dCBmb3IgdGhlIHNsaWNlKS5cbiAgICBpZiAoIWJlZm9yZSB8fCBiZWZvcmUuYXQgIT09IG5vdy5hdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBjaGFuZ2VkQ2xhc3NlcyhiZWZvcmUuc2lnbmF0dXJlcywgbm93LnNpZ25hdHVyZXMpO1xuICAgIC8vIFNvdXJjZSBmZWF0dXJlcyBkZWxldGVkIChvciB0aGF0IHVuZG9uZSkgY2hhbmdlIG5vIGxpdmUgcmVnaW9uLCBhbmQgd2hpY2ggY2xhc3NlcyB0aGV5IHdlcmVcbiAgICAvLyBpcyBub3Qga25vd24gaGVyZTogZXZlcnkgY2xhc3MgaXMgc3RhbGUuIEEgZmVhdHVyZSB0YWtlbiBzaG93cyBhcyBpdHMgY2xhc3MncyBjaGFuZ2UuXG4gICAgY29uc3QgZXZlcnlDbGFzcyA9ICFjaGFuZ2VkLnNpemUgJiYgYmVmb3JlLnNvdXJjZXMgIT09IG5vdy5zb3VyY2VzO1xuICAgIGlmICghY2hhbmdlZC5zaXplICYmICFldmVyeUNsYXNzKSByZXR1cm47XG4gICAgY29uc3QgdG91Y2hlZCA9IChjOiBzdHJpbmcpID0+IGV2ZXJ5Q2xhc3MgfHwgY2hhbmdlZC5oYXMoYyk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLnNlY3Rpb25zLnJlZ2lvbnNDaGFuZ2VkKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgWy4uLnRoaXMubWVzaENhY2hlXSkge1xuICAgICAgaWYgKGVudHJ5LmNsYXNzZXMuc29tZSh0b3VjaGVkKSkgdGhpcy5tZXNoQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93bjNkLnNvbWUoKGcpID0+IGcuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgICB0aGlzLnJlYnVpbGRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc2hvd24zZC5sZW5ndGggJiYgdGhpcy5jbGFzc2VzM2RJbWFnZSA9PT0gdGhpcy5wbG90dGVkRmlsZU5hbWUpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICAgIH1cbiAgICB9LCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TKTtcbiAgfVxuXG4gIC8qKiBGaW5nZXJwcmludCB0aGUgbGl2ZSBzbGljZSdzIGNsYXNzZXMsIHVubGVzcyBhbHJlYWR5OiB3aGF0IHRoZSBuZXh0IGVkaXQgaXMgY29tcGFyZWQgd2l0aC4gKi9cbiAgcHJpdmF0ZSB0cmFja0xpdmVDbGFzc2VzKCk6IHsgYXQ6IHN0cmluZzsgc2lnbmF0dXJlczogTWFwPHN0cmluZywgbnVtYmVyPjsgc291cmNlczogc3RyaW5nIH0ge1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPz89IHtcbiAgICAgIGF0OiB0aGlzLmxpdmVTbGljZUtleSgpLFxuICAgICAgc2lnbmF0dXJlczogY2xhc3NTaWduYXR1cmVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSxcbiAgICAgIHNvdXJjZXM6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U291cmNlU3RhdGVLZXkoKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpdmVDbGFzc2VzO1xuICB9XG5cbiAgLyoqIFdoaWNoIHNsaWNlIG9mIHdoaWNoIGltYWdlIHRoZSBsaXZlIHJlZ2lvbnMgYXJlLiAqL1xuICBwcml2YXRlIGxpdmVTbGljZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpfVxcbiR7dGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyd9YDtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBpbiBweMKyIMOXIHNsaWNlcyAoc2VlIFJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcykuICovXG4gIGFzeW5jIGdldENsYXNzVm9sdW1lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMoY2xhc3NlcykpO1xuICB9XG5cbiAgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2s/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2spO1xuICB9XG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMkKCk7XG4gIH1cbiAgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGRlbik7XG4gICAgLy8gQSBzdXJmYWNlIGlzIGl0cyBjbGFzcydzIChpdHMgZ3JvdXAga2V5IGlzIHRoZSBjbGFzcyBuYW1lKS5cbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWRkZW4oWy4uLnRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcygpXSk7XG4gICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICB9XG4gIGFzeW5jIHNlbGVjdFJlZ2lvbkNsYXNzZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0Q2xhc3NlcyhjbGFzc2VzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZ1dpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uV2l0aFNvdXJjZShyZWdpb25zLCBzbGljZSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyAoaml0LXVpIzkzKSwgZnJvbSB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLiDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7XG4gIH1cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTtcbiAgfVxuICAvKiogVGhlIHNsaWNlIHRoZSByZWdpb25zIGFyZSBzaG93biBmb3IgKHJlY29yZGVkIG91dHNpZGUgc3RhY2sgbW9kZSB0b28pLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfVxuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpO1xuICB9XG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpO1xuICB9XG4gIC8qKiBBbGwgc2xpY2VzJyBBTk5PVEFUSU9OIHJlZ2lvbnMgZm9yIGEgei1zdGFjayBzYXZlIChqaXQtdWkjOTMpLCBlYWNoIHRhZ2dlZFxuICAgKiAgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24uejsgcHJvZmlsZSBsaW5lcyBleGNsdWRlZC4gRmxhdCBhbm5vdGF0aW9uIHNldFxuICAgKiAgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCkpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIHJlZ3MuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQXV0aG9yaXRhdGl2ZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ugc2l6ZSBmb3IgbWFzayBleHBvcnQuIFByZWZlcnMgdGhlXG4gICAqICBhY3RpdmUgcmVuZGVyZXIncyByZXBvcnRlZCBzaXplLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhICh4L3lcbiAgICogIGFyZSB0aGUgZnVsbC1yZXMgcGl4ZWwgZGltZW5zaW9ucyB1c2VkIGFjcm9zcyB0aGUgYXBwKS4gUmVqZWN0cyBub24tZmluaXRlXG4gICAqICBvciBub24tcG9zaXRpdmUgc2l6ZXMg4oCUIHRoZSBQbG90bHkgYm91bmRzIGNhbiB5aWVsZCBOYU4gYmVmb3JlIGEgcGxvdCBpc1xuICAgKiAgZnVsbHkgbGFpZCBvdXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjcmFzaCBtYXNrIGNyZWF0aW9uLiAqL1xuICBnZXRNYXNrSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZhbGlkID0gKHM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICBzICYmIE51bWJlci5pc0Zpbml0ZShzLndpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUocy5oZWlnaHQpICYmIHMud2lkdGggPj0gMSAmJiBzLmhlaWdodCA+PSAxXG4gICAgICAgID8geyB3aWR0aDogTWF0aC5yb3VuZChzLndpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKHMuaGVpZ2h0KSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZyb21SZW5kZXJlciA9IHZhbGlkKHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpKTtcbiAgICBpZiAoZnJvbVJlbmRlcmVyKSByZXR1cm4gZnJvbVJlbmRlcmVyO1xuXG4gICAgbGV0IG1ldGE6IElJbWFnZU1ldGFkYXRhW10gPSBbXTtcbiAgICB0aGlzLmdldEltYWdlTWV0YSgpXG4gICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKVxuICAgICAgLnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgcmV0dXJuIG0wID8gdmFsaWQoeyB3aWR0aDogbTAueCwgaGVpZ2h0OiBtMC55IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdG9yQXBpOiBhbm5vdGF0aW9uLW9ubHkgc3VyZmFjZSBmb3IgdGhlIFJlZ2lvbiBFZGl0b3Ig4pSA4pSA4pSAXG4gIC8vIEludGVuc2l0eS1wcm9maWxlIGxpbmVzIChraW5kPSdwcm9maWxlJykgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90XG4gIC8vIHRoZSBlZGl0b3IuIFRoZXNlIG1ldGhvZHMgZ2l2ZSBleHRlcm5hbCBjb25zdW1lcnMgYW4gYW5ub3RhdGlvbi1vbmx5IHZpZXdcbiAgLy8gYW5kIGd1YXJhbnRlZSBwcm9maWxlIGxpbmVzIGFyZSBwcmVzZXJ2ZWQuIFRoZSB3cml0ZXMgbGFuZCBpbiB0aGUgc3RvcmUgbGlrZVxuICAvLyBhbnkgb3RoZXIsIGFuZCBldmVyeSBiYWNrZW5kIHJlZHJhd3MgZnJvbSBpdHMgZXZlbnRzLlxuXG4gIGdldEFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlLWFwcGVuZCB0aGUgc3RvcmUncyBwcm9maWxlIGxpbmVzIHNvIGFuIGVkaXRvciBzYXZlL2RlbGV0ZSBjYW4ndCBkcm9wIHRoZW0uXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgICAgIHJldHVybiBpZHhzLm1hcCgoaSkgPT4gcmVnc1tpXSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyICYmICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBzZXRTZWxlY3RlZFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IChyZWdpb25zIHx8IFtdKS5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvLyDilIDilIAgdG9vbHMg4oaSIGFjdGl2ZSByZW5kZXJlciAocnVuIG9uIGVpdGhlciBiYWNrZW5kKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gVGhlIHdhbmQsIHZlcnRleCBlcmFzZXIgYW5kIHpvb20tdG8tYm94IGFyZSBpbXBsZW1lbnRlZCBvbiBib3RoIGJhY2tlbmRzXG4gIC8vIHZpYSBJQ29vcmRpbmF0ZVRyYW5zZm9ybSAoKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrIGZvciB0aGUgd2FuZCksIHNvIHRoZXlcbiAgLy8gZm9sbG93IHRoZSBhY3RpdmUgcmVuZGVyZXIg4oCUIHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0LlxuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRBY3RpdmVUb29sKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJTYW1Qb2ludHMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCByZWFkcyBnbyBzdHJhaWdodCB0byBpdC5cbiAgLy8gVGhlIHR3byBTRVRURVJTIHN0aWxsIHJvdXRlIHRocm91Z2ggUGxvdGx5IGJlY2F1c2UgaXRzIGltcGxlbWVudGF0aW9uc1xuICAvLyBjYXJyeSByZW5kZXIgZ2x1ZSBiZXlvbmQgdGhlIHN0b3JlIHdyaXRlIChhIGxpdmUgUGxvdGx5LnJlc3R5bGUgb2ZcbiAgLy8gY29sb3JzY2FsZS9yZXZlcnNlc2NhbGUgb24gdGhlIG1vdW50ZWQgaGVhdG1hcCk7IE9TRCByZWNvbG9ycyB2aWEgaXRzIG93blxuICAvLyBzdG9yZSBzdWJzY3JpcHRpb24gZWl0aGVyIHdheS5cbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogQ29sb3JtYXBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICB9XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2UpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhLCBpbWFnZUtleSk7XG4gIH1cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElDaGFubmVsSGlzdG9ncmFtQXBpOiBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHN1cmZhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENoYW5uZWwvZ3JheXNjYWxlL2ludmVydCBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZTsgYm90aFxuICAvLyBiYWNrZW5kcyBzdWJzY3JpYmUgYW5kIHJlY29sb3IgbGl2ZSwgc28gc2V0dGVycyBqdXN0IHdyaXRlIHRoZSBzdG9yZS4gVGhlXG4gIC8vIGhpc3RvZ3JhbSBjb21lcyBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbiAoaXRzIG5hdGl2ZSBwaXhlbHMpLlxuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICAvKiogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGEgKDE2LWJpdCBtdWx0aS1iYW5kIFRJRkYpIHZpYSB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTtcbiAgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkQ2hhbm5lbChpbmRleCk7XG4gIH1cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpbmRleCwgcGFydGlhbCk7XG4gIH1cbiAgcmVzZXRDb250cmFzdChpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIC8vIEZ1bGwgcmVzZXQ6IHdpbmRvdyAoMC4uMjU1KSwgZ2FtbWEgKDEpIEFORCB0aGUgY2hhbm5lbCdzIGRlZmF1bHQgdGludC5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgdGhpcy5zdG9yZS5yZXNldENoYW5uZWxTdGF0ZShpKTtcbiAgfVxuICAvKiogQXV0by13aW5kb3cgZWFjaCBjaGFubmVsIGJ5IHNhdHVyYXRpbmcgYHNhdHVyYXRpb25gICgwLi4xKSBvZiBwaXhlbHMgYXQgZWFjaFxuICAgKiAgZW5kIG9mIGl0cyBoaXN0b2dyYW0gKHNraXBwaW5nIG91dGxpZXIgZmlyc3QvbGFzdCBiaW5zKS4gKi9cbiAgYXV0b0NvbnRyYXN0KGluZGljZXM6IG51bWJlcltdLCBzYXR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oaSwgMjU2KTtcbiAgICAgIGlmICghaCkgY29udGludWU7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gYXV0b1dpbmRvd0Zyb21IaXN0b2dyYW0oaCwgc2F0dXJhdGlvbiwgWzAsIDI1NV0pO1xuICAgICAgaWYgKG1heCA+IG1pbikgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaSwgeyBtaW4sIG1heCB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0R3JheXNjYWxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRHcmF5c2NhbGUoKTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7XG4gIH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbnZlcnQoKTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEludmVydChvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdGl2ZSBiYWNrZW5kJ3MgcmVnaW9uIG92ZXJsYXkgKHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0KS4gRmFsbHNcbiAgICogYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZWdpb25CYWNrZW5kKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgICBwbGFuZXM6ICgpID0+ICh0aGlzLnBsb3R0ZWRJbmZvPy5pc1N0YWNrID8gbnVsbCA6ICh0aGlzLmRhdGFzZXRSZWdpb25TZXQ/LnBsYW5lcyA/PyBudWxsKSksXG4gICAgICBzbGljZVBsYW5lczogKCkgPT4gdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXMgPz8gbnVsbCxcbiAgICAgIHZpZXdDaGFuZ2VkJDogdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxGYWNhZGUuY29udHJvbHM7XG4gIH1cblxuICAvKiogQ3JlYXRlZCBvbiBmaXJzdCB1c2U7IG93bnMgdGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHNwYXRpYWxGYWNhZGU6IFNwYXRpYWxDb250cm9sc0ZhY2FkZSB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcbiAgLyoqIFRoZSBzbGljZSBzaG93biwgdGhlIHBsb3QgdHlwZSBvciB0aGUgZGF0YXNldCdzIHBsYW5lcyBjaGFuZ2VkICh0aGUgc3BhdGlhbCBjb250cm9scyByZWNvdW50KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlld0NoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogQW5ndWxhciBjYWxscyB0aGlzIHdoZW4gdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgcm91dGVyIGlzIGRlc3Ryb3llZCDigJQgdGhlIGhvc3RcbiAgICogIGNvbXBvbmVudCBmb3IgYSBgcHJvdmlkZVZpc3VhbGl6YXRpb24oKWAgY2hhaW4uIFRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbiB3b3VsZFxuICAgKiAgb3RoZXJ3aXNlIGtlZXAgdGhlIHdob2xlIGlzb2xhdGVkIGNoYWluIHJlYWNoYWJsZSBmcm9tIHRoZSByb290IGRhdGEgcG9ydC4gKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB1bmRlZmluZWQgfTsgLy8gYSBsYXRlIGltcG9ydCBjaGFuZ2VzIG5vdGhpbmdcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGxhbmVDZWxsc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nLCB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW46IHRoZSBzYW1wbGluZyBpcyB0aGVcbiAgICogYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlJ3M7IHRoZSB2aWV3cG9ydCBjaGFuZ2VzIGNvbWUgZnJvbSBldmVyeVxuICAgKiBiYWNrZW5kIHRoYXQgcmVwb3J0cyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBtZXJnZWQgaW50byBvbmUgc3RhYmxlXG4gICAqIHN0cmVhbSB0aGUgaW5zZXQgc3Vic2NyaWJlcyB0byBvbmNlLlxuICAgKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVNhbXBsaW5nOiBJSW50ZW5zaXR5U2FtcGxpbmcgPSB7XG4gICAgLy8gTG9hZCB0aGUgZGlzcGxheWVkIHNsaWNlJ3MgcGl4ZWxzIGZvciBhIGJhY2tlbmQgdGhhdCBoYXMgbm8gZnJhbWVzIG9mIGl0cyBvd25cbiAgICAvLyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzOyBQbG90bHkgZmVlZHMgaXRzIGZyYW1lcyB0byB0aGUgc2VydmljZSB3aGVuIGl0IHBsb3RzKS5cbiAgICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZzogKGltYWdlSW5mbywgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSxcbiAgICAvLyBSZS1zYW1wbGUgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGltYWdlLXBpeGVsIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24uXG4gICAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pOiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHRoaXMuaW50ZW5zaXR5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICAgIH0sXG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PlxuICAgICAgbWVyZ2UoLi4udGhpcy5iYWNrZW5kcygpLm1hcCgoYikgPT4gYi5nZXRJbnRlbnNpdHlTYW1wbGluZygpPy5nZXRWaWV3cG9ydENoYW5nZSQoKSA/PyBFTVBUWSkpLFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIENyb3BzIGZvciBzYW1wbGluZyBhcmUgc2l6ZWQgZnJvbSB0aGUgcGxvdCBkaXYgKHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMgaW50byBpdCkuICovXG4gIHByaXZhdGUgcG9pbnRTYW1wbGluZ0F0UGxvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB0aGlzLmludGVuc2l0eS5zZXRTYW1wbGluZ0VsZW1lbnQodGhpcy5wbG90RGl2KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZ2V0Vmlld3BvcnRDaGFuZ2UkKClgLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZ2V0Vmlld3BvcnRDaGFuZ2UkKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludGVuc2l0eVNhbXBsaW5nLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXN1YWxpemVyIHZpZXcgaXMgZ29pbmcgYXdheTogZGV0YWNoIGV2ZXJ5IGJhY2tlbmQg4oCUIGRyb3BwaW5nIHRoZWlyIHZpZXctYm91bmRcbiAgICogIHN1YnNjcmlwdGlvbnMgYW5kIGRpc3Bvc2luZyB0aGUgbmFwYXJpLWpzIHZpZXdlciwgd2hvc2UgY2FudmFzLCByZW5kZXIgbG9vcCBhbmQgR1BVXG4gICAqICBidWZmZXJzIHdvdWxkIG90aGVyd2lzZSBvdXRsaXZlIHRoZSB2aWV3IChmb3IgYSBjb21wb25lbnQtc2NvcGVkIGNoYWluLCBmb3JldmVyKS5cbiAgICogIE5vdGhpbmcgaXMgb24gc2NyZWVuIGFmdGVyd2FyZHMsIHNvIHRoZSBuZXh0IHBsb3Qgc3RhcnRzIGZyb20gdGhlIGRlZmF1bHQgYmFja2VuZC4gKi9cbiAgZGV0YWNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRGl2ID0gbnVsbDtcbiAgICB0aGlzLnBsb3RseS5kZXRhY2goKTtcbiAgICB0aGlzLm9zZC5kZXRhY2goKTtcbiAgICB0aGlzLm5hcGFyaS5kZXRhY2goKTtcbiAgICB0aGlzLmxhc3RSZW5kZXJlZCA9IG51bGw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LiAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaCgpO1xuICB9XG59XG5cbi8qKlxuICogQSBzcGF0aWFsIGRhdGFzZXQncyByZWdpb24gc2V0IG9uIGFuIGltYWdlIChzZWUgYGF0dGFjaERhdGFzZXRSZWdpb25TZXRgKTogdGhlIGltYWdlIChpdHMgcmVnaW9uXG4gKiBzY29wZSBrZXkpLCB0aGUgc2V0J3Mga2V5LCBpdHMgcGxhbmVzJyB6IChpdHMgYHNsaWNlWmAsIHdoZW4gaXQgc2F5cyksIGl0cyBjbGFzcyBncm91cHMsIHdoZXRoZXJcbiAqIHRoZXkgd2VyZSBzaG93biBpbiAzRCBieSB0aGVtc2VsdmVzLCBhbmQgdGhlIG9wZW5lciBpdCB3YXMgYXR0YWNoZWQgdG8gdGhlIHN0b3JlIHdpdGggKG51bGwgd2hpbGVcbiAqIGl0IG9wZW5zKTogd2hpbGUgdGhlIHN0b3JlJ3Mgc291cmNlIG92ZXIgZXZlcnkgcGxhbmUgaXMgdGhhdCBvbmUsIHRoZSBzZXQgaXMgc3RpbGwgYXR0YWNoZWQuXG4gKi9cbmludGVyZmFjZSBEYXRhc2V0UmVnaW9uU2V0U3RhdGUge1xuICBpbWFnZTogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgcGxhbmVzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG4gIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZyB9PjtcbiAgc2hvd24zZDogYm9vbGVhbjtcbiAgb3BlbmVyOiBSZWdpb25Tb3VyY2VPcGVuZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgcmVnaW9uIHNldCdzIGNsYXNzZXMgYXMgM0QgZ3JvdXBzLCBhcyB0aGUgcmVnaW9uIGVkaXRvcidzIGNsYXNzIHRyZWUgc2hvd3MgdGhlbTogb25lIHBlciByb290IG9mXG4gKiBpdHMgaGllcmFyY2h5IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQgKG9uZSBwZXIgY2xhc3Mgb2YgYSBmbGF0IG9uZSksIGluIHRoZSBoaWVyYXJjaHkncyBvcmRlcjtcbiAqIHdpdGhvdXQgYSBoaWVyYXJjaHksIG9uZSBwZXIgY2xhc3MgaXRzIGZlYXR1cmVzIGhhdmUuIEVhY2ggaW4gdGhlIGNvbG91ciB0aGUgc2V0IGdpdmVzIGl0IChpdHNcbiAqIGhpZXJhcmNoeSdzLCBlbHNlIGl0cyBmZWF0dXJlcycpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2V0R3JvdXBzKGluZm86IFJlZ2lvblNvdXJjZUluZm8pOiBBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiBzdHJpbmdbXTsgY29sb3I6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoaW5mby5jbGFzc0NvbG9ycyA/PyB7fSkpO1xuICBjb25zdCBub2RlcyA9IFsuLi4oaW5mby5oaWVyYXJjaHkgPz8gW10pXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcbiAgaWYgKCFub2Rlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gWy4uLmNvbG9ycy5lbnRyaWVzKCldLm1hcCgoW25hbWUsIGNvbG9yXSkgPT4gKHsga2V5OiBuYW1lLCBjbGFzc2VzOiBbbmFtZV0sIGNvbG9yIH0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIGlmIChuLmNvbG9yKSBjb2xvcnMuc2V0KG4ubmFtZSwgbi5jb2xvcik7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldChub2Rlcy5tYXAoKG4pID0+IG4ubmFtZSkpO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBuIG9mIG5vZGVzKSB7XG4gICAgaWYgKCFuLnBhcmVudCB8fCAhbmFtZXMuaGFzKG4ucGFyZW50KSkgY29udGludWU7XG4gICAgY2hpbGRyZW4uc2V0KG4ucGFyZW50LCBbLi4uKGNoaWxkcmVuLmdldChuLnBhcmVudCkgPz8gW10pLCBuLm5hbWVdKTtcbiAgfVxuICBjb25zdCBzdWJ0cmVlID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdID0+IFtuYW1lLCAuLi4oY2hpbGRyZW4uZ2V0KG5hbWUpID8/IFtdKS5mbGF0TWFwKHN1YnRyZWUpXTtcbiAgcmV0dXJuIG5vZGVzXG4gICAgLmZpbHRlcigobikgPT4gIW4ucGFyZW50IHx8ICFuYW1lcy5oYXMobi5wYXJlbnQpKVxuICAgIC5tYXAoKG4pID0+ICh7IGtleTogbi5uYW1lLCBjbGFzc2VzOiBzdWJ0cmVlKG4ubmFtZSksIGNvbG9yOiBjb2xvcnMuZ2V0KG4ubmFtZSkgPz8gJyNjY2NjY2MnIH0pKTtcbn1cbiJdfQ==