@jax-data-science/sci-image-visualizer 0.8.2 → 0.8.3
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.
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +56 -19
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +55 -18
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +6 -1
- package/package.json +1 -1
|
@@ -321,6 +321,10 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
321
321
|
this.loadingBadge = null;
|
|
322
322
|
this.tileLoading = [];
|
|
323
323
|
this.observationsLoading = 0;
|
|
324
|
+
/** Image tiles in flight, and the scene they belong to: a fetch that outlives {@link reset}
|
|
325
|
+
* settles against the old generation and leaves the new scene's count alone. */
|
|
326
|
+
this.imageTilesLoading = 0;
|
|
327
|
+
this.imageTilesGeneration = 0;
|
|
324
328
|
/** Monotonic load generation. Bumped by {@link reset} and {@link cancelLoading}; the frame-loading
|
|
325
329
|
* loops (volume assembly, surface preload) capture it and bail when it changes, so a Cancel (or a
|
|
326
330
|
* new plot) actually stops fetching frames instead of running to completion in the background. */
|
|
@@ -639,6 +643,9 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
639
643
|
return false;
|
|
640
644
|
}
|
|
641
645
|
this.reset();
|
|
646
|
+
// This plot's scene. A newer plot resets into the next one while this one still awaits, and
|
|
647
|
+
// a superseded plot must not go on to draw (or count image tiles) into the newer scene.
|
|
648
|
+
const scene = this.imageTilesGeneration;
|
|
642
649
|
this.host = host;
|
|
643
650
|
this.plotDivId = plotDiv;
|
|
644
651
|
this.currentPlotType = plotType;
|
|
@@ -680,6 +687,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
680
687
|
});
|
|
681
688
|
this.viewer = viewer;
|
|
682
689
|
await viewer.ready;
|
|
690
|
+
if (scene !== this.imageTilesGeneration)
|
|
691
|
+
return false;
|
|
683
692
|
if (isSpatialOmics3d(plotType)) {
|
|
684
693
|
await this.mountSpatialOmics3d(viewer, host);
|
|
685
694
|
}
|
|
@@ -776,11 +785,15 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
776
785
|
const v = this.viewer;
|
|
777
786
|
if (!v)
|
|
778
787
|
return;
|
|
788
|
+
const scene = this.imageTilesGeneration;
|
|
779
789
|
const desc = await this.ensureDescriptor();
|
|
790
|
+
// Reset into a newer scene while the descriptor was in flight: this render is superseded.
|
|
791
|
+
if (scene !== this.imageTilesGeneration)
|
|
792
|
+
return;
|
|
780
793
|
if (desc && desc.levels?.length) {
|
|
781
794
|
if (token != null && token !== this.sliceReq)
|
|
782
795
|
return;
|
|
783
|
-
await this.renderImageTiled(z, desc);
|
|
796
|
+
await this.renderImageTiled(z, desc, scene);
|
|
784
797
|
return;
|
|
785
798
|
}
|
|
786
799
|
return this.renderImageStitched(z, token);
|
|
@@ -873,7 +886,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
873
886
|
* coordinates so regions align. Same three modes as the stitch path. Per-channel layers use the
|
|
874
887
|
* REAL pyramid levels (per-channel tiles only exist there); the composite uses all levels.
|
|
875
888
|
*/
|
|
876
|
-
async renderImageTiled(z, desc) {
|
|
889
|
+
async renderImageTiled(z, desc, scene) {
|
|
877
890
|
const v = this.viewer;
|
|
878
891
|
if (!v)
|
|
879
892
|
return;
|
|
@@ -890,7 +903,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
890
903
|
const st = states.find((s) => s.index === c);
|
|
891
904
|
const color = st?.color ?? desc.channelInfo?.[c]?.color ?? tintFor(c);
|
|
892
905
|
views.push({
|
|
893
|
-
source: this.buildTiledSource(desc, c, 1),
|
|
906
|
+
source: this.buildTiledSource(desc, c, 1, scene),
|
|
894
907
|
tint: color,
|
|
895
908
|
name: st?.name ?? `ch${c}`,
|
|
896
909
|
contrastLimits: [st?.min ?? 0, st?.max ?? 255],
|
|
@@ -906,7 +919,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
906
919
|
const st = states[0];
|
|
907
920
|
this.channelView.render('grayscale', [
|
|
908
921
|
{
|
|
909
|
-
source: this.buildTiledSource(desc, undefined, 1),
|
|
922
|
+
source: this.buildTiledSource(desc, undefined, 1, scene),
|
|
910
923
|
colormap: this.grayscaleColormap(),
|
|
911
924
|
contrastLimits: [st?.min ?? 0, st?.max ?? 255],
|
|
912
925
|
gamma: st?.gamma ?? 1,
|
|
@@ -916,7 +929,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
916
929
|
}
|
|
917
930
|
else {
|
|
918
931
|
this.imageMode = 'rgb';
|
|
919
|
-
this.channelView.render('rgb', [{ source: this.buildTiledSource(desc, undefined, 4) }], {
|
|
932
|
+
this.channelView.render('rgb', [{ source: this.buildTiledSource(desc, undefined, 4, scene) }], {
|
|
920
933
|
interpolation,
|
|
921
934
|
});
|
|
922
935
|
}
|
|
@@ -927,8 +940,9 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
927
940
|
await this.refreshHistogramSamples(z, desc);
|
|
928
941
|
}
|
|
929
942
|
/** Build a pyramidal TiledSource backed by the server `/tile` endpoint. `channel` selects a band
|
|
930
|
-
* (grayscale luminance, real levels only); omit it for the composite (RGBA, all levels).
|
|
931
|
-
|
|
943
|
+
* (grayscale luminance, real levels only); omit it for the composite (RGBA, all levels).
|
|
944
|
+
* `scene` is the generation of the render that asked for it, taken before that render's awaits. */
|
|
945
|
+
buildTiledSource(desc, channel, channels, scene) {
|
|
932
946
|
const infoB64 = this.tiles.getSelectedInfoB64() ?? '';
|
|
933
947
|
// Per-channel tiles exist only at REAL Bio-Formats levels; the composite exists at all levels.
|
|
934
948
|
const usable = channel == null
|
|
@@ -938,6 +952,9 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
938
952
|
const tileSize = desc.tileSize || TILE_SIZE;
|
|
939
953
|
const ch = channel == null ? '' : `&channel=${channel}`;
|
|
940
954
|
const api = this.api;
|
|
955
|
+
// The scene this source draws: its tiles count on the badge only while that scene is current,
|
|
956
|
+
// so a request the disposed source still issues after a reset never shows on the new one.
|
|
957
|
+
const generation = scene;
|
|
941
958
|
return {
|
|
942
959
|
kind: 'tiled',
|
|
943
960
|
width: desc.width,
|
|
@@ -951,17 +968,31 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
951
968
|
fetchTile: async (key) => {
|
|
952
969
|
const res = usable[key.level]?.res ?? key.level;
|
|
953
970
|
const url = `${api}tile?info=${infoB64}&res=${res}&col=${key.col}&row=${key.row}&z=${key.z}&tileSize=${tileSize}${ch}`;
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
971
|
+
// "Image reloading…" on the loading badge while any tile of the image is in flight.
|
|
972
|
+
const counted = generation === this.imageTilesGeneration;
|
|
973
|
+
if (counted) {
|
|
974
|
+
this.imageTilesLoading++;
|
|
975
|
+
this.showLoading();
|
|
976
|
+
}
|
|
977
|
+
try {
|
|
978
|
+
const headers = await this.tiles
|
|
979
|
+
.getAuthHeaders()
|
|
980
|
+
.catch(() => ({}));
|
|
981
|
+
const resp = await fetch(url, { headers });
|
|
982
|
+
if (!resp.ok) {
|
|
983
|
+
throw new Error(`[napari-js] tile ${key.level}/${key.col}/${key.row} → ${resp.status}`);
|
|
984
|
+
}
|
|
985
|
+
const bmp = await createImageBitmap(await resp.blob());
|
|
986
|
+
if (channels === 4)
|
|
987
|
+
return { width: bmp.width, height: bmp.height, data: bmp };
|
|
988
|
+
return this.bitmapToLuminance(bmp);
|
|
989
|
+
}
|
|
990
|
+
finally {
|
|
991
|
+
if (counted && generation === this.imageTilesGeneration) {
|
|
992
|
+
this.imageTilesLoading--;
|
|
993
|
+
this.showLoading();
|
|
994
|
+
}
|
|
960
995
|
}
|
|
961
|
-
const bmp = await createImageBitmap(await resp.blob());
|
|
962
|
-
if (channels === 4)
|
|
963
|
-
return { width: bmp.width, height: bmp.height, data: bmp };
|
|
964
|
-
return this.bitmapToLuminance(bmp);
|
|
965
996
|
},
|
|
966
997
|
};
|
|
967
998
|
}
|
|
@@ -1123,7 +1154,11 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
1123
1154
|
if (!this.host)
|
|
1124
1155
|
return;
|
|
1125
1156
|
this.loadingBadge ??= new NapariLoadingBadge(this.host);
|
|
1126
|
-
this.loadingBadge.set([
|
|
1157
|
+
this.loadingBadge.set([
|
|
1158
|
+
...(this.imageTilesLoading > 0 ? ['Image'] : []),
|
|
1159
|
+
...(this.observationsLoading > 0 ? ['Observations'] : []),
|
|
1160
|
+
...this.tileLoading,
|
|
1161
|
+
]);
|
|
1127
1162
|
}
|
|
1128
1163
|
installNavigator(z) {
|
|
1129
1164
|
this.navigator?.destroy();
|
|
@@ -3672,6 +3707,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
|
|
|
3672
3707
|
this.loadingBadge = null;
|
|
3673
3708
|
this.tileLoading = [];
|
|
3674
3709
|
this.observationsLoading = 0;
|
|
3710
|
+
this.imageTilesLoading = 0;
|
|
3711
|
+
this.imageTilesGeneration++;
|
|
3675
3712
|
this.regionOverlay?.destroy();
|
|
3676
3713
|
this.regionOverlay = null;
|
|
3677
3714
|
this.axesLabels?.destroy();
|
|
@@ -4409,4 +4446,4 @@ function tintedComposite(images, colors) {
|
|
|
4409
4446
|
});
|
|
4410
4447
|
return out;
|
|
4411
4448
|
}
|
|
4412
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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TUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNoRCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDMUIsQ0FBQyxD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QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLGFBQWEsQ0FBQztRQUMzQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsR0FBRyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztRQUN6QyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZnJvbSwgb2YsIGZpcnN0VmFsdWVGcm9tLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQge1xuICBWaWV3ZXIsXG4gIGhpc3RvZ3JhbVNjYWxhcixcbiAgY29sb3JtYXBGcm9tTHV0LFxuICB0aW50Q29sb3JtYXAsXG4gIHJldmVyc2VDb2xvcm1hcCxcbiAgaGVpZ2h0RmllbGQsXG4gIExVVF9TSVpFLFxuICBNdWx0aUNoYW5uZWxJbWFnZVZpZXcsXG4gIE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF4ZXNMYXllcixcbiAgSW1hZ2VMYXllcixcbiAgU3VyZmFjZUxheWVyLFxuICBWb2x1bWVMYXllcixcbiAgUG9pbnRzTGF5ZXIsXG4gIFBvaW50czNETGF5ZXIsXG4gIFRpbGVkU291cmNlLFxuICBUaWxlS2V5LFxuICBQaXhlbENodW5rLFxuICBDaGFubmVsVmlldyxcbiAgVm9sdW1lQ2hhbm5lbCxcbiAgQ29sb3JtYXAsXG4gIFByb2plY3RlZFBvaW50cyxcbn0gZnJvbSAnbmFwYXJpLWpzJztcbmltcG9ydCB7IG5lYXJlc3RQcm9qZWN0ZWRJbmRleCwgU2NyZWVuSW5kZXgsIFNDUkVFTl9JTkRFWF9NSU5fUE9JTlRTIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IFNQQVRJQUxfREFUQV9QT1JULCBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbENvbHVtbiwgU3BhdGlhbERhdGFzZXQsIFNwYXRpYWxJbWFnZVJlZiwgZmluZENvbHVtbk1ldGEsIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIGNvbnRyYXN0V2luZG93LCBlbmNvZGVDYXRlZ29yaWNhbCwgZW5jb2RlQ29udGludW91cywgbWFya2VyRGlhbWV0ZXJzLFxuICByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMsIHRvUmdiYVR1cGxlcywgcGFyc2VIZXgsIE1JU1NJTkdfQ09MT1IsIERFRkFVTFRfTVVURURfT1BBQ0lUWSxcbiAgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFUywgc3BhdGlhbENvbnRpbnVvdXNMdXQsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBOT19DQVRFR09SWSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgU3BhdGlhbE9ic2VydmF0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGVtcHR5U2VsZWN0aW9uLCBtYXNrVG9JbmRpY2VzLCBtdXRlZEZyb21TZWxlY3Rpb24sIHNhbWVTZWxlY3Rpb24sXG4gIHNlbGVjdEJ5Q2F0ZWdvcnksXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZnJhbWVQb3NpdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZnJhbWluZyc7XG5pbXBvcnQgeyBQSVhFTF9XT1JMRF9RVUFOVFVNLCB3b3JsZFF1YW50dW1Gb3JFeHRlbnQgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3dvcmxkLWdyaWQnO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TbGljZSwgdm9sdW1lSW1hZ2VSZWYgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdm9sdW1lLWltYWdlJztcbmltcG9ydCB7IGRlZmF1bHRTaWdtYSwgZGVuc2l0eUdyaWQsIHJhc3Rlcml6ZURlbnNpdHkgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZGVuc2l0eSc7XG5pbXBvcnQgeyBvYnNlcnZhdGlvbnNJblNlY3Rpb24sIHNlY3Rpb25zT2YgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VjdGlvbnMnO1xuaW1wb3J0IHsgdHlwZSBIb3ZlclNvdXJjZSwgaG92ZXJUZXh0LCBuZWFyZXN0T2JzZXJ2YXRpb24gfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtaG92ZXInO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRvb2x0aXAgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRvb2x0aXAnO1xuaW1wb3J0IHsgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMsIFRyYW5zY3JpcHRFc3RpbWF0ZSB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTmFwYXJpTmF2aWdhdG9yIH0gZnJvbSAnLi9uYXBhcmktbmF2aWdhdG9yJztcbmltcG9ydCB7IE5hcGFyaUxvYWRpbmdCYWRnZSB9IGZyb20gJy4vbmFwYXJpLWxvYWRpbmctYmFkZ2UnO1xuaW1wb3J0IHsgY2VsbFR5cGVDb2x1bW5Gb3IgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtdGlsZXMnO1xuaW1wb3J0IHsgTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQgfSBmcm9tICcuL25hcGFyaS16b29tJztcblxuLyoqXG4gKiBBIHNob3J0LCBzdGFibGUgaWQgZm9yIGEgY29sb3JtYXAgdmFsdWUsIGZvciBjYWNoZSBrZXlzLlxuICpcbiAqIEhhbGYgdGhlIGxpYnJhcnkncyBjb2xvcm1hcHMgYXJlIE5BTUVTIGFuZCBoYWxmIGFyZSBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYFxuICogYXJyYXlzIG9mIDI1NiBlbnRyaWVzLiBTdHJpbmdpZnlpbmcgdGhlIGFycmF5IGtpbmQgd291bGQgcHV0IDYgS0IgaW4gYSBrZXkgdGhhdFxuICogaXMgcmVidWlsdCBhbmQgY29tcGFyZWQgb24gZXZlcnkgdmlldyBjaGFuZ2U7IGhhc2hpbmcgaXQga2VlcHMgdGhlIGtleSBzbWFsbCxcbiAqIGFuZCBpdCBvbmx5IGhhcyB0byBkaXN0aW5ndWlzaCBvbmUgY29sb3JtYXAgZnJvbSBhbm90aGVyLlxuICovXG5mdW5jdGlvbiBjb2xvcm1hcElkKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICc/JztcbiAgLy8gRk5WLTFhIG92ZXIgdGhlIHN0b3BzLiBBIGNvbGxpc2lvbiB3b3VsZCBsZWF2ZSBhIHN0YWxlIGNvbG91cmluZyBvbiBzY3JlZW4sXG4gIC8vIG5vdCBjb3JydXB0IGFueXRoaW5nLCBhbmQgMzIgYml0cyBvdmVyIGEgZmV3IGh1bmRyZWQgY29sb3JtYXBzIHdpbGwgbm90LlxuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZS5tYXAoKHN0b3ApID0+IFN0cmluZyhzdG9wKSkuam9pbignLCcpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHRleHQuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiBgIyR7KGhhc2ggPj4+IDApLnRvU3RyaW5nKDM2KX1gO1xufVxuXG4vKipcbiAqIEluLXBsYW5lIGNvYXJzZW5pbmcgb2YgdGhlIDNEIGdlbmUgbWFwJ3MgbGF0dGljZSwgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZVxuICogdm9sdW1lLiBUaGUgZmllbGQgaXMgc21vb3RoLCBzbyBpdHMgZGV0YWlsIGlzIHNldCBieSB0aGUga2VybmVsIHJhdGhlciB0aGFuIHRoZVxuICogcmFzdGVyIOKAlCBhbmQgdGhlIGVzdGltYXRlIGlzIGEgcGFpciBvZiBzZXBhcmFibGUgYmx1cnMgb24gdGhlIG1haW4gdGhyZWFkLCB3aGljaFxuICogYXQgdGhlIHRlbXBsYXRlJ3MgZnVsbCByZXNvbHV0aW9uIG1lYW5zIHNlY29uZHMgb2YgZnJvemVuIFVJIHBlciB0b2dnbGUuXG4gKi9cbmNvbnN0IEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUgPSAyO1xuaW1wb3J0IHtcbiAgdHlwZSBFeHByZXNzaW9uRmllbGQsIHR5cGUgRXhwcmVzc2lvblZvbHVtZUZpZWxkLCBjb2xvckV4cHJlc3Npb25GaWVsZCxcbiAgZW5jb2RlRXhwcmVzc2lvblZvbHVtZSwgZXhwcmVzc2lvbkZpZWxkLCBleHByZXNzaW9uVm9sdW1lLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVN1cmZhY2UsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNOYXBhcmlTY2F0dGVyM2QsXG4gIGlzU3BhdGlhbE9taWNzLFxuICBpc1NwYXRpYWxPbWljczNkLFxuICBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlzdWFsaXplcixcbiAgUGl4ZWxEYXRhLFxuICBJbnRlbnNpdHlQcm9maWxlLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgVmlld2VyQ2FwYWJpbGl0aWVzLFxuICBWaWV3ZXJGZWF0dXJlLFxuICBjYXBhYmlsaXRpZXNPZixcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDb2xvcm1hcE5vZGUsIElXYW5kT3B0aW9ucywgSUJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IFZJWl9DT05GSUcsIFZpekNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFRJTEVfQUNDRVNTX1BPUlQsIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgfSBmcm9tICcuLi9zaW1wbGUtc2xpY2UtYWNjZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmFwYXJpU2NhbGVCYXIsIFNjYWxlQmFyQ2FtZXJhLCBmb3JtYXRVbSB9IGZyb20gJy4vbmFwYXJpLXNjYWxlLWJhcic7XG5pbXBvcnQgeyBOYXBhcmlSZWdpb25PdmVybGF5LCBPdmVybGF5Vmlld2VyIH0gZnJvbSAnLi9uYXBhcmktcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgTmFwYXJpQXhlc0xhYmVscywgQXhpc0xhYmVsU3BlYyB9IGZyb20gJy4vbmFwYXJpLWF4ZXMtbGFiZWxzJztcbmltcG9ydCB7IE5hcGFyaVZvbHVtZVpIYW5kbGUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtei1oYW5kbGUnO1xuaW1wb3J0IHtcbiAgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBXYW5kVG9vbFNlcnZpY2UsIFdhbmRUb29sSG9zdCwgQ2FjaGVkSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFRvb2xTZXJ2aWNlLCBCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL2JydXNoL2JydXNoLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSxcbiAgVmVydGV4RXJhc2VyVG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvdmVydGV4LWVyYXNlci92ZXJ0ZXgtZXJhc2VyLXRvb2wuc2VydmljZSc7XG5pbXBvcnQge1xuICBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgWm9vbVRvQm94VG9vbEhvc3QsXG59IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuXG4vKiogSUNvb3JkaW5hdGVUcmFuc2Zvcm0gb3ZlciB0aGUgbmFwYXJpIGNhbWVyYTogcG9pbnRlciBjbGllbnQgY29vcmRzIOKGlCBpbWFnZS93b3JsZCBjb29yZHMuICovXG5jbGFzcyBOYXBhcmlDb29yZGluYXRlVHJhbnNmb3JtIGltcGxlbWVudHMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdlcjoge1xuICAgICAgY2FudmFzVG9Xb3JsZChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICByZWFkb25seSBjYW1lcmE6IHsgem9vbTogbnVtYmVyIH07XG4gICAgfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWR5OiAoKSA9PiBib29sZWFuLFxuICApIHt9XG4gIGNsaWVudFRvRGF0YShjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cbiAgZGF0YUxlbmd0aFRvU2NyZWVuKGRhdGFMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFMZW5ndGggKiB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTsgLy8gQ1NTIHB4IHBlciB3b3JsZCB1bml0XG4gIH1cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59XG5cbi8qKiBPcGFxdWUgaGFuZGxlIGZyb20ge0BsaW5rIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLmxvYWR9LCBwYXNzZWQgYmFjayB0byBwbG90KCkuICovXG5pbnRlcmZhY2UgTmFwYXJpTG9hZGVkIHtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNdXN0IG1hdGNoIGBJSW1hZ2VJbmZvLmZpbGVOYW1lYCDigJQgdGhlIHJlbmRlciBvcmNoZXN0cmF0b3IgZHJvcHMgdGhlIHJlc3VsdCBpZiB0aGVcbiAgICogIGhhbmRsZSdzIGBmaWxlbmFtZWAgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltYWdlIChndWFyZHMgYWdhaW5zdCBzdGFsZSBjbGlja3MpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBWT0xVTUVfTUFYX1NMSUNFID0gMTAyNDsgLy8gXCJGdWxsXCIgaW4tcGxhbmUgY2FwOyB0aGUgZGVmYXVsdCDCvCBsb2FkIHVzZXMgMjU2XG4vKiogUmVmZXJlbmNlIGluLXBsYW5lIHdvcmxkIHNpemUgKGxvbmcgc2lkZSkgZm9yIHRoZSB2b2x1bWUvYXhlcyBib3gsIGluIGFyYml0cmFyeSB3b3JsZCB1bml0cy5cbiAqICBUaGUgYm94IGlzIGFuY2hvcmVkIHRvIHRoaXMgcmVmZXJlbmNlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNob3NlbiBkZWNpbWF0ZSBmYWN0b3IsIHNvIGNoYW5naW5nIHRoZVxuICogIHJlc29sdXRpb24gY2hhbmdlcyBERVRBSUwsIG5vdCB0aGUgdm9sdW1lJ3MgcHJvcG9ydGlvbnMgKFogbm8gbG9uZ2VyIGFwcGVhcnMgdG8gc2hyaW5rIHdoZW4gdGhlXG4gKiAgaW4tcGxhbmUgc2FtcGxpbmcgZ3Jvd3MpLiBTZXQgdG8gdGhlIERFRkFVTFQgZGVjaW1hdGUncyBpbi1wbGFuZSBjYXAgc28gdGhlIGRlZmF1bHQgdmlldyBpc1xuICogIHVuY2hhbmdlZDsgaGlnaGVyL2xvd2VyIHJlc29sdXRpb25zIGtlZXAgdGhhdCBzYW1lIHNoYXBlLiBTZWUge0BsaW5rIG1vdW50Vm9sdW1lfS4gKi9cbmNvbnN0IFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRiA9IFZPTFVNRV9NQVhfU0xJQ0UgLyBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbi8qKiBNYXggY29uY3VycmVudCBzbGljZSBmZXRjaGVzIHdoZW4gYXNzZW1ibGluZyBhIHZvbHVtZSDigJQga2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBidXN5XG4gKiAgd2l0aG91dCBmbG9vZGluZyBpdCAoYnJvd3NlcnMgY2FwIH42L2hvc3QpIG9uIGEgZGVlcCBzdGFjay4gKi9cbmNvbnN0IFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBWb2x1bWUvaXNvc3VyZmFjZSBzYW1wbGluZyBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYCAoMSA9IEZ1bGwgMTAyNCwgMiA9IMK9IDUxMiwgNCA9IMK8IDI1NlxuICogIGRlZmF1bHQsIDggPSDihZsgMTI4KTogdGhlIGluLXBsYW5lIGNhcCBoYWx2ZXMgZWFjaCBzdGVwOyBzbGljZXMgc3RheSB1bi1zdWJzYW1wbGVkIHVudGlsIOKFmywgdGhlblxuICogIHN1YnNhbXBsZS4gKi9cbmZ1bmN0aW9uIHZvbHVtZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4U2xpY2U6IG51bWJlcjsgc2xpY2VTdGVwOiBudW1iZXIgfSB7XG4gIGNvbnN0IHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIHJldHVybiB7XG4gICAgbWF4U2xpY2U6IE1hdGgubWF4KDgsIE1hdGgucm91bmQoVk9MVU1FX01BWF9TTElDRSAvIHMpKSxcbiAgICBzbGljZVN0ZXA6IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocyAvIDQpKSxcbiAgfTtcbn1cbi8qKiBGdWxseS1ub3JtYWxpemVkIGludGVuc2l0eSBoZWlnaHQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgaW4tcGxhbmUgZXh0ZW50IOKAlCBtYXRjaGVzIHRoZSBQbG90bHlcbiAqICBTVVJGQUNFIHotYXNwZWN0ICh+MC40KSBzbyB0aGUgcmVsaWVmIGlzbid0IGV4YWdnZXJhdGVkLiAqL1xuY29uc3QgU1VSRkFDRV9aX0FTUEVDVCA9IDAuNDtcbi8qKiBcIkZ1bGxcIiBtZXNoIGdyaWQgY2FwOyB0aGUgZGVjaW1hdGUgZmFjdG9yIGRpdmlkZXMgaXQgKGRlZmF1bHQgwrwg4oaSIDIyMCwgwr0g4oaSIDQ0MCwgRnVsbCDihpIgODgwKS4gKi9cbmNvbnN0IFNVUkZBQ0VfTUFYX0dSSUQgPSA4ODA7XG4vKiogQ29lZmZpY2llbnQgc2NhbGluZyB0aGUgcHlyYW1pZCB0aWxlIGJ1ZGdldCB3aXRoIHRoZSB0YXJnZXQgcmVzb2x1dGlvbiDigJQgYSBoaWdoZXIgdGFyZ2V0IHB1bGxzIGFcbiAqICBmaW5lciBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoICsgdm9sdW1lIGFzc2VtYmx5LiAqL1xuY29uc3QgU1RJVENIX0JVREdFVF9DT0VGRiA9IDE2O1xuLyoqIFN1cmZhY2UgbWVzaCB0YXJnZXQgZ3JpZCBmb3IgYSBkZWNpbWF0ZSBmYWN0b3IgYHNjYWxlYDogdGhlIGdyaWQgY2FwIHNocmlua3MgYnkgYHNjYWxlYCAoZXZlcnlcbiAqICBzbGljZSBpcyBrZXB0IOKAlCB0aGUgei1zbGlkZXIgbmVlZHMgdGhlbSBhbGwpLiBUaGUgc291cmNlIGlzIGZldGNoZWQgYXQgYSBtYXRjaGluZyByZXNvbHV0aW9uLiAqL1xuZnVuY3Rpb24gc3VyZmFjZVJlc29sdXRpb25Gb3Ioc2NhbGU6IG51bWJlcik6IHsgbWF4R3JpZDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4geyBtYXhHcmlkOiBNYXRoLm1heCgxNiwgTWF0aC5yb3VuZChTVVJGQUNFX01BWF9HUklEIC8gcykpIH07XG59XG5cbi8qKiAzRCBzY2F0dGVyOiBpbi1wbGFuZSBjYXAgZm9yIHRoZSBhc3NlbWJsZWQgdm94ZWwgZ3JpZCwgYW5kIHRoZSBtYXggbnVtYmVyIG9mIHBvaW50cyBlbWl0dGVkXG4gKiAgKHRoZSBncmlkIGlzIGZsYXQtc3RyaWRlZCBkb3duIHRvIHRoaXMpIOKAlCBrZWVwcyB0aGUgYmlsbGJvYXJkIGNvdW50IGludGVyYWN0aXZlLiAqL1xuY29uc3QgU0NBVFRFUjNEX01BWF9YWSA9IDY0O1xuY29uc3QgU0NBVFRFUjNEX01BWF9QT0lOVFMgPSAxNTAwMDA7XG5cbmNvbnN0IFRJTEVfU0laRSA9IDUxMjsgLy8gc2VydmVyIHRpbGUgZWRnZSAobWF0Y2hlcyB0aGUgT1NEIGJhY2tlbmQpXG4vKiogTWF4IHRpbGVzIHN0aXRjaGVkIGZvciBvbmUgZGlzcGxheWVkIHNsaWNlICg1MTJweCB0aWxlcyDihpIgdXAgdG8gfjYxNDTCsiBhdCBmdWxsIHJlcykuIEJleW9uZFxuICogIHRoaXMgd2Ugc3RlcCB0byBhIGNvYXJzZXIgcHlyYW1pZCBsZXZlbCBzbyBhIGxhcmdlIGltYWdlIHN0YXlzIHRyYWN0YWJsZS4gKi9cbmNvbnN0IE1BWF9TVElUQ0hfVElMRVMgPSAxNDQ7XG4vKiogV2ViR1BVIGRlZmF1bHQgYG1heFRleHR1cmVEaW1lbnNpb24yRGAg4oCUIGEgc3RpdGNoZWQgc2xpY2UncyBsb25nZXN0IHNpZGUgbXVzdCBmaXQgYSB0ZXh0dXJlLiAqL1xuY29uc3QgTUFYX1RFWFRVUkVfRElNID0gODE5Mjtcbi8qKiBDb25jdXJyZW50IHRpbGUgcmVxdWVzdHMgcGVyIHN0aXRjaGVkIHNsaWNlLiBGaXJpbmcgYSB3aG9sZSBncmlkIGF0IG9uY2UgKGh1bmRyZWRzIG9mIHJlcXVlc3RzXG4gKiAgZm9yIGEgbGFyZ2UgbGV2ZWwpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cyk7IGEgc21hbGwgcG9vbCBrZWVwcyB0aGUgcGlwZSBmdWxsIHdpdGhvdXRcbiAqICBmbG9vZGluZyBpdCDigJQgYW5kIHNsaWNlLWxldmVsIHdvcmtlcnMgYWxyZWFkeSBydW4gc2V2ZXJhbCBzdGl0Y2hlcyBpbiBwYXJhbGxlbCBvbiB0b3Agb2YgdGhpcy4gKi9cbmNvbnN0IFRJTEVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA2O1xuLyoqIEhvdyBsb25nIHRvIHBvbGwgYC90aWxlcy9pbmZvYCAoMjAyIHdoaWxlIHRoZSBzZXJ2ZXIgY2FjaGVzIHRoZSBzb3VyY2UpIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG9cbiAqICBhIHNpbmdsZSB0aWxlLiBHZW5lcm91cyBsaWtlIHRoZSBPU0QgYmFja2VuZCDigJQgYSBjb2xkIHdob2xlLXNsaWRlIGNhbiB0YWtlIG1pbnV0ZXMgdG8gY2FjaGUuICovXG5jb25zdCBERVNDUklQVE9SX1RJTUVPVVRfTVMgPSAxMjAwMDA7XG5cbi8qKiBEZWZhdWx0IHBlci1jaGFubmVsIHRpbnRzIChGaWppLXN0eWxlKSB3aGVuIHRoZSBzdG9yZS9kZXNjcmlwdG9yIG9mZmVycyBubyBjb2xvdXIuICovXG5jb25zdCBERUZBVUxUX1RJTlRTID0gWycjZmYwMDAwJywgJyMwMGZmMDAnLCAnIzAwMDBmZicsICcjZmZmZjAwJywgJyNmZjAwZmYnLCAnIzAwZmZmZicsICcjZmZmZmZmJ107XG5cbi8qKiBEZWZhdWx0IHRpbnQgZm9yIGEgY2hhbm5lbCBpbmRleCwgY3ljbGluZyB0aGUgRmlqaSBwYWxldHRlLiAqL1xuZnVuY3Rpb24gdGludEZvcihjaGFubmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gREVGQVVMVF9USU5UU1tjaGFubmVsICUgREVGQVVMVF9USU5UUy5sZW5ndGhdO1xufVxuXG4vKiogT25lIHB5cmFtaWQgbGV2ZWwgZnJvbSBgR0VUIC90aWxlcy9pbmZvYCAocmVzIDAgPSBmdWxsIHJlc29sdXRpb24pLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7XG4gIHJlczogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqIFN1YnNldCBvZiB0aGUgYC90aWxlcy9pbmZvYCBkZXNjcmlwdG9yIHRoaXMgYmFja2VuZCByZWFkcyAodGlsZSBncmlkLCBjaGFubmVscywgc2NhbGUpLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgbXVsdGljaGFubmVsPzogYm9vbGVhbjtcbiAgLyoqIFJlYWwgQmlvLUZvcm1hdHMgbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgcGVyLWNoYW5uZWwgdGlsZXMgZXhpc3Qgb25seSB0aGVyZS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICBiaXREZXB0aD86IG51bWJlcjtcbiAgICBtaW5BbGxvd2VkPzogbnVtYmVyO1xuICAgIG1heEFsbG93ZWQ/OiBudW1iZXI7XG4gIH0+IHwgbnVsbDtcbiAgbGV2ZWxzOiBUaWxlTGV2ZWxbXTtcbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFdlYkdQVSBpbWFnZSBiYWNrZW5kIGJ1aWx0IG9uIHRoZSBwdWJsaXNoZWQgYG5hcGFyaS1qc2AgbGlicmFyeSDigJQgdGhlIFBPQyBlbmdpbmUgZm9yXG4gKiBqaXQtdWkjMTAyIChhIGJyb3dzZXItYmFzZWQgbmFwYXJpIHNoaXBwZWQgYXMgYSBKUyBsaWJyYXJ5LCBzd2FwcGluZyBpbWFnZSBwbG90dGluZyB3aXRoXG4gKiBPcGVuU2VhZHJhZ29uIGFuZCAzRCBzbGljaW5nL2lzb3N1cmZhY2VzIHdpdGggUGxvdGx5KS5cbiAqXG4gKiBSZW5kZXIgc3RyYXRlZ3k6IHJhdGhlciB0aGFuIHJlLWltcGxlbWVudCB0aGUgc2VydmVyJ3MgdGlsZS9weXJhbWlkIHByb3RvY29sICh3aGljaCBPU0RcbiAqIGFscmVhZHkgaGFuZGxlcyksIHRoaXMgYmFja2VuZCByZW5kZXJzIHRoZSAqKmNvbXBsZXRlIHBlci1zbGljZSBpbWFnZSBVUkxzIHRoZSBhcHAgYWxyZWFkeVxuICogcHJvZHVjZXMqKiAoYElJbWFnZUluZm8udXJsc2ApIOKAlCBgdXJsc1t6XWAgZm9yIHRoZSAyRCBpbWFnZSwgYW5kIHRoZSBmdWxsIGB1cmxzYCBzdGFja1xuICogYXNzZW1ibGVkIGludG8gYSBkb3duc2FtcGxlZCB2b2x1bWUgZm9yIHRoZSAzRCB0eXBlcy4gUmVnaW9uIHN0YXRlIGFuZCBkaXNwbGF5IG9wdGlvbnNcbiAqIGRlbGVnYXRlIHRvIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAvIHtAbGluayBWaXN1YWxpemVyU3RvcmV9LCBleGFjdGx5IGFzIE9TRCBkb2VzLlxuICpcbiAqIEZvbGxvdy11cHMgKGppdC11aSMxMDIpOiBuYXRpdmUtcmVzb2x1dGlvbiBweXJhbWlkYWwgdGlsaW5nLCBvbi1jYW52YXMgdG9vbHMsIHJlZ2lvblxuICogb3ZlcmxheSByZW5kZXJpbmcsIHBlci1jaGFubmVsIGhpc3RvZ3JhbXMsIFRJRkYgZXhwb3J0LlxuICovXG4vKipcbiAqIFdoYXQgdGhlIDNEIHBvaW50cyBsYXllciBuZWVkcyB0byBjb2xvdXIgYSBjbG91ZDogb25lIHNjYWxhciBwZXIgcG9pbnQsIGEgY29sb3JtYXAsIGFuZCB0aGVcbiAqIHdpbmRvdyB0aGF0IG1hcHMgc2NhbGFycyBvbnRvIGl0LiBDYXRlZ29yaWNhbCBhbmQgY29udGludW91cyBjb2xvdXJpbmdzIGJvdGggcmVkdWNlIHRvIHRoaXMsXG4gKiBiZWNhdXNlIHRoZSBsYXllciBvZmZlcnMgbm8gcGVyLXBvaW50IGNvbG91ciBjaGFubmVsLlxuICovXG5pbnRlcmZhY2UgU3BhdGlhbDNkRW5jb2Rpbmcge1xuICB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgY29sb3JtYXA6IENvbG9ybWFwO1xuICBjb250cmFzdExpbWl0czogW251bWJlciwgbnVtYmVyXTtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlzdWFsaXplciB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzOiBQaXhlbERhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGxvdFR5cGU6IFBsb3RUeXBlID0gUGxvdFR5cGUuTkFQQVJJX0lNQUdFO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyBvd25pbmcgdGhlIDNEIHZvbHVtZSBsYXllcnMgKG9uZSBhZGRpdGl2ZSB0aW50ZWQgbGF5ZXIgcGVyIGNoYW5uZWxcbiAgICogIGZvciBtdWx0aWNoYW5uZWwsIG9yIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiBOdWxsIGluIDJELiAqL1xuICBwcml2YXRlIHZvbHVtZVZpZXc6IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgdm9sdW1lIGlzIGNvbXBvc2l0ZWQgZnJvbSBwZXItY2hhbm5lbCBsYXllcnMgKHZzIGEgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUpLiAqL1xuICBwcml2YXRlIHZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIGhlaWdodC1maWVsZCBzdXJmYWNlIG1lc2ggKE5BUEFSSV9TVVJGQUNFIHBsb3QgdHlwZTsgbnVsbCBvdGhlcndpc2UpLiBCdWlsdCBmcm9tIGFcbiAgICogIHNpbmdsZSBncmF5c2NhbGUgc2xpY2UgYnkge0BsaW5rIGJ1aWxkU3VyZmFjZX0gdmlhIG5hcGFyaS1qcydzIGBoZWlnaHRGaWVsZGAgKyBgYWRkU3VyZmFjZWAuICovXG4gIHByaXZhdGUgc3VyZmFjZUxheWVyOiBTdXJmYWNlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoaWNoIGJhbmQgdGhlIHN1cmZhY2Ugc2FtcGxlcyAoYSBjaGFubmVsIGluZGV4IGZvciBtdWx0aWNoYW5uZWwsIGVsc2UgdGhlIGNvbXBvc2l0ZSkuICovXG4gIHByaXZhdGUgc3VyZmFjZUNoYW5uZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLyoqIFRydWUgd2hlbiB0aGUgbW91bnRlZCBTdXJmYWNlIGZvbGxvd3Mgb25lIGJhbmQgb2YgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgc3VyZmFjZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAvKiogUHJlLWxvYWRlZCBwZXItc2xpY2UgbHVtaW5hbmNlIHBsYW5lcyAoYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCksIGtleWVkIGJ5IHosXG4gICAqICBzbyB0aGUgc3RhY2sgc2xpZGVyIHJlYnVpbGRzIHRoZSBzdXJmYWNlIGluc3RhbnRseS4gRmlsbGVkIGJ5IHtAbGluayBwcmVsb2FkU3VyZmFjZVBsYW5lc30uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3VyZmFjZVBsYW5lcyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICA+KCk7XG4gIC8qKiBJbi1wbGFuZSBncmlkIGNhcCBmb3IgdGhlIGFjdGl2ZSBzdXJmYWNlIGxvYWQgKGZ1bGwgZ3JpZCDDtyB0aGUgZGVjaW1hdGUgZmFjdG9yKS4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlTWF4R3JpZCA9IFNVUkZBQ0VfTUFYX0dSSUQ7XG4gIC8qKiBDb250cmFzdCB3aW5kb3cgW21pbixtYXhdIHRoZSBjdXJyZW50IHN1cmZhY2UgbWVzaCB3YXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2UgcmVzaGFwZXMgdGhlXG4gICAqICBtZXNoIChwaXhlbCBoZWlnaHQgPSBpbnRlbnNpdHkgd2l0aGluIFttaW4sbWF4XSksIHNvIGl0IHRyaWdnZXJzIGEgZ2VvbWV0cnkgcmVidWlsZC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQZXJzaXN0ZWQgd2lyZWZyYW1lIGNob2ljZSBmb3IgdGhlIHN1cmZhY2UgKHJlLWFwcGxpZWQgd2hlbiBhIG5ldyBzdXJmYWNlIG1vdW50cykuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpcmVmcmFtZSA9IGZhbHNlO1xuICAvKiogbmFwYXJpLWpzIDJEIHNjYXR0ZXIgcG9pbnRzIChyZWdpb24gY2VudHJvaWRzKSArIGl0cyByZWdpb24tY2hhbmdlIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyMmRQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhdHRlclJlZ2lvblN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBuYXBhcmktanMgM0Qgc2NhdHRlciAodm94ZWwgcG9pbnQgY2xvdWQpLiAqL1xuICBwcml2YXRlIHNjYXR0ZXIzZExheWVyOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTcGF0aWFsLW9taWNzIG9ic2VydmF0aW9uIG1hcmtlcnMgKyB0aGUgZGF0YXNldC92aWV3IHN1YnNjcmlwdGlvbiBkcml2aW5nIHRoZW0uICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czogUG9pbnRzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSAzRCBwb2ludCBjbG91ZC4gT25lIGxheWVyOiBzZWxlY3Rpb24gaXMgYSBwZXItcG9pbnQgYWxwaGEgb24gaXQsIG5vdCBhIHNlY29uZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzM2Q6IFBvaW50czNETGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsTGF5ZXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbnRlcmxlYXZlZCB4LHkseiwgY2FjaGVkIHNvIGEgY29sb3VyIGNoYW5nZSBkb2VzIG5vdCByZS13YWxrIDMuN00gb2JzZXJ2YXRpb25zLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb3NpdGlvbnMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc2NhbGFycyBjdXJyZW50bHkgdXBsb2FkZWQg4oCUIHNlZSB7QGxpbmsgcmVidWlsZFNwYXRpYWxQb2ludHMzZH0uICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxhcktleTNkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBhbmF0b21pY2FsIHZvbHVtZSB0aGUgY2xvdWQgc2l0cyBpbnNpZGUsIHdoZW4gdGhlIGRhdGFzZXQgaGFzIG9uZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lOiBWb2x1bWVMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxWb2x1bWVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyLWNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGFsb25nc2lkZSB0aGUgY2xvdWQsIGFuZCB3aGF0IHRoZXkgd2VyZVxuICAgKiAgYnVpbHQgZnJvbSDigJQgcmFzdGVyaXNpbmcgaXMgc2Vjb25kcyBvZiB3b3JrLCBzbyBpdCBtdXN0IG5vdCByZXBlYXQgZm9yIGFcbiAgICogIGNoYW5nZSB0aGF0IGNhbm5vdCBhZmZlY3QgdGhlIGZpZWxkLiAqL1xuICBwcml2YXRlIGRlbnNpdHlMYXllcnM6IFZvbHVtZUxheWVyW10gPSBbXTtcbiAgcHJpdmF0ZSBkZW5zaXR5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNlbGVjdGlvbiBpZGVudGl0eSwgYXMgYSBudW1iZXIgdGhlIGRlbnNpdHkga2V5IGNhbiBjYXJyeS4gKi9cbiAgcHJpdmF0ZSBsYXN0U2VsZWN0aW9uU2VlbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXZpc2lvbiA9IDA7XG4gIC8qKiBUaGUgZ2VuZSBtYXA6IGl0cyBsYXllciwgdGhlIGZpZWxkIGl0IHdhcyBlc3RpbWF0ZWQgZnJvbSwgYW5kIHRoZSBpbnB1dHMgZWFjaFxuICAgKiAgd2FzIGJ1aWx0IGZvciDigJQgdGhlIGZpZWxkIGlzIHRoZSBleHBlbnNpdmUgaGFsZiBhbmQgc3Vydml2ZXMgYSByZWNvbG91ci4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwTGF5ZXI6IEltYWdlTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGQ6IEV4cHJlc3Npb25GaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgZ2VuZSBtYXA6IGl0cyB2b2x1bWUgbGF5ZXIsIHRoZSBmaWVsZCBiZWhpbmQgaXQsIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHNhbWUgdHdvIGNsb2NrcyBhcyB0aGUgMkQgbWFwLiAqL1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVMYXllcjogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGQ6IEV4cHJlc3Npb25Wb2x1bWVGaWVsZCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGdlbmVNYXBWb2x1bWVGaWVsZEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPZmZzZXQgYXBwbGllZCB0byBvYnNlcnZhdGlvbiBjb29yZGluYXRlcyB0byBzaXQgdGhlbSBpbiB0aGUgdm9sdW1lJ3MgYm94LiAqL1xuICBwcml2YXRlIHNwYXRpYWxPcmlnaW4zZDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDBdO1xuICAvKiogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzLCBhbmQgZXZlcnl0aGluZyBpdCBuZWVkczogd2hhdCB0aGVcbiAgICogIGNsb3VkIGlzIGNvbG91cmVkIGJ5LCBhbmQgd2hlcmUgZWFjaCBkcmF3biBvYnNlcnZhdGlvbiBpcy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVG9vbHRpcDogTmFwYXJpU3BhdGlhbFRvb2x0aXAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZTogSG92ZXJTb3VyY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZXF1ZW5jZXMgdGhlIGFzeW5jIHJlc29sdXRpb25zLiBUaGUgS0VZIGlzIG9ubHkgY29tbWl0dGVkIG9uY2Ugb25lIGxhbmRzLFxuICAgKiAgc28gYSBzdXBlcnNlZGVkIGZldGNoIGNhbm5vdCBsZWF2ZSB0aGUgY2FjaGUgY2xhaW1pbmcgdG8gaG9sZCBhIHNvdXJjZSBpdFxuICAgKiAgbmV2ZXIgc3RvcmVkLiAqL1xuICBwcml2YXRlIGhvdmVyU291cmNlVG9rZW4gPSAwO1xuICAvKiogRHJhd24gb2JzZXJ2YXRpb25zJyBwb3NpdGlvbnMgZm9yIGhpdC10ZXN0aW5nLCBpbmRleGVkIEJZIE9CU0VSVkFUSU9OIHdpdGhcbiAgICogIE5hTiBmb3IgYW55dGhpbmcgbm90IGRyYXduLiBTY3JlZW4gcGl4ZWxzIGluIDNEICh0aGUgY2FtZXJhIG1vdmVzIHRoZW0sIHNvXG4gICAqICB0aGV5IGFyZSByZWJ1aWx0IHdoZW4gaXQgZG9lcykgYW5kIFdPUkxEIHVuaXRzIGluIDJEICh3aGVyZSB0aGUgY2FtZXJhIG9ubHlcbiAgICogIHNjYWxlcywgc28gdGhlIHBvaW50ZXIgaXMgY29udmVydGVkIGluc3RlYWQgb2YgMzc0ayBwb2ludHMpLiAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zOiBGbG9hdDMyQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuXG4gIC8qKlxuICAgKiBTY3JlZW4tc3BhY2UgYnVja2V0IGluZGV4IG92ZXIgdGhlIDNEIHByb2plY3Rpb24sIGJ1aWx0IG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICogc2NlbmUgbW92ZWQgcmF0aGVyIHRoYW4gd2hlbiBpdCBtb3Zlcy5cbiAgICpcbiAgICogTGF6aWx5LCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgZGVzaWduOiBhbiBvcmJpdCBkcmFnIGNoYW5nZXMgdGhlIGNhbWVyYSBldmVyeSBmcmFtZSwgc29cbiAgICogYnVpbGRpbmcgZWFnZXJseSB3b3VsZCBzcGVuZCB0ZW5zIG9mIG1pbGxpc2Vjb25kcyBhIGZyYW1lIGluZGV4aW5nIGZvciBwaWNrcyBub2JvZHkgaXNcbiAgICogbWFraW5nLiBEZWZlcnJlZCwgaXQgaXMgYnVpbHQgb25jZSB3aGVuIHRoZSBkcmFnIHN0b3BzIGFuZCB0aGUgcG9pbnRlciBuZXh0IG1vdmVzIOKAlFxuICAgKiBtZWFzdXJlZCB1cHN0cmVhbSBhdCAzLjdNIHBvaW50cywgdGhhdCB0dXJucyBhIDEyLjYgbXMgc2NhbiBwZXIgcG9pbnRlcm1vdmUgaW50b1xuICAgKiAwLjA2NiBtcy5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJJbmRleDogU2NyZWVuSW5kZXggfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCB3aGVuZXZlciB0aGUgY2FjaGVkIHBvc2l0aW9ucyBnbyBzdGFsZTogYSBtYXJrZXIgcmVidWlsZCwgb3Ig4oCUIGluIDNEXG4gICAqICBvbmx5LCB3aGVyZSB0aGUgcHJvamVjdGlvbiBkZXBlbmRzIG9uIGl0IOKAlCBhIGNhbWVyYSBtb3ZlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2VuZVJldiA9IDA7XG4gIHByaXZhdGUgaG92ZXJQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJGcmFtZSA9IDA7XG4gIHByaXZhdGUgaG92ZXJPZmY6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIC8qKiBPYnNlcnZhdGlvbiBpbmRpY2VzIHRoZSBjYWNoZWQgM0QgcG9zaXRpb25zIGJlbG9uZyB0bywgaW4gdGhlIHNhbWUgb3JkZXI7XG4gICAqICBudWxsIHdoZW4gZXZlcnkgb2JzZXJ2YXRpb24gaXMgZHJhd24uIFdpdGhvdXQgaXQgYSBwcm9qZWN0aW9uIGJ1aWx0IGZyb20gdGhlXG4gICAqICBwb3NpdGlvbnMgaXMgaW5kZXhlZCBieSBEUkFXTiBvcmRlciBhbmQgc2lsZW50bHkgYXR0cmlidXRlcyBlYWNoIHBvaW50IHRvXG4gICAqICB0aGUgd3Jvbmcgb2JzZXJ2YXRpb24gYXMgc29vbiBhcyBhIHNlY3Rpb24gaXMgaXNvbGF0ZWQuICovXG4gIHByaXZhdGUgc3BhdGlhbERyYXduM2Q6IFVpbnQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFJldXNlZCBwcm9qZWN0aW9uIGJ1ZmZlcnMg4oCUIHNlZSB7QGxpbmsgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb259LiAqL1xuICBwcml2YXRlIHNwYXRpYWxQcm9qZWN0aW9uM2Q6IFByb2plY3RlZFBvaW50cyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogUGVyLW9ic2VydmF0aW9uIGRlcHRoIGZyb20gdGhlIGxhc3QgcHJvamVjdGlvbiwgZm9yIHRoZSBkZXB0aC1hd2FyZSBob3ZlciBwaWNrLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEZXB0aHMzZDogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgKHZpZXdlciwgZGF0YXNldCkgd2hvc2UgM0Qgc2NlbmUgaGFzIGFscmVhZHkgaGFkIGl0cyBvcGVuaW5nIGZyYW1pbmcuICovXG4gIC8qKiBXaG9zZSAyRCBvYnNlcnZhdGlvbnMgdGhlIGNhbWVyYSBoYXMgYmVlbiBmcmFtZWQgb24g4oCUIHNlZSB7QGxpbmsgZnJhbWVTcGF0aWFsUG9pbnRzT25jZX0uICovXG4gIHByaXZhdGUgc3BhdGlhbDJkRnJhbWVkOiB7IHZpZXdlcjogVmlld2VyOyBkYXRhc2V0SWQ6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEYXRhc2V0IHRoZSAzRCBzY2FsZSBiYXIgd2FzIGJ1aWx0IGZvci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NhbGVCYXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwYXRpYWxTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogTGV2ZWwtb2YtZGV0YWlsIGNlbGwgb3V0bGluZXMsIHRyYW5zY3JpcHRzIGFuZCBkZW5zaXR5IG92ZXIgdGhlIDJEIHZpZXcg4oCUIGNyZWF0ZWQgb25cbiAgICogIGZpcnN0IHVzZSwgYW5kIG9ubHkgd2hlbiBhIHNwYXRpYWwgcG9ydCBpcyBib3VuZC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsVGlsZXNNZ3I6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGb3IgdGhlIHBhbmVsOiB0aGUgdHJhbnNjcmlwdHMtaW4tdmlldyBlc3RpbWF0ZSBhbmQgdGhlIGRlbnNpdHkgd2luZG93IGluIHVzZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNjcmlwdEVzdGltYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW4gdmlldyAoc2VlIE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLmdlbmVDb3VudHNJbikuICovXG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbnNpdHlTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICAvKiogTGF0ZXN0IChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBzYXcsIHNvIGEgc2xpY2VcbiAgICogIGNoYW5nZSBjYW4gcmVidWlsZCB0aGUgbWFya2VycyBmb3IgdGhlIG5ldyBwbGFuZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsTGF0ZXN0OiBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza10gfCBudWxsID1cbiAgICBudWxsO1xuICAvKiogV2hpY2ggZGF0YXNldCB0aGUgY3VycmVudCBtYXJrZXIgbGF5ZXIgd2FzIGJ1aWx0IGZvciwgc28gYSBkaXNwbGF5LW9ubHlcbiAgICogIGNoYW5nZSAoc2l6ZSwgY29sb3VyLCBvcGFjaXR5LCBzZWxlY3Rpb24pIGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UuICovXG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIE1vbm90b25pYyBndWFyZCBmb3IgdGhlIGFzeW5jIGNvbG91ciByZWJ1aWxkOiBmZXRjaGluZyBhIGdlbmUgdmVjdG9yIGlzIGFcbiAgICogIHJvdW5kLXRyaXAsIHNvIGEgZmFzdCBzZXF1ZW5jZSBvZiBjb2xvdXItYnkgY2hhbmdlcyBjYW4gcmVzb2x2ZSBvdXQgb2ZcbiAgICogIG9yZGVyLiBPbmx5IHRoZSBuZXdlc3QgcmVidWlsZCBpcyBhbGxvd2VkIHRvIHRvdWNoIHRoZSBsYXllci4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUmVidWlsZFRva2VuID0gMDtcbiAgLyoqIFwieCByZWxvYWRpbmfigKZcIiBhdCB0aGUgYm90dG9tIG9mIHRoZSBjYW52YXM6IHRoZSB0aWxlIGxheWVycycgbG9hZHMgYW5kIHRoZSBvYnNlcnZhdGlvbnMnLiAqL1xuICBwcml2YXRlIGxvYWRpbmdCYWRnZTogTmFwYXJpTG9hZGluZ0JhZGdlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGlsZUxvYWRpbmc6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgb2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gIC8qKiBNb25vdG9uaWMgbG9hZCBnZW5lcmF0aW9uLiBCdW1wZWQgYnkge0BsaW5rIHJlc2V0fSBhbmQge0BsaW5rIGNhbmNlbExvYWRpbmd9OyB0aGUgZnJhbWUtbG9hZGluZ1xuICAgKiAgbG9vcHMgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKSBjYXB0dXJlIGl0IGFuZCBiYWlsIHdoZW4gaXQgY2hhbmdlcywgc28gYSBDYW5jZWwgKG9yIGFcbiAgICogIG5ldyBwbG90KSBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQuICovXG4gIHByaXZhdGUgbG9hZFRva2VuID0gMDtcbiAgLyoqIERlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcyAoMSA9IEZ1bGwsIDIgPSDCvSBkZWZhdWx0LCA0ID0gwrwsIDggPSDihZspLiBBcHBsaWVkIHdoZW4gYVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZSAocmUpbG9hZHM7IGNoYW5naW5nIGl0IG5lZWRzIGEgcmUtcGxvdCAoaXQgY2hhbmdlcyBmZXRjaGVkIGRhdGEpLiAqL1xuICBwcml2YXRlIHJlc29sdXRpb25TY2FsZSA9IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFO1xuICAvKiogM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gZm9yIHRoZSB2b2x1bWUvaXNvc3VyZmFjZSB2aWV3IChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGF5ZXI6IEF4ZXNMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogRE9NIFgvWS9aICsgc2NhbGUgbGFiZWxzIHRyYWNraW5nIHRoZSAzRCBheGVzIGdpem1vIChudWxsIGluIDJEKS4gKi9cbiAgcHJpdmF0ZSBheGVzTGFiZWxzOiBOYXBhcmlBeGVzTGFiZWxzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEcmFnZ2FibGUgWi1oZWlnaHQgZ3JpcCBvdmVyIHRoZSB2b2x1bWUgKG51bGwgdW5sZXNzIGEgdm9sdW1lL2lzb3N1cmZhY2UgaXMgbW91bnRlZCkuICovXG4gIHByaXZhdGUgekhhbmRsZTogTmFwYXJpVm9sdW1lWkhhbmRsZSB8IG51bGwgPSBudWxsO1xuICAvKiogVXNlciBaLWhlaWdodCBmYWN0b3IgZm9yIHRoZSB2b2x1bWUgKDEgPSB0aGUgdm9sdW1lJ3MgbmF0dXJhbCBwcm9wb3J0aW9ucyk7IGRyaXZlbiBieSB0aGVcbiAgICogIGluLXZpZXcgZHJhZyBoYW5kbGUuIFJlc2V0IHBlciBtb3VudC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVaU2NhbGUgPSAxO1xuICAvKiogVm9sdW1lIHdvcmxkIGJveCBhdCBgdm9sdW1lWlNjYWxlID0gMWAgKGJhc2UpICsgdGhlIHNhbXBsZWQgdm94ZWwgZGVwdGgg4oCUIGVub3VnaCB0byByZWNvbXB1dGVcbiAgICogIHRoZSBaLWF4aXMgdm94ZWwgc2NhbGUsIGF4ZXMgZGVwdGgsIGFuZCBvdmVybGF5IGFuY2hvcnMgYXMgdGhlIGhhbmRsZSBzdHJldGNoZXMgWi4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVXb3JsZEJhc2U6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvbHVtZVNhbXBsZWREZXB0aCA9IDE7XG4gIC8qKiBQZXJzaXN0ZWQgYXhlcyBvbi9vZmYgY2hvaWNlLCByZS1hcHBsaWVkIHdoZW4gYSBuZXcgdm9sdW1lIG1vdW50cy4gRGVmYXVsdHMgb24uICovXG4gIHByaXZhdGUgYXhlc1Zpc2libGUgPSB0cnVlO1xuICBwcml2YXRlIHZvbHVtZURpbXM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogQXNzZW1ibGVkIHVpbnQ4IHZvbHVtZSBkYXRhIHBlciBjaGFubmVsIChrZXkgPSBjaGFubmVsIGluZGV4KSwga2VwdCBmb3IgdGhlIHZvbHVtZSBpbnRlbnNpdHlcbiAgICogIGhpc3RvZ3JhbS4gS2V5IDAgaG9sZHMgdGhlIGdyYXlzY2FsZS9jb21wb3NpdGUgdm9sdW1lIGluIHRoZSBzaW5nbGUtY2hhbm5lbCBjYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5uZWxEYXRhID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogTW9ub3RvbmljIHNsaWNlLXJlcXVlc3QgaWQgc28gYSBzbG93IG91dC1vZi1vcmRlciBzbGljZSBmZXRjaCBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLiAqL1xuICBwcml2YXRlIHNsaWNlUmVxID0gMDtcbiAgLyoqIENhY2hlZCBgL3RpbGVzL2luZm9gIHB5cmFtaWQgZGVzY3JpcHRvciArIHRoZSBpbmZvQjY0IGl0IHdhcyBmZXRjaGVkIGZvci4gKi9cbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3JLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgMkQgaW1hZ2UgaXMgY29tcG9zaXRlZCAoZHJpdmVzIGhpc3RvZ3JhbSArIHN0YXRlIGFwcGxpY2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZU1vZGU6ICdncmF5c2NhbGUnIHwgJ211bHRpY2hhbm5lbCcgfCAncmdiJyA9ICdyZ2InO1xuICAvKiogbmFwYXJpLWpzIGhpZ2gtbGV2ZWwgdmlldyB0aGF0IG93bnMgdGhlIHBlci1jaGFubmVsIGxheWVyIHNldCAoYnVpbGQgKyBsaXZlIGRpc3BsYXlcbiAgICogIHVwZGF0ZXMpIGZvciB0aGUgY3VycmVudCB7QGxpbmsgaW1hZ2VNb2RlfS4gUmVidWlsdCBvbiBlYWNoIChyZSlyZW5kZXIuICovXG4gIHByaXZhdGUgY2hhbm5lbFZpZXc6IE11bHRpQ2hhbm5lbEltYWdlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogTGl2ZSBzdWJzY3JpcHRpb24gYXBwbHlpbmcgY2hhbm5lbC1zdGF0ZSAvIGNvbG9ybWFwIGNoYW5nZXMgdG8gdGhlIGxheWVycy4gKi9cbiAgcHJpdmF0ZSBkaXNwbGF5U3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExhdGVzdCBncmF5c2NhbGUgY29sb3JtYXAgc2VsZWN0aW9uIGZyb20gdGhlIHN0b3JlIChhcHBsaWVkIHRvIHRoZSBzaW5nbGUgZ3JheSBsYXllcikuICovXG4gIHByaXZhdGUgY3VycmVudENvbG9ybWFwOiBDb2xvcm1hcE5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UmV2ZXJzZSA9IGZhbHNlO1xuICAvKiogTGF0ZXN0IGludmVydCB0b2dnbGUgZnJvbSB0aGUgc3RvcmUgKGZsaXBzIGludGVuc2l0eSBiZWZvcmUgdGhlIGNvbG9ybWFwLCBsaWtlIE9TRCkuICovXG4gIHByaXZhdGUgaW52ZXJ0RW5hYmxlZCA9IGZhbHNlO1xuICAvKiogUGh5c2ljYWwgc2NhbGUgYmFyIG92ZXJsYXkgZm9yIHRoZSAyRCBpbWFnZSAobnVsbCB3aGVuIDNEIG9yIHRoZSBpbWFnZSBoYXMgbm8gwrVtL3BpeGVsKS4gKi9cbiAgcHJpdmF0ZSBzY2FsZUJhcjogTmFwYXJpU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE92ZXJ2aWV3IG1pbmltYXAgKGJvdHRvbS1yaWdodCksIGFzIE9TRCdzIG5hdmlnYXRvci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3I6IE5hcGFyaU5hdmlnYXRvciB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciB0aGUgbmF2aWdhdG9yIGlzIHNob3duIOKAlCB0aGUgc2FtZSBob3N0IHNldHRpbmcgT1NEJ3MgbmF2aWdhdG9yIGhvbm91cnMuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yVmlzaWJsZSA9IHRydWU7XG4gIC8qKiBCdW1wZWQgcGVyIHRodW1ibmFpbCByZXF1ZXN0LCBzbyBhIHNsb3cgb25lIGNhbm5vdCBvdmVyd3JpdGUgYSBuZXdlciBzbGljZSdzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclRva2VuID0gMDtcbiAgLyoqIFNWRyByZWdpb24tZHJhd2luZyBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgdW50aWwgYSAyRCBpbWFnZSBpcyBwbG90dGVkKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25PdmVybGF5OiBOYXBhcmlSZWdpb25PdmVybGF5IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBQaXhlbC10b29sIHBsdW1iaW5nOiB0aGUgcGxvdCBkaXYgaWQsIGNvb3JkIHRyYW5zZm9ybSwgYW5kIGJvdW5kIHRvb2wgaG9zdHMuICovXG4gIHByaXZhdGUgcGxvdERpdklkID0gJyc7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3Q6IFdhbmRUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVyYXNlckhvc3Q6IFZlcnRleEVyYXNlclRvb2xIb3N0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDYWNoZWQgQ2FjaGVkSW1hZ2VEYXRhIGJ1aWx0IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgKHJlYnVpbHQgd2hlbiBsYXN0UGl4ZWxzIGNoYW5nZXMpLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZVNvdXJjZTogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBWaXNpYmxlIHdvcmxkIHJlY3QgY2FwdHVyZWQgQVQgdGhlIGxhc3QgcmVhZGJhY2sg4oCUIG11c3QgcGFpciB3aXRoIGBsYXN0UGl4ZWxzYCBzbyB0aGUgcGl4ZWxcbiAgICogIHRvb2xzJyByYXRpb3Mvb3JpZ2luIG1hdGNoIHRoZSBtYXRyaXgncyBjYW1lcmEgKHVzaW5nIHRoZSBsaXZlIHJlY3QgYWZ0ZXIgYSBwYW4vem9vbSB3b3VsZFxuICAgKiAgbWlzLXNjYWxlIHRoZSByZWdpb24pLiAqL1xuICBwcml2YXRlIGxhc3RQaXhlbHNSZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBJbWFnZSBzbW9vdGhpbmcgKGJpbGluZWFyKSB2cyBuZWFyZXN0LW5laWdoYm91ciAoY3Jpc3AgcGl4ZWxzLCB0aGUgZGVmYXVsdCkuICovXG4gIHByaXZhdGUgaW1hZ2VTbW9vdGhpbmcgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hlbiB0aGUgMkQgaW1hZ2UgaXMgcmVuZGVyZWQgdmlhIHB5cmFtaWRhbCBUaWxlZFNvdXJjZXMgKGRlc2NyaXB0b3IgYXZhaWxhYmxlKS4gKi9cbiAgcHJpdmF0ZSB0aWxlZCA9IGZhbHNlO1xuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIHRpbWVyICsgY2FtZXJhLWNoYW5nZSB1bnN1YnNjcmliZSAoa2VlcCBsYXN0UGl4ZWxzIGN1cnJlbnQgZm9yIHRvb2xzKS4gKi9cbiAgcHJpdmF0ZSByZWFkYmFja1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbWVyYVJlYWRiYWNrT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqIENvYXJzZSBwZXItY2hhbm5lbCBsdW1pbmFuY2Ugc2FtcGxlIChrZXllZCBieSBjaGFubmVsIGluZGV4KSBmb3IgdGhlIGhpc3RvZ3JhbSBpbiB0aWxlZCBtb2RlLFxuICAgKiAgd2hlcmUgdGhlIGxheWVycyBoYXZlIG5vIGZ1bGwgaW4tbWVtb3J5IHBpeGVscy4gUmVmcmVzaGVkIG9uIHBsb3QgKyBzbGljZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdFNhbXBsZXMgPSBuZXcgTWFwPG51bWJlciwgVWludDhBcnJheT4oKTtcbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggaGlzdG9ncmFtcyBmcm9tIGAvaGlzdG9ncmFtYCwga2V5ZWQgYCR7en18JHtjaGFubmVsfWAgKD44LWJpdCBpbWFnZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSUhpc3RvZ3JhbT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSByZWFkb25seSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3YW5kVG9vbDogV2FuZFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJ1c2hUb29sOiBCcnVzaFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJhc2VyVG9vbDogVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b29tVG9Cb3hUb29sOiBab29tVG9Cb3hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIHByaXZhdGUgcmVhZG9ubHkgY2VsbFNlZ21lbnRlcjogSUNlbGxTZWdtZW50ZXIgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlU3RhY2s6IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSxcbiAgICBASW5qZWN0KFZJWl9DT05GSUcpIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBvbmx5IGEgaG9zdCB0aGF0IHNlcnZlcyBzcGF0aWFsLW9taWNzIGRhdGEgcHJvdmlkZXMgaXQsIGFuZFxuICAgIC8vIHdpdGhvdXQgaXQgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlIGlzIG5ldmVyIG9mZmVyZWQgYW55d2F5LlxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMuYXBpID0gY29uZmlnLnNsaWRlQ3JvcFNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCArIGNhY2hlIHRoZSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIChgR0VUIC90aWxlcy9pbmZvYCk6IHRoZSBSRUFMIHBlci1sZXZlbCB0aWxlIGdyaWQsXG4gICAqIHRpbGUgc2l6ZSwgY2hhbm5lbCBtZXRhZGF0YSBhbmQgcGh5c2ljYWwgcGl4ZWwgc2l6ZS4gVGhlIGJhY2tlbmQgcmV0dXJucyAyMDIgd2hpbGUgdGhlIHNvdXJjZVxuICAgKiBpcyBzdGlsbCBjYWNoaW5nLCBzbyB3ZSBwb2xsIGJyaWVmbHkuIENhY2hlZCBwZXIgYGluZm9CNjRgOyByZXR1cm5zIG51bGwgaWYgaXQgbmV2ZXIgYmVjb21lc1xuICAgKiByZWFkeSAoY2FsbGVycyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUtdGlsZSBmZXRjaCkuIFRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgZ3JpZCDigJQgZ3Vlc3NpbmdcbiAgICogbGV2ZWwgZGltcyBmcm9tIGB0cnVlSW1hZ2VTaXplYCBvdmVyc2hvb3RzIHRoZSByZWFsIGdyaWQgYW5kIHRoZSBzZXJ2ZXIgNDAwcyBvdXQtb2YtcmFuZ2UgdGlsZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlc2NyaXB0b3IoKTogUHJvbWlzZTxUaWxlRGVzY3JpcHRvciB8IG51bGw+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAobm8gdGlsZSBzZXJ2ZXIg4oCUIGUuZy4gYSBudW1iZXJlZCBpbWFnZVxuICAgIC8vIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsIGVhY2ggc2xpY2UgYSBkaWZmZXJlbnQgZmlsZSk6IHRoZXJlIGlzIG5vXG4gICAgLy8gc2luZ2xlIHNlcnZlci10aWxlZCBweXJhbWlkIHRvIGRlc2NyaWJlLiBSZXR1cm5pbmcgbnVsbCByb3V0ZXMgZXZlcnlcbiAgICAvLyBjYWxsZXIgKDJEIGltYWdlLCB2b2x1bWUsIHN1cmZhY2UpIHRvIHRoZWlyIHN0aXRjaGVkL3NpbmdsZS1mZXRjaFxuICAgIC8vIGZhbGxiYWNrLCB3aGljaCDigJQgdmlhIGZldGNoU2xpY2UncyBvd24gU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIGJyYW5jaCDigJRcbiAgICAvLyBjb3JyZWN0bHkgZmV0Y2hlcyBlYWNoIHNsaWNlJ3Mgb3duIFVSTCBpbnN0ZWFkIG9mIG9uZSBmaXhlZCBmaWxlJ3MgdGlsZVxuICAgIC8vIHB5cmFtaWQuXG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUodGhpcy5sb2FkZWQ/LmltYWdlSW5mbykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpO1xuICAgIGlmICghaW5mb0I2NCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvciAmJiB0aGlzLmRlc2NyaXB0b3JLZXkgPT09IGluZm9CNjQpIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgREVTQ1JJUFRPUl9USU1FT1VUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3AuanNvbigpKSBhcyBUaWxlRGVzY3JpcHRvcjtcbiAgICAgICAgICBpZiAoYm9keT8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGJvZHk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JLZXkgPSBpbmZvQjY0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiAoc3RpbGwgY2FjaGluZykgb3IgZW1wdHkgYm9keSDihpIgcmUtcG9sbCB1bnRpbCB0aGUgZGVhZGxpbmUuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRpbGVzL2luZm8gbm90IHJlYWR5OyBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlLXRpbGUgZmV0Y2gnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMjAwKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgQ09NUExFVEUgcmVuZGVyZWQgc2xpY2UgYXMgYW4gYEltYWdlQml0bWFwYCBieSBzdGl0Y2hpbmcgdGhlIHNlcnZlcidzIFJFQUwgdGlsZSBncmlkXG4gICAqIChmcm9tIGAvdGlsZXMvaW5mb2ApIOKAlCBub3QganVzdCB0aGUgdG9wLWxlZnQgdGlsZSwgd2hpY2ggb25seSBldmVyIHNob3dlZCBhIGxhcmdlIGltYWdlJ3NcbiAgICogY29ybmVyLiBQaWNrcyB0aGUgZmluZXN0IHB5cmFtaWQgbGV2ZWwgd2hvc2UgZ3JpZCBmaXRzIGBidWRnZXRUaWxlc2AgYW5kIHdob3NlIGxvbmdlc3Qgc2lkZSBpc1xuICAgKiB3aXRoaW4gdGhlIEdQVSB0ZXh0dXJlIGxpbWl0LCBmZXRjaGVzIHRoYXQgZ3JpZCBjb25jdXJyZW50bHksIGFuZCBzdGl0Y2hlcyBpdCBpbnRvIG9uZSBjYW52YXMuXG4gICAqXG4gICAqIGBjaGFubmVsYCBzZWxlY3RzIGEgc2luZ2xlIGJhbmQgYXMgZ3JheXNjYWxlIChyZWFsIGxldmVscyBvbmx5KTsgb21pdCBmb3IgdGhlIHNlcnZlciBjb21wb3NpdGUuXG4gICAqIGBidWRnZXRUaWxlc2AgY2FwcyB0aGUgZ3JpZDogdGhlIDJEIHZpZXcgdXNlcyB0aGUgZnVsbCBidWRnZXQgZm9yIGRldGFpbDsgdGhlIDNEIHZvbHVtZSBwYXNzZXNcbiAgICogMSBmb3IgYSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBzbGljZSAoaXQgZG93bnNhbXBsZXMgdG8ge0BsaW5rIFZPTFVNRV9NQVhfU0xJQ0V9KS4gRmFsbHMgYmFja1xuICAgKiB0byBhIHNpbmdsZSBgY29sPTAscm93PTBgIHRpbGUgd2hlbiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSAoc21hbGwvc2ltcGxlIGltYWdlcywgdm9sdW1lcykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU2xpY2UoXG4gICAgejogbnVtYmVyLFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICAgYnVkZ2V0VGlsZXM6IG51bWJlciA9IE1BWF9TVElUQ0hfVElMRVMsXG4gICAgLyoqIFdoZW4gYSBzcGVjaWZpYyBjaGFubmVsIGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiBgYnVkZ2V0VGlsZXNgLCBkcm9wIHRvIHRoZSBzZXJ2ZXJcbiAgICAgKiAgQ09NUE9TSVRFIG92ZXJ2aWV3IGluc3RlYWQgb2Ygc3RpdGNoaW5nIHRoZSBodWdlIHBlci1jaGFubmVsIGxldmVsLiBPbmx5IHNhZmUgd2hlbiB0aGUgY2FsbGVyXG4gICAgICogIHdhbnRzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSAodGhlIHN1cmZhY2UgaGVpZ2h0KTogZm9yIGEgbXVsdGljaGFubmVsIFZPTFVNRSBldmVyeSBjaGFubmVsXG4gICAgICogIHdvdWxkIHRoZW4gZmV0Y2ggdGhlIHNhbWUgY29tcG9zaXRlIGFuZCB0aGUgY2hhbm5lbHMgd291bGQgY29sbGFwc2UgaW50byBvbmUsIHNvIHZvbHVtZVxuICAgICAqICBhc3NlbWJseSBsZWF2ZXMgdGhpcyBgZmFsc2VgIHRvIGtlZXAgZWFjaCBiYW5kIGRpc3RpbmN0LiAqL1xuICAgIGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxJbWFnZUJpdG1hcD4ge1xuICAgIC8vIFNlbGYtY29udGFpbmVkIG11bHRpLXNsaWNlIHN0YWNrICh0aWxlZDpmYWxzZSk6IGB6YCBpbmRleGVzIGEgY29tcGxldGVseVxuICAgIC8vIGRpZmZlcmVudCBmaWxlJ3Mgb3duIHByZXZpZXcgVVJMLCBub3QgYW4gaW50ZXJuYWwgc2xpY2Ugb2Ygb25lIHNlcnZlci1cbiAgICAvLyB0aWxlZCBmaWxlIOKAlCByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChzaGFyZWRcbiAgICAvLyB3aXRoIE9TRDsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIGJhcmUgZmV0Y2goKSkgaW5zdGVhZCBvZlxuICAgIC8vIGJ1aWxkaW5nIGEgL3RpbGU/aW5mbz0uLi4mej0gcmVxdWVzdCBhZ2FpbnN0IHdoaWNoZXZlciBzaW5nbGUgZmlsZVxuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCgpIHBvaW50cyBhdCAod2hpY2ggd291bGQgNDAwL21pc21hdGNoIGZvciBhbnkgelxuICAgIC8vIGJleW9uZCB0aGF0IG9uZSBmaWxlJ3Mgb3duIGV4dGVudCkuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgaWYgKHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykpIHtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsIHZvbHVtZTogZmV0Y2ggdGhlIHJlcXVlc3RlZCBjaGFubmVsJ3MgT1dOIHBsYW5lXG4gICAgICAvLyAoY2hhbm5lbFVybHNbel1bY2hhbm5lbF0pIHNvIGVhY2ggYmFuZCBzdGF5cyBkaXN0aW5jdCDigJQgdGhlIGNsaWVudC1zaWRlXG4gICAgICAvLyBhbmFsb2cgb2YgdGhlIHNlcnZlcidzIHBlci1jaGFubmVsIC90aWxlP2NoYW5uZWw9Yy4gRWxzZSB0aGUgei1hbmNob3IgVVJMLlxuICAgICAgY29uc3QgY2hVcmxzID0gKGluZm8gYXMgSUltYWdlSW5mbykuY2hhbm5lbFVybHM7XG4gICAgICBjb25zdCB1cmwgPSBjaGFubmVsICE9IG51bGwgJiYgY2hVcmxzPy5bel0/LltjaGFubmVsXSAhPSBudWxsXG4gICAgICAgID8gY2hVcmxzW3pdW2NoYW5uZWxdXG4gICAgICAgIDogdGhpcy5zaW1wbGVTdGFjay51cmxGb3IoaW5mbyBhcyBJSW1hZ2VJbmZvLCB6KTtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIG5vIFVSTCBmb3Igc2xpY2UgJHt6fWApO1xuICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0JpdG1hcCh1cmwpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gbm8gc2VsZWN0ZWQgaW1hZ2UgaW5mbyAoZ2V0U2VsZWN0ZWRJbmZvQjY0IG51bGwpJyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG5cbiAgICAvLyBUaGUgcmVxdWVzdGVkIGJhbmQ7IG1heSBiZSBkcm9wcGVkIHRvIHRoZSBjb21wb3NpdGUgKHVuZGVmaW5lZCkgYmVsb3cgd2hlbiB0aGUgY2hhbm5lbCBoYXMgbm9cbiAgICAvLyBweXJhbWlkIGxldmVsIHNtYWxsIGVub3VnaCB0byBzdGl0Y2ggd2l0aGluIGJ1ZGdldC5cbiAgICBsZXQgZWZmZWN0aXZlQ2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgY29uc3QgZmV0Y2hUaWxlID0gYXN5bmMgKFxuICAgICAgcmVzOiBudW1iZXIsXG4gICAgICBjb2w6IG51bWJlcixcbiAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgdDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+ID0+IHtcbiAgICAgIGNvbnN0IGNoID0gZWZmZWN0aXZlQ2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtlZmZlY3RpdmVDaGFubmVsfWA7XG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2NvbH0mcm93PSR7cm93fSZ6PSR7en0mdGlsZVNpemU9JHt0fSR7Y2h9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVycyB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHNsaWNlIGZldGNoIGZhaWxlZDogJHtyZXNwLnN0YXR1c30gKCR7Y29sfS8ke3Jvd30gcmVzICR7cmVzfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgfTtcblxuICAgIC8vIE5vIGRlc2NyaXB0b3Ig4oaSIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChsZWdhY3kgZmFsbGJhY2s7IGNvcnJlY3QgZm9yIHNtYWxsL3NpbXBsZSBpbWFnZXMpLlxuICAgIGlmICghZGVzYyB8fCAhZGVzYy5sZXZlbHM/Lmxlbmd0aCkgcmV0dXJuIGZldGNoVGlsZSgwLCAwLCAwLCBUSUxFX1NJWkUpO1xuXG4gICAgY29uc3QgdCA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IE9OTFkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHMgKHRoZSBmcm9udCBvZiBgbGV2ZWxzYCk7IHRoZSBzZXJ2ZXJcbiAgICAvLyBjb21wb3NpdGUgZXhpc3RzIGF0IGV2ZXJ5IGxldmVsLCBpbmNsdWRpbmcgdGhlIHNtYWxsIG92ZXJ2aWV3cy5cbiAgICBjb25zdCBwZXJDaGFubmVsTGV2ZWxzID0gZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB1c2FibGUgPVxuICAgICAgY2hhbm5lbCA9PSBudWxsID8gZGVzYy5sZXZlbHMgOiBkZXNjLmxldmVscy5zbGljZSgwLCBNYXRoLm1heCgxLCBwZXJDaGFubmVsTGV2ZWxzKSk7XG5cbiAgICAvLyBGaW5lc3QgbGV2ZWwgd2hvc2Ugc3RpdGNoZWQgZ3JpZCBmaXRzIEJPVEggdGhlIHRpbGUgYnVkZ2V0IGFuZCB0aGUgR1BVIHRleHR1cmUgbGltaXQ7IGlmIG5vbmVcbiAgICAvLyBmaXRzLCB0aGUgY29hcnNlc3QgYXZhaWxhYmxlIChmaXRzPWZhbHNlKS5cbiAgICBjb25zdCB0aWxlc0ZvciA9IChsdmw6IFRpbGVMZXZlbCk6IG51bWJlciA9PlxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpKSAqIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwuaGVpZ2h0IC8gdCkpO1xuICAgIGNvbnN0IHBpY2sgPSAobGV2ZWxzOiBUaWxlTGV2ZWxbXSk6IHsgbHZsOiBUaWxlTGV2ZWw7IGZpdHM6IGJvb2xlYW4gfSA9PiB7XG4gICAgICBsZXQgYyA9IGxldmVsc1swXTtcbiAgICAgIGZvciAoY29uc3QgbHZsIG9mIGxldmVscykge1xuICAgICAgICBjID0gbHZsO1xuICAgICAgICBpZiAodGlsZXNGb3IobHZsKSA8PSBidWRnZXRUaWxlcyAmJiBNYXRoLm1heChsdmwud2lkdGgsIGx2bC5oZWlnaHQpIDw9IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgICAgIHJldHVybiB7IGx2bCwgZml0czogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsdmw6IGMsIGZpdHM6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCBzZWwgPSBwaWNrKHVzYWJsZSk7XG4gICAgLy8gQSBzcGVjaWZpYyBjaGFubmVsIG9ubHkgaGFzIHRpbGVzIGF0IHRoZSAoZmV3LCBsYXJnZSkgcmVhbCBsZXZlbHMuIFdoZW4gbm9uZSBvZiB0aGVtIGZpdCB0aGVcbiAgICAvLyBidWRnZXQg4oCUIGUuZy4gdGhlIGNvYXJzZXN0IHJlYWwgbGV2ZWwgaXMgc3RpbGwgMTQ5ODLDlzE4NjcwIOKGkiB+MTEwMCBmdWxsLXJlcyB0aWxlcyDigJQgc3RpdGNoaW5nXG4gICAgLy8gaXQgcGVyIHNsaWNlIGZsb29kcyB0aGUgc2VydmVyICg1MDRzKSBhbmQgc3RhbGxzIHRoZSBsb2FkLiBUaGUgY29tcG9zaXRlIHB5cmFtaWQgaGFzIHNtYWxsXG4gICAgLy8gb3ZlcnZpZXcgbGV2ZWxzLCBzbyBmZXRjaCB0aGUgY29tcG9zaXRlIGluc3RlYWQgYW5kIGRlcml2ZSBsdW1pbmFuY2UgZnJvbSBpdC4gRXZlcnkgY2FsbGVyIGhlcmVcbiAgICAvLyAoc3VyZmFjZSBoZWlnaHQsIHZvbHVtZSBhc3NlbWJseSwgcmVhZGJhY2spIGRvd25zY2FsZXMgdGhlIHBsYW5lIGFueXdheSwgc28gYSBjb21wb3NpdGUtZGVyaXZlZFxuICAgIC8vIHBsYW5lIGlzIHRoZSByaWdodCB0cmFkZSBmb3Igb25lIHRoYXQgYWN0dWFsbHkgbG9hZHMuIE9ubHkga2lja3MgaW4gd2hlbiB0aGUgY2hhbm5lbCBjYW4ndCBmaXQuXG4gICAgaWYgKGFsbG93Q29tcG9zaXRlRmFsbGJhY2sgJiYgIXNlbC5maXRzICYmIGNoYW5uZWwgIT0gbnVsbCAmJiBkZXNjLmxldmVscy5sZW5ndGggPiBwZXJDaGFubmVsTGV2ZWxzKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBwaWNrKGRlc2MubGV2ZWxzKTtcbiAgICAgIGlmIChjb21wb3NpdGUuZml0cyB8fCB0aWxlc0Zvcihjb21wb3NpdGUubHZsKSA8IHRpbGVzRm9yKHNlbC5sdmwpKSB7XG4gICAgICAgIGVmZmVjdGl2ZUNoYW5uZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNlbCA9IGNvbXBvc2l0ZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbbmFwYXJpLWpzXSBjaGFubmVsICR7Y2hhbm5lbH0gaGFzIG5vIHB5cmFtaWQgbGV2ZWwgd2l0aGluIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlIGAgK1xuICAgICAgICAgICAgYGJ1ZGdldDsgdXNpbmcgdGhlIGNvbXBvc2l0ZSBvdmVydmlldyAocmVzICR7c2VsLmx2bC5yZXN9LCAke3NlbC5sdmwud2lkdGh9w5dgICtcbiAgICAgICAgICAgIGAke3NlbC5sdmwuaGVpZ2h0fSkgZm9yIHRoaXMgcGxhbmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hvc2VuID0gc2VsLmx2bDtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi53aWR0aCAvIHQpKTtcbiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNob3Nlbi5oZWlnaHQgLyB0KSk7XG4gICAgaWYgKCFzZWwuZml0cyAmJiBidWRnZXRUaWxlcyA9PT0gTUFYX1NUSVRDSF9USUxFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gZnVsbCByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlICR7YnVkZ2V0VGlsZXN9LXRpbGUvJHtNQVhfVEVYVFVSRV9ESU19cHggYnVkZ2V0OyBgICtcbiAgICAgICAgICBgZGlzcGxheWluZyBvdmVydmlldyBsZXZlbCByZXMgJHtjaG9zZW4ucmVzfSAoJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9KS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29scyA9PT0gMSAmJiByb3dzID09PSAxKSByZXR1cm4gZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIDAsIDAsIHQpO1xuXG4gICAgLy8gU3RpdGNoIGludG8gb25lIGxldmVsLXNpemVkIGNhbnZhcy4gRmV0Y2ggdGhlIGdyaWQgd2l0aCBCT1VOREVEIGNvbmN1cnJlbmN5OiBmaXJpbmcgZXZlcnkgdGlsZVxuICAgIC8vIGF0IG9uY2UgKGEgYmlnIGdyaWQgPSBodW5kcmVkcyBvZiByZXF1ZXN0cykgb3ZlcndoZWxtZWQgdGhlIHRpbGUgc2VydmVyICg1MDRzKS4gRWRnZSB0aWxlcyBhcmVcbiAgICAvLyBuYXJyb3dlci9zaG9ydGVyOyBkcmF3SW1hZ2UgcGxhY2VzIGVhY2ggYXQgaXRzIGdyaWQgb2Zmc2V0IHNvIHBhcnRpYWwgdGlsZXMgbGluZSB1cC5cbiAgICBjb25zdCBjb29yZHM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSBjb29yZHMucHVzaCh7IGNvbCwgcm93IH0pO1xuICAgIH1cbiAgICBjb25zdCB0aWxlczogQXJyYXk8eyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXI7IGJtcDogSW1hZ2VCaXRtYXAgfT4gPSBbXTtcbiAgICBjb25zdCBzdGl0Y2hXb3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGpvYiA9IGNvb3Jkcy5zaGlmdCgpO1xuICAgICAgICBpZiAoIWpvYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBmZXRjaFRpbGUoY2hvc2VuLnJlcywgam9iLmNvbCwgam9iLnJvdywgdCk7XG4gICAgICAgIHRpbGVzLnB1c2goeyBjb2w6IGpvYi5jb2wsIHJvdzogam9iLnJvdywgYm1wIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1pbihUSUxFX0ZFVENIX0NPTkNVUlJFTkNZLCBjb29yZHMubGVuZ3RoKSB9LCAoKSA9PiBzdGl0Y2hXb3JrZXIoKSksXG4gICAgKTtcblxuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGNob3Nlbi53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjaG9zZW4uaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IG51bGw7XG4gICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2Ugc3RpdGNoOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgZm9yIChjb25zdCB7IGNvbCwgcm93LCBibXAgfSBvZiB0aWxlcykge1xuICAgICAgY3R4LmRyYXdJbWFnZShibXAsIGNvbCAqIHQsIHJvdyAqIHQpO1xuICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBTYWZldHkgbmV0OiBpZiB0aGUgY2hvc2VuIGxldmVsIHN0aWxsIGV4Y2VlZHMgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0IChlLmcuIGEgbXVsdGljaGFubmVsXG4gICAgLy8gaW1hZ2Ugd2hvc2UgY29hcnNlc3QgUkVBTCBsZXZlbCBpcyBodWdlIOKAlCBvdmVydmlldyBsZXZlbHMgYXJlIGNvbXBvc2l0ZS1vbmx5KSwgZG93bnNjYWxlIHRoZVxuICAgIC8vIHN0aXRjaGVkIGNhbnZhcyB0byBmaXQgc28gdGhlIFdlYkdQVSB0ZXh0dXJlIHVwbG9hZCBjYW4ndCBmYWlsLlxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChjaG9zZW4ud2lkdGgsIGNob3Nlbi5oZWlnaHQpO1xuICAgIGlmIChsb25nZXN0ID4gTUFYX1RFWFRVUkVfRElNKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1BWF9URVhUVVJFX0RJTSAvIGxvbmdlc3Q7XG4gICAgICBjb25zdCBvdXRXID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjaG9zZW4ud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3Qgb3V0SCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmFwYXJpLWpzXSBzdGl0Y2hlZCBsZXZlbCAke2Nob3Nlbi53aWR0aH3DlyR7Y2hvc2VuLmhlaWdodH0gZXhjZWVkcyB0aGUgYCArXG4gICAgICAgICAgYCR7TUFYX1RFWFRVUkVfRElNfXB4IHRleHR1cmUgbGltaXQ7IGRvd25zY2FsaW5nIHRvICR7b3V0V33DlyR7b3V0SH0uYCxcbiAgICAgICk7XG4gICAgICBsZXQgb3V0OiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdXQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG91dFcsIG91dEgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIG91dC53aWR0aCA9IG91dFc7XG4gICAgICAgIG91dC5oZWlnaHQgPSBvdXRIO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2N0eCA9IG91dC5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghb2N0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBzbGljZSBkb3duc2NhbGU6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAgIG9jdHguZHJhd0ltYWdlKGNhbnZhcyBhcyB1bmtub3duIGFzIENhbnZhc0ltYWdlU291cmNlLCAwLCAwLCBvdXRXLCBvdXRIKTtcbiAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChvdXQgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChjYW52YXMgYXMgdW5rbm93biBhcyBJbWFnZUJpdG1hcFNvdXJjZSk7XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE5hcGFyaUxvYWRlZD4ge1xuICAgIC8vIEtlZXBzIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSdzIGJsb2IgY2FjaGUgaW4gc3luYyBldmVuIHdoZW4gdGhlIHVzZXJcbiAgICAvLyBzd2l0Y2hlcyBiYWNrZW5kcyAoZS5nLiBPU0QgSW1hZ2Ug4oaSIG5hcGFyaSBWb2x1bWUpIG9uIHRoZSBzYW1lIGZpbGUg4oCUXG4gICAgLy8gd2hpY2hldmVyIGJhY2tlbmQgbG9hZHMgYSBnZW51aW5lbHkgZGlmZmVyZW50IGZpbGUgZmlyc3QgZXZpY3RzIGl0LlxuICAgIHRoaXMuc2ltcGxlU3RhY2subm90ZUFjdGl2ZUZpbGUoaW1hZ2VJbmZvLmZpbGVOYW1lKTtcbiAgICB0aGlzLmxvYWRlZCA9IHsgaW1hZ2VJbmZvLCB6OiB6SW5kZXgsIGZpbGVuYW1lOiBpbWFnZUluZm8uZmlsZU5hbWUgfTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gIH1cblxuICBhc3luYyBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIF9pblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgIHRoaXMucGxvdERpdklkID0gcGxvdERpdjtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ID8gYCR7c2NyZWVuSGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICBob3N0LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICBjb25zdCBpbmZvID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LmltYWdlSW5mbyA/PyBpbWFnZUluZm87XG4gICAgY29uc3QgeiA9IChpbWFnZUxvYWRlZCBhcyBOYXBhcmlMb2FkZWQpPy56ID8/IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgdmlld2VyID0gbmV3IFZpZXdlcih7XG4gICAgICAgIGNhbnZhcyxcbiAgICAgICAgYmFja2dyb3VuZDogeyByOiAwLjA3LCBnOiAwLjA3LCBiOiAwLjA5LCBhOiAxIH0sXG4gICAgICAgIC8vIFNldCBoZXJlIHJhdGhlciB0aGFuIGxlZnQgdG8gbmFwYXJpLWpzJ3Mgb3duIGRlZmF1bHQgc28gdGhlIGdlbnRsZXJcbiAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBPU0QgYmFja2VuZCdzIHN0ZXAgKHNlZSBPU0RfWk9PTV9QRVJfU0NST0xMKTogdGhlIHdoZWVsIHNob3VsZCBmZWVsIHRoZVxuICAgICAgICAvLyBzYW1lIG9uIGFuIGltYWdlIHdoaWNoZXZlciByZW5kZXJlciBpcyBkcmF3aW5nIGl0LiBUaGUgc3RlcCBhcHBsaWVzIHBlclxuICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAvLyB0dW5lZCB0byBhIG1vdXNlIG5vdGNoIHJ1bnMgYXdheSB1bmRlciBhIHRyYWNrcGFkLlxuICAgICAgICB3aGVlbFpvb21TcGVlZDogTkFQQVJJX1dIRUVMX1pPT01fU1BFRUQsXG4gICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAvLyBwb3NlIGFsb25lLiBBIHNwYXRpYWwgc2NlbmUgaXMgYnVpbHQgZnJvbSBzZXZlcmFsIGxheWVycyBhbmQgcmVidWlsdCBjb25zdGFudGx5IOKAlFxuICAgICAgICAvLyByZWNvbG91cmluZyBieSBhIGNsYXNzLCBwaWNraW5nIGEgZ2VuZSwgc3RlcHBpbmcgYSBzZWN0aW9uIOKAlCBhbmQgd2l0aCBuYXBhcmktanMnc1xuICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgIC8vIFRoZSBwb3NlIGl0IHNuYXBwZWQgYmFjayB0byBkZXBlbmRlZCBvbiBXSElDSCBsYXllciB3YXMgcmVidWlsdCwgc28gaXNvbGF0aW5nIG9uZVxuICAgICAgICAvLyBzZWN0aW9uIHpvb21lZCB0byB0aGF0IHNlY3Rpb24ncyBib3VuZHMuIGByZXNldEZpdDNEKClgIG9uIGEgZGF0YXNldCBjaGFuZ2UgaXMgd2hhdFxuICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgZml0M2Q6ICdvbmNlJyxcbiAgICAgICAgLy8gSW4gdGhlIHNwYXRpYWwgbW9kZXMgYSBwbGFpbiBjbGljayBTRUxFQ1RTIHRoZSBjbGFzcyB1bmRlciB0aGUgY3Vyc29yLFxuICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgIC8vIGNsaWNrIHdvdWxkIGJvdGggc2VsZWN0IGEgY2xhc3MgYW5kIHpvb20gMnggYWJvdXQgdGhlIGN1cnNvciwgYW5kIHRoZVxuICAgICAgICAvLyB6b29tIHdvdWxkIHRoZW4gaGFsdmUgdGhlIHBpeGVsIHJhZGl1cyB0aGUgbmV4dCBjbGljayBoaXQtdGVzdHMgd2l0aC5cbiAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAuLi4oaXNTcGF0aWFsT21pY3MocGxvdFR5cGUpIHx8IGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpXG4gICAgICAgICAgPyB7IGNsaWNrWm9vbUZhY3RvcjogMCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgICAgYXdhaXQgdmlld2VyLnJlYWR5O1xuXG4gICAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNwYXRpYWxPbWljczNkKHZpZXdlciwgaG9zdCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSkge1xuICAgICAgICAvLyBObyBsb2FkZWQgaW1hZ2U6IGFuIGltYWdlLWxlc3MgZGF0YXNldCBvcGVuZWQgYmVmb3JlIGFueSBpbWFnZSAodGhlIHZpc3VhbGl6ZXInc1xuICAgICAgICAvLyBwbG90U3BhdGlhbFdpdGhvdXRJbWFnZSkg4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuXG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTcGF0aWFsT21pY3Modmlld2VyLCBob3N0LCB6LCBpbWFnZUxvYWRlZCA9PSBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U2NhdHRlcih2aWV3ZXIsIGhvc3QsIHopO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaVNjYXR0ZXIzZChwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIzZCh2aWV3ZXIsIGluZm8pO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaVN1cmZhY2UocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTdXJmYWNlKHZpZXdlcik7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRWb2x1bWUodmlld2VyLCBpbmZvLCBwbG90VHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgICAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICAgICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICAgICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgICAgICB0aGlzLmluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gcGxvdCBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2hhbm5lbHM6IHBlci1jaGFubmVsIGNvbXBvc2l0ZSwgTFVULCBuYXRpdmUgaGlzdG9ncmFtcyAoaml0LXVpIzEwMikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoZSBncmF5c2NhbGUgZGlzcGxheSBjb2xvcm1hcCBmcm9tIHRoZSBzdG9yZSBzZWxlY3Rpb24gKCtyZXZlcnNlKSwgZGVmYXVsdGluZyB0byBncmF5LlxuICAgKiAgTWFwcyB0aGUgaml0LXVpIHN0b3JlIGNvbG9ybWFwIG5vZGUgdG8gYSBuYXBhcmkgYENvbG9ybWFwYCB2aWEgdGhlIGxpYnJhcnkncyBMVVQgZmFjdG9yeTtcbiAgICogIHRoZSBtdWx0aWNoYW5uZWwgdGludCByYW1wcyBhcmUgYnVpbHQgaW5zaWRlIHtAbGluayBNdWx0aUNoYW5uZWxJbWFnZVZpZXd9IGZyb20gZWFjaFxuICAgKiAgY2hhbm5lbCdzIGhleCBjb2xvdXIuICovXG4gIHByaXZhdGUgZ3JheXNjYWxlQ29sb3JtYXAoKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGwpPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSkgOiBudWxsO1xuICAgIGlmIChsdXQpIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ2dyYXktY21hcCcsIGx1dCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJldmVyc2VcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCdncmF5LXJldicsIFtbMjU1LCAyNTUsIDI1NV0sIFswLCAwLCAwXV0gYXMgUmdiW10pXG4gICAgICA6ICdncmF5JztcbiAgfVxuXG4gIC8qKiBGZXRjaCBhIHN0aXRjaGVkIHNsaWNlIGFuZCByZWFkIGl0IGJhY2sgYXMgYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS4gYGNoYW5uZWxgIHNlbGVjdHMgYVxuICAgKiAgYmFuZCAobXVsdGljaGFubmVsKTsgb21pdCBpdCBmb3IgdGhlIGdyYXlzY2FsZSBjb21wb3NpdGUgKGFsbCBvdmVydmlldyBsZXZlbHMgYXZhaWxhYmxlLCBzbyBhXG4gICAqICBsYXJnZSBpbWFnZSBwaWNrcyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCByYXRoZXIgdGhhbiBvbmx5IHRoZSBmdWxsLXJlcyByZWFsIGxldmVsKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYW5uZWxEYXRhKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzPzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJtcCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCBjaGFubmVsLCBidWRnZXRUaWxlcyk7XG4gICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgfVxuXG4gIC8qKiBEZWNvZGUgYW4gYEltYWdlQml0bWFwYCAoc2VydmVyIGJhbmRzIGFyZSBncmF5c2NhbGUsIFI9Rz1CKSB0byBhIHNpbmdsZS1jaGFubmVsIHVpbnQ4IHBsYW5lLlxuICAgKiAgYG1heFNpZGVgIGNhcHMgdGhlIGxvbmdlc3Qgc2lkZSAoZG93bnNjYWxpbmcgb24gdGhlIGNhbnZhcyBkcmF3KSDigJQgdXNlZCB0byBrZWVwIHByZS1sb2FkZWRcbiAgICogIHN1cmZhY2Ugc2xpY2UgcGxhbmVzIHNtYWxsLiAqL1xuICBwcml2YXRlIGJpdG1hcFRvTHVtaW5hbmNlKFxuICAgIGJtcDogSW1hZ2VCaXRtYXAsXG4gICAgbWF4U2lkZT86IG51bWJlcixcbiAgKTogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBzY2FsZSA9IG1heFNpZGUgPyBNYXRoLm1pbigxLCBtYXhTaWRlIC8gTWF0aC5tYXgoYm1wLndpZHRoLCBibXAuaGVpZ2h0LCAxKSkgOiAxO1xuICAgIGNvbnN0IHcgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC53aWR0aCAqIHNjYWxlKSk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoYm1wLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHc7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIGNoYW5uZWwgcmVhZGJhY2s6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcbiAgICAvLyBTY2FsZSB0aGUgV0hPTEUgYml0bWFwIGludG8gdGhlIChwb3NzaWJseSBzbWFsbGVyKSB0YXJnZXQgY2FudmFzIOKAlCBkcmF3aW5nIGF0IG5hdHVyYWwgc2l6ZVxuICAgIC8vIHdvdWxkIGNyb3AgdG8gdGhlIHRvcC1sZWZ0IHfDl2ggY29ybmVyIHdoZW4gZG93bnNjYWxpbmcgYSBsYXJnZSBzbGljZSAobWF4U2lkZSA8IGJtcCBzaXplKS5cbiAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgdywgaCk7XG4gICAgYm1wLmNsb3NlPy4oKTtcbiAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3ICogaDsgaSsrKSBkYXRhW2ldID0gcmdiYVtpICogNF07XG4gICAgcmV0dXJuIHsgZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2UgZm9yIHNsaWNlIGB6YC4gV2l0aCBhIHNlcnZlciBweXJhbWlkIGRlc2NyaXB0b3Igd2UgdXNlIGEgcHlyYW1pZGFsXG4gICAqIHtAbGluayBUaWxlZFNvdXJjZX0gcGVyIGxheWVyIHNvIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb24gb24gem9vbSAobGlrZSBPU0QpIGFuZFxuICAgKiBzaXRzIG5hdHVyYWxseSBpbiBmdWxsLXJlc29sdXRpb24gY29vcmRpbmF0ZXM7IHdpdGhvdXQgb25lIHdlIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlLWxldmVsXG4gICAqIHN0aXRjaC4gVGhyZWUgZGlzcGxheSBtb2RlcyBlaXRoZXIgd2F5OiBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludCwgZ3JheXNjYWxlIGNvbG9ybWFwLCBSR0IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlKHo6IG51bWJlciwgdG9rZW4/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGlmIChkZXNjICYmIGRlc2MubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuICE9PSB0aGlzLnNsaWNlUmVxKSByZXR1cm47XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlVGlsZWQoeiwgZGVzYyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlU3RpdGNoZWQoeiwgdG9rZW4pO1xuICB9XG5cbiAgLyoqIFNpbmdsZS1sZXZlbCBzdGl0Y2ggZmFsbGJhY2sgKG5vIGRlc2NyaXB0b3IpOiB0aGUgcHJlLXRpbGluZyBwYXRoLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeildO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gJ3JnYic7XG4gICAgICBiaXRtYXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2Uoeik7XG4gICAgfVxuXG4gICAgLy8gMikgQ29tbWl0IOKAlCB1bmxlc3MgYSBuZXdlciBzY3J1YiBzdXBlcnNlZGVkIHVzIG9yIHRoZSB2aWV3ZXIgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IHRoaXMudmlld2VyICE9PSB2KSB7XG4gICAgICBiaXRtYXA/LmNsb3NlPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlzcGxheWVkIHRleHR1cmUgbWF5IGJlIGEgZG93bnNjYWxlZCBweXJhbWlkIGxldmVsOyBzY2FsZSB0aGUgbGF5ZXIgaW50byBGVUxMLVJFU09MVVRJT05cbiAgICAvLyB3b3JsZCBjb29yZGluYXRlcyAobGV2ZWwtMCBwaXhlbHMpIHNvIHRoZSBjYW1lcmEsIHJlYWRiYWNrIGFuZCDigJQgY3JpdGljYWxseSDigJQgcHJlLXNhdmVkXG4gICAgLy8gcmVnaW9ucyAoc3RvcmVkIGluIGZ1bGwtcmVzIGNvb3JkcywgZS5nLiBuZHBpKSBhbGwgbGluZSB1cCByZWdhcmRsZXNzIG9mIHdoaWNoIGxldmVsIGlzIHNob3duLlxuICAgIC8vIFRoaXMgbWlycm9ycyBPU0QsIHdob3NlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGFsd2F5cyBsZXZlbCAwLlxuICAgIGNvbnN0IHRleFcgPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLndpZHRoIDogcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLmhlaWdodCA6IHBsYW5lc1swXT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnVsbFcgPSBkZXNjPy53aWR0aCB8fCB0ZXhXIHx8IDE7XG4gICAgY29uc3QgZnVsbEggPSBkZXNjPy5oZWlnaHQgfHwgdGV4SCB8fCAxO1xuICAgIGNvbnN0IHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdID0gW3RleFcgPyBmdWxsVyAvIHRleFcgOiAxLCB0ZXhIID8gZnVsbEggLyB0ZXhIIDogMV07XG5cbiAgICB0aGlzLmltYWdlTW9kZSA9IG1vZGU7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IGQgPSBwbGFuZXNbMF07XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBmdWxsVztcbiAgICB0aGlzLmltYWdlSCA9IGZ1bGxIO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2Ugd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb25cbiAgICogYXMgeW91IHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVRpbGVkKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2MuY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjLm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuXG4gICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG5cbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2MuY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgdmlld3MucHVzaCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgYywgMSksXG4gICAgICAgICAgdGludDogY29sb3IsXG4gICAgICAgICAgbmFtZTogc3Q/Lm5hbWUgPz8gYGNoJHtjfWAsXG4gICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgdmlzaWJsZTogc3Q/LnZpc2libGUgPz8gdHJ1ZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcignbXVsdGljaGFubmVsJywgdmlld3MsIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoXG4gICAgICAgICdncmF5c2NhbGUnLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCAxKSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBpbnRlcnBvbGF0aW9uIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdyZ2InO1xuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ3JnYicsIFt7IHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgNCkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGRlc2Mud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkZXNjLmhlaWdodDtcbiAgICAvLyBBd2FpdCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgc28gZ2V0SGlzdG9ncmFtL2F1dG9Db250cmFzdCBoYXZlIGRhdGEgaW1tZWRpYXRlbHk7IHNsaWNlIGNoYW5nZXNcbiAgICAvLyByZWZyZXNoIGZpcmUtYW5kLWZvcmdldCAodGhlIGhpc3RvZ3JhbSBwYW5lIHJldHJpZXMpLlxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoeiwgZGVzYyk7XG4gIH1cblxuICAvKiogQnVpbGQgYSBweXJhbWlkYWwgVGlsZWRTb3VyY2UgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIgYC90aWxlYCBlbmRwb2ludC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kXG4gICAqICAoZ3JheXNjYWxlIGx1bWluYW5jZSwgcmVhbCBsZXZlbHMgb25seSk7IG9taXQgaXQgZm9yIHRoZSBjb21wb3NpdGUgKFJHQkEsIGFsbCBsZXZlbHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZWRTb3VyY2UoXG4gICAgZGVzYzogVGlsZURlc2NyaXB0b3IsXG4gICAgY2hhbm5lbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYW5uZWxzOiAxIHwgNCxcbiAgKTogVGlsZWRTb3VyY2Uge1xuICAgIGNvbnN0IGluZm9CNjQgPSB0aGlzLnRpbGVzLmdldFNlbGVjdGVkSW5mb0I2NCgpID8/ICcnO1xuICAgIC8vIFBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgYXQgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbHM7IHRoZSBjb21wb3NpdGUgZXhpc3RzIGF0IGFsbCBsZXZlbHMuXG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbFxuICAgICAgICA/IGRlc2MubGV2ZWxzXG4gICAgICAgIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgZGVzYy5yZWFsTGV2ZWxzID8/IGRlc2MubGV2ZWxzLmxlbmd0aCkpO1xuICAgIGNvbnN0IGxldmVsU2NhbGVzID0gdXNhYmxlLm1hcCgobCkgPT4gZGVzYy53aWR0aCAvIE1hdGgubWF4KDEsIGwud2lkdGgpKTsgLy8gbGV2ZWwtMCBweCBwZXIgbGV2ZWwgcHhcbiAgICBjb25zdCB0aWxlU2l6ZSA9IGRlc2MudGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIGNvbnN0IGNoID0gY2hhbm5lbCA9PSBudWxsID8gJycgOiBgJmNoYW5uZWw9JHtjaGFubmVsfWA7XG4gICAgY29uc3QgYXBpID0gdGhpcy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd0aWxlZCcsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICB0aWxlU2l6ZSxcbiAgICAgIGxldmVsczogdXNhYmxlLmxlbmd0aCxcbiAgICAgIGxldmVsU2NhbGVzLFxuICAgICAgZGVwdGg6IE1hdGgubWF4KDEsIGRlc2MueiB8fCAxKSxcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgZHR5cGU6ICd1aW50OCcsXG4gICAgICBmZXRjaFRpbGU6IGFzeW5jIChrZXk6IFRpbGVLZXkpOiBQcm9taXNlPFBpeGVsQ2h1bms+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdXNhYmxlW2tleS5sZXZlbF0/LnJlcyA/PyBrZXkubGV2ZWw7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2tleS5jb2x9JnJvdz0ke2tleS5yb3d9Jno9JHtrZXkuen0mdGlsZVNpemU9JHt0aWxlU2l6ZX0ke2NofWA7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtuYXBhcmktanNdIHRpbGUgJHtrZXkubGV2ZWx9LyR7a2V5LmNvbH0vJHtrZXkucm93fSDihpIgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBibXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSk7XG4gICAgICAgIGlmIChjaGFubmVscyA9PT0gNCkgcmV0dXJuIHsgd2lkdGg6IGJtcC53aWR0aCwgaGVpZ2h0OiBibXAuaGVpZ2h0LCBkYXRhOiBibXAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAoUmUpZmV0Y2ggYSBjb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSBmb3IgdGhlIGhpc3RvZ3JhbSAodGlsZWQgbW9kZSBoYXMgbm8gZnVsbFxuICAgKiAgaW4tbWVtb3J5IHBpeGVscykuIE9uZSBjaGVhcCBvdmVydmlldyB0aWxlIHBlciBjaGFubmVsOyBjYWNoZWQgYnkgY2hhbm5lbCBpbmRleC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoSGlzdG9ncmFtU2FtcGxlcyh6OiBudW1iZXIsIGRlc2M6IFRpbGVEZXNjcmlwdG9yKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5oaXN0U2FtcGxlcy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ3JnYicpIHJldHVybjsgLy8gUkdCIHVzZXMgdGhlIGRpc3BsYXllZC1waXhlbCByZWFkYmFjayAocmdiSGlzdG9ncmFtKVxuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuaW1hZ2VNb2RlID09PSAnbXVsdGljaGFubmVsJyA/IGRlc2MuY2hhbm5lbHMgPz8gMSA6IDE7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBjIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGNoLCAxKTsgLy8gYnVkZ2V0IDEg4oaSIGNvYXJzZXN0IHNpbmdsZSB0aWxlXG4gICAgICAgIHRoaXMuaGlzdFNhbXBsZXMuc2V0KGMsIGQuZGF0YSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbGVhdmUgdGhpcyBjaGFubmVsJ3Mgc2FtcGxlIHVuc2V0ICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFN1YnNjcmliZSBjaGFubmVsIHN0YXRlcyArIGdyYXlzY2FsZSBjb2xvcm1hcCDihpIgbGl2ZS1hcHBseSB0byB0aGUgcmVuZGVyZWQgbGF5ZXJzIChub1xuICAgKiAgcmUtZmV0Y2g7IG9ubHkgeiBjaGFuZ2VzIHJlLWZldGNoKS4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjaGFubmVscywgY29sb3JtYXAsIHJldmVyc2UsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgdGhpcy5hcHBseURpc3BsYXlTdGF0ZShjaGFubmVscyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU3Vic2NyaWJlIHRoZSBzdG9yZSBjb2xvcm1hcCAoK3JldmVyc2UpLCBpbnZlcnQsIGFuZCBjaGFubmVsIHN0YXRlIOKGkiB0aGUgdm9sdW1lL2lzb3N1cmZhY2VcbiAgICogIHRyYW5zZmVyIGZ1bmN0aW9uOiBjb2xvdXIgKGNoYW5uZWwgdGludCBvciBzZWxlY3RlZCBjb2xvcm1hcCksIHRoZSBpbnRlbnNpdHkgKip3aW5kb3dcbiAgICogIChtaW4vbWF4IOKGkiBjb250cmFzdExpbWl0cykqKiBhbmQgKipnYW1tYSoqLCBtaXJyb3JpbmcgdGhlIGdyYXlzY2FsZSBpbWFnZSdzIGRpc3BsYXkgY29udHJvbHNcbiAgICogIHNvIHRoZSBoaXN0b2dyYW0gcGFuZSBkcml2ZXMgdGhlIDNEIHJlbmRlci4gUmVwbGFjZXMgYW55IHByaW9yIHN1YnNjcmlwdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVWb2x1bWVEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudm9sdW1lVmlldztcbiAgICAgIGlmICghdmlldykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMudm9sdW1lTXVsdGljaGFubmVsKSB7XG4gICAgICAgIC8vIEVhY2ggY2hhbm5lbCdzIGxheWVyIGlzIHRpbnRlZCBieSBpdHMgY29sb3VyIGFuZCBnZXRzIGl0cyBvd24gd2luZG93L2dhbW1hL3Zpc2liaWxpdHkuXG4gICAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzLmZpbmQoKHMpID0+IHMuaW5kZXggPT09IGMpO1xuICAgICAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbChjLCB7XG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpLFxuICAgICAgICAgICAgLi4uKHN0XG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICAgICAgICAgIHZpc2libGU6IHN0LnZpc2libGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoMCwge1xuICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBIGNoYW5uZWwncyB0aW50IGNvbG9ybWFwIChibGFja+KGkmNvbG91cikgd2l0aCByZXZlcnNlLXNjYWxlIC8gaW52ZXJ0IGFwcGxpZWQgYnkgZmxpcHBpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFRpbnRDb2xvcm1hcChjb2xvcjogc3RyaW5nKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGxldCBjbWFwOiBDb2xvcm1hcCB8IHN0cmluZyA9IHRpbnRDb2xvcm1hcChjb2xvcik7XG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xvdXIgbWFwIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UuIEEgcmVhbCBjb2xvcm1hcCBzZWxlY3Rpb24gKHZpcmlkaXMvbWFnbWEv4oCmKSB3aW5zO1xuICAgKiBvdGhlcndpc2UgdGhlIGNoYW5uZWwncyBjb2xvdXIgdGludHMgaXQgKHNvIHRoZSBjaGFubmVsLWRpYWxvZyBjb2xvdXIgc3dhdGNoIHJlY29sb3JzIHRoZSAzRFxuICAgKiByZW5kZXIpLiBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wIOKAlCB0aGUgYFZvbHVtZUxheWVyYCBoYXMgbm8gcGVyLWxheWVyXG4gICAqIGludmVydCwgc28gYm90aCBhcmUgZW11bGF0ZWQgYnkgcmV2ZXJzaW5nIHRoZSBjb2xvcm1hcC5cbiAgICovXG4gIHByaXZhdGUgdm9sdW1lQ29sb3JtYXAoc3Q6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQpOiBDb2xvcm1hcCB8IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgbGFiZWw/OiBzdHJpbmc7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIC8vIEEgY29sb3JlZCBjb2xvcm1hcCAodmlyaWRpcy9tYWdtYS/igKYpIGRyaXZlcyB0aGUgdm9sdW1lOyB0aGUgZGVmYXVsdCBncmF5c2NhbGUgZmFtaWx5XG4gICAgLy8gKGdyYXkgLyBHcmV5cyAvIEdyZXlzIEludikgeWllbGRzIHRvIHRoZSBjaGFubmVsJ3MgY29sb3VyIHNvIHRoZSBkaWFsb2cgY29sb3VyIHN3YXRjaFxuICAgIC8vIHJlY29sb3JzIHRoZSAzRCByZW5kZXIuXG4gICAgY29uc3QgbGFiZWwgPSAobm9kZT8ubGFiZWwgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZ3JheUZhbWlseSA9IGxhYmVsID09PSAnJyB8fCBsYWJlbC5pbmNsdWRlcygnZ3JleScpIHx8IGxhYmVsLmluY2x1ZGVzKCdncmF5Jyk7XG4gICAgY29uc3QgdmFsdWUgPSBub2RlPy5kYXRhPy52YWx1ZTtcbiAgICBjb25zdCBsdXQgPSAhZ3JheUZhbWlseSAmJiB2YWx1ZSAhPSBudWxsID8gYnVpbGRDb2xvcm1hcEx1dCh2YWx1ZSwgZmFsc2UpIDogbnVsbDtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSBsdXRcbiAgICAgID8gY29sb3JtYXBGcm9tTHV0KCd2b2wtY21hcCcsIGx1dClcbiAgICAgIDogdGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicpO1xuICAgIC8vIFJldmVyc2Utc2NhbGUgYW5kIGludmVydCBlYWNoIGZsaXAgdGhlIHJhbXAgKHRoZSBWb2x1bWVMYXllciBoYXMgbm8gcGVyLWxheWVyIGludmVydCkuXG4gICAgaWYgKHRoaXMuY3VycmVudFJldmVyc2UpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgaWYgKHRoaXMuaW52ZXJ0RW5hYmxlZCkgY21hcCA9IHJldmVyc2VDb2xvcm1hcChjbWFwKTtcbiAgICByZXR1cm4gY21hcDtcbiAgfVxuXG4gIC8qKiBBcHBseSB0aGUgY3VycmVudCBjaGFubmVsIHN0YXRlcyAvIGNvbG9ybWFwIHRvIHRoZSBsaXZlIGxheWVycyAobm8gcmUtZmV0Y2gpLCBkZWxlZ2F0aW5nIHRoZVxuICAgKiAgcGVyLWNoYW5uZWwgbGF5ZXIgbXV0YXRpb25zIHRvIHRoZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fS4gKi9cbiAgcHJpdmF0ZSBhcHBseURpc3BsYXlTdGF0ZShjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuY2hhbm5lbFZpZXc7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcpIHtcbiAgICAgIHZpZXcubGF5ZXJzLmZvckVhY2goKF8sIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgaWYgKCFzdCkgcmV0dXJuO1xuICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgIHRpbnQ6IHN0LmNvbG9yLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdLFxuICAgICAgICAgIGdhbW1hOiBzdC5nYW1tYSxcbiAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnKSB7XG4gICAgICBjb25zdCBzdCA9IGNoYW5uZWxzWzBdO1xuICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIC4uLihzdCA/IHsgY29udHJhc3RMaW1pdHM6IFtzdC5taW4sIHN0Lm1heF0gYXMgW251bWJlciwgbnVtYmVyXSwgZ2FtbWE6IHN0LmdhbW1hIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogKFJlKWluc3RhbGwgdGhlIHBoeXNpY2FsIHNjYWxlIGJhciBvdmVyIHRoZSAyRCBpbWFnZSwgc2l6ZWQgZnJvbSB0aGUgaW1hZ2UncyDCtW0vcGl4ZWxcbiAgICogIChgL3RpbGVzL2luZm9gIG1wcFgsIGZhbGxpbmcgYmFjayB0byB0aGUgaW1hZ2UgbWV0YWRhdGEpLiBOby1vcCB3aXRob3V0IGEgcGh5c2ljYWwgc2l6ZS4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2NhbGVCYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGlmICh0aGlzLnZpZXdlciAmJiB0aGlzLmhvc3QgJiYgbXBwWCA+IDApIHtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgTmFwYXJpU2NhbGVCYXIodGhpcy5ob3N0LCB0aGlzLnZpZXdlci5jYW1lcmEsIG1wcFgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3ZlcnZpZXcgbmF2aWdhdG9yIGZvciBhIDJEIHZpZXcgd2l0aCBhbiBpbWFnZTogYSBjb2Fyc2UgdGh1bWJuYWlsIG9mIHRoZSB3aG9sZVxuICAgKiBpbWFnZSB3aXRoIHRoZSB2aWV3cG9ydCBvbiBpdDsgY2xpY2sgb3IgZHJhZyB0byBwYW4gYXQgdGhlIGN1cnJlbnQgem9vbSAoYXMgT1NEKS5cbiAgICovXG4gIHByaXZhdGUgc2hvd0xvYWRpbmcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvc3QpIHJldHVybjtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZSA/Pz0gbmV3IE5hcGFyaUxvYWRpbmdCYWRnZSh0aGlzLmhvc3QpO1xuICAgIHRoaXMubG9hZGluZ0JhZGdlLnNldChbLi4uKHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA+IDAgPyBbJ09ic2VydmF0aW9ucyddIDogW10pLCAuLi50aGlzLnRpbGVMb2FkaW5nXSk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxOYXZpZ2F0b3IoejogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy5ob3N0IHx8ICF0aGlzLmltYWdlVyB8fCAhdGhpcy5pbWFnZUgpIHJldHVybjtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG5ldyBOYXBhcmlOYXZpZ2F0b3IoXG4gICAgICB0aGlzLmhvc3QsIHRoaXMudmlld2VyLmNhbWVyYSwgdGhpcy5pbWFnZVcsIHRoaXMuaW1hZ2VILCAoKSA9PiB0aGlzLnNwYXRpYWxUb29sdGlwPy5oaWRlKCksXG4gICAgKTtcbiAgICB0aGlzLm5hdmlnYXRvci5zZXRWaXNpYmxlKHRoaXMubmF2aWdhdG9yVmlzaWJsZSk7XG4gICAgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuYXZpZ2F0b3IncyB0aHVtYm5haWwgZnJvbSB0aGUgY29hcnNlc3QgcHlyYW1pZCBsZXZlbC4gQSBtdWx0aWNoYW5uZWwgaW1hZ2VcbiAgICogaXMgY29tcG9zaXRlZCBmcm9tIGl0cyBjaGFubmVscyBpbiB0aGVpciBkaXNwbGF5IGNvbG91cnMsIHNvIHRoZSBvdmVydmlldyBsb29rcyBsaWtlXG4gICAqIHRoZSB2aWV3IHJhdGhlciB0aGFuIGxpa2UgY2hhbm5lbCAwIGluIGdyZXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdmlnYXRvcjtcbiAgICBpZiAoIW5hdikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLm5hdmlnYXRvclRva2VuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgICBjb25zdCBjaGFubmVscyA9IGRlc2M/Lm11bHRpY2hhbm5lbCA/IGRlc2MuY2hhbm5lbEluZm8gPz8gW10gOiBbXTtcbiAgICAgIGxldCBpbWFnZTogQ2FudmFzSW1hZ2VTb3VyY2U7XG4gICAgICBpZiAoY2hhbm5lbHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBiaXRtYXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoY2hhbm5lbHMubWFwKChfYywgYykgPT4gdGhpcy5mZXRjaFNsaWNlKHosIGMsIDEpKSk7XG4gICAgICAgIGltYWdlID0gdGludGVkQ29tcG9zaXRlKGJpdG1hcHMsIGNoYW5uZWxzLm1hcCgoYykgPT4gYy5jb2xvciA/PyAnI2ZmZmZmZicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIHVuZGVmaW5lZCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPT09IHRoaXMubmF2aWdhdG9yVG9rZW4gJiYgdGhpcy5uYXZpZ2F0b3IgPT09IG5hdikgbmF2LnNldEltYWdlKGltYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF2aWdhdG9yIHRodW1ibmFpbCB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNob3cvaGlkZSB0aGUgb3ZlcnZpZXcgbmF2aWdhdG9yIChzYW1lIHNldHRpbmcgYXMgT1NEJ3MpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIHRoaXMubmF2aWdhdG9yPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgYSBuYXBhcmktanMgYEhpc3RvZ3JhbWAgKGJpbiBjb3VudCArIG1pbi9tYXgpIHRvIHRoZSBwYW5lJ3MgYElIaXN0b2dyYW1gIChiaW4gZWRnZXMpLiAqL1xuICBwcml2YXRlIHRvSUhpc3RvZ3JhbShoOiB7IGNvdW50czogVWludDMyQXJyYXk7IGJpbnM6IG51bWJlcjsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiBJSGlzdG9ncmFtIHtcbiAgICBjb25zdCBzcGFuID0gaC5tYXggLSBoLm1pbiB8fCAxO1xuICAgIGNvbnN0IGJpbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBoLmJpbnMgfSwgKF8sIGkpID0+IGgubWluICsgKGkgKiBzcGFuKSAvIGguYmlucyk7XG4gICAgY29uc3QgY291bnRzID0gQXJyYXkuZnJvbShoLmNvdW50cyk7XG4gICAgcmV0dXJuIHsgYmlucywgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgM0Qgdm9sdW1lL2lzb3N1cmZhY2UuIEEgbXVsdGljaGFubmVsIGltYWdlIGJlY29tZXMgb25lIGFkZGl0aXZlLCB0aW50ZWRcbiAgICoge0BsaW5rIFZvbHVtZUxheWVyfSBwZXIgY2hhbm5lbCAoc28gZWFjaCBjaGFubmVsJ3MgY29sb3VyIGNvbXBvc2l0ZXMgaW50byB0aGUgcmVuZGVyKTsgYVxuICAgKiBncmF5c2NhbGUvY29tcG9zaXRlIGltYWdlIHVzZXMgYSBzaW5nbGUgdm9sdW1lLiBBZGRzIHRoZSBheGVzIGdpem1vICsgbGFiZWxzIGFuZCB3aXJlcyB0aGVcbiAgICogZGlzcGxheS1zdGF0ZSBzdWJzY3JpcHRpb24uIFRoZSBjYWxsZXIgb3ducyBgdmlld2VyLnJlYWR5YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgYmVmb3JlIHJlbmRlcmluZyBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXNcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpOiBubyB0aWxlIGRlc2NyaXB0b3IsIHNvXG4gICAgLy8gZGVyaXZlIHRoZSBjaGFubmVsIGNvdW50IGZyb20gaW1hZ2VNZXRhIGFuZCBhc3NlbWJsZSBlYWNoIGJhbmQgZnJvbSBpdHMgb3duXG4gICAgLy8gY2hhbm5lbFVybHNbel1bY10gcGxhbmUgKGZldGNoU2xpY2UgZG9lcyB0aGUgcGVyLWNoYW5uZWwgcm91dGluZykuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHNpbXBsZU1jID8gaW5mbyEuaW1hZ2VNZXRhIVswXS5jaGFubmVsQ291bnQgOiAoZGVzYz8uY2hhbm5lbHMgPz8gMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gc2ltcGxlTWMgfHwgKCEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDEpO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIGNvbnN0IHJlbmRlcmluZzogJ2lzbycgfCAnbWlwJyA9IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSkgPyAnaXNvJyA6ICdtaXAnO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcblxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IG11bHRpY2hhbm5lbDtcbiAgICB0aGlzLmltYWdlTW9kZSA9IHRoaXMudm9sdW1lTXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJztcbiAgICBjb25zdCB2aWV3ID0gbmV3IE11bHRpQ2hhbm5lbFZvbHVtZVZpZXcodmlld2VyKTtcbiAgICB0aGlzLnZvbHVtZVZpZXcgPSB2aWV3O1xuXG4gICAgLy8gQXNzZW1ibGUgcGVyLWNoYW5uZWwgc2NhbGFyIHZvbHVtZXMgZnJvbSB0aGUgc2VydmVyIHRpbGVzIChqaXQtc3BlY2lmaWMpOyB0aGUgbmFwYXJpLWpzIHZpZXdcbiAgICAvLyBvd25zIHRoZSBsYXllciBvcmNoZXN0cmF0aW9uIChvbmUgYWRkaXRpdmUgdGludGVkIHZvbHVtZSBwZXIgY2hhbm5lbCwgb3IgYSBzaW5nbGUgZ3JheXNjYWxlXG4gICAgLy8gdm9sdW1lKS4gVGhlIGFkYXB0ZXIgY29tcHV0ZXMgZWFjaCBjaGFubmVsJ3MgY29sb3JtYXAgKGluY2wuIGludmVydC9yZXZlcnNlIGZsaXBzKS5cbiAgICBsZXQgZGltczogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY2hhbm5lbHM6IFZvbHVtZUNoYW5uZWxbXSA9IFtdO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChtdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFubmVsQ291bnQ7IGMrKykge1xuICAgICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzLCBjKTtcbiAgICAgICAgICBpZiAoIXZvbCkgY29udGludWU7XG4gICAgICAgICAgZGltcyA9IHZvbDtcbiAgICAgICAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldChjLCB2b2wuZGF0YSk7XG4gICAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBzdD8uY29sb3IgPz8gZGVzYz8uY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy5jaGFubmVsVGludENvbG9ybWFwKGNvbG9yKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICB2aXNpYmxlOiBzdD8udmlzaWJsZSA/PyB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2b2wgPSBhd2FpdCB0aGlzLmFzc2VtYmxlVm9sdW1lKGluZm8sIHJlcyk7XG4gICAgICAgIGlmICh2b2wpIHtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgICAgICBjaGFubmVscy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHZvbC5kYXRhLFxuICAgICAgICAgICAgd2lkdGg6IHZvbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdm9sLmhlaWdodCxcbiAgICAgICAgICAgIGRlcHRoOiB2b2wuZGVwdGgsXG4gICAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuXG4gICAgaWYgKCFkaW1zIHx8ICFjaGFubmVscy5sZW5ndGggfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyXG5cbiAgICAvLyBSZXNvbHV0aW9uLWludmFyaWFudCB3b3JsZCBib3guIFNpemluZyB0aGUgYm94IGJ5IHRoZSBzYW1wbGVkIHZveGVsIGNvdW50cyBtYWRlIGhpZ2hlclxuICAgIC8vIGluLXBsYW5lIHJlc29sdXRpb24gZ3JvdyBYL1kgd2hpbGUgdGhlIGRlcHRoIHN0YXllZCB0aGUgKGNvbnN0YW50KSBzbGljZSBjb3VudCDigJQgc28gWiBhcHBlYXJlZFxuICAgIC8vIHRvIHNocmluayBhdCBoaWdoZXIgcmVzb2x1dGlvbi4gSW5zdGVhZCBhbmNob3IgdGhlIGluLXBsYW5lIGxvbmcgc2lkZSB0byBhIGZpeGVkIHJlZmVyZW5jZSBhbmRcbiAgICAvLyBsZXQgWiBzcGFuIHRoZSBmdWxsIHNsaWNlIGNvdW50OyB0aGUgYm94IHNoYXBlIGlzIHRoZW4gaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci4gVGhlXG4gICAgLy8gcGVyLWF4aXMgYHZveGVsU2l6ZWAgKG5hcGFyaSBgc2NhbGVgKSBtYXBzIHRoZSBzYW1wbGVkIGdyaWQgb250byB0aGF0IGZpeGVkIHdvcmxkIGJveC5cbiAgICAvLyBBIHN0YWNrIHRoYXQgZGVjbGFyZXMgaXRzIHBoeXNpY2FsIHNwYWNpbmcgb24gQUxMIFRIUkVFIGF4ZXMgZ2V0cyBpdHMgdHJ1ZVxuICAgIC8vIGV4dGVudCBhcyB0aGUgd29ybGQgYm94IOKAlCB0aGUgb25seSB3YXkgYW5pc290cm9weSBzdXJ2aXZlcywgYW5kIHdoYXQgbWFrZXMgYVxuICAgIC8vIHJlc2FtcGxlZCA0MCB4IDQwIHggMjAwIMK1bSB2b2x1bWUgcmVhZCBhcyBhIGJyYWluIGluc3RlYWQgb2YgYSBjdWJlLWFzcGVjdFxuICAgIC8vIGJyaWNrLiBJdCBuZWVkcyBub25lIG9mIHRoZSByZWZlcmVuY2UtYm94IGFyaXRobWV0aWM6IGEgcGh5c2ljYWwgYm94IGlzXG4gICAgLy8gYWxyZWFkeSBpbmRlcGVuZGVudCBvZiB0aGUgZGVjaW1hdGUgZmFjdG9yLlxuICAgIC8vXG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGtlZXBzIHRoYXQgYXJpdGhtZXRpYy4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWxcbiAgICAvLyBjb3VudHMgbWFkZSBoaWdoZXIgaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZVxuICAgIC8vIChjb25zdGFudCkgc2xpY2UgY291bnQg4oCUIHNvIFogYXBwZWFyZWQgdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLlxuICAgIC8vIEFuY2hvcmluZyB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZCBsZXR0aW5nIFogc3BhbiB0aGVcbiAgICAvLyBmdWxsIHNsaWNlIGNvdW50IG1ha2VzIHRoZSBib3ggc2hhcGUgaWRlbnRpY2FsIGF0IGV2ZXJ5IGRlY2ltYXRlIGZhY3Rvci5cbiAgICBjb25zdCBtZXRhID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICBjb25zdCBtcHBYWVo6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bGwgPVxuICAgICAgbWV0YT8ubXBwWCAmJiBtZXRhPy5tcHBZICYmIG1ldGE/Lm1wcFogPyBbbWV0YS5tcHBYLCBtZXRhLm1wcFksIG1ldGEubXBwWl0gOiBudWxsO1xuICAgIC8vIFRoZSBpbWFnZSdzIERFQ0xBUkVEIHBpeGVsIGRpbWVuc2lvbnMsIHdoaWNoIGlzIHdoYXQgbXBwIGlzIHBlcjogdGhlIHNhbXBsZWRcbiAgICAvLyBkaW1zIGFyZSBkZWNpbWF0ZWQsIHNvIHNpemluZyBhIHBoeXNpY2FsIGJveCBieSB0aGVtIHdvdWxkIG1ha2UgdGhlIHdvcmxkXG4gICAgLy8gYm94IGRlcGVuZCBvbiB0aGUgcmVzb2x1dGlvbiB0aGUgdXNlciBoYXBwZW5zIHRvIGJlIHZpZXdpbmcgYXQuXG4gICAgY29uc3QgZnVsbFcgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IG1ldGE/LnggPz8gZGltcy53aWR0aDtcbiAgICBjb25zdCBmdWxsSCA9IHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcy5oZWlnaHQ7XG4gICAgY29uc3QgZnVsbEQgPSBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXMuZGVwdGg7XG4gICAgbGV0IHdvcmxkOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH07XG4gICAgaWYgKG1wcFhZWikge1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiBmdWxsVyAqIG1wcFhZWlswXSxcbiAgICAgICAgaGVpZ2h0OiBmdWxsSCAqIG1wcFhZWlsxXSxcbiAgICAgICAgZGVwdGg6IGZ1bGxEICogbXBwWFlaWzJdLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZnVsbExvbmcgPSBNYXRoLm1heCgxLCBmdWxsVywgZnVsbEgpO1xuICAgICAgd29ybGQgPSB7XG4gICAgICAgIHdpZHRoOiAoZnVsbFcgKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICAgIGhlaWdodDogKGZ1bGxIICogVk9MVU1FX1dPUkxEX0lOUExBTkVfUkVGKSAvIGZ1bGxMb25nLFxuICAgICAgICBkZXB0aDogZnVsbEQsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBCYXNlIGJveCAoWi1zY2FsZSA9IDEpICsgdGhlIHNhbXBsZWQgZGVwdGggZHJpdmUgdGhlIGxpdmUgWi1oZWlnaHQgaGFuZGxlIGJlbG93OyB0aGUgcGVyc2lzdGVkXG4gICAgLy8gYHZvbHVtZVpTY2FsZWAgKHVzZXIgZHJhZykgYXBwbGllcyBvbiB0b3Agc28gY2hhbmdpbmcgcmVzb2x1dGlvbiBrZWVwcyB0aGUgY2hvc2VuIGhlaWdodC5cbiAgICB0aGlzLnZvbHVtZVdvcmxkQmFzZSA9IHdvcmxkO1xuICAgIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoID0gTWF0aC5tYXgoMSwgZGltcy5kZXB0aCk7XG4gICAgY29uc3Qgd29ybGRaID0gd29ybGQuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZTtcbiAgICBjb25zdCB2b3hlbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIHdvcmxkLndpZHRoIC8gZGltcy53aWR0aCxcbiAgICAgIHdvcmxkLmhlaWdodCAvIGRpbXMuaGVpZ2h0LFxuICAgICAgd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGgsXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNoYW5uZWxzKSBjaC52b3hlbFNpemUgPSB2b3hlbFNpemU7XG5cbiAgICB2aWV3LnJlbmRlcih0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA/ICdtdWx0aWNoYW5uZWwnIDogJ2dyYXlzY2FsZScsIGNoYW5uZWxzLCB7IHJlbmRlcmluZyB9KTtcbiAgICB0aGlzLmltYWdlVyA9IGRpbXMud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkaW1zLmhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSBkaW1zO1xuXG4gICAgLy8gM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gKyBsYWJlbHMsIHNoYXJpbmcgdGhlIHZvbHVtZSdzIHdvcmxkIGJveCBzbyB0aGUgZ2l6bW8gdHJhY2tzXG4gICAgLy8gdGhlIHJlbmRlcmVkIHByb3BvcnRpb25zLiBQaHlzaWNhbCBzY2FsZSB0ZXh0IHN0aWxsIGNvbWVzIGZyb20gdGhlIEZVTEwgaW1hZ2UgZXh0ZW50LlxuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMod29ybGQud2lkdGgsIHdvcmxkLmhlaWdodCwgd29ybGRaLCB7IHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkQXhlc0xhYmVscyh7IHdpZHRoOiB3b3JsZC53aWR0aCwgaGVpZ2h0OiB3b3JsZC5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgICAvLyBJbi12aWV3IGRyYWcgaGFuZGxlIGF0IHRoZSBUT1AgRU5EIE9GIFRIRSBaIEFYSVMgKHRoZSBib3gncyBtaW4tWFkgY29ybmVyLCB3aGVyZSB0aGUgYmx1ZVxuICAgICAgLy8gXCJaXCIgYXhpcyArIGxhYmVsIGxpdmUpLCBzbyBpdCByZWFkcyBhcyB0aGUgWi1oZWlnaHQgY29udHJvbC4gRmxvYXRlZCBhIGxpdHRsZSBwYXN0IHRoZSBheGlzXG4gICAgICAvLyB0aXAgKMOXMS4xMikgc28gdGhlIGdyaXAgY2xlYXJzIHRoZSBcIlogwrcg4oCmXCIgbGFiZWwuIERyYWcg4oaVIHRvIHJlc3RyZXRjaCBaIGxpdmUuXG4gICAgICB0aGlzLnpIYW5kbGUgPSBuZXcgTmFwYXJpVm9sdW1lWkhhbmRsZSh0aGlzLmhvc3QsIHZpZXdlci5jYW1lcmEzZCwge1xuICAgICAgICB0b3BBbmNob3I6ICgpID0+IFtcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLndpZHRoIC8gMixcbiAgICAgICAgICAtdGhpcy52b2x1bWVXb3JsZEJhc2UhLmhlaWdodCAvIDIsXG4gICAgICAgICAgKCh0aGlzLnZvbHVtZVdvcmxkQmFzZSEuZGVwdGggKiB0aGlzLnZvbHVtZVpTY2FsZSkgLyAyKSAqIDEuMTIsXG4gICAgICAgIF0sXG4gICAgICAgIGdldFNjYWxlOiAoKSA9PiB0aGlzLnZvbHVtZVpTY2FsZSxcbiAgICAgICAgc2V0U2NhbGU6IChzKSA9PiB0aGlzLnNldFZvbHVtZVpTY2FsZShzKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVZvbHVtZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyZXRjaCB0aGUgdm9sdW1lJ3MgWiBoZWlnaHQgbGl2ZSAoZHJpdmVuIGJ5IHRoZSBpbi12aWV3IHtAbGluayBOYXBhcmlWb2x1bWVaSGFuZGxlfSkuIE9ubHlcbiAgICogdGhlIHBlci1heGlzIGB2b3hlbFNpemVgIC8gYXhlcyBkZXB0aCBjaGFuZ2Ug4oCUIHRoZSB2b3hlbCB0ZXh0dXJlcyBhcmUgdW50b3VjaGVkIOKAlCBzbyBkcmFnZ2luZyBpc1xuICAgKiBzbW9vdGguIGBmYWN0b3JgIGlzIHJlbGF0aXZlIHRvIHRoZSB2b2x1bWUncyBuYXR1cmFsIHByb3BvcnRpb25zICgxKS4gUGVyc2lzdHMgYWNyb3NzIHJlLW1vdW50c1xuICAgKiAocmVzb2x1dGlvbiBjaGFuZ2VzKSBzbyB0aGUgY2hvc2VuIGhlaWdodCBzdGlja3MuXG4gICAqL1xuICBwcml2YXRlIHNldFZvbHVtZVpTY2FsZShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lWlNjYWxlID0gTWF0aC5taW4oMTAsIE1hdGgubWF4KDAuMSwgZmFjdG9yKSk7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMudm9sdW1lV29ybGRCYXNlO1xuICAgIGlmICghYmFzZSB8fCAhdGhpcy52b2x1bWVWaWV3KSByZXR1cm47XG4gICAgY29uc3Qgd29ybGRaID0gYmFzZS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZzWiA9IHdvcmxkWiAvIHRoaXMudm9sdW1lU2FtcGxlZERlcHRoO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3LmxheWVycykge1xuICAgICAgY29uc3QgW3N4LCBzeV0gPSBsYXllci52b3hlbFNpemU7XG4gICAgICBsYXllci52b3hlbFNpemUgPSBbc3gsIHN5LCB2c1pdO1xuICAgIH1cbiAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHRoaXMuYXhlc0xheWVyLmRlcHRoID0gd29ybGRaO1xuICAgIHRoaXMuYXhlc0xhYmVscz8udXBkYXRlQW5jaG9ycyhcbiAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IGJhc2Uud2lkdGgsIGhlaWdodDogYmFzZS5oZWlnaHQsIGRlcHRoOiB3b3JsZFogfSksXG4gICAgKTtcbiAgICB0aGlzLnpIYW5kbGU/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSBYL1kvWiBheGlzLWVuZCBsYWJlbCBzcGVjcyBmb3IgdGhlIDNEIGdpem1vLiBBbmNob3JzIGFyZSBpbiB0aGUgdm9sdW1lJ3MgY2VudHJlZFxuICAgKiAgd29ybGQgYm94IChtYXRjaGluZyB0aGUgQXhlc0xheWVyIGdlb21ldHJ5KTsgdGhlIHNjYWxlIHRleHQgcmVmbGVjdHMgdGhlIEZVTEwgaW1hZ2UgZXh0ZW50IOKAlFxuICAgKiAgcGh5c2ljYWwgwrVtIHdoZW4gwrVtL3BpeGVsIGlzIGtub3duLCBlbHNlIHBpeGVsIChYL1kpIC8gc2xpY2UgKFopIGNvdW50cy4gKi9cbiAgcHJpdmF0ZSBidWlsZEF4ZXNMYWJlbHMoXG4gICAgdm9sOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0sXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSB2b2wud2lkdGggLyAyO1xuICAgIGNvbnN0IGh5ID0gdm9sLmhlaWdodCAvIDI7XG4gICAgY29uc3QgaHogPSB2b2wuZGVwdGggLyAyO1xuICAgIC8vIE1lYXN1cmVkIGZyb20gdGhlIElNQUdFJ3Mgb3duIGV4dGVudCwgbmV2ZXIgZnJvbSB0aGUgd29ybGQgYm94OiB0aGUgYm94IGlzIGFcbiAgICAvLyBzaGFwZSAoYW5kIGZvciBhIHBoeXNpY2FsbHkgc2l6ZWQgdm9sdW1lIGl0IGlzIGFscmVhZHkgaW4gwrVtLCBzbyByZWFkaW5nIGFcbiAgICAvLyBwaXhlbCBjb3VudCBvZmYgaXQgYW5kIG11bHRpcGx5aW5nIGJ5IG1wcCB3b3VsZCBzY2FsZSB0aGUgbGFiZWwgdHdpY2UpLlxuICAgIGNvbnN0IHsgcHgsIG1wcCB9ID0gdGhpcy5pbWFnZUV4dGVudCgpO1xuICAgIGNvbnN0IGxlbiA9IChuOiBudW1iZXIsIHVtOiBudW1iZXIpOiBzdHJpbmcgPT4gKHVtID4gMCA/IGZvcm1hdFVtKG4gKiB1bSkgOiBgJHtufSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKHB4WzBdLCBtcHBbMF0pfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4ocHhbMV0sIG1wcFsxXSl9YCwgY29sb3I6ICcjNGRkOTU5JyB9LFxuICAgICAgLy8gUGh5c2ljYWwgd2hlbiB0aGUgc3RhY2sgZGVjbGFyZXMgaXRzIHNsaWNlIHNwYWNpbmcgKGBtcHBaYCkg4oCUIGEgcmVzYW1wbGVkXG4gICAgICAvLyB2b2x1bWUga25vd3MgaG93IHRoaWNrIGl0IGlzOyBhIHBsYWluIHotc3RhY2sgY2FuIG9ubHkgc2F5IGhvdyBtYW55IHNsaWNlcy5cbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogYFogwrcgJHtsZW4ocHhbMl0sIG1wcFsyXSl9YCwgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3MgZGVjbGFyZWQgZXh0ZW50IGluIHBpeGVscy9zbGljZXMsIGFuZCBpdHMgcGh5c2ljYWwgc3BhY2luZyBwZXJcbiAgICogYXhpcyBpbiDCtW0gKDAgPSB1bmRlY2xhcmVkLCBhbmQgdGhlbiB0aGF0IGF4aXMgcmVhZHMgaW4gcGl4ZWxzKS5cbiAgICpcbiAgICogT25lIHBsYWNlLCBiZWNhdXNlIHRoZSB2b2x1bWUgd29ybGQgYm94IGFuZCB0aGUgYXhpcyBsYWJlbHMgaGF2ZSB0byBhZ3JlZVxuICAgKiBhYm91dCB3aGF0IHRoZSBpbWFnZSdzIHJlYWwgZGltZW5zaW9ucyBhcmUg4oCUIHRoZSBzYW1wbGVkIGdyaWQgaXMgZGVjaW1hdGVkIGFuZFxuICAgKiBzYXlzIG5vdGhpbmcgYWJvdXQgZWl0aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbWFnZUV4dGVudCgpOiB7IHB4OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IG1wcDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnZvbHVtZURpbXM7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCBtZXRhPy5tcHBYIHx8IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB4OiBbXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gbWV0YT8ueCA/PyBkaW1zPy53aWR0aCA/PyAxLFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyBtZXRhPy55ID8/IGRpbXM/LmhlaWdodCA/PyAxLFxuICAgICAgICBtZXRhPy56IHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8udXJscz8ubGVuZ3RoIHx8IGRpbXM/LmRlcHRoIHx8IDEsXG4gICAgICBdLFxuICAgICAgLy8gQSBkZXNjcmlwdG9yIHRoYXQgcmVwb3J0cyBvbmx5IG1wcFggaXMgc3F1YXJlLXBpeGVsIGJ5IGNvbnZlbnRpb24sIHdoaWNoIGlzXG4gICAgICAvLyB3aGF0IHRoZSAyRCBzY2FsZSBiYXIgYWxyZWFkeSBhc3N1bWVzIG9mIGl0LlxuICAgICAgbXBwOiBbbXBwWCwgdGhpcy5kZXNjcmlwdG9yPy5tcHBZIHx8IG1ldGE/Lm1wcFkgfHwgbXBwWCwgbWV0YT8ubXBwWiB8fCAwXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGEgZG93bnNhbXBsZWQgdWludDggdm9sdW1lIChsdW1pbmFuY2UpIGZyb20gdGhlIHBlci1zbGljZSB0aWxlIGVuZHBvaW50LiBTbGljZXMgYXJlXG4gICAqIGZldGNoZWQgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IChrZWVwcyB0aGUgY29ubmVjdGlvbiBwb29sIGZ1bGwgd2l0aG91dCBmbG9vZGluZyBpdCBvbiBhIGRlZXBcbiAgICogc3RhY2spIGFuZCByZWFkIGludG8gdGhlIHZvbHVtZSBhcyBlYWNoIGFycml2ZXMsIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0gc28gdGhlXG4gICAqIGhvc3Qgc2hvd3MgYSBkZXRlcm1pbmF0ZSBwcm9ncmVzcyBiYXIgaW5zdGVhZCBvZiBhIGJhcmUgc3Bpbm5lci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZW1ibGVWb2x1bWUoXG4gICAgaW5mbzogSUltYWdlSW5mbyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiB7IG1heFNsaWNlPzogbnVtYmVyOyBzbGljZVN0ZXA/OiBudW1iZXIgfSA9IHt9LFxuICAgIGNoYW5uZWw/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgZnVsbERlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgaWYgKGZ1bGxEZXB0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbm8gc2xpY2VzIHRvIGFzc2VtYmxlIGEgdm9sdW1lJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iob3B0cy5zbGljZVN0ZXAgPz8gMSkpO1xuICAgIGNvbnN0IG1heFNsaWNlID0gb3B0cy5tYXhTbGljZSA/PyBWT0xVTUVfTUFYX1NMSUNFO1xuICAgIC8vIFNvdXJjZS1zbGljZSBpbmRpY2VzIHNhbXBsZWQgaW50byB0aGUgdm9sdW1lIChldmVyeSBgc3RlcGB0aCBwbGFuZSDihpIgbG93LXJlcyBpcyBmYXN0ZXIpLlxuICAgIGNvbnN0IHpJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IHogPSAwOyB6IDwgZnVsbERlcHRoOyB6ICs9IHN0ZXApIHpJbmRpY2VzLnB1c2goeik7XG4gICAgY29uc3QgZGVwdGggPSB6SW5kaWNlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBlYWNoIHNsaWNlIGF0IGEgcHlyYW1pZCBsZXZlbCBtYXRjaGluZyBgbWF4U2xpY2VgIChidWRnZXQgc2NhbGVzIHdpdGggdGhlIGRlY2ltYXRlXG4gICAgICAvLyBmYWN0b3IpLCBzbyBhIGhpZ2hlciBmYWN0b3IgcHVsbHMgYSBmaW5lciBsZXZlbCDihpIgbW9yZSByZWFsIGluLXBsYW5lIGRldGFpbDsgdGhlbiBkb3duc2FtcGxlXG4gICAgICAvLyB0byBgbWF4U2xpY2VgLiBgY2hhbm5lbGAgc2VsZWN0cyBhIGJhbmQgKG11bHRpY2hhbm5lbCB2b2x1bWUpOyBvbWl0IGZvciB0aGUgZ3JheXNjYWxlXG4gICAgICAvLyBjb21wb3NpdGUuIFRoZSBjYWxsZXIgb3ducyB0aGUgc3RhY2tMb2FkaW5nIGZsYWcgKG11bHRpY2hhbm5lbCBhc3NlbWJsZXMgY2hhbm5lbHMgaW4gdHVybikuXG4gICAgICBjb25zdCBidWRnZXQgPSB0aGlzLnRpbGVCdWRnZXRGb3IobWF4U2xpY2UpO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbMF0sIGNoYW5uZWwsIGJ1ZGdldCk7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIG1heFNsaWNlIC8gTWF0aC5tYXgoZmlyc3Qud2lkdGgsIGZpcnN0LmhlaWdodCwgMSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZpcnN0LndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3QuaGVpZ2h0ICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGRlcHRoKTtcblxuICAgICAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICAgIHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ25hcGFyaS1qcyB2b2x1bWUgYXNzZW1ibHk6IDJEIGNvbnRleHQgdW5hdmFpbGFibGUnKTtcblxuICAgICAgLy8gUmVhZCBvbmUgZmV0Y2hlZCBzbGljZSBiaXRtYXAgaW50byB0aGUgdm9sdW1lIHBsYW5lIGB6YCAobHVtaW5hbmNlKS4gU3luY2hyb25vdXMgYmV0d2VlblxuICAgICAgLy8gYXdhaXRzLCBzbyB0aGUgc2hhcmVkIDJEIGNvbnRleHQgaXMgc2FmZSB0byByZXVzZSBhY3Jvc3MgdGhlIGNvbmN1cnJlbnQgZmV0Y2ggd29ya2Vycy5cbiAgICAgIGxldCBkb25lID0gMDtcbiAgICAgIGNvbnN0IHJlYWRTbGljZSA9ICh6OiBudW1iZXIsIGJtcDogSW1hZ2VCaXRtYXApOiB2b2lkID0+IHtcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb25zdCByZ2JhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICAgICAgICBjb25zdCBiYXNlID0geiAqIHdpZHRoICogaGVpZ2h0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICBkYXRhW2Jhc2UgKyBpXSA9XG4gICAgICAgICAgICAocmdiYVtpICogNF0gKiAwLjI5OSArIHJnYmFbaSAqIDQgKyAxXSAqIDAuNTg3ICsgcmdiYVtpICogNCArIDJdICogMC4xMTQpIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBibXAuY2xvc2U/LigpO1xuICAgICAgICBkb25lKys7XG4gICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgfTtcblxuICAgICAgcmVhZFNsaWNlKDAsIGZpcnN0KTtcblxuICAgICAgLy8gUmVtYWluaW5nIHBsYW5lcyB2aWEgYSBzbWFsbCBwb29sIG9mIHdvcmtlcnMgZHJhaW5pbmcgYSBzaGFyZWQgcXVldWUuIEVhY2ggcGxhbmUgYHBgXG4gICAgICAvLyBtYXBzIHRvIHNvdXJjZSBzbGljZSBgekluZGljZXNbcF1gIChzdWJzYW1wbGVkIGZvciBsb3ctcmVzKS5cbiAgICAgIGNvbnN0IHBlbmRpbmc6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBwID0gMTsgcCA8IGRlcHRoOyBwKyspIHBlbmRpbmcucHVzaChwKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHAgPSBwZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICByZWFkU2xpY2UocCwgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHpJbmRpY2VzW3BdLCBjaGFubmVsLCBidWRnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2xTaXplID0gTWF0aC5taW4oVk9MVU1FX0ZFVENIX0NPTkNVUlJFTkNZLCBNYXRoLm1heCgxLCBkZXB0aCAtIDEpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2xTaXplIH0sICgpID0+IHdvcmtlcigpKSk7XG5cbiAgICAgIGlmICh0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybiBudWxsOyAvLyBjYW5jZWxsZWQg4oaSIGRvbid0IHJlbmRlciBhIHBhcnRpYWwgdm9sdW1lXG4gICAgICByZXR1cm4geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgTkFQQVJJX1NDQVRURVIgMkQgc2NhdHRlcjogdGhlIHNsaWNlIGltYWdlIHdpdGggYSBwb2ludHMgbGF5ZXIgYXQgZWFjaCByZWdpb24nc1xuICAgKiBjZW50cm9pZCAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyByZWdpb24tY2VudHJvaWQgc2NhdHRlcikuIFJlYnVpbGRzIHRoZSBwb2ludHMgbGl2ZSBhc1xuICAgKiByZWdpb25zIGNoYW5nZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKHopO1xuICAgIC8vIFRoaXMgbW9kZSBwbG90cyBSRUdJT04gY2VudHJvaWRzLCBzbyB3aXRob3V0IHRoZSByZWdpb24gdG9vbHMgdGhlcmUgaXMgbm9cbiAgICAvLyB3YXkgdG8gcHJvZHVjZSBhIHBvaW50IOKAlCBkcmF3aW5nIGEgcmVnaW9uIG5vdyBhZGRzIG9uZSBpbW1lZGlhdGVseS5cbiAgICB0aGlzLmluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IHRoaXMucmVnaW9uU3RvcmVcbiAgICAgIC5nZXRSZWdpb25VcGRhdGVFdmVudCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVidWlsZFNjYXR0ZXJQb2ludHMoKSk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSAyRCBzY2F0dGVyJ3MgcG9pbnQgbGF5ZXIgYXQgdGhlIGN1cnJlbnQgcmVnaW9uIGNlbnRyb2lkcy4gKi9cbiAgcHJpdmF0ZSByZWJ1aWxkU2NhdHRlclBvaW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2NhdHRlcjJkUG9pbnRzKSB7XG4gICAgICB2LmxheWVycy5yZW1vdmUodGhpcy5zY2F0dGVyMmRQb2ludHMpO1xuICAgICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjZW50cm9pZHMgPSB0aGlzLnJlZ2lvbkNlbnRyb2lkcygpO1xuICAgIGlmIChjZW50cm9pZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5zY2F0dGVyMmRQb2ludHMgPSB2LmFkZFBvaW50cyhjZW50cm9pZHMsIHtcbiAgICAgIHNpemU6IDEyLFxuICAgICAgZmFjZUNvbG9yOiBbMSwgMC44NSwgMC4yLCAxXSxcbiAgICAgIGJvcmRlckNvbG9yOiBbMCwgMCwgMCwgMV0sXG4gICAgICBib3JkZXJXaWR0aDogMixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpb24gY2VudHJvaWRzIGFzIGZsYXQgYFt4LCB5LCDigKZdYCBkYXRhIGNvb3JkcyAocmVjdGFuZ2xlIC8gcG9seWdvbiAvIG11bHRpcG9seWdvbikuICovXG4gIHByaXZhdGUgcmVnaW9uQ2VudHJvaWRzKCk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHBvbHlDZW50cm9pZCA9ICh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbiA9IHhzLmxlbmd0aDtcbiAgICAgIGlmIChuID09PSAwKSByZXR1cm47XG4gICAgICBsZXQgY3ggPSAwO1xuICAgICAgbGV0IGN5ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGN4ICs9IHhzW2ldO1xuICAgICAgICBjeSArPSB5c1tpXTtcbiAgICAgIH1cbiAgICAgIG91dC5wdXNoKGN4IC8gbiwgY3kgLyBuKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSkge1xuICAgICAgY29uc3QgYiA9IHIuYm91bmRzIGFzXG4gICAgICAgIHwgeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICAgICAgICB8IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1cbiAgICAgICAgfCB7IHBvbHlnb25zOiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXSB9W10gfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCd3aWR0aCcgaW4gYiAmJiAneCcgaW4gYikge1xuICAgICAgICBvdXQucHVzaChiLnggKyBiLndpZHRoIC8gMiwgYi55ICsgYi5oZWlnaHQgLyAyKTtcbiAgICAgIH0gZWxzZSBpZiAoJ3hwb2ludHMnIGluIGIpIHtcbiAgICAgICAgcG9seUNlbnRyb2lkKGIueHBvaW50cywgYi55cG9pbnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoJ3BvbHlnb25zJyBpbiBiKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBiLnBvbHlnb25zKSBwb2x5Q2VudHJvaWQocC54cG9pbnRzLCBwLnlwb2ludHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcmFjdGlvbiBzdGFjayBldmVyeSAyRCBtb2RlIG5lZWRzOiB0aGUgcmVnaW9uIG92ZXJsYXkgKGRyYXcvc2VsZWN0L2VkaXQpLCB0aGUgcGl4ZWxcbiAgICogdG9vbHMgdGhhdCByZWFkIGJhY2sgZGlzcGxheWVkIHBpeGVscyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0vY2VsbHBvc2UpLFxuICAgKiBhbmQgYSBjYW1lcmEgaG9vayB0aGF0IGtlZXBzIHRoYXQgcmVhZGJhY2sgY3VycmVudCBhcyB0aGUgdmlldyBwYW5zL3pvb21zIGFuZCB0aWxlZCBsZXZlbHNcbiAgICogbG9hZC5cbiAgICpcbiAgICogRXh0cmFjdGVkIGJlY2F1c2UgZm9yZ2V0dGluZyBpdCBpcyBpbnZpc2libGU6IHRoZSB0b29sYmFyIGdhdGVzIGl0cyByZWdpb24gYnV0dG9ucyBvbiAyRC12cy0zRFxuICAgKiByYXRoZXIgdGhhbiBvbiBwbG90IHR5cGUsIHNvIGEgMkQgbW9kZSB0aGF0IHNraXBzIHRoaXMgc2hvd3MgZXZlcnkgdG9vbCBhbmQgc2lsZW50bHkgZG9lc1xuICAgKiBub3RoaW5nLiBUaGF0IGlzIGV4YWN0bHkgd2hhdCBoYXBwZW5lZCB0byB0aGUgc3BhdGlhbCBhbmQgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgbW9kZXMuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGwyZEludGVyYWN0aW9uKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheSA9IG5ldyBOYXBhcmlSZWdpb25PdmVybGF5KGhvc3QsIHZpZXdlciwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSB2aWV3ZXIuY2FtZXJhLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLmFybVJlYWRiYWNrKCkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXRpYWwgb21pY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE1hcmtlciByYWRpdXMgKGltYWdlIHB4KSBmb3IgYSBkYXRhc2V0IHRoYXQgZGVjbGFyZXMgbm9uZSDigJQgc2VnbWVudGVkIGNlbGxzIG9mdGVuIGRvbid0LiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX0ZBTExCQUNLX1JBRElVUyA9IDQ7XG4gIC8qKiBTbWFsbGVzdCBtYXJrZXIgRElBTUVURVIsIGluIHNsaWNlIHBpeGVscywgb3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldC4gQSBjZWxsJ3MgcmVhbFxuICAgKiAgc2l6ZSBpcyBob25vdXJlZCB3aGVyZXZlciBpdCBzdXJ2aXZlcyB0aGUgZ3JpZDogdGhlIEFCQyBhdGxhcyBzZXJ2ZXMgNSDCtW0gcmFkaWkgb24gYVxuICAgKiAgNDAgwrVtL3B4IHRlbXBsYXRlLCBzbyBkcmF3aW5nIHRoZW0gdG8gc2NhbGUgd291bGQgcHV0IGV2ZXJ5IGNlbGwgYSBmaWZ0aCBvZiBhIHBpeGVsIHdpZGVcbiAgICogIGFuZCB0aGUgc2VjdGlvbiB3b3VsZCBjb21lIHVwIGVtcHR5LiBUaGUgcG9pbnQtc2l6ZSBjb250cm9sIHNjYWxlcyB1cCBmcm9tIHRoaXMgZmxvb3IuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfU0xJQ0VfTUlOX0RJQU1FVEVSX1BYID0gMS41O1xuICAvKiogTG9uZ2VzdCBzaWRlIG9mIHRoZSBnZW5lLW1hcCByYXN0ZXIsIGluIGZpZWxkIHBpeGVscy4gQSBnZW5lIG1hcCBpcyBhIHNtb290aFxuICAgKiAgZmllbGQgcmVhZCBhcyB0ZXJyaXRvcnksIHNvIGl0IGdhaW5zIG5vdGhpbmcgZnJvbSBtYXRjaGluZyBhIDIgR3B4IHNsaWRlJ3NcbiAgICogIHJlc29sdXRpb24g4oCUIGFuZCB0aGUgZXN0aW1hdGUgY29zdHMgb25lIHBhc3Mgb3ZlciB0aGlzIG1hbnkgcGl4ZWxzLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHRU5FX01BUF9NQVhfU0lERSA9IDUxMjtcbiAgLyoqIEtlcm5lbCDPgyBpbiBmaWVsZCBwaXhlbHMgYXQgc21vb3RoaW5nIDE6IHdpZGUgZW5vdWdoIHRvIHJlYWQgYmV0d2VlbiBjZWxscyxcbiAgICogIHRpZ2h0IGVub3VnaCB0byBrZWVwIGEgbnVjbGV1cy1zY2FsZSBzdHJ1Y3R1cmUgZGlzdGluY3QuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdFTkVfTUFQX1NJR01BID0gMi41O1xuICAvKiogQ2x1c3RlcnMgZHJhd24gYXMgZGVuc2l0eSB2b2x1bWVzIGF0IG9uY2UuIFBhc3QgYSBoYW5kZnVsLCBhZGRpdGl2ZSB0cmFuc2x1Y2VudFxuICAgKiAgY2xvdWRzIHN0b3AgYmVpbmcgc2VwYXJhYmxlIGJ5IGV5ZSDigJQgYW5kIGVhY2ggb25lIGlzIGEgZnVsbCByYXN0ZXJpc2F0aW9uLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERU5TSVRZX01BWF9DTFVTVEVSUyA9IDY7XG4gIC8qKiBDb2xvdXIgZm9yIG9ic2VydmF0aW9ucyB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQgdG8gY29sb3VyIGJ5OiB2aXNpYmxlLCBuZXV0cmFsLCBhbmRcbiAgICogIG9idmlvdXNseSBub3QgZW5jb2RpbmcgYW55dGhpbmcuICovXG4gIC8qKiBIb3cgbXVjaCBsYXJnZXIgYSBzZWxlY3RlZCBtYXJrZXIgaXMgZHJhd24sIHNvIGEgc21hbGwgc2VsZWN0aW9uIGlzIGZpbmRhYmxlIGluc2lkZSBhXG4gICAqICAzLjdNLXBvaW50IGNsb3VkIHJhdGhlciB0aGFuIG1lcmVseSBicmlnaHRlci4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFID0gMS42O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfTkVVVFJBTF9DT0xPUjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgIFswLjM1LCAwLjcyLCAwLjk1LCAwLjldO1xuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgU1BBVElBTF9PTUlDUyB2aWV3OiB0aGUgdGlzc3VlIGltYWdlIHdpdGggb25lIG1hcmtlciBwZXIgb2JzZXJ2YXRpb24sIGNvbG91cmVkIGJ5XG4gICAqIGFuIGFubm90YXRpb24gY29sdW1uIG9yIGEgZ2VuZS4gVGhlIG1hcmtlcnMgcmVidWlsZCB3aGVuZXZlciB0aGUgZGF0YXNldCBvciB0aGUgdmlldyBzdGF0ZVxuICAgKiBjaGFuZ2VzLCBzbyBzd2l0Y2hpbmcgdGhlIGNvbG91ci1ieSBjb2x1bW4gZG9lcyBub3QgcmVtb3VudCB0aGUgc2NlbmUuXG4gICAqXG4gICAqIFNldHMgdXAgdGhlIGZ1bGwgMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHJlZ2lvbiBvdmVybGF5LCBwaXhlbC10b29sIGhvc3RzLCByZWFkYmFjayBjdXJyZW5jeSDigJRcbiAgICogZXhhY3RseSBhcyB0aGUgcGxhaW4gaW1hZ2UgdmlldyBkb2VzLiBUaGF0IGlzIE5PVCBvcHRpb25hbCBoZXJlOiB0aGlzIG1vZGUncyBzZWxlY3Rpb24gaXNcbiAgICogZHJpdmVuIGJ5IGRyYXduIFJPSXMsIHNvIHdpdGhvdXQgdGhlIG92ZXJsYXkgdGhlcmUgaXMgbm8gd2F5IHRvIG1ha2UgYSBzZWxlY3Rpb24gYXQgYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNwYXRpYWxPbWljcyh2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQsIHo6IG51bWJlciwgbm9JbWFnZSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV2l0aCBubyBpbWFnZSBsb2FkZWQgdGhlcmUgaXMgbm90aGluZyB0byByZW5kZXIgdW5kZXIgdGhlIG9ic2VydmF0aW9uczsgdGhleSBhcmVcbiAgICAvLyBmcmFtZWQgb24gdGhlaXIgb3duIGV4dGVudCwgYXMgZm9yIGFueSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlLlxuICAgIGlmICghbm9JbWFnZSkgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAvLyBPbmx5IGZpdCB0byB0aGUgaW1hZ2Ugd2hlbiB0aGlzIGRhdGFzZXQgYWN0dWFsbHkgaGFzIG9uZS4gT3RoZXJ3aXNlIHRoZXJlIGlzXG4gICAgLy8gbm90aGluZyB0byBmaXQsIGBpbWFnZVdgL2BpbWFnZUhgIHN0aWxsIGhvbGQgdGhlIExBU1QgaW1hZ2UncyBkaW1lbnNpb25zLCBhbmRcbiAgICAvLyB0aGlzIGZpdHMgdG8gdGhvc2Ug4oCUIGFuZCBiZWNhdXNlIGl0IGRlZmVycyB0byBhIGZyYW1lLCBpdCBsYW5kcyBBRlRFUiB0aGUgcG9pbnRzXG4gICAgLy8gYXJlIGFkZGVkIGFuZCBvdmVyd3JpdGVzIHRoZSBmcmFtaW5nIHRoZXkgc2V0LiBUaGF0IGlzIHdoYXQgbGVmdCBhbiBpbWFnZS1sZXNzXG4gICAgLy8gZGF0YXNldCBhcyBhIHRlbi1waXhlbCBzcGVjayBvZmYgdG8gb25lIHNpZGUuXG4gICAgaWYgKHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdPy5pbWFnZVJlZikgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVEaXNwbGF5U3RhdGUoKTtcbiAgICAvLyBUaGUgc2NhbGUgYmFyIGFuZCBuYXZpZ2F0b3IgZGVzY3JpYmUgYW4gaW1hZ2U7IHdpdGggbm9uZSBsb2FkZWQsIHdoYXRldmVyIHRoZXkgd291bGRcbiAgICAvLyByZWFkIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBsYXN0IG9uZS5cbiAgICBpZiAoIW5vSW1hZ2UpIHtcbiAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICB0aGlzLmluc3RhbGxOYXZpZ2F0b3Ioeik7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXMoKT8uYXR0YWNoKHZpZXdlcik7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgMkQgb2JzZXJ2YXRpb24gbWFya2VycyBhcmUgZHJhd246IHdoZW4gdGhlIHVzZXIgd2FudHMgdGhlbSwgYW5kIG5vdCB3aGlsZVxuICAgKiBjZWxsIG91dGxpbmVzIGFyZSBvbiBzY3JlZW4g4oCUIHRoZW4gYSBjZWxsIElTIGl0cyBvdXRsaW5lLCBhbmQgYSBjaXJjbGUgb24gdG9wIG9mIGl0IGlzXG4gICAqIG5vaXNlLiBab29tZWQgb3V0IHBhc3QgdGhlIG91dGxpbmUgdGhyZXNob2xkLCB0aGUgY2lyY2xlcyBzdGFuZCBpbiBmb3IgdGhlIGNlbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9pbnRzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMV07XG4gICAgcmV0dXJuICh2aWV3Py5zaG93UG9pbnRzID8/IHRydWUpICYmICF0aGlzLnNwYXRpYWxUaWxlc01ncj8ub3V0bGluZXNTaG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGlsZWQtZ2VvbWV0cnkgbWFuYWdlciwgYnVpbHQgb24gZmlyc3QgdXNlLiBJdHMgaG9zdCBjYWxsYmFja3MgcmVhZCB0aGlzXG4gICAqIHNlcnZpY2UncyBsaXZlIHN0YXRlLCBzbyBpdCBuZXZlciBob2xkcyBhIHN0YWxlIGRhdGFzZXQgb3IgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxUaWxlcygpOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwge1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGlmICghcG9ydCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVGlsZXNNZ3IgPz89IG5ldyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyhwb3J0LCB7XG4gICAgICBsYXRlc3Q6ICgpID0+IHRoaXMuc3BhdGlhbExhdGVzdCxcbiAgICAgIGNhbnZhc1NpemU6ICgpID0+IFt0aGlzLmNhbnZhcz8uY2xpZW50V2lkdGggPz8gMCwgdGhpcy5jYW52YXM/LmNsaWVudEhlaWdodCA/PyAwXSxcbiAgICAgIGNvbnRpbnVvdXNMdXQ6ICh2aWV3KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgICAgICByZXR1cm4gc3BhdGlhbENvbnRpbnVvdXNMdXQobm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiB0aGlzLnRyYW5zY3JpcHRFc3RpbWF0ZSQubmV4dChlKSxcbiAgICAgIGdlbmVDb3VudHNDaGFuZ2VkOiAoYykgPT4gdGhpcy5nZW5lQ291bnRzSW5WaWV3JC5uZXh0KGMpLFxuICAgICAgbG9hZGluZ0NoYW5nZWQ6IChsYXllcnMpID0+IHtcbiAgICAgICAgdGhpcy50aWxlTG9hZGluZyA9IGxheWVycztcbiAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgfSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gdGhpcy5kZW5zaXR5U3RhdHMkLm5leHQoZCksXG4gICAgICBwb2x5Z29uc1Nob3duQ2hhbmdlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFRpbGVzTWdyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBkcmF3aW5nIGZvciB0aGUgM0QgY2xvdWQuXG4gICAqXG4gICAqIFJldXNlcyB7QGxpbmsgTmFwYXJpUmVnaW9uT3ZlcmxheX0gdmVyYmF0aW0gYnkgaGFuZGluZyBpdCBhIFNDUkVFTi1TUEFDRSB2aWV3ZXI6IHRoZSBkcmF3blxuICAgKiBzaGFwZSBpcyBhIGxhc3NvIGluIGNhbnZhcyBwaXhlbHMsIHNvIFwid29ybGRcIiBpcyB0aGUgY2FudmFzIGFuZCBib3RoIHRyYW5zZm9ybXMgYXJlIGlkZW50aXR5XG4gICAqIChiYXIgdGhlIGNsaWVudOKGkmNhbnZhcyBvZmZzZXQpLiBFdmVyeSBleGlzdGluZyB0b29sIOKAlCByZWN0YW5nbGUsIHBvbHlnb24sIGZyZWVoYW5kIOKAlCB0aGVyZWZvcmVcbiAgICogd29ya3MgaW4gM0Qgd2l0aCBubyBuZXcgZHJhd2luZyBjb2RlLlxuICAgKlxuICAgKiBBIHNjcmVlbi1zcGFjZSBzaGFwZSBzdG9wcyBtZWFuaW5nIGFueXRoaW5nIHRoZSBtb21lbnQgdGhlIGNhbWVyYSBtb3Zlcywgc28gYW4gb3JiaXQgY2xlYXJzXG4gICAqIHRoZSBkcmF3biByZWdpb25zLiBUaGUgU0VMRUNUSU9OIGl0IHByb2R1Y2VkIGlzIGtlcHQ6IHRoYXQgaXMgdGhlIGR1cmFibGUgYXJ0ZWZhY3QsIGFuZCB0aGVcbiAgICogaGlnaGxpZ2h0ZWQgcG9pbnRzIHN0YXkgaGlnaGxpZ2h0ZWQgZnJvbSBldmVyeSBhbmdsZS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDNkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzUmVjdCA9ICgpID0+IHRoaXMuY2FudmFzPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY3JlZW5TcGFjZTogT3ZlcmxheVZpZXdlciA9IHtcbiAgICAgIGNhbnZhc1RvV29ybGQ6IChjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCByID0gY2FudmFzUmVjdCgpO1xuICAgICAgICByZXR1cm4gciA/IFtjbGllbnRYIC0gci5sZWZ0LCBjbGllbnRZIC0gci50b3BdIDogW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgfSxcbiAgICAgIC8vIEFscmVhZHkgY2FudmFzIHBpeGVscy5cbiAgICAgIHdvcmxkVG9DYW52YXM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW3gsIHldLFxuICAgICAgc2V0Q29udHJvbHNFbmFibGVkOiAoZW5hYmxlZDogYm9vbGVhbikgPT4gdmlld2VyLnNldENvbnRyb2xzRW5hYmxlZChlbmFibGVkKSxcbiAgICAgIGNhbWVyYTogdmlld2VyLmNhbWVyYTNkLFxuICAgIH07XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgc2NyZWVuU3BhY2UsIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgIHRoaXMuYnVpbGRUb29sSG9zdHMoKTtcbiAgICB0aGlzLmNhbWVyYVJlYWRiYWNrT2ZmID0gdmlld2VyLmNhbWVyYTNkLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB7XG4gICAgICAvLyBPbmx5IHdoaWxlIG5vdGhpbmcgaXMgYmVpbmcgZHJhd24g4oCUIGNsZWFyaW5nIG1pZC1nZXN0dXJlIHdvdWxkIGRlbGV0ZSB0aGVcbiAgICAgIC8vIHNoYXBlIHVuZGVyIHRoZSB1c2VyJ3MgY3Vyc29yLlxuICAgICAgaWYgKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLmxlbmd0aCA+IDApIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhbXSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogTW92ZW1lbnQsIGluIHNjcmVlbiBwaXhlbHMsIHVuZGVyIHdoaWNoIGEgcHJlc3MtcmVsZWFzZSBpcyBhIENMSUNLIGFuZCBub3QgYVxuICAgKiAgZHJhZy4gQW4gb3JiaXQgb3IgYSBwYW4gc3RhcnRzIHRoZSBzYW1lIHdheSwgc28gdGhlIHR3byBoYXZlIHRvIGJlIHRvbGRcbiAgICogIGFwYXJ0IGJ5IGhvdyBmYXIgdGhlIHBvaW50ZXIgdHJhdmVsbGVkLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTElDS19TTE9QX1BYID0gNDtcbiAgLyoqIExvbmdlc3QgcHJlc3MtcmVsZWFzZSBzdGlsbCB0cmVhdGVkIGFzIGEgY2xpY2suIEEgbG9uZyBwcmVzcyB3aXRoIHRoZSBtb3VzZVxuICAgKiAgaGVsZCBzdGlsbCBpcyBtb3JlIGxpa2VseSBhbiBpbnRlcnJ1cHRlZCBkcmFnIHRoYW4gYSBzZWxlY3Rpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX01BWF9NUyA9IDYwMDtcbiAgLyoqIFBvaW50ZXIgZGlzdGFuY2UsIGluIHNjcmVlbiBwaXhlbHMsIHRoYXQgc3RpbGwgY291bnRzIGFzIFwib25cIiBhIG1hcmtlci5cbiAgICogIEdlbmVyb3VzIHJlbGF0aXZlIHRvIGEgMS41cHggZGlzYzogdGhlIGN1cnNvciBpcyBhIGJsdW50IGluc3RydW1lbnQsIGFuZCBhXG4gICAqICB0b29sdGlwIHlvdSBoYXZlIHRvIGh1bnQgZm9yIGlzIHdvcnNlIHRoYW4gbm9uZS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9WRVJfUkFESVVTX1BYID0gMTA7XG5cbiAgLyoqXG4gICAqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3czogaG92ZXIgYSBtYXJrZXIsIHJlYWQgaXRzIGNsYXNzLlxuICAgKlxuICAgKiBBIDM0LWVudHJ5IGxlZ2VuZCBjYW5ub3QgYmUgcmVhZCBiYWNrIGZyb20gYSBkb3Qg4oCUIHNldmVyYWwgY2xhc3NlcyBnZXRcbiAgICogc2ltaWxhciBjb2xvdXJzLCBhbmQgbWF0Y2hpbmcgb25lIHRvIGEgc3dhdGNoIGJ5IGV5ZSBpcyBleGFjdGx5IHRoZSB0YXNrIHRoaXNcbiAgICogcmVtb3Zlcy4gSXQgcmVwb3J0cyB3aGF0ZXZlciB0aGUgY2xvdWQgaXMgQ1VSUkVOVExZIGNvbG91cmVkIGJ5LCBzbyBpdCBhbmRcbiAgICogdGhlIGxlZ2VuZCBjYW4gbmV2ZXIgc2F5IGRpZmZlcmVudCB0aGluZ3MuXG4gICAqXG4gICAqIExpc3RlbnMgb24gdGhlIEhPU1QgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcyBzbyBpdCBrZWVwcyB3b3JraW5nIG92ZXIgdGhlIHJlZ2lvblxuICAgKiBvdmVybGF5IChhbiBTVkcgY292ZXJpbmcgdGhlIGNhbnZhcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cgZXZlcnlcbiAgICogbW92ZSksIGFuZCB0aHJvdHRsZXMgdG8gb25lIGhpdC10ZXN0IHBlciBhbmltYXRpb24gZnJhbWU6IGEgcG9pbnRlcm1vdmUgY2FuXG4gICAqIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBhbmQgZWFjaCB0ZXN0IGlzIGEgcGFzcyBvdmVyIHRoZSBjbG91ZC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BhdGlhbEhvdmVyKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG5ldyBOYXBhcmlTcGF0aWFsVG9vbHRpcChob3N0KTtcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgICAgaWYgKCFjYW52YXMpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmhvdmVyUG9pbnRlciA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICB5OiBlLmNsaWVudFkgLSByZWN0LnRvcCxcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgcmV0dXJuO1xuICAgICAgdGhpcy5ob3ZlckZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVIb3Zlcihob3N0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbFRvb2x0aXA/LmhpZGUoKTtcbiAgICB9O1xuXG4gICAgLy8gQSBjbGljayBvbiBhIG1hcmtlciBzZWxlY3RzIGl0cyBjbGFzcywgZXhhY3RseSBhcyBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZVxuICAgIC8vIHBhbmVsJ3MgbGVnZW5kIGRvZXMg4oCUIGluY2x1ZGluZyBjbGlja2luZyBhZ2FpbiB0byBjbGVhciwgc28gYSBjbGljayBpc1xuICAgIC8vIGFsd2F5cyByZXZlcnNpYmxlLiBUcmFja2VkIGFzIGRvd24vdXAgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGNsaWNrYCBzbyBhIERSQUdcbiAgICAvLyAoYW4gb3JiaXQgaW4gM0QsIGEgcGFuIGluIDJEKSBjYW4gYmUgdG9sZCBhcGFydCBmcm9tIGEgY2xpY2s6IHRoZSBnZXN0dXJlXG4gICAgLy8gaGFzIHRvIG1vdmUgbGVzcyB0aGFuIGEgZmV3IHBpeGVscyBhbmQgYmUgb3ZlciBxdWlja2x5LlxuICAgIGxldCBkb3duOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9uRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBkb3duID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgdDogRGF0ZS5ub3coKSB9O1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IGRvd247XG4gICAgICBkb3duID0gbnVsbDtcbiAgICAgIGlmICghc3RhcnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vdmVkID0gTWF0aC5oeXBvdChlLmNsaWVudFggLSBzdGFydC54LCBlLmNsaWVudFkgLSBzdGFydC55KTtcbiAgICAgIGlmIChtb3ZlZCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQudCA+IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkNMSUNLX01BWF9NUykgcmV0dXJuO1xuICAgICAgLy8gQSByZWdpb24gdG9vbCBvd25zIHRoZSBwb2ludGVyIHdoaWxlIGl0IGlzIGFjdGl2ZSwgYW5kIHBsYWNpbmcgYSBwb2x5Z29uXG4gICAgICAvLyB2ZXJ0ZXggaXMgYWxzbyBhIGNsaWNrIHRoYXQgZG9lcyBub3QgbW92ZS5cbiAgICAgIGlmICh0aGlzLnJlZ2lvbk92ZXJsYXk/LnRvb2xBY3RpdmUpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0Q2xhc3NBdChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvbk1vdmUpO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bik7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblVwKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uTGVhdmUpKTtcbiAgICB0aGlzLmhvdmVyT2ZmLnB1c2goKCkgPT4gaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uRG93bikpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApKTtcblxuICAgIC8vIEluIDNEIHRoZSBjYWNoZWQgcG9zaXRpb25zIGFyZSBzY3JlZW4gcGl4ZWxzLCBzbyBhbiBvcmJpdCBpbnZhbGlkYXRlcyB0aGVtLlxuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMudmlld2VyPy5jYW1lcmEzZDtcbiAgICBpZiAoY2FtZXJhICYmIGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSB7XG4gICAgICBjb25zdCBvZmYgPSBjYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3Zlck9mZi5wdXNoKG9mZik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsSG92ZXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvZmYgb2YgdGhpcy5ob3Zlck9mZikgb2ZmKCk7XG4gICAgdGhpcy5ob3Zlck9mZiA9IFtdO1xuICAgIGlmICh0aGlzLmhvdmVyRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaG92ZXJGcmFtZSk7XG4gICAgdGhpcy5ob3ZlckZyYW1lID0gMDtcbiAgICB0aGlzLmhvdmVyUG9pbnRlciA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbFRvb2x0aXAgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqIEhpdC10ZXN0IHRoZSBsYXN0IHBvaW50ZXIgcG9zaXRpb24gYW5kIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcC4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVIb3Zlcihob3N0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRpcCA9IHRoaXMuc3BhdGlhbFRvb2x0aXA7XG4gICAgY29uc3QgcG9pbnRlciA9IHRoaXMuaG92ZXJQb2ludGVyO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIXRpcCB8fCAhcG9pbnRlciB8fCAhZGF0YXNldCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIC8vIFRyYW5zY3JpcHQgbWFya2VycyBzaXQgb24gdG9wIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZXkgYXJlIGFza2VkIGZpcnN0LlxuICAgIGlmICghaXMzZCAmJiB0aGlzLnNwYXRpYWxUaWxlc01nciAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlci5jYW52YXNUb1dvcmxkKHBvaW50ZXIuY2xpZW50WCwgcG9pbnRlci5jbGllbnRZKTtcbiAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbTtcbiAgICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICAgIGNvbnN0IGxpbmVzID0gd29ybGQgPyB0aGlzLnNwYXRpYWxUaWxlc01nci5ob3ZlckF0KHdvcmxkWzBdLCB3b3JsZFsxXSwgcmFkaXVzLCAoZGV0YWlscykgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgICAgIGlmICghcCB8fCAhdGhpcy5zcGF0aWFsVG9vbHRpcCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcC5zaG93KGRldGFpbHMsIHAuY2xpZW50WCAtIHIubGVmdCwgcC5jbGllbnRZIC0gci50b3ApO1xuICAgICAgfSkgOiBudWxsO1xuICAgICAgaWYgKGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgdGlwLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gM0QgY29tcGFyZXMgc2NyZWVuIHBpeGVscyBkaXJlY3RseTsgMkQgaG9sZHMgd29ybGQgcG9zaXRpb25zLCBzbyB0aGUgcmFkaXVzXG4gICAgLy8gaXMgY29udmVydGVkIG9uY2UgaW5zdGVhZCBvZiBwcm9qZWN0aW5nIHRoZSB3aG9sZSBjbG91ZC5cbiAgICBjb25zdCB6b29tID0gaXMzZCA/IDEgOiAodGhpcy52aWV3ZXI/LmNhbWVyYS56b29tID8/IDEpO1xuICAgIGNvbnN0IHJhZGl1cyA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWCAvICh6b29tID4gMCA/IHpvb20gOiAxKTtcbiAgICBsZXQgeCA9IHBvaW50ZXIueDtcbiAgICBsZXQgeSA9IHBvaW50ZXIueTtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICB0aXAuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSB0aGlzLnBpY2tPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cywgaXMzZCk7XG4gICAgY29uc3QgbGluZXMgPSBob3ZlclRleHQodGhpcy5ob3ZlclNvdXJjZSwgaGl0KTtcbiAgICBpZiAoIWxpbmVzKSB7XG4gICAgICB0aXAuaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aXAuc2hvdyhsaW5lcywgcG9pbnRlci5jbGllbnRYIC0gcmVjdC5sZWZ0LCBwb2ludGVyLmNsaWVudFkgLSByZWN0LnRvcCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBjbGFzcyBvZiB0aGUgbWFya2VyIGF0IGEgY2xpZW50IHBvc2l0aW9uIOKAlCB0aGUgY2FudmFzIGVxdWl2YWxlbnQgb2ZcbiAgICogY2xpY2tpbmcgdGhhdCBjbGFzcyBpbiB0aGUgcGFuZWwncyBsZWdlbmQsIGFuZCB0aGUgc2FtZSBzZWxlY3Rpb24gb2JqZWN0LCBzb1xuICAgKiB0aGUgdHdvIGNvbnRyb2xzIGNhbm5vdCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHRzLlxuICAgKlxuICAgKiBDbGlja2luZyBhIGNsYXNzIHRoYXQgaXMgYWxyZWFkeSB0aGUgd2hvbGUgc2VsZWN0aW9uIENMRUFSUyBpdCwgd2hpY2ggaXMgd2hhdFxuICAgKiB0aGUgbGVnZW5kIGRvZXMuIENvbXBhcmVkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmF0aGVyIHRoYW4gYWdhaW5zdCBhXG4gICAqIHJlbWVtYmVyZWQgY2xpY2ssIHNvIHNlbGVjdGluZyBmcm9tIHRoZSBsZWdlbmQgYW5kIHRoZW4gY2xpY2tpbmcgdGhlIHNhbWVcbiAgICogY2xhc3Mgb24gdGhlIGNhbnZhcyBzdGlsbCB0b2dnbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RDbGFzc0F0KGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5ob3ZlclNvdXJjZTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc2VsZWN0aW9uU3RvcmU7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIC8vIE9ubHkgYSBjYXRlZ29yaWNhbCBzb3VyY2UgaGFzIGNsYXNzZXMgdG8gc2VsZWN0LiBBIGdlbmUgaXMgY29udGludW91czpcbiAgICAvLyB0aGVyZSBpcyBubyBzZXQgb2YgY2VsbHMgdGhhdCBcImlzXCIgYSB2YWx1ZS5cbiAgICBpZiAoIXN0b3JlIHx8ICFkYXRhc2V0IHx8IHNvdXJjZT8ua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5ob3ZlclBvc2l0aW9uc0ZvcihkYXRhc2V0Lm9ic2VydmF0aW9ucyk7XG4gICAgaWYgKCFwb3NpdGlvbnMpIHJldHVybjtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IHpvb20gPSBpczNkID8gMSA6ICh0aGlzLnZpZXdlcj8uY2FtZXJhLnpvb20gPz8gMSk7XG4gICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgIGxldCB4ID0gY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBsZXQgeSA9IGNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAoIWlzM2QpIHtcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy52aWV3ZXI/LmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICBpZiAoIXdvcmxkKSByZXR1cm47XG4gICAgICBbeCwgeV0gPSB3b3JsZDtcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIGlmIChoaXQgPCAwKSByZXR1cm47XG4gICAgY29uc3QgY29kZSA9IHNvdXJjZS5jb2Rlc1toaXRdO1xuICAgIC8vIEEgY2VsbCB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb3ZlciBoYXMgbm8gY2xhc3MgdG8gc2VsZWN0LlxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQgfHwgY29kZSA9PT0gTk9fQ0FURUdPUlkpIHJldHVybjtcblxuICAgIGNvbnN0IG5leHQgPSBzZWxlY3RCeUNhdGVnb3J5KHNvdXJjZS5jb2RlcywgY29kZSk7XG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2FtZVNlbGVjdGlvbihjdXJyZW50LCBuZXh0KSkge1xuICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0KG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9ic2VydmF0aW9uIGlzIHVuZGVyIHRoZSBjdXJzb3IuXG4gICAqXG4gICAqIEluIDNEIHRoaXMgZGVmZXJzIHRvIG5hcGFyaS1qcydzIHtAbGluayBuZWFyZXN0UHJvamVjdGVkSW5kZXh9IFdJVEggdGhlIGRlcHRocyB0aGVcbiAgICogcHJvamVjdGlvbiBwcm9kdWNlZCwgc28gdGhlIGZyb250LW1vc3QgY2FuZGlkYXRlIHdpbnMuIFRoYXQgbWF0dGVycyBtb3JlIHRoYW4gaXRcbiAgICogc291bmRzOiB0aGUgcmVuZGVyZXIgZGVwdGgtdGVzdHMgdGhlIGJpbGxib2FyZHMsIGFuZCBpbiBhIDMuN00tcG9pbnQgY2xvdWQgdGhlIGN1cnNvclxuICAgKiBjb3ZlcnMgbWFueSBvZiB0aGVtIOKAlCBwaWNraW5nIHRoZSBvbmUgbmVhcmVzdCB0aGUgY3Vyc29yJ3MgY2VudHJlIHJlZ3VsYXJseSBuYW1lcyBhXG4gICAqIGNlbGwgdGhhdCBzb21ldGhpbmcgZWxzZSBpcyBkcmF3biBvdmVyLCB3aGljaCByZWFkcyBhcyBhIHdyb25nIHRvb2x0aXAgcmF0aGVyIHRoYW4gYXNcbiAgICogYSBzdWJ0bGV0eSBvZiBwaWNraW5nLlxuICAgKlxuICAgKiBJbiAyRCB0aGUgcG9zaXRpb25zIGFyZSBXT1JMRCBjb29yZGluYXRlcyBvbiBvbmUgcGxhbmUsIHNvIHRoZXJlIGlzIG5vIGRlcHRoIHRvIGJyZWFrXG4gICAqIHRpZXMgd2l0aCBhbmQgdGhlIGV4aXN0aW5nIG5lYXJlc3QtbWFya2VyIHJ1bGUgaXMgdGhlIHJpZ2h0IG9uZS5cbiAgICovXG4gIHByaXZhdGUgcGlja09ic2VydmF0aW9uKFxuICAgIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgaXMzZDogYm9vbGVhbixcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIWlzM2QpIHJldHVybiBuZWFyZXN0T2JzZXJ2YXRpb24ocG9zaXRpb25zLCB4LCB5LCByYWRpdXMpO1xuICAgIC8vIFRoZSBjbG91ZCBkcmF3cyBhIHNlbGVjdGVkIG1hcmtlciBMQVJHRVIsIHNvIHRoZSBwaWNrIGhhcyB0byB1c2UgdGhlIHNhbWUgcmFkaXVzIHRoZVxuICAgIC8vIHJlbmRlcmVyIHVzZWQg4oCUIG90aGVyd2lzZSB0aGUgaGlnaGxpZ2h0ZWQgY2VsbHMsIHRoZSBvbmVzIGEgcmVhZGVyIGlzIG1vc3QgbGlrZWx5IHRvXG4gICAgLy8gYmUgcG9pbnRpbmcgYXQsIGFyZSB0aGUgaGFyZGVzdCB0byBob3Zlci5cbiAgICBjb25zdCBzY2FsZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy5zZWxlY3Rpb25TdG9yZT8uY3VycmVudCgpPy5tYXNrO1xuICAgIGNvbnN0IG9wdHMgPSBtYXNrPy5sZW5ndGhcbiAgICAgID8geyByYWRpdXNBdDogKGk6IG51bWJlcikgPT4gKG1hc2tbaV0gPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cykgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gYHJhZGl1c2Agc3RpbGwgYm91bmRzIHdoaWNoIGJ1Y2tldHMgYXJlIHZpc2l0ZWQsIHNvIGl0IGhhcyB0byBiZSB0aGUgTEFSR0VTVCBhbnlcbiAgICAvLyBwb2ludCBjYW4gY2xhaW0sIG5vdCB0aGUgYmFzZSBvbmUuXG4gICAgY29uc3QgcmVhY2ggPSBtYXNrPy5sZW5ndGggPyByYWRpdXMgKiBzY2FsZSA6IHJhZGl1cztcbiAgICBpZiAodGhpcy5ob3ZlckluZGV4KSByZXR1cm4gdGhpcy5ob3ZlckluZGV4LnBpY2soeCwgeSwgcmVhY2gsIG9wdHMpO1xuICAgIHJldHVybiBuZWFyZXN0UHJvamVjdGVkSW5kZXgocG9zaXRpb25zLCB4LCB5LCByZWFjaCwgdGhpcy5zcGF0aWFsRGVwdGhzM2QsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc2l0aW9ucyB0byBoaXQtdGVzdCBhZ2FpbnN0LCByZWJ1aWx0IG9ubHkgd2hlbiB0aGUgc2NlbmUgb3IgY2FtZXJhIG1vdmVkLlxuICAgKlxuICAgKiBBIHBhc3Mgb3ZlciAzLjdNIG9ic2VydmF0aW9ucyBpcyBub3Qgc29tZXRoaW5nIHRvIGRvIHBlciBwb2ludGVybW92ZSwgYW5kIHRoZVxuICAgKiBjbG91ZCBkb2VzIG5vdCBtb3ZlIGJldHdlZW4gZnJhbWVzIHVubGVzcyBzb21ldGhpbmcgc2F5cyBpdCBkaWQuXG4gICAqL1xuICBwcml2YXRlIGhvdmVyUG9zaXRpb25zRm9yKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhvdmVyUG9zaXRpb25zICYmIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPT09IHRoaXMuc3BhdGlhbFNjZW5lUmV2KSB7XG4gICAgICByZXR1cm4gdGhpcy5ob3ZlclBvc2l0aW9ucztcbiAgICB9XG4gICAgY29uc3QgaXMzZCA9IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIGNvbnN0IGJ1aWx0ID0gaXMzZFxuICAgICAgPyB0aGlzLmdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9uKG9icylcbiAgICAgIDogdGhpcy5ob3ZlcldvcmxkUG9zaXRpb25zKG9icyk7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IGJ1aWx0O1xuICAgIHRoaXMuaG92ZXJQb3NpdGlvbnNSZXYgPSB0aGlzLnNwYXRpYWxTY2VuZVJldjtcbiAgICAvLyBCdWlsdCBoZXJlLCBpbiB0aGUgc2FtZSBsYXp5IHNsb3QsIHNvIGl0IGlzIHBhaWQgZm9yIG9uIHRoZSBmaXJzdCBob3ZlciBhZnRlciB0aGVcbiAgICAvLyBzY2VuZSBtb3ZlZCBhbmQgbm90IG9uIGV2ZXJ5IGZyYW1lIG9mIGFuIG9yYml0LiBPbmx5IHdvcnRoIGl0IHBhc3QgdGhlIHBvaW50IHdoZXJlXG4gICAgLy8gdGhlIGxpbmVhciBzY2FuIHN0b3BzIGJlaW5nIGZyZWU7IGJlbG93IHRoYXQgdGhlIGJ1aWxkIGNvc3RzIG1vcmUgdGhhbiBpdCBzYXZlcy5cbiAgICB0aGlzLmhvdmVySW5kZXggPSBudWxsO1xuICAgIGlmIChpczNkICYmIGJ1aWx0ICYmIHRoaXMuY2FudmFzICYmIGJ1aWx0Lmxlbmd0aCAvIDIgPj0gU0NSRUVOX0lOREVYX01JTl9QT0lOVFMpIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgaWYgKHcgJiYgaCkge1xuICAgICAgICB0aGlzLmhvdmVySW5kZXggPSBuZXcgU2NyZWVuSW5kZXgoXG4gICAgICAgICAgeyBzY3JlZW46IGJ1aWx0LCBkZXB0aDogdGhpcy5zcGF0aWFsRGVwdGhzM2QgPz8gbmV3IEZsb2F0MzJBcnJheShidWlsdC5sZW5ndGggLyAyKSB9LFxuICAgICAgICAgIHcsXG4gICAgICAgICAgaCxcbiAgICAgICAgICAvLyBUaGUgbGFyZ2VzdCByYWRpdXMgYW55IHBpY2sgaGVyZSBjYW4gY2xhaW06IHRoZSBiYXNlIGhvdmVyIHJhZGl1cywgdGltZXMgdGhlXG4gICAgICAgICAgLy8gc2NhbGUgYSBTRUxFQ1RFRCBtYXJrZXIgaXMgZHJhd24gYXQuIFN0YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIHRoZSBkZWZhdWx0LFxuICAgICAgICAgIC8vIGJlY2F1c2UgaXQgaXMgd2hhdCBkZWNpZGVzIHdoZXRoZXIgYSBtYXJrZXIgc3RyYWRkbGluZyB0aGUgY2FudmFzIGVkZ2UgaXNcbiAgICAgICAgICAvLyBmb3VuZCDigJQgaXRzIGNlbnRyZSBpcyBvZmYgc2NyZWVuIHdoaWxlIHBhcnQgb2YgaXQgaXMgbm90LlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFJlYWNoOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFhcbiAgICAgICAgICAgICAgKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAyRCBtYXJrZXJzJyBXT1JMRCBwb3NpdGlvbnMsIGluZGV4ZWQgYnkgb2JzZXJ2YXRpb24sIE5hTiBmb3IgYW55IG5vdCBvblxuICAgKiB0aGUgZGlzcGxheWVkIHBsYW5lIOKAlCB0aGUgc2FtZSBhZmZpbmUgYW5kIHRoZSBzYW1lIHN1YnNldCB0aGUgbWFya2VyIGxheWVyIHdhc1xuICAgKiBidWlsdCBmcm9tLCBzbyB0aGUgdG9vbHRpcCBjYW5ub3QgcG9pbnQgYXQgYSBjZWxsIHRoYXQgaXMgbm90IGRyYXduLlxuICAgKi9cbiAgcHJpdmF0ZSBob3ZlcldvcmxkUG9zaXRpb25zKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlswXTtcbiAgICBpZiAoIWRhdGFzZXQgfHwgb2JzLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGFiID0gdGhpcy5zcGF0aWFsU2xhYihkYXRhc2V0KTtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBbc3gsIHN5XSA9IHJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICAgIGNvbnN0IFt0eCwgdHldID0gcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcyA/PyBudWxsO1xuICAgIGNvbnN0IG91dCA9IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50ICogMikuZmlsbChOYU4pO1xuICAgIGNvbnN0IG4gPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgY29uc3QgaSA9IGRyYXduID8gZHJhd25ba10gOiBrO1xuICAgICAgb3V0W2kgKiAyXSA9IG9icy54W2ldICogc3ggKyB0eDtcbiAgICAgIG91dFtpICogMiArIDFdID0gb2JzLnlbaV0gKiBzeSArIHR5O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRvb2x0aXAgc2F5cywgcmVzb2x2ZWQgb25jZSBwZXIgY29sb3VyIHNvdXJjZSByYXRoZXIgdGhhbiBwZXIgaG92ZXIuXG4gICAqXG4gICAqIEZldGNoZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBjb2xvdXJpbmcgb24gcHVycG9zZTogdGhlIHJlZmVyZW5jZSBwb3J0IGNhY2hlc1xuICAgKiBjb2x1bW5zLCBidXQgYSBob3N0J3MgbmVlZCBub3QsIGFuZCByZS1mZXRjaGluZyBhIDMuN00tZWxlbWVudCB2ZWN0b3IgYmVjYXVzZVxuICAgKiB0aGUgcG9pbnRlciBtb3ZlZCB3b3VsZCBiZSBpbmRlZmVuc2libGUgZWl0aGVyIHdheS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUhvdmVyU291cmNlKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBjb25zdCBrZXkgPSBkYXRhc2V0ICYmIGNvbG9yQnlcbiAgICAgID8gYCR7ZGF0YXNldC5pZH18JHtjb2xvckJ5LmtpbmR9OiR7Y29sb3JCeS5uYW1lfWBcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmhvdmVyU291cmNlS2V5KSByZXR1cm47XG4gICAgLy8gVGhlIGtleSBpcyBjb21taXR0ZWQgb25seSB3aGVyZSBhIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gU2V0dGluZyBpdCB1cFxuICAgIC8vIGZyb250IHdvdWxkIG1lYW4gYSByZXNvbHV0aW9uIHRoYXQgbG9zZXMgdGhlIHJhY2UgbGVhdmVzIHRoZSBrZXkgY2xhaW1pbmcgYVxuICAgIC8vIHNvdXJjZSB0aGF0IHdhcyBuZXZlciBzdG9yZWQg4oCUIGFuZCBzaW5jZSBldmVyeSBsYXRlciBlbWlzc2lvbiBjYXJyaWVzIHRoZVxuICAgIC8vIHNhbWUga2V5LCBpdCB3b3VsZCBzaG9ydC1jaXJjdWl0IGhlcmUgZm9yZXZlciBhbmQgdGhlIHRvb2x0aXAgd291bGQgc3RheVxuICAgIC8vIHNpbGVudCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMuaG92ZXJTb3VyY2VUb2tlbjtcbiAgICAvLyBObyBjb2xvdXIgc291cmNlIG1lYW5zIG5vdGhpbmcgaXMgYmVpbmcgc2FpZCBhYm91dCB0aGUgY2VsbHMsIHNvIHRoZXJlIGlzIG5vXG4gICAgLy8gY2x1c3RlciB0byBuYW1lIGFuZCB0aGUgdG9vbHRpcCBzdGF5cyBzaWxlbnQuXG4gICAgaWYgKCFrZXkgfHwgIWRhdGFzZXQgfHwgIWNvbG9yQnkgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb2xvckJ5LmtpbmQgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdGhpcy5ob3ZlclNvdXJjZVRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjYXRlZ29yaWNhbCcsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBjb2x1bW4ubWV0YS5jYXRlZ29yaWVzLFxuICAgICAgICAgICAgY29kZXM6IGNvbHVtbi5jb2RlcyxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICBraW5kOiAnY29udGludW91cycsXG4gICAgICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbHVtbi52YWx1ZXMsXG4gICAgICAgICAgICAuLi4oY29sdW1uLm1ldGEudW5pdCA/IHsgdW5pdDogY29sdW1uLm1ldGEudW5pdCB9IDoge30pLFxuICAgICAgICAgIH07XG4gICAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSB7XG4gICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgbmFtZTogY29sb3JCeS5uYW1lLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC4uLihkYXRhc2V0LmZlYXR1cmVzPy51bml0ID8geyB1bml0OiBkYXRhc2V0LmZlYXR1cmVzLnVuaXQgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgIC8vIFRoZSB0b29sdGlwIGlzIGFuIGV4dHJhOyBhIGZhaWxlZCBmZXRjaCBtdXN0IG5vdCBkaXN0dXJiIHRoZSByZW5kZXIuIFRoZVxuICAgICAgLy8ga2V5IGlzIGxlZnQgdW5zZXQgc28gYSBsYXRlciBlbWlzc2lvbiByZXRyaWVzIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgYVxuICAgICAgLy8gcGVybWFuZW50IHNpbGVuY2UuXG4gICAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIHRvIGNhbnZhcyBwaXhlbHMgdW5kZXIgdGhlIGN1cnJlbnQgM0QgY2FtZXJhLlxuICAgKlxuICAgKiBUaGUgcHJvamVjdGlvbiBpdHNlbGYgaXMgdGhlIHJlbmRlcmVyJ3M6IGB2aWV3ZXIucHJvamVjdFBvaW50c2Agb3ducyB0aGUgY2FtZXJhLCB0aGVcbiAgICogdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgdGhlIHBlcnNwZWN0aXZlIGRpdmlkZSBhbmQgdGhlIHktZmxpcC4gVGhpcyB1c2VkIHRvIGJlIGZpZnRlZW5cbiAgICogbGluZXMgb2YgY29sdW1uLW1ham9yIG1hdHJpeCBhcml0aG1ldGljIGhlcmUsIGR1cGxpY2F0aW5nIGEgc2Vjb25kIGNvcHkgaW5cbiAgICogYG5hcGFyaS1heGVzLWxhYmVsc2Ag4oCUIGFuZCB0aGUgdHdvIGhhZCBkcmlmdGVkIG9uIHdoYXQgdG8gZG8gd2l0aCBhIE5hTiB3LlxuICAgKlxuICAgKiBXaGF0IGlzIGxlZnQgaXMgdGhlIHBhcnQgdGhhdCBpcyBnZW51aW5lbHkgdGhpcyBhZGFwdGVyJ3M6IFNDQVRURVJJTkcgdGhlIGRyYXduIHN1YnNldFxuICAgKiBiYWNrIGludG8gb2JzZXJ2YXRpb24gb3JkZXIuIFRoZSBjbG91ZCBob2xkcyBvbmx5IHRoZSBwb2ludHMgb2YgdGhlIGRpc3BsYXllZCBzZWN0aW9uLFxuICAgKiBpbiBpdHMgb3duIHBhY2tpbmc7IGV2ZXJ5IGNvbnN1bWVyIGluZGV4ZXMgYnkgb2JzZXJ2YXRpb24uIE5hTiBzdGFuZHMgZm9yIFwibm90IG9uXG4gICAqIHNjcmVlblwiLCB3aGljaCBpcyBhbHNvIHRoZSByaWdodCBhbnN3ZXIgZm9yIGFuIG9ic2VydmF0aW9uIHdob3NlIHNlY3Rpb24gaXMgaGlkZGVuLlxuICAgKlxuICAgKiBOdWxsIHdoZW4gdGhlIDNEIGNsb3VkIGlzIG5vdCBtb3VudGVkLCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gdGhlIDJEIGFmZmluZSBwYXRoLlxuICAgKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIgfHwgIXRoaXMuc3BhdGlhbFBvc2l0aW9uczNkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHByb2plY3RlZCA9IHZpZXdlci5wcm9qZWN0UG9pbnRzKHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkLCB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QpO1xuICAgIGlmICghcHJvamVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICAvLyBSZXVzZWQgYWNyb3NzIGNhbWVyYSBjaGFuZ2VzOiBhdCAzLjdNIG9ic2VydmF0aW9ucyB0aGlzIGlzIGEgMzAgTUIgYWxsb2NhdGlvbiB0aGF0XG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIGhhcHBlbiBvbiBldmVyeSBvcmJpdC5cbiAgICB0aGlzLnNwYXRpYWxQcm9qZWN0aW9uM2QgPSBwcm9qZWN0ZWQ7XG5cbiAgICBjb25zdCBkcmF3biA9IHRoaXMuc3BhdGlhbERyYXduM2Q7XG4gICAgY29uc3QgeyBzY3JlZW4sIGRlcHRoIH0gPSBwcm9qZWN0ZWQ7XG4gICAgY29uc3QgY291bnQgPSBzY3JlZW4ubGVuZ3RoID4+IDE7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgY29uc3QgZGVwdGhzID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpLmZpbGwoTmFOKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgIGNvbnN0IGkgPSBkcmF3biA/IGRyYXduW2tdIDogaztcbiAgICAgIGlmIChpID49IG9icy5jb3VudCkgY29udGludWU7XG4gICAgICBvdXRbaSAqIDJdID0gc2NyZWVuW2sgKiAyXTtcbiAgICAgIG91dFtpICogMiArIDFdID0gc2NyZWVuW2sgKiAyICsgMV07XG4gICAgICBkZXB0aHNbaV0gPSBkZXB0aFtrXTtcbiAgICB9XG4gICAgLy8gS2VwdCBiZXNpZGUgdGhlIHNjcmVlbiBwb3NpdGlvbnMgc28gdGhlIGhvdmVyIHBpY2sgY2FuIHByZWZlciB0aGUgRlJPTlQtbW9zdCBwb2ludFxuICAgIC8vIHVuZGVyIHRoZSBjdXJzb3IgcmF0aGVyIHRoYW4gdGhlIG9uZSBuZWFyZXN0IGl0cyBjZW50cmUg4oCUIHdoaWNoIGluIGEgZGVuc2UgY2xvdWQgaXNcbiAgICAvLyByZWd1bGFybHkgc29tZXRoaW5nIHRoZSByZW5kZXJlciBkcmV3IGFub3RoZXIgcG9pbnQgb3Zlci5cbiAgICB0aGlzLnNwYXRpYWxEZXB0aHMzZCA9IGRlcHRocztcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIG1hcmtlcnMgb24gYW55IGRhdGFzZXQgb3Igdmlldy1zdGF0ZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU3BhdGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNwYXRpYWxTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgaWYgKCFwb3J0KSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0aW9uJCA9IHRoaXMuc2VsZWN0aW9uU3RvcmU/LmdldFNlbGVjdGlvbiQoKSA/PyBvZihlbXB0eVNlbGVjdGlvbigpKTtcbiAgICAvLyBUaGUgZGlzcGxheSBjb2xvcm1hcCBpcyBhbiBpbnB1dCBoZXJlLCBub3QganVzdCBzb21ldGhpbmcgcmVhZCBhdCBidWlsZFxuICAgIC8vIHRpbWU6IGBjb250aW51b3VzQ29sb3JtYXA6IG51bGxgIG1lYW5zIFwiZm9sbG93IHRoZSBpbWFnZSdzIGNvbG9ybWFwXCIsIGFuZCBhXG4gICAgLy8gc2V0dGluZyB0aGF0IG9ubHkgdGFrZXMgZWZmZWN0IGF0IHRoZSBuZXh0IHVucmVsYXRlZCByZWJ1aWxkIGlzIG5vdCBvbmUuXG4gICAgdGhpcy5zcGF0aWFsU3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICBwb3J0LmdldERhdGFzZXQkKCksIHRoaXMuc3RvcmUuZ2V0U3BhdGlhbFZpZXckKCksIHNlbGVjdGlvbiQsXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgXSkuc3Vic2NyaWJlKChbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCBjb2xvcm1hcCwgcmV2ZXJzZV0pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSAhIXJldmVyc2U7XG4gICAgICAvLyBLZXB0IHNvIGEgc2xpY2UgY2hhbmdlIGNhbiByZWRyYXcgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUsIHdoaWNoXG4gICAgICAvLyBhcnJpdmVzIHRocm91Z2ggc2V0WkluZGV4IHJhdGhlciB0aGFuIHRocm91Z2ggYW55IG9mIHRoZXNlIHN0cmVhbXMuXG4gICAgICB0aGlzLnNwYXRpYWxMYXRlc3QgPSBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXTtcbiAgICAgIC8vIFRoZSBtYXJrZXJzIGFyZSBhYm91dCB0byBtb3ZlIG9yIGNoYW5nZSBtZWFuaW5nLCBzbyBib3RoIGhhbHZlcyBvZiB0aGVcbiAgICAgIC8vIHRvb2x0aXAg4oCUIHdoZXJlIHRoZSBwb2ludHMgYXJlLCBhbmQgd2hhdCB0aGV5IGFyZSDigJQgYXJlIHN0YWxlLlxuICAgICAgdGhpcy5zcGF0aWFsU2NlbmVSZXYrKztcbiAgICAgIHZvaWQgdGhpcy5yZXNvbHZlSG92ZXJTb3VyY2UoZGF0YXNldCwgdmlldyk7XG4gICAgICB2b2lkIChpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKVxuICAgICAgICA/IHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMzZChkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50cyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pKTtcbiAgICAgIGlmICghaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogKFJlKWJ1aWxkIHRoZSBvYnNlcnZhdGlvbiBtYXJrZXIgbGF5ZXIgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrID0gZW1wdHlTZWxlY3Rpb24oKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuO1xuXG4gICAgLy8gUmVzb2x2ZSBjb2xvdXJzIEJFRk9SRSB0b3VjaGluZyB0aGUgc2NlbmU6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZVxuICAgIC8vIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGUgZXhpc3RpbmcgbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGZhY2VDb2xvcjogUmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZysrO1xuICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICB0cnkge1xuICAgICAgZmFjZUNvbG9yID0gZGF0YXNldFxuICAgICAgICA/IGF3YWl0IHRoaXMuc3BhdGlhbEZhY2VDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKVxuICAgICAgICA6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICBmYWNlQ29sb3IgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZy0tO1xuICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgIH1cbiAgICAvLyBBIG5ld2VyIHJlYnVpbGQgKG9yIGEgdGVhcmRvd24pIHN0YXJ0ZWQgd2hpbGUgdGhlIHZlY3RvciB3YXMgaW4gZmxpZ2h0LlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGlmICghZGF0YXNldCB8fCBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5nZW5lTWFwTGF5ZXIpIHtcbiAgICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSBkYXRhc2V0IHdob3NlIGltYWdlIElTIGl0cyB2b2x1bWUgc2hvd3MgT05FIFBMQU5FIGF0IGEgdGltZSwgc28gdGhlXG4gICAgLy8gbWFya2VycyBhcmUgdGhlIG9ic2VydmF0aW9ucyBpbiB0aGUgZGlzcGxheWVkIHBsYW5lLCBkcmF3biBpbiB0aGF0IHBsYW5lJ3NcbiAgICAvLyBwaXhlbCBncmlkLiBXaXRob3V0IHRoZSBmaWx0ZXIgdGhlIHNwZWNpbWVuJ3Mgd2hvbGUgZGVwdGggcGlsZXMgb250byBvbmVcbiAgICAvLyBzZWN0aW9uIGFuZCByZWFkcyBhcyBhIHNtZWFyOyB3aXRob3V0IHRoZSBhZmZpbmUgdGhlIGNvb3JkaW5hdGVzIGFyZSByZWFkXG4gICAgLy8gYXMgcGl4ZWxzIGFuZCBsYW5kIG9mZiB0aGUgc2xpY2UgZW50aXJlbHkuXG4gICAgY29uc3Qgc2xhYiA9IHRoaXMuc3BhdGlhbFNsYWIoZGF0YXNldCk7XG4gICAgLy8gVGhlIGdlbmUgbWFwIGdvZXMgVU5ERVIgdGhlIGNlbGxzLCBzbyBpdCBpcyBzZXR0bGVkIGJlZm9yZSB0aGV5IGFyZSBhZGRlZC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUdlbmVNYXAodmlld2VyLCBkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHNsYWIpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCByZWYgPSBzbGFiPy5yZWYgPz8gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBiYXNlID0gbWFya2VyRGlhbWV0ZXJzKG9icywgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9GQUxMQkFDS19SQURJVVMpO1xuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3QgZmxvb3IgPSBzbGFiPy5taW5EaWFtZXRlciA/PyAwO1xuICAgIGNvbnN0IHNpemVPZiA9IChpOiBudW1iZXIpID0+XG4gICAgICBNYXRoLm1heCh0eXBlb2YgYmFzZSA9PT0gJ251bWJlcicgPyBiYXNlIDogYmFzZVtpXSwgZmxvb3IpICogc2NhbGU7XG4gICAgY29uc3Qgc2l6ZTogbnVtYmVyIHwgRmxvYXQzMkFycmF5ID1cbiAgICAgIHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyAmJiAhc2xhYlxuICAgICAgICA/IE1hdGgubWF4KGJhc2UsIGZsb29yKSAqIHNjYWxlXG4gICAgICAgIDogRmxvYXQzMkFycmF5LmZyb20oc2xhYj8uaW5kaWNlcyA/PyB7IGxlbmd0aDogb2JzLmNvdW50IH0sIChfdiwgaSkgPT5cbiAgICAgICAgICAgIHNpemVPZihzbGFiID8gc2xhYi5pbmRpY2VzW2ldIDogaSkpO1xuXG4gICAgLy8gbmFwYXJpJ3MgaW1hZ2UgdmlldyBDTEVBUlMgdGhlIHdob2xlIGxheWVyIGxpc3Qgb24gZXZlcnkgcmVuZGVyLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGdvIHdpdGggaXQgd2hlbmV2ZXIgdGhlIGltYWdlIGlzIHJlLXJlbmRlcmVkIOKAlCBhIHNjcnViLCBhIGNvbnRyYXN0XG4gICAgLy8gY2hhbmdlLiBUaGUgY2FjaGVkIGhhbmRsZSBpcyB0aGVuIGRldGFjaGVkLCBhbmQgbXV0YXRpbmcgaXQgZHJhd3Mgbm90aGluZzpcbiAgICAvLyB0cmVhdCBhIGxheWVyIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzY2VuZSBhcyBhYnNlbnQgc28gaXQgZ2V0cyByZS1hZGRlZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzICYmICF2aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKHRoaXMuc3BhdGlhbFBvaW50cykpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQSBzaXplL2NvbG91ci9vcGFjaXR5L3NlbGVjdGlvbiBjaGFuZ2UgaXMgRElTUExBWS1vbmx5OiBtdXRhdGUgdGhlIGxheWVyXG4gICAgLy8gcmF0aGVyIHRoYW4gZHJvcHBpbmcgYW5kIHJlLWFkZGluZyBpdC4gQm90aCBzZXR0ZXJzIGJ1bXAgdGhlIGxheWVyJ3NcbiAgICAvLyBkYXRhVmVyc2lvbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBuYXBhcmktanMgcmVidWlsZCB0aGUgaW5zdGFuY2UgYnVmZmVyIGFuZFxuICAgIC8vIHJlZHJhdyDigJQgYW5kIGl0IGF2b2lkcyByZWJ1aWxkaW5nIDg0ayBwb3NpdGlvbnMgdG8gY2hhbmdlIG9uZSBudW1iZXIuXG4gICAgLy8gVGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlIGtleTogYSBzY3J1YiBjaGFuZ2VzIFdISUNIIG9ic2VydmF0aW9ucyBhcmUgZHJhd24sXG4gICAgLy8gd2hpY2ggaXMgZ2VvbWV0cnksIG5vdCBkaXNwbGF5LlxuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NsYWI/LnNsaWNlID8/ICcnfWA7XG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cyAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbExheWVyS2V5KSB7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMuc2l6ZSA9IHNpemU7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMudmlzaWJsZSA9IHRoaXMuc3BhdGlhbFBvaW50c1Zpc2libGUoKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cy5mYWNlQ29sb3IgPSB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIHNsYWI/LmluZGljZXMpIGFzIG5ldmVyO1xuICAgICAgdGhpcy5oaWRlRm9yZWlnbkltYWdlKHZpZXdlciwgKCEhcmVmIHx8ICEhZGF0YXNldC52b2x1bWUpICYmIHZpZXcuc2hvd0ltYWdlICE9PSBmYWxzZSk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5zZXRSZWdpb25zVmlzaWJsZSh2aWV3LnNob3dBbm5vdGF0aW9ucyAhPT0gZmFsc2UpO1xuICAgICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkcmF3biA9IHNsYWI/LmluZGljZXM7XG4gICAgY29uc3QgY291bnQgPSBkcmF3biA/IGRyYXduLmxlbmd0aCA6IG9icy5jb3VudDtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KGNvdW50ICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gZHJhd24gPyBkcmF3bltpXSA6IGk7XG4gICAgICBwb3NpdGlvbnNbaSAqIDJdID0gb2JzLnhbb107XG4gICAgICBwb3NpdGlvbnNbaSAqIDIgKyAxXSA9IG9icy55W29dO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IGtleTtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSB2aWV3ZXIuYWRkUG9pbnRzKHBvc2l0aW9ucywge1xuICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICBzaXplLFxuICAgICAgZmFjZUNvbG9yOiB0aGlzLmdhdGhlckNvbG9ycyhmYWNlQ29sb3IsIGRyYXduKSxcbiAgICAgIC8vIE5vIGJvcmRlcjogYXQgVmlzaXVtIHNwb3QgZGVuc2l0eSBhbiBvdXRsaW5lIHBlciBtYXJrZXIgcmVhZHMgYXMgbm9pc2UsXG4gICAgICAvLyBhbmQgaXQgY29zdHMgYSBzZWNvbmQgY29sb3VyIGFycmF5LlxuICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgICAvLyBUaGUgZGF0YXNldCdzIGRhdGEtPndvcmxkIGFmZmluZS4gU3BhdGlhbERhdGEgcmVjb3JkcyBvbmUgcGVyIGNvb3JkaW5hdGVcbiAgICAgIC8vIHN5c3RlbSAoVmlzaXVtIHNwb3QgY29vcmRzIGFyZSBpbiB0aGUgRlVMTC1yZXNvbHV0aW9uIGZyYW1lIHdoaWxlIHRoZVxuICAgICAgLy8gc2VydmVkIGltYWdlIG1heSBiZSB0aGUgaGlyZXMgZG93bnNjYWxlKSwgc28gd2l0aG91dCB0aGlzIHRoZSBtYXJrZXJzXG4gICAgICAvLyBsYW5kIGluIHRoZSByaWdodCBzaGFwZSBhdCB0aGUgd3Jvbmcgc2NhbGUuIERlZmF1bHRzIHRvIGlkZW50aXR5IHdoZW5cbiAgICAgIC8vIHRoZSBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBpbiB0aGUgaW1hZ2UncyBwaXhlbCBzcGFjZS5cbiAgICAgIHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSxcbiAgICAgIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdLFxuICAgICAgdmlzaWJsZTogdGhpcy5zcGF0aWFsUG9pbnRzVmlzaWJsZSgpLFxuICAgIH0pO1xuICAgIC8vIE91dGxpbmVzLCBkZW5zaXR5IGFuZCB0cmFuc2NyaXB0cyBnbyBiYWNrIG92ZXIgdGhlIG1hcmtlcnMganVzdCBhZGRlZC5cbiAgICB0aGlzLnNwYXRpYWxUaWxlc01ncj8uYWZ0ZXJPYnNlcnZhdGlvbnMoKTtcbiAgICB0aGlzLmZyYW1lU3BhdGlhbFBvaW50c09uY2Uodmlld2VyLCBkYXRhc2V0LmlkLCBwb3NpdGlvbnMsICEhcmVmKTtcbiAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCAoISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSkgJiYgdmlldy5zaG93SW1hZ2UgIT09IGZhbHNlKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgdGhpcy5zZXRSZWdpb25HcmlkRm9yKGRhdGFzZXQsIHBvc2l0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsbCB0aGUgcmVnaW9uIG92ZXJsYXkgaG93IGZpbmVseSBhIGRyYXduIHZlcnRleCBtYXkgYmUgcGxhY2VkLlxuICAgKlxuICAgKiBSZWdpb24gZ2VvbWV0cnkgaXMgc3RvcmVkIGluIHdob2xlIHdvcmxkIHVuaXRzLCB3aGljaCBpcyByaWdodCB3aGVuIHRoZSB3b3JsZCBJU1xuICAgKiBwaXhlbHMg4oCUIGEgcmVnaW9uIHNob3VsZCBhbGlnbiB0byB0aGVtLiBJdCBpcyB3cm9uZyBmb3IgYSBkYXRhc2V0IHRoYXQgcmVnaXN0ZXJzIG9udG9cbiAgICogbm8gaW1hZ2U6IHNlcUZJU0gncyBvYnNlcnZhdGlvbnMgc3BhbiBhYm91dCA1IHggNyB1bml0cyBpbiB0b3RhbCwgc28gd2hvbGUtdW5pdFxuICAgKiB2ZXJ0aWNlcyBsZWF2ZSByb3VnaGx5IHNpeCBieSBlaWdodCBwbGFjZWFibGUgcG9zaXRpb25zIGFjcm9zcyB0aGUgZW50aXJlIHNhbXBsZSBhbmRcbiAgICogYW4gUk9JIGNhbm5vdCBiZSBkcmF3biBhdCBhbnkgem9vbS4gTm90aGluZyBlcnJvcnM7IHRoZSB0b29sIGp1c3QgY2Fubm90IGV4cHJlc3MgdGhlXG4gICAqIHNoYXBlLlxuICAgKlxuICAgKiBLZXllZCBvbiB3aGV0aGVyIHRoZSBkYXRhc2V0IGJyaW5ncyBQSVhFTFMgcmF0aGVyIHRoYW4gb24gdGhlIGV4dGVudCwgYmVjYXVzZSB0aGVcbiAgICogZXh0ZW50IGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQg4oCUIDIsMDAwIHVuaXRzIGlzIGEgc21hbGwgc2xpZGUgb3IgYSBsYXJnZSBzZWN0aW9uXG4gICAqIGRlcGVuZGluZyBvbmx5IG9uIHdoYXQgdGhlIHVuaXRzIGFyZSwgYW5kIG9ubHkgdGhlIGRhdGFzZXQga25vd3MuXG4gICAqL1xuICBwcml2YXRlIHNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMucmVnaW9uT3ZlcmxheTtcbiAgICBpZiAoIW92ZXJsYXk/LnNldFdvcmxkUXVhbnR1bSkgcmV0dXJuO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8IGRhdGFzZXQudm9sdW1lKSB7XG4gICAgICBvdmVybGF5LnNldFdvcmxkUXVhbnR1bShQSVhFTF9XT1JMRF9RVUFOVFVNKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTsgbGV0IG1heFggPSAtSW5maW5pdHk7IGxldCBtaW5ZID0gSW5maW5pdHk7IGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCB4ID0gcG9zaXRpb25zW2ldO1xuICAgICAgY29uc3QgeSA9IHBvc2l0aW9uc1tpICsgMV07XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSBjb250aW51ZTtcbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgfVxuICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKHdvcmxkUXVhbnR1bUZvckV4dGVudChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmFtZSB0aGUgMkQgY2FtZXJhIG9uIHRoZSBvYnNlcnZhdGlvbnMsIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAqXG4gICAqIFRoZSAyRCBjYW1lcmEgaXMgbm9ybWFsbHkgZml0dGVkIHRvIHRoZSBJTUFHRSwgYmVjYXVzZSB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpbiB0aGF0XG4gICAqIGltYWdlJ3MgcGl4ZWwgc3BhY2UgYW5kIGZyYW1pbmcgdGhlIGltYWdlIGZyYW1lcyB0aGVtIHRvby4gQSBkYXRhc2V0IHdpdGggbm9cbiAgICogcmVmZXJlbmNlIGltYWdlIGhhcyBjb29yZGluYXRlcyBpbiBpdHMgb3duIHVuaXRzIGluc3RlYWQg4oCUIHNlcUZJU0gncyBzcGFuIGFib3V0XG4gICAqIDV4NyDigJQgc28gdGhlIGltYWdlIGZyYW1pbmcgbGVmdCBvdmVyIGZyb20gd2hhdGV2ZXIgd2FzIG9uIHNjcmVlbiBiZWZvcmUgcHV0cyB0aGVcbiAgICogd2hvbGUgY2xvdWQgb2Zmc2NyZWVuOiBtZWFzdXJlZCBhdCA5LjcgeCAxMy40IFBJWEVMUywgY2VudHJlZCAyNTZweCBmcm9tIHdoZXJlIHRoZVxuICAgKiBjYW1lcmEgd2FzIGxvb2tpbmcuIFRoZSBwb2ludHMgYXJlIGFsbCB0aGVyZSBhbmQgZHJhd247IHRoZXkgYXJlIGEgc3BlY2suIFdoaWNoXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZGF0YXNldCBoYXZpbmcgZmFpbGVkIHRvIGxvYWQuXG4gICAqXG4gICAqIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZyxcbiAgICogc2xpY2luZyBvciBwaWNraW5nIGEgZ2VuZSByZS1hZGRzIHRoaXMgbGF5ZXIsIGFuZCByZS1mcmFtaW5nIG9uIHRob3NlIHdvdWxkIG1vdmVcbiAgICogdGhlIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZVxuICAgKiB0aGUgb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICovXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpbWFnZSBsYXllciBmb3IgYSBkYXRhc2V0IHRoYXQgYnJpbmdzIG5vIGltYWdlIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgdmlld2VyIGtlZXBzIHdoYXRldmVyIGltYWdlIHdhcyBsYXN0IGxvYWRlZCwgYW5kIGZvciBhIGRhdGFzZXQgdGhhdFxuICAgKiByZWdpc3RlcnMgb250byBub25lIHRoYXQgcGljdHVyZSBiZWxvbmdzIHRvIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5IOKAlCB0aGUgZXhhbXBsZSdzXG4gICAqIGRlZmF1bHQgc2xpZGUsIHNheS4gSXQgaXMgbm90IG1lcmVseSBpcnJlbGV2YW50OiB0aGUgdHdvIGxpdmUgaW4gZGlmZmVyZW50IGNvb3JkaW5hdGVcbiAgICogc3BhY2VzIChpbWFnZSBwaXhlbHMgYWdhaW5zdCB0aGUgZW1iZWRkaW5nJ3Mgb3duIHVuaXRzKSwgc28gdGhlIGxlZnRvdmVyIGlzIG1hZ25pZmllZFxuICAgKiByb3VnaGx5IGEgaHVuZHJlZGZvbGQuIEF0IHRoZSBmaXR0ZWQgem9vbSB0aGUgY2FtZXJhIHNpdHMgaW5zaWRlIGl0cyBjb3JuZXIsIHdoZXJlIGl0XG4gICAqIHJlYWRzIGFzIGJsYW5rIGJhY2tncm91bmQsIGFuZCBpdCBhcHBlYXJzIG9ubHkgb25jZSB5b3Ugem9vbSBvdXQgZmFyIGVub3VnaCB0byBmaW5kXG4gICAqIGl0IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBpdCBnZXRzIG5vdGljZWQuXG4gICAqXG4gICAqIEhpZGRlbiByYXRoZXIgdGhhbiByZW1vdmVkLCBhbmQgaGlkZGVuIEhFUkUgcmF0aGVyIHRoYW4gYnkgY2xlYXJpbmcgdGhlIGhvc3QncyBpbWFnZVxuICAgKiBzdGF0ZTogdGhhdCBzdGF0ZSBkcml2ZXMgdGhlIHdob2xlIHJlbmRlciBwaXBlbGluZSwgaW5jbHVkaW5nIGEgUGxvdGx5IGJhY2tlbmQgd2hvc2VcbiAgICogZmllbGRzIGFyZSBkZWNsYXJlZCB3aXRoIGRlZmluaXRlLWFzc2lnbm1lbnQgYXNzZXJ0aW9ucywgc28gZW1wdHlpbmcgaXQgdGhyb3dzIGZyb21cbiAgICogd2hpY2hldmVyIGZpZWxkIHRoZSBuZXh0IHBhdGggaGFwcGVucyB0byByZWFkLiBUaGlzIHRvdWNoZXMgb25lIGxheWVyJ3MgdmlzaWJpbGl0eVxuICAgKiBhbmQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlRm9yZWlnbkltYWdlKHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SGFzUGl4ZWxzOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gTm8gaW1hZ2Ugb2YgaXRzIG93biDihpIgbm90aGluZyBmb3IgYW4gb3ZlcnZpZXcgdG8gc2hvdyBlaXRoZXIuXG4gICAgdGhpcy5uYXZpZ2F0b3I/LnNldFZpc2libGUoZGF0YXNldEhhc1BpeGVscyAmJiB0aGlzLm5hdmlnYXRvclZpc2libGUpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2Ygdmlld2VyLmxheWVycy5pdGVtcykge1xuICAgICAgaWYgKGxheWVyLmtpbmQgIT09ICdpbWFnZScpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIHRyYW5zY3JpcHQtZGVuc2l0eSByYXN0ZXIgaXMgYW4gaW1hZ2UgbGF5ZXIgdG9vLCBidXQgaXQgaXMgZGF0YSwgbm90IHRoZVxuICAgICAgLy8gdGlzc3VlOiB0aGUgSW1hZ2VzIHRvZ2dsZSBtdXN0IG5vdCB0YWtlIGl0IGRvd24gd2l0aCB0aGUgc2xpZGUuXG4gICAgICBpZiAodGhpcy5zcGF0aWFsVGlsZXNNZ3I/Lm93bnMobGF5ZXIpKSBjb250aW51ZTtcbiAgICAgIC8vIFJlLXNob3duIHdoZW4gYSBkYXRhc2V0IHRoYXQgb3ducyBhbiBpbWFnZSBjb21lcyBiYWNrLCBzbyBzd2l0Y2hpbmcgYmV0d2VlblxuICAgICAgLy8gZGF0YXNldHMgZG9lcyBub3QgbGVhdmUgdGhlIHRpc3N1ZSBwZXJtYW5lbnRseSBoaWRkZW4uXG4gICAgICBsYXllci52aXNpYmxlID0gZGF0YXNldEhhc1BpeGVscztcbiAgICB9XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZnJhbWVTcGF0aWFsUG9pbnRzT25jZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldElkOiBzdHJpbmcsIHBvc2l0aW9uczogRmxvYXQzMkFycmF5LCByZWdpc3RlcmVkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICAvLyBHYXRlZCBvbiB3aGV0aGVyIFRISVMgZGF0YXNldCByZWdpc3RlcnMgb250byBhbiBpbWFnZSwgbm90IG9uIGBpbWFnZVdgL2BpbWFnZUhgOlxuICAgIC8vIHRob3NlIGtlZXAgdGhlIGxhc3QgcGxvdHRlZCBpbWFnZSdzIGRpbWVuc2lvbnMgYWZ0ZXIgdGhlIGhvc3QgY2xlYXJzIGl0LCBzbyBhXG4gICAgLy8gc3RhbGUgNTEyeDM4MyByZWFkIGFzIFwidGhlcmUgaXMgYW4gaW1hZ2VcIiBhbmQgc2tpcHBlZCB0aGUgZnJhbWluZyBlbnRpcmVseS5cbiAgICBpZiAocmVnaXN0ZXJlZCkgcmV0dXJuO1xuICAgIC8vIE9uY2UgcGVyIGRhdGFzZXQsIGFzIG5hcGFyaS1qcydzIGBmaXQzZDogJ29uY2UnYCBkb2VzIGZvciB0aGUgY2xvdWQ6IHJlLWNvbG91cmluZywgc2xpY2luZ1xuICAgIC8vIG9yIHBpY2tpbmcgYSBnZW5lIHJlLWFkZHMgdGhpcyBsYXllciwgYW5kIHJlLWZyYW1pbmcgb24gdGhvc2Ugd291bGQgbW92ZSB0aGVcbiAgICAvLyBjYW1lcmEgdW5kZXIgdGhlIHVzZXIg4oCUIHRoZSBjYW1lcmEgdG9vbHMgYW5kIHRoZSBjYW52YXMgZHJhZyBhcmUgbWVhbnQgdG8gYmUgdGhlXG4gICAgLy8gb25seSB0aGluZ3MgdGhhdCBkby5cbiAgICBpZiAodGhpcy5zcGF0aWFsMmRGcmFtZWQ/LnZpZXdlciA9PT0gdmlld2VyXG4gICAgICAmJiB0aGlzLnNwYXRpYWwyZEZyYW1lZC5kYXRhc2V0SWQgPT09IGRhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZml0ID0gZnJhbWVQb3NpdGlvbnMoXG4gICAgICBwb3NpdGlvbnMsIHRoaXMuY2FudmFzPy5jbGllbnRXaWR0aCA/PyAwLCB0aGlzLmNhbnZhcz8uY2xpZW50SGVpZ2h0ID8/IDAsXG4gICAgKTtcbiAgICAvLyBOdWxsIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJhbWUgb247IGxlYXZlIHRoZSBjYW1lcmEgd2hlcmUgaXQgaXMgcmF0aGVyXG4gICAgLy8gdGhhbiBtb3ZpbmcgdGhlIHZpZXcgZm9yIGEgZGF0YXNldCB3ZSBjYW5ub3QgZml0LlxuICAgIGlmICghZml0KSByZXR1cm47XG4gICAgdmlld2VyLmNhbWVyYS5zZXQoZml0LmNlbnRlciwgZml0Lnpvb20gPz8gdmlld2VyLmNhbWVyYS56b29tKTtcbiAgICB0aGlzLnNwYXRpYWwyZEZyYW1lZCA9IHsgdmlld2VyLCBkYXRhc2V0SWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgKipnZW5lIG1hcCoqOiB0aGUgYWN0aXZlIGdlbmUncyBleHByZXNzaW9uIGFzIGEgY29udGludW91cyBmaWVsZCBkcmF3biB1bmRlclxuICAgKiB0aGUgY2VsbHMuXG4gICAqXG4gICAqIEEgc2NhdHRlciBjb2xvdXJlZCBieSBhIGdlbmUgc2F5cyB3aGljaCBjZWxscyBleHByZXNzIGl0OyBpdCBjYW5ub3Qgc2F5IHdoZXJlLFxuICAgKiBiZWNhdXNlIHRoZSBleWUgd2lsbCBub3QgaW50ZWdyYXRlIHRob3VzYW5kcyBvZiBkb3RzIGludG8gYSB0ZXJyaXRvcnkuIFRoZSBmaWVsZFxuICAgKiBpcyBhIGtlcm5lbC13ZWlnaHRlZCBNRUFOIHBlciBjZWxsIChzZWUgYHNwYXRpYWwtZXhwcmVzc2lvbi50c2ApLCBzbyBhIGRlbnNlXG4gICAqIHJlZ2lvbiBkb2VzIG5vdCBnbG93IG1lcmVseSBmb3IgYmVpbmcgZGVuc2UsIGFuZCBpdCBpcyB0cmFuc3BhcmVudCB3aGVyZXZlciBub1xuICAgKiBjZWxsIHdhcyBtZWFzdXJlZCDigJQgYW4gdW5zYW1wbGVkIGdhcCBtdXN0IG5vdCByZWFkIGFzIFwibm90IGV4cHJlc3NlZFwiLlxuICAgKlxuICAgKiBJdCBzaGFyZXMgdGhlIHBvaW50cycgTFVULCBwZXJjZW50aWxlIHdpbmRvdyBhbmQgbG9nIGZsYWcsIHNvIHRoZSBsYXllciB1bmRlclxuICAgKiB0aGUgY2VsbHMgYW5kIHRoZSBjZWxscyB0aGVtc2VsdmVzIGNhbm5vdCBkaXNhZ3JlZSBhYm91dCB3aGF0IGEgY29sb3VyIG1lYW5zLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIERJU1BMQVlFRCBpbWFnZSdzIHBpeGVsIGdyaWQsIGNvYXJzZW5lZCBzbyB0aGUgbG9uZyBzaWRlIGlzIGF0XG4gICAqIG1vc3Qge0BsaW5rIEdFTkVfTUFQX01BWF9TSURFfTogYSBzbW9vdGggZmllbGQgZ2FpbnMgbm90aGluZyBmcm9tIGEgc2xpZGUncyBmdWxsXG4gICAqIHJlc29sdXRpb24uIEZvciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGF0IGdyaWQgaXMgdGhlIGN1cnJlbnQgc2xpY2UsIGFuZCBvbmx5XG4gICAqIHRoYXQgcGxhbmUncyBvYnNlcnZhdGlvbnMgYXJlIGluY2x1ZGVkIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBtYXJrZXJzIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcChcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBzbGFiOiB7IHJlZjogU3BhdGlhbEltYWdlUmVmOyBpbmRpY2VzOiBVaW50MzJBcnJheTsgc2xpY2U6IG51bWJlciB9IHwgbnVsbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG5cbiAgICAvLyBUd28gY2xvY2tzOiB0aGUgRklFTEQgZGVwZW5kcyBvbiB0aGUgZ2VuZSwgdGhlIHBsYW5lIGFuZCB0aGUgYmFuZHdpZHRoLCB3aGlsZVxuICAgIC8vIHRoZSBjb2xvdXJzIGRlcGVuZCBvbiB0aGUgd2luZG93LCB0aGUgbG9nIGZsYWcgYW5kIHRoZSBvcGFjaXR5LiBSZWNvbG91cmluZyBhXG4gICAgLy8gY2FjaGVkIGZpZWxkIGlzIGEgZnJhY3Rpb24gb2YgZXN0aW1hdGluZyBvbmUuXG4gICAgY29uc3QgZmllbGRLZXkgPSBnZW5lXG4gICAgICA/IFtkYXRhc2V0LmlkLCBnZW5lLCBzbGFiPy5zbGljZSA/PyAnJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgIGZpZWxkS2V5LCBjbGlwLmpvaW4oJywnKSwgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHRoaXMuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICAvLyBBTlkgY2hhbmdlIGhlcmUgY2hhbmdlcyB0aGUgb3JkZXIgdGhlIGNlbGxzIGhhdmUgdG8gc2l0IGFib3ZlIOKAlCBpbmNsdWRpbmcgdGhlXG4gICAgLy8gZmlyc3Qgb25lLCB3aGVyZSB0aGVyZSBpcyBubyBwcmV2aW91cyBsYXllciB0byByZW1vdmUg4oCUIGFuZCB0aGUgbGF5ZXIgbGlzdCBpc1xuICAgIC8vIGFwcGVuZC1vbmx5LiBTbyBkcm9wIHRoZSBtYXJrZXJzIHVuY29uZGl0aW9uYWxseSBhbmQgbGV0IHRoZSByZWJ1aWxkIGJlbG93IHB1dFxuICAgIC8vIHRoZW0gYmFjayBvbiB0b3A7IG90aGVyd2lzZSB0aGUgZmllbGQgaXMgYXBwZW5kZWQgb3ZlciB0aGUgbWVhc3VyZW1lbnQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50cykge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsUG9pbnRzKTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcEtleSA9IGtleTtcbiAgICBpZiAoIWtleSB8fCAhZ2VuZSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGQgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lTWFwRmllbGRLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSByYXN0ZXIgY292ZXJzIHRoZSBkaXNwbGF5ZWQgaW1hZ2U7IHdpdGhvdXQgb25lIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAvLyBvdmVybGF5IGFuZCB0aGUgY2xvdWQgaXMgdGhlIDNEIG1vZGUncyBidXNpbmVzcywgbm90IHRoaXMgb25lJ3MuXG4gICAgY29uc3QgaW1hZ2VXID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS53aWR0aCA6IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGltYWdlSCA9IHNsYWIgPyBkYXRhc2V0LnZvbHVtZSEuaGVpZ2h0IDogdGhpcy5pbWFnZUg7XG4gICAgaWYgKCFpbWFnZVcgfHwgIWltYWdlSCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLm1heChcbiAgICAgIDEsXG4gICAgICBNYXRoLmNlaWwoTWF0aC5tYXgoaW1hZ2VXLCBpbWFnZUgpIC8gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfTUFYX1NJREUpLFxuICAgICk7XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IHRoaXMuZ2VuZU1hcEZpZWxkS2V5KSB7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmdlbmVNYXBLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZCA9IGV4cHJlc3Npb25GaWVsZChkYXRhc2V0Lm9ic2VydmF0aW9ucywge1xuICAgICAgICByZWY6IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmLFxuICAgICAgICB3aWR0aDogTWF0aC5jZWlsKGltYWdlVyAvIHN0ZXApLFxuICAgICAgICBoZWlnaHQ6IE1hdGguY2VpbChpbWFnZUggLyBzdGVwKSxcbiAgICAgICAgc3RlcCxcbiAgICAgICAgc2lnbWE6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIC8vIEEgcGxhbmUgd2lucyBvdmVyIGEgc2VsZWN0aW9uOiB0aGUgMkQgdmlldyBpcyBzaG93aW5nIG9uZSBzZWN0aW9uLCBzbyBhXG4gICAgICAgIC8vIGZpZWxkIHNwYW5uaW5nIHRoZSBzcGVjaW1lbidzIGRlcHRoIHdvdWxkIG5vdCBiZSB0aGUgdGhpbmcgb24gc2NyZWVuLlxuICAgICAgICBpbmRpY2VzOiBzbGFiPy5pbmRpY2VzID8/IGluU2VsZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZEtleSA9IGZpZWxkS2V5O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2VuZU1hcEZpZWxkO1xuICAgIGlmICghZmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JFeHByZXNzaW9uRmllbGQoZmllbGQsIGx1dCwgW2xvLCBoaV0sIHtcbiAgICAgIGxvZzogdmlldy5sb2dTY2FsZSxcbiAgICAgIC8vIFRoZSBNQVAncyBvd24gb3BhY2l0eTogcmVhZGluZyBhIGZpZWxkIHVuZGVyIHRoZSBjZWxscyBtZWFucyB0dXJuaW5nIHRoZVxuICAgICAgLy8gY2VsbHMgZG93biwgd2hpY2ggbXVzdCBub3QgdGFrZSB0aGUgZmllbGQgd2l0aCB0aGVtLlxuICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICB9KTtcbiAgICB0aGlzLmdlbmVNYXBMYXllciA9IHZpZXdlci5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IGZpZWxkLndpZHRoLCBoZWlnaHQ6IGZpZWxkLmhlaWdodCwgY2hhbm5lbHM6IDQsIGR0eXBlOiAndWludDgnLCBkYXRhOiByZ2JhIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9YCxcbiAgICAgICAgc2NhbGU6IFtzdGVwLCBzdGVwXSxcbiAgICAgICAgdHJhbnNsYXRlOiBbMCwgMF0sXG4gICAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgfSxcbiAgICApO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYW5lIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IGlzIGN1cnJlbnRseSBzaG93aW5nOiBpdHMgcGl4ZWwgYWZmaW5lLCB0aGVcbiAgICogb2JzZXJ2YXRpb25zIHRoYXQgZmFsbCBpbiBpdCwgYW5kIHRoZSBtYXJrZXIgZmxvb3IgdGhhdCBncmlkIG5lZWRzLlxuICAgKlxuICAgKiBOdWxsIGZvciBhIGRhdGFzZXQgd2l0aCBhIHJlYWwgYGltYWdlUmVmYCAoaXRzIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IHRoZVxuICAgKiBpbWFnZSdzIHBpeGVscyBhbmQgZXZlcnkgb2JzZXJ2YXRpb24gYmVsb25ncyB0byB0aGUgb25lIHNlY3Rpb24pIGFuZCBmb3Igb25lXG4gICAqIHdpdGggbm8gdm9sdW1lIGF0IGFsbCDigJQgYm90aCBvZiB3aGljaCBkcmF3IGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2xhYihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCk6IHtcbiAgICByZWY6IFNwYXRpYWxJbWFnZVJlZjsgaW5kaWNlczogVWludDMyQXJyYXk7IHNsaWNlOiBudW1iZXI7IG1pbkRpYW1ldGVyOiBudW1iZXI7XG4gIH0gfCBudWxsIHtcbiAgICBjb25zdCB2b2x1bWUgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBpZiAoZGF0YXNldC5pbWFnZVJlZiB8fCAhdm9sdW1lKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZjogdm9sdW1lSW1hZ2VSZWYodm9sdW1lLCBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0KSxcbiAgICAgIGluZGljZXM6IG9ic2VydmF0aW9uc0luU2xpY2UoZGF0YXNldC5vYnNlcnZhdGlvbnMsIHZvbHVtZSwgc2xpY2UpLFxuICAgICAgc2xpY2UsXG4gICAgICBtaW5EaWFtZXRlcjogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggKiB2b2x1bWUudm94ZWxTaXplWzBdLFxuICAgIH07XG4gIH1cblxuICAvKiogUGVyLXBvaW50IGNvbG91cnMgZm9yIHRoZSBkcmF3biBzdWJzZXQuIEEgYnJvYWRjYXN0IHR1cGxlIHN0YXlzIGJyb2FkY2FzdCDigJRcbiAgICogIGl0IGlzIG9uZSBjb2xvdXIgZm9yIGV2ZXJ5IHBvaW50IGVpdGhlciB3YXkuICovXG4gIHByaXZhdGUgZ2F0aGVyQ29sb3JzPFQ+KGNvbG9yczogVFtdIHwgVCwgaW5kaWNlcz86IFVpbnQzMkFycmF5KTogVFtdIHwgVCB7XG4gICAgaWYgKCFpbmRpY2VzIHx8ICFBcnJheS5pc0FycmF5KGNvbG9ycykpIHJldHVybiBjb2xvcnM7XG4gICAgY29uc3Qgb3V0OiBUW10gPSBuZXcgQXJyYXkoaW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gY29sb3JzW2luZGljZXNbaV1dO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIG92ZXIgYSBmcmVzaGx5IHJlbmRlcmVkIGltYWdlLlxuICAgKlxuICAgKiBUd28gcmVhc29ucywgYm90aCBpbnZpc2libGUgZnJvbSB0aGUgc3BhdGlhbCBzdG9yZSDigJQgd2hpY2ggaXMgd2h5IGEgc2NydWIgb3IgYVxuICAgKiByZS1yZW5kZXIgbmV2ZXIgcmVhY2hlZCB0aGUgbWFya2VycyBvbiBpdHMgb3duOlxuICAgKiAgLSB0aGUgaW1hZ2UgcmVuZGVyIENMRUFSUyB0aGUgbGF5ZXIgbGlzdCwgdGFraW5nIHRoZSBtYXJrZXJzIHdpdGggaXQ7XG4gICAqICAtIG92ZXIgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgdGhlIGRpc3BsYXllZCBwbGFuZSBkZWNpZGVzIHdoaWNoXG4gICAqICAgIG9ic2VydmF0aW9ucyBiZWxvbmcgb24gc2NyZWVuIGF0IGFsbCwgc28gdGhlIGNlbGxzIGhhdmUgdG8gbW92ZSB3aXRoIHRoZVxuICAgKiAgICBzZWN0aW9uIHJhdGhlciB0aGFuIGhhbmcgb3ZlciBhIGRpZmZlcmVudCBvbmUuXG4gICAqXG4gICAqIFVzZXMgdGhlIGxhdGVzdCB2YWx1ZXMgdGhlIG1hcmtlciBzdWJzY3JpcHRpb24gc2F3OyBhIG5vLW9wIHVudGlsIGl0IGhhcyBzZWVuXG4gICAqIGFueSwgaW4gdGhlIDNEIGNsb3VkIChubyBpbWFnZSwgbm8gcGxhbmUpLCBhbmQgd2l0aCBubyBkYXRhc2V0IHRvIGRyYXcuXG4gICAqL1xuICBwcml2YXRlIHJlZHJhd1NwYXRpYWxNYXJrZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhdGVzdCA9IHRoaXMuc3BhdGlhbExhdGVzdDtcbiAgICBpZiAoIWxhdGVzdD8uWzBdIHx8IGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzKC4uLmxhdGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIFNQQVRJQUxfT01JQ1NfM0Qgdmlldzogb2JzZXJ2YXRpb25zIGFzIGEgM0QgcG9pbnQgY2xvdWQgdW5kZXIgdGhlIG9yYml0IGNhbWVyYS5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG11Y2ggdGhpbm5lciB0aGFuIHRoZSAyRCBtb3VudC4gVGhlcmUgaXMgbm8gdGlzc3VlIGltYWdlIHRvIHJlbmRlciAoYSByZWdpc3RlcmVkXG4gICAqIHZvbHVtZSBsaWtlIHRoZSBBbGxlbiBDQ0YgaGFzIG5vIHNpbmdsZSByZWZlcmVuY2UgcGxhbmUpLCBzbyBubyBzY2FsZSBiYXIsIG5vIHJlYWRiYWNrLCBhbmQgbm9cbiAgICogMkQgaW50ZXJhY3Rpb24gc3RhY2sg4oCUIHRoZSByZWdpb24gdG9vbHMgZHJhdyBpbiBzY3JlZW4gc3BhY2UgYW5kIGhhdmUgbm8gbWVhbmluZyBhZ2FpbnN0IGFuXG4gICAqIG9yYml0aW5nIGNhbWVyYSwgd2hpY2ggaXMgd2h5IGBTZWxlY3QgZnJvbSBST0lzYCBpcyBoaWRkZW4gaW4gdGhpcyBtb2RlLiBgYWRkUG9pbnRzM0RgIHB1dHNcbiAgICogdGhlIHZpZXdlciBpbiAzRCBhbmQgZnJhbWVzIHRoZSBjYW1lcmEgb24gdGhlIGNsb3VkIGl0c2VsZi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTcGF0aWFsT21pY3MzZCh2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluc3RhbGwzZEludGVyYWN0aW9uKHZpZXdlciwgaG9zdCk7XG4gICAgdGhpcy5pbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3QpO1xuICAgIHRoaXMuc3Vic2NyaWJlU3BhdGlhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIGJhciBmb3IgdGhlIDNEIGNsb3VkLCBtZWFzdXJlZCBhdCB0aGUgT1JCSVQgUElWT1QuXG4gICAqXG4gICAqIEEgcGVyc3BlY3RpdmUgY2FtZXJhIGhhcyBubyBzaW5nbGUgc2NhbGUg4oCUIHRoaW5ncyBmYXJ0aGVyIGF3YXkgYXJlIHNtYWxsZXIg4oCUIHNvIGEgYmFyIGNhblxuICAgKiBvbmx5IGJlIHRydWUgYXQgb25lIGRlcHRoLiBUaGUgcGl2b3QgaXMgdGhlIGhvbmVzdCBjaG9pY2U6IGl0IGlzIHdoYXQgdGhlIGNhbWVyYSBpcyBmcmFtaW5nLFxuICAgKiB3aGF0IGEgem9vbSBtb3ZlcyB0b3dhcmRzLCBhbmQgd2hlcmUgdGhlIGV5ZSBpcyBhbnl3YXkuIG5hcGFyaSdzIG93biAzRCBzY2FsZSBiYXIgd29ya3MgdGhlXG4gICAqIHNhbWUgd2F5LlxuICAgKlxuICAgKiBgTmFwYXJpU2NhbGVCYXJgIG5lZWRzIENTUyBweCBwZXIgd29ybGQgdW5pdCwgd2hpY2ggYW4gb3JiaXQgY2FtZXJhIGRvZXMgbm90IGV4cG9zZSwgYnV0IGF0XG4gICAqIHRoZSBwaXZvdCBpdCBpcyBleGFjdGx5IGB2aWV3cG9ydEhlaWdodCAvICgyICogZGlzdGFuY2UgKiB0YW4oZm92IC8gMikpYCDigJQgdGhlIHNhbWVcbiAgICogcmVsYXRpb25zaGlwIGBDYW1lcmEzRC5wYW5gIHVzZXMgdG8gdHJhY2sgdGhlIGN1cnNvci4gVGhlIGJhciB0aGVuIGNvbnZlcnRzIHRocm91Z2hcbiAgICogYG1pY3JvbnNQZXJVbml0YCwgYW5kIGRyYXdzIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIGRhdGFzZXQgZG9lcyBub3QgZGVjbGFyZSBvbmUsIGJlY2F1c2UgYVxuICAgKiBiYXIgbGFiZWxsZWQgaW4gbWljcm9ucyBvdmVyIHVua25vd24gdW5pdHMgd291bGQgcmVhZCBhcyBhIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbDNkU2NhbGVCYXIodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICB0aGlzLm5hdmlnYXRvcj8uZGVzdHJveSgpO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICBjb25zdCBtaWNyb25zUGVyVW5pdCA9IGRhdGFzZXQ/Lm1pY3JvbnNQZXJVbml0O1xuICAgIGlmICghdGhpcy5ob3N0IHx8ICFtaWNyb25zUGVyVW5pdCB8fCBtaWNyb25zUGVyVW5pdCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICBjb25zdCBjYW0gPSB2aWV3ZXIuY2FtZXJhM2Q7XG4gICAgY29uc3Qgc2hpbTogU2NhbGVCYXJDYW1lcmEgPSB7XG4gICAgICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoID0gY2FudmFzPy5jbGllbnRIZWlnaHQgfHwgY2FudmFzPy5oZWlnaHQgfHwgMDtcbiAgICAgICAgY29uc3Qgd29ybGRQZXJQeCA9ICgyICogY2FtLmRpc3RhbmNlICogTWF0aC50YW4oY2FtLmZvdiAvIDIpKSAvIChoIHx8IDEpO1xuICAgICAgICByZXR1cm4gd29ybGRQZXJQeCA+IDAgPyAxIC8gd29ybGRQZXJQeCA6IDA7XG4gICAgICB9LFxuICAgICAgY2hhbmdlZDogY2FtLmNoYW5nZWQsXG4gICAgfTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE5hcGFyaVNjYWxlQmFyKHRoaXMuaG9zdCwgc2hpbSwgbWljcm9uc1BlclVuaXQpO1xuICB9XG5cbiAgLyoqIEJhc2UgbWFya2VyIGRpYW1ldGVyIGZvciB0aGUgM0QgY2xvdWQsIGluIFNDUkVFTiBwaXhlbHMgKHRoZSBsYXllcidzIHVuaXQpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMXzNEX0JBU0VfU0laRSA9IDM7XG5cbiAgLyoqIChSZSlidWlsZCB0aGUgM0QgcG9pbnQgY2xvdWQgZm9yIHRoZSBjdXJyZW50IGRhdGFzZXQgKyB2aWV3IHN0YXRlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2FsYXIgZW5jb2RpbmcgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZSwgZm9yIHRoZSBzYW1lIHJlYXNvblxuICAgIC8vIHRoZSAyRCBwYXRoIGRvZXM6IGEgZ2VuZSBmZXRjaCBjYW4gZmFpbCBvciBiZSBzdXBlcnNlZGVkLCBhbmQgZHJvcHBpbmcgdGhlXG4gICAgLy8gbGF5ZXIgZmlyc3Qgd291bGQgYmxhbmsgdGhlIHZpZXcuXG4gICAgbGV0IGVuYzogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZGF0YXNldCkge1xuICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nKys7XG4gICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICB0cnkge1xuICAgICAgICBlbmMgPSBhd2FpdCB0aGlzLnNwYXRpYWxTY2FsYXIzZChkYXRhc2V0LCB2aWV3KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgM0QgY29sb3VyaW5nIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIGEgZmxhdCBjb2xvdXInLCBlcnIpO1xuICAgICAgICBlbmMgPSBudWxsO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nLS07XG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2JzID0gZGF0YXNldD8ub2JzZXJ2YXRpb25zO1xuICAgIC8vIE5vIHogbWVhbnMgbm90aGluZyB0byBkcmF3IGluIDNELiBUaGUgcGxvdCB0eXBlIGlzIGdhdGVkIG9uIGByZXF1aXJlc1NwYXRpYWwzZGBcbiAgICAvLyBzbyB0aGlzIHNob3VsZCBiZSB1bnJlYWNoYWJsZSBmcm9tIHRoZSBVSSwgYnV0IGEgaG9zdCBjYW4gc2V0IHRoZSB0eXBlIGRpcmVjdGx5LlxuICAgIGlmICghZGF0YXNldCB8fCAhb2JzIHx8IG9icy5jb3VudCA9PT0gMCB8fCAhb2JzLnopIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BhdGlhbDNkTGF5ZXJzKHZpZXdlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQW5hdG9teSBmaXJzdDogb24gYSBzY2VuZSdzIEZJUlNUIGxheWVyIG5hcGFyaSBmcmFtZXMgdGhlIG9yYml0IGNhbWVyYSwgYW5kXG4gICAgLy8gdGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgdGhlIGZyYW1pbmcgd2Ugd2FudCDigJQgdGhlIGJyYWluLCBub3QgdGhlIG91dGVybW9zdFxuICAgIC8vIHN0cmF5IHNlZ21lbnRhdGlvbi4gRXZlcnkgbGF0ZXIgYWRkIGtlZXBzIHRoZSBwb3NlIGluc3RlYWQgKG5hcGFyaS1qcyBgZml0M2Q6ICdvbmNlJ2ApLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3BhdGlhbFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5zcGF0aWFsUmVidWlsZFRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcbiAgICAvLyBUaGVuIHRoZSBjbHVzdGVyIGRlbnNpdHkgdm9sdW1lcywgd2hpY2ggY2FuIHNldCB0aGUgY2VudHJpbmcgb2Zmc2V0IHdoZW5cbiAgICAvLyB0aGVyZSBpcyBubyByZWZlcmVuY2Ugdm9sdW1lIOKAlCBzbyBiZWZvcmUgYW55IHBvc2l0aW9uIGlzIGNvbXB1dGVkIGZyb20gaXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEZW5zaXR5Vm9sdW1lcyh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFRoZW4gdGhlIGdlbmUgbWFwLCB3aGljaCBzaGFyZXMgdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBsYXR0aWNlIOKAlCBzbyBpdCBnb2VzXG4gICAgLy8gYWZ0ZXIgYW55dGhpbmcgdGhhdCBjYW4gc3RpbGwgbW92ZSB0aGUgY2VudHJpbmcgb2Zmc2V0LlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlR2VuZU1hcFZvbHVtZSh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFNjYWxlIGRlcGVuZHMgb24gdGhlIGRhdGFzZXQncyBkZWNsYXJlZCB1bml0LCBzbyBpdCB3YWl0cyBmb3IgdGhlIGRhdGFzZXRcbiAgICAvLyByYXRoZXIgdGhhbiBiZWluZyBzZXQgdXAgYXQgbW91bnQgdGltZS5cbiAgICBpZiAoZGF0YXNldC5pZCAhPT0gdGhpcy5zcGF0aWFsU2NhbGVCYXJLZXkpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFNjYWxlQmFyS2V5ID0gZGF0YXNldC5pZDtcbiAgICAgIHRoaXMuaW5zdGFsbFNwYXRpYWwzZFNjYWxlQmFyKHZpZXdlciwgZGF0YXNldCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlZmVyZW5jZSB2b2x1bWUgaXMgaGlkZGVuLCBub3QgcmVtb3ZlZDogaXQgYWxzbyBmaXhlcyB0aGUgY2VudHJpbmdcbiAgICAvLyBvZmZzZXQgZXZlcnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSwgYW5kIHJlLWZldGNoaW5nIGEgMTAwIE1CIHRlbXBsYXRlXG4gICAgLy8gdG8gdW4taGlkZSBpdCB3b3VsZCBtYWtlIGEgY2hlY2tib3ggZmVlbCBsaWtlIGEgbG9hZC5cbiAgICBpZiAodGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWUudmlzaWJsZSA9IHZpZXcuc2hvd1ZvbHVtZTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZS5vcGFjaXR5ID0gdmlldy52b2x1bWVPcGFjaXR5O1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlID0gdmlldy5wb2ludFNjYWxlID4gMCA/IHZpZXcucG9pbnRTY2FsZSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfM0RfQkFTRV9TSVpFICogc2NhbGU7XG4gICAgY29uc3Qgc2NhbGFycyA9IGVuYz8udmFsdWVzID8/IG5ldyBGbG9hdDMyQXJyYXkob2JzLmNvdW50KTtcbiAgICBjb25zdCBjb2xvcm1hcCA9IGVuYz8uY29sb3JtYXAgPz8gdGhpcy5zcGF0aWFsRmxhdENvbG9ybWFwKCk7XG4gICAgY29uc3QgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl0gPSBlbmM/LmNvbnRyYXN0TGltaXRzID8/IFswLCAxXTtcblxuICAgIC8vIE9uZSBpbWFnZWQgc2VjdGlvbiwgb3IgdGhlIHdob2xlIHN0YWNrLiBUaGUgc3Vic2V0IElTIHRoZSBnZW9tZXRyeSwgc28gaXRcbiAgICAvLyBiZWxvbmdzIGluIHRoZSBnZW9tZXRyeSBrZXkgcmF0aGVyIHRoYW4gYmVpbmcgcmUtZGVyaXZlZCBwZXIgZnJhbWUg4oCUIGFuZCBhblxuICAgIC8vIG91dC1vZi1yYW5nZSBpbmRleCBpcyBjbGFtcGVkIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjbG91ZCwgYmVjYXVzZSB0aGVcbiAgICAvLyBzZWN0aW9uIGNvdW50IGNoYW5nZXMgd2l0aCB0aGUgZGF0YXNldCB3aGlsZSB0aGUgdmlldyBzdGF0ZSBwZXJzaXN0cy5cbiAgICBjb25zdCBzZWN0aW9ucyA9IHNlY3Rpb25zT2Yob2JzKTtcbiAgICBjb25zdCBzZWN0aW9uID1cbiAgICAgIHZpZXcucG9pbnRTZWN0aW9uICE9IG51bGwgJiYgc2VjdGlvbnMgJiYgc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICA/IHNlY3Rpb25zW01hdGgubWF4KDAsIE1hdGgubWluKHNlY3Rpb25zLmxlbmd0aCAtIDEsIHZpZXcucG9pbnRTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzaG93biA9IHNlY3Rpb24gIT0gbnVsbCA/IG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnMsIHNlY3Rpb24pIDogbnVsbDtcbiAgICBjb25zdCBzaG93bkNvdW50ID0gc2hvd24gPyBzaG93bi5sZW5ndGggOiBvYnMuY291bnQ7XG5cbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfToke29icy5jb3VudH06JHtzZWN0aW9uID8/ICdhbGwnfWA7XG4gICAgLy8gYFBvaW50czNETGF5ZXIudmFsdWVzYCBpcyByZWFkb25seSBhbmQgdGhlIGxheWVyIGV4cG9zZXMgbm8gZGF0YVZlcnNpb24gdG9cbiAgICAvLyBidW1wLCBzbyB1bmxpa2UgdGhlIDJEIHBhdGggYSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSBjYW5ub3QgYmUgbXV0YXRlZCBpblxuICAgIC8vIOKAlCB0aGUgbGF5ZXIgaGFzIHRvIGJlIHJlYnVpbHQuIE9ubHkgdGhlIHNpemUvb3BhY2l0eS9jb2xvcm1hcCBrbm9icyBhcmVcbiAgICAvLyBnZW51aW5lbHkgZGlzcGxheS1vbmx5LiBTbyB0cmFjayB0aGUgc2NhbGFycycgaWRlbnRpdHkgc2VwYXJhdGVseSBmcm9tIHRoZVxuICAgIC8vIGdlb21ldHJ5J3M6IGBjb2xvckJ5YCBwbHVzIHRoZSB0cmFuc2Zvcm1zIGZlZWRpbmcgdGhlIGVuY29kaW5nLlxuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBzY2FsYXJLZXkgPSBbXG4gICAgICBrZXksXG4gICAgICB2aWV3LmNvbG9yQnkgPyBgJHt2aWV3LmNvbG9yQnkua2luZH06JHt2aWV3LmNvbG9yQnkubmFtZX1gIDogJ2ZsYXQnLFxuICAgICAgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsXG4gICAgICBjbGlwLmpvaW4oJywnKSxcbiAgICBdLmpvaW4oJ3wnKTtcblxuICAgIGlmIChrZXkgIT09IHRoaXMuc3BhdGlhbExheWVyS2V5M2QpIHtcbiAgICAgIC8vIE5ldyBnZW9tZXRyeTogaW50ZXJsZWF2ZSB4LHkseiAodGhlIGxheWVyJ3MgZG9jdW1lbnRlZCBsYXlvdXQsIHgtZmFzdGVzdClcbiAgICAgIC8vIGFuZCBjYWNoZSBpdCwgc28gbGF0ZXIgY29sb3VyIGNoYW5nZXMgcmVidWlsZCB0aGUgbGF5ZXIgd2l0aG91dCB3YWxraW5nXG4gICAgICAvLyB0aGUgb2JzZXJ2YXRpb25zIGFnYWluLlxuICAgICAgY29uc3QgW294LCBveSwgb3pdID0gdGhpcy5zcGF0aWFsT3JpZ2luM2Q7XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQgKiAzKTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzXSA9IG9icy54W2ldICsgb3g7XG4gICAgICAgIHBvc2l0aW9uc1trICogMyArIDFdID0gb2JzLnlbaV0gKyBveTtcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzICsgMl0gPSBvYnMueltpXSArIG96O1xuICAgICAgfVxuICAgICAgdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QgPSBwb3NpdGlvbnM7XG4gICAgICB0aGlzLnNwYXRpYWxEcmF3bjNkID0gc2hvd247XG4gICAgfVxuXG4gICAgLy8gVGhlIHNjYWxhcnMgaGF2ZSB0byBmb2xsb3cgdGhlIGdlb21ldHJ5OiBhIHBlci1vYnNlcnZhdGlvbiB2ZWN0b3IgYWdhaW5zdCBvbmVcbiAgICAvLyBzZWN0aW9uJ3MgcG9zaXRpb25zIHdvdWxkIGNvbG91ciBlYWNoIGNlbGwgYnkgYSBzdHJhbmdlcidzIHZhbHVlLlxuICAgIGNvbnN0IHZhbHVlc0ZvciA9ICgpID0+IChzaG93biA/IEZsb2F0MzJBcnJheS5mcm9tKHNob3duLCAoaSkgPT4gc2NhbGFyc1tpXSkgOiBzY2FsYXJzKTtcblxuICAgIGlmICghdGhpcy5zcGF0aWFsUG9pbnRzM2QgfHwga2V5ICE9PSB0aGlzLnNwYXRpYWxMYXllcktleTNkKSB7XG4gICAgICAvLyBOZXcgR0VPTUVUUlkg4oCUIGEgZGlmZmVyZW50IGRhdGFzZXQsIG9yIGEgZGlmZmVyZW50IHNlY3Rpb24g4oCUIHNvIGEgbmV3IGxheWVyLlxuICAgICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50czNkKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMzZCk7XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0ga2V5O1xuICAgICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBzY2FsYXJLZXk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IHZpZXdlci5hZGRQb2ludHMzRCh0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCEsIHZhbHVlc0ZvcigpLCB7XG4gICAgICAgIG5hbWU6ICdvYnNlcnZhdGlvbnMnLFxuICAgICAgICBjb2xvcm1hcCxcbiAgICAgICAgY29udHJhc3RMaW1pdHMsXG4gICAgICAgIHNpemUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjYWxhcktleSAhPT0gdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QpIHtcbiAgICAgICAgLy8gQSBjaGFuZ2Ugb2YgY29sb3VyIFNPVVJDRSwgd2hpY2ggdXNlZCB0byBtZWFuIGRpc2NhcmRpbmcgdGhlIGxheWVyIGFuZCBidWlsZGluZ1xuICAgICAgICAvLyBhbm90aGVyIOKAlCBhbmQsIGJlY2F1c2UgYWRkaW5nIGEgM0QgbGF5ZXIgcmVmcmFtZXMsIGEgY2FtZXJhIGp1bXAgdG8gdW5kbyBhcyB3ZWxsLlxuICAgICAgICAvLyBuYXBhcmktanMg4omlIDAuMTQgbGV0cyB0aGUgc2NhbGFycyBiZSByZXBsYWNlZCBpbiBwbGFjZSDigJQgdGhlIHNldHRlciBidW1wcyB0aGVcbiAgICAgICAgLy8gbGF5ZXIncyBkYXRhVmVyc2lvbiBzbyB0aGUgdmlzdWFsIHJlLXVwbG9hZHMg4oCUIGFuZCB0aGUgcG9zaXRpb25zIGhhdmUgbm90IG1vdmVkLFxuICAgICAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGUgY2FtZXJhIHRvIHJlZnJhbWUuXG4gICAgICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gc2NhbGFyS2V5O1xuICAgICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC52YWx1ZXMgPSB2YWx1ZXNGb3IoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLmNvbG9ybWFwID0gY29sb3JtYXA7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5jb250cmFzdExpbWl0cyA9IGNvbnRyYXN0TGltaXRzO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2Quc2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLy8gU2VsZWN0aW9uIGlzIGEgUEVSLVBPSU5UIGFscGhhLCBpbiB0aGUgb25lIGxheWVyLlxuICAgIC8vXG4gICAgLy8gSXQgdXNlZCB0byBiZSBhIHNlY29uZCBsYXllcjogd2l0aCBhIHNpbmdsZSBvcGFjaXR5IGZvciB0aGUgd2hvbGUgY2xvdWQsIHRoZSBvbmx5IHdheVxuICAgIC8vIHRvIGhpZ2hsaWdodCBhIHN1YnNldCB3YXMgdG8gZHJhdyBpdCBhZ2FpbiBvbiB0b3AgYXQgZnVsbCBvcGFjaXR5IHdoaWxlIHRoZSBwYXJlbnRcbiAgICAvLyBkcm9wcGVkIHRvIHRoZSBtdXRlZCBsZXZlbC4gVGhhdCBzZWNvbmQgbGF5ZXIgaGFkIHRvIGJlIGtlcHQgaW4gc3RlcCB0aHJvdWdoIGV2ZXJ5XG4gICAgLy8gY29sb3JtYXAsIHdpbmRvdyBhbmQgc2l6ZSBjaGFuZ2UsIGFuZCB0aGUgdHdvIHRoZW4gZGVwdGgtc29ydGVkIGFnYWluc3QgZWFjaCBvdGhlciBhc1xuICAgIC8vIHNlcGFyYXRlIGRyYXdzLiBQZXItcG9pbnQgYWxwaGFzIGFuZCBzaXplcyBnaXZlIHRoZSBzYW1lIHJlYWRpbmcg4oCUIG11dGVkIGNsb3VkLCBicmlnaHRcbiAgICAvLyBzZWxlY3Rpb24sIHNsaWdodGx5IGxhcmdlciBzbyBhIHNtYWxsIG9uZSBpcyBmaW5kYWJsZSBpbnNpZGUgMy43TSBwb2ludHMg4oCUIGluIG9uZS5cbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwICYmIHNlbGVjdGlvbi5tYXNrLmxlbmd0aCA9PT0gb2JzLmNvdW50O1xuICAgIGNvbnN0IGNsb3VkID0gdGhpcy5zcGF0aWFsUG9pbnRzM2Q7XG4gICAgaWYgKGNsb3VkKSB7XG4gICAgICBjbG91ZC5vcGFjaXR5ID0gdmlldy5vcGFjaXR5O1xuICAgICAgaWYgKCFoYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgY2xvdWQuYWxwaGFzID0gbnVsbDtcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWxwaGFzID0gbmV3IEZsb2F0MzJBcnJheShzaG93bkNvdW50KTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNob3duQ291bnQ7IGsrKykge1xuICAgICAgICAgIGNvbnN0IGkgPSBzaG93biA/IHNob3duW2tdIDogaztcbiAgICAgICAgICBjb25zdCBwaWNrZWQgPSAhIXNlbGVjdGlvbi5tYXNrW2ldO1xuICAgICAgICAgIGFscGhhc1trXSA9IHBpY2tlZCA/IDEgOiBERUZBVUxUX01VVEVEX09QQUNJVFk7XG4gICAgICAgICAgc2l6ZXNba10gPSBwaWNrZWQgPyBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGNsb3VkLmFscGhhcyA9IGFscGhhcztcbiAgICAgICAgY2xvdWQuc2l6ZXMgPSBzaXplcztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTGFzdCwgc28gaXQgYWxzbyBjb3ZlcnMgYSBsYXllciB0aGlzIHBhc3MganVzdCBjcmVhdGVkLlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMzZCkgdGhpcy5zcGF0aWFsUG9pbnRzM2QudmlzaWJsZSA9IHZpZXcuc2hvd1BvaW50cztcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKjNEIGdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gb3ZlciB0aGUgd2hvbGUgc2VjdGlvbmVkXG4gICAqIHNwZWNpbWVuLCBhcyBvbmUgcmF5bWFyY2hlZCB2b2x1bWUuXG4gICAqXG4gICAqIFR3byB0aGluZ3MgaXQgY2FuIGJlLCBhbmQgdGhlIHBhbmVsJ3MgYFZvbHVtZSByZW5kZXJpbmdgIHRvZ2dsZSBwaWNrcyB3aGljaDpcbiAgICpcbiAgICogIC0gKipzaGVldHMqKiDigJQgZXhhY3RseSB0aGUgcGxhbmVzIHRoYXQgd2VyZSBpbWFnZWQsIGVhY2ggY2FycnlpbmcgdGhhdFxuICAgKiAgICBzbGlkZSdzIG93biAyRCBnZW5lIG1hcCwgd2l0aCB0aGUgZ2FwcyBiZXR3ZWVuIHNlY3Rpb25zIGVtcHR5LiBBIHN0YWNrIG9mXG4gICAqICAgIG1lYXN1cmVkIGZpZWxkcywgYXQgdGhlaXIgdHJ1ZSB6LlxuICAgKiAgLSAqKnZvbHVtZSoqIOKAlCB0aGUgc2FtZSBmaWVsZHMgc21vb3RoZWQgYWxvbmcgeiwgc28gdGhlIHBsYW5lcyBiZXR3ZWVuIHRoZVxuICAgKiAgICBzZWN0aW9ucyBjYXJyeSBhbiBpbnRlcnBvbGF0ZWQgdmFsdWUuIEFuIGVzdGltYXRlLCBhbmQgZHJhd24gYXMgYVxuICAgKiAgICB0cmFuc2x1Y2VudCBjbG91ZCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBkZW5zaXR5IHZvbHVtZXMgYXJlLlxuICAgKlxuICAgKiBPbmUgYFZvbHVtZUxheWVyYCByYXRoZXIgdGhhbiBhIHRleHR1cmVkIHF1YWQgcGVyIHNlY3Rpb246IGFuIGBJbWFnZUxheWVyYFxuICAgKiByZW5kZXJzIG9ubHkgYXQgYG5kaXNwbGF5ID09PSAyYCwgc28gNTMgc2hlZXRzIGluIHRoZSBvcmJpdCB2aWV3IHdvdWxkIG5lZWQgYVxuICAgKiBuZXcgbGF5ZXIgdHlwZSB1cHN0cmVhbSDigJQgd2hpbGUgYSBzY2FsYXIgdm9sdW1lIHdob3NlIHogc2FtcGxpbmcgYWxyZWFkeSBJU1xuICAgKiB0aGUgc2VjdGlvbiBzcGFjaW5nIGV4cHJlc3NlcyB0aGUgc2hlZXRzIGV4YWN0bHksIGFuZCB0aGUgc2FtZSBsYXR0aWNlIHRoZW5cbiAgICogZ2l2ZXMgdGhlIGludGVycG9sYXRlZCB2ZXJzaW9uIGZvciBmcmVlLlxuICAgKlxuICAgKiBFc3RpbWF0ZWQgb24gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd24gbGF0dGljZSAoYGRlbnNpdHlHcmlkYCBhdCBzdHJpZGUgMSksXG4gICAqIHNvIHRoZSBmaWVsZCBsYW5kcyB2b3hlbC1mb3Itdm94ZWwgb24gdGhlIGFuYXRvbXkgYW5kIG5lZWRzIG5vIG9mZnNldCDigJQgYVxuICAgKiBgVm9sdW1lTGF5ZXJgIGhhcyBubyB0cmFuc2xhdGUsIGFuZCBuYXBhcmkgY2VudHJlcyBib3RoIGJveGVzIG9uIHRoZSB3b3JsZFxuICAgKiBvcmlnaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUdlbmVNYXBWb2x1bWUoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdlbmUgPSB2aWV3LmdlbmVNYXAgJiYgdmlldy5jb2xvckJ5Py5raW5kID09PSAnZmVhdHVyZScgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3Qgc21vb3RoaW5nID0gdmlldy5nZW5lTWFwU21vb3RoaW5nID4gMCA/IHZpZXcuZ2VuZU1hcFNtb290aGluZyA6IDE7XG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IG9icyA9IGRhdGFzZXQub2JzZXJ2YXRpb25zO1xuICAgIC8vIEEgdm9sdW1lIGJ1aWx0IGZyb20gT05FIHNlY3Rpb24gd291bGQgc21lYXIgdGhhdCBzbGlkZSB0aHJvdWdoIHRoZSB3aG9sZVxuICAgIC8vIGRlcHRoLCBzbyB0aGUgc2VjdGlvbiByZXN0cmljdGlvbiBvbmx5IGFwcGxpZXMgdG8gdGhlIHNoZWV0cy5cbiAgICBjb25zdCBpbnRlcnBvbGF0ZSA9ICEhdmlldy5nZW5lTWFwVm9sdW1lO1xuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgIWludGVycG9sYXRlICYmIHZpZXcuZ2VuZU1hcFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5nZW5lTWFwU2VjdGlvbikpXVxuICAgICAgICA6IG51bGw7XG5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW1xuICAgICAgICBkYXRhc2V0LmlkLCBnZW5lLCBzbW9vdGhpbmcsIHNlY3Rpb24gPz8gJ2FsbCcsIGludGVycG9sYXRlID8gJ3ZvbCcgOiAnc2hlZXRzJyxcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qga2V5ID0gZmllbGRLZXlcbiAgICAgID8gW1xuICAgICAgICBmaWVsZEtleSwgY2xpcC5qb2luKCcsJyksIHZpZXcubG9nU2NhbGUgPyAnbG9nJyA6ICdsaW4nLCB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB0aGlzLmNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3KSxcbiAgICAgIF0uam9pbignfCcpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5nZW5lTWFwVm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyKTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29hcnNlbmVkIGluLXBsYW5lIGJ1dCBOT1QgYWxvbmcgejogdGhlIHNoZWV0cyBuZWVkIG9uZSBwbGFuZSBwZXIgaW1hZ2VkXG4gICAgLy8gc2VjdGlvbiwgd2hpbGUgdGhlIGZpZWxkIHRoZXkgY2FycnkgaXMgc21vb3RoIGJ5IGNvbnN0cnVjdGlvbiBhbmQgZ2FpbnNcbiAgICAvLyBub3RoaW5nIGZyb20gdGhlIHRlbXBsYXRlJ3MgNDAgwrVtIGRldGFpbC4gQXQgZnVsbCByZXNvbHV0aW9uIHRoZSBlc3RpbWF0ZSBpc1xuICAgIC8vIGEgNS43TS12b3hlbCBwYWlyIG9mIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCDigJQgc2Vjb25kcyBvZiBmcm96ZW4gVUkgZm9yIGFcbiAgICAvLyBjaGVja2JveDsgYW4gZWlnaHRoIG9mIHRoZSB2b3hlbHMgaXMgYW4gZWlnaHRoIG9mIHRoZSB3b3JrLlxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0LCBHRU5FX01BUF9WT0xVTUVfU1RSSURFLCAxMjgsIDEpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuXG4gICAgaWYgKGZpZWxkS2V5ICE9PSB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSkge1xuICAgICAgbGV0IHZhbHVlczogRmxvYXQzMkFycmF5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGdlbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gM0QgZ2VuZSBtYXA6IFwiJHtnZW5lfVwiIHVuYXZhaWxhYmxlYCwgZXJyKTtcbiAgICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IG1hc2tUb0luZGljZXMoc2VsZWN0aW9uLm1hc2spIDogdW5kZWZpbmVkO1xuICAgICAgLy8gSW4tcGxhbmUgYmFuZHdpZHRoIGlzIHRoZSAyRCBtYXAncywgaW4gdGhpcyBsYXR0aWNlJ3MgdW5pdHMsIHNvIGEgc2hlZXRcbiAgICAgIC8vIGFuZCB0aGUgMkQgdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZC4gQWxvbmcgeiBpdCBpcyB0aGVcbiAgICAgIC8vIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHMg4oCUIHRoZSBzbWFsbGVzdCDPgyB0aGF0IGJyaWRnZXMgb25lIHNlY3Rpb24gZ2FwLlxuICAgICAgLy8gSW4tcGxhbmUgz4MgaXMgYSBQSFlTSUNBTCBiYW5kd2lkdGgsIGFuY2hvcmVkIHRvIHRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgb3duXG4gICAgICAvLyB2b3hlbCDigJQgdGhlIHJlc29sdXRpb24gdGhlIDJEIG1hcCBlc3RpbWF0ZXMgYXQg4oCUIHNvIGEgc2hlZXQgYW5kIHRoZSAyRFxuICAgICAgLy8gdmlldyBvZiB0aGUgc2FtZSBzZWN0aW9uIGFyZSB0aGUgc2FtZSBmaWVsZCB3aGF0ZXZlciBsYXR0aWNlIHRoaXMgaXNcbiAgICAgIC8vIHJhc3RlcmlzZWQgb24uIEFsb25nIHogaXQgaXMgdGhlIGRlbnNpdHkgcGF0aCdzIDEuNSB2b3hlbHM6IHRoZSBzbWFsbGVzdCDPg1xuICAgICAgLy8gdGhhdCBicmlkZ2VzIG9uZSBzZWN0aW9uIGdhcC5cbiAgICAgIGNvbnN0IGluUGxhbmUgPSBkYXRhc2V0LnZvbHVtZT8udm94ZWxTaXplID8/IGdyaWQudm94ZWxTaXplO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQgPSBleHByZXNzaW9uVm9sdW1lKG9icywgZ3JpZCwge1xuICAgICAgICBzaWdtYTogW1xuICAgICAgICAgIGluUGxhbmVbMF0gKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICBpblBsYW5lWzFdICogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgICAgZ3JpZC52b3hlbFNpemVbMl0gKiAxLjUgKiBzbW9vdGhpbmcsXG4gICAgICAgIF0sXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgaW5kaWNlczogc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBpblNlbGVjdGlvbixcbiAgICAgICAgaW50ZXJwb2xhdGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZW5lTWFwVm9sdW1lRmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhmaWVsZC5tZWFuLCBjbGlwWzBdLCBjbGlwWzFdKTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRXhwcmVzc2lvblZvbHVtZShmaWVsZCwgW2xvLCBoaV0sIHsgbG9nOiB2aWV3LmxvZ1NjYWxlIH0pO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSB2aWV3ZXIuYWRkVm9sdW1lKFxuICAgICAgZGF0YSwgZmllbGQud2lkdGgsIGZpZWxkLmhlaWdodCwgZmllbGQuZGVwdGgsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBnZW5lIG1hcCDCtyAke2dlbmV9JHtpbnRlcnBvbGF0ZSA/ICcgwrcgdm9sdW1lJyA6ICcnfWAsXG4gICAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoYGdlbmUtbWFwLSR7Z2VuZX1gLCBsdXQpLFxuICAgICAgICAvLyBUaGUgZW5jb2RpbmcgYWxyZWFkeSBhcHBsaWVkIHRoZSB3aW5kb3csIHNvIHRoZSBsYXllciBtdXN0IG5vdCBhcHBseSBhXG4gICAgICAgIC8vIHNlY29uZCBvbmU6IDAuLjI1NSBpcyB0aGUgd2hvbGUgb2Ygd2hhdCBpdCB3YXMgZ2l2ZW4uXG4gICAgICAgIGNvbnRyYXN0TGltaXRzOiBbMCwgMjU1XSxcbiAgICAgICAgcmVuZGVyaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgICAvLyBBZGRpdGl2ZSBsaWtlIHRoZSBkZW5zaXR5IHZvbHVtZXMsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGUgc2hlZXRzXG4gICAgICAgIC8vIGhhdmUgdG8gcmVhZCBUSFJPVUdIIGVhY2ggb3RoZXIgYW5kIHRocm91Z2ggdGhlIGFuYXRvbXksIHdoaWNoIGFcbiAgICAgICAgLy8gdHJhbnNsdWNlbnQgYmxlbmQgd291bGQgb2NjbHVkZSBvbmUgc2hlZXQgYXQgYSB0aW1lLlxuICAgICAgICBibGVuZGluZzogJ2FkZGl0aXZlJyxcbiAgICAgICAgb3BhY2l0eTogdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzOiBlYWNoIGNsdXN0ZXIgcmFzdGVyaXNlZCBpbnRvIGEgc21vb3RoIHNjYWxhciBmaWVsZCBhbmRcbiAgICogcmF5bWFyY2hlZCBhbG9uZ3NpZGUgdGhlIGNsb3VkLCB0aW50ZWQgd2l0aCB0aGUgY2x1c3RlcidzIG93biBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgYSBzZXJpYWxseSBzZWN0aW9uZWQgZGF0YXNldCByZWFkYWJsZSBhcyBhbiBhbmF0b21pY2FsXG4gICAqIGRpc3RyaWJ1dGlvbi4gVGhlIGNsb3VkIHNob3dzIG1lYXN1cmVkIGNlbGxzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIGJ1dCBhdCAyMDAgwrVtXG4gICAqIHNlY3Rpb24gc3BhY2luZyB0aGUgZXllIGNhbm5vdCBpbnRlZ3JhdGUgYSBzdGFjayBvZiBkaXNjcyBpbnRvIGEgc2hhcGUsIGFuZFxuICAgKiBldmVyeSBnYXAgcmVhZHMgYXMgYWJzZW5jZS4gQSBkZW5zaXR5IGZpZWxkIGlzIGEgZGlmZmVyZW50IG9iamVjdCBmcm9tIGEgY2VsbDpcbiAgICogYW4gZXN0aW1hdGUsIGRlZmluZWQgYmV0d2VlbiB0aGUgaW1hZ2VkIHBsYW5lcywgZHJhd24gYXMgYSB0cmFuc2x1Y2VudCBjbG91ZCBzb1xuICAgKiBpdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIG1lYXN1cmVtZW50LiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBuZXZlciBpbnRlcnBvbGF0ZWQg4oCUXG4gICAqIGNvbnNlY3V0aXZlIHNlY3Rpb25zIHNhbXBsZSBkaWZmZXJlbnQgY2VsbHMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJwb2xhdGVcbiAgICogYWxvbmcuXG4gICAqXG4gICAqIE9uZSB2b2x1bWUgcGVyIGNsdXN0ZXIgcmF0aGVyIHRoYW4gb25lIGZvciBldmVyeXRoaW5nOiBhZGRpdGl2ZSBibGVuZGluZyBpcyB3aGF0XG4gICAqIG1ha2VzIHR3byBjbHVzdGVycycgdGVycml0b3JpZXMgY29tcGFyYWJsZSwgYW5kIGEgc2luZ2xlIGJsZW5kZWQgZmllbGQgd291bGRcbiAgICogYW5zd2VyIG5vIHF1ZXN0aW9uIGFueW9uZSBhc2tzIG9mIGEgdGF4b25vbXkuIENhcHBlZCBhdFxuICAgKiB7QGxpbmsgREVOU0lUWV9NQVhfQ0xVU1RFUlN9IGJ5IGNlbGwgY291bnQuXG4gICAqXG4gICAqIEtleWVkIHNvIGl0IHJlYnVpbGRzIG9ubHkgd2hlbiB0aGUgZmllbGQgd291bGQgYWN0dWFsbHkgZGlmZmVyIOKAlCB0aGUgZGF0YXNldCxcbiAgICogdGhlIGNvbG91ciBjb2x1bW4sIHRoZSBiYW5kd2lkdGgsIG9yIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZURlbnNpdHlWb2x1bWVzKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbiA9ICEhdmlldy5kZW5zaXR5Vm9sdW1lICYmICEhZGF0YXNldC5vYnNlcnZhdGlvbnMuejtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgPiAwID8gdmlldy5kZW5zaXR5U21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjb2x1bW4gPSB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdjb2x1bW4nID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIC8vIFRoZSBzZWxlY3Rpb24gZW50ZXJzIHRoZSBrZXkgYnkgSURFTlRJVFksIG5vdCBieSBjb3VudDogdHdvIGRpZmZlcmVudCBST0lzXG4gICAgLy8gaG9sZGluZyB0aGUgc2FtZSBudW1iZXIgb2YgY2VsbHMgd291bGQgb3RoZXJ3aXNlIGxvb2sgbGlrZSB0aGUgc2FtZSBrZXkgYW5kXG4gICAgLy8gbGVhdmUgdGhlIHByZXZpb3VzIFJPSSdzIGZpZWxkcyBvbiBzY3JlZW4uXG4gICAgY29uc3Qga2V5ID0gb25cbiAgICAgID8gW2RhdGFzZXQuaWQsIGNvbHVtbiA/PyAnYWxsJywgc21vb3RoaW5nLCB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmRlbnNpdHlLZXkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5kZW5zaXR5TGF5ZXJzKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0ga2V5O1xuICAgIGlmICgha2V5KSByZXR1cm47XG5cbiAgICBjb25zdCBncmlkID0gZGVuc2l0eUdyaWQoZGF0YXNldCk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgLy8gV2l0aCBubyByZWZlcmVuY2Ugdm9sdW1lIHRoZXJlIGlzIG5vIG9mZnNldCB5ZXQsIGFuZCBhIFZvbHVtZUxheWVyIGhhcyBub1xuICAgIC8vIHRyYW5zbGF0ZSDigJQgbmFwYXJpIGNlbnRyZXMgaXRzIGJveCBvbiB0aGUgd29ybGQgb3JpZ2luLiBTbyB0aGUgUE9JTlRTIG1vdmUgYnlcbiAgICAvLyBoYWxmIHRoZSBkZW5zaXR5IGJveCwgZXhhY3RseSBhcyB0aGV5IGRvIGZvciBhIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCB0aGVcbiAgICAvLyBjYWNoZWQgZ2VvbWV0cnkgaXMgaW52YWxpZGF0ZWQgYmVjYXVzZSB0aGF0IG9mZnNldCBqdXN0IGNoYW5nZWQuXG4gICAgaWYgKCF0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gW1xuICAgICAgICAtKGdyaWQud2lkdGggKiBncmlkLnZveGVsU2l6ZVswXSkgLyAyLFxuICAgICAgICAtKGdyaWQuaGVpZ2h0ICogZ3JpZC52b3hlbFNpemVbMV0pIC8gMixcbiAgICAgICAgLShncmlkLmRlcHRoICogZ3JpZC52b3hlbFNpemVbMl0pIC8gMixcbiAgICAgIF07XG4gICAgICB0aGlzLnNwYXRpYWxMYXllcktleTNkID0gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXBzOiB7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXTtcbiAgICB0cnkge1xuICAgICAgZ3JvdXBzID0gYXdhaXQgdGhpcy5kZW5zaXR5R3JvdXBzKGRhdGFzZXQsIGNvbHVtbiwgc2VsZWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gZGVuc2l0eSB2b2x1bWVzOiBjb2x1bW4gdW5hdmFpbGFibGUnLCBlcnIpO1xuICAgICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5kZW5zaXR5S2V5ICE9PSBrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IHNpZ21hID0gZGVmYXVsdFNpZ21hKGdyaWQsIHNtb290aGluZyk7XG4gICAgLy8gQWRkaXRpdmUgYmxlbmRpbmcgU1VNUywgc28gYSBmaXhlZCBwZXItbGF5ZXIgb3BhY2l0eSBibG93cyBvdXQgdG8gd2hpdGUgYXNcbiAgICAvLyBzb29uIGFzIHNldmVyYWwgYnJvYWQgY2x1c3RlcnMgb3ZlcmxhcCDigJQgc2l4IHN1YmNsYXNzZXMgYXQgMC41NSBlYWNoIHR1cm5lZFxuICAgIC8vIHRoZSBicmFpbiBpbnRvIG9uZSBjeWFuIG1hc3MuIFNwbGl0dGluZyB0aGUgYnVkZ2V0IGtlZXBzIG4gZnVsbHkgb3ZlcmxhcHBpbmdcbiAgICAvLyBwZWFrcyBpbnNpZGUgdGhlIGRpc3BsYXkncyByYW5nZSwgc28gb3ZlcmxhcCByZWFkcyBhcyBvdmVybGFwOyBhIHNpbmdsZVxuICAgIC8vIGNsdXN0ZXIgc3RpbGwgZ2V0cyB0aGUgZnVsbCAwLjU1LiBJdCBvbmx5IG1pdGlnYXRlczogYSB0cmFuc2x1Y2VudCByYXltYXJjaFxuICAgIC8vIGludGVncmF0ZXMgYWxvbmcgdGhlIHJheSwgc28gY2x1c3RlcnMgdGhhdCBhcmUgdWJpcXVpdG91cyByYXRoZXIgdGhhblxuICAgIC8vIHJlZ2lvbmFsICh0aGUgbGFyZ2VzdCBzdWJjbGFzc2VzIGFyZSBnbGlhLCB3aGljaCBhcmUgZXZlcnl3aGVyZSkgc3RpbGwgcGlsZVxuICAgIC8vIHVwLCBhbmQgb25lIGNsdXN0ZXIgYXQgYSB0aW1lIGlzIHRoZSByZWFkYWJsZSB3YXkgdG8gbG9vayBhdCB0aG9zZS5cbiAgICBjb25zdCBvcGFjaXR5ID0gTWF0aC5taW4oMC41NSwgMC45IC8gTWF0aC5tYXgoMSwgZ3JvdXBzLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmFzdGVyaXplRGVuc2l0eShkYXRhc2V0Lm9ic2VydmF0aW9ucywgZ3JpZCwgeyBzaWdtYSwgaW5kaWNlczogZ3JvdXAuaW5kaWNlcyB9KTtcbiAgICAgIC8vIEEgY2x1c3RlciB3aXRoIG5vdGhpbmcgb24gdGhlIGdyaWQgZHJhd3Mgbm8gbGF5ZXIsIHJhdGhlciB0aGFuIGFuIGVtcHR5IGJveC5cbiAgICAgIGlmICghZGF0YSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgdGhpcy5kZW5zaXR5TGF5ZXJzLnB1c2goXG4gICAgICAgIChcbiAgICAgICAgICB2aWV3ZXIuYWRkVm9sdW1lKGRhdGEsIGdyaWQud2lkdGgsIGdyaWQuaGVpZ2h0LCBncmlkLmRlcHRoLCB7XG4gICAgICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke2dyb3VwLm5hbWV9YCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoZ3JvdXAuY29sb3IpLFxuICAgICAgICAgICAgLy8gVHJhbnNsdWNlbnQsIG5vdCBNSVA6IGEgY2x1c3RlcidzIGludGVyaW9yIGlzIHRoZSByZWFkYWJsZSBwYXJ0LCBhbmQgTUlQXG4gICAgICAgICAgICAvLyB3b3VsZCBmbGF0dGVuIGV2ZXJ5IGNsb3VkIHRvIGl0cyBicmlnaHRlc3Qgc2hlbGwuXG4gICAgICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgICAgICBvcGFjaXR5LFxuICAgICAgICAgICAgLy8gQWRkaXRpdmUsIHNvIHR3byBjbHVzdGVycyBvdmVybGFwcGluZyByZWFkIGFzIGJvdGggYmVpbmcgdGhlcmUgaW5zdGVhZFxuICAgICAgICAgICAgLy8gb2YgdGhlIG5lYXJlciBvbmUgaGlkaW5nIHRoZSBvdGhlci5cbiAgICAgICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICAgICAgdm94ZWxTaXplOiBncmlkLnZveGVsU2l6ZSxcbiAgICAgICAgICB9KSksXG4gICAgICApO1xuICAgIH1cbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aXR5IG9mIHRoZSBjb2xvdXIgc2NhbGUgYSBjb250aW51b3VzIHNwYXRpYWwgbGF5ZXIgd2lsbCBkcmF3IHdpdGgsIGZvciBhXG4gICAqIGNhY2hlIGtleTogdGhlIGV4cGxpY2l0IGNob2ljZSwgb3IgZWxzZSB0aGUgZGlzcGxheSBjb2xvcm1hcCBhbmQgaXRzIHJldmVyc2VcbiAgICogZmxhZywgc2luY2UgdGhhdCBpcyB3aGF0IHtAbGluayBzcGF0aWFsQ29udGludW91c0x1dH0gZmFsbHMgYmFjayB0by5cbiAgICpcbiAgICogVGhlIGdlbmUgbWFwcyBjYWNoZSB0aGVpciBjb2xvdXJlZCBvdXRwdXQsIHNvIHdpdGhvdXQgdGhpcyBpbiB0aGUga2V5IGEgY2hhbmdlXG4gICAqIG9mIGNvbG91ciBzY2FsZSBsZWZ0IHRoZSBmaWVsZCBvbiBzY3JlZW4gaW4gdGhlIHByZXZpb3VzIGNvbG91cnMg4oCUIHRoZSBtYXJrZXJzXG4gICAqIHJlY29sb3VyZWQgYW5kIHRoZSBtYXAgdW5kZXIgdGhlbSBkaWQgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSBjb250aW51b3VzQ29sb3JtYXBLZXkodmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNvbG9ybWFwSWQodmlldy5jb250aW51b3VzQ29sb3JtYXApLFxuICAgICAgY29sb3JtYXBJZChub2RlPy5kYXRhPy52YWx1ZSksXG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID8gJ3JldicgOiAnJyxcbiAgICBdLmpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJldmlzaW9uIG51bWJlciBmb3IgYSBzZWxlY3Rpb24gb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgc3RvcmUgaGFuZHMgb3V0IGEgTkVXIG1hc2sgb2JqZWN0IHBlciBjaGFuZ2UsIHNvIG9iamVjdCBpZGVudGl0eSBpcyB0aGVcbiAgICogY2hlYXAgYW5kIGV4YWN0IHdheSB0byB0ZWxsIHR3byBzZWxlY3Rpb25zIGFwYXJ0IOKAlCBhIGZpbmdlcnByaW50IG92ZXIgMy43TVxuICAgKiBtYXNrIGJ5dGVzIHdvdWxkIGJlIG5laXRoZXIuIENvdW50aW5nIHJldmlzaW9ucyBrZWVwcyB0aGUgY2FjaGUga2V5IGEgc2hvcnRcbiAgICogc3RyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXYoc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IG51bWJlciB7XG4gICAgaWYgKHNlbGVjdGlvbiAhPT0gdGhpcy5sYXN0U2VsZWN0aW9uU2Vlbikge1xuICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uU2VlbiA9IHNlbGVjdGlvbjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uUmV2aXNpb24rKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmV2aXNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsdXN0ZXJzIHRvIHJhc3RlcmlzZTogdGhlIGNhdGVnb3JpZXMgb2YgdGhlIGFjdGl2ZSBjYXRlZ29yaWNhbCBjb2xvdXJpbmcsXG4gICAqIGJpZ2dlc3QgZmlyc3QgYW5kIGNhcHBlZCwgZWFjaCB3aXRoIGl0cyBsZWdlbmQgY29sb3VyLlxuICAgKlxuICAgKiBSZXN0cmljdGVkIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aGVuIHRoZXJlIGlzIG9uZSwgc28gXCJzZWxlY3QgYSByZWdpb24sXG4gICAqIGNoZWNrIHRoZSBib3hcIiBhbnN3ZXJzIHdoaWNoIGNsdXN0ZXJzIGxpdmUgdGhlcmUuIFdpdGggbm8gY2F0ZWdvcmljYWwgY29sb3VyaW5nXG4gICAqIHRoZXJlIGlzIG9uZSBncm91cCDigJQgdG90YWwgY2VsbCBkZW5zaXR5LCB3aGljaCBpcyBhIHJlYWwgcXVlc3Rpb24gb24gaXRzIG93blxuICAgKiAoXCJ3aGVyZSBpcyB0aGUgdGlzc3VlIGRlbnNlP1wiKSBhbmQgdGhlIGhvbmVzdCB0aGluZyB0byBzaG93IHdoZW4gdGhlIHZpZXcgaXNcbiAgICogbm90IGVuY29kaW5nIGEgdGF4b25vbXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbnNpdHlHcm91cHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIGNvbHVtbjogc3RyaW5nIHwgbnVsbCwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZzsgaW5kaWNlcz86IFVpbnQzMkFycmF5IH1bXT4ge1xuICAgIGNvbnN0IG4gPSBkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudDtcbiAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBzZWxlY3Rpb24ubWFzayA6IG51bGw7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgbWV0YSA9IGNvbHVtbiA/IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIGNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwb3J0IHx8ICFjb2x1bW4gfHwgIW1ldGEgfHwgbWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gaW5TZWxlY3Rpb24gPyBtYXNrVG9JbmRpY2VzKGluU2VsZWN0aW9uKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIFt7IG5hbWU6IGluU2VsZWN0aW9uID8gJ3NlbGVjdGVkIGNlbGxzJyA6ICdhbGwgY2VsbHMnLCBjb2xvcjogaGV4LCBpbmRpY2VzIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFpc0NhdGVnb3JpY2FsQ29sdW1uKGxvYWRlZCkpIHJldHVybiBbXTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobG9hZGVkLm1ldGEpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShsb2FkZWQubWV0YS5jYXRlZ29yaWVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGlmIChpblNlbGVjdGlvbiAmJiAhaW5TZWxlY3Rpb25baV0pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY29kZSA9IGxvYWRlZC5jb2Rlc1tpXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBjb2RlIDwgY291bnRzLmxlbmd0aCkgY291bnRzW2NvZGVdKys7XG4gICAgfVxuICAgIGNvbnN0IHJhbmtlZCA9IEFycmF5LmZyb20oY291bnRzLCAoY291bnQsIGNvZGUpID0+ICh7IGNvZGUsIGNvdW50IH0pKVxuICAgICAgLmZpbHRlcigoYykgPT4gYy5jb3VudCA+IDApXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpXG4gICAgICAuc2xpY2UoMCwgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuREVOU0lUWV9NQVhfQ0xVU1RFUlMpO1xuICAgIGlmIChjb3VudHMuZmlsdGVyKChjKSA9PiBjID4gMCkubGVuZ3RoID4gcmFua2VkLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW25hcGFyaS1qc10gJHtjb2x1bW59OiBkcmF3aW5nIHRoZSAke3JhbmtlZC5sZW5ndGh9IGxhcmdlc3QgY2x1c3RlcnMgYXMgZGVuc2l0eSBgICtcbiAgICAgICAgICAndm9sdW1lczsgbW9yZSB0aGFuIHRoYXQgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByYW5rZWQubWFwKCh7IGNvZGUgfSkgPT4ge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheShjb3VudHNbY29kZV0pO1xuICAgICAgbGV0IGsgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKGluU2VsZWN0aW9uICYmICFpblNlbGVjdGlvbltpXSkgY29udGludWU7XG4gICAgICAgIGlmIChsb2FkZWQuY29kZXNbaV0gPT09IGNvZGUpIGluZGljZXNbaysrXSA9IGk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBsb2FkZWQubWV0YS5jYXRlZ29yaWVzW2NvZGVdLFxuICAgICAgICBjb2xvcjogY29sb3JzW2NvZGVdID8/ICcjODg4ODg4JyxcbiAgICAgICAgaW5kaWNlczogaW5kaWNlcy5zdWJhcnJheSgwLCBrKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIChvciBrZWVwKSB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWUsIGFuZCBkZXJpdmUgdGhlIG9mZnNldCB0aGF0IHNpdHMgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgaXQuXG4gICAqXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZTogbmFwYXJpLWpzIG1hcHMgdGhlIHZvbHVtZSdzIHVuaXQgY3ViZSB0byBhIHdvcmxkIGJveFxuICAgKiAqKmNlbnRyZWQgb24gdGhlIG9yaWdpbioqLCBzaXplZCBgZGltcyB4IHZveGVsU2l6ZWAuIFRoZSBvYnNlcnZhdGlvbnMsIGJ5IGNvbnRyYWN0LCBhcmUgaW5cbiAgICogdGhlIHZvbHVtZSdzIG93biBmcmFtZSB3aXRoIGl0cyBuZWFyIGNvcm5lciBhdCB0aGUgY29vcmRpbmF0ZSBvcmlnaW4uIFNvIHRoZSB0d28gb25seSBsaW5lXG4gICAqIHVwIGlmIHRoZSBQT0lOVFMgbW92ZSDigJQgYnkgaGFsZiB0aGUgYm94IOKAlCB3aGljaCBpcyB3aGF0IHtAbGluayBzcGF0aWFsT3JpZ2luM2R9IGlzLlxuICAgKlxuICAgKiBBIGZhaWxlZCBvciBhYnNlbnQgdm9sdW1lIGlzIG5vdCBmYXRhbDogdGhlIGNsb3VkIHJlbmRlcnMgb24gaXRzIG93biwgYXQgaXRzIG93blxuICAgKiBjb29yZGluYXRlcywgYW5kIHRoZSBjYW1lcmEgZnJhbWVzIHRoZSBwb2ludHMgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3BhdGlhbFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSBkYXRhc2V0LnZvbHVtZTtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBrZXkgPSBtZXRhID8gYCR7ZGF0YXNldC5pZH06JHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9YCA6IG51bGw7XG4gICAgaWYgKGtleSAmJiBrZXkgPT09IHRoaXMuc3BhdGlhbFZvbHVtZUtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zcGF0aWFsVm9sdW1lKTtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICBpZiAoIW1ldGEgfHwgIXBvcnQ/LmdldFZvbHVtZSkgcmV0dXJuO1xuXG4gICAgbGV0IHZveGVsczogVWludDhBcnJheTtcbiAgICB0cnkge1xuICAgICAgdm94ZWxzID0gYXdhaXQgcG9ydC5nZXRWb2x1bWUoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gcmVmZXJlbmNlIHZvbHVtZSB1bmF2YWlsYWJsZSDigJQgZHJhd2luZyB0aGUgY2xvdWQgYWxvbmUnLCBlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgW3Z4LCB2eSwgdnpdID0gbWV0YS52b3hlbFNpemU7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IChcbiAgICAgIHZpZXdlci5hZGRWb2x1bWUodm94ZWxzLCBtZXRhLndpZHRoLCBtZXRhLmhlaWdodCwgbWV0YS5kZXB0aCwge1xuICAgICAgbmFtZTogJ3JlZmVyZW5jZSB2b2x1bWUnLFxuICAgICAgY29sb3JtYXA6ICdncmF5JyxcbiAgICAgIC8vIE1JUCB3b3VsZCBkcmF3IHRoZSBicmlnaHRlc3Qgdm94ZWwgYWxvbmcgZWFjaCByYXksIHdoaWNoIGZvciBhbiBhdmVyYWdlZFxuICAgICAgLy8gdGVtcGxhdGUgbWVhbnMgYSBmbGF0IHdoaXRlIHNoZWxsIHRoYXQgaGlkZXMgdGhlIGNsb3VkLiBUcmFuc2x1Y2VudCBsZXRzXG4gICAgICAvLyB0aGUgcG9pbnRzIHJlYWQgdGhyb3VnaCB0aGUgdGlzc3VlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGRyYXdpbmdcbiAgICAgIC8vIHRoZW0gdG9nZXRoZXIuXG4gICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICBvcGFjaXR5OiB2aWV3LnZvbHVtZU9wYWNpdHksXG4gICAgICAgIHZveGVsU2l6ZTogW3Z4LCB2eSwgdnpdLFxuICAgICAgfSkpO1xuICAgIC8vIEhhbGYgdGhlIGJveCwgbmVnYXRlZDogdGhlIG9ic2VydmF0aW9ucycgb3JpZ2luIGlzIHRoZSBib3gncyBuZWFyIGNvcm5lcixcbiAgICAvLyBhbmQgdGhlIGJveCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4uXG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbXG4gICAgICAtKG1ldGEud2lkdGggKiB2eCkgLyAyLFxuICAgICAgLShtZXRhLmhlaWdodCAqIHZ5KSAvIDIsXG4gICAgICAtKG1ldGEuZGVwdGggKiB2eikgLyAyLFxuICAgIF07XG4gICAgLy8gRm9yY2UgYSBnZW9tZXRyeSByZWJ1aWxkOiB0aGUgb2Zmc2V0IGNoYW5nZWQsIHNvIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHN0YWxlLlxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTcGF0aWFsM2RMYXllcnModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIFtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLCB0aGlzLnNwYXRpYWxWb2x1bWUsXG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciwgLi4udGhpcy5kZW5zaXR5TGF5ZXJzLFxuICAgIF0pIHtcbiAgICAgIGlmIChsYXllcikgdmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBudWxsO1xuICAgIHRoaXMuZGVuc2l0eUxheWVycyA9IFtdO1xuICAgIHRoaXMuZGVuc2l0eUtleSA9IG51bGw7XG4gICAgLy8gVGhlIHNjZW5lIGlzIGdvbmUsIHNvIHRoZSBuZXh0IDNEIGxheWVyIHNob3VsZCBmcmFtZSBpdHNlbGYgYWdhaW4uIFRoYXQgdXNlZCB0byBiZVxuICAgIC8vIGBzcGF0aWFsRnJhbWVkID0gbnVsbGAgbmV4dCB0byBhIGhhbmQtcm9sbGVkIHNhdmUvcmVzdG9yZTsgdGhlIHJlbmRlcmVyIG93bnMgdGhlXG4gICAgLy8gcG9saWN5IG5vdywgYW5kIHRoaXMgaXMgdGhlIHNhbWUgc3RhdGVtZW50IGFkZHJlc3NlZCB0byBpdC5cbiAgICB2aWV3ZXIucmVzZXRGaXQzRCgpO1xuICAgIHRoaXMuc3BhdGlhbDJkRnJhbWVkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWUgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbMCwgMCwgMF07XG4gICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFNjYWxhcktleTNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsRHJhd24zZCA9IG51bGw7XG4gIH1cblxuICAvKiogQSBvbmUtY29sb3VyIGNvbG9ybWFwLCBmb3IgdGhlIFwibm90aGluZyB0byBjb2xvdXIgYnlcIiBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRmxhdENvbG9ybWFwKCk6IENvbG9ybWFwIHtcbiAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgY29uc3QgcmdiOiBSZ2IgPSBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV07XG4gICAgLy8gVHdvIGlkZW50aWNhbCBzdG9wczogY29sb3JtYXBGcm9tTHV0IG5lZWRzIGF0IGxlYXN0IHR3bywgYW5kIGVxdWFsIGVuZHNcbiAgICAvLyBtYWtlIGV2ZXJ5IHZhbHVlIHJlc29sdmUgdG8gdGhlIHNhbWUgY29sb3VyLlxuICAgIHJldHVybiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtZmxhdCcsIFtyZ2IsIHJnYl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItcG9pbnQgc2NhbGFyICsgY29sb3JtYXAgKyB3aW5kb3cgdGhhdCBjb2xvdXIgdGhlIDNEIGNsb3VkLlxuICAgKlxuICAgKiBDb250aW51b3VzIGRhdGEgaXMgdGhlIG5hdHVyYWwgZml0OiB2YWx1ZXMgZ28gc3RyYWlnaHQgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggdGhlXG4gICAqIHNhbWUgcGVyY2VudGlsZSB3aW5kb3cgdGhlIDJEIHBhdGggdXNlcy4gQ2F0ZWdvcmljYWwgZGF0YSBoYXMgdG8gYmUgc211Z2dsZWQgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiBzY2FsYXIgY2hhbm5lbCDigJQgc2VlIHtAbGluayBTUEFUSUFMXzNEX01BWF9DQVRFR09SSUVTfS4gQ29kZXMgbWFwIHRvIExVVCBibG9ja3MsIGFuZFxuICAgKiBgY29udHJhc3RMaW1pdHNgIG9mIGBbLTAuNSwgSyAtIDAuNV1gIHB1dHMgY29kZSBgaWAgYXQgdGhlIGNlbnRyZSBvZiBibG9jayBgaWAsIHdoaWNoIGlzIHdoYXRcbiAgICogbWFrZXMgdGhlIHJvdW5kLXRyaXAgZXhhY3QgaW5zdGVhZCBvZiBhcHByb3hpbWF0ZWx5IHJpZ2h0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzcGF0aWFsU2NhbGFyM2QoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8U3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICBpZiAoIXBvcnQgfHwgIWNvbG9yQnkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvbHVtbi5jb2RlcywgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSxcbiAgICApO1xuICB9XG5cbiAgLyoqIENhdGVnb3J5IGNvZGVzIOKGkiBhIHN0ZXBwZWQgTFVULCBleGFjdCBmb3IgdXAgdG8ge0BsaW5rIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWwzZENhdGVnb3JpY2FsKGNvZGVzOiBVaW50MTZBcnJheSwgY29sb3JzOiBzdHJpbmdbXSk6IFNwYXRpYWwzZEVuY29kaW5nIHwgbnVsbCB7XG4gICAgLy8gU2xvdCAwIGlzIHJlc2VydmVkIGZvciBcIm5vIGNhdGVnb3J5XCIsIHNvIHRoZSBwYWxldHRlIG9jY3VwaWVzIDEuLksgYW5kIHRoZVxuICAgIC8vIGJsb2NrIGNvdW50IGlzIG9uZSBtb3JlIHRoYW4gdGhlIGNhdGVnb3J5IGNvdW50IOKAlCB3aGljaCBpcyB3aHkgdGhlIHB1Ymxpc2hlZFxuICAgIC8vIGNlaWxpbmcgaXMgOTUgY2F0ZWdvcmllcyByYXRoZXIgdGhhbiB0aGUgTFVUJ3MgOTYgZGlzdGluZ3Vpc2hhYmxlIGJsb2Nrcy5cbiAgICBpZiAoY29sb3JzLmxlbmd0aCA+IFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdICR7Y29sb3JzLmxlbmd0aH0gY2F0ZWdvcmllcyBleGNlZWRzIHRoZSAke1NQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9IHRoZSAzRCBgXG4gICAgICAgICsgXCJsYXllcidzIDI1Ni1lbnRyeSBMVVQgY2FuIGhvbGQgZGlzdGluY3RseTsgZHJhd2luZyBmbGF0IGluc3RlYWQgb2Ygd2l0aCB3cm9uZyBjb2xvdXJzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGsgPSBjb2xvcnMubGVuZ3RoICsgMTtcbiAgICBjb25zdCBwYWxldHRlOiBSZ2JbXSA9IFtcbiAgICAgIE1JU1NJTkdfQ09MT1IsXG4gICAgICAuLi5jb2xvcnMubWFwKHBhcnNlSGV4KSxcbiAgICBdO1xuICAgIGNvbnN0IGx1dDogUmdiW10gPSBuZXcgQXJyYXkoTFVUX1NJWkUpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgTFVUX1NJWkU7IGorKykge1xuICAgICAgbHV0W2pdID0gcGFsZXR0ZVtNYXRoLm1pbihrIC0gMSwgTWF0aC5mbG9vcigoaiAqIGspIC8gTFVUX1NJWkUpKV07XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoY29kZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBjb2Rlc1tpXSA9PT0gTk9fQ0FURUdPUlkgPyAwIDogY29kZXNbaV0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1jYXRlZ29yaWVzJywgbHV0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbLTAuNSwgayAtIDAuNV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgdGhlIGFjdGl2ZSBjb2xvcm1hcCBvdmVyIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgIHNvdXJjZTogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICk6IFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgbGV0IHZhbHVlcyA9IHNvdXJjZTtcbiAgICBpZiAobG9nKSB7XG4gICAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHZhbHVlc1tpXSA9IE1hdGgubG9nMXAoTWF0aC5tYXgoMCwgc291cmNlW2ldKSk7XG4gICAgfVxuICAgIGNvbnN0IFttaW4sIG1heF0gPSBjb250cmFzdFdpbmRvdyh2YWx1ZXMsIGxvLCBoaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlcyxcbiAgICAgIGNvbG9ybWFwOiBjb2xvcm1hcEZyb21MdXQoJ3NwYXRpYWwtY29udGludW91cycsIGx1dCksXG4gICAgICAvLyBBIGRlZ2VuZXJhdGUgd2luZG93IHdvdWxkIGRpdmlkZSBieSB6ZXJvIGluIHRoZSBzaGFkZXIncyBub3JtYWxpc2F0aW9uLlxuICAgICAgY29udHJhc3RMaW1pdHM6IG1heCA+IG1pbiA/IFttaW4sIG1heF0gOiBbbWluLCBtaW4gKyAxXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1vYnNlcnZhdGlvbiBjb2xvdXJzIGZvciB0aGUgY3VycmVudCB2aWV3IHN0YXRlLCBvciBhIHNpbmdsZSBmbGF0IGNvbG91ciB3aGVuIG5vdGhpbmcgaXNcbiAgICogc2VsZWN0ZWQgdG8gY29sb3VyIGJ5LiBDYXRlZ29yaWNhbCBjb2x1bW5zIHVzZSB0aGUgY29sdW1uJ3Mgb3duIHBhbGV0dGU7IGNvbnRpbnVvdXMgY29sdW1uc1xuICAgKiBhbmQgZ2VuZSB2ZWN0b3JzIGdvIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCB3aXRoIGEgcGVyY2VudGlsZS1jbGlwcGVkIHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3BhdGlhbEZhY2VDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgdG9SZ2JhVHVwbGVzPiB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgY29uc3QgY29sb3JCeSA9IHZpZXcuY29sb3JCeTtcbiAgICAvLyBFdmVyeXRoaW5nIE5PVCBzZWxlY3RlZCBpcyBtdXRlZDsgd2l0aCBub3RoaW5nIHNlbGVjdGVkLCBub3RoaW5nIGlzIG11dGVkXG4gICAgLy8gYW5kIHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkgKHRoZSBDb3NNeCBoaWdobGlnaHQtdnMtbXV0ZSBydWxlKS5cbiAgICBjb25zdCBtdXRlZCA9IG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pO1xuXG4gICAgaWYgKCFwb3J0IHx8ICFjb2xvckJ5KSB7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBHZW51aW5lbHkgdW5pZm9ybTogb25lIGJyb2FkY2FzdCB0dXBsZSwgc28gYSBmbGF0IDg0ay1vYnNlcnZhdGlvbiB2aWV3XG4gICAgICAvLyBkb2VzIG5vdCBhbGxvY2F0ZSA4NGsgb2YgdGhlbS5cbiAgICAgIGlmICghbXV0ZWQgJiYgdmlldy5vcGFjaXR5ID49IDEpIHJldHVybiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX05FVVRSQUxfQ09MT1I7XG4gICAgICAvLyBOb3QgdW5pZm9ybSDigJQgdGhlIG9wYWNpdHkgY29udHJvbCBvciBhIHNlbGVjdGlvbiB2YXJpZXMgdGhlIGFscGhhLCBzbyBpdFxuICAgICAgLy8gaGFzIHRvIGJlIHBlci1wb2ludC4gUmV0dXJuaW5nIHRoZSBjb25zdGFudCB0dXBsZSBoZXJlIGlzIHdoYXQgbWFkZSB0aGVcbiAgICAgIC8vIE9wYWNpdHkgc2xpZGVyIGRvIG5vdGhpbmcgaW4gdGhlIGRlZmF1bHQgc3RhdGUsIHdoaWNoIGlzIHRoZSBzdGF0ZSBhbnlvbmVcbiAgICAgIC8vIGxhbmRzIGluIGJlZm9yZSBwaWNraW5nIGEgY29sb3VyIHNvdXJjZS5cbiAgICAgIGNvbnN0IGhleCA9IGAjJHtbciwgZywgYl0ubWFwKChjKSA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKX1gO1xuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyhlbmNvZGVDYXRlZ29yaWNhbChuZXcgVWludDE2QXJyYXkoZGF0YXNldC5vYnNlcnZhdGlvbnMuY291bnQpLCB7XG4gICAgICAgIGNvbG9yczogW2hleF0sXG4gICAgICAgIG9wYWNpdHk6IHZpZXcub3BhY2l0eSxcbiAgICAgICAgbXV0ZWQsXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGNvbnN0IGNvbHVtbjogU3BhdGlhbENvbHVtbiA9IGF3YWl0IHBvcnQuZ2V0Q29sdW1uKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAoaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBlbmNvZGVDYXRlZ29yaWNhbChjb2x1bW4uY29kZXMsIHtcbiAgICAgICAgICBjb2xvcnM6IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2x1bW4ubWV0YSksXG4gICAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICAgIG11dGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgQ2VsbHMgcGFuZWwgaGlkZSB0aGVpciBkb3RzIHRvbywgd2hlbiB0aGUgZG90cyBhcmVcbiAgICAgICAgLy8gY29sb3VyZWQgYnkgdGhhdCBzYW1lIGdyb3VwaW5nLlxuICAgICAgICBjb25zdCBncm91cENvbHVtbiA9IGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgICBpZiAodmlldy5oaWRkZW5Hcm91cHM/Lmxlbmd0aCAmJiBncm91cENvbHVtbiA9PT0gY29sb3JCeS5uYW1lKSB7XG4gICAgICAgICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgICAgICAgY29uc3QgaGlkZSA9IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMubWFwKChjKSA9PiBvZmYuaGFzKGMpKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbi5jb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNvbHVtbi5jb2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChjICE9PSBOT19DQVRFR09SWSAmJiBoaWRlW2NdKSByZ2JhWzQgKiBpICsgM10gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHJnYmEpO1xuICAgICAgfVxuICAgICAgLy8gQSBjb250aW51b3VzIGNvbHVtbiBtYXkgY2FycnkgaXRzIG93biBsb2cgaGludCAoY291bnRzKTsgdGhlIHZpZXcnc1xuICAgICAgLy8gdG9nZ2xlIHdpbnMgb25jZSB0aGUgdXNlciBoYXMgc2V0IGl0LlxuICAgICAgcmV0dXJuIHRvUmdiYVR1cGxlcyh0aGlzLmVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgICAgICBjb2x1bW4udmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLCBtdXRlZCxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3Rvcihjb2xvckJ5Lm5hbWUpO1xuICAgIHJldHVybiB0b1JnYmFUdXBsZXModGhpcy5lbmNvZGVTcGF0aWFsQ29udGludW91cyhcbiAgICAgIHZhbHVlcywgdmlldywgdmlldy5sb2dTY2FsZSwgbXV0ZWQsXG4gICAgKSk7XG4gIH1cblxuICAvKiogQ29udGludW91cyB2YWx1ZXMg4oaSIFJHQkEgdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIGFuZCBhIGNsaXBwZWQgd2luZG93LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgIHZhbHVlczogRmxvYXQzMkFycmF5LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBsb2c6IGJvb2xlYW4sXG4gICAgbXV0ZWQ6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCxcbiAgKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICBjb25zdCBsdXQgPSBzcGF0aWFsQ29udGludW91c0x1dChcbiAgICAgIG5vZGU/LmRhdGE/LnZhbHVlLCB0aGlzLmN1cnJlbnRSZXZlcnNlLCB2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCxcbiAgICApO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbnRyYXN0V2luZG93KHZhbHVlcywgbG8sIGhpKTtcbiAgICByZXR1cm4gZW5jb2RlQ29udGludW91cyh2YWx1ZXMsIHsgbHV0LCBtaW4sIG1heCwgbG9nLCBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksIG11dGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU0NBVFRFUjNEIDNEIHNjYXR0ZXI6IHRoZSBkb3duc2FtcGxlZCB2b3hlbCBncmlkIGFzIGEgM0QgcG9pbnQgY2xvdWQgY29sb3JlZFxuICAgKiBieSBpbnRlbnNpdHkgKG5hcGFyaS1qcyBhbmFsb2cgb2YgUGxvdGx5J3Mgdm94ZWwgc2NhdHRlcjNkKS4gQXNzZW1ibGVzIGEgY29hcnNlIHZvbHVtZSwgdGhlblxuICAgKiBlbWl0cyBhIGZsYXQtc3RyaWRlZCBzYW1wbGUgb2Ygdm94ZWxzIChjYXBwZWQgYXQge0BsaW5rIFNDQVRURVIzRF9NQVhfUE9JTlRTfSkgdmlhIGBhZGRQb2ludHMzRGAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2NhdHRlcjNkKHZpZXdlcjogVmlld2VyLCBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHZvbHVtZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgbGV0IHZvbDogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgZGVwdGg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywge1xuICAgICAgICBtYXhTbGljZTogTWF0aC5taW4ocmVzLm1heFNsaWNlLCBTQ0FUVEVSM0RfTUFYX1hZKSxcbiAgICAgICAgc2xpY2VTdGVwOiByZXMuc2xpY2VTdGVwLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICAgIGlmICghdm9sIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfSA9IHZvbDtcbiAgICBjb25zdCB6U2NhbGUgPSBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSAvIE1hdGgubWF4KDEsIGRlcHRoKTsgLy8g4omIIGN1YmljIGFzcGVjdFxuICAgIGNvbnN0IHRvdGFsID0gd2lkdGggKiBoZWlnaHQgKiBkZXB0aDtcbiAgICBjb25zdCBzdHJpZGUgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWwgLyBTQ0FUVEVSM0RfTUFYX1BPSU5UUykpO1xuICAgIGNvbnN0IHBvczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB2YWw6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3RhbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIGNvbnN0IHggPSBpICUgd2lkdGg7XG4gICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpIC8gd2lkdGgpICUgaGVpZ2h0O1xuICAgICAgY29uc3QgemkgPSBNYXRoLmZsb29yKGkgLyAod2lkdGggKiBoZWlnaHQpKTtcbiAgICAgIHBvcy5wdXNoKHgsIHksIHppICogelNjYWxlKTtcbiAgICAgIHZhbC5wdXNoKGRhdGFbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpWzBdO1xuICAgIHRoaXMuc2NhdHRlcjNkTGF5ZXIgPSB2aWV3ZXIuYWRkUG9pbnRzM0QobmV3IEZsb2F0MzJBcnJheShwb3MpLCBuZXcgRmxvYXQzMkFycmF5KHZhbCksIHtcbiAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICBzaXplOiAzLFxuICAgIH0pO1xuICAgIHRoaXMuaW1hZ2VXID0gd2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBoZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0geyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuICAgIC8vIEZlZWQgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gZnJvbSB0aGUgYXNzZW1ibGVkIHZvbHVtZSAoa2V5IDApLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBkYXRhKTtcbiAgICB0aGlzLnN1YnNjcmliZVNjYXR0ZXIzZERpc3BsYXlTdGF0ZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIFN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgM0Qgc2NhdHRlcidzIGNvbG9ybWFwICsgY29udHJhc3QuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHNbMF07XG4gICAgICBsYXllci5jb2xvcm1hcCA9IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpO1xuICAgICAgaWYgKHN0KSBsYXllci5jb250cmFzdExpbWl0cyA9IFtzdC5taW4sIHN0Lm1heF07XG4gICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU1VSRkFDRSBoZWlnaHQtZmllbGQgc3VyZmFjZS4gQSBoZWlnaHQgZmllbGQgaXMgc2luZ2xlLXNjYWxhciwgc28gZm9yIGFcbiAgICogbXVsdGljaGFubmVsIGltYWdlIHRoZSBzdXJmYWNlIGZvbGxvd3MgT05FIGJhbmQg4oCUIHRoZSBmaXJzdCB2aXNpYmxlIGNoYW5uZWwgKGZhbGxiYWNrIDApIOKAlFxuICAgKiBjb2xvdXJlZCBieSB0aGF0IGNoYW5uZWwncyB3aW5kb3cvY29sb3JtYXAgKGxpa2UgdGhlIFBsb3RseSBTVVJGQUNFLCB3aGljaCBpcyBncmF5c2NhbGUtb25seSkuXG4gICAqIFByZS1sb2FkcyBldmVyeSBzbGljZSdzIGhlaWdodCBkYXRhIHdpdGggYSBwcm9ncmVzcyBiYXIgKGFzIHRoZSB2b2x1bWUgZG9lcykgc28gdGhlIHN0YWNrXG4gICAqIHNsaWRlciByZS1zbGljZXMgaW5zdGFudGx5LCB0aGVuIGJ1aWxkcyB0aGUgbWVzaCBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuIEFsbCBtZXNoICsgR1BVIHdvcmtcbiAgICogbGl2ZXMgaW4gbmFwYXJpLWpzIChgaGVpZ2h0RmllbGRgICsgYFZpZXdlci5hZGRTdXJmYWNlYCk7IHRoaXMgYmFja2VuZCBzdXBwbGllcyBzY2FsYXIgc2xpY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFN1cmZhY2Uodmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgLy8gU2VydmVybGVzcyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbFVybHMpIGhhcyBubyBkZXNjcmlwdG9yIOKAlCBkZXRlY3RcbiAgICAvLyBpdCBmcm9tIGltYWdlTWV0YSBzbyB0aGUgU3VyZmFjZSBzdGlsbCBmb2xsb3dzIG9uZSBiYW5kLlxuICAgIGNvbnN0IHNpbXBsZU1jID0gdGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbmZvKSAmJiAhIWluZm8/LmNoYW5uZWxVcmxzPy5sZW5ndGhcbiAgICAgICYmIChpbmZvPy5pbWFnZU1ldGE/LlswXT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSBzaW1wbGVNYyB8fCAoISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgKGRlc2M/LmNoYW5uZWxzID8/IDEpID4gMSk7XG4gICAgdGhpcy5zdXJmYWNlTXVsdGljaGFubmVsID0gbXVsdGljaGFubmVsO1xuICAgIC8vIEEgaGVpZ2h0IGZpZWxkIGlzIHNpbmdsZS1zY2FsYXIg4oaSIGZvbGxvdyB0aGUgcGFuZS1TRUxFQ1RFRCBjaGFubmVsLlxuICAgIHRoaXMuc3VyZmFjZUNoYW5uZWwgPSBtdWx0aWNoYW5uZWwgPyB0aGlzLnN0b3JlLmN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN1cmZhY2VNYXhHcmlkID0gc3VyZmFjZVJlc29sdXRpb25Gb3IodGhpcy5yZXNvbHV0aW9uU2NhbGUpLm1heEdyaWQ7XG4gICAgdGhpcy5pbWFnZU1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIGF3YWl0IHRoaXMucHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyKTtcbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRTdXJmYWNlKHZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCk7XG4gICAgdGhpcy5pbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyKTtcbiAgICAvLyBTdWJzY3JpYmUgYWZ0ZXIgdGhlIGZpcnN0IGJ1aWxkIHNvIGRpc3BsYXktc3RhdGUgZWRpdHMgdGFyZ2V0IGEgbGl2ZSBsYXllci5cbiAgICB0aGlzLnN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTtcbiAgfVxuXG4gIC8qKiBBZGQgdGhlIDNEIGF4ZXMgZ2l6bW8gKyBET00gbGFiZWxzIGFyb3VuZCB0aGUgKG9yaWdpbi1jZW50ZXJlZCkgc3VyZmFjZSBtZXNoLCBtYXRjaGluZyB0aGVcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlLiBJbnN0YWxsZWQgb25jZSBwZXIgbW91bnQ7IHRoZSBib3ggdHJhY2tzIHRoZSBtZXNoIGJvdW5kcywgWC9ZIHNob3cgdGhlXG4gICAqICBwaHlzaWNhbCAob3IgcGl4ZWwpIGV4dGVudCwgYW5kIFogaXMgdGhlIGludGVuc2l0eS9oZWlnaHQgYXhpcy4gKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3VyZmFjZUF4ZXModmlld2VyOiBWaWV3ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VyZmFjZUxheWVyKSByZXR1cm47XG4gICAgY29uc3QgYiA9IHRoaXMuc3VyZmFjZUxheWVyLmJvdW5kcygpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1heCgxLCBiLm1heFswXSAtIGIubWluWzBdKTtcbiAgICBjb25zdCBib3hIID0gTWF0aC5tYXgoMSwgYi5tYXhbMV0gLSBiLm1pblsxXSk7XG4gICAgY29uc3QgYm94RCA9IE1hdGgubWF4KDEsIGIubWF4WzJdIC0gYi5taW5bMl0pO1xuICAgIGNvbnN0IG1wcFggPSB0aGlzLmRlc2NyaXB0b3I/Lm1wcFggfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby5pbWFnZU1ldGE/LlswXT8ubXBwWCB8fCAwO1xuICAgIGNvbnN0IHZveGVsID0gbXBwWCA+IDAgPyAobXBwWCAqICh0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXKSkgLyBNYXRoLm1heCgxLCB0aGlzLmltYWdlVykgOiAxO1xuICAgIHRoaXMuYXhlc0xheWVyID0gdmlld2VyLmFkZEF4ZXMoYm94VywgYm94SCwgYm94RCwge1xuICAgICAgdm94ZWxTaXplOiBbdm94ZWwsIHZveGVsLCAxXSxcbiAgICAgIHZpc2libGU6IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5heGVzTGFiZWxzID0gbmV3IE5hcGFyaUF4ZXNMYWJlbHMoXG4gICAgICAgIHRoaXMuaG9zdCxcbiAgICAgICAgdmlld2VyLmNhbWVyYTNkLFxuICAgICAgICB0aGlzLmJ1aWxkU3VyZmFjZUF4ZXNMYWJlbHMoYm94VywgYm94SCwgYm94RCwgbXBwWCksXG4gICAgICApO1xuICAgICAgdGhpcy5heGVzTGFiZWxzLnNldFZpc2libGUodGhpcy5heGVzVmlzaWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFgvWS9aIGVuZC1sYWJlbHMgZm9yIHRoZSBzdXJmYWNlIGdpem1vOiBYL1kgYXJlIHRoZSBwaHlzaWNhbCAowrVtKSBvciBwaXhlbCBleHRlbnQgb2YgdGhlIEZVTExcbiAgICogIGltYWdlOyBaIGlzIHRoZSBpbnRlbnNpdHkvaGVpZ2h0IGF4aXMuIEFuY2hvcnMgYXJlIGluIHRoZSBjZW50ZXJlZCBib3ggKG1hdGNoaW5nIEF4ZXNMYXllcikuICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlQXhlc0xhYmVscyhcbiAgICBib3hXOiBudW1iZXIsXG4gICAgYm94SDogbnVtYmVyLFxuICAgIGJveEQ6IG51bWJlcixcbiAgICBtcHBYOiBudW1iZXIsXG4gICk6IEF4aXNMYWJlbFNwZWNbXSB7XG4gICAgY29uc3QgaHggPSBib3hXIC8gMjtcbiAgICBjb25zdCBoeSA9IGJveEggLyAyO1xuICAgIGNvbnN0IGh6ID0gYm94RCAvIDI7XG4gICAgY29uc3QgZGVzY1cgPSB0aGlzLmRlc2NyaXB0b3I/LndpZHRoID8/IHRoaXMuaW1hZ2VXO1xuICAgIGNvbnN0IGRlc2NIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gdGhpcy5pbWFnZUg7XG4gICAgY29uc3QgbGVuID0gKHB4OiBudW1iZXIpOiBzdHJpbmcgPT4gKG1wcFggPiAwID8gZm9ybWF0VW0ocHggKiBtcHBYKSA6IGAke3B4fSBweGApO1xuICAgIHJldHVybiBbXG4gICAgICB7IGFuY2hvcjogW2h4LCAtaHksIC1oel0sIHRleHQ6IGBYIMK3ICR7bGVuKGRlc2NXKX1gLCBjb2xvcjogJyNlZDQ1NDUnIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgaHksIC1oel0sIHRleHQ6IGBZIMK3ICR7bGVuKGRlc2NIKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICB7IGFuY2hvcjogWy1oeCwgLWh5LCBoel0sIHRleHQ6ICdaIMK3IGludGVuc2l0eScsIGNvbG9yOiAnIzY2OGNmZicgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1mZXRjaCBldmVyeSBzdGFjayBzbGljZSdzIGx1bWluYW5jZSBwbGFuZSAoZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpIGludG9cbiAgICoge0BsaW5rIHN1cmZhY2VQbGFuZXN9LCBkcml2aW5nIHtAbGluayBzdGFja0xvYWRpbmdQcm9ncmVzcyR9IOKAlCB0aGUgc2FtZSBsb2FkLXdpdGgtcHJvZ3Jlc3MgVVhcbiAgICogYXMgdGhlIHZvbHVtZSwgYnV0IGtlZXBpbmcgb25lIDJEIHBsYW5lIHBlciBzbGljZSByYXRoZXIgdGhhbiBwYWNraW5nIGEgM0Qgdm9sdW1lLiBCb3VuZGVkXG4gICAqIGNvbmN1cnJlbmN5IGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeSB3aXRob3V0IGZsb29kaW5nIGl0IG9uIGEgZGVlcCBzdGFjay5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlbG9hZFN1cmZhY2VQbGFuZXModmlld2VyOiBWaWV3ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMubG9hZFRva2VuOyAvLyBiYWlsIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpcyB3aGlsZSB3ZSBmZXRjaFxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlcHRoID0gaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LnogfHwgaW5mbz8udXJscz8ubGVuZ3RoIHx8IDE7XG4gICAgY29uc3QgeyBtYXhHcmlkIH0gPSBzdXJmYWNlUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdXJmYWNlUGxhbmVzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgZGVwdGg7IHorKykgcGVuZGluZy5wdXNoKHopO1xuICAgICAgbGV0IGRvbmUgPSAwO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgeiA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICBpZiAoeiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIgfHwgdGhpcy5sb2FkVG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5zZXQoeiwgYXdhaXQgdGhpcy5mZXRjaFN1cmZhY2VQbGFuZSh6LCBtYXhHcmlkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIHN1cmZhY2Ugc2xpY2UgJHt6fSBwcmVsb2FkIGZhaWxlZGAsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvbmUrKztcbiAgICAgICAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KE1hdGgucm91bmQoKGRvbmUgLyBkZXB0aCkgKiAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvb2wgPSBNYXRoLm1pbihWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1ksIE1hdGgubWF4KDEsIGRlcHRoKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb29sIH0sICgpID0+IHdvcmtlcigpKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHNsaWNlIGB6YCBhcyBhIHNpbmdsZSBXSE9MRS1pbWFnZSBsdW1pbmFuY2UgcGxhbmUgKGRlY2ltYXRlZCB0byBgbWF4R3JpZGApLiBQcmVmZXJzIHRoZVxuICAgKiBhcHAncyBjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgKGBzbWFsbFVybHNgL2B1cmxzYCwgZXhhY3RseSBsaWtlIHRoZSBQbG90bHkgc3VyZmFjZSkgc28gdGhlXG4gICAqIHN1cmZhY2UgYWx3YXlzIGNvdmVycyB0aGUgRlVMTCBzbGljZSDigJQgdGhlIHRpbGUtcHlyYW1pZCBgZmV0Y2hTbGljZWAgcGF0aCB3b3VsZCBmYWxsIGJhY2sgdG8gYVxuICAgKiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAoYSBjb3JuZXIpIGZvciBzZWxmLWNvbnRhaW5lZCAvIG5vbi1gL3RpbGVzL2luZm9gIGltYWdlcy4gRmFsbHMgYmFjayB0b1xuICAgKiBzdGl0Y2hpbmcgdGhlIHRpbGUgZ3JpZCBvbmx5IHdoZW4gbm8gY29tcGxldGUtaW1hZ2UgVVJMIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIC8qKiBUaWxlIGJ1ZGdldCB0byBzdGl0Y2ggYSB3aG9sZSBzbGljZSBhdCB+YHRhcmdldFB4YCByZXNvbHV0aW9uIGZyb20gdGhlIHB5cmFtaWQ6IGEgaGlnaGVyIHRhcmdldFxuICAgKiAgcHVsbHMgYSBGSU5FUiBweXJhbWlkIGxldmVsIChtb3JlIHJlYWwgZGV0YWlsKS4gU2hhcmVkIGJ5IHRoZSBzdXJmYWNlIHBsYW5lIGZldGNoIGFuZCB0aGUgdm9sdW1lXG4gICAqICBhc3NlbWJseSBzbyBib3RoIHNjYWxlIHRoZWlyIGluLXBsYW5lIHJlc29sdXRpb24gd2l0aCB0aGUgZGVjaW1hdGUgZmFjdG9yLiAqL1xuICBwcml2YXRlIHRpbGVCdWRnZXRGb3IodGFyZ2V0UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLmRlc2NyaXB0b3I/LnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICBNQVhfU1RJVENIX1RJTEVTLFxuICAgICAgTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgodGFyZ2V0UHggLyB0aWxlU2l6ZSkgKiogMiAqIFNUSVRDSF9CVURHRVRfQ09FRkYpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN1cmZhY2VQbGFuZShcbiAgICB6OiBudW1iZXIsXG4gICAgbWF4R3JpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBsZXQgcGxhbmU6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gUHJlZmVycmVkOiBzdGl0Y2ggdGhlIFdIT0xFIHNsaWNlIGZyb20gdGhlIHNlcnZlciBweXJhbWlkIGF0IGEgcmVzb2x1dGlvbiBkcml2ZW4gYnkgdGhlXG4gICAgLy8gZGVjaW1hdGUgZmFjdG9yIOKAlCBhIGhpZ2hlciB0YXJnZXQgZ3JpZCBwdWxscyBhIEZJTkVSIHB5cmFtaWQgbGV2ZWwgKG1vcmUgcmVhbCBkZXRhaWwpLiBXaXRoIGFcbiAgICAvLyBkZXNjcmlwdG9yLCBmZXRjaFNsaWNlIHN0aXRjaGVzIHRoZSB3aG9sZSBjaG9zZW4gbGV2ZWwgKG5ldmVyIGEgY29ybmVyKSwgdGhlbiB3ZSBkb3duc2NhbGUgdG9cbiAgICAvLyB0aGUgZ3JpZC4gVGhpcyBpcyB3aGF0IG1ha2VzIFwiRnVsbFwiIGFjdHVhbGx5IGhpZ2hlci1yZXMgdGhhbiBcIsK9XCIsIG5vdCBqdXN0IGEgZml4ZWQgcHJldmlldy5cbiAgICBpZiAoZGVzYz8ubGV2ZWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMudGlsZUJ1ZGdldEZvcihtYXhHcmlkKTtcbiAgICAgIC8vIFRoZSBzdXJmYWNlIGlzIGEgc2luZ2xlIGRlY2ltYXRlZCBwbGFuZSwgc28gdGhlIGNvbXBvc2l0ZSBmYWxsYmFjayBpcyBhY2NlcHRhYmxlIHdoZW4gdGhlXG4gICAgICAvLyBjaGFubmVsIGhhcyBubyBzbWFsbCBweXJhbWlkIGxldmVsIChrZWVwcyBpdCBmYXN0KTsgYSBtdWx0aWNoYW5uZWwgVk9MVU1FIG11c3Qgbm90IGRvIHRoaXMuXG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCBidWRnZXQsIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAobm8gcHlyYW1pZCk6IHRoZSBhcHAncyBDT01QTEVURSBwZXItc2xpY2UgaW1hZ2UgKHVybHNbel0sIG5vdCB0aGUgc21hbGwgYmx1cnJ5XG4gICAgLy8gdGh1bWJuYWlsKSDigJQgd2hvbGUgc2xpY2UsIGF2b2lkcyBhIGNvcm5lciB0aWxlLiBDYXBwZWQgYXQgdGhlIGltYWdlJ3Mgb3duIHJlc29sdXRpb24uXG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgY29uc3QgdXJsID0gaW5mbz8udXJscz8uW3pdID8/IGluZm8/LnNtYWxsVXJscz8uW3pdO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpLCBtYXhHcmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gc3VyZmFjZSB1cmwgZmV0Y2ggZmFpbGVkIGZvciB6PSR7en1gLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGFzdCByZXNvcnQgKG5vIHB5cmFtaWQgYW5kIG5vIGNvbXBsZXRlIGltYWdlKTogYSBzaW5nbGUgdGlsZS5cbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICBwbGFuZSA9IHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6LCB0aGlzLnN1cmZhY2VDaGFubmVsLCB0aGlzLnRpbGVCdWRnZXRGb3IobWF4R3JpZCksIHRydWUpLFxuICAgICAgICBtYXhHcmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBsYW5lO1xuICB9XG5cbiAgLyoqIFRoZSBjaGFubmVsIHN0YXRlIGRyaXZpbmcgdGhlIHN1cmZhY2U6IHRoZSBjaG9zZW4gYmFuZCBmb3IgbXVsdGljaGFubmVsIChtYXRjaGVkIGJ5IGluZGV4KSxcbiAgICogIGVsc2UgdGhlIHNpbmdsZSBncmF5c2NhbGUgY2hhbm5lbC4gKi9cbiAgcHJpdmF0ZSBzdXJmYWNlU3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IElDaGFubmVsU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN1cmZhY2VDaGFubmVsID09IG51bGwpIHJldHVybiBjaGFubmVsc1swXTtcbiAgICByZXR1cm4gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gdGhpcy5zdXJmYWNlQ2hhbm5lbCkgPz8gY2hhbm5lbHNbMF07XG4gIH1cblxuICAvKipcbiAgICogKFJlKWJ1aWxkIHRoZSBzdXJmYWNlIG1lc2ggZm9yIHNsaWNlIGB6YCBmcm9tIHRoZSBwcmUtbG9hZGVkIHBsYW5lIGNhY2hlIChpbnN0YW50IOKAlCB0aGlzIGlzXG4gICAqIHdoYXQgdGhlIHN0YWNrIHNsaWRlciBjYWxscyk7IGEgc2xpY2UgbWlzc2luZyBmcm9tIHRoZSBjYWNoZSBpcyBmZXRjaGVkIG9uIGRlbWFuZC4gbmFwYXJpLWpzJ3NcbiAgICogcHVyZSBgaGVpZ2h0RmllbGRgIGJ1aWxkcyB0aGUgdHJpYW5nbGUgZ3JpZCAoeiA9IG5vcm1hbGl6ZWQgaW50ZW5zaXR5KSwgdGhlbiBgYWRkU3VyZmFjZWBcbiAgICogcmVuZGVycyBpdC4gVGhlIHNsaWNlIHBsYW5lIGFsc28gZmVlZHMgdGhlIGludGVuc2l0eSBoaXN0b2dyYW0gKGtleSAwKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTdXJmYWNlKHZpZXdlcjogVmlld2VyLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGxhbmUgPSB0aGlzLnN1cmZhY2VQbGFuZXMuZ2V0KHopO1xuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGxhbmUgPSBhd2FpdCB0aGlzLmZldGNoU3VyZmFjZVBsYW5lKHosIHRoaXMuc3VyZmFjZU1heEdyaWQpO1xuICAgICAgICB0aGlzLnN1cmZhY2VQbGFuZXMuc2V0KHosIHBsYW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHNsaWNlIGZldGNoIGZhaWxlZDonLCBlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBsYW5lIHx8IHBsYW5lLndpZHRoIDwgMiB8fCBwbGFuZS5oZWlnaHQgPCAyIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IHN0ID0gdGhpcy5zdXJmYWNlU3RhdGUodGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpKTtcbiAgICBjb25zdCB3aW46IFtudW1iZXIsIG51bWJlcl0gPSBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV07XG4gICAgdGhpcy5zdXJmYWNlV2luZG93ID0gd2luO1xuICAgIC8vIEhlaWdodCBBTkQgY29sb3VyIGFyZSBub3JtYWxpemVkIGJ5IHRoZSBzYW1lIGNvbnRyYXN0IHdpbmRvdywgc28gY2hhbmdpbmcgbWluL21heCByZXNoYXBlcyB0aGVcbiAgICAvLyBzdXJmYWNlIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKS4gQ2VudGVyIGl0IGZvciB0aGUgYXhlcyBnaXptby4gVGhlXG4gICAgLy8gcGxhbmUgaXMgYWxyZWFkeSBkZWNpbWF0ZWQgdG8gdGhlIGdyaWQgY2FwIOKGkiBzdHJpZGUgMS5cbiAgICBjb25zdCB6U2NhbGUgPSBTVVJGQUNFX1pfQVNQRUNUICogTWF0aC5tYXgocGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCk7XG4gICAgY29uc3QgeyB2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcyB9ID0gaGVpZ2h0RmllbGQocGxhbmUuZGF0YSwgcGxhbmUud2lkdGgsIHBsYW5lLmhlaWdodCwge1xuICAgICAgelNjYWxlLFxuICAgICAgekxpbWl0czogd2luLFxuICAgICAgY2VudGVyOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUHJlc2VydmUgdGhlIG9yYml0IGNhbWVyYSBhY3Jvc3MgYSByZS1zbGljZSAvIHdpbmRvdyByZWJ1aWxkIOKAlCBvbmx5IHRoZSBmaXJzdCBtb3VudCBmcmFtZXMsIHNvXG4gICAgLy8gc3RlcHBpbmcgdGhlIHN0YWNrIG9yIGNoYW5naW5nIHRoZSB3aW5kb3cga2VlcHMgdGhlIGN1cnJlbnQgem9vbS9wYW4vb3JpZW50YXRpb24uXG4gICAgY29uc3QgY2FtID0gdmlld2VyLmNhbWVyYTNkO1xuICAgIGNvbnN0IHByZXNlcnZlQ2FtZXJhID0gdGhpcy5zdXJmYWNlTGF5ZXIgIT0gbnVsbDtcbiAgICBjb25zdCBzYXZlZFRhcmdldCA9IGNhbS50YXJnZXQ7XG4gICAgY29uc3Qgc2F2ZWREaXN0YW5jZSA9IGNhbS5kaXN0YW5jZTtcbiAgICBpZiAodGhpcy5zdXJmYWNlTGF5ZXIpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3VyZmFjZUxheWVyKTtcbiAgICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zdXJmYWNlTGF5ZXIgPSB2aWV3ZXIuYWRkU3VyZmFjZSh2ZXJ0aWNlcywgZmFjZXMsIHZhbHVlcywge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IHdpbixcbiAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgIHdpcmVmcmFtZTogdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH0pO1xuICAgIGlmIChwcmVzZXJ2ZUNhbWVyYSkge1xuICAgICAgY2FtLnRhcmdldCA9IHNhdmVkVGFyZ2V0O1xuICAgICAgY2FtLmRpc3RhbmNlID0gc2F2ZWREaXN0YW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmltYWdlVyA9IHBsYW5lLndpZHRoO1xuICAgIHRoaXMuaW1hZ2VIID0gcGxhbmUuaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IHsgd2lkdGg6IHBsYW5lLndpZHRoLCBoZWlnaHQ6IHBsYW5lLmhlaWdodCwgZGVwdGg6IE1hdGgubWF4KDEsIE1hdGgucm91bmQoelNjYWxlKSkgfTtcbiAgICAvLyBSZXVzZSB0aGUgdm9sdW1lIGludGVuc2l0eS1oaXN0b2dyYW0gcGF0aDogdGhlIHNsaWNlJ3Mgc2NhbGFyIHBsYW5lIGlzIHRoZSBoaXN0b2dyYW0gc291cmNlLlxuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLnNldCgwLCBwbGFuZS5kYXRhKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgdGhlIHN0b3JlIGNvbG9ybWFwIC8gcmV2ZXJzZSAvIGludmVydCAvIGNoYW5uZWwgd2luZG93IOKGkiB0aGUgc3VyZmFjZSwgc28gaGlzdG9ncmFtXG4gICAqICAmIGNoYW5uZWwtZGlhbG9nIGVkaXRzIHVwZGF0ZSBpdCBsaXZlIHdpdGhvdXQgYSByZS1mZXRjaC4gKiptaW4vbWF4IHJlc2hhcGVzIHRoZSBzdXJmYWNlJ3NcbiAgICogIGhlaWdodCoqIChhIHBpeGVsJ3MgaGVpZ2h0ID0gaXRzIGludGVuc2l0eSB3aXRoaW4gW21pbixtYXhdKSwgc28gYSB3aW5kb3cgY2hhbmdlIHJlYnVpbGRzIHRoZVxuICAgKiAgbWVzaCBnZW9tZXRyeSAoZnJvbSB0aGUgY2FjaGVkIHNsaWNlKTsgY29sb3VyLW9ubHkgZWRpdHMgKGNvbG9ybWFwL0xVVCwgZ2FtbWEsIHJldmVyc2UsIGludmVydClcbiAgICogIGp1c3QgdXBkYXRlIHRoZSBsYXllcidzIHVuaWZvcm1zLiAqL1xuICBwcml2YXRlIHN1YnNjcmliZVN1cmZhY2VEaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0U2VsZWN0ZWRDaGFubmVsKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHMsIHNlbGVjdGVkXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLmludmVydEVuYWJsZWQgPSBpbnZlcnQ7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMuc3VyZmFjZUxheWVyO1xuICAgICAgaWYgKCFsYXllciB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgY2hhbmdlZCAobXVsdGljaGFubmVsKTogcmUtZmV0Y2ggVEhBVCBiYW5kJ3MgcGxhbmVzIGFuZFxuICAgICAgLy8gcmVidWlsZCB0aGUgaGVpZ2h0LWZpZWxkIGZvciB0aGUgY3VycmVudCBzbGljZS5cbiAgICAgIGlmICh0aGlzLnN1cmZhY2VNdWx0aWNoYW5uZWwgJiYgc2VsZWN0ZWQgIT09IHRoaXMuc3VyZmFjZUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zdXJmYWNlQ2hhbm5lbCA9IHNlbGVjdGVkO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcmVsb2FkU3VyZmFjZVBsYW5lcyh0aGlzLnZpZXdlciEpO1xuICAgICAgICAgIGlmICh0aGlzLnZpZXdlcikgYXdhaXQgdGhpcy5idWlsZFN1cmZhY2UodGhpcy52aWV3ZXIsIHRoaXMubG9hZGVkPy56ID8/IDApO1xuICAgICAgICB9KSgpLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHN1cmZhY2UgY2hhbm5lbCBzd2l0Y2ggZmFpbGVkOicsIGVycikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdCA9IHRoaXMuc3VyZmFjZVN0YXRlKGNoYW5uZWxzKTtcbiAgICAgIGNvbnN0IHdpbjogW251bWJlciwgbnVtYmVyXSA9IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XTtcbiAgICAgIGNvbnN0IHdpbmRvd0NoYW5nZWQgPVxuICAgICAgICAhdGhpcy5zdXJmYWNlV2luZG93IHx8IHdpblswXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzBdIHx8IHdpblsxXSAhPT0gdGhpcy5zdXJmYWNlV2luZG93WzFdO1xuICAgICAgaWYgKHdpbmRvd0NoYW5nZWQpIHtcbiAgICAgICAgLy8gSGVpZ2h0IGZvbGxvd3MgdGhlIGNvbnRyYXN0IHdpbmRvdyDihpIgcmVidWlsZCB0aGUgbWVzaCBmb3IgdGhlIG5ldyBbbWluLG1heF0gKGNhbWVyYSBrZXB0KS5cbiAgICAgICAgdm9pZCB0aGlzLmJ1aWxkU3VyZmFjZSh0aGlzLnZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBzdXJmYWNlIHdpbmRvdyByZWJ1aWxkIGZhaWxlZDonLCBlcnIpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDb2xvdXItb25seSBjaGFuZ2U6IHVwZGF0ZSB1bmlmb3JtcyBpbiBwbGFjZSwgbm8gZ2VvbWV0cnkgcmVidWlsZC5cbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIHtcbiAgICAgICAgbGF5ZXIuY29udHJhc3RMaW1pdHMgPSB3aW47XG4gICAgICAgIGxheWVyLmdhbW1hID0gc3QuZ2FtbWE7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpdENhbWVyYVNvb24oKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY2FudmFzICYmIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhLmZpdChcbiAgICAgICAgICB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmltYWdlSCxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5pbWFnZUgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJ1bik7XG4gICAgZWxzZSBydW4oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWM7IGhvc3QgcmUtZHJpdmVzIHBsb3QoKSBmcm9tIGl0cyBpbWFnZSBzdHJlYW0uICovXG4gIHJlbG9hZEFuZFBsb3QoKTogdm9pZCB7XG4gICAgLyogbm8tb3AgKi9cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRva2VuKys7IC8vIGludmFsaWRhdGUgYW55IGluLWZsaWdodCBmcmFtZSBsb2FkaW5nIGZyb20gdGhlIHByZXZpb3VzIHBsb3RcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gbnVsbDtcbiAgICB0aGlzLnNjYWxlQmFyPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zY2FsZUJhciA9IG51bGw7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LmRlc3Ryb3koKTtcbiAgICB0aGlzLm5hdmlnYXRvciA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nQmFkZ2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZSA9IG51bGw7XG4gICAgdGhpcy50aWxlTG9hZGluZyA9IFtdO1xuICAgIHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA9IDA7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5kZXN0cm95KCk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbnVsbDtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmF4ZXNMYWJlbHMgPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMudGlsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmY/LigpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSBudWxsO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5kZXRhY2goKTtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nID0gZW5hYmxlZDtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICB0aGlzLmNoYW5uZWxWaWV3Py5zZXRJbnRlcnBvbGF0aW9uKGVuYWJsZWQgPyAnbGluZWFyJyA6ICduZWFyZXN0Jyk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIHN0YWNrIG5hdmlnYXRlZCB2aWEgc2V0WkluZGV4ICovXG4gIH1cblxuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWQpIHRoaXMubG9hZGVkLnogPSB6SW5kZXg7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLm5hdmlnYXRvcikgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6SW5kZXgpO1xuICAgIC8vIFN1cmZhY2U6IG9uZSBzbGljZSDihpIgb25lIG1lc2gsIHNvIHJlLWJ1aWxkIHRoZSBoZWlnaHQgZmllbGQgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2b2lkIHRoaXMuYnVpbGRTdXJmYWNlKHYsIHpJbmRleCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc2V0WkluZGV4IHN1cmZhY2UgZmFpbGVkOicsIGVyciksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBWb2x1bWUgLyBpc29zdXJmYWNlOiBzdGVwIHRoZSB2b2x1bWUncyB6IHBsYW5lIGluIHBsYWNlLlxuICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRpbGVkIDJEIGltYWdlOiBqdXN0IG1vdmUgdGhlIGRpbXMgcGxhbmUg4oCUIHRoZSB0aWxlZCB2aXN1YWwgZmV0Y2hlcyB0aGUgbmV3IHNsaWNlJ3MgdGlsZXNcbiAgICAvLyAoY2FjaGVkIHBlciB6KSwgbm8gbGF5ZXIgcmVidWlsZC4gUmVmcmVzaCB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGUgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMudGlsZWQpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcikgdm9pZCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHpJbmRleCwgdGhpcy5kZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAyRCBpbWFnZSAoc3RpdGNoIGZhbGxiYWNrKTogcmUtcmVuZGVyIHRoZSBzbGljZSAocmUtZmV0Y2hlcyBwZXItY2hhbm5lbCAvIGNvbXBvc2l0ZSkuIEJyYW5jaFxuICAgIC8vIG9mIGEgdm9sdW1lIGxheWVyIChub3QgY3VycmVudFBsb3RUeXBlLCB3aGljaCBjb3VsZCBiZSBzdGFsZSBhbmQgc2lsZW50bHkgbm8tb3AgdGhlIHN3YXApLlxuICAgIC8vIFRoZSB0b2tlbiBsZXRzIHJlbmRlckltYWdlIGRyb3AgYSBzdXBlcnNlZGVkIHNjcnViIHNvIGEgc2xvdyBvbGRlciBzbGljZSBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLlxuICAgIGNvbnN0IHJlcSA9ICsrdGhpcy5zbGljZVJlcTtcbiAgICB2b2lkIHRoaXMucmVuZGVySW1hZ2UoekluZGV4LCByZXEpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChyZXEgIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgICAgLy8gQUZURVIgdGhlIGltYWdlLCBuZXZlciBiZWZvcmU6IHRoZSByZW5kZXIgY2xlYXJzIHRoZSBsYXllciBsaXN0LCBzb1xuICAgICAgICAvLyBtYXJrZXJzIGRyYXduIGZpcnN0IGFyZSB3aXBlZCBieSB0aGUgdmVyeSBpbWFnZSBtZWFudCB0byBzaXQgdW5kZXIgdGhlbS5cbiAgICAgICAgLy8gT3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgcGxhbmUgYWxzbyBkZWNpZGVzIHdoaWNoIG9ic2VydmF0aW9uc1xuICAgICAgICAvLyBhcmUgZHJhd24gYXQgYWxsLCBzbyB0aGlzIGlzIHdoYXQgbW92ZXMgdGhlIGNlbGxzIHdpdGggdGhlIHNlY3Rpb24uXG4gICAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICAgIC8vIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCwgc28gdGhlIHNlbGVjdG9yIGhpZGVzIGl0IHVudGlsIGEgZGF0YXNldCBpcyBwdWJsaXNoZWQuXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuU1BBVElBTF9PTUlDU10hLFxuICAgIF07XG4gIH1cblxuICAvKiogVGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gUmVhZCBieSB0aGUgdG9vbGJhciB0byBpbml0IHRoZSBjb250cm9sLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uU2NhbGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMuIFRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCAocmUpbG9hZCDigJQgdGhlIGhvc3RcbiAgICogIHJlLXBsb3RzIGFmdGVyIGNhbGxpbmcgdGhpcywgc2luY2UgZGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KF9kaXZJZDogc3RyaW5nLCBfcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQge1xuICAgIC8qIFBsb3RseSBvd25zIHRoZSBpbnRlbnNpdHkgaW5zZXQgKi9cbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuUmVhZGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBweCA9IGF3YWl0IHYucmVhZERpc3BsYXllZFBpeGVscygpO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgICBpZiAoc2l6ZSAmJiByZWN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoLCByZWN0LngpKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLndpZHRoIC0geCwgcmVjdC53aWR0aCkpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLmhlaWdodCAtIHksIHJlY3QuaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcmVhZGJhY2sgdW5hdmFpbGFibGUgKi9cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVhZGJhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgIGVsc2Ugc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucnVuUmVhZGJhY2soKSwgMCk7XG4gIH1cblxuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIOKAlCBhcm1lZCBvbiBjYW1lcmEgY2hhbmdlcyBzbyBgbGFzdFBpeGVsc2AgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYVxuICAgKiAgcGFuL3pvb20gc2V0dGxlcyAoYW5kIGFmdGVyIHRpbGVkIGxldmVscyBmaW5pc2ggbG9hZGluZyksIHdoaWNoIHRoZSBvbi1jYW52YXMgcGl4ZWwgdG9vbHNcbiAgICogICh3YW5kL2JydXNoL1NBTSkgcmVhZCBzeW5jaHJvbm91c2x5LiBDb2FsZXNjZXMgcmFwaWQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBhcm1SZWFkYmFjayhkZWxheU1zID0gMjUwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgICB2b2lkIHRoaXMucnVuUmVhZGJhY2soKTtcbiAgICB9LCBkZWxheU1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmUgKyBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBQaXhlbCB0b29sczogcmV1c2UgdGhlIHNoYXJlZCwgYmFja2VuZC1hZ25vc3RpYyB0b29sIHNlcnZpY2VzIHdpdGggYSBuYXBhcmkgaG9zdCDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQnVpbGQgdGhlIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdG9vbCBob3N0cyBmb3IgdGhlIGN1cnJlbnQgdmlld2VyIChjYWxsZWQgZnJvbSBwbG90KCkpLiBUaGVcbiAgICogIHBpeGVsIHRvb2xzIHJlYWQgZGlzcGxheWVkIHBpeGVscyBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgYW5kIGNvbnZlcnQgcG9pbnRlclxuICAgKiAgY29vcmRzIHZpYSB0aGUgbmFwYXJpIGNhbWVyYSwgZXhhY3RseSBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE5hcGFyaUNvb3JkaW5hdGVUcmFuc2Zvcm0oXG4gICAgICB0aGlzLnZpZXdlcixcbiAgICAgICgpID0+ICEhdGhpcy52aWV3ZXIgJiYgdGhpcy5pbWFnZVcgPiAwLFxuICAgICk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmU7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMubG9hZGVkPy56ID8/IDAsXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHJlZ2lvbnMuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9ucy5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocikgPT4gcmVnaW9ucy5zZXRSZWdpb25zKHIpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuaG9zdCxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLmNhY2hlZEltYWdlRGF0YSgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdklkLFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuaG9zdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXJlY3QpIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2IHx8ICF0aGlzLmNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCB2aCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIHYuY2FtZXJhLmNlbnRlciA9IFsoeDAgKyB4MSkgLyAyLCAoeTAgKyB5MSkgLyAyXTtcbiAgICB2LmNhbWVyYS56b29tID0gTWF0aC5taW4odncgLyB3LCB2aCAvIGgpO1xuICAgIHYucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIENhY2hlZEltYWdlRGF0YSBmcm9tIHRoZSBtb3N0IHJlY2VudCByZWFkYmFjayAoUkdCQSBkZXZpY2UgcGl4ZWxzIOKGkiBbeV1beF09W3IsZyxiXSksXG4gICAqICB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHMg4oaUIHJlYWRiYWNrIHBpeGVscy4gQ2FjaGVkIHVudGlsIHRoZSByZWFkYmFjayBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlRGF0YSgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBjb25zdCBweCA9IHRoaXMubGFzdFBpeGVscztcbiAgICBpZiAoIXB4IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuY2FjaGVkSW1hZ2UgJiYgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9PT0gcHgpIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICAgIGNvbnN0IHcgPSBweC53aWR0aDtcbiAgICBjb25zdCBoID0gcHguaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgcmVjdCBjYXB0dXJlZCBXSVRIIHRoaXMgcmVhZGJhY2sgKG5vdCB0aGUgbGl2ZSBvbmUpIHNvIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlXG4gICAgLy8gbWF0cml4J3MgY2FtZXJhIOKAlCBvdGhlcndpc2UgYSBwYW4vem9vbSBzaW5jZSB0aGUgcmVhZGJhY2sgbWlzLXNjYWxlcyB0aGUgdHJhY2VkIHJlZ2lvbi5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5sYXN0UGl4ZWxzUmVjdCA/PyB0aGlzLnZpZXdlci52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZSA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JlY3Qud2lkdGggLyB3LCByZWN0LmhlaWdodCAvIGhdLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLFxuICAgICAgb3JpZ2luWDogcmVjdC54LFxuICAgICAgb3JpZ2luWTogcmVjdC55LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IHB4O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElUb29sQ29udHJvbGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAvLyBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gIC8vIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFybVJlYWRiYWNrKDApO1xuICAgIGlmICh0aGlzLndhbmRIb3N0KSB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKChvcHRpb25zID8/IHt9KSBhcyB1bmtub3duIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zID8/IHt9KTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG5cbi8qKlxuICogQWRkaXRpdmVseSBjb21wb3NpdGUgZ3JheXNjYWxlIGNoYW5uZWwgaW1hZ2VzLCBlYWNoIHRpbnRlZCB3aXRoIGl0cyBkaXNwbGF5IGNvbG91ciDigJRcbiAqIHRoZSBuYXZpZ2F0b3IncyBwaWN0dXJlIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLlxuICovXG5mdW5jdGlvbiB0aW50ZWRDb21wb3NpdGUoaW1hZ2VzOiBJbWFnZUJpdG1hcFtdLCBjb2xvcnM6IHN0cmluZ1tdKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICBjb25zdCB3ID0gaW1hZ2VzWzBdPy53aWR0aCA/PyAxO1xuICBjb25zdCBoID0gaW1hZ2VzWzBdPy5oZWlnaHQgPz8gMTtcbiAgY29uc3Qgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIG91dC53aWR0aCA9IHc7XG4gIG91dC5oZWlnaHQgPSBoO1xuICBjb25zdCBjdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIGN0eC5maWxsU3R5bGUgPSAnIzAwMCc7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCB3LCBoKTtcbiAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRtcC53aWR0aCA9IHc7XG4gIHRtcC5oZWlnaHQgPSBoO1xuICBjb25zdCB0ID0gdG1wLmdldENvbnRleHQoJzJkJykhO1xuICBpbWFnZXMuZm9yRWFjaCgoaW1nLCBpKSA9PiB7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHQuZHJhd0ltYWdlKGltZywgMCwgMCwgdywgaCk7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbXVsdGlwbHknO1xuICAgIHQuZmlsbFN0eWxlID0gY29sb3JzW2ldO1xuICAgIHQuZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdsaWdodGVyJztcbiAgICBjdHguZHJhd0ltYWdlKHRtcCwgMCwgMCk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
4449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ08sZUFBZSxFQUFFLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQzVFLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLGVBQWUsRUFDZixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixzQkFBc0IsR0FDdkIsTUFBTSxXQUFXLENBQUM7QUFnQm5CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFDMkMsY0FBYyxFQUFFLG1CQUFtQixHQUNwRixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFDTCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUNwRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFDbkYseUJBQXlCLEVBQUUsb0JBQW9CLEdBQ2hELE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEw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LElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ2hELFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVztTQUMxQixDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxJ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QyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLENBQUMsQ0FBQyx3QkFBd0IsR0FBRyxhQUFhLENBQUM7UUFDM0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztRQUN4QyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLEdBQUcsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDekMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZyb20sIG9mLCBmaXJzdFZhbHVlRnJvbSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHtcbiAgVmlld2VyLFxuICBoaXN0b2dyYW1TY2FsYXIsXG4gIGNvbG9ybWFwRnJvbUx1dCxcbiAgdGludENvbG9ybWFwLFxuICByZXZlcnNlQ29sb3JtYXAsXG4gIGhlaWdodEZpZWxkLFxuICBMVVRfU0laRSxcbiAgTXVsdGlDaGFubmVsSW1hZ2VWaWV3LFxuICBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3LFxufSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUge1xuICBBeGVzTGF5ZXIsXG4gIEltYWdlTGF5ZXIsXG4gIFN1cmZhY2VMYXllcixcbiAgVm9sdW1lTGF5ZXIsXG4gIFBvaW50c0xheWVyLFxuICBQb2ludHMzRExheWVyLFxuICBUaWxlZFNvdXJjZSxcbiAgVGlsZUtleSxcbiAgUGl4ZWxDaHVuayxcbiAgQ2hhbm5lbFZpZXcsXG4gIFZvbHVtZUNoYW5uZWwsXG4gIENvbG9ybWFwLFxuICBQcm9qZWN0ZWRQb2ludHMsXG59IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBuZWFyZXN0UHJvamVjdGVkSW5kZXgsIFNjcmVlbkluZGV4LCBTQ1JFRU5fSU5ERVhfTUlOX1BPSU5UUyB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgYnVpbGRDb2xvcm1hcEx1dCwgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxDb2x1bW4sIFNwYXRpYWxEYXRhc2V0LCBTcGF0aWFsSW1hZ2VSZWYsIGZpbmRDb2x1bW5NZXRhLCBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBjb250cmFzdFdpbmRvdywgZW5jb2RlQ2F0ZWdvcmljYWwsIGVuY29kZUNvbnRpbnVvdXMsIG1hcmtlckRpYW1ldGVycyxcbiAgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLCB0b1JnYmFUdXBsZXMsIHBhcnNlSGV4LCBNSVNTSU5HX0NPTE9SLCBERUZBVUxUX01VVEVEX09QQUNJVFksXG4gIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVMsIHNwYXRpYWxDb250aW51b3VzTHV0LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgTk9fQ0FURUdPUlkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IFNwYXRpYWxPYnNlcnZhdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbiwgbWFza1RvSW5kaWNlcywgbXV0ZWRGcm9tU2VsZWN0aW9uLCBzYW1lU2VsZWN0aW9uLFxuICBzZWxlY3RCeUNhdGVnb3J5LFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7IGZyYW1lUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWZyYW1pbmcnO1xuaW1wb3J0IHsgUElYRUxfV09STERfUVVBTlRVTSwgd29ybGRRdWFudHVtRm9yRXh0ZW50IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC93b3JsZC1ncmlkJztcbmltcG9ydCB7IG9ic2VydmF0aW9uc0luU2xpY2UsIHZvbHVtZUltYWdlUmVmIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXZvbHVtZS1pbWFnZSc7XG5pbXBvcnQgeyBkZWZhdWx0U2lnbWEsIGRlbnNpdHlHcmlkLCByYXN0ZXJpemVEZW5zaXR5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWRlbnNpdHknO1xuaW1wb3J0IHsgb2JzZXJ2YXRpb25zSW5TZWN0aW9uLCBzZWN0aW9uc09mIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zJztcbmltcG9ydCB7IHR5cGUgSG92ZXJTb3VyY2UsIGhvdmVyVGV4dCwgbmVhcmVzdE9ic2VydmF0aW9uIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWhvdmVyJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUb29sdGlwIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC10b29sdGlwJztcbmltcG9ydCB7IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLCBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IE5hcGFyaU5hdmlnYXRvciB9IGZyb20gJy4vbmFwYXJpLW5hdmlnYXRvcic7XG5pbXBvcnQgeyBOYXBhcmlMb2FkaW5nQmFkZ2UgfSBmcm9tICcuL25hcGFyaS1sb2FkaW5nLWJhZGdlJztcbmltcG9ydCB7IGNlbGxUeXBlQ29sdW1uRm9yIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVEIH0gZnJvbSAnLi9uYXBhcmktem9vbSc7XG5cbi8qKlxuICogQSBzaG9ydCwgc3RhYmxlIGlkIGZvciBhIGNvbG9ybWFwIHZhbHVlLCBmb3IgY2FjaGUga2V5cy5cbiAqXG4gKiBIYWxmIHRoZSBsaWJyYXJ5J3MgY29sb3JtYXBzIGFyZSBOQU1FUyBhbmQgaGFsZiBhcmUgaW5saW5lIGBbc3RvcCwgY29sb3VyXWBcbiAqIGFycmF5cyBvZiAyNTYgZW50cmllcy4gU3RyaW5naWZ5aW5nIHRoZSBhcnJheSBraW5kIHdvdWxkIHB1dCA2IEtCIGluIGEga2V5IHRoYXRcbiAqIGlzIHJlYnVpbHQgYW5kIGNvbXBhcmVkIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlOyBoYXNoaW5nIGl0IGtlZXBzIHRoZSBrZXkgc21hbGwsXG4gKiBhbmQgaXQgb25seSBoYXMgdG8gZGlzdGluZ3Vpc2ggb25lIGNvbG9ybWFwIGZyb20gYW5vdGhlci5cbiAqL1xuZnVuY3Rpb24gY29sb3JtYXBJZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiAnPyc7XG4gIC8vIEZOVi0xYSBvdmVyIHRoZSBzdG9wcy4gQSBjb2xsaXNpb24gd291bGQgbGVhdmUgYSBzdGFsZSBjb2xvdXJpbmcgb24gc2NyZWVuLFxuICAvLyBub3QgY29ycnVwdCBhbnl0aGluZywgYW5kIDMyIGJpdHMgb3ZlciBhIGZldyBodW5kcmVkIGNvbG9ybWFwcyB3aWxsIG5vdC5cbiAgbGV0IGhhc2ggPSAweDgxMWM5ZGM1O1xuICBjb25zdCB0ZXh0ID0gdmFsdWUubWFwKChzdG9wKSA9PiBTdHJpbmcoc3RvcCkpLmpvaW4oJywnKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCBePSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gYCMkeyhoYXNoID4+PiAwKS50b1N0cmluZygzNil9YDtcbn1cblxuLyoqXG4gKiBJbi1wbGFuZSBjb2Fyc2VuaW5nIG9mIHRoZSAzRCBnZW5lIG1hcCdzIGxhdHRpY2UsIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2VcbiAqIHZvbHVtZS4gVGhlIGZpZWxkIGlzIHNtb290aCwgc28gaXRzIGRldGFpbCBpcyBzZXQgYnkgdGhlIGtlcm5lbCByYXRoZXIgdGhhbiB0aGVcbiAqIHJhc3RlciDigJQgYW5kIHRoZSBlc3RpbWF0ZSBpcyBhIHBhaXIgb2Ygc2VwYXJhYmxlIGJsdXJzIG9uIHRoZSBtYWluIHRocmVhZCwgd2hpY2hcbiAqIGF0IHRoZSB0ZW1wbGF0ZSdzIGZ1bGwgcmVzb2x1dGlvbiBtZWFucyBzZWNvbmRzIG9mIGZyb3plbiBVSSBwZXIgdG9nZ2xlLlxuICovXG5jb25zdCBHRU5FX01BUF9WT0xVTUVfU1RSSURFID0gMjtcbmltcG9ydCB7XG4gIHR5cGUgRXhwcmVzc2lvbkZpZWxkLCB0eXBlIEV4cHJlc3Npb25Wb2x1bWVGaWVsZCwgY29sb3JFeHByZXNzaW9uRmllbGQsXG4gIGVuY29kZUV4cHJlc3Npb25Wb2x1bWUsIGV4cHJlc3Npb25GaWVsZCwgZXhwcmVzc2lvblZvbHVtZSxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQge1xuICBQbG90VHlwZSxcbiAgUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlTdXJmYWNlLFxuICBpc05hcGFyaVNjYXR0ZXIsXG4gIGlzTmFwYXJpU2NhdHRlcjNkLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgSVZpc3VhbGl6ZXIsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFZpZXdlckNhcGFiaWxpdGllcyxcbiAgVmlld2VyRmVhdHVyZSxcbiAgY2FwYWJpbGl0aWVzT2YsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgQ29sb3JtYXBOb2RlLCBJV2FuZE9wdGlvbnMsIElCcnVzaE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBWSVpfQ09ORklHLCBWaXpDb25maWcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBUSUxFX0FDQ0VTU19QT1JULCBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVNjYWxlQmFyLCBTY2FsZUJhckNhbWVyYSwgZm9ybWF0VW0gfSBmcm9tICcuL25hcGFyaS1zY2FsZS1iYXInO1xuaW1wb3J0IHsgTmFwYXJpUmVnaW9uT3ZlcmxheSwgT3ZlcmxheVZpZXdlciB9IGZyb20gJy4vbmFwYXJpLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE5hcGFyaUF4ZXNMYWJlbHMsIEF4aXNMYWJlbFNwZWMgfSBmcm9tICcuL25hcGFyaS1heGVzLWxhYmVscyc7XG5pbXBvcnQgeyBOYXBhcmlWb2x1bWVaSGFuZGxlIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXotaGFuZGxlJztcbmltcG9ydCB7XG4gIElDb29yZGluYXRlVHJhbnNmb3JtLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29vcmRpbmF0ZS10cmFuc2Zvcm0uY29udHJhY3QnO1xuaW1wb3J0IHsgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QsIENhY2hlZEltYWdlRGF0YSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBXYW5kT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvd2FuZC93YW5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsXG4gIFZlcnRleEVyYXNlclRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gIFpvb21Ub0JveFRvb2xIb3N0LFxufSBmcm9tICcuLi8uLi90b29sYmFyL3pvb20tdG8tYm94L3pvb20tdG8tYm94LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcblxuLyoqIElDb29yZGluYXRlVHJhbnNmb3JtIG92ZXIgdGhlIG5hcGFyaSBjYW1lcmE6IHBvaW50ZXIgY2xpZW50IGNvb3JkcyDihpQgaW1hZ2Uvd29ybGQgY29vcmRzLiAqL1xuY2xhc3MgTmFwYXJpQ29vcmRpbmF0ZVRyYW5zZm9ybSBpbXBsZW1lbnRzIElDb29yZGluYXRlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IHtcbiAgICAgIGNhbnZhc1RvV29ybGQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgcmVhZG9ubHkgY2FtZXJhOiB7IHpvb206IG51bWJlciB9O1xuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkeTogKCkgPT4gYm9vbGVhbixcbiAgKSB7fVxuICBjbGllbnRUb0RhdGEoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG4gIGRhdGFMZW5ndGhUb1NjcmVlbihkYXRhTGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXRhTGVuZ3RoICogdGhpcy52aWV3ZXIuY2FtZXJhLnpvb207IC8vIENTUyBweCBwZXIgd29ybGQgdW5pdFxuICB9XG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxufVxuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuY29uc3QgVk9MVU1FX01BWF9TTElDRSA9IDEwMjQ7IC8vIFwiRnVsbFwiIGluLXBsYW5lIGNhcDsgdGhlIGRlZmF1bHQgwrwgbG9hZCB1c2VzIDI1NlxuLyoqIFJlZmVyZW5jZSBpbi1wbGFuZSB3b3JsZCBzaXplIChsb25nIHNpZGUpIGZvciB0aGUgdm9sdW1lL2F4ZXMgYm94LCBpbiBhcmJpdHJhcnkgd29ybGQgdW5pdHMuXG4gKiAgVGhlIGJveCBpcyBhbmNob3JlZCB0byB0aGlzIHJlZmVyZW5jZSByZWdhcmRsZXNzIG9mIHRoZSBjaG9zZW4gZGVjaW1hdGUgZmFjdG9yLCBzbyBjaGFuZ2luZyB0aGVcbiAqICByZXNvbHV0aW9uIGNoYW5nZXMgREVUQUlMLCBub3QgdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zIChaIG5vIGxvbmdlciBhcHBlYXJzIHRvIHNocmluayB3aGVuIHRoZVxuICogIGluLXBsYW5lIHNhbXBsaW5nIGdyb3dzKS4gU2V0IHRvIHRoZSBERUZBVUxUIGRlY2ltYXRlJ3MgaW4tcGxhbmUgY2FwIHNvIHRoZSBkZWZhdWx0IHZpZXcgaXNcbiAqICB1bmNoYW5nZWQ7IGhpZ2hlci9sb3dlciByZXNvbHV0aW9ucyBrZWVwIHRoYXQgc2FtZSBzaGFwZS4gU2VlIHtAbGluayBtb3VudFZvbHVtZX0uICovXG5jb25zdCBWT0xVTUVfV09STERfSU5QTEFORV9SRUYgPSBWT0xVTUVfTUFYX1NMSUNFIC8gTkFQQVJJX0RFRkFVTFRfREVDSU1BVEU7XG4vKiogTWF4IGNvbmN1cnJlbnQgc2xpY2UgZmV0Y2hlcyB3aGVuIGFzc2VtYmxpbmcgYSB2b2x1bWUg4oCUIGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgYnVzeVxuICogIHdpdGhvdXQgZmxvb2RpbmcgaXQgKGJyb3dzZXJzIGNhcCB+Ni9ob3N0KSBvbiBhIGRlZXAgc3RhY2suICovXG5jb25zdCBWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVm9sdW1lL2lzb3N1cmZhY2Ugc2FtcGxpbmcgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWAgKDEgPSBGdWxsIDEwMjQsIDIgPSDCvSA1MTIsIDQgPSDCvCAyNTZcbiAqICBkZWZhdWx0LCA4ID0g4oWbIDEyOCk6IHRoZSBpbi1wbGFuZSBjYXAgaGFsdmVzIGVhY2ggc3RlcDsgc2xpY2VzIHN0YXkgdW4tc3Vic2FtcGxlZCB1bnRpbCDihZssIHRoZW5cbiAqICBzdWJzYW1wbGUuICovXG5mdW5jdGlvbiB2b2x1bWVSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heFNsaWNlOiBudW1iZXI7IHNsaWNlU3RlcDogbnVtYmVyIH0ge1xuICBjb25zdCBzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICByZXR1cm4ge1xuICAgIG1heFNsaWNlOiBNYXRoLm1heCg4LCBNYXRoLnJvdW5kKFZPTFVNRV9NQVhfU0xJQ0UgLyBzKSksXG4gICAgc2xpY2VTdGVwOiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMgLyA0KSksXG4gIH07XG59XG4vKiogRnVsbHktbm9ybWFsaXplZCBpbnRlbnNpdHkgaGVpZ2h0IGFzIGEgZnJhY3Rpb24gb2YgdGhlIGluLXBsYW5lIGV4dGVudCDigJQgbWF0Y2hlcyB0aGUgUGxvdGx5XG4gKiAgU1VSRkFDRSB6LWFzcGVjdCAofjAuNCkgc28gdGhlIHJlbGllZiBpc24ndCBleGFnZ2VyYXRlZC4gKi9cbmNvbnN0IFNVUkZBQ0VfWl9BU1BFQ1QgPSAwLjQ7XG4vKiogXCJGdWxsXCIgbWVzaCBncmlkIGNhcDsgdGhlIGRlY2ltYXRlIGZhY3RvciBkaXZpZGVzIGl0IChkZWZhdWx0IMK8IOKGkiAyMjAsIMK9IOKGkiA0NDAsIEZ1bGwg4oaSIDg4MCkuICovXG5jb25zdCBTVVJGQUNFX01BWF9HUklEID0gODgwO1xuLyoqIENvZWZmaWNpZW50IHNjYWxpbmcgdGhlIHB5cmFtaWQgdGlsZSBidWRnZXQgd2l0aCB0aGUgdGFyZ2V0IHJlc29sdXRpb24g4oCUIGEgaGlnaGVyIHRhcmdldCBwdWxscyBhXG4gKiAgZmluZXIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFNoYXJlZCBieSB0aGUgc3VyZmFjZSBwbGFuZSBmZXRjaCArIHZvbHVtZSBhc3NlbWJseS4gKi9cbmNvbnN0IFNUSVRDSF9CVURHRVRfQ09FRkYgPSAxNjtcbi8qKiBTdXJmYWNlIG1lc2ggdGFyZ2V0IGdyaWQgZm9yIGEgZGVjaW1hdGUgZmFjdG9yIGBzY2FsZWA6IHRoZSBncmlkIGNhcCBzaHJpbmtzIGJ5IGBzY2FsZWAgKGV2ZXJ5XG4gKiAgc2xpY2UgaXMga2VwdCDigJQgdGhlIHotc2xpZGVyIG5lZWRzIHRoZW0gYWxsKS4gVGhlIHNvdXJjZSBpcyBmZXRjaGVkIGF0IGEgbWF0Y2hpbmcgcmVzb2x1dGlvbi4gKi9cbmZ1bmN0aW9uIHN1cmZhY2VSZXNvbHV0aW9uRm9yKHNjYWxlOiBudW1iZXIpOiB7IG1heEdyaWQ6IG51bWJlciB9IHtcbiAgY29uc3QgcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc2NhbGUpKTtcbiAgcmV0dXJuIHsgbWF4R3JpZDogTWF0aC5tYXgoMTYsIE1hdGgucm91bmQoU1VSRkFDRV9NQVhfR1JJRCAvIHMpKSB9O1xufVxuXG4vKiogM0Qgc2NhdHRlcjogaW4tcGxhbmUgY2FwIGZvciB0aGUgYXNzZW1ibGVkIHZveGVsIGdyaWQsIGFuZCB0aGUgbWF4IG51bWJlciBvZiBwb2ludHMgZW1pdHRlZFxuICogICh0aGUgZ3JpZCBpcyBmbGF0LXN0cmlkZWQgZG93biB0byB0aGlzKSDigJQga2VlcHMgdGhlIGJpbGxib2FyZCBjb3VudCBpbnRlcmFjdGl2ZS4gKi9cbmNvbnN0IFNDQVRURVIzRF9NQVhfWFkgPSA2NDtcbmNvbnN0IFNDQVRURVIzRF9NQVhfUE9JTlRTID0gMTUwMDAwO1xuXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7IC8vIHNlcnZlciB0aWxlIGVkZ2UgKG1hdGNoZXMgdGhlIE9TRCBiYWNrZW5kKVxuLyoqIE1heCB0aWxlcyBzdGl0Y2hlZCBmb3Igb25lIGRpc3BsYXllZCBzbGljZSAoNTEycHggdGlsZXMg4oaSIHVwIHRvIH42MTQ0wrIgYXQgZnVsbCByZXMpLiBCZXlvbmRcbiAqICB0aGlzIHdlIHN0ZXAgdG8gYSBjb2Fyc2VyIHB5cmFtaWQgbGV2ZWwgc28gYSBsYXJnZSBpbWFnZSBzdGF5cyB0cmFjdGFibGUuICovXG5jb25zdCBNQVhfU1RJVENIX1RJTEVTID0gMTQ0O1xuLyoqIFdlYkdQVSBkZWZhdWx0IGBtYXhUZXh0dXJlRGltZW5zaW9uMkRgIOKAlCBhIHN0aXRjaGVkIHNsaWNlJ3MgbG9uZ2VzdCBzaWRlIG11c3QgZml0IGEgdGV4dHVyZS4gKi9cbmNvbnN0IE1BWF9URVhUVVJFX0RJTSA9IDgxOTI7XG4vKiogQ29uY3VycmVudCB0aWxlIHJlcXVlc3RzIHBlciBzdGl0Y2hlZCBzbGljZS4gRmlyaW5nIGEgd2hvbGUgZ3JpZCBhdCBvbmNlIChodW5kcmVkcyBvZiByZXF1ZXN0c1xuICogIGZvciBhIGxhcmdlIGxldmVsKSBvdmVyd2hlbG1lZCB0aGUgdGlsZSBzZXJ2ZXIgKDUwNHMpOyBhIHNtYWxsIHBvb2wga2VlcHMgdGhlIHBpcGUgZnVsbCB3aXRob3V0XG4gKiAgZmxvb2RpbmcgaXQg4oCUIGFuZCBzbGljZS1sZXZlbCB3b3JrZXJzIGFscmVhZHkgcnVuIHNldmVyYWwgc3RpdGNoZXMgaW4gcGFyYWxsZWwgb24gdG9wIG9mIHRoaXMuICovXG5jb25zdCBUSUxFX0ZFVENIX0NPTkNVUlJFTkNZID0gNjtcbi8qKiBIb3cgbG9uZyB0byBwb2xsIGAvdGlsZXMvaW5mb2AgKDIwMiB3aGlsZSB0aGUgc2VydmVyIGNhY2hlcyB0aGUgc291cmNlKSBiZWZvcmUgZmFsbGluZyBiYWNrIHRvXG4gKiAgYSBzaW5nbGUgdGlsZS4gR2VuZXJvdXMgbGlrZSB0aGUgT1NEIGJhY2tlbmQg4oCUIGEgY29sZCB3aG9sZS1zbGlkZSBjYW4gdGFrZSBtaW51dGVzIHRvIGNhY2hlLiAqL1xuY29uc3QgREVTQ1JJUFRPUl9USU1FT1VUX01TID0gMTIwMDAwO1xuXG4vKiogRGVmYXVsdCBwZXItY2hhbm5lbCB0aW50cyAoRmlqaS1zdHlsZSkgd2hlbiB0aGUgc3RvcmUvZGVzY3JpcHRvciBvZmZlcnMgbm8gY29sb3VyLiAqL1xuY29uc3QgREVGQVVMVF9USU5UUyA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmYwMCcsICcjZmYwMGZmJywgJyMwMGZmZmYnLCAnI2ZmZmZmZiddO1xuXG4vKiogRGVmYXVsdCB0aW50IGZvciBhIGNoYW5uZWwgaW5kZXgsIGN5Y2xpbmcgdGhlIEZpamkgcGFsZXR0ZS4gKi9cbmZ1bmN0aW9uIHRpbnRGb3IoY2hhbm5lbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIERFRkFVTFRfVElOVFNbY2hhbm5lbCAlIERFRkFVTFRfVElOVFMubGVuZ3RoXTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AgKHJlcyAwID0gZnVsbCByZXNvbHV0aW9uKS4gKi9cbmludGVyZmFjZSBUaWxlTGV2ZWwge1xuICByZXM6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBTdWJzZXQgb2YgdGhlIGAvdGlsZXMvaW5mb2AgZGVzY3JpcHRvciB0aGlzIGJhY2tlbmQgcmVhZHMgKHRpbGUgZ3JpZCwgY2hhbm5lbHMsIHNjYWxlKS4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHBlci1jaGFubmVsIHRpbGVzIGV4aXN0IG9ubHkgdGhlcmUuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgY29sb3I/OiBzdHJpbmc7XG4gICAgYml0RGVwdGg/OiBudW1iZXI7XG4gICAgbWluQWxsb3dlZD86IG51bWJlcjtcbiAgICBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIG1wcFg/OiBudW1iZXI7XG4gIG1wcFk/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBXZWJHUFUgaW1hZ2UgYmFja2VuZCBidWlsdCBvbiB0aGUgcHVibGlzaGVkIGBuYXBhcmktanNgIGxpYnJhcnkg4oCUIHRoZSBQT0MgZW5naW5lIGZvclxuICogaml0LXVpIzEwMiAoYSBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgc3dhcHBpbmcgaW1hZ2UgcGxvdHRpbmcgd2l0aFxuICogT3BlblNlYWRyYWdvbiBhbmQgM0Qgc2xpY2luZy9pc29zdXJmYWNlcyB3aXRoIFBsb3RseSkuXG4gKlxuICogUmVuZGVyIHN0cmF0ZWd5OiByYXRoZXIgdGhhbiByZS1pbXBsZW1lbnQgdGhlIHNlcnZlcidzIHRpbGUvcHlyYW1pZCBwcm90b2NvbCAod2hpY2ggT1NEXG4gKiBhbHJlYWR5IGhhbmRsZXMpLCB0aGlzIGJhY2tlbmQgcmVuZGVycyB0aGUgKipjb21wbGV0ZSBwZXItc2xpY2UgaW1hZ2UgVVJMcyB0aGUgYXBwIGFscmVhZHlcbiAqIHByb2R1Y2VzKiogKGBJSW1hZ2VJbmZvLnVybHNgKSDigJQgYHVybHNbel1gIGZvciB0aGUgMkQgaW1hZ2UsIGFuZCB0aGUgZnVsbCBgdXJsc2Agc3RhY2tcbiAqIGFzc2VtYmxlZCBpbnRvIGEgZG93bnNhbXBsZWQgdm9sdW1lIGZvciB0aGUgM0QgdHlwZXMuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zXG4gKiBkZWxlZ2F0ZSB0byB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSwgZXhhY3RseSBhcyBPU0QgZG9lcy5cbiAqXG4gKiBGb2xsb3ctdXBzIChqaXQtdWkjMTAyKTogbmF0aXZlLXJlc29sdXRpb24gcHlyYW1pZGFsIHRpbGluZywgb24tY2FudmFzIHRvb2xzLCByZWdpb25cbiAqIG92ZXJsYXkgcmVuZGVyaW5nLCBwZXItY2hhbm5lbCBoaXN0b2dyYW1zLCBUSUZGIGV4cG9ydC5cbiAqL1xuLyoqXG4gKiBXaGF0IHRoZSAzRCBwb2ludHMgbGF5ZXIgbmVlZHMgdG8gY29sb3VyIGEgY2xvdWQ6IG9uZSBzY2FsYXIgcGVyIHBvaW50LCBhIGNvbG9ybWFwLCBhbmQgdGhlXG4gKiB3aW5kb3cgdGhhdCBtYXBzIHNjYWxhcnMgb250byBpdC4gQ2F0ZWdvcmljYWwgYW5kIGNvbnRpbnVvdXMgY29sb3VyaW5ncyBib3RoIHJlZHVjZSB0byB0aGlzLFxuICogYmVjYXVzZSB0aGUgbGF5ZXIgb2ZmZXJzIG5vIHBlci1wb2ludCBjb2xvdXIgY2hhbm5lbC5cbiAqL1xuaW50ZXJmYWNlIFNwYXRpYWwzZEVuY29kaW5nIHtcbiAgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gIGNvbG9ybWFwOiBDb2xvcm1hcDtcbiAgY29udHJhc3RMaW1pdHM6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN0YWNrU2xpZGVyLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSB2aWV3ZXI6IFZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3N0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvYWRlZDogTmFwYXJpTG9hZGVkIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFBpeGVsczogUGl4ZWxEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFBsb3RUeXBlOiBQbG90VHlwZSA9IFBsb3RUeXBlLk5BUEFSSV9JTUFHRTtcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgb3duaW5nIHRoZSAzRCB2b2x1bWUgbGF5ZXJzIChvbmUgYWRkaXRpdmUgdGludGVkIGxheWVyIHBlciBjaGFubmVsXG4gICAqICBmb3IgbXVsdGljaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gTnVsbCBpbiAyRC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVWaWV3OiBNdWx0aUNoYW5uZWxWb2x1bWVWaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZvbHVtZSBpcyBjb21wb3NpdGVkIGZyb20gcGVyLWNoYW5uZWwgbGF5ZXJzICh2cyBhIHNpbmdsZSBncmF5c2NhbGUgdm9sdW1lKS4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyBoZWlnaHQtZmllbGQgc3VyZmFjZSBtZXNoIChOQVBBUklfU1VSRkFDRSBwbG90IHR5cGU7IG51bGwgb3RoZXJ3aXNlKS4gQnVpbHQgZnJvbSBhXG4gICAqICBzaW5nbGUgZ3JheXNjYWxlIHNsaWNlIGJ5IHtAbGluayBidWlsZFN1cmZhY2V9IHZpYSBuYXBhcmktanMncyBgaGVpZ2h0RmllbGRgICsgYGFkZFN1cmZhY2VgLiAqL1xuICBwcml2YXRlIHN1cmZhY2VMYXllcjogU3VyZmFjZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGljaCBiYW5kIHRoZSBzdXJmYWNlIHNhbXBsZXMgKGEgY2hhbm5lbCBpbmRleCBmb3IgbXVsdGljaGFubmVsLCBlbHNlIHRoZSBjb21wb3NpdGUpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VDaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIG1vdW50ZWQgU3VyZmFjZSBmb2xsb3dzIG9uZSBiYW5kIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLiAqL1xuICBwcml2YXRlIHN1cmZhY2VNdWx0aWNoYW5uZWwgPSBmYWxzZTtcbiAgLyoqIFByZS1sb2FkZWQgcGVyLXNsaWNlIGx1bWluYW5jZSBwbGFuZXMgKGFscmVhZHkgZGVjaW1hdGVkIHRvIHRoZSBzdXJmYWNlIGdyaWQpLCBrZXllZCBieSB6LFxuICAgKiAgc28gdGhlIHN0YWNrIHNsaWRlciByZWJ1aWxkcyB0aGUgc3VyZmFjZSBpbnN0YW50bHkuIEZpbGxlZCBieSB7QGxpbmsgcHJlbG9hZFN1cmZhY2VQbGFuZXN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cmZhY2VQbGFuZXMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cbiAgPigpO1xuICAvKiogSW4tcGxhbmUgZ3JpZCBjYXAgZm9yIHRoZSBhY3RpdmUgc3VyZmFjZSBsb2FkIChmdWxsIGdyaWQgw7cgdGhlIGRlY2ltYXRlIGZhY3RvcikuICovXG4gIHByaXZhdGUgc3VyZmFjZU1heEdyaWQgPSBTVVJGQUNFX01BWF9HUklEO1xuICAvKiogQ29udHJhc3Qgd2luZG93IFttaW4sbWF4XSB0aGUgY3VycmVudCBzdXJmYWNlIG1lc2ggd2FzIGJ1aWx0IHdpdGguIEEgY2hhbmdlIHJlc2hhcGVzIHRoZVxuICAgKiAgbWVzaCAocGl4ZWwgaGVpZ2h0ID0gaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLCBzbyBpdCB0cmlnZ2VycyBhIGdlb21ldHJ5IHJlYnVpbGQuICovXG4gIHByaXZhdGUgc3VyZmFjZVdpbmRvdzogW251bWJlciwgbnVtYmVyXSB8IG51bGwgPSBudWxsO1xuICAvKiogUGVyc2lzdGVkIHdpcmVmcmFtZSBjaG9pY2UgZm9yIHRoZSBzdXJmYWNlIChyZS1hcHBsaWVkIHdoZW4gYSBuZXcgc3VyZmFjZSBtb3VudHMpLiAqL1xuICBwcml2YXRlIHN1cmZhY2VXaXJlZnJhbWUgPSBmYWxzZTtcbiAgLyoqIG5hcGFyaS1qcyAyRCBzY2F0dGVyIHBvaW50cyAocmVnaW9uIGNlbnRyb2lkcykgKyBpdHMgcmVnaW9uLWNoYW5nZSBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc2NhdHRlcjJkUG9pbnRzOiBQb2ludHNMYXllciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYXR0ZXJSZWdpb25TdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICAvKiogbmFwYXJpLWpzIDNEIHNjYXR0ZXIgKHZveGVsIHBvaW50IGNsb3VkKS4gKi9cbiAgcHJpdmF0ZSBzY2F0dGVyM2RMYXllcjogUG9pbnRzM0RMYXllciB8IG51bGwgPSBudWxsO1xuICAvKiogU3BhdGlhbC1vbWljcyBvYnNlcnZhdGlvbiBtYXJrZXJzICsgdGhlIGRhdGFzZXQvdmlldyBzdWJzY3JpcHRpb24gZHJpdmluZyB0aGVtLiAqL1xuICBwcml2YXRlIHNwYXRpYWxQb2ludHM6IFBvaW50c0xheWVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgM0QgcG9pbnQgY2xvdWQuIE9uZSBsYXllcjogc2VsZWN0aW9uIGlzIGEgcGVyLXBvaW50IGFscGhhIG9uIGl0LCBub3QgYSBzZWNvbmQuICovXG4gIHByaXZhdGUgc3BhdGlhbFBvaW50czNkOiBQb2ludHMzRExheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BhdGlhbExheWVyS2V5M2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogSW50ZXJsZWF2ZWQgeCx5LHosIGNhY2hlZCBzbyBhIGNvbG91ciBjaGFuZ2UgZG9lcyBub3QgcmUtd2FsayAzLjdNIG9ic2VydmF0aW9ucy4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUG9zaXRpb25zM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogSWRlbnRpdHkgb2YgdGhlIHNjYWxhcnMgY3VycmVudGx5IHVwbG9hZGVkIOKAlCBzZWUge0BsaW5rIHJlYnVpbGRTcGF0aWFsUG9pbnRzM2R9LiAqL1xuICBwcml2YXRlIHNwYXRpYWxTY2FsYXJLZXkzZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgYW5hdG9taWNhbCB2b2x1bWUgdGhlIGNsb3VkIHNpdHMgaW5zaWRlLCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBvbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbFZvbHVtZTogVm9sdW1lTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsVm9sdW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFBlci1jbHVzdGVyIGRlbnNpdHkgdm9sdW1lcyBkcmF3biBhbG9uZ3NpZGUgdGhlIGNsb3VkLCBhbmQgd2hhdCB0aGV5IHdlcmVcbiAgICogIGJ1aWx0IGZyb20g4oCUIHJhc3RlcmlzaW5nIGlzIHNlY29uZHMgb2Ygd29yaywgc28gaXQgbXVzdCBub3QgcmVwZWF0IGZvciBhXG4gICAqICBjaGFuZ2UgdGhhdCBjYW5ub3QgYWZmZWN0IHRoZSBmaWVsZC4gKi9cbiAgcHJpdmF0ZSBkZW5zaXR5TGF5ZXJzOiBWb2x1bWVMYXllcltdID0gW107XG4gIHByaXZhdGUgZGVuc2l0eUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZWxlY3Rpb24gaWRlbnRpdHksIGFzIGEgbnVtYmVyIHRoZSBkZW5zaXR5IGtleSBjYW4gY2FycnkuICovXG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvblNlZW46IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2aXNpb24gPSAwO1xuICAvKiogVGhlIGdlbmUgbWFwOiBpdHMgbGF5ZXIsIHRoZSBmaWVsZCBpdCB3YXMgZXN0aW1hdGVkIGZyb20sIGFuZCB0aGUgaW5wdXRzIGVhY2hcbiAgICogIHdhcyBidWlsdCBmb3Ig4oCUIHRoZSBmaWVsZCBpcyB0aGUgZXhwZW5zaXZlIGhhbGYgYW5kIHN1cnZpdmVzIGEgcmVjb2xvdXIuICovXG4gIHByaXZhdGUgZ2VuZU1hcExheWVyOiBJbWFnZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcEZpZWxkOiBFeHByZXNzaW9uRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIDNEIGdlbmUgbWFwOiBpdHMgdm9sdW1lIGxheWVyLCB0aGUgZmllbGQgYmVoaW5kIGl0LCBhbmQgdGhlIGlucHV0cyBlYWNoXG4gICAqICB3YXMgYnVpbHQgZm9yIOKAlCBzYW1lIHR3byBjbG9ja3MgYXMgdGhlIDJEIG1hcC4gKi9cbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lTGF5ZXI6IFZvbHVtZUxheWVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZ2VuZU1hcFZvbHVtZUZpZWxkOiBFeHByZXNzaW9uVm9sdW1lRmllbGQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBnZW5lTWFwVm9sdW1lRmllbGRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogT2Zmc2V0IGFwcGxpZWQgdG8gb2JzZXJ2YXRpb24gY29vcmRpbmF0ZXMgdG8gc2l0IHRoZW0gaW4gdGhlIHZvbHVtZSdzIGJveC4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsT3JpZ2luM2Q6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwXTtcbiAgLyoqIEN1cnNvciB0b29sdGlwIGZvciB0aGUgc3BhdGlhbCB2aWV3cywgYW5kIGV2ZXJ5dGhpbmcgaXQgbmVlZHM6IHdoYXQgdGhlXG4gICAqICBjbG91ZCBpcyBjb2xvdXJlZCBieSwgYW5kIHdoZXJlIGVhY2ggZHJhd24gb2JzZXJ2YXRpb24gaXMuICovXG4gIHByaXZhdGUgc3BhdGlhbFRvb2x0aXA6IE5hcGFyaVNwYXRpYWxUb29sdGlwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2U6IEhvdmVyU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJTb3VyY2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2VxdWVuY2VzIHRoZSBhc3luYyByZXNvbHV0aW9ucy4gVGhlIEtFWSBpcyBvbmx5IGNvbW1pdHRlZCBvbmNlIG9uZSBsYW5kcyxcbiAgICogIHNvIGEgc3VwZXJzZWRlZCBmZXRjaCBjYW5ub3QgbGVhdmUgdGhlIGNhY2hlIGNsYWltaW5nIHRvIGhvbGQgYSBzb3VyY2UgaXRcbiAgICogIG5ldmVyIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSBob3ZlclNvdXJjZVRva2VuID0gMDtcbiAgLyoqIERyYXduIG9ic2VydmF0aW9ucycgcG9zaXRpb25zIGZvciBoaXQtdGVzdGluZywgaW5kZXhlZCBCWSBPQlNFUlZBVElPTiB3aXRoXG4gICAqICBOYU4gZm9yIGFueXRoaW5nIG5vdCBkcmF3bi4gU2NyZWVuIHBpeGVscyBpbiAzRCAodGhlIGNhbWVyYSBtb3ZlcyB0aGVtLCBzb1xuICAgKiAgdGhleSBhcmUgcmVidWlsdCB3aGVuIGl0IGRvZXMpIGFuZCBXT1JMRCB1bml0cyBpbiAyRCAod2hlcmUgdGhlIGNhbWVyYSBvbmx5XG4gICAqICBzY2FsZXMsIHNvIHRoZSBwb2ludGVyIGlzIGNvbnZlcnRlZCBpbnN0ZWFkIG9mIDM3NGsgcG9pbnRzKS4gKi9cbiAgcHJpdmF0ZSBob3ZlclBvc2l0aW9uczogRmxvYXQzMkFycmF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJQb3NpdGlvbnNSZXYgPSAtMTtcblxuICAvKipcbiAgICogU2NyZWVuLXNwYWNlIGJ1Y2tldCBpbmRleCBvdmVyIHRoZSAzRCBwcm9qZWN0aW9uLCBidWlsdCBvbiB0aGUgZmlyc3QgaG92ZXIgYWZ0ZXIgdGhlXG4gICAqIHNjZW5lIG1vdmVkIHJhdGhlciB0aGFuIHdoZW4gaXQgbW92ZXMuXG4gICAqXG4gICAqIExhemlseSwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGRlc2lnbjogYW4gb3JiaXQgZHJhZyBjaGFuZ2VzIHRoZSBjYW1lcmEgZXZlcnkgZnJhbWUsIHNvXG4gICAqIGJ1aWxkaW5nIGVhZ2VybHkgd291bGQgc3BlbmQgdGVucyBvZiBtaWxsaXNlY29uZHMgYSBmcmFtZSBpbmRleGluZyBmb3IgcGlja3Mgbm9ib2R5IGlzXG4gICAqIG1ha2luZy4gRGVmZXJyZWQsIGl0IGlzIGJ1aWx0IG9uY2Ugd2hlbiB0aGUgZHJhZyBzdG9wcyBhbmQgdGhlIHBvaW50ZXIgbmV4dCBtb3ZlcyDigJRcbiAgICogbWVhc3VyZWQgdXBzdHJlYW0gYXQgMy43TSBwb2ludHMsIHRoYXQgdHVybnMgYSAxMi42IG1zIHNjYW4gcGVyIHBvaW50ZXJtb3ZlIGludG9cbiAgICogMC4wNjYgbXMuXG4gICAqL1xuICBwcml2YXRlIGhvdmVySW5kZXg6IFNjcmVlbkluZGV4IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbmV2ZXIgdGhlIGNhY2hlZCBwb3NpdGlvbnMgZ28gc3RhbGU6IGEgbWFya2VyIHJlYnVpbGQsIG9yIOKAlCBpbiAzRFxuICAgKiAgb25seSwgd2hlcmUgdGhlIHByb2plY3Rpb24gZGVwZW5kcyBvbiBpdCDigJQgYSBjYW1lcmEgbW92ZS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsU2NlbmVSZXYgPSAwO1xuICBwcml2YXRlIGhvdmVyUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyRnJhbWUgPSAwO1xuICBwcml2YXRlIGhvdmVyT2ZmOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAvKiogT2JzZXJ2YXRpb24gaW5kaWNlcyB0aGUgY2FjaGVkIDNEIHBvc2l0aW9ucyBiZWxvbmcgdG8sIGluIHRoZSBzYW1lIG9yZGVyO1xuICAgKiAgbnVsbCB3aGVuIGV2ZXJ5IG9ic2VydmF0aW9uIGlzIGRyYXduLiBXaXRob3V0IGl0IGEgcHJvamVjdGlvbiBidWlsdCBmcm9tIHRoZVxuICAgKiAgcG9zaXRpb25zIGlzIGluZGV4ZWQgYnkgRFJBV04gb3JkZXIgYW5kIHNpbGVudGx5IGF0dHJpYnV0ZXMgZWFjaCBwb2ludCB0b1xuICAgKiAgdGhlIHdyb25nIG9ic2VydmF0aW9uIGFzIHNvb24gYXMgYSBzZWN0aW9uIGlzIGlzb2xhdGVkLiAqL1xuICBwcml2YXRlIHNwYXRpYWxEcmF3bjNkOiBVaW50MzJBcnJheSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBSZXVzZWQgcHJvamVjdGlvbiBidWZmZXJzIOKAlCBzZWUge0BsaW5rIGdldFNwYXRpYWxTY3JlZW5Qcm9qZWN0aW9ufS4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsUHJvamVjdGlvbjNkOiBQcm9qZWN0ZWRQb2ludHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIFBlci1vYnNlcnZhdGlvbiBkZXB0aCBmcm9tIHRoZSBsYXN0IHByb2plY3Rpb24sIGZvciB0aGUgZGVwdGgtYXdhcmUgaG92ZXIgcGljay4gKi9cbiAgcHJpdmF0ZSBzcGF0aWFsRGVwdGhzM2Q6IEZsb2F0MzJBcnJheSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlICh2aWV3ZXIsIGRhdGFzZXQpIHdob3NlIDNEIHNjZW5lIGhhcyBhbHJlYWR5IGhhZCBpdHMgb3BlbmluZyBmcmFtaW5nLiAqL1xuICAvKiogV2hvc2UgMkQgb2JzZXJ2YXRpb25zIHRoZSBjYW1lcmEgaGFzIGJlZW4gZnJhbWVkIG9uIOKAlCBzZWUge0BsaW5rIGZyYW1lU3BhdGlhbFBvaW50c09uY2V9LiAqL1xuICBwcml2YXRlIHNwYXRpYWwyZEZyYW1lZDogeyB2aWV3ZXI6IFZpZXdlcjsgZGF0YXNldElkOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogRGF0YXNldCB0aGUgM0Qgc2NhbGUgYmFyIHdhcyBidWlsdCBmb3IuICovXG4gIHByaXZhdGUgc3BhdGlhbFNjYWxlQmFyS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGF0aWFsU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIExldmVsLW9mLWRldGFpbCBjZWxsIG91dGxpbmVzLCB0cmFuc2NyaXB0cyBhbmQgZGVuc2l0eSBvdmVyIHRoZSAyRCB2aWV3IOKAlCBjcmVhdGVkIG9uXG4gICAqICBmaXJzdCB1c2UsIGFuZCBvbmx5IHdoZW4gYSBzcGF0aWFsIHBvcnQgaXMgYm91bmQuICovXG4gIHByaXZhdGUgc3BhdGlhbFRpbGVzTWdyOiBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB8IG51bGwgPSBudWxsO1xuICAvKiogRm9yIHRoZSBwYW5lbDogdGhlIHRyYW5zY3JpcHRzLWluLXZpZXcgZXN0aW1hdGUgYW5kIHRoZSBkZW5zaXR5IHdpbmRvdyBpbiB1c2UuICovXG4gIHJlYWRvbmx5IHRyYW5zY3JpcHRFc3RpbWF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRyYW5zY3JpcHRFc3RpbWF0ZSB8IG51bGw+KG51bGwpO1xuICAvKiogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluIHZpZXcgKHNlZSBOYXBhcmlTcGF0aWFsVGlsZUxheWVycy5nZW5lQ291bnRzSW4pLiAqL1xuICByZWFkb25seSBnZW5lQ291bnRzSW5WaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkZW5zaXR5U3RhdHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPihudWxsKTtcbiAgLyoqIExhdGVzdCAoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKSB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3LCBzbyBhIHNsaWNlXG4gICAqICBjaGFuZ2UgY2FuIHJlYnVpbGQgdGhlIG1hcmtlcnMgZm9yIHRoZSBuZXcgcGxhbmUuICovXG4gIHByaXZhdGUgc3BhdGlhbExhdGVzdDogW1NwYXRpYWxEYXRhc2V0IHwgbnVsbCwgU3BhdGlhbFZpZXdTdGF0ZSwgU3BhdGlhbFNlbGVjdGlvbk1hc2tdIHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgLyoqIFdoaWNoIGRhdGFzZXQgdGhlIGN1cnJlbnQgbWFya2VyIGxheWVyIHdhcyBidWlsdCBmb3IsIHNvIGEgZGlzcGxheS1vbmx5XG4gICAqICBjaGFuZ2UgKHNpemUsIGNvbG91ciwgb3BhY2l0eSwgc2VsZWN0aW9uKSBjYW4gdXBkYXRlIGl0IGluIHBsYWNlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxMYXllcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb25vdG9uaWMgZ3VhcmQgZm9yIHRoZSBhc3luYyBjb2xvdXIgcmVidWlsZDogZmV0Y2hpbmcgYSBnZW5lIHZlY3RvciBpcyBhXG4gICAqICByb3VuZC10cmlwLCBzbyBhIGZhc3Qgc2VxdWVuY2Ugb2YgY29sb3VyLWJ5IGNoYW5nZXMgY2FuIHJlc29sdmUgb3V0IG9mXG4gICAqICBvcmRlci4gT25seSB0aGUgbmV3ZXN0IHJlYnVpbGQgaXMgYWxsb3dlZCB0byB0b3VjaCB0aGUgbGF5ZXIuICovXG4gIHByaXZhdGUgc3BhdGlhbFJlYnVpbGRUb2tlbiA9IDA7XG4gIC8qKiBcInggcmVsb2FkaW5n4oCmXCIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2FudmFzOiB0aGUgdGlsZSBsYXllcnMnIGxvYWRzIGFuZCB0aGUgb2JzZXJ2YXRpb25zJy4gKi9cbiAgcHJpdmF0ZSBsb2FkaW5nQmFkZ2U6IE5hcGFyaUxvYWRpbmdCYWRnZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRpbGVMb2FkaW5nOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIG9ic2VydmF0aW9uc0xvYWRpbmcgPSAwO1xuICAvKiogSW1hZ2UgdGlsZXMgaW4gZmxpZ2h0LCBhbmQgdGhlIHNjZW5lIHRoZXkgYmVsb25nIHRvOiBhIGZldGNoIHRoYXQgb3V0bGl2ZXMge0BsaW5rIHJlc2V0fVxuICAgKiAgc2V0dGxlcyBhZ2FpbnN0IHRoZSBvbGQgZ2VuZXJhdGlvbiBhbmQgbGVhdmVzIHRoZSBuZXcgc2NlbmUncyBjb3VudCBhbG9uZS4gKi9cbiAgcHJpdmF0ZSBpbWFnZVRpbGVzTG9hZGluZyA9IDA7XG4gIHByaXZhdGUgaW1hZ2VUaWxlc0dlbmVyYXRpb24gPSAwO1xuICAvKiogTW9ub3RvbmljIGxvYWQgZ2VuZXJhdGlvbi4gQnVtcGVkIGJ5IHtAbGluayByZXNldH0gYW5kIHtAbGluayBjYW5jZWxMb2FkaW5nfTsgdGhlIGZyYW1lLWxvYWRpbmdcbiAgICogIGxvb3BzICh2b2x1bWUgYXNzZW1ibHksIHN1cmZhY2UgcHJlbG9hZCkgY2FwdHVyZSBpdCBhbmQgYmFpbCB3aGVuIGl0IGNoYW5nZXMsIHNvIGEgQ2FuY2VsIChvciBhXG4gICAqICBuZXcgcGxvdCkgYWN0dWFsbHkgc3RvcHMgZmV0Y2hpbmcgZnJhbWVzIGluc3RlYWQgb2YgcnVubmluZyB0byBjb21wbGV0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGxvYWRUb2tlbiA9IDA7XG4gIC8qKiBEZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMgKDEgPSBGdWxsLCAyID0gwr0gZGVmYXVsdCwgNCA9IMK8LCA4ID0g4oWbKS4gQXBwbGllZCB3aGVuIGFcbiAgICogIHZvbHVtZS9pc29zdXJmYWNlL3N1cmZhY2UgKHJlKWxvYWRzOyBjaGFuZ2luZyBpdCBuZWVkcyBhIHJlLXBsb3QgKGl0IGNoYW5nZXMgZmV0Y2hlZCBkYXRhKS4gKi9cbiAgcHJpdmF0ZSByZXNvbHV0aW9uU2NhbGUgPSBOQVBBUklfREVGQVVMVF9ERUNJTUFURTtcbiAgLyoqIDNEIGNvb3JkaW5hdGUtYXhlcyAvIHNjYWxlIGdpem1vIGZvciB0aGUgdm9sdW1lL2lzb3N1cmZhY2UgdmlldyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xheWVyOiBBeGVzTGF5ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIERPTSBYL1kvWiArIHNjYWxlIGxhYmVscyB0cmFja2luZyB0aGUgM0QgYXhlcyBnaXptbyAobnVsbCBpbiAyRCkuICovXG4gIHByaXZhdGUgYXhlc0xhYmVsczogTmFwYXJpQXhlc0xhYmVscyB8IG51bGwgPSBudWxsO1xuICAvKiogRHJhZ2dhYmxlIFotaGVpZ2h0IGdyaXAgb3ZlciB0aGUgdm9sdW1lIChudWxsIHVubGVzcyBhIHZvbHVtZS9pc29zdXJmYWNlIGlzIG1vdW50ZWQpLiAqL1xuICBwcml2YXRlIHpIYW5kbGU6IE5hcGFyaVZvbHVtZVpIYW5kbGUgfCBudWxsID0gbnVsbDtcbiAgLyoqIFVzZXIgWi1oZWlnaHQgZmFjdG9yIGZvciB0aGUgdm9sdW1lICgxID0gdGhlIHZvbHVtZSdzIG5hdHVyYWwgcHJvcG9ydGlvbnMpOyBkcml2ZW4gYnkgdGhlXG4gICAqICBpbi12aWV3IGRyYWcgaGFuZGxlLiBSZXNldCBwZXIgbW91bnQuICovXG4gIHByaXZhdGUgdm9sdW1lWlNjYWxlID0gMTtcbiAgLyoqIFZvbHVtZSB3b3JsZCBib3ggYXQgYHZvbHVtZVpTY2FsZSA9IDFgIChiYXNlKSArIHRoZSBzYW1wbGVkIHZveGVsIGRlcHRoIOKAlCBlbm91Z2ggdG8gcmVjb21wdXRlXG4gICAqICB0aGUgWi1heGlzIHZveGVsIHNjYWxlLCBheGVzIGRlcHRoLCBhbmQgb3ZlcmxheSBhbmNob3JzIGFzIHRoZSBoYW5kbGUgc3RyZXRjaGVzIFouICovXG4gIHByaXZhdGUgdm9sdW1lV29ybGRCYXNlOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2b2x1bWVTYW1wbGVkRGVwdGggPSAxO1xuICAvKiogUGVyc2lzdGVkIGF4ZXMgb24vb2ZmIGNob2ljZSwgcmUtYXBwbGllZCB3aGVuIGEgbmV3IHZvbHVtZSBtb3VudHMuIERlZmF1bHRzIG9uLiAqL1xuICBwcml2YXRlIGF4ZXNWaXNpYmxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2b2x1bWVEaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIEFzc2VtYmxlZCB1aW50OCB2b2x1bWUgZGF0YSBwZXIgY2hhbm5lbCAoa2V5ID0gY2hhbm5lbCBpbmRleCksIGtlcHQgZm9yIHRoZSB2b2x1bWUgaW50ZW5zaXR5XG4gICAqICBoaXN0b2dyYW0uIEtleSAwIGhvbGRzIHRoZSBncmF5c2NhbGUvY29tcG9zaXRlIHZvbHVtZSBpbiB0aGUgc2luZ2xlLWNoYW5uZWwgY2FzZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVDaGFubmVsRGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBVaW50OEFycmF5PigpO1xuICBwcml2YXRlIGltYWdlVyA9IDA7XG4gIHByaXZhdGUgaW1hZ2VIID0gMDtcbiAgLyoqIE1vbm90b25pYyBzbGljZS1yZXF1ZXN0IGlkIHNvIGEgc2xvdyBvdXQtb2Ytb3JkZXIgc2xpY2UgZmV0Y2ggY2FuJ3QgY2xvYmJlciBhIG5ld2VyIG9uZS4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcSA9IDA7XG4gIC8qKiBDYWNoZWQgYC90aWxlcy9pbmZvYCBweXJhbWlkIGRlc2NyaXB0b3IgKyB0aGUgaW5mb0I2NCBpdCB3YXMgZmV0Y2hlZCBmb3IuICovXG4gIHByaXZhdGUgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSG93IHRoZSBjdXJyZW50IDJEIGltYWdlIGlzIGNvbXBvc2l0ZWQgKGRyaXZlcyBoaXN0b2dyYW0gKyBzdGF0ZSBhcHBsaWNhdGlvbikuICovXG4gIHByaXZhdGUgaW1hZ2VNb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYicgPSAncmdiJztcbiAgLyoqIG5hcGFyaS1qcyBoaWdoLWxldmVsIHZpZXcgdGhhdCBvd25zIHRoZSBwZXItY2hhbm5lbCBsYXllciBzZXQgKGJ1aWxkICsgbGl2ZSBkaXNwbGF5XG4gICAqICB1cGRhdGVzKSBmb3IgdGhlIGN1cnJlbnQge0BsaW5rIGltYWdlTW9kZX0uIFJlYnVpbHQgb24gZWFjaCAocmUpcmVuZGVyLiAqL1xuICBwcml2YXRlIGNoYW5uZWxWaWV3OiBNdWx0aUNoYW5uZWxJbWFnZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIExpdmUgc3Vic2NyaXB0aW9uIGFwcGx5aW5nIGNoYW5uZWwtc3RhdGUgLyBjb2xvcm1hcCBjaGFuZ2VzIHRvIHRoZSBsYXllcnMuICovXG4gIHByaXZhdGUgZGlzcGxheVN1YjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgZ3JheXNjYWxlIGNvbG9ybWFwIHNlbGVjdGlvbiBmcm9tIHRoZSBzdG9yZSAoYXBwbGllZCB0byB0aGUgc2luZ2xlIGdyYXkgbGF5ZXIpLiAqL1xuICBwcml2YXRlIGN1cnJlbnRDb2xvcm1hcDogQ29sb3JtYXBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFJldmVyc2UgPSBmYWxzZTtcbiAgLyoqIExhdGVzdCBpbnZlcnQgdG9nZ2xlIGZyb20gdGhlIHN0b3JlIChmbGlwcyBpbnRlbnNpdHkgYmVmb3JlIHRoZSBjb2xvcm1hcCwgbGlrZSBPU0QpLiAqL1xuICBwcml2YXRlIGludmVydEVuYWJsZWQgPSBmYWxzZTtcbiAgLyoqIFBoeXNpY2FsIHNjYWxlIGJhciBvdmVybGF5IGZvciB0aGUgMkQgaW1hZ2UgKG51bGwgd2hlbiAzRCBvciB0aGUgaW1hZ2UgaGFzIG5vIMK1bS9waXhlbCkuICovXG4gIHByaXZhdGUgc2NhbGVCYXI6IE5hcGFyaVNjYWxlQmFyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPdmVydmlldyBtaW5pbWFwIChib3R0b20tcmlnaHQpLCBhcyBPU0QncyBuYXZpZ2F0b3IuICovXG4gIHByaXZhdGUgbmF2aWdhdG9yOiBOYXBhcmlOYXZpZ2F0b3IgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZXRoZXIgdGhlIG5hdmlnYXRvciBpcyBzaG93biDigJQgdGhlIHNhbWUgaG9zdCBzZXR0aW5nIE9TRCdzIG5hdmlnYXRvciBob25vdXJzLiAqL1xuICBwcml2YXRlIG5hdmlnYXRvclZpc2libGUgPSB0cnVlO1xuICAvKiogQnVtcGVkIHBlciB0aHVtYm5haWwgcmVxdWVzdCwgc28gYSBzbG93IG9uZSBjYW5ub3Qgb3ZlcndyaXRlIGEgbmV3ZXIgc2xpY2Uncy4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JUb2tlbiA9IDA7XG4gIC8qKiBTVkcgcmVnaW9uLWRyYXdpbmcgb3ZlcmxheSBmb3IgdGhlIDJEIGltYWdlIChudWxsIHVudGlsIGEgMkQgaW1hZ2UgaXMgcGxvdHRlZCkuICovXG4gIHByaXZhdGUgcmVnaW9uT3ZlcmxheTogTmFwYXJpUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICAvKiogUGl4ZWwtdG9vbCBwbHVtYmluZzogdGhlIHBsb3QgZGl2IGlkLCBjb29yZCB0cmFuc2Zvcm0sIGFuZCBib3VuZCB0b29sIGhvc3RzLiAqL1xuICBwcml2YXRlIHBsb3REaXZJZCA9ICcnO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhbmRIb3N0OiBXYW5kVG9vbEhvc3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlcmFzZXJIb3N0OiBWZXJ0ZXhFcmFzZXJUb29sSG9zdCB8IG51bGwgPSBudWxsO1xuICAvKiogQ2FjaGVkIENhY2hlZEltYWdlRGF0YSBidWlsdCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrIChyZWJ1aWx0IHdoZW4gbGFzdFBpeGVscyBjaGFuZ2VzKS4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRJbWFnZTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkSW1hZ2VTb3VyY2U6IFBpeGVsRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVmlzaWJsZSB3b3JsZCByZWN0IGNhcHR1cmVkIEFUIHRoZSBsYXN0IHJlYWRiYWNrIOKAlCBtdXN0IHBhaXIgd2l0aCBgbGFzdFBpeGVsc2Agc28gdGhlIHBpeGVsXG4gICAqICB0b29scycgcmF0aW9zL29yaWdpbiBtYXRjaCB0aGUgbWF0cml4J3MgY2FtZXJhICh1c2luZyB0aGUgbGl2ZSByZWN0IGFmdGVyIGEgcGFuL3pvb20gd291bGRcbiAgICogIG1pcy1zY2FsZSB0aGUgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSBsYXN0UGl4ZWxzUmVjdDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhcikgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscywgdGhlIGRlZmF1bHQpLiAqL1xuICBwcml2YXRlIGltYWdlU21vb3RoaW5nID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIDJEIGltYWdlIGlzIHJlbmRlcmVkIHZpYSBweXJhbWlkYWwgVGlsZWRTb3VyY2VzIChkZXNjcmlwdG9yIGF2YWlsYWJsZSkuICovXG4gIHByaXZhdGUgdGlsZWQgPSBmYWxzZTtcbiAgLyoqIERlYm91bmNlZCByZWFkYmFjayB0aW1lciArIGNhbWVyYS1jaGFuZ2UgdW5zdWJzY3JpYmUgKGtlZXAgbGFzdFBpeGVscyBjdXJyZW50IGZvciB0b29scykuICovXG4gIHByaXZhdGUgcmVhZGJhY2tUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW1lcmFSZWFkYmFja09mZjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb2Fyc2UgcGVyLWNoYW5uZWwgbHVtaW5hbmNlIHNhbXBsZSAoa2V5ZWQgYnkgY2hhbm5lbCBpbmRleCkgZm9yIHRoZSBoaXN0b2dyYW0gaW4gdGlsZWQgbW9kZSxcbiAgICogIHdoZXJlIHRoZSBsYXllcnMgaGF2ZSBubyBmdWxsIGluLW1lbW9yeSBwaXhlbHMuIFJlZnJlc2hlZCBvbiBwbG90ICsgc2xpY2UgY2hhbmdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RTYW1wbGVzID0gbmV3IE1hcDxudW1iZXIsIFVpbnQ4QXJyYXk+KCk7XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoIGhpc3RvZ3JhbXMgZnJvbSBgL2hpc3RvZ3JhbWAsIGtleWVkIGAke3p9fCR7Y2hhbm5lbH1gICg+OC1iaXQgaW1hZ2VzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIElIaXN0b2dyYW0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9zY2FsZUV2ZW50JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZW5zaXR5UHJvZmlsZSQgPSBuZXcgU3ViamVjdDxJbnRlbnNpdHlQcm9maWxlW10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8e1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFRJTEVfQUNDRVNTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FuZFRvb2w6IFdhbmRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJydXNoVG9vbDogQnJ1c2hUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIHJlYWRvbmx5IGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpbXBsZVN0YWNrOiBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogb25seSBhIGhvc3QgdGhhdCBzZXJ2ZXMgc3BhdGlhbC1vbWljcyBkYXRhIHByb3ZpZGVzIGl0LCBhbmRcbiAgICAvLyB3aXRob3V0IGl0IHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZSBpcyBuZXZlciBvZmZlcmVkIGFueXdheS5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKSBwcml2YXRlIHJlYWRvbmx5IHNwYXRpYWxEYXRhOiBTcGF0aWFsRGF0YVBvcnQgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIocmVnaW9uU3RvcmUsIHN0b3JlKTtcbiAgICB0aGlzLmFwaSA9IGNvbmZpZy5zbGlkZUNyb3BTZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggKyBjYWNoZSB0aGUgc2VydmVyIHB5cmFtaWQgZGVzY3JpcHRvciAoYEdFVCAvdGlsZXMvaW5mb2ApOiB0aGUgUkVBTCBwZXItbGV2ZWwgdGlsZSBncmlkLFxuICAgKiB0aWxlIHNpemUsIGNoYW5uZWwgbWV0YWRhdGEgYW5kIHBoeXNpY2FsIHBpeGVsIHNpemUuIFRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2VcbiAgICogaXMgc3RpbGwgY2FjaGluZywgc28gd2UgcG9sbCBicmllZmx5LiBDYWNoZWQgcGVyIGBpbmZvQjY0YDsgcmV0dXJucyBudWxsIGlmIGl0IG5ldmVyIGJlY29tZXNcbiAgICogcmVhZHkgKGNhbGxlcnMgZmFsbCBiYWNrIHRvIGEgc2luZ2xlLXRpbGUgZmV0Y2gpLiBUaGlzIGlzIHRoZSBhdXRob3JpdGF0aXZlIGdyaWQg4oCUIGd1ZXNzaW5nXG4gICAqIGxldmVsIGRpbXMgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAgb3ZlcnNob290cyB0aGUgcmVhbCBncmlkIGFuZCB0aGUgc2VydmVyIDQwMHMgb3V0LW9mLXJhbmdlIHRpbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXNjcmlwdG9yKCk6IFByb21pc2U8VGlsZURlc2NyaXB0b3IgfCBudWxsPiB7XG4gICAgLy8gU2VsZi1jb250YWluZWQgbXVsdGktc2xpY2Ugc3RhY2sgKG5vIHRpbGUgc2VydmVyIOKAlCBlLmcuIGEgbnVtYmVyZWQgaW1hZ2VcbiAgICAvLyBzZXJpZXMgYXNzZW1ibGVkIGNsaWVudC1zaWRlLCBlYWNoIHNsaWNlIGEgZGlmZmVyZW50IGZpbGUpOiB0aGVyZSBpcyBub1xuICAgIC8vIHNpbmdsZSBzZXJ2ZXItdGlsZWQgcHlyYW1pZCB0byBkZXNjcmliZS4gUmV0dXJuaW5nIG51bGwgcm91dGVzIGV2ZXJ5XG4gICAgLy8gY2FsbGVyICgyRCBpbWFnZSwgdm9sdW1lLCBzdXJmYWNlKSB0byB0aGVpciBzdGl0Y2hlZC9zaW5nbGUtZmV0Y2hcbiAgICAvLyBmYWxsYmFjaywgd2hpY2gg4oCUIHZpYSBmZXRjaFNsaWNlJ3Mgb3duIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSBicmFuY2gg4oCUXG4gICAgLy8gY29ycmVjdGx5IGZldGNoZXMgZWFjaCBzbGljZSdzIG93biBVUkwgaW5zdGVhZCBvZiBvbmUgZml4ZWQgZmlsZSdzIHRpbGVcbiAgICAvLyBweXJhbWlkLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKHRoaXMubG9hZGVkPy5pbWFnZUluZm8pKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IgJiYgdGhpcy5kZXNjcmlwdG9yS2V5ID09PSBpbmZvQjY0KSByZXR1cm4gdGhpcy5kZXNjcmlwdG9yO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZXMvaW5mbz9pbmZvPSR7aW5mb0I2NH1gO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIERFU0NSSVBUT1JfVElNRU9VVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwLmpzb24oKSkgYXMgVGlsZURlc2NyaXB0b3I7XG4gICAgICAgICAgaWYgKGJvZHk/LmxldmVscz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yS2V5ID0gaW5mb0I2NDtcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIGVtcHR5IGJvZHkg4oaSIHJlLXBvbGwgdW50aWwgdGhlIGRlYWRsaW5lLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSB0aWxlcy9pbmZvIG5vdCByZWFkeTsgZmFsbGluZyBiYWNrIHRvIHNpbmdsZS10aWxlIGZldGNoJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTIwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIENPTVBMRVRFIHJlbmRlcmVkIHNsaWNlIGFzIGFuIGBJbWFnZUJpdG1hcGAgYnkgc3RpdGNoaW5nIHRoZSBzZXJ2ZXIncyBSRUFMIHRpbGUgZ3JpZFxuICAgKiAoZnJvbSBgL3RpbGVzL2luZm9gKSDigJQgbm90IGp1c3QgdGhlIHRvcC1sZWZ0IHRpbGUsIHdoaWNoIG9ubHkgZXZlciBzaG93ZWQgYSBsYXJnZSBpbWFnZSdzXG4gICAqIGNvcm5lci4gUGlja3MgdGhlIGZpbmVzdCBweXJhbWlkIGxldmVsIHdob3NlIGdyaWQgZml0cyBgYnVkZ2V0VGlsZXNgIGFuZCB3aG9zZSBsb25nZXN0IHNpZGUgaXNcbiAgICogd2l0aGluIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCwgZmV0Y2hlcyB0aGF0IGdyaWQgY29uY3VycmVudGx5LCBhbmQgc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLlxuICAgKlxuICAgKiBgY2hhbm5lbGAgc2VsZWN0cyBhIHNpbmdsZSBiYW5kIGFzIGdyYXlzY2FsZSAocmVhbCBsZXZlbHMgb25seSk7IG9taXQgZm9yIHRoZSBzZXJ2ZXIgY29tcG9zaXRlLlxuICAgKiBgYnVkZ2V0VGlsZXNgIGNhcHMgdGhlIGdyaWQ6IHRoZSAyRCB2aWV3IHVzZXMgdGhlIGZ1bGwgYnVkZ2V0IGZvciBkZXRhaWw7IHRoZSAzRCB2b2x1bWUgcGFzc2VzXG4gICAqIDEgZm9yIGEgY2hlYXAgb3ZlcnZpZXcgdGlsZSBwZXIgc2xpY2UgKGl0IGRvd25zYW1wbGVzIHRvIHtAbGluayBWT0xVTUVfTUFYX1NMSUNFfSkuIEZhbGxzIGJhY2tcbiAgICogdG8gYSBzaW5nbGUgYGNvbD0wLHJvdz0wYCB0aWxlIHdoZW4gbm8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUgKHNtYWxsL3NpbXBsZSBpbWFnZXMsIHZvbHVtZXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFNsaWNlKFxuICAgIHo6IG51bWJlcixcbiAgICBjaGFubmVsPzogbnVtYmVyLFxuICAgIGJ1ZGdldFRpbGVzOiBudW1iZXIgPSBNQVhfU1RJVENIX1RJTEVTLFxuICAgIC8qKiBXaGVuIGEgc3BlY2lmaWMgY2hhbm5lbCBoYXMgbm8gcHlyYW1pZCBsZXZlbCB3aXRoaW4gYGJ1ZGdldFRpbGVzYCwgZHJvcCB0byB0aGUgc2VydmVyXG4gICAgICogIENPTVBPU0lURSBvdmVydmlldyBpbnN0ZWFkIG9mIHN0aXRjaGluZyB0aGUgaHVnZSBwZXItY2hhbm5lbCBsZXZlbC4gT25seSBzYWZlIHdoZW4gdGhlIGNhbGxlclxuICAgICAqICB3YW50cyBhIHNpbmdsZSBkZWNpbWF0ZWQgcGxhbmUgKHRoZSBzdXJmYWNlIGhlaWdodCk6IGZvciBhIG11bHRpY2hhbm5lbCBWT0xVTUUgZXZlcnkgY2hhbm5lbFxuICAgICAqICB3b3VsZCB0aGVuIGZldGNoIHRoZSBzYW1lIGNvbXBvc2l0ZSBhbmQgdGhlIGNoYW5uZWxzIHdvdWxkIGNvbGxhcHNlIGludG8gb25lLCBzbyB2b2x1bWVcbiAgICAgKiAgYXNzZW1ibHkgbGVhdmVzIHRoaXMgYGZhbHNlYCB0byBrZWVwIGVhY2ggYmFuZCBkaXN0aW5jdC4gKi9cbiAgICBhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrID0gZmFsc2UsXG4gICk6IFByb21pc2U8SW1hZ2VCaXRtYXA+IHtcbiAgICAvLyBTZWxmLWNvbnRhaW5lZCBtdWx0aS1zbGljZSBzdGFjayAodGlsZWQ6ZmFsc2UpOiBgemAgaW5kZXhlcyBhIGNvbXBsZXRlbHlcbiAgICAvLyBkaWZmZXJlbnQgZmlsZSdzIG93biBwcmV2aWV3IFVSTCwgbm90IGFuIGludGVybmFsIHNsaWNlIG9mIG9uZSBzZXJ2ZXItXG4gICAgLy8gdGlsZWQgZmlsZSDigJQgcmVzb2x2ZWQgYW5kIGZldGNoZWQgdmlhIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSAoc2hhcmVkXG4gICAgLy8gd2l0aCBPU0Q7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSBiYXJlIGZldGNoKCkpIGluc3RlYWQgb2ZcbiAgICAvLyBidWlsZGluZyBhIC90aWxlP2luZm89Li4uJno9IHJlcXVlc3QgYWdhaW5zdCB3aGljaGV2ZXIgc2luZ2xlIGZpbGVcbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQoKSBwb2ludHMgYXQgKHdoaWNoIHdvdWxkIDQwMC9taXNtYXRjaCBmb3IgYW55IHpcbiAgICAvLyBiZXlvbmQgdGhhdCBvbmUgZmlsZSdzIG93biBleHRlbnQpLlxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvO1xuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pKSB7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCB2b2x1bWU6IGZldGNoIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCdzIE9XTiBwbGFuZVxuICAgICAgLy8gKGNoYW5uZWxVcmxzW3pdW2NoYW5uZWxdKSBzbyBlYWNoIGJhbmQgc3RheXMgZGlzdGluY3Qg4oCUIHRoZSBjbGllbnQtc2lkZVxuICAgICAgLy8gYW5hbG9nIG9mIHRoZSBzZXJ2ZXIncyBwZXItY2hhbm5lbCAvdGlsZT9jaGFubmVsPWMuIEVsc2UgdGhlIHotYW5jaG9yIFVSTC5cbiAgICAgIGNvbnN0IGNoVXJscyA9IChpbmZvIGFzIElJbWFnZUluZm8pLmNoYW5uZWxVcmxzO1xuICAgICAgY29uc3QgdXJsID0gY2hhbm5lbCAhPSBudWxsICYmIGNoVXJscz8uW3pdPy5bY2hhbm5lbF0gIT0gbnVsbFxuICAgICAgICA/IGNoVXJsc1t6XVtjaGFubmVsXVxuICAgICAgICA6IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGluZm8gYXMgSUltYWdlSW5mbywgeik7XG4gICAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBubyBVUkwgZm9yIHNsaWNlICR7en1gKTtcbiAgICAgIHJldHVybiB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCaXRtYXAodXJsKTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIG5vIHNlbGVjdGVkIGltYWdlIGluZm8gKGdldFNlbGVjdGVkSW5mb0I2NCBudWxsKScpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuXG4gICAgLy8gVGhlIHJlcXVlc3RlZCBiYW5kOyBtYXkgYmUgZHJvcHBlZCB0byB0aGUgY29tcG9zaXRlICh1bmRlZmluZWQpIGJlbG93IHdoZW4gdGhlIGNoYW5uZWwgaGFzIG5vXG4gICAgLy8gcHlyYW1pZCBsZXZlbCBzbWFsbCBlbm91Z2ggdG8gc3RpdGNoIHdpdGhpbiBidWRnZXQuXG4gICAgbGV0IGVmZmVjdGl2ZUNoYW5uZWwgPSBjaGFubmVsO1xuICAgIGNvbnN0IGZldGNoVGlsZSA9IGFzeW5jIChcbiAgICAgIHJlczogbnVtYmVyLFxuICAgICAgY29sOiBudW1iZXIsXG4gICAgICByb3c6IG51bWJlcixcbiAgICAgIHQ6IG51bWJlcixcbiAgICApOiBQcm9taXNlPEltYWdlQml0bWFwPiA9PiB7XG4gICAgICBjb25zdCBjaCA9IGVmZmVjdGl2ZUNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7ZWZmZWN0aXZlQ2hhbm5lbH1gO1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9dGlsZT9pbmZvPSR7aW5mb0I2NH0mcmVzPSR7cmVzfSZjb2w9JHtjb2x9JnJvdz0ke3Jvd30mej0ke3p9JnRpbGVTaXplPSR7dH0ke2NofWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSBzbGljZSBmZXRjaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICgke2NvbH0vJHtyb3d9IHJlcyAke3Jlc30pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoYXdhaXQgcmVzcC5ibG9iKCkpO1xuICAgIH07XG5cbiAgICAvLyBObyBkZXNjcmlwdG9yIOKGkiBzaW5nbGUgdG9wLWxlZnQgdGlsZSAobGVnYWN5IGZhbGxiYWNrOyBjb3JyZWN0IGZvciBzbWFsbC9zaW1wbGUgaW1hZ2VzKS5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MubGV2ZWxzPy5sZW5ndGgpIHJldHVybiBmZXRjaFRpbGUoMCwgMCwgMCwgVElMRV9TSVpFKTtcblxuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBPTkxZIGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzICh0aGUgZnJvbnQgb2YgYGxldmVsc2ApOyB0aGUgc2VydmVyXG4gICAgLy8gY29tcG9zaXRlIGV4aXN0cyBhdCBldmVyeSBsZXZlbCwgaW5jbHVkaW5nIHRoZSBzbWFsbCBvdmVydmlld3MuXG4gICAgY29uc3QgcGVyQ2hhbm5lbExldmVscyA9IGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGg7XG4gICAgY29uc3QgdXNhYmxlID1cbiAgICAgIGNoYW5uZWwgPT0gbnVsbCA/IGRlc2MubGV2ZWxzIDogZGVzYy5sZXZlbHMuc2xpY2UoMCwgTWF0aC5tYXgoMSwgcGVyQ2hhbm5lbExldmVscykpO1xuXG4gICAgLy8gRmluZXN0IGxldmVsIHdob3NlIHN0aXRjaGVkIGdyaWQgZml0cyBCT1RIIHRoZSB0aWxlIGJ1ZGdldCBhbmQgdGhlIEdQVSB0ZXh0dXJlIGxpbWl0OyBpZiBub25lXG4gICAgLy8gZml0cywgdGhlIGNvYXJzZXN0IGF2YWlsYWJsZSAoZml0cz1mYWxzZSkuXG4gICAgY29uc3QgdGlsZXNGb3IgPSAobHZsOiBUaWxlTGV2ZWwpOiBudW1iZXIgPT5cbiAgICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChsdmwud2lkdGggLyB0KSkgKiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICBjb25zdCBwaWNrID0gKGxldmVsczogVGlsZUxldmVsW10pOiB7IGx2bDogVGlsZUxldmVsOyBmaXRzOiBib29sZWFuIH0gPT4ge1xuICAgICAgbGV0IGMgPSBsZXZlbHNbMF07XG4gICAgICBmb3IgKGNvbnN0IGx2bCBvZiBsZXZlbHMpIHtcbiAgICAgICAgYyA9IGx2bDtcbiAgICAgICAgaWYgKHRpbGVzRm9yKGx2bCkgPD0gYnVkZ2V0VGlsZXMgJiYgTWF0aC5tYXgobHZsLndpZHRoLCBsdmwuaGVpZ2h0KSA8PSBNQVhfVEVYVFVSRV9ESU0pIHtcbiAgICAgICAgICByZXR1cm4geyBsdmwsIGZpdHM6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbHZsOiBjLCBmaXRzOiBmYWxzZSB9O1xuICAgIH07XG5cbiAgICBsZXQgc2VsID0gcGljayh1c2FibGUpO1xuICAgIC8vIEEgc3BlY2lmaWMgY2hhbm5lbCBvbmx5IGhhcyB0aWxlcyBhdCB0aGUgKGZldywgbGFyZ2UpIHJlYWwgbGV2ZWxzLiBXaGVuIG5vbmUgb2YgdGhlbSBmaXQgdGhlXG4gICAgLy8gYnVkZ2V0IOKAlCBlLmcuIHRoZSBjb2Fyc2VzdCByZWFsIGxldmVsIGlzIHN0aWxsIDE0OTgyw5cxODY3MCDihpIgfjExMDAgZnVsbC1yZXMgdGlsZXMg4oCUIHN0aXRjaGluZ1xuICAgIC8vIGl0IHBlciBzbGljZSBmbG9vZHMgdGhlIHNlcnZlciAoNTA0cykgYW5kIHN0YWxscyB0aGUgbG9hZC4gVGhlIGNvbXBvc2l0ZSBweXJhbWlkIGhhcyBzbWFsbFxuICAgIC8vIG92ZXJ2aWV3IGxldmVscywgc28gZmV0Y2ggdGhlIGNvbXBvc2l0ZSBpbnN0ZWFkIGFuZCBkZXJpdmUgbHVtaW5hbmNlIGZyb20gaXQuIEV2ZXJ5IGNhbGxlciBoZXJlXG4gICAgLy8gKHN1cmZhY2UgaGVpZ2h0LCB2b2x1bWUgYXNzZW1ibHksIHJlYWRiYWNrKSBkb3duc2NhbGVzIHRoZSBwbGFuZSBhbnl3YXksIHNvIGEgY29tcG9zaXRlLWRlcml2ZWRcbiAgICAvLyBwbGFuZSBpcyB0aGUgcmlnaHQgdHJhZGUgZm9yIG9uZSB0aGF0IGFjdHVhbGx5IGxvYWRzLiBPbmx5IGtpY2tzIGluIHdoZW4gdGhlIGNoYW5uZWwgY2FuJ3QgZml0LlxuICAgIGlmIChhbGxvd0NvbXBvc2l0ZUZhbGxiYWNrICYmICFzZWwuZml0cyAmJiBjaGFubmVsICE9IG51bGwgJiYgZGVzYy5sZXZlbHMubGVuZ3RoID4gcGVyQ2hhbm5lbExldmVscykge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gcGljayhkZXNjLmxldmVscyk7XG4gICAgICBpZiAoY29tcG9zaXRlLmZpdHMgfHwgdGlsZXNGb3IoY29tcG9zaXRlLmx2bCkgPCB0aWxlc0ZvcihzZWwubHZsKSkge1xuICAgICAgICBlZmZlY3RpdmVDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWwgPSBjb21wb3NpdGU7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW25hcGFyaS1qc10gY2hhbm5lbCAke2NoYW5uZWx9IGhhcyBubyBweXJhbWlkIGxldmVsIHdpdGhpbiB0aGUgJHtidWRnZXRUaWxlc30tdGlsZSBgICtcbiAgICAgICAgICAgIGBidWRnZXQ7IHVzaW5nIHRoZSBjb21wb3NpdGUgb3ZlcnZpZXcgKHJlcyAke3NlbC5sdmwucmVzfSwgJHtzZWwubHZsLndpZHRofcOXYCArXG4gICAgICAgICAgICBgJHtzZWwubHZsLmhlaWdodH0pIGZvciB0aGlzIHBsYW5lLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNob3NlbiA9IHNlbC5sdmw7XG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4ud2lkdGggLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjaG9zZW4uaGVpZ2h0IC8gdCkpO1xuICAgIGlmICghc2VsLmZpdHMgJiYgYnVkZ2V0VGlsZXMgPT09IE1BWF9TVElUQ0hfVElMRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtuYXBhcmktanNdIGZ1bGwgcmVzb2x1dGlvbiBleGNlZWRzIHRoZSAke2J1ZGdldFRpbGVzfS10aWxlLyR7TUFYX1RFWFRVUkVfRElNfXB4IGJ1ZGdldDsgYCArXG4gICAgICAgICAgYGRpc3BsYXlpbmcgb3ZlcnZpZXcgbGV2ZWwgcmVzICR7Y2hvc2VuLnJlc30gKCR7Y2hvc2VuLndpZHRofcOXJHtjaG9zZW4uaGVpZ2h0fSkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHMgPT09IDEgJiYgcm93cyA9PT0gMSkgcmV0dXJuIGZldGNoVGlsZShjaG9zZW4ucmVzLCAwLCAwLCB0KTtcblxuICAgIC8vIFN0aXRjaCBpbnRvIG9uZSBsZXZlbC1zaXplZCBjYW52YXMuIEZldGNoIHRoZSBncmlkIHdpdGggQk9VTkRFRCBjb25jdXJyZW5jeTogZmlyaW5nIGV2ZXJ5IHRpbGVcbiAgICAvLyBhdCBvbmNlIChhIGJpZyBncmlkID0gaHVuZHJlZHMgb2YgcmVxdWVzdHMpIG92ZXJ3aGVsbWVkIHRoZSB0aWxlIHNlcnZlciAoNTA0cykuIEVkZ2UgdGlsZXMgYXJlXG4gICAgLy8gbmFycm93ZXIvc2hvcnRlcjsgZHJhd0ltYWdlIHBsYWNlcyBlYWNoIGF0IGl0cyBncmlkIG9mZnNldCBzbyBwYXJ0aWFsIHRpbGVzIGxpbmUgdXAuXG4gICAgY29uc3QgY29vcmRzOiBBcnJheTx7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlciB9PiA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHJvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgY29vcmRzLnB1c2goeyBjb2wsIHJvdyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXM6IEFycmF5PHsgY29sOiBudW1iZXI7IHJvdzogbnVtYmVyOyBibXA6IEltYWdlQml0bWFwIH0+ID0gW107XG4gICAgY29uc3Qgc3RpdGNoV29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBqb2IgPSBjb29yZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFqb2IpIHJldHVybjtcbiAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlKGNob3Nlbi5yZXMsIGpvYi5jb2wsIGpvYi5yb3csIHQpO1xuICAgICAgICB0aWxlcy5wdXNoKHsgY29sOiBqb2IuY29sLCByb3c6IGpvYi5yb3csIGJtcCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5taW4oVElMRV9GRVRDSF9DT05DVVJSRU5DWSwgY29vcmRzLmxlbmd0aCkgfSwgKCkgPT4gc3RpdGNoV29ya2VyKCkpLFxuICAgICk7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBjaG9zZW4ud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2hvc2VuLmhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgIHwgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBudWxsO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoJ1tuYXBhcmktanNdIHNsaWNlIHN0aXRjaDogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuICAgIGZvciAoY29uc3QgeyBjb2wsIHJvdywgYm1wIH0gb2YgdGlsZXMpIHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgfVxuXG4gICAgLy8gU2FmZXR5IG5ldDogaWYgdGhlIGNob3NlbiBsZXZlbCBzdGlsbCBleGNlZWRzIHRoZSBHUFUgdGV4dHVyZSBsaW1pdCAoZS5nLiBhIG11bHRpY2hhbm5lbFxuICAgIC8vIGltYWdlIHdob3NlIGNvYXJzZXN0IFJFQUwgbGV2ZWwgaXMgaHVnZSDigJQgb3ZlcnZpZXcgbGV2ZWxzIGFyZSBjb21wb3NpdGUtb25seSksIGRvd25zY2FsZSB0aGVcbiAgICAvLyBzdGl0Y2hlZCBjYW52YXMgdG8gZml0IHNvIHRoZSBXZWJHUFUgdGV4dHVyZSB1cGxvYWQgY2FuJ3QgZmFpbC5cbiAgICBjb25zdCBsb25nZXN0ID0gTWF0aC5tYXgoY2hvc2VuLndpZHRoLCBjaG9zZW4uaGVpZ2h0KTtcbiAgICBpZiAobG9uZ2VzdCA+IE1BWF9URVhUVVJFX0RJTSkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNQVhfVEVYVFVSRV9ESU0gLyBsb25nZXN0O1xuICAgICAgY29uc3Qgb3V0VyA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoY2hvc2VuLndpZHRoICogc2NhbGUpKTtcbiAgICAgIGNvbnN0IG91dEggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGNob3Nlbi5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gc3RpdGNoZWQgbGV2ZWwgJHtjaG9zZW4ud2lkdGh9w5cke2Nob3Nlbi5oZWlnaHR9IGV4Y2VlZHMgdGhlIGAgK1xuICAgICAgICAgIGAke01BWF9URVhUVVJFX0RJTX1weCB0ZXh0dXJlIGxpbWl0OyBkb3duc2NhbGluZyB0byAke291dFd9w5cke291dEh9LmAsXG4gICAgICApO1xuICAgICAgbGV0IG91dDogSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM7XG4gICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3V0ID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhvdXRXLCBvdXRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBvdXQud2lkdGggPSBvdXRXO1xuICAgICAgICBvdXQuaGVpZ2h0ID0gb3V0SDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9jdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSBhc1xuICAgICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgICB8IG51bGw7XG4gICAgICBpZiAoIW9jdHgpIHRocm93IG5ldyBFcnJvcignW25hcGFyaS1qc10gc2xpY2UgZG93bnNjYWxlOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgICBvY3R4LmRyYXdJbWFnZShjYW52YXMgYXMgdW5rbm93biBhcyBDYW52YXNJbWFnZVNvdXJjZSwgMCwgMCwgb3V0Vywgb3V0SCk7XG4gICAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAob3V0IGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoY2FudmFzIGFzIHVua25vd24gYXMgSW1hZ2VCaXRtYXBTb3VyY2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXI6IGxvYWQgLyByZW5kZXIgLyB2aWV3cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxOYXBhcmlMb2FkZWQ+IHtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBfaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwbG90RGl2KTtcbiAgICBpZiAoIWhvc3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtuYXBhcmktanNdIHBsb3QgdGFyZ2V0ICMke3Bsb3REaXZ9IG5vdCBmb3VuZGApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgLy8gVGhpcyBwbG90J3Mgc2NlbmUuIEEgbmV3ZXIgcGxvdCByZXNldHMgaW50byB0aGUgbmV4dCBvbmUgd2hpbGUgdGhpcyBvbmUgc3RpbGwgYXdhaXRzLCBhbmRcbiAgICAvLyBhIHN1cGVyc2VkZWQgcGxvdCBtdXN0IG5vdCBnbyBvbiB0byBkcmF3IChvciBjb3VudCBpbWFnZSB0aWxlcykgaW50byB0aGUgbmV3ZXIgc2NlbmUuXG4gICAgY29uc3Qgc2NlbmUgPSB0aGlzLmltYWdlVGlsZXNHZW5lcmF0aW9uO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wbG90RGl2SWQgPSBwbG90RGl2O1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBzY3JlZW5IZWlnaHQgPyBgJHtzY3JlZW5IZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgIGhvc3QuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcblxuICAgIGNvbnN0IGluZm8gPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8uaW1hZ2VJbmZvID8/IGltYWdlSW5mbztcbiAgICBjb25zdCB6ID0gKGltYWdlTG9hZGVkIGFzIE5hcGFyaUxvYWRlZCk/LnogPz8gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2aWV3ZXIgPSBuZXcgVmlld2VyKHtcbiAgICAgICAgY2FudmFzLFxuICAgICAgICBiYWNrZ3JvdW5kOiB7IHI6IDAuMDcsIGc6IDAuMDcsIGI6IDAuMDksIGE6IDEgfSxcbiAgICAgICAgLy8gU2V0IGhlcmUgcmF0aGVyIHRoYW4gbGVmdCB0byBuYXBhcmktanMncyBvd24gZGVmYXVsdCBzbyB0aGUgZ2VudGxlclxuICAgICAgICAvLyBzdGVwIGFwcGxpZXMgd2l0aCB0aGUgdmVyc2lvbiBjdXJyZW50bHkgaW5zdGFsbGVkLiBDaG9zZW4gdG8gbWF0Y2ggdGhlXG4gICAgICAgIC8vIE9TRCBiYWNrZW5kJ3Mgc3RlcCAoc2VlIE9TRF9aT09NX1BFUl9TQ1JPTEwpOiB0aGUgd2hlZWwgc2hvdWxkIGZlZWwgdGhlXG4gICAgICAgIC8vIHNhbWUgb24gYW4gaW1hZ2Ugd2hpY2hldmVyIHJlbmRlcmVyIGlzIGRyYXdpbmcgaXQuIFRoZSBzdGVwIGFwcGxpZXMgcGVyXG4gICAgICAgIC8vIHNjcm9sbCBFVkVOVCwgYW5kIGEgdHJhY2twYWQgc2VuZHMgYSBidXJzdCBvZiB0aGVtIHBlciBzd2lwZSwgc28gYSBzdGVwXG4gICAgICAgIC8vIHR1bmVkIHRvIGEgbW91c2Ugbm90Y2ggcnVucyBhd2F5IHVuZGVyIGEgdHJhY2twYWQuXG4gICAgICAgIHdoZWVsWm9vbVNwZWVkOiBOQVBBUklfV0hFRUxfWk9PTV9TUEVFRCxcbiAgICAgICAgLy8gVGhlIEZJUlNUIDNEIGxheWVyIG9mIGEgc2NlbmUgZnJhbWVzIHRoZSBvcmJpdCBjYW1lcmE7IGV2ZXJ5IGxhdGVyIG9uZSBsZWF2ZXMgdGhlXG4gICAgICAgIC8vIHBvc2UgYWxvbmUuIEEgc3BhdGlhbCBzY2VuZSBpcyBidWlsdCBmcm9tIHNldmVyYWwgbGF5ZXJzIGFuZCByZWJ1aWx0IGNvbnN0YW50bHkg4oCUXG4gICAgICAgIC8vIHJlY29sb3VyaW5nIGJ5IGEgY2xhc3MsIHBpY2tpbmcgYSBnZW5lLCBzdGVwcGluZyBhIHNlY3Rpb24g4oCUIGFuZCB3aXRoIG5hcGFyaS1qcydzXG4gICAgICAgIC8vIHByZXZpb3VzIHVuY29uZGl0aW9uYWwgZnJhbWluZyBlYWNoIG9mIHRob3NlIHRocmV3IGF3YXkgYW4gb3JiaXQgdGhlIHVzZXIgaGFkIHNldC5cbiAgICAgICAgLy8gVGhlIHBvc2UgaXQgc25hcHBlZCBiYWNrIHRvIGRlcGVuZGVkIG9uIFdISUNIIGxheWVyIHdhcyByZWJ1aWx0LCBzbyBpc29sYXRpbmcgb25lXG4gICAgICAgIC8vIHNlY3Rpb24gem9vbWVkIHRvIHRoYXQgc2VjdGlvbidzIGJvdW5kcy4gYHJlc2V0Rml0M0QoKWAgb24gYSBkYXRhc2V0IGNoYW5nZSBpcyB3aGF0XG4gICAgICAgIC8vIGxldHMgdGhlIG5leHQgc2NlbmUgZnJhbWUgaXRzZWxmLlxuICAgICAgICBmaXQzZDogJ29uY2UnLFxuICAgICAgICAvLyBJbiB0aGUgc3BhdGlhbCBtb2RlcyBhIHBsYWluIGNsaWNrIFNFTEVDVFMgdGhlIGNsYXNzIHVuZGVyIHRoZSBjdXJzb3IsXG4gICAgICAgIC8vIHNvIG5hcGFyaSdzIE9TRC1zdHlsZSBjbGljay10by16b29tIGlzIHR1cm5lZCBvZmYgdGhlcmU6IG90aGVyd2lzZSBvbmVcbiAgICAgICAgLy8gY2xpY2sgd291bGQgYm90aCBzZWxlY3QgYSBjbGFzcyBhbmQgem9vbSAyeCBhYm91dCB0aGUgY3Vyc29yLCBhbmQgdGhlXG4gICAgICAgIC8vIHpvb20gd291bGQgdGhlbiBoYWx2ZSB0aGUgcGl4ZWwgcmFkaXVzIHRoZSBuZXh0IGNsaWNrIGhpdC10ZXN0cyB3aXRoLlxuICAgICAgICAvLyBab29taW5nIGlzIHN0aWxsIG9uIHRoZSB3aGVlbCwgdGhlIHpvb20gYnV0dG9ucyBhbmQgdGhlIHpvb20tYm94IHRvb2wuXG4gICAgICAgIC4uLihpc1NwYXRpYWxPbWljcyhwbG90VHlwZSkgfHwgaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSlcbiAgICAgICAgICA/IHsgY2xpY2tab29tRmFjdG9yOiAwIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICBhd2FpdCB2aWV3ZXIucmVhZHk7XG4gICAgICBpZiAoc2NlbmUgIT09IHRoaXMuaW1hZ2VUaWxlc0dlbmVyYXRpb24pIHJldHVybiBmYWxzZTtcblxuICAgICAgaWYgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTcGF0aWFsT21pY3MzZCh2aWV3ZXIsIGhvc3QpO1xuICAgICAgfSBlbHNlIGlmIChpc1NwYXRpYWxPbWljcyhwbG90VHlwZSkpIHtcbiAgICAgICAgLy8gTm8gbG9hZGVkIGltYWdlOiBhbiBpbWFnZS1sZXNzIGRhdGFzZXQgb3BlbmVkIGJlZm9yZSBhbnkgaW1hZ2UgKHRoZSB2aXN1YWxpemVyJ3NcbiAgICAgICAgLy8gcGxvdFNwYXRpYWxXaXRob3V0SW1hZ2UpIOKAlCB0aGUgb2JzZXJ2YXRpb25zIGFsb25lLlxuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3BhdGlhbE9taWNzKHZpZXdlciwgaG9zdCwgeiwgaW1hZ2VMb2FkZWQgPT0gbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFwYXJpU2NhdHRlcihwbG90VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3VudFNjYXR0ZXIodmlld2VyLCBob3N0LCB6KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW91bnRTY2F0dGVyM2Qodmlld2VyLCBpbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNOYXBhcmlTdXJmYWNlKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50U3VyZmFjZSh2aWV3ZXIpO1xuICAgICAgfSBlbHNlIGlmIChpc05hcGFyaTNkKHBsb3RUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdW50Vm9sdW1lKHZpZXdlciwgaW5mbywgcGxvdFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbWFnZSh6KTtcbiAgICAgICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbFNjYWxlQmFyKCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICAgICAgdGhpcy5pbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgICAgfVxuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHBsb3QgZmFpbGVkOicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzOiBwZXItY2hhbm5lbCBjb21wb3NpdGUsIExVVCwgbmF0aXZlIGhpc3RvZ3JhbXMgKGppdC11aSMxMDIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgZ3JheXNjYWxlIGRpc3BsYXkgY29sb3JtYXAgZnJvbSB0aGUgc3RvcmUgc2VsZWN0aW9uICgrcmV2ZXJzZSksIGRlZmF1bHRpbmcgdG8gZ3JheS5cbiAgICogIE1hcHMgdGhlIGppdC11aSBzdG9yZSBjb2xvcm1hcCBub2RlIHRvIGEgbmFwYXJpIGBDb2xvcm1hcGAgdmlhIHRoZSBsaWJyYXJ5J3MgTFVUIGZhY3Rvcnk7XG4gICAqICB0aGUgbXVsdGljaGFubmVsIHRpbnQgcmFtcHMgYXJlIGJ1aWx0IGluc2lkZSB7QGxpbmsgTXVsdGlDaGFubmVsSW1hZ2VWaWV3fSBmcm9tIGVhY2hcbiAgICogIGNoYW5uZWwncyBoZXggY29sb3VyLiAqL1xuICBwcml2YXRlIGdyYXlzY2FsZUNvbG9ybWFwKCk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsKT8uZGF0YT8udmFsdWU7XG4gICAgY29uc3QgbHV0ID0gdmFsdWUgIT0gbnVsbCA/IGJ1aWxkQ29sb3JtYXBMdXQodmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UpIDogbnVsbDtcbiAgICBpZiAobHV0KSByZXR1cm4gY29sb3JtYXBGcm9tTHV0KCdncmF5LWNtYXAnLCBsdXQpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRSZXZlcnNlXG4gICAgICA/IGNvbG9ybWFwRnJvbUx1dCgnZ3JheS1yZXYnLCBbWzI1NSwgMjU1LCAyNTVdLCBbMCwgMCwgMF1dIGFzIFJnYltdKVxuICAgICAgOiAnZ3JheSc7XG4gIH1cblxuICAvKiogRmV0Y2ggYSBzdGl0Y2hlZCBzbGljZSBhbmQgcmVhZCBpdCBiYWNrIGFzIGEgc2luZ2xlLWNoYW5uZWwgdWludDggcGxhbmUuIGBjaGFubmVsYCBzZWxlY3RzIGFcbiAgICogIGJhbmQgKG11bHRpY2hhbm5lbCk7IG9taXQgaXQgZm9yIHRoZSBncmF5c2NhbGUgY29tcG9zaXRlIChhbGwgb3ZlcnZpZXcgbGV2ZWxzIGF2YWlsYWJsZSwgc28gYVxuICAgKiAgbGFyZ2UgaW1hZ2UgcGlja3MgYSBmaXR0aW5nIGRvd25zY2FsZWQgbGV2ZWwgcmF0aGVyIHRoYW4gb25seSB0aGUgZnVsbC1yZXMgcmVhbCBsZXZlbCkuICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFubmVsRGF0YShcbiAgICB6OiBudW1iZXIsXG4gICAgY2hhbm5lbD86IG51bWJlcixcbiAgICBidWRnZXRUaWxlcz86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBibXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgY2hhbm5lbCwgYnVkZ2V0VGlsZXMpO1xuICAgIHJldHVybiB0aGlzLmJpdG1hcFRvTHVtaW5hbmNlKGJtcCk7XG4gIH1cblxuICAvKiogRGVjb2RlIGFuIGBJbWFnZUJpdG1hcGAgKHNlcnZlciBiYW5kcyBhcmUgZ3JheXNjYWxlLCBSPUc9QikgdG8gYSBzaW5nbGUtY2hhbm5lbCB1aW50OCBwbGFuZS5cbiAgICogIGBtYXhTaWRlYCBjYXBzIHRoZSBsb25nZXN0IHNpZGUgKGRvd25zY2FsaW5nIG9uIHRoZSBjYW52YXMgZHJhdykg4oCUIHVzZWQgdG8ga2VlcCBwcmUtbG9hZGVkXG4gICAqICBzdXJmYWNlIHNsaWNlIHBsYW5lcyBzbWFsbC4gKi9cbiAgcHJpdmF0ZSBiaXRtYXBUb0x1bWluYW5jZShcbiAgICBibXA6IEltYWdlQml0bWFwLFxuICAgIG1heFNpZGU/OiBudW1iZXIsXG4gICk6IHsgZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3Qgc2NhbGUgPSBtYXhTaWRlID8gTWF0aC5taW4oMSwgbWF4U2lkZSAvIE1hdGgubWF4KGJtcC53aWR0aCwgYm1wLmhlaWdodCwgMSkpIDogMTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibXAud2lkdGggKiBzY2FsZSkpO1xuICAgIGNvbnN0IGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJtcC5oZWlnaHQgKiBzY2FsZSkpO1xuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzO1xuICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3LCBoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSB3O1xuICAgICAgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzXG4gICAgICB8IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuICAgICAgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgIHwgbnVsbDtcbiAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCdbbmFwYXJpLWpzXSBjaGFubmVsIHJlYWRiYWNrOiAyRCBjb250ZXh0IHVuYXZhaWxhYmxlJyk7XG4gICAgLy8gU2NhbGUgdGhlIFdIT0xFIGJpdG1hcCBpbnRvIHRoZSAocG9zc2libHkgc21hbGxlcikgdGFyZ2V0IGNhbnZhcyDigJQgZHJhd2luZyBhdCBuYXR1cmFsIHNpemVcbiAgICAvLyB3b3VsZCBjcm9wIHRvIHRoZSB0b3AtbGVmdCB3w5doIGNvcm5lciB3aGVuIGRvd25zY2FsaW5nIGEgbGFyZ2Ugc2xpY2UgKG1heFNpZGUgPCBibXAgc2l6ZSkuXG4gICAgY3R4LmRyYXdJbWFnZShibXAsIDAsIDAsIHcsIGgpO1xuICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgY29uc3QgcmdiYSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkodyAqIGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdyAqIGg7IGkrKykgZGF0YVtpXSA9IHJnYmFbaSAqIDRdO1xuICAgIHJldHVybiB7IGRhdGEsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIDJEIGltYWdlIGZvciBzbGljZSBgemAuIFdpdGggYSBzZXJ2ZXIgcHlyYW1pZCBkZXNjcmlwdG9yIHdlIHVzZSBhIHB5cmFtaWRhbFxuICAgKiB7QGxpbmsgVGlsZWRTb3VyY2V9IHBlciBsYXllciBzbyB0aGUgdmlldyByZWZpbmVzIHRvIGhpZ2hlciByZXNvbHV0aW9uIG9uIHpvb20gKGxpa2UgT1NEKSBhbmRcbiAgICogc2l0cyBuYXR1cmFsbHkgaW4gZnVsbC1yZXNvbHV0aW9uIGNvb3JkaW5hdGVzOyB3aXRob3V0IG9uZSB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZS1sZXZlbFxuICAgKiBzdGl0Y2guIFRocmVlIGRpc3BsYXkgbW9kZXMgZWl0aGVyIHdheTogbXVsdGljaGFubmVsIGFkZGl0aXZlIHRpbnQsIGdyYXlzY2FsZSBjb2xvcm1hcCwgUkdCLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZSh6OiBudW1iZXIsIHRva2VuPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGNvbnN0IHNjZW5lID0gdGhpcy5pbWFnZVRpbGVzR2VuZXJhdGlvbjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgLy8gUmVzZXQgaW50byBhIG5ld2VyIHNjZW5lIHdoaWxlIHRoZSBkZXNjcmlwdG9yIHdhcyBpbiBmbGlnaHQ6IHRoaXMgcmVuZGVyIGlzIHN1cGVyc2VkZWQuXG4gICAgaWYgKHNjZW5lICE9PSB0aGlzLmltYWdlVGlsZXNHZW5lcmF0aW9uKSByZXR1cm47XG4gICAgaWYgKGRlc2MgJiYgZGVzYy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVySW1hZ2VUaWxlZCh6LCBkZXNjLCBzY2VuZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlckltYWdlU3RpdGNoZWQoeiwgdG9rZW4pO1xuICB9XG5cbiAgLyoqIFNpbmdsZS1sZXZlbCBzdGl0Y2ggZmFsbGJhY2sgKG5vIGRlc2NyaXB0b3IpOiB0aGUgcHJlLXRpbGluZyBwYXRoLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlbmRlckltYWdlU3RpdGNoZWQoejogbnVtYmVyLCB0b2tlbj86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gYXdhaXQgdGhpcy5lbnN1cmVEZXNjcmlwdG9yKCk7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2M/LmNoYW5uZWxzID8/IChzdGF0ZXMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9ICEhZGVzYz8ubXVsdGljaGFubmVsICYmIGNoYW5uZWxDb3VudCA+IDE7XG5cbiAgICAvLyAxKSBGZXRjaCBhbGwgcGl4ZWwgZGF0YSBCRUZPUkUgdG91Y2hpbmcgdGhlIHZpZXdlciwgc28gYSBzdXBlcnNlZGVkIHNjcnViIGNhbiBiYWlsIHdpdGhvdXRcbiAgICAvLyAgICBoYXZpbmcgdG9ybiBkb3duIHRoZSB2aXNpYmxlIGxheWVycyAoYXZvaWRzIGZsaWNrZXIgLyBvdXQtb2Ytb3JkZXIgbGF5ZXIgc3RhdGUpLlxuICAgIGxldCBtb2RlOiAnZ3JheXNjYWxlJyB8ICdtdWx0aWNoYW5uZWwnIHwgJ3JnYic7XG4gICAgbGV0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgbW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgcGxhbmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IGNoYW5uZWxDb3VudCB9LCAoXywgYykgPT4gdGhpcy5mZXRjaENoYW5uZWxEYXRhKHosIGMpKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIG1vZGUgPSAnZ3JheXNjYWxlJztcbiAgICAgIC8vIENvbXBvc2l0ZSBmZXRjaCAobm8gY2hhbm5lbCkg4oaSIGFsbCBvdmVydmlldyBsZXZlbHMgdXNhYmxlLCBzbyBhIGxhcmdlIGdyYXlzY2FsZSBpbWFnZVxuICAgICAgLy8gc2VsZWN0cyBhIGZpdHRpbmcgZG93bnNjYWxlZCBsZXZlbCBpbnN0ZWFkIG9mIHRoZSBmdWxsLXJlcyByZWFsIGxldmVsICh0ZXh0dXJlIGxpbWl0KS5cbiAgICAgIHBsYW5lcyA9IFthd2FpdCB0aGlzLmZldGNoQ2hhbm5lbERhdGEoeildO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlID0gJ3JnYic7XG4gICAgICBiaXRtYXAgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2Uoeik7XG4gICAgfVxuXG4gICAgLy8gMikgQ29tbWl0IOKAlCB1bmxlc3MgYSBuZXdlciBzY3J1YiBzdXBlcnNlZGVkIHVzIG9yIHRoZSB2aWV3ZXIgd2FzIHRvcm4gZG93bi5cbiAgICBpZiAoKHRva2VuICE9IG51bGwgJiYgdG9rZW4gIT09IHRoaXMuc2xpY2VSZXEpIHx8IHRoaXMudmlld2VyICE9PSB2KSB7XG4gICAgICBiaXRtYXA/LmNsb3NlPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgZGlzcGxheWVkIHRleHR1cmUgbWF5IGJlIGEgZG93bnNjYWxlZCBweXJhbWlkIGxldmVsOyBzY2FsZSB0aGUgbGF5ZXIgaW50byBGVUxMLVJFU09MVVRJT05cbiAgICAvLyB3b3JsZCBjb29yZGluYXRlcyAobGV2ZWwtMCBwaXhlbHMpIHNvIHRoZSBjYW1lcmEsIHJlYWRiYWNrIGFuZCDigJQgY3JpdGljYWxseSDigJQgcHJlLXNhdmVkXG4gICAgLy8gcmVnaW9ucyAoc3RvcmVkIGluIGZ1bGwtcmVzIGNvb3JkcywgZS5nLiBuZHBpKSBhbGwgbGluZSB1cCByZWdhcmRsZXNzIG9mIHdoaWNoIGxldmVsIGlzIHNob3duLlxuICAgIC8vIFRoaXMgbWlycm9ycyBPU0QsIHdob3NlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGFsd2F5cyBsZXZlbCAwLlxuICAgIGNvbnN0IHRleFcgPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLndpZHRoIDogcGxhbmVzWzBdPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IHRleEggPSBtb2RlID09PSAncmdiJyA/IChiaXRtYXAgYXMgSW1hZ2VCaXRtYXApLmhlaWdodCA6IHBsYW5lc1swXT8uaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnVsbFcgPSBkZXNjPy53aWR0aCB8fCB0ZXhXIHx8IDE7XG4gICAgY29uc3QgZnVsbEggPSBkZXNjPy5oZWlnaHQgfHwgdGV4SCB8fCAxO1xuICAgIGNvbnN0IHNjYWxlOiBbbnVtYmVyLCBudW1iZXJdID0gW3RleFcgPyBmdWxsVyAvIHRleFcgOiAxLCB0ZXhIID8gZnVsbEggLyB0ZXhIIDogMV07XG5cbiAgICB0aGlzLmltYWdlTW9kZSA9IG1vZGU7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbjogJ2xpbmVhcicgfCAnbmVhcmVzdCcgPSB0aGlzLmltYWdlU21vb3RoaW5nID8gJ2xpbmVhcicgOiAnbmVhcmVzdCc7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG4gICAgaWYgKG1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICBjb25zdCB2aWV3czogQ2hhbm5lbFZpZXdbXSA9IHBsYW5lcy5tYXAoKGQsIGMpID0+IHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2M/LmNoYW5uZWxJbmZvPy5bY10/LmNvbG9yID8/IHRpbnRGb3IoYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0LCBjaGFubmVsczogMSwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IGQuZGF0YSB9LFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdtdWx0aWNoYW5uZWwnLCB2aWV3cywgeyBpbnRlcnBvbGF0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2dyYXlzY2FsZScpIHtcbiAgICAgIGNvbnN0IGQgPSBwbGFuZXNbMF07XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZC53aWR0aCwgaGVpZ2h0OiBkLmhlaWdodCwgY2hhbm5lbHM6IDEsIGR0eXBlOiAndWludDgnLCBkYXRhOiBkLmRhdGEgfSxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdLFxuICAgICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKCdyZ2InLCBbeyBzb3VyY2U6IGJpdG1hcCBhcyBJbWFnZUJpdG1hcCwgc2NhbGUgfV0sIHsgaW50ZXJwb2xhdGlvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZVcgPSBmdWxsVztcbiAgICB0aGlzLmltYWdlSCA9IGZ1bGxIO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgMkQgaW1hZ2Ugd2l0aCBweXJhbWlkYWwge0BsaW5rIFRpbGVkU291cmNlfXMg4oCUIHRoZSB2aWV3IHJlZmluZXMgdG8gaGlnaGVyIHJlc29sdXRpb25cbiAgICogYXMgeW91IHpvb20gaW4gKHRoZSB2aXN1YWwgZmV0Y2hlcyB0aGUgbGV2ZWwgd2hvc2UgdGV4ZWxzIOKJiCBzY3JlZW4gcGl4ZWxzKSBhbmQgc2l0cyBpbiBmdWxsLXJlc1xuICAgKiBjb29yZGluYXRlcyBzbyByZWdpb25zIGFsaWduLiBTYW1lIHRocmVlIG1vZGVzIGFzIHRoZSBzdGl0Y2ggcGF0aC4gUGVyLWNoYW5uZWwgbGF5ZXJzIHVzZSB0aGVcbiAgICogUkVBTCBweXJhbWlkIGxldmVscyAocGVyLWNoYW5uZWwgdGlsZXMgb25seSBleGlzdCB0aGVyZSk7IHRoZSBjb21wb3NpdGUgdXNlcyBhbGwgbGV2ZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW5kZXJJbWFnZVRpbGVkKHo6IG51bWJlciwgZGVzYzogVGlsZURlc2NyaXB0b3IsIHNjZW5lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IGRlc2MuY2hhbm5lbHMgPz8gKHN0YXRlcy5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgbXVsdGljaGFubmVsID0gISFkZXNjLm11bHRpY2hhbm5lbCAmJiBjaGFubmVsQ291bnQgPiAxO1xuICAgIGNvbnN0IGludGVycG9sYXRpb246ICdsaW5lYXInIHwgJ25lYXJlc3QnID0gdGhpcy5pbWFnZVNtb290aGluZyA/ICdsaW5lYXInIDogJ25lYXJlc3QnO1xuXG4gICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgdGhpcy5jaGFubmVsVmlldyA9IG5ldyBNdWx0aUNoYW5uZWxJbWFnZVZpZXcodik7XG5cbiAgICBpZiAobXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLmltYWdlTW9kZSA9ICdtdWx0aWNoYW5uZWwnO1xuICAgICAgY29uc3Qgdmlld3M6IENoYW5uZWxWaWV3W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgICAgY29uc3Qgc3QgPSBzdGF0ZXMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gc3Q/LmNvbG9yID8/IGRlc2MuY2hhbm5lbEluZm8/LltjXT8uY29sb3IgPz8gdGludEZvcihjKTtcbiAgICAgICAgdmlld3MucHVzaCh7XG4gICAgICAgICAgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgYywgMSwgc2NlbmUpLFxuICAgICAgICAgIHRpbnQ6IGNvbG9yLFxuICAgICAgICAgIG5hbWU6IHN0Py5uYW1lID8/IGBjaCR7Y31gLFxuICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgaW52ZXJ0OiB0aGlzLmludmVydEVuYWJsZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFubmVsVmlldy5yZW5kZXIoJ211bHRpY2hhbm5lbCcsIHZpZXdzLCB7IGludGVycG9sYXRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDEpIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ2dyYXlzY2FsZSc7XG4gICAgICBjb25zdCBzdCA9IHN0YXRlc1swXTtcbiAgICAgIHRoaXMuY2hhbm5lbFZpZXcucmVuZGVyKFxuICAgICAgICAnZ3JheXNjYWxlJyxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5idWlsZFRpbGVkU291cmNlKGRlc2MsIHVuZGVmaW5lZCwgMSwgc2NlbmUpLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuZ3JheXNjYWxlQ29sb3JtYXAoKSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB7IGludGVycG9sYXRpb24gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VNb2RlID0gJ3JnYic7XG4gICAgICB0aGlzLmNoYW5uZWxWaWV3LnJlbmRlcigncmdiJywgW3sgc291cmNlOiB0aGlzLmJ1aWxkVGlsZWRTb3VyY2UoZGVzYywgdW5kZWZpbmVkLCA0LCBzY2VuZSkgfV0sIHtcbiAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmltYWdlVyA9IGRlc2Mud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBkZXNjLmhlaWdodDtcbiAgICAvLyBBd2FpdCBvbiB0aGUgaW5pdGlhbCByZW5kZXIgc28gZ2V0SGlzdG9ncmFtL2F1dG9Db250cmFzdCBoYXZlIGRhdGEgaW1tZWRpYXRlbHk7IHNsaWNlIGNoYW5nZXNcbiAgICAvLyByZWZyZXNoIGZpcmUtYW5kLWZvcmdldCAodGhlIGhpc3RvZ3JhbSBwYW5lIHJldHJpZXMpLlxuICAgIGF3YWl0IHRoaXMucmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoeiwgZGVzYyk7XG4gIH1cblxuICAvKiogQnVpbGQgYSBweXJhbWlkYWwgVGlsZWRTb3VyY2UgYmFja2VkIGJ5IHRoZSBzZXJ2ZXIgYC90aWxlYCBlbmRwb2ludC4gYGNoYW5uZWxgIHNlbGVjdHMgYSBiYW5kXG4gICAqICAoZ3JheXNjYWxlIGx1bWluYW5jZSwgcmVhbCBsZXZlbHMgb25seSk7IG9taXQgaXQgZm9yIHRoZSBjb21wb3NpdGUgKFJHQkEsIGFsbCBsZXZlbHMpLlxuICAgKiAgYHNjZW5lYCBpcyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcmVuZGVyIHRoYXQgYXNrZWQgZm9yIGl0LCB0YWtlbiBiZWZvcmUgdGhhdCByZW5kZXIncyBhd2FpdHMuICovXG4gIHByaXZhdGUgYnVpbGRUaWxlZFNvdXJjZShcbiAgICBkZXNjOiBUaWxlRGVzY3JpcHRvcixcbiAgICBjaGFubmVsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhbm5lbHM6IDEgfCA0LFxuICAgIHNjZW5lOiBudW1iZXIsXG4gICk6IFRpbGVkU291cmNlIHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKSA/PyAnJztcbiAgICAvLyBQZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5IGF0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWxzOyB0aGUgY29tcG9zaXRlIGV4aXN0cyBhdCBhbGwgbGV2ZWxzLlxuICAgIGNvbnN0IHVzYWJsZSA9XG4gICAgICBjaGFubmVsID09IG51bGxcbiAgICAgICAgPyBkZXNjLmxldmVsc1xuICAgICAgICA6IGRlc2MubGV2ZWxzLnNsaWNlKDAsIE1hdGgubWF4KDEsIGRlc2MucmVhbExldmVscyA/PyBkZXNjLmxldmVscy5sZW5ndGgpKTtcbiAgICBjb25zdCBsZXZlbFNjYWxlcyA9IHVzYWJsZS5tYXAoKGwpID0+IGRlc2Mud2lkdGggLyBNYXRoLm1heCgxLCBsLndpZHRoKSk7IC8vIGxldmVsLTAgcHggcGVyIGxldmVsIHB4XG4gICAgY29uc3QgdGlsZVNpemUgPSBkZXNjLnRpbGVTaXplIHx8IFRJTEVfU0laRTtcbiAgICBjb25zdCBjaCA9IGNoYW5uZWwgPT0gbnVsbCA/ICcnIDogYCZjaGFubmVsPSR7Y2hhbm5lbH1gO1xuICAgIGNvbnN0IGFwaSA9IHRoaXMuYXBpO1xuICAgIC8vIFRoZSBzY2VuZSB0aGlzIHNvdXJjZSBkcmF3czogaXRzIHRpbGVzIGNvdW50IG9uIHRoZSBiYWRnZSBvbmx5IHdoaWxlIHRoYXQgc2NlbmUgaXMgY3VycmVudCxcbiAgICAvLyBzbyBhIHJlcXVlc3QgdGhlIGRpc3Bvc2VkIHNvdXJjZSBzdGlsbCBpc3N1ZXMgYWZ0ZXIgYSByZXNldCBuZXZlciBzaG93cyBvbiB0aGUgbmV3IG9uZS5cbiAgICBjb25zdCBnZW5lcmF0aW9uID0gc2NlbmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICd0aWxlZCcsXG4gICAgICB3aWR0aDogZGVzYy53aWR0aCxcbiAgICAgIGhlaWdodDogZGVzYy5oZWlnaHQsXG4gICAgICB0aWxlU2l6ZSxcbiAgICAgIGxldmVsczogdXNhYmxlLmxlbmd0aCxcbiAgICAgIGxldmVsU2NhbGVzLFxuICAgICAgZGVwdGg6IE1hdGgubWF4KDEsIGRlc2MueiB8fCAxKSxcbiAgICAgIGNoYW5uZWxzLFxuICAgICAgZHR5cGU6ICd1aW50OCcsXG4gICAgICBmZXRjaFRpbGU6IGFzeW5jIChrZXk6IFRpbGVLZXkpOiBQcm9taXNlPFBpeGVsQ2h1bms+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gdXNhYmxlW2tleS5sZXZlbF0/LnJlcyA/PyBrZXkubGV2ZWw7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2FwaX10aWxlP2luZm89JHtpbmZvQjY0fSZyZXM9JHtyZXN9JmNvbD0ke2tleS5jb2x9JnJvdz0ke2tleS5yb3d9Jno9JHtrZXkuen0mdGlsZVNpemU9JHt0aWxlU2l6ZX0ke2NofWA7XG4gICAgICAgIC8vIFwiSW1hZ2UgcmVsb2FkaW5n4oCmXCIgb24gdGhlIGxvYWRpbmcgYmFkZ2Ugd2hpbGUgYW55IHRpbGUgb2YgdGhlIGltYWdlIGlzIGluIGZsaWdodC5cbiAgICAgICAgY29uc3QgY291bnRlZCA9IGdlbmVyYXRpb24gPT09IHRoaXMuaW1hZ2VUaWxlc0dlbmVyYXRpb247XG4gICAgICAgIGlmIChjb3VudGVkKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZVRpbGVzTG9hZGluZysrO1xuICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnRpbGVzXG4gICAgICAgICAgICAuZ2V0QXV0aEhlYWRlcnMoKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbbmFwYXJpLWpzXSB0aWxlICR7a2V5LmxldmVsfS8ke2tleS5jb2x9LyR7a2V5LnJvd30g4oaSICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGF3YWl0IHJlc3AuYmxvYigpKTtcbiAgICAgICAgICBpZiAoY2hhbm5lbHMgPT09IDQpIHJldHVybiB7IHdpZHRoOiBibXAud2lkdGgsIGhlaWdodDogYm1wLmhlaWdodCwgZGF0YTogYm1wIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYml0bWFwVG9MdW1pbmFuY2UoYm1wKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoY291bnRlZCAmJiBnZW5lcmF0aW9uID09PSB0aGlzLmltYWdlVGlsZXNHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlVGlsZXNMb2FkaW5nLS07XG4gICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogKFJlKWZldGNoIGEgY29hcnNlIHBlci1jaGFubmVsIGx1bWluYW5jZSBzYW1wbGUgZm9yIHRoZSBoaXN0b2dyYW0gKHRpbGVkIG1vZGUgaGFzIG5vIGZ1bGxcbiAgICogIGluLW1lbW9yeSBwaXhlbHMpLiBPbmUgY2hlYXAgb3ZlcnZpZXcgdGlsZSBwZXIgY2hhbm5lbDsgY2FjaGVkIGJ5IGNoYW5uZWwgaW5kZXguICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEhpc3RvZ3JhbVNhbXBsZXMoejogbnVtYmVyLCBkZXNjOiBUaWxlRGVzY3JpcHRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaGlzdFNhbXBsZXMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm47IC8vIFJHQiB1c2VzIHRoZSBkaXNwbGF5ZWQtcGl4ZWwgcmVhZGJhY2sgKHJnYkhpc3RvZ3JhbSlcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmltYWdlTW9kZSA9PT0gJ211bHRpY2hhbm5lbCcgPyBkZXNjLmNoYW5uZWxzID8/IDEgOiAxO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbENvdW50OyBjKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnID8gYyA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHRoaXMuZmV0Y2hDaGFubmVsRGF0YSh6LCBjaCwgMSk7IC8vIGJ1ZGdldCAxIOKGkiBjb2Fyc2VzdCBzaW5nbGUgdGlsZVxuICAgICAgICB0aGlzLmhpc3RTYW1wbGVzLnNldChjLCBkLmRhdGEpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGxlYXZlIHRoaXMgY2hhbm5lbCdzIHNhbXBsZSB1bnNldCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmUgY2hhbm5lbCBzdGF0ZXMgKyBncmF5c2NhbGUgY29sb3JtYXAg4oaSIGxpdmUtYXBwbHkgdG8gdGhlIHJlbmRlcmVkIGxheWVycyAobm9cbiAgICogIHJlLWZldGNoOyBvbmx5IHogY2hhbmdlcyByZS1mZXRjaCkuIFJlcGxhY2VzIGFueSBwcmlvciBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY2hhbm5lbHMsIGNvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnRdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIHRoaXMuYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0aGUgc3RvcmUgY29sb3JtYXAgKCtyZXZlcnNlKSwgaW52ZXJ0LCBhbmQgY2hhbm5lbCBzdGF0ZSDihpIgdGhlIHZvbHVtZS9pc29zdXJmYWNlXG4gICAqICB0cmFuc2ZlciBmdW5jdGlvbjogY29sb3VyIChjaGFubmVsIHRpbnQgb3Igc2VsZWN0ZWQgY29sb3JtYXApLCB0aGUgaW50ZW5zaXR5ICoqd2luZG93XG4gICAqICAobWluL21heCDihpIgY29udHJhc3RMaW1pdHMpKiogYW5kICoqZ2FtbWEqKiwgbWlycm9yaW5nIHRoZSBncmF5c2NhbGUgaW1hZ2UncyBkaXNwbGF5IGNvbnRyb2xzXG4gICAqICBzbyB0aGUgaGlzdG9ncmFtIHBhbmUgZHJpdmVzIHRoZSAzRCByZW5kZXIuIFJlcGxhY2VzIGFueSBwcmlvciBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3Vic2NyaWJlVm9sdW1lRGlzcGxheVN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldEludmVydCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCksXG4gICAgXSkuc3Vic2NyaWJlKChbY29sb3JtYXAsIHJldmVyc2UsIGludmVydCwgY2hhbm5lbHNdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZvbHVtZVZpZXc7XG4gICAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCkge1xuICAgICAgICAvLyBFYWNoIGNoYW5uZWwncyBsYXllciBpcyB0aW50ZWQgYnkgaXRzIGNvbG91ciBhbmQgZ2V0cyBpdHMgb3duIHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5LlxuICAgICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNoYW5uZWwoYywge1xuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKSxcbiAgICAgICAgICAgIC4uLihzdFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICBnYW1tYTogc3QuZ2FtbWEsXG4gICAgICAgICAgICAgICAgICB2aXNpYmxlOiBzdC52aXNpYmxlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKDAsIHtcbiAgICAgICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICAgICAgLi4uKHN0ID8geyBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSBhcyBbbnVtYmVyLCBudW1iZXJdLCBnYW1tYTogc3QuZ2FtbWEgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogQSBjaGFubmVsJ3MgdGludCBjb2xvcm1hcCAoYmxhY2vihpJjb2xvdXIpIHdpdGggcmV2ZXJzZS1zY2FsZSAvIGludmVydCBhcHBsaWVkIGJ5IGZsaXBwaW5nLiAqL1xuICBwcml2YXRlIGNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3I6IHN0cmluZyk6IENvbG9ybWFwIHwgc3RyaW5nIHtcbiAgICBsZXQgY21hcDogQ29sb3JtYXAgfCBzdHJpbmcgPSB0aW50Q29sb3JtYXAoY29sb3IpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZXZlcnNlKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIGlmICh0aGlzLmludmVydEVuYWJsZWQpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgcmV0dXJuIGNtYXA7XG4gIH1cblxuICAvKipcbiAgICogQ29sb3VyIG1hcCBmb3IgdGhlIHZvbHVtZS9pc29zdXJmYWNlLiBBIHJlYWwgY29sb3JtYXAgc2VsZWN0aW9uICh2aXJpZGlzL21hZ21hL+KApikgd2lucztcbiAgICogb3RoZXJ3aXNlIHRoZSBjaGFubmVsJ3MgY29sb3VyIHRpbnRzIGl0IChzbyB0aGUgY2hhbm5lbC1kaWFsb2cgY29sb3VyIHN3YXRjaCByZWNvbG9ycyB0aGUgM0RcbiAgICogcmVuZGVyKS4gUmV2ZXJzZS1zY2FsZSBhbmQgaW52ZXJ0IGVhY2ggZmxpcCB0aGUgcmFtcCDigJQgdGhlIGBWb2x1bWVMYXllcmAgaGFzIG5vIHBlci1sYXllclxuICAgKiBpbnZlcnQsIHNvIGJvdGggYXJlIGVtdWxhdGVkIGJ5IHJldmVyc2luZyB0aGUgY29sb3JtYXAuXG4gICAqL1xuICBwcml2YXRlIHZvbHVtZUNvbG9ybWFwKHN0OiBJQ2hhbm5lbFN0YXRlIHwgdW5kZWZpbmVkKTogQ29sb3JtYXAgfCBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGxhYmVsPzogc3RyaW5nOyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICAvLyBBIGNvbG9yZWQgY29sb3JtYXAgKHZpcmlkaXMvbWFnbWEv4oCmKSBkcml2ZXMgdGhlIHZvbHVtZTsgdGhlIGRlZmF1bHQgZ3JheXNjYWxlIGZhbWlseVxuICAgIC8vIChncmF5IC8gR3JleXMgLyBHcmV5cyBJbnYpIHlpZWxkcyB0byB0aGUgY2hhbm5lbCdzIGNvbG91ciBzbyB0aGUgZGlhbG9nIGNvbG91ciBzd2F0Y2hcbiAgICAvLyByZWNvbG9ycyB0aGUgM0QgcmVuZGVyLlxuICAgIGNvbnN0IGxhYmVsID0gKG5vZGU/LmxhYmVsID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGdyYXlGYW1pbHkgPSBsYWJlbCA9PT0gJycgfHwgbGFiZWwuaW5jbHVkZXMoJ2dyZXknKSB8fCBsYWJlbC5pbmNsdWRlcygnZ3JheScpO1xuICAgIGNvbnN0IHZhbHVlID0gbm9kZT8uZGF0YT8udmFsdWU7XG4gICAgY29uc3QgbHV0ID0gIWdyYXlGYW1pbHkgJiYgdmFsdWUgIT0gbnVsbCA/IGJ1aWxkQ29sb3JtYXBMdXQodmFsdWUsIGZhbHNlKSA6IG51bGw7XG4gICAgbGV0IGNtYXA6IENvbG9ybWFwIHwgc3RyaW5nID0gbHV0XG4gICAgICA/IGNvbG9ybWFwRnJvbUx1dCgndm9sLWNtYXAnLCBsdXQpXG4gICAgICA6IHRpbnRDb2xvcm1hcChzdD8uY29sb3IgPz8gJyNmZmZmZmYnKTtcbiAgICAvLyBSZXZlcnNlLXNjYWxlIGFuZCBpbnZlcnQgZWFjaCBmbGlwIHRoZSByYW1wICh0aGUgVm9sdW1lTGF5ZXIgaGFzIG5vIHBlci1sYXllciBpbnZlcnQpLlxuICAgIGlmICh0aGlzLmN1cnJlbnRSZXZlcnNlKSBjbWFwID0gcmV2ZXJzZUNvbG9ybWFwKGNtYXApO1xuICAgIGlmICh0aGlzLmludmVydEVuYWJsZWQpIGNtYXAgPSByZXZlcnNlQ29sb3JtYXAoY21hcCk7XG4gICAgcmV0dXJuIGNtYXA7XG4gIH1cblxuICAvKiogQXBwbHkgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgLyBjb2xvcm1hcCB0byB0aGUgbGl2ZSBsYXllcnMgKG5vIHJlLWZldGNoKSwgZGVsZWdhdGluZyB0aGVcbiAgICogIHBlci1jaGFubmVsIGxheWVyIG11dGF0aW9ucyB0byB0aGUge0BsaW5rIE11bHRpQ2hhbm5lbEltYWdlVmlld30uICovXG4gIHByaXZhdGUgYXBwbHlEaXNwbGF5U3RhdGUoY2hhbm5lbHM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmNoYW5uZWxWaWV3O1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXZpZXcpIHJldHVybjtcbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdtdWx0aWNoYW5uZWwnKSB7XG4gICAgICB2aWV3LmxheWVycy5mb3JFYWNoKChfLCBjKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0ID0gY2hhbm5lbHMuZmluZCgocykgPT4gcy5pbmRleCA9PT0gYyk7XG4gICAgICAgIGlmICghc3QpIHJldHVybjtcbiAgICAgICAgdmlldy51cGRhdGVDaGFubmVsKGMsIHtcbiAgICAgICAgICB0aW50OiBzdC5jb2xvcixcbiAgICAgICAgICBjb250cmFzdExpbWl0czogW3N0Lm1pbiwgc3QubWF4XSxcbiAgICAgICAgICBnYW1tYTogc3QuZ2FtbWEsXG4gICAgICAgICAgdmlzaWJsZTogc3QudmlzaWJsZSxcbiAgICAgICAgICBpbnZlcnQ6IHRoaXMuaW52ZXJ0RW5hYmxlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJykge1xuICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgIHZpZXcudXBkYXRlQ2hhbm5lbCgwLCB7XG4gICAgICAgIGNvbG9ybWFwOiB0aGlzLmdyYXlzY2FsZUNvbG9ybWFwKCksXG4gICAgICAgIGludmVydDogdGhpcy5pbnZlcnRFbmFibGVkLFxuICAgICAgICAuLi4oc3QgPyB7IGNvbnRyYXN0TGltaXRzOiBbc3QubWluLCBzdC5tYXhdIGFzIFtudW1iZXIsIG51bWJlcl0sIGdhbW1hOiBzdC5nYW1tYSB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIChSZSlpbnN0YWxsIHRoZSBwaHlzaWNhbCBzY2FsZSBiYXIgb3ZlciB0aGUgMkQgaW1hZ2UsIHNpemVkIGZyb20gdGhlIGltYWdlJ3MgwrVtL3BpeGVsXG4gICAqICAoYC90aWxlcy9pbmZvYCBtcHBYLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhKS4gTm8tb3Agd2l0aG91dCBhIHBoeXNpY2FsIHNpemUuICovXG4gIHByaXZhdGUgaW5zdGFsbFNjYWxlQmFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF0/Lm1wcFggfHwgMDtcbiAgICBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5ob3N0ICYmIG1wcFggPiAwKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyID0gbmV3IE5hcGFyaVNjYWxlQmFyKHRoaXMuaG9zdCwgdGhpcy52aWV3ZXIuY2FtZXJhLCBtcHBYKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIG92ZXJ2aWV3IG5hdmlnYXRvciBmb3IgYSAyRCB2aWV3IHdpdGggYW4gaW1hZ2U6IGEgY29hcnNlIHRodW1ibmFpbCBvZiB0aGUgd2hvbGVcbiAgICogaW1hZ2Ugd2l0aCB0aGUgdmlld3BvcnQgb24gaXQ7IGNsaWNrIG9yIGRyYWcgdG8gcGFuIGF0IHRoZSBjdXJyZW50IHpvb20gKGFzIE9TRCkuXG4gICAqL1xuICBwcml2YXRlIHNob3dMb2FkaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3N0KSByZXR1cm47XG4gICAgdGhpcy5sb2FkaW5nQmFkZ2UgPz89IG5ldyBOYXBhcmlMb2FkaW5nQmFkZ2UodGhpcy5ob3N0KTtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZS5zZXQoW1xuICAgICAgLi4uKHRoaXMuaW1hZ2VUaWxlc0xvYWRpbmcgPiAwID8gWydJbWFnZSddIDogW10pLFxuICAgICAgLi4uKHRoaXMub2JzZXJ2YXRpb25zTG9hZGluZyA+IDAgPyBbJ09ic2VydmF0aW9ucyddIDogW10pLFxuICAgICAgLi4udGhpcy50aWxlTG9hZGluZyxcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbE5hdmlnYXRvcih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvcj8uZGVzdHJveSgpO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8ICF0aGlzLmhvc3QgfHwgIXRoaXMuaW1hZ2VXIHx8ICF0aGlzLmltYWdlSCkgcmV0dXJuO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbmV3IE5hcGFyaU5hdmlnYXRvcihcbiAgICAgIHRoaXMuaG9zdCwgdGhpcy52aWV3ZXIuY2FtZXJhLCB0aGlzLmltYWdlVywgdGhpcy5pbWFnZUgsICgpID0+IHRoaXMuc3BhdGlhbFRvb2x0aXA/LmhpZGUoKSxcbiAgICApO1xuICAgIHRoaXMubmF2aWdhdG9yLnNldFZpc2libGUodGhpcy5uYXZpZ2F0b3JWaXNpYmxlKTtcbiAgICB2b2lkIHRoaXMucmVmcmVzaE5hdmlnYXRvckltYWdlKHopO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIG5hdmlnYXRvcidzIHRodW1ibmFpbCBmcm9tIHRoZSBjb2Fyc2VzdCBweXJhbWlkIGxldmVsLiBBIG11bHRpY2hhbm5lbCBpbWFnZVxuICAgKiBpcyBjb21wb3NpdGVkIGZyb20gaXRzIGNoYW5uZWxzIGluIHRoZWlyIGRpc3BsYXkgY29sb3Vycywgc28gdGhlIG92ZXJ2aWV3IGxvb2tzIGxpa2VcbiAgICogdGhlIHZpZXcgcmF0aGVyIHRoYW4gbGlrZSBjaGFubmVsIDAgaW4gZ3JleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaE5hdmlnYXRvckltYWdlKHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5hdiA9IHRoaXMubmF2aWdhdG9yO1xuICAgIGlmICghbmF2KSByZXR1cm47XG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMubmF2aWdhdG9yVG9rZW47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gZGVzYz8ubXVsdGljaGFubmVsID8gZGVzYy5jaGFubmVsSW5mbyA/PyBbXSA6IFtdO1xuICAgICAgbGV0IGltYWdlOiBDYW52YXNJbWFnZVNvdXJjZTtcbiAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGJpdG1hcHMgPSBhd2FpdCBQcm9taXNlLmFsbChjaGFubmVscy5tYXAoKF9jLCBjKSA9PiB0aGlzLmZldGNoU2xpY2UoeiwgYywgMSkpKTtcbiAgICAgICAgaW1hZ2UgPSB0aW50ZWRDb21wb3NpdGUoYml0bWFwcywgY2hhbm5lbHMubWFwKChjKSA9PiBjLmNvbG9yID8/ICcjZmZmZmZmJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmZldGNoU2xpY2UoeiwgdW5kZWZpbmVkLCAxKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbiA9PT0gdGhpcy5uYXZpZ2F0b3JUb2tlbiAmJiB0aGlzLm5hdmlnYXRvciA9PT0gbmF2KSBuYXYuc2V0SW1hZ2UoaW1hZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBuYXZpZ2F0b3IgdGh1bWJuYWlsIHVuYXZhaWxhYmxlJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKHNhbWUgc2V0dGluZyBhcyBPU0QncykuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgdGhpcy5uYXZpZ2F0b3I/LnNldFZpc2libGUodmlzaWJsZSk7XG4gIH1cblxuICAvKiogQ29udmVydCBhIG5hcGFyaS1qcyBgSGlzdG9ncmFtYCAoYmluIGNvdW50ICsgbWluL21heCkgdG8gdGhlIHBhbmUncyBgSUhpc3RvZ3JhbWAgKGJpbiBlZGdlcykuICovXG4gIHByaXZhdGUgdG9JSGlzdG9ncmFtKGg6IHsgY291bnRzOiBVaW50MzJBcnJheTsgYmluczogbnVtYmVyOyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSk6IElIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHNwYW4gPSBoLm1heCAtIGgubWluIHx8IDE7XG4gICAgY29uc3QgYmlucyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGguYmlucyB9LCAoXywgaSkgPT4gaC5taW4gKyAoaSAqIHNwYW4pIC8gaC5iaW5zKTtcbiAgICBjb25zdCBjb3VudHMgPSBBcnJheS5mcm9tKGguY291bnRzKTtcbiAgICByZXR1cm4geyBiaW5zLCBjb3VudHMsIG1heDogY291bnRzLnJlZHVjZSgobSwgYykgPT4gKGMgPiBtID8gYyA6IG0pLCAwKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSAzRCB2b2x1bWUvaXNvc3VyZmFjZS4gQSBtdWx0aWNoYW5uZWwgaW1hZ2UgYmVjb21lcyBvbmUgYWRkaXRpdmUsIHRpbnRlZFxuICAgKiB7QGxpbmsgVm9sdW1lTGF5ZXJ9IHBlciBjaGFubmVsIChzbyBlYWNoIGNoYW5uZWwncyBjb2xvdXIgY29tcG9zaXRlcyBpbnRvIHRoZSByZW5kZXIpOyBhXG4gICAqIGdyYXlzY2FsZS9jb21wb3NpdGUgaW1hZ2UgdXNlcyBhIHNpbmdsZSB2b2x1bWUuIEFkZHMgdGhlIGF4ZXMgZ2l6bW8gKyBsYWJlbHMgYW5kIHdpcmVzIHRoZVxuICAgKiBkaXNwbGF5LXN0YXRlIHN1YnNjcmlwdGlvbi4gVGhlIGNhbGxlciBvd25zIGB2aWV3ZXIucmVhZHlgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlcixcbiAgICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBiZWZvcmUgcmVuZGVyaW5nIGlmIGEgQ2FuY2VsIC8gbmV3IHBsb3QgYnVtcHMgdGhpc1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsVXJscyk6IG5vIHRpbGUgZGVzY3JpcHRvciwgc29cbiAgICAvLyBkZXJpdmUgdGhlIGNoYW5uZWwgY291bnQgZnJvbSBpbWFnZU1ldGEgYW5kIGFzc2VtYmxlIGVhY2ggYmFuZCBmcm9tIGl0cyBvd25cbiAgICAvLyBjaGFubmVsVXJsc1t6XVtjXSBwbGFuZSAoZmV0Y2hTbGljZSBkb2VzIHRoZSBwZXItY2hhbm5lbCByb3V0aW5nKS5cbiAgICBjb25zdCBzaW1wbGVNYyA9IHRoaXMuc2ltcGxlU3RhY2suaXNTaW1wbGUoaW5mbykgJiYgISFpbmZvPy5jaGFubmVsVXJscz8ubGVuZ3RoXG4gICAgICAmJiAoaW5mbz8uaW1hZ2VNZXRhPy5bMF0/LmNoYW5uZWxDb3VudCA/PyAxKSA+IDE7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gc2ltcGxlTWMgPyBpbmZvIS5pbWFnZU1ldGEhWzBdLmNoYW5uZWxDb3VudCA6IChkZXNjPy5jaGFubmVscyA/PyAxKTtcbiAgICBjb25zdCBtdWx0aWNoYW5uZWwgPSBzaW1wbGVNYyB8fCAoISFkZXNjPy5tdWx0aWNoYW5uZWwgJiYgY2hhbm5lbENvdW50ID4gMSk7XG4gICAgY29uc3QgcmVzID0gdm9sdW1lUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgY29uc3QgcmVuZGVyaW5nOiAnaXNvJyB8ICdtaXAnID0gaXNOYXBhcmlJc29zdXJmYWNlKHBsb3RUeXBlKSA/ICdpc28nIDogJ21pcCc7XG4gICAgY29uc3Qgc3RhdGVzID0gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpO1xuXG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICAgIHRoaXMudm9sdW1lTXVsdGljaGFubmVsID0gbXVsdGljaGFubmVsO1xuICAgIHRoaXMuaW1hZ2VNb2RlID0gdGhpcy52b2x1bWVNdWx0aWNoYW5uZWwgPyAnbXVsdGljaGFubmVsJyA6ICdncmF5c2NhbGUnO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgTXVsdGlDaGFubmVsVm9sdW1lVmlldyh2aWV3ZXIpO1xuICAgIHRoaXMudm9sdW1lVmlldyA9IHZpZXc7XG5cbiAgICAvLyBBc3NlbWJsZSBwZXItY2hhbm5lbCBzY2FsYXIgdm9sdW1lcyBmcm9tIHRoZSBzZXJ2ZXIgdGlsZXMgKGppdC1zcGVjaWZpYyk7IHRoZSBuYXBhcmktanMgdmlld1xuICAgIC8vIG93bnMgdGhlIGxheWVyIG9yY2hlc3RyYXRpb24gKG9uZSBhZGRpdGl2ZSB0aW50ZWQgdm9sdW1lIHBlciBjaGFubmVsLCBvciBhIHNpbmdsZSBncmF5c2NhbGVcbiAgICAvLyB2b2x1bWUpLiBUaGUgYWRhcHRlciBjb21wdXRlcyBlYWNoIGNoYW5uZWwncyBjb2xvcm1hcCAoaW5jbC4gaW52ZXJ0L3JldmVyc2UgZmxpcHMpLlxuICAgIGxldCBkaW1zOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjaGFubmVsczogVm9sdW1lQ2hhbm5lbFtdID0gW107XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB0cnkge1xuICAgICAgaWYgKG11bHRpY2hhbm5lbCkge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5uZWxDb3VudDsgYysrKSB7XG4gICAgICAgICAgY29uc3Qgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCByZXMsIGMpO1xuICAgICAgICAgIGlmICghdm9sKSBjb250aW51ZTtcbiAgICAgICAgICBkaW1zID0gdm9sO1xuICAgICAgICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KGMsIHZvbC5kYXRhKTtcbiAgICAgICAgICBjb25zdCBzdCA9IHN0YXRlcy5maW5kKChzKSA9PiBzLmluZGV4ID09PSBjKTtcbiAgICAgICAgICBjb25zdCBjb2xvciA9IHN0Py5jb2xvciA/PyBkZXNjPy5jaGFubmVsSW5mbz8uW2NdPy5jb2xvciA/PyB0aW50Rm9yKGMpO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLmNoYW5uZWxUaW50Q29sb3JtYXAoY29sb3IpLFxuICAgICAgICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgICAgICAgIGdhbW1hOiBzdD8uZ2FtbWEgPz8gMSxcbiAgICAgICAgICAgIHZpc2libGU6IHN0Py52aXNpYmxlID8/IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZvbCA9IGF3YWl0IHRoaXMuYXNzZW1ibGVWb2x1bWUoaW5mbywgcmVzKTtcbiAgICAgICAgaWYgKHZvbCkge1xuICAgICAgICAgIGRpbXMgPSB2b2w7XG4gICAgICAgICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5zZXQoMCwgdm9sLmRhdGEpO1xuICAgICAgICAgIGNvbnN0IHN0ID0gc3RhdGVzWzBdO1xuICAgICAgICAgIGNoYW5uZWxzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogdm9sLmRhdGEsXG4gICAgICAgICAgICB3aWR0aDogdm9sLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB2b2wuaGVpZ2h0LFxuICAgICAgICAgICAgZGVwdGg6IHZvbC5kZXB0aCxcbiAgICAgICAgICAgIGNvbG9ybWFwOiB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KSxcbiAgICAgICAgICAgIGNvbnRyYXN0TGltaXRzOiBbc3Q/Lm1pbiA/PyAwLCBzdD8ubWF4ID8/IDI1NV0sXG4gICAgICAgICAgICBnYW1tYTogc3Q/LmdhbW1hID8/IDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG5cbiAgICBpZiAoIWRpbXMgfHwgIWNoYW5uZWxzLmxlbmd0aCB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjsgLy8gY2FuY2VsbGVkIOKGkiBkb24ndCByZW5kZXJcblxuICAgIC8vIFJlc29sdXRpb24taW52YXJpYW50IHdvcmxkIGJveC4gU2l6aW5nIHRoZSBib3ggYnkgdGhlIHNhbXBsZWQgdm94ZWwgY291bnRzIG1hZGUgaGlnaGVyXG4gICAgLy8gaW4tcGxhbmUgcmVzb2x1dGlvbiBncm93IFgvWSB3aGlsZSB0aGUgZGVwdGggc3RheWVkIHRoZSAoY29uc3RhbnQpIHNsaWNlIGNvdW50IOKAlCBzbyBaIGFwcGVhcmVkXG4gICAgLy8gdG8gc2hyaW5rIGF0IGhpZ2hlciByZXNvbHV0aW9uLiBJbnN0ZWFkIGFuY2hvciB0aGUgaW4tcGxhbmUgbG9uZyBzaWRlIHRvIGEgZml4ZWQgcmVmZXJlbmNlIGFuZFxuICAgIC8vIGxldCBaIHNwYW4gdGhlIGZ1bGwgc2xpY2UgY291bnQ7IHRoZSBib3ggc2hhcGUgaXMgdGhlbiBpZGVudGljYWwgYXQgZXZlcnkgZGVjaW1hdGUgZmFjdG9yLiBUaGVcbiAgICAvLyBwZXItYXhpcyBgdm94ZWxTaXplYCAobmFwYXJpIGBzY2FsZWApIG1hcHMgdGhlIHNhbXBsZWQgZ3JpZCBvbnRvIHRoYXQgZml4ZWQgd29ybGQgYm94LlxuICAgIC8vIEEgc3RhY2sgdGhhdCBkZWNsYXJlcyBpdHMgcGh5c2ljYWwgc3BhY2luZyBvbiBBTEwgVEhSRUUgYXhlcyBnZXRzIGl0cyB0cnVlXG4gICAgLy8gZXh0ZW50IGFzIHRoZSB3b3JsZCBib3gg4oCUIHRoZSBvbmx5IHdheSBhbmlzb3Ryb3B5IHN1cnZpdmVzLCBhbmQgd2hhdCBtYWtlcyBhXG4gICAgLy8gcmVzYW1wbGVkIDQwIHggNDAgeCAyMDAgwrVtIHZvbHVtZSByZWFkIGFzIGEgYnJhaW4gaW5zdGVhZCBvZiBhIGN1YmUtYXNwZWN0XG4gICAgLy8gYnJpY2suIEl0IG5lZWRzIG5vbmUgb2YgdGhlIHJlZmVyZW5jZS1ib3ggYXJpdGhtZXRpYzogYSBwaHlzaWNhbCBib3ggaXNcbiAgICAvLyBhbHJlYWR5IGluZGVwZW5kZW50IG9mIHRoZSBkZWNpbWF0ZSBmYWN0b3IuXG4gICAgLy9cbiAgICAvLyBFdmVyeXRoaW5nIGVsc2Uga2VlcHMgdGhhdCBhcml0aG1ldGljLiBTaXppbmcgdGhlIGJveCBieSB0aGUgc2FtcGxlZCB2b3hlbFxuICAgIC8vIGNvdW50cyBtYWRlIGhpZ2hlciBpbi1wbGFuZSByZXNvbHV0aW9uIGdyb3cgWC9ZIHdoaWxlIHRoZSBkZXB0aCBzdGF5ZWQgdGhlXG4gICAgLy8gKGNvbnN0YW50KSBzbGljZSBjb3VudCDigJQgc28gWiBhcHBlYXJlZCB0byBzaHJpbmsgYXQgaGlnaGVyIHJlc29sdXRpb24uXG4gICAgLy8gQW5jaG9yaW5nIHRoZSBpbi1wbGFuZSBsb25nIHNpZGUgdG8gYSBmaXhlZCByZWZlcmVuY2UgYW5kIGxldHRpbmcgWiBzcGFuIHRoZVxuICAgIC8vIGZ1bGwgc2xpY2UgY291bnQgbWFrZXMgdGhlIGJveCBzaGFwZSBpZGVudGljYWwgYXQgZXZlcnkgZGVjaW1hdGUgZmFjdG9yLlxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdO1xuICAgIGNvbnN0IG1wcFhZWjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9XG4gICAgICBtZXRhPy5tcHBYICYmIG1ldGE/Lm1wcFkgJiYgbWV0YT8ubXBwWiA/IFttZXRhLm1wcFgsIG1ldGEubXBwWSwgbWV0YS5tcHBaXSA6IG51bGw7XG4gICAgLy8gVGhlIGltYWdlJ3MgREVDTEFSRUQgcGl4ZWwgZGltZW5zaW9ucywgd2hpY2ggaXMgd2hhdCBtcHAgaXMgcGVyOiB0aGUgc2FtcGxlZFxuICAgIC8vIGRpbXMgYXJlIGRlY2ltYXRlZCwgc28gc2l6aW5nIGEgcGh5c2ljYWwgYm94IGJ5IHRoZW0gd291bGQgbWFrZSB0aGUgd29ybGRcbiAgICAvLyBib3ggZGVwZW5kIG9uIHRoZSByZXNvbHV0aW9uIHRoZSB1c2VyIGhhcHBlbnMgdG8gYmUgdmlld2luZyBhdC5cbiAgICBjb25zdCBmdWxsVyA9IHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gbWV0YT8ueCA/PyBkaW1zLndpZHRoO1xuICAgIGNvbnN0IGZ1bGxIID0gdGhpcy5kZXNjcmlwdG9yPy5oZWlnaHQgPz8gbWV0YT8ueSA/PyBkaW1zLmhlaWdodDtcbiAgICBjb25zdCBmdWxsRCA9IG1ldGE/LnogfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby51cmxzPy5sZW5ndGggfHwgZGltcy5kZXB0aDtcbiAgICBsZXQgd29ybGQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfTtcbiAgICBpZiAobXBwWFlaKSB7XG4gICAgICB3b3JsZCA9IHtcbiAgICAgICAgd2lkdGg6IGZ1bGxXICogbXBwWFlaWzBdLFxuICAgICAgICBoZWlnaHQ6IGZ1bGxIICogbXBwWFlaWzFdLFxuICAgICAgICBkZXB0aDogZnVsbEQgKiBtcHBYWVpbMl0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmdWxsTG9uZyA9IE1hdGgubWF4KDEsIGZ1bGxXLCBmdWxsSCk7XG4gICAgICB3b3JsZCA9IHtcbiAgICAgICAgd2lkdGg6IChmdWxsVyAqIFZPTFVNRV9XT1JMRF9JTlBMQU5FX1JFRikgLyBmdWxsTG9uZyxcbiAgICAgICAgaGVpZ2h0OiAoZnVsbEggKiBWT0xVTUVfV09STERfSU5QTEFORV9SRUYpIC8gZnVsbExvbmcsXG4gICAgICAgIGRlcHRoOiBmdWxsRCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIEJhc2UgYm94IChaLXNjYWxlID0gMSkgKyB0aGUgc2FtcGxlZCBkZXB0aCBkcml2ZSB0aGUgbGl2ZSBaLWhlaWdodCBoYW5kbGUgYmVsb3c7IHRoZSBwZXJzaXN0ZWRcbiAgICAvLyBgdm9sdW1lWlNjYWxlYCAodXNlciBkcmFnKSBhcHBsaWVzIG9uIHRvcCBzbyBjaGFuZ2luZyByZXNvbHV0aW9uIGtlZXBzIHRoZSBjaG9zZW4gaGVpZ2h0LlxuICAgIHRoaXMudm9sdW1lV29ybGRCYXNlID0gd29ybGQ7XG4gICAgdGhpcy52b2x1bWVTYW1wbGVkRGVwdGggPSBNYXRoLm1heCgxLCBkaW1zLmRlcHRoKTtcbiAgICBjb25zdCB3b3JsZFogPSB3b3JsZC5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlO1xuICAgIGNvbnN0IHZveGVsU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgd29ybGQud2lkdGggLyBkaW1zLndpZHRoLFxuICAgICAgd29ybGQuaGVpZ2h0IC8gZGltcy5oZWlnaHQsXG4gICAgICB3b3JsZFogLyB0aGlzLnZvbHVtZVNhbXBsZWREZXB0aCxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgY2ggb2YgY2hhbm5lbHMpIGNoLnZveGVsU2l6ZSA9IHZveGVsU2l6ZTtcblxuICAgIHZpZXcucmVuZGVyKHRoaXMudm9sdW1lTXVsdGljaGFubmVsID8gJ211bHRpY2hhbm5lbCcgOiAnZ3JheXNjYWxlJywgY2hhbm5lbHMsIHsgcmVuZGVyaW5nIH0pO1xuICAgIHRoaXMuaW1hZ2VXID0gZGltcy53aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGRpbXMuaGVpZ2h0O1xuICAgIHRoaXMudm9sdW1lRGltcyA9IGRpbXM7XG5cbiAgICAvLyAzRCBjb29yZGluYXRlLWF4ZXMgLyBzY2FsZSBnaXptbyArIGxhYmVscywgc2hhcmluZyB0aGUgdm9sdW1lJ3Mgd29ybGQgYm94IHNvIHRoZSBnaXptbyB0cmFja3NcbiAgICAvLyB0aGUgcmVuZGVyZWQgcHJvcG9ydGlvbnMuIFBoeXNpY2FsIHNjYWxlIHRleHQgc3RpbGwgY29tZXMgZnJvbSB0aGUgRlVMTCBpbWFnZSBleHRlbnQuXG4gICAgdGhpcy5heGVzTGF5ZXIgPSB2aWV3ZXIuYWRkQXhlcyh3b3JsZC53aWR0aCwgd29ybGQuaGVpZ2h0LCB3b3JsZFosIHsgdmlzaWJsZTogdGhpcy5heGVzVmlzaWJsZSB9KTtcbiAgICBpZiAodGhpcy5ob3N0KSB7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMgPSBuZXcgTmFwYXJpQXhlc0xhYmVscyhcbiAgICAgICAgdGhpcy5ob3N0LFxuICAgICAgICB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgICAgIHRoaXMuYnVpbGRBeGVzTGFiZWxzKHsgd2lkdGg6IHdvcmxkLndpZHRoLCBoZWlnaHQ6IHdvcmxkLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9KSxcbiAgICAgICk7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMuc2V0VmlzaWJsZSh0aGlzLmF4ZXNWaXNpYmxlKTtcbiAgICAgIC8vIEluLXZpZXcgZHJhZyBoYW5kbGUgYXQgdGhlIFRPUCBFTkQgT0YgVEhFIFogQVhJUyAodGhlIGJveCdzIG1pbi1YWSBjb3JuZXIsIHdoZXJlIHRoZSBibHVlXG4gICAgICAvLyBcIlpcIiBheGlzICsgbGFiZWwgbGl2ZSksIHNvIGl0IHJlYWRzIGFzIHRoZSBaLWhlaWdodCBjb250cm9sLiBGbG9hdGVkIGEgbGl0dGxlIHBhc3QgdGhlIGF4aXNcbiAgICAgIC8vIHRpcCAow5cxLjEyKSBzbyB0aGUgZ3JpcCBjbGVhcnMgdGhlIFwiWiDCtyDigKZcIiBsYWJlbC4gRHJhZyDihpUgdG8gcmVzdHJldGNoIFogbGl2ZS5cbiAgICAgIHRoaXMuekhhbmRsZSA9IG5ldyBOYXBhcmlWb2x1bWVaSGFuZGxlKHRoaXMuaG9zdCwgdmlld2VyLmNhbWVyYTNkLCB7XG4gICAgICAgIHRvcEFuY2hvcjogKCkgPT4gW1xuICAgICAgICAgIC10aGlzLnZvbHVtZVdvcmxkQmFzZSEud2lkdGggLyAyLFxuICAgICAgICAgIC10aGlzLnZvbHVtZVdvcmxkQmFzZSEuaGVpZ2h0IC8gMixcbiAgICAgICAgICAoKHRoaXMudm9sdW1lV29ybGRCYXNlIS5kZXB0aCAqIHRoaXMudm9sdW1lWlNjYWxlKSAvIDIpICogMS4xMixcbiAgICAgICAgXSxcbiAgICAgICAgZ2V0U2NhbGU6ICgpID0+IHRoaXMudm9sdW1lWlNjYWxlLFxuICAgICAgICBzZXRTY2FsZTogKHMpID0+IHRoaXMuc2V0Vm9sdW1lWlNjYWxlKHMpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlVm9sdW1lRGlzcGxheVN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJldGNoIHRoZSB2b2x1bWUncyBaIGhlaWdodCBsaXZlIChkcml2ZW4gYnkgdGhlIGluLXZpZXcge0BsaW5rIE5hcGFyaVZvbHVtZVpIYW5kbGV9KS4gT25seVxuICAgKiB0aGUgcGVyLWF4aXMgYHZveGVsU2l6ZWAgLyBheGVzIGRlcHRoIGNoYW5nZSDigJQgdGhlIHZveGVsIHRleHR1cmVzIGFyZSB1bnRvdWNoZWQg4oCUIHNvIGRyYWdnaW5nIGlzXG4gICAqIHNtb290aC4gYGZhY3RvcmAgaXMgcmVsYXRpdmUgdG8gdGhlIHZvbHVtZSdzIG5hdHVyYWwgcHJvcG9ydGlvbnMgKDEpLiBQZXJzaXN0cyBhY3Jvc3MgcmUtbW91bnRzXG4gICAqIChyZXNvbHV0aW9uIGNoYW5nZXMpIHNvIHRoZSBjaG9zZW4gaGVpZ2h0IHN0aWNrcy5cbiAgICovXG4gIHByaXZhdGUgc2V0Vm9sdW1lWlNjYWxlKGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52b2x1bWVaU2NhbGUgPSBNYXRoLm1pbigxMCwgTWF0aC5tYXgoMC4xLCBmYWN0b3IpKTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy52b2x1bWVXb3JsZEJhc2U7XG4gICAgaWYgKCFiYXNlIHx8ICF0aGlzLnZvbHVtZVZpZXcpIHJldHVybjtcbiAgICBjb25zdCB3b3JsZFogPSBiYXNlLmRlcHRoICogdGhpcy52b2x1bWVaU2NhbGU7XG4gICAgY29uc3QgdnNaID0gd29ybGRaIC8gdGhpcy52b2x1bWVTYW1wbGVkRGVwdGg7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLnZvbHVtZVZpZXcubGF5ZXJzKSB7XG4gICAgICBjb25zdCBbc3gsIHN5XSA9IGxheWVyLnZveGVsU2l6ZTtcbiAgICAgIGxheWVyLnZveGVsU2l6ZSA9IFtzeCwgc3ksIHZzWl07XG4gICAgfVxuICAgIGlmICh0aGlzLmF4ZXNMYXllcikgdGhpcy5heGVzTGF5ZXIuZGVwdGggPSB3b3JsZFo7XG4gICAgdGhpcy5heGVzTGFiZWxzPy51cGRhdGVBbmNob3JzKFxuICAgICAgdGhpcy5idWlsZEF4ZXNMYWJlbHMoeyB3aWR0aDogYmFzZS53aWR0aCwgaGVpZ2h0OiBiYXNlLmhlaWdodCwgZGVwdGg6IHdvcmxkWiB9KSxcbiAgICApO1xuICAgIHRoaXMuekhhbmRsZT8ucmVwb3NpdGlvbigpO1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIFgvWS9aIGF4aXMtZW5kIGxhYmVsIHNwZWNzIGZvciB0aGUgM0QgZ2l6bW8uIEFuY2hvcnMgYXJlIGluIHRoZSB2b2x1bWUncyBjZW50cmVkXG4gICAqICB3b3JsZCBib3ggKG1hdGNoaW5nIHRoZSBBeGVzTGF5ZXIgZ2VvbWV0cnkpOyB0aGUgc2NhbGUgdGV4dCByZWZsZWN0cyB0aGUgRlVMTCBpbWFnZSBleHRlbnQg4oCUXG4gICAqICBwaHlzaWNhbCDCtW0gd2hlbiDCtW0vcGl4ZWwgaXMga25vd24sIGVsc2UgcGl4ZWwgKFgvWSkgLyBzbGljZSAoWikgY291bnRzLiAqL1xuICBwcml2YXRlIGJ1aWxkQXhlc0xhYmVscyhcbiAgICB2b2w6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IGRlcHRoOiBudW1iZXIgfSxcbiAgKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IHZvbC53aWR0aCAvIDI7XG4gICAgY29uc3QgaHkgPSB2b2wuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCBoeiA9IHZvbC5kZXB0aCAvIDI7XG4gICAgLy8gTWVhc3VyZWQgZnJvbSB0aGUgSU1BR0UncyBvd24gZXh0ZW50LCBuZXZlciBmcm9tIHRoZSB3b3JsZCBib3g6IHRoZSBib3ggaXMgYVxuICAgIC8vIHNoYXBlIChhbmQgZm9yIGEgcGh5c2ljYWxseSBzaXplZCB2b2x1bWUgaXQgaXMgYWxyZWFkeSBpbiDCtW0sIHNvIHJlYWRpbmcgYVxuICAgIC8vIHBpeGVsIGNvdW50IG9mZiBpdCBhbmQgbXVsdGlwbHlpbmcgYnkgbXBwIHdvdWxkIHNjYWxlIHRoZSBsYWJlbCB0d2ljZSkuXG4gICAgY29uc3QgeyBweCwgbXBwIH0gPSB0aGlzLmltYWdlRXh0ZW50KCk7XG4gICAgY29uc3QgbGVuID0gKG46IG51bWJlciwgdW06IG51bWJlcik6IHN0cmluZyA9PiAodW0gPiAwID8gZm9ybWF0VW0obiAqIHVtKSA6IGAke259IHB4YCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgYW5jaG9yOiBbaHgsIC1oeSwgLWh6XSwgdGV4dDogYFggwrcgJHtsZW4ocHhbMF0sIG1wcFswXSl9YCwgY29sb3I6ICcjZWQ0NTQ1JyB9LFxuICAgICAgeyBhbmNob3I6IFstaHgsIGh5LCAtaHpdLCB0ZXh0OiBgWSDCtyAke2xlbihweFsxXSwgbXBwWzFdKX1gLCBjb2xvcjogJyM0ZGQ5NTknIH0sXG4gICAgICAvLyBQaHlzaWNhbCB3aGVuIHRoZSBzdGFjayBkZWNsYXJlcyBpdHMgc2xpY2Ugc3BhY2luZyAoYG1wcFpgKSDigJQgYSByZXNhbXBsZWRcbiAgICAgIC8vIHZvbHVtZSBrbm93cyBob3cgdGhpY2sgaXQgaXM7IGEgcGxhaW4gei1zdGFjayBjYW4gb25seSBzYXkgaG93IG1hbnkgc2xpY2VzLlxuICAgICAgeyBhbmNob3I6IFstaHgsIC1oeSwgaHpdLCB0ZXh0OiBgWiDCtyAke2xlbihweFsyXSwgbXBwWzJdKX1gLCBjb2xvcjogJyM2NjhjZmYnIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UncyBkZWNsYXJlZCBleHRlbnQgaW4gcGl4ZWxzL3NsaWNlcywgYW5kIGl0cyBwaHlzaWNhbCBzcGFjaW5nIHBlclxuICAgKiBheGlzIGluIMK1bSAoMCA9IHVuZGVjbGFyZWQsIGFuZCB0aGVuIHRoYXQgYXhpcyByZWFkcyBpbiBwaXhlbHMpLlxuICAgKlxuICAgKiBPbmUgcGxhY2UsIGJlY2F1c2UgdGhlIHZvbHVtZSB3b3JsZCBib3ggYW5kIHRoZSBheGlzIGxhYmVscyBoYXZlIHRvIGFncmVlXG4gICAqIGFib3V0IHdoYXQgdGhlIGltYWdlJ3MgcmVhbCBkaW1lbnNpb25zIGFyZSDigJQgdGhlIHNhbXBsZWQgZ3JpZCBpcyBkZWNpbWF0ZWQgYW5kXG4gICAqIHNheXMgbm90aGluZyBhYm91dCBlaXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGltYWdlRXh0ZW50KCk6IHsgcHg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsgbXBwOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgY29uc3QgZGltcyA9IHRoaXMudm9sdW1lRGltcztcbiAgICBjb25zdCBtcHBYID0gdGhpcy5kZXNjcmlwdG9yPy5tcHBYIHx8IG1ldGE/Lm1wcFggfHwgMDtcbiAgICByZXR1cm4ge1xuICAgICAgcHg6IFtcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyBtZXRhPy54ID8/IGRpbXM/LndpZHRoID8/IDEsXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcj8uaGVpZ2h0ID8/IG1ldGE/LnkgPz8gZGltcz8uaGVpZ2h0ID8/IDEsXG4gICAgICAgIG1ldGE/LnogfHwgdGhpcy5sb2FkZWQ/LmltYWdlSW5mby51cmxzPy5sZW5ndGggfHwgZGltcz8uZGVwdGggfHwgMSxcbiAgICAgIF0sXG4gICAgICAvLyBBIGRlc2NyaXB0b3IgdGhhdCByZXBvcnRzIG9ubHkgbXBwWCBpcyBzcXVhcmUtcGl4ZWwgYnkgY29udmVudGlvbiwgd2hpY2ggaXNcbiAgICAgIC8vIHdoYXQgdGhlIDJEIHNjYWxlIGJhciBhbHJlYWR5IGFzc3VtZXMgb2YgaXQuXG4gICAgICBtcHA6IFttcHBYLCB0aGlzLmRlc2NyaXB0b3I/Lm1wcFkgfHwgbWV0YT8ubXBwWSB8fCBtcHBYLCBtZXRhPy5tcHBaIHx8IDBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYSBkb3duc2FtcGxlZCB1aW50OCB2b2x1bWUgKGx1bWluYW5jZSkgZnJvbSB0aGUgcGVyLXNsaWNlIHRpbGUgZW5kcG9pbnQuIFNsaWNlcyBhcmVcbiAgICogZmV0Y2hlZCB3aXRoIGJvdW5kZWQgY29uY3VycmVuY3kgKGtlZXBzIHRoZSBjb25uZWN0aW9uIHBvb2wgZnVsbCB3aXRob3V0IGZsb29kaW5nIGl0IG9uIGEgZGVlcFxuICAgKiBzdGFjaykgYW5kIHJlYWQgaW50byB0aGUgdm9sdW1lIGFzIGVhY2ggYXJyaXZlcywgZHJpdmluZyB7QGxpbmsgc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkfSBzbyB0aGVcbiAgICogaG9zdCBzaG93cyBhIGRldGVybWluYXRlIHByb2dyZXNzIGJhciBpbnN0ZWFkIG9mIGEgYmFyZSBzcGlubmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlbWJsZVZvbHVtZShcbiAgICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IHsgbWF4U2xpY2U/OiBudW1iZXI7IHNsaWNlU3RlcD86IG51bWJlciB9ID0ge30sXG4gICAgY2hhbm5lbD86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmxvYWRUb2tlbjsgLy8gYmFpbCBpZiBhIENhbmNlbCAvIG5ldyBwbG90IGJ1bXBzIHRoaXMgd2hpbGUgd2UgZmV0Y2hcbiAgICBjb25zdCBmdWxsRGVwdGggPSBpbmZvPy5pbWFnZU1ldGE/LlswXT8ueiB8fCBpbmZvPy51cmxzPy5sZW5ndGggfHwgMTtcbiAgICBpZiAoZnVsbERlcHRoIDwgMSkge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBubyBzbGljZXMgdG8gYXNzZW1ibGUgYSB2b2x1bWUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihvcHRzLnNsaWNlU3RlcCA/PyAxKSk7XG4gICAgY29uc3QgbWF4U2xpY2UgPSBvcHRzLm1heFNsaWNlID8/IFZPTFVNRV9NQVhfU0xJQ0U7XG4gICAgLy8gU291cmNlLXNsaWNlIGluZGljZXMgc2FtcGxlZCBpbnRvIHRoZSB2b2x1bWUgKGV2ZXJ5IGBzdGVwYHRoIHBsYW5lIOKGkiBsb3ctcmVzIGlzIGZhc3RlcikuXG4gICAgY29uc3QgekluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgeiA9IDA7IHogPCBmdWxsRGVwdGg7IHogKz0gc3RlcCkgekluZGljZXMucHVzaCh6KTtcbiAgICBjb25zdCBkZXB0aCA9IHpJbmRpY2VzLmxlbmd0aDtcblxuICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIGVhY2ggc2xpY2UgYXQgYSBweXJhbWlkIGxldmVsIG1hdGNoaW5nIGBtYXhTbGljZWAgKGJ1ZGdldCBzY2FsZXMgd2l0aCB0aGUgZGVjaW1hdGVcbiAgICAgIC8vIGZhY3RvciksIHNvIGEgaGlnaGVyIGZhY3RvciBwdWxscyBhIGZpbmVyIGxldmVsIOKGkiBtb3JlIHJlYWwgaW4tcGxhbmUgZGV0YWlsOyB0aGVuIGRvd25zYW1wbGVcbiAgICAgIC8vIHRvIGBtYXhTbGljZWAuIGBjaGFubmVsYCBzZWxlY3RzIGEgYmFuZCAobXVsdGljaGFubmVsIHZvbHVtZSk7IG9taXQgZm9yIHRoZSBncmF5c2NhbGVcbiAgICAgIC8vIGNvbXBvc2l0ZS4gVGhlIGNhbGxlciBvd25zIHRoZSBzdGFja0xvYWRpbmcgZmxhZyAobXVsdGljaGFubmVsIGFzc2VtYmxlcyBjaGFubmVscyBpbiB0dXJuKS5cbiAgICAgIGNvbnN0IGJ1ZGdldCA9IHRoaXMudGlsZUJ1ZGdldEZvcihtYXhTbGljZSk7XG4gICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHRoaXMuZmV0Y2hTbGljZSh6SW5kaWNlc1swXSwgY2hhbm5lbCwgYnVkZ2V0KTtcbiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgbWF4U2xpY2UgLyBNYXRoLm1heChmaXJzdC53aWR0aCwgZmlyc3QuaGVpZ2h0LCAxKSk7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZmlyc3Qud2lkdGggKiBzY2FsZSkpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChmaXJzdC5oZWlnaHQgKiBzY2FsZSkpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogZGVwdGgpO1xuXG4gICAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICAgIGlmICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgfVxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXNcbiAgICAgICAgfCBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgICAgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcbiAgICAgICAgfCBudWxsO1xuICAgICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignbmFwYXJpLWpzIHZvbHVtZSBhc3NlbWJseTogMkQgY29udGV4dCB1bmF2YWlsYWJsZScpO1xuXG4gICAgICAvLyBSZWFkIG9uZSBmZXRjaGVkIHNsaWNlIGJpdG1hcCBpbnRvIHRoZSB2b2x1bWUgcGxhbmUgYHpgIChsdW1pbmFuY2UpLiBTeW5jaHJvbm91cyBiZXR3ZWVuXG4gICAgICAvLyBhd2FpdHMsIHNvIHRoZSBzaGFyZWQgMkQgY29udGV4dCBpcyBzYWZlIHRvIHJldXNlIGFjcm9zcyB0aGUgY29uY3VycmVudCBmZXRjaCB3b3JrZXJzLlxuICAgICAgbGV0IGRvbmUgPSAwO1xuICAgICAgY29uc3QgcmVhZFNsaWNlID0gKHo6IG51bWJlciwgYm1wOiBJbWFnZUJpdG1hcCk6IHZvaWQgPT4ge1xuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKGJtcCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJnYmEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB6ICogd2lkdGggKiBoZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7IGkrKykge1xuICAgICAgICAgIGRhdGFbYmFzZSArIGldID1cbiAgICAgICAgICAgIChyZ2JhW2kgKiA0XSAqIDAuMjk5ICsgcmdiYVtpICogNCArIDFdICogMC41ODcgKyByZ2JhW2kgKiA0ICsgMl0gKiAwLjExNCkgfCAwO1xuICAgICAgICB9XG4gICAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgICAgIGRvbmUrKztcbiAgICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dChNYXRoLnJvdW5kKChkb25lIC8gZGVwdGgpICogMTAwKSk7XG4gICAgICB9O1xuXG4gICAgICByZWFkU2xpY2UoMCwgZmlyc3QpO1xuXG4gICAgICAvLyBSZW1haW5pbmcgcGxhbmVzIHZpYSBhIHNtYWxsIHBvb2wgb2Ygd29ya2VycyBkcmFpbmluZyBhIHNoYXJlZCBxdWV1ZS4gRWFjaCBwbGFuZSBgcGBcbiAgICAgIC8vIG1hcHMgdG8gc291cmNlIHNsaWNlIGB6SW5kaWNlc1twXWAgKHN1YnNhbXBsZWQgZm9yIGxvdy1yZXMpLlxuICAgICAgY29uc3QgcGVuZGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IHAgPSAxOyBwIDwgZGVwdGg7IHArKykgcGVuZGluZy5wdXNoKHApO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgcCA9IHBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICBpZiAocCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICAgIHJlYWRTbGljZShwLCBhd2FpdCB0aGlzLmZldGNoU2xpY2UoekluZGljZXNbcF0sIGNoYW5uZWwsIGJ1ZGdldCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9vbFNpemUgPSBNYXRoLm1pbihWT0xVTUVfRkVUQ0hfQ09OQ1VSUkVOQ1ksIE1hdGgubWF4KDEsIGRlcHRoIC0gMSkpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9vbFNpemUgfSwgKCkgPT4gd29ya2VyKCkpKTtcblxuICAgICAgaWYgKHRoaXMubG9hZFRva2VuICE9PSB0b2tlbikgcmV0dXJuIG51bGw7IC8vIGNhbmNlbGxlZCDihpIgZG9uJ3QgcmVuZGVyIGEgcGFydGlhbCB2b2x1bWVcbiAgICAgIHJldHVybiB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBOQVBBUklfU0NBVFRFUiAyRCBzY2F0dGVyOiB0aGUgc2xpY2UgaW1hZ2Ugd2l0aCBhIHBvaW50cyBsYXllciBhdCBlYWNoIHJlZ2lvbidzXG4gICAqIGNlbnRyb2lkIChuYXBhcmktanMgYW5hbG9nIG9mIFBsb3RseSdzIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyKS4gUmVidWlsZHMgdGhlIHBvaW50cyBsaXZlIGFzXG4gICAqIHJlZ2lvbnMgY2hhbmdlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNjYXR0ZXIodmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50LCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuc3Vic2NyaWJlRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICB0aGlzLmluc3RhbGxOYXZpZ2F0b3Ioeik7XG4gICAgLy8gVGhpcyBtb2RlIHBsb3RzIFJFR0lPTiBjZW50cm9pZHMsIHNvIHdpdGhvdXQgdGhlIHJlZ2lvbiB0b29scyB0aGVyZSBpcyBub1xuICAgIC8vIHdheSB0byBwcm9kdWNlIGEgcG9pbnQg4oCUIGRyYXdpbmcgYSByZWdpb24gbm93IGFkZHMgb25lIGltbWVkaWF0ZWx5LlxuICAgIHRoaXMuaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLnJlYnVpbGRTY2F0dGVyUG9pbnRzKCk7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViID0gdGhpcy5yZWdpb25TdG9yZVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWJ1aWxkU2NhdHRlclBvaW50cygpKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIDJEIHNjYXR0ZXIncyBwb2ludCBsYXllciBhdCB0aGUgY3VycmVudCByZWdpb24gY2VudHJvaWRzLiAqL1xuICBwcml2YXRlIHJlYnVpbGRTY2F0dGVyUG9pbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodGhpcy5zY2F0dGVyMmRQb2ludHMpIHtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZSh0aGlzLnNjYXR0ZXIyZFBvaW50cyk7XG4gICAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRoaXMucmVnaW9uQ2VudHJvaWRzKCk7XG4gICAgaWYgKGNlbnRyb2lkcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IHYuYWRkUG9pbnRzKGNlbnRyb2lkcywge1xuICAgICAgc2l6ZTogMTIsXG4gICAgICBmYWNlQ29sb3I6IFsxLCAwLjg1LCAwLjIsIDFdLFxuICAgICAgYm9yZGVyQ29sb3I6IFswLCAwLCAwLCAxXSxcbiAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lvbiBjZW50cm9pZHMgYXMgZmxhdCBgW3gsIHksIOKApl1gIGRhdGEgY29vcmRzIChyZWN0YW5nbGUgLyBwb2x5Z29uIC8gbXVsdGlwb2x5Z29uKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25DZW50cm9pZHMoKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgcG9seUNlbnRyb2lkID0gKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuID0geHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPT09IDApIHJldHVybjtcbiAgICAgIGxldCBjeCA9IDA7XG4gICAgICBsZXQgY3kgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgY3ggKz0geHNbaV07XG4gICAgICAgIGN5ICs9IHlzW2ldO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goY3ggLyBuLCBjeSAvIG4pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSB7XG4gICAgICBjb25zdCBiID0gci5ib3VuZHMgYXNcbiAgICAgICAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9XG4gICAgICAgIHwgeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW10gfVxuICAgICAgICB8IHsgcG9seWdvbnM6IHsgeHBvaW50czogbnVtYmVyW107IHlwb2ludHM6IG51bWJlcltdIH1bXSB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYikgY29udGludWU7XG4gICAgICBpZiAoJ3dpZHRoJyBpbiBiICYmICd4JyBpbiBiKSB7XG4gICAgICAgIG91dC5wdXNoKGIueCArIGIud2lkdGggLyAyLCBiLnkgKyBiLmhlaWdodCAvIDIpO1xuICAgICAgfSBlbHNlIGlmICgneHBvaW50cycgaW4gYikge1xuICAgICAgICBwb2x5Q2VudHJvaWQoYi54cG9pbnRzLCBiLnlwb2ludHMpO1xuICAgICAgfSBlbHNlIGlmICgncG9seWdvbnMnIGluIGIpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGIucG9seWdvbnMpIHBvbHlDZW50cm9pZChwLnhwb2ludHMsIHAueXBvaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG91dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGludGVyYWN0aW9uIHN0YWNrIGV2ZXJ5IDJEIG1vZGUgbmVlZHM6IHRoZSByZWdpb24gb3ZlcmxheSAoZHJhdy9zZWxlY3QvZWRpdCksIHRoZSBwaXhlbFxuICAgKiB0b29scyB0aGF0IHJlYWQgYmFjayBkaXNwbGF5ZWQgcGl4ZWxzICh3YW5kLCBicnVzaCwgdmVydGV4IGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSksXG4gICAqIGFuZCBhIGNhbWVyYSBob29rIHRoYXQga2VlcHMgdGhhdCByZWFkYmFjayBjdXJyZW50IGFzIHRoZSB2aWV3IHBhbnMvem9vbXMgYW5kIHRpbGVkIGxldmVsc1xuICAgKiBsb2FkLlxuICAgKlxuICAgKiBFeHRyYWN0ZWQgYmVjYXVzZSBmb3JnZXR0aW5nIGl0IGlzIGludmlzaWJsZTogdGhlIHRvb2xiYXIgZ2F0ZXMgaXRzIHJlZ2lvbiBidXR0b25zIG9uIDJELXZzLTNEXG4gICAqIHJhdGhlciB0aGFuIG9uIHBsb3QgdHlwZSwgc28gYSAyRCBtb2RlIHRoYXQgc2tpcHMgdGhpcyBzaG93cyBldmVyeSB0b29sIGFuZCBzaWxlbnRseSBkb2VzXG4gICAqIG5vdGhpbmcuIFRoYXQgaXMgZXhhY3RseSB3aGF0IGhhcHBlbmVkIHRvIHRoZSBzcGF0aWFsIGFuZCByZWdpb24tY2VudHJvaWQgc2NhdHRlciBtb2Rlcy5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbDJkSW50ZXJhY3Rpb24odmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbmV3IE5hcGFyaVJlZ2lvbk92ZXJsYXkoaG9zdCwgdmlld2VyLCB0aGlzLnJlZ2lvblN0b3JlKTtcbiAgICB0aGlzLmJ1aWxkVG9vbEhvc3RzKCk7XG4gICAgdGhpcy5jYW1lcmFSZWFkYmFja09mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuYXJtUmVhZGJhY2soKSk7XG4gIH1cblxuICAvLyDilIDilIAgU3BhdGlhbCBvbWljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogTWFya2VyIHJhZGl1cyAoaW1hZ2UgcHgpIGZvciBhIGRhdGFzZXQgdGhhdCBkZWNsYXJlcyBub25lIOKAlCBzZWdtZW50ZWQgY2VsbHMgb2Z0ZW4gZG9uJ3QuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfRkFMTEJBQ0tfUkFESVVTID0gNDtcbiAgLyoqIFNtYWxsZXN0IG1hcmtlciBESUFNRVRFUiwgaW4gc2xpY2UgcGl4ZWxzLCBvdmVyIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0LiBBIGNlbGwncyByZWFsXG4gICAqICBzaXplIGlzIGhvbm91cmVkIHdoZXJldmVyIGl0IHN1cnZpdmVzIHRoZSBncmlkOiB0aGUgQUJDIGF0bGFzIHNlcnZlcyA1IMK1bSByYWRpaSBvbiBhXG4gICAqICA0MCDCtW0vcHggdGVtcGxhdGUsIHNvIGRyYXdpbmcgdGhlbSB0byBzY2FsZSB3b3VsZCBwdXQgZXZlcnkgY2VsbCBhIGZpZnRoIG9mIGEgcGl4ZWwgd2lkZVxuICAgKiAgYW5kIHRoZSBzZWN0aW9uIHdvdWxkIGNvbWUgdXAgZW1wdHkuIFRoZSBwb2ludC1zaXplIGNvbnRyb2wgc2NhbGVzIHVwIGZyb20gdGhpcyBmbG9vci4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9TTElDRV9NSU5fRElBTUVURVJfUFggPSAxLjU7XG4gIC8qKiBMb25nZXN0IHNpZGUgb2YgdGhlIGdlbmUtbWFwIHJhc3RlciwgaW4gZmllbGQgcGl4ZWxzLiBBIGdlbmUgbWFwIGlzIGEgc21vb3RoXG4gICAqICBmaWVsZCByZWFkIGFzIHRlcnJpdG9yeSwgc28gaXQgZ2FpbnMgbm90aGluZyBmcm9tIG1hdGNoaW5nIGEgMiBHcHggc2xpZGUnc1xuICAgKiAgcmVzb2x1dGlvbiDigJQgYW5kIHRoZSBlc3RpbWF0ZSBjb3N0cyBvbmUgcGFzcyBvdmVyIHRoaXMgbWFueSBwaXhlbHMuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdFTkVfTUFQX01BWF9TSURFID0gNTEyO1xuICAvKiogS2VybmVsIM+DIGluIGZpZWxkIHBpeGVscyBhdCBzbW9vdGhpbmcgMTogd2lkZSBlbm91Z2ggdG8gcmVhZCBiZXR3ZWVuIGNlbGxzLFxuICAgKiAgdGlnaHQgZW5vdWdoIHRvIGtlZXAgYSBudWNsZXVzLXNjYWxlIHN0cnVjdHVyZSBkaXN0aW5jdC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0VORV9NQVBfU0lHTUEgPSAyLjU7XG4gIC8qKiBDbHVzdGVycyBkcmF3biBhcyBkZW5zaXR5IHZvbHVtZXMgYXQgb25jZS4gUGFzdCBhIGhhbmRmdWwsIGFkZGl0aXZlIHRyYW5zbHVjZW50XG4gICAqICBjbG91ZHMgc3RvcCBiZWluZyBzZXBhcmFibGUgYnkgZXllIOKAlCBhbmQgZWFjaCBvbmUgaXMgYSBmdWxsIHJhc3RlcmlzYXRpb24uICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFTlNJVFlfTUFYX0NMVVNURVJTID0gNjtcbiAgLyoqIENvbG91ciBmb3Igb2JzZXJ2YXRpb25zIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCB0byBjb2xvdXIgYnk6IHZpc2libGUsIG5ldXRyYWwsIGFuZFxuICAgKiAgb2J2aW91c2x5IG5vdCBlbmNvZGluZyBhbnl0aGluZy4gKi9cbiAgLyoqIEhvdyBtdWNoIGxhcmdlciBhIHNlbGVjdGVkIG1hcmtlciBpcyBkcmF3biwgc28gYSBzbWFsbCBzZWxlY3Rpb24gaXMgZmluZGFibGUgaW5zaWRlIGFcbiAgICogIDMuN00tcG9pbnQgY2xvdWQgcmF0aGVyIHRoYW4gbWVyZWx5IGJyaWdodGVyLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTUEFUSUFMX1NFTEVDVEVEX1NJWkVfU0NBTEUgPSAxLjY7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1BBVElBTF9ORVVUUkFMX0NPTE9SOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9XG4gICAgWzAuMzUsIDAuNzIsIDAuOTUsIDAuOV07XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBTUEFUSUFMX09NSUNTIHZpZXc6IHRoZSB0aXNzdWUgaW1hZ2Ugd2l0aCBvbmUgbWFya2VyIHBlciBvYnNlcnZhdGlvbiwgY29sb3VyZWQgYnlcbiAgICogYW4gYW5ub3RhdGlvbiBjb2x1bW4gb3IgYSBnZW5lLiBUaGUgbWFya2VycyByZWJ1aWxkIHdoZW5ldmVyIHRoZSBkYXRhc2V0IG9yIHRoZSB2aWV3IHN0YXRlXG4gICAqIGNoYW5nZXMsIHNvIHN3aXRjaGluZyB0aGUgY29sb3VyLWJ5IGNvbHVtbiBkb2VzIG5vdCByZW1vdW50IHRoZSBzY2VuZS5cbiAgICpcbiAgICogU2V0cyB1cCB0aGUgZnVsbCAyRCBpbnRlcmFjdGlvbiBzdGFjayDigJQgcmVnaW9uIG92ZXJsYXksIHBpeGVsLXRvb2wgaG9zdHMsIHJlYWRiYWNrIGN1cnJlbmN5IOKAlFxuICAgKiBleGFjdGx5IGFzIHRoZSBwbGFpbiBpbWFnZSB2aWV3IGRvZXMuIFRoYXQgaXMgTk9UIG9wdGlvbmFsIGhlcmU6IHRoaXMgbW9kZSdzIHNlbGVjdGlvbiBpc1xuICAgKiBkcml2ZW4gYnkgZHJhd24gUk9Jcywgc28gd2l0aG91dCB0aGUgb3ZlcmxheSB0aGVyZSBpcyBubyB3YXkgdG8gbWFrZSBhIHNlbGVjdGlvbiBhdCBhbGwuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3BhdGlhbE9taWNzKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgejogbnVtYmVyLCBub0ltYWdlID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXaXRoIG5vIGltYWdlIGxvYWRlZCB0aGVyZSBpcyBub3RoaW5nIHRvIHJlbmRlciB1bmRlciB0aGUgb2JzZXJ2YXRpb25zOyB0aGV5IGFyZVxuICAgIC8vIGZyYW1lZCBvbiB0aGVpciBvd24gZXh0ZW50LCBhcyBmb3IgYW55IGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2UuXG4gICAgaWYgKCFub0ltYWdlKSBhd2FpdCB0aGlzLnJlbmRlckltYWdlKHopO1xuICAgIC8vIE9ubHkgZml0IHRvIHRoZSBpbWFnZSB3aGVuIHRoaXMgZGF0YXNldCBhY3R1YWxseSBoYXMgb25lLiBPdGhlcndpc2UgdGhlcmUgaXNcbiAgICAvLyBub3RoaW5nIHRvIGZpdCwgYGltYWdlV2AvYGltYWdlSGAgc3RpbGwgaG9sZCB0aGUgTEFTVCBpbWFnZSdzIGRpbWVuc2lvbnMsIGFuZFxuICAgIC8vIHRoaXMgZml0cyB0byB0aG9zZSDigJQgYW5kIGJlY2F1c2UgaXQgZGVmZXJzIHRvIGEgZnJhbWUsIGl0IGxhbmRzIEFGVEVSIHRoZSBwb2ludHNcbiAgICAvLyBhcmUgYWRkZWQgYW5kIG92ZXJ3cml0ZXMgdGhlIGZyYW1pbmcgdGhleSBzZXQuIFRoYXQgaXMgd2hhdCBsZWZ0IGFuIGltYWdlLWxlc3NcbiAgICAvLyBkYXRhc2V0IGFzIGEgdGVuLXBpeGVsIHNwZWNrIG9mZiB0byBvbmUgc2lkZS5cbiAgICBpZiAodGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF0/LmltYWdlUmVmKSB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgICB0aGlzLnN1YnNjcmliZURpc3BsYXlTdGF0ZSgpO1xuICAgIC8vIFRoZSBzY2FsZSBiYXIgYW5kIG5hdmlnYXRvciBkZXNjcmliZSBhbiBpbWFnZTsgd2l0aCBub25lIGxvYWRlZCwgd2hhdGV2ZXIgdGhleSB3b3VsZFxuICAgIC8vIHJlYWQgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGxhc3Qgb25lLlxuICAgIGlmICghbm9JbWFnZSkge1xuICAgICAgdGhpcy5pbnN0YWxsU2NhbGVCYXIoKTtcbiAgICAgIHRoaXMuaW5zdGFsbE5hdmlnYXRvcih6KTtcbiAgICB9XG4gICAgdGhpcy5pbnN0YWxsMmRJbnRlcmFjdGlvbih2aWV3ZXIsIGhvc3QpO1xuICAgIHRoaXMuaW5zdGFsbFNwYXRpYWxIb3Zlcihob3N0KTtcbiAgICB0aGlzLnNwYXRpYWxUaWxlcygpPy5hdHRhY2godmlld2VyKTtcbiAgICB0aGlzLnN1YnNjcmliZVNwYXRpYWwoKTtcbiAgICB0aGlzLnNjaGVkdWxlUmVhZGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSAyRCBvYnNlcnZhdGlvbiBtYXJrZXJzIGFyZSBkcmF3bjogd2hlbiB0aGUgdXNlciB3YW50cyB0aGVtLCBhbmQgbm90IHdoaWxlXG4gICAqIGNlbGwgb3V0bGluZXMgYXJlIG9uIHNjcmVlbiDigJQgdGhlbiBhIGNlbGwgSVMgaXRzIG91dGxpbmUsIGFuZCBhIGNpcmNsZSBvbiB0b3Agb2YgaXQgaXNcbiAgICogbm9pc2UuIFpvb21lZCBvdXQgcGFzdCB0aGUgb3V0bGluZSB0aHJlc2hvbGQsIHRoZSBjaXJjbGVzIHN0YW5kIGluIGZvciB0aGUgY2VsbHMuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxQb2ludHNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNwYXRpYWxMYXRlc3Q/LlsxXTtcbiAgICByZXR1cm4gKHZpZXc/LnNob3dQb2ludHMgPz8gdHJ1ZSkgJiYgIXRoaXMuc3BhdGlhbFRpbGVzTWdyPy5vdXRsaW5lc1Nob3duO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0aWxlZC1nZW9tZXRyeSBtYW5hZ2VyLCBidWlsdCBvbiBmaXJzdCB1c2UuIEl0cyBob3N0IGNhbGxiYWNrcyByZWFkIHRoaXNcbiAgICogc2VydmljZSdzIGxpdmUgc3RhdGUsIHNvIGl0IG5ldmVyIGhvbGRzIGEgc3RhbGUgZGF0YXNldCBvciBjb2xvcm1hcC5cbiAgICovXG4gIHByaXZhdGUgc3BhdGlhbFRpbGVzKCk6IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzIHwgbnVsbCB7XG4gICAgY29uc3QgcG9ydCA9IHRoaXMuc3BhdGlhbERhdGE7XG4gICAgaWYgKCFwb3J0KSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxUaWxlc01nciA/Pz0gbmV3IE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzKHBvcnQsIHtcbiAgICAgIGxhdGVzdDogKCkgPT4gdGhpcy5zcGF0aWFsTGF0ZXN0LFxuICAgICAgY2FudmFzU2l6ZTogKCkgPT4gW3RoaXMuY2FudmFzPy5jbGllbnRXaWR0aCA/PyAwLCB0aGlzLmNhbnZhcz8uY2xpZW50SGVpZ2h0ID8/IDBdLFxuICAgICAgY29udGludW91c0x1dDogKHZpZXcpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgICAgIHJldHVybiBzcGF0aWFsQ29udGludW91c0x1dChub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXApO1xuICAgICAgfSxcbiAgICAgIGVzdGltYXRlQ2hhbmdlZDogKGUpID0+IHRoaXMudHJhbnNjcmlwdEVzdGltYXRlJC5uZXh0KGUpLFxuICAgICAgZ2VuZUNvdW50c0NoYW5nZWQ6IChjKSA9PiB0aGlzLmdlbmVDb3VudHNJblZpZXckLm5leHQoYyksXG4gICAgICBsb2FkaW5nQ2hhbmdlZDogKGxheWVycykgPT4ge1xuICAgICAgICB0aGlzLnRpbGVMb2FkaW5nID0gbGF5ZXJzO1xuICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICB9LFxuICAgICAgZGVuc2l0eUNoYW5nZWQ6IChkKSA9PiB0aGlzLmRlbnNpdHlTdGF0cyQubmV4dChkKSxcbiAgICAgIHBvbHlnb25zU2hvd25DaGFuZ2VkOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHRoaXMuc3BhdGlhbFBvaW50cy52aXNpYmxlID0gdGhpcy5zcGF0aWFsUG9pbnRzVmlzaWJsZSgpO1xuICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsVGlsZXNNZ3I7XG4gIH1cblxuICAvKipcbiAgICogUmVnaW9uIGRyYXdpbmcgZm9yIHRoZSAzRCBjbG91ZC5cbiAgICpcbiAgICogUmV1c2VzIHtAbGluayBOYXBhcmlSZWdpb25PdmVybGF5fSB2ZXJiYXRpbSBieSBoYW5kaW5nIGl0IGEgU0NSRUVOLVNQQUNFIHZpZXdlcjogdGhlIGRyYXduXG4gICAqIHNoYXBlIGlzIGEgbGFzc28gaW4gY2FudmFzIHBpeGVscywgc28gXCJ3b3JsZFwiIGlzIHRoZSBjYW52YXMgYW5kIGJvdGggdHJhbnNmb3JtcyBhcmUgaWRlbnRpdHlcbiAgICogKGJhciB0aGUgY2xpZW504oaSY2FudmFzIG9mZnNldCkuIEV2ZXJ5IGV4aXN0aW5nIHRvb2wg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQg4oCUIHRoZXJlZm9yZVxuICAgKiB3b3JrcyBpbiAzRCB3aXRoIG5vIG5ldyBkcmF3aW5nIGNvZGUuXG4gICAqXG4gICAqIEEgc2NyZWVuLXNwYWNlIHNoYXBlIHN0b3BzIG1lYW5pbmcgYW55dGhpbmcgdGhlIG1vbWVudCB0aGUgY2FtZXJhIG1vdmVzLCBzbyBhbiBvcmJpdCBjbGVhcnNcbiAgICogdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBTRUxFQ1RJT04gaXQgcHJvZHVjZWQgaXMga2VwdDogdGhhdCBpcyB0aGUgZHVyYWJsZSBhcnRlZmFjdCwgYW5kIHRoZVxuICAgKiBoaWdobGlnaHRlZCBwb2ludHMgc3RheSBoaWdobGlnaHRlZCBmcm9tIGV2ZXJ5IGFuZ2xlLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsM2RJbnRlcmFjdGlvbih2aWV3ZXI6IFZpZXdlciwgaG9zdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXNSZWN0ID0gKCkgPT4gdGhpcy5jYW52YXM/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNjcmVlblNwYWNlOiBPdmVybGF5Vmlld2VyID0ge1xuICAgICAgY2FudmFzVG9Xb3JsZDogKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSBjYW52YXNSZWN0KCk7XG4gICAgICAgIHJldHVybiByID8gW2NsaWVudFggLSByLmxlZnQsIGNsaWVudFkgLSByLnRvcF0gOiBbY2xpZW50WCwgY2xpZW50WV07XG4gICAgICB9LFxuICAgICAgLy8gQWxyZWFkeSBjYW52YXMgcGl4ZWxzLlxuICAgICAgd29ybGRUb0NhbnZhczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbeCwgeV0sXG4gICAgICBzZXRDb250cm9sc0VuYWJsZWQ6IChlbmFibGVkOiBib29sZWFuKSA9PiB2aWV3ZXIuc2V0Q29udHJvbHNFbmFibGVkKGVuYWJsZWQpLFxuICAgICAgY2FtZXJhOiB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXkgPSBuZXcgTmFwYXJpUmVnaW9uT3ZlcmxheShob3N0LCBzY3JlZW5TcGFjZSwgdGhpcy5yZWdpb25TdG9yZSk7XG4gICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSB2aWV3ZXIuY2FtZXJhM2QuY2hhbmdlZC5jb25uZWN0KCgpID0+IHtcbiAgICAgIC8vIE9ubHkgd2hpbGUgbm90aGluZyBpcyBiZWluZyBkcmF3biDigJQgY2xlYXJpbmcgbWlkLWdlc3R1cmUgd291bGQgZGVsZXRlIHRoZVxuICAgICAgLy8gc2hhcGUgdW5kZXIgdGhlIHVzZXIncyBjdXJzb3IuXG4gICAgICBpZiAodGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkubGVuZ3RoID4gMCkgdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKFtdKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBNb3ZlbWVudCwgaW4gc2NyZWVuIHBpeGVscywgdW5kZXIgd2hpY2ggYSBwcmVzcy1yZWxlYXNlIGlzIGEgQ0xJQ0sgYW5kIG5vdCBhXG4gICAqICBkcmFnLiBBbiBvcmJpdCBvciBhIHBhbiBzdGFydHMgdGhlIHNhbWUgd2F5LCBzbyB0aGUgdHdvIGhhdmUgdG8gYmUgdG9sZFxuICAgKiAgYXBhcnQgYnkgaG93IGZhciB0aGUgcG9pbnRlciB0cmF2ZWxsZWQuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMSUNLX1NMT1BfUFggPSA0O1xuICAvKiogTG9uZ2VzdCBwcmVzcy1yZWxlYXNlIHN0aWxsIHRyZWF0ZWQgYXMgYSBjbGljay4gQSBsb25nIHByZXNzIHdpdGggdGhlIG1vdXNlXG4gICAqICBoZWxkIHN0aWxsIGlzIG1vcmUgbGlrZWx5IGFuIGludGVycnVwdGVkIGRyYWcgdGhhbiBhIHNlbGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xJQ0tfTUFYX01TID0gNjAwO1xuICAvKiogUG9pbnRlciBkaXN0YW5jZSwgaW4gc2NyZWVuIHBpeGVscywgdGhhdCBzdGlsbCBjb3VudHMgYXMgXCJvblwiIGEgbWFya2VyLlxuICAgKiAgR2VuZXJvdXMgcmVsYXRpdmUgdG8gYSAxLjVweCBkaXNjOiB0aGUgY3Vyc29yIGlzIGEgYmx1bnQgaW5zdHJ1bWVudCwgYW5kIGFcbiAgICogIHRvb2x0aXAgeW91IGhhdmUgdG8gaHVudCBmb3IgaXMgd29yc2UgdGhhbiBub25lLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIT1ZFUl9SQURJVVNfUFggPSAxMDtcblxuICAvKipcbiAgICogQ3Vyc29yIHRvb2x0aXAgZm9yIHRoZSBzcGF0aWFsIHZpZXdzOiBob3ZlciBhIG1hcmtlciwgcmVhZCBpdHMgY2xhc3MuXG4gICAqXG4gICAqIEEgMzQtZW50cnkgbGVnZW5kIGNhbm5vdCBiZSByZWFkIGJhY2sgZnJvbSBhIGRvdCDigJQgc2V2ZXJhbCBjbGFzc2VzIGdldFxuICAgKiBzaW1pbGFyIGNvbG91cnMsIGFuZCBtYXRjaGluZyBvbmUgdG8gYSBzd2F0Y2ggYnkgZXllIGlzIGV4YWN0bHkgdGhlIHRhc2sgdGhpc1xuICAgKiByZW1vdmVzLiBJdCByZXBvcnRzIHdoYXRldmVyIHRoZSBjbG91ZCBpcyBDVVJSRU5UTFkgY29sb3VyZWQgYnksIHNvIGl0IGFuZFxuICAgKiB0aGUgbGVnZW5kIGNhbiBuZXZlciBzYXkgZGlmZmVyZW50IHRoaW5ncy5cbiAgICpcbiAgICogTGlzdGVucyBvbiB0aGUgSE9TVCByYXRoZXIgdGhhbiB0aGUgY2FudmFzIHNvIGl0IGtlZXBzIHdvcmtpbmcgb3ZlciB0aGUgcmVnaW9uXG4gICAqIG92ZXJsYXkgKGFuIFNWRyBjb3ZlcmluZyB0aGUgY2FudmFzLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdyBldmVyeVxuICAgKiBtb3ZlKSwgYW5kIHRocm90dGxlcyB0byBvbmUgaGl0LXRlc3QgcGVyIGFuaW1hdGlvbiBmcmFtZTogYSBwb2ludGVybW92ZSBjYW5cbiAgICogZmlyZSBmYXIgbW9yZSBvZnRlbiB0aGFuIHRoYXQsIGFuZCBlYWNoIHRlc3QgaXMgYSBwYXNzIG92ZXIgdGhlIGNsb3VkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU3BhdGlhbEhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwID0gbmV3IE5hcGFyaVNwYXRpYWxUb29sdGlwKGhvc3QpO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuaG92ZXJQb2ludGVyID0ge1xuICAgICAgICB4OiBlLmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICAgIHk6IGUuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5ob3ZlckZyYW1lKSByZXR1cm47XG4gICAgICB0aGlzLmhvdmVyRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyKGhvc3QpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkxlYXZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5ob3ZlclBvaW50ZXIgPSBudWxsO1xuICAgICAgdGhpcy5zcGF0aWFsVG9vbHRpcD8uaGlkZSgpO1xuICAgIH07XG5cbiAgICAvLyBBIGNsaWNrIG9uIGEgbWFya2VyIHNlbGVjdHMgaXRzIGNsYXNzLCBleGFjdGx5IGFzIGNsaWNraW5nIHRoYXQgY2xhc3MgaW4gdGhlXG4gICAgLy8gcGFuZWwncyBsZWdlbmQgZG9lcyDigJQgaW5jbHVkaW5nIGNsaWNraW5nIGFnYWluIHRvIGNsZWFyLCBzbyBhIGNsaWNrIGlzXG4gICAgLy8gYWx3YXlzIHJldmVyc2libGUuIFRyYWNrZWQgYXMgZG93bi91cCByYXRoZXIgdGhhbiBib3VuZCB0byBgY2xpY2tgIHNvIGEgRFJBR1xuICAgIC8vIChhbiBvcmJpdCBpbiAzRCwgYSBwYW4gaW4gMkQpIGNhbiBiZSB0b2xkIGFwYXJ0IGZyb20gYSBjbGljazogdGhlIGdlc3R1cmVcbiAgICAvLyBoYXMgdG8gbW92ZSBsZXNzIHRoYW4gYSBmZXcgcGl4ZWxzIGFuZCBiZSBvdmVyIHF1aWNrbHkuXG4gICAgbGV0IGRvd246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb25Eb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGRvd24gPSB7IHg6IGUuY2xpZW50WCwgeTogZS5jbGllbnRZLCB0OiBEYXRlLm5vdygpIH07XG4gICAgfTtcbiAgICBjb25zdCBvblVwID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZG93bjtcbiAgICAgIGRvd24gPSBudWxsO1xuICAgICAgaWYgKCFzdGFydCkgcmV0dXJuO1xuICAgICAgY29uc3QgbW92ZWQgPSBNYXRoLmh5cG90KGUuY2xpZW50WCAtIHN0YXJ0LngsIGUuY2xpZW50WSAtIHN0YXJ0LnkpO1xuICAgICAgaWYgKG1vdmVkID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfU0xPUF9QWCkgcmV0dXJuO1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydC50ID4gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuQ0xJQ0tfTUFYX01TKSByZXR1cm47XG4gICAgICAvLyBBIHJlZ2lvbiB0b29sIG93bnMgdGhlIHBvaW50ZXIgd2hpbGUgaXQgaXMgYWN0aXZlLCBhbmQgcGxhY2luZyBhIHBvbHlnb25cbiAgICAgIC8vIHZlcnRleCBpcyBhbHNvIGEgY2xpY2sgdGhhdCBkb2VzIG5vdCBtb3ZlLlxuICAgICAgaWYgKHRoaXMucmVnaW9uT3ZlcmxheT8udG9vbEFjdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RDbGFzc0F0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBvbkxlYXZlKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIG9uVXApO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Nb3ZlKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSkpO1xuICAgIHRoaXMuaG92ZXJPZmYucHVzaCgoKSA9PiBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25Eb3duKSk7XG4gICAgdGhpcy5ob3Zlck9mZi5wdXNoKCgpID0+IGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25VcCkpO1xuXG4gICAgLy8gSW4gM0QgdGhlIGNhY2hlZCBwb3NpdGlvbnMgYXJlIHNjcmVlbiBwaXhlbHMsIHNvIGFuIG9yYml0IGludmFsaWRhdGVzIHRoZW0uXG4gICAgY29uc3QgY2FtZXJhID0gdGhpcy52aWV3ZXI/LmNhbWVyYTNkO1xuICAgIGlmIChjYW1lcmEgJiYgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgIGNvbnN0IG9mZiA9IGNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgICB0aGlzLnNwYXRpYWxTY2VuZVJldisrO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmhvdmVyT2ZmLnB1c2gob2ZmKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwYXRpYWxIb3ZlcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9mZiBvZiB0aGlzLmhvdmVyT2ZmKSBvZmYoKTtcbiAgICB0aGlzLmhvdmVyT2ZmID0gW107XG4gICAgaWYgKHRoaXMuaG92ZXJGcmFtZSkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5ob3ZlckZyYW1lKTtcbiAgICB0aGlzLmhvdmVyRnJhbWUgPSAwO1xuICAgIHRoaXMuaG92ZXJQb2ludGVyID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxUb29sdGlwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zcGF0aWFsVG9vbHRpcCA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9ucyA9IG51bGw7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9uc1JldiA9IC0xO1xuICAgIHRoaXMuaG92ZXJJbmRleCA9IG51bGw7XG4gIH1cblxuICAvKiogSGl0LXRlc3QgdGhlIGxhc3QgcG9pbnRlciBwb3NpdGlvbiBhbmQgc2hvdyBvciBoaWRlIHRoZSB0b29sdGlwLiAqL1xuICBwcml2YXRlIHVwZGF0ZUhvdmVyKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5zcGF0aWFsVG9vbHRpcDtcbiAgICBjb25zdCBwb2ludGVyID0gdGhpcy5ob3ZlclBvaW50ZXI7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIGlmICghdGlwIHx8ICFwb2ludGVyIHx8ICFkYXRhc2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBpczNkID0gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSk7XG4gICAgLy8gVHJhbnNjcmlwdCBtYXJrZXJzIHNpdCBvbiB0b3Agb2YgZXZlcnl0aGluZywgc28gdGhleSBhcmUgYXNrZWQgZmlyc3QuXG4gICAgaWYgKCFpczNkICYmIHRoaXMuc3BhdGlhbFRpbGVzTWdyICYmIHRoaXMudmlld2VyKSB7XG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMudmlld2VyLmNhbnZhc1RvV29ybGQocG9pbnRlci5jbGllbnRYLCBwb2ludGVyLmNsaWVudFkpO1xuICAgICAgY29uc3Qgem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tO1xuICAgICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgICAgY29uc3QgbGluZXMgPSB3b3JsZCA/IHRoaXMuc3BhdGlhbFRpbGVzTWdyLmhvdmVyQXQod29ybGRbMF0sIHdvcmxkWzFdLCByYWRpdXMsIChkZXRhaWxzKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmhvdmVyUG9pbnRlcjtcbiAgICAgICAgaWYgKCFwIHx8ICF0aGlzLnNwYXRpYWxUb29sdGlwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHIgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLnNwYXRpYWxUb29sdGlwLnNob3coZGV0YWlscywgcC5jbGllbnRYIC0gci5sZWZ0LCBwLmNsaWVudFkgLSByLnRvcCk7XG4gICAgICB9KSA6IG51bGw7XG4gICAgICBpZiAobGluZXMpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRpcC5zaG93KGxpbmVzLCBwb2ludGVyLmNsaWVudFggLSByZWN0LmxlZnQsIHBvaW50ZXIuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuaG92ZXJQb3NpdGlvbnNGb3IoZGF0YXNldC5vYnNlcnZhdGlvbnMpO1xuICAgIGlmICghcG9zaXRpb25zKSB7XG4gICAgICB0aXAuaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAzRCBjb21wYXJlcyBzY3JlZW4gcGl4ZWxzIGRpcmVjdGx5OyAyRCBob2xkcyB3b3JsZCBwb3NpdGlvbnMsIHNvIHRoZSByYWRpdXNcbiAgICAvLyBpcyBjb252ZXJ0ZWQgb25jZSBpbnN0ZWFkIG9mIHByb2plY3RpbmcgdGhlIHdob2xlIGNsb3VkLlxuICAgIGNvbnN0IHpvb20gPSBpczNkID8gMSA6ICh0aGlzLnZpZXdlcj8uY2FtZXJhLnpvb20gPz8gMSk7XG4gICAgY29uc3QgcmFkaXVzID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuSE9WRVJfUkFESVVTX1BYIC8gKHpvb20gPiAwID8gem9vbSA6IDEpO1xuICAgIGxldCB4ID0gcG9pbnRlci54O1xuICAgIGxldCB5ID0gcG9pbnRlci55O1xuICAgIGlmICghaXMzZCkge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlcj8uY2FudmFzVG9Xb3JsZChwb2ludGVyLmNsaWVudFgsIHBvaW50ZXIuY2xpZW50WSk7XG4gICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgIHRpcC5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFt4LCB5XSA9IHdvcmxkO1xuICAgIH1cblxuICAgIGNvbnN0IGhpdCA9IHRoaXMucGlja09ic2VydmF0aW9uKHBvc2l0aW9ucywgeCwgeSwgcmFkaXVzLCBpczNkKTtcbiAgICBjb25zdCBsaW5lcyA9IGhvdmVyVGV4dCh0aGlzLmhvdmVyU291cmNlLCBoaXQpO1xuICAgIGlmICghbGluZXMpIHtcbiAgICAgIHRpcC5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRpcC5zaG93KGxpbmVzLCBwb2ludGVyLmNsaWVudFggLSByZWN0LmxlZnQsIHBvaW50ZXIuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNsYXNzIG9mIHRoZSBtYXJrZXIgYXQgYSBjbGllbnQgcG9zaXRpb24g4oCUIHRoZSBjYW52YXMgZXF1aXZhbGVudCBvZlxuICAgKiBjbGlja2luZyB0aGF0IGNsYXNzIGluIHRoZSBwYW5lbCdzIGxlZ2VuZCwgYW5kIHRoZSBzYW1lIHNlbGVjdGlvbiBvYmplY3QsIHNvXG4gICAqIHRoZSB0d28gY29udHJvbHMgY2Fubm90IHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHMuXG4gICAqXG4gICAqIENsaWNraW5nIGEgY2xhc3MgdGhhdCBpcyBhbHJlYWR5IHRoZSB3aG9sZSBzZWxlY3Rpb24gQ0xFQVJTIGl0LCB3aGljaCBpcyB3aGF0XG4gICAqIHRoZSBsZWdlbmQgZG9lcy4gQ29tcGFyZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIGl0c2VsZiByYXRoZXIgdGhhbiBhZ2FpbnN0IGFcbiAgICogcmVtZW1iZXJlZCBjbGljaywgc28gc2VsZWN0aW5nIGZyb20gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGUgc2FtZVxuICAgKiBjbGFzcyBvbiB0aGUgY2FudmFzIHN0aWxsIHRvZ2dsZXMuXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdENsYXNzQXQoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmhvdmVyU291cmNlO1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zZWxlY3Rpb25TdG9yZTtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5zcGF0aWFsTGF0ZXN0Py5bMF07XG4gICAgLy8gT25seSBhIGNhdGVnb3JpY2FsIHNvdXJjZSBoYXMgY2xhc3NlcyB0byBzZWxlY3QuIEEgZ2VuZSBpcyBjb250aW51b3VzOlxuICAgIC8vIHRoZXJlIGlzIG5vIHNldCBvZiBjZWxscyB0aGF0IFwiaXNcIiBhIHZhbHVlLlxuICAgIGlmICghc3RvcmUgfHwgIWRhdGFzZXQgfHwgc291cmNlPy5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmhvdmVyUG9zaXRpb25zRm9yKGRhdGFzZXQub2JzZXJ2YXRpb25zKTtcbiAgICBpZiAoIXBvc2l0aW9ucykgcmV0dXJuO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgIGlmICghY2FudmFzKSByZXR1cm47XG4gICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpczNkID0gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSk7XG4gICAgY29uc3Qgem9vbSA9IGlzM2QgPyAxIDogKHRoaXMudmlld2VyPy5jYW1lcmEuem9vbSA/PyAxKTtcbiAgICBjb25zdCByYWRpdXMgPSBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5IT1ZFUl9SQURJVVNfUFggLyAoem9vbSA+IDAgPyB6b29tIDogMSk7XG4gICAgbGV0IHggPSBjbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGxldCB5ID0gY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGlmICghaXMzZCkge1xuICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLnZpZXdlcj8uY2FudmFzVG9Xb3JsZChjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIGlmICghd29ybGQpIHJldHVybjtcbiAgICAgIFt4LCB5XSA9IHdvcmxkO1xuICAgIH1cblxuICAgIGNvbnN0IGhpdCA9IG5lYXJlc3RPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cyk7XG4gICAgaWYgKGhpdCA8IDApIHJldHVybjtcbiAgICBjb25zdCBjb2RlID0gc291cmNlLmNvZGVzW2hpdF07XG4gICAgLy8gQSBjZWxsIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGNvdmVyIGhhcyBubyBjbGFzcyB0byBzZWxlY3QuXG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCB8fCBjb2RlID09PSBOT19DQVRFR09SWSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV4dCA9IHNlbGVjdEJ5Q2F0ZWdvcnkoc291cmNlLmNvZGVzLCBjb2RlKTtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RvcmUuY3VycmVudCgpO1xuICAgIGlmIChzYW1lU2VsZWN0aW9uKGN1cnJlbnQsIG5leHQpKSB7XG4gICAgICBzdG9yZS5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdG9yZS5zZXQobmV4dCk7XG4gIH1cblxuICAvKipcbiAgICogV2hpY2ggb2JzZXJ2YXRpb24gaXMgdW5kZXIgdGhlIGN1cnNvci5cbiAgICpcbiAgICogSW4gM0QgdGhpcyBkZWZlcnMgdG8gbmFwYXJpLWpzJ3Mge0BsaW5rIG5lYXJlc3RQcm9qZWN0ZWRJbmRleH0gV0lUSCB0aGUgZGVwdGhzIHRoZVxuICAgKiBwcm9qZWN0aW9uIHByb2R1Y2VkLCBzbyB0aGUgZnJvbnQtbW9zdCBjYW5kaWRhdGUgd2lucy4gVGhhdCBtYXR0ZXJzIG1vcmUgdGhhbiBpdFxuICAgKiBzb3VuZHM6IHRoZSByZW5kZXJlciBkZXB0aC10ZXN0cyB0aGUgYmlsbGJvYXJkcywgYW5kIGluIGEgMy43TS1wb2ludCBjbG91ZCB0aGUgY3Vyc29yXG4gICAqIGNvdmVycyBtYW55IG9mIHRoZW0g4oCUIHBpY2tpbmcgdGhlIG9uZSBuZWFyZXN0IHRoZSBjdXJzb3IncyBjZW50cmUgcmVndWxhcmx5IG5hbWVzIGFcbiAgICogY2VsbCB0aGF0IHNvbWV0aGluZyBlbHNlIGlzIGRyYXduIG92ZXIsIHdoaWNoIHJlYWRzIGFzIGEgd3JvbmcgdG9vbHRpcCByYXRoZXIgdGhhbiBhc1xuICAgKiBhIHN1YnRsZXR5IG9mIHBpY2tpbmcuXG4gICAqXG4gICAqIEluIDJEIHRoZSBwb3NpdGlvbnMgYXJlIFdPUkxEIGNvb3JkaW5hdGVzIG9uIG9uZSBwbGFuZSwgc28gdGhlcmUgaXMgbm8gZGVwdGggdG8gYnJlYWtcbiAgICogdGllcyB3aXRoIGFuZCB0aGUgZXhpc3RpbmcgbmVhcmVzdC1tYXJrZXIgcnVsZSBpcyB0aGUgcmlnaHQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrT2JzZXJ2YXRpb24oXG4gICAgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXksXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBpczNkOiBib29sZWFuLFxuICApOiBudW1iZXIge1xuICAgIGlmICghaXMzZCkgcmV0dXJuIG5lYXJlc3RPYnNlcnZhdGlvbihwb3NpdGlvbnMsIHgsIHksIHJhZGl1cyk7XG4gICAgLy8gVGhlIGNsb3VkIGRyYXdzIGEgc2VsZWN0ZWQgbWFya2VyIExBUkdFUiwgc28gdGhlIHBpY2sgaGFzIHRvIHVzZSB0aGUgc2FtZSByYWRpdXMgdGhlXG4gICAgLy8gcmVuZGVyZXIgdXNlZCDigJQgb3RoZXJ3aXNlIHRoZSBoaWdobGlnaHRlZCBjZWxscywgdGhlIG9uZXMgYSByZWFkZXIgaXMgbW9zdCBsaWtlbHkgdG9cbiAgICAvLyBiZSBwb2ludGluZyBhdCwgYXJlIHRoZSBoYXJkZXN0IHRvIGhvdmVyLlxuICAgIGNvbnN0IHNjYWxlID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9TRUxFQ1RFRF9TSVpFX1NDQUxFO1xuICAgIGNvbnN0IG1hc2sgPSB0aGlzLnNlbGVjdGlvblN0b3JlPy5jdXJyZW50KCk/Lm1hc2s7XG4gICAgY29uc3Qgb3B0cyA9IG1hc2s/Lmxlbmd0aFxuICAgICAgPyB7IHJhZGl1c0F0OiAoaTogbnVtYmVyKSA9PiAobWFza1tpXSA/IHJhZGl1cyAqIHNjYWxlIDogcmFkaXVzKSB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICAvLyBgcmFkaXVzYCBzdGlsbCBib3VuZHMgd2hpY2ggYnVja2V0cyBhcmUgdmlzaXRlZCwgc28gaXQgaGFzIHRvIGJlIHRoZSBMQVJHRVNUIGFueVxuICAgIC8vIHBvaW50IGNhbiBjbGFpbSwgbm90IHRoZSBiYXNlIG9uZS5cbiAgICBjb25zdCByZWFjaCA9IG1hc2s/Lmxlbmd0aCA/IHJhZGl1cyAqIHNjYWxlIDogcmFkaXVzO1xuICAgIGlmICh0aGlzLmhvdmVySW5kZXgpIHJldHVybiB0aGlzLmhvdmVySW5kZXgucGljayh4LCB5LCByZWFjaCwgb3B0cyk7XG4gICAgcmV0dXJuIG5lYXJlc3RQcm9qZWN0ZWRJbmRleChwb3NpdGlvbnMsIHgsIHksIHJlYWNoLCB0aGlzLnNwYXRpYWxEZXB0aHMzZCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb25zIHRvIGhpdC10ZXN0IGFnYWluc3QsIHJlYnVpbHQgb25seSB3aGVuIHRoZSBzY2VuZSBvciBjYW1lcmEgbW92ZWQuXG4gICAqXG4gICAqIEEgcGFzcyBvdmVyIDMuN00gb2JzZXJ2YXRpb25zIGlzIG5vdCBzb21ldGhpbmcgdG8gZG8gcGVyIHBvaW50ZXJtb3ZlLCBhbmQgdGhlXG4gICAqIGNsb3VkIGRvZXMgbm90IG1vdmUgYmV0d2VlbiBmcmFtZXMgdW5sZXNzIHNvbWV0aGluZyBzYXlzIGl0IGRpZC5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJQb3NpdGlvbnNGb3Iob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaG92ZXJQb3NpdGlvbnMgJiYgdGhpcy5ob3ZlclBvc2l0aW9uc1JldiA9PT0gdGhpcy5zcGF0aWFsU2NlbmVSZXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmhvdmVyUG9zaXRpb25zO1xuICAgIH1cbiAgICBjb25zdCBpczNkID0gaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSk7XG4gICAgY29uc3QgYnVpbHQgPSBpczNkXG4gICAgICA/IHRoaXMuZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzKVxuICAgICAgOiB0aGlzLmhvdmVyV29ybGRQb3NpdGlvbnMob2JzKTtcbiAgICB0aGlzLmhvdmVyUG9zaXRpb25zID0gYnVpbHQ7XG4gICAgdGhpcy5ob3ZlclBvc2l0aW9uc1JldiA9IHRoaXMuc3BhdGlhbFNjZW5lUmV2O1xuICAgIC8vIEJ1aWx0IGhlcmUsIGluIHRoZSBzYW1lIGxhenkgc2xvdCwgc28gaXQgaXMgcGFpZCBmb3Igb24gdGhlIGZpcnN0IGhvdmVyIGFmdGVyIHRoZVxuICAgIC8vIHNjZW5lIG1vdmVkIGFuZCBub3Qgb24gZXZlcnkgZnJhbWUgb2YgYW4gb3JiaXQuIE9ubHkgd29ydGggaXQgcGFzdCB0aGUgcG9pbnQgd2hlcmVcbiAgICAvLyB0aGUgbGluZWFyIHNjYW4gc3RvcHMgYmVpbmcgZnJlZTsgYmVsb3cgdGhhdCB0aGUgYnVpbGQgY29zdHMgbW9yZSB0aGFuIGl0IHNhdmVzLlxuICAgIHRoaXMuaG92ZXJJbmRleCA9IG51bGw7XG4gICAgaWYgKGlzM2QgJiYgYnVpbHQgJiYgdGhpcy5jYW52YXMgJiYgYnVpbHQubGVuZ3RoIC8gMiA+PSBTQ1JFRU5fSU5ERVhfTUlOX1BPSU5UUykge1xuICAgICAgY29uc3QgdyA9IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHRoaXMuY2FudmFzLndpZHRoO1xuICAgICAgY29uc3QgaCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCB0aGlzLmNhbnZhcy5oZWlnaHQ7XG4gICAgICBpZiAodyAmJiBoKSB7XG4gICAgICAgIHRoaXMuaG92ZXJJbmRleCA9IG5ldyBTY3JlZW5JbmRleChcbiAgICAgICAgICB7IHNjcmVlbjogYnVpbHQsIGRlcHRoOiB0aGlzLnNwYXRpYWxEZXB0aHMzZCA/PyBuZXcgRmxvYXQzMkFycmF5KGJ1aWx0Lmxlbmd0aCAvIDIpIH0sXG4gICAgICAgICAgdyxcbiAgICAgICAgICBoLFxuICAgICAgICAgIC8vIFRoZSBsYXJnZXN0IHJhZGl1cyBhbnkgcGljayBoZXJlIGNhbiBjbGFpbTogdGhlIGJhc2UgaG92ZXIgcmFkaXVzLCB0aW1lcyB0aGVcbiAgICAgICAgICAvLyBzY2FsZSBhIFNFTEVDVEVEIG1hcmtlciBpcyBkcmF3biBhdC4gU3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gdGhlIGRlZmF1bHQsXG4gICAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyB3aGF0IGRlY2lkZXMgd2hldGhlciBhIG1hcmtlciBzdHJhZGRsaW5nIHRoZSBjYW52YXMgZWRnZSBpc1xuICAgICAgICAgIC8vIGZvdW5kIOKAlCBpdHMgY2VudHJlIGlzIG9mZiBzY3JlZW4gd2hpbGUgcGFydCBvZiBpdCBpcyBub3QuXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4UmVhY2g6IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkhPVkVSX1JBRElVU19QWFxuICAgICAgICAgICAgICAqIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVpbHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIDJEIG1hcmtlcnMnIFdPUkxEIHBvc2l0aW9ucywgaW5kZXhlZCBieSBvYnNlcnZhdGlvbiwgTmFOIGZvciBhbnkgbm90IG9uXG4gICAqIHRoZSBkaXNwbGF5ZWQgcGxhbmUg4oCUIHRoZSBzYW1lIGFmZmluZSBhbmQgdGhlIHNhbWUgc3Vic2V0IHRoZSBtYXJrZXIgbGF5ZXIgd2FzXG4gICAqIGJ1aWx0IGZyb20sIHNvIHRoZSB0b29sdGlwIGNhbm5vdCBwb2ludCBhdCBhIGNlbGwgdGhhdCBpcyBub3QgZHJhd24uXG4gICAqL1xuICBwcml2YXRlIGhvdmVyV29ybGRQb3NpdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuc3BhdGlhbExhdGVzdD8uWzBdO1xuICAgIGlmICghZGF0YXNldCB8fCBvYnMuY291bnQgPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNsYWIgPSB0aGlzLnNwYXRpYWxTbGFiKGRhdGFzZXQpO1xuICAgIGNvbnN0IHJlZiA9IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IFtzeCwgc3ldID0gcmVmPy5zY2FsZSA/PyBbMSwgMV07XG4gICAgY29uc3QgW3R4LCB0eV0gPSByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF07XG4gICAgY29uc3QgZHJhd24gPSBzbGFiPy5pbmRpY2VzID8/IG51bGw7XG4gICAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQgKiAyKS5maWxsKE5hTik7XG4gICAgY29uc3QgbiA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICBjb25zdCBpID0gZHJhd24gPyBkcmF3bltrXSA6IGs7XG4gICAgICBvdXRbaSAqIDJdID0gb2JzLnhbaV0gKiBzeCArIHR4O1xuICAgICAgb3V0W2kgKiAyICsgMV0gPSBvYnMueVtpXSAqIHN5ICsgdHk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgdG9vbHRpcCBzYXlzLCByZXNvbHZlZCBvbmNlIHBlciBjb2xvdXIgc291cmNlIHJhdGhlciB0aGFuIHBlciBob3Zlci5cbiAgICpcbiAgICogRmV0Y2hlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGNvbG91cmluZyBvbiBwdXJwb3NlOiB0aGUgcmVmZXJlbmNlIHBvcnQgY2FjaGVzXG4gICAqIGNvbHVtbnMsIGJ1dCBhIGhvc3QncyBuZWVkIG5vdCwgYW5kIHJlLWZldGNoaW5nIGEgMy43TS1lbGVtZW50IHZlY3RvciBiZWNhdXNlXG4gICAqIHRoZSBwb2ludGVyIG1vdmVkIHdvdWxkIGJlIGluZGVmZW5zaWJsZSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlSG92ZXJTb3VyY2UoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGNvbnN0IGtleSA9IGRhdGFzZXQgJiYgY29sb3JCeVxuICAgICAgPyBgJHtkYXRhc2V0LmlkfXwke2NvbG9yQnkua2luZH06JHtjb2xvckJ5Lm5hbWV9YFxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuaG92ZXJTb3VyY2VLZXkpIHJldHVybjtcbiAgICAvLyBUaGUga2V5IGlzIGNvbW1pdHRlZCBvbmx5IHdoZXJlIGEgdmFsdWUgaXMgYWN0dWFsbHkgc3RvcmVkLiBTZXR0aW5nIGl0IHVwXG4gICAgLy8gZnJvbnQgd291bGQgbWVhbiBhIHJlc29sdXRpb24gdGhhdCBsb3NlcyB0aGUgcmFjZSBsZWF2ZXMgdGhlIGtleSBjbGFpbWluZyBhXG4gICAgLy8gc291cmNlIHRoYXQgd2FzIG5ldmVyIHN0b3JlZCDigJQgYW5kIHNpbmNlIGV2ZXJ5IGxhdGVyIGVtaXNzaW9uIGNhcnJpZXMgdGhlXG4gICAgLy8gc2FtZSBrZXksIGl0IHdvdWxkIHNob3J0LWNpcmN1aXQgaGVyZSBmb3JldmVyIGFuZCB0aGUgdG9vbHRpcCB3b3VsZCBzdGF5XG4gICAgLy8gc2lsZW50IGZvciB0aGUgcmVzdCBvZiB0aGUgc2Vzc2lvbi5cbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy5ob3ZlclNvdXJjZVRva2VuO1xuICAgIC8vIE5vIGNvbG91ciBzb3VyY2UgbWVhbnMgbm90aGluZyBpcyBiZWluZyBzYWlkIGFib3V0IHRoZSBjZWxscywgc28gdGhlcmUgaXMgbm9cbiAgICAvLyBjbHVzdGVyIHRvIG5hbWUgYW5kIHRoZSB0b29sdGlwIHN0YXlzIHNpbGVudC5cbiAgICBpZiAoIWtleSB8fCAhZGF0YXNldCB8fCAhY29sb3JCeSB8fCAhcG9ydCkge1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IG51bGw7XG4gICAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0ga2V5O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKGNvbG9yQnkua2luZCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgICAgaWYgKHRva2VuICE9PSB0aGlzLmhvdmVyU291cmNlVG9rZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAga2luZDogJ2NhdGVnb3JpY2FsJyxcbiAgICAgICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IGNvbHVtbi5tZXRhLmNhdGVnb3JpZXMsXG4gICAgICAgICAgICBjb2RlczogY29sdW1uLmNvZGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb250aW51b3VzJyxcbiAgICAgICAgICAgIG5hbWU6IGNvbG9yQnkubmFtZSxcbiAgICAgICAgICAgIHZhbHVlczogY29sdW1uLnZhbHVlcyxcbiAgICAgICAgICAgIC4uLihjb2x1bW4ubWV0YS51bml0ID8geyB1bml0OiBjb2x1bW4ubWV0YS51bml0IH0gOiB7fSksXG4gICAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IGtleTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgICBpZiAodG9rZW4gIT09IHRoaXMuaG92ZXJTb3VyY2VUb2tlbikgcmV0dXJuO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZSA9IHtcbiAgICAgICAga2luZDogJ2NvbnRpbnVvdXMnLFxuICAgICAgICBuYW1lOiBjb2xvckJ5Lm5hbWUsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgLi4uKGRhdGFzZXQuZmVhdHVyZXM/LnVuaXQgPyB7IHVuaXQ6IGRhdGFzZXQuZmVhdHVyZXMudW5pdCB9IDoge30pLFxuICAgICAgfTtcbiAgICAgIHRoaXMuaG92ZXJTb3VyY2VLZXkgPSBrZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBpZiAodG9rZW4gIT09IHRoaXMuaG92ZXJTb3VyY2VUb2tlbikgcmV0dXJuO1xuICAgICAgLy8gVGhlIHRvb2x0aXAgaXMgYW4gZXh0cmE7IGEgZmFpbGVkIGZldGNoIG11c3Qgbm90IGRpc3R1cmIgdGhlIHJlbmRlci4gVGhlXG4gICAgICAvLyBrZXkgaXMgbGVmdCB1bnNldCBzbyBhIGxhdGVyIGVtaXNzaW9uIHJldHJpZXMgcmF0aGVyIHRoYW4gaW5oZXJpdGluZyBhXG4gICAgICAvLyBwZXJtYW5lbnQgc2lsZW5jZS5cbiAgICAgIHRoaXMuaG92ZXJTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5ob3ZlclNvdXJjZUtleSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3QgZXZlcnkgb2JzZXJ2YXRpb24gdG8gY2FudmFzIHBpeGVscyB1bmRlciB0aGUgY3VycmVudCAzRCBjYW1lcmEuXG4gICAqXG4gICAqIFRoZSBwcm9qZWN0aW9uIGl0c2VsZiBpcyB0aGUgcmVuZGVyZXInczogYHZpZXdlci5wcm9qZWN0UG9pbnRzYCBvd25zIHRoZSBjYW1lcmEsIHRoZVxuICAgKiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCB0aGUgcGVyc3BlY3RpdmUgZGl2aWRlIGFuZCB0aGUgeS1mbGlwLiBUaGlzIHVzZWQgdG8gYmUgZmlmdGVlblxuICAgKiBsaW5lcyBvZiBjb2x1bW4tbWFqb3IgbWF0cml4IGFyaXRobWV0aWMgaGVyZSwgZHVwbGljYXRpbmcgYSBzZWNvbmQgY29weSBpblxuICAgKiBgbmFwYXJpLWF4ZXMtbGFiZWxzYCDigJQgYW5kIHRoZSB0d28gaGFkIGRyaWZ0ZWQgb24gd2hhdCB0byBkbyB3aXRoIGEgTmFOIHcuXG4gICAqXG4gICAqIFdoYXQgaXMgbGVmdCBpcyB0aGUgcGFydCB0aGF0IGlzIGdlbnVpbmVseSB0aGlzIGFkYXB0ZXInczogU0NBVFRFUklORyB0aGUgZHJhd24gc3Vic2V0XG4gICAqIGJhY2sgaW50byBvYnNlcnZhdGlvbiBvcmRlci4gVGhlIGNsb3VkIGhvbGRzIG9ubHkgdGhlIHBvaW50cyBvZiB0aGUgZGlzcGxheWVkIHNlY3Rpb24sXG4gICAqIGluIGl0cyBvd24gcGFja2luZzsgZXZlcnkgY29uc3VtZXIgaW5kZXhlcyBieSBvYnNlcnZhdGlvbi4gTmFOIHN0YW5kcyBmb3IgXCJub3Qgb25cbiAgICogc2NyZWVuXCIsIHdoaWNoIGlzIGFsc28gdGhlIHJpZ2h0IGFuc3dlciBmb3IgYW4gb2JzZXJ2YXRpb24gd2hvc2Ugc2VjdGlvbiBpcyBoaWRkZW4uXG4gICAqXG4gICAqIE51bGwgd2hlbiB0aGUgM0QgY2xvdWQgaXMgbm90IG1vdW50ZWQsIHNvIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byB0aGUgMkQgYWZmaW5lIHBhdGguXG4gICAqL1xuICBnZXRTcGF0aWFsU2NyZWVuUHJvamVjdGlvbihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMpOiBGbG9hdDMyQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXZpZXdlciB8fCAhdGhpcy5zcGF0aWFsUG9zaXRpb25zM2QpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcHJvamVjdGVkID0gdmlld2VyLnByb2plY3RQb2ludHModGhpcy5zcGF0aWFsUG9zaXRpb25zM2QsIHRoaXMuc3BhdGlhbFByb2plY3Rpb24zZCk7XG4gICAgaWYgKCFwcm9qZWN0ZWQpIHJldHVybiBudWxsO1xuICAgIC8vIFJldXNlZCBhY3Jvc3MgY2FtZXJhIGNoYW5nZXM6IGF0IDMuN00gb2JzZXJ2YXRpb25zIHRoaXMgaXMgYSAzMCBNQiBhbGxvY2F0aW9uIHRoYXRcbiAgICAvLyB3b3VsZCBvdGhlcndpc2UgaGFwcGVuIG9uIGV2ZXJ5IG9yYml0LlxuICAgIHRoaXMuc3BhdGlhbFByb2plY3Rpb24zZCA9IHByb2plY3RlZDtcblxuICAgIGNvbnN0IGRyYXduID0gdGhpcy5zcGF0aWFsRHJhd24zZDtcbiAgICBjb25zdCB7IHNjcmVlbiwgZGVwdGggfSA9IHByb2plY3RlZDtcbiAgICBjb25zdCBjb3VudCA9IHNjcmVlbi5sZW5ndGggPj4gMTtcbiAgICBjb25zdCBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCAqIDIpLmZpbGwoTmFOKTtcbiAgICBjb25zdCBkZXB0aHMgPSBuZXcgRmxvYXQzMkFycmF5KG9icy5jb3VudCkuZmlsbChOYU4pO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY291bnQ7IGsrKykge1xuICAgICAgY29uc3QgaSA9IGRyYXduID8gZHJhd25ba10gOiBrO1xuICAgICAgaWYgKGkgPj0gb2JzLmNvdW50KSBjb250aW51ZTtcbiAgICAgIG91dFtpICogMl0gPSBzY3JlZW5bayAqIDJdO1xuICAgICAgb3V0W2kgKiAyICsgMV0gPSBzY3JlZW5bayAqIDIgKyAxXTtcbiAgICAgIGRlcHRoc1tpXSA9IGRlcHRoW2tdO1xuICAgIH1cbiAgICAvLyBLZXB0IGJlc2lkZSB0aGUgc2NyZWVuIHBvc2l0aW9ucyBzbyB0aGUgaG92ZXIgcGljayBjYW4gcHJlZmVyIHRoZSBGUk9OVC1tb3N0IHBvaW50XG4gICAgLy8gdW5kZXIgdGhlIGN1cnNvciByYXRoZXIgdGhhbiB0aGUgb25lIG5lYXJlc3QgaXRzIGNlbnRyZSDigJQgd2hpY2ggaW4gYSBkZW5zZSBjbG91ZCBpc1xuICAgIC8vIHJlZ3VsYXJseSBzb21ldGhpbmcgdGhlIHJlbmRlcmVyIGRyZXcgYW5vdGhlciBwb2ludCBvdmVyLlxuICAgIHRoaXMuc3BhdGlhbERlcHRoczNkID0gZGVwdGhzO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgbWFya2VycyBvbiBhbnkgZGF0YXNldCBvciB2aWV3LXN0YXRlIGNoYW5nZS4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTcGF0aWFsKCk6IHZvaWQge1xuICAgIHRoaXMuc3BhdGlhbFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBpZiAoIXBvcnQpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3Rpb24kID0gdGhpcy5zZWxlY3Rpb25TdG9yZT8uZ2V0U2VsZWN0aW9uJCgpID8/IG9mKGVtcHR5U2VsZWN0aW9uKCkpO1xuICAgIC8vIFRoZSBkaXNwbGF5IGNvbG9ybWFwIGlzIGFuIGlucHV0IGhlcmUsIG5vdCBqdXN0IHNvbWV0aGluZyByZWFkIGF0IGJ1aWxkXG4gICAgLy8gdGltZTogYGNvbnRpbnVvdXNDb2xvcm1hcDogbnVsbGAgbWVhbnMgXCJmb2xsb3cgdGhlIGltYWdlJ3MgY29sb3JtYXBcIiwgYW5kIGFcbiAgICAvLyBzZXR0aW5nIHRoYXQgb25seSB0YWtlcyBlZmZlY3QgYXQgdGhlIG5leHQgdW5yZWxhdGVkIHJlYnVpbGQgaXMgbm90IG9uZS5cbiAgICB0aGlzLnNwYXRpYWxTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHBvcnQuZ2V0RGF0YXNldCQoKSwgdGhpcy5zdG9yZS5nZXRTcGF0aWFsVmlldyQoKSwgc2VsZWN0aW9uJCxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSwgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIGNvbG9ybWFwLCByZXZlcnNlXSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50Q29sb3JtYXAgPSAoY29sb3JtYXAgYXMgQ29sb3JtYXBOb2RlKSA/PyBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50UmV2ZXJzZSA9ICEhcmV2ZXJzZTtcbiAgICAgIC8vIEtlcHQgc28gYSBzbGljZSBjaGFuZ2UgY2FuIHJlZHJhdyB0aGUgbWFya2VycyBmb3IgdGhlIG5ldyBwbGFuZSwgd2hpY2hcbiAgICAgIC8vIGFycml2ZXMgdGhyb3VnaCBzZXRaSW5kZXggcmF0aGVyIHRoYW4gdGhyb3VnaCBhbnkgb2YgdGhlc2Ugc3RyZWFtcy5cbiAgICAgIHRoaXMuc3BhdGlhbExhdGVzdCA9IFtkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb25dO1xuICAgICAgLy8gVGhlIG1hcmtlcnMgYXJlIGFib3V0IHRvIG1vdmUgb3IgY2hhbmdlIG1lYW5pbmcsIHNvIGJvdGggaGFsdmVzIG9mIHRoZVxuICAgICAgLy8gdG9vbHRpcCDigJQgd2hlcmUgdGhlIHBvaW50cyBhcmUsIGFuZCB3aGF0IHRoZXkgYXJlIOKAlCBhcmUgc3RhbGUuXG4gICAgICB0aGlzLnNwYXRpYWxTY2VuZVJldisrO1xuICAgICAgdm9pZCB0aGlzLnJlc29sdmVIb3ZlclNvdXJjZShkYXRhc2V0LCB2aWV3KTtcbiAgICAgIHZvaWQgKGlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpXG4gICAgICAgID8gdGhpcy5yZWJ1aWxkU3BhdGlhbFBvaW50czNkKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbilcbiAgICAgICAgOiB0aGlzLnJlYnVpbGRTcGF0aWFsUG9pbnRzKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbikpO1xuICAgICAgaWYgKCFpc1NwYXRpYWxPbWljczNkKHRoaXMuY3VycmVudFBsb3RUeXBlKSkgdGhpcy5zcGF0aWFsVGlsZXNNZ3I/LnJlZnJlc2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAoUmUpYnVpbGQgdGhlIG9ic2VydmF0aW9uIG1hcmtlciBsYXllciBmb3IgdGhlIGN1cnJlbnQgZGF0YXNldCArIHZpZXcgc3RhdGUuICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFNwYXRpYWxQb2ludHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsLCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgPSBlbXB0eVNlbGVjdGlvbigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW47XG5cbiAgICAvLyBSZXNvbHZlIGNvbG91cnMgQkVGT1JFIHRvdWNoaW5nIHRoZSBzY2VuZTogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlXG4gICAgLy8gc3VwZXJzZWRlZCwgYW5kIGRyb3BwaW5nIHRoZSBleGlzdGluZyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZmFjZUNvbG9yOiBSZXR1cm5UeXBlPHR5cGVvZiB0b1JnYmFUdXBsZXM+IHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nKys7XG4gICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgIHRyeSB7XG4gICAgICBmYWNlQ29sb3IgPSBkYXRhc2V0XG4gICAgICAgID8gYXdhaXQgdGhpcy5zcGF0aWFsRmFjZUNvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24pXG4gICAgICAgIDogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIGNvbG91cmluZyBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBhIGZsYXQgY29sb3VyJywgZXJyKTtcbiAgICAgIGZhY2VDb2xvciA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nLS07XG4gICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgfVxuICAgIC8vIEEgbmV3ZXIgcmVidWlsZCAob3IgYSB0ZWFyZG93bikgc3RhcnRlZCB3aGlsZSB0aGUgdmVjdG9yIHdhcyBpbiBmbGlnaHQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgaWYgKCFkYXRhc2V0IHx8IGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50ID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB7XG4gICAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdlbmVNYXBMYXllcikge1xuICAgICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcExheWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5nZW5lTWFwS2V5ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Lm9ic2VydmF0aW9ucztcbiAgICAvLyBBIGRhdGFzZXQgd2hvc2UgaW1hZ2UgSVMgaXRzIHZvbHVtZSBzaG93cyBPTkUgUExBTkUgYXQgYSB0aW1lLCBzbyB0aGVcbiAgICAvLyBtYXJrZXJzIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGluIHRoZSBkaXNwbGF5ZWQgcGxhbmUsIGRyYXduIGluIHRoYXQgcGxhbmUnc1xuICAgIC8vIHBpeGVsIGdyaWQuIFdpdGhvdXQgdGhlIGZpbHRlciB0aGUgc3BlY2ltZW4ncyB3aG9sZSBkZXB0aCBwaWxlcyBvbnRvIG9uZVxuICAgIC8vIHNlY3Rpb24gYW5kIHJlYWRzIGFzIGEgc21lYXI7IHdpdGhvdXQgdGhlIGFmZmluZSB0aGUgY29vcmRpbmF0ZXMgYXJlIHJlYWRcbiAgICAvLyBhcyBwaXhlbHMgYW5kIGxhbmQgb2ZmIHRoZSBzbGljZSBlbnRpcmVseS5cbiAgICBjb25zdCBzbGFiID0gdGhpcy5zcGF0aWFsU2xhYihkYXRhc2V0KTtcbiAgICAvLyBUaGUgZ2VuZSBtYXAgZ29lcyBVTkRFUiB0aGUgY2VsbHMsIHNvIGl0IGlzIHNldHRsZWQgYmVmb3JlIHRoZXkgYXJlIGFkZGVkLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlR2VuZU1hcCh2aWV3ZXIsIGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiwgc2xhYik7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIGNvbnN0IHJlZiA9IHNsYWI/LnJlZiA/PyBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IGJhc2UgPSBtYXJrZXJEaWFtZXRlcnMob2JzLCBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX0ZBTExCQUNLX1JBRElVUyk7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBmbG9vciA9IHNsYWI/Lm1pbkRpYW1ldGVyID8/IDA7XG4gICAgY29uc3Qgc2l6ZU9mID0gKGk6IG51bWJlcikgPT5cbiAgICAgIE1hdGgubWF4KHR5cGVvZiBiYXNlID09PSAnbnVtYmVyJyA/IGJhc2UgOiBiYXNlW2ldLCBmbG9vcikgKiBzY2FsZTtcbiAgICBjb25zdCBzaXplOiBudW1iZXIgfCBGbG9hdDMyQXJyYXkgPVxuICAgICAgdHlwZW9mIGJhc2UgPT09ICdudW1iZXInICYmICFzbGFiXG4gICAgICAgID8gTWF0aC5tYXgoYmFzZSwgZmxvb3IpICogc2NhbGVcbiAgICAgICAgOiBGbG9hdDMyQXJyYXkuZnJvbShzbGFiPy5pbmRpY2VzID8/IHsgbGVuZ3RoOiBvYnMuY291bnQgfSwgKF92LCBpKSA9PlxuICAgICAgICAgICAgc2l6ZU9mKHNsYWIgPyBzbGFiLmluZGljZXNbaV0gOiBpKSk7XG5cbiAgICAvLyBuYXBhcmkncyBpbWFnZSB2aWV3IENMRUFSUyB0aGUgd2hvbGUgbGF5ZXIgbGlzdCBvbiBldmVyeSByZW5kZXIsIHNvIHRoZVxuICAgIC8vIG1hcmtlcnMgZ28gd2l0aCBpdCB3aGVuZXZlciB0aGUgaW1hZ2UgaXMgcmUtcmVuZGVyZWQg4oCUIGEgc2NydWIsIGEgY29udHJhc3RcbiAgICAvLyBjaGFuZ2UuIFRoZSBjYWNoZWQgaGFuZGxlIGlzIHRoZW4gZGV0YWNoZWQsIGFuZCBtdXRhdGluZyBpdCBkcmF3cyBub3RoaW5nOlxuICAgIC8vIHRyZWF0IGEgbGF5ZXIgdGhhdCBpcyBubyBsb25nZXIgaW4gdGhlIHNjZW5lIGFzIGFic2VudCBzbyBpdCBnZXRzIHJlLWFkZGVkLlxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMgJiYgIXZpZXdlci5sYXllcnMuaXRlbXMuaW5jbHVkZXModGhpcy5zcGF0aWFsUG9pbnRzKSkge1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBIHNpemUvY29sb3VyL29wYWNpdHkvc2VsZWN0aW9uIGNoYW5nZSBpcyBESVNQTEFZLW9ubHk6IG11dGF0ZSB0aGUgbGF5ZXJcbiAgICAvLyByYXRoZXIgdGhhbiBkcm9wcGluZyBhbmQgcmUtYWRkaW5nIGl0LiBCb3RoIHNldHRlcnMgYnVtcCB0aGUgbGF5ZXInc1xuICAgIC8vIGRhdGFWZXJzaW9uLCB3aGljaCBpcyB3aGF0IG1ha2VzIG5hcGFyaS1qcyByZWJ1aWxkIHRoZSBpbnN0YW5jZSBidWZmZXIgYW5kXG4gICAgLy8gcmVkcmF3IOKAlCBhbmQgaXQgYXZvaWRzIHJlYnVpbGRpbmcgODRrIHBvc2l0aW9ucyB0byBjaGFuZ2Ugb25lIG51bWJlci5cbiAgICAvLyBUaGUgc2xpY2UgaXMgcGFydCBvZiB0aGUga2V5OiBhIHNjcnViIGNoYW5nZXMgV0hJQ0ggb2JzZXJ2YXRpb25zIGFyZSBkcmF3bixcbiAgICAvLyB3aGljaCBpcyBnZW9tZXRyeSwgbm90IGRpc3BsYXkuXG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH06JHtvYnMuY291bnR9OiR7c2xhYj8uc2xpY2UgPz8gJyd9YDtcbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzICYmIGtleSA9PT0gdGhpcy5zcGF0aWFsTGF5ZXJLZXkpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cy5zaXplID0gc2l6ZTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50cy52aXNpYmxlID0gdGhpcy5zcGF0aWFsUG9pbnRzVmlzaWJsZSgpO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzLmZhY2VDb2xvciA9IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgc2xhYj8uaW5kaWNlcykgYXMgbmV2ZXI7XG4gICAgICB0aGlzLmhpZGVGb3JlaWduSW1hZ2Uodmlld2VyLCAoISFyZWYgfHwgISFkYXRhc2V0LnZvbHVtZSkgJiYgdmlldy5zaG93SW1hZ2UgIT09IGZhbHNlKTtcbiAgICB0aGlzLnJlZ2lvbk92ZXJsYXk/LnNldFJlZ2lvbnNWaXNpYmxlKHZpZXcuc2hvd0Fubm90YXRpb25zICE9PSBmYWxzZSk7XG4gICAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNwYXRpYWxQb2ludHMpIHtcbiAgICAgIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50cyk7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYXduID0gc2xhYj8uaW5kaWNlcztcbiAgICBjb25zdCBjb3VudCA9IGRyYXduID8gZHJhd24ubGVuZ3RoIDogb2JzLmNvdW50O1xuICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBkcmF3biA/IGRyYXduW2ldIDogaTtcbiAgICAgIHBvc2l0aW9uc1tpICogMl0gPSBvYnMueFtvXTtcbiAgICAgIHBvc2l0aW9uc1tpICogMiArIDFdID0gb2JzLnlbb107XG4gICAgfVxuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0ga2V5O1xuICAgIHRoaXMuc3BhdGlhbFBvaW50cyA9IHZpZXdlci5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAnb2JzZXJ2YXRpb25zJyxcbiAgICAgIHNpemUsXG4gICAgICBmYWNlQ29sb3I6IHRoaXMuZ2F0aGVyQ29sb3JzKGZhY2VDb2xvciwgZHJhd24pLFxuICAgICAgLy8gTm8gYm9yZGVyOiBhdCBWaXNpdW0gc3BvdCBkZW5zaXR5IGFuIG91dGxpbmUgcGVyIG1hcmtlciByZWFkcyBhcyBub2lzZSxcbiAgICAgIC8vIGFuZCBpdCBjb3N0cyBhIHNlY29uZCBjb2xvdXIgYXJyYXkuXG4gICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgIC8vIFRoZSBkYXRhc2V0J3MgZGF0YS0+d29ybGQgYWZmaW5lLiBTcGF0aWFsRGF0YSByZWNvcmRzIG9uZSBwZXIgY29vcmRpbmF0ZVxuICAgICAgLy8gc3lzdGVtIChWaXNpdW0gc3BvdCBjb29yZHMgYXJlIGluIHRoZSBGVUxMLXJlc29sdXRpb24gZnJhbWUgd2hpbGUgdGhlXG4gICAgICAvLyBzZXJ2ZWQgaW1hZ2UgbWF5IGJlIHRoZSBoaXJlcyBkb3duc2NhbGUpLCBzbyB3aXRob3V0IHRoaXMgdGhlIG1hcmtlcnNcbiAgICAgIC8vIGxhbmQgaW4gdGhlIHJpZ2h0IHNoYXBlIGF0IHRoZSB3cm9uZyBzY2FsZS4gRGVmYXVsdHMgdG8gaWRlbnRpdHkgd2hlblxuICAgICAgLy8gdGhlIGNvb3JkaW5hdGVzIGFyZSBhbHJlYWR5IGluIHRoZSBpbWFnZSdzIHBpeGVsIHNwYWNlLlxuICAgICAgc2NhbGU6IHJlZj8uc2NhbGUgPz8gWzEsIDFdLFxuICAgICAgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0sXG4gICAgICB2aXNpYmxlOiB0aGlzLnNwYXRpYWxQb2ludHNWaXNpYmxlKCksXG4gICAgfSk7XG4gICAgLy8gT3V0bGluZXMsIGRlbnNpdHkgYW5kIHRyYW5zY3JpcHRzIGdvIGJhY2sgb3ZlciB0aGUgbWFya2VycyBqdXN0IGFkZGVkLlxuICAgIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5hZnRlck9ic2VydmF0aW9ucygpO1xuICAgIHRoaXMuZnJhbWVTcGF0aWFsUG9pbnRzT25jZSh2aWV3ZXIsIGRhdGFzZXQuaWQsIHBvc2l0aW9ucywgISFyZWYpO1xuICAgIHRoaXMuaGlkZUZvcmVpZ25JbWFnZSh2aWV3ZXIsICghIXJlZiB8fCAhIWRhdGFzZXQudm9sdW1lKSAmJiB2aWV3LnNob3dJbWFnZSAhPT0gZmFsc2UpO1xuICAgIHRoaXMucmVnaW9uT3ZlcmxheT8uc2V0UmVnaW9uc1Zpc2libGUodmlldy5zaG93QW5ub3RhdGlvbnMgIT09IGZhbHNlKTtcbiAgICB0aGlzLnNldFJlZ2lvbkdyaWRGb3IoZGF0YXNldCwgcG9zaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxsIHRoZSByZWdpb24gb3ZlcmxheSBob3cgZmluZWx5IGEgZHJhd24gdmVydGV4IG1heSBiZSBwbGFjZWQuXG4gICAqXG4gICAqIFJlZ2lvbiBnZW9tZXRyeSBpcyBzdG9yZWQgaW4gd2hvbGUgd29ybGQgdW5pdHMsIHdoaWNoIGlzIHJpZ2h0IHdoZW4gdGhlIHdvcmxkIElTXG4gICAqIHBpeGVscyDigJQgYSByZWdpb24gc2hvdWxkIGFsaWduIHRvIHRoZW0uIEl0IGlzIHdyb25nIGZvciBhIGRhdGFzZXQgdGhhdCByZWdpc3RlcnMgb250b1xuICAgKiBubyBpbWFnZTogc2VxRklTSCdzIG9ic2VydmF0aW9ucyBzcGFuIGFib3V0IDUgeCA3IHVuaXRzIGluIHRvdGFsLCBzbyB3aG9sZS11bml0XG4gICAqIHZlcnRpY2VzIGxlYXZlIHJvdWdobHkgc2l4IGJ5IGVpZ2h0IHBsYWNlYWJsZSBwb3NpdGlvbnMgYWNyb3NzIHRoZSBlbnRpcmUgc2FtcGxlIGFuZFxuICAgKiBhbiBST0kgY2Fubm90IGJlIGRyYXduIGF0IGFueSB6b29tLiBOb3RoaW5nIGVycm9yczsgdGhlIHRvb2wganVzdCBjYW5ub3QgZXhwcmVzcyB0aGVcbiAgICogc2hhcGUuXG4gICAqXG4gICAqIEtleWVkIG9uIHdoZXRoZXIgdGhlIGRhdGFzZXQgYnJpbmdzIFBJWEVMUyByYXRoZXIgdGhhbiBvbiB0aGUgZXh0ZW50LCBiZWNhdXNlIHRoZVxuICAgKiBleHRlbnQgY2Fubm90IHRlbGwgdGhlIHR3byBhcGFydCDigJQgMiwwMDAgdW5pdHMgaXMgYSBzbWFsbCBzbGlkZSBvciBhIGxhcmdlIHNlY3Rpb25cbiAgICogZGVwZW5kaW5nIG9ubHkgb24gd2hhdCB0aGUgdW5pdHMgYXJlLCBhbmQgb25seSB0aGUgZGF0YXNldCBrbm93cy5cbiAgICovXG4gIHByaXZhdGUgc2V0UmVnaW9uR3JpZEZvcihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5yZWdpb25PdmVybGF5O1xuICAgIGlmICghb3ZlcmxheT8uc2V0V29ybGRRdWFudHVtKSByZXR1cm47XG4gICAgaWYgKGRhdGFzZXQuaW1hZ2VSZWYgfHwgZGF0YXNldC52b2x1bWUpIHtcbiAgICAgIG92ZXJsYXkuc2V0V29ybGRRdWFudHVtKFBJWEVMX1dPUkxEX1FVQU5UVU0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgbWluWCA9IEluZmluaXR5OyBsZXQgbWF4WCA9IC1JbmZpbml0eTsgbGV0IG1pblkgPSBJbmZpbml0eTsgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGNvbnN0IHggPSBwb3NpdGlvbnNbaV07XG4gICAgICBjb25zdCB5ID0gcG9zaXRpb25zW2kgKyAxXTtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoeSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICB9XG4gICAgb3ZlcmxheS5zZXRXb3JsZFF1YW50dW0od29ybGRRdWFudHVtRm9yRXh0ZW50KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyYW1lIHRoZSAyRCBjYW1lcmEgb24gdGhlIG9ic2VydmF0aW9ucywgZm9yIGEgZGF0YXNldCB0aGF0IGJyaW5ncyBubyBpbWFnZS5cbiAgICpcbiAgICogVGhlIDJEIGNhbWVyYSBpcyBub3JtYWxseSBmaXR0ZWQgdG8gdGhlIElNQUdFLCBiZWNhdXNlIHRoZSBvYnNlcnZhdGlvbnMgYXJlIGluIHRoYXRcbiAgICogaW1hZ2UncyBwaXhlbCBzcGFjZSBhbmQgZnJhbWluZyB0aGUgaW1hZ2UgZnJhbWVzIHRoZW0gdG9vLiBBIGRhdGFzZXQgd2l0aCBub1xuICAgKiByZWZlcmVuY2UgaW1hZ2UgaGFzIGNvb3JkaW5hdGVzIGluIGl0cyBvd24gdW5pdHMgaW5zdGVhZCDigJQgc2VxRklTSCdzIHNwYW4gYWJvdXRcbiAgICogNXg3IOKAlCBzbyB0aGUgaW1hZ2UgZnJhbWluZyBsZWZ0IG92ZXIgZnJvbSB3aGF0ZXZlciB3YXMgb24gc2NyZWVuIGJlZm9yZSBwdXRzIHRoZVxuICAgKiB3aG9sZSBjbG91ZCBvZmZzY3JlZW46IG1lYXN1cmVkIGF0IDkuNyB4IDEzLjQgUElYRUxTLCBjZW50cmVkIDI1NnB4IGZyb20gd2hlcmUgdGhlXG4gICAqIGNhbWVyYSB3YXMgbG9va2luZy4gVGhlIHBvaW50cyBhcmUgYWxsIHRoZXJlIGFuZCBkcmF3bjsgdGhleSBhcmUgYSBzcGVjay4gV2hpY2hcbiAgICogbG9va3MgZXhhY3RseSBsaWtlIHRoZSBkYXRhc2V0IGhhdmluZyBmYWlsZWQgdG8gbG9hZC5cbiAgICpcbiAgICogT25jZSBwZXIgZGF0YXNldCwgYXMgbmFwYXJpLWpzJ3MgYGZpdDNkOiAnb25jZSdgIGRvZXMgZm9yIHRoZSBjbG91ZDogcmUtY29sb3VyaW5nLFxuICAgKiBzbGljaW5nIG9yIHBpY2tpbmcgYSBnZW5lIHJlLWFkZHMgdGhpcyBsYXllciwgYW5kIHJlLWZyYW1pbmcgb24gdGhvc2Ugd291bGQgbW92ZVxuICAgKiB0aGUgY2FtZXJhIHVuZGVyIHRoZSB1c2VyIOKAlCB0aGUgY2FtZXJhIHRvb2xzIGFuZCB0aGUgY2FudmFzIGRyYWcgYXJlIG1lYW50IHRvIGJlXG4gICAqIHRoZSBvbmx5IHRoaW5ncyB0aGF0IGRvLlxuICAgKi9cbiAgLyoqXG4gICAqIEhpZGUgdGhlIGltYWdlIGxheWVyIGZvciBhIGRhdGFzZXQgdGhhdCBicmluZ3Mgbm8gaW1hZ2Ugb2YgaXRzIG93bi5cbiAgICpcbiAgICogVGhlIGhvc3QncyB2aWV3ZXIga2VlcHMgd2hhdGV2ZXIgaW1hZ2Ugd2FzIGxhc3QgbG9hZGVkLCBhbmQgZm9yIGEgZGF0YXNldCB0aGF0XG4gICAqIHJlZ2lzdGVycyBvbnRvIG5vbmUgdGhhdCBwaWN0dXJlIGJlbG9uZ3MgdG8gc29tZXRoaW5nIGVsc2UgZW50aXJlbHkg4oCUIHRoZSBleGFtcGxlJ3NcbiAgICogZGVmYXVsdCBzbGlkZSwgc2F5LiBJdCBpcyBub3QgbWVyZWx5IGlycmVsZXZhbnQ6IHRoZSB0d28gbGl2ZSBpbiBkaWZmZXJlbnQgY29vcmRpbmF0ZVxuICAgKiBzcGFjZXMgKGltYWdlIHBpeGVscyBhZ2FpbnN0IHRoZSBlbWJlZGRpbmcncyBvd24gdW5pdHMpLCBzbyB0aGUgbGVmdG92ZXIgaXMgbWFnbmlmaWVkXG4gICAqIHJvdWdobHkgYSBodW5kcmVkZm9sZC4gQXQgdGhlIGZpdHRlZCB6b29tIHRoZSBjYW1lcmEgc2l0cyBpbnNpZGUgaXRzIGNvcm5lciwgd2hlcmUgaXRcbiAgICogcmVhZHMgYXMgYmxhbmsgYmFja2dyb3VuZCwgYW5kIGl0IGFwcGVhcnMgb25seSBvbmNlIHlvdSB6b29tIG91dCBmYXIgZW5vdWdoIHRvIGZpbmRcbiAgICogaXQg4oCUIHdoaWNoIGlzIGV4YWN0bHkgaG93IGl0IGdldHMgbm90aWNlZC5cbiAgICpcbiAgICogSGlkZGVuIHJhdGhlciB0aGFuIHJlbW92ZWQsIGFuZCBoaWRkZW4gSEVSRSByYXRoZXIgdGhhbiBieSBjbGVhcmluZyB0aGUgaG9zdCdzIGltYWdlXG4gICAqIHN0YXRlOiB0aGF0IHN0YXRlIGRyaXZlcyB0aGUgd2hvbGUgcmVuZGVyIHBpcGVsaW5lLCBpbmNsdWRpbmcgYSBQbG90bHkgYmFja2VuZCB3aG9zZVxuICAgKiBmaWVsZHMgYXJlIGRlY2xhcmVkIHdpdGggZGVmaW5pdGUtYXNzaWdubWVudCBhc3NlcnRpb25zLCBzbyBlbXB0eWluZyBpdCB0aHJvd3MgZnJvbVxuICAgKiB3aGljaGV2ZXIgZmllbGQgdGhlIG5leHQgcGF0aCBoYXBwZW5zIHRvIHJlYWQuIFRoaXMgdG91Y2hlcyBvbmUgbGF5ZXIncyB2aXNpYmlsaXR5XG4gICAqIGFuZCBub3RoaW5nIGVsc2UuXG4gICAqL1xuICBwcml2YXRlIGhpZGVGb3JlaWduSW1hZ2Uodmlld2VyOiBWaWV3ZXIsIGRhdGFzZXRIYXNQaXhlbHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBObyBpbWFnZSBvZiBpdHMgb3duIOKGkiBub3RoaW5nIGZvciBhbiBvdmVydmlldyB0byBzaG93IGVpdGhlci5cbiAgICB0aGlzLm5hdmlnYXRvcj8uc2V0VmlzaWJsZShkYXRhc2V0SGFzUGl4ZWxzICYmIHRoaXMubmF2aWdhdG9yVmlzaWJsZSk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB2aWV3ZXIubGF5ZXJzLml0ZW1zKSB7XG4gICAgICBpZiAobGF5ZXIua2luZCAhPT0gJ2ltYWdlJykgY29udGludWU7XG4gICAgICAvLyBUaGUgdHJhbnNjcmlwdC1kZW5zaXR5IHJhc3RlciBpcyBhbiBpbWFnZSBsYXllciB0b28sIGJ1dCBpdCBpcyBkYXRhLCBub3QgdGhlXG4gICAgICAvLyB0aXNzdWU6IHRoZSBJbWFnZXMgdG9nZ2xlIG11c3Qgbm90IHRha2UgaXQgZG93biB3aXRoIHRoZSBzbGlkZS5cbiAgICAgIGlmICh0aGlzLnNwYXRpYWxUaWxlc01ncj8ub3ducyhsYXllcikpIGNvbnRpbnVlO1xuICAgICAgLy8gUmUtc2hvd24gd2hlbiBhIGRhdGFzZXQgdGhhdCBvd25zIGFuIGltYWdlIGNvbWVzIGJhY2ssIHNvIHN3aXRjaGluZyBiZXR3ZWVuXG4gICAgICAvLyBkYXRhc2V0cyBkb2VzIG5vdCBsZWF2ZSB0aGUgdGlzc3VlIHBlcm1hbmVudGx5IGhpZGRlbi5cbiAgICAgIGxheWVyLnZpc2libGUgPSBkYXRhc2V0SGFzUGl4ZWxzO1xuICAgIH1cbiAgICB2aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBmcmFtZVNwYXRpYWxQb2ludHNPbmNlKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0SWQ6IHN0cmluZywgcG9zaXRpb25zOiBGbG9hdDMyQXJyYXksIHJlZ2lzdGVyZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIC8vIEdhdGVkIG9uIHdoZXRoZXIgVEhJUyBkYXRhc2V0IHJlZ2lzdGVycyBvbnRvIGFuIGltYWdlLCBub3Qgb24gYGltYWdlV2AvYGltYWdlSGA6XG4gICAgLy8gdGhvc2Uga2VlcCB0aGUgbGFzdCBwbG90dGVkIGltYWdlJ3MgZGltZW5zaW9ucyBhZnRlciB0aGUgaG9zdCBjbGVhcnMgaXQsIHNvIGFcbiAgICAvLyBzdGFsZSA1MTJ4MzgzIHJlYWQgYXMgXCJ0aGVyZSBpcyBhbiBpbWFnZVwiIGFuZCBza2lwcGVkIHRoZSBmcmFtaW5nIGVudGlyZWx5LlxuICAgIGlmIChyZWdpc3RlcmVkKSByZXR1cm47XG4gICAgLy8gT25jZSBwZXIgZGF0YXNldCwgYXMgbmFwYXJpLWpzJ3MgYGZpdDNkOiAnb25jZSdgIGRvZXMgZm9yIHRoZSBjbG91ZDogcmUtY29sb3VyaW5nLCBzbGljaW5nXG4gICAgLy8gb3IgcGlja2luZyBhIGdlbmUgcmUtYWRkcyB0aGlzIGxheWVyLCBhbmQgcmUtZnJhbWluZyBvbiB0aG9zZSB3b3VsZCBtb3ZlIHRoZVxuICAgIC8vIGNhbWVyYSB1bmRlciB0aGUgdXNlciDigJQgdGhlIGNhbWVyYSB0b29scyBhbmQgdGhlIGNhbnZhcyBkcmFnIGFyZSBtZWFudCB0byBiZSB0aGVcbiAgICAvLyBvbmx5IHRoaW5ncyB0aGF0IGRvLlxuICAgIGlmICh0aGlzLnNwYXRpYWwyZEZyYW1lZD8udmlld2VyID09PSB2aWV3ZXJcbiAgICAgICYmIHRoaXMuc3BhdGlhbDJkRnJhbWVkLmRhdGFzZXRJZCA9PT0gZGF0YXNldElkKSByZXR1cm47XG5cbiAgICBjb25zdCBmaXQgPSBmcmFtZVBvc2l0aW9ucyhcbiAgICAgIHBvc2l0aW9ucywgdGhpcy5jYW52YXM/LmNsaWVudFdpZHRoID8/IDAsIHRoaXMuY2FudmFzPy5jbGllbnRIZWlnaHQgPz8gMCxcbiAgICApO1xuICAgIC8vIE51bGwgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBmcmFtZSBvbjsgbGVhdmUgdGhlIGNhbWVyYSB3aGVyZSBpdCBpcyByYXRoZXJcbiAgICAvLyB0aGFuIG1vdmluZyB0aGUgdmlldyBmb3IgYSBkYXRhc2V0IHdlIGNhbm5vdCBmaXQuXG4gICAgaWYgKCFmaXQpIHJldHVybjtcbiAgICB2aWV3ZXIuY2FtZXJhLnNldChmaXQuY2VudGVyLCBmaXQuem9vbSA/PyB2aWV3ZXIuY2FtZXJhLnpvb20pO1xuICAgIHRoaXMuc3BhdGlhbDJkRnJhbWVkID0geyB2aWV3ZXIsIGRhdGFzZXRJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKmdlbmUgbWFwKio6IHRoZSBhY3RpdmUgZ2VuZSdzIGV4cHJlc3Npb24gYXMgYSBjb250aW51b3VzIGZpZWxkIGRyYXduIHVuZGVyXG4gICAqIHRoZSBjZWxscy5cbiAgICpcbiAgICogQSBzY2F0dGVyIGNvbG91cmVkIGJ5IGEgZ2VuZSBzYXlzIHdoaWNoIGNlbGxzIGV4cHJlc3MgaXQ7IGl0IGNhbm5vdCBzYXkgd2hlcmUsXG4gICAqIGJlY2F1c2UgdGhlIGV5ZSB3aWxsIG5vdCBpbnRlZ3JhdGUgdGhvdXNhbmRzIG9mIGRvdHMgaW50byBhIHRlcnJpdG9yeS4gVGhlIGZpZWxkXG4gICAqIGlzIGEga2VybmVsLXdlaWdodGVkIE1FQU4gcGVyIGNlbGwgKHNlZSBgc3BhdGlhbC1leHByZXNzaW9uLnRzYCksIHNvIGEgZGVuc2VcbiAgICogcmVnaW9uIGRvZXMgbm90IGdsb3cgbWVyZWx5IGZvciBiZWluZyBkZW5zZSwgYW5kIGl0IGlzIHRyYW5zcGFyZW50IHdoZXJldmVyIG5vXG4gICAqIGNlbGwgd2FzIG1lYXN1cmVkIOKAlCBhbiB1bnNhbXBsZWQgZ2FwIG11c3Qgbm90IHJlYWQgYXMgXCJub3QgZXhwcmVzc2VkXCIuXG4gICAqXG4gICAqIEl0IHNoYXJlcyB0aGUgcG9pbnRzJyBMVVQsIHBlcmNlbnRpbGUgd2luZG93IGFuZCBsb2cgZmxhZywgc28gdGhlIGxheWVyIHVuZGVyXG4gICAqIHRoZSBjZWxscyBhbmQgdGhlIGNlbGxzIHRoZW1zZWx2ZXMgY2Fubm90IGRpc2FncmVlIGFib3V0IHdoYXQgYSBjb2xvdXIgbWVhbnMuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgRElTUExBWUVEIGltYWdlJ3MgcGl4ZWwgZ3JpZCwgY29hcnNlbmVkIHNvIHRoZSBsb25nIHNpZGUgaXMgYXRcbiAgICogbW9zdCB7QGxpbmsgR0VORV9NQVBfTUFYX1NJREV9OiBhIHNtb290aCBmaWVsZCBnYWlucyBub3RoaW5nIGZyb20gYSBzbGlkZSdzIGZ1bGxcbiAgICogcmVzb2x1dGlvbi4gRm9yIGEgdm9sdW1lLWJhY2tlZCBkYXRhc2V0IHRoYXQgZ3JpZCBpcyB0aGUgY3VycmVudCBzbGljZSwgYW5kIG9ubHlcbiAgICogdGhhdCBwbGFuZSdzIG9ic2VydmF0aW9ucyBhcmUgaW5jbHVkZWQg4oCUIHRoZSBzYW1lIHJ1bGUgdGhlIG1hcmtlcnMgZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVHZW5lTWFwKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICAgIHNsYWI6IHsgcmVmOiBTcGF0aWFsSW1hZ2VSZWY7IGluZGljZXM6IFVpbnQzMkFycmF5OyBzbGljZTogbnVtYmVyIH0gfCBudWxsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnZW5lID0gdmlldy5nZW5lTWFwICYmIHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2ZlYXR1cmUnID8gdmlldy5jb2xvckJ5Lm5hbWUgOiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZ2VuZU1hcFNtb290aGluZyA+IDAgPyB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNsaXAgPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcblxuICAgIC8vIFR3byBjbG9ja3M6IHRoZSBGSUVMRCBkZXBlbmRzIG9uIHRoZSBnZW5lLCB0aGUgcGxhbmUgYW5kIHRoZSBiYW5kd2lkdGgsIHdoaWxlXG4gICAgLy8gdGhlIGNvbG91cnMgZGVwZW5kIG9uIHRoZSB3aW5kb3csIHRoZSBsb2cgZmxhZyBhbmQgdGhlIG9wYWNpdHkuIFJlY29sb3VyaW5nIGFcbiAgICAvLyBjYWNoZWQgZmllbGQgaXMgYSBmcmFjdGlvbiBvZiBlc3RpbWF0aW5nIG9uZS5cbiAgICBjb25zdCBmaWVsZEtleSA9IGdlbmVcbiAgICAgID8gW2RhdGFzZXQuaWQsIGdlbmUsIHNsYWI/LnNsaWNlID8/ICcnLCBzbW9vdGhpbmcsIHRoaXMuc2VsZWN0aW9uUmV2KHNlbGVjdGlvbildLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGtleSA9IGZpZWxkS2V5XG4gICAgICA/IFtcbiAgICAgICAgZmllbGRLZXksIGNsaXAuam9pbignLCcpLCB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJywgdmlldy5nZW5lTWFwT3BhY2l0eSxcbiAgICAgICAgdGhpcy5jb250aW51b3VzQ29sb3JtYXBLZXkodmlldyksXG4gICAgICBdLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZ2VuZU1hcEtleSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZ2VuZU1hcExheWVyKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLmdlbmVNYXBMYXllcik7XG4gICAgICB0aGlzLmdlbmVNYXBMYXllciA9IG51bGw7XG4gICAgfVxuICAgIC8vIEFOWSBjaGFuZ2UgaGVyZSBjaGFuZ2VzIHRoZSBvcmRlciB0aGUgY2VsbHMgaGF2ZSB0byBzaXQgYWJvdmUg4oCUIGluY2x1ZGluZyB0aGVcbiAgICAvLyBmaXJzdCBvbmUsIHdoZXJlIHRoZXJlIGlzIG5vIHByZXZpb3VzIGxheWVyIHRvIHJlbW92ZSDigJQgYW5kIHRoZSBsYXllciBsaXN0IGlzXG4gICAgLy8gYXBwZW5kLW9ubHkuIFNvIGRyb3AgdGhlIG1hcmtlcnMgdW5jb25kaXRpb25hbGx5IGFuZCBsZXQgdGhlIHJlYnVpbGQgYmVsb3cgcHV0XG4gICAgLy8gdGhlbSBiYWNrIG9uIHRvcDsgb3RoZXJ3aXNlIHRoZSBmaWVsZCBpcyBhcHBlbmRlZCBvdmVyIHRoZSBtZWFzdXJlbWVudC5cbiAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxQb2ludHMpO1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5nZW5lTWFwS2V5ID0ga2V5O1xuICAgIGlmICgha2V5IHx8ICFnZW5lIHx8ICFwb3J0KSB7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZCA9IG51bGw7XG4gICAgICB0aGlzLmdlbmVNYXBGaWVsZEtleSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHJhc3RlciBjb3ZlcnMgdGhlIGRpc3BsYXllZCBpbWFnZTsgd2l0aG91dCBvbmUgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG92ZXJsYXkgYW5kIHRoZSBjbG91ZCBpcyB0aGUgM0QgbW9kZSdzIGJ1c2luZXNzLCBub3QgdGhpcyBvbmUncy5cbiAgICBjb25zdCBpbWFnZVcgPSBzbGFiID8gZGF0YXNldC52b2x1bWUhLndpZHRoIDogdGhpcy5pbWFnZVc7XG4gICAgY29uc3QgaW1hZ2VIID0gc2xhYiA/IGRhdGFzZXQudm9sdW1lIS5oZWlnaHQgOiB0aGlzLmltYWdlSDtcbiAgICBpZiAoIWltYWdlVyB8fCAhaW1hZ2VIKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KFxuICAgICAgMSxcbiAgICAgIE1hdGguY2VpbChNYXRoLm1heChpbWFnZVcsIGltYWdlSCkgLyBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9NQVhfU0lERSksXG4gICAgKTtcblxuICAgIGlmIChmaWVsZEtleSAhPT0gdGhpcy5nZW5lTWFwRmllbGRLZXkpIHtcbiAgICAgIGxldCB2YWx1ZXM6IEZsb2F0MzJBcnJheTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IGF3YWl0IHBvcnQuZ2V0RmVhdHVyZVZlY3RvcihnZW5lKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtuYXBhcmktanNdIGdlbmUgbWFwOiBcIiR7Z2VuZX1cIiB1bmF2YWlsYWJsZWAsIGVycik7XG4gICAgICAgIHRoaXMuZ2VuZU1hcEtleSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZ2VuZU1hcEtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICBjb25zdCBpblNlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgPyBtYXNrVG9JbmRpY2VzKHNlbGVjdGlvbi5tYXNrKSA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkID0gZXhwcmVzc2lvbkZpZWxkKGRhdGFzZXQub2JzZXJ2YXRpb25zLCB7XG4gICAgICAgIHJlZjogc2xhYj8ucmVmID8/IGRhdGFzZXQuaW1hZ2VSZWYsXG4gICAgICAgIHdpZHRoOiBNYXRoLmNlaWwoaW1hZ2VXIC8gc3RlcCksXG4gICAgICAgIGhlaWdodDogTWF0aC5jZWlsKGltYWdlSCAvIHN0ZXApLFxuICAgICAgICBzdGVwLFxuICAgICAgICBzaWdtYTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuR0VORV9NQVBfU0lHTUEgKiBzbW9vdGhpbmcsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgLy8gQSBwbGFuZSB3aW5zIG92ZXIgYSBzZWxlY3Rpb246IHRoZSAyRCB2aWV3IGlzIHNob3dpbmcgb25lIHNlY3Rpb24sIHNvIGFcbiAgICAgICAgLy8gZmllbGQgc3Bhbm5pbmcgdGhlIHNwZWNpbWVuJ3MgZGVwdGggd291bGQgbm90IGJlIHRoZSB0aGluZyBvbiBzY3JlZW4uXG4gICAgICAgIGluZGljZXM6IHNsYWI/LmluZGljZXMgPz8gaW5TZWxlY3Rpb24sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2VuZU1hcEZpZWxkS2V5ID0gZmllbGRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5nZW5lTWFwRmllbGQ7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICBjb25zdCBbbG8sIGhpXSA9IGNvbnRyYXN0V2luZG93KGZpZWxkLm1lYW4sIGNsaXBbMF0sIGNsaXBbMV0pO1xuICAgIGNvbnN0IHJnYmEgPSBjb2xvckV4cHJlc3Npb25GaWVsZChmaWVsZCwgbHV0LCBbbG8sIGhpXSwge1xuICAgICAgbG9nOiB2aWV3LmxvZ1NjYWxlLFxuICAgICAgLy8gVGhlIE1BUCdzIG93biBvcGFjaXR5OiByZWFkaW5nIGEgZmllbGQgdW5kZXIgdGhlIGNlbGxzIG1lYW5zIHR1cm5pbmcgdGhlXG4gICAgICAvLyBjZWxscyBkb3duLCB3aGljaCBtdXN0IG5vdCB0YWtlIHRoZSBmaWVsZCB3aXRoIHRoZW0uXG4gICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgIH0pO1xuICAgIHRoaXMuZ2VuZU1hcExheWVyID0gdmlld2VyLmFkZEltYWdlKFxuICAgICAgeyBraW5kOiAndHlwZWQnLCB3aWR0aDogZmllbGQud2lkdGgsIGhlaWdodDogZmllbGQuaGVpZ2h0LCBjaGFubmVsczogNCwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IHJnYmEgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYGdlbmUgbWFwIMK3ICR7Z2VuZX1gLFxuICAgICAgICBzY2FsZTogW3N0ZXAsIHN0ZXBdLFxuICAgICAgICB0cmFuc2xhdGU6IFswLCAwXSxcbiAgICAgICAgYmxlbmRpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICB9LFxuICAgICk7XG4gICAgdmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxhbmUgYSB2b2x1bWUtYmFja2VkIGRhdGFzZXQgaXMgY3VycmVudGx5IHNob3dpbmc6IGl0cyBwaXhlbCBhZmZpbmUsIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgdGhhdCBmYWxsIGluIGl0LCBhbmQgdGhlIG1hcmtlciBmbG9vciB0aGF0IGdyaWQgbmVlZHMuXG4gICAqXG4gICAqIE51bGwgZm9yIGEgZGF0YXNldCB3aXRoIGEgcmVhbCBgaW1hZ2VSZWZgIChpdHMgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgdGhlXG4gICAqIGltYWdlJ3MgcGl4ZWxzIGFuZCBldmVyeSBvYnNlcnZhdGlvbiBiZWxvbmdzIHRvIHRoZSBvbmUgc2VjdGlvbikgYW5kIGZvciBvbmVcbiAgICogd2l0aCBubyB2b2x1bWUgYXQgYWxsIOKAlCBib3RoIG9mIHdoaWNoIGRyYXcgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHNwYXRpYWxTbGFiKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0KToge1xuICAgIHJlZjogU3BhdGlhbEltYWdlUmVmOyBpbmRpY2VzOiBVaW50MzJBcnJheTsgc2xpY2U6IG51bWJlcjsgbWluRGlhbWV0ZXI6IG51bWJlcjtcbiAgfSB8IG51bGwge1xuICAgIGNvbnN0IHZvbHVtZSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGlmIChkYXRhc2V0LmltYWdlUmVmIHx8ICF2b2x1bWUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5sb2FkZWQ/LnogPz8gMDtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmOiB2b2x1bWVJbWFnZVJlZih2b2x1bWUsIGRhdGFzZXQubWljcm9uc1BlclVuaXQpLFxuICAgICAgaW5kaWNlczogb2JzZXJ2YXRpb25zSW5TbGljZShkYXRhc2V0Lm9ic2VydmF0aW9ucywgdm9sdW1lLCBzbGljZSksXG4gICAgICBzbGljZSxcbiAgICAgIG1pbkRpYW1ldGVyOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5TUEFUSUFMX1NMSUNFX01JTl9ESUFNRVRFUl9QWCAqIHZvbHVtZS52b3hlbFNpemVbMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBQZXItcG9pbnQgY29sb3VycyBmb3IgdGhlIGRyYXduIHN1YnNldC4gQSBicm9hZGNhc3QgdHVwbGUgc3RheXMgYnJvYWRjYXN0IOKAlFxuICAgKiAgaXQgaXMgb25lIGNvbG91ciBmb3IgZXZlcnkgcG9pbnQgZWl0aGVyIHdheS4gKi9cbiAgcHJpdmF0ZSBnYXRoZXJDb2xvcnM8VD4oY29sb3JzOiBUW10gfCBULCBpbmRpY2VzPzogVWludDMyQXJyYXkpOiBUW10gfCBUIHtcbiAgICBpZiAoIWluZGljZXMgfHwgIUFycmF5LmlzQXJyYXkoY29sb3JzKSkgcmV0dXJuIGNvbG9ycztcbiAgICBjb25zdCBvdXQ6IFRbXSA9IG5ldyBBcnJheShpbmRpY2VzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBjb2xvcnNbaW5kaWNlc1tpXV07XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXcgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgb3ZlciBhIGZyZXNobHkgcmVuZGVyZWQgaW1hZ2UuXG4gICAqXG4gICAqIFR3byByZWFzb25zLCBib3RoIGludmlzaWJsZSBmcm9tIHRoZSBzcGF0aWFsIHN0b3JlIOKAlCB3aGljaCBpcyB3aHkgYSBzY3J1YiBvciBhXG4gICAqIHJlLXJlbmRlciBuZXZlciByZWFjaGVkIHRoZSBtYXJrZXJzIG9uIGl0cyBvd246XG4gICAqICAtIHRoZSBpbWFnZSByZW5kZXIgQ0xFQVJTIHRoZSBsYXllciBsaXN0LCB0YWtpbmcgdGhlIG1hcmtlcnMgd2l0aCBpdDtcbiAgICogIC0gb3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgZGlzcGxheWVkIHBsYW5lIGRlY2lkZXMgd2hpY2hcbiAgICogICAgb2JzZXJ2YXRpb25zIGJlbG9uZyBvbiBzY3JlZW4gYXQgYWxsLCBzbyB0aGUgY2VsbHMgaGF2ZSB0byBtb3ZlIHdpdGggdGhlXG4gICAqICAgIHNlY3Rpb24gcmF0aGVyIHRoYW4gaGFuZyBvdmVyIGEgZGlmZmVyZW50IG9uZS5cbiAgICpcbiAgICogVXNlcyB0aGUgbGF0ZXN0IHZhbHVlcyB0aGUgbWFya2VyIHN1YnNjcmlwdGlvbiBzYXc7IGEgbm8tb3AgdW50aWwgaXQgaGFzIHNlZW5cbiAgICogYW55LCBpbiB0aGUgM0QgY2xvdWQgKG5vIGltYWdlLCBubyBwbGFuZSksIGFuZCB3aXRoIG5vIGRhdGFzZXQgdG8gZHJhdy5cbiAgICovXG4gIHByaXZhdGUgcmVkcmF3U3BhdGlhbE1hcmtlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5zcGF0aWFsTGF0ZXN0O1xuICAgIGlmICghbGF0ZXN0Py5bMF0gfHwgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHJldHVybjtcbiAgICB2b2lkIHRoaXMucmVidWlsZFNwYXRpYWxQb2ludHMoLi4ubGF0ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgU1BBVElBTF9PTUlDU18zRCB2aWV3OiBvYnNlcnZhdGlvbnMgYXMgYSAzRCBwb2ludCBjbG91ZCB1bmRlciB0aGUgb3JiaXQgY2FtZXJhLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbXVjaCB0aGlubmVyIHRoYW4gdGhlIDJEIG1vdW50LiBUaGVyZSBpcyBubyB0aXNzdWUgaW1hZ2UgdG8gcmVuZGVyIChhIHJlZ2lzdGVyZWRcbiAgICogdm9sdW1lIGxpa2UgdGhlIEFsbGVuIENDRiBoYXMgbm8gc2luZ2xlIHJlZmVyZW5jZSBwbGFuZSksIHNvIG5vIHNjYWxlIGJhciwgbm8gcmVhZGJhY2ssIGFuZCBub1xuICAgKiAyRCBpbnRlcmFjdGlvbiBzdGFjayDigJQgdGhlIHJlZ2lvbiB0b29scyBkcmF3IGluIHNjcmVlbiBzcGFjZSBhbmQgaGF2ZSBubyBtZWFuaW5nIGFnYWluc3QgYW5cbiAgICogb3JiaXRpbmcgY2FtZXJhLCB3aGljaCBpcyB3aHkgYFNlbGVjdCBmcm9tIFJPSXNgIGlzIGhpZGRlbiBpbiB0aGlzIG1vZGUuIGBhZGRQb2ludHMzRGAgcHV0c1xuICAgKiB0aGUgdmlld2VyIGluIDNEIGFuZCBmcmFtZXMgdGhlIGNhbWVyYSBvbiB0aGUgY2xvdWQgaXRzZWxmLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNwYXRpYWxPbWljczNkKHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW5zdGFsbDNkSW50ZXJhY3Rpb24odmlld2VyLCBob3N0KTtcbiAgICB0aGlzLmluc3RhbGxTcGF0aWFsSG92ZXIoaG9zdCk7XG4gICAgdGhpcy5zdWJzY3JpYmVTcGF0aWFsKCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGUgYmFyIGZvciB0aGUgM0QgY2xvdWQsIG1lYXN1cmVkIGF0IHRoZSBPUkJJVCBQSVZPVC5cbiAgICpcbiAgICogQSBwZXJzcGVjdGl2ZSBjYW1lcmEgaGFzIG5vIHNpbmdsZSBzY2FsZSDigJQgdGhpbmdzIGZhcnRoZXIgYXdheSBhcmUgc21hbGxlciDigJQgc28gYSBiYXIgY2FuXG4gICAqIG9ubHkgYmUgdHJ1ZSBhdCBvbmUgZGVwdGguIFRoZSBwaXZvdCBpcyB0aGUgaG9uZXN0IGNob2ljZTogaXQgaXMgd2hhdCB0aGUgY2FtZXJhIGlzIGZyYW1pbmcsXG4gICAqIHdoYXQgYSB6b29tIG1vdmVzIHRvd2FyZHMsIGFuZCB3aGVyZSB0aGUgZXllIGlzIGFueXdheS4gbmFwYXJpJ3Mgb3duIDNEIHNjYWxlIGJhciB3b3JrcyB0aGVcbiAgICogc2FtZSB3YXkuXG4gICAqXG4gICAqIGBOYXBhcmlTY2FsZUJhcmAgbmVlZHMgQ1NTIHB4IHBlciB3b3JsZCB1bml0LCB3aGljaCBhbiBvcmJpdCBjYW1lcmEgZG9lcyBub3QgZXhwb3NlLCBidXQgYXRcbiAgICogdGhlIHBpdm90IGl0IGlzIGV4YWN0bHkgYHZpZXdwb3J0SGVpZ2h0IC8gKDIgKiBkaXN0YW5jZSAqIHRhbihmb3YgLyAyKSlgIOKAlCB0aGUgc2FtZVxuICAgKiByZWxhdGlvbnNoaXAgYENhbWVyYTNELnBhbmAgdXNlcyB0byB0cmFjayB0aGUgY3Vyc29yLiBUaGUgYmFyIHRoZW4gY29udmVydHMgdGhyb3VnaFxuICAgKiBgbWljcm9uc1BlclVuaXRgLCBhbmQgZHJhd3Mgbm90aGluZyBhdCBhbGwgd2hlbiB0aGUgZGF0YXNldCBkb2VzIG5vdCBkZWNsYXJlIG9uZSwgYmVjYXVzZSBhXG4gICAqIGJhciBsYWJlbGxlZCBpbiBtaWNyb25zIG92ZXIgdW5rbm93biB1bml0cyB3b3VsZCByZWFkIGFzIGEgbWVhc3VyZW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTcGF0aWFsM2RTY2FsZUJhcih2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zY2FsZUJhcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIHRoaXMubmF2aWdhdG9yPy5kZXN0cm95KCk7XG4gICAgdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIGNvbnN0IG1pY3JvbnNQZXJVbml0ID0gZGF0YXNldD8ubWljcm9uc1BlclVuaXQ7XG4gICAgaWYgKCF0aGlzLmhvc3QgfHwgIW1pY3JvbnNQZXJVbml0IHx8IG1pY3JvbnNQZXJVbml0IDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgIGNvbnN0IGNhbSA9IHZpZXdlci5jYW1lcmEzZDtcbiAgICBjb25zdCBzaGltOiBTY2FsZUJhckNhbWVyYSA9IHtcbiAgICAgIGdldCB6b29tKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGggPSBjYW52YXM/LmNsaWVudEhlaWdodCB8fCBjYW52YXM/LmhlaWdodCB8fCAwO1xuICAgICAgICBjb25zdCB3b3JsZFBlclB4ID0gKDIgKiBjYW0uZGlzdGFuY2UgKiBNYXRoLnRhbihjYW0uZm92IC8gMikpIC8gKGggfHwgMSk7XG4gICAgICAgIHJldHVybiB3b3JsZFBlclB4ID4gMCA/IDEgLyB3b3JsZFBlclB4IDogMDtcbiAgICAgIH0sXG4gICAgICBjaGFuZ2VkOiBjYW0uY2hhbmdlZCxcbiAgICB9O1xuICAgIHRoaXMuc2NhbGVCYXIgPSBuZXcgTmFwYXJpU2NhbGVCYXIodGhpcy5ob3N0LCBzaGltLCBtaWNyb25zUGVyVW5pdCk7XG4gIH1cblxuICAvKiogQmFzZSBtYXJrZXIgZGlhbWV0ZXIgZm9yIHRoZSAzRCBjbG91ZCwgaW4gU0NSRUVOIHBpeGVscyAodGhlIGxheWVyJ3MgdW5pdCkuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNQQVRJQUxfM0RfQkFTRV9TSVpFID0gMztcblxuICAvKiogKFJlKWJ1aWxkIHRoZSAzRCBwb2ludCBjbG91ZCBmb3IgdGhlIGN1cnJlbnQgZGF0YXNldCArIHZpZXcgc3RhdGUuICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFNwYXRpYWxQb2ludHMzZChcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayA9IGVtcHR5U2VsZWN0aW9uKCksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgdG9rZW4gPSArK3RoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbjtcblxuICAgIC8vIFJlc29sdmUgdGhlIHNjYWxhciBlbmNvZGluZyBCRUZPUkUgdG91Y2hpbmcgdGhlIHNjZW5lLCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gICAgLy8gdGhlIDJEIHBhdGggZG9lczogYSBnZW5lIGZldGNoIGNhbiBmYWlsIG9yIGJlIHN1cGVyc2VkZWQsIGFuZCBkcm9wcGluZyB0aGVcbiAgICAvLyBsYXllciBmaXJzdCB3b3VsZCBibGFuayB0aGUgdmlldy5cbiAgICBsZXQgZW5jOiBTcGF0aWFsM2RFbmNvZGluZyB8IG51bGwgPSBudWxsO1xuICAgIGlmIChkYXRhc2V0KSB7XG4gICAgICB0aGlzLm9ic2VydmF0aW9uc0xvYWRpbmcrKztcbiAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuYyA9IGF3YWl0IHRoaXMuc3BhdGlhbFNjYWxhcjNkKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gc3BhdGlhbCAzRCBjb2xvdXJpbmcgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gYSBmbGF0IGNvbG91cicsIGVycik7XG4gICAgICAgIGVuYyA9IG51bGw7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLm9ic2VydmF0aW9uc0xvYWRpbmctLTtcbiAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBvYnMgPSBkYXRhc2V0Py5vYnNlcnZhdGlvbnM7XG4gICAgLy8gTm8geiBtZWFucyBub3RoaW5nIHRvIGRyYXcgaW4gM0QuIFRoZSBwbG90IHR5cGUgaXMgZ2F0ZWQgb24gYHJlcXVpcmVzU3BhdGlhbDNkYFxuICAgIC8vIHNvIHRoaXMgc2hvdWxkIGJlIHVucmVhY2hhYmxlIGZyb20gdGhlIFVJLCBidXQgYSBob3N0IGNhbiBzZXQgdGhlIHR5cGUgZGlyZWN0bHkuXG4gICAgaWYgKCFkYXRhc2V0IHx8ICFvYnMgfHwgb2JzLmNvdW50ID09PSAwIHx8ICFvYnMueikge1xuICAgICAgdGhpcy5yZW1vdmVTcGF0aWFsM2RMYXllcnModmlld2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbmF0b215IGZpcnN0OiBvbiBhIHNjZW5lJ3MgRklSU1QgbGF5ZXIgbmFwYXJpIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhLCBhbmRcbiAgICAvLyB0aGUgcmVmZXJlbmNlIHZvbHVtZSBpcyB0aGUgZnJhbWluZyB3ZSB3YW50IOKAlCB0aGUgYnJhaW4sIG5vdCB0aGUgb3V0ZXJtb3N0XG4gICAgLy8gc3RyYXkgc2VnbWVudGF0aW9uLiBFdmVyeSBsYXRlciBhZGQga2VlcHMgdGhlIHBvc2UgaW5zdGVhZCAobmFwYXJpLWpzIGBmaXQzZDogJ29uY2UnYCkuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTcGF0aWFsVm9sdW1lKHZpZXdlciwgZGF0YXNldCwgdmlldyk7XG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuICAgIC8vIFRoZW4gdGhlIGNsdXN0ZXIgZGVuc2l0eSB2b2x1bWVzLCB3aGljaCBjYW4gc2V0IHRoZSBjZW50cmluZyBvZmZzZXQgd2hlblxuICAgIC8vIHRoZXJlIGlzIG5vIHJlZmVyZW5jZSB2b2x1bWUg4oCUIHNvIGJlZm9yZSBhbnkgcG9zaXRpb24gaXMgY29tcHV0ZWQgZnJvbSBpdC5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZURlbnNpdHlWb2x1bWVzKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgLy8gVGhlbiB0aGUgZ2VuZSBtYXAsIHdoaWNoIHNoYXJlcyB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIGxhdHRpY2Ug4oCUIHNvIGl0IGdvZXNcbiAgICAvLyBhZnRlciBhbnl0aGluZyB0aGF0IGNhbiBzdGlsbCBtb3ZlIHRoZSBjZW50cmluZyBvZmZzZXQuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVHZW5lTWFwVm9sdW1lKHZpZXdlciwgZGF0YXNldCwgdmlldywgc2VsZWN0aW9uKTtcbiAgICBpZiAodG9rZW4gIT09IHRoaXMuc3BhdGlhbFJlYnVpbGRUb2tlbiB8fCB0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgLy8gU2NhbGUgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCdzIGRlY2xhcmVkIHVuaXQsIHNvIGl0IHdhaXRzIGZvciB0aGUgZGF0YXNldFxuICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIHNldCB1cCBhdCBtb3VudCB0aW1lLlxuICAgIGlmIChkYXRhc2V0LmlkICE9PSB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSkge1xuICAgICAgdGhpcy5zcGF0aWFsU2NhbGVCYXJLZXkgPSBkYXRhc2V0LmlkO1xuICAgICAgdGhpcy5pbnN0YWxsU3BhdGlhbDNkU2NhbGVCYXIodmlld2VyLCBkYXRhc2V0KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVmZXJlbmNlIHZvbHVtZSBpcyBoaWRkZW4sIG5vdCByZW1vdmVkOiBpdCBhbHNvIGZpeGVzIHRoZSBjZW50cmluZ1xuICAgIC8vIG9mZnNldCBldmVyeSBwb3NpdGlvbiBpcyBjb21wdXRlZCBmcm9tLCBhbmQgcmUtZmV0Y2hpbmcgYSAxMDAgTUIgdGVtcGxhdGVcbiAgICAvLyB0byB1bi1oaWRlIGl0IHdvdWxkIG1ha2UgYSBjaGVja2JveCBmZWVsIGxpa2UgYSBsb2FkLlxuICAgIGlmICh0aGlzLnNwYXRpYWxWb2x1bWUpIHtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZS52aXNpYmxlID0gdmlldy5zaG93Vm9sdW1lO1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lLm9wYWNpdHkgPSB2aWV3LnZvbHVtZU9wYWNpdHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3LnBvaW50U2NhbGUgPiAwID8gdmlldy5wb2ludFNjYWxlIDogMTtcbiAgICBjb25zdCBzaXplID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF8zRF9CQVNFX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzY2FsYXJzID0gZW5jPy52YWx1ZXMgPz8gbmV3IEZsb2F0MzJBcnJheShvYnMuY291bnQpO1xuICAgIGNvbnN0IGNvbG9ybWFwID0gZW5jPy5jb2xvcm1hcCA/PyB0aGlzLnNwYXRpYWxGbGF0Q29sb3JtYXAoKTtcbiAgICBjb25zdCBjb250cmFzdExpbWl0czogW251bWJlciwgbnVtYmVyXSA9IGVuYz8uY29udHJhc3RMaW1pdHMgPz8gWzAsIDFdO1xuXG4gICAgLy8gT25lIGltYWdlZCBzZWN0aW9uLCBvciB0aGUgd2hvbGUgc3RhY2suIFRoZSBzdWJzZXQgSVMgdGhlIGdlb21ldHJ5LCBzbyBpdFxuICAgIC8vIGJlbG9uZ3MgaW4gdGhlIGdlb21ldHJ5IGtleSByYXRoZXIgdGhhbiBiZWluZyByZS1kZXJpdmVkIHBlciBmcmFtZSDigJQgYW5kIGFuXG4gICAgLy8gb3V0LW9mLXJhbmdlIGluZGV4IGlzIGNsYW1wZWQgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNsb3VkLCBiZWNhdXNlIHRoZVxuICAgIC8vIHNlY3Rpb24gY291bnQgY2hhbmdlcyB3aXRoIHRoZSBkYXRhc2V0IHdoaWxlIHRoZSB2aWV3IHN0YXRlIHBlcnNpc3RzLlxuICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNPZihvYnMpO1xuICAgIGNvbnN0IHNlY3Rpb24gPVxuICAgICAgdmlldy5wb2ludFNlY3Rpb24gIT0gbnVsbCAmJiBzZWN0aW9ucyAmJiBzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgID8gc2VjdGlvbnNbTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VjdGlvbnMubGVuZ3RoIC0gMSwgdmlldy5wb2ludFNlY3Rpb24pKV1cbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHNob3duID0gc2VjdGlvbiAhPSBudWxsID8gb2JzZXJ2YXRpb25zSW5TZWN0aW9uKG9icywgc2VjdGlvbikgOiBudWxsO1xuICAgIGNvbnN0IHNob3duQ291bnQgPSBzaG93biA/IHNob3duLmxlbmd0aCA6IG9icy5jb3VudDtcblxuICAgIGNvbnN0IGtleSA9IGAke2RhdGFzZXQuaWR9OiR7b2JzLmNvdW50fToke3NlY3Rpb24gPz8gJ2FsbCd9YDtcbiAgICAvLyBgUG9pbnRzM0RMYXllci52YWx1ZXNgIGlzIHJlYWRvbmx5IGFuZCB0aGUgbGF5ZXIgZXhwb3NlcyBubyBkYXRhVmVyc2lvbiB0b1xuICAgIC8vIGJ1bXAsIHNvIHVubGlrZSB0aGUgMkQgcGF0aCBhIGNoYW5nZSBvZiBjb2xvdXIgU09VUkNFIGNhbm5vdCBiZSBtdXRhdGVkIGluXG4gICAgLy8g4oCUIHRoZSBsYXllciBoYXMgdG8gYmUgcmVidWlsdC4gT25seSB0aGUgc2l6ZS9vcGFjaXR5L2NvbG9ybWFwIGtub2JzIGFyZVxuICAgIC8vIGdlbnVpbmVseSBkaXNwbGF5LW9ubHkuIFNvIHRyYWNrIHRoZSBzY2FsYXJzJyBpZGVudGl0eSBzZXBhcmF0ZWx5IGZyb20gdGhlXG4gICAgLy8gZ2VvbWV0cnknczogYGNvbG9yQnlgIHBsdXMgdGhlIHRyYW5zZm9ybXMgZmVlZGluZyB0aGUgZW5jb2RpbmcuXG4gICAgY29uc3QgY2xpcCA9IHZpZXcucGVyY2VudGlsZUNsaXAgPz8gWzAuMDEsIDAuOTldO1xuICAgIGNvbnN0IHNjYWxhcktleSA9IFtcbiAgICAgIGtleSxcbiAgICAgIHZpZXcuY29sb3JCeSA/IGAke3ZpZXcuY29sb3JCeS5raW5kfToke3ZpZXcuY29sb3JCeS5uYW1lfWAgOiAnZmxhdCcsXG4gICAgICB2aWV3LmxvZ1NjYWxlID8gJ2xvZycgOiAnbGluJyxcbiAgICAgIGNsaXAuam9pbignLCcpLFxuICAgIF0uam9pbignfCcpO1xuXG4gICAgaWYgKGtleSAhPT0gdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCkge1xuICAgICAgLy8gTmV3IGdlb21ldHJ5OiBpbnRlcmxlYXZlIHgseSx6ICh0aGUgbGF5ZXIncyBkb2N1bWVudGVkIGxheW91dCwgeC1mYXN0ZXN0KVxuICAgICAgLy8gYW5kIGNhY2hlIGl0LCBzbyBsYXRlciBjb2xvdXIgY2hhbmdlcyByZWJ1aWxkIHRoZSBsYXllciB3aXRob3V0IHdhbGtpbmdcbiAgICAgIC8vIHRoZSBvYnNlcnZhdGlvbnMgYWdhaW4uXG4gICAgICBjb25zdCBbb3gsIG95LCBvel0gPSB0aGlzLnNwYXRpYWxPcmlnaW4zZDtcbiAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCAqIDMpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaG93bkNvdW50OyBrKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHNob3duID8gc2hvd25ba10gOiBrO1xuICAgICAgICBwb3NpdGlvbnNbayAqIDNdID0gb2JzLnhbaV0gKyBveDtcbiAgICAgICAgcG9zaXRpb25zW2sgKiAzICsgMV0gPSBvYnMueVtpXSArIG95O1xuICAgICAgICBwb3NpdGlvbnNbayAqIDMgKyAyXSA9IG9icy56W2ldICsgb3o7XG4gICAgICB9XG4gICAgICB0aGlzLnNwYXRpYWxQb3NpdGlvbnMzZCA9IHBvc2l0aW9ucztcbiAgICAgIHRoaXMuc3BhdGlhbERyYXduM2QgPSBzaG93bjtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2NhbGFycyBoYXZlIHRvIGZvbGxvdyB0aGUgZ2VvbWV0cnk6IGEgcGVyLW9ic2VydmF0aW9uIHZlY3RvciBhZ2FpbnN0IG9uZVxuICAgIC8vIHNlY3Rpb24ncyBwb3NpdGlvbnMgd291bGQgY29sb3VyIGVhY2ggY2VsbCBieSBhIHN0cmFuZ2VyJ3MgdmFsdWUuXG4gICAgY29uc3QgdmFsdWVzRm9yID0gKCkgPT4gKHNob3duID8gRmxvYXQzMkFycmF5LmZyb20oc2hvd24sIChpKSA9PiBzY2FsYXJzW2ldKSA6IHNjYWxhcnMpO1xuXG4gICAgaWYgKCF0aGlzLnNwYXRpYWxQb2ludHMzZCB8fCBrZXkgIT09IHRoaXMuc3BhdGlhbExheWVyS2V5M2QpIHtcbiAgICAgIC8vIE5ldyBHRU9NRVRSWSDigJQgYSBkaWZmZXJlbnQgZGF0YXNldCwgb3IgYSBkaWZmZXJlbnQgc2VjdGlvbiDigJQgc28gYSBuZXcgbGF5ZXIuXG4gICAgICBpZiAodGhpcy5zcGF0aWFsUG9pbnRzM2QpIHZpZXdlci5sYXllcnMucmVtb3ZlKHRoaXMuc3BhdGlhbFBvaW50czNkKTtcbiAgICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBrZXk7XG4gICAgICB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCA9IHNjYWxhcktleTtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkID0gdmlld2VyLmFkZFBvaW50czNEKHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkISwgdmFsdWVzRm9yKCksIHtcbiAgICAgICAgbmFtZTogJ29ic2VydmF0aW9ucycsXG4gICAgICAgIGNvbG9ybWFwLFxuICAgICAgICBjb250cmFzdExpbWl0cyxcbiAgICAgICAgc2l6ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2NhbGFyS2V5ICE9PSB0aGlzLnNwYXRpYWxTY2FsYXJLZXkzZCkge1xuICAgICAgICAvLyBBIGNoYW5nZSBvZiBjb2xvdXIgU09VUkNFLCB3aGljaCB1c2VkIHRvIG1lYW4gZGlzY2FyZGluZyB0aGUgbGF5ZXIgYW5kIGJ1aWxkaW5nXG4gICAgICAgIC8vIGFub3RoZXIg4oCUIGFuZCwgYmVjYXVzZSBhZGRpbmcgYSAzRCBsYXllciByZWZyYW1lcywgYSBjYW1lcmEganVtcCB0byB1bmRvIGFzIHdlbGwuXG4gICAgICAgIC8vIG5hcGFyaS1qcyDiiaUgMC4xNCBsZXRzIHRoZSBzY2FsYXJzIGJlIHJlcGxhY2VkIGluIHBsYWNlIOKAlCB0aGUgc2V0dGVyIGJ1bXBzIHRoZVxuICAgICAgICAvLyBsYXllcidzIGRhdGFWZXJzaW9uIHNvIHRoZSB2aXN1YWwgcmUtdXBsb2FkcyDigJQgYW5kIHRoZSBwb3NpdGlvbnMgaGF2ZSBub3QgbW92ZWQsXG4gICAgICAgIC8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgZm9yIHRoZSBjYW1lcmEgdG8gcmVmcmFtZS5cbiAgICAgICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBzY2FsYXJLZXk7XG4gICAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLnZhbHVlcyA9IHZhbHVlc0ZvcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QuY29sb3JtYXAgPSBjb2xvcm1hcDtcbiAgICAgIHRoaXMuc3BhdGlhbFBvaW50czNkLmNvbnRyYXN0TGltaXRzID0gY29udHJhc3RMaW1pdHM7XG4gICAgICB0aGlzLnNwYXRpYWxQb2ludHMzZC5zaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvLyBTZWxlY3Rpb24gaXMgYSBQRVItUE9JTlQgYWxwaGEsIGluIHRoZSBvbmUgbGF5ZXIuXG4gICAgLy9cbiAgICAvLyBJdCB1c2VkIHRvIGJlIGEgc2Vjb25kIGxheWVyOiB3aXRoIGEgc2luZ2xlIG9wYWNpdHkgZm9yIHRoZSB3aG9sZSBjbG91ZCwgdGhlIG9ubHkgd2F5XG4gICAgLy8gdG8gaGlnaGxpZ2h0IGEgc3Vic2V0IHdhcyB0byBkcmF3IGl0IGFnYWluIG9uIHRvcCBhdCBmdWxsIG9wYWNpdHkgd2hpbGUgdGhlIHBhcmVudFxuICAgIC8vIGRyb3BwZWQgdG8gdGhlIG11dGVkIGxldmVsLiBUaGF0IHNlY29uZCBsYXllciBoYWQgdG8gYmUga2VwdCBpbiBzdGVwIHRocm91Z2ggZXZlcnlcbiAgICAvLyBjb2xvcm1hcCwgd2luZG93IGFuZCBzaXplIGNoYW5nZSwgYW5kIHRoZSB0d28gdGhlbiBkZXB0aC1zb3J0ZWQgYWdhaW5zdCBlYWNoIG90aGVyIGFzXG4gICAgLy8gc2VwYXJhdGUgZHJhd3MuIFBlci1wb2ludCBhbHBoYXMgYW5kIHNpemVzIGdpdmUgdGhlIHNhbWUgcmVhZGluZyDigJQgbXV0ZWQgY2xvdWQsIGJyaWdodFxuICAgIC8vIHNlbGVjdGlvbiwgc2xpZ2h0bHkgbGFyZ2VyIHNvIGEgc21hbGwgb25lIGlzIGZpbmRhYmxlIGluc2lkZSAzLjdNIHBvaW50cyDigJQgaW4gb25lLlxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbiA9IHNlbGVjdGlvbi5jb3VudCA+IDAgJiYgc2VsZWN0aW9uLm1hc2subGVuZ3RoID09PSBvYnMuY291bnQ7XG4gICAgY29uc3QgY2xvdWQgPSB0aGlzLnNwYXRpYWxQb2ludHMzZDtcbiAgICBpZiAoY2xvdWQpIHtcbiAgICAgIGNsb3VkLm9wYWNpdHkgPSB2aWV3Lm9wYWNpdHk7XG4gICAgICBpZiAoIWhhc1NlbGVjdGlvbikge1xuICAgICAgICBjbG91ZC5hbHBoYXMgPSBudWxsO1xuICAgICAgICBjbG91ZC5zaXplcyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhbHBoYXMgPSBuZXcgRmxvYXQzMkFycmF5KHNob3duQ291bnQpO1xuICAgICAgICBjb25zdCBzaXplcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2hvd25Db3VudCk7XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2hvd25Db3VudDsgaysrKSB7XG4gICAgICAgICAgY29uc3QgaSA9IHNob3duID8gc2hvd25ba10gOiBrO1xuICAgICAgICAgIGNvbnN0IHBpY2tlZCA9ICEhc2VsZWN0aW9uLm1hc2tbaV07XG4gICAgICAgICAgYWxwaGFzW2tdID0gcGlja2VkID8gMSA6IERFRkFVTFRfTVVURURfT1BBQ0lUWTtcbiAgICAgICAgICBzaXplc1trXSA9IHBpY2tlZCA/IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfU0VMRUNURURfU0laRV9TQ0FMRSA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgY2xvdWQuYWxwaGFzID0gYWxwaGFzO1xuICAgICAgICBjbG91ZC5zaXplcyA9IHNpemVzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBMYXN0LCBzbyBpdCBhbHNvIGNvdmVycyBhIGxheWVyIHRoaXMgcGFzcyBqdXN0IGNyZWF0ZWQuXG4gICAgaWYgKHRoaXMuc3BhdGlhbFBvaW50czNkKSB0aGlzLnNwYXRpYWxQb2ludHMzZC52aXNpYmxlID0gdmlldy5zaG93UG9pbnRzO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlICoqM0QgZ2VuZSBtYXAqKjogdGhlIGFjdGl2ZSBnZW5lJ3MgZXhwcmVzc2lvbiBvdmVyIHRoZSB3aG9sZSBzZWN0aW9uZWRcbiAgICogc3BlY2ltZW4sIGFzIG9uZSByYXltYXJjaGVkIHZvbHVtZS5cbiAgICpcbiAgICogVHdvIHRoaW5ncyBpdCBjYW4gYmUsIGFuZCB0aGUgcGFuZWwncyBgVm9sdW1lIHJlbmRlcmluZ2AgdG9nZ2xlIHBpY2tzIHdoaWNoOlxuICAgKlxuICAgKiAgLSAqKnNoZWV0cyoqIOKAlCBleGFjdGx5IHRoZSBwbGFuZXMgdGhhdCB3ZXJlIGltYWdlZCwgZWFjaCBjYXJyeWluZyB0aGF0XG4gICAqICAgIHNsaWRlJ3Mgb3duIDJEIGdlbmUgbWFwLCB3aXRoIHRoZSBnYXBzIGJldHdlZW4gc2VjdGlvbnMgZW1wdHkuIEEgc3RhY2sgb2ZcbiAgICogICAgbWVhc3VyZWQgZmllbGRzLCBhdCB0aGVpciB0cnVlIHouXG4gICAqICAtICoqdm9sdW1lKiog4oCUIHRoZSBzYW1lIGZpZWxkcyBzbW9vdGhlZCBhbG9uZyB6LCBzbyB0aGUgcGxhbmVzIGJldHdlZW4gdGhlXG4gICAqICAgIHNlY3Rpb25zIGNhcnJ5IGFuIGludGVycG9sYXRlZCB2YWx1ZS4gQW4gZXN0aW1hdGUsIGFuZCBkcmF3biBhcyBhXG4gICAqICAgIHRyYW5zbHVjZW50IGNsb3VkIGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGRlbnNpdHkgdm9sdW1lcyBhcmUuXG4gICAqXG4gICAqIE9uZSBgVm9sdW1lTGF5ZXJgIHJhdGhlciB0aGFuIGEgdGV4dHVyZWQgcXVhZCBwZXIgc2VjdGlvbjogYW4gYEltYWdlTGF5ZXJgXG4gICAqIHJlbmRlcnMgb25seSBhdCBgbmRpc3BsYXkgPT09IDJgLCBzbyA1MyBzaGVldHMgaW4gdGhlIG9yYml0IHZpZXcgd291bGQgbmVlZCBhXG4gICAqIG5ldyBsYXllciB0eXBlIHVwc3RyZWFtIOKAlCB3aGlsZSBhIHNjYWxhciB2b2x1bWUgd2hvc2UgeiBzYW1wbGluZyBhbHJlYWR5IElTXG4gICAqIHRoZSBzZWN0aW9uIHNwYWNpbmcgZXhwcmVzc2VzIHRoZSBzaGVldHMgZXhhY3RseSwgYW5kIHRoZSBzYW1lIGxhdHRpY2UgdGhlblxuICAgKiBnaXZlcyB0aGUgaW50ZXJwb2xhdGVkIHZlcnNpb24gZm9yIGZyZWUuXG4gICAqXG4gICAqIEVzdGltYXRlZCBvbiB0aGUgcmVmZXJlbmNlIHZvbHVtZSdzIG93biBsYXR0aWNlIChgZGVuc2l0eUdyaWRgIGF0IHN0cmlkZSAxKSxcbiAgICogc28gdGhlIGZpZWxkIGxhbmRzIHZveGVsLWZvci12b3hlbCBvbiB0aGUgYW5hdG9teSBhbmQgbmVlZHMgbm8gb2Zmc2V0IOKAlCBhXG4gICAqIGBWb2x1bWVMYXllcmAgaGFzIG5vIHRyYW5zbGF0ZSwgYW5kIG5hcGFyaSBjZW50cmVzIGJvdGggYm94ZXMgb24gdGhlIHdvcmxkXG4gICAqIG9yaWdpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlR2VuZU1hcFZvbHVtZShcbiAgICB2aWV3ZXI6IFZpZXdlciwgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2VuZSA9IHZpZXcuZ2VuZU1hcCAmJiB2aWV3LmNvbG9yQnk/LmtpbmQgPT09ICdmZWF0dXJlJyA/IHZpZXcuY29sb3JCeS5uYW1lIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBzbW9vdGhpbmcgPSB2aWV3LmdlbmVNYXBTbW9vdGhpbmcgPiAwID8gdmlldy5nZW5lTWFwU21vb3RoaW5nIDogMTtcbiAgICBjb25zdCBjbGlwID0gdmlldy5wZXJjZW50aWxlQ2xpcCA/PyBbMC4wMSwgMC45OV07XG4gICAgY29uc3Qgb2JzID0gZGF0YXNldC5vYnNlcnZhdGlvbnM7XG4gICAgLy8gQSB2b2x1bWUgYnVpbHQgZnJvbSBPTkUgc2VjdGlvbiB3b3VsZCBzbWVhciB0aGF0IHNsaWRlIHRocm91Z2ggdGhlIHdob2xlXG4gICAgLy8gZGVwdGgsIHNvIHRoZSBzZWN0aW9uIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgc2hlZXRzLlxuICAgIGNvbnN0IGludGVycG9sYXRlID0gISF2aWV3LmdlbmVNYXBWb2x1bWU7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSBzZWN0aW9uc09mKG9icyk7XG4gICAgY29uc3Qgc2VjdGlvbiA9XG4gICAgICAhaW50ZXJwb2xhdGUgJiYgdmlldy5nZW5lTWFwU2VjdGlvbiAhPSBudWxsICYmIHNlY3Rpb25zICYmIHNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzZWN0aW9uc1tNYXRoLm1heCgwLCBNYXRoLm1pbihzZWN0aW9ucy5sZW5ndGggLSAxLCB2aWV3LmdlbmVNYXBTZWN0aW9uKSldXG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gZ2VuZVxuICAgICAgPyBbXG4gICAgICAgIGRhdGFzZXQuaWQsIGdlbmUsIHNtb290aGluZywgc2VjdGlvbiA/PyAnYWxsJywgaW50ZXJwb2xhdGUgPyAndm9sJyA6ICdzaGVldHMnLFxuICAgICAgICB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLFxuICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBrZXkgPSBmaWVsZEtleVxuICAgICAgPyBbXG4gICAgICAgIGZpZWxkS2V5LCBjbGlwLmpvaW4oJywnKSwgdmlldy5sb2dTY2FsZSA/ICdsb2cnIDogJ2xpbicsIHZpZXcuZ2VuZU1hcE9wYWNpdHksXG4gICAgICAgIHRoaXMuY29udGludW91c0NvbG9ybWFwS2V5KHZpZXcpLFxuICAgICAgXS5qb2luKCd8JylcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdlbmVNYXBWb2x1bWVLZXkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmdlbmVNYXBWb2x1bWVMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIpO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkgfHwgIWdlbmUgfHwgIXBvcnQpIHtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDb2Fyc2VuZWQgaW4tcGxhbmUgYnV0IE5PVCBhbG9uZyB6OiB0aGUgc2hlZXRzIG5lZWQgb25lIHBsYW5lIHBlciBpbWFnZWRcbiAgICAvLyBzZWN0aW9uLCB3aGlsZSB0aGUgZmllbGQgdGhleSBjYXJyeSBpcyBzbW9vdGggYnkgY29uc3RydWN0aW9uIGFuZCBnYWluc1xuICAgIC8vIG5vdGhpbmcgZnJvbSB0aGUgdGVtcGxhdGUncyA0MCDCtW0gZGV0YWlsLiBBdCBmdWxsIHJlc29sdXRpb24gdGhlIGVzdGltYXRlIGlzXG4gICAgLy8gYSA1LjdNLXZveGVsIHBhaXIgb2YgYmx1cnMgb24gdGhlIG1haW4gdGhyZWFkIOKAlCBzZWNvbmRzIG9mIGZyb3plbiBVSSBmb3IgYVxuICAgIC8vIGNoZWNrYm94OyBhbiBlaWdodGggb2YgdGhlIHZveGVscyBpcyBhbiBlaWdodGggb2YgdGhlIHdvcmsuXG4gICAgY29uc3QgZ3JpZCA9IGRlbnNpdHlHcmlkKGRhdGFzZXQsIEdFTkVfTUFQX1ZPTFVNRV9TVFJJREUsIDEyOCwgMSk7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG5cbiAgICBpZiAoZmllbGRLZXkgIT09IHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkS2V5KSB7XG4gICAgICBsZXQgdmFsdWVzOiBGbG9hdDMyQXJyYXk7XG4gICAgICB0cnkge1xuICAgICAgICB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoZ2VuZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSAzRCBnZW5lIG1hcDogXCIke2dlbmV9XCIgdW5hdmFpbGFibGVgLCBlcnIpO1xuICAgICAgICB0aGlzLmdlbmVNYXBWb2x1bWVLZXkgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmdlbmVNYXBWb2x1bWVLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgICAgY29uc3QgaW5TZWxlY3Rpb24gPSBzZWxlY3Rpb24uY291bnQgPiAwID8gbWFza1RvSW5kaWNlcyhzZWxlY3Rpb24ubWFzaykgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBJbi1wbGFuZSBiYW5kd2lkdGggaXMgdGhlIDJEIG1hcCdzLCBpbiB0aGlzIGxhdHRpY2UncyB1bml0cywgc28gYSBzaGVldFxuICAgICAgLy8gYW5kIHRoZSAyRCB2aWV3IG9mIHRoZSBzYW1lIHNlY3Rpb24gYXJlIHRoZSBzYW1lIGZpZWxkLiBBbG9uZyB6IGl0IGlzIHRoZVxuICAgICAgLy8gZGVuc2l0eSBwYXRoJ3MgMS41IHZveGVscyDigJQgdGhlIHNtYWxsZXN0IM+DIHRoYXQgYnJpZGdlcyBvbmUgc2VjdGlvbiBnYXAuXG4gICAgICAvLyBJbi1wbGFuZSDPgyBpcyBhIFBIWVNJQ0FMIGJhbmR3aWR0aCwgYW5jaG9yZWQgdG8gdGhlIHJlZmVyZW5jZSB2b2x1bWUncyBvd25cbiAgICAgIC8vIHZveGVsIOKAlCB0aGUgcmVzb2x1dGlvbiB0aGUgMkQgbWFwIGVzdGltYXRlcyBhdCDigJQgc28gYSBzaGVldCBhbmQgdGhlIDJEXG4gICAgICAvLyB2aWV3IG9mIHRoZSBzYW1lIHNlY3Rpb24gYXJlIHRoZSBzYW1lIGZpZWxkIHdoYXRldmVyIGxhdHRpY2UgdGhpcyBpc1xuICAgICAgLy8gcmFzdGVyaXNlZCBvbi4gQWxvbmcgeiBpdCBpcyB0aGUgZGVuc2l0eSBwYXRoJ3MgMS41IHZveGVsczogdGhlIHNtYWxsZXN0IM+DXG4gICAgICAvLyB0aGF0IGJyaWRnZXMgb25lIHNlY3Rpb24gZ2FwLlxuICAgICAgY29uc3QgaW5QbGFuZSA9IGRhdGFzZXQudm9sdW1lPy52b3hlbFNpemUgPz8gZ3JpZC52b3hlbFNpemU7XG4gICAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZCA9IGV4cHJlc3Npb25Wb2x1bWUob2JzLCBncmlkLCB7XG4gICAgICAgIHNpZ21hOiBbXG4gICAgICAgICAgaW5QbGFuZVswXSAqIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLkdFTkVfTUFQX1NJR01BICogc21vb3RoaW5nLFxuICAgICAgICAgIGluUGxhbmVbMV0gKiBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5HRU5FX01BUF9TSUdNQSAqIHNtb290aGluZyxcbiAgICAgICAgICBncmlkLnZveGVsU2l6ZVsyXSAqIDEuNSAqIHNtb290aGluZyxcbiAgICAgICAgXSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICBpbmRpY2VzOiBzZWN0aW9uICE9IG51bGwgPyBvYnNlcnZhdGlvbnNJblNlY3Rpb24ob2JzLCBzZWN0aW9uKSA6IGluU2VsZWN0aW9uLFxuICAgICAgICBpbnRlcnBvbGF0ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5nZW5lTWFwVm9sdW1lRmllbGRLZXkgPSBmaWVsZEtleTtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZDtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICBjb25zdCBbbG8sIGhpXSA9IGNvbnRyYXN0V2luZG93KGZpZWxkLm1lYW4sIGNsaXBbMF0sIGNsaXBbMV0pO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVFeHByZXNzaW9uVm9sdW1lKGZpZWxkLCBbbG8sIGhpXSwgeyBsb2c6IHZpZXcubG9nU2NhbGUgfSk7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudENvbG9ybWFwIGFzIHsgZGF0YT86IHsgdmFsdWU/OiB1bmtub3duIH0gfSB8IG51bGw7XG4gICAgY29uc3QgbHV0ID0gc3BhdGlhbENvbnRpbnVvdXNMdXQoXG4gICAgICBub2RlPy5kYXRhPy52YWx1ZSwgdGhpcy5jdXJyZW50UmV2ZXJzZSwgdmlldy5jb250aW51b3VzQ29sb3JtYXAsXG4gICAgKTtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVMYXllciA9IHZpZXdlci5hZGRWb2x1bWUoXG4gICAgICBkYXRhLCBmaWVsZC53aWR0aCwgZmllbGQuaGVpZ2h0LCBmaWVsZC5kZXB0aCxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYGdlbmUgbWFwIMK3ICR7Z2VuZX0ke2ludGVycG9sYXRlID8gJyDCtyB2b2x1bWUnIDogJyd9YCxcbiAgICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dChgZ2VuZS1tYXAtJHtnZW5lfWAsIGx1dCksXG4gICAgICAgIC8vIFRoZSBlbmNvZGluZyBhbHJlYWR5IGFwcGxpZWQgdGhlIHdpbmRvdywgc28gdGhlIGxheWVyIG11c3Qgbm90IGFwcGx5IGFcbiAgICAgICAgLy8gc2Vjb25kIG9uZTogMC4uMjU1IGlzIHRoZSB3aG9sZSBvZiB3aGF0IGl0IHdhcyBnaXZlbi5cbiAgICAgICAgY29udHJhc3RMaW1pdHM6IFswLCAyNTVdLFxuICAgICAgICByZW5kZXJpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgIC8vIEFkZGl0aXZlIGxpa2UgdGhlIGRlbnNpdHkgdm9sdW1lcywgYW5kIGZvciB0aGUgc2FtZSByZWFzb246IHRoZSBzaGVldHNcbiAgICAgICAgLy8gaGF2ZSB0byByZWFkIFRIUk9VR0ggZWFjaCBvdGhlciBhbmQgdGhyb3VnaCB0aGUgYW5hdG9teSwgd2hpY2ggYVxuICAgICAgICAvLyB0cmFuc2x1Y2VudCBibGVuZCB3b3VsZCBvY2NsdWRlIG9uZSBzaGVldCBhdCBhIHRpbWUuXG4gICAgICAgIGJsZW5kaW5nOiAnYWRkaXRpdmUnLFxuICAgICAgICBvcGFjaXR5OiB2aWV3LmdlbmVNYXBPcGFjaXR5LFxuICAgICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgICAgfSxcbiAgICApO1xuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2x1c3RlciBkZW5zaXR5IHZvbHVtZXM6IGVhY2ggY2x1c3RlciByYXN0ZXJpc2VkIGludG8gYSBzbW9vdGggc2NhbGFyIGZpZWxkIGFuZFxuICAgKiByYXltYXJjaGVkIGFsb25nc2lkZSB0aGUgY2xvdWQsIHRpbnRlZCB3aXRoIHRoZSBjbHVzdGVyJ3Mgb3duIGxlZ2VuZCBjb2xvdXIuXG4gICAqXG4gICAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIHNlcmlhbGx5IHNlY3Rpb25lZCBkYXRhc2V0IHJlYWRhYmxlIGFzIGFuIGFuYXRvbWljYWxcbiAgICogZGlzdHJpYnV0aW9uLiBUaGUgY2xvdWQgc2hvd3MgbWVhc3VyZWQgY2VsbHMgYW5kIG5vdGhpbmcgZWxzZSDigJQgYnV0IGF0IDIwMCDCtW1cbiAgICogc2VjdGlvbiBzcGFjaW5nIHRoZSBleWUgY2Fubm90IGludGVncmF0ZSBhIHN0YWNrIG9mIGRpc2NzIGludG8gYSBzaGFwZSwgYW5kXG4gICAqIGV2ZXJ5IGdhcCByZWFkcyBhcyBhYnNlbmNlLiBBIGRlbnNpdHkgZmllbGQgaXMgYSBkaWZmZXJlbnQgb2JqZWN0IGZyb20gYSBjZWxsOlxuICAgKiBhbiBlc3RpbWF0ZSwgZGVmaW5lZCBiZXR3ZWVuIHRoZSBpbWFnZWQgcGxhbmVzLCBkcmF3biBhcyBhIHRyYW5zbHVjZW50IGNsb3VkIHNvXG4gICAqIGl0IGNhbm5vdCBiZSBtaXN0YWtlbiBmb3IgbWVhc3VyZW1lbnQuIEluZGl2aWR1YWwgY2VsbHMgYXJlIG5ldmVyIGludGVycG9sYXRlZCDigJRcbiAgICogY29uc2VjdXRpdmUgc2VjdGlvbnMgc2FtcGxlIGRpZmZlcmVudCBjZWxscywgc28gdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcnBvbGF0ZVxuICAgKiBhbG9uZy5cbiAgICpcbiAgICogT25lIHZvbHVtZSBwZXIgY2x1c3RlciByYXRoZXIgdGhhbiBvbmUgZm9yIGV2ZXJ5dGhpbmc6IGFkZGl0aXZlIGJsZW5kaW5nIGlzIHdoYXRcbiAgICogbWFrZXMgdHdvIGNsdXN0ZXJzJyB0ZXJyaXRvcmllcyBjb21wYXJhYmxlLCBhbmQgYSBzaW5nbGUgYmxlbmRlZCBmaWVsZCB3b3VsZFxuICAgKiBhbnN3ZXIgbm8gcXVlc3Rpb24gYW55b25lIGFza3Mgb2YgYSB0YXhvbm9teS4gQ2FwcGVkIGF0XG4gICAqIHtAbGluayBERU5TSVRZX01BWF9DTFVTVEVSU30gYnkgY2VsbCBjb3VudC5cbiAgICpcbiAgICogS2V5ZWQgc28gaXQgcmVidWlsZHMgb25seSB3aGVuIHRoZSBmaWVsZCB3b3VsZCBhY3R1YWxseSBkaWZmZXIg4oCUIHRoZSBkYXRhc2V0LFxuICAgKiB0aGUgY29sb3VyIGNvbHVtbiwgdGhlIGJhbmR3aWR0aCwgb3IgdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGVuc2l0eVZvbHVtZXMoXG4gICAgdmlld2VyOiBWaWV3ZXIsIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLFxuICAgIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9uID0gISF2aWV3LmRlbnNpdHlWb2x1bWUgJiYgISFkYXRhc2V0Lm9ic2VydmF0aW9ucy56O1xuICAgIGNvbnN0IHNtb290aGluZyA9IHZpZXcuZGVuc2l0eVNtb290aGluZyA+IDAgPyB2aWV3LmRlbnNpdHlTbW9vdGhpbmcgOiAxO1xuICAgIGNvbnN0IGNvbHVtbiA9IHZpZXcuY29sb3JCeT8ua2luZCA9PT0gJ2NvbHVtbicgPyB2aWV3LmNvbG9yQnkubmFtZSA6IG51bGw7XG4gICAgLy8gVGhlIHNlbGVjdGlvbiBlbnRlcnMgdGhlIGtleSBieSBJREVOVElUWSwgbm90IGJ5IGNvdW50OiB0d28gZGlmZmVyZW50IFJPSXNcbiAgICAvLyBob2xkaW5nIHRoZSBzYW1lIG51bWJlciBvZiBjZWxscyB3b3VsZCBvdGhlcndpc2UgbG9vayBsaWtlIHRoZSBzYW1lIGtleSBhbmRcbiAgICAvLyBsZWF2ZSB0aGUgcHJldmlvdXMgUk9JJ3MgZmllbGRzIG9uIHNjcmVlbi5cbiAgICBjb25zdCBrZXkgPSBvblxuICAgICAgPyBbZGF0YXNldC5pZCwgY29sdW1uID8/ICdhbGwnLCBzbW9vdGhpbmcsIHRoaXMuc2VsZWN0aW9uUmV2KHNlbGVjdGlvbildLmpvaW4oJ3wnKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChrZXkgPT09IHRoaXMuZGVuc2l0eUtleSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmRlbnNpdHlMYXllcnMpIHZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmRlbnNpdHlMYXllcnMgPSBbXTtcbiAgICB0aGlzLmRlbnNpdHlLZXkgPSBrZXk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcblxuICAgIGNvbnN0IGdyaWQgPSBkZW5zaXR5R3JpZChkYXRhc2V0KTtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICAvLyBXaXRoIG5vIHJlZmVyZW5jZSB2b2x1bWUgdGhlcmUgaXMgbm8gb2Zmc2V0IHlldCwgYW5kIGEgVm9sdW1lTGF5ZXIgaGFzIG5vXG4gICAgLy8gdHJhbnNsYXRlIOKAlCBuYXBhcmkgY2VudHJlcyBpdHMgYm94IG9uIHRoZSB3b3JsZCBvcmlnaW4uIFNvIHRoZSBQT0lOVFMgbW92ZSBieVxuICAgIC8vIGhhbGYgdGhlIGRlbnNpdHkgYm94LCBleGFjdGx5IGFzIHRoZXkgZG8gZm9yIGEgcmVmZXJlbmNlIHZvbHVtZSwgYW5kIHRoZVxuICAgIC8vIGNhY2hlZCBnZW9tZXRyeSBpcyBpbnZhbGlkYXRlZCBiZWNhdXNlIHRoYXQgb2Zmc2V0IGp1c3QgY2hhbmdlZC5cbiAgICBpZiAoIXRoaXMuc3BhdGlhbFZvbHVtZSkge1xuICAgICAgdGhpcy5zcGF0aWFsT3JpZ2luM2QgPSBbXG4gICAgICAgIC0oZ3JpZC53aWR0aCAqIGdyaWQudm94ZWxTaXplWzBdKSAvIDIsXG4gICAgICAgIC0oZ3JpZC5oZWlnaHQgKiBncmlkLnZveGVsU2l6ZVsxXSkgLyAyLFxuICAgICAgICAtKGdyaWQuZGVwdGggKiBncmlkLnZveGVsU2l6ZVsyXSkgLyAyLFxuICAgICAgXTtcbiAgICAgIHRoaXMuc3BhdGlhbExheWVyS2V5M2QgPSBudWxsO1xuICAgIH1cblxuICAgIGxldCBncm91cHM6IHsgbmFtZTogc3RyaW5nOyBjb2xvcjogc3RyaW5nOyBpbmRpY2VzPzogVWludDMyQXJyYXkgfVtdO1xuICAgIHRyeSB7XG4gICAgICBncm91cHMgPSBhd2FpdCB0aGlzLmRlbnNpdHlHcm91cHMoZGF0YXNldCwgY29sdW1uLCBzZWxlY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBkZW5zaXR5IHZvbHVtZXM6IGNvbHVtbiB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgICB0aGlzLmRlbnNpdHlLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmRlbnNpdHlLZXkgIT09IGtleSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2lnbWEgPSBkZWZhdWx0U2lnbWEoZ3JpZCwgc21vb3RoaW5nKTtcbiAgICAvLyBBZGRpdGl2ZSBibGVuZGluZyBTVU1TLCBzbyBhIGZpeGVkIHBlci1sYXllciBvcGFjaXR5IGJsb3dzIG91dCB0byB3aGl0ZSBhc1xuICAgIC8vIHNvb24gYXMgc2V2ZXJhbCBicm9hZCBjbHVzdGVycyBvdmVybGFwIOKAlCBzaXggc3ViY2xhc3NlcyBhdCAwLjU1IGVhY2ggdHVybmVkXG4gICAgLy8gdGhlIGJyYWluIGludG8gb25lIGN5YW4gbWFzcy4gU3BsaXR0aW5nIHRoZSBidWRnZXQga2VlcHMgbiBmdWxseSBvdmVybGFwcGluZ1xuICAgIC8vIHBlYWtzIGluc2lkZSB0aGUgZGlzcGxheSdzIHJhbmdlLCBzbyBvdmVybGFwIHJlYWRzIGFzIG92ZXJsYXA7IGEgc2luZ2xlXG4gICAgLy8gY2x1c3RlciBzdGlsbCBnZXRzIHRoZSBmdWxsIDAuNTUuIEl0IG9ubHkgbWl0aWdhdGVzOiBhIHRyYW5zbHVjZW50IHJheW1hcmNoXG4gICAgLy8gaW50ZWdyYXRlcyBhbG9uZyB0aGUgcmF5LCBzbyBjbHVzdGVycyB0aGF0IGFyZSB1YmlxdWl0b3VzIHJhdGhlciB0aGFuXG4gICAgLy8gcmVnaW9uYWwgKHRoZSBsYXJnZXN0IHN1YmNsYXNzZXMgYXJlIGdsaWEsIHdoaWNoIGFyZSBldmVyeXdoZXJlKSBzdGlsbCBwaWxlXG4gICAgLy8gdXAsIGFuZCBvbmUgY2x1c3RlciBhdCBhIHRpbWUgaXMgdGhlIHJlYWRhYmxlIHdheSB0byBsb29rIGF0IHRob3NlLlxuICAgIGNvbnN0IG9wYWNpdHkgPSBNYXRoLm1pbigwLjU1LCAwLjkgLyBNYXRoLm1heCgxLCBncm91cHMubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXN0ZXJpemVEZW5zaXR5KGRhdGFzZXQub2JzZXJ2YXRpb25zLCBncmlkLCB7IHNpZ21hLCBpbmRpY2VzOiBncm91cC5pbmRpY2VzIH0pO1xuICAgICAgLy8gQSBjbHVzdGVyIHdpdGggbm90aGluZyBvbiB0aGUgZ3JpZCBkcmF3cyBubyBsYXllciwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYm94LlxuICAgICAgaWYgKCFkYXRhKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyIHx8IHRoaXMuZGVuc2l0eUtleSAhPT0ga2V5KSByZXR1cm47XG4gICAgICB0aGlzLmRlbnNpdHlMYXllcnMucHVzaChcbiAgICAgICAgKFxuICAgICAgICAgIHZpZXdlci5hZGRWb2x1bWUoZGF0YSwgZ3JpZC53aWR0aCwgZ3JpZC5oZWlnaHQsIGdyaWQuZGVwdGgsIHtcbiAgICAgICAgICAgIG5hbWU6IGBkZW5zaXR5IMK3ICR7Z3JvdXAubmFtZX1gLFxuICAgICAgICAgICAgY29sb3JtYXA6IHRoaXMuY2hhbm5lbFRpbnRDb2xvcm1hcChncm91cC5jb2xvciksXG4gICAgICAgICAgICAvLyBUcmFuc2x1Y2VudCwgbm90IE1JUDogYSBjbHVzdGVyJ3MgaW50ZXJpb3IgaXMgdGhlIHJlYWRhYmxlIHBhcnQsIGFuZCBNSVBcbiAgICAgICAgICAgIC8vIHdvdWxkIGZsYXR0ZW4gZXZlcnkgY2xvdWQgdG8gaXRzIGJyaWdodGVzdCBzaGVsbC5cbiAgICAgICAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgICAgIG9wYWNpdHksXG4gICAgICAgICAgICAvLyBBZGRpdGl2ZSwgc28gdHdvIGNsdXN0ZXJzIG92ZXJsYXBwaW5nIHJlYWQgYXMgYm90aCBiZWluZyB0aGVyZSBpbnN0ZWFkXG4gICAgICAgICAgICAvLyBvZiB0aGUgbmVhcmVyIG9uZSBoaWRpbmcgdGhlIG90aGVyLlxuICAgICAgICAgICAgYmxlbmRpbmc6ICdhZGRpdGl2ZScsXG4gICAgICAgICAgICB2b3hlbFNpemU6IGdyaWQudm94ZWxTaXplLFxuICAgICAgICAgIH0pKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpdHkgb2YgdGhlIGNvbG91ciBzY2FsZSBhIGNvbnRpbnVvdXMgc3BhdGlhbCBsYXllciB3aWxsIGRyYXcgd2l0aCwgZm9yIGFcbiAgICogY2FjaGUga2V5OiB0aGUgZXhwbGljaXQgY2hvaWNlLCBvciBlbHNlIHRoZSBkaXNwbGF5IGNvbG9ybWFwIGFuZCBpdHMgcmV2ZXJzZVxuICAgKiBmbGFnLCBzaW5jZSB0aGF0IGlzIHdoYXQge0BsaW5rIHNwYXRpYWxDb250aW51b3VzTHV0fSBmYWxscyBiYWNrIHRvLlxuICAgKlxuICAgKiBUaGUgZ2VuZSBtYXBzIGNhY2hlIHRoZWlyIGNvbG91cmVkIG91dHB1dCwgc28gd2l0aG91dCB0aGlzIGluIHRoZSBrZXkgYSBjaGFuZ2VcbiAgICogb2YgY29sb3VyIHNjYWxlIGxlZnQgdGhlIGZpZWxkIG9uIHNjcmVlbiBpbiB0aGUgcHJldmlvdXMgY29sb3VycyDigJQgdGhlIG1hcmtlcnNcbiAgICogcmVjb2xvdXJlZCBhbmQgdGhlIG1hcCB1bmRlciB0aGVtIGRpZCBub3QuXG4gICAqL1xuICBwcml2YXRlIGNvbnRpbnVvdXNDb2xvcm1hcEtleSh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jdXJyZW50Q29sb3JtYXAgYXMgeyBkYXRhPzogeyB2YWx1ZT86IHVua25vd24gfSB9IHwgbnVsbDtcbiAgICByZXR1cm4gW1xuICAgICAgY29sb3JtYXBJZCh2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCksXG4gICAgICBjb2xvcm1hcElkKG5vZGU/LmRhdGE/LnZhbHVlKSxcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPyAncmV2JyA6ICcnLFxuICAgIF0uam9pbignOicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmV2aXNpb24gbnVtYmVyIGZvciBhIHNlbGVjdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIFRoZSBzdG9yZSBoYW5kcyBvdXQgYSBORVcgbWFzayBvYmplY3QgcGVyIGNoYW5nZSwgc28gb2JqZWN0IGlkZW50aXR5IGlzIHRoZVxuICAgKiBjaGVhcCBhbmQgZXhhY3Qgd2F5IHRvIHRlbGwgdHdvIHNlbGVjdGlvbnMgYXBhcnQg4oCUIGEgZmluZ2VycHJpbnQgb3ZlciAzLjdNXG4gICAqIG1hc2sgYnl0ZXMgd291bGQgYmUgbmVpdGhlci4gQ291bnRpbmcgcmV2aXNpb25zIGtlZXBzIHRoZSBjYWNoZSBrZXkgYSBzaG9ydFxuICAgKiBzdHJpbmcuXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdGlvblJldihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogbnVtYmVyIHtcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB0aGlzLmxhc3RTZWxlY3Rpb25TZWVuKSB7XG4gICAgICB0aGlzLmxhc3RTZWxlY3Rpb25TZWVuID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SZXZpc2lvbisrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25SZXZpc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlcnMgdG8gcmFzdGVyaXNlOiB0aGUgY2F0ZWdvcmllcyBvZiB0aGUgYWN0aXZlIGNhdGVnb3JpY2FsIGNvbG91cmluZyxcbiAgICogYmlnZ2VzdCBmaXJzdCBhbmQgY2FwcGVkLCBlYWNoIHdpdGggaXRzIGxlZ2VuZCBjb2xvdXIuXG4gICAqXG4gICAqIFJlc3RyaWN0ZWQgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdoZW4gdGhlcmUgaXMgb25lLCBzbyBcInNlbGVjdCBhIHJlZ2lvbixcbiAgICogY2hlY2sgdGhlIGJveFwiIGFuc3dlcnMgd2hpY2ggY2x1c3RlcnMgbGl2ZSB0aGVyZS4gV2l0aCBubyBjYXRlZ29yaWNhbCBjb2xvdXJpbmdcbiAgICogdGhlcmUgaXMgb25lIGdyb3VwIOKAlCB0b3RhbCBjZWxsIGRlbnNpdHksIHdoaWNoIGlzIGEgcmVhbCBxdWVzdGlvbiBvbiBpdHMgb3duXG4gICAqIChcIndoZXJlIGlzIHRoZSB0aXNzdWUgZGVuc2U/XCIpIGFuZCB0aGUgaG9uZXN0IHRoaW5nIHRvIHNob3cgd2hlbiB0aGUgdmlldyBpc1xuICAgKiBub3QgZW5jb2RpbmcgYSB0YXhvbm9teS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVuc2l0eUdyb3VwcyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgY29sdW1uOiBzdHJpbmcgfCBudWxsLCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICApOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBjb2xvcjogc3RyaW5nOyBpbmRpY2VzPzogVWludDMyQXJyYXkgfVtdPiB7XG4gICAgY29uc3QgbiA9IGRhdGFzZXQub2JzZXJ2YXRpb25zLmNvdW50O1xuICAgIGNvbnN0IGluU2VsZWN0aW9uID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IHNlbGVjdGlvbi5tYXNrIDogbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBtZXRhID0gY29sdW1uID8gZmluZENvbHVtbk1ldGEoZGF0YXNldCwgY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBvcnQgfHwgIWNvbHVtbiB8fCAhbWV0YSB8fCBtZXRhLmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBpblNlbGVjdGlvbiA/IG1hc2tUb0luZGljZXMoaW5TZWxlY3Rpb24pIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgW3IsIGcsIGJdID0gTmFwYXJpVmlzdWFsaXplclNlcnZpY2UuU1BBVElBTF9ORVVUUkFMX0NPTE9SO1xuICAgICAgY29uc3QgaGV4ID0gYCMke1tyLCBnLCBiXS5tYXAoKGMpID0+IE1hdGgucm91bmQoYyAqIDI1NSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpfWA7XG4gICAgICByZXR1cm4gW3sgbmFtZTogaW5TZWxlY3Rpb24gPyAnc2VsZWN0ZWQgY2VsbHMnIDogJ2FsbCBjZWxscycsIGNvbG9yOiBoZXgsIGluZGljZXMgfV07XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4obG9hZGVkKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbG9ycyA9IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhsb2FkZWQubWV0YSk7XG4gICAgY29uc3QgY291bnRzID0gbmV3IFVpbnQzMkFycmF5KGxvYWRlZC5tZXRhLmNhdGVnb3JpZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYgKGluU2VsZWN0aW9uICYmICFpblNlbGVjdGlvbltpXSkgY29udGludWU7XG4gICAgICBjb25zdCBjb2RlID0gbG9hZGVkLmNvZGVzW2ldO1xuICAgICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGNvZGUgPCBjb3VudHMubGVuZ3RoKSBjb3VudHNbY29kZV0rKztcbiAgICB9XG4gICAgY29uc3QgcmFua2VkID0gQXJyYXkuZnJvbShjb3VudHMsIChjb3VudCwgY29kZSkgPT4gKHsgY29kZSwgY291bnQgfSkpXG4gICAgICAuZmlsdGVyKChjKSA9PiBjLmNvdW50ID4gMClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNvdW50IC0gYS5jb3VudClcbiAgICAgIC5zbGljZSgwLCBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5ERU5TSVRZX01BWF9DTFVTVEVSUyk7XG4gICAgaWYgKGNvdW50cy5maWx0ZXIoKGMpID0+IGMgPiAwKS5sZW5ndGggPiByYW5rZWQubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBbbmFwYXJpLWpzXSAke2NvbHVtbn06IGRyYXdpbmcgdGhlICR7cmFua2VkLmxlbmd0aH0gbGFyZ2VzdCBjbHVzdGVycyBhcyBkZW5zaXR5IGAgK1xuICAgICAgICAgICd2b2x1bWVzOyBtb3JlIHRoYW4gdGhhdCBzdG9wIGJlaW5nIHNlcGFyYWJsZSBieSBleWUnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmtlZC5tYXAoKHsgY29kZSB9KSA9PiB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tjb2RlXSk7XG4gICAgICBsZXQgayA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAoaW5TZWxlY3Rpb24gJiYgIWluU2VsZWN0aW9uW2ldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGxvYWRlZC5jb2Rlc1tpXSA9PT0gY29kZSkgaW5kaWNlc1trKytdID0gaTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGxvYWRlZC5tZXRhLmNhdGVnb3JpZXNbY29kZV0sXG4gICAgICAgIGNvbG9yOiBjb2xvcnNbY29kZV0gPz8gJyM4ODg4ODgnLFxuICAgICAgICBpbmRpY2VzOiBpbmRpY2VzLnN1YmFycmF5KDAsIGspLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgKG9yIGtlZXApIHRoZSBkYXRhc2V0J3MgcmVmZXJlbmNlIHZvbHVtZSwgYW5kIGRlcml2ZSB0aGUgb2Zmc2V0IHRoYXQgc2l0cyB0aGVcbiAgICogb2JzZXJ2YXRpb25zIGluc2lkZSBpdC5cbiAgICpcbiAgICogYFZvbHVtZUxheWVyYCBoYXMgbm8gdHJhbnNsYXRlOiBuYXBhcmktanMgbWFwcyB0aGUgdm9sdW1lJ3MgdW5pdCBjdWJlIHRvIGEgd29ybGQgYm94XG4gICAqICoqY2VudHJlZCBvbiB0aGUgb3JpZ2luKiosIHNpemVkIGBkaW1zIHggdm94ZWxTaXplYC4gVGhlIG9ic2VydmF0aW9ucywgYnkgY29udHJhY3QsIGFyZSBpblxuICAgKiB0aGUgdm9sdW1lJ3Mgb3duIGZyYW1lIHdpdGggaXRzIG5lYXIgY29ybmVyIGF0IHRoZSBjb29yZGluYXRlIG9yaWdpbi4gU28gdGhlIHR3byBvbmx5IGxpbmVcbiAgICogdXAgaWYgdGhlIFBPSU5UUyBtb3ZlIOKAlCBieSBoYWxmIHRoZSBib3gg4oCUIHdoaWNoIGlzIHdoYXQge0BsaW5rIHNwYXRpYWxPcmlnaW4zZH0gaXMuXG4gICAqXG4gICAqIEEgZmFpbGVkIG9yIGFic2VudCB2b2x1bWUgaXMgbm90IGZhdGFsOiB0aGUgY2xvdWQgcmVuZGVycyBvbiBpdHMgb3duLCBhdCBpdHMgb3duXG4gICAqIGNvb3JkaW5hdGVzLCBhbmQgdGhlIGNhbWVyYSBmcmFtZXMgdGhlIHBvaW50cyBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTcGF0aWFsVm9sdW1lKFxuICAgIHZpZXdlcjogVmlld2VyLCBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudm9sdW1lO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLnNwYXRpYWxEYXRhO1xuICAgIGNvbnN0IGtleSA9IG1ldGEgPyBgJHtkYXRhc2V0LmlkfToke21ldGEud2lkdGh9eCR7bWV0YS5oZWlnaHR9eCR7bWV0YS5kZXB0aH1gIDogbnVsbDtcbiAgICBpZiAoa2V5ICYmIGtleSA9PT0gdGhpcy5zcGF0aWFsVm9sdW1lS2V5KSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5zcGF0aWFsVm9sdW1lKSB7XG4gICAgICB2aWV3ZXIubGF5ZXJzLnJlbW92ZSh0aGlzLnNwYXRpYWxWb2x1bWUpO1xuICAgICAgdGhpcy5zcGF0aWFsVm9sdW1lID0gbnVsbDtcbiAgICAgIHRoaXMuc3BhdGlhbFZvbHVtZUtleSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3BhdGlhbE9yaWdpbjNkID0gWzAsIDAsIDBdO1xuICAgIGlmICghbWV0YSB8fCAhcG9ydD8uZ2V0Vm9sdW1lKSByZXR1cm47XG5cbiAgICBsZXQgdm94ZWxzOiBVaW50OEFycmF5O1xuICAgIHRyeSB7XG4gICAgICB2b3hlbHMgPSBhd2FpdCBwb3J0LmdldFZvbHVtZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSByZWZlcmVuY2Ugdm9sdW1lIHVuYXZhaWxhYmxlIOKAlCBkcmF3aW5nIHRoZSBjbG91ZCBhbG9uZScsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG5cbiAgICBjb25zdCBbdngsIHZ5LCB2el0gPSBtZXRhLnZveGVsU2l6ZTtcbiAgICB0aGlzLnNwYXRpYWxWb2x1bWVLZXkgPSBrZXk7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lID0gKFxuICAgICAgdmlld2VyLmFkZFZvbHVtZSh2b3hlbHMsIG1ldGEud2lkdGgsIG1ldGEuaGVpZ2h0LCBtZXRhLmRlcHRoLCB7XG4gICAgICBuYW1lOiAncmVmZXJlbmNlIHZvbHVtZScsXG4gICAgICBjb2xvcm1hcDogJ2dyYXknLFxuICAgICAgLy8gTUlQIHdvdWxkIGRyYXcgdGhlIGJyaWdodGVzdCB2b3hlbCBhbG9uZyBlYWNoIHJheSwgd2hpY2ggZm9yIGFuIGF2ZXJhZ2VkXG4gICAgICAvLyB0ZW1wbGF0ZSBtZWFucyBhIGZsYXQgd2hpdGUgc2hlbGwgdGhhdCBoaWRlcyB0aGUgY2xvdWQuIFRyYW5zbHVjZW50IGxldHNcbiAgICAgIC8vIHRoZSBwb2ludHMgcmVhZCB0aHJvdWdoIHRoZSB0aXNzdWUsIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgZHJhd2luZ1xuICAgICAgLy8gdGhlbSB0b2dldGhlci5cbiAgICAgIHJlbmRlcmluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgIG9wYWNpdHk6IHZpZXcudm9sdW1lT3BhY2l0eSxcbiAgICAgICAgdm94ZWxTaXplOiBbdngsIHZ5LCB2el0sXG4gICAgICB9KSk7XG4gICAgLy8gSGFsZiB0aGUgYm94LCBuZWdhdGVkOiB0aGUgb2JzZXJ2YXRpb25zJyBvcmlnaW4gaXMgdGhlIGJveCdzIG5lYXIgY29ybmVyLFxuICAgIC8vIGFuZCB0aGUgYm94IGlzIGNlbnRyZWQgb24gdGhlIHdvcmxkIG9yaWdpbi5cbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFtcbiAgICAgIC0obWV0YS53aWR0aCAqIHZ4KSAvIDIsXG4gICAgICAtKG1ldGEuaGVpZ2h0ICogdnkpIC8gMixcbiAgICAgIC0obWV0YS5kZXB0aCAqIHZ6KSAvIDIsXG4gICAgXTtcbiAgICAvLyBGb3JjZSBhIGdlb21ldHJ5IHJlYnVpbGQ6IHRoZSBvZmZzZXQgY2hhbmdlZCwgc28gY2FjaGVkIHBvc2l0aW9ucyBhcmUgc3RhbGUuXG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwYXRpYWwzZExheWVycyh2aWV3ZXI6IFZpZXdlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgW1xuICAgICAgdGhpcy5zcGF0aWFsUG9pbnRzM2QsIHRoaXMuc3BhdGlhbFZvbHVtZSxcbiAgICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyLCAuLi50aGlzLmRlbnNpdHlMYXllcnMsXG4gICAgXSkge1xuICAgICAgaWYgKGxheWVyKSB2aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgfVxuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVLZXkgPSBudWxsO1xuICAgIHRoaXMuZ2VuZU1hcFZvbHVtZUZpZWxkID0gbnVsbDtcbiAgICB0aGlzLmdlbmVNYXBWb2x1bWVGaWVsZEtleSA9IG51bGw7XG4gICAgdGhpcy5kZW5zaXR5TGF5ZXJzID0gW107XG4gICAgdGhpcy5kZW5zaXR5S2V5ID0gbnVsbDtcbiAgICAvLyBUaGUgc2NlbmUgaXMgZ29uZSwgc28gdGhlIG5leHQgM0QgbGF5ZXIgc2hvdWxkIGZyYW1lIGl0c2VsZiBhZ2Fpbi4gVGhhdCB1c2VkIHRvIGJlXG4gICAgLy8gYHNwYXRpYWxGcmFtZWQgPSBudWxsYCBuZXh0IHRvIGEgaGFuZC1yb2xsZWQgc2F2ZS9yZXN0b3JlOyB0aGUgcmVuZGVyZXIgb3ducyB0aGVcbiAgICAvLyBwb2xpY3kgbm93LCBhbmQgdGhpcyBpcyB0aGUgc2FtZSBzdGF0ZW1lbnQgYWRkcmVzc2VkIHRvIGl0LlxuICAgIHZpZXdlci5yZXNldEZpdDNEKCk7XG4gICAgdGhpcy5zcGF0aWFsMmRGcmFtZWQgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxEcmF3bjNkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBBIG9uZS1jb2xvdXIgY29sb3JtYXAsIGZvciB0aGUgXCJub3RoaW5nIHRvIGNvbG91ciBieVwiIHN0YXRlLiAqL1xuICBwcml2YXRlIHNwYXRpYWxGbGF0Q29sb3JtYXAoKTogQ29sb3JtYXAge1xuICAgIGNvbnN0IFtyLCBnLCBiXSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICBjb25zdCByZ2I6IFJnYiA9IFtNYXRoLnJvdW5kKHIgKiAyNTUpLCBNYXRoLnJvdW5kKGcgKiAyNTUpLCBNYXRoLnJvdW5kKGIgKiAyNTUpXTtcbiAgICAvLyBUd28gaWRlbnRpY2FsIHN0b3BzOiBjb2xvcm1hcEZyb21MdXQgbmVlZHMgYXQgbGVhc3QgdHdvLCBhbmQgZXF1YWwgZW5kc1xuICAgIC8vIG1ha2UgZXZlcnkgdmFsdWUgcmVzb2x2ZSB0byB0aGUgc2FtZSBjb2xvdXIuXG4gICAgcmV0dXJuIGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1mbGF0JywgW3JnYiwgcmdiXSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBlci1wb2ludCBzY2FsYXIgKyBjb2xvcm1hcCArIHdpbmRvdyB0aGF0IGNvbG91ciB0aGUgM0QgY2xvdWQuXG4gICAqXG4gICAqIENvbnRpbnVvdXMgZGF0YSBpcyB0aGUgbmF0dXJhbCBmaXQ6IHZhbHVlcyBnbyBzdHJhaWdodCB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgd2l0aCB0aGVcbiAgICogc2FtZSBwZXJjZW50aWxlIHdpbmRvdyB0aGUgMkQgcGF0aCB1c2VzLiBDYXRlZ29yaWNhbCBkYXRhIGhhcyB0byBiZSBzbXVnZ2xlZCB0aHJvdWdoIHRoZSBzYW1lXG4gICAqIHNjYWxhciBjaGFubmVsIOKAlCBzZWUge0BsaW5rIFNQQVRJQUxfM0RfTUFYX0NBVEVHT1JJRVN9LiBDb2RlcyBtYXAgdG8gTFVUIGJsb2NrcywgYW5kXG4gICAqIGBjb250cmFzdExpbWl0c2Agb2YgYFstMC41LCBLIC0gMC41XWAgcHV0cyBjb2RlIGBpYCBhdCB0aGUgY2VudHJlIG9mIGJsb2NrIGBpYCwgd2hpY2ggaXMgd2hhdFxuICAgKiBtYWtlcyB0aGUgcm91bmQtdHJpcCBleGFjdCBpbnN0ZWFkIG9mIGFwcHJveGltYXRlbHkgcmlnaHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNwYXRpYWxTY2FsYXIzZChcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTxTcGF0aWFsM2RFbmNvZGluZyB8IG51bGw+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIGlmICghcG9ydCB8fCAhY29sb3JCeSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoY29sdW1uLmNvZGVzLCByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29sdW1uLm1ldGEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgICAgIGNvbHVtbi52YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBwb3J0LmdldEZlYXR1cmVWZWN0b3IoY29sb3JCeS5uYW1lKTtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGVTcGF0aWFsM2RDb250aW51b3VzKFxuICAgICAgdmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLFxuICAgICk7XG4gIH1cblxuICAvKiogQ2F0ZWdvcnkgY29kZXMg4oaSIGEgc3RlcHBlZCBMVVQsIGV4YWN0IGZvciB1cCB0byB7QGxpbmsgU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFU30uICovXG4gIHByaXZhdGUgZW5jb2RlU3BhdGlhbDNkQ2F0ZWdvcmljYWwoY29kZXM6IFVpbnQxNkFycmF5LCBjb2xvcnM6IHN0cmluZ1tdKTogU3BhdGlhbDNkRW5jb2RpbmcgfCBudWxsIHtcbiAgICAvLyBTbG90IDAgaXMgcmVzZXJ2ZWQgZm9yIFwibm8gY2F0ZWdvcnlcIiwgc28gdGhlIHBhbGV0dGUgb2NjdXBpZXMgMS4uSyBhbmQgdGhlXG4gICAgLy8gYmxvY2sgY291bnQgaXMgb25lIG1vcmUgdGhhbiB0aGUgY2F0ZWdvcnkgY291bnQg4oCUIHdoaWNoIGlzIHdoeSB0aGUgcHVibGlzaGVkXG4gICAgLy8gY2VpbGluZyBpcyA5NSBjYXRlZ29yaWVzIHJhdGhlciB0aGFuIHRoZSBMVVQncyA5NiBkaXN0aW5ndWlzaGFibGUgYmxvY2tzLlxuICAgIGlmIChjb2xvcnMubGVuZ3RoID4gU1BBVElBTF8zRF9NQVhfQ0FURUdPUklFUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW25hcGFyaS1qc10gJHtjb2xvcnMubGVuZ3RofSBjYXRlZ29yaWVzIGV4Y2VlZHMgdGhlICR7U1BBVElBTF8zRF9NQVhfQ0FURUdPUklFU30gdGhlIDNEIGBcbiAgICAgICAgKyBcImxheWVyJ3MgMjU2LWVudHJ5IExVVCBjYW4gaG9sZCBkaXN0aW5jdGx5OyBkcmF3aW5nIGZsYXQgaW5zdGVhZCBvZiB3aXRoIHdyb25nIGNvbG91cnNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgayA9IGNvbG9ycy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IHBhbGV0dGU6IFJnYltdID0gW1xuICAgICAgTUlTU0lOR19DT0xPUixcbiAgICAgIC4uLmNvbG9ycy5tYXAocGFyc2VIZXgpLFxuICAgIF07XG4gICAgY29uc3QgbHV0OiBSZ2JbXSA9IG5ldyBBcnJheShMVVRfU0laRSk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBMVVRfU0laRTsgaisrKSB7XG4gICAgICBsdXRbal0gPSBwYWxldHRlW01hdGgubWluKGsgLSAxLCBNYXRoLmZsb29yKChqICogaykgLyBMVVRfU0laRSkpXTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShjb2Rlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXSA9IGNvZGVzW2ldID09PSBOT19DQVRFR09SWSA/IDAgOiBjb2Rlc1tpXSArIDE7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZXMsXG4gICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNhdGVnb3JpZXMnLCBsdXQpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFstMC41LCBrIC0gMC41XSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnRpbnVvdXMgdmFsdWVzIOKGkiB0aGUgYWN0aXZlIGNvbG9ybWFwIG92ZXIgYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LiAqL1xuICBwcml2YXRlIGVuY29kZVNwYXRpYWwzZENvbnRpbnVvdXMoXG4gICAgc291cmNlOiBGbG9hdDMyQXJyYXksIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGxvZzogYm9vbGVhbixcbiAgKTogU3BhdGlhbDNkRW5jb2Rpbmcge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBsZXQgdmFsdWVzID0gc291cmNlO1xuICAgIGlmIChsb2cpIHtcbiAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykgdmFsdWVzW2ldID0gTWF0aC5sb2cxcChNYXRoLm1heCgwLCBzb3VyY2VbaV0pKTtcbiAgICB9XG4gICAgY29uc3QgW21pbiwgbWF4XSA9IGNvbnRyYXN0V2luZG93KHZhbHVlcywgbG8sIGhpKTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWVzLFxuICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1jb250aW51b3VzJywgbHV0KSxcbiAgICAgIC8vIEEgZGVnZW5lcmF0ZSB3aW5kb3cgd291bGQgZGl2aWRlIGJ5IHplcm8gaW4gdGhlIHNoYWRlcidzIG5vcm1hbGlzYXRpb24uXG4gICAgICBjb250cmFzdExpbWl0czogbWF4ID4gbWluID8gW21pbiwgbWF4XSA6IFttaW4sIG1pbiArIDFdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyLW9ic2VydmF0aW9uIGNvbG91cnMgZm9yIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUsIG9yIGEgc2luZ2xlIGZsYXQgY29sb3VyIHdoZW4gbm90aGluZyBpc1xuICAgKiBzZWxlY3RlZCB0byBjb2xvdXIgYnkuIENhdGVnb3JpY2FsIGNvbHVtbnMgdXNlIHRoZSBjb2x1bW4ncyBvd24gcGFsZXR0ZTsgY29udGludW91cyBjb2x1bW5zXG4gICAqIGFuZCBnZW5lIHZlY3RvcnMgZ28gdGhyb3VnaCB0aGUgYWN0aXZlIGNvbG9ybWFwIHdpdGggYSBwZXJjZW50aWxlLWNsaXBwZWQgd2luZG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzcGF0aWFsRmFjZUNvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiB0b1JnYmFUdXBsZXM+IHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5zcGF0aWFsRGF0YTtcbiAgICBjb25zdCBjb2xvckJ5ID0gdmlldy5jb2xvckJ5O1xuICAgIC8vIEV2ZXJ5dGhpbmcgTk9UIHNlbGVjdGVkIGlzIG11dGVkOyB3aXRoIG5vdGhpbmcgc2VsZWN0ZWQsIG5vdGhpbmcgaXMgbXV0ZWRcbiAgICAvLyBhbmQgdGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSAodGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUpLlxuICAgIGNvbnN0IG11dGVkID0gbXV0ZWRGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7XG5cbiAgICBpZiAoIXBvcnQgfHwgIWNvbG9yQnkpIHtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIEdlbnVpbmVseSB1bmlmb3JtOiBvbmUgYnJvYWRjYXN0IHR1cGxlLCBzbyBhIGZsYXQgODRrLW9ic2VydmF0aW9uIHZpZXdcbiAgICAgIC8vIGRvZXMgbm90IGFsbG9jYXRlIDg0ayBvZiB0aGVtLlxuICAgICAgaWYgKCFtdXRlZCAmJiB2aWV3Lm9wYWNpdHkgPj0gMSkgcmV0dXJuIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLlNQQVRJQUxfTkVVVFJBTF9DT0xPUjtcbiAgICAgIC8vIE5vdCB1bmlmb3JtIOKAlCB0aGUgb3BhY2l0eSBjb250cm9sIG9yIGEgc2VsZWN0aW9uIHZhcmllcyB0aGUgYWxwaGEsIHNvIGl0XG4gICAgICAvLyBoYXMgdG8gYmUgcGVyLXBvaW50LiBSZXR1cm5pbmcgdGhlIGNvbnN0YW50IHR1cGxlIGhlcmUgaXMgd2hhdCBtYWRlIHRoZVxuICAgICAgLy8gT3BhY2l0eSBzbGlkZXIgZG8gbm90aGluZyBpbiB0aGUgZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXMgdGhlIHN0YXRlIGFueW9uZVxuICAgICAgLy8gbGFuZHMgaW4gYmVmb3JlIHBpY2tpbmcgYSBjb2xvdXIgc291cmNlLlxuICAgICAgY29uc3QgaGV4ID0gYCMke1tyLCBnLCBiXS5tYXAoKGMpID0+IE1hdGgucm91bmQoYyAqIDI1NSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpfWA7XG4gICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKGVuY29kZUNhdGVnb3JpY2FsKG5ldyBVaW50MTZBcnJheShkYXRhc2V0Lm9ic2VydmF0aW9ucy5jb3VudCksIHtcbiAgICAgICAgY29sb3JzOiBbaGV4XSxcbiAgICAgICAgb3BhY2l0eTogdmlldy5vcGFjaXR5LFxuICAgICAgICBtdXRlZCxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAoY29sb3JCeS5raW5kID09PSAnY29sdW1uJykge1xuICAgICAgY29uc3QgY29sdW1uOiBTcGF0aWFsQ29sdW1uID0gYXdhaXQgcG9ydC5nZXRDb2x1bW4oY29sb3JCeS5uYW1lKTtcbiAgICAgIGlmIChpc0NhdGVnb3JpY2FsQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgY29uc3QgcmdiYSA9IGVuY29kZUNhdGVnb3JpY2FsKGNvbHVtbi5jb2Rlcywge1xuICAgICAgICAgIGNvbG9yczogcmVzb2x2ZUNhdGVnb3J5Q29sb3JzKGNvbHVtbi5tZXRhKSxcbiAgICAgICAgICBvcGFjaXR5OiB2aWV3Lm9wYWNpdHksXG4gICAgICAgICAgbXV0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcm91cHMgc3dpdGNoZWQgb2ZmIGluIHRoZSBDZWxscyBwYW5lbCBoaWRlIHRoZWlyIGRvdHMgdG9vLCB3aGVuIHRoZSBkb3RzIGFyZVxuICAgICAgICAvLyBjb2xvdXJlZCBieSB0aGF0IHNhbWUgZ3JvdXBpbmcuXG4gICAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0gY2VsbFR5cGVDb2x1bW5Gb3IoZGF0YXNldCwgdmlldyk7XG4gICAgICAgIGlmICh2aWV3LmhpZGRlbkdyb3Vwcz8ubGVuZ3RoICYmIGdyb3VwQ29sdW1uID09PSBjb2xvckJ5Lm5hbWUpIHtcbiAgICAgICAgICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcuaGlkZGVuR3JvdXBzKTtcbiAgICAgICAgICBjb25zdCBoaWRlID0gY29sdW1uLm1ldGEuY2F0ZWdvcmllcy5tYXAoKGMpID0+IG9mZi5oYXMoYykpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uLmNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY29sdW1uLmNvZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGMgIT09IE5PX0NBVEVHT1JZICYmIGhpZGVbY10pIHJnYmFbNCAqIGkgKyAzXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b1JnYmFUdXBsZXMocmdiYSk7XG4gICAgICB9XG4gICAgICAvLyBBIGNvbnRpbnVvdXMgY29sdW1uIG1heSBjYXJyeSBpdHMgb3duIGxvZyBoaW50IChjb3VudHMpOyB0aGUgdmlldydzXG4gICAgICAvLyB0b2dnbGUgd2lucyBvbmNlIHRoZSB1c2VyIGhhcyBzZXQgaXQuXG4gICAgICByZXR1cm4gdG9SZ2JhVHVwbGVzKHRoaXMuZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgICAgIGNvbHVtbi52YWx1ZXMsIHZpZXcsIHZpZXcubG9nU2NhbGUsIG11dGVkLFxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgcG9ydC5nZXRGZWF0dXJlVmVjdG9yKGNvbG9yQnkubmFtZSk7XG4gICAgcmV0dXJuIHRvUmdiYVR1cGxlcyh0aGlzLmVuY29kZVNwYXRpYWxDb250aW51b3VzKFxuICAgICAgdmFsdWVzLCB2aWV3LCB2aWV3LmxvZ1NjYWxlLCBtdXRlZCxcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBDb250aW51b3VzIHZhbHVlcyDihpIgUkdCQSB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgYW5kIGEgY2xpcHBlZCB3aW5kb3cuICovXG4gIHByaXZhdGUgZW5jb2RlU3BhdGlhbENvbnRpbnVvdXMoXG4gICAgdmFsdWVzOiBGbG9hdDMyQXJyYXksIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGxvZzogYm9vbGVhbixcbiAgICBtdXRlZDogVWludDhBcnJheSB8IG51bGwgPSBudWxsLFxuICApOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRDb2xvcm1hcCBhcyB7IGRhdGE/OiB7IHZhbHVlPzogdW5rbm93biB9IH0gfCBudWxsO1xuICAgIGNvbnN0IGx1dCA9IHNwYXRpYWxDb250aW51b3VzTHV0KFxuICAgICAgbm9kZT8uZGF0YT8udmFsdWUsIHRoaXMuY3VycmVudFJldmVyc2UsIHZpZXcuY29udGludW91c0NvbG9ybWFwLFxuICAgICk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSB2aWV3LnBlcmNlbnRpbGVDbGlwID8/IFswLjAxLCAwLjk5XTtcbiAgICBjb25zdCBbbWluLCBtYXhdID0gY29udHJhc3RXaW5kb3codmFsdWVzLCBsbywgaGkpO1xuICAgIHJldHVybiBlbmNvZGVDb250aW51b3VzKHZhbHVlcywgeyBsdXQsIG1pbiwgbWF4LCBsb2csIG9wYWNpdHk6IHZpZXcub3BhY2l0eSwgbXV0ZWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TQ0FUVEVSM0QgM0Qgc2NhdHRlcjogdGhlIGRvd25zYW1wbGVkIHZveGVsIGdyaWQgYXMgYSAzRCBwb2ludCBjbG91ZCBjb2xvcmVkXG4gICAqIGJ5IGludGVuc2l0eSAobmFwYXJpLWpzIGFuYWxvZyBvZiBQbG90bHkncyB2b3hlbCBzY2F0dGVyM2QpLiBBc3NlbWJsZXMgYSBjb2Fyc2Ugdm9sdW1lLCB0aGVuXG4gICAqIGVtaXRzIGEgZmxhdC1zdHJpZGVkIHNhbXBsZSBvZiB2b3hlbHMgKGNhcHBlZCBhdCB7QGxpbmsgU0NBVFRFUjNEX01BWF9QT0lOVFN9KSB2aWEgYGFkZFBvaW50czNEYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW91bnRTY2F0dGVyM2Qodmlld2VyOiBWaWV3ZXIsIGluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgIHRoaXMudm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdm9sdW1lUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICBsZXQgdm9sOiB7IGRhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyBkZXB0aDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdm9sID0gYXdhaXQgdGhpcy5hc3NlbWJsZVZvbHVtZShpbmZvLCB7XG4gICAgICAgIG1heFNsaWNlOiBNYXRoLm1pbihyZXMubWF4U2xpY2UsIFNDQVRURVIzRF9NQVhfWFkpLFxuICAgICAgICBzbGljZVN0ZXA6IHJlcy5zbGljZVN0ZXAsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gICAgaWYgKCF2b2wgfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sO1xuICAgIGNvbnN0IHpTY2FsZSA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpIC8gTWF0aC5tYXgoMSwgZGVwdGgpOyAvLyDiiYggY3ViaWMgYXNwZWN0XG4gICAgY29uc3QgdG90YWwgPSB3aWR0aCAqIGhlaWdodCAqIGRlcHRoO1xuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbCAvIFNDQVRURVIzRF9NQVhfUE9JTlRTKSk7XG4gICAgY29uc3QgcG9zOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHZhbDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpICs9IHN0cmlkZSkge1xuICAgICAgY29uc3QgeCA9IGkgJSB3aWR0aDtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLmZsb29yKGkgLyB3aWR0aCkgJSBoZWlnaHQ7XG4gICAgICBjb25zdCB6aSA9IE1hdGguZmxvb3IoaSAvICh3aWR0aCAqIGhlaWdodCkpO1xuICAgICAgcG9zLnB1c2goeCwgeSwgemkgKiB6U2NhbGUpO1xuICAgICAgdmFsLnB1c2goZGF0YVtpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3QgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IHZpZXdlci5hZGRQb2ludHMzRChuZXcgRmxvYXQzMkFycmF5KHBvcyksIG5ldyBGbG9hdDMyQXJyYXkodmFsKSwge1xuICAgICAgY29sb3JtYXA6IHRoaXMudm9sdW1lQ29sb3JtYXAoc3QpLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XSxcbiAgICAgIHNpemU6IDMsXG4gICAgfSk7XG4gICAgdGhpcy5pbWFnZVcgPSB3aWR0aDtcbiAgICB0aGlzLmltYWdlSCA9IGhlaWdodDtcbiAgICB0aGlzLnZvbHVtZURpbXMgPSB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG4gICAgLy8gRmVlZCB0aGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSBmcm9tIHRoZSBhc3NlbWJsZWQgdm9sdW1lIChrZXkgMCkuXG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIGRhdGEpO1xuICAgIHRoaXMuc3Vic2NyaWJlU2NhdHRlcjNkRGlzcGxheVN0YXRlKCk7XG4gICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gIH1cblxuICAvKiogU3RvcmUgY29sb3JtYXAgLyByZXZlcnNlIC8gaW52ZXJ0IC8gY2hhbm5lbCB3aW5kb3cg4oaSIHRoZSAzRCBzY2F0dGVyJ3MgY29sb3JtYXAgKyBjb250cmFzdC4gKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVTY2F0dGVyM2REaXNwbGF5U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlzcGxheVN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVsc10pID0+IHtcbiAgICAgIHRoaXMuY3VycmVudENvbG9ybWFwID0gKGNvbG9ybWFwIGFzIENvbG9ybWFwTm9kZSkgPz8gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFJldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5pbnZlcnRFbmFibGVkID0gaW52ZXJ0O1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnNjYXR0ZXIzZExheWVyO1xuICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuICAgICAgY29uc3Qgc3QgPSBjaGFubmVsc1swXTtcbiAgICAgIGxheWVyLmNvbG9ybWFwID0gdGhpcy52b2x1bWVDb2xvcm1hcChzdCk7XG4gICAgICBpZiAoc3QpIGxheWVyLmNvbnRyYXN0TGltaXRzID0gW3N0Lm1pbiwgc3QubWF4XTtcbiAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW91bnQgdGhlIE5BUEFSSV9TVVJGQUNFIGhlaWdodC1maWVsZCBzdXJmYWNlLiBBIGhlaWdodCBmaWVsZCBpcyBzaW5nbGUtc2NhbGFyLCBzbyBmb3IgYVxuICAgKiBtdWx0aWNoYW5uZWwgaW1hZ2UgdGhlIHN1cmZhY2UgZm9sbG93cyBPTkUgYmFuZCDigJQgdGhlIGZpcnN0IHZpc2libGUgY2hhbm5lbCAoZmFsbGJhY2sgMCkg4oCUXG4gICAqIGNvbG91cmVkIGJ5IHRoYXQgY2hhbm5lbCdzIHdpbmRvdy9jb2xvcm1hcCAobGlrZSB0aGUgUGxvdGx5IFNVUkZBQ0UsIHdoaWNoIGlzIGdyYXlzY2FsZS1vbmx5KS5cbiAgICogUHJlLWxvYWRzIGV2ZXJ5IHNsaWNlJ3MgaGVpZ2h0IGRhdGEgd2l0aCBhIHByb2dyZXNzIGJhciAoYXMgdGhlIHZvbHVtZSBkb2VzKSBzbyB0aGUgc3RhY2tcbiAgICogc2xpZGVyIHJlLXNsaWNlcyBpbnN0YW50bHksIHRoZW4gYnVpbGRzIHRoZSBtZXNoIGZvciB0aGUgY3VycmVudCBzbGljZS4gQWxsIG1lc2ggKyBHUFUgd29ya1xuICAgKiBsaXZlcyBpbiBuYXBhcmktanMgKGBoZWlnaHRGaWVsZGAgKyBgVmlld2VyLmFkZFN1cmZhY2VgKTsgdGhpcyBiYWNrZW5kIHN1cHBsaWVzIHNjYWxhciBzbGljZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U3VyZmFjZSh2aWV3ZXI6IFZpZXdlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSBhd2FpdCB0aGlzLmVuc3VyZURlc2NyaXB0b3IoKTtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbztcbiAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsVXJscykgaGFzIG5vIGRlc2NyaXB0b3Ig4oCUIGRldGVjdFxuICAgIC8vIGl0IGZyb20gaW1hZ2VNZXRhIHNvIHRoZSBTdXJmYWNlIHN0aWxsIGZvbGxvd3Mgb25lIGJhbmQuXG4gICAgY29uc3Qgc2ltcGxlTWMgPSB0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGluZm8pICYmICEhaW5mbz8uY2hhbm5lbFVybHM/Lmxlbmd0aFxuICAgICAgJiYgKGluZm8/LmltYWdlTWV0YT8uWzBdPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGNvbnN0IG11bHRpY2hhbm5lbCA9IHNpbXBsZU1jIHx8ICghIWRlc2M/Lm11bHRpY2hhbm5lbCAmJiAoZGVzYz8uY2hhbm5lbHMgPz8gMSkgPiAxKTtcbiAgICB0aGlzLnN1cmZhY2VNdWx0aWNoYW5uZWwgPSBtdWx0aWNoYW5uZWw7XG4gICAgLy8gQSBoZWlnaHQgZmllbGQgaXMgc2luZ2xlLXNjYWxhciDihpIgZm9sbG93IHRoZSBwYW5lLVNFTEVDVEVEIGNoYW5uZWwuXG4gICAgdGhpcy5zdXJmYWNlQ2hhbm5lbCA9IG11bHRpY2hhbm5lbCA/IHRoaXMuc3RvcmUuY3VycmVudFNlbGVjdGVkQ2hhbm5lbCgpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZU1heEdyaWQgPSBzdXJmYWNlUmVzb2x1dGlvbkZvcih0aGlzLnJlc29sdXRpb25TY2FsZSkubWF4R3JpZDtcbiAgICB0aGlzLmltYWdlTW9kZSA9ICdncmF5c2NhbGUnO1xuICAgIHRoaXMudm9sdW1lTXVsdGljaGFubmVsID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5wcmVsb2FkU3VyZmFjZVBsYW5lcyh2aWV3ZXIpO1xuICAgIGlmICh0aGlzLnZpZXdlciAhPT0gdmlld2VyKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5idWlsZFN1cmZhY2Uodmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKTtcbiAgICB0aGlzLmluc3RhbGxTdXJmYWNlQXhlcyh2aWV3ZXIpO1xuICAgIC8vIFN1YnNjcmliZSBhZnRlciB0aGUgZmlyc3QgYnVpbGQgc28gZGlzcGxheS1zdGF0ZSBlZGl0cyB0YXJnZXQgYSBsaXZlIGxheWVyLlxuICAgIHRoaXMuc3Vic2NyaWJlU3VyZmFjZURpc3BsYXlTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEFkZCB0aGUgM0QgYXhlcyBnaXptbyArIERPTSBsYWJlbHMgYXJvdW5kIHRoZSAob3JpZ2luLWNlbnRlcmVkKSBzdXJmYWNlIG1lc2gsIG1hdGNoaW5nIHRoZVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UuIEluc3RhbGxlZCBvbmNlIHBlciBtb3VudDsgdGhlIGJveCB0cmFja3MgdGhlIG1lc2ggYm91bmRzLCBYL1kgc2hvdyB0aGVcbiAgICogIHBoeXNpY2FsIChvciBwaXhlbCkgZXh0ZW50LCBhbmQgWiBpcyB0aGUgaW50ZW5zaXR5L2hlaWdodCBheGlzLiAqL1xuICBwcml2YXRlIGluc3RhbGxTdXJmYWNlQXhlcyh2aWV3ZXI6IFZpZXdlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdXJmYWNlTGF5ZXIpIHJldHVybjtcbiAgICBjb25zdCBiID0gdGhpcy5zdXJmYWNlTGF5ZXIuYm91bmRzKCk7XG4gICAgY29uc3QgYm94VyA9IE1hdGgubWF4KDEsIGIubWF4WzBdIC0gYi5taW5bMF0pO1xuICAgIGNvbnN0IGJveEggPSBNYXRoLm1heCgxLCBiLm1heFsxXSAtIGIubWluWzFdKTtcbiAgICBjb25zdCBib3hEID0gTWF0aC5tYXgoMSwgYi5tYXhbMl0gLSBiLm1pblsyXSk7XG4gICAgY29uc3QgbXBwWCA9IHRoaXMuZGVzY3JpcHRvcj8ubXBwWCB8fCB0aGlzLmxvYWRlZD8uaW1hZ2VJbmZvLmltYWdlTWV0YT8uWzBdPy5tcHBYIHx8IDA7XG4gICAgY29uc3Qgdm94ZWwgPSBtcHBYID4gMCA/IChtcHBYICogKHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gdGhpcy5pbWFnZVcpKSAvIE1hdGgubWF4KDEsIHRoaXMuaW1hZ2VXKSA6IDE7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSB2aWV3ZXIuYWRkQXhlcyhib3hXLCBib3hILCBib3hELCB7XG4gICAgICB2b3hlbFNpemU6IFt2b3hlbCwgdm94ZWwsIDFdLFxuICAgICAgdmlzaWJsZTogdGhpcy5heGVzVmlzaWJsZSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5ob3N0KSB7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMgPSBuZXcgTmFwYXJpQXhlc0xhYmVscyhcbiAgICAgICAgdGhpcy5ob3N0LFxuICAgICAgICB2aWV3ZXIuY2FtZXJhM2QsXG4gICAgICAgIHRoaXMuYnVpbGRTdXJmYWNlQXhlc0xhYmVscyhib3hXLCBib3hILCBib3hELCBtcHBYKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmF4ZXNMYWJlbHMuc2V0VmlzaWJsZSh0aGlzLmF4ZXNWaXNpYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKiogWC9ZL1ogZW5kLWxhYmVscyBmb3IgdGhlIHN1cmZhY2UgZ2l6bW86IFgvWSBhcmUgdGhlIHBoeXNpY2FsICjCtW0pIG9yIHBpeGVsIGV4dGVudCBvZiB0aGUgRlVMTFxuICAgKiAgaW1hZ2U7IFogaXMgdGhlIGludGVuc2l0eS9oZWlnaHQgYXhpcy4gQW5jaG9ycyBhcmUgaW4gdGhlIGNlbnRlcmVkIGJveCAobWF0Y2hpbmcgQXhlc0xheWVyKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFN1cmZhY2VBeGVzTGFiZWxzKFxuICAgIGJveFc6IG51bWJlcixcbiAgICBib3hIOiBudW1iZXIsXG4gICAgYm94RDogbnVtYmVyLFxuICAgIG1wcFg6IG51bWJlcixcbiAgKTogQXhpc0xhYmVsU3BlY1tdIHtcbiAgICBjb25zdCBoeCA9IGJveFcgLyAyO1xuICAgIGNvbnN0IGh5ID0gYm94SCAvIDI7XG4gICAgY29uc3QgaHogPSBib3hEIC8gMjtcbiAgICBjb25zdCBkZXNjVyA9IHRoaXMuZGVzY3JpcHRvcj8ud2lkdGggPz8gdGhpcy5pbWFnZVc7XG4gICAgY29uc3QgZGVzY0ggPSB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyB0aGlzLmltYWdlSDtcbiAgICBjb25zdCBsZW4gPSAocHg6IG51bWJlcik6IHN0cmluZyA9PiAobXBwWCA+IDAgPyBmb3JtYXRVbShweCAqIG1wcFgpIDogYCR7cHh9IHB4YCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgYW5jaG9yOiBbaHgsIC1oeSwgLWh6XSwgdGV4dDogYFggwrcgJHtsZW4oZGVzY1cpfWAsIGNvbG9yOiAnI2VkNDU0NScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCBoeSwgLWh6XSwgdGV4dDogYFkgwrcgJHtsZW4oZGVzY0gpfWAsIGNvbG9yOiAnIzRkZDk1OScgfSxcbiAgICAgIHsgYW5jaG9yOiBbLWh4LCAtaHksIGh6XSwgdGV4dDogJ1ogwrcgaW50ZW5zaXR5JywgY29sb3I6ICcjNjY4Y2ZmJyB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUHJlLWZldGNoIGV2ZXJ5IHN0YWNrIHNsaWNlJ3MgbHVtaW5hbmNlIHBsYW5lIChkZWNpbWF0ZWQgdG8gdGhlIHN1cmZhY2UgZ3JpZCkgaW50b1xuICAgKiB7QGxpbmsgc3VyZmFjZVBsYW5lc30sIGRyaXZpbmcge0BsaW5rIHN0YWNrTG9hZGluZ1Byb2dyZXNzJH0g4oCUIHRoZSBzYW1lIGxvYWQtd2l0aC1wcm9ncmVzcyBVWFxuICAgKiBhcyB0aGUgdm9sdW1lLCBidXQga2VlcGluZyBvbmUgMkQgcGxhbmUgcGVyIHNsaWNlIHJhdGhlciB0aGFuIHBhY2tpbmcgYSAzRCB2b2x1bWUuIEJvdW5kZWRcbiAgICogY29uY3VycmVuY3kga2VlcHMgdGhlIGNvbm5lY3Rpb24gcG9vbCBidXN5IHdpdGhvdXQgZmxvb2RpbmcgaXQgb24gYSBkZWVwIHN0YWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVsb2FkU3VyZmFjZVBsYW5lcyh2aWV3ZXI6IFZpZXdlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5sb2FkVG9rZW47IC8vIGJhaWwgaWYgYSBDYW5jZWwgLyBuZXcgcGxvdCBidW1wcyB0aGlzIHdoaWxlIHdlIGZldGNoXG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgY29uc3QgZGVwdGggPSBpbmZvPy5pbWFnZU1ldGE/LlswXT8ueiB8fCBpbmZvPy51cmxzPy5sZW5ndGggfHwgMTtcbiAgICBjb25zdCB7IG1heEdyaWQgfSA9IHN1cmZhY2VSZXNvbHV0aW9uRm9yKHRoaXMucmVzb2x1dGlvblNjYWxlKTtcbiAgICB0aGlzLnN1cmZhY2VQbGFuZXMuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZW5kaW5nOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBkZXB0aDsgeisrKSBwZW5kaW5nLnB1c2goeik7XG4gICAgICBsZXQgZG9uZSA9IDA7XG4gICAgICBjb25zdCB3b3JrZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBjb25zdCB6ID0gcGVuZGluZy5zaGlmdCgpO1xuICAgICAgICAgIGlmICh6ID09PSB1bmRlZmluZWQgfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlciB8fCB0aGlzLmxvYWRUb2tlbiAhPT0gdG9rZW4pIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdXJmYWNlUGxhbmVzLnNldCh6LCBhd2FpdCB0aGlzLmZldGNoU3VyZmFjZVBsYW5lKHosIG1heEdyaWQpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW25hcGFyaS1qc10gc3VyZmFjZSBzbGljZSAke3p9IHByZWxvYWQgZmFpbGVkYCwgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZG9uZSsrO1xuICAgICAgICAgIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQoTWF0aC5yb3VuZCgoZG9uZSAvIGRlcHRoKSAqIDEwMCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9vbCA9IE1hdGgubWluKFZPTFVNRV9GRVRDSF9DT05DVVJSRU5DWSwgTWF0aC5tYXgoMSwgZGVwdGgpKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHBvb2wgfSwgKCkgPT4gd29ya2VyKCkpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggc2xpY2UgYHpgIGFzIGEgc2luZ2xlIFdIT0xFLWltYWdlIGx1bWluYW5jZSBwbGFuZSAoZGVjaW1hdGVkIHRvIGBtYXhHcmlkYCkuIFByZWZlcnMgdGhlXG4gICAqIGFwcCdzIGNvbXBsZXRlIHBlci1zbGljZSBpbWFnZSAoYHNtYWxsVXJsc2AvYHVybHNgLCBleGFjdGx5IGxpa2UgdGhlIFBsb3RseSBzdXJmYWNlKSBzbyB0aGVcbiAgICogc3VyZmFjZSBhbHdheXMgY292ZXJzIHRoZSBGVUxMIHNsaWNlIOKAlCB0aGUgdGlsZS1weXJhbWlkIGBmZXRjaFNsaWNlYCBwYXRoIHdvdWxkIGZhbGwgYmFjayB0byBhXG4gICAqIHNpbmdsZSB0b3AtbGVmdCB0aWxlIChhIGNvcm5lcikgZm9yIHNlbGYtY29udGFpbmVkIC8gbm9uLWAvdGlsZXMvaW5mb2AgaW1hZ2VzLiBGYWxscyBiYWNrIHRvXG4gICAqIHN0aXRjaGluZyB0aGUgdGlsZSBncmlkIG9ubHkgd2hlbiBubyBjb21wbGV0ZS1pbWFnZSBVUkwgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgLyoqIFRpbGUgYnVkZ2V0IHRvIHN0aXRjaCBhIHdob2xlIHNsaWNlIGF0IH5gdGFyZ2V0UHhgIHJlc29sdXRpb24gZnJvbSB0aGUgcHlyYW1pZDogYSBoaWdoZXIgdGFyZ2V0XG4gICAqICBwdWxscyBhIEZJTkVSIHB5cmFtaWQgbGV2ZWwgKG1vcmUgcmVhbCBkZXRhaWwpLiBTaGFyZWQgYnkgdGhlIHN1cmZhY2UgcGxhbmUgZmV0Y2ggYW5kIHRoZSB2b2x1bWVcbiAgICogIGFzc2VtYmx5IHNvIGJvdGggc2NhbGUgdGhlaXIgaW4tcGxhbmUgcmVzb2x1dGlvbiB3aXRoIHRoZSBkZWNpbWF0ZSBmYWN0b3IuICovXG4gIHByaXZhdGUgdGlsZUJ1ZGdldEZvcih0YXJnZXRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMuZGVzY3JpcHRvcj8udGlsZVNpemUgfHwgVElMRV9TSVpFO1xuICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgIE1BWF9TVElUQ0hfVElMRVMsXG4gICAgICBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKCh0YXJnZXRQeCAvIHRpbGVTaXplKSAqKiAyICogU1RJVENIX0JVREdFVF9DT0VGRikpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU3VyZmFjZVBsYW5lKFxuICAgIHo6IG51bWJlcixcbiAgICBtYXhHcmlkOiBudW1iZXIsXG4gICk6IFByb21pc2U8eyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubG9hZGVkPy5pbWFnZUluZm87XG4gICAgY29uc3QgZGVzYyA9IGF3YWl0IHRoaXMuZW5zdXJlRGVzY3JpcHRvcigpO1xuICAgIGxldCBwbGFuZTogeyBkYXRhOiBVaW50OEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyBQcmVmZXJyZWQ6IHN0aXRjaCB0aGUgV0hPTEUgc2xpY2UgZnJvbSB0aGUgc2VydmVyIHB5cmFtaWQgYXQgYSByZXNvbHV0aW9uIGRyaXZlbiBieSB0aGVcbiAgICAvLyBkZWNpbWF0ZSBmYWN0b3Ig4oCUIGEgaGlnaGVyIHRhcmdldCBncmlkIHB1bGxzIGEgRklORVIgcHlyYW1pZCBsZXZlbCAobW9yZSByZWFsIGRldGFpbCkuIFdpdGggYVxuICAgIC8vIGRlc2NyaXB0b3IsIGZldGNoU2xpY2Ugc3RpdGNoZXMgdGhlIHdob2xlIGNob3NlbiBsZXZlbCAobmV2ZXIgYSBjb3JuZXIpLCB0aGVuIHdlIGRvd25zY2FsZSB0b1xuICAgIC8vIHRoZSBncmlkLiBUaGlzIGlzIHdoYXQgbWFrZXMgXCJGdWxsXCIgYWN0dWFsbHkgaGlnaGVyLXJlcyB0aGFuIFwiwr1cIiwgbm90IGp1c3QgYSBmaXhlZCBwcmV2aWV3LlxuICAgIGlmIChkZXNjPy5sZXZlbHM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgYnVkZ2V0ID0gdGhpcy50aWxlQnVkZ2V0Rm9yKG1heEdyaWQpO1xuICAgICAgLy8gVGhlIHN1cmZhY2UgaXMgYSBzaW5nbGUgZGVjaW1hdGVkIHBsYW5lLCBzbyB0aGUgY29tcG9zaXRlIGZhbGxiYWNrIGlzIGFjY2VwdGFibGUgd2hlbiB0aGVcbiAgICAgIC8vIGNoYW5uZWwgaGFzIG5vIHNtYWxsIHB5cmFtaWQgbGV2ZWwgKGtlZXBzIGl0IGZhc3QpOyBhIG11bHRpY2hhbm5lbCBWT0xVTUUgbXVzdCBub3QgZG8gdGhpcy5cbiAgICAgIHBsYW5lID0gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIHRoaXMuc3VyZmFjZUNoYW5uZWwsIGJ1ZGdldCwgdHJ1ZSksXG4gICAgICAgIG1heEdyaWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChubyBweXJhbWlkKTogdGhlIGFwcCdzIENPTVBMRVRFIHBlci1zbGljZSBpbWFnZSAodXJsc1t6XSwgbm90IHRoZSBzbWFsbCBibHVycnlcbiAgICAvLyB0aHVtYm5haWwpIOKAlCB3aG9sZSBzbGljZSwgYXZvaWRzIGEgY29ybmVyIHRpbGUuIENhcHBlZCBhdCB0aGUgaW1hZ2UncyBvd24gcmVzb2x1dGlvbi5cbiAgICBpZiAoIXBsYW5lKSB7XG4gICAgICBjb25zdCB1cmwgPSBpbmZvPy51cmxzPy5bel0gPz8gaW5mbz8uc21hbGxVcmxzPy5bel07XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXNcbiAgICAgICAgICAgIC5nZXRBdXRoSGVhZGVycygpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gKHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICAgICAgaWYgKHJlc3Aub2spIHtcbiAgICAgICAgICAgIHBsYW5lID0gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChhd2FpdCByZXNwLmJsb2IoKSksIG1heEdyaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbbmFwYXJpLWpzXSBzdXJmYWNlIHVybCBmZXRjaCBmYWlsZWQgZm9yIHo9JHt6fWAsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXN0IHJlc29ydCAobm8gcHlyYW1pZCBhbmQgbm8gY29tcGxldGUgaW1hZ2UpOiBhIHNpbmdsZSB0aWxlLlxuICAgIGlmICghcGxhbmUpIHtcbiAgICAgIHBsYW5lID0gdGhpcy5iaXRtYXBUb0x1bWluYW5jZShcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFNsaWNlKHosIHRoaXMuc3VyZmFjZUNoYW5uZWwsIHRoaXMudGlsZUJ1ZGdldEZvcihtYXhHcmlkKSwgdHJ1ZSksXG4gICAgICAgIG1heEdyaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGxhbmU7XG4gIH1cblxuICAvKiogVGhlIGNoYW5uZWwgc3RhdGUgZHJpdmluZyB0aGUgc3VyZmFjZTogdGhlIGNob3NlbiBiYW5kIGZvciBtdWx0aWNoYW5uZWwgKG1hdGNoZWQgYnkgaW5kZXgpLFxuICAgKiAgZWxzZSB0aGUgc2luZ2xlIGdyYXlzY2FsZSBjaGFubmVsLiAqL1xuICBwcml2YXRlIHN1cmZhY2VTdGF0ZShjaGFubmVsczogSUNoYW5uZWxTdGF0ZVtdKTogSUNoYW5uZWxTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3VyZmFjZUNoYW5uZWwgPT0gbnVsbCkgcmV0dXJuIGNoYW5uZWxzWzBdO1xuICAgIHJldHVybiBjaGFubmVscy5maW5kKChzKSA9PiBzLmluZGV4ID09PSB0aGlzLnN1cmZhY2VDaGFubmVsKSA/PyBjaGFubmVsc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiAoUmUpYnVpbGQgdGhlIHN1cmZhY2UgbWVzaCBmb3Igc2xpY2UgYHpgIGZyb20gdGhlIHByZS1sb2FkZWQgcGxhbmUgY2FjaGUgKGluc3RhbnQg4oCUIHRoaXMgaXNcbiAgICogd2hhdCB0aGUgc3RhY2sgc2xpZGVyIGNhbGxzKTsgYSBzbGljZSBtaXNzaW5nIGZyb20gdGhlIGNhY2hlIGlzIGZldGNoZWQgb24gZGVtYW5kLiBuYXBhcmktanMnc1xuICAgKiBwdXJlIGBoZWlnaHRGaWVsZGAgYnVpbGRzIHRoZSB0cmlhbmdsZSBncmlkICh6ID0gbm9ybWFsaXplZCBpbnRlbnNpdHkpLCB0aGVuIGBhZGRTdXJmYWNlYFxuICAgKiByZW5kZXJzIGl0LiBUaGUgc2xpY2UgcGxhbmUgYWxzbyBmZWVkcyB0aGUgaW50ZW5zaXR5IGhpc3RvZ3JhbSAoa2V5IDApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFN1cmZhY2Uodmlld2VyOiBWaWV3ZXIsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwbGFuZSA9IHRoaXMuc3VyZmFjZVBsYW5lcy5nZXQoeik7XG4gICAgaWYgKCFwbGFuZSkge1xuICAgICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBwbGFuZSA9IGF3YWl0IHRoaXMuZmV0Y2hTdXJmYWNlUGxhbmUoeiwgdGhpcy5zdXJmYWNlTWF4R3JpZCk7XG4gICAgICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5zZXQoeiwgcGxhbmUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHN1cmZhY2Ugc2xpY2UgZmV0Y2ggZmFpbGVkOicsIGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcGxhbmUgfHwgcGxhbmUud2lkdGggPCAyIHx8IHBsYW5lLmhlaWdodCA8IDIgfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3QgPSB0aGlzLnN1cmZhY2VTdGF0ZSh0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCkpO1xuICAgIGNvbnN0IHdpbjogW251bWJlciwgbnVtYmVyXSA9IFtzdD8ubWluID8/IDAsIHN0Py5tYXggPz8gMjU1XTtcbiAgICB0aGlzLnN1cmZhY2VXaW5kb3cgPSB3aW47XG4gICAgLy8gSGVpZ2h0IEFORCBjb2xvdXIgYXJlIG5vcm1hbGl6ZWQgYnkgdGhlIHNhbWUgY29udHJhc3Qgd2luZG93LCBzbyBjaGFuZ2luZyBtaW4vbWF4IHJlc2hhcGVzIHRoZVxuICAgIC8vIHN1cmZhY2UgKGEgcGl4ZWwncyBoZWlnaHQgPSBpdHMgaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLiBDZW50ZXIgaXQgZm9yIHRoZSBheGVzIGdpem1vLiBUaGVcbiAgICAvLyBwbGFuZSBpcyBhbHJlYWR5IGRlY2ltYXRlZCB0byB0aGUgZ3JpZCBjYXAg4oaSIHN0cmlkZSAxLlxuICAgIGNvbnN0IHpTY2FsZSA9IFNVUkZBQ0VfWl9BU1BFQ1QgKiBNYXRoLm1heChwbGFuZS53aWR0aCwgcGxhbmUuaGVpZ2h0KTtcbiAgICBjb25zdCB7IHZlcnRpY2VzLCBmYWNlcywgdmFsdWVzIH0gPSBoZWlnaHRGaWVsZChwbGFuZS5kYXRhLCBwbGFuZS53aWR0aCwgcGxhbmUuaGVpZ2h0LCB7XG4gICAgICB6U2NhbGUsXG4gICAgICB6TGltaXRzOiB3aW4sXG4gICAgICBjZW50ZXI6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JiaXQgY2FtZXJhIGFjcm9zcyBhIHJlLXNsaWNlIC8gd2luZG93IHJlYnVpbGQg4oCUIG9ubHkgdGhlIGZpcnN0IG1vdW50IGZyYW1lcywgc29cbiAgICAvLyBzdGVwcGluZyB0aGUgc3RhY2sgb3IgY2hhbmdpbmcgdGhlIHdpbmRvdyBrZWVwcyB0aGUgY3VycmVudCB6b29tL3Bhbi9vcmllbnRhdGlvbi5cbiAgICBjb25zdCBjYW0gPSB2aWV3ZXIuY2FtZXJhM2Q7XG4gICAgY29uc3QgcHJlc2VydmVDYW1lcmEgPSB0aGlzLnN1cmZhY2VMYXllciAhPSBudWxsO1xuICAgIGNvbnN0IHNhdmVkVGFyZ2V0ID0gY2FtLnRhcmdldDtcbiAgICBjb25zdCBzYXZlZERpc3RhbmNlID0gY2FtLmRpc3RhbmNlO1xuICAgIGlmICh0aGlzLnN1cmZhY2VMYXllcikge1xuICAgICAgdmlld2VyLmxheWVycy5yZW1vdmUodGhpcy5zdXJmYWNlTGF5ZXIpO1xuICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnN1cmZhY2VMYXllciA9IHZpZXdlci5hZGRTdXJmYWNlKHZlcnRpY2VzLCBmYWNlcywgdmFsdWVzLCB7XG4gICAgICBjb2xvcm1hcDogdGhpcy52b2x1bWVDb2xvcm1hcChzdCksXG4gICAgICBjb250cmFzdExpbWl0czogd2luLFxuICAgICAgZ2FtbWE6IHN0Py5nYW1tYSA/PyAxLFxuICAgICAgd2lyZWZyYW1lOiB0aGlzLnN1cmZhY2VXaXJlZnJhbWUsXG4gICAgfSk7XG4gICAgaWYgKHByZXNlcnZlQ2FtZXJhKSB7XG4gICAgICBjYW0udGFyZ2V0ID0gc2F2ZWRUYXJnZXQ7XG4gICAgICBjYW0uZGlzdGFuY2UgPSBzYXZlZERpc3RhbmNlO1xuICAgIH1cblxuICAgIHRoaXMuaW1hZ2VXID0gcGxhbmUud2lkdGg7XG4gICAgdGhpcy5pbWFnZUggPSBwbGFuZS5oZWlnaHQ7XG4gICAgdGhpcy52b2x1bWVEaW1zID0geyB3aWR0aDogcGxhbmUud2lkdGgsIGhlaWdodDogcGxhbmUuaGVpZ2h0LCBkZXB0aDogTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh6U2NhbGUpKSB9O1xuICAgIC8vIFJldXNlIHRoZSB2b2x1bWUgaW50ZW5zaXR5LWhpc3RvZ3JhbSBwYXRoOiB0aGUgc2xpY2UncyBzY2FsYXIgcGxhbmUgaXMgdGhlIGhpc3RvZ3JhbSBzb3VyY2UuXG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICAgIHRoaXMudm9sdW1lQ2hhbm5lbERhdGEuc2V0KDAsIHBsYW5lLmRhdGEpO1xuICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICB9XG5cbiAgLyoqIFN1YnNjcmliZSB0aGUgc3RvcmUgY29sb3JtYXAgLyByZXZlcnNlIC8gaW52ZXJ0IC8gY2hhbm5lbCB3aW5kb3cg4oaSIHRoZSBzdXJmYWNlLCBzbyBoaXN0b2dyYW1cbiAgICogICYgY2hhbm5lbC1kaWFsb2cgZWRpdHMgdXBkYXRlIGl0IGxpdmUgd2l0aG91dCBhIHJlLWZldGNoLiAqKm1pbi9tYXggcmVzaGFwZXMgdGhlIHN1cmZhY2Unc1xuICAgKiAgaGVpZ2h0KiogKGEgcGl4ZWwncyBoZWlnaHQgPSBpdHMgaW50ZW5zaXR5IHdpdGhpbiBbbWluLG1heF0pLCBzbyBhIHdpbmRvdyBjaGFuZ2UgcmVidWlsZHMgdGhlXG4gICAqICBtZXNoIGdlb21ldHJ5IChmcm9tIHRoZSBjYWNoZWQgc2xpY2UpOyBjb2xvdXItb25seSBlZGl0cyAoY29sb3JtYXAvTFVULCBnYW1tYSwgcmV2ZXJzZSwgaW52ZXJ0KVxuICAgKiAganVzdCB1cGRhdGUgdGhlIGxheWVyJ3MgdW5pZm9ybXMuICovXG4gIHByaXZhdGUgc3Vic2NyaWJlU3VyZmFjZURpc3BsYXlTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kaXNwbGF5U3ViID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLmdldENvbG9ybWFwKCksXG4gICAgICB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRTZWxlY3RlZENoYW5uZWwoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjb2xvcm1hcCwgcmV2ZXJzZSwgaW52ZXJ0LCBjaGFubmVscywgc2VsZWN0ZWRdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRDb2xvcm1hcCA9IChjb2xvcm1hcCBhcyBDb2xvcm1hcE5vZGUpID8/IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRSZXZlcnNlID0gcmV2ZXJzZTtcbiAgICAgIHRoaXMuaW52ZXJ0RW5hYmxlZCA9IGludmVydDtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXI7XG4gICAgICBpZiAoIWxheWVyIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgLy8gU2VsZWN0ZWQgY2hhbm5lbCBjaGFuZ2VkIChtdWx0aWNoYW5uZWwpOiByZS1mZXRjaCBUSEFUIGJhbmQncyBwbGFuZXMgYW5kXG4gICAgICAvLyByZWJ1aWxkIHRoZSBoZWlnaHQtZmllbGQgZm9yIHRoZSBjdXJyZW50IHNsaWNlLlxuICAgICAgaWYgKHRoaXMuc3VyZmFjZU11bHRpY2hhbm5lbCAmJiBzZWxlY3RlZCAhPT0gdGhpcy5zdXJmYWNlQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gc2VsZWN0ZWQ7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByZWxvYWRTdXJmYWNlUGxhbmVzKHRoaXMudmlld2VyISk7XG4gICAgICAgICAgaWYgKHRoaXMudmlld2VyKSBhd2FpdCB0aGlzLmJ1aWxkU3VyZmFjZSh0aGlzLnZpZXdlciwgdGhpcy5sb2FkZWQ/LnogPz8gMCk7XG4gICAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc3VyZmFjZSBjaGFubmVsIHN3aXRjaCBmYWlsZWQ6JywgZXJyKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0ID0gdGhpcy5zdXJmYWNlU3RhdGUoY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgd2luOiBbbnVtYmVyLCBudW1iZXJdID0gW3N0Py5taW4gPz8gMCwgc3Q/Lm1heCA/PyAyNTVdO1xuICAgICAgY29uc3Qgd2luZG93Q2hhbmdlZCA9XG4gICAgICAgICF0aGlzLnN1cmZhY2VXaW5kb3cgfHwgd2luWzBdICE9PSB0aGlzLnN1cmZhY2VXaW5kb3dbMF0gfHwgd2luWzFdICE9PSB0aGlzLnN1cmZhY2VXaW5kb3dbMV07XG4gICAgICBpZiAod2luZG93Q2hhbmdlZCkge1xuICAgICAgICAvLyBIZWlnaHQgZm9sbG93cyB0aGUgY29udHJhc3Qgd2luZG93IOKGkiByZWJ1aWxkIHRoZSBtZXNoIGZvciB0aGUgbmV3IFttaW4sbWF4XSAoY2FtZXJhIGtlcHQpLlxuICAgICAgICB2b2lkIHRoaXMuYnVpbGRTdXJmYWNlKHRoaXMudmlld2VyLCB0aGlzLmxvYWRlZD8ueiA/PyAwKS5jYXRjaCgoZXJyKSA9PlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHN1cmZhY2Ugd2luZG93IHJlYnVpbGQgZmFpbGVkOicsIGVyciksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIENvbG91ci1vbmx5IGNoYW5nZTogdXBkYXRlIHVuaWZvcm1zIGluIHBsYWNlLCBubyBnZW9tZXRyeSByZWJ1aWxkLlxuICAgICAgbGF5ZXIuY29sb3JtYXAgPSB0aGlzLnZvbHVtZUNvbG9ybWFwKHN0KTtcbiAgICAgIGlmIChzdCkge1xuICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IHdpbjtcbiAgICAgICAgbGF5ZXIuZ2FtbWEgPSBzdC5nYW1tYTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZml0Q2FtZXJhU29vbigpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5jYW52YXMgJiYgdGhpcy5pbWFnZVcgPiAwICYmIHRoaXMuaW1hZ2VIID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdlci5jYW1lcmEuZml0KFxuICAgICAgICAgIHRoaXMuaW1hZ2VXLFxuICAgICAgICAgIHRoaXMuaW1hZ2VILFxuICAgICAgICAgIHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8IHRoaXMuaW1hZ2VXLFxuICAgICAgICAgIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCB0aGlzLmltYWdlSCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocnVuKTtcbiAgICBlbHNlIHJ1bigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYzsgaG9zdCByZS1kcml2ZXMgcGxvdCgpIGZyb20gaXRzIGltYWdlIHN0cmVhbS4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBuby1vcCAqL1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKzsgLy8gaW52YWxpZGF0ZSBhbnkgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmcgZnJvbSB0aGUgcHJldmlvdXMgcGxvdFxuICAgIHRoaXMuZGlzcGxheVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRpc3BsYXlTdWIgPSBudWxsO1xuICAgIHRoaXMuc2NhbGVCYXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjYWxlQmFyID0gbnVsbDtcbiAgICB0aGlzLm5hdmlnYXRvcj8uZGVzdHJveSgpO1xuICAgIHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICB0aGlzLmxvYWRpbmdCYWRnZT8uZGVzdHJveSgpO1xuICAgIHRoaXMubG9hZGluZ0JhZGdlID0gbnVsbDtcbiAgICB0aGlzLnRpbGVMb2FkaW5nID0gW107XG4gICAgdGhpcy5vYnNlcnZhdGlvbnNMb2FkaW5nID0gMDtcbiAgICB0aGlzLmltYWdlVGlsZXNMb2FkaW5nID0gMDtcbiAgICB0aGlzLmltYWdlVGlsZXNHZW5lcmF0aW9uKys7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5Py5kZXN0cm95KCk7XG4gICAgdGhpcy5yZWdpb25PdmVybGF5ID0gbnVsbDtcbiAgICB0aGlzLmF4ZXNMYWJlbHM/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmF4ZXNMYWJlbHMgPSBudWxsO1xuICAgIHRoaXMuekhhbmRsZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuekhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVXb3JsZEJhc2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVsc1JlY3QgPSBudWxsO1xuICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5jbGVhcigpO1xuICAgIHRoaXMudGlsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhpc3RTYW1wbGVzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmY/LigpO1xuICAgIHRoaXMuY2FtZXJhUmVhZGJhY2tPZmYgPSBudWxsO1xuICAgIHRoaXMuY2hhbm5lbFZpZXcgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFRpbGVzTWdyPy5kZXRhY2goKTtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVWaWV3ID0gbnVsbDtcbiAgICB0aGlzLnZvbHVtZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICAgIHRoaXMuc3VyZmFjZUxheWVyID0gbnVsbDtcbiAgICB0aGlzLnN1cmZhY2VDaGFubmVsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3VyZmFjZVBsYW5lcy5jbGVhcigpO1xuICAgIHRoaXMuc3VyZmFjZVdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyUmVnaW9uU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2NhdHRlclJlZ2lvblN1YiA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3BhdGlhbFN1YiA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVTcGF0aWFsSG92ZXIoKTtcbiAgICB0aGlzLmhvdmVyU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmhvdmVyU291cmNlS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbExheWVyS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxQb2ludHMzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsTGF5ZXJLZXkzZCA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsU2NhbGFyS2V5M2QgPSBudWxsO1xuICAgIHRoaXMuc3BhdGlhbFZvbHVtZSA9IG51bGw7XG4gICAgdGhpcy5zcGF0aWFsVm9sdW1lS2V5ID0gbnVsbDtcbiAgICB0aGlzLnNwYXRpYWxPcmlnaW4zZCA9IFswLCAwLCAwXTtcbiAgICB0aGlzLnNwYXRpYWxTY2FsZUJhcktleSA9IG51bGw7XG4gICAgLy8gRHJvcCB0aGUgY2FjaGVkIGludGVybGVhdmVkIGNvb3JkaW5hdGVzIHRvbzogaG9sZGluZyAzLjdNIHggMyBmbG9hdHMgYWZ0ZXJcbiAgICAvLyBhIHRlYXJkb3duIGlzIH40NU1CIG9mIHJldGFpbmVkIGhlYXAgZm9yIGEgc2NlbmUgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgIHRoaXMuc3BhdGlhbFBvc2l0aW9uczNkID0gbnVsbDtcbiAgICAvLyBJbnZhbGlkYXRlIGFueSBjb2xvdXIgZmV0Y2ggc3RpbGwgaW4gZmxpZ2h0IHNvIGl0IGNhbid0IGF0dGFjaCB0byB0aGUgbmV4dCBzY2VuZS5cbiAgICB0aGlzLnNwYXRpYWxSZWJ1aWxkVG9rZW4rKztcbiAgICB0aGlzLnNjYXR0ZXIyZFBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5zY2F0dGVyM2RMYXllciA9IG51bGw7XG4gICAgdGhpcy5heGVzTGF5ZXIgPSBudWxsO1xuICAgIHRoaXMudm9sdW1lRGltcyA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVDaGFubmVsRGF0YS5jbGVhcigpO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlcikgdGhpcy52aWV3ZXIuY2FtZXJhLnpvb20gPSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSAqIDEuMztcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyKSB0aGlzLnZpZXdlci5jYW1lcmEuem9vbSA9IHRoaXMudmlld2VyLmNhbWVyYS56b29tIC8gMS4zO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlU21vb3RoaW5nID0gZW5hYmxlZDtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICB0aGlzLmNoYW5uZWxWaWV3Py5zZXRJbnRlcnBvbGF0aW9uKGVuYWJsZWQgPyAnbGluZWFyJyA6ICduZWFyZXN0Jyk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIHN0YWNrIG5hdmlnYXRlZCB2aWEgc2V0WkluZGV4ICovXG4gIH1cblxuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWQpIHRoaXMubG9hZGVkLnogPSB6SW5kZXg7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLm5hdmlnYXRvcikgdm9pZCB0aGlzLnJlZnJlc2hOYXZpZ2F0b3JJbWFnZSh6SW5kZXgpO1xuICAgIC8vIFN1cmZhY2U6IG9uZSBzbGljZSDihpIgb25lIG1lc2gsIHNvIHJlLWJ1aWxkIHRoZSBoZWlnaHQgZmllbGQgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICB2b2lkIHRoaXMuYnVpbGRTdXJmYWNlKHYsIHpJbmRleCkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignW25hcGFyaS1qc10gc2V0WkluZGV4IHN1cmZhY2UgZmFpbGVkOicsIGVyciksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBWb2x1bWUgLyBpc29zdXJmYWNlOiBzdGVwIHRoZSB2b2x1bWUncyB6IHBsYW5lIGluIHBsYWNlLlxuICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRpbGVkIDJEIGltYWdlOiBqdXN0IG1vdmUgdGhlIGRpbXMgcGxhbmUg4oCUIHRoZSB0aWxlZCB2aXN1YWwgZmV0Y2hlcyB0aGUgbmV3IHNsaWNlJ3MgdGlsZXNcbiAgICAvLyAoY2FjaGVkIHBlciB6KSwgbm8gbGF5ZXIgcmVidWlsZC4gUmVmcmVzaCB0aGUgY29hcnNlIGhpc3RvZ3JhbSBzYW1wbGUgZm9yIHRoZSBuZXcgc2xpY2UuXG4gICAgaWYgKHRoaXMudGlsZWQpIHtcbiAgICAgIHYuZGltcy56ID0gekluZGV4O1xuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcikgdm9pZCB0aGlzLnJlZnJlc2hIaXN0b2dyYW1TYW1wbGVzKHpJbmRleCwgdGhpcy5kZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyAyRCBpbWFnZSAoc3RpdGNoIGZhbGxiYWNrKTogcmUtcmVuZGVyIHRoZSBzbGljZSAocmUtZmV0Y2hlcyBwZXItY2hhbm5lbCAvIGNvbXBvc2l0ZSkuIEJyYW5jaFxuICAgIC8vIG9mIGEgdm9sdW1lIGxheWVyIChub3QgY3VycmVudFBsb3RUeXBlLCB3aGljaCBjb3VsZCBiZSBzdGFsZSBhbmQgc2lsZW50bHkgbm8tb3AgdGhlIHN3YXApLlxuICAgIC8vIFRoZSB0b2tlbiBsZXRzIHJlbmRlckltYWdlIGRyb3AgYSBzdXBlcnNlZGVkIHNjcnViIHNvIGEgc2xvdyBvbGRlciBzbGljZSBjYW4ndCBjbG9iYmVyIGEgbmV3ZXIgb25lLlxuICAgIGNvbnN0IHJlcSA9ICsrdGhpcy5zbGljZVJlcTtcbiAgICB2b2lkIHRoaXMucmVuZGVySW1hZ2UoekluZGV4LCByZXEpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChyZXEgIT09IHRoaXMuc2xpY2VSZXEpIHJldHVybjtcbiAgICAgICAgLy8gQUZURVIgdGhlIGltYWdlLCBuZXZlciBiZWZvcmU6IHRoZSByZW5kZXIgY2xlYXJzIHRoZSBsYXllciBsaXN0LCBzb1xuICAgICAgICAvLyBtYXJrZXJzIGRyYXduIGZpcnN0IGFyZSB3aXBlZCBieSB0aGUgdmVyeSBpbWFnZSBtZWFudCB0byBzaXQgdW5kZXIgdGhlbS5cbiAgICAgICAgLy8gT3ZlciBhIHZvbHVtZS1iYWNrZWQgZGF0YXNldCB0aGUgcGxhbmUgYWxzbyBkZWNpZGVzIHdoaWNoIG9ic2VydmF0aW9uc1xuICAgICAgICAvLyBhcmUgZHJhd24gYXQgYWxsLCBzbyB0aGlzIGlzIHdoYXQgbW92ZXMgdGhlIGNlbGxzIHdpdGggdGhlIHNlY3Rpb24uXG4gICAgICAgIHRoaXMucmVkcmF3U3BhdGlhbE1hcmtlcnMoKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlYWRiYWNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUuZXJyb3IoJ1tuYXBhcmktanNdIHNldFpJbmRleCBzbGljZSBmYWlsZWQ6JywgZXJyKSk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGJ1bXAgdGhlIGxvYWQgZ2VuZXJhdGlvbiBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkVG9rZW4rKztcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UGxvdFR5cGUgPSBwbG90VHlwZTtcbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBjb25zdCBtID0gbW9kZSA9PT0gJ3BhbicgPyAncGFuJyA6IG1vZGUgPT09ICd6b29tJyA/ICd6b29tJyA6ICdyb3RhdGUnOyAvLyBvcmJpdC90dXJudGFibGUg4oaSIHJvdGF0ZVxuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKG0pO1xuICB9XG5cbiAgLyoqIFJlLWZyYW1lIHRoZSAzRCBjYW1lcmEgb24gdGhlIGN1cnJlbnQgM0QgbGF5ZXIuIEEgc3VyZmFjZSBtZXNoIHNpdHMgaW4gdGhlIHBvc2l0aXZlIG9jdGFudFxuICAgKiAgKG5vdCBjZW50cmVkKSwgc28gZnJhbWUgaXQgYnkgaXRzIG93biBib3VuZHM7IGEgdm9sdW1lL2lzb3N1cmZhY2UgdXNlcyBpdHMgY2VudHJlZCBib3guICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgY29uc3QgbWVzaExheWVyID0gdGhpcy5zdXJmYWNlTGF5ZXIgPz8gdGhpcy5zY2F0dGVyM2RMYXllcjtcbiAgICBpZiAobWVzaExheWVyKSB7XG4gICAgICBjb25zdCBiID0gbWVzaExheWVyLmJvdW5kcygpO1xuICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhM2QudGFyZ2V0ID0gYi5jZW50ZXI7XG4gICAgICB0aGlzLnZpZXdlci5jYW1lcmEzZC5kaXN0YW5jZSA9IE1hdGgubWF4KGIucmFkaXVzICogMi41LCAxZS0zKTtcbiAgICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IHRoaXMudm9sdW1lRGltcztcbiAgICBpZiAoZCkgdGhpcy52aWV3ZXIuY2FtZXJhM2QuZnJhbWUoZC53aWR0aCwgZC5oZWlnaHQsIGQuZGVwdGgpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICAgIC8vIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCwgc28gdGhlIHNlbGVjdG9yIGhpZGVzIGl0IHVudGlsIGEgZGF0YXNldCBpcyBwdWJsaXNoZWQuXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuU1BBVElBTF9PTUlDU10hLFxuICAgIF07XG4gIH1cblxuICAvKiogVGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gUmVhZCBieSB0aGUgdG9vbGJhciB0byBpbml0IHRoZSBjb250cm9sLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uU2NhbGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMuIFRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCAocmUpbG9hZCDigJQgdGhlIGhvc3RcbiAgICogIHJlLXBsb3RzIGFmdGVyIGNhbGxpbmcgdGhpcywgc2luY2UgZGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVzb2x1dGlvblNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICB9XG5cbiAgZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKTogT2JzZXJ2YWJsZTxJbnRlbnNpdHlQcm9maWxlW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlQcm9maWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KF9kaXZJZDogc3RyaW5nLCBfcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQge1xuICAgIC8qIFBsb3RseSBvd25zIHRoZSBpbnRlbnNpdHkgaW5zZXQgKi9cbiAgfVxuXG4gIC8qKiBSZWFkIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGludG8gYGxhc3RQaXhlbHNgICh0aGUgcGl4ZWwtdG9vbHMnIHNvdXJjZSkgKyBlbWl0IHRoZSBjbGFtcGVkXG4gICAqICB2aXNpYmxlIHJlZ2lvbi4gQSBmcmVzaCBQaXhlbERhdGEgb2JqZWN0IG1lYW5zIGNhY2hlZEltYWdlRGF0YSgpIHJlYnVpbGRzIGF1dG9tYXRpY2FsbHkuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuUmVhZGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBweCA9IGF3YWl0IHYucmVhZERpc3BsYXllZFBpeGVscygpO1xuICAgICAgaWYgKHRoaXMudmlld2VyICE9PSB2KSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gdi52aXNpYmxlV29ybGRSZWN0KCk7IC8vIGNhcHR1cmUgV0lUSCB0aGUgcGl4ZWxzIChzYW1lIGNhbWVyYSlcbiAgICAgIHRoaXMubGFzdFBpeGVscyA9IHB4O1xuICAgICAgdGhpcy5sYXN0UGl4ZWxzUmVjdCA9IHJlY3Q7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgICBpZiAoc2l6ZSAmJiByZWN0KSB7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzaXplLndpZHRoLCByZWN0LngpKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNpemUuaGVpZ2h0LCByZWN0LnkpKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLndpZHRoIC0geCwgcmVjdC53aWR0aCkpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihzaXplLmhlaWdodCAtIHksIHJlY3QuaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcmVhZGJhY2sgdW5hdmFpbGFibGUgKi9cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUmVhZGJhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdm9pZCB0aGlzLnJ1blJlYWRiYWNrKCkpO1xuICAgIGVsc2Ugc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucnVuUmVhZGJhY2soKSwgMCk7XG4gIH1cblxuICAvKiogRGVib3VuY2VkIHJlYWRiYWNrIOKAlCBhcm1lZCBvbiBjYW1lcmEgY2hhbmdlcyBzbyBgbGFzdFBpeGVsc2AgdHJhY2tzIHRoZSBjdXJyZW50IHZpZXcgYWZ0ZXIgYVxuICAgKiAgcGFuL3pvb20gc2V0dGxlcyAoYW5kIGFmdGVyIHRpbGVkIGxldmVscyBmaW5pc2ggbG9hZGluZyksIHdoaWNoIHRoZSBvbi1jYW52YXMgcGl4ZWwgdG9vbHNcbiAgICogICh3YW5kL2JydXNoL1NBTSkgcmVhZCBzeW5jaHJvbm91c2x5LiBDb2FsZXNjZXMgcmFwaWQgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBhcm1SZWFkYmFjayhkZWxheU1zID0gMjUwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZGJhY2tUaW1lciAhPSBudWxsKSBjbGVhclRpbWVvdXQodGhpcy5yZWFkYmFja1RpbWVyKTtcbiAgICB0aGlzLnJlYWRiYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVhZGJhY2tUaW1lciA9IG51bGw7XG4gICAgICB2b2lkIHRoaXMucnVuUmVhZGJhY2soKTtcbiAgICB9LCBkZWxheU1zKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmUgKyBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBQaXhlbCB0b29sczogcmV1c2UgdGhlIHNoYXJlZCwgYmFja2VuZC1hZ25vc3RpYyB0b29sIHNlcnZpY2VzIHdpdGggYSBuYXBhcmkgaG9zdCDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQnVpbGQgdGhlIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgdG9vbCBob3N0cyBmb3IgdGhlIGN1cnJlbnQgdmlld2VyIChjYWxsZWQgZnJvbSBwbG90KCkpLiBUaGVcbiAgICogIHBpeGVsIHRvb2xzIHJlYWQgZGlzcGxheWVkIHBpeGVscyBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxhc3QgcmVhZGJhY2sgYW5kIGNvbnZlcnQgcG9pbnRlclxuICAgKiAgY29vcmRzIHZpYSB0aGUgbmFwYXJpIGNhbWVyYSwgZXhhY3RseSBtaXJyb3JpbmcgdGhlIE9TRCBob3N0LiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE5hcGFyaUNvb3JkaW5hdGVUcmFuc2Zvcm0oXG4gICAgICB0aGlzLnZpZXdlcixcbiAgICAgICgpID0+ICEhdGhpcy52aWV3ZXIgJiYgdGhpcy5pbWFnZVcgPiAwLFxuICAgICk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uU3RvcmU7XG4gICAgdGhpcy53YW5kSG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHJlZ2lvbnMuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHIpID0+IHJlZ2lvbnMuc2V0UmVnaW9ucyhyKSxcbiAgICAgIGdldENhY2hlZEltYWdlRGF0YTogKCkgPT4gdGhpcy5jYWNoZWRJbWFnZURhdGEoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMubG9hZGVkPy56ID8/IDAsXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmhvc3QsXG4gICAgICBnZXRDb29yZGluYXRlVHJhbnNmb3JtOiAoKSA9PiB0aGlzLmNvb3JkVHJhbnNmb3JtIGFzIElDb29yZGluYXRlVHJhbnNmb3JtLFxuICAgICAgZ2V0RmlsZU5hbWU6ICgpID0+IHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHJlZ2lvbnMuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gcmVnaW9ucy5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocikgPT4gcmVnaW9ucy5zZXRSZWdpb25zKHIpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuaG9zdCxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLmNhY2hlZEltYWdlRGF0YSgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdklkLFxuICAgICAgcGl4ZWxUb0RhdGE6IChweCwgcHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuaG9zdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXJlY3QpIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgY29uc3QgW3gsIHldID0gdGhpcy52aWV3ZXIuY2FudmFzVG9Xb3JsZChyZWN0LmxlZnQgKyBweCwgcmVjdC50b3AgKyBweSk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgIH0sXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkcykgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogWm9vbS9wYW4gdGhlIGNhbWVyYSB0byBmaXQgYSBkYXRhLXNwYWNlIHJlY3RhbmdsZSBgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dYC4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2IHx8ICF0aGlzLmNhbnZhcyB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW3hNaW4sIHhNYXgsIHlBLCB5Ql0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKHhNaW4sIHhNYXgpO1xuICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoeE1pbiwgeE1heCk7XG4gICAgY29uc3QgeTAgPSBNYXRoLm1pbih5QSwgeUIpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoeUEsIHlCKTtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoMSwgeDEgLSB4MCk7XG4gICAgY29uc3QgaCA9IE1hdGgubWF4KDEsIHkxIC0geTApO1xuICAgIGNvbnN0IHZ3ID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggfHwgdztcbiAgICBjb25zdCB2aCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIHYuY2FtZXJhLmNlbnRlciA9IFsoeDAgKyB4MSkgLyAyLCAoeTAgKyB5MSkgLyAyXTtcbiAgICB2LmNhbWVyYS56b29tID0gTWF0aC5taW4odncgLyB3LCB2aCAvIGgpO1xuICAgIHYucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIENhY2hlZEltYWdlRGF0YSBmcm9tIHRoZSBtb3N0IHJlY2VudCByZWFkYmFjayAoUkdCQSBkZXZpY2UgcGl4ZWxzIOKGkiBbeV1beF09W3IsZyxiXSksXG4gICAqICB3aXRoIHJhdGlvcy9vcmlnaW4gbWFwcGluZyBpbWFnZSBjb29yZHMg4oaUIHJlYWRiYWNrIHBpeGVscy4gQ2FjaGVkIHVudGlsIHRoZSByZWFkYmFjayBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIGNhY2hlZEltYWdlRGF0YSgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBjb25zdCBweCA9IHRoaXMubGFzdFBpeGVscztcbiAgICBpZiAoIXB4IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuY2FjaGVkSW1hZ2UgJiYgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9PT0gcHgpIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICAgIGNvbnN0IHcgPSBweC53aWR0aDtcbiAgICBjb25zdCBoID0gcHguaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgcmVjdCBjYXB0dXJlZCBXSVRIIHRoaXMgcmVhZGJhY2sgKG5vdCB0aGUgbGl2ZSBvbmUpIHNvIHJhdGlvcy9vcmlnaW4gbWF0Y2ggdGhlXG4gICAgLy8gbWF0cml4J3MgY2FtZXJhIOKAlCBvdGhlcndpc2UgYSBwYW4vem9vbSBzaW5jZSB0aGUgcmVhZGJhY2sgbWlzLXNjYWxlcyB0aGUgdHJhY2VkIHJlZ2lvbi5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5sYXN0UGl4ZWxzUmVjdCA/PyB0aGlzLnZpZXdlci52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZSA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JlY3Qud2lkdGggLyB3LCByZWN0LmhlaWdodCAvIGhdLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLFxuICAgICAgb3JpZ2luWDogcmVjdC54LFxuICAgICAgb3JpZ2luWTogcmVjdC55LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IHB4O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZEltYWdlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElUb29sQ29udHJvbGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gQ29udHJvbCBnYXRpbmc6IGEgdG9vbCB0aGF0IEFDVElWQVRFUyBkaXNhYmxlcyB0aGUgY2FtZXJhIGNvbnRyb2xzOyBkZWFjdGl2YXRpb24gaXMgYSBuby1vcFxuICAvLyBiZWNhdXNlIHRoZSBob3N0IGFsd2F5cyBjYWxscyB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIEZJUlNUIGluIGVhY2ggdG9nZ2xlICh3aGljaCBzZXRzXG4gIC8vIHRoZSBiYXNlbGluZSBlbmFibGVkL2Rpc2FibGVkKSwgc28gcmUtZW5hYmxpbmcgaGVyZSB3b3VsZCBmaWdodCBhIGZyZXNobHktYWN0aXZhdGVkIGRyYXcgbW9kZS5cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuOyAvLyBubyBwbG90IHlldCDihpIgbm90aGluZyB0byBkcml2ZVxuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICB0aGlzLmNhY2hlZEltYWdlU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmFybVJlYWRiYWNrKDApO1xuICAgIGlmICh0aGlzLndhbmRIb3N0KSB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBXYW5kT3B0aW9ucyk7XG4gIH1cbiAgc2V0V2FuZE9wdGlvbnMob3B0aW9uczogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5zZXRPcHRpb25zKChvcHRpb25zID8/IHt9KSBhcyB1bmtub3duIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXI/LnNldENvbnRyb2xzRW5hYmxlZChmYWxzZSk7XG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hcm1SZWFkYmFjaygwKTtcbiAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgdW5rbm93biBhcyBCcnVzaE9wdGlvbnMpO1xuICB9XG4gIHNldEJydXNoT3B0aW9ucyhvcHRpb25zOiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zID8/IHt9KTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZXJhc2VySG9zdCkgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRDb250cm9sc0VuYWJsZWQoZmFsc2UpO1xuICAgICAgdGhpcy56b29tVG9Cb3hUb29sLmJpbmRIb3N0KHRoaXMuem9vbUJveEhvc3QoKSk7XG4gICAgfVxuICAgIHRoaXMuem9vbVRvQm94VG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgLy8gU0FNIC8gY2VsbHBvc2Ug4oCUIHNlcnZlciByb3VuZC10cmlwcyB0aGF0IHJlYWQgdGhlIGRyYXduIHJlY3RhbmdsZXMgKyBkaXNwbGF5ZWQgcGl4ZWxzIHRocm91Z2hcbiAgLy8gdGhlIHNhbWUgd2FuZCBob3N0IChyZWN0YW5nbGVzIGZyb20gdGhlIFJlZ2lvblN0b3JlLCBpbWFnZSBmcm9tIHRoZSByZWFkYmFjaykuXG4gIGFzeW5jIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCAhdGhpcy53YW5kSG9zdCkgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpOyAvLyB0aGUgU0FNIGVtYmVkZGluZyBzYW1wbGVzIHRoZSBjdXJyZW50bHktZGlzcGxheWVkIGltYWdlXG4gICAgdGhpcy5jYWNoZWRJbWFnZVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgYXN5bmMgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy52aWV3ZXIgfHwgIXRoaXMud2FuZEhvc3QgfHwgIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIDA7XG4gICAgYXdhaXQgdGhpcy5ydW5SZWFkYmFjaygpO1xuICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuY2VsbFNlZ21lbnRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLmNlbGxTZWdtZW50VG9vbC5zZWdtZW50Qm94ZXModGhpcy5jZWxsU2VnbWVudGVyKTtcbiAgfVxuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Ub29sLnNldE1vZGVsKGlkKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlbChpZCk7XG4gIH1cbiAgc2V0U2FtUG9pbnRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0Q29udHJvbHNFbmFibGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY2FjaGVkSW1hZ2VTb3VyY2UgPSBudWxsO1xuICAgICAgdGhpcy5hcm1SZWFkYmFjaygwKTsgLy8gcmVmcmVzaCB0aGUgcmVhZGJhY2sgdGhlIGNsaWNrJ3MgZW1iZWRkaW5nIHdpbGwgc2FtcGxlXG4gICAgICBpZiAodGhpcy53YW5kSG9zdCkgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJSW50ZW5zaXR5U2FtcGxpbmc6IFBsb3RseSBvd25zIHNhbXBsaW5nOyBlbWl0IHZpZXdwb3J0IGNoYW5nZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nKF9pbWFnZUluZm86IElJbWFnZUluZm8sIF96SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICByZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koXG4gICAgX3g6IG51bWJlcixcbiAgICBfeTogbnVtYmVyLFxuICAgIF93aWR0aDogbnVtYmVyLFxuICAgIF9oZWlnaHQ6IG51bWJlcixcbiAgICBfekluZGV4OiBudW1iZXIsXG4gICk6IHZvaWQge31cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldElzb1JhbmdlOiAoaXNvTWluOiBudW1iZXIsIGlzb01heDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEFwcGx5IHRvIGV2ZXJ5IGNoYW5uZWwncyB2b2x1bWUgbGF5ZXIuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy52b2x1bWVWaWV3Py5sYXllcnMgPz8gW10pIHtcbiAgICAgICAgICBsYXllci5jb250cmFzdExpbWl0cyA9IFtpc29NaW4sIGlzb01heF07XG4gICAgICAgICAgbGF5ZXIucmVuZGVyaW5nID0gJ2lzbyc7XG4gICAgICAgICAgbGF5ZXIuaXNvVGhyZXNob2xkID0gMC41O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc3VyZmFjZUxheWVyICYmICF0aGlzLnNjYXR0ZXIzZExheWVyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3VyZmFjZURyYWdNb2RlOiAobW9kZTogc3RyaW5nKTogdm9pZCA9PiB0aGlzLnNldFN1cmZhY2VEcmFnTW9kZShtb2RlKSxcbiAgICAgIHJlc2V0U3VyZmFjZUNhbWVyYTogKCk6IHZvaWQgPT4gdGhpcy5yZXNldFN1cmZhY2VDYW1lcmEoKSxcbiAgICAgIHNldEF4ZXNWaXNpYmxlOiAodmlzaWJsZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmF4ZXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgdGhpcy5heGVzTGFiZWxzPy5zZXRWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5heGVzTGF5ZXIpIHtcbiAgICAgICAgICB0aGlzLmF4ZXNMYXllci52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgICAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXhlc1Zpc2libGU6ICgpOiBib29sZWFuID0+IHRoaXMuYXhlc1Zpc2libGUsXG4gICAgICAvLyBTdXJmYWNlIHdpcmVmcmFtZSAobmFwYXJpLWpzIHN1cmZhY2Ugb25seSkg4oCUIGEgbGl2ZSBsYXllciBwcm9wZXJ0eSwgbm8gcmVidWlsZCBuZWVkZWQuXG4gICAgICBzZXRXaXJlZnJhbWU6IChvbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cmZhY2VXaXJlZnJhbWUgPSBvbjtcbiAgICAgICAgaWYgKHRoaXMuc3VyZmFjZUxheWVyKSB7XG4gICAgICAgICAgdGhpcy5zdXJmYWNlTGF5ZXIud2lyZWZyYW1lID0gb247XG4gICAgICAgICAgdGhpcy52aWV3ZXI/LnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdpcmVmcmFtZTogKCk6IGJvb2xlYW4gPT4gdGhpcy5zdXJmYWNlV2lyZWZyYW1lLFxuICAgIH07XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuIG51bGw7XG4gICAgLy8gVm9sdW1lIC8gaXNvc3VyZmFjZTogaW50ZW5zaXR5IGhpc3RvZ3JhbSBvZiB0aGUgYXNzZW1ibGVkIChkb3duc2FtcGxlZCkgdWludDggdm9sdW1lIGZvciB0aGVcbiAgICAvLyByZXF1ZXN0ZWQgY2hhbm5lbCAobXVsdGljaGFubmVsKSBvciB0aGUgc2luZ2xlIGdyYXlzY2FsZSB2b2x1bWUgKGtleSAwKS5cbiAgICBpZiAodGhpcy52b2x1bWVDaGFubmVsRGF0YS5zaXplKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy52b2x1bWVDaGFubmVsRGF0YS5nZXQoY2hhbm5lbEluZGV4KSA/PyB0aGlzLnZvbHVtZUNoYW5uZWxEYXRhLmdldCgwKTtcbiAgICAgIHJldHVybiBkYXRhID8gdGhpcy50b0lIaXN0b2dyYW0oaGlzdG9ncmFtU2NhbGFyKGRhdGEsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gVGlsZWQgbW9kZSBoYXMgbm8gZnVsbCBpbi1tZW1vcnkgcGl4ZWxzIOKGkiB1c2UgdGhlIGNvYXJzZSBwZXItY2hhbm5lbCBzYW1wbGUgKFJHQjogcmVhZGJhY2spLlxuICAgIGlmICh0aGlzLnRpbGVkKSB7XG4gICAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuaGlzdFNhbXBsZXMuZ2V0KHRoaXMuaW1hZ2VNb2RlID09PSAnZ3JheXNjYWxlJyA/IDAgOiBjaGFubmVsSW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZSA/IHRoaXMudG9JSGlzdG9ncmFtKGhpc3RvZ3JhbVNjYWxhcihzYW1wbGUsIGJpbnMsIDAsIDI1NSkpIDogbnVsbDtcbiAgICB9XG4gICAgLy8gR3JheXNjYWxlL211bHRpY2hhbm5lbCAoc3RpdGNoKTogbmF0aXZlIHBlci1jaGFubmVsIGhpc3RvZ3JhbSBzdHJhaWdodCBmcm9tIHRoZSBpbi1tZW1vcnlcbiAgICAvLyBzY2FsYXIgbGF5ZXIgKG5vIEdQVSByZWFkYmFjaykuIFJHQjogYmluIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzJyBSL0cvQiBieXRlICg4LWJpdCBjbGllbnQgcGF0aCkuXG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmNoYW5uZWxWaWV3Py5sYXllcnNbdGhpcy5pbWFnZU1vZGUgPT09ICdncmF5c2NhbGUnID8gMCA6IGNoYW5uZWxJbmRleF07XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBjb25zdCBoID0gdi5sYXllckhpc3RvZ3JhbShsYXllciwgYmlucyk7XG4gICAgICBpZiAoaCkgcmV0dXJuIHRoaXMudG9JSGlzdG9ncmFtKGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZU1vZGUgPT09ICdyZ2InKSByZXR1cm4gdGhpcy5yZ2JIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRIaXN0b2dyYW0kKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBPYnNlcnZhYmxlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgLy8gPjgtYml0IGNoYW5uZWxzOiBmZXRjaCB0aGUgdHJ1ZSBuYXRpdmUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciAodGhlIGRpc3BsYXllZCBwaXhlbHNcbiAgICAvLyBhcmUgOC1iaXQsIHNvIHRoZSBjbGllbnQgaGlzdG9ncmFtIHdvdWxkIGJlIGNsaXBwZWQpLiA4LWJpdCBjaGFubmVscyB1c2UgdGhlIGNsaWVudCBwYXRoLlxuICAgIGNvbnN0IGJpdERlcHRoID0gdGhpcy5kZXNjcmlwdG9yPy5jaGFubmVsSW5mbz8uW2NoYW5uZWxJbmRleF0/LmJpdERlcHRoID8/IDg7XG4gICAgaWYgKGJpdERlcHRoID4gOCkge1xuICAgICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgICBjb25zdCBrZXkgPSBgJHt6fXwke2NoYW5uZWxJbmRleH1gO1xuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYXRpdmVIaXN0b2dyYW1zLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlZCkgcmV0dXJuIG9mKGNhY2hlZCk7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoTmF0aXZlSGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucywgeiwga2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCArIGNhY2hlIG9uZSBjaGFubmVsJ3MgbmF0aXZlLWJpdC1kZXB0aCBoaXN0b2dyYW0gZnJvbSBgR0VUIC9oaXN0b2dyYW1gICg+OC1iaXQpLiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTmF0aXZlSGlzdG9ncmFtKFxuICAgIGNoYW5uZWw6IG51bWJlcixcbiAgICBiaW5zOiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPElIaXN0b2dyYW0gfCBudWxsPiB7XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfWhpc3RvZ3JhbT9pbmZvPSR7aW5mb0I2NH0mY2hhbm5lbD0ke2NoYW5uZWx9Jno9JHt6fSZiaW5zPSR7Ymluc31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHJldHVybiBudWxsOyAvLyAyMDIgKHN0aWxsIGNhY2hpbmcpIG9yIHRyYW5zaWVudCDihpIgbnVsbDsgdGhlIHBhbmUgcmV0cmllc1xuICAgICAgY29uc3QgaGkgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICAgICAgYml0RGVwdGg6IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNaW46IG51bWJlcjtcbiAgICAgICAgcmFuZ2VNYXg6IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNaW46IG51bWJlcjtcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IG51bWJlcjtcbiAgICAgICAgYmluV2lkdGg6IG51bWJlcjtcbiAgICAgICAgY291bnRzOiBudW1iZXJbXTtcbiAgICAgIH07XG4gICAgICBpZiAoIWhpPy5jb3VudHMpIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgb3V0OiBJSGlzdG9ncmFtID0ge1xuICAgICAgICBiaW5zOiBoaS5jb3VudHMubWFwKChfLCBpKSA9PiBoaS5yYW5nZU1pbiArIGkgKiBoaS5iaW5XaWR0aCksXG4gICAgICAgIGNvdW50czogaGkuY291bnRzLFxuICAgICAgICBtYXg6IGhpLmNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCksXG4gICAgICAgIGJpdERlcHRoOiBoaS5iaXREZXB0aCxcbiAgICAgICAgcmFuZ2VNaW46IGhpLnJhbmdlTWluLFxuICAgICAgICByYW5nZU1heDogaGkucmFuZ2VNYXgsXG4gICAgICAgIG9ic2VydmVkTWluOiBoaS5vYnNlcnZlZE1pbixcbiAgICAgICAgb2JzZXJ2ZWRNYXg6IGhpLm9ic2VydmVkTWF4LFxuICAgICAgfTtcbiAgICAgIHRoaXMubmF0aXZlSGlzdG9ncmFtcy5zZXQoa2V5LCBvdXQpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW25hcGFyaS1qc10gbmF0aXZlIGhpc3RvZ3JhbSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBvZiB0aGUgZGlzcGxheWVkIFJHQiBjb21wb3NpdGUgKFIvRy9CIGJ5dGUpLCBmcm9tIHRoZSBsYXN0IHJlYWRiYWNrLiAqL1xuICBwcml2YXRlIHJnYkhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5sYXN0UGl4ZWxzO1xuICAgIGlmICghcHgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGJhbmQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyLCBjaGFubmVsSW5kZXgpKTtcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjU2LCBNYXRoLmZsb29yKGJpbnMpIHx8IDI1NikpO1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBBcnJheShuKS5maWxsKDApO1xuICAgIGNvbnN0IGRhdGEgPSBweC5kYXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRhdGFbaSArIDNdID09PSAwKSBjb250aW51ZTsgLy8gc2tpcCB0cmFuc3BhcmVudCBwYWRkaW5nXG4gICAgICBjb3VudHNbTWF0aC5taW4obiAtIDEsIChkYXRhW2kgKyBiYW5kXSAqIG4pID4+IDgpXSsrO1xuICAgIH1cbiAgICBjb25zdCBiaW5zQXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4gKGkgKiAyNTYpIC8gbik7XG4gICAgcmV0dXJuIHsgYmluczogYmluc0FyciwgY291bnRzLCBtYXg6IGNvdW50cy5yZWR1Y2UoKG0sIGMpID0+IChjID4gbSA/IGMgOiBtKSwgMCkgfTtcbiAgfVxuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdi5zY3JlZW5zaG90KCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ25hcGFyaS1qcy5wbmcnO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgIH0pO1xuICB9XG4gIC8qKiBOYXRpdmUtYml0LWRlcHRoICgxNi8zMi1iaXQpIG11bHRpLWJhbmQgVElGRiBleHBvcnQgdmlhIHRoZSBzZXJ2ZXIgYC9leHBvcnQvdGlmZmAgZW5kcG9pbnQg4oCUXG4gICAqICB0aGUgZGlzcGxheWVkIFBORyBpcyBhbiA4LWJpdCBmaWd1cmUsIHRoaXMgcHJlc2VydmVzIHRoZSB0cnVlIHBpeGVsIHZhbHVlcy4gVmlzaWJsZSBjaGFubmVsc1xuICAgKiAgb25seSAob21pdHRlZCB3aGVuIGFsbCBhcmUgdmlzaWJsZSDihpIgc2VydmVyIGRlZmF1bHQpLiBNaXJyb3JzIHRoZSBPU0QgYmFja2VuZC4gKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3QgdmlzaWJsZSA9IHN0YXRlcy5maWx0ZXIoKGMpID0+IGMudmlzaWJsZSkubWFwKChjKSA9PiBjLmluZGV4KTtcbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgc3RhdGVzLmxlbmd0aCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgeiA9IHRoaXMubG9hZGVkPy56ID8/IDA7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke2luZm9CNjR9Jno9JHt6fSR7Y2hQYXJhbX1gO1xuICAgIGNvbnN0IHN0ZW0gPSAodGhpcy5sb2FkZWQ/LmZpbGVuYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlc1xuICAgICAgLmdldEF1dGhIZWFkZXJzKClcbiAgICAgIC5jYXRjaCgoKSA9PiAoe30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBzdGF0dXMgJHtyZXNwLnN0YXR1c31gKTtcbiAgICAgIHNhdmVBcyhhd2FpdCByZXNwLmJsb2IoKSwgYCR7c3RlbX1fMTZiaXQub21lLnRpZmApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSAxNi1iaXQgVElGRiBleHBvcnQgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG5cbi8qKlxuICogQWRkaXRpdmVseSBjb21wb3NpdGUgZ3JheXNjYWxlIGNoYW5uZWwgaW1hZ2VzLCBlYWNoIHRpbnRlZCB3aXRoIGl0cyBkaXNwbGF5IGNvbG91ciDigJRcbiAqIHRoZSBuYXZpZ2F0b3IncyBwaWN0dXJlIG9mIGEgbXVsdGljaGFubmVsIGltYWdlLlxuICovXG5mdW5jdGlvbiB0aW50ZWRDb21wb3NpdGUoaW1hZ2VzOiBJbWFnZUJpdG1hcFtdLCBjb2xvcnM6IHN0cmluZ1tdKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICBjb25zdCB3ID0gaW1hZ2VzWzBdPy53aWR0aCA/PyAxO1xuICBjb25zdCBoID0gaW1hZ2VzWzBdPy5oZWlnaHQgPz8gMTtcbiAgY29uc3Qgb3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIG91dC53aWR0aCA9IHc7XG4gIG91dC5oZWlnaHQgPSBoO1xuICBjb25zdCBjdHggPSBvdXQuZ2V0Q29udGV4dCgnMmQnKSE7XG4gIGN0eC5maWxsU3R5bGUgPSAnIzAwMCc7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCB3LCBoKTtcbiAgY29uc3QgdG1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gIHRtcC53aWR0aCA9IHc7XG4gIHRtcC5oZWlnaHQgPSBoO1xuICBjb25zdCB0ID0gdG1wLmdldENvbnRleHQoJzJkJykhO1xuICBpbWFnZXMuZm9yRWFjaCgoaW1nLCBpKSA9PiB7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICAgIHQuZHJhd0ltYWdlKGltZywgMCwgMCwgdywgaCk7XG4gICAgdC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnbXVsdGlwbHknO1xuICAgIHQuZmlsbFN0eWxlID0gY29sb3JzW2ldO1xuICAgIHQuZmlsbFJlY3QoMCwgMCwgdywgaCk7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdsaWdodGVyJztcbiAgICBjdHguZHJhd0ltYWdlKHRtcCwgMCwgMCk7XG4gIH0pO1xuICByZXR1cm4gb3V0O1xufVxuIl19
|