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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
2
+ import { BehaviorSubject, Subject, combineLatest } from 'rxjs';
3
+ import { distinctUntilChanged, map } from 'rxjs/operators';
3
4
  import { Rectangle, Polygon, hydrateBounds } from '../models/region';
4
5
  import { downloadGeoJson, featureFromRegion, regionFromGeoJsonFeature, regionsFromGeoJson, regionsToGeoJson, } from '../models/region-geojson';
5
6
  import { VisualizerStore } from './visualizer-store.service';
@@ -148,6 +149,8 @@ export class RegionStore {
148
149
  */
149
150
  this.sources = new RegionSourceScope();
150
151
  this.sourceView$ = new BehaviorSubject(null);
152
+ /** Whether the overlays draw the source (see setRegionSourceDrawn). */
153
+ this.sourceDrawn$ = new BehaviorSubject(true);
151
154
  /** The region look the user chose (overrides the source's hint), field by field. */
152
155
  this.userStyle = {};
153
156
  this.regionStyle$ = new BehaviorSubject(DEFAULT_REGION_STYLE);
@@ -769,6 +772,17 @@ export class RegionStore {
769
772
  hasRegionSource() {
770
773
  return this.sources.has(this.scope.activeImage, this.sourceSlice);
771
774
  }
775
+ /** Whether the current image has any region source, over all its slices or a slice's own. */
776
+ hasAnyRegionSource() {
777
+ return this.sources.hasAny(this.scope.activeImage);
778
+ }
779
+ /**
780
+ * The opener of the current image's source over all its slices, as attached (see
781
+ * {@link attachRegionSource}), or null without one: tells whose source it still is.
782
+ */
783
+ getPlanesSourceOpener() {
784
+ return this.sources.planesOpener(this.scope.activeImage);
785
+ }
772
786
  /** The slice's region source as a source layer draws it; null without one (or until it opens). */
773
787
  getRegionSourceView() {
774
788
  return this.sourceView$.value;
@@ -777,6 +791,23 @@ export class RegionStore {
777
791
  getRegionSourceView$() {
778
792
  return this.sourceView$.asObservable();
779
793
  }
794
+ /**
795
+ * The source view the overlays draw: {@link getRegionSourceView$}, or null while the source is
796
+ * drawn by another layer instead (see {@link setRegionSourceDrawn}). The Region Editor's list
797
+ * and the source's other uses keep reading the source itself.
798
+ */
799
+ getDrawnRegionSourceView$() {
800
+ return combineLatest([this.sourceView$, this.sourceDrawn$.pipe(distinctUntilChanged())]).pipe(map(([view, drawn]) => (drawn ? view : null)));
801
+ }
802
+ /**
803
+ * Whether the overlays draw the region source (default), or leave it to another layer that draws
804
+ * the same outlines (the 2D spatial view's cells, from a 3D segmentation's region set), so they
805
+ * are not drawn twice. Only the drawing: the source stays attached, listed and editable.
806
+ */
807
+ setRegionSourceDrawn(drawn) {
808
+ if (drawn !== this.sourceDrawn$.value)
809
+ this.sourceDrawn$.next(drawn);
810
+ }
780
811
  /**
781
812
  * Take source features into the working set for editing: their exact geometry becomes
782
813
  * ordinary regions (minted, coloured and slice-tagged as any region entering the store) and
@@ -1417,4 +1448,4 @@ function onPlane(features, z) {
1417
1448
  return { ...f, geometry: z === 0 ? geometry : { ...geometry, plane: { c: -1, z, t: 0 } } };
1418
1449
  });
1419
1450
  }
1420
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHNUQsT0FBTyxFQUFVLFNBQVMsRUFBRSxPQUFPLEVBQWdCLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNGLE9BQU8sRUFFTCxlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUNMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEtBQUssSUFBSSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixF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USxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELG9HQUFvRztBQUNwRyxTQUFTLE9BQU8sQ0FBQyxRQUFzQixFQUFFLENBQVM7SUFDaEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN4RCxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24sIE11bHRpUG9seWdvbiwgaHlkcmF0ZUJvdW5kcyB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHtcbiAgR2VvSnNvbkZlYXR1cmUsXG4gIGRvd25sb2FkR2VvSnNvbixcbiAgZmVhdHVyZUZyb21SZWdpb24sXG4gIHJlZ2lvbkZyb21HZW9Kc29uRmVhdHVyZSxcbiAgcmVnaW9uc0Zyb21HZW9Kc29uLFxuICByZWdpb25zVG9HZW9Kc29uLFxufSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWdlb2pzb24nO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGksIElSZWdpb25Tb3VyY2VBcGkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IGFwcGx5UHJlc2V0Q29sb3JzLCBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHtcbiAgY2xvbmVCb3VuZHMsXG4gIG1ha2VQb2x5Z29uLFxuICByZWN0VG9SaW5nLFxuICByZWdpb25Qb2x5Z29ucyxcbiAgcmVnaW9uUG9seWxpbmVzLFxuICByZXBsYWNlQm91bmRzLFxufSBmcm9tICcuLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBvdXRsaW5lc0FyZWEgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyByZWNvbnN0cnVjdEluV29ya2VyIH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS93b3JrZXItcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBlZGl0IGZyb20gJy4uL21vZGVscy9wb2x5Z29uLWVkaXQnO1xuaW1wb3J0IHsgcmVnaW9uc0VxdWFsLCB3aXRoUmVnaW9uUGF0Y2gsIHdpdGhSZWdpb25aIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbi1jbG9uZSc7XG5pbXBvcnQgeyBSZWdpb25IaXN0b3J5IH0gZnJvbSAnLi9yZWdpb24taGlzdG9yeSc7XG5pbXBvcnQgeyBSZWdpb25TZWxlY3Rpb24gfSBmcm9tICcuL3JlZ2lvbi1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgUmVnaW9uU2NvcGVDYWNoZSwgU3RhY2tTYXZlTGF5b3V0IH0gZnJvbSAnLi9yZWdpb24tc2NvcGUtY2FjaGUnO1xuaW1wb3J0IHsgUmVnaW9uU291cmNlT3BlbmVyLCBSZWdpb25Tb3VyY2VTY29wZSwgUmVnaW9uU291cmNlU2xpY2VzIH0gZnJvbSAnLi9yZWdpb24tc291cmNlLXNjb3BlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uSW5kZXhQYWdlLCBSZWdpb25JbmRleFF1ZXJ5LCBSZWdpb25Tb3VyY2VTdHlsZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB7IERFRkFVTFRfUkVHSU9OX1NUWUxFLCBSZWdpb25TdHlsZSB9IGZyb20gJy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5cbi8qKiBTZWxlY3RpbmcgY2xhc3NlcyB0YWtlcyBhdCBtb3N0IHRoaXMgbWFueSByZWdpb24tc291cmNlIGZlYXR1cmVzIGludG8gdGhlIHJlZ2lvbnMuICovXG5leHBvcnQgY29uc3QgU0VMRUNUX0NMQVNTRVNfTElNSVQgPSA1MDAwO1xuLyoqIEEgcmVnaW9uIHNvdXJjZSdzIG91dGxpbmVzIG9uIGEgc2xpY2UsIGVhY2ggcmluZydzIGFuZCBsaW5lJ3MgY2xhc3Mgd2l0aCBpdCB3aGVuIHJlYWQgZm9yIGFsbC4gKi9cbnR5cGUgTGFiZWxsZWRPdXRsaW5lcyA9IFNsaWNlT3V0bGluZXMgJiB7IHJpbmdMYWJlbHM/OiBzdHJpbmdbXTsgbGluZUxhYmVscz86IHN0cmluZ1tdIH07XG5cbi8qKiBDbGFzcyBzZXRzIHdob3NlIHJlZ2lvbi1zb3VyY2Ugb3V0bGluZXMgYXJlIGtlcHQgZm9yIHJlYnVpbGRpbmcgdGhlaXIgc3VyZmFjZXMuICovXG5jb25zdCBTT1VSQ0VfT1VUTElORV9DQUNIRV9TSVpFID0gODtcbi8qKiBDbGFzc2VzIHdob3NlIHJlZ2lvbi1zb3VyY2UgcGFydCBvZiB0aGUgdm9sdW1lIGlzIGtlcHQgKHNlZSBSZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMpLiAqL1xuY29uc3QgU09VUkNFX1ZPTFVNRV9DQUNIRV9TSVpFID0gNjQ7XG5cbi8qKiBBIHNsaWNlJ3MgcmluZ3MsIGVhY2ggd2l0aCBpdHMgZmVhdHVyZSAoc2VlIFNsaWNlT3V0bGluZXMucmluZ0dyb3VwcyksIGFuZCBpdHMgbGluZXMuICovXG5pbnRlcmZhY2UgU2xpY2VQYXJ0cyB7XG4gIHJpbmdzOiBBcnJheUxpa2U8bnVtYmVyPltdO1xuICByaW5nR3JvdXBzOiBudW1iZXJbXTtcbiAgbGluZXM6IEFycmF5TGlrZTxudW1iZXI+W107XG59XG5cbi8qKlxuICogRmVhdHVyZSBpZHMgdW5pcXVlIGFjcm9zcyBvdXRsaW5lcyByZWFkIGZyb20gc2V2ZXJhbCBwbGFjZXM6IGVhY2ggY2FsbCBnaXZlcyBvbmUgcGFydCdzXG4gKiByZW51bWJlcmluZyBvZiBpdHMgb3duIGlkcyAoYSBwYXJ0IHdpdGhvdXQgdGhlbSBpcyBvbmUgZmVhdHVyZSkuXG4gKi9cbmZ1bmN0aW9uIGZlYXR1cmVJZHMoKTogKCkgPT4gKG93bjogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIge1xuICBsZXQgbmV4dCA9IDA7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaWRzID0gbmV3IE1hcDxudW1iZXIgfCB1bmRlZmluZWQsIG51bWJlcj4oKTtcbiAgICByZXR1cm4gKG93bikgPT4ge1xuICAgICAgbGV0IGlkID0gaWRzLmdldChvd24pO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGlkcy5zZXQob3duLCAoaWQgPSBuZXh0KyspKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9O1xuICB9O1xufVxuXG4vKiogQSBzbGljZSdzIHBhcnRzIGFzIG91dGxpbmVzLiAqL1xuZnVuY3Rpb24gc2xpY2VPdXRsaW5lcyh6OiBudW1iZXIsIHM6IFNsaWNlUGFydHMpOiBTbGljZU91dGxpbmVzIHtcbiAgcmV0dXJuIHtcbiAgICB6LFxuICAgIHJpbmdzOiBzLnJpbmdzLFxuICAgIC4uLihzLnJpbmdzLmxlbmd0aCA/IHsgcmluZ0dyb3Vwczogcy5yaW5nR3JvdXBzIH0gOiB7fSksXG4gICAgLi4uKHMubGluZXMubGVuZ3RoID8geyBsaW5lczogcy5saW5lcyB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIE91dGxpbmVzIGJ5IHNsaWNlIG1lcmdlZCBpbnRvIG9uZSBlbnRyeSBwZXIgc2xpY2UgKHJpbmdzLCB0aGVuIGxpbmVzKSwgaW4gc2xpY2Ugb3JkZXIsIGVhY2hcbiAqIHBhcnQncyBmZWF0dXJlcyBhcGFydCBmcm9tIHRoZSBvdGhlcnMnICh0aGV5IGZpbGwgYXMgdGhlaXIgdW5pb24pLlxuICovXG5mdW5jdGlvbiBtZXJnZU91dGxpbmVzKHBhcnRzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10pOiBTbGljZU91dGxpbmVzW10ge1xuICBjb25zdCBieVogPSBuZXcgTWFwPG51bWJlciwgU2xpY2VQYXJ0cz4oKTtcbiAgY29uc3QgbmV4dFBhcnQgPSBmZWF0dXJlSWRzKCk7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmICghcGFydC5yaW5ncy5sZW5ndGggJiYgIXBhcnQubGluZXM/Lmxlbmd0aCkgY29udGludWU7XG4gICAgbGV0IHNsaWNlID0gYnlaLmdldChwYXJ0LnopO1xuICAgIGlmICghc2xpY2UpIGJ5Wi5zZXQocGFydC56LCAoc2xpY2UgPSB7IHJpbmdzOiBbXSwgcmluZ0dyb3VwczogW10sIGxpbmVzOiBbXSB9KSk7XG4gICAgY29uc3QgaWQgPSBuZXh0UGFydCgpO1xuICAgIHBhcnQucmluZ3MuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgc2xpY2UucmluZ3MucHVzaChyKTtcbiAgICAgIHNsaWNlLnJpbmdHcm91cHMucHVzaChpZChwYXJ0LnJpbmdHcm91cHM/LltpXSkpO1xuICAgIH0pO1xuICAgIHNsaWNlLmxpbmVzLnB1c2goLi4uKHBhcnQubGluZXMgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShieVosIChbeiwgc10pID0+IHNsaWNlT3V0bGluZXMoeiwgcykpLnNvcnQoKGEsIGIpID0+IGEueiAtIGIueik7XG59XG5cbi8qKiBUaGUgcmVnaW9uIHNvdXJjZXMnIHBhcnQgb2YgYSBjbGFzcydzIHZvbHVtZTogaXRzIGFyZWEgb24gZWFjaCBzbGljZSwgd2l0aCB0aGUgb3V0bGluZXMuICovXG5pbnRlcmZhY2UgU291cmNlVm9sdW1lIHtcbiAgdG90YWw6IG51bWJlcjtcbiAgc2xpY2VzOiBSZWFkb25seU1hcDxudW1iZXIsIHsgYXJlYTogbnVtYmVyOyBvdXRsaW5lczogU2xpY2VPdXRsaW5lcyB9Pjtcbn1cblxuLyoqIE9uZSB1bmRvIHN0ZXA6IHRoZSByZWdpb24gc2V0IGFuZCwgZm9yIGEgc2xpY2Ugd2l0aCBhIHJlZ2lvbiBzb3VyY2UsIHdoYXQgd2FzIHRha2VuIGZyb20gaXQuICovXG5pbnRlcmZhY2UgUmVnaW9uU25hcHNob3Qge1xuICByZWdpb25zOiBSZWdpb25bXTtcbiAgdGFrZW46IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIHJlZ2lvbiBzdG9yZSDigJQgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBzdGF0ZS5cbiAqXG4gKiBIb2xkcyB0aGUgbmV1dHJhbCB7QGxpbmsgUmVnaW9ufSBtb2RlbCAobmV2ZXIgYSBiYWNrZW5kJ3Mgb3duIHNoYXBlXG4gKiByZXByZXNlbnRhdGlvbiksIGtleWVkIHBlciBpbWFnZSBzbyByZWdpb25zIHBlcnNpc3QgYXMgdGhlIHVzZXIgc3dpdGNoZXNcbiAqIGZpbGVzIGFuZCBzdXJ2aXZlIGEgUGxvdGx54oeET3BlblNlYWRyYWdvbiBiYWNrZW5kIHN3aXRjaCAoYm90aCBiYWNrZW5kcyByZWFkXG4gKiBhbmQgd3JpdGUgKnRoaXMqIHN0b3JlLCBzbyBubyBtaWdyYXRpb24gaXMgbmVlZGVkKS4gQmFja2VuZHMgb3duICpyZW5kZXJpbmcqXG4gKiBhbmQgcmVhY3QgdG8ge0BsaW5rIGdldFJlZ2lvblVwZGF0ZUV2ZW50fTsgdGhpcyBzZXJ2aWNlIG93bnMgKnN0YXRlKiBhbmQgdGhlXG4gKiBlZGl0aW5nIG9wZXJhdGlvbnMuXG4gKlxuICogSW1wbGVtZW50czpcbiAqICAtIHtAbGluayBJUmVnaW9uU3RvcmV9IOKAlCB0aGUgY3Jvc3MtYmFja2VuZCBDUlVEL3NlbGVjdGlvbi9jb2xvdXIgY29udHJhY3RcbiAqICAgIGV2ZXJ5IGNvbnN1bWVyIChSZWdpb24gRWRpdG9yLCBzZWdtZW50YXRpb24sIGV0Yy4pIGFscmVhZHkgdXNlcy5cbiAqICAtIHtAbGluayBJUmVnaW9uRWRpdEFwaX0g4oCUIFJlZ2lvbi1uYXRpdmUgZ2VvbWV0cnkgZWRpdHMgKG1vdmUvcmVzaXplLCBhbmRcbiAqICAgIGFkZC9kZWxldGUvbW92ZSB2ZXJ0ZXgpIHRoZSBPU0Qgb3ZlcmxheSBkcml2ZXMuXG4gKlxuICogQ29weS1vbi13cml0ZSAocmV2aWV3IFJULTEzKTogbm8gb3BlcmF0aW9uIGNoYW5nZXMgYSBzdG9yZWQge0BsaW5rIFJlZ2lvbn1cbiAqIChvciB0aGUgcmVnaW9ucyBhcnJheSkgaW4gcGxhY2UuIEFuIGVkaXQgYnVpbGRzIGEgcmVwbGFjZW1lbnQg4oCUIHRoZSBnZW9tZXRyeVxuICogdGhyb3VnaCB0aGUgcHVyZSBgbW9kZWxzL3BvbHlnb24tZWRpdGAgZnVuY3Rpb25zIOKAlCBhbmQgc3dhcHMgaXQgaW4sIHNvIHRoZVxuICogdW5kbyBoaXN0b3J5ICh7QGxpbmsgUmVnaW9uSGlzdG9yeX0pIGNhbiBrZWVwIHNoYWxsb3cgc25hcHNob3RzIHRoYXQgc2hhcmVcbiAqIGV2ZXJ5IHVudG91Y2hlZCByZWdpb24gaW5zdGVhZCBvZiBkZWVwLWNsb25pbmcgdGhlIHdob2xlIHNldCBwZXIgc3RlcC5cbiAqIENhbGxlcnMgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcnVsZSB3aXRoIHRoZSBpbnN0YW5jZXMge0BsaW5rIGdldFJlZ2lvbnN9XG4gKiByZXR1cm5zOiB0cmVhdCB0aGVtIGFzIHJlYWQtb25seSwgYW5kIGNvbW1pdCBhIGNoYW5nZWQgY29weS5cbiAqXG4gKiBDbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4ge0BsaW5rIFZpc3VhbGl6ZXJTdG9yZX0gKHNoYXJlZCBieSBib3RoXG4gKiBiYWNrZW5kcyk7IEdlb0pTT04gaW1wb3J0L2V4cG9ydCBpcyBgbW9kZWxzL3JlZ2lvbi1nZW9qc29uYC4gQWxsIGNvb3JkaW5hdGVzXG4gKiBhcmUgaW1hZ2UgcGl4ZWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlZ2lvblN0b3JlIGltcGxlbWVudHMgSVJlZ2lvblN0b3JlLCBJUmVnaW9uRWRpdEFwaSwgSVJlZ2lvblNvdXJjZUFwaSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVORE9fTElNSVQgPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVU5ET19DT0FMRVNDRV9NUyA9IDI1MDtcblxuICAvKiogVGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zIOKAlCB0aGUgbGl2ZSwgZWRpdGVkIGFycmF5LiAqL1xuICBwcml2YXRlIHJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG5cbiAgLyoqXG4gICAqIFVuZG8vcmVkbyBoaXN0b3J5IChqaXQtdWkjODUpOiB1cCB0byB7QGxpbmsgVU5ET19MSU1JVH0gc25hcHNob3RzIG9mIHRoZVxuICAgKiByZWdpb24gc2V0LCBlYWNoIHRha2VuIGp1c3QgKmJlZm9yZSogYSByZWdpb24tZWRpdGluZyBhY3Rpb247IGNvbnRpbnVvdXNcbiAgICogZ2VzdHVyZXMgYW5kIHJhcGlkIGNvbW1pdHMgY29hbGVzY2UgKHNlZSB7QGxpbmsgUmVnaW9uSGlzdG9yeX0pLiBTbmFwc2hvdHNcbiAgICogYXJlIHNoYWxsb3cg4oCUIHRoZSByZWdpb25zIGFycmF5IGFzIGl0IHdhcyDigJQgd2hpY2ggaXMgc2FmZSBiZWNhdXNlIG5vdGhpbmdcbiAgICogaGVyZSBtdXRhdGVzIGEgcmVnaW9uIG9yIGFuIGFycmF5IGluIHBsYWNlIChSVC0xMykuIEhpc3RvcnkgbmV2ZXIgY3Jvc3NlcyBhblxuICAgKiBpbWFnZSBsb2FkL3N3aXRjaCDigJQge0BsaW5rIHJlc2V0VW5kb0hpc3Rvcnl9IGNsZWFycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IG5ldyBSZWdpb25IaXN0b3J5PFJlZ2lvblNuYXBzaG90PihcbiAgICBSZWdpb25TdG9yZS5VTkRPX0xJTUlULFxuICAgIFJlZ2lvblN0b3JlLlVORE9fQ09BTEVTQ0VfTVMsXG4gICk7XG5cbiAgLyoqIE1vbm90b25pYyBpZCBzb3VyY2Ug4oCUIGlkcyBuZXZlciByZXBlYXQgd2l0aGluIHRoZSBzZXJ2aWNlIGxpZmV0aW1lLCBzb1xuICAgKiAgc2VsZWN0aW9uIHN0YXlzIGNvcnJlY3QgYWNyb3NzIGRlbGV0ZS9hZGQgY3ljbGVzIGV2ZW4gd2hlbiBuYW1lcyBjb2xsaWRlLiAqL1xuICBwcml2YXRlIG5leHRJZCA9IDE7XG5cbiAgcHJpdmF0ZSBzaG93U2hhcGVMYWJlbCA9IGZhbHNlO1xuICBwcml2YXRlIHNoYXBlQ29sb3IgPSAnIzAwRkZGRic7XG4gIHByaXZhdGUgZmlsbENvbG9yID0gJyNmZjAwZmYnO1xuICBwcml2YXRlIGlzUmVnaW9uU2F2ZWRPbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFBlci1pbWFnZSBjYWNoZSBhbmQsIGZvciB6LXN0YWNrcywgcGVyLXNsaWNlIHJlZ2lvbnMgKGppdC11aSM5MykuIEluIHN0YWNrXG4gICAqIG1vZGUgdGhlIGxpdmUgYHJlZ2lvbnNgIGFycmF5IGhvbGRzIE9ORSBzbGljZSDigJQgdGhlIGRpc3BsYXkgc2xpY2Ug4oCUIHNvIHRoZVxuICAgKiBvdmVybGF5cywgdGhlIHNlbGVjdGlvbiBwcm9qZWN0aW9uIGFuZCB0aGUgUmVnaW9ucyB0YWJsZSB3b3JrIHVuY2hhbmdlZFxuICAgKiAodGhleSBhbGwgcmVhZCB7QGxpbmsgZ2V0UmVnaW9uc30pOyB7QGxpbmsgc2V0RGlzcGxheVNsaWNlfSBzd2FwcyB0aGUgbGl2ZVxuICAgKiBzZXQgb24gc2NydWIgYW5kIHtAbGluayBnZXRTbGljZVJlZ2lvbnN9IGZsYXR0ZW5zIGV2ZXJ5IHNsaWNlIChlYWNoIHRhZ2dlZFxuICAgKiB3aXRoIGl0cyB6ZXJvLWJhc2VkIHtAbGluayBSZWdpb24uen0pIGZvciBzYXZlL2V4cG9ydC4gT2ZmIGJ5IGRlZmF1bHQsIHNvXG4gICAqIHNpbmdsZS1wbGFuZSBpbWFnZXMgYXJlIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjb3BlID0gbmV3IFJlZ2lvblNjb3BlQ2FjaGUoKTtcblxuICAvKiogU2VsZWN0aW9uIGJ5IHJlZ2lvbiAqaWQqIChzdGFibGUgYWNyb3NzIGVkaXRzKSwgcHJvamVjdGVkIHRvIGFycmF5XG4gICAqICBpbmRpY2VzIG9uIHRoZSBJUmVnaW9uU3RvcmUgYm91bmRhcnkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uID0gbmV3IFJlZ2lvblNlbGVjdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZSQgPSBuZXcgU3ViamVjdDxSZWdpb25bXT4oKTtcbiAgLyoqIE5vbi1jb2FsZXNjZWQgc2libGluZyBvZiByZWdpb25VcGRhdGUkOiBmaXJlcyBvbiBldmVyeSBjaGFuZ2UgZXZlbiBkdXJpbmcgYVxuICAgKiAgYmF0Y2hlZCBkcmFnLCBzbyBsaXZlIGNvbnN1bWVycyAoaW50ZW5zaXR5IGluc2V0KSB1cGRhdGUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbkxpdmVFZGl0JCA9IG5ldyBTdWJqZWN0PFJlZ2lvbltdPigpO1xuICAvKiogU2VlIHtAbGluayBnZXRSZWdpb25TZXRSZXBsYWNlZCR9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblNldFJlcGxhY2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgY29hbGVzY2luZyBmb3IgbGl2ZSBkcmFncyAoc2VlIElSZWdpb25FZGl0QXBpLmJlZ2luQmF0Y2gpLiAqL1xuICBwcml2YXRlIGJhdGNoRGVwdGggPSAwO1xuICBwcml2YXRlIHBlbmRpbmdFbWl0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIExhcmdlIHJlZ2lvbiBzZXRzIGhlbGQgYXMgdGlsZWQgcmVnaW9uIHNvdXJjZXMgcmF0aGVyIHRoYW4gYXMgcmVnaW9ucyAoc2VlXG4gICAqIHtAbGluayBhdHRhY2hSZWdpb25Tb3VyY2V9KTogcGVyIGltYWdlIGFuZCBzbGljZSwgd2l0aCB0aGUgaWRzIHRha2VuIG91dCBvZiBlYWNoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzID0gbmV3IFJlZ2lvblNvdXJjZVNjb3BlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPihudWxsKTtcbiAgLyoqIFRoZSByZWdpb24gbG9vayB0aGUgdXNlciBjaG9zZSAob3ZlcnJpZGVzIHRoZSBzb3VyY2UncyBoaW50KSwgZmllbGQgYnkgZmllbGQuICovXG4gIHByaXZhdGUgdXNlclN0eWxlOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPiA9IHt9O1xuICAvKiogVGhlIGN1cnJlbnQgc291cmNlJ3Mgc3R5bGUgaGludC4gKi9cbiAgcHJpdmF0ZSBoaW50U3R5bGU6IFJlZ2lvblNvdXJjZVN0eWxlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblN0eWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVnaW9uU3R5bGU+KERFRkFVTFRfUkVHSU9OX1NUWUxFKTtcbiAgLyoqIEJ1bXBlZCBvbiBldmVyeSBjaGFuZ2Ugb2YgdGhlIHNsaWNlJ3Mgc291cmNlLCBzbyBhIGxhdGUgb3BlbiBpcyBkcm9wcGVkLiAqL1xuICBwcml2YXRlIHNvdXJjZUdlbmVyYXRpb24gPSAwO1xuICAvKiogVGhlIHNvdXJjZSBsYXN0IHB1Ymxpc2hlZCBhcyB0aGUgdmlldzogYSBzb3VyY2Ugc2hvd24gYWdhaW4gZG9lcyBub3QgdHVybiB0aGUgbGFiZWxzIGJhY2sgb24uICovXG4gIHByaXZhdGUgc2hvd25Tb3VyY2U6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIHdoZW4gYSByZWdpb24gc291cmNlIGlzIGF0dGFjaGVkIG9yIGRyb3BwZWQ6IHdoYXQgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2VzIGlzIHN0YWxlLiAqL1xuICBwcml2YXRlIHNvdXJjZXNWZXJzaW9uID0gMDtcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiBzb3VyY2VzJyBwYXJ0IG9mIHtAbGluayBjbGFzc1ZvbHVtZXN9LCBieSBjbGFzcyBhbmQgd2hhdCB0aGUgc291cmNlcyBob2xkIChzZWVcbiAgICoge0BsaW5rIHNvdXJjZVN0YXRlS2V5fSk6IGFuIGVkaXQgb2YgdGhlIHJlZ2lvbnMgbGVhdmVzIGl0LCBzbyB0aGUgdm9sdW1lcyBvZiBhIHNsaWNlIGJlaW5nIGRyYXduXG4gICAqIG9uIGNvc3Qgbm8gc291cmNlIHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VWb2x1bWVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNvdXJjZVZvbHVtZT4+KCk7XG4gIC8qKiBUaGUgcmVnaW9uIHNvdXJjZXMnIG91dGxpbmVzIG9mIHRoZSBjbGFzcyBzZXRzIHJlY29uc3RydWN0ZWQgbGFzdCAoc2VlIHtAbGluayBzb3VyY2VPdXRsaW5lc30pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZU91dGxpbmVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExhYmVsbGVkT3V0bGluZXNbXT4+KCk7XG5cbiAgLyoqIFRoZSBjbGFzc2VzIGhpZGRlbiBmcm9tIHZpZXcgKG5hbWVzIGFzIGdpdmVuKTsgZXZlcnkgY2xhc3MgaXMgc2hvd24gYXQgZmlyc3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlkZGVuQ2xhc3NlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlYWRvbmx5U2V0PHN0cmluZz4+KG5ldyBTZXQoKSk7XG4gIC8qKiB7QGxpbmsgaGlkZGVuQ2xhc3NlcyR9IGJ5IHtAbGluayBwcmVzZXRLZXl9LCBhcyBhIHJlZ2lvbidzIGxhYmVsIGlzIG1hdGNoZWQuICovXG4gIHByaXZhdGUgaGlkZGVuS2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUpIHtcbiAgICAvLyBBIGNsYXNzIGNvbG91ciBjaGFuZ2UgcmVjb2xvdXJzIHRoZSBzb3VyY2UncyBmZWF0dXJlcyBhcyBpdCByZWNvbG91cnMgcmVnaW9ucy5cbiAgICB0aGlzLnN0b3JlLmdldFByZXNldFNldCQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldyQudmFsdWU7XG4gICAgICBpZiAodmlldykgdGhpcy5zb3VyY2VWaWV3JC5uZXh0KHsgLi4udmlldyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgKG9yLCB3aXRoIGBhcHBlbmRgLCBhZGQgdG8pIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucy4gTWludHMgaWRzXG4gICAqIGFuZCBkZWZhdWx0IG5hbWVzLCBhcHBsaWVzIHN0b3JlZCBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzLCBhbmQgZW1pdHMuIFdoZW5cbiAgICogYGlzUmVnaW9uU2F2ZU9uYCBpcyBmYWxzZSB0aGUgcmVnaW9ucyBhcmUgc2hvd24gdHJhbnNpZW50bHkgKGVtaXR0ZWQpIGJ1dFxuICAgKiBub3Qgc3RvcmVkIOKAlCBtaXJyb3JzIHRoZSBwcmV2aW91cyBQbG90bHkgYmVoYXZpb3VyLlxuICAgKi9cbiAgc2V0UmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICAgYXBwZW5kOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHZvaWQge1xuICAgIGlmIChzaG93UmVnaW9uTGFiZWwgPT09IHVuZGVmaW5lZCkgc2hvd1JlZ2lvbkxhYmVsID0gdGhpcy5zaG93U2hhcGVMYWJlbDtcbiAgICBpZiAoaXNSZWdpb25TYXZlT24gPT09IHVuZGVmaW5lZCkgaXNSZWdpb25TYXZlT24gPSB0aGlzLmlzUmVnaW9uU2F2ZWRPbjtcbiAgICBpZiAoZmlsbENvbG9yID09PSB1bmRlZmluZWQpIGZpbGxDb2xvciA9IHRoaXMuZmlsbENvbG9yO1xuXG4gICAgcmVnaW9ucyA9IHRoaXMuYWRtaXQocmVnaW9ucyk7XG5cbiAgICB0aGlzLmlzUmVnaW9uU2F2ZWRPbiA9IGlzUmVnaW9uU2F2ZU9uO1xuICAgIGlmIChpc1JlZ2lvblNhdmVPbikge1xuICAgICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICAgIGlmICh0aGlzLnNob3dTaGFwZUxhYmVsICE9PSBzaG93UmVnaW9uTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHNob3dSZWdpb25MYWJlbDtcbiAgICAgICAgdGhpcy5yZXB1Ymxpc2hWaWV3KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbGxDb2xvciA9IGZpbGxDb2xvcjtcbiAgICAgIGlmIChhcHBlbmQpIHtcbiAgICAgICAgLy8gUmVqZWN0IGJ5IGlkIGNvbGxpc2lvbiAoYWxyZWFkeSB0cmFja2VkKSBvciBnZW9tZXRyeSBlcXVhbGl0eSAoc2FtZVxuICAgICAgICAvLyBjb29yZGluYXRlcykg4oCUIHRoZSBmaW5kIGJ1dHRvbiBjYW4gcHVzaCB0aGUgc2FtZSByZWdpb24gcmVwZWF0ZWRseS5cbiAgICAgICAgY29uc3QgYWRkZWQgPSByZWdpb25zLmZpbHRlcihcbiAgICAgICAgICAocikgPT4gIXRoaXMucmVnaW9ucy5zb21lKChleGlzdGluZykgPT4gZXhpc3RpbmcuaWQgPT09IHIuaWQgfHwgcmVnaW9uc0VxdWFsKGV4aXN0aW5nLCByKSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5jb25jYXQoYWRkZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWdpb25zID0gcmVnaW9ucy5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5lbWl0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYW5zaWVudCBkaXNwbGF5IG9ubHkg4oCUIGRvbid0IHRvdWNoIHN0b3JlZCBzdGF0ZS5cbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYW5vbmljYWwgYWNjZXNzb3I6IHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9ucy4gQSBmcmVzaCBhcnJheSwgYnV0IHRoZVxuICAgKiBpbnN0YW5jZXMgYXJlIHRoZSBzdG9yZWQgb25lcywgc2hhcmVkIHdpdGggdGhlIHVuZG8gaGlzdG9yeTogdHJlYXQgdGhlbSBhc1xuICAgKiByZWFkLW9ubHkgYW5kIGNoYW5nZSBhIHJlZ2lvbiB0aHJvdWdoIHRoZSBzdG9yZSdzIG9wZXJhdGlvbnMgKG9yIGJ5XG4gICAqIGNvbW1pdHRpbmcgYSBjb3B5KS4gVHlwZWQgYFJlZ2lvbltdYCByYXRoZXIgdGhhblxuICAgKiBgUmVhZG9ubHlBcnJheTxSZWFkb25seTxSZWdpb24+PmAgYmVjYXVzZSB0aGUgSVJlZ2lvblN0b3JlIGNvbnRyYWN0IGFuZCB0aGVcbiAgICogYmFja2VuZHMgc3RpbGwgdGFrZSBhIG11dGFibGUgYXJyYXkuXG4gICAqL1xuICBnZXRSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zLnNsaWNlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHJlZ2lvbnMgZm9yIHotc3RhY2tzIChqaXQtdWkjOTMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUcnVlIHdoaWxlIGEgei1zdGFjayBpcyBsb2FkZWQgYW5kIHRoZSBzdG9yZSBob2xkcyByZWdpb25zIHBlciBzbGljZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUuc3RhY2tNb2RlO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IGRpc3BsYXkgc2xpY2UgKHplcm8tYmFzZWQpLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5kaXNwbGF5U2xpY2U7XG4gIH1cblxuICAvKiogSG93IHRoZSBjdXJyZW50IHN0YWNrIHBlcnNpc3RzIHRvIGRpc2sgKGppdC11aSM5Myk6IGBjb21iaW5lZGAgPSBvbmVcbiAgICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrKTsgYHBlci1zbGljZS1maWxlYCA9IG9uZSBnZW9qc29uIHBlclxuICAgKiAgc2xpY2UtZmlsZSAoZm9sZGVyIHN0YWNrKS4gTWVhbmluZ2xlc3Mgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogU3RhY2tTYXZlTGF5b3V0IHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5zYXZlTGF5b3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHBlci1zbGljZSBzdGFjayBtb2RlLiBgc2xpY2VzYCBtYXBzIGVhY2ggemVyby1iYXNlZCBzbGljZSBpbmRleCB0b1xuICAgKiB0aGUgcmVnaW9ucyBpbXBvcnRlZCBmb3IgdGhhdCBzbGljZTsgdGhlIHN0b3JlIG1ha2VzIGBpbml0aWFsWmAncyBzbGljZSB0aGVcbiAgICogbGl2ZSBzZXQsIHNvIHRoZSBvdmVybGF5cyAvIHNlbGVjdGlvbiAvIFJlZ2lvbnMgdGFibGUgYXJlIHVuY2hhbmdlZCAodGhleVxuICAgKiBzdGlsbCByZWFkIHtAbGluayBnZXRSZWdpb25zfSkuIEZyZXNobHktY3JlYXRlZCByZWdpb25zIGFyZSB0YWdnZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzbGljZSBzbyB0aGV5IHBlcnNpc3Qgb24gaXQsIGFuZCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfSByZXR1cm5zXG4gICAqIGV2ZXJ5IHNsaWNlIGZvciBzYXZlL2V4cG9ydC4gSWRzL25hbWVzL2NsYXNzaWZpY2F0aW9uIGNvbG91cnMgYXJlIG1pbnRlZFxuICAgKiBleGFjdGx5IGFzIHtAbGluayBzZXRSZWdpb25zfSBkb2VzLlxuICAgKi9cbiAgZW50ZXJTdGFja01vZGUoc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaID0gMCwgc2F2ZUxheW91dDogU3RhY2tTYXZlTGF5b3V0ID0gJ2NvbWJpbmVkJyk6IHZvaWQge1xuICAgIGNvbnN0IGFkbWl0dGVkID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHNsaWNlcykgYWRtaXR0ZWQuc2V0KHosIHRoaXMubm9ybWFsaXplU2xpY2UocmVncyB8fCBbXSwgeikpO1xuICAgIHRoaXMucmVnaW9ucyA9IHRoaXMuc2NvcGUuZW50ZXJTdGFjayhhZG1pdHRlZCwgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UoW10pO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgdGhpcy5yZWZyZXNoU291cmNlVmlldygpO1xuICB9XG5cbiAgLyoqIExlYXZlIHN0YWNrIG1vZGUgKHNpbmdsZS1wbGFuZSBpbWFnZSwgb3IgdGhlIHN0YWNrIHdhcyBjbG9zZWQpLiAqL1xuICBleGl0U3RhY2tNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGUuZXhpdFN0YWNrKCk7XG4gICAgdGhpcy5yZWZyZXNoU291cmNlVmlldygpO1xuICB9XG5cbiAgLyoqIFRoZSBsaXZlLXNldCBzd2FwIG9mIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LiAqL1xuICBwcml2YXRlIHNob3dTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5zY29wZS5zaG93U2xpY2UoeiwgdGhpcy5yZWdpb25zKTtcbiAgICBpZiAoIW5leHQpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnMgPSBuZXh0O1xuICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UoW10pO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgdGhpcy5yZWZyZXNoU291cmNlVmlldygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgYSBkaWZmZXJlbnQgc2xpY2U6IGNhcHR1cmUgdGhlIGN1cnJlbnQgc2xpY2UncyAocG9zc2libHkgZWRpdGVkKVxuICAgKiByZWdpb25zIGJhY2sgaW50byB0aGUgcGVyLXNsaWNlIHN0b3JlLCB0aGVuIGxvYWQgdGhlIHRhcmdldCBzbGljZSdzIHJlZ2lvbnNcbiAgICogYXMgdGhlIGxpdmUgc2V0IGFuZCBlbWl0LiBVbmRvIG5ldmVyIGNyb3NzZXMgYSBzbGljZS4gT3V0c2lkZSBzdGFjayBtb2RlXG4gICAqIHRoaXMgb25seSByZWNvcmRzIHRoZSByZXF1ZXN0ZWQgc2xpY2UgaW5kZXggKGEgbm8tb3Agb3RoZXJ3aXNlOiBzaW5nbGUtcGxhbmVcbiAgICogcmVnaW9ucyBzdGF5IG9uIHRoZSBkZWZhdWx0IHBsYW5lIOKAlCBhZGRSZWdpb24gdGFncyBSZWdpb24ueiBvbmx5IGluIHN0YWNrXG4gICAqIG1vZGUsIHNvIHRoZSByZWNvcmRlZCBpbmRleCBpcyB1bnVzZWQgdW50aWwgYSBzdGFjayBpcyBlbnRlcmVkKS4gKGppdC11aSM5MylcbiAgICogRWl0aGVyIHdheSB7QGxpbmsgZ2V0UmVnaW9uU2V0UmVwbGFjZWQkfSBlbWl0czogdGhlIHNsaWNlIG9uIHNjcmVlbiBjaGFuZ2VkXG4gICAqIHVuZGVyIGFueSBpbi1wcm9ncmVzcyB0b29sIHdvcmsuXG4gICAqL1xuICBzZXREaXNwbGF5U2xpY2UoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U2xpY2Uoeik7XG4gICAgdGhpcy5yZWdpb25TZXRSZXBsYWNlZCQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHNsaWNlJ3MgcmVnaW9ucyBmb3Igc2F2ZS9leHBvcnQsIGVhY2ggdGFnZ2VkIHdpdGggaXRzIHplcm8tYmFzZWRcbiAgICogc2xpY2UgaW5kZXggaW4ge0BsaW5rIFJlZ2lvbi56fS4gQ2FwdHVyZXMgdGhlIGN1cnJlbnQgc2xpY2UncyBsaXZlIGVkaXRzXG4gICAqIGZpcnN0LiBSZXR1cm5zIHRoZSBmbGF0IHNpbmdsZS1wbGFuZSBzZXQgd2hlbiBub3QgaW4gc3RhY2sgbW9kZS4gKGppdC11aSM5MylcbiAgICovXG4gIGdldFNsaWNlUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUuc2xpY2VSZWdpb25zKHRoaXMucmVnaW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBldmVyeVxuICAgKiBzbGljZSB0aGF0IGN1cnJlbnRseSBoYXMgcmVnaW9ucywgUExVUyBzbGljZXMgdGhhdCB3ZXJlIGxvYWRlZCBub24tZW1wdHkgYnV0XG4gICAqIGFyZSBub3cgZW1wdHkgKHNvIHRoZWlyIGZpbGUgaXMgcmUtd3JpdHRlbiBlbXB0eSwgY2xlYXJpbmcgYSBzbGljZSB3aG9zZVxuICAgKiByZWdpb25zIHRoZSB1c2VyIGRlbGV0ZWQpLiBFYWNoIHJldHVybmVkIHJlZ2lvbiBpcyB0YWdnZWQgd2l0aCBpdHMgeiwgYW5kXG4gICAqIHRoZSBjdXJyZW50IGxpdmUgc2xpY2UgaXMgY2FwdHVyZWQgZmlyc3QuIEVtcHR5IG91dHNpZGUgc3RhY2sgbW9kZS5cbiAgICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIGNvbnN0IHNsaWNlcyA9IHRoaXMuc2NvcGUuc3RhY2tTYXZlU2xpY2VzKHRoaXMucmVnaW9ucyk7XG4gICAgLy8gQSBzbGljZSB3aG9zZSByZWdpb24gc291cmNlIGxvc3QgZmVhdHVyZXMgKHRha2VuLCBkZWxldGVkKSBpcyByZS13cml0dGVuIHRvbywgYW5kIHNvIGlzIG9uZVxuICAgIC8vIHdob3NlIHNvdXJjZSB3YXMgaW1wb3J0ZWQ6IGl0IGlzIG9uIG5vIGZpbGUgeWV0LlxuICAgIGNvbnN0IGltYWdlID0gdGhpcy5zY29wZS5hY3RpdmVJbWFnZTtcbiAgICBjb25zdCBjaGFuZ2VkID0gW1xuICAgICAgLi4ubmV3IFNldChbLi4udGhpcy5zb3VyY2VzLnNsaWNlc1dpdGhUYWtlbihpbWFnZSksIC4uLnRoaXMuc291cmNlcy5pbXBvcnRlZFNsaWNlcyhpbWFnZSldKSxcbiAgICBdLmZpbHRlcigoeikgPT4gIXNsaWNlcy5oYXMoeikpO1xuICAgIGlmICghY2hhbmdlZC5sZW5ndGgpIHJldHVybiBzbGljZXM7XG4gICAgZm9yIChjb25zdCB6IG9mIGNoYW5nZWQpIHNsaWNlcy5zZXQoeiwgW10pO1xuICAgIHJldHVybiBuZXcgTWFwKEFycmF5LmZyb20oc2xpY2VzKS5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSkpO1xuICB9XG5cbiAgLyoqIE1pbnQgaWRzL25hbWVzICsgYXBwbHkgY2xhc3NpZmljYXRpb24gY29sb3VycyArIHRhZyB0aGUgc2xpY2UgaW5kZXgsIGFzXG4gICAqICB7QGxpbmsgc2V0UmVnaW9uc30gZG9lcywgZm9yIHJlZ2lvbnMgZW50ZXJpbmcgdGhlIHBlci1zbGljZSBzdG9yZS4gKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVTbGljZShyZWdpb25zOiBSZWdpb25bXSwgejogbnVtYmVyKTogUmVnaW9uW10ge1xuICAgIC8vIEEgZnJlc2ggKGltcG9ydGVkKSByZWdpb24gaXMgdGFnZ2VkIGluIHBsYWNlOyBhIHN0b3JlZCBvbmUgaXMgY29waWVkLlxuICAgIHJldHVybiB0aGlzLmFkbWl0KHJlZ2lvbnMubWFwKChyKSA9PiAoci5pZCA9PSBudWxsID8gT2JqZWN0LmFzc2lnbihyLCB7IHogfSkgOiB3aXRoUmVnaW9uWihyLCB6KSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpb25zIGVudGVyaW5nIHRoZSBzdG9yZTogbWludCBpZHMgYW5kIGRlZmF1bHQgbmFtZXMsIGh5ZHJhdGUgSlNPTiBib3VuZHNcbiAgICogaW50byBjbGFzcyBpbnN0YW5jZXMg4oCUIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSAocmVuZGVyaW5nLCBnZW9tZXRyeSBkZS1kdXAsXG4gICAqIG1vdmVSZWdpb24sIEdlb0pTT04gZXhwb3J0KSBkaXNjcmltaW5hdGVzIHRoZW0gd2l0aCBgaW5zdGFuY2VvZmBcbiAgICogKGppdC11aSMxMjQpIOKAlCBhbmQgYXBwbHkgY2xhc3NpZmljYXRpb24gY29sb3Vycy4gQSByZWdpb24gdGhhdCBpcyBuZXcgdG9cbiAgICogdGhlIHN0b3JlIChubyBpZCB5ZXQpIGlzIGNvbXBsZXRlZCBpbiBwbGFjZTsgb25lIHRoYXQgYWxyZWFkeSBoYXMgYW4gaWQgbWF5XG4gICAqIGJlIGEgc3RvcmVkIGluc3RhbmNlIHNoYXJlZCB3aXRoIHRoZSB1bmRvIGhpc3RvcnksIHNvIGl0IGlzIGNvcGllZCBpZiBpdFxuICAgKiBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG1pdChyZWdpb25zOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICBjb25zdCBmcmVzaCA9IG5ldyBTZXQ8UmVnaW9uPigpO1xuICAgIGNvbnN0IGFkbWl0dGVkID0gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT4ge1xuICAgICAgaWYgKHJlZ2lvbi5pZCA9PSBudWxsKSB7XG4gICAgICAgIHJlZ2lvbi5pZCA9IHRoaXMubmV4dElkKys7XG4gICAgICAgIGlmIChyZWdpb24ubmFtZSA9PSBudWxsKSByZWdpb24ubmFtZSA9IGBzaGFwZSR7cmVnaW9uLmlkfWA7XG4gICAgICAgIHJlZ2lvbi5ib3VuZHMgPSBoeWRyYXRlQm91bmRzKHJlZ2lvbi5ib3VuZHMpO1xuICAgICAgICBmcmVzaC5hZGQocmVnaW9uKTtcbiAgICAgICAgcmV0dXJuIHJlZ2lvbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kcyA9IGh5ZHJhdGVCb3VuZHMocmVnaW9uLmJvdW5kcyk7XG4gICAgICByZXR1cm4gcmVnaW9uLm5hbWUgPT0gbnVsbCB8fCBib3VuZHMgIT09IHJlZ2lvbi5ib3VuZHNcbiAgICAgICAgPyB3aXRoUmVnaW9uUGF0Y2gocmVnaW9uLCB7IG5hbWU6IHJlZ2lvbi5uYW1lID8/IGBzaGFwZSR7cmVnaW9uLmlkfWAsIGJvdW5kcyB9KVxuICAgICAgICA6IHJlZ2lvbjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy53aXRoQ2xhc3NpZmljYXRpb25Db2xvcnMoYWRtaXR0ZWQsIChyKSA9PiBmcmVzaC5oYXMocikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlZCBwb2x5Z29ucyBwcm9qZWN0ZWQgZm9yIGltYWdlLXByb2Nlc3NpbmcgY29uc3VtZXJzIChzZWdtZW50YXRpb24sXG4gICAqIGNyb3AgcmVxdWVzdHMsIHRyYWNlIGJ1aWxkZXJzKSwgc3RyYWlnaHQgZnJvbSBlYWNoIHJlZ2lvbidzIGJvdW5kczogYVxuICAgKiByZWN0YW5nbGUncyBjb3JuZXJzLCBhIHBvbHlnb24gd2l0aCBpdHMgaG9sZXMgKGEgYsOpemllciBhcyBpdHMgY3VydmUpLCBvbmVcbiAgICogcG9seWdvbiBwZXIgcGFydCBvZiBhIG11bHRpLXBvbHlnb24uIE9wZW4gcG9seWxpbmVzIGFyZSBhbm5vdGF0aW9uLW9ubHkgYW5kXG4gICAqIGV4Y2x1ZGVkLiBDb29yZGluYXRlcyBhcmUgcm91bmRlZCB0byB3aG9sZSBwaXhlbHMuXG4gICAqL1xuICBnZXRSZWdpb25Qb2x5Z29ucygpOiBQb2x5Z29uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMuZmxhdE1hcCgocmVnaW9uKSA9PiByZWdpb25Qb2x5Z29ucyhyZWdpb24pKTtcbiAgfVxuXG4gIGdldFJlZ2lvblVwZGF0ZUV2ZW50KCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25VcGRhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIExpdmUgKG5vbi1jb2FsZXNjZWQpIHJlZ2lvbi1jaGFuZ2Ugc3RyZWFtIOKAlCBmaXJlcyBwZXIgZnJhbWUgZHVyaW5nIGEgZHJhZy5cbiAgICogIFVzZWQgYnkgdGhlIGludGVuc2l0eS1wcm9maWxlIGluc2V0IHNvIGl0IHRyYWNrcyBsaW5lIFJPSXMgbGl2ZS4gKi9cbiAgZ2V0UmVnaW9uTGl2ZUVkaXQkKCk6IE9ic2VydmFibGU8UmVnaW9uW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25MaXZlRWRpdCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYWZ0ZXIgZXZlcnkge0BsaW5rIHVuZG99LCB7QGxpbmsgcmVkb30gYW5kIHtAbGluayBzZXREaXNwbGF5U2xpY2V9IGNhbGxcbiAgICogKGV2ZW4gb25lIHRoYXQgY2hhbmdlZCBub3RoaW5nKTogdGhlIHJlZ2lvbiBzZXQgd2FzIHJlcGxhY2VkIHVuZGVyIHdoYXRldmVyXG4gICAqIGEgY2FudmFzIHRvb2wgd2FzIGJ1aWxkaW5nIG9uIChhIGJydXNoIHN0cm9rZSwgYSBTQU0gcG9pbnQgcHJvbXB0KSwgc28gdGhlXG4gICAqIGJhY2tlbmRzIHJlc2V0IHRoZWlyIGNhbnZhcyB0b29scyBvbiBpdC4gTm90IGVtaXR0ZWQgZm9yIG9yZGluYXJ5IGVkaXRzIOKAlFxuICAgKiBhIHRvb2wncyBvd24gY29tbWl0IG11c3Qgbm90IHJlc2V0IGl0LlxuICAgKi9cbiAgZ2V0UmVnaW9uU2V0UmVwbGFjZWQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblNldFJlcGxhY2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogU2VsZWN0IHJlZ2lvbnMgYnkgYXJyYXkgaW5kZXggKG9yIFtdIHRvIGNsZWFyKS4gU3RvcmVkIGludGVybmFsbHkgYnkgaWRcbiAgICogIHNvIHRoZSBzZWxlY3Rpb24gc3Vydml2ZXMgc3Vic2VxdWVudCBlZGl0cy9yZW9yZGVycy4gKi9cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RJbmRpY2VzKGluZGljZXMsIHRoaXMucmVnaW9ucyk7XG4gIH1cblxuICAvKiogU2VsZWN0IGEgc2luZ2xlIHJlZ2lvbiBieSBpZGVudGl0eSAoaWQpLiBCYWNrZW5kcyBjYWxsIHRoaXMgZnJvbSB0aGVpclxuICAgKiAgYHNlbGVjdFJlZ2lvbigpYDsgdGhlIE9TRCBvdmVybGF5ICsgcmVnaW9uIGVkaXRvciBoaWdobGlnaHQgb2ZmIHRoZVxuICAgKiAgcmVzdWx0aW5nIHNlbGVjdGlvbiBlbWl0LiBOby1vcCBpZiB0aGUgcmVnaW9uIGlzbid0IGluIHRoZSBzdG9yZS4gKi9cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgaWYgKHJlZ2lvbj8uaWQgPT0gbnVsbCB8fCB0aGlzLmluZGV4T2ZJZChyZWdpb24uaWQpIDwgMCkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UoW3JlZ2lvbi5pZF0pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCk6IE9ic2VydmFibGU8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaW5kaWNlcyQ7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgY3VycmVudCBzZWxlY3Rpb24gKGFycmF5IGluZGljZXMpIOKAlCBmb3IgY2FsbGVycyB0aGF0IG5lZWQgdG9cbiAgICogIHJlYWQgdGhlIHNlbGVjdGlvbiB3aXRob3V0IHN1YnNjcmliaW5nLiAqL1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmluZGljZXM7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVnaW9ucyBhbmQgY2xlYXIgdGhlIHNlbGVjdGlvbi4gKi9cbiAgZGVsZXRlQWN0aXZlU2hhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb24uaWRzKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMuZmlsdGVyKChyKSA9PiAhaWRzLmhhcyhyLmlkKSk7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShbXSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IGNvbG91cnMgLyBsYWJlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U2hvd1NoYXBlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1NoYXBlTGFiZWw7XG4gIH1cbiAgZ2V0U2hhcGVDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNoYXBlQ29sb3I7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmlsbENvbG9yO1xuICB9XG5cbiAgLyoqIFNob3cgb3IgaGlkZSByZWdpb24gbGFiZWxzIChub3Qgb24gdGhlIGNvbnRyYWN0OyBzcGVjcyBkcml2ZSBpdCBkaXJlY3RseSkuXG4gICAqICBAZGVwcmVjYXRlZCBOb3RoaW5nIGluIHRoZSBsaWJyYXJ5IGNhbGxzIGl0OyB3aWxsIGJlIHJlbW92ZWQgbmV4dCBtaW5vci4gKi9cbiAgc2V0U2hvd1NoYXBlTGFiZWwoc2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1NoYXBlTGFiZWwgPSBzaG93O1xuICAgIHRoaXMucmVwdWJsaXNoVmlldygpO1xuICB9XG5cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmU6IHVuZG8gLyByZWRvIChqaXQtdWkjODUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFbWl0cyB3aGV0aGVyIGFuIHVuZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFVuZG8gYnV0dG9uJ3MgZW5hYmxlZCBzdGF0ZSAoZ3JleWVkIG91dCB3aGVuIGZhbHNlKS4gKi9cbiAgZ2V0Q2FuVW5kbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5jYW5VbmRvJDtcbiAgfVxuXG4gIC8qKiBFbWl0cyB3aGV0aGVyIGEgcmVkbyBzdGVwIGlzIGN1cnJlbnRseSBhdmFpbGFibGUg4oCUIGRyaXZlcyB0aGUgdG9vbGJhclxuICAgKiAgUmVkbyBidXR0b24ncyBlbmFibGVkIHN0YXRlLiAqL1xuICBnZXRDYW5SZWRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmNhblJlZG8kO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblVuZG8kfSDigJQgdHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSByZWdpb25cbiAgICogIGFjdGlvbiBjYW4gYmUgdW5kb25lLiAqL1xuICBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuY2FuVW5kbygpO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfSDigJQgdHJ1ZSB3aGVuIGFuIHVuZG9uZSBhY3Rpb24gY2FuXG4gICAqICBiZSByZS1hcHBsaWVkLiAqL1xuICBjYW5SZWRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuY2FuUmVkbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZG8gdGhlIG1vc3QgcmVjZW50IHJlZ2lvbiBhY3Rpb24sIHJlc3RvcmluZyB0aGUgcmVnaW9uIHNldCB0byBpdHMgc3RhdGVcbiAgICoganVzdCBiZWZvcmUgdGhhdCBhY3Rpb24gYW5kIHB1c2hpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb250byB0aGUgcmVkbyBzdGFjay5cbiAgICogVXAgdG8ge0BsaW5rIFVORE9fTElNSVR9IHN0ZXBzIGFyZSByZXRhaW5lZCwgc28gdGhpcyBjYW4gYmUgY2FsbGVkIHVwIHRvXG4gICAqIHtAbGluayBVTkRPX0xJTUlUfSB0aW1lcyBpbiBhIHJvdyBiZWZvcmUgdGhlIGhpc3RvcnkgZW1wdGllcy4gTm8tb3Agd2hlblxuICAgKiBub3RoaW5nIGlzIGxlZnQgdG8gdW5kby5cbiAgICovXG4gIHVuZG8oKTogdm9pZCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmhpc3RvcnkudW5kbyh0aGlzLnNuYXBzaG90KCkpO1xuICAgIGlmIChzbmFwc2hvdCkgdGhpcy5yZXN0b3JlU25hcHNob3Qoc25hcHNob3QpO1xuICAgIHRoaXMucmVnaW9uU2V0UmVwbGFjZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRvIHRoZSBhY3Rpb24gbW9zdCByZWNlbnRseSB1bmRvbmUsIHJlc3RvcmluZyB0aGUgcmVnaW9uIHNldCB0byB0aGUgc3RhdGVcbiAgICogaXQgaGFkIGJlZm9yZSB0aGF0IHVuZG8gYW5kIHB1c2hpbmcgdGhlIGN1cnJlbnQgc3RhdGUgYmFjayBvbnRvIHRoZSB1bmRvXG4gICAqIHN0YWNrLiBOby1vcCB3aGVuIHRoZXJlJ3Mgbm90aGluZyB0byByZWRvICh0aGUgcmVkbyBzdGFjayBpcyBjbGVhcmVkIGJ5IGFueVxuICAgKiBmcmVzaCByZWdpb24gYWN0aW9uKS5cbiAgICovXG4gIHJlZG8oKTogdm9pZCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmhpc3RvcnkucmVkbyh0aGlzLnNuYXBzaG90KCkpO1xuICAgIGlmIChzbmFwc2hvdCkgdGhpcy5yZXN0b3JlU25hcHNob3Qoc25hcHNob3QpO1xuICAgIHRoaXMucmVnaW9uU2V0UmVwbGFjZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBEaXNjYXJkIHRoZSB1bmRvL3JlZG8gaGlzdG9yeSAoZS5nLiBvbiBpbWFnZSBsb2FkL3N3aXRjaCDigJQgaGlzdG9yeSBuZXZlclxuICAgKiAgY3Jvc3NlcyBpbWFnZXMpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuaGlzdG9yeS5yZXNldCgpO1xuICB9XG5cbiAgLyoqIE1ha2UgYHNuYXBzaG90YCB0aGUgbGl2ZSByZWdpb24gc2V0IGFuZCBub3RpZnkgYm90aCBiYWNrZW5kcy4gU2hhcmVkIGJ5XG4gICAqICB7QGxpbmsgdW5kb30gYW5kIHtAbGluayByZWRvfTsgbm90aGluZyByZWNvcmRzIGhpc3Rvcnkgd2hpbGUgaXQgcnVucy4gKi9cbiAgcHJpdmF0ZSByZXN0b3JlU25hcHNob3Qoc25hcHNob3Q6IFJlZ2lvblNuYXBzaG90KTogdm9pZCB7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3RvcmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWdpb25zID0gc25hcHNob3QucmVnaW9ucy5zbGljZSgpO1xuICAgICAgdGhpcy5zZXRUYWtlbihzbmFwc2hvdC50YWtlbik7XG4gICAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgICAgLy8gRHJvcHMgYW55IHNlbGVjdGVkIGlkcyB0aGUgcmVzdG9yZWQgc2V0IG5vIGxvbmdlciBjb250YWlucy5cbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIH0pO1xuICAgIC8vIE5vdGlmeSB0aGUgbGl2ZSArIGNvYWxlc2NlZCBzdHJlYW1zIHNvIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlblxuICAgIC8vIHJlLXJlbmRlcnMgZnJvbSB0aGUgcmVzdG9yZWQgc3RvcmUgc3RhdGUuXG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdCQubmV4dCh0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmUgdGhlIHByZS1hY3Rpb24gcmVnaW9uIHNldCBpbnRvIHRoZSBib3VuZGVkIHVuZG8gaGlzdG9yeS4gQ2FsbGVkIGF0XG4gICAqIHRoZSB0b3Agb2YgZXZlcnkgbXV0YXRpbmcgb3BlcmF0aW9uLCAqYmVmb3JlKiBpdCBjaGFuZ2VzIGByZWdpb25zYC4gVGhlXG4gICAqIHNuYXBzaG90IGlzIHRoZSBhcnJheSBpdHNlbGY6IGV2ZXJ5IG9wZXJhdGlvbiByZXBsYWNlcyBgcmVnaW9uc2AgKGFuZCBhbnlcbiAgICogcmVnaW9uIGl0IGVkaXRzKSByYXRoZXIgdGhhbiBjaGFuZ2luZyB0aGVtLCBzbyBpdCBuZXZlciBjaGFuZ2VzIGFmdGVyIHRoaXMuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZFVuZG9TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvcnkucmVjb3JkKHRoaXMuc25hcHNob3QoKSk7XG4gIH1cblxuICAvKiogVGhlIHN0YXRlIGFuIHVuZG8gc3RlcCByZXN0b3Jlcy4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdCgpOiBSZWdpb25TbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgcmVnaW9uczogdGhpcy5yZWdpb25zLCB0YWtlbjogdGhpcy5jdXJyZW50VGFrZW4oKSB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogR2VvSlNPTiBJL08gKG1vZGVscy9yZWdpb24tZ2VvanNvbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFBhcnNlIEdlb0pTT04gaW50byByZWdpb25zLCByZW1lbWJlcmluZyB0aGUgY2xhc3MgY29sb3VycyB0aGUgZmlsZSBjYXJyaWVzIHNvIHRoZXkgYXJlXG4gICAqICBrZXB0IGZvciBjbGFzc2VzIHdpdGggbm8gcHJlc2V0IChzZWUgVmlzdWFsaXplclN0b3JlLnJlbWVtYmVySW1wb3J0ZWRDbGFzc0NvbG9ycykuICovXG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IHJlZ2lvbnMgPSByZWdpb25zRnJvbUdlb0pzb24oZ2VvSnNvblN0cik7XG4gICAgY29uc3QgY29sb3JzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgaWYgKHIubGFiZWwgJiYgci5jb2xvciAmJiAhY29sb3JzLmhhcyhyLmxhYmVsKSkgY29sb3JzLnNldChyLmxhYmVsLCByLmNvbG9yKTtcbiAgICB9XG4gICAgaWYgKGNvbG9ycy5zaXplKSB0aGlzLnN0b3JlLnJlbWVtYmVySW1wb3J0ZWRDbGFzc0NvbG9ycyhjb2xvcnMpO1xuICAgIHJldHVybiByZWdpb25zO1xuICB9XG4gIC8qKiBEb3dubG9hZCBgcmVnaW9uc2AgYXMgR2VvSlNPTiwgbmFtZWQgYWZ0ZXIgYGZpbGVOYW1lYCAoZXh0ZW5zaW9uXG4gICAqICByZXBsYWNlZCBieSBgLmdlb2pzb25gKSBvciBgcm9pcy5nZW9qc29uYCB3aXRob3V0IG9uZS4gKi9cbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgZmlsZU5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBkb3dubG9hZEdlb0pzb24ocmVnaW9uc1RvR2VvSnNvbihyZWdpb25zKSwgZmlsZU5hbWUpO1xuICB9XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmcge1xuICAgIHJldHVybiByZWdpb25zVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25FZGl0QXBpOiBzdHJ1Y3R1cmFsIGVkaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFkZFJlZ2lvbihyZWdpb246IFJlZ2lvbik6IG51bWJlciB7XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICBpZiAocmVnaW9uLmlkID09IG51bGwpIHJlZ2lvbi5pZCA9IHRoaXMubmV4dElkKys7XG4gICAgaWYgKHJlZ2lvbi5uYW1lID09IG51bGwpIHJlZ2lvbi5uYW1lID0gYHNoYXBlJHtyZWdpb24uaWR9YDtcbiAgICByZWdpb24uYm91bmRzID0gaHlkcmF0ZUJvdW5kcyhyZWdpb24uYm91bmRzKTsgLy8gaml0LXVpIzEyNFxuICAgIC8vIEEgcmVnaW9uIGRyYXduIG9uIGEgc3RhY2sgYmVsb25ncyB0byB0aGUgc2xpY2UgY3VycmVudGx5IGRpc3BsYXllZCwgc29cbiAgICAvLyBpdCBzYXZlcy9yZWxvYWRzIG9uIHRoYXQgc2xpY2UgKGppdC11aSM5MykuIE5vLW9wIGZvciBzaW5nbGUtcGxhbmUgaW1hZ2VzXG4gICAgLy8gKHRoZSBkaXNwbGF5IHNsaWNlIHN0YXlzIDApLlxuICAgIGlmICh0aGlzLnNjb3BlLnN0YWNrTW9kZSkgcmVnaW9uLnogPSB0aGlzLnNjb3BlLmRpc3BsYXlTbGljZTtcbiAgICAvLyBUaGUgY2FsbGVyJ3MgaW5zdGFuY2UgYmVjb21lcyB0aGUgc3RvcmVkIG9uZSAoY29tcGxldGVkIGluIHBsYWNlKS5cbiAgICBjb25zdCBbc3RvcmVkXSA9IHRoaXMud2l0aENsYXNzaWZpY2F0aW9uQ29sb3JzKFtyZWdpb25dLCAoKSA9PiB0cnVlKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbLi4udGhpcy5yZWdpb25zLCBzdG9yZWRdO1xuICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UoW3N0b3JlZC5pZF0pO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gICAgcmV0dXJuIHN0b3JlZC5pZDtcbiAgfVxuXG4gIHJlbW92ZVJlZ2lvbihpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVSZWdpb25zKFtpZF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgcmVnaW9ucyB3aXRoIHRoZXNlIGlkcywgaWYgcHJlc2VudC4gV2l0aCBgeyByZWNvcmRVbmRvOiBmYWxzZSB9YFxuICAgKiBubyB1bmRvIHN0ZXAgaXMgdGFrZW4g4oCUIGZvciBjbGVhcmluZyB0cmFuc2llbnQgc2hhcGVzIHRoYXQgd2VyZSBuZXZlciB0aGVcbiAgICogdXNlcidzIHdvcmsgKHRoZSAzRCB2aWV3J3Mgc2NyZWVuLXNwYWNlIGxhc3NvcyBvbiBhbiBvcmJpdCwgTkFQQVJJLVNWQy0xMSkuXG4gICAqL1xuICByZW1vdmVSZWdpb25zKGlkczogSXRlcmFibGU8bnVtYmVyPiwgb3B0czogeyByZWNvcmRVbmRvPzogYm9vbGVhbiB9ID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBkcm9wID0gbmV3IFNldChpZHMpO1xuICAgIGlmICghdGhpcy5yZWdpb25zLnNvbWUoKHIpID0+IGRyb3AuaGFzKHIuaWQpKSkgcmV0dXJuO1xuICAgIGlmIChvcHRzLnJlY29yZFVuZG8gIT09IGZhbHNlKSB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5maWx0ZXIoKHIpID0+ICFkcm9wLmhhcyhyLmlkKSk7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmV0YWluKChzKSA9PiAhZHJvcC5oYXMocykpO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICB1cGRhdGVCb3VuZHMoaWQ6IG51bWJlciwgYm91bmRzOiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghcikgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgLy8gQSBjb3B5LCBzbyB0aGUgY2FsbGVyIGNhbiBrZWVwIHVzaW5nIChhbmQgY2hhbmdpbmcpIHRoZSBib3VuZHMgaXQgcGFzc2VkLlxuICAgIHRoaXMucmVwbGFjZVJlZ2lvbihyZXBsYWNlQm91bmRzKHIsIGNsb25lQm91bmRzKGJvdW5kcykpKTtcbiAgfVxuXG4gIG1vdmVSZWdpb24oaWQ6IG51bWJlciwgZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLmZpbmRCeUlkKGlkKTtcbiAgICBpZiAoIXIgfHwgIXIuYm91bmRzKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICAvLyBFdmVyeSBwYXJ0IChhbmQgaXRzIGhvbGVzKSBtb3ZlcyB0b2dldGhlciAoaml0LXVpIzg1KS5cbiAgICB0aGlzLnJlcGxhY2VSZWdpb24ocmVwbGFjZUJvdW5kcyhyLCBlZGl0LnRyYW5zbGF0ZUJvdW5kcyhyLmJvdW5kcywgZHgsIGR5KSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25FZGl0QXBpOiB2ZXJ0ZXggZWRpdHMgKHBvbHlnb25zIG9ubHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBFYWNoIG9uZSBpcyBhIHB1cmUgY29weS1vbi13cml0ZSBlZGl0IGZyb20gbW9kZWxzL3BvbHlnb24tZWRpdDsgYSBudWxsXG4gIC8vIHJlc3VsdCAob3V0IG9mIHJhbmdlLCB3b3VsZCBkZWdlbmVyYXRlKSByZWNvcmRzIG5vdGhpbmcgYW5kIGVtaXRzIG5vdGhpbmcuXG5cbiAgbW92ZVZlcnRleChpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0Lm1vdmVWZXJ0ZXgocCwgaW5kZXgsIHgsIHkpKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgdmVydGV4IG9uIGEgcG9seWdvbidzIGludGVyaW9yIHJpbmcgKGhvbGUpIOKAlCBqaXQtdWkjODUuICovXG4gIG1vdmVIb2xlVmVydGV4KGlkOiBudW1iZXIsIGhvbGVJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0Lm1vdmVIb2xlVmVydGV4KHAsIGhvbGVJbmRleCwgaW5kZXgsIHgsIHkpKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgYSB2ZXJ0ZXggb24gYSBwb2x5Z29uJ3MgaW50ZXJpb3IgcmluZyAoaG9sZSksIGFmdGVyIGBzZWdJbmRleGBcbiAgICogICh0aGUgZWRnZSdzIHN0YXJ0IHZlcnRleCkuIE5vLW9wIGZvciBhbiBvdXQtb2YtcmFuZ2UgaG9sZSDigJQgaml0LXVpIzg1LiAqL1xuICBhZGRIb2xlVmVydGV4KGlkOiBudW1iZXIsIGhvbGVJbmRleDogbnVtYmVyLCBzZWdJbmRleDogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0LmFkZEhvbGVWZXJ0ZXgocCwgaG9sZUluZGV4LCBzZWdJbmRleCwgeCwgeSkpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSB0aGUgdmVydGV4IGF0IGBpbmRleGAgb24gYSBwb2x5Z29uJ3MgaW50ZXJpb3IgcmluZyAoaG9sZSkuIFJlbW92aW5nXG4gICAqICBpdCBiZWxvdyAzIHZlcnRpY2VzIGRyb3BzIHRoZSB3aG9sZSBob2xlIChhIHJpbmcgd2l0aCA8IDMgcG9pbnRzIGJvdW5kcyBub1xuICAgKiAgYXJlYSkg4oCUIGppdC11aSM4NS4gKi9cbiAgZGVsZXRlSG9sZVZlcnRleChpZDogbnVtYmVyLCBob2xlSW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0LmRlbGV0ZUhvbGVWZXJ0ZXgocCwgaG9sZUluZGV4LCBpbmRleCkpO1xuICB9XG5cbiAgYWRkVmVydGV4KGlkOiBudW1iZXIsIHNlZ0luZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQuYWRkVmVydGV4KHAsIHNlZ0luZGV4LCB4LCB5KSk7XG4gIH1cblxuICBkZWxldGVWZXJ0ZXgoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0LmRlbGV0ZVZlcnRleChwLCBpbmRleCkpO1xuICB9XG5cbiAgc2V0QmV6aWVyKGlkOiBudW1iZXIsIGJlemllcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLmZpbmRCeUlkKGlkKTtcbiAgICBpZiAoIXIgfHwgIXIuYm91bmRzKSByZXR1cm47XG4gICAgbGV0IG5leHQ6IFBvbHlnb24gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoci5ib3VuZHMgaW5zdGFuY2VvZiBQb2x5Z29uKSB7XG4gICAgICBuZXh0ID0gZWRpdC5zZXRCZXppZXIoci5ib3VuZHMsIGJlemllcik7XG4gICAgfSBlbHNlIGlmIChyLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSAmJiBiZXppZXIpIHtcbiAgICAgIC8vIFNtb290aGluZyBhIHJlY3RhbmdsZTogY29udmVydCBpdCB0byBhIDQtYW5jaG9yIGNsb3NlZCBwb2x5Z29uIGZpcnN0LlxuICAgICAgY29uc3QgcmluZyA9IHJlY3RUb1Jpbmcoci5ib3VuZHMpO1xuICAgICAgbmV4dCA9IGVkaXQuc2V0QmV6aWVyKG1ha2VQb2x5Z29uKHJpbmcueHMsIHJpbmcueXMpLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKCFuZXh0KSByZXR1cm47IC8vIGFscmVhZHkgaW4gdGhhdCBzdGF0ZSwgb3IgYmV6aWVyPWZhbHNlIG9uIGEgcmVjdGFuZ2xlXG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICB0aGlzLnJlcGxhY2VSZWdpb24ocmVwbGFjZUJvdW5kcyhyLCBuZXh0KSk7XG4gIH1cblxuICAvKiogRHJhZyBhIGJlemllciBjb250cm9sIHBvaW50IG9uIGEgaG9sZSByaW5nIHZlcnRleCAoZG9udXQgYmV6aWVyIGVkaXRpbmcpLiAqL1xuICBtb3ZlSG9sZUJlemllckhhbmRsZShcbiAgICBpZDogbnVtYmVyLFxuICAgIGhvbGVJbmRleDogbnVtYmVyLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2lkZTogJ2luJyB8ICdvdXQnLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0Lm1vdmVIb2xlQmV6aWVySGFuZGxlKHAsIGhvbGVJbmRleCwgaW5kZXgsIHNpZGUsIHgsIHkpKTtcbiAgfVxuXG4gIG1vdmVCZXppZXJIYW5kbGUoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlciwgc2lkZTogJ2luJyB8ICdvdXQnLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdFBvbHlnb24oaWQsIChwKSA9PiBlZGl0Lm1vdmVCZXppZXJIYW5kbGUocCwgaW5kZXgsIHNpZGUsIHgsIHkpKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIGNvcHktb24td3JpdGUgcG9seWdvbiBlZGl0IHRvIHJlZ2lvbiBgaWRgOiByZWNvcmQsIHN3YXAgaW4sIGVtaXQuICovXG4gIHByaXZhdGUgZWRpdFBvbHlnb24oaWQ6IG51bWJlciwgYXBwbHk6IChwOiBQb2x5Z29uKSA9PiBQb2x5Z29uIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLmZpbmRCeUlkKGlkKTtcbiAgICBpZiAoIXIgfHwgIShyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24pKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGFwcGx5KHIuYm91bmRzKTtcbiAgICBpZiAoIW5leHQpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbihyZXBsYWNlQm91bmRzKHIsIG5leHQpKTtcbiAgfVxuXG4gIC8qKiBTd2FwIGBuZXh0YCBpbiBmb3IgdGhlIHN0b3JlZCByZWdpb24gd2l0aCBpdHMgaWQgKGEgbmV3IGFycmF5KSwgdGhlbiBzeW5jIGFuZCBlbWl0LiAqL1xuICBwcml2YXRlIHJlcGxhY2VSZWdpb24obmV4dDogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLm1hcCgocikgPT4gKHIuaWQgPT09IG5leHQuaWQgPyBuZXh0IDogcikpO1xuICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKiogQ29hbGVzY2UgYHJlZ2lvblVwZGF0ZSRgIHVudGlsIHRoZSBtYXRjaGluZyB7QGxpbmsgZW5kQmF0Y2h9IChsaXZlIGRyYWdzKTtcbiAgICogIHRoZSBiYXRjaCBpcyBhbHNvIG9uZSB1bmRvIGdlc3R1cmUgKHtAbGluayBiZWdpbkdlc3R1cmV9KS4gKi9cbiAgYmVnaW5CYXRjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhdGNoRGVwdGgrKztcbiAgICB0aGlzLmJlZ2luR2VzdHVyZSgpO1xuICB9XG4gIGVuZEJhdGNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPiAwKSB0aGlzLmJhdGNoRGVwdGgtLTtcbiAgICB0aGlzLmVuZEdlc3R1cmUoKTtcbiAgICBpZiAodGhpcy5iYXRjaERlcHRoID09PSAwICYmIHRoaXMucGVuZGluZ0VtaXQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0VtaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFyayB0aGUgc3RhcnQgb2Ygb25lIHVzZXIgZ2VzdHVyZSAoZS5nLiBhIHdhbmQvYnJ1c2ggbW91c2Vkb3duKTogZXZlcnlcbiAgICogY29tbWl0IHVudGlsIHRoZSBtYXRjaGluZyB7QGxpbmsgZW5kR2VzdHVyZX0gYmVjb21lcyBhIHNpbmdsZSB1bmRvIHN0ZXAsXG4gICAqIHdpdGhvdXQgZGVsYXlpbmcgYHJlZ2lvblVwZGF0ZSRgICh0b29scyByZW5kZXIgdGhyb3VnaCBpdCB3aGlsZSBkcmFnZ2luZykuXG4gICAqIENhbGxzIG5lc3QuIEEgZ2VzdHVyZSBuZXZlciBmb2xkcyBpbnRvIGFuIGVhcmxpZXIgdGltZWQgYnVyc3QuXG4gICAqL1xuICBiZWdpbkdlc3R1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5oaXN0b3J5LmJlZ2luR2VzdHVyZSgpO1xuICB9XG5cbiAgLyoqIEVuZCB0aGUgZ2VzdHVyZSBvcGVuZWQgYnkge0BsaW5rIGJlZ2luR2VzdHVyZX07IHRoZSBuZXh0IGNvbW1pdCBzdGFydHMgYSBuZXcgc3RlcC4gKi9cbiAgZW5kR2VzdHVyZSgpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvcnkuZW5kR2VzdHVyZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlZ2lvbiBzb3VyY2VzOiBsYXJnZSByZWdpb24gc2V0cywgdGlsZWQgYnkgbGV2ZWwgb2YgZGV0YWlsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBIb2xkIGEgbGFyZ2UgcmVnaW9uIHNldCBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UgaW5zdGVhZCBvZiBhcyByZWdpb25zOiB0aGUgYmFja2VuZHMgdGhhdFxuICAgKiBkcmF3IHNvdXJjZXMgKE9wZW5TZWFkcmFnb24sIG5hcGFyaSkgZHJhdyBpdHMgZmVhdHVyZXMgYXQgdGhlIGRldGFpbCB0aGUgem9vbSBzaG93cywgZnJvbVxuICAgKiB0aGUgdGlsZXMgaW4gdmlldywgYW5kIGEgZmVhdHVyZSBqb2lucyB0aGUgcmVnaW9ucyDigJQgZXhhY3RseSwgYXMgYW4gb3JkaW5hcnkgZWRpdGFibGVcbiAgICoge0BsaW5rIFJlZ2lvbn0gd2l0aCBpdHMge0BsaW5rIFJlZ2lvbi5zb3VyY2VJZH0g4oCUIG9ubHkgd2hlbiBpdCBpcyBzZWxlY3RlZCBvciBlZGl0ZWRcbiAgICogKHtAbGluayB0YWtlU291cmNlRmVhdHVyZXN9KS4gVW50aWwgdGhlbiB7QGxpbmsgZ2V0UmVnaW9uc30gZG9lcyBub3QgaW5jbHVkZSBpdC5cbiAgICpcbiAgICogYHNvdXJjZWAgbWF5IGJlIGFuIG9wZW5lciwgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93biAoYW5kIGFnYWluIGlmIHRoZVxuICAgKiBzb3VyY2Ugd2FzIGNsb3NlZCB0byBzYXZlIG1lbW9yeSkuIGBzbGljZXNgIHNheXMgd2hpY2ggc2xpY2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2UgaXRcbiAgICogc2VydmVzOiBvbmUgKGRlZmF1bHQ6IHRoZSBzbGljZSBzaG93bjsgcGxhbmUgMCBvZiB0aGUgc291cmNlKSwgb3IgYCdwbGFuZXMnYCwgZXZlcnkgc2xpY2UgelxuICAgKiBmcm9tIHBsYW5lIHogb2YgYSB6LWluZGV4ZWQgc291cmNlLiBSZXBsYWNlcyB0aGUgc291cmNlIHRob3NlIHNsaWNlcyBoYWQuXG4gICAqXG4gICAqIGBpbXBvcnRlZGAgbWFya3MgYSBzb3VyY2UgYnJvdWdodCBpbiBvdmVyIHRoZSBpbWFnZSAoYW4gaW1wb3J0ZWQgdm9sdW1lLCBmb2xkZXIgb3Igc2VydmVkIHNldClcbiAgICogcmF0aGVyIHRoYW4gdGhlIGltYWdlJ3Mgb3duIHJlZ2lvbnM6IGl0IGlzIG9uIG5vIGZpbGUgeWV0LCBzbyBhIHNhdmUgd3JpdGVzIGl0cyBzbGljZXMgdGhvdWdoXG4gICAqIG5vdGhpbmcgd2FzIHRha2VuIGZyb20gaXQg4oCUIGB0cnVlYCBmb3IgYSBzb3VyY2Ugb2Ygb25lIHNsaWNlLCB0aGUgc2xpY2VzIGl0cyBwbGFuZXMgY292ZXIgZm9yIGFcbiAgICogYCdwbGFuZXMnYCBzb3VyY2UuIFRoZSBpbWFnZSdzIG93biBzb3VyY2VzIGFyZSBub3QgbWFya2VkOiBsb2FkaW5nIHRoZW0gY2hhbmdlcyBub3RoaW5nIHRvIHNhdmUuXG4gICAqL1xuICBhdHRhY2hSZWdpb25Tb3VyY2UoXG4gICAgc291cmNlOiBSZWdpb25Tb3VyY2UgfCBSZWdpb25Tb3VyY2VPcGVuZXIsXG4gICAgc2xpY2VzOiBSZWdpb25Tb3VyY2VTbGljZXMgPSB7IHNsaWNlOiB0aGlzLnNvdXJjZVNsaWNlIH0sXG4gICAgaW1wb3J0ZWQ6IGJvb2xlYW4gfCByZWFkb25seSBudW1iZXJbXSA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuICAgIGNvbnN0IG9wZW46IFJlZ2lvblNvdXJjZU9wZW5lciA9IHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicgPyBzb3VyY2UgOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoc291cmNlKTtcbiAgICBjb25zdCBpbXBvcnRlZFNsaWNlcyA9XG4gICAgICBpbXBvcnRlZCA9PT0gZmFsc2UgPyBbXSA6IGltcG9ydGVkID09PSB0cnVlID8gKHNsaWNlcyA9PT0gJ3BsYW5lcycgPyBbXSA6IFtzbGljZXMuc2xpY2VdKSA6IGltcG9ydGVkO1xuICAgIHRoaXMuc291cmNlcy5hdHRhY2goaW1hZ2UsIG9wZW4sIHNsaWNlcywgaW1wb3J0ZWRTbGljZXMpO1xuICAgIHRoaXMuc291cmNlc1ZlcnNpb24rKztcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgY3VycmVudCBpbWFnZSdzIHJlZ2lvbiBzb3VyY2VzIChjbG9zaW5nIHRoZW0pIGFuZCB3aGF0IHdhcyB0YWtlbiBmcm9tIHRoZW0uICovXG4gIGRldGFjaFJlZ2lvblNvdXJjZXMoKTogdm9pZCB7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGlmICghaW1hZ2UpIHJldHVybjtcbiAgICB0aGlzLnNvdXJjZXMuZGV0YWNoSW1hZ2UoaW1hZ2UpO1xuICAgIHRoaXMuc291cmNlc1ZlcnNpb24rKztcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0aGUgc2xpY2UncyByZWdpb24gc291cmNlLCBmb3IgcmVnaW9ucyBpbXBvcnRlZCBpbiBwbGFjZSBvZiB0aGUgc2xpY2UncyAoYSBzbWFsbCBmaWxlXG4gICAqIHJlcGxhY2luZyBhIGxhcmdlIG9uZSk6IGEgc291cmNlIG9mIHRoZSBzbGljZSdzIG93biBpcyBkZXRhY2hlZDsgYSB6LWluZGV4ZWQgc291cmNlIG92ZXIgZXZlcnlcbiAgICogc2xpY2UgaGFzIHRoaXMgc2xpY2UncyBmZWF0dXJlcyB0YWtlbiBvdXQgKGFzIGRlbGV0ZWQpLiBUaGUgb3RoZXIgc2xpY2VzIGtlZXAgdGhlaXJzLlxuICAgKi9cbiAgYXN5bmMgZHJvcFNsaWNlUmVnaW9uU291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5zY29wZS5hY3RpdmVJbWFnZTtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMuc291cmNlU2xpY2U7XG4gICAgaWYgKCFpbWFnZSB8fCAhdGhpcy5zb3VyY2VzLmhhcyhpbWFnZSwgc2xpY2UpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc291cmNlcy5oYXNPd25Tb3VyY2UoaW1hZ2UsIHNsaWNlKSkge1xuICAgICAgdGhpcy5zb3VyY2VzLmRldGFjaFNsaWNlKGltYWdlLCBzbGljZSk7XG4gICAgICB0aGlzLnNvdXJjZXNWZXJzaW9uKys7XG4gICAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnNvdXJjZUdlbmVyYXRpb247XG4gICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCBzbGljZSk7XG4gICAgaWYgKCFiaW5kaW5nIHx8IGdlbmVyYXRpb24gIT09IHRoaXMuc291cmNlR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IGFsbCA9IGF3YWl0IGJpbmRpbmcuc291cmNlLmdldEluZGV4KGJpbmRpbmcucGxhbmUsIHtcbiAgICAgIG9mZnNldDogMCxcbiAgICAgIGxpbWl0OiBiaW5kaW5nLnNvdXJjZS5pbmZvLmZlYXR1cmVDb3VudCxcbiAgICB9KTtcbiAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5zb3VyY2VHZW5lcmF0aW9uKSByZXR1cm47XG4gICAgdGhpcy5zZXRUYWtlbihuZXcgU2V0KFsuLi50aGlzLmN1cnJlbnRUYWtlbigpLCAuLi5hbGwucm93cy5tYXAoKHIpID0+IHIuaWQpXSkpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNsaWNlIHNob3duIGhhcyBhIHJlZ2lvbiBzb3VyY2UuICovXG4gIGhhc1JlZ2lvblNvdXJjZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzLmhhcyh0aGlzLnNjb3BlLmFjdGl2ZUltYWdlLCB0aGlzLnNvdXJjZVNsaWNlKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2xpY2UncyByZWdpb24gc291cmNlIGFzIGEgc291cmNlIGxheWVyIGRyYXdzIGl0OyBudWxsIHdpdGhvdXQgb25lIChvciB1bnRpbCBpdCBvcGVucykuICovXG4gIGdldFJlZ2lvblNvdXJjZVZpZXcoKTogUmVnaW9uU291cmNlVmlldyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICB9XG5cbiAgLyoqIHtAbGluayBnZXRSZWdpb25Tb3VyY2VWaWV3fSBhbmQgZXZlcnkgY2hhbmdlIG9mIGl0IChzbGljZSwgdGFrZW4gaWRzLCBjbGFzcyBjb2xvdXJzKS4gKi9cbiAgZ2V0UmVnaW9uU291cmNlVmlldyQoKTogT2JzZXJ2YWJsZTxSZWdpb25Tb3VyY2VWaWV3IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2Ugc291cmNlIGZlYXR1cmVzIGludG8gdGhlIHdvcmtpbmcgc2V0IGZvciBlZGl0aW5nOiB0aGVpciBleGFjdCBnZW9tZXRyeSBiZWNvbWVzXG4gICAqIG9yZGluYXJ5IHJlZ2lvbnMgKG1pbnRlZCwgY29sb3VyZWQgYW5kIHNsaWNlLXRhZ2dlZCBhcyBhbnkgcmVnaW9uIGVudGVyaW5nIHRoZSBzdG9yZSkgYW5kXG4gICAqIHRoZSBzb3VyY2Ugc3RvcHMgZHJhd2luZyB0aGVtLiBOb3QgYW4gdW5kbyBzdGVwIG9mIGl0cyBvd24g4oCUIHVuZG9pbmcgcGFzdCBpdCBwdXRzIHRoZVxuICAgKiBmZWF0dXJlcyBiYWNrIGluIHRoZSBzb3VyY2UuIFJlc29sdmVzIHRoZSByZWdpb24gaWRzLCBpbiB0aGUgb3JkZXIgYXNrZWQgKGEgZmVhdHVyZSBhbHJlYWR5XG4gICAqIHRha2VuIHJlc29sdmVzIHRvIGl0cyByZWdpb24pOyBbXSB3aGVuIHRoZSBzbGljZSBjaGFuZ2VkIG1lYW53aGlsZS5cbiAgICovXG4gIGFzeW5jIHRha2VTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGlmICghdmlldyB8fCAhaWRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnNvdXJjZUdlbmVyYXRpb247XG4gICAgY29uc3Qgd2FudGVkID0gaWRzLmZpbHRlcigoaWQpID0+ICF2aWV3LnRha2VuLmhhcyhpZCkpO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gd2FudGVkLmxlbmd0aCA/IGF3YWl0IHZpZXcuc291cmNlLmdldEZlYXR1cmVzKHdhbnRlZCkgOiBbXTtcbiAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5zb3VyY2VHZW5lcmF0aW9uKSByZXR1cm4gW107XG4gICAgY29uc3QgdGFrZW4gPSB0aGlzLmN1cnJlbnRUYWtlbigpO1xuICAgIGNvbnN0IGZyZXNoID0gZmVhdHVyZXMuZmlsdGVyKChmKSA9PiAhdGFrZW4uaGFzKGYuaWQpKTtcbiAgICBpZiAoZnJlc2gubGVuZ3RoKSB7XG4gICAgICBjb25zdCByZWdpb25zID0gZnJlc2gubWFwKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlZ2lvbkZyb21HZW9Kc29uRmVhdHVyZShmLmZlYXR1cmUgYXMgR2VvSnNvbkZlYXR1cmUsIDAsIGYuaWQpO1xuICAgICAgICBpZiAodGhpcy5zY29wZS5zdGFja01vZGUpIHJlZ2lvbi56ID0gdGhpcy5zY29wZS5kaXNwbGF5U2xpY2U7XG4gICAgICAgIHJldHVybiByZWdpb247XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFkbWl0dGVkID0gdGhpcy5hZG1pdChyZWdpb25zKTtcbiAgICAgIC8vIEZyZXNoIGluc3RhbmNlcywgY29tcGxldGVkIGluIHBsYWNlOiBuYW1lZCBhZnRlciB0aGVpciBuZXcgaWQgbGlrZSBhIGRyYXduIHJlZ2lvbi5cbiAgICAgIGZvciAoY29uc3QgciBvZiBhZG1pdHRlZCkgci5uYW1lID0gYHNoYXBlJHtyLmlkfWA7XG4gICAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMuY29uY2F0KGFkbWl0dGVkKTtcbiAgICAgIHRoaXMuc2V0VGFrZW4obmV3IFNldChbLi4udGFrZW4sIC4uLmZyZXNoLm1hcCgoZikgPT4gZi5pZCldKSk7XG4gICAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmVtaXQoKTtcbiAgICB9XG4gICAgY29uc3QgYnlTb3VyY2UgPSBuZXcgTWFwKHRoaXMucmVnaW9ucy5maWx0ZXIoKHIpID0+IHIuc291cmNlSWQgIT09IHVuZGVmaW5lZCkubWFwKChyKSA9PiBbci5zb3VyY2VJZCwgci5pZF0pKTtcbiAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IGJ5U291cmNlLmdldChpZCkpLmZpbHRlcigoaWQpOiBpZCBpcyBudW1iZXIgPT4gaWQgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKioge0BsaW5rIHRha2VTb3VyY2VGZWF0dXJlc30sIHRoZW4gc2VsZWN0IHRoZW0gKGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24gd2l0aCBgYWRkaXRpdmVgKS4gKi9cbiAgYXN5bmMgc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmUgPSBmYWxzZSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB0YWtlbiA9IGF3YWl0IHRoaXMudGFrZVNvdXJjZUZlYXR1cmVzKGlkcyk7XG4gICAgaWYgKCF0YWtlbi5sZW5ndGgpIHJldHVybiB0YWtlbjtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKGFkZGl0aXZlID8gWy4uLm5ldyBTZXQoWy4uLnRoaXMuc2VsZWN0aW9uLmlkcywgLi4udGFrZW5dKV0gOiB0YWtlbik7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHRha2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZlYXR1cmVzIHBlciBjbGFzcyBzdGlsbCBpbiB0aGUgc2xpY2UncyByZWdpb24gc291cmNlIChub3QgdGFrZW4pOyB7fSB3aXRob3V0IG9uZS4gV2l0aFxuICAgKiBgc3RhY2tgLCBhIHotc3RhY2sncyBvdmVyIGV2ZXJ5IHNsaWNlOiBpdHMgc291cmNlJ3MgcGxhbmVzLCBvciBlYWNoIHNsaWNlJ3Mgc291cmNlIGFkZGVkIHVwLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2sgPSBmYWxzZSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5zY29wZS5hY3RpdmVJbWFnZTtcbiAgICBpZiAoIXN0YWNrIHx8ICF0aGlzLnNjb3BlLnN0YWNrTW9kZSkge1xuICAgICAgcmV0dXJuIHZpZXcgPyB2aWV3LnNvdXJjZS5nZXRDbGFzc0NvdW50cyh2aWV3LnBsYW5lLCBBcnJheS5mcm9tKHZpZXcudGFrZW4pKSA6IHt9O1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3VyY2VzLmhhc1BsYW5lc1NvdXJjZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IGJpbmRpbmcgPSBhd2FpdCB0aGlzLnNvdXJjZXMuYmluZGluZyhpbWFnZSwgdGhpcy5zb3VyY2VTbGljZSk7XG4gICAgICBpZiAoIWJpbmRpbmcpIHJldHVybiB7fTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBiaW5kaW5nLnNvdXJjZS5nZXRDbGFzc0NvdW50cyhudWxsLCB0aGlzLnNvdXJjZXMuYWxsVGFrZW4oaW1hZ2UpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBIHRpbGUgc2VydmVyIHRoYXQgcHJlZGF0ZXMgY291bnRpbmcgZXZlcnkgcGxhbmU6IHRoZSBzbGljZSdzIGNvdW50cy5cbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uc10gY291bGQgbm90IGNvdW50IHRoZSBjbGFzc2VzIG9mIGV2ZXJ5IHNsaWNlJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHZpZXcgPyB2aWV3LnNvdXJjZS5nZXRDbGFzc0NvdW50cyh2aWV3LnBsYW5lLCBBcnJheS5mcm9tKHZpZXcudGFrZW4pKSA6IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNsaWNlIG9mIHRoaXMuc291cmNlcy5zbGljZXNXaXRoU291cmNlKGltYWdlKSkge1xuICAgICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCBzbGljZSk7XG4gICAgICBpZiAoIWJpbmRpbmcpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgb3duID0gYXdhaXQgYmluZGluZy5zb3VyY2UuZ2V0Q2xhc3NDb3VudHMoYmluZGluZy5wbGFuZSwgQXJyYXkuZnJvbSh0aGlzLnNvdXJjZXMudGFrZW4oaW1hZ2UsIHNsaWNlKSkpO1xuICAgICAgZm9yIChjb25zdCBbbGFiZWwsIG5dIG9mIE9iamVjdC5lbnRyaWVzKG93bikpIGNvdW50c1tsYWJlbF0gPSAoY291bnRzW2xhYmVsXSA/PyAwKSArIG47XG4gICAgfVxuICAgIHJldHVybiBjb3VudHM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGV2ZXJ5IHJlZ2lvbiBvZiB0aGVzZSBjbGFzc2VzIG9uIHRoZSBzbGljZSDigJQgdGhlIHJlZ2lvbnMnLCBhbmQgdGhlIHJlZ2lvbiBzb3VyY2UncyxcbiAgICogd2hpY2ggYXJlIHRha2VuIGludG8gdGhlIHJlZ2lvbnMgKGF0IG1vc3Qge0BsaW5rIFNFTEVDVF9DTEFTU0VTX0xJTUlUfSBvZiB0aGVtKS4gQWRkZWQgdG8gdGhlXG4gICAqIHNlbGVjdGlvbiB3aXRoIGBhZGRpdGl2ZWAuIFRoZSBzZWxlY3Rpb24gaG9sZHMgdGhlIGNsYXNzZXMgdG9vIChzZWUge0BsaW5rIGdldFBpY2tlZENsYXNzZXN9KS5cbiAgICogUmVzb2x2ZXMgdGhlIHNlbGVjdGVkIHJlZ2lvbiBpZHMuXG4gICAqL1xuICBhc3luYyBzZWxlY3RDbGFzc2VzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZSA9IGZhbHNlKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdhbnRlZCA9IG5ldyBTZXQoY2xhc3Nlcyk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldyQudmFsdWU7XG4gICAgaWYgKHZpZXcgJiYgY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB2aWV3LnNvdXJjZS5nZXRJbmRleCh2aWV3LnBsYW5lLCB7XG4gICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgbGltaXQ6IFNFTEVDVF9DTEFTU0VTX0xJTUlULFxuICAgICAgICBjbGFzc2VzLFxuICAgICAgICBleGNsdWRlOiBBcnJheS5mcm9tKHZpZXcudGFrZW4pLFxuICAgICAgfSk7XG4gICAgICBpZiAocGFnZS5yb3dzLmxlbmd0aCkgYXdhaXQgdGhpcy50YWtlU291cmNlRmVhdHVyZXMocGFnZS5yb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIH1cbiAgICBjb25zdCBpZHMgPSB0aGlzLnJlZ2lvbnMuZmlsdGVyKChyKSA9PiAhci5pc1Byb2ZpbGU/LigpICYmIHIubGFiZWwgJiYgd2FudGVkLmhhcyhyLmxhYmVsKSkubWFwKChyKSA9PiByLmlkKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKFxuICAgICAgYWRkaXRpdmUgPyBbLi4ubmV3IFNldChbLi4udGhpcy5zZWxlY3Rpb24uaWRzLCAuLi5pZHNdKV0gOiBpZHMsXG4gICAgICBhZGRpdGl2ZSA/IFsuLi5uZXcgU2V0KFsuLi50aGlzLnNlbGVjdGlvbi5jbGFzc2VzLCAuLi5jbGFzc2VzXSldIDogY2xhc3NlcyxcbiAgICApO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHJldHVybiBpZHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsYXNzZXMgdGhlIHNlbGVjdGlvbiB3YXMgcGlja2VkIGFzIGJ5IHtAbGluayBzZWxlY3RDbGFzc2VzfSAoYSBjbGFzcyB0cmVlIG5vZGUgd2l0aCBpdHNcbiAgICogc3ViY2xhc3NlcywgYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpOyBbXSBvbmNlIGFueXRoaW5nIGVsc2Ugc2VsZWN0ZWQuIEVhY2ggaXMgYSB2b2x1bWUgdGhyb3VnaFxuICAgKiB0aGUgd2hvbGUgc3RhY2ssIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBhIHJlZ2lvbiBvbiB0aGUgc2xpY2UuXG4gICAqL1xuICBnZXRQaWNrZWRDbGFzc2VzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uY2xhc3NlcztcbiAgfVxuXG4gIGdldFBpY2tlZENsYXNzZXMkKCk6IE9ic2VydmFibGU8cmVhZG9ubHkgc3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uY2xhc3NlcyQ7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgc2xpY2UncyBleGFjdCBvdXRsaW5lcyBvZiB0aGVzZSBjbGFzc2VzLCB0aGUgcmVnaW9uIHNvdXJjZXMnIGFuZCB0aGUgcmVnaW9ucycgKGFzIHRoZVxuICAgKiAzRCByZWNvbnN0cnVjdGlvbiByZWFkcyB0aGVtIGF0IHRoZSBzdGFjaydzIG93biByZXNvbHV0aW9uKTogd2hhdCBpcyBpbnNpZGUgdGhlaXIgdm9sdW1lLlxuICAgKi9cbiAgY2xhc3NTbGljZU91dGxpbmVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxTbGljZU91dGxpbmVzW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc091dGxpbmVzKGNsYXNzZXMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAzRCByZWNvbnN0cnVjdGlvbiBvZiBlYWNoIGdyb3VwIG9mIGNsYXNzZXMgb3ZlciBldmVyeSBzbGljZSBvZiB0aGUgc3RhY2sgKGFuIGF0bGFzXG4gICAqIHN0cnVjdHVyZSB3aXRoIGl0cyBzdWJzdHJ1Y3R1cmVzLCBzYXkpOiB0aGUgb3V0bGluZXMgb2YgdGhlIHJlZ2lvbnMgb2YgdGhvc2UgY2xhc3NlcyBvbiBldmVyeVxuICAgKiBzbGljZSDigJQgdGhlIHJlZ2lvbiBzb3VyY2VzJyBhbmQgdGhvc2UgZHJhd24gb3IgdGFrZW4g4oCUIHN0YWNrZWQgYW5kIG1lc2hlZCBpbiBhIHdvcmtlci4gTWVzaGVzXG4gICAqIGFyZSBpbiBpbWFnZSBweCAoeCwgeSkgYW5kIHNsaWNlIGluZGljZXMgKHopLiBgcGl4ZWxTdGVwYCBpcyB0aGUgaW4tcGxhbmUgdm94ZWwgc2l6ZSAoaW1hZ2VcbiAgICogcHgpOyB0aGUgb3V0bGluZXMgYXJlIHJlYWQgYXQgdGhlIG1hdGNoaW5nIGxldmVsIG9mIGRldGFpbC4gQSBncm91cCB3aXRoIG5vIG91dGxpbmUgZ2V0cyBhblxuICAgKiBlbXB0eSBtZXNoLlxuICAgKi9cbiAgYXN5bmMgcmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9PixcbiAgICBwaXhlbFN0ZXAgPSAxLFxuICApOiBQcm9taXNlPEFycmF5PHsga2V5OiBzdHJpbmc7IG1lc2g6IE1lc2ggfT4+IHtcbiAgICBjb25zdCBsZXZlbCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGgubWF4KDEsIHBpeGVsU3RlcCkpKSk7XG4gICAgY29uc3Qgb3V0OiBBcnJheTx7IGtleTogc3RyaW5nOyBtZXNoOiBNZXNoIH0+ID0gW107XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgIGNvbnN0IHNsaWNlcyA9IGF3YWl0IHRoaXMuY2xhc3NPdXRsaW5lcyhncm91cC5jbGFzc2VzLCBsZXZlbCk7XG4gICAgICBvdXQucHVzaCh7IGtleTogZ3JvdXAua2V5LCBtZXNoOiBhd2FpdCByZWNvbnN0cnVjdEluV29ya2VyKHNsaWNlcywgeyBwaXhlbFN0ZXAgfSkgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogRWFjaCBjbGFzcydzIHZvbHVtZSBvdmVyIHRoZSB3aG9sZSBzdGFjaywgaW4gcHjCsiDDlyBzbGljZXM6IGl0cyBvdXRsaW5lcycgYXJlYSBvbiBldmVyeSBzbGljZVxuICAgKiAoaXRzIGZlYXR1cmVzJyB1bmlvbiwgc2VlIGBvdXRsaW5lc0FyZWFgKSwgb25lIHNsaWNlIHRoaWNrIChDYXZhbGllcmkncyBlc3RpbWF0b3IpLCBmcm9tIHRoZVxuICAgKiBleGFjdCBvdXRsaW5lcy4gV2hlcmUgYSBmZWF0dXJlIGlzLCBhIHJlZ2lvbiBzb3VyY2UncyBvciBhIGRyYXduIG9yIHRha2VuIHJlZ2lvbiwgZG9lcyBub3RcbiAgICogY2hhbmdlIGl0OiB0YWtpbmcgb25lIGxlYXZlcyB0aGUgdm9sdW1lIGFzIGl0IHdhcy4gVGhlIHJlZ2lvbiBzb3VyY2VzJyBwYXJ0IGlzIGNhY2hlZCB1bnRpbFxuICAgKiB3aGF0IHRoZXkgaG9sZCBjaGFuZ2VzIChhIGZlYXR1cmUgdGFrZW4gb3IgZGVsZXRlZCwgYW5vdGhlciBzb3VyY2UpOyBvbmx5IHRoZSBzbGljZXMgd2l0aFxuICAgKiBkcmF3biBvciB0YWtlbiByZWdpb25zIG9mIHRoZSBjbGFzcyBhcmUgbWVhc3VyZWQgYWdhaW4uXG4gICAqL1xuICBhc3luYyBjbGFzc1ZvbHVtZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc291cmNlU3RhdGVLZXkoKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLm5ldyBTZXQoY2xhc3NlcyldLm1hcChhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLnNvdXJjZVZvbHVtZShzdGF0ZSwgbmFtZSk7XG4gICAgICAgIGxldCB2b2x1bWUgPSBzb3VyY2UudG90YWw7XG4gICAgICAgIGZvciAoY29uc3QgcmVnaW9ucyBvZiBtZXJnZU91dGxpbmVzKHRoaXMucmVnaW9uT3V0bGluZXMoW25hbWVdKSkpIHtcbiAgICAgICAgICBjb25zdCB1bmRlciA9IHNvdXJjZS5zbGljZXMuZ2V0KHJlZ2lvbnMueik7XG4gICAgICAgICAgY29uc3QgW2JvdGhdID0gdW5kZXIgPyBtZXJnZU91dGxpbmVzKFt1bmRlci5vdXRsaW5lcywgcmVnaW9uc10pIDogW3JlZ2lvbnNdO1xuICAgICAgICAgIHZvbHVtZSArPSBvdXRsaW5lc0FyZWEoYm90aC5yaW5ncywgYm90aC5yaW5nR3JvdXBzKSAtICh1bmRlcj8uYXJlYSA/PyAwKTtcbiAgICAgICAgfVxuICAgICAgICBvdXQuc2V0KG5hbWUsIHZvbHVtZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbiBzb3VyY2VzJyBwYXJ0IG9mIGEgY2xhc3MncyB2b2x1bWUsIGNhY2hlZCBieSB3aGF0IHRoZXkgaG9sZCAoc2VlIGNsYXNzVm9sdW1lcykuICovXG4gIHByaXZhdGUgc291cmNlVm9sdW1lKHN0YXRlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8U291cmNlVm9sdW1lPiB7XG4gICAgY29uc3Qga2V5ID0gYCR7c3RhdGV9XFxuJHtuYW1lfWA7XG4gICAgbGV0IHNvdXJjZSA9IHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKHNvdXJjZSkge1xuICAgICAgLy8gTW9zdCByZWNlbnRseSB1c2VkIGxhc3QuXG4gICAgICB0aGlzLnNvdXJjZVZvbHVtZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5zb3VyY2VWb2x1bWVDYWNoZS5zZXQoa2V5LCBzb3VyY2UpO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgc291cmNlID0gdGhpcy5zb3VyY2VPdXRsaW5lcyhbbmFtZV0sIDApLnRoZW4oKHBhcnRzKSA9PiB7XG4gICAgICBjb25zdCBzbGljZXMgPSBuZXcgTWFwPG51bWJlciwgeyBhcmVhOiBudW1iZXI7IG91dGxpbmVzOiBTbGljZU91dGxpbmVzIH0+KCk7XG4gICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgZm9yIChjb25zdCBvdXRsaW5lcyBvZiBtZXJnZU91dGxpbmVzKHBhcnRzKSkge1xuICAgICAgICBjb25zdCBhcmVhID0gb3V0bGluZXNBcmVhKG91dGxpbmVzLnJpbmdzLCBvdXRsaW5lcy5yaW5nR3JvdXBzKTtcbiAgICAgICAgc2xpY2VzLnNldChvdXRsaW5lcy56LCB7IGFyZWEsIG91dGxpbmVzIH0pO1xuICAgICAgICB0b3RhbCArPSBhcmVhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdG90YWwsIHNsaWNlcyB9O1xuICAgIH0pO1xuICAgIHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuc2V0KGtleSwgc291cmNlKTtcbiAgICBzb3VyY2UuY2F0Y2goKCkgPT4gdGhpcy5zb3VyY2VWb2x1bWVDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgd2hpbGUgKHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuc2l6ZSA+IFNPVVJDRV9WT0xVTUVfQ0FDSEVfU0laRSkge1xuICAgICAgdGhpcy5zb3VyY2VWb2x1bWVDYWNoZS5kZWxldGUodGhpcy5zb3VyY2VWb2x1bWVDYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgc2xpY2UncyBvdXRsaW5lcyBvZiB0aGVzZSBjbGFzc2VzLCB0aGUgcmVnaW9uIHNvdXJjZXMnIHRoZW4gdGhlIHJlZ2lvbnMnOiBjbG9zZWQgc2hhcGVzJ1xuICAgKiByaW5ncywgYW5kIG9wZW4gcG9seWxpbmVzIGFzIGBsaW5lc2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsYXNzT3V0bGluZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGxldmVsOiBudW1iZXIpOiBQcm9taXNlPFNsaWNlT3V0bGluZXNbXT4ge1xuICAgIHJldHVybiBtZXJnZU91dGxpbmVzKFsuLi4oYXdhaXQgdGhpcy5zb3VyY2VPdXRsaW5lcyhjbGFzc2VzLCBsZXZlbCkpLCAuLi50aGlzLnJlZ2lvbk91dGxpbmVzKGNsYXNzZXMpXSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiBzb3VyY2VzJyBvdXRsaW5lcyBvZiB0aGVzZSBjbGFzc2VzIG9uIGV2ZXJ5IHNsaWNlLCB3aXRob3V0IHRoZSBmZWF0dXJlcyB0YWtlbiBvclxuICAgKiBkZWxldGVkLiBUaGUgbGFzdCBmZXcgY2xhc3Mgc2V0cyBhcmUga2VwdCB1bnRpbCB3aGF0IHRoZSBzb3VyY2VzIGhvbGQgY2hhbmdlczogcmVidWlsZGluZyBhXG4gICAqIHN1cmZhY2UgYWZ0ZXIgYW4gZWRpdCByZWFkcyBub3RoaW5nIGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBzb3VyY2VPdXRsaW5lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsIGxldmVsOiBudW1iZXIpOiBQcm9taXNlPExhYmVsbGVkT3V0bGluZXNbXT4ge1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuc291cmNlU3RhdGVLZXkoKX1cXG4ke2xldmVsfVxcbiR7Y2xhc3NlcyA/IGNsYXNzZXMuam9pbignXFxuJykgOiAnKid9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNvdXJjZU91dGxpbmVDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAvLyBNb3N0IHJlY2VudGx5IHVzZWQgbGFzdC5cbiAgICAgIHRoaXMuc291cmNlT3V0bGluZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUuc2V0KGtleSwgY2FjaGVkKTtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlYWQgPSB0aGlzLnJlYWRTb3VyY2VPdXRsaW5lcyhjbGFzc2VzLCBsZXZlbCk7XG4gICAgdGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUuc2V0KGtleSwgcmVhZCk7XG4gICAgcmVhZC5jYXRjaCgoKSA9PiB0aGlzLnNvdXJjZU91dGxpbmVDYWNoZS5kZWxldGUoa2V5KSk7XG4gICAgd2hpbGUgKHRoaXMuc291cmNlT3V0bGluZUNhY2hlLnNpemUgPiBTT1VSQ0VfT1VUTElORV9DQUNIRV9TSVpFKSB7XG4gICAgICB0aGlzLnNvdXJjZU91dGxpbmVDYWNoZS5kZWxldGUodGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZFNvdXJjZU91dGxpbmVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCwgbGV2ZWw6IG51bWJlcik6IFByb21pc2U8TGFiZWxsZWRPdXRsaW5lc1tdPiB7XG4gICAgY29uc3Qgb3V0OiBMYWJlbGxlZE91dGxpbmVzW10gPSBbXTtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgaWYgKHRoaXMuc291cmNlcy5oYXNQbGFuZXNTb3VyY2UoaW1hZ2UpKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIHRoaXMuc291cmNlU2xpY2UpO1xuICAgICAgY29uc3Qgb3V0bGluZXMgPSBhd2FpdCBiaW5kaW5nPy5zb3VyY2UuZ2V0Q2xhc3NPdXRsaW5lcyhjbGFzc2VzLCBsZXZlbCwgdGhpcy5zb3VyY2VzLmFsbFRha2VuKGltYWdlKSk7XG4gICAgICBvdXQucHVzaCguLi4ob3V0bGluZXMgPz8gW10pKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB6IG9mIHRoaXMuc291cmNlcy5zbGljZXNXaXRoU291cmNlKGltYWdlKSkge1xuICAgICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCB6KTtcbiAgICAgIGlmICghYmluZGluZykgY29udGludWU7XG4gICAgICBjb25zdCBvdXRsaW5lcyA9IGF3YWl0IGJpbmRpbmcuc291cmNlLmdldENsYXNzT3V0bGluZXMoXG4gICAgICAgIGNsYXNzZXMsXG4gICAgICAgIGxldmVsLFxuICAgICAgICBBcnJheS5mcm9tKHRoaXMuc291cmNlcy50YWtlbihpbWFnZSwgeikpLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcyBvZiBvdXRsaW5lcykgaWYgKHMueiA9PT0gYmluZGluZy5wbGFuZSkgb3V0LnB1c2goeyAuLi5zLCB6IH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGNsYXNzJ3Mgb3V0bGluZXMgb24gZXZlcnkgc2xpY2UsIGJ5IGNsYXNzOiB0aGUgcmVnaW9uIHNvdXJjZXMnIChvbmUgcmVhZCBmb3IgYWxsLCBrZXB0XG4gICAqIGxpa2Uge0BsaW5rIHNvdXJjZU91dGxpbmVzfSkgYW5kIHRoZSBkcmF3biBhbmQgdGFrZW4gcmVnaW9ucycuIFdoYXQgYSBzZWN0aW9uIHRocm91Z2ggdGhlXG4gICAqIHN0YWNrIGN1dHMgKHNlZSBgZ2VvbWV0cnkvc2VjdGlvbmApLlxuICAgKi9cbiAgYXN5bmMgb3V0bGluZXNCeUNsYXNzKGxldmVsOiBudW1iZXIpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFNsaWNlT3V0bGluZXNbXT4+IHtcbiAgICBjb25zdCBieUNsYXNzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxudW1iZXIsIFNsaWNlUGFydHM+PigpO1xuICAgIGNvbnN0IHNsb3QgPSAobGFiZWw6IHN0cmluZywgejogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgc2xpY2VzID0gYnlDbGFzcy5nZXQobGFiZWwpO1xuICAgICAgaWYgKCFzbGljZXMpIGJ5Q2xhc3Muc2V0KGxhYmVsLCAoc2xpY2VzID0gbmV3IE1hcCgpKSk7XG4gICAgICBsZXQgc2xpY2UgPSBzbGljZXMuZ2V0KHopO1xuICAgICAgaWYgKCFzbGljZSkgc2xpY2VzLnNldCh6LCAoc2xpY2UgPSB7IHJpbmdzOiBbXSwgcmluZ0dyb3VwczogW10sIGxpbmVzOiBbXSB9KSk7XG4gICAgICByZXR1cm4gc2xpY2U7XG4gICAgfTtcbiAgICBjb25zdCBuZXh0UGFydCA9IGZlYXR1cmVJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHMgb2YgYXdhaXQgdGhpcy5zb3VyY2VPdXRsaW5lcyhudWxsLCBsZXZlbCkpIHtcbiAgICAgIGNvbnN0IGlkID0gbmV4dFBhcnQoKTtcbiAgICAgIHMucmluZ3MuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHMucmluZ0xhYmVscz8uW2ldO1xuICAgICAgICBpZiAoIWxhYmVsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNsaWNlID0gc2xvdChsYWJlbCwgcy56KTtcbiAgICAgICAgc2xpY2UucmluZ3MucHVzaChyKTtcbiAgICAgICAgc2xpY2UucmluZ0dyb3Vwcy5wdXNoKGlkKHMucmluZ0dyb3Vwcz8uW2ldKSk7XG4gICAgICB9KTtcbiAgICAgIChzLmxpbmVzID8/IFtdKS5mb3JFYWNoKChsLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gcy5saW5lTGFiZWxzPy5baV07XG4gICAgICAgIGlmIChsYWJlbCkgc2xvdChsYWJlbCwgcy56KS5saW5lcy5wdXNoKGwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBsYWJlbCwgb3V0bGluZXMgfSBvZiB0aGlzLmxhYmVsbGVkUmVnaW9uT3V0bGluZXMobnVsbCkpIHtcbiAgICAgIC8vIEEgcmVnaW9uIGlzIG9uZSBmZWF0dXJlLlxuICAgICAgY29uc3QgaWQgPSBuZXh0UGFydCgpKHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBzbGljZSA9IHNsb3QobGFiZWwsIG91dGxpbmVzLnopO1xuICAgICAgc2xpY2UucmluZ3MucHVzaCguLi5vdXRsaW5lcy5yaW5ncyk7XG4gICAgICBzbGljZS5yaW5nR3JvdXBzLnB1c2goLi4ub3V0bGluZXMucmluZ3MubWFwKCgpID0+IGlkKSk7XG4gICAgICBzbGljZS5saW5lcy5wdXNoKC4uLihvdXRsaW5lcy5saW5lcyA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgIEFycmF5LmZyb20oYnlDbGFzcywgKFtsYWJlbCwgc2xpY2VzXSkgPT4gW2xhYmVsLCBBcnJheS5mcm9tKHNsaWNlcywgKFt6LCBzXSkgPT4gc2xpY2VPdXRsaW5lcyh6LCBzKSldKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBkcmF3biBhbmQgdGFrZW4gcmVnaW9ucycgb3V0bGluZXMgb2YgdGhlc2UgY2xhc3NlcywgYnkgc2xpY2UuICovXG4gIHByaXZhdGUgcmVnaW9uT3V0bGluZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10pOiBTbGljZU91dGxpbmVzW10ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsbGVkUmVnaW9uT3V0bGluZXMobmV3IFNldChjbGFzc2VzKSkubWFwKChvKSA9PiBvLm91dGxpbmVzKTtcbiAgfVxuXG4gIC8qKiBFYWNoIGRyYXduIG9yIHRha2VuIHJlZ2lvbidzIG91dGxpbmVzIChvZiB0aGUgYHdhbnRlZGAgY2xhc3NlczsgbnVsbDogZXZlcnkgY2xhc3MpIHdpdGggaXRzIGNsYXNzLiAqL1xuICBwcml2YXRlIGxhYmVsbGVkUmVnaW9uT3V0bGluZXMoXG4gICAgd2FudGVkOiBSZWFkb25seVNldDxzdHJpbmc+IHwgbnVsbCxcbiAgKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyBvdXRsaW5lczogU2xpY2VPdXRsaW5lcyB9PiB7XG4gICAgY29uc3Qgb3V0OiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IG91dGxpbmVzOiBTbGljZU91dGxpbmVzIH0+ID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGUuc3RhY2tNb2RlID8gdGhpcy5nZXRTbGljZVJlZ2lvbnMoKSA6IHRoaXMucmVnaW9ucykge1xuICAgICAgaWYgKHIuaXNQcm9maWxlPy4oKSB8fCAhci5sYWJlbCB8fCAod2FudGVkICYmICF3YW50ZWQuaGFzKHIubGFiZWwpKSkgY29udGludWU7XG4gICAgICBjb25zdCByaW5nczogRmxvYXQ2NEFycmF5W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiByZWdpb25Qb2x5Z29ucyhyKSkge1xuICAgICAgICByaW5ncy5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKHAueHBvaW50cy5mbGF0TWFwKCh4LCBpKSA9PiBbeCwgcC55cG9pbnRzW2ldXSkpKTtcbiAgICAgICAgZm9yIChjb25zdCBob2xlIG9mIHAuaG9sZXMgPz8gW10pIHJpbmdzLnB1c2goRmxvYXQ2NEFycmF5LmZyb20oaG9sZS5mbGF0KCkpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxpbmVzID0gcmVnaW9uUG9seWxpbmVzKHIpO1xuICAgICAgb3V0LnB1c2goeyBsYWJlbDogci5sYWJlbCwgb3V0bGluZXM6IHsgejogci56ID8/IDAsIHJpbmdzLCAuLi4obGluZXMubGVuZ3RoID8geyBsaW5lcyB9IDoge30pIH0gfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogV2hhdCB0aGUgcmVnaW9uIHNvdXJjZXMgb2YgdGhlIGltYWdlIGhvbGQgKHNlZSB7QGxpbmsgc291cmNlU3RhdGVLZXl9KTogaXQgY2hhbmdlcyB3aGVuIGFcbiAgICogIGZlYXR1cmUgaXMgdGFrZW4gb3IgZGVsZXRlZCwgb3IgdGhhdCBpcyB1bmRvbmUuICovXG4gIGdldFNvdXJjZVN0YXRlS2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlU3RhdGVLZXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSByZWdpb24gc291cmNlcyBvZiB0aGUgaW1hZ2UgaG9sZDogdGhlIGltYWdlLCBpdHMgc291cmNlcyAob25lIGF0dGFjaGVkIG9yIGRyb3BwZWRcbiAgICogYnVtcHMgdGhlIHZlcnNpb24pIGFuZCB0aGUgZmVhdHVyZXMgdGFrZW4gZnJvbSB0aGVtLiBBIGtleSBmb3Igd2hhdCBpcyByZWFkIGZyb20gdGhlbS5cbiAgICovXG4gIHByaXZhdGUgc291cmNlU3RhdGVLZXkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgbGV0IHRha2VuID0gMjE2NjEzNjI2MTtcbiAgICBmb3IgKGNvbnN0IHogb2YgdGhpcy5zb3VyY2VzLnNsaWNlc1dpdGhUYWtlbihpbWFnZSkpIHtcbiAgICAgIGZvciAoY29uc3QgaWQgb2YgWy4uLnRoaXMuc291cmNlcy50YWtlbihpbWFnZSwgeildLnNvcnQoKSkge1xuICAgICAgICBjb25zdCBzID0gYCR7en06JHtpZH07YDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB0YWtlbiA9IE1hdGguaW11bCh0YWtlbiBeIHMuY2hhckNvZGVBdChpKSwgMTY3Nzc2MTkpID4+PiAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7aW1hZ2V9XFxuJHt0aGlzLnNvdXJjZXNWZXJzaW9ufVxcbiR7dGFrZW59YDtcbiAgfVxuXG4gIC8qKiBEZWxldGUgc291cmNlIGZlYXR1cmVzIHdpdGhvdXQgdGFraW5nIHRoZW0gKG9uZSB1bmRvIHN0ZXApLiAqL1xuICBkZWxldGVTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgdGFrZW4gPSB0aGlzLmN1cnJlbnRUYWtlbigpO1xuICAgIGNvbnN0IGRyb3AgPSBpZHMuZmlsdGVyKChpZCkgPT4gIXRha2VuLmhhcyhpZCkpO1xuICAgIGlmICghZHJvcC5sZW5ndGggfHwgIXRoaXMuc291cmNlVmlldyQudmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHRoaXMuc2V0VGFrZW4obmV3IFNldChbLi4udGFrZW4sIC4uLmRyb3BdKSk7XG4gICAgdGhpcy5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogQSBwYWdlIG9mIHRoZSBzbGljZSBzb3VyY2UncyBmZWF0dXJlcyBub3QgdGFrZW4gZnJvbSBpdCAoZmlsZSBvcmRlciksIGUuZy4gZm9yIHRoZSBSZWdpb25cbiAgICogRWRpdG9yJ3MgbGlzdDsgYW4gZW1wdHkgcGFnZSB3aXRob3V0IGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVnaW9uU291cmNlSW5kZXgocXVlcnk6IE9taXQ8UmVnaW9uSW5kZXhRdWVyeSwgJ2V4Y2x1ZGUnPik6IFByb21pc2U8UmVnaW9uSW5kZXhQYWdlPiB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldyQudmFsdWU7XG4gICAgaWYgKCF2aWV3KSByZXR1cm4geyB0b3RhbDogMCwgcm93czogW10gfTtcbiAgICByZXR1cm4gdmlldy5zb3VyY2UuZ2V0SW5kZXgodmlldy5wbGFuZSwgeyAuLi5xdWVyeSwgZXhjbHVkZTogQXJyYXkuZnJvbSh2aWV3LnRha2VuKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgcmVnaW9uc2AgYXMgYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uIHN0cmluZyBtZXJnZWQgd2l0aCB0aGUgcmVnaW9uIHNvdXJjZXMgYmVoaW5kIHRoZW06XG4gICAqIHRoZSBzb3VyY2VzJyBmZWF0dXJlcyB0aGF0IHdlcmUgbm90IHRha2VuIChvciBkZWxldGVkKSwgdGhlbiBgcmVnaW9uc2AuIFdpdGhvdXQgYSBzb3VyY2UsXG4gICAqIHtAbGluayBnZXRHZW9Kc29uU3RyaW5nfS5cbiAgICpcbiAgICogYHNsaWNlYCBuYW1lcyBvbmUgc2xpY2UtZmlsZSBvZiBhIGZvbGRlciBzdGFjayAoYSBwZXItc2xpY2UtZmlsZSBzYXZlKTogaXRzIHNvdXJjZSdzIGZlYXR1cmVzLFxuICAgKiBvbiB0aGUgZmlsZSdzIG93biBwbGFuZSDigJQgb2YgYSB6LWluZGV4ZWQgc291cmNlIG92ZXIgZXZlcnkgc2xpY2UsIG9ubHkgdGhhdCBzbGljZSdzIHBsYW5lLlxuICAgKiBXaXRob3V0IGl0LCB0aGUgZXhwb3J0IGlzIHRoZSBpbWFnZSdzOiBvbiBhIHN0YWNrIHNhdmVkIGFzIG9uZSBmaWxlLCBldmVyeSBzbGljZSdzIHNvdXJjZVxuICAgKiAoZWFjaCBmZWF0dXJlIG9uIGl0cyBzbGljZSdzIHBsYW5lLCBgZ2VvbWV0cnkucGxhbmUuemApIGFuZCBhIHotaW5kZXhlZCBzb3VyY2UncyBldmVyeSBwbGFuZTtcbiAgICogb3RoZXJ3aXNlIHRoZSBzb3VyY2Ugb2YgdGhlIHNsaWNlIHNob3duLlxuICAgKi9cbiAgYXN5bmMgZ2V0R2VvSnNvbldpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgY29uc3QgcGxhbmVzID0gdGhpcy5zY29wZS5zdGFja01vZGUgJiYgdGhpcy5zb3VyY2VzLmhhc1BsYW5lc1NvdXJjZShpbWFnZSk7XG4gICAgY29uc3QgZmVhdHVyZXMgPSByZWdpb25zXG4gICAgICAuZmlsdGVyKChyKSA9PiAhci5pc1Byb2ZpbGU/LigpKVxuICAgICAgLm1hcCgocikgPT4gZmVhdHVyZUZyb21SZWdpb24ocikpXG4gICAgICAuZmlsdGVyKChmKTogZiBpcyBvYmplY3QgPT4gISFmKTtcbiAgICBpZiAoc2xpY2UgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjb3BlLnN0YWNrTW9kZSAmJiB0aGlzLnNjb3BlLnNhdmVMYXlvdXQgPT09ICdjb21iaW5lZCcgJiYgIXBsYW5lcykge1xuICAgICAgY29uc3Qgc2xpY2VkID0gdGhpcy5zb3VyY2VzLnNsaWNlc1dpdGhTb3VyY2UoaW1hZ2UpO1xuICAgICAgaWYgKHNsaWNlZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgc291cmNlRmVhdHVyZXM6IG9iamVjdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeiBvZiBzbGljZWQpIHtcbiAgICAgICAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIHopO1xuICAgICAgICAgIGlmICghYmluZGluZykgY29udGludWU7XG4gICAgICAgICAgY29uc3QgZXhwb3J0ZWQgPSBhd2FpdCBiaW5kaW5nLnNvdXJjZS5leHBvcnRHZW9Kc29uKEFycmF5LmZyb20odGhpcy5zb3VyY2VzLnRha2VuKGltYWdlLCB6KSksIFtdKTtcbiAgICAgICAgICBzb3VyY2VGZWF0dXJlcy5wdXNoKC4uLm9uUGxhbmUocGxhbmVGZWF0dXJlcyhleHBvcnRlZCwgYmluZGluZy5wbGFuZSksIHopKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLCBmZWF0dXJlczogWy4uLnNvdXJjZUZlYXR1cmVzLCAuLi5mZWF0dXJlc10gfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gc2xpY2UgPz8gdGhpcy5zb3VyY2VTbGljZTtcbiAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIGF0KTtcbiAgICBpZiAoIWJpbmRpbmcpIHJldHVybiByZWdpb25zVG9HZW9Kc29uKHJlZ2lvbnMpO1xuICAgIGlmIChwbGFuZXMgJiYgc2xpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIHNsaWNlLWZpbGUgb2YgYSB6LWluZGV4ZWQgc291cmNlOiB0aGF0IHNsaWNlJ3MgcGxhbmUsIHdyaXR0ZW4gb24gdGhlIGZpbGUncyBwbGFuZSAwLlxuICAgICAgY29uc3QgZXhwb3J0ZWQgPSBhd2FpdCBiaW5kaW5nLnNvdXJjZS5leHBvcnRHZW9Kc29uKHRoaXMuc291cmNlcy5hbGxUYWtlbihpbWFnZSksIFtdKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgIGZlYXR1cmVzOiBbLi4ub25QbGFuZShwbGFuZUZlYXR1cmVzKGV4cG9ydGVkLCBiaW5kaW5nLnBsYW5lKSwgMCksIC4uLmZlYXR1cmVzXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlID0gcGxhbmVzID8gdGhpcy5zb3VyY2VzLmFsbFRha2VuKGltYWdlKSA6IEFycmF5LmZyb20odGhpcy5zb3VyY2VzLnRha2VuKGltYWdlLCBhdCkpO1xuICAgIHJldHVybiBiaW5kaW5nLnNvdXJjZS5leHBvcnRHZW9Kc29uKGV4Y2x1ZGUsIGZlYXR1cmVzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWdpb24gbG9vayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogV2hldGhlciBhIHJlZ2lvbiBvZiBjbGFzcyBgbGFiZWxgIGdvZXMgdW5sYWJlbGxlZCBiZWNhdXNlIGEgc3ViY2xhc3Mgb2YgaXQgKGJ5IHRoZSByZWdpb25cbiAgICogc291cmNlJ3MgY2xhc3MgaGllcmFyY2h5KSBpcyBhbW9uZyB0aGUgcmVnaW9ucyB0b28g4oCUIGFuIGF0bGFzJ3MgXCJJc29jb3J0ZXhcIiB1bmRlciBpdHMgYXJlYXMuXG4gICAqIEZhbHNlIHdpdGhvdXQgYSBoaWVyYXJjaHkuXG4gICAqL1xuICBpc0xhYmVsQ292ZXJlZChsYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFsYWJlbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhpZXJhcmNoeSA9IHRoaXMuc291cmNlVmlldyQudmFsdWU/LnNvdXJjZS5pbmZvLmhpZXJhcmNoeTtcbiAgICBpZiAoIWhpZXJhcmNoeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNvdmVyZWRGb3I/LnJlZ2lvbnMgIT09IHRoaXMucmVnaW9ucyB8fCB0aGlzLmNvdmVyZWRGb3IuaGllcmFyY2h5ICE9PSBoaWVyYXJjaHkpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG5ldyBNYXAoaGllcmFyY2h5LmZpbHRlcigobikgPT4gbi5wYXJlbnQpLm1hcCgobikgPT4gW24ubmFtZSwgbi5wYXJlbnQgYXMgc3RyaW5nXSkpO1xuICAgICAgY29uc3QgY292ZXJlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9ucykge1xuICAgICAgICBsZXQgcCA9IHIubGFiZWwgPyBwYXJlbnQuZ2V0KHIubGFiZWwpIDogdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAocCAmJiAhY292ZXJlZC5oYXMocCkpIHtcbiAgICAgICAgICBjb3ZlcmVkLmFkZChwKTtcbiAgICAgICAgICBwID0gcGFyZW50LmdldChwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb3ZlcmVkRm9yID0geyByZWdpb25zOiB0aGlzLnJlZ2lvbnMsIGhpZXJhcmNoeSwgY292ZXJlZCB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb3ZlcmVkRm9yLmNvdmVyZWQuaGFzKGxhYmVsKTtcbiAgfVxuICBwcml2YXRlIGNvdmVyZWRGb3I6IHsgcmVnaW9uczogUmVnaW9uW107IGhpZXJhcmNoeTogcmVhZG9ubHkgb2JqZWN0W107IGNvdmVyZWQ6IFNldDxzdHJpbmc+IH0gfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIGNsYXNzZXMgaGlkZGVuIGZyb20gdmlldyAoc2VlIHtAbGluayBzZXRDbGFzc2VzSGlkZGVufSkuICovXG4gIGdldEhpZGRlbkNsYXNzZXMoKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZGVuQ2xhc3NlcyQudmFsdWU7XG4gIH1cblxuICAvKioge0BsaW5rIGdldEhpZGRlbkNsYXNzZXN9IGFuZCBldmVyeSBjaGFuZ2Ugb2YgaXQuICovXG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbkNsYXNzZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgKG9yIHNob3cgYWdhaW4pIHRoZXNlIGNsYXNzZXMnIHJlZ2lvbnM6IHRoZSBvdmVybGF5cyBhbmQgdGhlIHJlZ2lvbiBzb3VyY2UncyBsYXllciBzdG9wXG4gICAqIGRyYXdpbmcgdGhlbSwgYW5kIGEgaGlkZGVuIHJlZ2lvbiBjYW4gYmUgbmVpdGhlciBwaWNrZWQgbm9yIGtlcHQgc2VsZWN0ZWQuIFRoZSByZWdpb25zIHN0YXkgaW5cbiAgICogdGhlIHNldCAodGhlIHRhYmxlIGxpc3RzIHRoZW07IGEgc2F2ZSBrZWVwcyB0aGVtKS5cbiAgICovXG4gIHNldENsYXNzZXNIaWRkZW4oY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaGlkZGVuQ2xhc3NlcyQudmFsdWU7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQoY3VyKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlcykge1xuICAgICAgaWYgKGhpZGRlbikgbmV4dC5hZGQoYyk7XG4gICAgICBlbHNlIG5leHQuZGVsZXRlKGMpO1xuICAgIH1cbiAgICBpZiAobmV4dC5zaXplID09PSBjdXIuc2l6ZSAmJiBbLi4ubmV4dF0uZXZlcnkoKGMpID0+IGN1ci5oYXMoYykpKSByZXR1cm47XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLmhpZGRlbktleXMgPSBuZXcgU2V0KFsuLi5uZXh0XS5tYXAoKGMpID0+IHByZXNldEtleShzZXQsIGMpKSk7XG4gICAgdGhpcy5oaWRkZW5DbGFzc2VzJC5uZXh0KG5leHQpO1xuICAgIGlmIChoaWRkZW4pIHtcbiAgICAgIGNvbnN0IHNob3duID0gdGhpcy5zZWxlY3Rpb24uaW5kaWNlcy5maWx0ZXIoKGkpID0+ICF0aGlzLmlzQ2xhc3NIaWRkZW4odGhpcy5yZWdpb25zW2ldPy5sYWJlbCkpO1xuICAgICAgaWYgKHNob3duLmxlbmd0aCAhPT0gdGhpcy5zZWxlY3Rpb24uaW5kaWNlcy5sZW5ndGgpIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoc2hvd24pO1xuICAgIH1cbiAgICB0aGlzLnJlcHVibGlzaFZpZXcoKTtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLmdldFJlZ2lvbnMoKSk7XG4gIH1cblxuICAvKiogV2hldGhlciByZWdpb25zIGxhYmVsbGVkIGBsYWJlbGAgYXJlIGhpZGRlbiAoYW4gdW5sYWJlbGxlZCByZWdpb24gbmV2ZXIgaXMpLiAqL1xuICBpc0NsYXNzSGlkZGVuKGxhYmVsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhbGFiZWwgJiYgdGhpcy5oaWRkZW5LZXlzLnNpemUgPiAwICYmIHRoaXMuaGlkZGVuS2V5cy5oYXMocHJlc2V0S2V5KHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0KCksIGxhYmVsKSk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbiBsb29rOiBvdXRsaW5lcywgb3IgZmlsbGVkIChhbiBhdGxhcydzIGxvb2spOyBzZWUgYHJlZ2lvbi1zdHlsZWAuICovXG4gIGdldFJlZ2lvblN0eWxlKCk6IFJlZ2lvblN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdHlsZSQudmFsdWU7XG4gIH1cblxuICAvKioge0BsaW5rIGdldFJlZ2lvblN0eWxlfSBhbmQgZXZlcnkgY2hhbmdlIG9mIGl0LiAqL1xuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0eWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaG9vc2UgdGhlIHJlZ2lvbiBsb29rLCBmaWVsZCBieSBmaWVsZDsgaXQgb3ZlcnJpZGVzIGEgcmVnaW9uIHNvdXJjZSdzIGhpbnQgZm9yIHRoZSBzZXNzaW9uLlxuICAgKiBUaGUgb3ZlcmxheXMgcmVkcmF3LlxuICAgKi9cbiAgc2V0UmVnaW9uU3R5bGUocGF0Y2g6IFBhcnRpYWw8UmVnaW9uU3R5bGU+KTogdm9pZCB7XG4gICAgdGhpcy51c2VyU3R5bGUgPSB7IC4uLnRoaXMudXNlclN0eWxlLCAuLi5wYXRjaCB9O1xuICAgIHRoaXMucmVzdHlsZSgpO1xuICB9XG5cbiAgLyoqIFRoZSBsb29rIG5vdzogdGhlIHVzZXIncyBjaG9pY2UsIGVsc2UgdGhlIHNvdXJjZSdzIGhpbnQsIGVsc2Ugb3V0bGluZXMuICovXG4gIHByaXZhdGUgZWZmZWN0aXZlU3R5bGUoKTogUmVnaW9uU3R5bGUge1xuICAgIGNvbnN0IGhpbnQgPSB0aGlzLmhpbnRTdHlsZSA/PyB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsbE9wYWNpdHk6IHRoaXMudXNlclN0eWxlLmZpbGxPcGFjaXR5ID8/IGhpbnQuZmlsbE9wYWNpdHkgPz8gREVGQVVMVF9SRUdJT05fU1RZTEUuZmlsbE9wYWNpdHksXG4gICAgICBzdHJva2U6IHRoaXMudXNlclN0eWxlLnN0cm9rZSAhPT0gdW5kZWZpbmVkID8gdGhpcy51c2VyU3R5bGUuc3Ryb2tlIDogKGhpbnQuc3Ryb2tlID8/IG51bGwpLFxuICAgICAgc3Ryb2tlV2lkdGg6XG4gICAgICAgIHRoaXMudXNlclN0eWxlLnN0cm9rZVdpZHRoICE9PSB1bmRlZmluZWQgPyB0aGlzLnVzZXJTdHlsZS5zdHJva2VXaWR0aCA6IChoaW50LnN0cm9rZVdpZHRoID8/IG51bGwpLFxuICAgICAgaGlnaGxpZ2h0OiB0aGlzLnVzZXJTdHlsZS5oaWdobGlnaHQgIT09IHVuZGVmaW5lZCA/IHRoaXMudXNlclN0eWxlLmhpZ2hsaWdodCA6IChoaW50LmhpZ2hsaWdodCA/PyBudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFB1Ymxpc2ggdGhlIGxvb2sgd2hlbiBpdCBjaGFuZ2VkOiB0aGUgb3ZlcmxheXMgcmVkcmF3IHRoZSByZWdpb25zLCB0aGUgc291cmNlIGxheWVyIGl0cyBmZWF0dXJlcy4gKi9cbiAgcHJpdmF0ZSByZXN0eWxlKHJlZHJhdyA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZWZmZWN0aXZlU3R5bGUoKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLnJlZ2lvblN0eWxlJC52YWx1ZTtcbiAgICBjb25zdCBzYW1lID0gKE9iamVjdC5rZXlzKG5leHQpIGFzIEFycmF5PGtleW9mIFJlZ2lvblN0eWxlPikuZXZlcnkoKGspID0+IG5leHRba10gPT09IGN1cltrXSk7XG4gICAgaWYgKCFzYW1lKSB0aGlzLnJlZ2lvblN0eWxlJC5uZXh0KG5leHQpO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGlmIChyZWRyYXcgfHwgIXNhbWUgfHwgKHZpZXcgJiYgdmlldy5sYWJlbHMgIT09IHRoaXMuc2hvd1NoYXBlTGFiZWwpKSB7XG4gICAgICB0aGlzLnJlcHVibGlzaFZpZXcoKTtcbiAgICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmUtZW1pdCB0aGUgc291cmNlIHZpZXcgd2l0aCB0aGUgY3VycmVudCBsb29rIGFuZCBsYWJlbCBzZXR0aW5nLiAqL1xuICBwcml2YXRlIHJlcHVibGlzaFZpZXcoKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldyQudmFsdWU7XG4gICAgaWYgKHZpZXcpIHRoaXMuc291cmNlVmlldyQubmV4dCh7IC4uLnZpZXcsIHN0eWxlOiB0aGlzLnJlZ2lvblN0eWxlJC52YWx1ZSwgbGFiZWxzOiB0aGlzLnNob3dTaGFwZUxhYmVsIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBhIHJlZ2lvbiBzb3VyY2UgaXMga2V5ZWQgYnk6IHRoZSBkaXNwbGF5IHNsaWNlIGluIHN0YWNrIG1vZGUsIGVsc2UgMC4gKi9cbiAgcHJpdmF0ZSBnZXQgc291cmNlU2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5zdGFja01vZGUgPyB0aGlzLnNjb3BlLmRpc3BsYXlTbGljZSA6IDA7XG4gIH1cblxuICBwcml2YXRlIGN1cnJlbnRUYWtlbigpOiBSZWFkb25seVNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzLnRha2VuKHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2UsIHRoaXMuc291cmNlU2xpY2UpO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIHNsaWNlJ3MgdGFrZW4gaWRzIGFuZCB0ZWxsIHRoZSBzb3VyY2UgbGF5ZXJzLiAqL1xuICBwcml2YXRlIHNldFRha2VuKHRha2VuOiBSZWFkb25seVNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgaWYgKHRha2VuID09PSB0aGlzLmN1cnJlbnRUYWtlbigpKSByZXR1cm47XG4gICAgdGhpcy5zb3VyY2VzLnNldFRha2VuKHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2UsIHRoaXMuc291cmNlU2xpY2UsIHRha2VuKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgICBpZiAodmlldykgdGhpcy5zb3VyY2VWaWV3JC5uZXh0KHsgLi4udmlldywgdGFrZW4gfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9vayB1cCAob3BlbmluZyBpdCBpZiBuZWVkZWQpIHRoZSBzbGljZSdzIHNvdXJjZSBhbmQgcHVibGlzaCBpdCBhcyB0aGUgc291cmNlIHZpZXcuIFRoZSB2aWV3XG4gICAqIGlzIHdpdGhkcmF3biBhdCBvbmNlOiB1bnRpbCB0aGUgaW5jb21pbmcgc291cmNlIG9wZW5zLCBub3RoaW5nIHJlYWRzLCB0YWtlcyBvciBkZWxldGVzIGZyb20gdGhlXG4gICAqIG91dGdvaW5nIG9uZSBpbnRvIHRoZSBzbGljZSBub3cgc2hvd24uXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hTb3VyY2VWaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuc291cmNlR2VuZXJhdGlvbjtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLnNvdXJjZVNsaWNlO1xuICAgIGlmICh0aGlzLnNvdXJjZVZpZXckLnZhbHVlKSB0aGlzLnNvdXJjZVZpZXckLm5leHQobnVsbCk7XG4gICAgdGhpcy5zb3VyY2VzLnNob3coaW1hZ2UsIHNsaWNlKTtcbiAgICBpZiAoIXRoaXMuc291cmNlcy5oYXMoaW1hZ2UsIHNsaWNlKSkge1xuICAgICAgdGhpcy5oaW50U3R5bGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnJlc3R5bGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIHNsaWNlKS50aGVuKFxuICAgICAgKGJpbmRpbmcpID0+IHtcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuc291cmNlR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICBpZiAoIWJpbmRpbmcpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZVZpZXckLm5leHQobnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSBiaW5kaW5nLnNvdXJjZS5pbmZvO1xuICAgICAgICBjb25zdCBjbGFzc0NvbG9ycyA9IE9iamVjdC5lbnRyaWVzKGluZm8uY2xhc3NDb2xvcnMpO1xuICAgICAgICBpZiAoY2xhc3NDb2xvcnMubGVuZ3RoKSB0aGlzLnN0b3JlLnJlbWVtYmVySW1wb3J0ZWRDbGFzc0NvbG9ycyhuZXcgTWFwKGNsYXNzQ29sb3JzKSk7XG4gICAgICAgIC8vIEEgc291cmNlIHRoYXQgYXNrcyBmb3IgbGFiZWxzIGdldHMgdGhlbSB3aGVuIGl0IG9wZW5zICh0aGUgdG9nZ2xlIHN0aWxsIHR1cm5zIHRoZW0gb2ZmKS5cbiAgICAgICAgY29uc3QgbGFiZWxzT24gPSAhIWluZm8uc3R5bGU/LmxhYmVscyAmJiAhdGhpcy5zaG93U2hhcGVMYWJlbCAmJiB0aGlzLnNob3duU291cmNlICE9PSBiaW5kaW5nLnNvdXJjZTtcbiAgICAgICAgaWYgKGxhYmVsc09uKSB0aGlzLnNob3dTaGFwZUxhYmVsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93blNvdXJjZSA9IGJpbmRpbmcuc291cmNlO1xuICAgICAgICB0aGlzLmhpbnRTdHlsZSA9IGluZm8uc3R5bGU7XG4gICAgICAgIHRoaXMuc291cmNlVmlldyQubmV4dCh7XG4gICAgICAgICAgc291cmNlOiBiaW5kaW5nLnNvdXJjZSxcbiAgICAgICAgICBwbGFuZTogYmluZGluZy5wbGFuZSxcbiAgICAgICAgICB0YWtlbjogdGhpcy5zb3VyY2VzLnRha2VuKGltYWdlLCBzbGljZSksXG4gICAgICAgICAgY29sb3JPZjogKGYpID0+XG4gICAgICAgICAgICBmLmxhYmVsID8gY29sb3JGb3JMYWJlbChmLmxhYmVsLCB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpKSA6IGYuY29sb3IgfHwgdGhpcy5zaGFwZUNvbG9yLFxuICAgICAgICAgIHN0eWxlOiB0aGlzLnJlZ2lvblN0eWxlJC52YWx1ZSxcbiAgICAgICAgICBsYWJlbHM6IHRoaXMuc2hvd1NoYXBlTGFiZWwsXG4gICAgICAgICAgaXNIaWRkZW46IChsYWJlbCkgPT4gdGhpcy5pc0NsYXNzSGlkZGVuKGxhYmVsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzdHlsZShsYWJlbHNPbik7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5zb3VyY2VHZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlZ2lvbnNdIGNvdWxkIG5vdCBvcGVuIHRoZSByZWdpb24gc291cmNlJywgZXJyKTtcbiAgICAgICAgdGhpcy5zb3VyY2VWaWV3JC5uZXh0KG51bGwpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIHBlci1pbWFnZSBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIGltYWdlOiBzbmFwc2hvdCB0aGUgb3V0Z29pbmcgcmVnaW9ucywgcmVzdG9yZSB0aGVcbiAgICogaW5jb21pbmcgaW1hZ2UncyAob3IgW10gaWYgbm9uZSksIGNsZWFyIHNlbGVjdGlvbiwgYW5kIG5vdGlmeS4gSWRlbXBvdGVudFxuICAgKiBmb3IgdGhlIHNhbWUgaW1hZ2UgKHNvIHJlcGVhdGVkIHJlcGxvdHMgb2Ygb25lIGltYWdlIGtlZXAgaXRzIHJlZ2lvbnMpLlxuICAgKi9cbiAgc2V0QWN0aXZlSW1hZ2UoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvKTogdm9pZCB7XG4gICAgLy8gU3dpdGNoaW5nIGltYWdlcyBhbHNvIGVuZHMgYW55IHBlci1zbGljZSBzdGFjayBzZXNzaW9uIChqaXQtdWkjOTMpLlxuICAgIGNvbnN0IGluY29taW5nID0gdGhpcy5zY29wZS5zd2l0Y2hJbWFnZShSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KGltYWdlSW5mbyksIHRoaXMucmVnaW9ucyk7XG4gICAgaWYgKCFpbmNvbWluZykgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9ucyA9IGluY29taW5nO1xuICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UoW10pO1xuICAgIC8vIFVuZG8gbmV2ZXIgY3Jvc3NlcyBhbiBpbWFnZSBzd2l0Y2guXG4gICAgdGhpcy5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICAgIHRoaXMucmVmcmVzaFNvdXJjZVZpZXcoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBpbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEFwcGx5IHRoZSBwcmVzZXQgc2V0J3MgY2xhc3MgY29sb3VycyAoc2VlIHtAbGluayBhcHBseVByZXNldENvbG9yc30pLFxuICAgKiAgcHJvbW90aW5nIHVua25vd24gY2xhc3NlcyBpbnRvIHRoZSBzaGFyZWQgc3RvcmUgd2hlbiB0aGUgc2V0IGFza3MgZm9yIGl0LiAqL1xuICBwcml2YXRlIHdpdGhDbGFzc2lmaWNhdGlvbkNvbG9ycyhyZWdpb25zOiBSZWdpb25bXSwgaW5QbGFjZTogKHI6IFJlZ2lvbikgPT4gYm9vbGVhbik6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gYXBwbHlQcmVzZXRDb2xvcnMocmVnaW9ucywgdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKSwge1xuICAgICAgaW5QbGFjZSxcbiAgICAgIG9uUHJvbW90ZTogKHByZXNldCkgPT4gdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZS5zeW5jKHRoaXMucmVnaW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGVtaXQoKTogdm9pZCB7XG4gICAgLy8gTGl2ZS1lZGl0IGxpc3RlbmVycyAoZS5nLiB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQpIHJlYWN0IG9uIEVWRVJZXG4gICAgLy8gY2hhbmdlIOKAlCBpbmNsdWRpbmcgcGVyLWZyYW1lIGR1cmluZyBhIGJhdGNoZWQgZHJhZyDigJQgc28gdGhleSB0cmFjayB0aGVcbiAgICAvLyByZWdpb24gbGl2ZS4gVGhlIG1haW4gcmVnaW9uVXBkYXRlJCBzdGF5cyBjb2FsZXNjZWQgZHVyaW5nIGEgYmF0Y2ggKGZpcmVzXG4gICAgLy8gb25jZSBvbiBlbmRCYXRjaCkgdG8ga2VlcCBoZWF2aWVyIGNvbnN1bWVycyAoUmVnaW9ucyB0YWIpIGNhbG0uXG4gICAgdGhpcy5yZWdpb25MaXZlRWRpdCQubmV4dCh0aGlzLnJlZ2lvbnMuc2xpY2UoKSk7XG4gICAgaWYgKHRoaXMuYmF0Y2hEZXB0aCA+IDApIHtcbiAgICAgIHRoaXMucGVuZGluZ0VtaXQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLmdldFJlZ2lvbnMoKSk7XG4gIH1cblxuICAvKiogUHJvamVjdCB0aGUgc2VsZWN0ZWQgaWRzIG9udG8gdGhlIGN1cnJlbnQgcmVnaW9ucyAocHJ1bmluZyBnb25lIG9uZXMpO1xuICAgKiAgZW1pdHMgb25seSBpZiB0aGUgaW5kZXggc2V0IGNoYW5nZWQuICovXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5zeW5jKHRoaXMucmVnaW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBSZWdpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmRleE9mSWQoaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5maW5kSW5kZXgoKHIpID0+IHIuaWQgPT09IGlkKTtcbiAgfVxufVxuXG4vKiogVGhlIGZlYXR1cmVzIG9mIGFuIGV4cG9ydGVkIEZlYXR1cmVDb2xsZWN0aW9uIG9uIGBwbGFuZWAgKGEgbWlzc2luZyBwbGFuZSBpcyBwbGFuZSAwKS4gKi9cbmZ1bmN0aW9uIHBsYW5lRmVhdHVyZXMoZ2VvSnNvbjogc3RyaW5nLCBwbGFuZTogbnVtYmVyKTogR2VvRmVhdHVyZVtdIHtcbiAgY29uc3QgZmVhdHVyZXMgPSAoSlNPTi5wYXJzZShnZW9Kc29uKT8uZmVhdHVyZXMgPz8gW10pIGFzIEdlb0ZlYXR1cmVbXTtcbiAgcmV0dXJuIGZlYXR1cmVzLmZpbHRlcigoZikgPT4gKGY/Lmdlb21ldHJ5Py5wbGFuZT8ueiA/PyAwKSA9PT0gcGxhbmUpO1xufVxuXG4vKiogYGZlYXR1cmVzYCBtb3ZlZCBvbnRvIHBsYW5lIGB6YCwgYXMgUXVQYXRoIHdyaXRlcyBpdDogYGdlb21ldHJ5LnBsYW5lYCwgbGVmdCBvdXQgZm9yIHBsYW5lIDAuICovXG5mdW5jdGlvbiBvblBsYW5lKGZlYXR1cmVzOiBHZW9GZWF0dXJlW10sIHo6IG51bWJlcik6IEdlb0ZlYXR1cmVbXSB7XG4gIHJldHVybiBmZWF0dXJlcy5tYXAoKGYpID0+IHtcbiAgICBjb25zdCB7IHBsYW5lOiBfcGxhbmUsIC4uLmdlb21ldHJ5IH0gPSBmLmdlb21ldHJ5ID8/IHt9O1xuICAgIHJldHVybiB7IC4uLmYsIGdlb21ldHJ5OiB6ID09PSAwID8gZ2VvbWV0cnkgOiB7IC4uLmdlb21ldHJ5LCBwbGFuZTogeyBjOiAtMSwgeiwgdDogMCB9IH0gfTtcbiAgfSk7XG59XG5cbmludGVyZmFjZSBHZW9GZWF0dXJlIHtcbiAgZ2VvbWV0cnk/OiB7IHBsYW5lPzogeyB6PzogbnVtYmVyIH07IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cbiJdfQ==
1451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczRCxPQUFPLEVBQVUsU0FBUyxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0YsT0FBTyxFQUVMLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FDakIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRixPQUFPLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGVBQWUsRUFDZixhQUFhLEdBQ2QsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQWlCLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sS0FBSyxJQUFJLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FB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RUQsb0dBQW9HO0FBQ3BHLFNBQVMsT0FBTyxDQUFDLFFBQXNCLEVBQUUsQ0FBUztJQUNoRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN4QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3hELE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3RixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVnaW9uLCBSZWN0YW5nbGUsIFBvbHlnb24sIE11bHRpUG9seWdvbiwgaHlkcmF0ZUJvdW5kcyB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHtcbiAgR2VvSnNvbkZlYXR1cmUsXG4gIGRvd25sb2FkR2VvSnNvbixcbiAgZmVhdHVyZUZyb21SZWdpb24sXG4gIHJlZ2lvbkZyb21HZW9Kc29uRmVhdHVyZSxcbiAgcmVnaW9uc0Zyb21HZW9Kc29uLFxuICByZWdpb25zVG9HZW9Kc29uLFxufSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWdlb2pzb24nO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSVJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRBcGksIElSZWdpb25Tb3VyY2VBcGkgfSBmcm9tICcuLi9jb250cmFjdHMvcmVnaW9uLXN0b3JlLmNvbnRyYWN0JztcbmltcG9ydCB7IGFwcGx5UHJlc2V0Q29sb3JzLCBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHtcbiAgY2xvbmVCb3VuZHMsXG4gIG1ha2VQb2x5Z29uLFxuICByZWN0VG9SaW5nLFxuICByZWdpb25Qb2x5Z29ucyxcbiAgcmVnaW9uUG9seWxpbmVzLFxuICByZXBsYWNlQm91bmRzLFxufSBmcm9tICcuLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBvdXRsaW5lc0FyZWEgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyByZWNvbnN0cnVjdEluV29ya2VyIH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS93b3JrZXItcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBlZGl0IGZyb20gJy4uL21vZGVscy9wb2x5Z29uLWVkaXQnO1xuaW1wb3J0IHsgcmVnaW9uc0VxdWFsLCB3aXRoUmVnaW9uUGF0Y2gsIHdpdGhSZWdpb25aIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbi1jbG9uZSc7XG5pbXBvcnQgeyBSZWdpb25IaXN0b3J5IH0gZnJvbSAnLi9yZWdpb24taGlzdG9yeSc7XG5pbXBvcnQgeyBSZWdpb25TZWxlY3Rpb24gfSBmcm9tICcuL3JlZ2lvbi1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgUmVnaW9uU2NvcGVDYWNoZSwgU3RhY2tTYXZlTGF5b3V0IH0gZnJvbSAnLi9yZWdpb24tc2NvcGUtY2FjaGUnO1xuaW1wb3J0IHsgUmVnaW9uU291cmNlT3BlbmVyLCBSZWdpb25Tb3VyY2VTY29wZSwgUmVnaW9uU291cmNlU2xpY2VzIH0gZnJvbSAnLi9yZWdpb24tc291cmNlLXNjb3BlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uSW5kZXhQYWdlLCBSZWdpb25JbmRleFF1ZXJ5LCBSZWdpb25Tb3VyY2VTdHlsZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB7IERFRkFVTFRfUkVHSU9OX1NUWUxFLCBSZWdpb25TdHlsZSB9IGZyb20gJy4uL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5cbi8qKiBTZWxlY3RpbmcgY2xhc3NlcyB0YWtlcyBhdCBtb3N0IHRoaXMgbWFueSByZWdpb24tc291cmNlIGZlYXR1cmVzIGludG8gdGhlIHJlZ2lvbnMuICovXG5leHBvcnQgY29uc3QgU0VMRUNUX0NMQVNTRVNfTElNSVQgPSA1MDAwO1xuLyoqIEEgcmVnaW9uIHNvdXJjZSdzIG91dGxpbmVzIG9uIGEgc2xpY2UsIGVhY2ggcmluZydzIGFuZCBsaW5lJ3MgY2xhc3Mgd2l0aCBpdCB3aGVuIHJlYWQgZm9yIGFsbC4gKi9cbnR5cGUgTGFiZWxsZWRPdXRsaW5lcyA9IFNsaWNlT3V0bGluZXMgJiB7IHJpbmdMYWJlbHM/OiBzdHJpbmdbXTsgbGluZUxhYmVscz86IHN0cmluZ1tdIH07XG5cbi8qKiBDbGFzcyBzZXRzIHdob3NlIHJlZ2lvbi1zb3VyY2Ugb3V0bGluZXMgYXJlIGtlcHQgZm9yIHJlYnVpbGRpbmcgdGhlaXIgc3VyZmFjZXMuICovXG5jb25zdCBTT1VSQ0VfT1VUTElORV9DQUNIRV9TSVpFID0gODtcbi8qKiBDbGFzc2VzIHdob3NlIHJlZ2lvbi1zb3VyY2UgcGFydCBvZiB0aGUgdm9sdW1lIGlzIGtlcHQgKHNlZSBSZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMpLiAqL1xuY29uc3QgU09VUkNFX1ZPTFVNRV9DQUNIRV9TSVpFID0gNjQ7XG5cbi8qKiBBIHNsaWNlJ3MgcmluZ3MsIGVhY2ggd2l0aCBpdHMgZmVhdHVyZSAoc2VlIFNsaWNlT3V0bGluZXMucmluZ0dyb3VwcyksIGFuZCBpdHMgbGluZXMuICovXG5pbnRlcmZhY2UgU2xpY2VQYXJ0cyB7XG4gIHJpbmdzOiBBcnJheUxpa2U8bnVtYmVyPltdO1xuICByaW5nR3JvdXBzOiBudW1iZXJbXTtcbiAgbGluZXM6IEFycmF5TGlrZTxudW1iZXI+W107XG59XG5cbi8qKlxuICogRmVhdHVyZSBpZHMgdW5pcXVlIGFjcm9zcyBvdXRsaW5lcyByZWFkIGZyb20gc2V2ZXJhbCBwbGFjZXM6IGVhY2ggY2FsbCBnaXZlcyBvbmUgcGFydCdzXG4gKiByZW51bWJlcmluZyBvZiBpdHMgb3duIGlkcyAoYSBwYXJ0IHdpdGhvdXQgdGhlbSBpcyBvbmUgZmVhdHVyZSkuXG4gKi9cbmZ1bmN0aW9uIGZlYXR1cmVJZHMoKTogKCkgPT4gKG93bjogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIge1xuICBsZXQgbmV4dCA9IDA7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaWRzID0gbmV3IE1hcDxudW1iZXIgfCB1bmRlZmluZWQsIG51bWJlcj4oKTtcbiAgICByZXR1cm4gKG93bikgPT4ge1xuICAgICAgbGV0IGlkID0gaWRzLmdldChvd24pO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIGlkcy5zZXQob3duLCAoaWQgPSBuZXh0KyspKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9O1xuICB9O1xufVxuXG4vKiogQSBzbGljZSdzIHBhcnRzIGFzIG91dGxpbmVzLiAqL1xuZnVuY3Rpb24gc2xpY2VPdXRsaW5lcyh6OiBudW1iZXIsIHM6IFNsaWNlUGFydHMpOiBTbGljZU91dGxpbmVzIHtcbiAgcmV0dXJuIHtcbiAgICB6LFxuICAgIHJpbmdzOiBzLnJpbmdzLFxuICAgIC4uLihzLnJpbmdzLmxlbmd0aCA/IHsgcmluZ0dyb3Vwczogcy5yaW5nR3JvdXBzIH0gOiB7fSksXG4gICAgLi4uKHMubGluZXMubGVuZ3RoID8geyBsaW5lczogcy5saW5lcyB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIE91dGxpbmVzIGJ5IHNsaWNlIG1lcmdlZCBpbnRvIG9uZSBlbnRyeSBwZXIgc2xpY2UgKHJpbmdzLCB0aGVuIGxpbmVzKSwgaW4gc2xpY2Ugb3JkZXIsIGVhY2hcbiAqIHBhcnQncyBmZWF0dXJlcyBhcGFydCBmcm9tIHRoZSBvdGhlcnMnICh0aGV5IGZpbGwgYXMgdGhlaXIgdW5pb24pLlxuICovXG5mdW5jdGlvbiBtZXJnZU91dGxpbmVzKHBhcnRzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10pOiBTbGljZU91dGxpbmVzW10ge1xuICBjb25zdCBieVogPSBuZXcgTWFwPG51bWJlciwgU2xpY2VQYXJ0cz4oKTtcbiAgY29uc3QgbmV4dFBhcnQgPSBmZWF0dXJlSWRzKCk7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmICghcGFydC5yaW5ncy5sZW5ndGggJiYgIXBhcnQubGluZXM/Lmxlbmd0aCkgY29udGludWU7XG4gICAgbGV0IHNsaWNlID0gYnlaLmdldChwYXJ0LnopO1xuICAgIGlmICghc2xpY2UpIGJ5Wi5zZXQocGFydC56LCAoc2xpY2UgPSB7IHJpbmdzOiBbXSwgcmluZ0dyb3VwczogW10sIGxpbmVzOiBbXSB9KSk7XG4gICAgY29uc3QgaWQgPSBuZXh0UGFydCgpO1xuICAgIHBhcnQucmluZ3MuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgc2xpY2UucmluZ3MucHVzaChyKTtcbiAgICAgIHNsaWNlLnJpbmdHcm91cHMucHVzaChpZChwYXJ0LnJpbmdHcm91cHM/LltpXSkpO1xuICAgIH0pO1xuICAgIHNsaWNlLmxpbmVzLnB1c2goLi4uKHBhcnQubGluZXMgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShieVosIChbeiwgc10pID0+IHNsaWNlT3V0bGluZXMoeiwgcykpLnNvcnQoKGEsIGIpID0+IGEueiAtIGIueik7XG59XG5cbi8qKiBUaGUgcmVnaW9uIHNvdXJjZXMnIHBhcnQgb2YgYSBjbGFzcydzIHZvbHVtZTogaXRzIGFyZWEgb24gZWFjaCBzbGljZSwgd2l0aCB0aGUgb3V0bGluZXMuICovXG5pbnRlcmZhY2UgU291cmNlVm9sdW1lIHtcbiAgdG90YWw6IG51bWJlcjtcbiAgc2xpY2VzOiBSZWFkb25seU1hcDxudW1iZXIsIHsgYXJlYTogbnVtYmVyOyBvdXRsaW5lczogU2xpY2VPdXRsaW5lcyB9Pjtcbn1cblxuLyoqIE9uZSB1bmRvIHN0ZXA6IHRoZSByZWdpb24gc2V0IGFuZCwgZm9yIGEgc2xpY2Ugd2l0aCBhIHJlZ2lvbiBzb3VyY2UsIHdoYXQgd2FzIHRha2VuIGZyb20gaXQuICovXG5pbnRlcmZhY2UgUmVnaW9uU25hcHNob3Qge1xuICByZWdpb25zOiBSZWdpb25bXTtcbiAgdGFrZW46IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIHJlZ2lvbiBzdG9yZSDigJQgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBzdGF0ZS5cbiAqXG4gKiBIb2xkcyB0aGUgbmV1dHJhbCB7QGxpbmsgUmVnaW9ufSBtb2RlbCAobmV2ZXIgYSBiYWNrZW5kJ3Mgb3duIHNoYXBlXG4gKiByZXByZXNlbnRhdGlvbiksIGtleWVkIHBlciBpbWFnZSBzbyByZWdpb25zIHBlcnNpc3QgYXMgdGhlIHVzZXIgc3dpdGNoZXNcbiAqIGZpbGVzIGFuZCBzdXJ2aXZlIGEgUGxvdGx54oeET3BlblNlYWRyYWdvbiBiYWNrZW5kIHN3aXRjaCAoYm90aCBiYWNrZW5kcyByZWFkXG4gKiBhbmQgd3JpdGUgKnRoaXMqIHN0b3JlLCBzbyBubyBtaWdyYXRpb24gaXMgbmVlZGVkKS4gQmFja2VuZHMgb3duICpyZW5kZXJpbmcqXG4gKiBhbmQgcmVhY3QgdG8ge0BsaW5rIGdldFJlZ2lvblVwZGF0ZUV2ZW50fTsgdGhpcyBzZXJ2aWNlIG93bnMgKnN0YXRlKiBhbmQgdGhlXG4gKiBlZGl0aW5nIG9wZXJhdGlvbnMuXG4gKlxuICogSW1wbGVtZW50czpcbiAqICAtIHtAbGluayBJUmVnaW9uU3RvcmV9IOKAlCB0aGUgY3Jvc3MtYmFja2VuZCBDUlVEL3NlbGVjdGlvbi9jb2xvdXIgY29udHJhY3RcbiAqICAgIGV2ZXJ5IGNvbnN1bWVyIChSZWdpb24gRWRpdG9yLCBzZWdtZW50YXRpb24sIGV0Yy4pIGFscmVhZHkgdXNlcy5cbiAqICAtIHtAbGluayBJUmVnaW9uRWRpdEFwaX0g4oCUIFJlZ2lvbi1uYXRpdmUgZ2VvbWV0cnkgZWRpdHMgKG1vdmUvcmVzaXplLCBhbmRcbiAqICAgIGFkZC9kZWxldGUvbW92ZSB2ZXJ0ZXgpIHRoZSBPU0Qgb3ZlcmxheSBkcml2ZXMuXG4gKlxuICogQ29weS1vbi13cml0ZSAocmV2aWV3IFJULTEzKTogbm8gb3BlcmF0aW9uIGNoYW5nZXMgYSBzdG9yZWQge0BsaW5rIFJlZ2lvbn1cbiAqIChvciB0aGUgcmVnaW9ucyBhcnJheSkgaW4gcGxhY2UuIEFuIGVkaXQgYnVpbGRzIGEgcmVwbGFjZW1lbnQg4oCUIHRoZSBnZW9tZXRyeVxuICogdGhyb3VnaCB0aGUgcHVyZSBgbW9kZWxzL3BvbHlnb24tZWRpdGAgZnVuY3Rpb25zIOKAlCBhbmQgc3dhcHMgaXQgaW4sIHNvIHRoZVxuICogdW5kbyBoaXN0b3J5ICh7QGxpbmsgUmVnaW9uSGlzdG9yeX0pIGNhbiBrZWVwIHNoYWxsb3cgc25hcHNob3RzIHRoYXQgc2hhcmVcbiAqIGV2ZXJ5IHVudG91Y2hlZCByZWdpb24gaW5zdGVhZCBvZiBkZWVwLWNsb25pbmcgdGhlIHdob2xlIHNldCBwZXIgc3RlcC5cbiAqIENhbGxlcnMgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcnVsZSB3aXRoIHRoZSBpbnN0YW5jZXMge0BsaW5rIGdldFJlZ2lvbnN9XG4gKiByZXR1cm5zOiB0cmVhdCB0aGVtIGFzIHJlYWQtb25seSwgYW5kIGNvbW1pdCBhIGNoYW5nZWQgY29weS5cbiAqXG4gKiBDbGFzc2lmaWNhdGlvbiBjb2xvdXJzIGxpdmUgaW4ge0BsaW5rIFZpc3VhbGl6ZXJTdG9yZX0gKHNoYXJlZCBieSBib3RoXG4gKiBiYWNrZW5kcyk7IEdlb0pTT04gaW1wb3J0L2V4cG9ydCBpcyBgbW9kZWxzL3JlZ2lvbi1nZW9qc29uYC4gQWxsIGNvb3JkaW5hdGVzXG4gKiBhcmUgaW1hZ2UgcGl4ZWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlZ2lvblN0b3JlIGltcGxlbWVudHMgSVJlZ2lvblN0b3JlLCBJUmVnaW9uRWRpdEFwaSwgSVJlZ2lvblNvdXJjZUFwaSB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVORE9fTElNSVQgPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVU5ET19DT0FMRVNDRV9NUyA9IDI1MDtcblxuICAvKiogVGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zIOKAlCB0aGUgbGl2ZSwgZWRpdGVkIGFycmF5LiAqL1xuICBwcml2YXRlIHJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG5cbiAgLyoqXG4gICAqIFVuZG8vcmVkbyBoaXN0b3J5IChqaXQtdWkjODUpOiB1cCB0byB7QGxpbmsgVU5ET19MSU1JVH0gc25hcHNob3RzIG9mIHRoZVxuICAgKiByZWdpb24gc2V0LCBlYWNoIHRha2VuIGp1c3QgKmJlZm9yZSogYSByZWdpb24tZWRpdGluZyBhY3Rpb247IGNvbnRpbnVvdXNcbiAgICogZ2VzdHVyZXMgYW5kIHJhcGlkIGNvbW1pdHMgY29hbGVzY2UgKHNlZSB7QGxpbmsgUmVnaW9uSGlzdG9yeX0pLiBTbmFwc2hvdHNcbiAgICogYXJlIHNoYWxsb3cg4oCUIHRoZSByZWdpb25zIGFycmF5IGFzIGl0IHdhcyDigJQgd2hpY2ggaXMgc2FmZSBiZWNhdXNlIG5vdGhpbmdcbiAgICogaGVyZSBtdXRhdGVzIGEgcmVnaW9uIG9yIGFuIGFycmF5IGluIHBsYWNlIChSVC0xMykuIEhpc3RvcnkgbmV2ZXIgY3Jvc3NlcyBhblxuICAgKiBpbWFnZSBsb2FkL3N3aXRjaCDigJQge0BsaW5rIHJlc2V0VW5kb0hpc3Rvcnl9IGNsZWFycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IG5ldyBSZWdpb25IaXN0b3J5PFJlZ2lvblNuYXBzaG90PihcbiAgICBSZWdpb25TdG9yZS5VTkRPX0xJTUlULFxuICAgIFJlZ2lvblN0b3JlLlVORE9fQ09BTEVTQ0VfTVMsXG4gICk7XG5cbiAgLyoqIE1vbm90b25pYyBpZCBzb3VyY2Ug4oCUIGlkcyBuZXZlciByZXBlYXQgd2l0aGluIHRoZSBzZXJ2aWNlIGxpZmV0aW1lLCBzb1xuICAgKiAgc2VsZWN0aW9uIHN0YXlzIGNvcnJlY3QgYWNyb3NzIGRlbGV0ZS9hZGQgY3ljbGVzIGV2ZW4gd2hlbiBuYW1lcyBjb2xsaWRlLiAqL1xuICBwcml2YXRlIG5leHRJZCA9IDE7XG5cbiAgcHJpdmF0ZSBzaG93U2hhcGVMYWJlbCA9IGZhbHNlO1xuICBwcml2YXRlIHNoYXBlQ29sb3IgPSAnIzAwRkZGRic7XG4gIHByaXZhdGUgZmlsbENvbG9yID0gJyNmZjAwZmYnO1xuICBwcml2YXRlIGlzUmVnaW9uU2F2ZWRPbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFBlci1pbWFnZSBjYWNoZSBhbmQsIGZvciB6LXN0YWNrcywgcGVyLXNsaWNlIHJlZ2lvbnMgKGppdC11aSM5MykuIEluIHN0YWNrXG4gICAqIG1vZGUgdGhlIGxpdmUgYHJlZ2lvbnNgIGFycmF5IGhvbGRzIE9ORSBzbGljZSDigJQgdGhlIGRpc3BsYXkgc2xpY2Ug4oCUIHNvIHRoZVxuICAgKiBvdmVybGF5cywgdGhlIHNlbGVjdGlvbiBwcm9qZWN0aW9uIGFuZCB0aGUgUmVnaW9ucyB0YWJsZSB3b3JrIHVuY2hhbmdlZFxuICAgKiAodGhleSBhbGwgcmVhZCB7QGxpbmsgZ2V0UmVnaW9uc30pOyB7QGxpbmsgc2V0RGlzcGxheVNsaWNlfSBzd2FwcyB0aGUgbGl2ZVxuICAgKiBzZXQgb24gc2NydWIgYW5kIHtAbGluayBnZXRTbGljZVJlZ2lvbnN9IGZsYXR0ZW5zIGV2ZXJ5IHNsaWNlIChlYWNoIHRhZ2dlZFxuICAgKiB3aXRoIGl0cyB6ZXJvLWJhc2VkIHtAbGluayBSZWdpb24uen0pIGZvciBzYXZlL2V4cG9ydC4gT2ZmIGJ5IGRlZmF1bHQsIHNvXG4gICAqIHNpbmdsZS1wbGFuZSBpbWFnZXMgYXJlIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNjb3BlID0gbmV3IFJlZ2lvblNjb3BlQ2FjaGUoKTtcblxuICAvKiogU2VsZWN0aW9uIGJ5IHJlZ2lvbiAqaWQqIChzdGFibGUgYWNyb3NzIGVkaXRzKSwgcHJvamVjdGVkIHRvIGFycmF5XG4gICAqICBpbmRpY2VzIG9uIHRoZSBJUmVnaW9uU3RvcmUgYm91bmRhcnkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uID0gbmV3IFJlZ2lvblNlbGVjdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZSQgPSBuZXcgU3ViamVjdDxSZWdpb25bXT4oKTtcbiAgLyoqIE5vbi1jb2FsZXNjZWQgc2libGluZyBvZiByZWdpb25VcGRhdGUkOiBmaXJlcyBvbiBldmVyeSBjaGFuZ2UgZXZlbiBkdXJpbmcgYVxuICAgKiAgYmF0Y2hlZCBkcmFnLCBzbyBsaXZlIGNvbnN1bWVycyAoaW50ZW5zaXR5IGluc2V0KSB1cGRhdGUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbkxpdmVFZGl0JCA9IG5ldyBTdWJqZWN0PFJlZ2lvbltdPigpO1xuICAvKiogU2VlIHtAbGluayBnZXRSZWdpb25TZXRSZXBsYWNlZCR9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblNldFJlcGxhY2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgY29hbGVzY2luZyBmb3IgbGl2ZSBkcmFncyAoc2VlIElSZWdpb25FZGl0QXBpLmJlZ2luQmF0Y2gpLiAqL1xuICBwcml2YXRlIGJhdGNoRGVwdGggPSAwO1xuICBwcml2YXRlIHBlbmRpbmdFbWl0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIExhcmdlIHJlZ2lvbiBzZXRzIGhlbGQgYXMgdGlsZWQgcmVnaW9uIHNvdXJjZXMgcmF0aGVyIHRoYW4gYXMgcmVnaW9ucyAoc2VlXG4gICAqIHtAbGluayBhdHRhY2hSZWdpb25Tb3VyY2V9KTogcGVyIGltYWdlIGFuZCBzbGljZSwgd2l0aCB0aGUgaWRzIHRha2VuIG91dCBvZiBlYWNoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzID0gbmV3IFJlZ2lvblNvdXJjZVNjb3BlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsPihudWxsKTtcbiAgLyoqIFdoZXRoZXIgdGhlIG92ZXJsYXlzIGRyYXcgdGhlIHNvdXJjZSAoc2VlIHNldFJlZ2lvblNvdXJjZURyYXduKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VEcmF3biQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAvKiogVGhlIHJlZ2lvbiBsb29rIHRoZSB1c2VyIGNob3NlIChvdmVycmlkZXMgdGhlIHNvdXJjZSdzIGhpbnQpLCBmaWVsZCBieSBmaWVsZC4gKi9cbiAgcHJpdmF0ZSB1c2VyU3R5bGU6IFBhcnRpYWw8UmVnaW9uU3R5bGU+ID0ge307XG4gIC8qKiBUaGUgY3VycmVudCBzb3VyY2UncyBzdHlsZSBoaW50LiAqL1xuICBwcml2YXRlIGhpbnRTdHlsZTogUmVnaW9uU291cmNlU3R5bGUgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uU3R5bGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWdpb25TdHlsZT4oREVGQVVMVF9SRUdJT05fU1RZTEUpO1xuICAvKiogQnVtcGVkIG9uIGV2ZXJ5IGNoYW5nZSBvZiB0aGUgc2xpY2UncyBzb3VyY2UsIHNvIGEgbGF0ZSBvcGVuIGlzIGRyb3BwZWQuICovXG4gIHByaXZhdGUgc291cmNlR2VuZXJhdGlvbiA9IDA7XG4gIC8qKiBUaGUgc291cmNlIGxhc3QgcHVibGlzaGVkIGFzIHRoZSB2aWV3OiBhIHNvdXJjZSBzaG93biBhZ2FpbiBkb2VzIG5vdCB0dXJuIHRoZSBsYWJlbHMgYmFjayBvbi4gKi9cbiAgcHJpdmF0ZSBzaG93blNvdXJjZTogUmVnaW9uU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbiBhIHJlZ2lvbiBzb3VyY2UgaXMgYXR0YWNoZWQgb3IgZHJvcHBlZDogd2hhdCBpcyByZWFkIGZyb20gdGhlIHNvdXJjZXMgaXMgc3RhbGUuICovXG4gIHByaXZhdGUgc291cmNlc1ZlcnNpb24gPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHNvdXJjZXMnIHBhcnQgb2Yge0BsaW5rIGNsYXNzVm9sdW1lc30sIGJ5IGNsYXNzIGFuZCB3aGF0IHRoZSBzb3VyY2VzIGhvbGQgKHNlZVxuICAgKiB7QGxpbmsgc291cmNlU3RhdGVLZXl9KTogYW4gZWRpdCBvZiB0aGUgcmVnaW9ucyBsZWF2ZXMgaXQsIHNvIHRoZSB2b2x1bWVzIG9mIGEgc2xpY2UgYmVpbmcgZHJhd25cbiAgICogb24gY29zdCBubyBzb3VyY2UgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZVZvbHVtZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8U291cmNlVm9sdW1lPj4oKTtcbiAgLyoqIFRoZSByZWdpb24gc291cmNlcycgb3V0bGluZXMgb2YgdGhlIGNsYXNzIHNldHMgcmVjb25zdHJ1Y3RlZCBsYXN0IChzZWUge0BsaW5rIHNvdXJjZU91dGxpbmVzfSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlT3V0bGluZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8TGFiZWxsZWRPdXRsaW5lc1tdPj4oKTtcblxuICAvKiogVGhlIGNsYXNzZXMgaGlkZGVuIGZyb20gdmlldyAobmFtZXMgYXMgZ2l2ZW4pOyBldmVyeSBjbGFzcyBpcyBzaG93biBhdCBmaXJzdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoaWRkZW5DbGFzc2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlTZXQ8c3RyaW5nPj4obmV3IFNldCgpKTtcbiAgLyoqIHtAbGluayBoaWRkZW5DbGFzc2VzJH0gYnkge0BsaW5rIHByZXNldEtleX0sIGFzIGEgcmVnaW9uJ3MgbGFiZWwgaXMgbWF0Y2hlZC4gKi9cbiAgcHJpdmF0ZSBoaWRkZW5LZXlzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSkge1xuICAgIC8vIEEgY2xhc3MgY29sb3VyIGNoYW5nZSByZWNvbG91cnMgdGhlIHNvdXJjZSdzIGZlYXR1cmVzIGFzIGl0IHJlY29sb3VycyByZWdpb25zLlxuICAgIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0JCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgICAgIGlmICh2aWV3KSB0aGlzLnNvdXJjZVZpZXckLm5leHQoeyAuLi52aWV3IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogQ1JVRCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVwbGFjZSAob3IsIHdpdGggYGFwcGVuZGAsIGFkZCB0bykgdGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zLiBNaW50cyBpZHNcbiAgICogYW5kIGRlZmF1bHQgbmFtZXMsIGFwcGxpZXMgc3RvcmVkIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMsIGFuZCBlbWl0cy4gV2hlblxuICAgKiBgaXNSZWdpb25TYXZlT25gIGlzIGZhbHNlIHRoZSByZWdpb25zIGFyZSBzaG93biB0cmFuc2llbnRseSAoZW1pdHRlZCkgYnV0XG4gICAqIG5vdCBzdG9yZWQg4oCUIG1pcnJvcnMgdGhlIHByZXZpb3VzIFBsb3RseSBiZWhhdmlvdXIuXG4gICAqL1xuICBzZXRSZWdpb25zKFxuICAgIHJlZ2lvbnM6IFJlZ2lvbltdLFxuICAgIHNob3dSZWdpb25MYWJlbD86IGJvb2xlYW4sXG4gICAgaXNSZWdpb25TYXZlT24/OiBib29sZWFuLFxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcbiAgICBhcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHNob3dSZWdpb25MYWJlbCA9PT0gdW5kZWZpbmVkKSBzaG93UmVnaW9uTGFiZWwgPSB0aGlzLnNob3dTaGFwZUxhYmVsO1xuICAgIGlmIChpc1JlZ2lvblNhdmVPbiA9PT0gdW5kZWZpbmVkKSBpc1JlZ2lvblNhdmVPbiA9IHRoaXMuaXNSZWdpb25TYXZlZE9uO1xuICAgIGlmIChmaWxsQ29sb3IgPT09IHVuZGVmaW5lZCkgZmlsbENvbG9yID0gdGhpcy5maWxsQ29sb3I7XG5cbiAgICByZWdpb25zID0gdGhpcy5hZG1pdChyZWdpb25zKTtcblxuICAgIHRoaXMuaXNSZWdpb25TYXZlZE9uID0gaXNSZWdpb25TYXZlT247XG4gICAgaWYgKGlzUmVnaW9uU2F2ZU9uKSB7XG4gICAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgICAgaWYgKHRoaXMuc2hvd1NoYXBlTGFiZWwgIT09IHNob3dSZWdpb25MYWJlbCkge1xuICAgICAgICB0aGlzLnNob3dTaGFwZUxhYmVsID0gc2hvd1JlZ2lvbkxhYmVsO1xuICAgICAgICB0aGlzLnJlcHVibGlzaFZpZXcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbENvbG9yID0gZmlsbENvbG9yO1xuICAgICAgaWYgKGFwcGVuZCkge1xuICAgICAgICAvLyBSZWplY3QgYnkgaWQgY29sbGlzaW9uIChhbHJlYWR5IHRyYWNrZWQpIG9yIGdlb21ldHJ5IGVxdWFsaXR5IChzYW1lXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzKSDigJQgdGhlIGZpbmQgYnV0dG9uIGNhbiBwdXNoIHRoZSBzYW1lIHJlZ2lvbiByZXBlYXRlZGx5LlxuICAgICAgICBjb25zdCBhZGRlZCA9IHJlZ2lvbnMuZmlsdGVyKFxuICAgICAgICAgIChyKSA9PiAhdGhpcy5yZWdpb25zLnNvbWUoKGV4aXN0aW5nKSA9PiBleGlzdGluZy5pZCA9PT0gci5pZCB8fCByZWdpb25zRXF1YWwoZXhpc3RpbmcsIHIpKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLmNvbmNhdChhZGRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZ2lvbnMgPSByZWdpb25zLnNsaWNlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmVtaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhbnNpZW50IGRpc3BsYXkgb25seSDigJQgZG9uJ3QgdG91Y2ggc3RvcmVkIHN0YXRlLlxuICAgICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQocmVnaW9ucy5zbGljZSgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNhbm9uaWNhbCBhY2Nlc3NvcjogdGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zLiBBIGZyZXNoIGFycmF5LCBidXQgdGhlXG4gICAqIGluc3RhbmNlcyBhcmUgdGhlIHN0b3JlZCBvbmVzLCBzaGFyZWQgd2l0aCB0aGUgdW5kbyBoaXN0b3J5OiB0cmVhdCB0aGVtIGFzXG4gICAqIHJlYWQtb25seSBhbmQgY2hhbmdlIGEgcmVnaW9uIHRocm91Z2ggdGhlIHN0b3JlJ3Mgb3BlcmF0aW9ucyAob3IgYnlcbiAgICogY29tbWl0dGluZyBhIGNvcHkpLiBUeXBlZCBgUmVnaW9uW11gIHJhdGhlciB0aGFuXG4gICAqIGBSZWFkb25seUFycmF5PFJlYWRvbmx5PFJlZ2lvbj4+YCBiZWNhdXNlIHRoZSBJUmVnaW9uU3RvcmUgY29udHJhY3QgYW5kIHRoZVxuICAgKiBiYWNrZW5kcyBzdGlsbCB0YWtlIGEgbXV0YWJsZSBhcnJheS5cbiAgICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMuc2xpY2UoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc2xpY2UgcmVnaW9ucyBmb3Igei1zdGFja3MgKGppdC11aSM5Mykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRydWUgd2hpbGUgYSB6LXN0YWNrIGlzIGxvYWRlZCBhbmQgdGhlIHN0b3JlIGhvbGRzIHJlZ2lvbnMgcGVyIHNsaWNlLiAqL1xuICBpc1N0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5zdGFja01vZGU7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgZGlzcGxheSBzbGljZSAoemVyby1iYXNlZCkuICovXG4gIGdldERpc3BsYXlTbGljZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNjb3BlLmRpc3BsYXlTbGljZTtcbiAgfVxuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgc3RhY2sgcGVyc2lzdHMgdG8gZGlzayAoaml0LXVpIzkzKTogYGNvbWJpbmVkYCA9IG9uZVxuICAgKiAgei1pbmRleGVkIGdlb2pzb24gKHNpbmdsZS1maWxlIHotc3RhY2spOyBgcGVyLXNsaWNlLWZpbGVgID0gb25lIGdlb2pzb24gcGVyXG4gICAqICBzbGljZS1maWxlIChmb2xkZXIgc3RhY2spLiBNZWFuaW5nbGVzcyBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldFN0YWNrU2F2ZUxheW91dCgpOiBTdGFja1NhdmVMYXlvdXQge1xuICAgIHJldHVybiB0aGlzLnNjb3BlLnNhdmVMYXlvdXQ7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgcGVyLXNsaWNlIHN0YWNrIG1vZGUuIGBzbGljZXNgIG1hcHMgZWFjaCB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4IHRvXG4gICAqIHRoZSByZWdpb25zIGltcG9ydGVkIGZvciB0aGF0IHNsaWNlOyB0aGUgc3RvcmUgbWFrZXMgYGluaXRpYWxaYCdzIHNsaWNlIHRoZVxuICAgKiBsaXZlIHNldCwgc28gdGhlIG92ZXJsYXlzIC8gc2VsZWN0aW9uIC8gUmVnaW9ucyB0YWJsZSBhcmUgdW5jaGFuZ2VkICh0aGV5XG4gICAqIHN0aWxsIHJlYWQge0BsaW5rIGdldFJlZ2lvbnN9KS4gRnJlc2hseS1jcmVhdGVkIHJlZ2lvbnMgYXJlIHRhZ2dlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHNsaWNlIHNvIHRoZXkgcGVyc2lzdCBvbiBpdCwgYW5kIHtAbGluayBnZXRTbGljZVJlZ2lvbnN9IHJldHVybnNcbiAgICogZXZlcnkgc2xpY2UgZm9yIHNhdmUvZXhwb3J0LiBJZHMvbmFtZXMvY2xhc3NpZmljYXRpb24gY29sb3VycyBhcmUgbWludGVkXG4gICAqIGV4YWN0bHkgYXMge0BsaW5rIHNldFJlZ2lvbnN9IGRvZXMuXG4gICAqL1xuICBlbnRlclN0YWNrTW9kZShzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFogPSAwLCBzYXZlTGF5b3V0OiBTdGFja1NhdmVMYXlvdXQgPSAnY29tYmluZWQnKTogdm9pZCB7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgZm9yIChjb25zdCBbeiwgcmVnc10gb2Ygc2xpY2VzKSBhZG1pdHRlZC5zZXQoeiwgdGhpcy5ub3JtYWxpemVTbGljZShyZWdzIHx8IFtdLCB6KSk7XG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5zY29wZS5lbnRlclN0YWNrKGFkbWl0dGVkLCBpbml0aWFsWiwgc2F2ZUxheW91dCk7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShbXSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvKiogTGVhdmUgc3RhY2sgbW9kZSAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZS5leGl0U3RhY2soKTtcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvKiogVGhlIGxpdmUtc2V0IHN3YXAgb2Yge0BsaW5rIHNldERpc3BsYXlTbGljZX0uICovXG4gIHByaXZhdGUgc2hvd1NsaWNlKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnNjb3BlLnNob3dTbGljZSh6LCB0aGlzLnJlZ2lvbnMpO1xuICAgIGlmICghbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9ucyA9IG5leHQ7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShbXSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLnJlc2V0VW5kb0hpc3RvcnkoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBhIGRpZmZlcmVudCBzbGljZTogY2FwdHVyZSB0aGUgY3VycmVudCBzbGljZSdzIChwb3NzaWJseSBlZGl0ZWQpXG4gICAqIHJlZ2lvbnMgYmFjayBpbnRvIHRoZSBwZXItc2xpY2Ugc3RvcmUsIHRoZW4gbG9hZCB0aGUgdGFyZ2V0IHNsaWNlJ3MgcmVnaW9uc1xuICAgKiBhcyB0aGUgbGl2ZSBzZXQgYW5kIGVtaXQuIFVuZG8gbmV2ZXIgY3Jvc3NlcyBhIHNsaWNlLiBPdXRzaWRlIHN0YWNrIG1vZGVcbiAgICogdGhpcyBvbmx5IHJlY29yZHMgdGhlIHJlcXVlc3RlZCBzbGljZSBpbmRleCAoYSBuby1vcCBvdGhlcndpc2U6IHNpbmdsZS1wbGFuZVxuICAgKiByZWdpb25zIHN0YXkgb24gdGhlIGRlZmF1bHQgcGxhbmUg4oCUIGFkZFJlZ2lvbiB0YWdzIFJlZ2lvbi56IG9ubHkgaW4gc3RhY2tcbiAgICogbW9kZSwgc28gdGhlIHJlY29yZGVkIGluZGV4IGlzIHVudXNlZCB1bnRpbCBhIHN0YWNrIGlzIGVudGVyZWQpLiAoaml0LXVpIzkzKVxuICAgKiBFaXRoZXIgd2F5IHtAbGluayBnZXRSZWdpb25TZXRSZXBsYWNlZCR9IGVtaXRzOiB0aGUgc2xpY2Ugb24gc2NyZWVuIGNoYW5nZWRcbiAgICogdW5kZXIgYW55IGluLXByb2dyZXNzIHRvb2wgd29yay5cbiAgICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dTbGljZSh6KTtcbiAgICB0aGlzLnJlZ2lvblNldFJlcGxhY2VkJC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiBzbGljZSBpbmRleCBpbiB7QGxpbmsgUmVnaW9uLnp9LiBDYXB0dXJlcyB0aGUgY3VycmVudCBzbGljZSdzIGxpdmUgZWRpdHNcbiAgICogZmlyc3QuIFJldHVybnMgdGhlIGZsYXQgc2luZ2xlLXBsYW5lIHNldCB3aGVuIG5vdCBpbiBzdGFjayBtb2RlLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZS5zbGljZVJlZ2lvbnModGhpcy5yZWdpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljZXMgdG8gd3JpdGUgb24gYSBwZXItc2xpY2UtZmlsZSBzYXZlIChmb2xkZXIgc3RhY2ssIGppdC11aSM5Myk6IGV2ZXJ5XG4gICAqIHNsaWNlIHRoYXQgY3VycmVudGx5IGhhcyByZWdpb25zLCBQTFVTIHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSBidXRcbiAgICogYXJlIG5vdyBlbXB0eSAoc28gdGhlaXIgZmlsZSBpcyByZS13cml0dGVuIGVtcHR5LCBjbGVhcmluZyBhIHNsaWNlIHdob3NlXG4gICAqIHJlZ2lvbnMgdGhlIHVzZXIgZGVsZXRlZCkuIEVhY2ggcmV0dXJuZWQgcmVnaW9uIGlzIHRhZ2dlZCB3aXRoIGl0cyB6LCBhbmRcbiAgICogdGhlIGN1cnJlbnQgbGl2ZSBzbGljZSBpcyBjYXB0dXJlZCBmaXJzdC4gRW1wdHkgb3V0c2lkZSBzdGFjayBtb2RlLlxuICAgKi9cbiAgZ2V0U3RhY2tTYXZlU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgc2xpY2VzID0gdGhpcy5zY29wZS5zdGFja1NhdmVTbGljZXModGhpcy5yZWdpb25zKTtcbiAgICAvLyBBIHNsaWNlIHdob3NlIHJlZ2lvbiBzb3VyY2UgbG9zdCBmZWF0dXJlcyAodGFrZW4sIGRlbGV0ZWQpIGlzIHJlLXdyaXR0ZW4gdG9vLCBhbmQgc28gaXMgb25lXG4gICAgLy8gd2hvc2Ugc291cmNlIHdhcyBpbXBvcnRlZDogaXQgaXMgb24gbm8gZmlsZSB5ZXQuXG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KFsuLi50aGlzLnNvdXJjZXMuc2xpY2VzV2l0aFRha2VuKGltYWdlKSwgLi4udGhpcy5zb3VyY2VzLmltcG9ydGVkU2xpY2VzKGltYWdlKV0pLFxuICAgIF0uZmlsdGVyKCh6KSA9PiAhc2xpY2VzLmhhcyh6KSk7XG4gICAgaWYgKCFjaGFuZ2VkLmxlbmd0aCkgcmV0dXJuIHNsaWNlcztcbiAgICBmb3IgKGNvbnN0IHogb2YgY2hhbmdlZCkgc2xpY2VzLnNldCh6LCBbXSk7XG4gICAgcmV0dXJuIG5ldyBNYXAoQXJyYXkuZnJvbShzbGljZXMpLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdKSk7XG4gIH1cblxuICAvKiogTWludCBpZHMvbmFtZXMgKyBhcHBseSBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzICsgdGFnIHRoZSBzbGljZSBpbmRleCwgYXNcbiAgICogIHtAbGluayBzZXRSZWdpb25zfSBkb2VzLCBmb3IgcmVnaW9ucyBlbnRlcmluZyB0aGUgcGVyLXNsaWNlIHN0b3JlLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVNsaWNlKHJlZ2lvbnM6IFJlZ2lvbltdLCB6OiBudW1iZXIpOiBSZWdpb25bXSB7XG4gICAgLy8gQSBmcmVzaCAoaW1wb3J0ZWQpIHJlZ2lvbiBpcyB0YWdnZWQgaW4gcGxhY2U7IGEgc3RvcmVkIG9uZSBpcyBjb3BpZWQuXG4gICAgcmV0dXJuIHRoaXMuYWRtaXQocmVnaW9ucy5tYXAoKHIpID0+IChyLmlkID09IG51bGwgPyBPYmplY3QuYXNzaWduKHIsIHsgeiB9KSA6IHdpdGhSZWdpb25aKHIsIHopKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgZW50ZXJpbmcgdGhlIHN0b3JlOiBtaW50IGlkcyBhbmQgZGVmYXVsdCBuYW1lcywgaHlkcmF0ZSBKU09OIGJvdW5kc1xuICAgKiBpbnRvIGNsYXNzIGluc3RhbmNlcyDigJQgZXZlcnl0aGluZyBkb3duc3RyZWFtIChyZW5kZXJpbmcsIGdlb21ldHJ5IGRlLWR1cCxcbiAgICogbW92ZVJlZ2lvbiwgR2VvSlNPTiBleHBvcnQpIGRpc2NyaW1pbmF0ZXMgdGhlbSB3aXRoIGBpbnN0YW5jZW9mYFxuICAgKiAoaml0LXVpIzEyNCkg4oCUIGFuZCBhcHBseSBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzLiBBIHJlZ2lvbiB0aGF0IGlzIG5ldyB0b1xuICAgKiB0aGUgc3RvcmUgKG5vIGlkIHlldCkgaXMgY29tcGxldGVkIGluIHBsYWNlOyBvbmUgdGhhdCBhbHJlYWR5IGhhcyBhbiBpZCBtYXlcbiAgICogYmUgYSBzdG9yZWQgaW5zdGFuY2Ugc2hhcmVkIHdpdGggdGhlIHVuZG8gaGlzdG9yeSwgc28gaXQgaXMgY29waWVkIGlmIGl0XG4gICAqIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KHJlZ2lvbnM6IFJlZ2lvbltdKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGZyZXNoID0gbmV3IFNldDxSZWdpb24+KCk7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSByZWdpb25zLm1hcCgocmVnaW9uKSA9PiB7XG4gICAgICBpZiAocmVnaW9uLmlkID09IG51bGwpIHtcbiAgICAgICAgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICAgICAgaWYgKHJlZ2lvbi5uYW1lID09IG51bGwpIHJlZ2lvbi5uYW1lID0gYHNoYXBlJHtyZWdpb24uaWR9YDtcbiAgICAgICAgcmVnaW9uLmJvdW5kcyA9IGh5ZHJhdGVCb3VuZHMocmVnaW9uLmJvdW5kcyk7XG4gICAgICAgIGZyZXNoLmFkZChyZWdpb24pO1xuICAgICAgICByZXR1cm4gcmVnaW9uO1xuICAgICAgfVxuICAgICAgY29uc3QgYm91bmRzID0gaHlkcmF0ZUJvdW5kcyhyZWdpb24uYm91bmRzKTtcbiAgICAgIHJldHVybiByZWdpb24ubmFtZSA9PSBudWxsIHx8IGJvdW5kcyAhPT0gcmVnaW9uLmJvdW5kc1xuICAgICAgICA/IHdpdGhSZWdpb25QYXRjaChyZWdpb24sIHsgbmFtZTogcmVnaW9uLm5hbWUgPz8gYHNoYXBlJHtyZWdpb24uaWR9YCwgYm91bmRzIH0pXG4gICAgICAgIDogcmVnaW9uO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLndpdGhDbGFzc2lmaWNhdGlvbkNvbG9ycyhhZG1pdHRlZCwgKHIpID0+IGZyZXNoLmhhcyhyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VkIHBvbHlnb25zIHByb2plY3RlZCBmb3IgaW1hZ2UtcHJvY2Vzc2luZyBjb25zdW1lcnMgKHNlZ21lbnRhdGlvbixcbiAgICogY3JvcCByZXF1ZXN0cywgdHJhY2UgYnVpbGRlcnMpLCBzdHJhaWdodCBmcm9tIGVhY2ggcmVnaW9uJ3MgYm91bmRzOiBhXG4gICAqIHJlY3RhbmdsZSdzIGNvcm5lcnMsIGEgcG9seWdvbiB3aXRoIGl0cyBob2xlcyAoYSBiw6l6aWVyIGFzIGl0cyBjdXJ2ZSksIG9uZVxuICAgKiBwb2x5Z29uIHBlciBwYXJ0IG9mIGEgbXVsdGktcG9seWdvbi4gT3BlbiBwb2x5bGluZXMgYXJlIGFubm90YXRpb24tb25seSBhbmRcbiAgICogZXhjbHVkZWQuIENvb3JkaW5hdGVzIGFyZSByb3VuZGVkIHRvIHdob2xlIHBpeGVscy5cbiAgICovXG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5mbGF0TWFwKChyZWdpb24pID0+IHJlZ2lvblBvbHlnb25zKHJlZ2lvbikpO1xuICB9XG5cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblVwZGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogTGl2ZSAobm9uLWNvYWxlc2NlZCkgcmVnaW9uLWNoYW5nZSBzdHJlYW0g4oCUIGZpcmVzIHBlciBmcmFtZSBkdXJpbmcgYSBkcmFnLlxuICAgKiAgVXNlZCBieSB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgc28gaXQgdHJhY2tzIGxpbmUgUk9JcyBsaXZlLiAqL1xuICBnZXRSZWdpb25MaXZlRWRpdCQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkxpdmVFZGl0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhZnRlciBldmVyeSB7QGxpbmsgdW5kb30sIHtAbGluayByZWRvfSBhbmQge0BsaW5rIHNldERpc3BsYXlTbGljZX0gY2FsbFxuICAgKiAoZXZlbiBvbmUgdGhhdCBjaGFuZ2VkIG5vdGhpbmcpOiB0aGUgcmVnaW9uIHNldCB3YXMgcmVwbGFjZWQgdW5kZXIgd2hhdGV2ZXJcbiAgICogYSBjYW52YXMgdG9vbCB3YXMgYnVpbGRpbmcgb24gKGEgYnJ1c2ggc3Ryb2tlLCBhIFNBTSBwb2ludCBwcm9tcHQpLCBzbyB0aGVcbiAgICogYmFja2VuZHMgcmVzZXQgdGhlaXIgY2FudmFzIHRvb2xzIG9uIGl0LiBOb3QgZW1pdHRlZCBmb3Igb3JkaW5hcnkgZWRpdHMg4oCUXG4gICAqIGEgdG9vbCdzIG93biBjb21taXQgbXVzdCBub3QgcmVzZXQgaXQuXG4gICAqL1xuICBnZXRSZWdpb25TZXRSZXBsYWNlZCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU2V0UmVwbGFjZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTZWxlY3QgcmVnaW9ucyBieSBhcnJheSBpbmRleCAob3IgW10gdG8gY2xlYXIpLiBTdG9yZWQgaW50ZXJuYWxseSBieSBpZFxuICAgKiAgc28gdGhlIHNlbGVjdGlvbiBzdXJ2aXZlcyBzdWJzZXF1ZW50IGVkaXRzL3Jlb3JkZXJzLiAqL1xuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdEluZGljZXMoaW5kaWNlcywgdGhpcy5yZWdpb25zKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgYSBzaW5nbGUgcmVnaW9uIGJ5IGlkZW50aXR5IChpZCkuIEJhY2tlbmRzIGNhbGwgdGhpcyBmcm9tIHRoZWlyXG4gICAqICBgc2VsZWN0UmVnaW9uKClgOyB0aGUgT1NEIG92ZXJsYXkgKyByZWdpb24gZWRpdG9yIGhpZ2hsaWdodCBvZmYgdGhlXG4gICAqICByZXN1bHRpbmcgc2VsZWN0aW9uIGVtaXQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkIHtcbiAgICBpZiAocmVnaW9uPy5pZCA9PSBudWxsIHx8IHRoaXMuaW5kZXhPZklkKHJlZ2lvbi5pZCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShbcmVnaW9uLmlkXSk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5pbmRpY2VzJDtcbiAgfVxuXG4gIC8qKiBTeW5jaHJvbm91cyBjdXJyZW50IHNlbGVjdGlvbiAoYXJyYXkgaW5kaWNlcykg4oCUIGZvciBjYWxsZXJzIHRoYXQgbmVlZCB0b1xuICAgKiAgcmVhZCB0aGUgc2VsZWN0aW9uIHdpdGhvdXQgc3Vic2NyaWJpbmcuICovXG4gIGdldFNlbGVjdGVkU2hhcGVJbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaW5kaWNlcztcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZWdpb25zIGFuZCBjbGVhciB0aGUgc2VsZWN0aW9uLiAqL1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvbi5pZHMpO1xuICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5maWx0ZXIoKHIpID0+ICFpZHMuaGFzKHIuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKFtdKTtcbiAgICB0aGlzLnN5bmNDYWNoZSgpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogY29sb3VycyAvIGxhYmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U2hhcGVMYWJlbDtcbiAgfVxuICBnZXRTaGFwZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcGVDb2xvcjtcbiAgfVxuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWxsQ29sb3I7XG4gIH1cblxuICAvKiogU2hvdyBvciBoaWRlIHJlZ2lvbiBsYWJlbHMgKG5vdCBvbiB0aGUgY29udHJhY3Q7IHNwZWNzIGRyaXZlIGl0IGRpcmVjdGx5KS5cbiAgICogIEBkZXByZWNhdGVkIE5vdGhpbmcgaW4gdGhlIGxpYnJhcnkgY2FsbHMgaXQ7IHdpbGwgYmUgcmVtb3ZlZCBuZXh0IG1pbm9yLiAqL1xuICBzZXRTaG93U2hhcGVMYWJlbChzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHNob3c7XG4gICAgdGhpcy5yZXB1Ymxpc2hWaWV3KCk7XG4gIH1cblxuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpO1xuICB9XG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbCwgY29sb3IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZTogdW5kbyAvIHJlZG8gKGppdC11aSM4NSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEVtaXRzIHdoZXRoZXIgYW4gdW5kbyBzdGVwIGlzIGN1cnJlbnRseSBhdmFpbGFibGUg4oCUIGRyaXZlcyB0aGUgdG9vbGJhclxuICAgKiAgVW5kbyBidXR0b24ncyBlbmFibGVkIHN0YXRlIChncmV5ZWQgb3V0IHdoZW4gZmFsc2UpLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmNhblVuZG8kO1xuICB9XG5cbiAgLyoqIEVtaXRzIHdoZXRoZXIgYSByZWRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBSZWRvIGJ1dHRvbidzIGVuYWJsZWQgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuY2FuUmVkbyQ7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCBvZiB7QGxpbmsgZ2V0Q2FuVW5kbyR9IOKAlCB0cnVlIHdoZW4gYXQgbGVhc3Qgb25lIHJlZ2lvblxuICAgKiAgYWN0aW9uIGNhbiBiZSB1bmRvbmUuICovXG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5jYW5VbmRvKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCBvZiB7QGxpbmsgZ2V0Q2FuUmVkbyR9IOKAlCB0cnVlIHdoZW4gYW4gdW5kb25lIGFjdGlvbiBjYW5cbiAgICogIGJlIHJlLWFwcGxpZWQuICovXG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5jYW5SZWRvKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyB0aGUgbW9zdCByZWNlbnQgcmVnaW9uIGFjdGlvbiwgcmVzdG9yaW5nIHRoZSByZWdpb24gc2V0IHRvIGl0cyBzdGF0ZVxuICAgKiBqdXN0IGJlZm9yZSB0aGF0IGFjdGlvbiBhbmQgcHVzaGluZyB0aGUgY3VycmVudCBzdGF0ZSBvbnRvIHRoZSByZWRvIHN0YWNrLlxuICAgKiBVcCB0byB7QGxpbmsgVU5ET19MSU1JVH0gc3RlcHMgYXJlIHJldGFpbmVkLCBzbyB0aGlzIGNhbiBiZSBjYWxsZWQgdXAgdG9cbiAgICoge0BsaW5rIFVORE9fTElNSVR9IHRpbWVzIGluIGEgcm93IGJlZm9yZSB0aGUgaGlzdG9yeSBlbXB0aWVzLiBOby1vcCB3aGVuXG4gICAqIG5vdGhpbmcgaXMgbGVmdCB0byB1bmRvLlxuICAgKi9cbiAgdW5kbygpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuaGlzdG9yeS51bmRvKHRoaXMuc25hcHNob3QoKSk7XG4gICAgaWYgKHNuYXBzaG90KSB0aGlzLnJlc3RvcmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gICAgdGhpcy5yZWdpb25TZXRSZXBsYWNlZCQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZG8gdGhlIGFjdGlvbiBtb3N0IHJlY2VudGx5IHVuZG9uZSwgcmVzdG9yaW5nIHRoZSByZWdpb24gc2V0IHRvIHRoZSBzdGF0ZVxuICAgKiBpdCBoYWQgYmVmb3JlIHRoYXQgdW5kbyBhbmQgcHVzaGluZyB0aGUgY3VycmVudCBzdGF0ZSBiYWNrIG9udG8gdGhlIHVuZG9cbiAgICogc3RhY2suIE5vLW9wIHdoZW4gdGhlcmUncyBub3RoaW5nIHRvIHJlZG8gKHRoZSByZWRvIHN0YWNrIGlzIGNsZWFyZWQgYnkgYW55XG4gICAqIGZyZXNoIHJlZ2lvbiBhY3Rpb24pLlxuICAgKi9cbiAgcmVkbygpOiB2b2lkIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuaGlzdG9yeS5yZWRvKHRoaXMuc25hcHNob3QoKSk7XG4gICAgaWYgKHNuYXBzaG90KSB0aGlzLnJlc3RvcmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gICAgdGhpcy5yZWdpb25TZXRSZXBsYWNlZCQubmV4dCgpO1xuICB9XG5cbiAgLyoqIERpc2NhcmQgdGhlIHVuZG8vcmVkbyBoaXN0b3J5IChlLmcuIG9uIGltYWdlIGxvYWQvc3dpdGNoIOKAlCBoaXN0b3J5IG5ldmVyXG4gICAqICBjcm9zc2VzIGltYWdlcykuICovXG4gIHJlc2V0VW5kb0hpc3RvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5oaXN0b3J5LnJlc2V0KCk7XG4gIH1cblxuICAvKiogTWFrZSBgc25hcHNob3RgIHRoZSBsaXZlIHJlZ2lvbiBzZXQgYW5kIG5vdGlmeSBib3RoIGJhY2tlbmRzLiBTaGFyZWQgYnlcbiAgICogIHtAbGluayB1bmRvfSBhbmQge0BsaW5rIHJlZG99OyBub3RoaW5nIHJlY29yZHMgaGlzdG9yeSB3aGlsZSBpdCBydW5zLiAqL1xuICBwcml2YXRlIHJlc3RvcmVTbmFwc2hvdChzbmFwc2hvdDogUmVnaW9uU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvcnkucmVzdG9yZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lvbnMgPSBzbmFwc2hvdC5yZWdpb25zLnNsaWNlKCk7XG4gICAgICB0aGlzLnNldFRha2VuKHNuYXBzaG90LnRha2VuKTtcbiAgICAgIHRoaXMuc3luY0NhY2hlKCk7XG4gICAgICAvLyBEcm9wcyBhbnkgc2VsZWN0ZWQgaWRzIHRoZSByZXN0b3JlZCBzZXQgbm8gbG9uZ2VyIGNvbnRhaW5zLlxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgfSk7XG4gICAgLy8gTm90aWZ5IHRoZSBsaXZlICsgY29hbGVzY2VkIHN0cmVhbXMgc28gd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuXG4gICAgLy8gcmUtcmVuZGVycyBmcm9tIHRoZSByZXN0b3JlZCBzdG9yZSBzdGF0ZS5cbiAgICB0aGlzLnJlZ2lvbkxpdmVFZGl0JC5uZXh0KHRoaXMucmVnaW9ucy5zbGljZSgpKTtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLmdldFJlZ2lvbnMoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSB0aGUgcHJlLWFjdGlvbiByZWdpb24gc2V0IGludG8gdGhlIGJvdW5kZWQgdW5kbyBoaXN0b3J5LiBDYWxsZWQgYXRcbiAgICogdGhlIHRvcCBvZiBldmVyeSBtdXRhdGluZyBvcGVyYXRpb24sICpiZWZvcmUqIGl0IGNoYW5nZXMgYHJlZ2lvbnNgLiBUaGVcbiAgICogc25hcHNob3QgaXMgdGhlIGFycmF5IGl0c2VsZjogZXZlcnkgb3BlcmF0aW9uIHJlcGxhY2VzIGByZWdpb25zYCAoYW5kIGFueVxuICAgKiByZWdpb24gaXQgZWRpdHMpIHJhdGhlciB0aGFuIGNoYW5naW5nIHRoZW0sIHNvIGl0IG5ldmVyIGNoYW5nZXMgYWZ0ZXIgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkVW5kb1NuYXBzaG90KCk6IHZvaWQge1xuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zbmFwc2hvdCgpKTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhdGUgYW4gdW5kbyBzdGVwIHJlc3RvcmVzLiAqL1xuICBwcml2YXRlIHNuYXBzaG90KCk6IFJlZ2lvblNuYXBzaG90IHtcbiAgICByZXR1cm4geyByZWdpb25zOiB0aGlzLnJlZ2lvbnMsIHRha2VuOiB0aGlzLmN1cnJlbnRUYWtlbigpIH07XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlOiBHZW9KU09OIEkvTyAobW9kZWxzL3JlZ2lvbi1nZW9qc29uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUGFyc2UgR2VvSlNPTiBpbnRvIHJlZ2lvbnMsIHJlbWVtYmVyaW5nIHRoZSBjbGFzcyBjb2xvdXJzIHRoZSBmaWxlIGNhcnJpZXMgc28gdGhleSBhcmVcbiAgICogIGtlcHQgZm9yIGNsYXNzZXMgd2l0aCBubyBwcmVzZXQgKHNlZSBWaXN1YWxpemVyU3RvcmUucmVtZW1iZXJJbXBvcnRlZENsYXNzQ29sb3JzKS4gKi9cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXSB7XG4gICAgY29uc3QgcmVnaW9ucyA9IHJlZ2lvbnNGcm9tR2VvSnNvbihnZW9Kc29uU3RyKTtcbiAgICBjb25zdCBjb2xvcnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgICBpZiAoci5sYWJlbCAmJiByLmNvbG9yICYmICFjb2xvcnMuaGFzKHIubGFiZWwpKSBjb2xvcnMuc2V0KHIubGFiZWwsIHIuY29sb3IpO1xuICAgIH1cbiAgICBpZiAoY29sb3JzLnNpemUpIHRoaXMuc3RvcmUucmVtZW1iZXJJbXBvcnRlZENsYXNzQ29sb3JzKGNvbG9ycyk7XG4gICAgcmV0dXJuIHJlZ2lvbnM7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciBgZmlsZU5hbWVgIChleHRlbnNpb25cbiAgICogIHJlcGxhY2VkIGJ5IGAuZ2VvanNvbmApIG9yIGByb2lzLmdlb2pzb25gIHdpdGhvdXQgb25lLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdLCBmaWxlTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGRvd25sb2FkR2VvSnNvbihyZWdpb25zVG9HZW9Kc29uKHJlZ2lvbnMpLCBmaWxlTmFtZSk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZyhyZWdpb25zOiBSZWdpb25bXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlZ2lvbnNUb0dlb0pzb24ocmVnaW9ucyk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRBcGk6IHN0cnVjdHVyYWwgZWRpdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkUmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogbnVtYmVyIHtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIGlmIChyZWdpb24uaWQgPT0gbnVsbCkgcmVnaW9uLmlkID0gdGhpcy5uZXh0SWQrKztcbiAgICBpZiAocmVnaW9uLm5hbWUgPT0gbnVsbCkgcmVnaW9uLm5hbWUgPSBgc2hhcGUke3JlZ2lvbi5pZH1gO1xuICAgIHJlZ2lvbi5ib3VuZHMgPSBoeWRyYXRlQm91bmRzKHJlZ2lvbi5ib3VuZHMpOyAvLyBqaXQtdWkjMTI0XG4gICAgLy8gQSByZWdpb24gZHJhd24gb24gYSBzdGFjayBiZWxvbmdzIHRvIHRoZSBzbGljZSBjdXJyZW50bHkgZGlzcGxheWVkLCBzb1xuICAgIC8vIGl0IHNhdmVzL3JlbG9hZHMgb24gdGhhdCBzbGljZSAoaml0LXVpIzkzKS4gTm8tb3AgZm9yIHNpbmdsZS1wbGFuZSBpbWFnZXNcbiAgICAvLyAodGhlIGRpc3BsYXkgc2xpY2Ugc3RheXMgMCkuXG4gICAgaWYgKHRoaXMuc2NvcGUuc3RhY2tNb2RlKSByZWdpb24ueiA9IHRoaXMuc2NvcGUuZGlzcGxheVNsaWNlO1xuICAgIC8vIFRoZSBjYWxsZXIncyBpbnN0YW5jZSBiZWNvbWVzIHRoZSBzdG9yZWQgb25lIChjb21wbGV0ZWQgaW4gcGxhY2UpLlxuICAgIGNvbnN0IFtzdG9yZWRdID0gdGhpcy53aXRoQ2xhc3NpZmljYXRpb25Db2xvcnMoW3JlZ2lvbl0sICgpID0+IHRydWUpO1xuICAgIHRoaXMucmVnaW9ucyA9IFsuLi50aGlzLnJlZ2lvbnMsIHN0b3JlZF07XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShbc3RvcmVkLmlkXSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgICByZXR1cm4gc3RvcmVkLmlkO1xuICB9XG5cbiAgcmVtb3ZlUmVnaW9uKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVJlZ2lvbnMoW2lkXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSByZWdpb25zIHdpdGggdGhlc2UgaWRzLCBpZiBwcmVzZW50LiBXaXRoIGB7IHJlY29yZFVuZG86IGZhbHNlIH1gXG4gICAqIG5vIHVuZG8gc3RlcCBpcyB0YWtlbiDigJQgZm9yIGNsZWFyaW5nIHRyYW5zaWVudCBzaGFwZXMgdGhhdCB3ZXJlIG5ldmVyIHRoZVxuICAgKiB1c2VyJ3Mgd29yayAodGhlIDNEIHZpZXcncyBzY3JlZW4tc3BhY2UgbGFzc29zIG9uIGFuIG9yYml0LCBOQVBBUkktU1ZDLTExKS5cbiAgICovXG4gIHJlbW92ZVJlZ2lvbnMoaWRzOiBJdGVyYWJsZTxudW1iZXI+LCBvcHRzOiB7IHJlY29yZFVuZG8/OiBib29sZWFuIH0gPSB7fSk6IHZvaWQge1xuICAgIGNvbnN0IGRyb3AgPSBuZXcgU2V0KGlkcyk7XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuc29tZSgocikgPT4gZHJvcC5oYXMoci5pZCkpKSByZXR1cm47XG4gICAgaWYgKG9wdHMucmVjb3JkVW5kbyAhPT0gZmFsc2UpIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLmZpbHRlcigocikgPT4gIWRyb3AuaGFzKHIuaWQpKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZXRhaW4oKHMpID0+ICFkcm9wLmhhcyhzKSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIHVwZGF0ZUJvdW5kcyhpZDogbnVtYmVyLCBib3VuZHM6IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24pOiB2b2lkIHtcbiAgICBjb25zdCByID0gdGhpcy5maW5kQnlJZChpZCk7XG4gICAgaWYgKCFyKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICAvLyBBIGNvcHksIHNvIHRoZSBjYWxsZXIgY2FuIGtlZXAgdXNpbmcgKGFuZCBjaGFuZ2luZykgdGhlIGJvdW5kcyBpdCBwYXNzZWQuXG4gICAgdGhpcy5yZXBsYWNlUmVnaW9uKHJlcGxhY2VCb3VuZHMociwgY2xvbmVCb3VuZHMoYm91bmRzKSkpO1xuICB9XG5cbiAgbW92ZVJlZ2lvbihpZDogbnVtYmVyLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghciB8fCAhci5ib3VuZHMpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIC8vIEV2ZXJ5IHBhcnQgKGFuZCBpdHMgaG9sZXMpIG1vdmVzIHRvZ2V0aGVyIChqaXQtdWkjODUpLlxuICAgIHRoaXMucmVwbGFjZVJlZ2lvbihyZXBsYWNlQm91bmRzKHIsIGVkaXQudHJhbnNsYXRlQm91bmRzKHIuYm91bmRzLCBkeCwgZHkpKSk7XG4gIH1cblxuICAvLyDilIDilIAgSVJlZ2lvbkVkaXRBcGk6IHZlcnRleCBlZGl0cyAocG9seWdvbnMgb25seSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEVhY2ggb25lIGlzIGEgcHVyZSBjb3B5LW9uLXdyaXRlIGVkaXQgZnJvbSBtb2RlbHMvcG9seWdvbi1lZGl0OyBhIG51bGxcbiAgLy8gcmVzdWx0IChvdXQgb2YgcmFuZ2UsIHdvdWxkIGRlZ2VuZXJhdGUpIHJlY29yZHMgbm90aGluZyBhbmQgZW1pdHMgbm90aGluZy5cblxuICBtb3ZlVmVydGV4KGlkOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQubW92ZVZlcnRleChwLCBpbmRleCwgeCwgeSkpO1xuICB9XG5cbiAgLyoqIE1vdmUgYSB2ZXJ0ZXggb24gYSBwb2x5Z29uJ3MgaW50ZXJpb3IgcmluZyAoaG9sZSkg4oCUIGppdC11aSM4NS4gKi9cbiAgbW92ZUhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQubW92ZUhvbGVWZXJ0ZXgocCwgaG9sZUluZGV4LCBpbmRleCwgeCwgeSkpO1xuICB9XG5cbiAgLyoqIEluc2VydCBhIHZlcnRleCBvbiBhIHBvbHlnb24ncyBpbnRlcmlvciByaW5nIChob2xlKSwgYWZ0ZXIgYHNlZ0luZGV4YFxuICAgKiAgKHRoZSBlZGdlJ3Mgc3RhcnQgdmVydGV4KS4gTm8tb3AgZm9yIGFuIG91dC1vZi1yYW5nZSBob2xlIOKAlCBqaXQtdWkjODUuICovXG4gIGFkZEhvbGVWZXJ0ZXgoaWQ6IG51bWJlciwgaG9sZUluZGV4OiBudW1iZXIsIHNlZ0luZGV4OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQuYWRkSG9sZVZlcnRleChwLCBob2xlSW5kZXgsIHNlZ0luZGV4LCB4LCB5KSk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoZSB2ZXJ0ZXggYXQgYGluZGV4YCBvbiBhIHBvbHlnb24ncyBpbnRlcmlvciByaW5nIChob2xlKS4gUmVtb3ZpbmdcbiAgICogIGl0IGJlbG93IDMgdmVydGljZXMgZHJvcHMgdGhlIHdob2xlIGhvbGUgKGEgcmluZyB3aXRoIDwgMyBwb2ludHMgYm91bmRzIG5vXG4gICAqICBhcmVhKSDigJQgaml0LXVpIzg1LiAqL1xuICBkZWxldGVIb2xlVmVydGV4KGlkOiBudW1iZXIsIGhvbGVJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQuZGVsZXRlSG9sZVZlcnRleChwLCBob2xlSW5kZXgsIGluZGV4KSk7XG4gIH1cblxuICBhZGRWZXJ0ZXgoaWQ6IG51bWJlciwgc2VnSW5kZXg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRQb2x5Z29uKGlkLCAocCkgPT4gZWRpdC5hZGRWZXJ0ZXgocCwgc2VnSW5kZXgsIHgsIHkpKTtcbiAgfVxuXG4gIGRlbGV0ZVZlcnRleChpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQuZGVsZXRlVmVydGV4KHAsIGluZGV4KSk7XG4gIH1cblxuICBzZXRCZXppZXIoaWQ6IG51bWJlciwgYmV6aWVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghciB8fCAhci5ib3VuZHMpIHJldHVybjtcbiAgICBsZXQgbmV4dDogUG9seWdvbiB8IG51bGwgPSBudWxsO1xuICAgIGlmIChyLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIG5leHQgPSBlZGl0LnNldEJlemllcihyLmJvdW5kcywgYmV6aWVyKTtcbiAgICB9IGVsc2UgaWYgKHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlICYmIGJlemllcikge1xuICAgICAgLy8gU21vb3RoaW5nIGEgcmVjdGFuZ2xlOiBjb252ZXJ0IGl0IHRvIGEgNC1hbmNob3IgY2xvc2VkIHBvbHlnb24gZmlyc3QuXG4gICAgICBjb25zdCByaW5nID0gcmVjdFRvUmluZyhyLmJvdW5kcyk7XG4gICAgICBuZXh0ID0gZWRpdC5zZXRCZXppZXIobWFrZVBvbHlnb24ocmluZy54cywgcmluZy55cyksIHRydWUpO1xuICAgIH1cbiAgICBpZiAoIW5leHQpIHJldHVybjsgLy8gYWxyZWFkeSBpbiB0aGF0IHN0YXRlLCBvciBiZXppZXI9ZmFsc2Ugb24gYSByZWN0YW5nbGVcbiAgICB0aGlzLnJlY29yZFVuZG9TbmFwc2hvdCgpO1xuICAgIHRoaXMucmVwbGFjZVJlZ2lvbihyZXBsYWNlQm91bmRzKHIsIG5leHQpKTtcbiAgfVxuXG4gIC8qKiBEcmFnIGEgYmV6aWVyIGNvbnRyb2wgcG9pbnQgb24gYSBob2xlIHJpbmcgdmVydGV4IChkb251dCBiZXppZXIgZWRpdGluZykuICovXG4gIG1vdmVIb2xlQmV6aWVySGFuZGxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgaG9sZUluZGV4OiBudW1iZXIsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzaWRlOiAnaW4nIHwgJ291dCcsXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQubW92ZUhvbGVCZXppZXJIYW5kbGUocCwgaG9sZUluZGV4LCBpbmRleCwgc2lkZSwgeCwgeSkpO1xuICB9XG5cbiAgbW92ZUJlemllckhhbmRsZShpZDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCBzaWRlOiAnaW4nIHwgJ291dCcsIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0UG9seWdvbihpZCwgKHApID0+IGVkaXQubW92ZUJlemllckhhbmRsZShwLCBpbmRleCwgc2lkZSwgeCwgeSkpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGEgY29weS1vbi13cml0ZSBwb2x5Z29uIGVkaXQgdG8gcmVnaW9uIGBpZGA6IHJlY29yZCwgc3dhcCBpbiwgZW1pdC4gKi9cbiAgcHJpdmF0ZSBlZGl0UG9seWdvbihpZDogbnVtYmVyLCBhcHBseTogKHA6IFBvbHlnb24pID0+IFBvbHlnb24gfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgciA9IHRoaXMuZmluZEJ5SWQoaWQpO1xuICAgIGlmICghciB8fCAhKHIuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gYXBwbHkoci5ib3VuZHMpO1xuICAgIGlmICghbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMucmVjb3JkVW5kb1NuYXBzaG90KCk7XG4gICAgdGhpcy5yZXBsYWNlUmVnaW9uKHJlcGxhY2VCb3VuZHMociwgbmV4dCkpO1xuICB9XG5cbiAgLyoqIFN3YXAgYG5leHRgIGluIGZvciB0aGUgc3RvcmVkIHJlZ2lvbiB3aXRoIGl0cyBpZCAoYSBuZXcgYXJyYXkpLCB0aGVuIHN5bmMgYW5kIGVtaXQuICovXG4gIHByaXZhdGUgcmVwbGFjZVJlZ2lvbihuZXh0OiBSZWdpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMubWFwKChyKSA9PiAoci5pZCA9PT0gbmV4dC5pZCA/IG5leHQgOiByKSk7XG4gICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKiBDb2FsZXNjZSBgcmVnaW9uVXBkYXRlJGAgdW50aWwgdGhlIG1hdGNoaW5nIHtAbGluayBlbmRCYXRjaH0gKGxpdmUgZHJhZ3MpO1xuICAgKiAgdGhlIGJhdGNoIGlzIGFsc28gb25lIHVuZG8gZ2VzdHVyZSAoe0BsaW5rIGJlZ2luR2VzdHVyZX0pLiAqL1xuICBiZWdpbkJhdGNoKCk6IHZvaWQge1xuICAgIHRoaXMuYmF0Y2hEZXB0aCsrO1xuICAgIHRoaXMuYmVnaW5HZXN0dXJlKCk7XG4gIH1cbiAgZW5kQmF0Y2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmF0Y2hEZXB0aCA+IDApIHRoaXMuYmF0Y2hEZXB0aC0tO1xuICAgIHRoaXMuZW5kR2VzdHVyZSgpO1xuICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPT09IDAgJiYgdGhpcy5wZW5kaW5nRW1pdCkge1xuICAgICAgdGhpcy5wZW5kaW5nRW1pdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBzdGFydCBvZiBvbmUgdXNlciBnZXN0dXJlIChlLmcuIGEgd2FuZC9icnVzaCBtb3VzZWRvd24pOiBldmVyeVxuICAgKiBjb21taXQgdW50aWwgdGhlIG1hdGNoaW5nIHtAbGluayBlbmRHZXN0dXJlfSBiZWNvbWVzIGEgc2luZ2xlIHVuZG8gc3RlcCxcbiAgICogd2l0aG91dCBkZWxheWluZyBgcmVnaW9uVXBkYXRlJGAgKHRvb2xzIHJlbmRlciB0aHJvdWdoIGl0IHdoaWxlIGRyYWdnaW5nKS5cbiAgICogQ2FsbHMgbmVzdC4gQSBnZXN0dXJlIG5ldmVyIGZvbGRzIGludG8gYW4gZWFybGllciB0aW1lZCBidXJzdC5cbiAgICovXG4gIGJlZ2luR2VzdHVyZSgpOiB2b2lkIHtcbiAgICB0aGlzLmhpc3RvcnkuYmVnaW5HZXN0dXJlKCk7XG4gIH1cblxuICAvKiogRW5kIHRoZSBnZXN0dXJlIG9wZW5lZCBieSB7QGxpbmsgYmVnaW5HZXN0dXJlfTsgdGhlIG5leHQgY29tbWl0IHN0YXJ0cyBhIG5ldyBzdGVwLiAqL1xuICBlbmRHZXN0dXJlKCk6IHZvaWQge1xuICAgIHRoaXMuaGlzdG9yeS5lbmRHZXN0dXJlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIHNvdXJjZXM6IGxhcmdlIHJlZ2lvbiBzZXRzLCB0aWxlZCBieSBsZXZlbCBvZiBkZXRhaWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSBpbnN0ZWFkIG9mIGFzIHJlZ2lvbnM6IHRoZSBiYWNrZW5kcyB0aGF0XG4gICAqIGRyYXcgc291cmNlcyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpKSBkcmF3IGl0cyBmZWF0dXJlcyBhdCB0aGUgZGV0YWlsIHRoZSB6b29tIHNob3dzLCBmcm9tXG4gICAqIHRoZSB0aWxlcyBpbiB2aWV3LCBhbmQgYSBmZWF0dXJlIGpvaW5zIHRoZSByZWdpb25zIOKAlCBleGFjdGx5LCBhcyBhbiBvcmRpbmFyeSBlZGl0YWJsZVxuICAgKiB7QGxpbmsgUmVnaW9ufSB3aXRoIGl0cyB7QGxpbmsgUmVnaW9uLnNvdXJjZUlkfSDigJQgb25seSB3aGVuIGl0IGlzIHNlbGVjdGVkIG9yIGVkaXRlZFxuICAgKiAoe0BsaW5rIHRha2VTb3VyY2VGZWF0dXJlc30pLiBVbnRpbCB0aGVuIHtAbGluayBnZXRSZWdpb25zfSBkb2VzIG5vdCBpbmNsdWRlIGl0LlxuICAgKlxuICAgKiBgc291cmNlYCBtYXkgYmUgYW4gb3BlbmVyLCBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgaXRzIHNsaWNlIGlzIHNob3duIChhbmQgYWdhaW4gaWYgdGhlXG4gICAqIHNvdXJjZSB3YXMgY2xvc2VkIHRvIHNhdmUgbWVtb3J5KS4gYHNsaWNlc2Agc2F5cyB3aGljaCBzbGljZSBvZiB0aGUgY3VycmVudCBpbWFnZSBpdFxuICAgKiBzZXJ2ZXM6IG9uZSAoZGVmYXVsdDogdGhlIHNsaWNlIHNob3duOyBwbGFuZSAwIG9mIHRoZSBzb3VyY2UpLCBvciBgJ3BsYW5lcydgLCBldmVyeSBzbGljZSB6XG4gICAqIGZyb20gcGxhbmUgeiBvZiBhIHotaW5kZXhlZCBzb3VyY2UuIFJlcGxhY2VzIHRoZSBzb3VyY2UgdGhvc2Ugc2xpY2VzIGhhZC5cbiAgICpcbiAgICogYGltcG9ydGVkYCBtYXJrcyBhIHNvdXJjZSBicm91Z2h0IGluIG92ZXIgdGhlIGltYWdlIChhbiBpbXBvcnRlZCB2b2x1bWUsIGZvbGRlciBvciBzZXJ2ZWQgc2V0KVxuICAgKiByYXRoZXIgdGhhbiB0aGUgaW1hZ2UncyBvd24gcmVnaW9uczogaXQgaXMgb24gbm8gZmlsZSB5ZXQsIHNvIGEgc2F2ZSB3cml0ZXMgaXRzIHNsaWNlcyB0aG91Z2hcbiAgICogbm90aGluZyB3YXMgdGFrZW4gZnJvbSBpdCDigJQgYHRydWVgIGZvciBhIHNvdXJjZSBvZiBvbmUgc2xpY2UsIHRoZSBzbGljZXMgaXRzIHBsYW5lcyBjb3ZlciBmb3IgYVxuICAgKiBgJ3BsYW5lcydgIHNvdXJjZS4gVGhlIGltYWdlJ3Mgb3duIHNvdXJjZXMgYXJlIG5vdCBtYXJrZWQ6IGxvYWRpbmcgdGhlbSBjaGFuZ2VzIG5vdGhpbmcgdG8gc2F2ZS5cbiAgICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShcbiAgICBzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lcixcbiAgICBzbGljZXM6IFJlZ2lvblNvdXJjZVNsaWNlcyA9IHsgc2xpY2U6IHRoaXMuc291cmNlU2xpY2UgfSxcbiAgICBpbXBvcnRlZDogYm9vbGVhbiB8IHJlYWRvbmx5IG51bWJlcltdID0gZmFsc2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5zY29wZS5hY3RpdmVJbWFnZTtcbiAgICBpZiAoIWltYWdlKSByZXR1cm47XG4gICAgY29uc3Qgb3BlbjogUmVnaW9uU291cmNlT3BlbmVyID0gdHlwZW9mIHNvdXJjZSA9PT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZSA6ICgpID0+IFByb21pc2UucmVzb2x2ZShzb3VyY2UpO1xuICAgIGNvbnN0IGltcG9ydGVkU2xpY2VzID1cbiAgICAgIGltcG9ydGVkID09PSBmYWxzZSA/IFtdIDogaW1wb3J0ZWQgPT09IHRydWUgPyAoc2xpY2VzID09PSAncGxhbmVzJyA/IFtdIDogW3NsaWNlcy5zbGljZV0pIDogaW1wb3J0ZWQ7XG4gICAgdGhpcy5zb3VyY2VzLmF0dGFjaChpbWFnZSwgb3Blbiwgc2xpY2VzLCBpbXBvcnRlZFNsaWNlcyk7XG4gICAgdGhpcy5zb3VyY2VzVmVyc2lvbisrO1xuICAgIHRoaXMucmVmcmVzaFNvdXJjZVZpZXcoKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBjdXJyZW50IGltYWdlJ3MgcmVnaW9uIHNvdXJjZXMgKGNsb3NpbmcgdGhlbSkgYW5kIHdoYXQgd2FzIHRha2VuIGZyb20gdGhlbS4gKi9cbiAgZGV0YWNoUmVnaW9uU291cmNlcygpOiB2b2lkIHtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuICAgIHRoaXMuc291cmNlcy5kZXRhY2hJbWFnZShpbWFnZSk7XG4gICAgdGhpcy5zb3VyY2VzVmVyc2lvbisrO1xuICAgIHRoaXMucmVmcmVzaFNvdXJjZVZpZXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIHRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UsIGZvciByZWdpb25zIGltcG9ydGVkIGluIHBsYWNlIG9mIHRoZSBzbGljZSdzIChhIHNtYWxsIGZpbGVcbiAgICogcmVwbGFjaW5nIGEgbGFyZ2Ugb25lKTogYSBzb3VyY2Ugb2YgdGhlIHNsaWNlJ3Mgb3duIGlzIGRldGFjaGVkOyBhIHotaW5kZXhlZCBzb3VyY2Ugb3ZlciBldmVyeVxuICAgKiBzbGljZSBoYXMgdGhpcyBzbGljZSdzIGZlYXR1cmVzIHRha2VuIG91dCAoYXMgZGVsZXRlZCkuIFRoZSBvdGhlciBzbGljZXMga2VlcCB0aGVpcnMuXG4gICAqL1xuICBhc3luYyBkcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5zb3VyY2VTbGljZTtcbiAgICBpZiAoIWltYWdlIHx8ICF0aGlzLnNvdXJjZXMuaGFzKGltYWdlLCBzbGljZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5zb3VyY2VzLmhhc093blNvdXJjZShpbWFnZSwgc2xpY2UpKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuZGV0YWNoU2xpY2UoaW1hZ2UsIHNsaWNlKTtcbiAgICAgIHRoaXMuc291cmNlc1ZlcnNpb24rKztcbiAgICAgIHRoaXMucmVmcmVzaFNvdXJjZVZpZXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuc291cmNlR2VuZXJhdGlvbjtcbiAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIHNsaWNlKTtcbiAgICBpZiAoIWJpbmRpbmcgfHwgZ2VuZXJhdGlvbiAhPT0gdGhpcy5zb3VyY2VHZW5lcmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgYWxsID0gYXdhaXQgYmluZGluZy5zb3VyY2UuZ2V0SW5kZXgoYmluZGluZy5wbGFuZSwge1xuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgbGltaXQ6IGJpbmRpbmcuc291cmNlLmluZm8uZmVhdHVyZUNvdW50LFxuICAgIH0pO1xuICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLnNvdXJjZUdlbmVyYXRpb24pIHJldHVybjtcbiAgICB0aGlzLnNldFRha2VuKG5ldyBTZXQoWy4uLnRoaXMuY3VycmVudFRha2VuKCksIC4uLmFsbC5yb3dzLm1hcCgocikgPT4gci5pZCldKSk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc2xpY2Ugc2hvd24gaGFzIGEgcmVnaW9uIHNvdXJjZS4gKi9cbiAgaGFzUmVnaW9uU291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZXMuaGFzKHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2UsIHRoaXMuc291cmNlU2xpY2UpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGN1cnJlbnQgaW1hZ2UgaGFzIGFueSByZWdpb24gc291cmNlLCBvdmVyIGFsbCBpdHMgc2xpY2VzIG9yIGEgc2xpY2UncyBvd24uICovXG4gIGhhc0FueVJlZ2lvblNvdXJjZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzLmhhc0FueSh0aGlzLnNjb3BlLmFjdGl2ZUltYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3BlbmVyIG9mIHRoZSBjdXJyZW50IGltYWdlJ3Mgc291cmNlIG92ZXIgYWxsIGl0cyBzbGljZXMsIGFzIGF0dGFjaGVkIChzZWVcbiAgICoge0BsaW5rIGF0dGFjaFJlZ2lvblNvdXJjZX0pLCBvciBudWxsIHdpdGhvdXQgb25lOiB0ZWxscyB3aG9zZSBzb3VyY2UgaXQgc3RpbGwgaXMuXG4gICAqL1xuICBnZXRQbGFuZXNTb3VyY2VPcGVuZXIoKTogUmVnaW9uU291cmNlT3BlbmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlcy5wbGFuZXNPcGVuZXIodGhpcy5zY29wZS5hY3RpdmVJbWFnZSk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSBhcyBhIHNvdXJjZSBsYXllciBkcmF3cyBpdDsgbnVsbCB3aXRob3V0IG9uZSAob3IgdW50aWwgaXQgb3BlbnMpLiAqL1xuICBnZXRSZWdpb25Tb3VyY2VWaWV3KCk6IFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgZ2V0UmVnaW9uU291cmNlVmlld30gYW5kIGV2ZXJ5IGNoYW5nZSBvZiBpdCAoc2xpY2UsIHRha2VuIGlkcywgY2xhc3MgY29sb3VycykuICovXG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VWaWV3JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHZpZXcgdGhlIG92ZXJsYXlzIGRyYXc6IHtAbGluayBnZXRSZWdpb25Tb3VyY2VWaWV3JH0sIG9yIG51bGwgd2hpbGUgdGhlIHNvdXJjZSBpc1xuICAgKiBkcmF3biBieSBhbm90aGVyIGxheWVyIGluc3RlYWQgKHNlZSB7QGxpbmsgc2V0UmVnaW9uU291cmNlRHJhd259KS4gVGhlIFJlZ2lvbiBFZGl0b3IncyBsaXN0XG4gICAqIGFuZCB0aGUgc291cmNlJ3Mgb3RoZXIgdXNlcyBrZWVwIHJlYWRpbmcgdGhlIHNvdXJjZSBpdHNlbGYuXG4gICAqL1xuICBnZXREcmF3blJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5zb3VyY2VWaWV3JCwgdGhpcy5zb3VyY2VEcmF3biQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKV0pLnBpcGUoXG4gICAgICBtYXAoKFt2aWV3LCBkcmF3bl0pID0+IChkcmF3biA/IHZpZXcgOiBudWxsKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5cyBkcmF3IHRoZSByZWdpb24gc291cmNlIChkZWZhdWx0KSwgb3IgbGVhdmUgaXQgdG8gYW5vdGhlciBsYXllciB0aGF0IGRyYXdzXG4gICAqIHRoZSBzYW1lIG91dGxpbmVzICh0aGUgMkQgc3BhdGlhbCB2aWV3J3MgY2VsbHMsIGZyb20gYSAzRCBzZWdtZW50YXRpb24ncyByZWdpb24gc2V0KSwgc28gdGhleVxuICAgKiBhcmUgbm90IGRyYXduIHR3aWNlLiBPbmx5IHRoZSBkcmF3aW5nOiB0aGUgc291cmNlIHN0YXlzIGF0dGFjaGVkLCBsaXN0ZWQgYW5kIGVkaXRhYmxlLlxuICAgKi9cbiAgc2V0UmVnaW9uU291cmNlRHJhd24oZHJhd246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZHJhd24gIT09IHRoaXMuc291cmNlRHJhd24kLnZhbHVlKSB0aGlzLnNvdXJjZURyYXduJC5uZXh0KGRyYXduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHNvdXJjZSBmZWF0dXJlcyBpbnRvIHRoZSB3b3JraW5nIHNldCBmb3IgZWRpdGluZzogdGhlaXIgZXhhY3QgZ2VvbWV0cnkgYmVjb21lc1xuICAgKiBvcmRpbmFyeSByZWdpb25zIChtaW50ZWQsIGNvbG91cmVkIGFuZCBzbGljZS10YWdnZWQgYXMgYW55IHJlZ2lvbiBlbnRlcmluZyB0aGUgc3RvcmUpIGFuZFxuICAgKiB0aGUgc291cmNlIHN0b3BzIGRyYXdpbmcgdGhlbS4gTm90IGFuIHVuZG8gc3RlcCBvZiBpdHMgb3duIOKAlCB1bmRvaW5nIHBhc3QgaXQgcHV0cyB0aGVcbiAgICogZmVhdHVyZXMgYmFjayBpbiB0aGUgc291cmNlLiBSZXNvbHZlcyB0aGUgcmVnaW9uIGlkcywgaW4gdGhlIG9yZGVyIGFza2VkIChhIGZlYXR1cmUgYWxyZWFkeVxuICAgKiB0YWtlbiByZXNvbHZlcyB0byBpdHMgcmVnaW9uKTsgW10gd2hlbiB0aGUgc2xpY2UgY2hhbmdlZCBtZWFud2hpbGUuXG4gICAqL1xuICBhc3luYyB0YWtlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgICBpZiAoIXZpZXcgfHwgIWlkcy5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy5zb3VyY2VHZW5lcmF0aW9uO1xuICAgIGNvbnN0IHdhbnRlZCA9IGlkcy5maWx0ZXIoKGlkKSA9PiAhdmlldy50YWtlbi5oYXMoaWQpKTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHdhbnRlZC5sZW5ndGggPyBhd2FpdCB2aWV3LnNvdXJjZS5nZXRGZWF0dXJlcyh3YW50ZWQpIDogW107XG4gICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuc291cmNlR2VuZXJhdGlvbikgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRha2VuID0gdGhpcy5jdXJyZW50VGFrZW4oKTtcbiAgICBjb25zdCBmcmVzaCA9IGZlYXR1cmVzLmZpbHRlcigoZikgPT4gIXRha2VuLmhhcyhmLmlkKSk7XG4gICAgaWYgKGZyZXNoLmxlbmd0aCkge1xuICAgICAgY29uc3QgcmVnaW9ucyA9IGZyZXNoLm1hcCgoZikgPT4ge1xuICAgICAgICBjb25zdCByZWdpb24gPSByZWdpb25Gcm9tR2VvSnNvbkZlYXR1cmUoZi5mZWF0dXJlIGFzIEdlb0pzb25GZWF0dXJlLCAwLCBmLmlkKTtcbiAgICAgICAgaWYgKHRoaXMuc2NvcGUuc3RhY2tNb2RlKSByZWdpb24ueiA9IHRoaXMuc2NvcGUuZGlzcGxheVNsaWNlO1xuICAgICAgICByZXR1cm4gcmVnaW9uO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBhZG1pdHRlZCA9IHRoaXMuYWRtaXQocmVnaW9ucyk7XG4gICAgICAvLyBGcmVzaCBpbnN0YW5jZXMsIGNvbXBsZXRlZCBpbiBwbGFjZTogbmFtZWQgYWZ0ZXIgdGhlaXIgbmV3IGlkIGxpa2UgYSBkcmF3biByZWdpb24uXG4gICAgICBmb3IgKGNvbnN0IHIgb2YgYWRtaXR0ZWQpIHIubmFtZSA9IGBzaGFwZSR7ci5pZH1gO1xuICAgICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLmNvbmNhdChhZG1pdHRlZCk7XG4gICAgICB0aGlzLnNldFRha2VuKG5ldyBTZXQoWy4uLnRha2VuLCAuLi5mcmVzaC5tYXAoKGYpID0+IGYuaWQpXSkpO1xuICAgICAgdGhpcy5zeW5jQ2FjaGUoKTtcbiAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5lbWl0KCk7XG4gICAgfVxuICAgIGNvbnN0IGJ5U291cmNlID0gbmV3IE1hcCh0aGlzLnJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLnNvdXJjZUlkICE9PSB1bmRlZmluZWQpLm1hcCgocikgPT4gW3Iuc291cmNlSWQsIHIuaWRdKSk7XG4gICAgcmV0dXJuIGlkcy5tYXAoKGlkKSA9PiBieVNvdXJjZS5nZXQoaWQpKS5maWx0ZXIoKGlkKTogaWQgaXMgbnVtYmVyID0+IGlkICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIHtAbGluayB0YWtlU291cmNlRmVhdHVyZXN9LCB0aGVuIHNlbGVjdCB0aGVtIChhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHdpdGggYGFkZGl0aXZlYCkuICovXG4gIGFzeW5jIHNlbGVjdFNvdXJjZUZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlID0gZmFsc2UpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgdGFrZW4gPSBhd2FpdCB0aGlzLnRha2VTb3VyY2VGZWF0dXJlcyhpZHMpO1xuICAgIGlmICghdGFrZW4ubGVuZ3RoKSByZXR1cm4gdGFrZW47XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShhZGRpdGl2ZSA/IFsuLi5uZXcgU2V0KFsuLi50aGlzLnNlbGVjdGlvbi5pZHMsIC4uLnRha2VuXSldIDogdGFrZW4pO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHJldHVybiB0YWtlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZWF0dXJlcyBwZXIgY2xhc3Mgc3RpbGwgaW4gdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSAobm90IHRha2VuKTsge30gd2l0aG91dCBvbmUuIFdpdGhcbiAgICogYHN0YWNrYCwgYSB6LXN0YWNrJ3Mgb3ZlciBldmVyeSBzbGljZTogaXRzIHNvdXJjZSdzIHBsYW5lcywgb3IgZWFjaCBzbGljZSdzIHNvdXJjZSBhZGRlZCB1cC5cbiAgICovXG4gIGFzeW5jIGdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzKHN0YWNrID0gZmFsc2UpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgICBjb25zdCBpbWFnZSA9IHRoaXMuc2NvcGUuYWN0aXZlSW1hZ2U7XG4gICAgaWYgKCFzdGFjayB8fCAhdGhpcy5zY29wZS5zdGFja01vZGUpIHtcbiAgICAgIHJldHVybiB2aWV3ID8gdmlldy5zb3VyY2UuZ2V0Q2xhc3NDb3VudHModmlldy5wbGFuZSwgQXJyYXkuZnJvbSh2aWV3LnRha2VuKSkgOiB7fTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc291cmNlcy5oYXNQbGFuZXNTb3VyY2UoaW1hZ2UpKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gYXdhaXQgdGhpcy5zb3VyY2VzLmJpbmRpbmcoaW1hZ2UsIHRoaXMuc291cmNlU2xpY2UpO1xuICAgICAgaWYgKCFiaW5kaW5nKSByZXR1cm4ge307XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgYmluZGluZy5zb3VyY2UuZ2V0Q2xhc3NDb3VudHMobnVsbCwgdGhpcy5zb3VyY2VzLmFsbFRha2VuKGltYWdlKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQSB0aWxlIHNlcnZlciB0aGF0IHByZWRhdGVzIGNvdW50aW5nIGV2ZXJ5IHBsYW5lOiB0aGUgc2xpY2UncyBjb3VudHMuXG4gICAgICAgIGNvbnNvbGUud2FybignW3JlZ2lvbnNdIGNvdWxkIG5vdCBjb3VudCB0aGUgY2xhc3NlcyBvZiBldmVyeSBzbGljZScsIGVycik7XG4gICAgICAgIHJldHVybiB2aWV3ID8gdmlldy5zb3VyY2UuZ2V0Q2xhc3NDb3VudHModmlldy5wbGFuZSwgQXJyYXkuZnJvbSh2aWV3LnRha2VuKSkgOiB7fTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCBzbGljZSBvZiB0aGlzLnNvdXJjZXMuc2xpY2VzV2l0aFNvdXJjZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IGJpbmRpbmcgPSBhd2FpdCB0aGlzLnNvdXJjZXMuYmluZGluZyhpbWFnZSwgc2xpY2UpO1xuICAgICAgaWYgKCFiaW5kaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG93biA9IGF3YWl0IGJpbmRpbmcuc291cmNlLmdldENsYXNzQ291bnRzKGJpbmRpbmcucGxhbmUsIEFycmF5LmZyb20odGhpcy5zb3VyY2VzLnRha2VuKGltYWdlLCBzbGljZSkpKTtcbiAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBuXSBvZiBPYmplY3QuZW50cmllcyhvd24pKSBjb3VudHNbbGFiZWxdID0gKGNvdW50c1tsYWJlbF0gPz8gMCkgKyBuO1xuICAgIH1cbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBldmVyeSByZWdpb24gb2YgdGhlc2UgY2xhc3NlcyBvbiB0aGUgc2xpY2Ug4oCUIHRoZSByZWdpb25zJywgYW5kIHRoZSByZWdpb24gc291cmNlJ3MsXG4gICAqIHdoaWNoIGFyZSB0YWtlbiBpbnRvIHRoZSByZWdpb25zIChhdCBtb3N0IHtAbGluayBTRUxFQ1RfQ0xBU1NFU19MSU1JVH0gb2YgdGhlbSkuIEFkZGVkIHRvIHRoZVxuICAgKiBzZWxlY3Rpb24gd2l0aCBgYWRkaXRpdmVgLiBUaGUgc2VsZWN0aW9uIGhvbGRzIHRoZSBjbGFzc2VzIHRvbyAoc2VlIHtAbGluayBnZXRQaWNrZWRDbGFzc2VzfSkuXG4gICAqIFJlc29sdmVzIHRoZSBzZWxlY3RlZCByZWdpb24gaWRzLlxuICAgKi9cbiAgYXN5bmMgc2VsZWN0Q2xhc3NlcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgYWRkaXRpdmUgPSBmYWxzZSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KGNsYXNzZXMpO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGlmICh2aWV3ICYmIGNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYWdlID0gYXdhaXQgdmlldy5zb3VyY2UuZ2V0SW5kZXgodmlldy5wbGFuZSwge1xuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIGxpbWl0OiBTRUxFQ1RfQ0xBU1NFU19MSU1JVCxcbiAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgZXhjbHVkZTogQXJyYXkuZnJvbSh2aWV3LnRha2VuKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhZ2Uucm93cy5sZW5ndGgpIGF3YWl0IHRoaXMudGFrZVNvdXJjZUZlYXR1cmVzKHBhZ2Uucm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICB9XG4gICAgY29uc3QgaWRzID0gdGhpcy5yZWdpb25zLmZpbHRlcigocikgPT4gIXIuaXNQcm9maWxlPy4oKSAmJiByLmxhYmVsICYmIHdhbnRlZC5oYXMoci5sYWJlbCkpLm1hcCgocikgPT4gci5pZCk7XG4gICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZShcbiAgICAgIGFkZGl0aXZlID8gWy4uLm5ldyBTZXQoWy4uLnRoaXMuc2VsZWN0aW9uLmlkcywgLi4uaWRzXSldIDogaWRzLFxuICAgICAgYWRkaXRpdmUgPyBbLi4ubmV3IFNldChbLi4udGhpcy5zZWxlY3Rpb24uY2xhc3NlcywgLi4uY2xhc3Nlc10pXSA6IGNsYXNzZXMsXG4gICAgKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4gaWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzc2VzIHRoZSBzZWxlY3Rpb24gd2FzIHBpY2tlZCBhcyBieSB7QGxpbmsgc2VsZWN0Q2xhc3Nlc30gKGEgY2xhc3MgdHJlZSBub2RlIHdpdGggaXRzXG4gICAqIHN1YmNsYXNzZXMsIGEgc3VyZmFjZSBjbGlja2VkIGluIDNEKTsgW10gb25jZSBhbnl0aGluZyBlbHNlIHNlbGVjdGVkLiBFYWNoIGlzIGEgdm9sdW1lIHRocm91Z2hcbiAgICogdGhlIHdob2xlIHN0YWNrLCB3aGV0aGVyIG9yIG5vdCBpdCBoYXMgYSByZWdpb24gb24gdGhlIHNsaWNlLlxuICAgKi9cbiAgZ2V0UGlja2VkQ2xhc3NlcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNsYXNzZXM7XG4gIH1cblxuICBnZXRQaWNrZWRDbGFzc2VzJCgpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNsYXNzZXMkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHNsaWNlJ3MgZXhhY3Qgb3V0bGluZXMgb2YgdGhlc2UgY2xhc3NlcywgdGhlIHJlZ2lvbiBzb3VyY2VzJyBhbmQgdGhlIHJlZ2lvbnMnIChhcyB0aGVcbiAgICogM0QgcmVjb25zdHJ1Y3Rpb24gcmVhZHMgdGhlbSBhdCB0aGUgc3RhY2sncyBvd24gcmVzb2x1dGlvbik6IHdoYXQgaXMgaW5zaWRlIHRoZWlyIHZvbHVtZS5cbiAgICovXG4gIGNsYXNzU2xpY2VPdXRsaW5lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8U2xpY2VPdXRsaW5lc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NPdXRsaW5lcyhjbGFzc2VzLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgM0QgcmVjb25zdHJ1Y3Rpb24gb2YgZWFjaCBncm91cCBvZiBjbGFzc2VzIG92ZXIgZXZlcnkgc2xpY2Ugb2YgdGhlIHN0YWNrIChhbiBhdGxhc1xuICAgKiBzdHJ1Y3R1cmUgd2l0aCBpdHMgc3Vic3RydWN0dXJlcywgc2F5KTogdGhlIG91dGxpbmVzIG9mIHRoZSByZWdpb25zIG9mIHRob3NlIGNsYXNzZXMgb24gZXZlcnlcbiAgICogc2xpY2Ug4oCUIHRoZSByZWdpb24gc291cmNlcycgYW5kIHRob3NlIGRyYXduIG9yIHRha2VuIOKAlCBzdGFja2VkIGFuZCBtZXNoZWQgaW4gYSB3b3JrZXIuIE1lc2hlc1xuICAgKiBhcmUgaW4gaW1hZ2UgcHggKHgsIHkpIGFuZCBzbGljZSBpbmRpY2VzICh6KS4gYHBpeGVsU3RlcGAgaXMgdGhlIGluLXBsYW5lIHZveGVsIHNpemUgKGltYWdlXG4gICAqIHB4KTsgdGhlIG91dGxpbmVzIGFyZSByZWFkIGF0IHRoZSBtYXRjaGluZyBsZXZlbCBvZiBkZXRhaWwuIEEgZ3JvdXAgd2l0aCBubyBvdXRsaW5lIGdldHMgYW5cbiAgICogZW1wdHkgbWVzaC5cbiAgICovXG4gIGFzeW5jIHJlY29uc3RydWN0Q2xhc3NlcyhcbiAgICBncm91cHM6IFJlYWRvbmx5QXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfT4sXG4gICAgcGl4ZWxTdGVwID0gMSxcbiAgKTogUHJvbWlzZTxBcnJheTx7IGtleTogc3RyaW5nOyBtZXNoOiBNZXNoIH0+PiB7XG4gICAgY29uc3QgbGV2ZWwgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKE1hdGgubG9nMihNYXRoLm1heCgxLCBwaXhlbFN0ZXApKSkpO1xuICAgIGNvbnN0IG91dDogQXJyYXk8eyBrZXk6IHN0cmluZzsgbWVzaDogTWVzaCB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBzbGljZXMgPSBhd2FpdCB0aGlzLmNsYXNzT3V0bGluZXMoZ3JvdXAuY2xhc3NlcywgbGV2ZWwpO1xuICAgICAgb3V0LnB1c2goeyBrZXk6IGdyb3VwLmtleSwgbWVzaDogYXdhaXQgcmVjb25zdHJ1Y3RJbldvcmtlcihzbGljZXMsIHsgcGl4ZWxTdGVwIH0pIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyB2b2x1bWUgb3ZlciB0aGUgd2hvbGUgc3RhY2ssIGluIHB4wrIgw5cgc2xpY2VzOiBpdHMgb3V0bGluZXMnIGFyZWEgb24gZXZlcnkgc2xpY2VcbiAgICogKGl0cyBmZWF0dXJlcycgdW5pb24sIHNlZSBgb3V0bGluZXNBcmVhYCksIG9uZSBzbGljZSB0aGljayAoQ2F2YWxpZXJpJ3MgZXN0aW1hdG9yKSwgZnJvbSB0aGVcbiAgICogZXhhY3Qgb3V0bGluZXMuIFdoZXJlIGEgZmVhdHVyZSBpcywgYSByZWdpb24gc291cmNlJ3Mgb3IgYSBkcmF3biBvciB0YWtlbiByZWdpb24sIGRvZXMgbm90XG4gICAqIGNoYW5nZSBpdDogdGFraW5nIG9uZSBsZWF2ZXMgdGhlIHZvbHVtZSBhcyBpdCB3YXMuIFRoZSByZWdpb24gc291cmNlcycgcGFydCBpcyBjYWNoZWQgdW50aWxcbiAgICogd2hhdCB0aGV5IGhvbGQgY2hhbmdlcyAoYSBmZWF0dXJlIHRha2VuIG9yIGRlbGV0ZWQsIGFub3RoZXIgc291cmNlKTsgb25seSB0aGUgc2xpY2VzIHdpdGhcbiAgICogZHJhd24gb3IgdGFrZW4gcmVnaW9ucyBvZiB0aGUgY2xhc3MgYXJlIG1lYXN1cmVkIGFnYWluLlxuICAgKi9cbiAgYXN5bmMgY2xhc3NWb2x1bWVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnNvdXJjZVN0YXRlS2V5KCk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi5uZXcgU2V0KGNsYXNzZXMpXS5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5zb3VyY2VWb2x1bWUoc3RhdGUsIG5hbWUpO1xuICAgICAgICBsZXQgdm9sdW1lID0gc291cmNlLnRvdGFsO1xuICAgICAgICBmb3IgKGNvbnN0IHJlZ2lvbnMgb2YgbWVyZ2VPdXRsaW5lcyh0aGlzLnJlZ2lvbk91dGxpbmVzKFtuYW1lXSkpKSB7XG4gICAgICAgICAgY29uc3QgdW5kZXIgPSBzb3VyY2Uuc2xpY2VzLmdldChyZWdpb25zLnopO1xuICAgICAgICAgIGNvbnN0IFtib3RoXSA9IHVuZGVyID8gbWVyZ2VPdXRsaW5lcyhbdW5kZXIub3V0bGluZXMsIHJlZ2lvbnNdKSA6IFtyZWdpb25zXTtcbiAgICAgICAgICB2b2x1bWUgKz0gb3V0bGluZXNBcmVhKGJvdGgucmluZ3MsIGJvdGgucmluZ0dyb3VwcykgLSAodW5kZXI/LmFyZWEgPz8gMCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnNldChuYW1lLCB2b2x1bWUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFRoZSByZWdpb24gc291cmNlcycgcGFydCBvZiBhIGNsYXNzJ3Mgdm9sdW1lLCBjYWNoZWQgYnkgd2hhdCB0aGV5IGhvbGQgKHNlZSBjbGFzc1ZvbHVtZXMpLiAqL1xuICBwcml2YXRlIHNvdXJjZVZvbHVtZShzdGF0ZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZVZvbHVtZT4ge1xuICAgIGNvbnN0IGtleSA9IGAke3N0YXRlfVxcbiR7bmFtZX1gO1xuICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZVZvbHVtZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgIC8vIE1vc3QgcmVjZW50bHkgdXNlZCBsYXN0LlxuICAgICAgdGhpcy5zb3VyY2VWb2x1bWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuc2V0KGtleSwgc291cmNlKTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIHNvdXJjZSA9IHRoaXMuc291cmNlT3V0bGluZXMoW25hbWVdLCAwKS50aGVuKChwYXJ0cykgPT4ge1xuICAgICAgY29uc3Qgc2xpY2VzID0gbmV3IE1hcDxudW1iZXIsIHsgYXJlYTogbnVtYmVyOyBvdXRsaW5lczogU2xpY2VPdXRsaW5lcyB9PigpO1xuICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgIGZvciAoY29uc3Qgb3V0bGluZXMgb2YgbWVyZ2VPdXRsaW5lcyhwYXJ0cykpIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IG91dGxpbmVzQXJlYShvdXRsaW5lcy5yaW5ncywgb3V0bGluZXMucmluZ0dyb3Vwcyk7XG4gICAgICAgIHNsaWNlcy5zZXQob3V0bGluZXMueiwgeyBhcmVhLCBvdXRsaW5lcyB9KTtcbiAgICAgICAgdG90YWwgKz0gYXJlYTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRvdGFsLCBzbGljZXMgfTtcbiAgICB9KTtcbiAgICB0aGlzLnNvdXJjZVZvbHVtZUNhY2hlLnNldChrZXksIHNvdXJjZSk7XG4gICAgc291cmNlLmNhdGNoKCgpID0+IHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgIHdoaWxlICh0aGlzLnNvdXJjZVZvbHVtZUNhY2hlLnNpemUgPiBTT1VSQ0VfVk9MVU1FX0NBQ0hFX1NJWkUpIHtcbiAgICAgIHRoaXMuc291cmNlVm9sdW1lQ2FjaGUuZGVsZXRlKHRoaXMuc291cmNlVm9sdW1lQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgb2YgdGhlc2UgY2xhc3NlcywgdGhlIHJlZ2lvbiBzb3VyY2VzJyB0aGVuIHRoZSByZWdpb25zJzogY2xvc2VkIHNoYXBlcydcbiAgICogcmluZ3MsIGFuZCBvcGVuIHBvbHlsaW5lcyBhcyBgbGluZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGFzc091dGxpbmVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBsZXZlbDogbnVtYmVyKTogUHJvbWlzZTxTbGljZU91dGxpbmVzW10+IHtcbiAgICByZXR1cm4gbWVyZ2VPdXRsaW5lcyhbLi4uKGF3YWl0IHRoaXMuc291cmNlT3V0bGluZXMoY2xhc3NlcywgbGV2ZWwpKSwgLi4udGhpcy5yZWdpb25PdXRsaW5lcyhjbGFzc2VzKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gc291cmNlcycgb3V0bGluZXMgb2YgdGhlc2UgY2xhc3NlcyBvbiBldmVyeSBzbGljZSwgd2l0aG91dCB0aGUgZmVhdHVyZXMgdGFrZW4gb3JcbiAgICogZGVsZXRlZC4gVGhlIGxhc3QgZmV3IGNsYXNzIHNldHMgYXJlIGtlcHQgdW50aWwgd2hhdCB0aGUgc291cmNlcyBob2xkIGNoYW5nZXM6IHJlYnVpbGRpbmcgYVxuICAgKiBzdXJmYWNlIGFmdGVyIGFuIGVkaXQgcmVhZHMgbm90aGluZyBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgc291cmNlT3V0bGluZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLCBsZXZlbDogbnVtYmVyKTogUHJvbWlzZTxMYWJlbGxlZE91dGxpbmVzW10+IHtcbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLnNvdXJjZVN0YXRlS2V5KCl9XFxuJHtsZXZlbH1cXG4ke2NsYXNzZXMgPyBjbGFzc2VzLmpvaW4oJ1xcbicpIDogJyonfWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgLy8gTW9zdCByZWNlbnRseSB1c2VkIGxhc3QuXG4gICAgICB0aGlzLnNvdXJjZU91dGxpbmVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuc291cmNlT3V0bGluZUNhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5yZWFkU291cmNlT3V0bGluZXMoY2xhc3NlcywgbGV2ZWwpO1xuICAgIHRoaXMuc291cmNlT3V0bGluZUNhY2hlLnNldChrZXksIHJlYWQpO1xuICAgIHJlYWQuY2F0Y2goKCkgPT4gdGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUuZGVsZXRlKGtleSkpO1xuICAgIHdoaWxlICh0aGlzLnNvdXJjZU91dGxpbmVDYWNoZS5zaXplID4gU09VUkNFX09VVExJTkVfQ0FDSEVfU0laRSkge1xuICAgICAgdGhpcy5zb3VyY2VPdXRsaW5lQ2FjaGUuZGVsZXRlKHRoaXMuc291cmNlT3V0bGluZUNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRTb3VyY2VPdXRsaW5lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsIGxldmVsOiBudW1iZXIpOiBQcm9taXNlPExhYmVsbGVkT3V0bGluZXNbXT4ge1xuICAgIGNvbnN0IG91dDogTGFiZWxsZWRPdXRsaW5lc1tdID0gW107XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGlmICh0aGlzLnNvdXJjZXMuaGFzUGxhbmVzU291cmNlKGltYWdlKSkge1xuICAgICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCB0aGlzLnNvdXJjZVNsaWNlKTtcbiAgICAgIGNvbnN0IG91dGxpbmVzID0gYXdhaXQgYmluZGluZz8uc291cmNlLmdldENsYXNzT3V0bGluZXMoY2xhc3NlcywgbGV2ZWwsIHRoaXMuc291cmNlcy5hbGxUYWtlbihpbWFnZSkpO1xuICAgICAgb3V0LnB1c2goLi4uKG91dGxpbmVzID8/IFtdKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeiBvZiB0aGlzLnNvdXJjZXMuc2xpY2VzV2l0aFNvdXJjZShpbWFnZSkpIHtcbiAgICAgIGNvbnN0IGJpbmRpbmcgPSBhd2FpdCB0aGlzLnNvdXJjZXMuYmluZGluZyhpbWFnZSwgeik7XG4gICAgICBpZiAoIWJpbmRpbmcpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgb3V0bGluZXMgPSBhd2FpdCBiaW5kaW5nLnNvdXJjZS5nZXRDbGFzc091dGxpbmVzKFxuICAgICAgICBjbGFzc2VzLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnNvdXJjZXMudGFrZW4oaW1hZ2UsIHopKSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygb3V0bGluZXMpIGlmIChzLnogPT09IGJpbmRpbmcucGxhbmUpIG91dC5wdXNoKHsgLi4ucywgeiB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeSBjbGFzcydzIG91dGxpbmVzIG9uIGV2ZXJ5IHNsaWNlLCBieSBjbGFzczogdGhlIHJlZ2lvbiBzb3VyY2VzJyAob25lIHJlYWQgZm9yIGFsbCwga2VwdFxuICAgKiBsaWtlIHtAbGluayBzb3VyY2VPdXRsaW5lc30pIGFuZCB0aGUgZHJhd24gYW5kIHRha2VuIHJlZ2lvbnMnLiBXaGF0IGEgc2VjdGlvbiB0aHJvdWdoIHRoZVxuICAgKiBzdGFjayBjdXRzIChzZWUgYGdlb21ldHJ5L3NlY3Rpb25gKS5cbiAgICovXG4gIGFzeW5jIG91dGxpbmVzQnlDbGFzcyhsZXZlbDogbnVtYmVyKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBTbGljZU91dGxpbmVzW10+PiB7XG4gICAgY29uc3QgYnlDbGFzcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8bnVtYmVyLCBTbGljZVBhcnRzPj4oKTtcbiAgICBjb25zdCBzbG90ID0gKGxhYmVsOiBzdHJpbmcsIHo6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHNsaWNlcyA9IGJ5Q2xhc3MuZ2V0KGxhYmVsKTtcbiAgICAgIGlmICghc2xpY2VzKSBieUNsYXNzLnNldChsYWJlbCwgKHNsaWNlcyA9IG5ldyBNYXAoKSkpO1xuICAgICAgbGV0IHNsaWNlID0gc2xpY2VzLmdldCh6KTtcbiAgICAgIGlmICghc2xpY2UpIHNsaWNlcy5zZXQoeiwgKHNsaWNlID0geyByaW5nczogW10sIHJpbmdHcm91cHM6IFtdLCBsaW5lczogW10gfSkpO1xuICAgICAgcmV0dXJuIHNsaWNlO1xuICAgIH07XG4gICAgY29uc3QgbmV4dFBhcnQgPSBmZWF0dXJlSWRzKCk7XG4gICAgZm9yIChjb25zdCBzIG9mIGF3YWl0IHRoaXMuc291cmNlT3V0bGluZXMobnVsbCwgbGV2ZWwpKSB7XG4gICAgICBjb25zdCBpZCA9IG5leHRQYXJ0KCk7XG4gICAgICBzLnJpbmdzLmZvckVhY2goKHIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBzLnJpbmdMYWJlbHM/LltpXTtcbiAgICAgICAgaWYgKCFsYWJlbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzbGljZSA9IHNsb3QobGFiZWwsIHMueik7XG4gICAgICAgIHNsaWNlLnJpbmdzLnB1c2gocik7XG4gICAgICAgIHNsaWNlLnJpbmdHcm91cHMucHVzaChpZChzLnJpbmdHcm91cHM/LltpXSkpO1xuICAgICAgfSk7XG4gICAgICAocy5saW5lcyA/PyBbXSkuZm9yRWFjaCgobCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHMubGluZUxhYmVscz8uW2ldO1xuICAgICAgICBpZiAobGFiZWwpIHNsb3QobGFiZWwsIHMueikubGluZXMucHVzaChsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgbGFiZWwsIG91dGxpbmVzIH0gb2YgdGhpcy5sYWJlbGxlZFJlZ2lvbk91dGxpbmVzKG51bGwpKSB7XG4gICAgICAvLyBBIHJlZ2lvbiBpcyBvbmUgZmVhdHVyZS5cbiAgICAgIGNvbnN0IGlkID0gbmV4dFBhcnQoKSh1bmRlZmluZWQpO1xuICAgICAgY29uc3Qgc2xpY2UgPSBzbG90KGxhYmVsLCBvdXRsaW5lcy56KTtcbiAgICAgIHNsaWNlLnJpbmdzLnB1c2goLi4ub3V0bGluZXMucmluZ3MpO1xuICAgICAgc2xpY2UucmluZ0dyb3Vwcy5wdXNoKC4uLm91dGxpbmVzLnJpbmdzLm1hcCgoKSA9PiBpZCkpO1xuICAgICAgc2xpY2UubGluZXMucHVzaCguLi4ob3V0bGluZXMubGluZXMgPz8gW10pKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGJ5Q2xhc3MsIChbbGFiZWwsIHNsaWNlc10pID0+IFtsYWJlbCwgQXJyYXkuZnJvbShzbGljZXMsIChbeiwgc10pID0+IHNsaWNlT3V0bGluZXMoeiwgcykpXSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBUaGUgZHJhd24gYW5kIHRha2VuIHJlZ2lvbnMnIG91dGxpbmVzIG9mIHRoZXNlIGNsYXNzZXMsIGJ5IHNsaWNlLiAqL1xuICBwcml2YXRlIHJlZ2lvbk91dGxpbmVzKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogU2xpY2VPdXRsaW5lc1tdIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbGxlZFJlZ2lvbk91dGxpbmVzKG5ldyBTZXQoY2xhc3NlcykpLm1hcCgobykgPT4gby5vdXRsaW5lcyk7XG4gIH1cblxuICAvKiogRWFjaCBkcmF3biBvciB0YWtlbiByZWdpb24ncyBvdXRsaW5lcyAob2YgdGhlIGB3YW50ZWRgIGNsYXNzZXM7IG51bGw6IGV2ZXJ5IGNsYXNzKSB3aXRoIGl0cyBjbGFzcy4gKi9cbiAgcHJpdmF0ZSBsYWJlbGxlZFJlZ2lvbk91dGxpbmVzKFxuICAgIHdhbnRlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiB8IG51bGwsXG4gICk6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgb3V0bGluZXM6IFNsaWNlT3V0bGluZXMgfT4ge1xuICAgIGNvbnN0IG91dDogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyBvdXRsaW5lczogU2xpY2VPdXRsaW5lcyB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlLnN0YWNrTW9kZSA/IHRoaXMuZ2V0U2xpY2VSZWdpb25zKCkgOiB0aGlzLnJlZ2lvbnMpIHtcbiAgICAgIGlmIChyLmlzUHJvZmlsZT8uKCkgfHwgIXIubGFiZWwgfHwgKHdhbnRlZCAmJiAhd2FudGVkLmhhcyhyLmxhYmVsKSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcmluZ3M6IEZsb2F0NjRBcnJheVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgcmVnaW9uUG9seWdvbnMocikpIHtcbiAgICAgICAgcmluZ3MucHVzaChGbG9hdDY0QXJyYXkuZnJvbShwLnhwb2ludHMuZmxhdE1hcCgoeCwgaSkgPT4gW3gsIHAueXBvaW50c1tpXV0pKSk7XG4gICAgICAgIGZvciAoY29uc3QgaG9sZSBvZiBwLmhvbGVzID8/IFtdKSByaW5ncy5wdXNoKEZsb2F0NjRBcnJheS5mcm9tKGhvbGUuZmxhdCgpKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaW5lcyA9IHJlZ2lvblBvbHlsaW5lcyhyKTtcbiAgICAgIG91dC5wdXNoKHsgbGFiZWw6IHIubGFiZWwsIG91dGxpbmVzOiB7IHo6IHIueiA/PyAwLCByaW5ncywgLi4uKGxpbmVzLmxlbmd0aCA/IHsgbGluZXMgfSA6IHt9KSB9IH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIG9mIHRoZSBpbWFnZSBob2xkIChzZWUge0BsaW5rIHNvdXJjZVN0YXRlS2V5fSk6IGl0IGNoYW5nZXMgd2hlbiBhXG4gICAqICBmZWF0dXJlIGlzIHRha2VuIG9yIGRlbGV0ZWQsIG9yIHRoYXQgaXMgdW5kb25lLiAqL1xuICBnZXRTb3VyY2VTdGF0ZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZVN0YXRlS2V5KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgcmVnaW9uIHNvdXJjZXMgb2YgdGhlIGltYWdlIGhvbGQ6IHRoZSBpbWFnZSwgaXRzIHNvdXJjZXMgKG9uZSBhdHRhY2hlZCBvciBkcm9wcGVkXG4gICAqIGJ1bXBzIHRoZSB2ZXJzaW9uKSBhbmQgdGhlIGZlYXR1cmVzIHRha2VuIGZyb20gdGhlbS4gQSBrZXkgZm9yIHdoYXQgaXMgcmVhZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHNvdXJjZVN0YXRlS2V5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGxldCB0YWtlbiA9IDIxNjYxMzYyNjE7XG4gICAgZm9yIChjb25zdCB6IG9mIHRoaXMuc291cmNlcy5zbGljZXNXaXRoVGFrZW4oaW1hZ2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIFsuLi50aGlzLnNvdXJjZXMudGFrZW4oaW1hZ2UsIHopXS5zb3J0KCkpIHtcbiAgICAgICAgY29uc3QgcyA9IGAke3p9OiR7aWR9O2A7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgdGFrZW4gPSBNYXRoLmltdWwodGFrZW4gXiBzLmNoYXJDb2RlQXQoaSksIDE2Nzc3NjE5KSA+Pj4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke2ltYWdlfVxcbiR7dGhpcy5zb3VyY2VzVmVyc2lvbn1cXG4ke3Rha2VufWA7XG4gIH1cblxuICAvKiogRGVsZXRlIHNvdXJjZSBmZWF0dXJlcyB3aXRob3V0IHRha2luZyB0aGVtIChvbmUgdW5kbyBzdGVwKS4gKi9cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHRha2VuID0gdGhpcy5jdXJyZW50VGFrZW4oKTtcbiAgICBjb25zdCBkcm9wID0gaWRzLmZpbHRlcigoaWQpID0+ICF0YWtlbi5oYXMoaWQpKTtcbiAgICBpZiAoIWRyb3AubGVuZ3RoIHx8ICF0aGlzLnNvdXJjZVZpZXckLnZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5yZWNvcmRVbmRvU25hcHNob3QoKTtcbiAgICB0aGlzLnNldFRha2VuKG5ldyBTZXQoWy4uLnRha2VuLCAuLi5kcm9wXSkpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcGFnZSBvZiB0aGUgc2xpY2Ugc291cmNlJ3MgZmVhdHVyZXMgbm90IHRha2VuIGZyb20gaXQgKGZpbGUgb3JkZXIpLCBlLmcuIGZvciB0aGUgUmVnaW9uXG4gICAqIEVkaXRvcidzIGxpc3Q7IGFuIGVtcHR5IHBhZ2Ugd2l0aG91dCBhIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGlmICghdmlldykgcmV0dXJuIHsgdG90YWw6IDAsIHJvd3M6IFtdIH07XG4gICAgcmV0dXJuIHZpZXcuc291cmNlLmdldEluZGV4KHZpZXcucGxhbmUsIHsgLi4ucXVlcnksIGV4Y2x1ZGU6IEFycmF5LmZyb20odmlldy50YWtlbikgfSk7XG4gIH1cblxuICAvKipcbiAgICogYHJlZ2lvbnNgIGFzIGEgR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvbiBzdHJpbmcgbWVyZ2VkIHdpdGggdGhlIHJlZ2lvbiBzb3VyY2VzIGJlaGluZCB0aGVtOlxuICAgKiB0aGUgc291cmNlcycgZmVhdHVyZXMgdGhhdCB3ZXJlIG5vdCB0YWtlbiAob3IgZGVsZXRlZCksIHRoZW4gYHJlZ2lvbnNgLiBXaXRob3V0IGEgc291cmNlLFxuICAgKiB7QGxpbmsgZ2V0R2VvSnNvblN0cmluZ30uXG4gICAqXG4gICAqIGBzbGljZWAgbmFtZXMgb25lIHNsaWNlLWZpbGUgb2YgYSBmb2xkZXIgc3RhY2sgKGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSk6IGl0cyBzb3VyY2UncyBmZWF0dXJlcyxcbiAgICogb24gdGhlIGZpbGUncyBvd24gcGxhbmUg4oCUIG9mIGEgei1pbmRleGVkIHNvdXJjZSBvdmVyIGV2ZXJ5IHNsaWNlLCBvbmx5IHRoYXQgc2xpY2UncyBwbGFuZS5cbiAgICogV2l0aG91dCBpdCwgdGhlIGV4cG9ydCBpcyB0aGUgaW1hZ2Unczogb24gYSBzdGFjayBzYXZlZCBhcyBvbmUgZmlsZSwgZXZlcnkgc2xpY2UncyBzb3VyY2VcbiAgICogKGVhY2ggZmVhdHVyZSBvbiBpdHMgc2xpY2UncyBwbGFuZSwgYGdlb21ldHJ5LnBsYW5lLnpgKSBhbmQgYSB6LWluZGV4ZWQgc291cmNlJ3MgZXZlcnkgcGxhbmU7XG4gICAqIG90aGVyd2lzZSB0aGUgc291cmNlIG9mIHRoZSBzbGljZSBzaG93bi5cbiAgICovXG4gIGFzeW5jIGdldEdlb0pzb25XaXRoU291cmNlKHJlZ2lvbnM6IFJlZ2lvbltdLCBzbGljZT86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuc2NvcGUuc3RhY2tNb2RlICYmIHRoaXMuc291cmNlcy5oYXNQbGFuZXNTb3VyY2UoaW1hZ2UpO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVnaW9uc1xuICAgICAgLmZpbHRlcigocikgPT4gIXIuaXNQcm9maWxlPy4oKSlcbiAgICAgIC5tYXAoKHIpID0+IGZlYXR1cmVGcm9tUmVnaW9uKHIpKVxuICAgICAgLmZpbHRlcigoZik6IGYgaXMgb2JqZWN0ID0+ICEhZik7XG4gICAgaWYgKHNsaWNlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY29wZS5zdGFja01vZGUgJiYgdGhpcy5zY29wZS5zYXZlTGF5b3V0ID09PSAnY29tYmluZWQnICYmICFwbGFuZXMpIHtcbiAgICAgIGNvbnN0IHNsaWNlZCA9IHRoaXMuc291cmNlcy5zbGljZXNXaXRoU291cmNlKGltYWdlKTtcbiAgICAgIGlmIChzbGljZWQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUZlYXR1cmVzOiBvYmplY3RbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygc2xpY2VkKSB7XG4gICAgICAgICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCB6KTtcbiAgICAgICAgICBpZiAoIWJpbmRpbmcpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGV4cG9ydGVkID0gYXdhaXQgYmluZGluZy5zb3VyY2UuZXhwb3J0R2VvSnNvbihBcnJheS5mcm9tKHRoaXMuc291cmNlcy50YWtlbihpbWFnZSwgeikpLCBbXSk7XG4gICAgICAgICAgc291cmNlRmVhdHVyZXMucHVzaCguLi5vblBsYW5lKHBsYW5lRmVhdHVyZXMoZXhwb3J0ZWQsIGJpbmRpbmcucGxhbmUpLCB6KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJywgZmVhdHVyZXM6IFsuLi5zb3VyY2VGZWF0dXJlcywgLi4uZmVhdHVyZXNdIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhdCA9IHNsaWNlID8/IHRoaXMuc291cmNlU2xpY2U7XG4gICAgY29uc3QgYmluZGluZyA9IGF3YWl0IHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCBhdCk7XG4gICAgaWYgKCFiaW5kaW5nKSByZXR1cm4gcmVnaW9uc1RvR2VvSnNvbihyZWdpb25zKTtcbiAgICBpZiAocGxhbmVzICYmIHNsaWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9uZSBzbGljZS1maWxlIG9mIGEgei1pbmRleGVkIHNvdXJjZTogdGhhdCBzbGljZSdzIHBsYW5lLCB3cml0dGVuIG9uIHRoZSBmaWxlJ3MgcGxhbmUgMC5cbiAgICAgIGNvbnN0IGV4cG9ydGVkID0gYXdhaXQgYmluZGluZy5zb3VyY2UuZXhwb3J0R2VvSnNvbih0aGlzLnNvdXJjZXMuYWxsVGFrZW4oaW1hZ2UpLCBbXSk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICBmZWF0dXJlczogWy4uLm9uUGxhbmUocGxhbmVGZWF0dXJlcyhleHBvcnRlZCwgYmluZGluZy5wbGFuZSksIDApLCAuLi5mZWF0dXJlc10sXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZXhjbHVkZSA9IHBsYW5lcyA/IHRoaXMuc291cmNlcy5hbGxUYWtlbihpbWFnZSkgOiBBcnJheS5mcm9tKHRoaXMuc291cmNlcy50YWtlbihpbWFnZSwgYXQpKTtcbiAgICByZXR1cm4gYmluZGluZy5zb3VyY2UuZXhwb3J0R2VvSnNvbihleGNsdWRlLCBmZWF0dXJlcyk7XG4gIH1cblxuICAvLyDilIDilIAgUmVnaW9uIGxvb2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSByZWdpb24gb2YgY2xhc3MgYGxhYmVsYCBnb2VzIHVubGFiZWxsZWQgYmVjYXVzZSBhIHN1YmNsYXNzIG9mIGl0IChieSB0aGUgcmVnaW9uXG4gICAqIHNvdXJjZSdzIGNsYXNzIGhpZXJhcmNoeSkgaXMgYW1vbmcgdGhlIHJlZ2lvbnMgdG9vIOKAlCBhbiBhdGxhcydzIFwiSXNvY29ydGV4XCIgdW5kZXIgaXRzIGFyZWFzLlxuICAgKiBGYWxzZSB3aXRob3V0IGEgaGllcmFyY2h5LlxuICAgKi9cbiAgaXNMYWJlbENvdmVyZWQobGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghbGFiZWwpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBoaWVyYXJjaHkgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlPy5zb3VyY2UuaW5mby5oaWVyYXJjaHk7XG4gICAgaWYgKCFoaWVyYXJjaHkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5jb3ZlcmVkRm9yPy5yZWdpb25zICE9PSB0aGlzLnJlZ2lvbnMgfHwgdGhpcy5jb3ZlcmVkRm9yLmhpZXJhcmNoeSAhPT0gaGllcmFyY2h5KSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBuZXcgTWFwKGhpZXJhcmNoeS5maWx0ZXIoKG4pID0+IG4ucGFyZW50KS5tYXAoKG4pID0+IFtuLm5hbWUsIG4ucGFyZW50IGFzIHN0cmluZ10pKTtcbiAgICAgIGNvbnN0IGNvdmVyZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvbnMpIHtcbiAgICAgICAgbGV0IHAgPSByLmxhYmVsID8gcGFyZW50LmdldChyLmxhYmVsKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgd2hpbGUgKHAgJiYgIWNvdmVyZWQuaGFzKHApKSB7XG4gICAgICAgICAgY292ZXJlZC5hZGQocCk7XG4gICAgICAgICAgcCA9IHBhcmVudC5nZXQocCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY292ZXJlZEZvciA9IHsgcmVnaW9uczogdGhpcy5yZWdpb25zLCBoaWVyYXJjaHksIGNvdmVyZWQgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY292ZXJlZEZvci5jb3ZlcmVkLmhhcyhsYWJlbCk7XG4gIH1cbiAgcHJpdmF0ZSBjb3ZlcmVkRm9yOiB7IHJlZ2lvbnM6IFJlZ2lvbltdOyBoaWVyYXJjaHk6IHJlYWRvbmx5IG9iamVjdFtdOyBjb3ZlcmVkOiBTZXQ8c3RyaW5nPiB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSBjbGFzc2VzIGhpZGRlbiBmcm9tIHZpZXcgKHNlZSB7QGxpbmsgc2V0Q2xhc3Nlc0hpZGRlbn0pLiAqL1xuICBnZXRIaWRkZW5DbGFzc2VzKCk6IFJlYWRvbmx5U2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbkNsYXNzZXMkLnZhbHVlO1xuICB9XG5cbiAgLyoqIHtAbGluayBnZXRIaWRkZW5DbGFzc2VzfSBhbmQgZXZlcnkgY2hhbmdlIG9mIGl0LiAqL1xuICBnZXRIaWRkZW5DbGFzc2VzJCgpOiBPYnNlcnZhYmxlPFJlYWRvbmx5U2V0PHN0cmluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5oaWRkZW5DbGFzc2VzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIChvciBzaG93IGFnYWluKSB0aGVzZSBjbGFzc2VzJyByZWdpb25zOiB0aGUgb3ZlcmxheXMgYW5kIHRoZSByZWdpb24gc291cmNlJ3MgbGF5ZXIgc3RvcFxuICAgKiBkcmF3aW5nIHRoZW0sIGFuZCBhIGhpZGRlbiByZWdpb24gY2FuIGJlIG5laXRoZXIgcGlja2VkIG5vciBrZXB0IHNlbGVjdGVkLiBUaGUgcmVnaW9ucyBzdGF5IGluXG4gICAqIHRoZSBzZXQgKHRoZSB0YWJsZSBsaXN0cyB0aGVtOyBhIHNhdmUga2VlcHMgdGhlbSkuXG4gICAqL1xuICBzZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmhpZGRlbkNsYXNzZXMkLnZhbHVlO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KGN1cik7XG4gICAgZm9yIChjb25zdCBjIG9mIGNsYXNzZXMpIHtcbiAgICAgIGlmIChoaWRkZW4pIG5leHQuYWRkKGMpO1xuICAgICAgZWxzZSBuZXh0LmRlbGV0ZShjKTtcbiAgICB9XG4gICAgaWYgKG5leHQuc2l6ZSA9PT0gY3VyLnNpemUgJiYgWy4uLm5leHRdLmV2ZXJ5KChjKSA9PiBjdXIuaGFzKGMpKSkgcmV0dXJuO1xuICAgIGNvbnN0IHNldCA9IHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0KCk7XG4gICAgdGhpcy5oaWRkZW5LZXlzID0gbmV3IFNldChbLi4ubmV4dF0ubWFwKChjKSA9PiBwcmVzZXRLZXkoc2V0LCBjKSkpO1xuICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyQubmV4dChuZXh0KTtcbiAgICBpZiAoaGlkZGVuKSB7XG4gICAgICBjb25zdCBzaG93biA9IHRoaXMuc2VsZWN0aW9uLmluZGljZXMuZmlsdGVyKChpKSA9PiAhdGhpcy5pc0NsYXNzSGlkZGVuKHRoaXMucmVnaW9uc1tpXT8ubGFiZWwpKTtcbiAgICAgIGlmIChzaG93bi5sZW5ndGggIT09IHRoaXMuc2VsZWN0aW9uLmluZGljZXMubGVuZ3RoKSB0aGlzLnNldFNlbGVjdGVkU2hhcGVJbmRpY2VzKHNob3duKTtcbiAgICB9XG4gICAgdGhpcy5yZXB1Ymxpc2hWaWV3KCk7XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgcmVnaW9ucyBsYWJlbGxlZCBgbGFiZWxgIGFyZSBoaWRkZW4gKGFuIHVubGFiZWxsZWQgcmVnaW9uIG5ldmVyIGlzKS4gKi9cbiAgaXNDbGFzc0hpZGRlbihsYWJlbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWxhYmVsICYmIHRoaXMuaGlkZGVuS2V5cy5zaXplID4gMCAmJiB0aGlzLmhpZGRlbktleXMuaGFzKHByZXNldEtleSh0aGlzLnN0b3JlLmdldFByZXNldFNldCgpLCBsYWJlbCkpO1xuICB9XG5cbiAgLyoqIFRoZSByZWdpb24gbG9vazogb3V0bGluZXMsIG9yIGZpbGxlZCAoYW4gYXRsYXMncyBsb29rKTsgc2VlIGByZWdpb24tc3R5bGVgLiAqL1xuICBnZXRSZWdpb25TdHlsZSgpOiBSZWdpb25TdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3R5bGUkLnZhbHVlO1xuICB9XG5cbiAgLyoqIHtAbGluayBnZXRSZWdpb25TdHlsZX0gYW5kIGV2ZXJ5IGNoYW5nZSBvZiBpdC4gKi9cbiAgZ2V0UmVnaW9uU3R5bGUkKCk6IE9ic2VydmFibGU8UmVnaW9uU3R5bGU+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdHlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hvb3NlIHRoZSByZWdpb24gbG9vaywgZmllbGQgYnkgZmllbGQ7IGl0IG92ZXJyaWRlcyBhIHJlZ2lvbiBzb3VyY2UncyBoaW50IGZvciB0aGUgc2Vzc2lvbi5cbiAgICogVGhlIG92ZXJsYXlzIHJlZHJhdy5cbiAgICovXG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMudXNlclN0eWxlID0geyAuLi50aGlzLnVzZXJTdHlsZSwgLi4ucGF0Y2ggfTtcbiAgICB0aGlzLnJlc3R5bGUoKTtcbiAgfVxuXG4gIC8qKiBUaGUgbG9vayBub3c6IHRoZSB1c2VyJ3MgY2hvaWNlLCBlbHNlIHRoZSBzb3VyY2UncyBoaW50LCBlbHNlIG91dGxpbmVzLiAqL1xuICBwcml2YXRlIGVmZmVjdGl2ZVN0eWxlKCk6IFJlZ2lvblN0eWxlIHtcbiAgICBjb25zdCBoaW50ID0gdGhpcy5oaW50U3R5bGUgPz8ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGxPcGFjaXR5OiB0aGlzLnVzZXJTdHlsZS5maWxsT3BhY2l0eSA/PyBoaW50LmZpbGxPcGFjaXR5ID8/IERFRkFVTFRfUkVHSU9OX1NUWUxFLmZpbGxPcGFjaXR5LFxuICAgICAgc3Ryb2tlOiB0aGlzLnVzZXJTdHlsZS5zdHJva2UgIT09IHVuZGVmaW5lZCA/IHRoaXMudXNlclN0eWxlLnN0cm9rZSA6IChoaW50LnN0cm9rZSA/PyBudWxsKSxcbiAgICAgIHN0cm9rZVdpZHRoOlxuICAgICAgICB0aGlzLnVzZXJTdHlsZS5zdHJva2VXaWR0aCAhPT0gdW5kZWZpbmVkID8gdGhpcy51c2VyU3R5bGUuc3Ryb2tlV2lkdGggOiAoaGludC5zdHJva2VXaWR0aCA/PyBudWxsKSxcbiAgICAgIGhpZ2hsaWdodDogdGhpcy51c2VyU3R5bGUuaGlnaGxpZ2h0ICE9PSB1bmRlZmluZWQgPyB0aGlzLnVzZXJTdHlsZS5oaWdobGlnaHQgOiAoaGludC5oaWdobGlnaHQgPz8gbnVsbCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBQdWJsaXNoIHRoZSBsb29rIHdoZW4gaXQgY2hhbmdlZDogdGhlIG92ZXJsYXlzIHJlZHJhdyB0aGUgcmVnaW9ucywgdGhlIHNvdXJjZSBsYXllciBpdHMgZmVhdHVyZXMuICovXG4gIHByaXZhdGUgcmVzdHlsZShyZWRyYXcgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmVmZmVjdGl2ZVN0eWxlKCk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5yZWdpb25TdHlsZSQudmFsdWU7XG4gICAgY29uc3Qgc2FtZSA9IChPYmplY3Qua2V5cyhuZXh0KSBhcyBBcnJheTxrZXlvZiBSZWdpb25TdHlsZT4pLmV2ZXJ5KChrKSA9PiBuZXh0W2tdID09PSBjdXJba10pO1xuICAgIGlmICghc2FtZSkgdGhpcy5yZWdpb25TdHlsZSQubmV4dChuZXh0KTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3JC52YWx1ZTtcbiAgICBpZiAocmVkcmF3IHx8ICFzYW1lIHx8ICh2aWV3ICYmIHZpZXcubGFiZWxzICE9PSB0aGlzLnNob3dTaGFwZUxhYmVsKSkge1xuICAgICAgdGhpcy5yZXB1Ymxpc2hWaWV3KCk7XG4gICAgICB0aGlzLnJlZ2lvblVwZGF0ZSQubmV4dCh0aGlzLmdldFJlZ2lvbnMoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlLWVtaXQgdGhlIHNvdXJjZSB2aWV3IHdpdGggdGhlIGN1cnJlbnQgbG9vayBhbmQgbGFiZWwgc2V0dGluZy4gKi9cbiAgcHJpdmF0ZSByZXB1Ymxpc2hWaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXckLnZhbHVlO1xuICAgIGlmICh2aWV3KSB0aGlzLnNvdXJjZVZpZXckLm5leHQoeyAuLi52aWV3LCBzdHlsZTogdGhpcy5yZWdpb25TdHlsZSQudmFsdWUsIGxhYmVsczogdGhpcy5zaG93U2hhcGVMYWJlbCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgc2xpY2UgYSByZWdpb24gc291cmNlIGlzIGtleWVkIGJ5OiB0aGUgZGlzcGxheSBzbGljZSBpbiBzdGFjayBtb2RlLCBlbHNlIDAuICovXG4gIHByaXZhdGUgZ2V0IHNvdXJjZVNsaWNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUuc3RhY2tNb2RlID8gdGhpcy5zY29wZS5kaXNwbGF5U2xpY2UgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50VGFrZW4oKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlcy50YWtlbih0aGlzLnNjb3BlLmFjdGl2ZUltYWdlLCB0aGlzLnNvdXJjZVNsaWNlKTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBzbGljZSdzIHRha2VuIGlkcyBhbmQgdGVsbCB0aGUgc291cmNlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBzZXRUYWtlbih0YWtlbjogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIGlmICh0YWtlbiA9PT0gdGhpcy5jdXJyZW50VGFrZW4oKSkgcmV0dXJuO1xuICAgIHRoaXMuc291cmNlcy5zZXRUYWtlbih0aGlzLnNjb3BlLmFjdGl2ZUltYWdlLCB0aGlzLnNvdXJjZVNsaWNlLCB0YWtlbik7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldyQudmFsdWU7XG4gICAgaWYgKHZpZXcpIHRoaXMuc291cmNlVmlldyQubmV4dCh7IC4uLnZpZXcsIHRha2VuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2sgdXAgKG9wZW5pbmcgaXQgaWYgbmVlZGVkKSB0aGUgc2xpY2UncyBzb3VyY2UgYW5kIHB1Ymxpc2ggaXQgYXMgdGhlIHNvdXJjZSB2aWV3LiBUaGUgdmlld1xuICAgKiBpcyB3aXRoZHJhd24gYXQgb25jZTogdW50aWwgdGhlIGluY29taW5nIHNvdXJjZSBvcGVucywgbm90aGluZyByZWFkcywgdGFrZXMgb3IgZGVsZXRlcyBmcm9tIHRoZVxuICAgKiBvdXRnb2luZyBvbmUgaW50byB0aGUgc2xpY2Ugbm93IHNob3duLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoU291cmNlVmlldygpOiB2b2lkIHtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLnNvdXJjZUdlbmVyYXRpb247XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnNjb3BlLmFjdGl2ZUltYWdlO1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5zb3VyY2VTbGljZTtcbiAgICBpZiAodGhpcy5zb3VyY2VWaWV3JC52YWx1ZSkgdGhpcy5zb3VyY2VWaWV3JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuc291cmNlcy5zaG93KGltYWdlLCBzbGljZSk7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXMuaGFzKGltYWdlLCBzbGljZSkpIHtcbiAgICAgIHRoaXMuaGludFN0eWxlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5yZXN0eWxlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc291cmNlcy5iaW5kaW5nKGltYWdlLCBzbGljZSkudGhlbihcbiAgICAgIChiaW5kaW5nKSA9PiB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLnNvdXJjZUdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgaWYgKCFiaW5kaW5nKSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2VWaWV3JC5uZXh0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYmluZGluZy5zb3VyY2UuaW5mbztcbiAgICAgICAgY29uc3QgY2xhc3NDb2xvcnMgPSBPYmplY3QuZW50cmllcyhpbmZvLmNsYXNzQ29sb3JzKTtcbiAgICAgICAgaWYgKGNsYXNzQ29sb3JzLmxlbmd0aCkgdGhpcy5zdG9yZS5yZW1lbWJlckltcG9ydGVkQ2xhc3NDb2xvcnMobmV3IE1hcChjbGFzc0NvbG9ycykpO1xuICAgICAgICAvLyBBIHNvdXJjZSB0aGF0IGFza3MgZm9yIGxhYmVscyBnZXRzIHRoZW0gd2hlbiBpdCBvcGVucyAodGhlIHRvZ2dsZSBzdGlsbCB0dXJucyB0aGVtIG9mZikuXG4gICAgICAgIGNvbnN0IGxhYmVsc09uID0gISFpbmZvLnN0eWxlPy5sYWJlbHMgJiYgIXRoaXMuc2hvd1NoYXBlTGFiZWwgJiYgdGhpcy5zaG93blNvdXJjZSAhPT0gYmluZGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChsYWJlbHNPbikgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd25Tb3VyY2UgPSBiaW5kaW5nLnNvdXJjZTtcbiAgICAgICAgdGhpcy5oaW50U3R5bGUgPSBpbmZvLnN0eWxlO1xuICAgICAgICB0aGlzLnNvdXJjZVZpZXckLm5leHQoe1xuICAgICAgICAgIHNvdXJjZTogYmluZGluZy5zb3VyY2UsXG4gICAgICAgICAgcGxhbmU6IGJpbmRpbmcucGxhbmUsXG4gICAgICAgICAgdGFrZW46IHRoaXMuc291cmNlcy50YWtlbihpbWFnZSwgc2xpY2UpLFxuICAgICAgICAgIGNvbG9yT2Y6IChmKSA9PlxuICAgICAgICAgICAgZi5sYWJlbCA/IGNvbG9yRm9yTGFiZWwoZi5sYWJlbCwgdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQoKSkgOiBmLmNvbG9yIHx8IHRoaXMuc2hhcGVDb2xvcixcbiAgICAgICAgICBzdHlsZTogdGhpcy5yZWdpb25TdHlsZSQudmFsdWUsXG4gICAgICAgICAgbGFiZWxzOiB0aGlzLnNob3dTaGFwZUxhYmVsLFxuICAgICAgICAgIGlzSGlkZGVuOiAobGFiZWwpID0+IHRoaXMuaXNDbGFzc0hpZGRlbihsYWJlbCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc3R5bGUobGFiZWxzT24pO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuc291cmNlR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb25zXSBjb3VsZCBub3Qgb3BlbiB0aGUgcmVnaW9uIHNvdXJjZScsIGVycik7XG4gICAgICAgIHRoaXMuc291cmNlVmlldyQubmV4dChudWxsKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBwZXItaW1hZ2UgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdGhlIGFjdGl2ZSBpbWFnZTogc25hcHNob3QgdGhlIG91dGdvaW5nIHJlZ2lvbnMsIHJlc3RvcmUgdGhlXG4gICAqIGluY29taW5nIGltYWdlJ3MgKG9yIFtdIGlmIG5vbmUpLCBjbGVhciBzZWxlY3Rpb24sIGFuZCBub3RpZnkuIElkZW1wb3RlbnRcbiAgICogZm9yIHRoZSBzYW1lIGltYWdlIChzbyByZXBlYXRlZCByZXBsb3RzIG9mIG9uZSBpbWFnZSBrZWVwIGl0cyByZWdpb25zKS5cbiAgICovXG4gIHNldEFjdGl2ZUltYWdlKGltYWdlSW5mbzogSUltYWdlSW5mbyk6IHZvaWQge1xuICAgIC8vIFN3aXRjaGluZyBpbWFnZXMgYWxzbyBlbmRzIGFueSBwZXItc2xpY2Ugc3RhY2sgc2Vzc2lvbiAoaml0LXVpIzkzKS5cbiAgICBjb25zdCBpbmNvbWluZyA9IHRoaXMuc2NvcGUuc3dpdGNoSW1hZ2UoUmVnaW9uU2NvcGVDYWNoZS5pbWFnZUtleShpbWFnZUluZm8pLCB0aGlzLnJlZ2lvbnMpO1xuICAgIGlmICghaW5jb21pbmcpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbnMgPSBpbmNvbWluZztcbiAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKFtdKTtcbiAgICAvLyBVbmRvIG5ldmVyIGNyb3NzZXMgYW4gaW1hZ2Ugc3dpdGNoLlxuICAgIHRoaXMucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlJC5uZXh0KHRoaXMuZ2V0UmVnaW9ucygpKTtcbiAgICB0aGlzLnJlZnJlc2hTb3VyY2VWaWV3KCk7XG4gIH1cblxuICAvLyDilIDilIAgaW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBcHBseSB0aGUgcHJlc2V0IHNldCdzIGNsYXNzIGNvbG91cnMgKHNlZSB7QGxpbmsgYXBwbHlQcmVzZXRDb2xvcnN9KSxcbiAgICogIHByb21vdGluZyB1bmtub3duIGNsYXNzZXMgaW50byB0aGUgc2hhcmVkIHN0b3JlIHdoZW4gdGhlIHNldCBhc2tzIGZvciBpdC4gKi9cbiAgcHJpdmF0ZSB3aXRoQ2xhc3NpZmljYXRpb25Db2xvcnMocmVnaW9uczogUmVnaW9uW10sIGluUGxhY2U6IChyOiBSZWdpb24pID0+IGJvb2xlYW4pOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIGFwcGx5UHJlc2V0Q29sb3JzKHJlZ2lvbnMsIHRoaXMuc3RvcmUuZ2V0UHJlc2V0U2V0KCksIHtcbiAgICAgIGluUGxhY2UsXG4gICAgICBvblByb21vdGU6IChwcmVzZXQpID0+IHRoaXMuc3RvcmUudXBzZXJ0Q2xhc3MocHJlc2V0KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGUuc3luYyh0aGlzLnJlZ2lvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0KCk6IHZvaWQge1xuICAgIC8vIExpdmUtZWRpdCBsaXN0ZW5lcnMgKGUuZy4gdGhlIGludGVuc2l0eS1wcm9maWxlIGluc2V0KSByZWFjdCBvbiBFVkVSWVxuICAgIC8vIGNoYW5nZSDigJQgaW5jbHVkaW5nIHBlci1mcmFtZSBkdXJpbmcgYSBiYXRjaGVkIGRyYWcg4oCUIHNvIHRoZXkgdHJhY2sgdGhlXG4gICAgLy8gcmVnaW9uIGxpdmUuIFRoZSBtYWluIHJlZ2lvblVwZGF0ZSQgc3RheXMgY29hbGVzY2VkIGR1cmluZyBhIGJhdGNoIChmaXJlc1xuICAgIC8vIG9uY2Ugb24gZW5kQmF0Y2gpIHRvIGtlZXAgaGVhdmllciBjb25zdW1lcnMgKFJlZ2lvbnMgdGFiKSBjYWxtLlxuICAgIHRoaXMucmVnaW9uTGl2ZUVkaXQkLm5leHQodGhpcy5yZWdpb25zLnNsaWNlKCkpO1xuICAgIGlmICh0aGlzLmJhdGNoRGVwdGggPiAwKSB7XG4gICAgICB0aGlzLnBlbmRpbmdFbWl0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWdpb25VcGRhdGUkLm5leHQodGhpcy5nZXRSZWdpb25zKCkpO1xuICB9XG5cbiAgLyoqIFByb2plY3QgdGhlIHNlbGVjdGVkIGlkcyBvbnRvIHRoZSBjdXJyZW50IHJlZ2lvbnMgKHBydW5pbmcgZ29uZSBvbmVzKTtcbiAgICogIGVtaXRzIG9ubHkgaWYgdGhlIGluZGV4IHNldCBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIGVtaXRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24uc3luYyh0aGlzLnJlZ2lvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQnlJZChpZDogbnVtYmVyKTogUmVnaW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zLmZpbmQoKHIpID0+IHIuaWQgPT09IGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5kZXhPZklkKGlkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBpZCk7XG4gIH1cbn1cblxuLyoqIFRoZSBmZWF0dXJlcyBvZiBhbiBleHBvcnRlZCBGZWF0dXJlQ29sbGVjdGlvbiBvbiBgcGxhbmVgIChhIG1pc3NpbmcgcGxhbmUgaXMgcGxhbmUgMCkuICovXG5mdW5jdGlvbiBwbGFuZUZlYXR1cmVzKGdlb0pzb246IHN0cmluZywgcGxhbmU6IG51bWJlcik6IEdlb0ZlYXR1cmVbXSB7XG4gIGNvbnN0IGZlYXR1cmVzID0gKEpTT04ucGFyc2UoZ2VvSnNvbik/LmZlYXR1cmVzID8/IFtdKSBhcyBHZW9GZWF0dXJlW107XG4gIHJldHVybiBmZWF0dXJlcy5maWx0ZXIoKGYpID0+IChmPy5nZW9tZXRyeT8ucGxhbmU/LnogPz8gMCkgPT09IHBsYW5lKTtcbn1cblxuLyoqIGBmZWF0dXJlc2AgbW92ZWQgb250byBwbGFuZSBgemAsIGFzIFF1UGF0aCB3cml0ZXMgaXQ6IGBnZW9tZXRyeS5wbGFuZWAsIGxlZnQgb3V0IGZvciBwbGFuZSAwLiAqL1xuZnVuY3Rpb24gb25QbGFuZShmZWF0dXJlczogR2VvRmVhdHVyZVtdLCB6OiBudW1iZXIpOiBHZW9GZWF0dXJlW10ge1xuICByZXR1cm4gZmVhdHVyZXMubWFwKChmKSA9PiB7XG4gICAgY29uc3QgeyBwbGFuZTogX3BsYW5lLCAuLi5nZW9tZXRyeSB9ID0gZi5nZW9tZXRyeSA/PyB7fTtcbiAgICByZXR1cm4geyAuLi5mLCBnZW9tZXRyeTogeiA9PT0gMCA/IGdlb21ldHJ5IDogeyAuLi5nZW9tZXRyeSwgcGxhbmU6IHsgYzogLTEsIHosIHQ6IDAgfSB9IH07XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgR2VvRmVhdHVyZSB7XG4gIGdlb21ldHJ5PzogeyBwbGFuZT86IHsgej86IG51bWJlciB9OyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG4iXX0=