@jax-data-science/sci-image-visualizer 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/display-types.mjs +1 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +73 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +418 -29
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +35 -1
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +8 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +12 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +2 -1
- package/esm2022/lib/routing-visualizer.service.mjs +5 -1
- package/esm2022/lib/spatial/spatial-tiles.mjs +144 -1
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +198 -9
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +878 -30
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/display-types.d.ts +4 -2
- package/lib/contracts/plot-type-contribution.contract.d.ts +9 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +12 -1
- package/lib/contracts/spatial-dataset.contract.d.ts +30 -0
- package/lib/contracts/visualizer.contract.d.ts +7 -1
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +20 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +76 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +7 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +3 -1
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +2 -1
- package/lib/spatial/spatial-tiles.d.ts +38 -1
- package/lib/spatial-controls/spatial-controls.component.d.ts +54 -0
- package/package.json +1 -1
|
@@ -2,7 +2,14 @@ import { Colormap, colormapFromLut } from 'napari-js';
|
|
|
2
2
|
import { ALL_GENES } from '../../contracts/ports/spatial-data.port';
|
|
3
3
|
import { NO_CATEGORY, NO_OBSERVATION, isCategoricalColumn, } from '../../contracts/spatial-dataset.contract';
|
|
4
4
|
import { DEFAULT_CATEGORICAL_PALETTE, MISSING_COLOR, contrastWindow, lutFor, parseHex, resolveCategoryColors, } from '../../spatial/spatial-encoding';
|
|
5
|
-
import { INFERNO_SCALE, POLYGON_LEVEL_MIN_CELL_PX, allGenesPlan, cellTypeColumnFor, cellsShown, colorDensityWindow, densityAutoRange, groupedMarkerPx, quantileOf, tilesInRectFrom, defaultGlyphFor, discreteColormapStops, glyphOutline, glyphRings, pixelsPerDataUnit, polygonLevelFor, tileId, tilesInRect, transcriptLevelFor, transcriptMarkerPx, typicalCellDiameter, visibleArea, visibleDataRect, } from '../../spatial/spatial-tiles';
|
|
5
|
+
import { INFERNO_SCALE, POLYGON_LEVEL_MIN_CELL_PX, allGenesPlan, cellTypeColumnFor, cellsShown, colorDensityWindow, densityAutoRange, groupedMarkerPx, quantileOf, tilesInRectFrom, defaultGlyphFor, discreteColormapStops, glyphOutline, glyphRings, pixelsPerDataUnit, polygonLevelFor, tileId, tilesInRect, transcriptLevelFor, transcriptMarkerPx, typicalCellDiameter, visibleArea, visibleDataRect, geneBinSize, groupTranscripts, clipTranscripts, clusterColorMap, } from '../../spatial/spatial-tiles';
|
|
6
|
+
/** The all-gene pyramid's finest bin (250 µm source tiles / 128) and default level count, used
|
|
7
|
+
* to group a gene selection on the same ladder when a dataset has no pyramid. */
|
|
8
|
+
const PYRAMID_BASE_BIN_UM = 250 / 128;
|
|
9
|
+
const PYRAMID_LEVELS = 7;
|
|
10
|
+
/** Icons get a dark rim only while there are at most this many, at least this big (px). */
|
|
11
|
+
const GLYPH_OUTLINE_MAX = 20_000;
|
|
12
|
+
const GLYPH_OUTLINE_MIN_PX = 8;
|
|
6
13
|
const ORDER = [
|
|
7
14
|
'cellFill', 'cellOutline', 'nucleusOutline', 'density', 'transcripts', 'transcriptOutline',
|
|
8
15
|
];
|
|
@@ -41,6 +48,12 @@ export class NapariSpatialTileLayers {
|
|
|
41
48
|
/** Selection identity → revision, so a change key can name a selection cheaply. */
|
|
42
49
|
this.lastSelection = null;
|
|
43
50
|
this.selectionRevision = 0;
|
|
51
|
+
/** µm per observation unit of the drawn dataset, for describing a grouped marker's area. */
|
|
52
|
+
this.micronsPerUnit = null;
|
|
53
|
+
/** Loads in flight, per layer label, for the loading badge. */
|
|
54
|
+
this.loading = new Map();
|
|
55
|
+
/** The loaded per-gene transcripts the in-view counts are taken from. */
|
|
56
|
+
this.countSource = null;
|
|
44
57
|
// ── hover ─────────────────────────────────────────────────────────────────────────
|
|
45
58
|
this.drawn = null;
|
|
46
59
|
this.hoverTypes = null;
|
|
@@ -48,6 +61,7 @@ export class NapariSpatialTileLayers {
|
|
|
48
61
|
this.hoverCache = new Map();
|
|
49
62
|
this.hoverKey = null;
|
|
50
63
|
this.hoverTimer = null;
|
|
64
|
+
this.densityCache = new Map();
|
|
51
65
|
this.countsCache = null;
|
|
52
66
|
/** The density window in use and the densest bin, for the panel's threshold control. */
|
|
53
67
|
this.densityStats = null;
|
|
@@ -60,6 +74,81 @@ export class NapariSpatialTileLayers {
|
|
|
60
74
|
this.viewer = viewer;
|
|
61
75
|
this.cameraOff = viewer.camera.changed.connect(() => this.schedule());
|
|
62
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Group a gene selection for the zoom: one marker per gene-tree cluster (a gene in no
|
|
79
|
+
* cluster is its own) per bin of the pyramid ladder, starting at the finest bin whose
|
|
80
|
+
* markers are 14 px apart and stepping up while the markers would exceed the budget.
|
|
81
|
+
* Null to draw every transcript: zoomed in, with the selection within the budget.
|
|
82
|
+
*/
|
|
83
|
+
groupSelection(t, view, ladder, pxPerUnit) {
|
|
84
|
+
const budget = Math.max(1, view.transcriptBudget);
|
|
85
|
+
const genes = view.transcriptGenes;
|
|
86
|
+
const groups = view.transcriptGeneGroups;
|
|
87
|
+
const names = [...groups.map((g) => g.name), ...genes];
|
|
88
|
+
const clusterOf = genes.map((gene, slot) => {
|
|
89
|
+
const g = groups.findIndex((x) => x.genes.includes(gene));
|
|
90
|
+
return g >= 0 ? g : groups.length + slot;
|
|
91
|
+
});
|
|
92
|
+
const keyOf = (slot) => clusterOf[slot] ?? groups.length + slot;
|
|
93
|
+
let bin = ladder.start;
|
|
94
|
+
if (bin === null) {
|
|
95
|
+
// Every transcript, if they fit the max and none was cut off at the cap.
|
|
96
|
+
if (t.count <= budget && t.count < MAX_TRANSCRIPTS)
|
|
97
|
+
return null;
|
|
98
|
+
bin = ladder.baseBin;
|
|
99
|
+
}
|
|
100
|
+
const top = ladder.baseBin * 2 ** (ladder.levels - 1);
|
|
101
|
+
let grouped = groupTranscripts(t, bin, keyOf);
|
|
102
|
+
// Over the max: combine into larger markers, a level at a time.
|
|
103
|
+
while (grouped.tile.count > budget && bin < top) {
|
|
104
|
+
bin *= 2;
|
|
105
|
+
grouped = groupTranscripts(t, bin, keyOf);
|
|
106
|
+
}
|
|
107
|
+
const refCount = quantileOf(grouped.tile.weight, 0.95);
|
|
108
|
+
const binPx = bin * pxPerUnit;
|
|
109
|
+
const px = new Float32Array(grouped.tile.count);
|
|
110
|
+
for (let i = 0; i < grouped.tile.count; i++) {
|
|
111
|
+
px[i] = groupedMarkerPx(grouped.tile.weight[i], refCount, binPx, view.transcriptScale);
|
|
112
|
+
}
|
|
113
|
+
return { merged: grouped.tile, px, bin, group: grouped.group, names };
|
|
114
|
+
}
|
|
115
|
+
/** Report `label` loading while `work` is in flight. */
|
|
116
|
+
async track(label, work) {
|
|
117
|
+
this.loading.set(label, (this.loading.get(label) ?? 0) + 1);
|
|
118
|
+
this.host.loadingChanged?.([...this.loading.keys()]);
|
|
119
|
+
try {
|
|
120
|
+
return await work;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
const n = (this.loading.get(label) ?? 1) - 1;
|
|
124
|
+
if (n > 0)
|
|
125
|
+
this.loading.set(label, n);
|
|
126
|
+
else
|
|
127
|
+
this.loading.delete(label);
|
|
128
|
+
this.host.loadingChanged?.([...this.loading.keys()]);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Transcripts of each selected gene inside `rect`: each entry counts for the transcripts it
|
|
133
|
+
* stands for (an aggregate at a coarse level holds several). Null without per-gene data.
|
|
134
|
+
*/
|
|
135
|
+
geneCountsIn(rect) {
|
|
136
|
+
const src = this.countSource;
|
|
137
|
+
if (!src)
|
|
138
|
+
return null;
|
|
139
|
+
const out = {};
|
|
140
|
+
for (const g of src.genes)
|
|
141
|
+
out[g] = 0;
|
|
142
|
+
const { x, y, weight, gene } = src.merged;
|
|
143
|
+
for (let i = 0; i < src.merged.count; i++) {
|
|
144
|
+
if (x[i] < rect.x0 || x[i] > rect.x1 || y[i] < rect.y0 || y[i] > rect.y1)
|
|
145
|
+
continue;
|
|
146
|
+
const name = src.genes[gene[i]];
|
|
147
|
+
if (name !== undefined)
|
|
148
|
+
out[name] += weight[i];
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
63
152
|
/** Whether `layer` is one of the overlays drawn here (density, cells, transcripts). */
|
|
64
153
|
owns(layer) {
|
|
65
154
|
for (const l of this.layers.values())
|
|
@@ -79,6 +168,9 @@ export class NapariSpatialTileLayers {
|
|
|
79
168
|
this.timer = null;
|
|
80
169
|
this.token++;
|
|
81
170
|
this.tileRetries = 0;
|
|
171
|
+
this.countSource = null;
|
|
172
|
+
this.loading.clear();
|
|
173
|
+
this.host.loadingChanged?.([]);
|
|
82
174
|
if (this.viewer) {
|
|
83
175
|
for (const layer of this.layers.values()) {
|
|
84
176
|
if (this.viewer.layers.items.includes(layer))
|
|
@@ -150,6 +242,7 @@ export class NapariSpatialTileLayers {
|
|
|
150
242
|
]);
|
|
151
243
|
if (stale())
|
|
152
244
|
return;
|
|
245
|
+
this.host.geneCountsChanged?.(this.geneCountsIn(rect));
|
|
153
246
|
// A tile that failed left a hole the cache keys do not record, so try the same view
|
|
154
247
|
// again, backing off, a bounded number of times.
|
|
155
248
|
if (!this.planIncomplete) {
|
|
@@ -181,7 +274,9 @@ export class NapariSpatialTileLayers {
|
|
|
181
274
|
const hidden = await this.hiddenCodes(dataset, view);
|
|
182
275
|
if (stale())
|
|
183
276
|
return;
|
|
184
|
-
const
|
|
277
|
+
const label = view.cellSet === 'both' ? 'Cells and nuclei'
|
|
278
|
+
: view.cellSet === 'nucleus' ? 'Nuclei' : 'Cells';
|
|
279
|
+
const geometry = await this.track(label, this.cellGeometry(dataset, view, rect, level, hidden, stale));
|
|
185
280
|
if (!geometry)
|
|
186
281
|
return;
|
|
187
282
|
const { rings, nuclei, geometryKey } = geometry;
|
|
@@ -365,7 +460,8 @@ export class NapariSpatialTileLayers {
|
|
|
365
460
|
// ── transcripts ───────────────────────────────────────────────────────────────────
|
|
366
461
|
async planTranscripts(dataset, view, rect, pxPerUnit, stale) {
|
|
367
462
|
const mode = view.transcriptMode;
|
|
368
|
-
const job = (mode === 'circles' || mode === 'glyphs')
|
|
463
|
+
const job = (mode === 'circles' || mode === 'glyphs')
|
|
464
|
+
&& (this.port.getTranscriptTile || (this.port.getTranscriptGeneBins && dataset.transcriptGeneBins))
|
|
369
465
|
? (view.transcriptAllGenes
|
|
370
466
|
? this.allGenesJob(dataset, view, rect, pxPerUnit)
|
|
371
467
|
: this.geneJob(dataset, view, rect, pxPerUnit))
|
|
@@ -374,6 +470,7 @@ export class NapariSpatialTileLayers {
|
|
|
374
470
|
this.drop('transcripts');
|
|
375
471
|
this.drop('transcriptOutline');
|
|
376
472
|
this.drawn = null;
|
|
473
|
+
this.countSource = null;
|
|
377
474
|
return;
|
|
378
475
|
}
|
|
379
476
|
// Marker sizes follow the zoom, so the zoom is part of the key; a pan that keeps
|
|
@@ -382,25 +479,49 @@ export class NapariSpatialTileLayers {
|
|
|
382
479
|
dataset.id, mode, job.key, view.transcriptColorBy, this.cellTypeColumnName(dataset, view),
|
|
383
480
|
view.transcriptScale, view.transcriptOpacity, JSON.stringify(view.transcriptGlyphs),
|
|
384
481
|
pxPerUnit.toPrecision(4), view.hiddenGroups.join('\u0001'), view.transcriptHiddenGenes.join(','),
|
|
385
|
-
JSON.stringify(view.transcriptGeneColors),
|
|
482
|
+
JSON.stringify(view.transcriptGeneColors), JSON.stringify(view.transcriptGeneGroups),
|
|
386
483
|
].join('|');
|
|
387
484
|
const current = this.layers.get('transcripts');
|
|
388
485
|
if (planKey === this.keys.get('transcripts') && current && this.viewer.layers.items.includes(current)) {
|
|
389
486
|
return;
|
|
390
487
|
}
|
|
391
|
-
const loaded = await job.load();
|
|
488
|
+
const loaded = await this.track('Transcripts', job.load());
|
|
392
489
|
if (stale())
|
|
393
490
|
return;
|
|
491
|
+
// Per-gene counts in view come from what was loaded, before hidden genes are dropped:
|
|
492
|
+
// a hidden gene still has transcripts there. Summed density grids (no per-gene levels,
|
|
493
|
+
// zoomed out) hold clusters, not genes: no per-gene counts there, rather than a guess.
|
|
494
|
+
this.countSource = (loaded.kind ?? job.kind) === 'genes' && !loaded.clustered
|
|
495
|
+
? { merged: loaded.merged, genes: [...view.transcriptGenes] } : null;
|
|
394
496
|
const hidden = await this.hiddenCodes(dataset, view);
|
|
395
497
|
if (stale())
|
|
396
498
|
return;
|
|
397
|
-
|
|
499
|
+
// Density-grid markers carry no cells and were built from the visible genes only.
|
|
500
|
+
const filtered = loaded.clustered ? { merged: loaded.merged, px: loaded.px }
|
|
501
|
+
: filterTranscripts(loaded.merged, loaded.px, hidden, (loaded.kind ?? job.kind) === 'genes' ? hiddenGeneSlots(view) : null);
|
|
502
|
+
let { merged, px } = filtered;
|
|
503
|
+
let selectionBin = loaded.clustered?.bin ?? null;
|
|
504
|
+
let entryGroup = loaded.clustered?.group ?? null;
|
|
505
|
+
let groupNames = loaded.clustered?.names ?? null;
|
|
506
|
+
if (loaded.ladder) {
|
|
507
|
+
const g = this.groupSelection(merged, view, loaded.ladder, pxPerUnit);
|
|
508
|
+
if (g)
|
|
509
|
+
({ merged, px, bin: selectionBin, group: entryGroup, names: groupNames } = g);
|
|
510
|
+
}
|
|
398
511
|
// A bin of the all-gene pyramid mixes genes and carries none, so it cannot be coloured
|
|
399
512
|
// by gene: colour it by its dominant cell's type until individual transcripts show.
|
|
400
513
|
const kind = loaded.kind ?? job.kind;
|
|
401
|
-
const colorView = kind === 'bins' && view.transcriptColorBy
|
|
402
|
-
? { ...view, transcriptColorBy: 'cellType' }
|
|
403
|
-
|
|
514
|
+
const colorView = kind === 'bins' && view.transcriptColorBy !== 'cellType'
|
|
515
|
+
? { ...view, transcriptColorBy: 'cellType' }
|
|
516
|
+
// Density-grid markers have no cell to take a type from: they take their cluster's colour.
|
|
517
|
+
: loaded.clustered && view.transcriptColorBy === 'cellType'
|
|
518
|
+
? { ...view, transcriptColorBy: 'cluster' } : view;
|
|
519
|
+
// Each entry's cluster: its marker's group, or the gene-tree group its gene is in.
|
|
520
|
+
const geneCluster = view.transcriptGenes.map((g) => view.transcriptGeneGroups.find((x) => x.genes.includes(g))?.name ?? g);
|
|
521
|
+
const clusterOf = (i) => (entryGroup && groupNames
|
|
522
|
+
? groupNames[entryGroup[i]] ?? null
|
|
523
|
+
: geneCluster[merged.gene[i]] ?? null);
|
|
524
|
+
const faces = await this.transcriptColors(dataset, colorView, merged, kind === 'genes' ? clusterOf : undefined);
|
|
404
525
|
if (stale())
|
|
405
526
|
return;
|
|
406
527
|
if (this.planIncomplete)
|
|
@@ -409,11 +530,16 @@ export class NapariSpatialTileLayers {
|
|
|
409
530
|
this.keys.set('transcripts', planKey);
|
|
410
531
|
const diam = px.map((d) => d / pxPerUnit);
|
|
411
532
|
this.drawn = {
|
|
412
|
-
kind: loaded.kind ?? job.kind,
|
|
533
|
+
kind: loaded.kind ?? job.kind,
|
|
534
|
+
bin: selectionBin ? { size: selectionBin, origin: loaded.clustered?.origin ?? [0, 0] }
|
|
535
|
+
: (loaded.kind ? loaded.bin : job.bin),
|
|
413
536
|
merged, radius: diam.map((d) => d / 2),
|
|
414
537
|
genes: [...view.transcriptGenes], ref: dataset.imageRef ?? null, grid: null,
|
|
538
|
+
...(entryGroup && groupNames ? { entryGroup, groupNames } : {}),
|
|
539
|
+
...(loaded.clustered ? { groupGenes: loaded.clustered.genes } : {}),
|
|
415
540
|
};
|
|
416
541
|
this.hoverCache.clear();
|
|
542
|
+
this.micronsPerUnit = dataset.micronsPerUnit ?? null;
|
|
417
543
|
const typeColumn = this.cellTypeColumnName(dataset, view);
|
|
418
544
|
this.hoverTypes = typeColumn ? await this.categoricalCodes(typeColumn).catch(() => null) : null;
|
|
419
545
|
if (stale())
|
|
@@ -425,7 +551,7 @@ export class NapariSpatialTileLayers {
|
|
|
425
551
|
this.drawTranscriptCircles(merged, diam, faces.rgba, view, place);
|
|
426
552
|
}
|
|
427
553
|
else {
|
|
428
|
-
this.drawTranscriptGlyphs(merged, diam, faces, view, place);
|
|
554
|
+
this.drawTranscriptGlyphs(merged, diam, faces, view, place, pxPerUnit);
|
|
429
555
|
}
|
|
430
556
|
}
|
|
431
557
|
/** One sized circle per entry, the size saying how many transcripts it stands for. */
|
|
@@ -449,7 +575,7 @@ export class NapariSpatialTileLayers {
|
|
|
449
575
|
});
|
|
450
576
|
this.replace('transcripts', layer);
|
|
451
577
|
}
|
|
452
|
-
drawTranscriptGlyphs(merged, diam, faces, view, { scale, translate }) {
|
|
578
|
+
drawTranscriptGlyphs(merged, diam, faces, view, { scale, translate }, pxPerUnit) {
|
|
453
579
|
// Glyphs: each entry becomes its gene's icon polygon, filled through a discrete
|
|
454
580
|
// colormap and outlined dark so small icons stay readable over the tissue. With every
|
|
455
581
|
// gene drawn there is one icon for all of them — 18,000 shapes would say nothing.
|
|
@@ -472,6 +598,13 @@ export class NapariSpatialTileLayers {
|
|
|
472
598
|
translate,
|
|
473
599
|
});
|
|
474
600
|
this.replace('transcripts', fill);
|
|
601
|
+
// A dark rim keeps a few large icons readable over the tissue; on many small ones the
|
|
602
|
+
// rims merge into a solid dark sheet that hides every colour, so they are left off.
|
|
603
|
+
const medianPx = median(diam) * pxPerUnit;
|
|
604
|
+
if (merged.count > GLYPH_OUTLINE_MAX || medianPx < GLYPH_OUTLINE_MIN_PX) {
|
|
605
|
+
this.drop('transcriptOutline');
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
475
608
|
const edge = this.viewer.addShapes(coords, offsets, {
|
|
476
609
|
name: 'transcript outlines',
|
|
477
610
|
draw: 'outline',
|
|
@@ -523,7 +656,7 @@ export class NapariSpatialTileLayers {
|
|
|
523
656
|
const obs = d.merged.observation[i];
|
|
524
657
|
const cells = obs === NO_OBSERVATION ? [] : [obs];
|
|
525
658
|
let box;
|
|
526
|
-
if (d.kind === 'bins' && d.bin) {
|
|
659
|
+
if ((d.kind === 'bins' || d.kind === 'genes') && d.bin) {
|
|
527
660
|
const { size, origin } = d.bin;
|
|
528
661
|
const bx = Math.floor((d.merged.x[i] - origin[0]) / size);
|
|
529
662
|
const by = Math.floor((d.merged.y[i] - origin[1]) / size);
|
|
@@ -535,8 +668,9 @@ export class NapariSpatialTileLayers {
|
|
|
535
668
|
const e = 0.02;
|
|
536
669
|
box = [d.merged.x[i] - e, d.merged.y[i] - e, d.merged.x[i] + e, d.merged.y[i] + e];
|
|
537
670
|
}
|
|
671
|
+
const genes = d.groupGenes && d.entryGroup ? d.groupGenes[d.entryGroup[i]] : undefined;
|
|
538
672
|
try {
|
|
539
|
-
const summary = await this.port.getTranscriptSummary({ box, cells });
|
|
673
|
+
const summary = await this.port.getTranscriptSummary({ box, cells, ...(genes ? { genes } : {}) });
|
|
540
674
|
const lines = this.describe(d, i, summary);
|
|
541
675
|
this.hoverCache.set(key, lines);
|
|
542
676
|
if (this.hoverKey === key)
|
|
@@ -591,6 +725,19 @@ export class NapariSpatialTileLayers {
|
|
|
591
725
|
];
|
|
592
726
|
}
|
|
593
727
|
const gene = d.genes[t.gene[i]] ?? 'transcript';
|
|
728
|
+
if (d.bin) {
|
|
729
|
+
const um = d.bin.size * (this.micronsPerUnit ?? 1);
|
|
730
|
+
const group = d.entryGroup && d.groupNames ? d.groupNames[d.entryGroup[i]] : gene;
|
|
731
|
+
const top = s?.topGenes?.length
|
|
732
|
+
? [s.topGenes.slice(0, 6).map((g) => `${g.name} ${fmt(g.count)}`).join(', ')] : [];
|
|
733
|
+
return [
|
|
734
|
+
`${group} · ${fmt(n)} transcript${n === 1 ? '' : 's'}`,
|
|
735
|
+
...(d.groupGenes ? top : group !== gene ? [`mostly ${gene}`] : []),
|
|
736
|
+
`${um.toFixed(1)} × ${um.toFixed(1)} µm area · zoom in to split`,
|
|
737
|
+
...(obs === NO_OBSERVATION && d.groupGenes ? [] : [cellLine(obs, 'mostly cell')]),
|
|
738
|
+
...(!s && d.groupGenes && this.port.getTranscriptSummary ? ['loading details…'] : []),
|
|
739
|
+
];
|
|
740
|
+
}
|
|
594
741
|
return n > 1
|
|
595
742
|
? [`${gene} · ${fmt(n)} transcripts`, 'grouped: zoom in to split', cellLine(obs, 'near cell')]
|
|
596
743
|
: [`${gene} transcript`, cellLine(obs, 'in cell')];
|
|
@@ -612,24 +759,182 @@ export class NapariSpatialTileLayers {
|
|
|
612
759
|
const keysAt = (l) => tilesInRect(rect, l, meta.levels, meta.bounds, MAX_TRANSCRIPT_TILES);
|
|
613
760
|
const query = { genes, quality: view.transcriptQuality };
|
|
614
761
|
const pxPerMicron = this.pxPerMicron(dataset, pxPerUnit);
|
|
762
|
+
const mx = (rect.x1 - rect.x0) * 0.25;
|
|
763
|
+
const my = (rect.y1 - rect.y0) * 0.25;
|
|
764
|
+
const around = { x0: rect.x0 - mx, y0: rect.y0 - my, x1: rect.x1 + mx, y1: rect.y1 + my };
|
|
765
|
+
// Zoomed out, each gene's transcripts are grouped on the all-gene pyramid's bin ladder,
|
|
766
|
+
// so a gene selection reads like "all genes" does: one marker per gene per area, sized
|
|
767
|
+
// by how many it holds; zoomed in far enough, every transcript is its own marker.
|
|
768
|
+
const ladder = dataset.transcriptBins?.levels;
|
|
769
|
+
const baseBin = ladder?.[0]?.binSize
|
|
770
|
+
?? (dataset.micronsPerUnit ? PYRAMID_BASE_BIN_UM / dataset.micronsPerUnit : 0);
|
|
771
|
+
const bin = geneBinSize(pxPerUnit, baseBin, ladder?.length ?? PYRAMID_LEVELS);
|
|
772
|
+
// Zoomed out to bins as wide as the density grid, a selection is drawn from the per-gene
|
|
773
|
+
// density grids — one cached request per cluster — rather than 10x's coarse per-gene
|
|
774
|
+
// tiles, which take minutes for a few hundred genes.
|
|
775
|
+
// With the pyramid's per-gene levels, every zoom of a selection reads them: the level the
|
|
776
|
+
// zoom calls for, coarser while the markers would exceed the max.
|
|
777
|
+
// Both are built from high-quality calls only: with low-quality calls included, the
|
|
778
|
+
// quality-aware tiles below serve every zoom (as long as there are tiles to serve).
|
|
779
|
+
const highOnly = view.transcriptQuality !== 'all' || !this.port.getTranscriptTile;
|
|
780
|
+
const geneBins = dataset.transcriptGeneBins;
|
|
781
|
+
const fromGeneBins = highOnly && geneBins && this.port.getTranscriptGeneBins;
|
|
782
|
+
if (fromGeneBins && (bin !== null || !this.port.getTranscriptTile)) {
|
|
783
|
+
return this.geneBinsJob(dataset, view, around, geneBins, bin ?? geneBins.levels[0].binSize, mx, my, rect);
|
|
784
|
+
}
|
|
785
|
+
const grid = dataset.density?.gridSize[0] ?? 0;
|
|
786
|
+
if (highOnly && bin !== null && grid > 0 && this.port.getDensity && bin >= grid * 0.75) {
|
|
787
|
+
return this.clusterDensityJob(dataset, view, around, pxPerUnit, Math.max(bin, grid), mx, my, rect);
|
|
788
|
+
}
|
|
615
789
|
return {
|
|
616
790
|
kind: 'genes',
|
|
617
|
-
|
|
791
|
+
// The clip window, in quarter-view steps: a pan past the margin re-clips.
|
|
792
|
+
key: `genes|${genes.join(',')}|${view.transcriptQuality}|${view.transcriptBudget}|${bin ?? 'each'}|`
|
|
793
|
+
+ `${Math.floor(rect.x0 / (mx || 1))},${Math.floor(rect.y0 / (my || 1))}|${keysAt(first).map(tileId)}`,
|
|
618
794
|
load: async () => {
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
break;
|
|
626
|
-
level++;
|
|
627
|
-
}
|
|
795
|
+
// The zoom's own level only: over the budget, the transcripts are combined into
|
|
796
|
+
// larger markers (groupSelection), never fetched from slower coarse levels.
|
|
797
|
+
const tiles = await this.fetchAll(keysAt(first), (k) => this.port.getTranscriptTile(k.level, k.gx, k.gy, query));
|
|
798
|
+
// Only what is on screen (and a margin, so a small pan needs nothing new) counts
|
|
799
|
+
// against the budget and the cap; a tile reaches far past the view.
|
|
800
|
+
const merged = mergeTranscriptTiles(tiles.map((t) => clipTranscripts(t, around)), MAX_TRANSCRIPTS);
|
|
628
801
|
const px = new Float32Array(merged.count);
|
|
629
802
|
for (let i = 0; i < merged.count; i++) {
|
|
630
803
|
px[i] = transcriptMarkerPx(merged.weight[i], view.transcriptScale, pxPerMicron);
|
|
631
804
|
}
|
|
632
|
-
return
|
|
805
|
+
return baseBin > 0
|
|
806
|
+
? { merged, px, ladder: { baseBin, levels: ladder?.length ?? PYRAMID_LEVELS, start: bin } }
|
|
807
|
+
: { merged, px };
|
|
808
|
+
},
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* A gene selection from the pyramid's per-gene levels: starting at the level whose bins are
|
|
813
|
+
* `startBin`, fetch the view's tiles for the selected genes and step to a coarser level while
|
|
814
|
+
* one marker per cluster per bin would exceed the max. Hidden genes are fetched too (their
|
|
815
|
+
* counts in view still show) and dropped before drawing; grouping by cluster happens there.
|
|
816
|
+
*/
|
|
817
|
+
geneBinsJob(dataset, view, around, meta, startBin, mx, my, rect) {
|
|
818
|
+
const genes = view.transcriptGenes;
|
|
819
|
+
const levels = meta.levels;
|
|
820
|
+
let first = levels.findIndex((l) => l.binSize >= startBin * 0.999);
|
|
821
|
+
if (first < 0)
|
|
822
|
+
first = levels.length - 1;
|
|
823
|
+
const budget = Math.max(1, view.transcriptBudget);
|
|
824
|
+
const hidden = new Set(view.transcriptHiddenGenes);
|
|
825
|
+
const clusters = this.selectionClusters(view);
|
|
826
|
+
const clusterOf = new Map();
|
|
827
|
+
clusters.forEach((c, ci) => c.genes.forEach((g) => clusterOf.set(genes.indexOf(g), ci)));
|
|
828
|
+
const keysAt = (m) => tilesInRectFrom(meta.origin, around, m, levels.map((l) => ({ tileSize: l.tileSize })), null, MAX_BIN_TILES);
|
|
829
|
+
return {
|
|
830
|
+
kind: 'genes',
|
|
831
|
+
key: `gene-bins|${genes.join(',')}|${budget}|${first}|${JSON.stringify(view.transcriptGeneGroups)}|`
|
|
832
|
+
+ `${Math.floor(rect.x0 / (mx || 1))},${Math.floor(rect.y0 / (my || 1))}`,
|
|
833
|
+
load: async () => {
|
|
834
|
+
let m = first;
|
|
835
|
+
for (;;) {
|
|
836
|
+
const tiles = await this.fetchAll(keysAt(m), (k) => this.port.getTranscriptGeneBins(k.level, k.gx, k.gy, genes));
|
|
837
|
+
const clipped = tiles.map((t) => clipTranscripts(t, around));
|
|
838
|
+
// Past the cap a merge would drop whole genes (the tail of every tile): go coarser.
|
|
839
|
+
if (clipped.reduce((n, t) => n + t.count, 0) > MAX_TRANSCRIPTS && m < levels.length - 1) {
|
|
840
|
+
m++;
|
|
841
|
+
continue;
|
|
842
|
+
}
|
|
843
|
+
const merged = mergeTranscriptTiles(clipped, MAX_TRANSCRIPTS);
|
|
844
|
+
// Markers this level would draw: one per (visible cluster, bin).
|
|
845
|
+
const seen = new Set();
|
|
846
|
+
const bin = levels[m].binSize;
|
|
847
|
+
for (let i = 0; i < merged.count; i++) {
|
|
848
|
+
if (hidden.has(genes[merged.gene[i]]))
|
|
849
|
+
continue;
|
|
850
|
+
const c = clusterOf.get(merged.gene[i]);
|
|
851
|
+
if (c === undefined)
|
|
852
|
+
continue;
|
|
853
|
+
seen.add(`${c}|${Math.floor(merged.x[i] / bin)}|${Math.floor(merged.y[i] / bin)}`);
|
|
854
|
+
}
|
|
855
|
+
if (seen.size <= budget || m >= levels.length - 1) {
|
|
856
|
+
return { merged, px: new Float32Array(merged.count), ladder: { baseBin: bin, levels: 1, start: bin } };
|
|
857
|
+
}
|
|
858
|
+
m++;
|
|
859
|
+
}
|
|
860
|
+
},
|
|
861
|
+
};
|
|
862
|
+
}
|
|
863
|
+
/** The selection's clusters: each gene-tree group's visible genes, then each ungrouped gene. */
|
|
864
|
+
selectionClusters(view) {
|
|
865
|
+
const hidden = new Set(view.transcriptHiddenGenes);
|
|
866
|
+
const slots = new Map(view.transcriptGenes.map((g, i) => [g, i]));
|
|
867
|
+
const taken = new Set();
|
|
868
|
+
const out = [];
|
|
869
|
+
for (const g of view.transcriptGeneGroups) {
|
|
870
|
+
const genes = g.genes.filter((x) => slots.has(x) && !hidden.has(x) && !taken.has(x));
|
|
871
|
+
genes.forEach((x) => taken.add(x));
|
|
872
|
+
if (genes.length)
|
|
873
|
+
out.push({ name: g.name, genes, slot: slots.get(genes[0]) });
|
|
874
|
+
}
|
|
875
|
+
for (const gene of view.transcriptGenes) {
|
|
876
|
+
if (!taken.has(gene) && !hidden.has(gene))
|
|
877
|
+
out.push({ name: gene, genes: [gene], slot: slots.get(gene) });
|
|
878
|
+
}
|
|
879
|
+
return out;
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Per-gene density grids summed for `genes`, cached (a cluster is asked for once per bin).
|
|
883
|
+
* Keyed by dataset too: this manager outlives a dataset, and another may share gene names.
|
|
884
|
+
*/
|
|
885
|
+
densityFor(dataset, genes, bin) {
|
|
886
|
+
const key = `${dataset}|${bin}|${genes.join(',')}`;
|
|
887
|
+
let p = this.densityCache.get(key);
|
|
888
|
+
if (!p) {
|
|
889
|
+
p = this.port.getDensity(genes, bin);
|
|
890
|
+
p.catch(() => this.densityCache.delete(key));
|
|
891
|
+
this.densityCache.set(key, p);
|
|
892
|
+
if (this.densityCache.size > 256)
|
|
893
|
+
this.densityCache.delete(this.densityCache.keys().next().value);
|
|
894
|
+
}
|
|
895
|
+
return p;
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* A gene selection zoomed out: one marker per cluster per bin, from the per-gene density
|
|
899
|
+
* grids. The bin starts where markers are 14 px apart and doubles until the markers fit the
|
|
900
|
+
* max; each marker sits at the count-weighted centre of the finer grid inside it, so markers
|
|
901
|
+
* follow the tissue rather than a lattice.
|
|
902
|
+
*/
|
|
903
|
+
clusterDensityJob(dataset, view, around, pxPerUnit, startBin, mx, my, rect) {
|
|
904
|
+
const grid = dataset.density.gridSize[0];
|
|
905
|
+
const clusters = this.selectionClusters(view);
|
|
906
|
+
let first = grid;
|
|
907
|
+
while (first < startBin * 0.999)
|
|
908
|
+
first *= 2;
|
|
909
|
+
const budget = Math.max(1, view.transcriptBudget);
|
|
910
|
+
return {
|
|
911
|
+
kind: 'genes',
|
|
912
|
+
key: `clusters|${clusters.map((c) => `${c.name}:${c.genes.join('+')}`).join(';')}|${budget}|${first}|`
|
|
913
|
+
+ `${Math.floor(rect.x0 / (mx || 1))},${Math.floor(rect.y0 / (my || 1))}`,
|
|
914
|
+
load: async () => {
|
|
915
|
+
let bin = first;
|
|
916
|
+
for (;;) {
|
|
917
|
+
// The finer grid gives each marker its centre; the server bins 1, 2, 4 or 8 cells.
|
|
918
|
+
const fine = Math.min(bin >= grid * 2 ? bin / 2 : bin, grid * 8);
|
|
919
|
+
const rasters = await Promise.all(clusters.map((c) => this.densityFor(dataset.id, c.genes, fine)));
|
|
920
|
+
const out = clusterMarkers(rasters, clusters.map((c) => c.slot), bin, around);
|
|
921
|
+
if (out.tile.count <= budget || bin >= grid * 2 ** 12) {
|
|
922
|
+
const refCount = quantileOf(out.tile.weight, 0.95);
|
|
923
|
+
const binPx = bin * pxPerUnit;
|
|
924
|
+
const px = new Float32Array(out.tile.count);
|
|
925
|
+
for (let i = 0; i < out.tile.count; i++) {
|
|
926
|
+
px[i] = groupedMarkerPx(out.tile.weight[i], refCount, binPx, view.transcriptScale);
|
|
927
|
+
}
|
|
928
|
+
return {
|
|
929
|
+
merged: out.tile, px, kind: 'genes',
|
|
930
|
+
clustered: {
|
|
931
|
+
group: out.group, names: clusters.map((c) => c.name), genes: clusters.map((c) => c.genes), bin,
|
|
932
|
+
origin: rasters[0]?.meta.origin ?? [0, 0],
|
|
933
|
+
},
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
bin *= 2;
|
|
937
|
+
}
|
|
633
938
|
},
|
|
634
939
|
};
|
|
635
940
|
}
|
|
@@ -714,10 +1019,40 @@ export class NapariSpatialTileLayers {
|
|
|
714
1019
|
};
|
|
715
1020
|
}
|
|
716
1021
|
/** Per-entry colours both as RGBA (points) and as colormap values (glyph shapes). */
|
|
717
|
-
async transcriptColors(dataset, view, t) {
|
|
1022
|
+
async transcriptColors(dataset, view, t, clusterOf) {
|
|
718
1023
|
let rgb;
|
|
719
1024
|
let codeOf;
|
|
720
|
-
if (view.transcriptColorBy === '
|
|
1025
|
+
if (view.transcriptColorBy === 'cluster' && clusterOf) {
|
|
1026
|
+
// A cluster named like a group of the cells' grouping takes that group's colour, so a
|
|
1027
|
+
// cluster's transcripts and its cells agree; any other cluster takes a palette colour.
|
|
1028
|
+
const name = this.cellTypeColumnName(dataset, view);
|
|
1029
|
+
const codes = name ? await this.categoricalCodes(name).catch(() => null) : null;
|
|
1030
|
+
const cellColor = new Map();
|
|
1031
|
+
if (codes?.meta.kind === 'categorical') {
|
|
1032
|
+
const colors = resolveCategoryColors(codes.meta);
|
|
1033
|
+
codes.meta.categories.forEach((c, k) => cellColor.set(c, colors[k]));
|
|
1034
|
+
}
|
|
1035
|
+
const colors = clusterColorMap(view.transcriptGenes, view.transcriptGeneGroups, cellColor, DEFAULT_CATEGORICAL_PALETTE);
|
|
1036
|
+
const index = new Map();
|
|
1037
|
+
const hex = [];
|
|
1038
|
+
const codeFor = (cluster) => {
|
|
1039
|
+
let k = index.get(cluster);
|
|
1040
|
+
if (k === undefined) {
|
|
1041
|
+
k = hex.length;
|
|
1042
|
+
index.set(cluster, k);
|
|
1043
|
+
hex.push(colors.get(cluster) ?? cellColor.get(cluster) ?? DEFAULT_CATEGORICAL_PALETTE[0]);
|
|
1044
|
+
}
|
|
1045
|
+
return k;
|
|
1046
|
+
};
|
|
1047
|
+
const code = new Int32Array(t.count);
|
|
1048
|
+
for (let i = 0; i < t.count; i++) {
|
|
1049
|
+
const c = clusterOf(i);
|
|
1050
|
+
code[i] = c === null ? -1 : codeFor(c);
|
|
1051
|
+
}
|
|
1052
|
+
rgb = hex.map(parseHex);
|
|
1053
|
+
codeOf = (i) => code[i];
|
|
1054
|
+
}
|
|
1055
|
+
else if (view.transcriptColorBy === 'gene' || view.transcriptColorBy === 'cluster') {
|
|
721
1056
|
// All genes: codes are the dataset's gene indices, folded onto the palette.
|
|
722
1057
|
const n = view.transcriptAllGenes ? DEFAULT_CATEGORICAL_PALETTE.length : view.transcriptGenes.length;
|
|
723
1058
|
rgb = Array.from({ length: n }, (_g, i) => parseHex((!view.transcriptAllGenes && view.transcriptGeneColors[view.transcriptGenes[i]])
|
|
@@ -763,7 +1098,7 @@ export class NapariSpatialTileLayers {
|
|
|
763
1098
|
JSON.stringify(view.densityRange), JSON.stringify(view.densityColormap)].join('|');
|
|
764
1099
|
if (key === this.keys.get('density') && this.layers.has('density'))
|
|
765
1100
|
return;
|
|
766
|
-
const raster = await this.port.getDensity(genes, view.densityBin);
|
|
1101
|
+
const raster = await this.track('Transcript density', this.port.getDensity(genes, view.densityBin));
|
|
767
1102
|
if (stale())
|
|
768
1103
|
return;
|
|
769
1104
|
// Bins drawn as squares, as Xenium Explorer does; the window is in transcripts/µm².
|
|
@@ -1095,4 +1430,58 @@ export function mergeTranscriptTiles(tiles, limit = Infinity) {
|
|
|
1095
1430
|
}
|
|
1096
1431
|
return out;
|
|
1097
1432
|
}
|
|
1098
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtdGlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtdGlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJdEQsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSx5Q0FBeUMsQ0FBQztBQUUxRixPQUFPLEVBQ0wsV0FBVyxFQUFFLGNBQWMsRUFFM0IsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFDbEQsT0FBTyxFQUNMLDJCQUEyQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsR0FDcEcsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0ssYUFBYSxFQUFFLHlCQUF5QixFQUFtQixZQUFZLEVBQUUsaUJBQWlCLEVBQ3BHLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFDOUYsZUFBZSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQ25GLGVBQWUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUM1RSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxHQUNsRCxNQUFNLDZCQUE2QixDQUFDO0FBb0RyQyxNQUFNLEtBQUssR0FBWTtJQUNyQixVQUFVLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsbUJBQW1CO0NBQzNGLENBQUM7QUFFRjsrQ0FDK0M7QUFDL0MsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFN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QUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUN4RCxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxJQUFJLENBQUMsS0FBWTtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFjO1FBQ3JDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQWVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsV0FBVyxDQUN6QixDQUF1RCxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsU0FBaUI7SUFFaEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7Z0JBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQztRQUNELENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJ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TCxNQUFNLEVBQUU7WUFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEYsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQzdFO1FBQ0QsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7S0FDYixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLENBQWU7SUFDN0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJO1FBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7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VCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sb3JtYXAsIGNvbG9ybWFwRnJvbUx1dCB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgdHlwZSB7IEltYWdlTGF5ZXIsIExheWVyLCBSR0JBLCBTaGFwZXNMYXllciwgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUgeyBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IEFMTF9HRU5FUywgdHlwZSBTcGF0aWFsRGF0YVBvcnQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksIE5PX09CU0VSVkFUSU9OLCBTcGF0aWFsQm91bmRzLCBTcGF0aWFsQ29sdW1uLCBTcGF0aWFsRGF0YXNldCwgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxQb2x5Z29ucywgU3BhdGlhbFRyYW5zY3JpcHRDb3VudHMsIFNwYXRpYWxUcmFuc2NyaXB0U3VtbWFyeSwgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBpc0NhdGVnb3JpY2FsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURSwgTUlTU0lOR19DT0xPUiwgY29udHJhc3RXaW5kb3csIGx1dEZvciwgcGFyc2VIZXgsIHJlc29sdmVDYXRlZ29yeUNvbG9ycyxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxTZWxlY3Rpb25NYXNrIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5pbXBvcnQge1xuICBEYXRhUmVjdCwgSU5GRVJOT19TQ0FMRSwgUE9MWUdPTl9MRVZFTF9NSU5fQ0VMTF9QWCwgVHJhbnNjcmlwdEdseXBoLCBhbGxHZW5lc1BsYW4sIGNlbGxUeXBlQ29sdW1uRm9yLFxuICBjZWxsc1Nob3duLCBjb2xvckRlbnNpdHlXaW5kb3csIGRlbnNpdHlBdXRvUmFuZ2UsIGdyb3VwZWRNYXJrZXJQeCwgcXVhbnRpbGVPZiwgdGlsZXNJblJlY3RGcm9tLFxuICBkZWZhdWx0R2x5cGhGb3IsIGRpc2NyZXRlQ29sb3JtYXBTdG9wcywgZ2x5cGhPdXRsaW5lLCBnbHlwaFJpbmdzLCBwaXhlbHNQZXJEYXRhVW5pdCxcbiAgcG9seWdvbkxldmVsRm9yLCB0aWxlSWQsIHRpbGVzSW5SZWN0LCB0cmFuc2NyaXB0TGV2ZWxGb3IsIHRyYW5zY3JpcHRNYXJrZXJQeCxcbiAgdHlwaWNhbENlbGxEaWFtZXRlciwgdmlzaWJsZUFyZWEsIHZpc2libGVEYXRhUmVjdCxcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcblxuLyoqXG4gKiBMZXZlbC1vZi1kZXRhaWwgY2VsbCBvdXRsaW5lcywgdHJhbnNjcmlwdHMgYW5kIHRyYW5zY3JpcHQgZGVuc2l0eSBmb3IgdGhlIDJEIHNwYXRpYWwgdmlldy5cbiAqXG4gKiBXSFkgQSBTRVBBUkFURSBDTEFTU1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5dGhpbmcgZWxzZSB0aGUgc3BhdGlhbCB2aWV3IGRyYXdzIGlzIGJ1aWx0IG9uY2UgcGVyIChkYXRhc2V0LCB2aWV3KSBhbmQgb25seVxuICogcmVzdHlsZWQgYWZ0ZXJ3YXJkcy4gVGhlc2UgbGF5ZXJzIGFsc28gZGVwZW5kIG9uIHRoZSBDQU1FUkE6IHdoaWNoIHRpbGVzIGFyZSBvbiBzY3JlZW5cbiAqIGFuZCB3aGljaCBsZXZlbCBvZiBkZXRhaWwgdGhlIHpvb20gY2FsbHMgZm9yLiBLZWVwaW5nIHRoYXQgbG9vcCDigJQgcGxhbiBvbiBjYW1lcmEgaWRsZSxcbiAqIGZldGNoIHRpbGVzLCBtZXJnZSwgZHJhdyDigJQgb3V0IG9mIHRoZSB2aXN1YWxpemVyIHNlcnZpY2Uga2VlcHMgYm90aCByZWFkYWJsZS5cbiAqXG4gKiBMQVlFUiBPUkRFUlxuICogLS0tLS0tLS0tLS1cbiAqIG5hcGFyaS1qcydzIGxheWVyIGxpc3QgaXMgYXBwZW5kLW9ubHkgKGFkZCAvIHJlbW92ZSAvIGNsZWFyKSwgc28gb3JkZXIgaXMga2VwdCBieVxuICogcmUtYWRkaW5nOiBjZWxsIGZpbGwsIGNlbGwgb3V0bGluZSwgdGhlIHRyYW5zY3JpcHQgZGVuc2l0eSwgdGhlbiB0cmFuc2NyaXB0cyBvbiB0b3AuXG4gKiBUaGUgc2VydmljZSdzIG9ic2VydmF0aW9uIG1hcmtlcnMgc2l0IHVuZGVyIGFsbCBvZiB0aGVtOyB3aGlsZSBvdXRsaW5lcyBhcmUgZHJhd24gdGhlXG4gKiBtYXJrZXJzIGFyZSBoaWRkZW4gKGEgY2VsbCBpcyBpdHMgb3V0bGluZSB0aGVuLCBub3QgYSBkb3QpLCBzbyB0aGUgY2VsbHMgbmV2ZXIgaGF2ZSB0b1xuICogYmUgb3JkZXJlZCBhZ2FpbnN0IHRoZW0uIFRoZSBkZW5zaXR5IGdvZXMgT1ZFUiB0aGUgbWFya2VycyBvbiBwdXJwb3NlOiB1bmRlciAxMF41XG4gKiBkb3RzIGl0IHdvdWxkIG9ubHkgc2hvdyBpbiB0aGUgZ2FwcyBiZXR3ZWVuIGNlbGxzLiB7QGxpbmsgYWZ0ZXJPYnNlcnZhdGlvbnN9IHJlc3RvcmVzXG4gKiB0aGUgb3JkZXIgYWZ0ZXIgdGhlIHNlcnZpY2UgcmUtYWRkcyBpdHMgbWFya2Vycy5cbiAqXG4gKiBPTkUgTEFZRVIgUEVSIEdST1VQXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFYWNoIGdyb3VwIGlzIG9uZSBtZXJnZWQgbGF5ZXIgb3ZlciBldmVyeSB2aXNpYmxlIHRpbGUsIHJlYnVpbHQgd2hlbiB0aGUgdGlsZSBzZXQgb3JcbiAqIGxldmVsIGNoYW5nZXMuIFJlY29sb3VyaW5nIChhIG5ldyBjZWxsLXR5cGUgY29sdW1uLCBhIHNlbGVjdGlvbikgb25seSByZXdyaXRlcyB0aGVcbiAqIHBlci1zaGFwZSB2YWx1ZXMg4oCUIHRoZSBnZW9tZXRyeSBpcyBub3QgcmUtZXhwYW5kZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BhdGlhbFRpbGVIb3N0IHtcbiAgLyoqIExhdGVzdCBkYXRhc2V0L3ZpZXcvc2VsZWN0aW9uLCBhcyB0aGUgc3BhdGlhbCBzdWJzY3JpcHRpb24gc2F3IHRoZW0uICovXG4gIGxhdGVzdCgpOiBbU3BhdGlhbERhdGFzZXQgfCBudWxsLCBTcGF0aWFsVmlld1N0YXRlLCBTcGF0aWFsU2VsZWN0aW9uTWFza10gfCBudWxsO1xuICAvKiogQ2FudmFzIHNpemUgaW4gQ1NTIHBpeGVscy4gKi9cbiAgY2FudmFzU2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdO1xuICAvKiogVGhlIGNvbnRpbnVvdXMgTFVUIHRoZSB2aWV3IGlzIHVzaW5nIChzbyBjZWxscyBjb2xvdXJlZCBieSBhIGdlbmUgbWF0Y2ggdGhlIG1hcmtlcnMpLiAqL1xuICBjb250aW51b3VzTHV0KHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBSZ2JbXTtcbiAgLyoqIE91dGxpbmVzIGFwcGVhcmVkIG9yIGRpc2FwcGVhcmVkOiB0aGUgbWFya2VycycgdmlzaWJpbGl0eSBmb2xsb3dzLiAqL1xuICBwb2x5Z29uc1Nob3duQ2hhbmdlZChzaG93bjogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBUaGUgZGVuc2l0eSB3aW5kb3cgY2hhbmdlZCAoYXV0by1kZXJpdmVkIG9yIHNldCkuICovXG4gIGRlbnNpdHlDaGFuZ2VkPyhzdGF0czogeyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9KTogdm9pZDtcbiAgLyoqIEVzdGltYXRlZCB0cmFuc2NyaXB0cyBpbiB2aWV3IGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGFnYWluc3QgdGhlIGJ1ZGdldC4gKi9cbiAgZXN0aW1hdGVDaGFuZ2VkPyhlc3RpbWF0ZTogVHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbCk6IHZvaWQ7XG59XG5cbi8qKiBYZW5pdW0gRXhwbG9yZXIncyBcIkVzdGltYXRlZCBUcmFuc2NyaXB0IFBvaW50c1wiLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0RXN0aW1hdGUge1xuICAvKiogVHJhbnNjcmlwdHMgb2YgdGhlIHZpc2libGUgZ2VuZXMgZXN0aW1hdGVkIHRvIGJlIGluIHZpZXcuICovXG4gIHBvaW50czogbnVtYmVyO1xuICAvKiogVGhlIG1hcmtlciBidWRnZXQuICovXG4gIG1heDogbnVtYmVyO1xufVxuXG50eXBlIEdyb3VwID0gJ2RlbnNpdHknIHwgJ2NlbGxGaWxsJyB8ICdjZWxsT3V0bGluZScgfCAnbnVjbGV1c091dGxpbmUnIHwgJ3RyYW5zY3JpcHRzJyB8ICd0cmFuc2NyaXB0T3V0bGluZSc7XG5jb25zdCBPUkRFUjogR3JvdXBbXSA9IFtcbiAgJ2NlbGxGaWxsJywgJ2NlbGxPdXRsaW5lJywgJ251Y2xldXNPdXRsaW5lJywgJ2RlbnNpdHknLCAndHJhbnNjcmlwdHMnLCAndHJhbnNjcmlwdE91dGxpbmUnLFxuXTtcblxuLyoqIFRyYW5zY3JpcHRzIGRyYXduIGF0IG9uY2UuIFBhc3QgdGhpcyBhIHNjcmVlbiBpcyBzb2xpZCBjb2xvdXIgYW55d2F5OyB0aGUgbGV2ZWxcbiAqICBwb2xpY3kga2VlcHMgYSBub3JtYWwgdmlldyBmYXIgYmVsb3cgaXQuICovXG5jb25zdCBNQVhfVFJBTlNDUklQVFMgPSA0MDBfMDAwO1xuY29uc3QgTUFYX0NFTExfVElMRVMgPSA0ODtcbmNvbnN0IE1BWF9UUkFOU0NSSVBUX1RJTEVTID0gMzY7XG5jb25zdCBNQVhfQklOX1RJTEVTID0gNjQ7XG5cbi8qKiBBIHRyYW5zY3JpcHQgZmV0Y2ggdGhlIHBsYW5uZXIgY2FuIGtleSBiZWZvcmUgcnVubmluZy4gKi9cbmludGVyZmFjZSBUcmFuc2NyaXB0Sm9iIHtcbiAgLyoqIFdoYXQgb25lIGVudHJ5IGlzIOKAlCBkZWNpZGVzIHdoYXQgaG92ZXJpbmcgaXQgc2F5cy4gKi9cbiAga2luZDogJ2dlbmVzJyB8ICdpbmRpdmlkdWFsJyB8ICdiaW5zJztcbiAgLyoqIEZvciBiaW5zOiB0aGVpciBzaXplIGFuZCBncmlkIG9yaWdpbiwgc28gYSBob3ZlcmVkIGJpbidzIHNxdWFyZSBjYW4gYmUgcmVjb3ZlcmVkLiAqL1xuICBiaW4/OiB7IHNpemU6IG51bWJlcjsgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdIH07XG4gIC8qKiBJZGVudGlmaWVzIHdoYXQgd2lsbCBiZSBkcmF3biwgc28gYW4gdW5jaGFuZ2VkIHBsYW4gaXMgYSBuby1vcC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBGZXRjaCBhbmQgbWVyZ2U7IGBweGAgaXMgZWFjaCBlbnRyeSdzIG1hcmtlciBkaWFtZXRlciBpbiBzY3JlZW4gcGl4ZWxzLiBBIGpvYiBtYXlcbiAgICogIHN3aXRjaCB0byBhbm90aGVyIGtpbmQgb25jZSBpdCBzZWVzIHRoZSBkYXRhIChpbmRpdmlkdWFsIOKGkiBiaW5zKTsgaXQgdGhlbiBzYXlzIHNvLiAqL1xuICBsb2FkKCk6IFByb21pc2U8VHJhbnNjcmlwdExvYWQ+O1xufVxuXG5pbnRlcmZhY2UgVHJhbnNjcmlwdExvYWQge1xuICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTtcbiAgcHg6IEZsb2F0MzJBcnJheTtcbiAga2luZD86IFRyYW5zY3JpcHRKb2JbJ2tpbmQnXTtcbiAgYmluPzogVHJhbnNjcmlwdEpvYlsnYmluJ107XG59XG5cbi8qKiBXaGVyZSBhIGxheWVyIHNpdHMgaW4gd29ybGQgc3BhY2U6IHRoZSBkYXRhc2V0J3MgYWZmaW5lIG9udG8gaXRzIHRpc3N1ZSBpbWFnZS4gKi9cbmludGVyZmFjZSBQbGFjZW1lbnQgeyBzY2FsZTogW251bWJlciwgbnVtYmVyXTsgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdIH1cblxuLyoqIFRyYW5zY3JpcHQgY29sb3VyczogcGVyLWVudHJ5IFJHQkEgZm9yIHBvaW50cywgdmFsdWVzICsgY29sb3JtYXAgZm9yIHNoYXBlcy4gKi9cbmludGVyZmFjZSBUcmFuc2NyaXB0RmFjZXMgeyByZ2JhOiBSR0JBW107IHZhbHVlczogRmxvYXQzMkFycmF5OyBjb2xvcm1hcDogQ29sb3JtYXAgfVxuY29uc3QgQ0FNRVJBX0lETEVfTVMgPSAxMjA7XG4vKiogRmlyc3QgcmV0cnkgb2YgYSB2aWV3IHdpdGggYSBmYWlsZWQgdGlsZTsgZG91YmxlcyBlYWNoIHRpbWUsIHVwIHRvIE1BWF9USUxFX1JFVFJJRVMuICovXG5jb25zdCBUSUxFX1JFVFJZX01TID0gMTAwMDtcbmNvbnN0IE1BWF9USUxFX1JFVFJJRVMgPSAzO1xuXG5jb25zdCBVTkFTU0lHTkVEX1JHQkE6IFJHQkEgPSBbMC42MiwgMC42MiwgMC42MiwgMC41NV07XG5cbmV4cG9ydCBjbGFzcyBOYXBhcmlTcGF0aWFsVGlsZUxheWVycyB7XG4gIHByaXZhdGUgdmlld2VyOiBWaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjYW1lcmFPZmY6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAvKiogU2V0IHdoZW4gYSB0aWxlIG9mIHRoZSBjdXJyZW50IHBsYW4gZmFpbGVkIHRvIGxvYWQgKHNlZSBmZXRjaEFsbCkuICovXG4gIHByaXZhdGUgcGxhbkluY29tcGxldGUgPSBmYWxzZTtcbiAgLyoqIENvbnNlY3V0aXZlIHJldHJpZXMgb2YgYW4gaW5jb21wbGV0ZSB2aWV3LiAqL1xuICBwcml2YXRlIHRpbGVSZXRyaWVzID0gMDtcbiAgcHJpdmF0ZSB0b2tlbiA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF5ZXJzID0gbmV3IE1hcDxHcm91cCwgTGF5ZXI+KCk7XG4gIC8qKiBXaGF0IGVhY2ggZ3JvdXAgY3VycmVudGx5IHNob3dzLCBzbyBhbiB1bmNoYW5nZWQgcGxhbiBpcyBhIG5vLW9wLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtleXMgPSBuZXcgTWFwPEdyb3VwLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcG9seWdvbnNTaG93biA9IGZhbHNlO1xuICAvKiogUmluZ3MgY3VycmVudGx5IGRyYXduIGFuZCB0aGUgKGRhdGFzZXQsIHNldCwgdGlsZXMpIHRoZXkgY2FtZSBmcm9tLiAqL1xuICBwcml2YXRlIGN1cnJlbnRSaW5nczogU3BhdGlhbFBvbHlnb25UaWxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2VsbEdlb21ldHJ5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50TnVjbGVpOiBTcGF0aWFsUG9seWdvblRpbGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjZWxsU3R5bGVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2VsZWN0aW9uIGlkZW50aXR5IOKGkiByZXZpc2lvbiwgc28gYSBjaGFuZ2Uga2V5IGNhbiBuYW1lIGEgc2VsZWN0aW9uIGNoZWFwbHkuICovXG4gIHByaXZhdGUgbGFzdFNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2sgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25SZXZpc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwb3J0OiBTcGF0aWFsRGF0YVBvcnQsIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogU3BhdGlhbFRpbGVIb3N0KSB7fVxuXG4gIC8vIOKUgOKUgCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoKHZpZXdlcjogVmlld2VyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld2VyID09PSB2aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLmRldGFjaCgpO1xuICAgIHRoaXMudmlld2VyID0gdmlld2VyO1xuICAgIHRoaXMuY2FtZXJhT2ZmID0gdmlld2VyLmNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy5zY2hlZHVsZSgpKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBsYXllcmAgaXMgb25lIG9mIHRoZSBvdmVybGF5cyBkcmF3biBoZXJlIChkZW5zaXR5LCBjZWxscywgdHJhbnNjcmlwdHMpLiAqL1xuICBvd25zKGxheWVyOiBMYXllcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkgaWYgKGwgPT09IGxheWVyKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZXRhY2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG92ZXJUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lcik7XG4gICAgdGhpcy5ob3ZlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgICB0aGlzLmNhbWVyYU9mZj8uKCk7XG4gICAgdGhpcy5jYW1lcmFPZmYgPSBudWxsO1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgdGhpcy50b2tlbisrO1xuICAgIHRoaXMudGlsZVJldHJpZXMgPSAwO1xuICAgIGlmICh0aGlzLnZpZXdlcikge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodGhpcy52aWV3ZXIubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGxheWVyKSkgdGhpcy52aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGF5ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXRQb2x5Z29uc1Nob3duKGZhbHNlKTtcbiAgICB0aGlzLnZpZXdlciA9IG51bGw7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGlsZSBvdXRsaW5lcyBhcmUgb24gc2NyZWVuIOKAlCB0aGUgc2VydmljZSBoaWRlcyBpdHMgZG90cyB0aGVuLiAqL1xuICBnZXQgb3V0bGluZXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wb2x5Z29uc1Nob3duO1xuICB9XG5cbiAgLyoqIERhdGFzZXQsIHZpZXcgb3Igc2VsZWN0aW9uIGNoYW5nZWQ6IHJlLXBsYW4gbm93IHJhdGhlciB0aGFuIG9uIGNhbWVyYSBpZGxlLiAqL1xuICByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGUoMCk7XG4gIH1cblxuICAvKiogQ2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBzZXJ2aWNlIGFkZHMgaXRzIG1hcmtlciBsYXllcjogZXZlcnl0aGluZyBnb2VzIGJhY2sgb24gdG9wLiAqL1xuICBhZnRlck9ic2VydmF0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgZm9yIChjb25zdCBnIG9mIE9SREVSKSB7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzLmdldChnKTtcbiAgICAgIGlmICghbGF5ZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKHYubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGxheWVyKSkgdi5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICAgIHYubGF5ZXJzLmFkZChsYXllcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIHBsYW5uaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGUoZGVsYXkgPSBDQU1FUkFfSURMRV9NUyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgICB2b2lkIHRoaXMucGxhbigpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGxhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWV3ZXIgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBsYXRlc3QgPSB0aGlzLmhvc3QubGF0ZXN0KCk7XG4gICAgaWYgKCF2aWV3ZXIgfHwgIWxhdGVzdCkgcmV0dXJuO1xuICAgIGNvbnN0IFtkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb25dID0gbGF0ZXN0O1xuICAgIGNvbnN0IHRva2VuID0gKyt0aGlzLnRva2VuO1xuICAgIGNvbnN0IHN0YWxlID0gKCkgPT4gdG9rZW4gIT09IHRoaXMudG9rZW4gfHwgdGhpcy52aWV3ZXIgIT09IHZpZXdlcjtcbiAgICB0aGlzLnBsYW5JbmNvbXBsZXRlID0gZmFsc2U7XG5cbiAgICBpZiAoIWRhdGFzZXQpIHtcbiAgICAgIGZvciAoY29uc3QgZyBvZiBPUkRFUikgdGhpcy5kcm9wKGcpO1xuICAgICAgdGhpcy5kcm9wQ2VsbHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3csIGhdID0gdGhpcy5ob3N0LmNhbnZhc1NpemUoKTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHJlY3QgPSB2aXNpYmxlRGF0YVJlY3Qodmlld2VyLmNhbWVyYS5jZW50ZXIsIHZpZXdlci5jYW1lcmEuem9vbSwgdywgaCwgcmVmKTtcbiAgICBjb25zdCBweFBlclVuaXQgPSBwaXhlbHNQZXJEYXRhVW5pdCh2aWV3ZXIuY2FtZXJhLnpvb20sIHJlZik7XG4gICAgaWYgKCFyZWN0KSByZXR1cm47XG5cbiAgICB2b2lkIHRoaXMucGxhbkVzdGltYXRlKGRhdGFzZXQsIHZpZXcsIHZpZXdlciwgdywgaCwgc3RhbGUpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucGxhbkRlbnNpdHkoZGF0YXNldCwgdmlldywgc3RhbGUpLFxuICAgICAgdGhpcy5wbGFuQ2VsbHMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCByZWN0LCBweFBlclVuaXQsIHN0YWxlKSxcbiAgICAgIHRoaXMucGxhblRyYW5zY3JpcHRzKGRhdGFzZXQsIHZpZXcsIHJlY3QsIHB4UGVyVW5pdCwgc3RhbGUpLFxuICAgIF0pO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgLy8gQSB0aWxlIHRoYXQgZmFpbGVkIGxlZnQgYSBob2xlIHRoZSBjYWNoZSBrZXlzIGRvIG5vdCByZWNvcmQsIHNvIHRyeSB0aGUgc2FtZSB2aWV3XG4gICAgLy8gYWdhaW4sIGJhY2tpbmcgb2ZmLCBhIGJvdW5kZWQgbnVtYmVyIG9mIHRpbWVzLlxuICAgIGlmICghdGhpcy5wbGFuSW5jb21wbGV0ZSkge1xuICAgICAgdGhpcy50aWxlUmV0cmllcyA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbGVSZXRyaWVzIDwgTUFYX1RJTEVfUkVUUklFUykge1xuICAgICAgdGhpcy5zY2hlZHVsZShUSUxFX1JFVFJZX01TICogMiAqKiB0aGlzLnRpbGVSZXRyaWVzKyspO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBjZWxscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGFzeW5jIHBsYW5DZWxscyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICByZWN0OiBEYXRhUmVjdCwgcHhQZXJVbml0OiBudW1iZXIsIHN0YWxlOiAoKSA9PiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aWxlZCA9IGRhdGFzZXQucG9seWdvblRpbGVzO1xuICAgIGNvbnN0IHdob2xlID0gIXRpbGVkICYmIGRhdGFzZXQucG9seWdvbnMgJiYgdGhpcy5wb3J0LmdldFBvbHlnb25zO1xuICAgIGlmICghY2VsbHNTaG93bihkYXRhc2V0LCB2aWV3KSB8fCAoIXRpbGVkICYmICF3aG9sZSkpIHtcbiAgICAgIHRoaXMuZHJvcENlbGxzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpYW1ldGVyID0gdHlwaWNhbENlbGxEaWFtZXRlcihkYXRhc2V0Lm9ic2VydmF0aW9ucy5yYWRpdXMpO1xuICAgIC8vIFdob2xlLWRhdGFzZXQgcmluZ3MgaGF2ZSBvbmUgbGV2ZWwgYW5kIG5vIGNvYXJzZXIgZmFsbGJhY2ssIHNvIHRoZXkgYXJlIGRyYXduIGFzXG4gICAgLy8gc29vbiBhcyBhIGNlbGwgaXMgYmlnIGVub3VnaCB0byByZWFkIGFzIGEgc2hhcGUgcmF0aGVyIHRoYW4gYSBkb3QuXG4gICAgY29uc3QgbGV2ZWwgPSB0aWxlZFxuICAgICAgPyBwb2x5Z29uTGV2ZWxGb3IocHhQZXJVbml0LCBkaWFtZXRlciwgdGlsZWQubGV2ZWxzLmxlbmd0aClcbiAgICAgIDogKHB4UGVyVW5pdCAqIGRpYW1ldGVyID49IFBPTFlHT05fTEVWRUxfTUlOX0NFTExfUFhbMl0gPyAwIDogLTEpO1xuICAgIGlmIChsZXZlbCA8IDApIHtcbiAgICAgIHRoaXMuZHJvcENlbGxzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR3JvdXBzIHN3aXRjaGVkIG9mZiBpbiB0aGUgbGlzdDogdGhlaXIgY2VsbHMgYXJlIGxlZnQgb3V0IG9mIHRoZSBnZW9tZXRyeS5cbiAgICBjb25zdCBoaWRkZW4gPSBhd2FpdCB0aGlzLmhpZGRlbkNvZGVzKGRhdGFzZXQsIHZpZXcpO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBhd2FpdCB0aGlzLmNlbGxHZW9tZXRyeShkYXRhc2V0LCB2aWV3LCByZWN0LCBsZXZlbCwgaGlkZGVuLCBzdGFsZSk7XG4gICAgaWYgKCFnZW9tZXRyeSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgcmluZ3MsIG51Y2xlaSwgZ2VvbWV0cnlLZXkgfSA9IGdlb21ldHJ5O1xuXG4gICAgY29uc3QgZ2VvbWV0cnlDaGFuZ2VkID0gZ2VvbWV0cnlLZXkgIT09IHRoaXMuY2VsbEdlb21ldHJ5S2V5O1xuICAgIGNvbnN0IHN0eWxlS2V5ID0gW1xuICAgICAgZ2VvbWV0cnlLZXksIHZpZXcuY2VsbENvbG9yTW9kZSwgdmlldy5jZWxsQ29sb3JHZW5lLCB2aWV3LmNlbGxTaW5nbGVDb2xvcixcbiAgICAgIHRoaXMuY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQsIHZpZXcpLFxuICAgICAgdGhpcy5zZWxlY3Rpb25SZXYoc2VsZWN0aW9uKSwgdmlldy5sb2dTY2FsZSwgdmlldy5wZXJjZW50aWxlQ2xpcC5qb2luKCksXG4gICAgICBKU09OLnN0cmluZ2lmeSh2aWV3LmNvbnRpbnVvdXNDb2xvcm1hcCksIHZpZXcuY2VsbERyYXcsIHZpZXcuY2VsbE9wYWNpdHksXG4gICAgXS5qb2luKCd8Jyk7XG4gICAgY29uc3QgcHJlc2VudCA9IFsnY2VsbEZpbGwnLCAnY2VsbE91dGxpbmUnLCAnbnVjbGV1c091dGxpbmUnXS5zb21lKChnKSA9PiB7XG4gICAgICBjb25zdCBsID0gdGhpcy5sYXllcnMuZ2V0KGcgYXMgR3JvdXApO1xuICAgICAgcmV0dXJuIGwgJiYgdGhpcy52aWV3ZXIhLmxheWVycy5pdGVtcy5pbmNsdWRlcyhsKTtcbiAgICB9KTtcbiAgICBpZiAoIWdlb21ldHJ5Q2hhbmdlZCAmJiBzdHlsZUtleSA9PT0gdGhpcy5jZWxsU3R5bGVLZXkgJiYgcHJlc2VudCkge1xuICAgICAgdGhpcy5zZXRQb2x5Z29uc1Nob3duKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xvcnMgPSBhd2FpdCB0aGlzLmNlbGxDb2xvcnMoZGF0YXNldCwgdmlldywgc2VsZWN0aW9uLCByaW5ncy5vYnNlcnZhdGlvbik7XG4gICAgaWYgKHN0YWxlKCkpIHJldHVybjtcblxuICAgIHRoaXMuY3VycmVudFJpbmdzID0gcmluZ3M7XG4gICAgdGhpcy5jdXJyZW50TnVjbGVpID0gbnVjbGVpO1xuICAgIC8vIEEgZ2VvbWV0cnkgbWlzc2luZyBhIGZhaWxlZCB0aWxlIGlzIGRyYXduIGJ1dCBub3QgcmVtZW1iZXJlZCwgc28gdGhlIHJldHJ5IHJlZmV0Y2hlcyBpdC5cbiAgICB0aGlzLmNlbGxHZW9tZXRyeUtleSA9IHRoaXMucGxhbkluY29tcGxldGUgPyBudWxsIDogZ2VvbWV0cnlLZXk7XG4gICAgdGhpcy5jZWxsU3R5bGVLZXkgPSBzdHlsZUtleTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IGNvbW1vbiA9IHsgc2NhbGU6IHJlZj8uc2NhbGUgPz8gWzEsIDFdLCB0cmFuc2xhdGU6IHJlZj8udHJhbnNsYXRlID8/IFswLCAwXSB9IGFzIGNvbnN0O1xuICAgIGNvbnN0IGZpbGwgPSB2aWV3LmNlbGxEcmF3ICE9PSAnb3V0bGluZSc7XG4gICAgY29uc3Qgb3V0bGluZSA9IHZpZXcuY2VsbERyYXcgIT09ICdmaWxsJztcblxuICAgIHRoaXMudXBzZXJ0U2hhcGVzKCdjZWxsRmlsbCcsIGZpbGwsIGdlb21ldHJ5Q2hhbmdlZCwgcmluZ3MsIHtcbiAgICAgIG5hbWU6ICdjZWxscycsIGRyYXc6ICdmaWxsJywgb3BhY2l0eTogdmlldy5jZWxsT3BhY2l0eSwgLi4uY29sb3JzLCAuLi5jb21tb24sXG4gICAgfSk7XG4gICAgdGhpcy51cHNlcnRTaGFwZXMoJ2NlbGxPdXRsaW5lJywgb3V0bGluZSwgZ2VvbWV0cnlDaGFuZ2VkLCByaW5ncywgZmlsbFxuICAgICAgLy8gT3ZlciBhIGZpbGwsIGEgZGFyayBvdXRsaW5lIHNlcGFyYXRlcyBuZWlnaGJvdXJzIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgICA/IHsgbmFtZTogJ2NlbGwgb3V0bGluZXMnLCBkcmF3OiAnb3V0bGluZScsIGNvbG9yOiBbMC4wOCwgMC4wOCwgMC4xLCAxXSwgb3BhY2l0eTogMC43LCAuLi5jb21tb24gfVxuICAgICAgOiB7IG5hbWU6ICdjZWxsIG91dGxpbmVzJywgZHJhdzogJ291dGxpbmUnLCBvcGFjaXR5OiAxLCAuLi5jb2xvcnMsIC4uLmNvbW1vbiB9KTtcbiAgICAvLyBcIkJvdGhcIjogbnVjbGVpIG91dGxpbmVkIG92ZXIgdGhlIGNlbGxzLCBsaWdodCBzbyB0aGV5IHJlYWQgYWdhaW5zdCBhbnkgZmlsbC5cbiAgICBpZiAobnVjbGVpKSB7XG4gICAgICB0aGlzLnVwc2VydFNoYXBlcygnbnVjbGV1c091dGxpbmUnLCB0cnVlLCBnZW9tZXRyeUNoYW5nZWQsIG51Y2xlaSwge1xuICAgICAgICBuYW1lOiAnbnVjbGV1cyBvdXRsaW5lcycsIGRyYXc6ICdvdXRsaW5lJywgY29sb3I6IFswLjk1LCAwLjk1LCAwLjk4LCAxXSwgb3BhY2l0eTogMC44LCAuLi5jb21tb24sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcm9wKCdudWNsZXVzT3V0bGluZScpO1xuICAgIH1cbiAgICB0aGlzLnNldFBvbHlnb25zU2hvd24odHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdGlvblJldihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogbnVtYmVyIHtcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB0aGlzLmxhc3RTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgIHRoaXMuc2VsZWN0aW9uUmV2aXNpb24rKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uUmV2aXNpb247XG4gIH1cblxuICAvKiogUGVyLXNoYXBlIHZhbHVlcyArIGNvbG9ybWFwIGZvciB0aGUgcmluZ3MnIG93bmVycy4gKi9cbiAgLyoqXG4gICAqIFBlci1zaGFwZSB2YWx1ZXMgKyBjb2xvcm1hcCBmb3IgdGhlIHJpbmdzJyBvd25lcnMsIGJ5IHRoZSB2aWV3J3MgY2VsbC1jb2xvdXIgbW9kZVxuICAgKiAoWGVuaXVtIEV4cGxvcmVyJ3MgXCJDZWxsIENvbG9yXCIpLiBBIHNlbGVjdGlvbiBtdXRlcyB3aGF0IGl0IGxlYXZlcyBvdXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNlbGxDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gICAgb3duZXJzOiBVaW50MzJBcnJheSxcbiAgKTogUHJvbWlzZTx7IHZhbHVlcz86IEZsb2F0MzJBcnJheTsgY29sb3JtYXA/OiBDb2xvcm1hcDsgY29udHJhc3RMaW1pdHM/OiBbbnVtYmVyLCBudW1iZXJdOyBjb2xvcj86IFJHQkEgfT4ge1xuICAgIGNvbnN0IG11dGVkID0gc2VsZWN0aW9uLmNvdW50ID4gMCA/IHNlbGVjdGlvbi5tYXNrIDogbnVsbDtcbiAgICBjb25zdCBtb2RlID0gdmlldy5jZWxsQ29sb3JNb2RlO1xuXG4gICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICBjb25zdCBbciwgZywgYl0gPSBwYXJzZUhleCh2aWV3LmNlbGxTaW5nbGVDb2xvcik7XG4gICAgICByZXR1cm4geyBjb2xvcjogW3IgLyAyNTUsIGcgLyAyNTUsIGIgLyAyNTUsIDFdIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29udGludW91cyA9IGFzeW5jIChyYXc6IEZsb2F0MzJBcnJheSwgbG9nOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KG93bmVycy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHJhd1tvd25lcnNbaV1dID8/IE5hTjtcbiAgICAgICAgdmFsdWVzW2ldID0gbG9nID8gTWF0aC5sb2cxcChNYXRoLm1heCgwLCB2KSkgOiB2O1xuICAgICAgfVxuICAgICAgY29uc3QgW2xvLCBoaV0gPSBjb250cmFzdFdpbmRvdyhcbiAgICAgICAgbG9nID8gcmF3Lm1hcCgodikgPT4gTWF0aC5sb2cxcChNYXRoLm1heCgwLCB2KSkpIDogcmF3LFxuICAgICAgICB2aWV3LnBlcmNlbnRpbGVDbGlwWzBdLCB2aWV3LnBlcmNlbnRpbGVDbGlwWzFdLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgY29sb3JtYXA6IGNvbG9ybWFwRnJvbUx1dCgnc3BhdGlhbC1jb250aW51b3VzJywgdGhpcy5ob3N0LmNvbnRpbnVvdXNMdXQodmlldykpLFxuICAgICAgICBjb250cmFzdExpbWl0czogW2xvLCBoaV0gYXMgW251bWJlciwgbnVtYmVyXSxcbiAgICAgIH07XG4gICAgfTtcbiAgICBpZiAobW9kZSA9PT0gJ2dlbmUnICYmIHZpZXcuY2VsbENvbG9yR2VuZSkge1xuICAgICAgcmV0dXJuIGNvbnRpbnVvdXMoYXdhaXQgdGhpcy5wb3J0LmdldEZlYXR1cmVWZWN0b3Iodmlldy5jZWxsQ29sb3JHZW5lKSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSAndHJhbnNjcmlwdERlbnNpdHknICYmIGRhdGFzZXQuY29sdW1ucy5zb21lKChjKSA9PiBjLm5hbWUgPT09ICd0cmFuc2NyaXB0X2RlbnNpdHknKSkge1xuICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGhpcy5wb3J0LmdldENvbHVtbigndHJhbnNjcmlwdF9kZW5zaXR5Jyk7XG4gICAgICBpZiAoIWlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSkgcmV0dXJuIGNvbnRpbnVvdXMoY29sdW1uLnZhbHVlcywgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBtb2RlID09PSAnc2VnbWVudGF0aW9uJyAmJiBkYXRhc2V0LmNvbHVtbnMuc29tZSgoYykgPT4gYy5uYW1lID09PSAnc2VnbWVudGF0aW9uX21ldGhvZCcpXG4gICAgICA/ICdzZWdtZW50YXRpb25fbWV0aG9kJ1xuICAgICAgOiB0aGlzLmNlbGxUeXBlQ29sdW1uTmFtZShkYXRhc2V0LCB2aWV3KTtcbiAgICBjb25zdCBjb2RlcyA9IG5hbWUgPyBhd2FpdCB0aGlzLmNhdGVnb3JpY2FsQ29kZXMobmFtZSkgOiBudWxsO1xuICAgIGNvbnN0IHsgY29sb3JtYXAsIHZhbHVlT2YgfSA9IHRoaXMuY2F0ZWdvcmljYWxDb2xvcm1hcChjb2Rlcz8ubWV0YSA/PyBudWxsKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KG93bmVycy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gb3duZXJzW2ldO1xuICAgICAgY29uc3QgY29kZSA9ICFjb2RlcyB8fCAobXV0ZWQgJiYgIW11dGVkW29dKSA/IC0xIDogY29kZXMuY29kZXNbb107XG4gICAgICB2YWx1ZXNbaV0gPSB2YWx1ZU9mKGNvZGUgPT09IE5PX0NBVEVHT1JZID8gLTEgOiBjb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBjb2xvcm1hcCwgY29udHJhc3RMaW1pdHM6IFswLCAxXSB9O1xuICB9XG5cbiAgLyoqIENvZGVzIG9mIHRoZSBncm91cCBjb2x1bW4gdGhhdCBhcmUgc3dpdGNoZWQgb2ZmLCBvciBudWxsIHdoZW4gbm9uZSBhcmUuICovXG4gIHByaXZhdGUgYXN5bmMgaGlkZGVuQ29kZXMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICk6IFByb21pc2U8eyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgIGlmICghdmlldy5oaWRkZW5Hcm91cHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5jZWxsVHlwZUNvbHVtbk5hbWUoZGF0YXNldCwgdmlldyk7XG4gICAgY29uc3QgY29sID0gbmFtZSA/IGF3YWl0IHRoaXMuY2F0ZWdvcmljYWxDb2RlcyhuYW1lKSA6IG51bGw7XG4gICAgaWYgKCFjb2wgfHwgY29sLm1ldGEua2luZCAhPT0gJ2NhdGVnb3JpY2FsJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LmhpZGRlbkdyb3Vwcyk7XG4gICAgY29uc3QgaGlkZGVuID0gVWludDhBcnJheS5mcm9tKGNvbC5tZXRhLmNhdGVnb3JpZXMsIChjKSA9PiAob2ZmLmhhcyhjKSA/IDEgOiAwKSk7XG4gICAgcmV0dXJuIHsgY29kZXM6IGNvbC5jb2RlcywgaGlkZGVuIH07XG4gIH1cblxuICBwcml2YXRlIGNlbGxUeXBlQ29sdW1uTmFtZShkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjZWxsVHlwZUNvbHVtbkZvcihkYXRhc2V0LCB2aWV3KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2F0ZWdvcmljYWxDb2RlcyhuYW1lOiBzdHJpbmcpOlxuICAgIFByb21pc2U8eyBjb2RlczogVWludDE2QXJyYXk7IG1ldGE6IFNwYXRpYWxDb2x1bW5bJ21ldGEnXSB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRoaXMucG9ydC5nZXRDb2x1bW4obmFtZSk7XG4gICAgcmV0dXJuIGlzQ2F0ZWdvcmljYWxDb2x1bW4oY29sdW1uKSA/IHsgY29kZXM6IGNvbHVtbi5jb2RlcywgbWV0YTogY29sdW1uLm1ldGEgfSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhdGVnb3JpY2FsQ29sb3JtYXAobWV0YTogU3BhdGlhbENvbHVtblsnbWV0YSddIHwgbnVsbCk6XG4gICAgeyBjb2xvcm1hcDogQ29sb3JtYXA7IHZhbHVlT2Y6IChjb2RlOiBudW1iZXIpID0+IG51bWJlcjsgcmdiOiBSZ2JbXSB9IHtcbiAgICBjb25zdCBoZXggPSBtZXRhICYmIG1ldGEua2luZCA9PT0gJ2NhdGVnb3JpY2FsJ1xuICAgICAgPyByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMobWV0YSlcbiAgICAgIDogW0RFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVswXV07XG4gICAgY29uc3QgcmdiID0gaGV4Lm1hcChwYXJzZUhleCk7XG4gICAgY29uc3QgeyBzdG9wcywgdmFsdWVPZiB9ID0gZGlzY3JldGVDb2xvcm1hcFN0b3BzKHJnYiwgTUlTU0lOR19DT0xPUik7XG4gICAgcmV0dXJuIHsgY29sb3JtYXA6IG5ldyBDb2xvcm1hcCgnc3BhdGlhbC1jYXRlZ29yaWVzJywgc3RvcHMpLCB2YWx1ZU9mLCByZ2IgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2VsbCByaW5ncyAoYW5kLCBmb3IgXCJib3RoXCIsIHRoZSBudWNsZXVzIHJpbmdzKSBjb3ZlcmluZyBgcmVjdGAgYXQgYGxldmVsYCwgbWludXNcbiAgICogdGhlIGhpZGRlbiBncm91cHMg4oCUIHJldXNlZCB3aGVuIG5vdGhpbmcgdGhhdCBkZWNpZGVzIHRoZW0gY2hhbmdlZC4gTnVsbCB3aGVuIHRoZVxuICAgKiB2aWV3IHdlbnQgc3RhbGUgb3IgdGhlIGRhdGFzZXQgaGFzIG5vIHNldCB0byBkcmF3LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjZWxsR2VvbWV0cnkoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHJlY3Q6IERhdGFSZWN0LCBsZXZlbDogbnVtYmVyLFxuICAgIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCwgc3RhbGU6ICgpID0+IGJvb2xlYW4sXG4gICk6IFByb21pc2U8eyByaW5nczogU3BhdGlhbFBvbHlnb25UaWxlOyBudWNsZWk6IFNwYXRpYWxQb2x5Z29uVGlsZSB8IG51bGw7IGdlb21ldHJ5S2V5OiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBjb25zdCB0aWxlZCA9IGRhdGFzZXQucG9seWdvblRpbGVzO1xuICAgIGNvbnN0IGhpZGRlbktleSA9IHZpZXcuaGlkZGVuR3JvdXBzLmpvaW4oJ1xcdTAwMDEnKTtcbiAgICBsZXQgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZTtcbiAgICBsZXQgbnVjbGVpOiBTcGF0aWFsUG9seWdvblRpbGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZ2VvbWV0cnlLZXk6IHN0cmluZztcbiAgICBpZiAodGlsZWQpIHtcbiAgICAgIGNvbnN0IGJvdGggPSB2aWV3LmNlbGxTZXQgPT09ICdib3RoJztcbiAgICAgIGNvbnN0IHNldCA9ICFib3RoICYmIHZpZXcuY2VsbFNldCAmJiB0aWxlZC5zZXRzLnNvbWUoKHMpID0+IHMubmFtZSA9PT0gdmlldy5jZWxsU2V0KVxuICAgICAgICA/IHZpZXcuY2VsbFNldCA6ICh0aWxlZC5kZWZhdWx0U2V0ID8/IHRpbGVkLnNldHNbMF0/Lm5hbWUpO1xuICAgICAgaWYgKCFzZXQpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbnVjbGV1c1NldCA9IGJvdGggPyB0aWxlZC5zZXRzLmZpbmQoKHMpID0+IHMubmFtZSAhPT0gc2V0KT8ubmFtZSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGtleXMgPSB0aWxlc0luUmVjdChyZWN0LCBsZXZlbCwgdGlsZWQubGV2ZWxzLCB0aWxlZC5ib3VuZHMsIE1BWF9DRUxMX1RJTEVTKTtcbiAgICAgIGdlb21ldHJ5S2V5ID0gYCR7ZGF0YXNldC5pZH18JHtzZXR9fCR7bnVjbGV1c1NldCA/PyAnJ318JHtoaWRkZW5LZXl9fCR7a2V5cy5tYXAodGlsZUlkKS5qb2luKCcsJyl9YDtcbiAgICAgIGlmIChnZW9tZXRyeUtleSA9PT0gdGhpcy5jZWxsR2VvbWV0cnlLZXkgJiYgdGhpcy5jdXJyZW50UmluZ3MpIHtcbiAgICAgICAgcmluZ3MgPSB0aGlzLmN1cnJlbnRSaW5ncztcbiAgICAgICAgbnVjbGVpID0gdGhpcy5jdXJyZW50TnVjbGVpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3RpbGVzLCBudWNsZXVzVGlsZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuZmV0Y2hBbGwoa2V5cywgKGspID0+IHRoaXMucG9ydC5nZXRQb2x5Z29uVGlsZSEoc2V0LCBrLmxldmVsLCBrLmd4LCBrLmd5KSksXG4gICAgICAgICAgbnVjbGV1c1NldFxuICAgICAgICAgICAgPyB0aGlzLmZldGNoQWxsKGtleXMsIChrKSA9PiB0aGlzLnBvcnQuZ2V0UG9seWdvblRpbGUhKG51Y2xldXNTZXQsIGsubGV2ZWwsIGsuZ3gsIGsuZ3kpKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUobnVsbCksXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoc3RhbGUoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJpbmdzID0gZmlsdGVyUmluZ3MobWVyZ2VQb2x5Z29uVGlsZXModGlsZXMpLCBoaWRkZW4pO1xuICAgICAgICBudWNsZWkgPSBudWNsZXVzVGlsZXMgPyBmaWx0ZXJSaW5ncyhtZXJnZVBvbHlnb25UaWxlcyhudWNsZXVzVGlsZXMpLCBoaWRkZW4pIDogbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZ2VvbWV0cnlLZXkgPSBgJHtkYXRhc2V0LmlkfXx3aG9sZXwke2hpZGRlbktleX1gO1xuICAgICAgaWYgKGdlb21ldHJ5S2V5ID09PSB0aGlzLmNlbGxHZW9tZXRyeUtleSAmJiB0aGlzLmN1cnJlbnRSaW5ncykge1xuICAgICAgICByaW5ncyA9IHRoaXMuY3VycmVudFJpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9seXM6IFNwYXRpYWxQb2x5Z29ucyA9IGF3YWl0IHRoaXMucG9ydC5nZXRQb2x5Z29ucyEoKTtcbiAgICAgICAgaWYgKHN0YWxlKCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBXaG9sZS1kYXRhc2V0IHJpbmdzIGFyZSBpbmRleC1hbGlnbmVkIHdpdGggdGhlIG9ic2VydmF0aW9ucy5cbiAgICAgICAgcmluZ3MgPSBmaWx0ZXJSaW5ncyhcbiAgICAgICAgICB7IC4uLnBvbHlzLCBvYnNlcnZhdGlvbjogVWludDMyQXJyYXkuZnJvbSh7IGxlbmd0aDogcG9seXMuY291bnQgfSwgKF92LCBpKSA9PiBpKSB9LCBoaWRkZW4sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJpbmdzLCBudWNsZWksIGdlb21ldHJ5S2V5IH07XG4gIH1cblxuICAvLyDilIDilIAgdHJhbnNjcmlwdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBwbGFuVHJhbnNjcmlwdHMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHJlY3Q6IERhdGFSZWN0LCBweFBlclVuaXQ6IG51bWJlcixcbiAgICBzdGFsZTogKCkgPT4gYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kZSA9IHZpZXcudHJhbnNjcmlwdE1vZGU7XG4gICAgY29uc3Qgam9iID0gKG1vZGUgPT09ICdjaXJjbGVzJyB8fCBtb2RlID09PSAnZ2x5cGhzJykgJiYgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlXG4gICAgICA/ICh2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc1xuICAgICAgICA/IHRoaXMuYWxsR2VuZXNKb2IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KVxuICAgICAgICA6IHRoaXMuZ2VuZUpvYihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpKVxuICAgICAgOiBudWxsO1xuICAgIGlmICgham9iKSB7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRzJyk7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRPdXRsaW5lJyk7XG4gICAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTWFya2VyIHNpemVzIGZvbGxvdyB0aGUgem9vbSwgc28gdGhlIHpvb20gaXMgcGFydCBvZiB0aGUga2V5OyBhIHBhbiB0aGF0IGtlZXBzXG4gICAgLy8gdGhlIHNhbWUgdGlsZXMgb24gc2NyZWVuIGNoYW5nZXMgbm90aGluZy5cbiAgICBjb25zdCBwbGFuS2V5ID0gW1xuICAgICAgZGF0YXNldC5pZCwgbW9kZSwgam9iLmtleSwgdmlldy50cmFuc2NyaXB0Q29sb3JCeSwgdGhpcy5jZWxsVHlwZUNvbHVtbk5hbWUoZGF0YXNldCwgdmlldyksXG4gICAgICB2aWV3LnRyYW5zY3JpcHRTY2FsZSwgdmlldy50cmFuc2NyaXB0T3BhY2l0eSwgSlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2x5cGhzKSxcbiAgICAgIHB4UGVyVW5pdC50b1ByZWNpc2lvbig0KSwgdmlldy5oaWRkZW5Hcm91cHMuam9pbignXFx1MDAwMScpLCB2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5qb2luKCcsJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lQ29sb3JzKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5sYXllcnMuZ2V0KCd0cmFuc2NyaXB0cycpO1xuICAgIGlmIChwbGFuS2V5ID09PSB0aGlzLmtleXMuZ2V0KCd0cmFuc2NyaXB0cycpICYmIGN1cnJlbnQgJiYgdGhpcy52aWV3ZXIhLmxheWVycy5pdGVtcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBqb2IubG9hZCgpO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgY29uc3QgaGlkZGVuID0gYXdhaXQgdGhpcy5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgbWVyZ2VkLCBweCB9ID0gZmlsdGVyVHJhbnNjcmlwdHMobG9hZGVkLm1lcmdlZCwgbG9hZGVkLnB4LCBoaWRkZW4sXG4gICAgICAobG9hZGVkLmtpbmQgPz8gam9iLmtpbmQpID09PSAnZ2VuZXMnID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpIDogbnVsbCk7XG4gICAgLy8gQSBiaW4gb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgbWl4ZXMgZ2VuZXMgYW5kIGNhcnJpZXMgbm9uZSwgc28gaXQgY2Fubm90IGJlIGNvbG91cmVkXG4gICAgLy8gYnkgZ2VuZTogY29sb3VyIGl0IGJ5IGl0cyBkb21pbmFudCBjZWxsJ3MgdHlwZSB1bnRpbCBpbmRpdmlkdWFsIHRyYW5zY3JpcHRzIHNob3cuXG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIGNvbnN0IGNvbG9yVmlldyA9IGtpbmQgPT09ICdiaW5zJyAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnZ2VuZSdcbiAgICAgID8geyAuLi52aWV3LCB0cmFuc2NyaXB0Q29sb3JCeTogJ2NlbGxUeXBlJyBhcyBjb25zdCB9IDogdmlldztcbiAgICBjb25zdCBmYWNlcyA9IGF3YWl0IHRoaXMudHJhbnNjcmlwdENvbG9ycyhkYXRhc2V0LCBjb2xvclZpZXcsIG1lcmdlZCk7XG4gICAgaWYgKHN0YWxlKCkpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnBsYW5JbmNvbXBsZXRlKSB0aGlzLmtleXMuZGVsZXRlKCd0cmFuc2NyaXB0cycpO1xuICAgIGVsc2UgdGhpcy5rZXlzLnNldCgndHJhbnNjcmlwdHMnLCBwbGFuS2V5KTtcbiAgICBjb25zdCBkaWFtID0gcHgubWFwKChkKSA9PiBkIC8gcHhQZXJVbml0KTtcbiAgICB0aGlzLmRyYXduID0ge1xuICAgICAga2luZDogbG9hZGVkLmtpbmQgPz8gam9iLmtpbmQsIGJpbjogbG9hZGVkLmtpbmQgPyBsb2FkZWQuYmluIDogam9iLmJpbixcbiAgICAgIG1lcmdlZCwgcmFkaXVzOiBkaWFtLm1hcCgoZCkgPT4gZCAvIDIpLFxuICAgICAgZ2VuZXM6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10sIHJlZjogZGF0YXNldC5pbWFnZVJlZiA/PyBudWxsLCBncmlkOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5ob3ZlckNhY2hlLmNsZWFyKCk7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHRoaXMuY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQsIHZpZXcpO1xuICAgIHRoaXMuaG92ZXJUeXBlcyA9IHR5cGVDb2x1bW4gPyBhd2FpdCB0aGlzLmNhdGVnb3JpY2FsQ29kZXModHlwZUNvbHVtbikuY2F0Y2goKCkgPT4gbnVsbCkgOiBudWxsO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBwbGFjZTogUGxhY2VtZW50ID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH07XG4gICAgaWYgKG1vZGUgPT09ICdjaXJjbGVzJykge1xuICAgICAgdGhpcy5kcm9wKCd0cmFuc2NyaXB0T3V0bGluZScpO1xuICAgICAgdGhpcy5kcmF3VHJhbnNjcmlwdENpcmNsZXMobWVyZ2VkLCBkaWFtLCBmYWNlcy5yZ2JhLCB2aWV3LCBwbGFjZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJhd1RyYW5zY3JpcHRHbHlwaHMobWVyZ2VkLCBkaWFtLCBmYWNlcywgdmlldywgcGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPbmUgc2l6ZWQgY2lyY2xlIHBlciBlbnRyeSwgdGhlIHNpemUgc2F5aW5nIGhvdyBtYW55IHRyYW5zY3JpcHRzIGl0IHN0YW5kcyBmb3IuICovXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRDaXJjbGVzKFxuICAgIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLCBkaWFtOiBGbG9hdDMyQXJyYXksIHJnYmE6IFJHQkFbXSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICB7IHNjYWxlLCB0cmFuc2xhdGUgfTogUGxhY2VtZW50LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCAqIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIHBvc2l0aW9uc1syICogaV0gPSBtZXJnZWQueFtpXTtcbiAgICAgIHBvc2l0aW9uc1syICogaSArIDFdID0gbWVyZ2VkLnlbaV07XG4gICAgfVxuICAgIGNvbnN0IGxheWVyID0gdGhpcy52aWV3ZXIhLmFkZFBvaW50cyhwb3NpdGlvbnMsIHtcbiAgICAgIG5hbWU6ICd0cmFuc2NyaXB0cycsXG4gICAgICBzaXplOiBkaWFtLFxuICAgICAgZmFjZUNvbG9yOiByZ2JhLFxuICAgICAgLy8gQSBkYXJrIHJpbTogYSB0cmFuc2NyaXB0IGNvbG91cmVkIGJ5IGl0cyBjZWxsJ3MgdHlwZSBpcyBvdGhlcndpc2UgdGhlIHNhbWVcbiAgICAgIC8vIGNvbG91ciBhcyB0aGUgY2VsbCBmaWxsIGl0IHNpdHMgb24sIGFuZCB2YW5pc2hlcyBpbnRvIGl0LlxuICAgICAgYm9yZGVyQ29sb3I6IFswLjA0LCAwLjA0LCAwLjA1LCAwLjldLFxuICAgICAgYm9yZGVyV2lkdGg6IDAuMTggKiBtZWRpYW4oZGlhbSksXG4gICAgICBvcGFjaXR5OiB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LFxuICAgICAgc2NhbGUsXG4gICAgICB0cmFuc2xhdGUsXG4gICAgfSk7XG4gICAgdGhpcy5yZXBsYWNlKCd0cmFuc2NyaXB0cycsIGxheWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd1RyYW5zY3JpcHRHbHlwaHMoXG4gICAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsIGRpYW06IEZsb2F0MzJBcnJheSwgZmFjZXM6IFRyYW5zY3JpcHRGYWNlcywgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgICB7IHNjYWxlLCB0cmFuc2xhdGUgfTogUGxhY2VtZW50LFxuICApOiB2b2lkIHtcbiAgICAvLyBHbHlwaHM6IGVhY2ggZW50cnkgYmVjb21lcyBpdHMgZ2VuZSdzIGljb24gcG9seWdvbiwgZmlsbGVkIHRocm91Z2ggYSBkaXNjcmV0ZVxuICAgIC8vIGNvbG9ybWFwIGFuZCBvdXRsaW5lZCBkYXJrIHNvIHNtYWxsIGljb25zIHN0YXkgcmVhZGFibGUgb3ZlciB0aGUgdGlzc3VlLiBXaXRoIGV2ZXJ5XG4gICAgLy8gZ2VuZSBkcmF3biB0aGVyZSBpcyBvbmUgaWNvbiBmb3IgYWxsIG9mIHRoZW0g4oCUIDE4LDAwMCBzaGFwZXMgd291bGQgc2F5IG5vdGhpbmcuXG4gICAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcztcbiAgICBjb25zdCBnbHlwaEZvciA9IChzbG90OiBudW1iZXIpOiBUcmFuc2NyaXB0R2x5cGggPT5cbiAgICAgICh2aWV3LnRyYW5zY3JpcHRHbHlwaHNbZ2VuZXNbc2xvdF1dIGFzIFRyYW5zY3JpcHRHbHlwaCB8IHVuZGVmaW5lZCkgPz8gZGVmYXVsdEdseXBoRm9yKHNsb3QpO1xuICAgIGNvbnN0IHNpbmdsZSA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzXG4gICAgICA/IGdseXBoT3V0bGluZSgodmlldy50cmFuc2NyaXB0R2x5cGhzW0FMTF9HRU5FU10gYXMgVHJhbnNjcmlwdEdseXBoIHwgdW5kZWZpbmVkKSA/PyAnY2lyY2xlJylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBvdXRsaW5lcyA9IHNpbmdsZSA/IFtdIDogZ2VuZXMubWFwKChfZywgc2xvdCkgPT4gZ2x5cGhPdXRsaW5lKGdseXBoRm9yKHNsb3QpKSk7XG4gICAgY29uc3QgcmFkaXVzID0gZGlhbS5tYXAoKGQpID0+IGQgLyAyKTtcbiAgICBjb25zdCB7IGNvb3Jkcywgb2Zmc2V0cyB9ID0gZ2x5cGhSaW5ncyhcbiAgICAgIG1lcmdlZC54LCBtZXJnZWQueSwgcmFkaXVzLCAoaSkgPT4gc2luZ2xlID8/IG91dGxpbmVzW21lcmdlZC5nZW5lW2ldXSxcbiAgICApO1xuICAgIGNvbnN0IGZpbGwgPSB0aGlzLnZpZXdlciEuYWRkU2hhcGVzKGNvb3Jkcywgb2Zmc2V0cywge1xuICAgICAgbmFtZTogJ3RyYW5zY3JpcHRzJyxcbiAgICAgIGRyYXc6ICdmaWxsJyxcbiAgICAgIHZhbHVlczogZmFjZXMudmFsdWVzLFxuICAgICAgY29sb3JtYXA6IGZhY2VzLmNvbG9ybWFwLFxuICAgICAgY29udHJhc3RMaW1pdHM6IFswLCAxXSxcbiAgICAgIG9wYWNpdHk6IHZpZXcudHJhbnNjcmlwdE9wYWNpdHksXG4gICAgICBzY2FsZSxcbiAgICAgIHRyYW5zbGF0ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlcGxhY2UoJ3RyYW5zY3JpcHRzJywgZmlsbCk7XG4gICAgY29uc3QgZWRnZSA9IHRoaXMudmlld2VyIS5hZGRTaGFwZXMoY29vcmRzLCBvZmZzZXRzLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdCBvdXRsaW5lcycsXG4gICAgICBkcmF3OiAnb3V0bGluZScsXG4gICAgICBjb2xvcjogWzAuMDUsIDAuMDUsIDAuMDUsIDFdLFxuICAgICAgb3BhY2l0eTogTWF0aC5taW4oMSwgdmlldy50cmFuc2NyaXB0T3BhY2l0eSArIDAuMSksXG4gICAgICBzY2FsZSxcbiAgICAgIHRyYW5zbGF0ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlcGxhY2UoJ3RyYW5zY3JpcHRPdXRsaW5lJywgZWRnZSk7XG4gIH1cblxuICAvLyDilIDilIAgaG92ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBkcmF3bjogRHJhd25UcmFuc2NyaXB0cyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyVHlwZXM6IHsgY29kZXM6IFVpbnQxNkFycmF5OyBtZXRhOiBTcGF0aWFsQ29sdW1uWydtZXRhJ10gfSB8IG51bGwgPSBudWxsO1xuICAvKiogRGV0YWlscyBhbHJlYWR5IGZldGNoZWQsIGJ5IGhvdmVyZWQgZW50cnkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaG92ZXJDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSBob3ZlcktleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVG9vbHRpcCBsaW5lcyBmb3IgdGhlIHRyYW5zY3JpcHQgbWFya2VyIHVuZGVyIHdvcmxkIHBvaW50IGAod3gsIHd5KWAsIG9yIG51bGwuXG4gICAqXG4gICAqIFJldHVybnMgd2hhdCBpcyBrbm93biBhdCBvbmNlIChnZW5lLCBjb3VudCwgY2VsbCB0eXBlKTsgYW55dGhpbmcgdGhhdCBuZWVkcyB0aGVcbiAgICogc2VydmVyIOKAlCBkaXN0aW5jdCBnZW5lcyBpbiBhIGdyb3VwLCBpdHMgdG9wIGdlbmVzIGFuZCBjZWxscywgdGhlIGNlbGwncyBkaXNwbGF5IGlkIOKAlFxuICAgKiBhcnJpdmVzIHRocm91Z2ggYG9uRGV0YWlsc2Agb25jZSB0aGUgcG9pbnRlciBoYXMgcmVzdGVkIG9uIHRoZSBtYXJrZXIgYnJpZWZseS5cbiAgICovXG4gIGhvdmVyQXQoXG4gICAgd3g6IG51bWJlciwgd3k6IG51bWJlciwgcmFkaXVzV29ybGQ6IG51bWJlciwgb25EZXRhaWxzOiAobGluZXM6IHN0cmluZ1tdKSA9PiB2b2lkLFxuICApOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIGNvbnN0IGQgPSB0aGlzLmRyYXduO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnMuZ2V0KCd0cmFuc2NyaXB0cycpO1xuICAgIGlmICghZCB8fCAhbGF5ZXIgfHwgIXRoaXMudmlld2VyPy5sYXllcnMuaXRlbXMuaW5jbHVkZXMobGF5ZXIpIHx8ICFkLm1lcmdlZC5jb3VudCkge1xuICAgICAgdGhpcy5ob3ZlcktleSA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3ggPSBkLnJlZj8uc2NhbGU/LlswXSA/PyAxO1xuICAgIGNvbnN0IHN5ID0gZC5yZWY/LnNjYWxlPy5bMV0gPz8gMTtcbiAgICBjb25zdCB4ID0gKHd4IC0gKGQucmVmPy50cmFuc2xhdGU/LlswXSA/PyAwKSkgLyBzeDtcbiAgICBjb25zdCB5ID0gKHd5IC0gKGQucmVmPy50cmFuc2xhdGU/LlsxXSA/PyAwKSkgLyBzeTtcbiAgICBjb25zdCBpID0gcGlja05lYXJlc3QoZCwgeCwgeSwgcmFkaXVzV29ybGQgLyBNYXRoLmFicyhzeCkpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5ob3ZlcktleSA9IG51bGw7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYCR7ZC5raW5kfXwke2QubWVyZ2VkLnhbaV19fCR7ZC5tZXJnZWQueVtpXX18JHtkLm1lcmdlZC5nZW5lW2ldfWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5ob3ZlckNhY2hlLmdldChrZXkpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5ob3ZlcktleSkge1xuICAgICAgdGhpcy5ob3ZlcktleSA9IGtleTtcbiAgICAgIGlmICh0aGlzLmhvdmVyVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmhvdmVyVGltZXIpO1xuICAgICAgdGhpcy5ob3ZlclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMuZmV0Y2hEZXRhaWxzKGQsIGksIGtleSwgb25EZXRhaWxzKSwgMTUwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpYmUoZCwgaSwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoRGV0YWlscyhcbiAgICBkOiBEcmF3blRyYW5zY3JpcHRzLCBpOiBudW1iZXIsIGtleTogc3RyaW5nLCBvbkRldGFpbHM6IChsaW5lczogc3RyaW5nW10pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRTdW1tYXJ5IHx8IHRoaXMuaG92ZXJLZXkgIT09IGtleSkgcmV0dXJuO1xuICAgIGNvbnN0IG9icyA9IGQubWVyZ2VkLm9ic2VydmF0aW9uW2ldO1xuICAgIGNvbnN0IGNlbGxzID0gb2JzID09PSBOT19PQlNFUlZBVElPTiA/IFtdIDogW29ic107XG4gICAgbGV0IGJveDogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGQua2luZCA9PT0gJ2JpbnMnICYmIGQuYmluKSB7XG4gICAgICBjb25zdCB7IHNpemUsIG9yaWdpbiB9ID0gZC5iaW47XG4gICAgICBjb25zdCBieCA9IE1hdGguZmxvb3IoKGQubWVyZ2VkLnhbaV0gLSBvcmlnaW5bMF0pIC8gc2l6ZSk7XG4gICAgICBjb25zdCBieSA9IE1hdGguZmxvb3IoKGQubWVyZ2VkLnlbaV0gLSBvcmlnaW5bMV0pIC8gc2l6ZSk7XG4gICAgICBjb25zdCB4MCA9IG9yaWdpblswXSArIGJ4ICogc2l6ZTtcbiAgICAgIGNvbnN0IHkwID0gb3JpZ2luWzFdICsgYnkgKiBzaXplO1xuICAgICAgYm94ID0gW3gwLCB5MCwgeDAgKyBzaXplLCB5MCArIHNpemVdO1xuICAgIH0gZWxzZSBpZiAoZC5raW5kID09PSAnaW5kaXZpZHVhbCcpIHtcbiAgICAgIGNvbnN0IGUgPSAwLjAyO1xuICAgICAgYm94ID0gW2QubWVyZ2VkLnhbaV0gLSBlLCBkLm1lcmdlZC55W2ldIC0gZSwgZC5tZXJnZWQueFtpXSArIGUsIGQubWVyZ2VkLnlbaV0gKyBlXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFN1bW1hcnkoeyBib3gsIGNlbGxzIH0pO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmRlc2NyaWJlKGQsIGksIHN1bW1hcnkpO1xuICAgICAgdGhpcy5ob3ZlckNhY2hlLnNldChrZXksIGxpbmVzKTtcbiAgICAgIGlmICh0aGlzLmhvdmVyS2V5ID09PSBrZXkpIG9uRGV0YWlscyhsaW5lcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRyYW5zY3JpcHQgZGV0YWlscyB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSB0b29sdGlwIHRleHQgZm9yIGVudHJ5IGBpYCwgd2l0aCB0aGUgc2VydmVyJ3MgZGV0YWlscyB3aGVuIHRoZXkgaGF2ZSBhcnJpdmVkLiAqL1xuICBwcml2YXRlIGRlc2NyaWJlKGQ6IERyYXduVHJhbnNjcmlwdHMsIGk6IG51bWJlciwgczogU3BhdGlhbFRyYW5zY3JpcHRTdW1tYXJ5IHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0ID0gZC5tZXJnZWQ7XG4gICAgY29uc3QgbiA9IHQud2VpZ2h0W2ldO1xuICAgIGNvbnN0IG9icyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgY29uc3QgZm10ID0gKHY6IG51bWJlcikgPT4gdi50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IHR5cGVPZiA9IChvOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVzID0gdGhpcy5ob3ZlclR5cGVzO1xuICAgICAgaWYgKCF0eXBlcyB8fCBvID09PSBOT19PQlNFUlZBVElPTiB8fCB0eXBlcy5tZXRhLmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYyA9IHR5cGVzLmNvZGVzW29dO1xuICAgICAgcmV0dXJuIGMgPT09IE5PX0NBVEVHT1JZID8gbnVsbCA6IHR5cGVzLm1ldGEuY2F0ZWdvcmllc1tjXSA/PyBudWxsO1xuICAgIH07XG4gICAgY29uc3QgY2VsbExpbmUgPSAobzogbnVtYmVyLCBwcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG8gPT09IE5PX09CU0VSVkFUSU9OKSByZXR1cm4gJ291dHNpZGUgYW55IGNlbGwnO1xuICAgICAgY29uc3QgaWQgPSBzPy5jZWxsSWRzPy5bb10gPz8gYCMke299YDtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlT2Yobyk7XG4gICAgICByZXR1cm4gYCR7cHJlZml4fSAke2lkfSR7dHlwZSA/IGAgwrcgJHt0eXBlfWAgOiAnJ31gO1xuICAgIH07XG5cbiAgICBpZiAoZC5raW5kID09PSAnYmlucycpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gW2Ake2ZtdChuKX0gdHJhbnNjcmlwdHMgwrcgYWxsIGdlbmVzYF07XG4gICAgICBpZiAoZC5iaW4pIGxpbmVzLnB1c2goYCR7ZC5iaW4uc2l6ZS50b0ZpeGVkKDEpfSDDlyAke2QuYmluLnNpemUudG9GaXhlZCgxKX0gwrVtIGFyZWFgKTtcbiAgICAgIGlmIChzPy50cmFuc2NyaXB0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7Zm10KHMuZ2VuZXMgPz8gMCl9IGRpc3RpbmN0IGdlbmVzIMK3ICR7Zm10KHMuY2VsbHMgPz8gMCl9IGNlbGwke3MuY2VsbHMgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICAgICAgKyAocy51bmFzc2lnbmVkID8gYCDCtyAke2ZtdChzLnVuYXNzaWduZWQpfSBvdXRzaWRlIGNlbGxzYCA6ICcnKSk7XG4gICAgICAgIGlmIChzLnRvcEdlbmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGB0b3AgZ2VuZXM6ICR7cy50b3BHZW5lcy5zbGljZSgwLCA1KS5tYXAoKGcpID0+IGAke2cubmFtZX0gJHtmbXQoZy5jb3VudCl9YCkuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGluZXMucHVzaChjZWxsTGluZShvYnMsICdtb3N0bHkgY2VsbCcpKTtcbiAgICAgIGlmICghcyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFN1bW1hcnkpIGxpbmVzLnB1c2goJ2xvYWRpbmcgZGV0YWlsc+KApicpO1xuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICBpZiAoZC5raW5kID09PSAnaW5kaXZpZHVhbCcpIHtcbiAgICAgIGNvbnN0IGdlbmUgPSBzPy50b3BHZW5lcz8uWzBdPy5uYW1lO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgZ2VuZSA/IGAke2dlbmV9IHRyYW5zY3JpcHRgIDogJ1RyYW5zY3JpcHQnLFxuICAgICAgICBjZWxsTGluZShvYnMsICdpbiBjZWxsJyksXG4gICAgICAgIC4uLighcyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFN1bW1hcnkgPyBbJ2xvYWRpbmcgZGV0YWlsc+KApiddIDogW10pLFxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgZ2VuZSA9IGQuZ2VuZXNbdC5nZW5lW2ldXSA/PyAndHJhbnNjcmlwdCc7XG4gICAgcmV0dXJuIG4gPiAxXG4gICAgICA/IFtgJHtnZW5lfSDCtyAke2ZtdChuKX0gdHJhbnNjcmlwdHNgLCAnZ3JvdXBlZDogem9vbSBpbiB0byBzcGxpdCcsIGNlbGxMaW5lKG9icywgJ25lYXIgY2VsbCcpXVxuICAgICAgOiBbYCR7Z2VuZX0gdHJhbnNjcmlwdGAsIGNlbGxMaW5lKG9icywgJ2luIGNlbGwnKV07XG4gIH1cblxuICAvKiogUGh5c2ljYWwgbWFya2VyIHNpemUgbmVlZHMgwrVtOyBudWxsIHdoZW4gdGhlIGRhdGFzZXQncyB1bml0IGlzIHVua25vd24uICovXG4gIHByaXZhdGUgcHhQZXJNaWNyb24oZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHB4UGVyVW5pdDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZGF0YXNldC5taWNyb25zUGVyVW5pdCA/IHB4UGVyVW5pdCAvIGRhdGFzZXQubWljcm9uc1BlclVuaXQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNob3NlbiBnZW5lcywgYXQgdGhlIGxldmVsIHRoZSB6b29tIGNhbGxzIGZvciDigJQgb3IgY29hcnNlciwgd2hpbGUgdGhlIG1hcmtlcnMgaW5cbiAgICogdmlldyB3b3VsZCBleGNlZWQgdGhlIGJ1ZGdldC5cbiAgICovXG4gIHByaXZhdGUgZ2VuZUpvYihcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgcmVjdDogRGF0YVJlY3QsIHB4UGVyVW5pdDogbnVtYmVyLFxuICApOiBUcmFuc2NyaXB0Sm9iIHwgbnVsbCB7XG4gICAgY29uc3QgbWV0YSA9IGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzO1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgaWYgKCFtZXRhIHx8ICFnZW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpcnN0ID0gdHJhbnNjcmlwdExldmVsRm9yKHB4UGVyVW5pdCwgbWV0YS5sZXZlbHMpO1xuICAgIGNvbnN0IGtleXNBdCA9IChsOiBudW1iZXIpID0+IHRpbGVzSW5SZWN0KHJlY3QsIGwsIG1ldGEubGV2ZWxzLCBtZXRhLmJvdW5kcywgTUFYX1RSQU5TQ1JJUFRfVElMRVMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0geyBnZW5lcywgcXVhbGl0eTogdmlldy50cmFuc2NyaXB0UXVhbGl0eSB9O1xuICAgIGNvbnN0IHB4UGVyTWljcm9uID0gdGhpcy5weFBlck1pY3JvbihkYXRhc2V0LCBweFBlclVuaXQpO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnZ2VuZXMnLFxuICAgICAga2V5OiBgZ2VuZXN8JHtnZW5lcy5qb2luKCcsJyl9fCR7dmlldy50cmFuc2NyaXB0UXVhbGl0eX18JHt2aWV3LnRyYW5zY3JpcHRCdWRnZXR9fCR7a2V5c0F0KGZpcnN0KS5tYXAodGlsZUlkKX1gLFxuICAgICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbGV2ZWwgPSBmaXJzdDtcbiAgICAgICAgbGV0IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgdGlsZXMgPSBhd2FpdCB0aGlzLmZldGNoQWxsKGtleXNBdChsZXZlbCksXG4gICAgICAgICAgICAoaykgPT4gdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlIShrLmxldmVsLCBrLmd4LCBrLmd5LCBxdWVyeSkpO1xuICAgICAgICAgIG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKHRpbGVzLCBNQVhfVFJBTlNDUklQVFMpO1xuICAgICAgICAgIGlmIChtZXJnZWQuY291bnQgPD0gdmlldy50cmFuc2NyaXB0QnVkZ2V0IHx8IGxldmVsID49IG1ldGEubGV2ZWxzLmxlbmd0aCAtIDEpIGJyZWFrO1xuICAgICAgICAgIGxldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHggPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgICAgICBweFtpXSA9IHRyYW5zY3JpcHRNYXJrZXJQeChtZXJnZWQud2VpZ2h0W2ldLCB2aWV3LnRyYW5zY3JpcHRTY2FsZSwgcHhQZXJNaWNyb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lcmdlZCwgcHggfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeSBnZW5lOiB0aGUgdHJhbnNjcmlwdHMgdGhlbXNlbHZlcyBvbmNlIHRoZXkgZml0IHRoZSBidWRnZXQsIGVsc2UgYmlucyBvZiB0aGVcbiAgICogYWxsLWdlbmUgcHlyYW1pZCBzaXplZCBieSBob3cgbWFueSB0cmFuc2NyaXB0cyBlYWNoIGhvbGRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGxHZW5lc0pvYihcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgcmVjdDogRGF0YVJlY3QsIHB4UGVyVW5pdDogbnVtYmVyLFxuICApOiBUcmFuc2NyaXB0Sm9iIHwgbnVsbCB7XG4gICAgY29uc3QgYmlucyA9IGRhdGFzZXQudHJhbnNjcmlwdEJpbnM7XG4gICAgY29uc3QgdGlsZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcztcbiAgICBjb25zdCBib3VuZHMgPSBiaW5zPy5ib3VuZHMgPz8gdGlsZXM/LmJvdW5kcztcbiAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGxhbiA9IGFsbEdlbmVzUGxhbih7XG4gICAgICByZWN0LCBib3VuZHMsIHB4UGVyVW5pdCwgYnVkZ2V0OiB2aWV3LnRyYW5zY3JpcHRCdWRnZXQsXG4gICAgICB0b3RhbDogYmlucz8uY291bnQgPz8gdGlsZXM/LmNvdW50ID8/IDAsXG4gICAgICBsZXZlbHM6IGJpbnMgJiYgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRCaW5zID8gYmlucy5sZXZlbHMgOiBbXSxcbiAgICAgIGNhbkluZGl2aWR1YWw6ICEhdGlsZXMsXG4gICAgfSk7XG5cbiAgICBpZiAocGxhbi5raW5kID09PSAnaW5kaXZpZHVhbCcgJiYgdGlsZXMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSB0aWxlc0luUmVjdChyZWN0LCAwLCB0aWxlcy5sZXZlbHMsIHRpbGVzLmJvdW5kcywgTUFYX1RSQU5TQ1JJUFRfVElMRVMpO1xuICAgICAgLy8gRWFjaCB0aWxlIGNsaXBwZWQgdG8gdGhlIHZpZXcsIHJvdW5kZWQgb3V0d2FyZCB0byAxMCB1bml0cyBzbyBzbWFsbCBwYW5zIGhpdCBjYWNoZS5cbiAgICAgIGNvbnN0IHIxMCA9ICh2OiBudW1iZXIsIHVwOiBib29sZWFuKSA9PiAodXAgPyBNYXRoLmNlaWwodiAvIDEwKSA6IE1hdGguZmxvb3IodiAvIDEwKSkgKiAxMDtcbiAgICAgIGNvbnN0IHNpemUgPSB0aWxlcy5sZXZlbHNbMF0udGlsZVNpemU7XG4gICAgICBjb25zdCBib3hlcyA9IGtleXMubWFwKChrKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4gW1xuICAgICAgICBNYXRoLm1heChrLmd4ICogc2l6ZSwgcjEwKHJlY3QueDAsIGZhbHNlKSksIE1hdGgubWF4KGsuZ3kgKiBzaXplLCByMTAocmVjdC55MCwgZmFsc2UpKSxcbiAgICAgICAgTWF0aC5taW4oKGsuZ3ggKyAxKSAqIHNpemUsIHIxMChyZWN0LngxLCB0cnVlKSksIE1hdGgubWluKChrLmd5ICsgMSkgKiBzaXplLCByMTAocmVjdC55MSwgdHJ1ZSkpLFxuICAgICAgXSk7XG4gICAgICBjb25zdCBweFBlck1pY3JvbiA9IHRoaXMucHhQZXJNaWNyb24oZGF0YXNldCwgcHhQZXJVbml0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAga2V5OiBgYWxsfGluZGl2aWR1YWx8JHt2aWV3LnRyYW5zY3JpcHRCdWRnZXR9fCR7Ym94ZXMubWFwKChiKSA9PiBiLmpvaW4oJywnKSkuam9pbignOycpfWAsXG4gICAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBnb3QgPSBhd2FpdCB0aGlzLmZldGNoQWxsKGtleXMubWFwKChrLCBpKSA9PiAoeyAuLi5rLCBib3g6IGJveGVzW2ldIH0pKSxcbiAgICAgICAgICAgIChrKSA9PiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUhKDAsIGsuZ3gsIGsuZ3ksIHsgZ2VuZXM6IFtBTExfR0VORVNdLCBib3g6IGsuYm94IH0pKTtcbiAgICAgICAgICAvLyBUaGUgcGxhbiBlc3RpbWF0ZWQgdGhlIHZpZXcgZnJvbSB0aGUgZGF0YXNldCdzIGF2ZXJhZ2UgZGVuc2l0eTsgZXhwcmVzc2lvbiBpc1xuICAgICAgICAgIC8vIHVuZXZlbiwgc28gYSBkZW5zZSB2aWV3IGNhbiBob2xkIGZhciBtb3JlLiBSYXRoZXIgdGhhbiBjdXQgdGhlIGV4Y2VzcyBvZmYsIHNob3dcbiAgICAgICAgICAvLyBpdCBncm91cGVkIOKAlCB0aGUgYmluIGxldmVsIHRoZSBwbGFubmVyIHdvdWxkIHBpY2sgaWYgaXQgaGFkIGtub3duLlxuICAgICAgICAgIGNvbnN0IGNhcCA9IE1hdGgubWF4KHZpZXcudHJhbnNjcmlwdEJ1ZGdldCAqIDEuNSwgMSk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkID0gZ290LnJlZHVjZSgobiwgdCkgPT4gbiArIHQuY291bnQsIDApO1xuICAgICAgICAgIGlmIChsb2FkZWQgPiBjYXAgJiYgYmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gYWxsR2VuZXNQbGFuKHtcbiAgICAgICAgICAgICAgcmVjdCwgYm91bmRzLCBweFBlclVuaXQsIGJ1ZGdldDogdmlldy50cmFuc2NyaXB0QnVkZ2V0LCB0b3RhbDogYmlucy5jb3VudCxcbiAgICAgICAgICAgICAgbGV2ZWxzOiBiaW5zLmxldmVscywgY2FuSW5kaXZpZHVhbDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmYWxsYmFjay5raW5kID09PSAnYmlucycpIHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5iaW5zSm9iKHZpZXcsIHJlY3QsIHB4UGVyVW5pdCwgYm91bmRzLCBiaW5zLCBmYWxsYmFjay5sZXZlbCk7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLihhd2FpdCBqb2IubG9hZCgpKSwga2luZDogam9iLmtpbmQsIGJpbjogam9iLmJpbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVRyYW5zY3JpcHRUaWxlcyhnb3QsIGNhcCk7XG4gICAgICAgICAgY29uc3QgcHggPSBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZC5jb3VudCk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXJnZWQuY291bnQ7IGkrKykgcHhbaV0gPSB0cmFuc2NyaXB0TWFya2VyUHgoMSwgdmlldy50cmFuc2NyaXB0U2NhbGUsIHB4UGVyTWljcm9uKTtcbiAgICAgICAgICByZXR1cm4geyBtZXJnZWQsIHB4IH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwbGFuLmtpbmQgPT09ICdiaW5zJyAmJiBiaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0Qmlucykge1xuICAgICAgcmV0dXJuIHRoaXMuYmluc0pvYih2aWV3LCByZWN0LCBweFBlclVuaXQsIGJvdW5kcywgYmlucywgcGxhbi5sZXZlbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEJpbnMgb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgYXQgYGxldmVsYCwgc2l6ZWQgYnkgaG93IG1hbnkgdHJhbnNjcmlwdHMgZWFjaCBob2xkcy4gKi9cbiAgcHJpdmF0ZSBiaW5zSm9iKFxuICAgIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHJlY3Q6IERhdGFSZWN0LCBweFBlclVuaXQ6IG51bWJlciwgYm91bmRzOiBTcGF0aWFsQm91bmRzLFxuICAgIGJpbnM6IE5vbk51bGxhYmxlPFNwYXRpYWxEYXRhc2V0Wyd0cmFuc2NyaXB0QmlucyddPiwgbGV2ZWw6IG51bWJlcixcbiAgKTogVHJhbnNjcmlwdEpvYiB7XG4gICAgY29uc3QgbHYgPSBiaW5zLmxldmVsc1tsZXZlbF07XG4gICAgY29uc3Qga2V5cyA9IHRpbGVzSW5SZWN0RnJvbShiaW5zLm9yaWdpbiwgcmVjdCwgbGV2ZWwsXG4gICAgICBiaW5zLmxldmVscy5tYXAoKGwpID0+ICh7IHRpbGVTaXplOiBsLnRpbGVTaXplIH0pKSwgYm91bmRzLCBNQVhfQklOX1RJTEVTKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2JpbnMnLFxuICAgICAgYmluOiB7IHNpemU6IGx2LmJpblNpemUsIG9yaWdpbjogYmlucy5vcmlnaW4gfSxcbiAgICAgIGtleTogYGFsbHxiaW5zfCR7bGV2ZWx9fCR7dmlldy50cmFuc2NyaXB0QnVkZ2V0fXwke2tleXMubWFwKHRpbGVJZCl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZ290ID0gYXdhaXQgdGhpcy5mZXRjaEFsbChrZXlzLCAoaykgPT4gdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRCaW5zIShrLmxldmVsLCBrLmd4LCBrLmd5KSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKGdvdCwgTWF0aC5tYXgodmlldy50cmFuc2NyaXB0QnVkZ2V0ICogMS41LCAxKSk7XG4gICAgICAgIGNvbnN0IHJlZkNvdW50ID0gcXVhbnRpbGVPZihtZXJnZWQud2VpZ2h0LCAwLjk1KTtcbiAgICAgICAgY29uc3QgYmluUHggPSBsdi5iaW5TaXplICogcHhQZXJVbml0O1xuICAgICAgICBjb25zdCBweCA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXJnZWQuY291bnQ7IGkrKykge1xuICAgICAgICAgIHB4W2ldID0gZ3JvdXBlZE1hcmtlclB4KG1lcmdlZC53ZWlnaHRbaV0sIHJlZkNvdW50LCBiaW5QeCwgdmlldy50cmFuc2NyaXB0U2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lcmdlZCwgcHggfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBQZXItZW50cnkgY29sb3VycyBib3RoIGFzIFJHQkEgKHBvaW50cykgYW5kIGFzIGNvbG9ybWFwIHZhbHVlcyAoZ2x5cGggc2hhcGVzKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2NyaXB0Q29sb3JzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gICk6IFByb21pc2U8VHJhbnNjcmlwdEZhY2VzPiB7XG4gICAgbGV0IHJnYjogUmdiW107XG4gICAgbGV0IGNvZGVPZjogKGk6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGlmICh2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnZ2VuZScpIHtcbiAgICAgIC8vIEFsbCBnZW5lczogY29kZXMgYXJlIHRoZSBkYXRhc2V0J3MgZ2VuZSBpbmRpY2VzLCBmb2xkZWQgb250byB0aGUgcGFsZXR0ZS5cbiAgICAgIGNvbnN0IG4gPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyA/IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGggOiB2aWV3LnRyYW5zY3JpcHRHZW5lcy5sZW5ndGg7XG4gICAgICByZ2IgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfZywgaSkgPT4gcGFyc2VIZXgoXG4gICAgICAgICghdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgJiYgdmlldy50cmFuc2NyaXB0R2VuZUNvbG9yc1t2aWV3LnRyYW5zY3JpcHRHZW5lc1tpXV0pXG4gICAgICAgIHx8IERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURVtpICUgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLmxlbmd0aF0pKTtcbiAgICAgIGNvZGVPZiA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzID8gKGkpID0+IHQuZ2VuZVtpXSAlIG4gOiAoaSkgPT4gdC5nZW5lW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5jZWxsVHlwZUNvbHVtbk5hbWUoZGF0YXNldCwgdmlldyk7XG4gICAgICBjb25zdCBjb2RlcyA9IG5hbWUgPyBhd2FpdCB0aGlzLmNhdGVnb3JpY2FsQ29kZXMobmFtZSkgOiBudWxsO1xuICAgICAgcmdiID0gY29kZXM/Lm1ldGEua2luZCA9PT0gJ2NhdGVnb3JpY2FsJyA/IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhjb2Rlcy5tZXRhKS5tYXAocGFyc2VIZXgpIDogW107XG4gICAgICBjb2RlT2YgPSAoaSkgPT4ge1xuICAgICAgICBjb25zdCBvID0gdC5vYnNlcnZhdGlvbltpXTtcbiAgICAgICAgaWYgKCFjb2RlcyB8fCBvID09PSBOT19PQlNFUlZBVElPTikgcmV0dXJuIC0xO1xuICAgICAgICBjb25zdCBjID0gY29kZXMuY29kZXNbb107XG4gICAgICAgIHJldHVybiBjID09PSBOT19DQVRFR09SWSA/IC0xIDogYztcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgc3RvcHMsIHZhbHVlT2YgfSA9IGRpc2NyZXRlQ29sb3JtYXBTdG9wcyhyZ2IsIE1JU1NJTkdfQ09MT1IpO1xuICAgIGNvbnN0IHJnYmE6IFJHQkFbXSA9IG5ldyBBcnJheSh0LmNvdW50KTtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHQuY291bnQpO1xuICAgIGNvbnN0IHR1cGxlczogUkdCQVtdID0gcmdiLm1hcCgoW3IsIGcsIGJdKSA9PiBbciAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSwgMV0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29kZU9mKGkpO1xuICAgICAgcmdiYVtpXSA9IGMgPCAwID8gVU5BU1NJR05FRF9SR0JBIDogdHVwbGVzW2NdO1xuICAgICAgdmFsdWVzW2ldID0gdmFsdWVPZihjKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmdiYSwgdmFsdWVzLCBjb2xvcm1hcDogbmV3IENvbG9ybWFwKCd0cmFuc2NyaXB0LWNhdGVnb3JpZXMnLCBzdG9wcykgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkZW5zaXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgYXN5bmMgcGxhbkRlbnNpdHkoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHN0YWxlOiAoKSA9PiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoaWRkZW5HZW5lcyA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gW0FMTF9HRU5FU11cbiAgICAgIDogdmlldy50cmFuc2NyaXB0R2VuZXMuZmlsdGVyKChnKSA9PiAhaGlkZGVuR2VuZXMuaGFzKGcpKTtcbiAgICBpZiAoIWRhdGFzZXQuZGVuc2l0eSB8fCAhdGhpcy5wb3J0LmdldERlbnNpdHkgfHwgdmlldy50cmFuc2NyaXB0TW9kZSAhPT0gJ2RlbnNpdHknIHx8ICFnZW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJvcCgnZGVuc2l0eScpO1xuICAgICAgdGhpcy5kZW5zaXR5U3RhdHMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsdXQgPSBsdXRGb3Iodmlldy5kZW5zaXR5Q29sb3JtYXAgPz8gSU5GRVJOT19TQ0FMRSk7XG4gICAgY29uc3Qga2V5ID0gW2RhdGFzZXQuaWQsIGdlbmVzLmpvaW4oJywnKSwgdmlldy5kZW5zaXR5QmluLCB2aWV3LmRlbnNpdHlPcGFjaXR5LFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmlldy5kZW5zaXR5UmFuZ2UpLCBKU09OLnN0cmluZ2lmeSh2aWV3LmRlbnNpdHlDb2xvcm1hcCldLmpvaW4oJ3wnKTtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmtleXMuZ2V0KCdkZW5zaXR5JykgJiYgdGhpcy5sYXllcnMuaGFzKCdkZW5zaXR5JykpIHJldHVybjtcbiAgICBjb25zdCByYXN0ZXIgPSBhd2FpdCB0aGlzLnBvcnQuZ2V0RGVuc2l0eShnZW5lcywgdmlldy5kZW5zaXR5QmluKTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgLy8gQmlucyBkcmF3biBhcyBzcXVhcmVzLCBhcyBYZW5pdW0gRXhwbG9yZXIgZG9lczsgdGhlIHdpbmRvdyBpcyBpbiB0cmFuc2NyaXB0cy/CtW3Csi5cbiAgICBjb25zdCBtZXRhID0gcmFzdGVyLm1ldGE7XG4gICAgY29uc3QgYXJlYSA9IG1ldGEuZ3JpZFNpemVbMF0gKiBtZXRhLmdyaWRTaXplWzFdO1xuICAgIGNvbnN0IHBlckFyZWEgPSByYXN0ZXIudmFsdWVzLm1hcCgodikgPT4gdiAvIGFyZWEpO1xuICAgIGNvbnN0IFtsbywgaGldID0gdmlldy5kZW5zaXR5UmFuZ2UgPz8gZGVuc2l0eUF1dG9SYW5nZShwZXJBcmVhKTtcbiAgICB0aGlzLmRlbnNpdHlTdGF0cyA9IHsgbG8sIGhpLCBtYXg6IHBlckFyZWEucmVkdWNlKChtLCB2KSA9PiAodiA+IG0gPyB2IDogbSksIDApIH07XG4gICAgY29uc3QgcmdiYSA9IGNvbG9yRGVuc2l0eVdpbmRvdyhwZXJBcmVhLCBsdXQsIHZpZXcuZGVuc2l0eU9wYWNpdHksIGxvLCBoaSk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCBzeCA9IHJlZj8uc2NhbGU/LlswXSA/PyAxO1xuICAgIGNvbnN0IHN5ID0gcmVmPy5zY2FsZT8uWzFdID8/IDE7XG4gICAgY29uc3QgbGF5ZXI6IEltYWdlTGF5ZXIgPSB0aGlzLnZpZXdlciEuYWRkSW1hZ2UoXG4gICAgICB7IGtpbmQ6ICd0eXBlZCcsIHdpZHRoOiBtZXRhLmNvbHMsIGhlaWdodDogbWV0YS5yb3dzLCBjaGFubmVsczogNCwgZHR5cGU6ICd1aW50OCcsIGRhdGE6IHJnYmEgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYGRlbnNpdHkgwrcgJHt2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyA/ICdhbGwgZ2VuZXMnIDogZ2VuZXMuam9pbignLCAnKX1gLFxuICAgICAgICBzY2FsZTogW21ldGEuZ3JpZFNpemVbMF0gKiBzeCwgbWV0YS5ncmlkU2l6ZVsxXSAqIHN5XSxcbiAgICAgICAgdHJhbnNsYXRlOiBbXG4gICAgICAgICAgbWV0YS5vcmlnaW5bMF0gKiBzeCArIChyZWY/LnRyYW5zbGF0ZT8uWzBdID8/IDApLFxuICAgICAgICAgIG1ldGEub3JpZ2luWzFdICogc3kgKyAocmVmPy50cmFuc2xhdGU/LlsxXSA/PyAwKSxcbiAgICAgICAgXSxcbiAgICAgICAgYmxlbmRpbmc6ICd0cmFuc2x1Y2VudCcsXG4gICAgICAgIGludGVycG9sYXRpb246ICduZWFyZXN0JyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmtleXMuc2V0KCdkZW5zaXR5Jywga2V5KTtcbiAgICB0aGlzLnJlcGxhY2UoJ2RlbnNpdHknLCBsYXllcik7XG4gICAgdGhpcy5ob3N0LmRlbnNpdHlDaGFuZ2VkPy4odGhpcy5kZW5zaXR5U3RhdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudHNDYWNoZTogeyBrZXk6IHN0cmluZzsgY291bnRzOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzPiB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRyYW5zY3JpcHRzIGluIHZpZXcgZm9yIHRoZSB2aXNpYmxlIGdlbmVzOiBlYWNoIGdlbmUncyBkYXRhc2V0IHRvdGFsIHRpbWVzIHRoZSBzaGFyZVxuICAgKiBvZiB0aGUgdGlzc3VlIG9uIHNjcmVlbi4gQW4gZXN0aW1hdGUg4oCUIGV4cHJlc3Npb24gaXMgbm90IHVuaWZvcm0g4oCUIHdoaWNoIGlzIGFsc28gd2hhdFxuICAgKiBYZW5pdW0gRXhwbG9yZXIgc2hvd3M7IGl0IHRlbGxzIHRoZSB1c2VyIHdoZXRoZXIgdGhlIGJ1ZGdldCB3aWxsIGZvcmNlIGdyb3VwaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGFuRXN0aW1hdGUoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHZpZXdlcjogVmlld2VyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgICBzdGFsZTogKCkgPT4gYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGlsZXMgPSBkYXRhc2V0LnRyYW5zY3JpcHRUaWxlcztcbiAgICBpZiAoIXRpbGVzIHx8ICF0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdENvdW50cyB8fCB2aWV3LnRyYW5zY3JpcHRNb2RlID09PSAnb2ZmJykge1xuICAgICAgdGhpcy5ob3N0LmVzdGltYXRlQ2hhbmdlZD8uKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRkZW5HZW5lcyA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyBbXSA6IHZpZXcudHJhbnNjcmlwdEdlbmVzLmZpbHRlcigoZykgPT4gIWhpZGRlbkdlbmVzLmhhcyhnKSk7XG4gICAgY29uc3Qga2V5ID0gYCR7ZGF0YXNldC5pZH18JHtnZW5lcy5qb2luKCcsJyl9YDtcbiAgICBpZiAodGhpcy5jb3VudHNDYWNoZT8ua2V5ICE9PSBrZXkpIHtcbiAgICAgIHRoaXMuY291bnRzQ2FjaGUgPSB7IGtleSwgY291bnRzOiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdENvdW50cyhnZW5lcykgfTtcbiAgICB9XG4gICAgbGV0IGNvdW50czogU3BhdGlhbFRyYW5zY3JpcHRDb3VudHM7XG4gICAgdHJ5IHtcbiAgICAgIGNvdW50cyA9IGF3YWl0IHRoaXMuY291bnRzQ2FjaGUuY291bnRzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5jb3VudHNDYWNoZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgY29uc3QgaW5WaWV3ID0gdmlzaWJsZURhdGFSZWN0KHZpZXdlci5jYW1lcmEuY2VudGVyLCB2aWV3ZXIuY2FtZXJhLnpvb20sIHcsIGgsIGRhdGFzZXQuaW1hZ2VSZWYsIDApO1xuICAgIGlmICghaW5WaWV3KSByZXR1cm47XG4gICAgY29uc3QgYiA9IGNvdW50cy5ib3VuZHM7XG4gICAgY29uc3Qgc2hhcmUgPSBNYXRoLm1pbigxLCB2aXNpYmxlQXJlYShpblZpZXcsIGIpIC8gTWF0aC5tYXgoMSwgKGJbMl0gLSBiWzBdKSAqIChiWzNdIC0gYlsxXSkpKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzXG4gICAgICA/IGNvdW50cy50b3RhbFxuICAgICAgOiBnZW5lcy5yZWR1Y2UoKHN1bSwgZykgPT4gc3VtICsgKGNvdW50cy5jb3VudHNbZ10gPz8gMCksIDApO1xuICAgIHRoaXMuaG9zdC5lc3RpbWF0ZUNoYW5nZWQ/Lih7IHBvaW50czogTWF0aC5yb3VuZChzZWxlY3RlZCAqIHNoYXJlKSwgbWF4OiB2aWV3LnRyYW5zY3JpcHRCdWRnZXQgfSk7XG4gIH1cblxuICAvKiogVGhlIGRlbnNpdHkgd2luZG93IGluIHVzZSBhbmQgdGhlIGRlbnNlc3QgYmluLCBmb3IgdGhlIHBhbmVsJ3MgdGhyZXNob2xkIGNvbnRyb2wuICovXG4gIGRlbnNpdHlTdGF0czogeyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8g4pSA4pSAIGxheWVyIGJvb2trZWVwaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGZXRjaCBldmVyeSB0aWxlLCBkcmF3aW5nIHdoYXQgYXJyaXZlZC4gQSBmYWlsdXJlIGRvZXMgbm90IGZhaWwgdGhlIHZpZXcsIGJ1dCBpdCBtYXJrcyB0aGVcbiAgICogcGxhbiBpbmNvbXBsZXRlOiB0aGUgY2FsbGVyIG11c3Qgbm90IGNhY2hlIGl0IGFzIGRvbmUsIGFuZCBgcGxhbigpYCByZXRyaWVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEFsbDxLLCBUPihrZXlzOiBLW10sIGxvYWQ6IChrOiBLKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtleXMubWFwKGxvYWQpKTtcbiAgICBjb25zdCBvdXQ6IFRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcyBvZiBzZXR0bGVkKSB7XG4gICAgICBpZiAocy5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSBvdXQucHVzaChzLnZhbHVlKTtcbiAgICAgIGVsc2UgY29uc29sZS53YXJuKCdbbmFwYXJpLWpzXSBzcGF0aWFsIHRpbGUgZmFpbGVkJywgcy5yZWFzb24pO1xuICAgIH1cbiAgICBpZiAob3V0Lmxlbmd0aCA8IGtleXMubGVuZ3RoKSB0aGlzLnBsYW5JbmNvbXBsZXRlID0gdHJ1ZTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBhIHNoYXBlcyBsYXllciBpbiBwbGFjZSBmb3IgYGdyb3VwYDogYSBnZW9tZXRyeSBjaGFuZ2UgYnVpbGRzIGEgbmV3IGxheWVyLCBhXG4gICAqIGNvbG91ci1vbmx5IGNoYW5nZSBtdXRhdGVzIHZhbHVlcy9jb2xvcm1hcCBvbiB0aGUgZXhpc3Rpbmcgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSB1cHNlcnRTaGFwZXMoXG4gICAgZ3JvdXA6IEdyb3VwLCB3YW50ZWQ6IGJvb2xlYW4sIGdlb21ldHJ5Q2hhbmdlZDogYm9vbGVhbiwgcmluZ3M6IFNwYXRpYWxQb2x5Z29ucyxcbiAgICBvcHRzOiBQYXJhbWV0ZXJzPFZpZXdlclsnYWRkU2hhcGVzJ10+WzJdICYgb2JqZWN0LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXdhbnRlZCkge1xuICAgICAgdGhpcy5kcm9wKGdyb3VwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmxheWVycy5nZXQoZ3JvdXApIGFzIFNoYXBlc0xheWVyIHwgdW5kZWZpbmVkO1xuICAgIGlmIChleGlzdGluZyAmJiAhZ2VvbWV0cnlDaGFuZ2VkICYmIHRoaXMudmlld2VyIS5sYXllcnMuaXRlbXMuaW5jbHVkZXMoZXhpc3RpbmcpKSB7XG4gICAgICAvLyBGbGF0IGNvbG91ciBoYXMgbm8gdmFsdWVzOyBjbGVhcmluZyB0aGVtIGlzIHdoYXQgc3dpdGNoZXMgdGhlIGxheWVyIHRvIGBjb2xvcmAuXG4gICAgICBleGlzdGluZy52YWx1ZXMgPSBvcHRzLnZhbHVlcyA/PyBudWxsO1xuICAgICAgaWYgKG9wdHMuY29sb3JtYXApIGV4aXN0aW5nLmNvbG9ybWFwID0gb3B0cy5jb2xvcm1hcDtcbiAgICAgIGlmIChvcHRzLmNvbnRyYXN0TGltaXRzKSBleGlzdGluZy5jb250cmFzdExpbWl0cyA9IG9wdHMuY29udHJhc3RMaW1pdHM7XG4gICAgICBpZiAob3B0cy5jb2xvcikgZXhpc3RpbmcuY29sb3IgPSBvcHRzLmNvbG9yO1xuICAgICAgaWYgKG9wdHMub3BhY2l0eSAhPT0gdW5kZWZpbmVkKSBleGlzdGluZy5vcGFjaXR5ID0gb3B0cy5vcGFjaXR5O1xuICAgICAgdGhpcy52aWV3ZXIhLnJlcXVlc3RSZW5kZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZpZXdlciEuYWRkU2hhcGVzKHJpbmdzLmNvb3JkcywgcmluZ3Mub2Zmc2V0cywgb3B0cyk7XG4gICAgdGhpcy5yZXBsYWNlKGdyb3VwLCBsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBgbGF5ZXJgIGFzIGBncm91cGAncyBsYXllciBhbmQgcmVzdG9yZSB0aGUgb3JkZXIgb2YgdGhlIGdyb3VwcyBhYm92ZSBpdC5cbiAgICogVGhlIGxheWVyIHdhcyBqdXN0IGFkZGVkIGJ5IHRoZSBjYWxsZXIgKHNvIGl0IGlzIG9uIHRvcCk7IGdyb3VwcyB0aGF0IGJlbG9uZyBhYm92ZVxuICAgKiBpdCBhcmUgcmVtb3ZlZCBhbmQgcmUtYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIHJlcGxhY2UoZ3JvdXA6IEdyb3VwLCBsYXllcjogTGF5ZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gdGhpcy52aWV3ZXIhO1xuICAgIGNvbnN0IG9sZCA9IHRoaXMubGF5ZXJzLmdldChncm91cCk7XG4gICAgaWYgKG9sZCAmJiBvbGQgIT09IGxheWVyICYmIHYubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKG9sZCkpIHYubGF5ZXJzLnJlbW92ZShvbGQpO1xuICAgIHRoaXMubGF5ZXJzLnNldChncm91cCwgbGF5ZXIpO1xuICAgIGZvciAoY29uc3QgZyBvZiBPUkRFUi5zbGljZShPUkRFUi5pbmRleE9mKGdyb3VwKSArIDEpKSB7XG4gICAgICBjb25zdCBhYm92ZSA9IHRoaXMubGF5ZXJzLmdldChnKTtcbiAgICAgIGlmICghYWJvdmUgfHwgIXYubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGFib3ZlKSkgY29udGludWU7XG4gICAgICB2LmxheWVycy5yZW1vdmUoYWJvdmUpO1xuICAgICAgdi5sYXllcnMuYWRkKGFib3ZlKTtcbiAgICB9XG4gICAgdi5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGRyb3AoZ3JvdXA6IEdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVycy5nZXQoZ3JvdXApO1xuICAgIGlmIChsYXllciAmJiB0aGlzLnZpZXdlcj8ubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGxheWVyKSkgdGhpcy52aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5sYXllcnMuZGVsZXRlKGdyb3VwKTtcbiAgICB0aGlzLmtleXMuZGVsZXRlKGdyb3VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJvcENlbGxzKCk6IHZvaWQge1xuICAgIHRoaXMuZHJvcCgnY2VsbEZpbGwnKTtcbiAgICB0aGlzLmRyb3AoJ2NlbGxPdXRsaW5lJyk7XG4gICAgdGhpcy5kcm9wKCdudWNsZXVzT3V0bGluZScpO1xuICAgIHRoaXMuY3VycmVudE51Y2xlaSA9IG51bGw7XG4gICAgdGhpcy5jZWxsR2VvbWV0cnlLZXkgPSBudWxsO1xuICAgIHRoaXMuY2VsbFN0eWxlS2V5ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRSaW5ncyA9IG51bGw7XG4gICAgdGhpcy5zZXRQb2x5Z29uc1Nob3duKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UG9seWdvbnNTaG93bihzaG93bjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChzaG93biA9PT0gdGhpcy5wb2x5Z29uc1Nob3duKSByZXR1cm47XG4gICAgdGhpcy5wb2x5Z29uc1Nob3duID0gc2hvd247XG4gICAgdGhpcy5ob3N0LnBvbHlnb25zU2hvd25DaGFuZ2VkKHNob3duKTtcbiAgfVxufVxuXG4vKiogV2hhdCB0aGUgdHJhbnNjcmlwdCBsYXllciBjdXJyZW50bHkgc2hvd3Mg4oCUIHdoYXQgaG92ZXJpbmcgbmVlZHMgdG8gbmFtZSBhIG1hcmtlci4gKi9cbmludGVyZmFjZSBEcmF3blRyYW5zY3JpcHRzIHtcbiAga2luZDogVHJhbnNjcmlwdEpvYlsna2luZCddO1xuICBiaW4/OiBUcmFuc2NyaXB0Sm9iWydiaW4nXTtcbiAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7XG4gIC8qKiBNYXJrZXIgcmFkaXVzIHBlciBlbnRyeSwgaW4gb2JzZXJ2YXRpb24gdW5pdHMuICovXG4gIHJhZGl1czogRmxvYXQzMkFycmF5O1xuICBnZW5lczogc3RyaW5nW107XG4gIHJlZjogU3BhdGlhbEltYWdlUmVmIHwgbnVsbDtcbiAgLyoqIExhemlseSBidWlsdCBzcGF0aWFsIGluZGV4OiBidWNrZXQg4oaSIGVudHJ5IGluZGljZXMuICovXG4gIGdyaWQ6IHsgc2l6ZTogbnVtYmVyOyBidWNrZXRzOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4gfSB8IG51bGw7XG59XG5cbi8qKiBJbmRleCBvZiB0aGUgZW50cnkgdW5kZXIgYCh4LCB5KWAg4oCUIHdpdGhpbiBpdHMgb3duIHJhZGl1cyBvciBgdG9sZXJhbmNlYCDigJQgb3IgLTEuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja05lYXJlc3QoXG4gIGQ6IFBpY2s8RHJhd25UcmFuc2NyaXB0cywgJ21lcmdlZCcgfCAncmFkaXVzJyB8ICdncmlkJz4sIHg6IG51bWJlciwgeTogbnVtYmVyLCB0b2xlcmFuY2U6IG51bWJlcixcbik6IG51bWJlciB7XG4gIGNvbnN0IHQgPSBkLm1lcmdlZDtcbiAgaWYgKCFkLmdyaWQpIHtcbiAgICBsZXQgbWF4UiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIGlmIChkLnJhZGl1c1tpXSA+IG1heFIpIG1heFIgPSBkLnJhZGl1c1tpXTtcbiAgICBjb25zdCBzaXplID0gTWF0aC5tYXgobWF4UiAqIDIsIHRvbGVyYW5jZSAqIDIsIDFlLTYpO1xuICAgIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBidWNrZXRLZXkoTWF0aC5mbG9vcih0LnhbaV0gLyBzaXplKSwgTWF0aC5mbG9vcih0LnlbaV0gLyBzaXplKSk7XG4gICAgICBsZXQgYiA9IGJ1Y2tldHMuZ2V0KGspO1xuICAgICAgaWYgKCFiKSBidWNrZXRzLnNldChrLCAoYiA9IFtdKSk7XG4gICAgICBiLnB1c2goaSk7XG4gICAgfVxuICAgIGQuZ3JpZCA9IHsgc2l6ZSwgYnVja2V0cyB9O1xuICB9XG4gIGNvbnN0IHsgc2l6ZSwgYnVja2V0cyB9ID0gZC5ncmlkO1xuICBjb25zdCBneCA9IE1hdGguZmxvb3IoeCAvIHNpemUpO1xuICBjb25zdCBneSA9IE1hdGguZmxvb3IoeSAvIHNpemUpO1xuICBsZXQgYmVzdCA9IC0xO1xuICBsZXQgYmVzdEQgPSBJbmZpbml0eTtcbiAgZm9yIChsZXQgZHkgPSAtMTsgZHkgPD0gMTsgZHkrKykge1xuICAgIGZvciAobGV0IGR4ID0gLTE7IGR4IDw9IDE7IGR4KyspIHtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBidWNrZXRzLmdldChidWNrZXRLZXkoZ3ggKyBkeCwgZ3kgKyBkeSkpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLmh5cG90KHQueFtpXSAtIHgsIHQueVtpXSAtIHkpO1xuICAgICAgICBpZiAoZGlzdCA8PSBNYXRoLm1heChkLnJhZGl1c1tpXSwgdG9sZXJhbmNlKSAmJiBkaXN0IDwgYmVzdEQpIHtcbiAgICAgICAgICBiZXN0RCA9IGRpc3Q7XG4gICAgICAgICAgYmVzdCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG5cbmZ1bmN0aW9uIGJ1Y2tldEtleShneDogbnVtYmVyLCBneTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChneCArIDMyNzY4KSAqIDY1NTM2ICsgKGd5ICsgMzI3NjgpO1xufVxuXG4vKiogUmluZ3Mgd2hvc2Ugb3duaW5nIGNlbGwgaXMgaW4gYSBzd2l0Y2hlZC1vZmYgZ3JvdXAgcmVtb3ZlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSaW5ncyhcbiAgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSwgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgaWYgKCFoaWRkZW4pIHJldHVybiByaW5ncztcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tyaW5ncy5vYnNlcnZhdGlvbltpXV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGhpZGRlbi5oaWRkZW5bY29kZV0pIGNvbnRpbnVlO1xuICAgIGtlZXAucHVzaChpKTtcbiAgICB2ZXJ0aWNlcyArPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAtIHJpbmdzLm9mZnNldHNbaV07XG4gIH1cbiAgaWYgKGtlZXAubGVuZ3RoID09PSByaW5ncy5jb3VudCkgcmV0dXJuIHJpbmdzO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShrZWVwLmxlbmd0aCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGggKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgdiA9IDA7XG4gIGtlZXAuZm9yRWFjaCgoaSwgcikgPT4ge1xuICAgIG9ic2VydmF0aW9uW3JdID0gcmluZ3Mub2JzZXJ2YXRpb25baV07XG4gICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgY29uc3QgYSA9IHJpbmdzLm9mZnNldHNbaV0gKiAyO1xuICAgIGNvbnN0IGIgPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgY29vcmRzLnNldChyaW5ncy5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICB2ICs9IChiIC0gYSkgLyAyO1xuICB9KTtcbiAgb2Zmc2V0c1trZWVwLmxlbmd0aF0gPSB2O1xuICByZXR1cm4geyBjb3VudDoga2VlcC5sZW5ndGgsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIFNsb3RzIChpbmRpY2VzIGludG8gdGhlIHNlbGVjdGVkIGdlbmVzKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWUgdG9nZ2xlLiAqL1xuZnVuY3Rpb24gaGlkZGVuR2VuZVNsb3RzKHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiBVaW50OEFycmF5IHwgbnVsbCB7XG4gIGlmICghdmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgb2ZmID0gbmV3IFNldCh2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcyk7XG4gIHJldHVybiBVaW50OEFycmF5LmZyb20odmlldy50cmFuc2NyaXB0R2VuZXMsIChnKSA9PiAob2ZmLmhhcyhnKSA/IDEgOiAwKSk7XG59XG5cbi8qKiBFbnRyaWVzIGluIGEgaGlkZGVuIGdyb3VwJ3MgY2VsbCwgb3Igb2YgYSBoaWRkZW4gZ2VuZSwgcmVtb3ZlZCAod2l0aCB0aGVpciBzaXplcykuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHJhbnNjcmlwdHMoXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSwgcHg6IEZsb2F0MzJBcnJheSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLCBoaWRkZW5HZW5lczogVWludDhBcnJheSB8IG51bGwsXG4pOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5IH0ge1xuICBpZiAoIWhpZGRlbiAmJiAhaGlkZGVuR2VuZXMpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAoaGlkZGVuR2VuZXMgJiYgaGlkZGVuR2VuZXNbdC5nZW5lW2ldXSkgY29udGludWU7XG4gICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgaWYgKGhpZGRlbiAmJiBvICE9PSBOT19PQlNFUlZBVElPTikge1xuICAgICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tvXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICB9XG4gICAga2VlcC5wdXNoKGkpO1xuICB9XG4gIGNvbnN0IHBpY2sgPSA8VCBleHRlbmRzIEZsb2F0MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDE2QXJyYXk+KGE6IFQpOiBUID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgKGEuY29uc3RydWN0b3IgYXMgbmV3IChuOiBudW1iZXIpID0+IFQpKGtlZXAubGVuZ3RoKTtcbiAgICBrZWVwLmZvckVhY2goKGksIGspID0+IHsgb3V0W2tdID0gYVtpXTsgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IHtcbiAgICAgIGNvdW50OiBrZWVwLmxlbmd0aCwgYWdncmVnYXRlZDogdC5hZ2dyZWdhdGVkLCB4OiBwaWNrKHQueCksIHk6IHBpY2sodC55KSwgejogcGljayh0LnopLFxuICAgICAgd2VpZ2h0OiBwaWNrKHQud2VpZ2h0KSwgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgICB9LFxuICAgIHB4OiBwaWNrKHB4KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVkaWFuKHY6IEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gIGlmICghdi5sZW5ndGgpIHJldHVybiAwO1xuICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih2Lmxlbmd0aCAvIDEwMjQpKTtcbiAgY29uc3Qgc2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpICs9IHN0ZXApIHNhbXBsZS5wdXNoKHZbaV0pO1xuICBzYW1wbGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICByZXR1cm4gc2FtcGxlW3NhbXBsZS5sZW5ndGggPj4gMV07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0aWxlcycgcmluZ3MgaW50byBvbmUgc2V0LCBkcm9wcGluZyByaW5ncyBhbHJlYWR5IHNlZW4gKGEgY2VsbCBzdHJhZGRsaW5nXG4gKiAgdHdvIHRpbGVzIG1heSBiZSBsaXN0ZWQgYnkgYm90aCkuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQb2x5Z29uVGlsZXModGlsZXM6IFNwYXRpYWxQb2x5Z29uVGlsZVtdKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsZXQgcmluZ3MgPSAwO1xuICBsZXQgdmVydGljZXMgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgaWYgKHNlZW4uaGFzKHQub2JzZXJ2YXRpb25baV0pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKHQub2JzZXJ2YXRpb25baV0pO1xuICAgICAgcmluZ3MrKztcbiAgICAgIHZlcnRpY2VzICs9IHQub2Zmc2V0c1tpICsgMV0gLSB0Lm9mZnNldHNbaV07XG4gICAgfVxuICB9XG4gIHNlZW4uY2xlYXIoKTtcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkocmluZ3MpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KHJpbmdzICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHIgPSAwO1xuICBsZXQgdiA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gdC5vYnNlcnZhdGlvbltpXTtcbiAgICAgIGlmIChzZWVuLmhhcyhvKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChvKTtcbiAgICAgIG9ic2VydmF0aW9uW3JdID0gbztcbiAgICAgIG9mZnNldHNbcl0gPSB2O1xuICAgICAgY29uc3QgYSA9IHQub2Zmc2V0c1tpXSAqIDI7XG4gICAgICBjb25zdCBiID0gdC5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgICBjb29yZHMuc2V0KHQuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgICB2ICs9IChiIC0gYSkgLyAyO1xuICAgICAgcisrO1xuICAgIH1cbiAgfVxuICBvZmZzZXRzW3JpbmdzXSA9IHY7XG4gIHJldHVybiB7IGNvdW50OiByaW5ncywgb2JzZXJ2YXRpb24sIG9mZnNldHMsIGNvb3JkcyB9O1xufVxuXG4vKiogQ29uY2F0ZW5hdGUgdHJhbnNjcmlwdCB0aWxlcywgc3RvcHBpbmcgYXQgYGxpbWl0YCBlbnRyaWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVHJhbnNjcmlwdFRpbGVzKHRpbGVzOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGVbXSwgbGltaXQgPSBJbmZpbml0eSk6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSB7XG4gIGxldCBuID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSBuICs9IHQuY291bnQ7XG4gIG4gPSBNYXRoLm1pbihuLCBsaW1pdCk7XG4gIGNvbnN0IG91dDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlID0ge1xuICAgIGNvdW50OiBuLFxuICAgIGFnZ3JlZ2F0ZWQ6IHRpbGVzLnNvbWUoKHQpID0+IHQuYWdncmVnYXRlZCksXG4gICAgeDogbmV3IEZsb2F0MzJBcnJheShuKSwgeTogbmV3IEZsb2F0MzJBcnJheShuKSwgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSwgb2JzZXJ2YXRpb246IG5ldyBVaW50MzJBcnJheShuKSwgZ2VuZTogbmV3IFVpbnQxNkFycmF5KG4pLFxuICB9O1xuICBsZXQgbyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGNvbnN0IGsgPSBNYXRoLm1pbih0LmNvdW50LCBuIC0gbyk7XG4gICAgaWYgKGsgPD0gMCkgYnJlYWs7XG4gICAgZm9yIChjb25zdCBmIG9mIFsneCcsICd5JywgJ3onLCAnd2VpZ2h0JywgJ29ic2VydmF0aW9uJywgJ2dlbmUnXSBhcyBjb25zdCkge1xuICAgICAgKG91dFtmXSBhcyBGbG9hdDMyQXJyYXkpLnNldCgodFtmXSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KDAsIGspLCBvKTtcbiAgICB9XG4gICAgbyArPSBrO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
1433
|
+
/**
|
|
1434
|
+
* One marker per (cluster, `bin` square) from per-cluster density grids: the counts of the grid
|
|
1435
|
+
* cells inside `area` summed per square, at their count-weighted centre. `slots[c]` is the gene
|
|
1436
|
+
* slot whose icon cluster c's markers take.
|
|
1437
|
+
*/
|
|
1438
|
+
export function clusterMarkers(rasters, slots, bin, area) {
|
|
1439
|
+
const x = [];
|
|
1440
|
+
const y = [];
|
|
1441
|
+
const w = [];
|
|
1442
|
+
const gene = [];
|
|
1443
|
+
const group = [];
|
|
1444
|
+
rasters.forEach((r, c) => {
|
|
1445
|
+
const [cw, ch] = r.meta.gridSize;
|
|
1446
|
+
const [ox, oy] = r.meta.origin;
|
|
1447
|
+
const { rows, cols } = r.meta;
|
|
1448
|
+
const c0 = Math.max(0, Math.floor((area.x0 - ox) / cw));
|
|
1449
|
+
const c1 = Math.min(cols - 1, Math.floor((area.x1 - ox) / cw));
|
|
1450
|
+
const r0 = Math.max(0, Math.floor((area.y0 - oy) / ch));
|
|
1451
|
+
const r1 = Math.min(rows - 1, Math.floor((area.y1 - oy) / ch));
|
|
1452
|
+
const squares = new Map();
|
|
1453
|
+
for (let row = r0; row <= r1; row++) {
|
|
1454
|
+
for (let col = c0; col <= c1; col++) {
|
|
1455
|
+
const v = r.values[row * cols + col];
|
|
1456
|
+
if (!(v > 0))
|
|
1457
|
+
continue;
|
|
1458
|
+
const cx = ox + (col + 0.5) * cw;
|
|
1459
|
+
const cy = oy + (row + 0.5) * ch;
|
|
1460
|
+
const key = Math.floor((cy - oy) / bin) * 1e6 + Math.floor((cx - ox) / bin);
|
|
1461
|
+
const s = squares.get(key) ?? { n: 0, sx: 0, sy: 0 };
|
|
1462
|
+
s.n += v;
|
|
1463
|
+
s.sx += v * cx;
|
|
1464
|
+
s.sy += v * cy;
|
|
1465
|
+
squares.set(key, s);
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
for (const s of squares.values()) {
|
|
1469
|
+
x.push(s.sx / s.n);
|
|
1470
|
+
y.push(s.sy / s.n);
|
|
1471
|
+
w.push(Math.round(s.n));
|
|
1472
|
+
gene.push(slots[c]);
|
|
1473
|
+
group.push(c);
|
|
1474
|
+
}
|
|
1475
|
+
});
|
|
1476
|
+
const n = w.length;
|
|
1477
|
+
return {
|
|
1478
|
+
tile: {
|
|
1479
|
+
count: n, aggregated: true,
|
|
1480
|
+
x: Float32Array.from(x), y: Float32Array.from(y), z: new Float32Array(n),
|
|
1481
|
+
weight: Uint32Array.from(w), observation: new Uint32Array(n).fill(NO_OBSERVATION),
|
|
1482
|
+
gene: Uint16Array.from(gene),
|
|
1483
|
+
},
|
|
1484
|
+
group: Int32Array.from(group),
|
|
1485
|
+
};
|
|
1486
|
+
}
|
|
1487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtdGlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXNwYXRpYWwtdGlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJdEQsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSx5Q0FBeUMsQ0FBQztBQUUxRixPQUFPLEVBQ0wsV0FBVyxFQUFFLGNBQWMsRUFHM0IsbUJBQW1CLEdBQ3BCLE1BQU0sMENBQTBDLENBQUM7QUFDbEQsT0FBTyxFQUNMLDJCQUEyQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsR0FDcEcsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0ssYUFBYSxFQUFFLHlCQUF5QixFQUFtQixZQUFZLEVBQUUsaUJBQWlCLEVBQ3BHLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFDOUYsZUFBZSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQ25GLGVBQWUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUM1RSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQ2pHLGVBQWUsR0FDaEIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQztrRkFDa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QiwyRkFBMkY7QUFDM0YsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDakMs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QUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDakMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDakMsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNmLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUs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RUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixDQUFDO1FBQ0QsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQ0QsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDO0lBQ3JCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO29CQUM3RCxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNiLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEVBQVUsRUFBRSxFQUFVO0lBQ3ZDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBeUIsRUFBRSxNQUF5RDtJQUVwRixJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDcEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlELENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsU0FBUyxlQUFlLENBQUMsSUFBc0I7SUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDaEQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixDQUF3QixFQUFFLEVBQWdCLEVBQzFDLE1BQXlELEVBQUUsV0FBOEI7SUFFekYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN0RCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQUUsU0FBUztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFxRCxDQUFJLEVBQUssRUFBRTtRQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFLLENBQUMsQ0FBQyxXQUFvQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBQ0YsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RixNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDN0U7UUFDRCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsQ0FBZTtJQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUk7UUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7d0NBQ3dDO0FBQ3hDLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUEyQjtJQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixLQUFLLEVBQUUsQ0FBQztZQUNSLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFNBQVM7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixDQUFDLEVBQUUsQ0FBQztRQUNOLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQThCLEVBQUUsS0FBSyxHQUFHLFFBQVE7SUFDbkYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLO1FBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxHQUEwQjtRQUNqQyxLQUFLLEVBQUUsQ0FBQztRQUNSLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzNDLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDdEYsQ0FBQztJQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsTUFBTTtRQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQVUsRUFBRSxDQUFDO1lBQ3pFLEdBQUcsQ0FBQyxDQUFDLENBQWtCLENBQUMsR0FBRyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNULENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBK0IsRUFBRSxLQUFlLEVBQUUsR0FBVyxFQUFFLElBQWM7SUFFN0UsTUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBQztJQUN2QixNQUFNLENBQUMsR0FBYSxFQUFFLENBQUM7SUFDdkIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpRCxDQUFDO1FBQ3pFLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxLQUFLLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFBRSxTQUFTO2dCQUN2QixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUM1RSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ1QsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNmLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSTtZQUMxQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pGLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9ybWFwLCBjb2xvcm1hcEZyb21MdXQgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZUxheWVyLCBMYXllciwgUkdCQSwgU2hhcGVzTGF5ZXIsIFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB0eXBlIHsgUmdiIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NvbG9ybWFwLWx1dCc7XG5pbXBvcnQgeyBBTExfR0VORVMsIHR5cGUgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIE5PX0NBVEVHT1JZLCBOT19PQlNFUlZBVElPTiwgU3BhdGlhbEJvdW5kcywgU3BhdGlhbENvbHVtbiwgU3BhdGlhbERhdGFzZXQsIFNwYXRpYWxEZW5zaXR5UmFzdGVyLCBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25zLCBTcGF0aWFsVHJhbnNjcmlwdENvdW50cywgU3BhdGlhbFRyYW5zY3JpcHRTdW1tYXJ5LCBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gIGlzQ2F0ZWdvcmljYWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFLCBNSVNTSU5HX0NPTE9SLCBjb250cmFzdFdpbmRvdywgbHV0Rm9yLCBwYXJzZUhleCwgcmVzb2x2ZUNhdGVnb3J5Q29sb3JzLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtZW5jb2RpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtc2VsZWN0aW9uJztcbmltcG9ydCB7XG4gIERhdGFSZWN0LCBJTkZFUk5PX1NDQUxFLCBQT0xZR09OX0xFVkVMX01JTl9DRUxMX1BYLCBUcmFuc2NyaXB0R2x5cGgsIGFsbEdlbmVzUGxhbiwgY2VsbFR5cGVDb2x1bW5Gb3IsXG4gIGNlbGxzU2hvd24sIGNvbG9yRGVuc2l0eVdpbmRvdywgZGVuc2l0eUF1dG9SYW5nZSwgZ3JvdXBlZE1hcmtlclB4LCBxdWFudGlsZU9mLCB0aWxlc0luUmVjdEZyb20sXG4gIGRlZmF1bHRHbHlwaEZvciwgZGlzY3JldGVDb2xvcm1hcFN0b3BzLCBnbHlwaE91dGxpbmUsIGdseXBoUmluZ3MsIHBpeGVsc1BlckRhdGFVbml0LFxuICBwb2x5Z29uTGV2ZWxGb3IsIHRpbGVJZCwgdGlsZXNJblJlY3QsIHRyYW5zY3JpcHRMZXZlbEZvciwgdHJhbnNjcmlwdE1hcmtlclB4LFxuICB0eXBpY2FsQ2VsbERpYW1ldGVyLCB2aXNpYmxlQXJlYSwgdmlzaWJsZURhdGFSZWN0LCBnZW5lQmluU2l6ZSwgZ3JvdXBUcmFuc2NyaXB0cywgY2xpcFRyYW5zY3JpcHRzLFxuICBjbHVzdGVyQ29sb3JNYXAsXG59IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC10aWxlcyc7XG5cbi8qKiBUaGUgYWxsLWdlbmUgcHlyYW1pZCdzIGZpbmVzdCBiaW4gKDI1MCDCtW0gc291cmNlIHRpbGVzIC8gMTI4KSBhbmQgZGVmYXVsdCBsZXZlbCBjb3VudCwgdXNlZFxuICogIHRvIGdyb3VwIGEgZ2VuZSBzZWxlY3Rpb24gb24gdGhlIHNhbWUgbGFkZGVyIHdoZW4gYSBkYXRhc2V0IGhhcyBubyBweXJhbWlkLiAqL1xuY29uc3QgUFlSQU1JRF9CQVNFX0JJTl9VTSA9IDI1MCAvIDEyODtcbmNvbnN0IFBZUkFNSURfTEVWRUxTID0gNztcbi8qKiBJY29ucyBnZXQgYSBkYXJrIHJpbSBvbmx5IHdoaWxlIHRoZXJlIGFyZSBhdCBtb3N0IHRoaXMgbWFueSwgYXQgbGVhc3QgdGhpcyBiaWcgKHB4KS4gKi9cbmNvbnN0IEdMWVBIX09VVExJTkVfTUFYID0gMjBfMDAwO1xuY29uc3QgR0xZUEhfT1VUTElORV9NSU5fUFggPSA4O1xuXG4vKipcbiAqIExldmVsLW9mLWRldGFpbCBjZWxsIG91dGxpbmVzLCB0cmFuc2NyaXB0cyBhbmQgdHJhbnNjcmlwdCBkZW5zaXR5IGZvciB0aGUgMkQgc3BhdGlhbCB2aWV3LlxuICpcbiAqIFdIWSBBIFNFUEFSQVRFIENMQVNTXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXZlcnl0aGluZyBlbHNlIHRoZSBzcGF0aWFsIHZpZXcgZHJhd3MgaXMgYnVpbHQgb25jZSBwZXIgKGRhdGFzZXQsIHZpZXcpIGFuZCBvbmx5XG4gKiByZXN0eWxlZCBhZnRlcndhcmRzLiBUaGVzZSBsYXllcnMgYWxzbyBkZXBlbmQgb24gdGhlIENBTUVSQTogd2hpY2ggdGlsZXMgYXJlIG9uIHNjcmVlblxuICogYW5kIHdoaWNoIGxldmVsIG9mIGRldGFpbCB0aGUgem9vbSBjYWxscyBmb3IuIEtlZXBpbmcgdGhhdCBsb29wIOKAlCBwbGFuIG9uIGNhbWVyYSBpZGxlLFxuICogZmV0Y2ggdGlsZXMsIG1lcmdlLCBkcmF3IOKAlCBvdXQgb2YgdGhlIHZpc3VhbGl6ZXIgc2VydmljZSBrZWVwcyBib3RoIHJlYWRhYmxlLlxuICpcbiAqIExBWUVSIE9SREVSXG4gKiAtLS0tLS0tLS0tLVxuICogbmFwYXJpLWpzJ3MgbGF5ZXIgbGlzdCBpcyBhcHBlbmQtb25seSAoYWRkIC8gcmVtb3ZlIC8gY2xlYXIpLCBzbyBvcmRlciBpcyBrZXB0IGJ5XG4gKiByZS1hZGRpbmc6IGNlbGwgZmlsbCwgY2VsbCBvdXRsaW5lLCB0aGUgdHJhbnNjcmlwdCBkZW5zaXR5LCB0aGVuIHRyYW5zY3JpcHRzIG9uIHRvcC5cbiAqIFRoZSBzZXJ2aWNlJ3Mgb2JzZXJ2YXRpb24gbWFya2VycyBzaXQgdW5kZXIgYWxsIG9mIHRoZW07IHdoaWxlIG91dGxpbmVzIGFyZSBkcmF3biB0aGVcbiAqIG1hcmtlcnMgYXJlIGhpZGRlbiAoYSBjZWxsIGlzIGl0cyBvdXRsaW5lIHRoZW4sIG5vdCBhIGRvdCksIHNvIHRoZSBjZWxscyBuZXZlciBoYXZlIHRvXG4gKiBiZSBvcmRlcmVkIGFnYWluc3QgdGhlbS4gVGhlIGRlbnNpdHkgZ29lcyBPVkVSIHRoZSBtYXJrZXJzIG9uIHB1cnBvc2U6IHVuZGVyIDEwXjVcbiAqIGRvdHMgaXQgd291bGQgb25seSBzaG93IGluIHRoZSBnYXBzIGJldHdlZW4gY2VsbHMuIHtAbGluayBhZnRlck9ic2VydmF0aW9uc30gcmVzdG9yZXNcbiAqIHRoZSBvcmRlciBhZnRlciB0aGUgc2VydmljZSByZS1hZGRzIGl0cyBtYXJrZXJzLlxuICpcbiAqIE9ORSBMQVlFUiBQRVIgR1JPVVBcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEVhY2ggZ3JvdXAgaXMgb25lIG1lcmdlZCBsYXllciBvdmVyIGV2ZXJ5IHZpc2libGUgdGlsZSwgcmVidWlsdCB3aGVuIHRoZSB0aWxlIHNldCBvclxuICogbGV2ZWwgY2hhbmdlcy4gUmVjb2xvdXJpbmcgKGEgbmV3IGNlbGwtdHlwZSBjb2x1bW4sIGEgc2VsZWN0aW9uKSBvbmx5IHJld3JpdGVzIHRoZVxuICogcGVyLXNoYXBlIHZhbHVlcyDigJQgdGhlIGdlb21ldHJ5IGlzIG5vdCByZS1leHBhbmRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsVGlsZUhvc3Qge1xuICAvKiogTGF0ZXN0IGRhdGFzZXQvdmlldy9zZWxlY3Rpb24sIGFzIHRoZSBzcGF0aWFsIHN1YnNjcmlwdGlvbiBzYXcgdGhlbS4gKi9cbiAgbGF0ZXN0KCk6IFtTcGF0aWFsRGF0YXNldCB8IG51bGwsIFNwYXRpYWxWaWV3U3RhdGUsIFNwYXRpYWxTZWxlY3Rpb25NYXNrXSB8IG51bGw7XG4gIC8qKiBDYW52YXMgc2l6ZSBpbiBDU1MgcGl4ZWxzLiAqL1xuICBjYW52YXNTaXplKCk6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBUaGUgY29udGludW91cyBMVVQgdGhlIHZpZXcgaXMgdXNpbmcgKHNvIGNlbGxzIGNvbG91cmVkIGJ5IGEgZ2VuZSBtYXRjaCB0aGUgbWFya2VycykuICovXG4gIGNvbnRpbnVvdXNMdXQodmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFJnYltdO1xuICAvKiogT3V0bGluZXMgYXBwZWFyZWQgb3IgZGlzYXBwZWFyZWQ6IHRoZSBtYXJrZXJzJyB2aXNpYmlsaXR5IGZvbGxvd3MuICovXG4gIHBvbHlnb25zU2hvd25DaGFuZ2VkKHNob3duOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFRoZSBkZW5zaXR5IHdpbmRvdyBjaGFuZ2VkIChhdXRvLWRlcml2ZWQgb3Igc2V0KS4gKi9cbiAgZGVuc2l0eUNoYW5nZWQ/KHN0YXRzOiB7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0pOiB2b2lkO1xuICAvKiogRXN0aW1hdGVkIHRyYW5zY3JpcHRzIGluIHZpZXcgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYWdhaW5zdCB0aGUgYnVkZ2V0LiAqL1xuICBlc3RpbWF0ZUNoYW5nZWQ/KGVzdGltYXRlOiBUcmFuc2NyaXB0RXN0aW1hdGUgfCBudWxsKTogdm9pZDtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbnNpZGUgdGhlIHZpZXcsIG9yIG51bGwgd2hlbiBub3Qga25vd24uICovXG4gIGdlbmVDb3VudHNDaGFuZ2VkPyhjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsKTogdm9pZDtcbiAgLyoqIFRoZSBsYXllcnMgd2hvc2UgZGF0YSBpcyBpbiBmbGlnaHQgbm93IChcIlRyYW5zY3JpcHRzXCIsIFwiQ2VsbHNcIuKApik7IGVtcHR5IHdoZW4gbm9uZS4gKi9cbiAgbG9hZGluZ0NoYW5nZWQ/KGxheWVyczogc3RyaW5nW10pOiB2b2lkO1xufVxuXG4vKiogWGVuaXVtIEV4cGxvcmVyJ3MgXCJFc3RpbWF0ZWQgVHJhbnNjcmlwdCBQb2ludHNcIi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdEVzdGltYXRlIHtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIHRoZSB2aXNpYmxlIGdlbmVzIGVzdGltYXRlZCB0byBiZSBpbiB2aWV3LiAqL1xuICBwb2ludHM6IG51bWJlcjtcbiAgLyoqIFRoZSBtYXJrZXIgYnVkZ2V0LiAqL1xuICBtYXg6IG51bWJlcjtcbn1cblxudHlwZSBHcm91cCA9ICdkZW5zaXR5JyB8ICdjZWxsRmlsbCcgfCAnY2VsbE91dGxpbmUnIHwgJ251Y2xldXNPdXRsaW5lJyB8ICd0cmFuc2NyaXB0cycgfCAndHJhbnNjcmlwdE91dGxpbmUnO1xuY29uc3QgT1JERVI6IEdyb3VwW10gPSBbXG4gICdjZWxsRmlsbCcsICdjZWxsT3V0bGluZScsICdudWNsZXVzT3V0bGluZScsICdkZW5zaXR5JywgJ3RyYW5zY3JpcHRzJywgJ3RyYW5zY3JpcHRPdXRsaW5lJyxcbl07XG5cbi8qKiBUcmFuc2NyaXB0cyBkcmF3biBhdCBvbmNlLiBQYXN0IHRoaXMgYSBzY3JlZW4gaXMgc29saWQgY29sb3VyIGFueXdheTsgdGhlIGxldmVsXG4gKiAgcG9saWN5IGtlZXBzIGEgbm9ybWFsIHZpZXcgZmFyIGJlbG93IGl0LiAqL1xuY29uc3QgTUFYX1RSQU5TQ1JJUFRTID0gNDAwXzAwMDtcbmNvbnN0IE1BWF9DRUxMX1RJTEVTID0gNDg7XG5jb25zdCBNQVhfVFJBTlNDUklQVF9USUxFUyA9IDM2O1xuY29uc3QgTUFYX0JJTl9USUxFUyA9IDY0O1xuXG4vKiogQSB0cmFuc2NyaXB0IGZldGNoIHRoZSBwbGFubmVyIGNhbiBrZXkgYmVmb3JlIHJ1bm5pbmcuICovXG5pbnRlcmZhY2UgVHJhbnNjcmlwdEpvYiB7XG4gIC8qKiBXaGF0IG9uZSBlbnRyeSBpcyDigJQgZGVjaWRlcyB3aGF0IGhvdmVyaW5nIGl0IHNheXMuICovXG4gIGtpbmQ6ICdnZW5lcycgfCAnaW5kaXZpZHVhbCcgfCAnYmlucyc7XG4gIC8qKiBGb3IgYmluczogdGhlaXIgc2l6ZSBhbmQgZ3JpZCBvcmlnaW4sIHNvIGEgaG92ZXJlZCBiaW4ncyBzcXVhcmUgY2FuIGJlIHJlY292ZXJlZC4gKi9cbiAgYmluPzogeyBzaXplOiBudW1iZXI7IG9yaWdpbjogW251bWJlciwgbnVtYmVyXSB9O1xuICAvKiogSWRlbnRpZmllcyB3aGF0IHdpbGwgYmUgZHJhd24sIHNvIGFuIHVuY2hhbmdlZCBwbGFuIGlzIGEgbm8tb3AuICovXG4gIGtleTogc3RyaW5nO1xuICAvKiogRmV0Y2ggYW5kIG1lcmdlOyBgcHhgIGlzIGVhY2ggZW50cnkncyBtYXJrZXIgZGlhbWV0ZXIgaW4gc2NyZWVuIHBpeGVscy4gQSBqb2IgbWF5XG4gICAqICBzd2l0Y2ggdG8gYW5vdGhlciBraW5kIG9uY2UgaXQgc2VlcyB0aGUgZGF0YSAoaW5kaXZpZHVhbCDihpIgYmlucyk7IGl0IHRoZW4gc2F5cyBzby4gKi9cbiAgbG9hZCgpOiBQcm9taXNlPFRyYW5zY3JpcHRMb2FkPjtcbn1cblxuaW50ZXJmYWNlIFRyYW5zY3JpcHRMb2FkIHtcbiAgbWVyZ2VkOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7XG4gIHB4OiBGbG9hdDMyQXJyYXk7XG4gIC8qKiBGb3IgYSBnZW5lIHNlbGVjdGlvbjogZ3JvdXAgaXQgb24gdGhpcyBiaW4gbGFkZGVyIG9uY2UgaGlkZGVuIGdlbmVzIGFyZSBkcm9wcGVkLiAqL1xuICBsYWRkZXI/OiB7IGJhc2VCaW46IG51bWJlcjsgbGV2ZWxzOiBudW1iZXI7IHN0YXJ0OiBudW1iZXIgfCBudWxsIH07XG4gIC8qKiBBbHJlYWR5IG9uZSBtYXJrZXIgcGVyIGNsdXN0ZXIgcGVyIGJpbiAoem9vbWVkIG91dCwgZnJvbSB0aGUgZGVuc2l0eSBncmlkcyk6IG5vIGNlbGxzLiAqL1xuICBjbHVzdGVyZWQ/OiB7IGdyb3VwOiBJbnQzMkFycmF5OyBuYW1lczogc3RyaW5nW107IGdlbmVzOiBzdHJpbmdbXVtdOyBiaW46IG51bWJlcjsgb3JpZ2luOiBbbnVtYmVyLCBudW1iZXJdIH07XG4gIGtpbmQ/OiBUcmFuc2NyaXB0Sm9iWydraW5kJ107XG4gIGJpbj86IFRyYW5zY3JpcHRKb2JbJ2JpbiddO1xufVxuXG4vKiogV2hlcmUgYSBsYXllciBzaXRzIGluIHdvcmxkIHNwYWNlOiB0aGUgZGF0YXNldCdzIGFmZmluZSBvbnRvIGl0cyB0aXNzdWUgaW1hZ2UuICovXG5pbnRlcmZhY2UgUGxhY2VtZW50IHsgc2NhbGU6IFtudW1iZXIsIG51bWJlcl07IHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSB9XG5cbi8qKiBUcmFuc2NyaXB0IGNvbG91cnM6IHBlci1lbnRyeSBSR0JBIGZvciBwb2ludHMsIHZhbHVlcyArIGNvbG9ybWFwIGZvciBzaGFwZXMuICovXG5pbnRlcmZhY2UgVHJhbnNjcmlwdEZhY2VzIHsgcmdiYTogUkdCQVtdOyB2YWx1ZXM6IEZsb2F0MzJBcnJheTsgY29sb3JtYXA6IENvbG9ybWFwIH1cbmNvbnN0IENBTUVSQV9JRExFX01TID0gMTIwO1xuLyoqIEZpcnN0IHJldHJ5IG9mIGEgdmlldyB3aXRoIGEgZmFpbGVkIHRpbGU7IGRvdWJsZXMgZWFjaCB0aW1lLCB1cCB0byBNQVhfVElMRV9SRVRSSUVTLiAqL1xuY29uc3QgVElMRV9SRVRSWV9NUyA9IDEwMDA7XG5jb25zdCBNQVhfVElMRV9SRVRSSUVTID0gMztcblxuY29uc3QgVU5BU1NJR05FRF9SR0JBOiBSR0JBID0gWzAuNjIsIDAuNjIsIDAuNjIsIDAuNTVdO1xuXG5leHBvcnQgY2xhc3MgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMge1xuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FtZXJhT2ZmOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgLyoqIFNldCB3aGVuIGEgdGlsZSBvZiB0aGUgY3VycmVudCBwbGFuIGZhaWxlZCB0byBsb2FkIChzZWUgZmV0Y2hBbGwpLiAqL1xuICBwcml2YXRlIHBsYW5JbmNvbXBsZXRlID0gZmFsc2U7XG4gIC8qKiBDb25zZWN1dGl2ZSByZXRyaWVzIG9mIGFuIGluY29tcGxldGUgdmlldy4gKi9cbiAgcHJpdmF0ZSB0aWxlUmV0cmllcyA9IDA7XG4gIHByaXZhdGUgdG9rZW4gPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGxheWVycyA9IG5ldyBNYXA8R3JvdXAsIExheWVyPigpO1xuICAvKiogV2hhdCBlYWNoIGdyb3VwIGN1cnJlbnRseSBzaG93cywgc28gYW4gdW5jaGFuZ2VkIHBsYW4gaXMgYSBuby1vcC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBrZXlzID0gbmV3IE1hcDxHcm91cCwgc3RyaW5nPigpO1xuICBwcml2YXRlIHBvbHlnb25zU2hvd24gPSBmYWxzZTtcbiAgLyoqIFJpbmdzIGN1cnJlbnRseSBkcmF3biBhbmQgdGhlIChkYXRhc2V0LCBzZXQsIHRpbGVzKSB0aGV5IGNhbWUgZnJvbS4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50UmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNlbGxHZW9tZXRyeUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudE51Y2xlaTogU3BhdGlhbFBvbHlnb25UaWxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2VsbFN0eWxlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFNlbGVjdGlvbiBpZGVudGl0eSDihpIgcmV2aXNpb24sIHNvIGEgY2hhbmdlIGtleSBjYW4gbmFtZSBhIHNlbGVjdGlvbiBjaGVhcGx5LiAqL1xuICBwcml2YXRlIGxhc3RTZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2aXNpb24gPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcG9ydDogU3BhdGlhbERhdGFQb3J0LCBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFNwYXRpYWxUaWxlSG9zdCkge31cblxuICAvLyDilIDilIAgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGF0dGFjaCh2aWV3ZXI6IFZpZXdlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdlciA9PT0gdmlld2VyKSByZXR1cm47XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjtcbiAgICB0aGlzLmNhbWVyYU9mZiA9IHZpZXdlci5jYW1lcmEuY2hhbmdlZC5jb25uZWN0KCgpID0+IHRoaXMuc2NoZWR1bGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogR3JvdXAgYSBnZW5lIHNlbGVjdGlvbiBmb3IgdGhlIHpvb206IG9uZSBtYXJrZXIgcGVyIGdlbmUtdHJlZSBjbHVzdGVyIChhIGdlbmUgaW4gbm9cbiAgICogY2x1c3RlciBpcyBpdHMgb3duKSBwZXIgYmluIG9mIHRoZSBweXJhbWlkIGxhZGRlciwgc3RhcnRpbmcgYXQgdGhlIGZpbmVzdCBiaW4gd2hvc2VcbiAgICogbWFya2VycyBhcmUgMTQgcHggYXBhcnQgYW5kIHN0ZXBwaW5nIHVwIHdoaWxlIHRoZSBtYXJrZXJzIHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICAgKiBOdWxsIHRvIGRyYXcgZXZlcnkgdHJhbnNjcmlwdDogem9vbWVkIGluLCB3aXRoIHRoZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBidWRnZXQuXG4gICAqL1xuICBwcml2YXRlIGdyb3VwU2VsZWN0aW9uKFxuICAgIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgbGFkZGVyOiBOb25OdWxsYWJsZTxUcmFuc2NyaXB0TG9hZFsnbGFkZGVyJ10+LFxuICAgIHB4UGVyVW5pdDogbnVtYmVyLFxuICApOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5OyBiaW46IG51bWJlcjsgZ3JvdXA6IEludDMyQXJyYXk7IG5hbWVzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3QgYnVkZ2V0ID0gTWF0aC5tYXgoMSwgdmlldy50cmFuc2NyaXB0QnVkZ2V0KTtcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGNvbnN0IGdyb3VwcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHM7XG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZ3JvdXBzLm1hcCgoZykgPT4gZy5uYW1lKSwgLi4uZ2VuZXNdO1xuICAgIGNvbnN0IGNsdXN0ZXJPZiA9IGdlbmVzLm1hcCgoZ2VuZSwgc2xvdCkgPT4ge1xuICAgICAgY29uc3QgZyA9IGdyb3Vwcy5maW5kSW5kZXgoKHgpID0+IHguZ2VuZXMuaW5jbHVkZXMoZ2VuZSkpO1xuICAgICAgcmV0dXJuIGcgPj0gMCA/IGcgOiBncm91cHMubGVuZ3RoICsgc2xvdDtcbiAgICB9KTtcbiAgICBjb25zdCBrZXlPZiA9IChzbG90OiBudW1iZXIpID0+IGNsdXN0ZXJPZltzbG90XSA/PyBncm91cHMubGVuZ3RoICsgc2xvdDtcbiAgICBsZXQgYmluID0gbGFkZGVyLnN0YXJ0O1xuICAgIGlmIChiaW4gPT09IG51bGwpIHtcbiAgICAgIC8vIEV2ZXJ5IHRyYW5zY3JpcHQsIGlmIHRoZXkgZml0IHRoZSBtYXggYW5kIG5vbmUgd2FzIGN1dCBvZmYgYXQgdGhlIGNhcC5cbiAgICAgIGlmICh0LmNvdW50IDw9IGJ1ZGdldCAmJiB0LmNvdW50IDwgTUFYX1RSQU5TQ1JJUFRTKSByZXR1cm4gbnVsbDtcbiAgICAgIGJpbiA9IGxhZGRlci5iYXNlQmluO1xuICAgIH1cbiAgICBjb25zdCB0b3AgPSBsYWRkZXIuYmFzZUJpbiAqIDIgKiogKGxhZGRlci5sZXZlbHMgLSAxKTtcbiAgICBsZXQgZ3JvdXBlZCA9IGdyb3VwVHJhbnNjcmlwdHModCwgYmluLCBrZXlPZik7XG4gICAgLy8gT3ZlciB0aGUgbWF4OiBjb21iaW5lIGludG8gbGFyZ2VyIG1hcmtlcnMsIGEgbGV2ZWwgYXQgYSB0aW1lLlxuICAgIHdoaWxlIChncm91cGVkLnRpbGUuY291bnQgPiBidWRnZXQgJiYgYmluIDwgdG9wKSB7XG4gICAgICBiaW4gKj0gMjtcbiAgICAgIGdyb3VwZWQgPSBncm91cFRyYW5zY3JpcHRzKHQsIGJpbiwga2V5T2YpO1xuICAgIH1cbiAgICBjb25zdCByZWZDb3VudCA9IHF1YW50aWxlT2YoZ3JvdXBlZC50aWxlLndlaWdodCwgMC45NSk7XG4gICAgY29uc3QgYmluUHggPSBiaW4gKiBweFBlclVuaXQ7XG4gICAgY29uc3QgcHggPSBuZXcgRmxvYXQzMkFycmF5KGdyb3VwZWQudGlsZS5jb3VudCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cGVkLnRpbGUuY291bnQ7IGkrKykge1xuICAgICAgcHhbaV0gPSBncm91cGVkTWFya2VyUHgoZ3JvdXBlZC50aWxlLndlaWdodFtpXSwgcmVmQ291bnQsIGJpblB4LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSk7XG4gICAgfVxuICAgIHJldHVybiB7IG1lcmdlZDogZ3JvdXBlZC50aWxlLCBweCwgYmluLCBncm91cDogZ3JvdXBlZC5ncm91cCwgbmFtZXMgfTtcbiAgfVxuXG4gIC8qKiDCtW0gcGVyIG9ic2VydmF0aW9uIHVuaXQgb2YgdGhlIGRyYXduIGRhdGFzZXQsIGZvciBkZXNjcmliaW5nIGEgZ3JvdXBlZCBtYXJrZXIncyBhcmVhLiAqL1xuICBwcml2YXRlIG1pY3JvbnNQZXJVbml0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogTG9hZHMgaW4gZmxpZ2h0LCBwZXIgbGF5ZXIgbGFiZWwsIGZvciB0aGUgbG9hZGluZyBiYWRnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAvKiogUmVwb3J0IGBsYWJlbGAgbG9hZGluZyB3aGlsZSBgd29ya2AgaXMgaW4gZmxpZ2h0LiAqL1xuICBwcml2YXRlIGFzeW5jIHRyYWNrPFQ+KGxhYmVsOiBzdHJpbmcsIHdvcms6IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGxhYmVsLCAodGhpcy5sb2FkaW5nLmdldChsYWJlbCkgPz8gMCkgKyAxKTtcbiAgICB0aGlzLmhvc3QubG9hZGluZ0NoYW5nZWQ/LihbLi4udGhpcy5sb2FkaW5nLmtleXMoKV0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgd29yaztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgbiA9ICh0aGlzLmxvYWRpbmcuZ2V0KGxhYmVsKSA/PyAxKSAtIDE7XG4gICAgICBpZiAobiA+IDApIHRoaXMubG9hZGluZy5zZXQobGFiZWwsIG4pO1xuICAgICAgZWxzZSB0aGlzLmxvYWRpbmcuZGVsZXRlKGxhYmVsKTtcbiAgICAgIHRoaXMuaG9zdC5sb2FkaW5nQ2hhbmdlZD8uKFsuLi50aGlzLmxvYWRpbmcua2V5cygpXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBsb2FkZWQgcGVyLWdlbmUgdHJhbnNjcmlwdHMgdGhlIGluLXZpZXcgY291bnRzIGFyZSB0YWtlbiBmcm9tLiAqL1xuICBwcml2YXRlIGNvdW50U291cmNlOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBnZW5lczogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW5zaWRlIGByZWN0YDogZWFjaCBlbnRyeSBjb3VudHMgZm9yIHRoZSB0cmFuc2NyaXB0cyBpdFxuICAgKiBzdGFuZHMgZm9yIChhbiBhZ2dyZWdhdGUgYXQgYSBjb2Fyc2UgbGV2ZWwgaG9sZHMgc2V2ZXJhbCkuIE51bGwgd2l0aG91dCBwZXItZ2VuZSBkYXRhLlxuICAgKi9cbiAgZ2VuZUNvdW50c0luKHJlY3Q6IERhdGFSZWN0KTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuY291bnRTb3VyY2U7XG4gICAgaWYgKCFzcmMpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZyBvZiBzcmMuZ2VuZXMpIG91dFtnXSA9IDA7XG4gICAgY29uc3QgeyB4LCB5LCB3ZWlnaHQsIGdlbmUgfSA9IHNyYy5tZXJnZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubWVyZ2VkLmNvdW50OyBpKyspIHtcbiAgICAgIGlmICh4W2ldIDwgcmVjdC54MCB8fCB4W2ldID4gcmVjdC54MSB8fCB5W2ldIDwgcmVjdC55MCB8fCB5W2ldID4gcmVjdC55MSkgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lID0gc3JjLmdlbmVzW2dlbmVbaV1dO1xuICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgb3V0W25hbWVdICs9IHdlaWdodFtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBsYXllcmAgaXMgb25lIG9mIHRoZSBvdmVybGF5cyBkcmF3biBoZXJlIChkZW5zaXR5LCBjZWxscywgdHJhbnNjcmlwdHMpLiAqL1xuICBvd25zKGxheWVyOiBMYXllcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgbCBvZiB0aGlzLmxheWVycy52YWx1ZXMoKSkgaWYgKGwgPT09IGxheWVyKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZXRhY2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG92ZXJUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lcik7XG4gICAgdGhpcy5ob3ZlclRpbWVyID0gbnVsbDtcbiAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgICB0aGlzLmNhbWVyYU9mZj8uKCk7XG4gICAgdGhpcy5jYW1lcmFPZmYgPSBudWxsO1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgdGhpcy50b2tlbisrO1xuICAgIHRoaXMudGlsZVJldHJpZXMgPSAwO1xuICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMubG9hZGluZy5jbGVhcigpO1xuICAgIHRoaXMuaG9zdC5sb2FkaW5nQ2hhbmdlZD8uKFtdKTtcbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld2VyLmxheWVycy5pdGVtcy5pbmNsdWRlcyhsYXllcikpIHRoaXMudmlld2VyLmxheWVycy5yZW1vdmUobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVycy5jbGVhcigpO1xuICAgIHRoaXMua2V5cy5jbGVhcigpO1xuICAgIHRoaXMuc2V0UG9seWdvbnNTaG93bihmYWxzZSk7XG4gICAgdGhpcy52aWV3ZXIgPSBudWxsO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgb3V0bGluZXMgYXJlIG9uIHNjcmVlbiDigJQgdGhlIHNlcnZpY2UgaGlkZXMgaXRzIGRvdHMgdGhlbi4gKi9cbiAgZ2V0IG91dGxpbmVzU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9seWdvbnNTaG93bjtcbiAgfVxuXG4gIC8qKiBEYXRhc2V0LCB2aWV3IG9yIHNlbGVjdGlvbiBjaGFuZ2VkOiByZS1wbGFuIG5vdyByYXRoZXIgdGhhbiBvbiBjYW1lcmEgaWRsZS4gKi9cbiAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNjaGVkdWxlKDApO1xuICB9XG5cbiAgLyoqIENhbGxlZCByaWdodCBhZnRlciB0aGUgc2VydmljZSBhZGRzIGl0cyBtYXJrZXIgbGF5ZXI6IGV2ZXJ5dGhpbmcgZ29lcyBiYWNrIG9uIHRvcC4gKi9cbiAgYWZ0ZXJPYnNlcnZhdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZyBvZiBPUkRFUikge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVycy5nZXQoZyk7XG4gICAgICBpZiAoIWxheWVyKSBjb250aW51ZTtcbiAgICAgIGlmICh2LmxheWVycy5pdGVtcy5pbmNsdWRlcyhsYXllcikpIHYubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgICB2LmxheWVycy5hZGQobGF5ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBwbGFubmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNjaGVkdWxlKGRlbGF5ID0gQ0FNRVJBX0lETEVfTVMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdm9pZCB0aGlzLnBsYW4oKTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBsYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3QgbGF0ZXN0ID0gdGhpcy5ob3N0LmxhdGVzdCgpO1xuICAgIGlmICghdmlld2VyIHx8ICFsYXRlc3QpIHJldHVybjtcbiAgICBjb25zdCBbZGF0YXNldCwgdmlldywgc2VsZWN0aW9uXSA9IGxhdGVzdDtcbiAgICBjb25zdCB0b2tlbiA9ICsrdGhpcy50b2tlbjtcbiAgICBjb25zdCBzdGFsZSA9ICgpID0+IHRva2VuICE9PSB0aGlzLnRva2VuIHx8IHRoaXMudmlld2VyICE9PSB2aWV3ZXI7XG4gICAgdGhpcy5wbGFuSW5jb21wbGV0ZSA9IGZhbHNlO1xuXG4gICAgaWYgKCFkYXRhc2V0KSB7XG4gICAgICBmb3IgKGNvbnN0IGcgb2YgT1JERVIpIHRoaXMuZHJvcChnKTtcbiAgICAgIHRoaXMuZHJvcENlbGxzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFt3LCBoXSA9IHRoaXMuaG9zdC5jYW52YXNTaXplKCk7XG4gICAgY29uc3QgcmVmID0gZGF0YXNldC5pbWFnZVJlZjtcbiAgICBjb25zdCByZWN0ID0gdmlzaWJsZURhdGFSZWN0KHZpZXdlci5jYW1lcmEuY2VudGVyLCB2aWV3ZXIuY2FtZXJhLnpvb20sIHcsIGgsIHJlZik7XG4gICAgY29uc3QgcHhQZXJVbml0ID0gcGl4ZWxzUGVyRGF0YVVuaXQodmlld2VyLmNhbWVyYS56b29tLCByZWYpO1xuICAgIGlmICghcmVjdCkgcmV0dXJuO1xuXG4gICAgdm9pZCB0aGlzLnBsYW5Fc3RpbWF0ZShkYXRhc2V0LCB2aWV3LCB2aWV3ZXIsIHcsIGgsIHN0YWxlKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnBsYW5EZW5zaXR5KGRhdGFzZXQsIHZpZXcsIHN0YWxlKSxcbiAgICAgIHRoaXMucGxhbkNlbGxzKGRhdGFzZXQsIHZpZXcsIHNlbGVjdGlvbiwgcmVjdCwgcHhQZXJVbml0LCBzdGFsZSksXG4gICAgICB0aGlzLnBsYW5UcmFuc2NyaXB0cyhkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQsIHN0YWxlKSxcbiAgICBdKTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuICAgIHRoaXMuaG9zdC5nZW5lQ291bnRzQ2hhbmdlZD8uKHRoaXMuZ2VuZUNvdW50c0luKHJlY3QpKTtcbiAgICAvLyBBIHRpbGUgdGhhdCBmYWlsZWQgbGVmdCBhIGhvbGUgdGhlIGNhY2hlIGtleXMgZG8gbm90IHJlY29yZCwgc28gdHJ5IHRoZSBzYW1lIHZpZXdcbiAgICAvLyBhZ2FpbiwgYmFja2luZyBvZmYsIGEgYm91bmRlZCBudW1iZXIgb2YgdGltZXMuXG4gICAgaWYgKCF0aGlzLnBsYW5JbmNvbXBsZXRlKSB7XG4gICAgICB0aGlzLnRpbGVSZXRyaWVzID0gMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGlsZVJldHJpZXMgPCBNQVhfVElMRV9SRVRSSUVTKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlKFRJTEVfUkVUUllfTVMgKiAyICoqIHRoaXMudGlsZVJldHJpZXMrKyk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIGNlbGxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgYXN5bmMgcGxhbkNlbGxzKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrLFxuICAgIHJlY3Q6IERhdGFSZWN0LCBweFBlclVuaXQ6IG51bWJlciwgc3RhbGU6ICgpID0+IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbGVkID0gZGF0YXNldC5wb2x5Z29uVGlsZXM7XG4gICAgY29uc3Qgd2hvbGUgPSAhdGlsZWQgJiYgZGF0YXNldC5wb2x5Z29ucyAmJiB0aGlzLnBvcnQuZ2V0UG9seWdvbnM7XG4gICAgaWYgKCFjZWxsc1Nob3duKGRhdGFzZXQsIHZpZXcpIHx8ICghdGlsZWQgJiYgIXdob2xlKSkge1xuICAgICAgdGhpcy5kcm9wQ2VsbHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGlhbWV0ZXIgPSB0eXBpY2FsQ2VsbERpYW1ldGVyKGRhdGFzZXQub2JzZXJ2YXRpb25zLnJhZGl1cyk7XG4gICAgLy8gV2hvbGUtZGF0YXNldCByaW5ncyBoYXZlIG9uZSBsZXZlbCBhbmQgbm8gY29hcnNlciBmYWxsYmFjaywgc28gdGhleSBhcmUgZHJhd24gYXNcbiAgICAvLyBzb29uIGFzIGEgY2VsbCBpcyBiaWcgZW5vdWdoIHRvIHJlYWQgYXMgYSBzaGFwZSByYXRoZXIgdGhhbiBhIGRvdC5cbiAgICBjb25zdCBsZXZlbCA9IHRpbGVkXG4gICAgICA/IHBvbHlnb25MZXZlbEZvcihweFBlclVuaXQsIGRpYW1ldGVyLCB0aWxlZC5sZXZlbHMubGVuZ3RoKVxuICAgICAgOiAocHhQZXJVbml0ICogZGlhbWV0ZXIgPj0gUE9MWUdPTl9MRVZFTF9NSU5fQ0VMTF9QWFsyXSA/IDAgOiAtMSk7XG4gICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgdGhpcy5kcm9wQ2VsbHMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHcm91cHMgc3dpdGNoZWQgb2ZmIGluIHRoZSBsaXN0OiB0aGVpciBjZWxscyBhcmUgbGVmdCBvdXQgb2YgdGhlIGdlb21ldHJ5LlxuICAgIGNvbnN0IGhpZGRlbiA9IGF3YWl0IHRoaXMuaGlkZGVuQ29kZXMoZGF0YXNldCwgdmlldyk7XG4gICAgaWYgKHN0YWxlKCkpIHJldHVybjtcbiAgICBjb25zdCBsYWJlbCA9IHZpZXcuY2VsbFNldCA9PT0gJ2JvdGgnID8gJ0NlbGxzIGFuZCBudWNsZWknXG4gICAgICA6IHZpZXcuY2VsbFNldCA9PT0gJ251Y2xldXMnID8gJ051Y2xlaScgOiAnQ2VsbHMnO1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gYXdhaXQgdGhpcy50cmFjayhsYWJlbCwgdGhpcy5jZWxsR2VvbWV0cnkoZGF0YXNldCwgdmlldywgcmVjdCwgbGV2ZWwsIGhpZGRlbiwgc3RhbGUpKTtcbiAgICBpZiAoIWdlb21ldHJ5KSByZXR1cm47XG4gICAgY29uc3QgeyByaW5ncywgbnVjbGVpLCBnZW9tZXRyeUtleSB9ID0gZ2VvbWV0cnk7XG5cbiAgICBjb25zdCBnZW9tZXRyeUNoYW5nZWQgPSBnZW9tZXRyeUtleSAhPT0gdGhpcy5jZWxsR2VvbWV0cnlLZXk7XG4gICAgY29uc3Qgc3R5bGVLZXkgPSBbXG4gICAgICBnZW9tZXRyeUtleSwgdmlldy5jZWxsQ29sb3JNb2RlLCB2aWV3LmNlbGxDb2xvckdlbmUsIHZpZXcuY2VsbFNpbmdsZUNvbG9yLFxuICAgICAgdGhpcy5jZWxsVHlwZUNvbHVtbk5hbWUoZGF0YXNldCwgdmlldyksXG4gICAgICB0aGlzLnNlbGVjdGlvblJldihzZWxlY3Rpb24pLCB2aWV3LmxvZ1NjYWxlLCB2aWV3LnBlcmNlbnRpbGVDbGlwLmpvaW4oKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZpZXcuY29udGludW91c0NvbG9ybWFwKSwgdmlldy5jZWxsRHJhdywgdmlldy5jZWxsT3BhY2l0eSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgICBjb25zdCBwcmVzZW50ID0gWydjZWxsRmlsbCcsICdjZWxsT3V0bGluZScsICdudWNsZXVzT3V0bGluZSddLnNvbWUoKGcpID0+IHtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmxheWVycy5nZXQoZyBhcyBHcm91cCk7XG4gICAgICByZXR1cm4gbCAmJiB0aGlzLnZpZXdlciEubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGwpO1xuICAgIH0pO1xuICAgIGlmICghZ2VvbWV0cnlDaGFuZ2VkICYmIHN0eWxlS2V5ID09PSB0aGlzLmNlbGxTdHlsZUtleSAmJiBwcmVzZW50KSB7XG4gICAgICB0aGlzLnNldFBvbHlnb25zU2hvd24odHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbG9ycyA9IGF3YWl0IHRoaXMuY2VsbENvbG9ycyhkYXRhc2V0LCB2aWV3LCBzZWxlY3Rpb24sIHJpbmdzLm9ic2VydmF0aW9uKTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jdXJyZW50UmluZ3MgPSByaW5ncztcbiAgICB0aGlzLmN1cnJlbnROdWNsZWkgPSBudWNsZWk7XG4gICAgLy8gQSBnZW9tZXRyeSBtaXNzaW5nIGEgZmFpbGVkIHRpbGUgaXMgZHJhd24gYnV0IG5vdCByZW1lbWJlcmVkLCBzbyB0aGUgcmV0cnkgcmVmZXRjaGVzIGl0LlxuICAgIHRoaXMuY2VsbEdlb21ldHJ5S2V5ID0gdGhpcy5wbGFuSW5jb21wbGV0ZSA/IG51bGwgOiBnZW9tZXRyeUtleTtcbiAgICB0aGlzLmNlbGxTdHlsZUtleSA9IHN0eWxlS2V5O1xuICAgIGNvbnN0IHJlZiA9IGRhdGFzZXQuaW1hZ2VSZWY7XG4gICAgY29uc3QgY29tbW9uID0geyBzY2FsZTogcmVmPy5zY2FsZSA/PyBbMSwgMV0sIHRyYW5zbGF0ZTogcmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdIH0gYXMgY29uc3Q7XG4gICAgY29uc3QgZmlsbCA9IHZpZXcuY2VsbERyYXcgIT09ICdvdXRsaW5lJztcbiAgICBjb25zdCBvdXRsaW5lID0gdmlldy5jZWxsRHJhdyAhPT0gJ2ZpbGwnO1xuXG4gICAgdGhpcy51cHNlcnRTaGFwZXMoJ2NlbGxGaWxsJywgZmlsbCwgZ2VvbWV0cnlDaGFuZ2VkLCByaW5ncywge1xuICAgICAgbmFtZTogJ2NlbGxzJywgZHJhdzogJ2ZpbGwnLCBvcGFjaXR5OiB2aWV3LmNlbGxPcGFjaXR5LCAuLi5jb2xvcnMsIC4uLmNvbW1vbixcbiAgICB9KTtcbiAgICB0aGlzLnVwc2VydFNoYXBlcygnY2VsbE91dGxpbmUnLCBvdXRsaW5lLCBnZW9tZXRyeUNoYW5nZWQsIHJpbmdzLCBmaWxsXG4gICAgICAvLyBPdmVyIGEgZmlsbCwgYSBkYXJrIG91dGxpbmUgc2VwYXJhdGVzIG5laWdoYm91cnMgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAgID8geyBuYW1lOiAnY2VsbCBvdXRsaW5lcycsIGRyYXc6ICdvdXRsaW5lJywgY29sb3I6IFswLjA4LCAwLjA4LCAwLjEsIDFdLCBvcGFjaXR5OiAwLjcsIC4uLmNvbW1vbiB9XG4gICAgICA6IHsgbmFtZTogJ2NlbGwgb3V0bGluZXMnLCBkcmF3OiAnb3V0bGluZScsIG9wYWNpdHk6IDEsIC4uLmNvbG9ycywgLi4uY29tbW9uIH0pO1xuICAgIC8vIFwiQm90aFwiOiBudWNsZWkgb3V0bGluZWQgb3ZlciB0aGUgY2VsbHMsIGxpZ2h0IHNvIHRoZXkgcmVhZCBhZ2FpbnN0IGFueSBmaWxsLlxuICAgIGlmIChudWNsZWkpIHtcbiAgICAgIHRoaXMudXBzZXJ0U2hhcGVzKCdudWNsZXVzT3V0bGluZScsIHRydWUsIGdlb21ldHJ5Q2hhbmdlZCwgbnVjbGVpLCB7XG4gICAgICAgIG5hbWU6ICdudWNsZXVzIG91dGxpbmVzJywgZHJhdzogJ291dGxpbmUnLCBjb2xvcjogWzAuOTUsIDAuOTUsIDAuOTgsIDFdLCBvcGFjaXR5OiAwLjgsIC4uLmNvbW1vbixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3AoJ251Y2xldXNPdXRsaW5lJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0UG9seWdvbnNTaG93bih0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0aW9uUmV2KHNlbGVjdGlvbjogU3BhdGlhbFNlbGVjdGlvbk1hc2spOiBudW1iZXIge1xuICAgIGlmIChzZWxlY3Rpb24gIT09IHRoaXMubGFzdFNlbGVjdGlvbikge1xuICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5zZWxlY3Rpb25SZXZpc2lvbisrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25SZXZpc2lvbjtcbiAgfVxuXG4gIC8qKiBQZXItc2hhcGUgdmFsdWVzICsgY29sb3JtYXAgZm9yIHRoZSByaW5ncycgb3duZXJzLiAqL1xuICAvKipcbiAgICogUGVyLXNoYXBlIHZhbHVlcyArIGNvbG9ybWFwIGZvciB0aGUgcmluZ3MnIG93bmVycywgYnkgdGhlIHZpZXcncyBjZWxsLWNvbG91ciBtb2RlXG4gICAqIChYZW5pdW0gRXhwbG9yZXIncyBcIkNlbGwgQ29sb3JcIikuIEEgc2VsZWN0aW9uIG11dGVzIHdoYXQgaXQgbGVhdmVzIG91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2VsbENvbG9ycyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayxcbiAgICBvd25lcnM6IFVpbnQzMkFycmF5LFxuICApOiBQcm9taXNlPHsgdmFsdWVzPzogRmxvYXQzMkFycmF5OyBjb2xvcm1hcD86IENvbG9ybWFwOyBjb250cmFzdExpbWl0cz86IFtudW1iZXIsIG51bWJlcl07IGNvbG9yPzogUkdCQSB9PiB7XG4gICAgY29uc3QgbXV0ZWQgPSBzZWxlY3Rpb24uY291bnQgPiAwID8gc2VsZWN0aW9uLm1hc2sgOiBudWxsO1xuICAgIGNvbnN0IG1vZGUgPSB2aWV3LmNlbGxDb2xvck1vZGU7XG5cbiAgICBpZiAobW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IHBhcnNlSGV4KHZpZXcuY2VsbFNpbmdsZUNvbG9yKTtcbiAgICAgIHJldHVybiB7IGNvbG9yOiBbciAvIDI1NSwgZyAvIDI1NSwgYiAvIDI1NSwgMV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250aW51b3VzID0gYXN5bmMgKHJhdzogRmxvYXQzMkFycmF5LCBsb2c6IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkob3duZXJzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gcmF3W293bmVyc1tpXV0gPz8gTmFOO1xuICAgICAgICB2YWx1ZXNbaV0gPSBsb2cgPyBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHYpKSA6IHY7XG4gICAgICB9XG4gICAgICBjb25zdCBbbG8sIGhpXSA9IGNvbnRyYXN0V2luZG93KFxuICAgICAgICBsb2cgPyByYXcubWFwKCh2KSA9PiBNYXRoLmxvZzFwKE1hdGgubWF4KDAsIHYpKSkgOiByYXcsXG4gICAgICAgIHZpZXcucGVyY2VudGlsZUNsaXBbMF0sIHZpZXcucGVyY2VudGlsZUNsaXBbMV0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICBjb2xvcm1hcDogY29sb3JtYXBGcm9tTHV0KCdzcGF0aWFsLWNvbnRpbnVvdXMnLCB0aGlzLmhvc3QuY29udGludW91c0x1dCh2aWV3KSksXG4gICAgICAgIGNvbnRyYXN0TGltaXRzOiBbbG8sIGhpXSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgfTtcbiAgICB9O1xuICAgIGlmIChtb2RlID09PSAnZ2VuZScgJiYgdmlldy5jZWxsQ29sb3JHZW5lKSB7XG4gICAgICByZXR1cm4gY29udGludW91cyhhd2FpdCB0aGlzLnBvcnQuZ2V0RmVhdHVyZVZlY3Rvcih2aWV3LmNlbGxDb2xvckdlbmUpLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICd0cmFuc2NyaXB0RGVuc2l0eScgJiYgZGF0YXNldC5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gJ3RyYW5zY3JpcHRfZGVuc2l0eScpKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0aGlzLnBvcnQuZ2V0Q29sdW1uKCd0cmFuc2NyaXB0X2RlbnNpdHknKTtcbiAgICAgIGlmICghaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pKSByZXR1cm4gY29udGludW91cyhjb2x1bW4udmFsdWVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IG1vZGUgPT09ICdzZWdtZW50YXRpb24nICYmIGRhdGFzZXQuY29sdW1ucy5zb21lKChjKSA9PiBjLm5hbWUgPT09ICdzZWdtZW50YXRpb25fbWV0aG9kJylcbiAgICAgID8gJ3NlZ21lbnRhdGlvbl9tZXRob2QnXG4gICAgICA6IHRoaXMuY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQsIHZpZXcpO1xuICAgIGNvbnN0IGNvZGVzID0gbmFtZSA/IGF3YWl0IHRoaXMuY2F0ZWdvcmljYWxDb2RlcyhuYW1lKSA6IG51bGw7XG4gICAgY29uc3QgeyBjb2xvcm1hcCwgdmFsdWVPZiB9ID0gdGhpcy5jYXRlZ29yaWNhbENvbG9ybWFwKGNvZGVzPy5tZXRhID8/IG51bGwpO1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkob3duZXJzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBvd25lcnNbaV07XG4gICAgICBjb25zdCBjb2RlID0gIWNvZGVzIHx8IChtdXRlZCAmJiAhbXV0ZWRbb10pID8gLTEgOiBjb2Rlcy5jb2Rlc1tvXTtcbiAgICAgIHZhbHVlc1tpXSA9IHZhbHVlT2YoY29kZSA9PT0gTk9fQ0FURUdPUlkgPyAtMSA6IGNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZXMsIGNvbG9ybWFwLCBjb250cmFzdExpbWl0czogWzAsIDFdIH07XG4gIH1cblxuICAvKiogQ29kZXMgb2YgdGhlIGdyb3VwIGNvbHVtbiB0aGF0IGFyZSBzd2l0Y2hlZCBvZmYsIG9yIG51bGwgd2hlbiBub25lIGFyZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBoaWRkZW5Db2RlcyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSxcbiAgKTogUHJvbWlzZTx7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgaWYgKCF2aWV3LmhpZGRlbkdyb3Vwcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmNlbGxUeXBlQ29sdW1uTmFtZShkYXRhc2V0LCB2aWV3KTtcbiAgICBjb25zdCBjb2wgPSBuYW1lID8gYXdhaXQgdGhpcy5jYXRlZ29yaWNhbENvZGVzKG5hbWUpIDogbnVsbDtcbiAgICBpZiAoIWNvbCB8fCBjb2wubWV0YS5raW5kICE9PSAnY2F0ZWdvcmljYWwnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcuaGlkZGVuR3JvdXBzKTtcbiAgICBjb25zdCBoaWRkZW4gPSBVaW50OEFycmF5LmZyb20oY29sLm1ldGEuY2F0ZWdvcmllcywgKGMpID0+IChvZmYuaGFzKGMpID8gMSA6IDApKTtcbiAgICByZXR1cm4geyBjb2RlczogY29sLmNvZGVzLCBoaWRkZW4gfTtcbiAgfVxuXG4gIHByaXZhdGUgY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNlbGxUeXBlQ29sdW1uRm9yKGRhdGFzZXQsIHZpZXcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYXRlZ29yaWNhbENvZGVzKG5hbWU6IHN0cmluZyk6XG4gICAgUHJvbWlzZTx7IGNvZGVzOiBVaW50MTZBcnJheTsgbWV0YTogU3BhdGlhbENvbHVtblsnbWV0YSddIH0gfCBudWxsPiB7XG4gICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGhpcy5wb3J0LmdldENvbHVtbihuYW1lKTtcbiAgICByZXR1cm4gaXNDYXRlZ29yaWNhbENvbHVtbihjb2x1bW4pID8geyBjb2RlczogY29sdW1uLmNvZGVzLCBtZXRhOiBjb2x1bW4ubWV0YSB9IDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2F0ZWdvcmljYWxDb2xvcm1hcChtZXRhOiBTcGF0aWFsQ29sdW1uWydtZXRhJ10gfCBudWxsKTpcbiAgICB7IGNvbG9ybWFwOiBDb2xvcm1hcDsgdmFsdWVPZjogKGNvZGU6IG51bWJlcikgPT4gbnVtYmVyOyByZ2I6IFJnYltdIH0ge1xuICAgIGNvbnN0IGhleCA9IG1ldGEgJiYgbWV0YS5raW5kID09PSAnY2F0ZWdvcmljYWwnXG4gICAgICA/IHJlc29sdmVDYXRlZ29yeUNvbG9ycyhtZXRhKVxuICAgICAgOiBbREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFWzBdXTtcbiAgICBjb25zdCByZ2IgPSBoZXgubWFwKHBhcnNlSGV4KTtcbiAgICBjb25zdCB7IHN0b3BzLCB2YWx1ZU9mIH0gPSBkaXNjcmV0ZUNvbG9ybWFwU3RvcHMocmdiLCBNSVNTSU5HX0NPTE9SKTtcbiAgICByZXR1cm4geyBjb2xvcm1hcDogbmV3IENvbG9ybWFwKCdzcGF0aWFsLWNhdGVnb3JpZXMnLCBzdG9wcyksIHZhbHVlT2YsIHJnYiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjZWxsIHJpbmdzIChhbmQsIGZvciBcImJvdGhcIiwgdGhlIG51Y2xldXMgcmluZ3MpIGNvdmVyaW5nIGByZWN0YCBhdCBgbGV2ZWxgLCBtaW51c1xuICAgKiB0aGUgaGlkZGVuIGdyb3VwcyDigJQgcmV1c2VkIHdoZW4gbm90aGluZyB0aGF0IGRlY2lkZXMgdGhlbSBjaGFuZ2VkLiBOdWxsIHdoZW4gdGhlXG4gICAqIHZpZXcgd2VudCBzdGFsZSBvciB0aGUgZGF0YXNldCBoYXMgbm8gc2V0IHRvIGRyYXcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNlbGxHZW9tZXRyeShcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgcmVjdDogRGF0YVJlY3QsIGxldmVsOiBudW1iZXIsXG4gICAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLCBzdGFsZTogKCkgPT4gYm9vbGVhbixcbiAgKTogUHJvbWlzZTx7IHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGU7IG51Y2xlaTogU3BhdGlhbFBvbHlnb25UaWxlIHwgbnVsbDsgZ2VvbWV0cnlLZXk6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IHRpbGVkID0gZGF0YXNldC5wb2x5Z29uVGlsZXM7XG4gICAgY29uc3QgaGlkZGVuS2V5ID0gdmlldy5oaWRkZW5Hcm91cHMuam9pbignXFx1MDAwMScpO1xuICAgIGxldCByaW5nczogU3BhdGlhbFBvbHlnb25UaWxlO1xuICAgIGxldCBudWNsZWk6IFNwYXRpYWxQb2x5Z29uVGlsZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBnZW9tZXRyeUtleTogc3RyaW5nO1xuICAgIGlmICh0aWxlZCkge1xuICAgICAgY29uc3QgYm90aCA9IHZpZXcuY2VsbFNldCA9PT0gJ2JvdGgnO1xuICAgICAgY29uc3Qgc2V0ID0gIWJvdGggJiYgdmlldy5jZWxsU2V0ICYmIHRpbGVkLnNldHMuc29tZSgocykgPT4gcy5uYW1lID09PSB2aWV3LmNlbGxTZXQpXG4gICAgICAgID8gdmlldy5jZWxsU2V0IDogKHRpbGVkLmRlZmF1bHRTZXQgPz8gdGlsZWQuc2V0c1swXT8ubmFtZSk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBudWNsZXVzU2V0ID0gYm90aCA/IHRpbGVkLnNldHMuZmluZCgocykgPT4gcy5uYW1lICE9PSBzZXQpPy5uYW1lIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qga2V5cyA9IHRpbGVzSW5SZWN0KHJlY3QsIGxldmVsLCB0aWxlZC5sZXZlbHMsIHRpbGVkLmJvdW5kcywgTUFYX0NFTExfVElMRVMpO1xuICAgICAgZ2VvbWV0cnlLZXkgPSBgJHtkYXRhc2V0LmlkfXwke3NldH18JHtudWNsZXVzU2V0ID8/ICcnfXwke2hpZGRlbktleX18JHtrZXlzLm1hcCh0aWxlSWQpLmpvaW4oJywnKX1gO1xuICAgICAgaWYgKGdlb21ldHJ5S2V5ID09PSB0aGlzLmNlbGxHZW9tZXRyeUtleSAmJiB0aGlzLmN1cnJlbnRSaW5ncykge1xuICAgICAgICByaW5ncyA9IHRoaXMuY3VycmVudFJpbmdzO1xuICAgICAgICBudWNsZWkgPSB0aGlzLmN1cnJlbnROdWNsZWk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbdGlsZXMsIG51Y2xldXNUaWxlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5mZXRjaEFsbChrZXlzLCAoaykgPT4gdGhpcy5wb3J0LmdldFBvbHlnb25UaWxlIShzZXQsIGsubGV2ZWwsIGsuZ3gsIGsuZ3kpKSxcbiAgICAgICAgICBudWNsZXVzU2V0XG4gICAgICAgICAgICA/IHRoaXMuZmV0Y2hBbGwoa2V5cywgKGspID0+IHRoaXMucG9ydC5nZXRQb2x5Z29uVGlsZSEobnVjbGV1c1NldCwgay5sZXZlbCwgay5neCwgay5neSkpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShudWxsKSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChzdGFsZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmluZ3MgPSBmaWx0ZXJSaW5ncyhtZXJnZVBvbHlnb25UaWxlcyh0aWxlcyksIGhpZGRlbik7XG4gICAgICAgIG51Y2xlaSA9IG51Y2xldXNUaWxlcyA/IGZpbHRlclJpbmdzKG1lcmdlUG9seWdvblRpbGVzKG51Y2xldXNUaWxlcyksIGhpZGRlbikgOiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBnZW9tZXRyeUtleSA9IGAke2RhdGFzZXQuaWR9fHdob2xlfCR7aGlkZGVuS2V5fWA7XG4gICAgICBpZiAoZ2VvbWV0cnlLZXkgPT09IHRoaXMuY2VsbEdlb21ldHJ5S2V5ICYmIHRoaXMuY3VycmVudFJpbmdzKSB7XG4gICAgICAgIHJpbmdzID0gdGhpcy5jdXJyZW50UmluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2x5czogU3BhdGlhbFBvbHlnb25zID0gYXdhaXQgdGhpcy5wb3J0LmdldFBvbHlnb25zISgpO1xuICAgICAgICBpZiAoc3RhbGUoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIFdob2xlLWRhdGFzZXQgcmluZ3MgYXJlIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgb2JzZXJ2YXRpb25zLlxuICAgICAgICByaW5ncyA9IGZpbHRlclJpbmdzKFxuICAgICAgICAgIHsgLi4ucG9seXMsIG9ic2VydmF0aW9uOiBVaW50MzJBcnJheS5mcm9tKHsgbGVuZ3RoOiBwb2x5cy5jb3VudCB9LCAoX3YsIGkpID0+IGkpIH0sIGhpZGRlbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcmluZ3MsIG51Y2xlaSwgZ2VvbWV0cnlLZXkgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0cmFuc2NyaXB0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGFzeW5jIHBsYW5UcmFuc2NyaXB0cyhcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgcmVjdDogRGF0YVJlY3QsIHB4UGVyVW5pdDogbnVtYmVyLFxuICAgIHN0YWxlOiAoKSA9PiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtb2RlID0gdmlldy50cmFuc2NyaXB0TW9kZTtcbiAgICBjb25zdCBqb2IgPSAobW9kZSA9PT0gJ2NpcmNsZXMnIHx8IG1vZGUgPT09ICdnbHlwaHMnKVxuICAgICAgJiYgKHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0VGlsZSB8fCAodGhpcy5wb3J0LmdldFRyYW5zY3JpcHRHZW5lQmlucyAmJiBkYXRhc2V0LnRyYW5zY3JpcHRHZW5lQmlucykpXG4gICAgICA/ICh2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc1xuICAgICAgICA/IHRoaXMuYWxsR2VuZXNKb2IoZGF0YXNldCwgdmlldywgcmVjdCwgcHhQZXJVbml0KVxuICAgICAgICA6IHRoaXMuZ2VuZUpvYihkYXRhc2V0LCB2aWV3LCByZWN0LCBweFBlclVuaXQpKVxuICAgICAgOiBudWxsO1xuICAgIGlmICgham9iKSB7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRzJyk7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRPdXRsaW5lJyk7XG4gICAgICB0aGlzLmRyYXduID0gbnVsbDtcbiAgICAgIHRoaXMuY291bnRTb3VyY2UgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBNYXJrZXIgc2l6ZXMgZm9sbG93IHRoZSB6b29tLCBzbyB0aGUgem9vbSBpcyBwYXJ0IG9mIHRoZSBrZXk7IGEgcGFuIHRoYXQga2VlcHNcbiAgICAvLyB0aGUgc2FtZSB0aWxlcyBvbiBzY3JlZW4gY2hhbmdlcyBub3RoaW5nLlxuICAgIGNvbnN0IHBsYW5LZXkgPSBbXG4gICAgICBkYXRhc2V0LmlkLCBtb2RlLCBqb2Iua2V5LCB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5LCB0aGlzLmNlbGxUeXBlQ29sdW1uTmFtZShkYXRhc2V0LCB2aWV3KSxcbiAgICAgIHZpZXcudHJhbnNjcmlwdFNjYWxlLCB2aWV3LnRyYW5zY3JpcHRPcGFjaXR5LCBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHbHlwaHMpLFxuICAgICAgcHhQZXJVbml0LnRvUHJlY2lzaW9uKDQpLCB2aWV3LmhpZGRlbkdyb3Vwcy5qb2luKCdcXHUwMDAxJyksIHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmpvaW4oJywnKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZpZXcudHJhbnNjcmlwdEdlbmVDb2xvcnMpLCBKU09OLnN0cmluZ2lmeSh2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5sYXllcnMuZ2V0KCd0cmFuc2NyaXB0cycpO1xuICAgIGlmIChwbGFuS2V5ID09PSB0aGlzLmtleXMuZ2V0KCd0cmFuc2NyaXB0cycpICYmIGN1cnJlbnQgJiYgdGhpcy52aWV3ZXIhLmxheWVycy5pdGVtcy5pbmNsdWRlcyhjdXJyZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCB0aGlzLnRyYWNrKCdUcmFuc2NyaXB0cycsIGpvYi5sb2FkKCkpO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG4gICAgLy8gUGVyLWdlbmUgY291bnRzIGluIHZpZXcgY29tZSBmcm9tIHdoYXQgd2FzIGxvYWRlZCwgYmVmb3JlIGhpZGRlbiBnZW5lcyBhcmUgZHJvcHBlZDpcbiAgICAvLyBhIGhpZGRlbiBnZW5lIHN0aWxsIGhhcyB0cmFuc2NyaXB0cyB0aGVyZS4gU3VtbWVkIGRlbnNpdHkgZ3JpZHMgKG5vIHBlci1nZW5lIGxldmVscyxcbiAgICAvLyB6b29tZWQgb3V0KSBob2xkIGNsdXN0ZXJzLCBub3QgZ2VuZXM6IG5vIHBlci1nZW5lIGNvdW50cyB0aGVyZSwgcmF0aGVyIHRoYW4gYSBndWVzcy5cbiAgICB0aGlzLmNvdW50U291cmNlID0gKGxvYWRlZC5raW5kID8/IGpvYi5raW5kKSA9PT0gJ2dlbmVzJyAmJiAhbG9hZGVkLmNsdXN0ZXJlZFxuICAgICAgPyB7IG1lcmdlZDogbG9hZGVkLm1lcmdlZCwgZ2VuZXM6IFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lc10gfSA6IG51bGw7XG4gICAgY29uc3QgaGlkZGVuID0gYXdhaXQgdGhpcy5oaWRkZW5Db2RlcyhkYXRhc2V0LCB2aWV3KTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuICAgIC8vIERlbnNpdHktZ3JpZCBtYXJrZXJzIGNhcnJ5IG5vIGNlbGxzIGFuZCB3ZXJlIGJ1aWx0IGZyb20gdGhlIHZpc2libGUgZ2VuZXMgb25seS5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IGxvYWRlZC5jbHVzdGVyZWQgPyB7IG1lcmdlZDogbG9hZGVkLm1lcmdlZCwgcHg6IGxvYWRlZC5weCB9XG4gICAgICA6IGZpbHRlclRyYW5zY3JpcHRzKGxvYWRlZC5tZXJnZWQsIGxvYWRlZC5weCwgaGlkZGVuLFxuICAgICAgICAobG9hZGVkLmtpbmQgPz8gam9iLmtpbmQpID09PSAnZ2VuZXMnID8gaGlkZGVuR2VuZVNsb3RzKHZpZXcpIDogbnVsbCk7XG4gICAgbGV0IHsgbWVyZ2VkLCBweCB9ID0gZmlsdGVyZWQ7XG4gICAgbGV0IHNlbGVjdGlvbkJpbjogbnVtYmVyIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/LmJpbiA/PyBudWxsO1xuICAgIGxldCBlbnRyeUdyb3VwOiBJbnQzMkFycmF5IHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lmdyb3VwID8/IG51bGw7XG4gICAgbGV0IGdyb3VwTmFtZXM6IHN0cmluZ1tdIHwgbnVsbCA9IGxvYWRlZC5jbHVzdGVyZWQ/Lm5hbWVzID8/IG51bGw7XG4gICAgaWYgKGxvYWRlZC5sYWRkZXIpIHtcbiAgICAgIGNvbnN0IGcgPSB0aGlzLmdyb3VwU2VsZWN0aW9uKG1lcmdlZCwgdmlldywgbG9hZGVkLmxhZGRlciwgcHhQZXJVbml0KTtcbiAgICAgIGlmIChnKSAoeyBtZXJnZWQsIHB4LCBiaW46IHNlbGVjdGlvbkJpbiwgZ3JvdXA6IGVudHJ5R3JvdXAsIG5hbWVzOiBncm91cE5hbWVzIH0gPSBnKTtcbiAgICB9XG4gICAgLy8gQSBiaW4gb2YgdGhlIGFsbC1nZW5lIHB5cmFtaWQgbWl4ZXMgZ2VuZXMgYW5kIGNhcnJpZXMgbm9uZSwgc28gaXQgY2Fubm90IGJlIGNvbG91cmVkXG4gICAgLy8gYnkgZ2VuZTogY29sb3VyIGl0IGJ5IGl0cyBkb21pbmFudCBjZWxsJ3MgdHlwZSB1bnRpbCBpbmRpdmlkdWFsIHRyYW5zY3JpcHRzIHNob3cuXG4gICAgY29uc3Qga2luZCA9IGxvYWRlZC5raW5kID8/IGpvYi5raW5kO1xuICAgIGNvbnN0IGNvbG9yVmlldyA9IGtpbmQgPT09ICdiaW5zJyAmJiB2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ICE9PSAnY2VsbFR5cGUnXG4gICAgICA/IHsgLi4udmlldywgdHJhbnNjcmlwdENvbG9yQnk6ICdjZWxsVHlwZScgYXMgY29uc3QgfVxuICAgICAgLy8gRGVuc2l0eS1ncmlkIG1hcmtlcnMgaGF2ZSBubyBjZWxsIHRvIHRha2UgYSB0eXBlIGZyb206IHRoZXkgdGFrZSB0aGVpciBjbHVzdGVyJ3MgY29sb3VyLlxuICAgICAgOiBsb2FkZWQuY2x1c3RlcmVkICYmIHZpZXcudHJhbnNjcmlwdENvbG9yQnkgPT09ICdjZWxsVHlwZSdcbiAgICAgICAgPyB7IC4uLnZpZXcsIHRyYW5zY3JpcHRDb2xvckJ5OiAnY2x1c3RlcicgYXMgY29uc3QgfSA6IHZpZXc7XG4gICAgLy8gRWFjaCBlbnRyeSdzIGNsdXN0ZXI6IGl0cyBtYXJrZXIncyBncm91cCwgb3IgdGhlIGdlbmUtdHJlZSBncm91cCBpdHMgZ2VuZSBpcyBpbi5cbiAgICBjb25zdCBnZW5lQ2x1c3RlciA9IHZpZXcudHJhbnNjcmlwdEdlbmVzLm1hcCgoZykgPT5cbiAgICAgIHZpZXcudHJhbnNjcmlwdEdlbmVHcm91cHMuZmluZCgoeCkgPT4geC5nZW5lcy5pbmNsdWRlcyhnKSk/Lm5hbWUgPz8gZyk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gKGk6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4gKGVudHJ5R3JvdXAgJiYgZ3JvdXBOYW1lc1xuICAgICAgPyBncm91cE5hbWVzW2VudHJ5R3JvdXBbaV1dID8/IG51bGxcbiAgICAgIDogZ2VuZUNsdXN0ZXJbbWVyZ2VkLmdlbmVbaV1dID8/IG51bGwpO1xuICAgIGNvbnN0IGZhY2VzID0gYXdhaXQgdGhpcy50cmFuc2NyaXB0Q29sb3JzKGRhdGFzZXQsIGNvbG9yVmlldywgbWVyZ2VkLCBraW5kID09PSAnZ2VuZXMnID8gY2x1c3Rlck9mIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoc3RhbGUoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMucGxhbkluY29tcGxldGUpIHRoaXMua2V5cy5kZWxldGUoJ3RyYW5zY3JpcHRzJyk7XG4gICAgZWxzZSB0aGlzLmtleXMuc2V0KCd0cmFuc2NyaXB0cycsIHBsYW5LZXkpO1xuICAgIGNvbnN0IGRpYW0gPSBweC5tYXAoKGQpID0+IGQgLyBweFBlclVuaXQpO1xuICAgIHRoaXMuZHJhd24gPSB7XG4gICAgICBraW5kOiBsb2FkZWQua2luZCA/PyBqb2Iua2luZCxcbiAgICAgIGJpbjogc2VsZWN0aW9uQmluID8geyBzaXplOiBzZWxlY3Rpb25CaW4sIG9yaWdpbjogbG9hZGVkLmNsdXN0ZXJlZD8ub3JpZ2luID8/IFswLCAwXSB9XG4gICAgICAgIDogKGxvYWRlZC5raW5kID8gbG9hZGVkLmJpbiA6IGpvYi5iaW4pLFxuICAgICAgbWVyZ2VkLCByYWRpdXM6IGRpYW0ubWFwKChkKSA9PiBkIC8gMiksXG4gICAgICBnZW5lczogWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXSwgcmVmOiBkYXRhc2V0LmltYWdlUmVmID8/IG51bGwsIGdyaWQ6IG51bGwsXG4gICAgICAuLi4oZW50cnlHcm91cCAmJiBncm91cE5hbWVzID8geyBlbnRyeUdyb3VwLCBncm91cE5hbWVzIH0gOiB7fSksXG4gICAgICAuLi4obG9hZGVkLmNsdXN0ZXJlZCA/IHsgZ3JvdXBHZW5lczogbG9hZGVkLmNsdXN0ZXJlZC5nZW5lcyB9IDoge30pLFxuICAgIH07XG4gICAgdGhpcy5ob3ZlckNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5taWNyb25zUGVyVW5pdCA9IGRhdGFzZXQubWljcm9uc1BlclVuaXQgPz8gbnVsbDtcbiAgICBjb25zdCB0eXBlQ29sdW1uID0gdGhpcy5jZWxsVHlwZUNvbHVtbk5hbWUoZGF0YXNldCwgdmlldyk7XG4gICAgdGhpcy5ob3ZlclR5cGVzID0gdHlwZUNvbHVtbiA/IGF3YWl0IHRoaXMuY2F0ZWdvcmljYWxDb2Rlcyh0eXBlQ29sdW1uKS5jYXRjaCgoKSA9PiBudWxsKSA6IG51bGw7XG4gICAgaWYgKHN0YWxlKCkpIHJldHVybjtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHBsYWNlOiBQbGFjZW1lbnQgPSB7IHNjYWxlOiByZWY/LnNjYWxlID8/IFsxLCAxXSwgdHJhbnNsYXRlOiByZWY/LnRyYW5zbGF0ZSA/PyBbMCwgMF0gfTtcbiAgICBpZiAobW9kZSA9PT0gJ2NpcmNsZXMnKSB7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRPdXRsaW5lJyk7XG4gICAgICB0aGlzLmRyYXdUcmFuc2NyaXB0Q2lyY2xlcyhtZXJnZWQsIGRpYW0sIGZhY2VzLnJnYmEsIHZpZXcsIHBsYWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3VHJhbnNjcmlwdEdseXBocyhtZXJnZWQsIGRpYW0sIGZhY2VzLCB2aWV3LCBwbGFjZSwgcHhQZXJVbml0KTtcbiAgICB9XG4gIH1cblxuICAvKiogT25lIHNpemVkIGNpcmNsZSBwZXIgZW50cnksIHRoZSBzaXplIHNheWluZyBob3cgbWFueSB0cmFuc2NyaXB0cyBpdCBzdGFuZHMgZm9yLiAqL1xuICBwcml2YXRlIGRyYXdUcmFuc2NyaXB0Q2lyY2xlcyhcbiAgICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSwgZGlhbTogRmxvYXQzMkFycmF5LCByZ2JhOiBSR0JBW10sIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgeyBzY2FsZSwgdHJhbnNsYXRlIH06IFBsYWNlbWVudCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQgKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICBwb3NpdGlvbnNbMiAqIGldID0gbWVyZ2VkLnhbaV07XG4gICAgICBwb3NpdGlvbnNbMiAqIGkgKyAxXSA9IG1lcmdlZC55W2ldO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMudmlld2VyIS5hZGRQb2ludHMocG9zaXRpb25zLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdHMnLFxuICAgICAgc2l6ZTogZGlhbSxcbiAgICAgIGZhY2VDb2xvcjogcmdiYSxcbiAgICAgIC8vIEEgZGFyayByaW06IGEgdHJhbnNjcmlwdCBjb2xvdXJlZCBieSBpdHMgY2VsbCdzIHR5cGUgaXMgb3RoZXJ3aXNlIHRoZSBzYW1lXG4gICAgICAvLyBjb2xvdXIgYXMgdGhlIGNlbGwgZmlsbCBpdCBzaXRzIG9uLCBhbmQgdmFuaXNoZXMgaW50byBpdC5cbiAgICAgIGJvcmRlckNvbG9yOiBbMC4wNCwgMC4wNCwgMC4wNSwgMC45XSxcbiAgICAgIGJvcmRlcldpZHRoOiAwLjE4ICogbWVkaWFuKGRpYW0pLFxuICAgICAgb3BhY2l0eTogdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICAgIHNjYWxlLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pO1xuICAgIHRoaXMucmVwbGFjZSgndHJhbnNjcmlwdHMnLCBsYXllcik7XG4gIH1cblxuICBwcml2YXRlIGRyYXdUcmFuc2NyaXB0R2x5cGhzKFxuICAgIG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlLCBkaWFtOiBGbG9hdDMyQXJyYXksIGZhY2VzOiBUcmFuc2NyaXB0RmFjZXMsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsXG4gICAgeyBzY2FsZSwgdHJhbnNsYXRlIH06IFBsYWNlbWVudCwgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIEdseXBoczogZWFjaCBlbnRyeSBiZWNvbWVzIGl0cyBnZW5lJ3MgaWNvbiBwb2x5Z29uLCBmaWxsZWQgdGhyb3VnaCBhIGRpc2NyZXRlXG4gICAgLy8gY29sb3JtYXAgYW5kIG91dGxpbmVkIGRhcmsgc28gc21hbGwgaWNvbnMgc3RheSByZWFkYWJsZSBvdmVyIHRoZSB0aXNzdWUuIFdpdGggZXZlcnlcbiAgICAvLyBnZW5lIGRyYXduIHRoZXJlIGlzIG9uZSBpY29uIGZvciBhbGwgb2YgdGhlbSDigJQgMTgsMDAwIHNoYXBlcyB3b3VsZCBzYXkgbm90aGluZy5cbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEdlbmVzO1xuICAgIGNvbnN0IGdseXBoRm9yID0gKHNsb3Q6IG51bWJlcik6IFRyYW5zY3JpcHRHbHlwaCA9PlxuICAgICAgKHZpZXcudHJhbnNjcmlwdEdseXBoc1tnZW5lc1tzbG90XV0gYXMgVHJhbnNjcmlwdEdseXBoIHwgdW5kZWZpbmVkKSA/PyBkZWZhdWx0R2x5cGhGb3Ioc2xvdCk7XG4gICAgY29uc3Qgc2luZ2xlID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gZ2x5cGhPdXRsaW5lKCh2aWV3LnRyYW5zY3JpcHRHbHlwaHNbQUxMX0dFTkVTXSBhcyBUcmFuc2NyaXB0R2x5cGggfCB1bmRlZmluZWQpID8/ICdjaXJjbGUnKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IG91dGxpbmVzID0gc2luZ2xlID8gW10gOiBnZW5lcy5tYXAoKF9nLCBzbG90KSA9PiBnbHlwaE91dGxpbmUoZ2x5cGhGb3Ioc2xvdCkpKTtcbiAgICBjb25zdCByYWRpdXMgPSBkaWFtLm1hcCgoZCkgPT4gZCAvIDIpO1xuICAgIGNvbnN0IHsgY29vcmRzLCBvZmZzZXRzIH0gPSBnbHlwaFJpbmdzKFxuICAgICAgbWVyZ2VkLngsIG1lcmdlZC55LCByYWRpdXMsIChpKSA9PiBzaW5nbGUgPz8gb3V0bGluZXNbbWVyZ2VkLmdlbmVbaV1dLFxuICAgICk7XG4gICAgY29uc3QgZmlsbCA9IHRoaXMudmlld2VyIS5hZGRTaGFwZXMoY29vcmRzLCBvZmZzZXRzLCB7XG4gICAgICBuYW1lOiAndHJhbnNjcmlwdHMnLFxuICAgICAgZHJhdzogJ2ZpbGwnLFxuICAgICAgdmFsdWVzOiBmYWNlcy52YWx1ZXMsXG4gICAgICBjb2xvcm1hcDogZmFjZXMuY29sb3JtYXAsXG4gICAgICBjb250cmFzdExpbWl0czogWzAsIDFdLFxuICAgICAgb3BhY2l0eTogdmlldy50cmFuc2NyaXB0T3BhY2l0eSxcbiAgICAgIHNjYWxlLFxuICAgICAgdHJhbnNsYXRlLFxuICAgIH0pO1xuICAgIHRoaXMucmVwbGFjZSgndHJhbnNjcmlwdHMnLCBmaWxsKTtcbiAgICAvLyBBIGRhcmsgcmltIGtlZXBzIGEgZmV3IGxhcmdlIGljb25zIHJlYWRhYmxlIG92ZXIgdGhlIHRpc3N1ZTsgb24gbWFueSBzbWFsbCBvbmVzIHRoZVxuICAgIC8vIHJpbXMgbWVyZ2UgaW50byBhIHNvbGlkIGRhcmsgc2hlZXQgdGhhdCBoaWRlcyBldmVyeSBjb2xvdXIsIHNvIHRoZXkgYXJlIGxlZnQgb2ZmLlxuICAgIGNvbnN0IG1lZGlhblB4ID0gbWVkaWFuKGRpYW0pICogcHhQZXJVbml0O1xuICAgIGlmIChtZXJnZWQuY291bnQgPiBHTFlQSF9PVVRMSU5FX01BWCB8fCBtZWRpYW5QeCA8IEdMWVBIX09VVExJTkVfTUlOX1BYKSB7XG4gICAgICB0aGlzLmRyb3AoJ3RyYW5zY3JpcHRPdXRsaW5lJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkZ2UgPSB0aGlzLnZpZXdlciEuYWRkU2hhcGVzKGNvb3Jkcywgb2Zmc2V0cywge1xuICAgICAgbmFtZTogJ3RyYW5zY3JpcHQgb3V0bGluZXMnLFxuICAgICAgZHJhdzogJ291dGxpbmUnLFxuICAgICAgY29sb3I6IFswLjA1LCAwLjA1LCAwLjA1LCAxXSxcbiAgICAgIG9wYWNpdHk6IE1hdGgubWluKDEsIHZpZXcudHJhbnNjcmlwdE9wYWNpdHkgKyAwLjEpLFxuICAgICAgc2NhbGUsXG4gICAgICB0cmFuc2xhdGUsXG4gICAgfSk7XG4gICAgdGhpcy5yZXBsYWNlKCd0cmFuc2NyaXB0T3V0bGluZScsIGVkZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGhvdmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgZHJhd246IERyYXduVHJhbnNjcmlwdHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3ZlclR5cGVzOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgbWV0YTogU3BhdGlhbENvbHVtblsnbWV0YSddIH0gfCBudWxsID0gbnVsbDtcbiAgLyoqIERldGFpbHMgYWxyZWFkeSBmZXRjaGVkLCBieSBob3ZlcmVkIGVudHJ5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGhvdmVyQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIHByaXZhdGUgaG92ZXJLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRvb2x0aXAgbGluZXMgZm9yIHRoZSB0cmFuc2NyaXB0IG1hcmtlciB1bmRlciB3b3JsZCBwb2ludCBgKHd4LCB3eSlgLCBvciBudWxsLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoYXQgaXMga25vd24gYXQgb25jZSAoZ2VuZSwgY291bnQsIGNlbGwgdHlwZSk7IGFueXRoaW5nIHRoYXQgbmVlZHMgdGhlXG4gICAqIHNlcnZlciDigJQgZGlzdGluY3QgZ2VuZXMgaW4gYSBncm91cCwgaXRzIHRvcCBnZW5lcyBhbmQgY2VsbHMsIHRoZSBjZWxsJ3MgZGlzcGxheSBpZCDigJRcbiAgICogYXJyaXZlcyB0aHJvdWdoIGBvbkRldGFpbHNgIG9uY2UgdGhlIHBvaW50ZXIgaGFzIHJlc3RlZCBvbiB0aGUgbWFya2VyIGJyaWVmbHkuXG4gICAqL1xuICBob3ZlckF0KFxuICAgIHd4OiBudW1iZXIsIHd5OiBudW1iZXIsIHJhZGl1c1dvcmxkOiBudW1iZXIsIG9uRGV0YWlsczogKGxpbmVzOiBzdHJpbmdbXSkgPT4gdm9pZCxcbiAgKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICBjb25zdCBkID0gdGhpcy5kcmF3bjtcbiAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzLmdldCgndHJhbnNjcmlwdHMnKTtcbiAgICBpZiAoIWQgfHwgIWxheWVyIHx8ICF0aGlzLnZpZXdlcj8ubGF5ZXJzLml0ZW1zLmluY2x1ZGVzKGxheWVyKSB8fCAhZC5tZXJnZWQuY291bnQpIHtcbiAgICAgIHRoaXMuaG92ZXJLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN4ID0gZC5yZWY/LnNjYWxlPy5bMF0gPz8gMTtcbiAgICBjb25zdCBzeSA9IGQucmVmPy5zY2FsZT8uWzFdID8/IDE7XG4gICAgY29uc3QgeCA9ICh3eCAtIChkLnJlZj8udHJhbnNsYXRlPy5bMF0gPz8gMCkpIC8gc3g7XG4gICAgY29uc3QgeSA9ICh3eSAtIChkLnJlZj8udHJhbnNsYXRlPy5bMV0gPz8gMCkpIC8gc3k7XG4gICAgY29uc3QgaSA9IHBpY2tOZWFyZXN0KGQsIHgsIHksIHJhZGl1c1dvcmxkIC8gTWF0aC5hYnMoc3gpKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuaG92ZXJLZXkgPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGAke2Qua2luZH18JHtkLm1lcmdlZC54W2ldfXwke2QubWVyZ2VkLnlbaV19fCR7ZC5tZXJnZWQuZ2VuZVtpXX1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaG92ZXJDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGlmIChrZXkgIT09IHRoaXMuaG92ZXJLZXkpIHtcbiAgICAgIHRoaXMuaG92ZXJLZXkgPSBrZXk7XG4gICAgICBpZiAodGhpcy5ob3ZlclRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVyKTtcbiAgICAgIHRoaXMuaG92ZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLmZldGNoRGV0YWlscyhkLCBpLCBrZXksIG9uRGV0YWlscyksIDE1MCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlc2NyaWJlKGQsIGksIG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERldGFpbHMoXG4gICAgZDogRHJhd25UcmFuc2NyaXB0cywgaTogbnVtYmVyLCBrZXk6IHN0cmluZywgb25EZXRhaWxzOiAobGluZXM6IHN0cmluZ1tdKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9ydC5nZXRUcmFuc2NyaXB0U3VtbWFyeSB8fCB0aGlzLmhvdmVyS2V5ICE9PSBrZXkpIHJldHVybjtcbiAgICBjb25zdCBvYnMgPSBkLm1lcmdlZC5vYnNlcnZhdGlvbltpXTtcbiAgICBjb25zdCBjZWxscyA9IG9icyA9PT0gTk9fT0JTRVJWQVRJT04gPyBbXSA6IFtvYnNdO1xuICAgIGxldCBib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICAgIGlmICgoZC5raW5kID09PSAnYmlucycgfHwgZC5raW5kID09PSAnZ2VuZXMnKSAmJiBkLmJpbikge1xuICAgICAgY29uc3QgeyBzaXplLCBvcmlnaW4gfSA9IGQuYmluO1xuICAgICAgY29uc3QgYnggPSBNYXRoLmZsb29yKChkLm1lcmdlZC54W2ldIC0gb3JpZ2luWzBdKSAvIHNpemUpO1xuICAgICAgY29uc3QgYnkgPSBNYXRoLmZsb29yKChkLm1lcmdlZC55W2ldIC0gb3JpZ2luWzFdKSAvIHNpemUpO1xuICAgICAgY29uc3QgeDAgPSBvcmlnaW5bMF0gKyBieCAqIHNpemU7XG4gICAgICBjb25zdCB5MCA9IG9yaWdpblsxXSArIGJ5ICogc2l6ZTtcbiAgICAgIGJveCA9IFt4MCwgeTAsIHgwICsgc2l6ZSwgeTAgKyBzaXplXTtcbiAgICB9IGVsc2UgaWYgKGQua2luZCA9PT0gJ2luZGl2aWR1YWwnKSB7XG4gICAgICBjb25zdCBlID0gMC4wMjtcbiAgICAgIGJveCA9IFtkLm1lcmdlZC54W2ldIC0gZSwgZC5tZXJnZWQueVtpXSAtIGUsIGQubWVyZ2VkLnhbaV0gKyBlLCBkLm1lcmdlZC55W2ldICsgZV07XG4gICAgfVxuICAgIGNvbnN0IGdlbmVzID0gZC5ncm91cEdlbmVzICYmIGQuZW50cnlHcm91cCA/IGQuZ3JvdXBHZW5lc1tkLmVudHJ5R3JvdXBbaV1dIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRTdW1tYXJ5KHsgYm94LCBjZWxscywgLi4uKGdlbmVzID8geyBnZW5lcyB9IDoge30pIH0pO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmRlc2NyaWJlKGQsIGksIHN1bW1hcnkpO1xuICAgICAgdGhpcy5ob3ZlckNhY2hlLnNldChrZXksIGxpbmVzKTtcbiAgICAgIGlmICh0aGlzLmhvdmVyS2V5ID09PSBrZXkpIG9uRGV0YWlscyhsaW5lcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHRyYW5zY3JpcHQgZGV0YWlscyB1bmF2YWlsYWJsZScsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSB0b29sdGlwIHRleHQgZm9yIGVudHJ5IGBpYCwgd2l0aCB0aGUgc2VydmVyJ3MgZGV0YWlscyB3aGVuIHRoZXkgaGF2ZSBhcnJpdmVkLiAqL1xuICBwcml2YXRlIGRlc2NyaWJlKGQ6IERyYXduVHJhbnNjcmlwdHMsIGk6IG51bWJlciwgczogU3BhdGlhbFRyYW5zY3JpcHRTdW1tYXJ5IHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0ID0gZC5tZXJnZWQ7XG4gICAgY29uc3QgbiA9IHQud2VpZ2h0W2ldO1xuICAgIGNvbnN0IG9icyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgY29uc3QgZm10ID0gKHY6IG51bWJlcikgPT4gdi50b0xvY2FsZVN0cmluZygpO1xuICAgIGNvbnN0IHR5cGVPZiA9IChvOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHR5cGVzID0gdGhpcy5ob3ZlclR5cGVzO1xuICAgICAgaWYgKCF0eXBlcyB8fCBvID09PSBOT19PQlNFUlZBVElPTiB8fCB0eXBlcy5tZXRhLmtpbmQgIT09ICdjYXRlZ29yaWNhbCcpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgYyA9IHR5cGVzLmNvZGVzW29dO1xuICAgICAgcmV0dXJuIGMgPT09IE5PX0NBVEVHT1JZID8gbnVsbCA6IHR5cGVzLm1ldGEuY2F0ZWdvcmllc1tjXSA/PyBudWxsO1xuICAgIH07XG4gICAgY29uc3QgY2VsbExpbmUgPSAobzogbnVtYmVyLCBwcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG8gPT09IE5PX09CU0VSVkFUSU9OKSByZXR1cm4gJ291dHNpZGUgYW55IGNlbGwnO1xuICAgICAgY29uc3QgaWQgPSBzPy5jZWxsSWRzPy5bb10gPz8gYCMke299YDtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlT2Yobyk7XG4gICAgICByZXR1cm4gYCR7cHJlZml4fSAke2lkfSR7dHlwZSA/IGAgwrcgJHt0eXBlfWAgOiAnJ31gO1xuICAgIH07XG5cbiAgICBpZiAoZC5raW5kID09PSAnYmlucycpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gW2Ake2ZtdChuKX0gdHJhbnNjcmlwdHMgwrcgYWxsIGdlbmVzYF07XG4gICAgICBpZiAoZC5iaW4pIGxpbmVzLnB1c2goYCR7ZC5iaW4uc2l6ZS50b0ZpeGVkKDEpfSDDlyAke2QuYmluLnNpemUudG9GaXhlZCgxKX0gwrVtIGFyZWFgKTtcbiAgICAgIGlmIChzPy50cmFuc2NyaXB0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7Zm10KHMuZ2VuZXMgPz8gMCl9IGRpc3RpbmN0IGdlbmVzIMK3ICR7Zm10KHMuY2VsbHMgPz8gMCl9IGNlbGwke3MuY2VsbHMgPT09IDEgPyAnJyA6ICdzJ31gXG4gICAgICAgICAgKyAocy51bmFzc2lnbmVkID8gYCDCtyAke2ZtdChzLnVuYXNzaWduZWQpfSBvdXRzaWRlIGNlbGxzYCA6ICcnKSk7XG4gICAgICAgIGlmIChzLnRvcEdlbmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGB0b3AgZ2VuZXM6ICR7cy50b3BHZW5lcy5zbGljZSgwLCA1KS5tYXAoKGcpID0+IGAke2cubmFtZX0gJHtmbXQoZy5jb3VudCl9YCkuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGluZXMucHVzaChjZWxsTGluZShvYnMsICdtb3N0bHkgY2VsbCcpKTtcbiAgICAgIGlmICghcyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFN1bW1hcnkpIGxpbmVzLnB1c2goJ2xvYWRpbmcgZGV0YWlsc+KApicpO1xuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICBpZiAoZC5raW5kID09PSAnaW5kaXZpZHVhbCcpIHtcbiAgICAgIGNvbnN0IGdlbmUgPSBzPy50b3BHZW5lcz8uWzBdPy5uYW1lO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgZ2VuZSA/IGAke2dlbmV9IHRyYW5zY3JpcHRgIDogJ1RyYW5zY3JpcHQnLFxuICAgICAgICBjZWxsTGluZShvYnMsICdpbiBjZWxsJyksXG4gICAgICAgIC4uLighcyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFN1bW1hcnkgPyBbJ2xvYWRpbmcgZGV0YWlsc+KApiddIDogW10pLFxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgZ2VuZSA9IGQuZ2VuZXNbdC5nZW5lW2ldXSA/PyAndHJhbnNjcmlwdCc7XG4gICAgaWYgKGQuYmluKSB7XG4gICAgICBjb25zdCB1bSA9IGQuYmluLnNpemUgKiAodGhpcy5taWNyb25zUGVyVW5pdCA/PyAxKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gZC5lbnRyeUdyb3VwICYmIGQuZ3JvdXBOYW1lcyA/IGQuZ3JvdXBOYW1lc1tkLmVudHJ5R3JvdXBbaV1dIDogZ2VuZTtcbiAgICAgIGNvbnN0IHRvcCA9IHM/LnRvcEdlbmVzPy5sZW5ndGhcbiAgICAgICAgPyBbcy50b3BHZW5lcy5zbGljZSgwLCA2KS5tYXAoKGcpID0+IGAke2cubmFtZX0gJHtmbXQoZy5jb3VudCl9YCkuam9pbignLCAnKV0gOiBbXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGAke2dyb3VwfSDCtyAke2ZtdChuKX0gdHJhbnNjcmlwdCR7biA9PT0gMSA/ICcnIDogJ3MnfWAsXG4gICAgICAgIC4uLihkLmdyb3VwR2VuZXMgPyB0b3AgOiBncm91cCAhPT0gZ2VuZSA/IFtgbW9zdGx5ICR7Z2VuZX1gXSA6IFtdKSxcbiAgICAgICAgYCR7dW0udG9GaXhlZCgxKX0gw5cgJHt1bS50b0ZpeGVkKDEpfSDCtW0gYXJlYSDCtyB6b29tIGluIHRvIHNwbGl0YCxcbiAgICAgICAgLi4uKG9icyA9PT0gTk9fT0JTRVJWQVRJT04gJiYgZC5ncm91cEdlbmVzID8gW10gOiBbY2VsbExpbmUob2JzLCAnbW9zdGx5IGNlbGwnKV0pLFxuICAgICAgICAuLi4oIXMgJiYgZC5ncm91cEdlbmVzICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0U3VtbWFyeSA/IFsnbG9hZGluZyBkZXRhaWxz4oCmJ10gOiBbXSksXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gbiA+IDFcbiAgICAgID8gW2Ake2dlbmV9IMK3ICR7Zm10KG4pfSB0cmFuc2NyaXB0c2AsICdncm91cGVkOiB6b29tIGluIHRvIHNwbGl0JywgY2VsbExpbmUob2JzLCAnbmVhciBjZWxsJyldXG4gICAgICA6IFtgJHtnZW5lfSB0cmFuc2NyaXB0YCwgY2VsbExpbmUob2JzLCAnaW4gY2VsbCcpXTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBtYXJrZXIgc2l6ZSBuZWVkcyDCtW07IG51bGwgd2hlbiB0aGUgZGF0YXNldCdzIHVuaXQgaXMgdW5rbm93bi4gKi9cbiAgcHJpdmF0ZSBweFBlck1pY3JvbihkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgcHhQZXJVbml0OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBkYXRhc2V0Lm1pY3JvbnNQZXJVbml0ID8gcHhQZXJVbml0IC8gZGF0YXNldC5taWNyb25zUGVyVW5pdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2hvc2VuIGdlbmVzLCBhdCB0aGUgbGV2ZWwgdGhlIHpvb20gY2FsbHMgZm9yIOKAlCBvciBjb2Fyc2VyLCB3aGlsZSB0aGUgbWFya2VycyBpblxuICAgKiB2aWV3IHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lSm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCByZWN0OiBEYXRhUmVjdCwgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2IgfCBudWxsIHtcbiAgICBjb25zdCBtZXRhID0gZGF0YXNldC50cmFuc2NyaXB0VGlsZXM7XG4gICAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRHZW5lcztcbiAgICBpZiAoIW1ldGEgfHwgIWdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZmlyc3QgPSB0cmFuc2NyaXB0TGV2ZWxGb3IocHhQZXJVbml0LCBtZXRhLmxldmVscyk7XG4gICAgY29uc3Qga2V5c0F0ID0gKGw6IG51bWJlcikgPT4gdGlsZXNJblJlY3QocmVjdCwgbCwgbWV0YS5sZXZlbHMsIG1ldGEuYm91bmRzLCBNQVhfVFJBTlNDUklQVF9USUxFUyk7XG4gICAgY29uc3QgcXVlcnkgPSB7IGdlbmVzLCBxdWFsaXR5OiB2aWV3LnRyYW5zY3JpcHRRdWFsaXR5IH07XG4gICAgY29uc3QgcHhQZXJNaWNyb24gPSB0aGlzLnB4UGVyTWljcm9uKGRhdGFzZXQsIHB4UGVyVW5pdCk7XG4gICAgY29uc3QgbXggPSAocmVjdC54MSAtIHJlY3QueDApICogMC4yNTtcbiAgICBjb25zdCBteSA9IChyZWN0LnkxIC0gcmVjdC55MCkgKiAwLjI1O1xuICAgIGNvbnN0IGFyb3VuZDogRGF0YVJlY3QgPSB7IHgwOiByZWN0LngwIC0gbXgsIHkwOiByZWN0LnkwIC0gbXksIHgxOiByZWN0LngxICsgbXgsIHkxOiByZWN0LnkxICsgbXkgfTtcbiAgICAvLyBab29tZWQgb3V0LCBlYWNoIGdlbmUncyB0cmFuc2NyaXB0cyBhcmUgZ3JvdXBlZCBvbiB0aGUgYWxsLWdlbmUgcHlyYW1pZCdzIGJpbiBsYWRkZXIsXG4gICAgLy8gc28gYSBnZW5lIHNlbGVjdGlvbiByZWFkcyBsaWtlIFwiYWxsIGdlbmVzXCIgZG9lczogb25lIG1hcmtlciBwZXIgZ2VuZSBwZXIgYXJlYSwgc2l6ZWRcbiAgICAvLyBieSBob3cgbWFueSBpdCBob2xkczsgem9vbWVkIGluIGZhciBlbm91Z2gsIGV2ZXJ5IHRyYW5zY3JpcHQgaXMgaXRzIG93biBtYXJrZXIuXG4gICAgY29uc3QgbGFkZGVyID0gZGF0YXNldC50cmFuc2NyaXB0Qmlucz8ubGV2ZWxzO1xuICAgIGNvbnN0IGJhc2VCaW4gPSBsYWRkZXI/LlswXT8uYmluU2l6ZVxuICAgICAgPz8gKGRhdGFzZXQubWljcm9uc1BlclVuaXQgPyBQWVJBTUlEX0JBU0VfQklOX1VNIC8gZGF0YXNldC5taWNyb25zUGVyVW5pdCA6IDApO1xuICAgIGNvbnN0IGJpbiA9IGdlbmVCaW5TaXplKHB4UGVyVW5pdCwgYmFzZUJpbiwgbGFkZGVyPy5sZW5ndGggPz8gUFlSQU1JRF9MRVZFTFMpO1xuICAgIC8vIFpvb21lZCBvdXQgdG8gYmlucyBhcyB3aWRlIGFzIHRoZSBkZW5zaXR5IGdyaWQsIGEgc2VsZWN0aW9uIGlzIGRyYXduIGZyb20gdGhlIHBlci1nZW5lXG4gICAgLy8gZGVuc2l0eSBncmlkcyDigJQgb25lIGNhY2hlZCByZXF1ZXN0IHBlciBjbHVzdGVyIOKAlCByYXRoZXIgdGhhbiAxMHgncyBjb2Fyc2UgcGVyLWdlbmVcbiAgICAvLyB0aWxlcywgd2hpY2ggdGFrZSBtaW51dGVzIGZvciBhIGZldyBodW5kcmVkIGdlbmVzLlxuICAgIC8vIFdpdGggdGhlIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHMsIGV2ZXJ5IHpvb20gb2YgYSBzZWxlY3Rpb24gcmVhZHMgdGhlbTogdGhlIGxldmVsIHRoZVxuICAgIC8vIHpvb20gY2FsbHMgZm9yLCBjb2Fyc2VyIHdoaWxlIHRoZSBtYXJrZXJzIHdvdWxkIGV4Y2VlZCB0aGUgbWF4LlxuICAgIC8vIEJvdGggYXJlIGJ1aWx0IGZyb20gaGlnaC1xdWFsaXR5IGNhbGxzIG9ubHk6IHdpdGggbG93LXF1YWxpdHkgY2FsbHMgaW5jbHVkZWQsIHRoZVxuICAgIC8vIHF1YWxpdHktYXdhcmUgdGlsZXMgYmVsb3cgc2VydmUgZXZlcnkgem9vbSAoYXMgbG9uZyBhcyB0aGVyZSBhcmUgdGlsZXMgdG8gc2VydmUpLlxuICAgIGNvbnN0IGhpZ2hPbmx5ID0gdmlldy50cmFuc2NyaXB0UXVhbGl0eSAhPT0gJ2FsbCcgfHwgIXRoaXMucG9ydC5nZXRUcmFuc2NyaXB0VGlsZTtcbiAgICBjb25zdCBnZW5lQmlucyA9IGRhdGFzZXQudHJhbnNjcmlwdEdlbmVCaW5zO1xuICAgIGNvbnN0IGZyb21HZW5lQmlucyA9IGhpZ2hPbmx5ICYmIGdlbmVCaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0R2VuZUJpbnM7XG4gICAgaWYgKGZyb21HZW5lQmlucyAmJiAoYmluICE9PSBudWxsIHx8ICF0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdFRpbGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lQmluc0pvYihkYXRhc2V0LCB2aWV3LCBhcm91bmQsIGdlbmVCaW5zLCBiaW4gPz8gZ2VuZUJpbnMubGV2ZWxzWzBdLmJpblNpemUsIG14LCBteSwgcmVjdCk7XG4gICAgfVxuICAgIGNvbnN0IGdyaWQgPSBkYXRhc2V0LmRlbnNpdHk/LmdyaWRTaXplWzBdID8/IDA7XG4gICAgaWYgKGhpZ2hPbmx5ICYmIGJpbiAhPT0gbnVsbCAmJiBncmlkID4gMCAmJiB0aGlzLnBvcnQuZ2V0RGVuc2l0eSAmJiBiaW4gPj0gZ3JpZCAqIDAuNzUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsdXN0ZXJEZW5zaXR5Sm9iKGRhdGFzZXQsIHZpZXcsIGFyb3VuZCwgcHhQZXJVbml0LCBNYXRoLm1heChiaW4sIGdyaWQpLCBteCwgbXksIHJlY3QpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2dlbmVzJyxcbiAgICAgIC8vIFRoZSBjbGlwIHdpbmRvdywgaW4gcXVhcnRlci12aWV3IHN0ZXBzOiBhIHBhbiBwYXN0IHRoZSBtYXJnaW4gcmUtY2xpcHMuXG4gICAgICBrZXk6IGBnZW5lc3wke2dlbmVzLmpvaW4oJywnKX18JHt2aWV3LnRyYW5zY3JpcHRRdWFsaXR5fXwke3ZpZXcudHJhbnNjcmlwdEJ1ZGdldH18JHtiaW4gPz8gJ2VhY2gnfXxgXG4gICAgICAgICsgYCR7TWF0aC5mbG9vcihyZWN0LngwIC8gKG14IHx8IDEpKX0sJHtNYXRoLmZsb29yKHJlY3QueTAgLyAobXkgfHwgMSkpfXwke2tleXNBdChmaXJzdCkubWFwKHRpbGVJZCl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gVGhlIHpvb20ncyBvd24gbGV2ZWwgb25seTogb3ZlciB0aGUgYnVkZ2V0LCB0aGUgdHJhbnNjcmlwdHMgYXJlIGNvbWJpbmVkIGludG9cbiAgICAgICAgLy8gbGFyZ2VyIG1hcmtlcnMgKGdyb3VwU2VsZWN0aW9uKSwgbmV2ZXIgZmV0Y2hlZCBmcm9tIHNsb3dlciBjb2Fyc2UgbGV2ZWxzLlxuICAgICAgICBjb25zdCB0aWxlcyA9IGF3YWl0IHRoaXMuZmV0Y2hBbGwoa2V5c0F0KGZpcnN0KSxcbiAgICAgICAgICAoaykgPT4gdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRUaWxlIShrLmxldmVsLCBrLmd4LCBrLmd5LCBxdWVyeSkpO1xuICAgICAgICAvLyBPbmx5IHdoYXQgaXMgb24gc2NyZWVuIChhbmQgYSBtYXJnaW4sIHNvIGEgc21hbGwgcGFuIG5lZWRzIG5vdGhpbmcgbmV3KSBjb3VudHNcbiAgICAgICAgLy8gYWdhaW5zdCB0aGUgYnVkZ2V0IGFuZCB0aGUgY2FwOyBhIHRpbGUgcmVhY2hlcyBmYXIgcGFzdCB0aGUgdmlldy5cbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXMubWFwKCh0KSA9PiBjbGlwVHJhbnNjcmlwdHModCwgYXJvdW5kKSksIE1BWF9UUkFOU0NSSVBUUyk7XG4gICAgICAgIGNvbnN0IHB4ID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgcHhbaV0gPSB0cmFuc2NyaXB0TWFya2VyUHgobWVyZ2VkLndlaWdodFtpXSwgdmlldy50cmFuc2NyaXB0U2NhbGUsIHB4UGVyTWljcm9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZUJpbiA+IDBcbiAgICAgICAgICA/IHsgbWVyZ2VkLCBweCwgbGFkZGVyOiB7IGJhc2VCaW4sIGxldmVsczogbGFkZGVyPy5sZW5ndGggPz8gUFlSQU1JRF9MRVZFTFMsIHN0YXJ0OiBiaW4gfSB9XG4gICAgICAgICAgOiB7IG1lcmdlZCwgcHggfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGdlbmUgc2VsZWN0aW9uIGZyb20gdGhlIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHM6IHN0YXJ0aW5nIGF0IHRoZSBsZXZlbCB3aG9zZSBiaW5zIGFyZVxuICAgKiBgc3RhcnRCaW5gLCBmZXRjaCB0aGUgdmlldydzIHRpbGVzIGZvciB0aGUgc2VsZWN0ZWQgZ2VuZXMgYW5kIHN0ZXAgdG8gYSBjb2Fyc2VyIGxldmVsIHdoaWxlXG4gICAqIG9uZSBtYXJrZXIgcGVyIGNsdXN0ZXIgcGVyIGJpbiB3b3VsZCBleGNlZWQgdGhlIG1heC4gSGlkZGVuIGdlbmVzIGFyZSBmZXRjaGVkIHRvbyAodGhlaXJcbiAgICogY291bnRzIGluIHZpZXcgc3RpbGwgc2hvdykgYW5kIGRyb3BwZWQgYmVmb3JlIGRyYXdpbmc7IGdyb3VwaW5nIGJ5IGNsdXN0ZXIgaGFwcGVucyB0aGVyZS5cbiAgICovXG4gIHByaXZhdGUgZ2VuZUJpbnNKb2IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGFyb3VuZDogRGF0YVJlY3QsXG4gICAgbWV0YTogTm9uTnVsbGFibGU8U3BhdGlhbERhdGFzZXRbJ3RyYW5zY3JpcHRHZW5lQmlucyddPiwgc3RhcnRCaW46IG51bWJlciwgbXg6IG51bWJlciwgbXk6IG51bWJlciwgcmVjdDogRGF0YVJlY3QsXG4gICk6IFRyYW5zY3JpcHRKb2Ige1xuICAgIGNvbnN0IGdlbmVzID0gdmlldy50cmFuc2NyaXB0R2VuZXM7XG4gICAgY29uc3QgbGV2ZWxzID0gbWV0YS5sZXZlbHM7XG4gICAgbGV0IGZpcnN0ID0gbGV2ZWxzLmZpbmRJbmRleCgobCkgPT4gbC5iaW5TaXplID49IHN0YXJ0QmluICogMC45OTkpO1xuICAgIGlmIChmaXJzdCA8IDApIGZpcnN0ID0gbGV2ZWxzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgYnVkZ2V0ID0gTWF0aC5tYXgoMSwgdmlldy50cmFuc2NyaXB0QnVkZ2V0KTtcbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgICBjb25zdCBjbHVzdGVycyA9IHRoaXMuc2VsZWN0aW9uQ2x1c3RlcnModmlldyk7XG4gICAgY29uc3QgY2x1c3Rlck9mID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBjbHVzdGVycy5mb3JFYWNoKChjLCBjaSkgPT4gYy5nZW5lcy5mb3JFYWNoKChnKSA9PiBjbHVzdGVyT2Yuc2V0KGdlbmVzLmluZGV4T2YoZyksIGNpKSkpO1xuICAgIGNvbnN0IGtleXNBdCA9IChtOiBudW1iZXIpID0+IHRpbGVzSW5SZWN0RnJvbShtZXRhLm9yaWdpbiwgYXJvdW5kLCBtLFxuICAgICAgbGV2ZWxzLm1hcCgobCkgPT4gKHsgdGlsZVNpemU6IGwudGlsZVNpemUgfSkpLCBudWxsLCBNQVhfQklOX1RJTEVTKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2dlbmVzJyxcbiAgICAgIGtleTogYGdlbmUtYmluc3wke2dlbmVzLmpvaW4oJywnKX18JHtidWRnZXR9fCR7Zmlyc3R9fCR7SlNPTi5zdHJpbmdpZnkodmlldy50cmFuc2NyaXB0R2VuZUdyb3Vwcyl9fGBcbiAgICAgICAgKyBgJHtNYXRoLmZsb29yKHJlY3QueDAgLyAobXggfHwgMSkpfSwke01hdGguZmxvb3IocmVjdC55MCAvIChteSB8fCAxKSl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG0gPSBmaXJzdDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHRpbGVzID0gYXdhaXQgdGhpcy5mZXRjaEFsbChrZXlzQXQobSksXG4gICAgICAgICAgICAoaykgPT4gdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRHZW5lQmlucyEoay5sZXZlbCwgay5neCwgay5neSwgZ2VuZXMpKTtcbiAgICAgICAgICBjb25zdCBjbGlwcGVkID0gdGlsZXMubWFwKCh0KSA9PiBjbGlwVHJhbnNjcmlwdHModCwgYXJvdW5kKSk7XG4gICAgICAgICAgLy8gUGFzdCB0aGUgY2FwIGEgbWVyZ2Ugd291bGQgZHJvcCB3aG9sZSBnZW5lcyAodGhlIHRhaWwgb2YgZXZlcnkgdGlsZSk6IGdvIGNvYXJzZXIuXG4gICAgICAgICAgaWYgKGNsaXBwZWQucmVkdWNlKChuLCB0KSA9PiBuICsgdC5jb3VudCwgMCkgPiBNQVhfVFJBTlNDUklQVFMgJiYgbSA8IGxldmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBtKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VUcmFuc2NyaXB0VGlsZXMoY2xpcHBlZCwgTUFYX1RSQU5TQ1JJUFRTKTtcbiAgICAgICAgICAvLyBNYXJrZXJzIHRoaXMgbGV2ZWwgd291bGQgZHJhdzogb25lIHBlciAodmlzaWJsZSBjbHVzdGVyLCBiaW4pLlxuICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBjb25zdCBiaW4gPSBsZXZlbHNbbV0uYmluU2l6ZTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGlkZGVuLmhhcyhnZW5lc1ttZXJnZWQuZ2VuZVtpXV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjbHVzdGVyT2YuZ2V0KG1lcmdlZC5nZW5lW2ldKTtcbiAgICAgICAgICAgIGlmIChjID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYCR7Y318JHtNYXRoLmZsb29yKG1lcmdlZC54W2ldIC8gYmluKX18JHtNYXRoLmZsb29yKG1lcmdlZC55W2ldIC8gYmluKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4uc2l6ZSA8PSBidWRnZXQgfHwgbSA+PSBsZXZlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVyZ2VkLCBweDogbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpLCBsYWRkZXI6IHsgYmFzZUJpbjogYmluLCBsZXZlbHM6IDEsIHN0YXJ0OiBiaW4gfSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBtKys7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0aW9uJ3MgY2x1c3RlcnM6IGVhY2ggZ2VuZS10cmVlIGdyb3VwJ3MgdmlzaWJsZSBnZW5lcywgdGhlbiBlYWNoIHVuZ3JvdXBlZCBnZW5lLiAqL1xuICBwcml2YXRlIHNlbGVjdGlvbkNsdXN0ZXJzKHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUpOiB7IG5hbWU6IHN0cmluZzsgZ2VuZXM6IHN0cmluZ1tdOyBzbG90OiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgICBjb25zdCBzbG90cyA9IG5ldyBNYXAodmlldy50cmFuc2NyaXB0R2VuZXMubWFwKChnLCBpKSA9PiBbZywgaV0pKTtcbiAgICBjb25zdCB0YWtlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG91dDogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXTsgc2xvdDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZyBvZiB2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzKSB7XG4gICAgICBjb25zdCBnZW5lcyA9IGcuZ2VuZXMuZmlsdGVyKCh4KSA9PiBzbG90cy5oYXMoeCkgJiYgIWhpZGRlbi5oYXMoeCkgJiYgIXRha2VuLmhhcyh4KSk7XG4gICAgICBnZW5lcy5mb3JFYWNoKCh4KSA9PiB0YWtlbi5hZGQoeCkpO1xuICAgICAgaWYgKGdlbmVzLmxlbmd0aCkgb3V0LnB1c2goeyBuYW1lOiBnLm5hbWUsIGdlbmVzLCBzbG90OiBzbG90cy5nZXQoZ2VuZXNbMF0pISB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBnZW5lIG9mIHZpZXcudHJhbnNjcmlwdEdlbmVzKSB7XG4gICAgICBpZiAoIXRha2VuLmhhcyhnZW5lKSAmJiAhaGlkZGVuLmhhcyhnZW5lKSkgb3V0LnB1c2goeyBuYW1lOiBnZW5lLCBnZW5lczogW2dlbmVdLCBzbG90OiBzbG90cy5nZXQoZ2VuZSkhIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1nZW5lIGRlbnNpdHkgZ3JpZHMgc3VtbWVkIGZvciBgZ2VuZXNgLCBjYWNoZWQgKGEgY2x1c3RlciBpcyBhc2tlZCBmb3Igb25jZSBwZXIgYmluKS5cbiAgICogS2V5ZWQgYnkgZGF0YXNldCB0b286IHRoaXMgbWFuYWdlciBvdXRsaXZlcyBhIGRhdGFzZXQsIGFuZCBhbm90aGVyIG1heSBzaGFyZSBnZW5lIG5hbWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBkZW5zaXR5Rm9yKGRhdGFzZXQ6IHN0cmluZywgZ2VuZXM6IHN0cmluZ1tdLCBiaW46IG51bWJlcik6IFByb21pc2U8U3BhdGlhbERlbnNpdHlSYXN0ZXI+IHtcbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0fXwke2Jpbn18JHtnZW5lcy5qb2luKCcsJyl9YDtcbiAgICBsZXQgcCA9IHRoaXMuZGVuc2l0eUNhY2hlLmdldChrZXkpO1xuICAgIGlmICghcCkge1xuICAgICAgcCA9IHRoaXMucG9ydC5nZXREZW5zaXR5IShnZW5lcywgYmluKTtcbiAgICAgIHAuY2F0Y2goKCkgPT4gdGhpcy5kZW5zaXR5Q2FjaGUuZGVsZXRlKGtleSkpO1xuICAgICAgdGhpcy5kZW5zaXR5Q2FjaGUuc2V0KGtleSwgcCk7XG4gICAgICBpZiAodGhpcy5kZW5zaXR5Q2FjaGUuc2l6ZSA+IDI1NikgdGhpcy5kZW5zaXR5Q2FjaGUuZGVsZXRlKHRoaXMuZGVuc2l0eUNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUhKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbnNpdHlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPj4oKTtcblxuICAvKipcbiAgICogQSBnZW5lIHNlbGVjdGlvbiB6b29tZWQgb3V0OiBvbmUgbWFya2VyIHBlciBjbHVzdGVyIHBlciBiaW4sIGZyb20gdGhlIHBlci1nZW5lIGRlbnNpdHlcbiAgICogZ3JpZHMuIFRoZSBiaW4gc3RhcnRzIHdoZXJlIG1hcmtlcnMgYXJlIDE0IHB4IGFwYXJ0IGFuZCBkb3VibGVzIHVudGlsIHRoZSBtYXJrZXJzIGZpdCB0aGVcbiAgICogbWF4OyBlYWNoIG1hcmtlciBzaXRzIGF0IHRoZSBjb3VudC13ZWlnaHRlZCBjZW50cmUgb2YgdGhlIGZpbmVyIGdyaWQgaW5zaWRlIGl0LCBzbyBtYXJrZXJzXG4gICAqIGZvbGxvdyB0aGUgdGlzc3VlIHJhdGhlciB0aGFuIGEgbGF0dGljZS5cbiAgICovXG4gIHByaXZhdGUgY2x1c3RlckRlbnNpdHlKb2IoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIGFyb3VuZDogRGF0YVJlY3QsIHB4UGVyVW5pdDogbnVtYmVyLCBzdGFydEJpbjogbnVtYmVyLFxuICAgIG14OiBudW1iZXIsIG15OiBudW1iZXIsIHJlY3Q6IERhdGFSZWN0LFxuICApOiBUcmFuc2NyaXB0Sm9iIHtcbiAgICBjb25zdCBncmlkID0gZGF0YXNldC5kZW5zaXR5IS5ncmlkU2l6ZVswXTtcbiAgICBjb25zdCBjbHVzdGVycyA9IHRoaXMuc2VsZWN0aW9uQ2x1c3RlcnModmlldyk7XG4gICAgbGV0IGZpcnN0ID0gZ3JpZDtcbiAgICB3aGlsZSAoZmlyc3QgPCBzdGFydEJpbiAqIDAuOTk5KSBmaXJzdCAqPSAyO1xuICAgIGNvbnN0IGJ1ZGdldCA9IE1hdGgubWF4KDEsIHZpZXcudHJhbnNjcmlwdEJ1ZGdldCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdnZW5lcycsXG4gICAgICBrZXk6IGBjbHVzdGVyc3wke2NsdXN0ZXJzLm1hcCgoYykgPT4gYCR7Yy5uYW1lfToke2MuZ2VuZXMuam9pbignKycpfWApLmpvaW4oJzsnKX18JHtidWRnZXR9fCR7Zmlyc3R9fGBcbiAgICAgICAgKyBgJHtNYXRoLmZsb29yKHJlY3QueDAgLyAobXggfHwgMSkpfSwke01hdGguZmxvb3IocmVjdC55MCAvIChteSB8fCAxKSl9YCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGJpbiA9IGZpcnN0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgLy8gVGhlIGZpbmVyIGdyaWQgZ2l2ZXMgZWFjaCBtYXJrZXIgaXRzIGNlbnRyZTsgdGhlIHNlcnZlciBiaW5zIDEsIDIsIDQgb3IgOCBjZWxscy5cbiAgICAgICAgICBjb25zdCBmaW5lID0gTWF0aC5taW4oYmluID49IGdyaWQgKiAyID8gYmluIC8gMiA6IGJpbiwgZ3JpZCAqIDgpO1xuICAgICAgICAgIGNvbnN0IHJhc3RlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChjbHVzdGVycy5tYXAoKGMpID0+IHRoaXMuZGVuc2l0eUZvcihkYXRhc2V0LmlkLCBjLmdlbmVzLCBmaW5lKSkpO1xuICAgICAgICAgIGNvbnN0IG91dCA9IGNsdXN0ZXJNYXJrZXJzKHJhc3RlcnMsIGNsdXN0ZXJzLm1hcCgoYykgPT4gYy5zbG90KSwgYmluLCBhcm91bmQpO1xuICAgICAgICAgIGlmIChvdXQudGlsZS5jb3VudCA8PSBidWRnZXQgfHwgYmluID49IGdyaWQgKiAyICoqIDEyKSB7XG4gICAgICAgICAgICBjb25zdCByZWZDb3VudCA9IHF1YW50aWxlT2Yob3V0LnRpbGUud2VpZ2h0LCAwLjk1KTtcbiAgICAgICAgICAgIGNvbnN0IGJpblB4ID0gYmluICogcHhQZXJVbml0O1xuICAgICAgICAgICAgY29uc3QgcHggPSBuZXcgRmxvYXQzMkFycmF5KG91dC50aWxlLmNvdW50KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0LnRpbGUuY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBweFtpXSA9IGdyb3VwZWRNYXJrZXJQeChvdXQudGlsZS53ZWlnaHRbaV0sIHJlZkNvdW50LCBiaW5QeCwgdmlldy50cmFuc2NyaXB0U2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVyZ2VkOiBvdXQudGlsZSwgcHgsIGtpbmQ6ICdnZW5lcycsXG4gICAgICAgICAgICAgIGNsdXN0ZXJlZDoge1xuICAgICAgICAgICAgICAgIGdyb3VwOiBvdXQuZ3JvdXAsIG5hbWVzOiBjbHVzdGVycy5tYXAoKGMpID0+IGMubmFtZSksIGdlbmVzOiBjbHVzdGVycy5tYXAoKGMpID0+IGMuZ2VuZXMpLCBiaW4sXG4gICAgICAgICAgICAgICAgb3JpZ2luOiByYXN0ZXJzWzBdPy5tZXRhLm9yaWdpbiA/PyBbMCwgMF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaW4gKj0gMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGdlbmU6IHRoZSB0cmFuc2NyaXB0cyB0aGVtc2VsdmVzIG9uY2UgdGhleSBmaXQgdGhlIGJ1ZGdldCwgZWxzZSBiaW5zIG9mIHRoZVxuICAgKiBhbGwtZ2VuZSBweXJhbWlkIHNpemVkIGJ5IGhvdyBtYW55IHRyYW5zY3JpcHRzIGVhY2ggaG9sZHMuXG4gICAqL1xuICBwcml2YXRlIGFsbEdlbmVzSm9iKFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCByZWN0OiBEYXRhUmVjdCwgcHhQZXJVbml0OiBudW1iZXIsXG4gICk6IFRyYW5zY3JpcHRKb2IgfCBudWxsIHtcbiAgICBjb25zdCBiaW5zID0gZGF0YXNldC50cmFuc2NyaXB0QmlucztcbiAgICBjb25zdCB0aWxlcyA9IGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzO1xuICAgIGNvbnN0IGJvdW5kcyA9IGJpbnM/LmJvdW5kcyA/PyB0aWxlcz8uYm91bmRzO1xuICAgIGlmICghYm91bmRzKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwbGFuID0gYWxsR2VuZXNQbGFuKHtcbiAgICAgIHJlY3QsIGJvdW5kcywgcHhQZXJVbml0LCBidWRnZXQ6IHZpZXcudHJhbnNjcmlwdEJ1ZGdldCxcbiAgICAgIHRvdGFsOiBiaW5zPy5jb3VudCA/PyB0aWxlcz8uY291bnQgPz8gMCxcbiAgICAgIGxldmVsczogYmlucyAmJiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMgPyBiaW5zLmxldmVscyA6IFtdLFxuICAgICAgY2FuSW5kaXZpZHVhbDogISF0aWxlcyxcbiAgICB9KTtcblxuICAgIGlmIChwbGFuLmtpbmQgPT09ICdpbmRpdmlkdWFsJyAmJiB0aWxlcykge1xuICAgICAgY29uc3Qga2V5cyA9IHRpbGVzSW5SZWN0KHJlY3QsIDAsIHRpbGVzLmxldmVscywgdGlsZXMuYm91bmRzLCBNQVhfVFJBTlNDUklQVF9USUxFUyk7XG4gICAgICAvLyBFYWNoIHRpbGUgY2xpcHBlZCB0byB0aGUgdmlldywgcm91bmRlZCBvdXR3YXJkIHRvIDEwIHVuaXRzIHNvIHNtYWxsIHBhbnMgaGl0IGNhY2hlLlxuICAgICAgY29uc3QgcjEwID0gKHY6IG51bWJlciwgdXA6IGJvb2xlYW4pID0+ICh1cCA/IE1hdGguY2VpbCh2IC8gMTApIDogTWF0aC5mbG9vcih2IC8gMTApKSAqIDEwO1xuICAgICAgY29uc3Qgc2l6ZSA9IHRpbGVzLmxldmVsc1swXS50aWxlU2l6ZTtcbiAgICAgIGNvbnN0IGJveGVzID0ga2V5cy5tYXAoKGspOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiBbXG4gICAgICAgIE1hdGgubWF4KGsuZ3ggKiBzaXplLCByMTAocmVjdC54MCwgZmFsc2UpKSwgTWF0aC5tYXgoay5neSAqIHNpemUsIHIxMChyZWN0LnkwLCBmYWxzZSkpLFxuICAgICAgICBNYXRoLm1pbigoay5neCArIDEpICogc2l6ZSwgcjEwKHJlY3QueDEsIHRydWUpKSwgTWF0aC5taW4oKGsuZ3kgKyAxKSAqIHNpemUsIHIxMChyZWN0LnkxLCB0cnVlKSksXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHB4UGVyTWljcm9uID0gdGhpcy5weFBlck1pY3JvbihkYXRhc2V0LCBweFBlclVuaXQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2luZGl2aWR1YWwnLFxuICAgICAgICBrZXk6IGBhbGx8aW5kaXZpZHVhbHwke3ZpZXcudHJhbnNjcmlwdEJ1ZGdldH18JHtib3hlcy5tYXAoKGIpID0+IGIuam9pbignLCcpKS5qb2luKCc7Jyl9YCxcbiAgICAgICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvdCA9IGF3YWl0IHRoaXMuZmV0Y2hBbGwoa2V5cy5tYXAoKGssIGkpID0+ICh7IC4uLmssIGJveDogYm94ZXNbaV0gfSkpLFxuICAgICAgICAgICAgKGspID0+IHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0VGlsZSEoMCwgay5neCwgay5neSwgeyBnZW5lczogW0FMTF9HRU5FU10sIGJveDogay5ib3ggfSkpO1xuICAgICAgICAgIC8vIFRoZSBwbGFuIGVzdGltYXRlZCB0aGUgdmlldyBmcm9tIHRoZSBkYXRhc2V0J3MgYXZlcmFnZSBkZW5zaXR5OyBleHByZXNzaW9uIGlzXG4gICAgICAgICAgLy8gdW5ldmVuLCBzbyBhIGRlbnNlIHZpZXcgY2FuIGhvbGQgZmFyIG1vcmUuIFJhdGhlciB0aGFuIGN1dCB0aGUgZXhjZXNzIG9mZiwgc2hvd1xuICAgICAgICAgIC8vIGl0IGdyb3VwZWQg4oCUIHRoZSBiaW4gbGV2ZWwgdGhlIHBsYW5uZXIgd291bGQgcGljayBpZiBpdCBoYWQga25vd24uXG4gICAgICAgICAgY29uc3QgY2FwID0gTWF0aC5tYXgodmlldy50cmFuc2NyaXB0QnVkZ2V0ICogMS41LCAxKTtcbiAgICAgICAgICBjb25zdCBsb2FkZWQgPSBnb3QucmVkdWNlKChuLCB0KSA9PiBuICsgdC5jb3VudCwgMCk7XG4gICAgICAgICAgaWYgKGxvYWRlZCA+IGNhcCAmJiBiaW5zICYmIHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0Qmlucykge1xuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBhbGxHZW5lc1BsYW4oe1xuICAgICAgICAgICAgICByZWN0LCBib3VuZHMsIHB4UGVyVW5pdCwgYnVkZ2V0OiB2aWV3LnRyYW5zY3JpcHRCdWRnZXQsIHRvdGFsOiBiaW5zLmNvdW50LFxuICAgICAgICAgICAgICBsZXZlbHM6IGJpbnMubGV2ZWxzLCBjYW5JbmRpdmlkdWFsOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZhbGxiYWNrLmtpbmQgPT09ICdiaW5zJykge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSB0aGlzLmJpbnNKb2IodmlldywgcmVjdCwgcHhQZXJVbml0LCBib3VuZHMsIGJpbnMsIGZhbGxiYWNrLmxldmVsKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IGpvYi5sb2FkKCkpLCBraW5kOiBqb2Iua2luZCwgYmluOiBqb2IuYmluIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlVHJhbnNjcmlwdFRpbGVzKGdvdCwgY2FwKTtcbiAgICAgICAgICBjb25zdCBweCA9IG5ldyBGbG9hdDMyQXJyYXkobWVyZ2VkLmNvdW50KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSBweFtpXSA9IHRyYW5zY3JpcHRNYXJrZXJQeCgxLCB2aWV3LnRyYW5zY3JpcHRTY2FsZSwgcHhQZXJNaWNyb24pO1xuICAgICAgICAgIHJldHVybiB7IG1lcmdlZCwgcHggfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHBsYW4ua2luZCA9PT0gJ2JpbnMnICYmIGJpbnMgJiYgdGhpcy5wb3J0LmdldFRyYW5zY3JpcHRCaW5zKSB7XG4gICAgICByZXR1cm4gdGhpcy5iaW5zSm9iKHZpZXcsIHJlY3QsIHB4UGVyVW5pdCwgYm91bmRzLCBiaW5zLCBwbGFuLmxldmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQmlucyBvZiB0aGUgYWxsLWdlbmUgcHlyYW1pZCBhdCBgbGV2ZWxgLCBzaXplZCBieSBob3cgbWFueSB0cmFuc2NyaXB0cyBlYWNoIGhvbGRzLiAqL1xuICBwcml2YXRlIGJpbnNKb2IoXG4gICAgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgcmVjdDogRGF0YVJlY3QsIHB4UGVyVW5pdDogbnVtYmVyLCBib3VuZHM6IFNwYXRpYWxCb3VuZHMsXG4gICAgYmluczogTm9uTnVsbGFibGU8U3BhdGlhbERhdGFzZXRbJ3RyYW5zY3JpcHRCaW5zJ10+LCBsZXZlbDogbnVtYmVyLFxuICApOiBUcmFuc2NyaXB0Sm9iIHtcbiAgICBjb25zdCBsdiA9IGJpbnMubGV2ZWxzW2xldmVsXTtcbiAgICBjb25zdCBrZXlzID0gdGlsZXNJblJlY3RGcm9tKGJpbnMub3JpZ2luLCByZWN0LCBsZXZlbCxcbiAgICAgIGJpbnMubGV2ZWxzLm1hcCgobCkgPT4gKHsgdGlsZVNpemU6IGwudGlsZVNpemUgfSkpLCBib3VuZHMsIE1BWF9CSU5fVElMRVMpO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnYmlucycsXG4gICAgICBiaW46IHsgc2l6ZTogbHYuYmluU2l6ZSwgb3JpZ2luOiBiaW5zLm9yaWdpbiB9LFxuICAgICAga2V5OiBgYWxsfGJpbnN8JHtsZXZlbH18JHt2aWV3LnRyYW5zY3JpcHRCdWRnZXR9fCR7a2V5cy5tYXAodGlsZUlkKX1gLFxuICAgICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBnb3QgPSBhd2FpdCB0aGlzLmZldGNoQWxsKGtleXMsIChrKSA9PiB0aGlzLnBvcnQuZ2V0VHJhbnNjcmlwdEJpbnMhKGsubGV2ZWwsIGsuZ3gsIGsuZ3kpKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VUcmFuc2NyaXB0VGlsZXMoZ290LCBNYXRoLm1heCh2aWV3LnRyYW5zY3JpcHRCdWRnZXQgKiAxLjUsIDEpKTtcbiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBxdWFudGlsZU9mKG1lcmdlZC53ZWlnaHQsIDAuOTUpO1xuICAgICAgICBjb25zdCBiaW5QeCA9IGx2LmJpblNpemUgKiBweFBlclVuaXQ7XG4gICAgICAgIGNvbnN0IHB4ID0gbmV3IEZsb2F0MzJBcnJheShtZXJnZWQuY291bnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lcmdlZC5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgcHhbaV0gPSBncm91cGVkTWFya2VyUHgobWVyZ2VkLndlaWdodFtpXSwgcmVmQ291bnQsIGJpblB4LCB2aWV3LnRyYW5zY3JpcHRTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWVyZ2VkLCBweCB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFBlci1lbnRyeSBjb2xvdXJzIGJvdGggYXMgUkdCQSAocG9pbnRzKSBhbmQgYXMgY29sb3JtYXAgdmFsdWVzIChnbHlwaCBzaGFwZXMpLiAqL1xuICBwcml2YXRlIGFzeW5jIHRyYW5zY3JpcHRDb2xvcnMoXG4gICAgZGF0YXNldDogU3BhdGlhbERhdGFzZXQsIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUsIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgICBjbHVzdGVyT2Y/OiAoaTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsLFxuICApOiBQcm9taXNlPFRyYW5zY3JpcHRGYWNlcz4ge1xuICAgIGxldCByZ2I6IFJnYltdO1xuICAgIGxldCBjb2RlT2Y6IChpOiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBpZiAodmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NsdXN0ZXInICYmIGNsdXN0ZXJPZikge1xuICAgICAgLy8gQSBjbHVzdGVyIG5hbWVkIGxpa2UgYSBncm91cCBvZiB0aGUgY2VsbHMnIGdyb3VwaW5nIHRha2VzIHRoYXQgZ3JvdXAncyBjb2xvdXIsIHNvIGFcbiAgICAgIC8vIGNsdXN0ZXIncyB0cmFuc2NyaXB0cyBhbmQgaXRzIGNlbGxzIGFncmVlOyBhbnkgb3RoZXIgY2x1c3RlciB0YWtlcyBhIHBhbGV0dGUgY29sb3VyLlxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5jYXRlZ29yaWNhbENvZGVzKG5hbWUpLmNhdGNoKCgpID0+IG51bGwpIDogbnVsbDtcbiAgICAgIGNvbnN0IGNlbGxDb2xvciA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBpZiAoY29kZXM/Lm1ldGEua2luZCA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29kZXMubWV0YSk7XG4gICAgICAgIGNvZGVzLm1ldGEuY2F0ZWdvcmllcy5mb3JFYWNoKChjLCBrKSA9PiBjZWxsQ29sb3Iuc2V0KGMsIGNvbG9yc1trXSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sb3JzID0gY2x1c3RlckNvbG9yTWFwKHZpZXcudHJhbnNjcmlwdEdlbmVzLCB2aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzLCBjZWxsQ29sb3IsXG4gICAgICAgIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURSk7XG4gICAgICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBjb25zdCBoZXg6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBjb2RlRm9yID0gKGNsdXN0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgayA9IGluZGV4LmdldChjbHVzdGVyKTtcbiAgICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGsgPSBoZXgubGVuZ3RoO1xuICAgICAgICAgIGluZGV4LnNldChjbHVzdGVyLCBrKTtcbiAgICAgICAgICBoZXgucHVzaChjb2xvcnMuZ2V0KGNsdXN0ZXIpID8/IGNlbGxDb2xvci5nZXQoY2x1c3RlcikgPz8gREVGQVVMVF9DQVRFR09SSUNBTF9QQUxFVFRFWzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaztcbiAgICAgIH07XG4gICAgICBjb25zdCBjb2RlID0gbmV3IEludDMyQXJyYXkodC5jb3VudCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gY2x1c3Rlck9mKGkpO1xuICAgICAgICBjb2RlW2ldID0gYyA9PT0gbnVsbCA/IC0xIDogY29kZUZvcihjKTtcbiAgICAgIH1cbiAgICAgIHJnYiA9IGhleC5tYXAocGFyc2VIZXgpO1xuICAgICAgY29kZU9mID0gKGkpID0+IGNvZGVbaV07XG4gICAgfSBlbHNlIGlmICh2aWV3LnRyYW5zY3JpcHRDb2xvckJ5ID09PSAnZ2VuZScgfHwgdmlldy50cmFuc2NyaXB0Q29sb3JCeSA9PT0gJ2NsdXN0ZXInKSB7XG4gICAgICAvLyBBbGwgZ2VuZXM6IGNvZGVzIGFyZSB0aGUgZGF0YXNldCdzIGdlbmUgaW5kaWNlcywgZm9sZGVkIG9udG8gdGhlIHBhbGV0dGUuXG4gICAgICBjb25zdCBuID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXMgPyBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEUubGVuZ3RoIDogdmlldy50cmFuc2NyaXB0R2VuZXMubGVuZ3RoO1xuICAgICAgcmdiID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoX2csIGkpID0+IHBhcnNlSGV4KFxuICAgICAgICAoIXZpZXcudHJhbnNjcmlwdEFsbEdlbmVzICYmIHZpZXcudHJhbnNjcmlwdEdlbmVDb2xvcnNbdmlldy50cmFuc2NyaXB0R2VuZXNbaV1dKVxuICAgICAgICB8fCBERUZBVUxUX0NBVEVHT1JJQ0FMX1BBTEVUVEVbaSAlIERFRkFVTFRfQ0FURUdPUklDQUxfUEFMRVRURS5sZW5ndGhdKSk7XG4gICAgICBjb2RlT2YgPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyA/IChpKSA9PiB0LmdlbmVbaV0gJSBuIDogKGkpID0+IHQuZ2VuZVtpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2VsbFR5cGVDb2x1bW5OYW1lKGRhdGFzZXQsIHZpZXcpO1xuICAgICAgY29uc3QgY29kZXMgPSBuYW1lID8gYXdhaXQgdGhpcy5jYXRlZ29yaWNhbENvZGVzKG5hbWUpIDogbnVsbDtcbiAgICAgIHJnYiA9IGNvZGVzPy5tZXRhLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgPyByZXNvbHZlQ2F0ZWdvcnlDb2xvcnMoY29kZXMubWV0YSkubWFwKHBhcnNlSGV4KSA6IFtdO1xuICAgICAgY29kZU9mID0gKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICAgIGlmICghY29kZXMgfHwgbyA9PT0gTk9fT0JTRVJWQVRJT04pIHJldHVybiAtMTtcbiAgICAgICAgY29uc3QgYyA9IGNvZGVzLmNvZGVzW29dO1xuICAgICAgICByZXR1cm4gYyA9PT0gTk9fQ0FURUdPUlkgPyAtMSA6IGM7XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7IHN0b3BzLCB2YWx1ZU9mIH0gPSBkaXNjcmV0ZUNvbG9ybWFwU3RvcHMocmdiLCBNSVNTSU5HX0NPTE9SKTtcbiAgICBjb25zdCByZ2JhOiBSR0JBW10gPSBuZXcgQXJyYXkodC5jb3VudCk7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh0LmNvdW50KTtcbiAgICBjb25zdCB0dXBsZXM6IFJHQkFbXSA9IHJnYi5tYXAoKFtyLCBnLCBiXSkgPT4gW3IgLyAyNTUsIGcgLyAyNTUsIGIgLyAyNTUsIDFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGNvZGVPZihpKTtcbiAgICAgIHJnYmFbaV0gPSBjIDwgMCA/IFVOQVNTSUdORURfUkdCQSA6IHR1cGxlc1tjXTtcbiAgICAgIHZhbHVlc1tpXSA9IHZhbHVlT2YoYyk7XG4gICAgfVxuICAgIHJldHVybiB7IHJnYmEsIHZhbHVlcywgY29sb3JtYXA6IG5ldyBDb2xvcm1hcCgndHJhbnNjcmlwdC1jYXRlZ29yaWVzJywgc3RvcHMpIH07XG4gIH1cblxuICAvLyDilIDilIAgZGVuc2l0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGFzeW5jIHBsYW5EZW5zaXR5KFxuICAgIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LCB2aWV3OiBTcGF0aWFsVmlld1N0YXRlLCBzdGFsZTogKCkgPT4gYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGlkZGVuR2VuZXMgPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgICBjb25zdCBnZW5lcyA9IHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzXG4gICAgICA/IFtBTExfR0VORVNdXG4gICAgICA6IHZpZXcudHJhbnNjcmlwdEdlbmVzLmZpbHRlcigoZykgPT4gIWhpZGRlbkdlbmVzLmhhcyhnKSk7XG4gICAgaWYgKCFkYXRhc2V0LmRlbnNpdHkgfHwgIXRoaXMucG9ydC5nZXREZW5zaXR5IHx8IHZpZXcudHJhbnNjcmlwdE1vZGUgIT09ICdkZW5zaXR5JyB8fCAhZ2VuZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRyb3AoJ2RlbnNpdHknKTtcbiAgICAgIHRoaXMuZGVuc2l0eVN0YXRzID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbHV0ID0gbHV0Rm9yKHZpZXcuZGVuc2l0eUNvbG9ybWFwID8/IElORkVSTk9fU0NBTEUpO1xuICAgIGNvbnN0IGtleSA9IFtkYXRhc2V0LmlkLCBnZW5lcy5qb2luKCcsJyksIHZpZXcuZGVuc2l0eUJpbiwgdmlldy5kZW5zaXR5T3BhY2l0eSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZpZXcuZGVuc2l0eVJhbmdlKSwgSlNPTi5zdHJpbmdpZnkodmlldy5kZW5zaXR5Q29sb3JtYXApXS5qb2luKCd8Jyk7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5rZXlzLmdldCgnZGVuc2l0eScpICYmIHRoaXMubGF5ZXJzLmhhcygnZGVuc2l0eScpKSByZXR1cm47XG4gICAgY29uc3QgcmFzdGVyID0gYXdhaXQgdGhpcy50cmFjaygnVHJhbnNjcmlwdCBkZW5zaXR5JywgdGhpcy5wb3J0LmdldERlbnNpdHkoZ2VuZXMsIHZpZXcuZGVuc2l0eUJpbikpO1xuICAgIGlmIChzdGFsZSgpKSByZXR1cm47XG5cbiAgICAvLyBCaW5zIGRyYXduIGFzIHNxdWFyZXMsIGFzIFhlbml1bSBFeHBsb3JlciBkb2VzOyB0aGUgd2luZG93IGlzIGluIHRyYW5zY3JpcHRzL8K1bcKyLlxuICAgIGNvbnN0IG1ldGEgPSByYXN0ZXIubWV0YTtcbiAgICBjb25zdCBhcmVhID0gbWV0YS5ncmlkU2l6ZVswXSAqIG1ldGEuZ3JpZFNpemVbMV07XG4gICAgY29uc3QgcGVyQXJlYSA9IHJhc3Rlci52YWx1ZXMubWFwKCh2KSA9PiB2IC8gYXJlYSk7XG4gICAgY29uc3QgW2xvLCBoaV0gPSB2aWV3LmRlbnNpdHlSYW5nZSA/PyBkZW5zaXR5QXV0b1JhbmdlKHBlckFyZWEpO1xuICAgIHRoaXMuZGVuc2l0eVN0YXRzID0geyBsbywgaGksIG1heDogcGVyQXJlYS5yZWR1Y2UoKG0sIHYpID0+ICh2ID4gbSA/IHYgOiBtKSwgMCkgfTtcbiAgICBjb25zdCByZ2JhID0gY29sb3JEZW5zaXR5V2luZG93KHBlckFyZWEsIGx1dCwgdmlldy5kZW5zaXR5T3BhY2l0eSwgbG8sIGhpKTtcbiAgICBjb25zdCByZWYgPSBkYXRhc2V0LmltYWdlUmVmO1xuICAgIGNvbnN0IHN4ID0gcmVmPy5zY2FsZT8uWzBdID8/IDE7XG4gICAgY29uc3Qgc3kgPSByZWY/LnNjYWxlPy5bMV0gPz8gMTtcbiAgICBjb25zdCBsYXllcjogSW1hZ2VMYXllciA9IHRoaXMudmlld2VyIS5hZGRJbWFnZShcbiAgICAgIHsga2luZDogJ3R5cGVkJywgd2lkdGg6IG1ldGEuY29scywgaGVpZ2h0OiBtZXRhLnJvd3MsIGNoYW5uZWxzOiA0LCBkdHlwZTogJ3VpbnQ4JywgZGF0YTogcmdiYSB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBgZGVuc2l0eSDCtyAke3ZpZXcudHJhbnNjcmlwdEFsbEdlbmVzID8gJ2FsbCBnZW5lcycgOiBnZW5lcy5qb2luKCcsICcpfWAsXG4gICAgICAgIHNjYWxlOiBbbWV0YS5ncmlkU2l6ZVswXSAqIHN4LCBtZXRhLmdyaWRTaXplWzFdICogc3ldLFxuICAgICAgICB0cmFuc2xhdGU6IFtcbiAgICAgICAgICBtZXRhLm9yaWdpblswXSAqIHN4ICsgKHJlZj8udHJhbnNsYXRlPy5bMF0gPz8gMCksXG4gICAgICAgICAgbWV0YS5vcmlnaW5bMV0gKiBzeSArIChyZWY/LnRyYW5zbGF0ZT8uWzFdID8/IDApLFxuICAgICAgICBdLFxuICAgICAgICBibGVuZGluZzogJ3RyYW5zbHVjZW50JyxcbiAgICAgICAgaW50ZXJwb2xhdGlvbjogJ25lYXJlc3QnLFxuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMua2V5cy5zZXQoJ2RlbnNpdHknLCBrZXkpO1xuICAgIHRoaXMucmVwbGFjZSgnZGVuc2l0eScsIGxheWVyKTtcbiAgICB0aGlzLmhvc3QuZGVuc2l0eUNoYW5nZWQ/Lih0aGlzLmRlbnNpdHlTdGF0cyk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50c0NhY2hlOiB7IGtleTogc3RyaW5nOyBjb3VudHM6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+IH0gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVHJhbnNjcmlwdHMgaW4gdmlldyBmb3IgdGhlIHZpc2libGUgZ2VuZXM6IGVhY2ggZ2VuZSdzIGRhdGFzZXQgdG90YWwgdGltZXMgdGhlIHNoYXJlXG4gICAqIG9mIHRoZSB0aXNzdWUgb24gc2NyZWVuLiBBbiBlc3RpbWF0ZSDigJQgZXhwcmVzc2lvbiBpcyBub3QgdW5pZm9ybSDigJQgd2hpY2ggaXMgYWxzbyB3aGF0XG4gICAqIFhlbml1bSBFeHBsb3JlciBzaG93czsgaXQgdGVsbHMgdGhlIHVzZXIgd2hldGhlciB0aGUgYnVkZ2V0IHdpbGwgZm9yY2UgZ3JvdXBpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBsYW5Fc3RpbWF0ZShcbiAgICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCwgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSwgdmlld2VyOiBWaWV3ZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIHN0YWxlOiAoKSA9PiBib29sZWFuLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aWxlcyA9IGRhdGFzZXQudHJhbnNjcmlwdFRpbGVzO1xuICAgIGlmICghdGlsZXMgfHwgIXRoaXMucG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzIHx8IHZpZXcudHJhbnNjcmlwdE1vZGUgPT09ICdvZmYnKSB7XG4gICAgICB0aGlzLmhvc3QuZXN0aW1hdGVDaGFuZ2VkPy4obnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhpZGRlbkdlbmVzID0gbmV3IFNldCh2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcyk7XG4gICAgY29uc3QgZ2VuZXMgPSB2aWV3LnRyYW5zY3JpcHRBbGxHZW5lcyA/IFtdIDogdmlldy50cmFuc2NyaXB0R2VuZXMuZmlsdGVyKChnKSA9PiAhaGlkZGVuR2VuZXMuaGFzKGcpKTtcbiAgICBjb25zdCBrZXkgPSBgJHtkYXRhc2V0LmlkfXwke2dlbmVzLmpvaW4oJywnKX1gO1xuICAgIGlmICh0aGlzLmNvdW50c0NhY2hlPy5rZXkgIT09IGtleSkge1xuICAgICAgdGhpcy5jb3VudHNDYWNoZSA9IHsga2V5LCBjb3VudHM6IHRoaXMucG9ydC5nZXRUcmFuc2NyaXB0Q291bnRzKGdlbmVzKSB9O1xuICAgIH1cbiAgICBsZXQgY291bnRzOiBTcGF0aWFsVHJhbnNjcmlwdENvdW50cztcbiAgICB0cnkge1xuICAgICAgY291bnRzID0gYXdhaXQgdGhpcy5jb3VudHNDYWNoZS5jb3VudHM7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmNvdW50c0NhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YWxlKCkpIHJldHVybjtcbiAgICBjb25zdCBpblZpZXcgPSB2aXNpYmxlRGF0YVJlY3Qodmlld2VyLmNhbWVyYS5jZW50ZXIsIHZpZXdlci5jYW1lcmEuem9vbSwgdywgaCwgZGF0YXNldC5pbWFnZVJlZiwgMCk7XG4gICAgaWYgKCFpblZpZXcpIHJldHVybjtcbiAgICBjb25zdCBiID0gY291bnRzLmJvdW5kcztcbiAgICBjb25zdCBzaGFyZSA9IE1hdGgubWluKDEsIHZpc2libGVBcmVhKGluVmlldywgYikgLyBNYXRoLm1heCgxLCAoYlsyXSAtIGJbMF0pICogKGJbM10gLSBiWzFdKSkpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdmlldy50cmFuc2NyaXB0QWxsR2VuZXNcbiAgICAgID8gY291bnRzLnRvdGFsXG4gICAgICA6IGdlbmVzLnJlZHVjZSgoc3VtLCBnKSA9PiBzdW0gKyAoY291bnRzLmNvdW50c1tnXSA/PyAwKSwgMCk7XG4gICAgdGhpcy5ob3N0LmVzdGltYXRlQ2hhbmdlZD8uKHsgcG9pbnRzOiBNYXRoLnJvdW5kKHNlbGVjdGVkICogc2hhcmUpLCBtYXg6IHZpZXcudHJhbnNjcmlwdEJ1ZGdldCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgZGVuc2l0eSB3aW5kb3cgaW4gdXNlIGFuZCB0aGUgZGVuc2VzdCBiaW4sIGZvciB0aGUgcGFuZWwncyB0aHJlc2hvbGQgY29udHJvbC4gKi9cbiAgZGVuc2l0eVN0YXRzOiB7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyDilIDilIAgbGF5ZXIgYm9va2tlZXBpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZldGNoIGV2ZXJ5IHRpbGUsIGRyYXdpbmcgd2hhdCBhcnJpdmVkLiBBIGZhaWx1cmUgZG9lcyBub3QgZmFpbCB0aGUgdmlldywgYnV0IGl0IG1hcmtzIHRoZVxuICAgKiBwbGFuIGluY29tcGxldGU6IHRoZSBjYWxsZXIgbXVzdCBub3QgY2FjaGUgaXQgYXMgZG9uZSwgYW5kIGBwbGFuKClgIHJldHJpZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQWxsPEssIFQ+KGtleXM6IEtbXSwgbG9hZDogKGs6IEspID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2V5cy5tYXAobG9hZCkpO1xuICAgIGNvbnN0IG91dDogVFtdID0gW107XG4gICAgZm9yIChjb25zdCBzIG9mIHNldHRsZWQpIHtcbiAgICAgIGlmIChzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIG91dC5wdXNoKHMudmFsdWUpO1xuICAgICAgZWxzZSBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIHNwYXRpYWwgdGlsZSBmYWlsZWQnLCBzLnJlYXNvbik7XG4gICAgfVxuICAgIGlmIChvdXQubGVuZ3RoIDwga2V5cy5sZW5ndGgpIHRoaXMucGxhbkluY29tcGxldGUgPSB0cnVlO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEgc2hhcGVzIGxheWVyIGluIHBsYWNlIGZvciBgZ3JvdXBgOiBhIGdlb21ldHJ5IGNoYW5nZSBidWlsZHMgYSBuZXcgbGF5ZXIsIGFcbiAgICogY29sb3VyLW9ubHkgY2hhbmdlIG11dGF0ZXMgdmFsdWVzL2NvbG9ybWFwIG9uIHRoZSBleGlzdGluZyBvbmUuXG4gICAqL1xuICBwcml2YXRlIHVwc2VydFNoYXBlcyhcbiAgICBncm91cDogR3JvdXAsIHdhbnRlZDogYm9vbGVhbiwgZ2VvbWV0cnlDaGFuZ2VkOiBib29sZWFuLCByaW5nczogU3BhdGlhbFBvbHlnb25zLFxuICAgIG9wdHM6IFBhcmFtZXRlcnM8Vmlld2VyWydhZGRTaGFwZXMnXT5bMl0gJiBvYmplY3QsXG4gICk6IHZvaWQge1xuICAgIGlmICghd2FudGVkKSB7XG4gICAgICB0aGlzLmRyb3AoZ3JvdXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubGF5ZXJzLmdldChncm91cCkgYXMgU2hhcGVzTGF5ZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nICYmICFnZW9tZXRyeUNoYW5nZWQgJiYgdGhpcy52aWV3ZXIhLmxheWVycy5pdGVtcy5pbmNsdWRlcyhleGlzdGluZykpIHtcbiAgICAgIC8vIEZsYXQgY29sb3VyIGhhcyBubyB2YWx1ZXM7IGNsZWFyaW5nIHRoZW0gaXMgd2hhdCBzd2l0Y2hlcyB0aGUgbGF5ZXIgdG8gYGNvbG9yYC5cbiAgICAgIGV4aXN0aW5nLnZhbHVlcyA9IG9wdHMudmFsdWVzID8/IG51bGw7XG4gICAgICBpZiAob3B0cy5jb2xvcm1hcCkgZXhpc3RpbmcuY29sb3JtYXAgPSBvcHRzLmNvbG9ybWFwO1xuICAgICAgaWYgKG9wdHMuY29udHJhc3RMaW1pdHMpIGV4aXN0aW5nLmNvbnRyYXN0TGltaXRzID0gb3B0cy5jb250cmFzdExpbWl0cztcbiAgICAgIGlmIChvcHRzLmNvbG9yKSBleGlzdGluZy5jb2xvciA9IG9wdHMuY29sb3I7XG4gICAgICBpZiAob3B0cy5vcGFjaXR5ICE9PSB1bmRlZmluZWQpIGV4aXN0aW5nLm9wYWNpdHkgPSBvcHRzLm9wYWNpdHk7XG4gICAgICB0aGlzLnZpZXdlciEucmVxdWVzdFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMudmlld2VyIS5hZGRTaGFwZXMocmluZ3MuY29vcmRzLCByaW5ncy5vZmZzZXRzLCBvcHRzKTtcbiAgICB0aGlzLnJlcGxhY2UoZ3JvdXAsIGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGBsYXllcmAgYXMgYGdyb3VwYCdzIGxheWVyIGFuZCByZXN0b3JlIHRoZSBvcmRlciBvZiB0aGUgZ3JvdXBzIGFib3ZlIGl0LlxuICAgKiBUaGUgbGF5ZXIgd2FzIGp1c3QgYWRkZWQgYnkgdGhlIGNhbGxlciAoc28gaXQgaXMgb24gdG9wKTsgZ3JvdXBzIHRoYXQgYmVsb25nIGFib3ZlXG4gICAqIGl0IGFyZSByZW1vdmVkIGFuZCByZS1hZGRlZC5cbiAgICovXG4gIHByaXZhdGUgcmVwbGFjZShncm91cDogR3JvdXAsIGxheWVyOiBMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlciE7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5sYXllcnMuZ2V0KGdyb3VwKTtcbiAgICBpZiAob2xkICYmIG9sZCAhPT0gbGF5ZXIgJiYgdi5sYXllcnMuaXRlbXMuaW5jbHVkZXMob2xkKSkgdi5sYXllcnMucmVtb3ZlKG9sZCk7XG4gICAgdGhpcy5sYXllcnMuc2V0KGdyb3VwLCBsYXllcik7XG4gICAgZm9yIChjb25zdCBnIG9mIE9SREVSLnNsaWNlKE9SREVSLmluZGV4T2YoZ3JvdXApICsgMSkpIHtcbiAgICAgIGNvbnN0IGFib3ZlID0gdGhpcy5sYXllcnMuZ2V0KGcpO1xuICAgICAgaWYgKCFhYm92ZSB8fCAhdi5sYXllcnMuaXRlbXMuaW5jbHVkZXMoYWJvdmUpKSBjb250aW51ZTtcbiAgICAgIHYubGF5ZXJzLnJlbW92ZShhYm92ZSk7XG4gICAgICB2LmxheWVycy5hZGQoYWJvdmUpO1xuICAgIH1cbiAgICB2LnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJvcChncm91cDogR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzLmdldChncm91cCk7XG4gICAgaWYgKGxheWVyICYmIHRoaXMudmlld2VyPy5sYXllcnMuaXRlbXMuaW5jbHVkZXMobGF5ZXIpKSB0aGlzLnZpZXdlci5sYXllcnMucmVtb3ZlKGxheWVyKTtcbiAgICB0aGlzLmxheWVycy5kZWxldGUoZ3JvdXApO1xuICAgIHRoaXMua2V5cy5kZWxldGUoZ3JvdXApO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wQ2VsbHMoKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wKCdjZWxsRmlsbCcpO1xuICAgIHRoaXMuZHJvcCgnY2VsbE91dGxpbmUnKTtcbiAgICB0aGlzLmRyb3AoJ251Y2xldXNPdXRsaW5lJyk7XG4gICAgdGhpcy5jdXJyZW50TnVjbGVpID0gbnVsbDtcbiAgICB0aGlzLmNlbGxHZW9tZXRyeUtleSA9IG51bGw7XG4gICAgdGhpcy5jZWxsU3R5bGVLZXkgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFJpbmdzID0gbnVsbDtcbiAgICB0aGlzLnNldFBvbHlnb25zU2hvd24oZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb2x5Z29uc1Nob3duKHNob3duOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHNob3duID09PSB0aGlzLnBvbHlnb25zU2hvd24pIHJldHVybjtcbiAgICB0aGlzLnBvbHlnb25zU2hvd24gPSBzaG93bjtcbiAgICB0aGlzLmhvc3QucG9seWdvbnNTaG93bkNoYW5nZWQoc2hvd24pO1xuICB9XG59XG5cbi8qKiBXaGF0IHRoZSB0cmFuc2NyaXB0IGxheWVyIGN1cnJlbnRseSBzaG93cyDigJQgd2hhdCBob3ZlcmluZyBuZWVkcyB0byBuYW1lIGEgbWFya2VyLiAqL1xuaW50ZXJmYWNlIERyYXduVHJhbnNjcmlwdHMge1xuICBraW5kOiBUcmFuc2NyaXB0Sm9iWydraW5kJ107XG4gIGJpbj86IFRyYW5zY3JpcHRKb2JbJ2JpbiddO1xuICBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTtcbiAgLyoqIE1hcmtlciByYWRpdXMgcGVyIGVudHJ5LCBpbiBvYnNlcnZhdGlvbiB1bml0cy4gKi9cbiAgcmFkaXVzOiBGbG9hdDMyQXJyYXk7XG4gIGdlbmVzOiBzdHJpbmdbXTtcbiAgcmVmOiBTcGF0aWFsSW1hZ2VSZWYgfCBudWxsO1xuICAvKiogRm9yIGEgZ3JvdXBlZCBnZW5lIHNlbGVjdGlvbjogZWFjaCBlbnRyeSdzIGdyb3VwLCBhbmQgdGhlIGdyb3VwcycgbmFtZXMuICovXG4gIGVudHJ5R3JvdXA/OiBJbnQzMkFycmF5O1xuICBncm91cE5hbWVzPzogc3RyaW5nW107XG4gIC8qKiBFYWNoIGdyb3VwJ3MgZ2VuZXMsIHdoZW4gdGhlIG1hcmtlcnMgY2FtZSBmcm9tIHRoZSBkZW5zaXR5IGdyaWRzIChmb3IgdGhlIGhvdmVyKS4gKi9cbiAgZ3JvdXBHZW5lcz86IHN0cmluZ1tdW107XG4gIC8qKiBMYXppbHkgYnVpbHQgc3BhdGlhbCBpbmRleDogYnVja2V0IOKGkiBlbnRyeSBpbmRpY2VzLiAqL1xuICBncmlkOiB7IHNpemU6IG51bWJlcjsgYnVja2V0czogTWFwPG51bWJlciwgbnVtYmVyW10+IH0gfCBudWxsO1xufVxuXG4vKiogSW5kZXggb2YgdGhlIGVudHJ5IHVuZGVyIGAoeCwgeSlgIOKAlCB3aXRoaW4gaXRzIG93biByYWRpdXMgb3IgYHRvbGVyYW5jZWAg4oCUIG9yIC0xLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tOZWFyZXN0KFxuICBkOiBQaWNrPERyYXduVHJhbnNjcmlwdHMsICdtZXJnZWQnIHwgJ3JhZGl1cycgfCAnZ3JpZCc+LCB4OiBudW1iZXIsIHk6IG51bWJlciwgdG9sZXJhbmNlOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCB0ID0gZC5tZXJnZWQ7XG4gIGlmICghZC5ncmlkKSB7XG4gICAgbGV0IG1heFIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSBpZiAoZC5yYWRpdXNbaV0gPiBtYXhSKSBtYXhSID0gZC5yYWRpdXNbaV07XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KG1heFIgKiAyLCB0b2xlcmFuY2UgKiAyLCAxZS02KTtcbiAgICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBrID0gYnVja2V0S2V5KE1hdGguZmxvb3IodC54W2ldIC8gc2l6ZSksIE1hdGguZmxvb3IodC55W2ldIC8gc2l6ZSkpO1xuICAgICAgbGV0IGIgPSBidWNrZXRzLmdldChrKTtcbiAgICAgIGlmICghYikgYnVja2V0cy5zZXQoaywgKGIgPSBbXSkpO1xuICAgICAgYi5wdXNoKGkpO1xuICAgIH1cbiAgICBkLmdyaWQgPSB7IHNpemUsIGJ1Y2tldHMgfTtcbiAgfVxuICBjb25zdCB7IHNpemUsIGJ1Y2tldHMgfSA9IGQuZ3JpZDtcbiAgY29uc3QgZ3ggPSBNYXRoLmZsb29yKHggLyBzaXplKTtcbiAgY29uc3QgZ3kgPSBNYXRoLmZsb29yKHkgLyBzaXplKTtcbiAgbGV0IGJlc3QgPSAtMTtcbiAgbGV0IGJlc3REID0gSW5maW5pdHk7XG4gIGZvciAobGV0IGR5ID0gLTE7IGR5IDw9IDE7IGR5KyspIHtcbiAgICBmb3IgKGxldCBkeCA9IC0xOyBkeCA8PSAxOyBkeCsrKSB7XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgYnVja2V0cy5nZXQoYnVja2V0S2V5KGd4ICsgZHgsIGd5ICsgZHkpKSA/PyBbXSkge1xuICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5oeXBvdCh0LnhbaV0gLSB4LCB0LnlbaV0gLSB5KTtcbiAgICAgICAgaWYgKGRpc3QgPD0gTWF0aC5tYXgoZC5yYWRpdXNbaV0sIHRvbGVyYW5jZSkgJiYgZGlzdCA8IGJlc3REKSB7XG4gICAgICAgICAgYmVzdEQgPSBkaXN0O1xuICAgICAgICAgIGJlc3QgPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG5mdW5jdGlvbiBidWNrZXRLZXkoZ3g6IG51bWJlciwgZ3k6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoZ3ggKyAzMjc2OCkgKiA2NTUzNiArIChneSArIDMyNzY4KTtcbn1cblxuLyoqIFJpbmdzIHdob3NlIG93bmluZyBjZWxsIGlzIGluIGEgc3dpdGNoZWQtb2ZmIGdyb3VwIHJlbW92ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmluZ3MoXG4gIHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGUsIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGlmICghaGlkZGVuKSByZXR1cm4gcmluZ3M7XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZ3MuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbcmluZ3Mub2JzZXJ2YXRpb25baV1dO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICBrZWVwLnB1c2goaSk7XG4gICAgdmVydGljZXMgKz0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gLSByaW5ncy5vZmZzZXRzW2ldO1xuICB9XG4gIGlmIChrZWVwLmxlbmd0aCA9PT0gcmluZ3MuY291bnQpIHJldHVybiByaW5ncztcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGgpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtlZXAubGVuZ3RoICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHYgPSAwO1xuICBrZWVwLmZvckVhY2goKGksIHIpID0+IHtcbiAgICBvYnNlcnZhdGlvbltyXSA9IHJpbmdzLm9ic2VydmF0aW9uW2ldO1xuICAgIG9mZnNldHNbcl0gPSB2O1xuICAgIGNvbnN0IGEgPSByaW5ncy5vZmZzZXRzW2ldICogMjtcbiAgICBjb25zdCBiID0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgIGNvb3Jkcy5zZXQocmluZ3MuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgfSk7XG4gIG9mZnNldHNba2VlcC5sZW5ndGhdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IGtlZXAubGVuZ3RoLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBTbG90cyAoaW5kaWNlcyBpbnRvIHRoZSBzZWxlY3RlZCBnZW5lcykgc3dpdGNoZWQgb2ZmIHdpdGggdGhlaXIgZXllIHRvZ2dsZS4gKi9cbmZ1bmN0aW9uIGhpZGRlbkdlbmVTbG90cyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHZpZXcudHJhbnNjcmlwdEdlbmVzLCAoZykgPT4gKG9mZi5oYXMoZykgPyAxIDogMCkpO1xufVxuXG4vKiogRW50cmllcyBpbiBhIGhpZGRlbiBncm91cCdzIGNlbGwsIG9yIG9mIGEgaGlkZGVuIGdlbmUsIHJlbW92ZWQgKHdpdGggdGhlaXIgc2l6ZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRyYW5zY3JpcHRzKFxuICB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsIHB4OiBGbG9hdDMyQXJyYXksXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCwgaGlkZGVuR2VuZXM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKCFoaWRkZW4gJiYgIWhpZGRlbkdlbmVzKSByZXR1cm4geyBtZXJnZWQ6IHQsIHB4IH07XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkdlbmVzICYmIGhpZGRlbkdlbmVzW3QuZ2VuZVtpXV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgIGlmIChoaWRkZW4gJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbb107XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjb2RlXSkgY29udGludWU7XG4gICAgfVxuICAgIGtlZXAucHVzaChpKTtcbiAgfVxuICBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBUKTogVCA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBUKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChpLCBrKSA9PiB7IG91dFtrXSA9IGFbaV07IH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiB7XG4gICAgICBjb3VudDoga2VlcC5sZW5ndGgsIGFnZ3JlZ2F0ZWQ6IHQuYWdncmVnYXRlZCwgeDogcGljayh0LngpLCB5OiBwaWNrKHQueSksIHo6IHBpY2sodC56KSxcbiAgICAgIHdlaWdodDogcGljayh0LndlaWdodCksIG9ic2VydmF0aW9uOiBwaWNrKHQub2JzZXJ2YXRpb24pLCBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lZGlhbih2OiBGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBpZiAoIXYubGVuZ3RoKSByZXR1cm4gMDtcbiAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iodi5sZW5ndGggLyAxMDI0KSk7XG4gIGNvbnN0IHNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSBzdGVwKSBzYW1wbGUucHVzaCh2W2ldKTtcbiAgc2FtcGxlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgcmV0dXJuIHNhbXBsZVtzYW1wbGUubGVuZ3RoID4+IDFdO1xufVxuXG4vKiogQ29uY2F0ZW5hdGUgdGlsZXMnIHJpbmdzIGludG8gb25lIHNldCwgZHJvcHBpbmcgcmluZ3MgYWxyZWFkeSBzZWVuIChhIGNlbGwgc3RyYWRkbGluZ1xuICogIHR3byB0aWxlcyBtYXkgYmUgbGlzdGVkIGJ5IGJvdGgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUG9seWdvblRpbGVzKHRpbGVzOiBTcGF0aWFsUG9seWdvblRpbGVbXSk6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IHJpbmdzID0gMDtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzZWVuLmhhcyh0Lm9ic2VydmF0aW9uW2ldKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZCh0Lm9ic2VydmF0aW9uW2ldKTtcbiAgICAgIHJpbmdzKys7XG4gICAgICB2ZXJ0aWNlcyArPSB0Lm9mZnNldHNbaSArIDFdIC0gdC5vZmZzZXRzW2ldO1xuICAgIH1cbiAgfVxuICBzZWVuLmNsZWFyKCk7XG4gIGNvbnN0IG9ic2VydmF0aW9uID0gbmV3IFVpbnQzMkFycmF5KHJpbmdzKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShyaW5ncyArIDEpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzICogMik7XG4gIGxldCByID0gMDtcbiAgbGV0IHYgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICBpZiAoc2Vlbi5oYXMobykpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobyk7XG4gICAgICBvYnNlcnZhdGlvbltyXSA9IG87XG4gICAgICBvZmZzZXRzW3JdID0gdjtcbiAgICAgIGNvbnN0IGEgPSB0Lm9mZnNldHNbaV0gKiAyO1xuICAgICAgY29uc3QgYiA9IHQub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgICAgY29vcmRzLnNldCh0LmNvb3Jkcy5zdWJhcnJheShhLCBiKSwgdiAqIDIpO1xuICAgICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgICAgIHIrKztcbiAgICB9XG4gIH1cbiAgb2Zmc2V0c1tyaW5nc10gPSB2O1xuICByZXR1cm4geyBjb3VudDogcmluZ3MsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRyYW5zY3JpcHQgdGlsZXMsIHN0b3BwaW5nIGF0IGBsaW1pdGAgZW50cmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyYW5zY3JpcHRUaWxlcyh0aWxlczogU3BhdGlhbFRyYW5zY3JpcHRUaWxlW10sIGxpbWl0ID0gSW5maW5pdHkpOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUge1xuICBsZXQgbiA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykgbiArPSB0LmNvdW50O1xuICBuID0gTWF0aC5taW4obiwgbGltaXQpO1xuICBjb25zdCBvdXQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSA9IHtcbiAgICBjb3VudDogbixcbiAgICBhZ2dyZWdhdGVkOiB0aWxlcy5zb21lKCh0KSA9PiB0LmFnZ3JlZ2F0ZWQpLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkobiksIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksIHo6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgd2VpZ2h0OiBuZXcgVWludDMyQXJyYXkobiksIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobiksIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sIHNsb3RzOiBudW1iZXJbXSwgYmluOiBudW1iZXIsIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbiwgYWdncmVnYXRlZDogdHJ1ZSxcbiAgICAgIHg6IEZsb2F0MzJBcnJheS5mcm9tKHgpLCB5OiBGbG9hdDMyQXJyYXkuZnJvbSh5KSwgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSwgb2JzZXJ2YXRpb246IG5ldyBVaW50MzJBcnJheShuKS5maWxsKE5PX09CU0VSVkFUSU9OKSxcbiAgICAgIGdlbmU6IFVpbnQxNkFycmF5LmZyb20oZ2VuZSksXG4gICAgfSxcbiAgICBncm91cDogSW50MzJBcnJheS5mcm9tKGdyb3VwKSxcbiAgfTtcbn1cbiJdfQ==
|