@cqa-lib/cqa-ui 1.1.509 → 1.1.510
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/esm2020/lib/simulator/simulator.component.mjs +507 -11
- package/fesm2015/cqa-lib-cqa-ui.mjs +509 -7
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +501 -7
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/simulator/simulator.component.d.ts +85 -3
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ViewChild, HostListener } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ViewChildren, HostListener } from '@angular/core';
|
|
2
2
|
import { getEmptyStatePreset } from '../empty-state/empty-state-presets.constants';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/platform-browser";
|
|
5
5
|
import * as i2 from "@angular/material/icon";
|
|
6
6
|
import * as i3 from "../segment-control/segment-control.component";
|
|
7
7
|
import * as i4 from "@angular/material/progress-spinner";
|
|
8
|
-
import * as i5 from "
|
|
9
|
-
import * as i6 from "
|
|
8
|
+
import * as i5 from "../badge/badge.component";
|
|
9
|
+
import * as i6 from "../button/button.component";
|
|
10
|
+
import * as i7 from "@angular/common";
|
|
11
|
+
import * as i8 from "@angular/material/tooltip";
|
|
10
12
|
export class SimulatorComponent {
|
|
11
13
|
constructor(sanitizer, cdr) {
|
|
12
14
|
this.sanitizer = sanitizer;
|
|
@@ -34,11 +36,15 @@ export class SimulatorComponent {
|
|
|
34
36
|
this.browserDevice = '';
|
|
35
37
|
this.isFastForwarding = false;
|
|
36
38
|
this.fastForwardConfig = null;
|
|
39
|
+
this.showVideoLibrary = false;
|
|
40
|
+
this.showCaptureVideo = false;
|
|
41
|
+
this.isCapturingVideo = false;
|
|
37
42
|
this.videoTimeUpdate = new EventEmitter();
|
|
38
43
|
this.videoPlay = new EventEmitter();
|
|
39
44
|
this.videoPause = new EventEmitter();
|
|
40
45
|
this.markerHit = new EventEmitter();
|
|
41
46
|
this.isVideoPlayingChange = new EventEmitter();
|
|
47
|
+
this.captureVideoRequested = new EventEmitter();
|
|
42
48
|
this.progress = 0;
|
|
43
49
|
this.dragging = false;
|
|
44
50
|
this.isPlaying = false;
|
|
@@ -56,6 +62,42 @@ export class SimulatorComponent {
|
|
|
56
62
|
// State machine for robust media operations
|
|
57
63
|
this.playerState = 'idle';
|
|
58
64
|
this.operationQueue = Promise.resolve(); // Serialize all media operations
|
|
65
|
+
// Video-on-demand (Video Library) state — single source of truth is `videoUrls`.
|
|
66
|
+
// `newVideoIndexes` marks which indexes were just captured (so we can show the
|
|
67
|
+
// NEW badge until that clip is selected); `libraryVideoDurations` caches the
|
|
68
|
+
// metadata-loaded duration per index for each library card's thumbnail.
|
|
69
|
+
this.isVideoLibraryCollapsed = true;
|
|
70
|
+
this.newVideoIndexes = new Set();
|
|
71
|
+
this.libraryVideoDurations = new Map();
|
|
72
|
+
this.downloadingIndexes = new Set();
|
|
73
|
+
this.downloadProgress = new Map(); // 0-100 per clip index
|
|
74
|
+
this.lastLibrarySyncKey = '';
|
|
75
|
+
// Tracks which clip index the library row was last auto-scrolled to, so the
|
|
76
|
+
// timeupdate handler doesn't re-trigger a scroll every frame.
|
|
77
|
+
this.lastScrolledClipIndex = -1;
|
|
78
|
+
// Auto-recovery: when the <video> fires an error event (e.g. Chrome's
|
|
79
|
+
// "PIPELINE_ERROR_READ: FFmpegDemuxer" after a network glitch), we flip
|
|
80
|
+
// this flag to unmount the <video> via *ngIf, then flip it back so Angular
|
|
81
|
+
// remounts a fresh element — the same mechanism that makes the
|
|
82
|
+
// Screenshots↔Video tab-switch workaround recover playback today.
|
|
83
|
+
this.videoRefreshing = false;
|
|
84
|
+
this.pendingRecoverySeekSec = null;
|
|
85
|
+
this.pendingRecoveryPlay = false;
|
|
86
|
+
this.recoveryAttempts = 0;
|
|
87
|
+
this.recoveryAttemptWindowStart = 0;
|
|
88
|
+
this.MAX_RECOVERY_ATTEMPTS = 10;
|
|
89
|
+
this.RECOVERY_WINDOW_MS = 10000;
|
|
90
|
+
// Phase 2 — "Show Full Video" mode. When true, the main timeline spans the total
|
|
91
|
+
// duration across all clips and step markers from every clip are laid out on it.
|
|
92
|
+
// Clip-to-clip transitions happen under the hood via the existing onVideoEnded
|
|
93
|
+
// auto-advance path — the user doesn't see a reset.
|
|
94
|
+
this.isVideoFullMode = false;
|
|
95
|
+
// 0-100 position on the global timeline while the user is actively dragging.
|
|
96
|
+
// Needed because `progress` is per-current-clip and would give the wrong value.
|
|
97
|
+
this.globalDragProgress = 0;
|
|
98
|
+
// Drag-to-scroll state for the clips row (mouse equivalent of touch-swipe).
|
|
99
|
+
this.clipsDragState = { dragging: false, startX: 0, startScrollLeft: 0, didMove: false };
|
|
100
|
+
this.clipsDragActive = false;
|
|
59
101
|
this.segments = [
|
|
60
102
|
{ label: 'Screenshots', value: 'screenshots', icon: 'photo' },
|
|
61
103
|
{ label: 'Video', value: 'video', icon: 'videocam' },
|
|
@@ -276,6 +318,8 @@ export class SimulatorComponent {
|
|
|
276
318
|
borderRadius: '0%'
|
|
277
319
|
}
|
|
278
320
|
};
|
|
321
|
+
/** Circumference of the 6-radius progress ring (see clip-download-btn__ring in template). */
|
|
322
|
+
this.downloadRingCircumference = 2 * Math.PI * 6;
|
|
279
323
|
this.safeTraceUrl = this.sanitizer.bypassSecurityTrustResourceUrl('');
|
|
280
324
|
this.updateSegments();
|
|
281
325
|
}
|
|
@@ -402,6 +446,44 @@ export class SimulatorComponent {
|
|
|
402
446
|
this.attachVideoListeners();
|
|
403
447
|
this.updateSafeTraceUrl();
|
|
404
448
|
}
|
|
449
|
+
ngAfterViewChecked() {
|
|
450
|
+
// Keep the active library card's <video> element's play state in sync with the main player
|
|
451
|
+
// so the card doesn't show a frozen thumbnail while the main video is playing.
|
|
452
|
+
const key = `${this.currentVideoIndex}:${this.isPlaying}`;
|
|
453
|
+
if (key !== this.lastLibrarySyncKey) {
|
|
454
|
+
this.lastLibrarySyncKey = key;
|
|
455
|
+
this.syncLibraryClipPlayback();
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
syncLibraryClipPlayback() {
|
|
459
|
+
const refs = this.clipVideos;
|
|
460
|
+
if (!refs)
|
|
461
|
+
return;
|
|
462
|
+
const mainEl = this.vplayer?.nativeElement;
|
|
463
|
+
refs.forEach((ref, i) => {
|
|
464
|
+
const el = ref?.nativeElement;
|
|
465
|
+
if (!el)
|
|
466
|
+
return;
|
|
467
|
+
const shouldPlay = i === this.currentVideoIndex && this.isPlaying;
|
|
468
|
+
if (shouldPlay) {
|
|
469
|
+
// Seed the card's currentTime from the main player so they start roughly aligned.
|
|
470
|
+
if (mainEl && isFinite(mainEl.currentTime) && !isNaN(mainEl.currentTime)) {
|
|
471
|
+
try {
|
|
472
|
+
el.currentTime = mainEl.currentTime;
|
|
473
|
+
}
|
|
474
|
+
catch (_) { /* ignore */ }
|
|
475
|
+
}
|
|
476
|
+
if (el.paused) {
|
|
477
|
+
const p = el.play();
|
|
478
|
+
if (p && typeof p.catch === 'function')
|
|
479
|
+
p.catch(() => { });
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
else if (!el.paused) {
|
|
483
|
+
el.pause();
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
}
|
|
405
487
|
ngOnChanges(changes) {
|
|
406
488
|
if (changes['videoUrls']) {
|
|
407
489
|
const arr = changes['videoUrls'].currentValue;
|
|
@@ -856,6 +938,36 @@ export class SimulatorComponent {
|
|
|
856
938
|
const durationMs = video.duration * 1000;
|
|
857
939
|
return (step.cumulativeDuration / durationMs) * 100;
|
|
858
940
|
}
|
|
941
|
+
/** Full-video markers: every marker, flattened, laid out on the global timeline.
|
|
942
|
+
* `stepMarkers` is already in global coordinates — `currentVideoMarkers` does the
|
|
943
|
+
* inverse (filters + adjusts per-clip); here we just flatten the original list. */
|
|
944
|
+
get fullVideoMarkers() {
|
|
945
|
+
return this.flattenMarkers(this.stepMarkers || []);
|
|
946
|
+
}
|
|
947
|
+
getGlobalFullStepLeftPosition(step) {
|
|
948
|
+
const total = this.totalDuration;
|
|
949
|
+
if (!total)
|
|
950
|
+
return 0;
|
|
951
|
+
return Math.min(100, Math.max(0, (step.cumulativeDuration / total) * 100));
|
|
952
|
+
}
|
|
953
|
+
/** Cumulative elapsed ms on the global timeline (prior clip durations + current local time). */
|
|
954
|
+
get globalCurrentTimeMs() {
|
|
955
|
+
const local = (this.vplayer?.nativeElement?.currentTime ?? 0) * 1000;
|
|
956
|
+
const boundaries = this.segmentBoundaries;
|
|
957
|
+
const priorEnd = this.currentVideoIndex > 0 ? (boundaries[this.currentVideoIndex - 1] ?? 0) : 0;
|
|
958
|
+
return priorEnd + local;
|
|
959
|
+
}
|
|
960
|
+
/** 0-100 position on the global timeline, driven by timeupdate. */
|
|
961
|
+
get globalProgress() {
|
|
962
|
+
const total = this.totalDuration;
|
|
963
|
+
if (!total)
|
|
964
|
+
return 0;
|
|
965
|
+
return Math.min(100, Math.max(0, (this.globalCurrentTimeMs / total) * 100));
|
|
966
|
+
}
|
|
967
|
+
/** While dragging in full mode, the scrubber reads the override; otherwise globalProgress. */
|
|
968
|
+
get globalScrubberPercent() {
|
|
969
|
+
return this.dragging ? this.globalDragProgress : this.globalProgress;
|
|
970
|
+
}
|
|
859
971
|
getStepColor(step) {
|
|
860
972
|
return step.level === 1 ? '#000000' : '#6366F1';
|
|
861
973
|
}
|
|
@@ -941,14 +1053,31 @@ export class SimulatorComponent {
|
|
|
941
1053
|
}
|
|
942
1054
|
}
|
|
943
1055
|
onTimelineClick(event) {
|
|
944
|
-
if (!this.timelineBar?.nativeElement
|
|
945
|
-
return;
|
|
946
|
-
const video = this.vplayer.nativeElement;
|
|
947
|
-
if (!video.duration || !isFinite(video.duration))
|
|
1056
|
+
if (!this.timelineBar?.nativeElement)
|
|
948
1057
|
return;
|
|
949
1058
|
const rect = this.timelineBar.nativeElement.getBoundingClientRect();
|
|
950
1059
|
const clickX = event.clientX - rect.left;
|
|
951
1060
|
const percent = Math.max(0, Math.min(1, clickX / rect.width));
|
|
1061
|
+
if (this.isVideoFullMode) {
|
|
1062
|
+
const total = this.totalDuration;
|
|
1063
|
+
if (!total)
|
|
1064
|
+
return;
|
|
1065
|
+
const shouldResumePlaying = this.isPlaying;
|
|
1066
|
+
const targetGlobalMs = percent * total;
|
|
1067
|
+
this.switchToVideoAndSeek(targetGlobalMs);
|
|
1068
|
+
if (shouldResumePlaying) {
|
|
1069
|
+
this.enqueueOperation(async () => {
|
|
1070
|
+
await new Promise(resolve => setTimeout(resolve, 120));
|
|
1071
|
+
await this.playVideoInternal();
|
|
1072
|
+
});
|
|
1073
|
+
}
|
|
1074
|
+
return;
|
|
1075
|
+
}
|
|
1076
|
+
if (!this.vplayer?.nativeElement)
|
|
1077
|
+
return;
|
|
1078
|
+
const video = this.vplayer.nativeElement;
|
|
1079
|
+
if (!video.duration || !isFinite(video.duration))
|
|
1080
|
+
return;
|
|
952
1081
|
const targetTimeMs = percent * video.duration * 1000;
|
|
953
1082
|
const shouldResumePlaying = this.isPlaying;
|
|
954
1083
|
console.log('[Simulator] onTimelineClick', {
|
|
@@ -988,7 +1117,12 @@ export class SimulatorComponent {
|
|
|
988
1117
|
const rect = this.timelineBar.nativeElement.getBoundingClientRect();
|
|
989
1118
|
const x = event.clientX - rect.left;
|
|
990
1119
|
const percent = Math.max(0, Math.min(x / rect.width, 1));
|
|
991
|
-
this.
|
|
1120
|
+
if (this.isVideoFullMode) {
|
|
1121
|
+
this.globalDragProgress = percent * 100;
|
|
1122
|
+
}
|
|
1123
|
+
else {
|
|
1124
|
+
this.progress = percent * 100; // Per-clip timeline position
|
|
1125
|
+
}
|
|
992
1126
|
}
|
|
993
1127
|
stopDrag() {
|
|
994
1128
|
if (!this.dragging)
|
|
@@ -1002,6 +1136,20 @@ export class SimulatorComponent {
|
|
|
1002
1136
|
shouldResumePlaying: shouldResumePlaying,
|
|
1003
1137
|
currentPlayerState: this.playerState
|
|
1004
1138
|
});
|
|
1139
|
+
if (this.isVideoFullMode) {
|
|
1140
|
+
const total = this.totalDuration;
|
|
1141
|
+
if (!total)
|
|
1142
|
+
return;
|
|
1143
|
+
const targetGlobalMs = (this.globalDragProgress / 100) * total;
|
|
1144
|
+
this.switchToVideoAndSeek(targetGlobalMs);
|
|
1145
|
+
if (shouldResumePlaying) {
|
|
1146
|
+
this.enqueueOperation(async () => {
|
|
1147
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
1148
|
+
await this.playVideoInternal();
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
return;
|
|
1152
|
+
}
|
|
1005
1153
|
const video = this.vplayer?.nativeElement;
|
|
1006
1154
|
if (!video || !video.duration || !isFinite(video.duration))
|
|
1007
1155
|
return;
|
|
@@ -1074,6 +1222,78 @@ export class SimulatorComponent {
|
|
|
1074
1222
|
// Ensure playback speed is consistent across all videos
|
|
1075
1223
|
this.applyCurrentPlaybackRate();
|
|
1076
1224
|
this.attachVideoListeners();
|
|
1225
|
+
// Consume any pending recovery state queued by onVideoError(): seek back to
|
|
1226
|
+
// where playback errored and auto-resume if we were playing at the time.
|
|
1227
|
+
if (this.pendingRecoverySeekSec != null) {
|
|
1228
|
+
const seekSec = this.pendingRecoverySeekSec;
|
|
1229
|
+
const shouldPlay = this.pendingRecoveryPlay;
|
|
1230
|
+
this.pendingRecoverySeekSec = null;
|
|
1231
|
+
this.pendingRecoveryPlay = false;
|
|
1232
|
+
const video = this.vplayer?.nativeElement;
|
|
1233
|
+
if (video && isFinite(video.duration)) {
|
|
1234
|
+
try {
|
|
1235
|
+
video.currentTime = Math.max(0, Math.min(seekSec, video.duration));
|
|
1236
|
+
}
|
|
1237
|
+
catch (_) { /* element may not be seekable yet; harmless */ }
|
|
1238
|
+
}
|
|
1239
|
+
if (shouldPlay) {
|
|
1240
|
+
this.enqueueOperation(async () => {
|
|
1241
|
+
await new Promise(resolve => setTimeout(resolve, 80));
|
|
1242
|
+
await this.playVideoInternal();
|
|
1243
|
+
});
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
/** Native error-event handler for the main <video> element. The Chrome media
|
|
1248
|
+
* stack occasionally throws "PipelineStatus::PIPELINE_ERROR_READ: FFmpegDemuxer:
|
|
1249
|
+
* data source error" during playback after a brief network blip or a burst of
|
|
1250
|
+
* fast user actions; once that happens the element becomes unresponsive to
|
|
1251
|
+
* play/pause/seek. We recover by unmounting+remounting the <video> via *ngIf
|
|
1252
|
+
* — the same mechanism that makes the Screenshots↔Video tab-switch workaround
|
|
1253
|
+
* work today — then restore the pre-error playhead and resume playback. */
|
|
1254
|
+
onVideoError() {
|
|
1255
|
+
const video = this.vplayer?.nativeElement;
|
|
1256
|
+
const err = video?.error;
|
|
1257
|
+
console.error('[Simulator] onVideoError — triggering auto-recovery', {
|
|
1258
|
+
playerState: this.playerState,
|
|
1259
|
+
errorCode: err?.code,
|
|
1260
|
+
errorMessage: err?.message,
|
|
1261
|
+
networkState: video?.networkState,
|
|
1262
|
+
readyState: video?.readyState,
|
|
1263
|
+
currentVideoIndex: this.currentVideoIndex,
|
|
1264
|
+
currentVideoUrl: this.currentVideoUrl,
|
|
1265
|
+
attempts: this.recoveryAttempts
|
|
1266
|
+
});
|
|
1267
|
+
// Bound the retry budget to a rolling window so a persistently broken
|
|
1268
|
+
// source (404, unsupported codec, …) doesn't flap forever.
|
|
1269
|
+
const now = Date.now();
|
|
1270
|
+
if (now - this.recoveryAttemptWindowStart > this.RECOVERY_WINDOW_MS) {
|
|
1271
|
+
this.recoveryAttempts = 0;
|
|
1272
|
+
this.recoveryAttemptWindowStart = now;
|
|
1273
|
+
}
|
|
1274
|
+
this.recoveryAttempts++;
|
|
1275
|
+
if (this.recoveryAttempts > this.MAX_RECOVERY_ATTEMPTS) {
|
|
1276
|
+
console.error('[Simulator] onVideoError: exceeded recovery attempts, giving up');
|
|
1277
|
+
this.playerState = 'error';
|
|
1278
|
+
this.isPlaying = false;
|
|
1279
|
+
this.isVideoPlayingChange.emit(false);
|
|
1280
|
+
return;
|
|
1281
|
+
}
|
|
1282
|
+
// Capture what we need to restore after the remount.
|
|
1283
|
+
this.pendingRecoverySeekSec = (video && isFinite(video.currentTime)) ? video.currentTime : 0;
|
|
1284
|
+
this.pendingRecoveryPlay = this.isPlaying;
|
|
1285
|
+
// Put the state machine into 'error' so onVideoElementReady resets it
|
|
1286
|
+
// back to 'idle' when the remounted element arrives.
|
|
1287
|
+
this.playerState = 'error';
|
|
1288
|
+
this.isPlaying = false;
|
|
1289
|
+
this.playPromise = null;
|
|
1290
|
+
this.isVideoPlayingChange.emit(false);
|
|
1291
|
+
// Unmount → remount. Brief 100ms gap mirrors the tab-switch workaround.
|
|
1292
|
+
this.videoRefreshing = true;
|
|
1293
|
+
setTimeout(() => {
|
|
1294
|
+
this.videoRefreshing = false;
|
|
1295
|
+
this.cdr.markForCheck();
|
|
1296
|
+
}, 100);
|
|
1077
1297
|
}
|
|
1078
1298
|
onVideoEnded() {
|
|
1079
1299
|
this.isPlaying = false;
|
|
@@ -1118,6 +1338,12 @@ export class SimulatorComponent {
|
|
|
1118
1338
|
this.videoTimeUpdate.emit(segmentStart + currentMs);
|
|
1119
1339
|
this.checkMarkerHit(segmentStart + currentMs);
|
|
1120
1340
|
this.maybePreloadNextSegment();
|
|
1341
|
+
// Auto-scroll the library row so the currently-playing clip stays visible.
|
|
1342
|
+
// Only while playing; when paused we leave the row where the user left it.
|
|
1343
|
+
if (this.isPlaying && this.currentVideoIndex !== this.lastScrolledClipIndex) {
|
|
1344
|
+
this.lastScrolledClipIndex = this.currentVideoIndex;
|
|
1345
|
+
this.scrollCurrentClipIntoView();
|
|
1346
|
+
}
|
|
1121
1347
|
}
|
|
1122
1348
|
};
|
|
1123
1349
|
video.addEventListener('timeupdate', handler);
|
|
@@ -1402,6 +1628,256 @@ export class SimulatorComponent {
|
|
|
1402
1628
|
}
|
|
1403
1629
|
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
|
1404
1630
|
}
|
|
1631
|
+
captureVideo() {
|
|
1632
|
+
if (!this.showCaptureVideo || !this.isLive || this.isCapturingVideo)
|
|
1633
|
+
return;
|
|
1634
|
+
this.captureVideoRequested.emit();
|
|
1635
|
+
}
|
|
1636
|
+
// ─── Clips row drag-to-scroll (mouse equivalent of touch-swipe) ──────────────
|
|
1637
|
+
// Design: tracking starts on mousedown but we DON'T flip to the "dragging" visual state
|
|
1638
|
+
// or block clicks until the pointer crosses a 5px threshold. That way a plain click
|
|
1639
|
+
// (no movement) registers normally on the card / download button with the usual cursor.
|
|
1640
|
+
onClipsMouseDown(event, scroller) {
|
|
1641
|
+
if (event.button !== 0 || !scroller)
|
|
1642
|
+
return;
|
|
1643
|
+
this.clipsDragState.dragging = true;
|
|
1644
|
+
this.clipsDragState.didMove = false;
|
|
1645
|
+
this.clipsDragState.startX = event.clientX;
|
|
1646
|
+
this.clipsDragState.startScrollLeft = scroller.scrollLeft;
|
|
1647
|
+
}
|
|
1648
|
+
onClipsMouseMove(event, scroller) {
|
|
1649
|
+
if (!this.clipsDragState.dragging || !scroller)
|
|
1650
|
+
return;
|
|
1651
|
+
const dx = event.clientX - this.clipsDragState.startX;
|
|
1652
|
+
if (!this.clipsDragState.didMove && Math.abs(dx) > 5) {
|
|
1653
|
+
this.clipsDragState.didMove = true;
|
|
1654
|
+
this.clipsDragActive = true; // flip the grabbing cursor now that it's a real drag
|
|
1655
|
+
}
|
|
1656
|
+
if (this.clipsDragState.didMove) {
|
|
1657
|
+
scroller.scrollLeft = this.clipsDragState.startScrollLeft - dx;
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
onClipsMouseUp(_event) {
|
|
1661
|
+
if (!this.clipsDragState.dragging)
|
|
1662
|
+
return;
|
|
1663
|
+
this.clipsDragState.dragging = false;
|
|
1664
|
+
this.clipsDragActive = false;
|
|
1665
|
+
if (this.clipsDragState.didMove) {
|
|
1666
|
+
// Keep didMove=true briefly so the synthetic click fires and is ignored, then reset.
|
|
1667
|
+
setTimeout(() => { this.clipsDragState.didMove = false; }, 0);
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
onClipsMouseLeave(event) {
|
|
1671
|
+
this.onClipsMouseUp(event);
|
|
1672
|
+
}
|
|
1673
|
+
/** Click handler on a Video Library card — switches the main player to that clip and auto-plays.
|
|
1674
|
+
* Selecting a *different* clip also collapses the library so the newly-playing video is unobstructed;
|
|
1675
|
+
* re-clicking the active clip just toggles play/pause and keeps the drawer state.
|
|
1676
|
+
* Ignored when the click originated from a horizontal drag-scroll. */
|
|
1677
|
+
selectLibraryClip(index) {
|
|
1678
|
+
if (this.clipsDragState.didMove)
|
|
1679
|
+
return;
|
|
1680
|
+
if (!Array.isArray(this.videoUrls) || index < 0 || index >= this.videoUrls.length)
|
|
1681
|
+
return;
|
|
1682
|
+
this.newVideoIndexes.delete(index);
|
|
1683
|
+
// Full-mode: seek the global timeline to this clip's start. Keep full mode and
|
|
1684
|
+
// the library panel open so the user can see the highlight follow along.
|
|
1685
|
+
// If the clicked card is the one already playing under the hood, treat the
|
|
1686
|
+
// click as a play/pause toggle (the card's overlay icon reflects that state).
|
|
1687
|
+
if (this.isVideoFullMode) {
|
|
1688
|
+
if (index === this.currentVideoIndex) {
|
|
1689
|
+
this.togglePlay();
|
|
1690
|
+
return;
|
|
1691
|
+
}
|
|
1692
|
+
const boundaries = this.segmentBoundaries;
|
|
1693
|
+
const targetGlobalMs = index === 0 ? 0 : (boundaries[index - 1] ?? 0);
|
|
1694
|
+
const shouldResume = this.isPlaying;
|
|
1695
|
+
this.switchToVideoAndSeek(targetGlobalMs);
|
|
1696
|
+
if (shouldResume) {
|
|
1697
|
+
this.enqueueOperation(async () => {
|
|
1698
|
+
await new Promise(resolve => setTimeout(resolve, 150));
|
|
1699
|
+
await this.playVideoInternal();
|
|
1700
|
+
});
|
|
1701
|
+
}
|
|
1702
|
+
return;
|
|
1703
|
+
}
|
|
1704
|
+
if (index === this.currentVideoIndex) {
|
|
1705
|
+
this.togglePlay();
|
|
1706
|
+
return;
|
|
1707
|
+
}
|
|
1708
|
+
this.isVideoLibraryCollapsed = true;
|
|
1709
|
+
this.enqueueOperation(async () => {
|
|
1710
|
+
await this.switchToVideoAndResetInternal(index);
|
|
1711
|
+
await this.playVideoInternal();
|
|
1712
|
+
});
|
|
1713
|
+
}
|
|
1714
|
+
/** Per-card metadata handler — caches duration so the `0:42` thumbnail label can render.
|
|
1715
|
+
* Bound to BOTH `loadedmetadata` and `durationchange`:
|
|
1716
|
+
* - Some MP4s (esp. short clips with moov at the end) report a wrong/partial duration
|
|
1717
|
+
* on `loadedmetadata`; Chrome later corrects it via `durationchange`. Listening to
|
|
1718
|
+
* both + keeping the max-so-far avoids stale wrong values like "00:01" for a 5s clip.
|
|
1719
|
+
* - For streamed MP4s that report `Infinity`, seek to the end once so Chrome fetches
|
|
1720
|
+
* the cues/trailer and fires a corrected `durationchange`. */
|
|
1721
|
+
onLibraryClipMetadataLoaded(index, videoEl) {
|
|
1722
|
+
const d = videoEl?.duration;
|
|
1723
|
+
if (d === Infinity && !videoEl.dataset['cqaDurationProbed']) {
|
|
1724
|
+
videoEl.dataset['cqaDurationProbed'] = '1';
|
|
1725
|
+
try {
|
|
1726
|
+
videoEl.currentTime = Number.MAX_SAFE_INTEGER;
|
|
1727
|
+
}
|
|
1728
|
+
catch (_) { /* some browsers throw before metadata; ignore */ }
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
if (typeof d === 'number' && isFinite(d) && d > 0) {
|
|
1732
|
+
const prev = this.libraryVideoDurations.get(index) || 0;
|
|
1733
|
+
if (d > prev) {
|
|
1734
|
+
this.libraryVideoDurations.set(index, d);
|
|
1735
|
+
this.cdr.markForCheck();
|
|
1736
|
+
}
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
trackLibraryClipByIndex(index, url) {
|
|
1740
|
+
return index + ':' + (url || '');
|
|
1741
|
+
}
|
|
1742
|
+
/** Download the clip at `index`. Streams the bytes with fetch so we can show progress,
|
|
1743
|
+
* then saves via a temporary blob URL so the file comes down on the same page
|
|
1744
|
+
* (no new tab / window). Falls back to a direct anchor click if fetch is unavailable or fails. */
|
|
1745
|
+
async downloadClip(index) {
|
|
1746
|
+
if (this.clipsDragState.didMove)
|
|
1747
|
+
return;
|
|
1748
|
+
const url = Array.isArray(this.videoUrls) ? this.videoUrls[index] : undefined;
|
|
1749
|
+
if (!url || this.downloadingIndexes.has(index))
|
|
1750
|
+
return;
|
|
1751
|
+
const filename = this.deriveClipFilename(url, index);
|
|
1752
|
+
this.downloadingIndexes.add(index);
|
|
1753
|
+
this.downloadProgress.set(index, 0);
|
|
1754
|
+
this.cdr.markForCheck();
|
|
1755
|
+
try {
|
|
1756
|
+
const response = await fetch(url, { mode: 'cors', credentials: 'omit' });
|
|
1757
|
+
if (!response.ok || !response.body) {
|
|
1758
|
+
throw new Error('Download failed: ' + response.status);
|
|
1759
|
+
}
|
|
1760
|
+
const total = Number(response.headers.get('content-length')) || 0;
|
|
1761
|
+
const reader = response.body.getReader();
|
|
1762
|
+
const chunks = [];
|
|
1763
|
+
let received = 0;
|
|
1764
|
+
while (true) {
|
|
1765
|
+
const { done, value } = await reader.read();
|
|
1766
|
+
if (done)
|
|
1767
|
+
break;
|
|
1768
|
+
if (value) {
|
|
1769
|
+
chunks.push(value);
|
|
1770
|
+
received += value.length;
|
|
1771
|
+
if (total > 0) {
|
|
1772
|
+
this.downloadProgress.set(index, Math.min(100, Math.round((received / total) * 100)));
|
|
1773
|
+
}
|
|
1774
|
+
this.cdr.markForCheck();
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
const blob = new Blob(chunks, { type: 'video/webm' });
|
|
1778
|
+
this.saveBlobAsDownload(blob, filename);
|
|
1779
|
+
}
|
|
1780
|
+
catch (_err) {
|
|
1781
|
+
// CORS block or network failure — fall back to a direct anchor click (may open in a new tab
|
|
1782
|
+
// depending on the server's Content-Disposition, but at least always triggers the browser's save flow).
|
|
1783
|
+
this.triggerDirectDownload(url, filename);
|
|
1784
|
+
}
|
|
1785
|
+
finally {
|
|
1786
|
+
this.downloadingIndexes.delete(index);
|
|
1787
|
+
this.downloadProgress.delete(index);
|
|
1788
|
+
this.cdr.markForCheck();
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
deriveClipFilename(url, index) {
|
|
1792
|
+
try {
|
|
1793
|
+
const u = new URL(url);
|
|
1794
|
+
const last = (u.pathname.split('/').pop() || '').split('?')[0];
|
|
1795
|
+
if (last && /\.[a-z0-9]+$/i.test(last))
|
|
1796
|
+
return `clip-${index + 1}-${last}`;
|
|
1797
|
+
}
|
|
1798
|
+
catch (_) { /* ignore */ }
|
|
1799
|
+
return `clip-${index + 1}.webm`;
|
|
1800
|
+
}
|
|
1801
|
+
saveBlobAsDownload(blob, filename) {
|
|
1802
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
1803
|
+
try {
|
|
1804
|
+
const a = document.createElement('a');
|
|
1805
|
+
a.href = objectUrl;
|
|
1806
|
+
a.download = filename;
|
|
1807
|
+
a.rel = 'noopener';
|
|
1808
|
+
document.body.appendChild(a);
|
|
1809
|
+
a.click();
|
|
1810
|
+
document.body.removeChild(a);
|
|
1811
|
+
}
|
|
1812
|
+
finally {
|
|
1813
|
+
setTimeout(() => URL.revokeObjectURL(objectUrl), 2000);
|
|
1814
|
+
}
|
|
1815
|
+
}
|
|
1816
|
+
/** stroke-dashoffset for the progress ring of clip `index`; 0 = full, circumference = empty. */
|
|
1817
|
+
downloadRingDashoffset(index) {
|
|
1818
|
+
const pct = Math.min(100, Math.max(0, this.downloadProgress.get(index) || 0));
|
|
1819
|
+
return this.downloadRingCircumference * (1 - pct / 100);
|
|
1820
|
+
}
|
|
1821
|
+
triggerDirectDownload(url, filename) {
|
|
1822
|
+
const a = document.createElement('a');
|
|
1823
|
+
a.href = url;
|
|
1824
|
+
a.download = filename;
|
|
1825
|
+
a.rel = 'noopener';
|
|
1826
|
+
document.body.appendChild(a);
|
|
1827
|
+
a.click();
|
|
1828
|
+
document.body.removeChild(a);
|
|
1829
|
+
}
|
|
1830
|
+
onShowFullVideo() {
|
|
1831
|
+
if (!this.showVideoLibrary)
|
|
1832
|
+
return;
|
|
1833
|
+
if (!Array.isArray(this.videoUrls) || this.videoUrls.length === 0)
|
|
1834
|
+
return;
|
|
1835
|
+
this.isVideoFullMode = true;
|
|
1836
|
+
this.isVideoLibraryCollapsed = true;
|
|
1837
|
+
this.progress = 0;
|
|
1838
|
+
this.globalDragProgress = 0;
|
|
1839
|
+
this.lastScrolledClipIndex = -1;
|
|
1840
|
+
this.enqueueOperation(async () => {
|
|
1841
|
+
await this.switchToVideoAndResetInternal(0);
|
|
1842
|
+
await this.playVideoInternal();
|
|
1843
|
+
});
|
|
1844
|
+
}
|
|
1845
|
+
onExitFullVideo() {
|
|
1846
|
+
this.isVideoFullMode = false;
|
|
1847
|
+
this.isVideoLibraryCollapsed = true;
|
|
1848
|
+
this.progress = 0;
|
|
1849
|
+
this.globalDragProgress = 0;
|
|
1850
|
+
this.lastScrolledClipIndex = -1;
|
|
1851
|
+
this.enqueueOperation(async () => {
|
|
1852
|
+
await this.switchToVideoAndResetInternal(0);
|
|
1853
|
+
});
|
|
1854
|
+
}
|
|
1855
|
+
/** Horizontally scrolls the `.clips-row` so the currently-playing clip card is
|
|
1856
|
+
* in the visible strip. No-op if the card is already on screen. Caller guards
|
|
1857
|
+
* on `isPlaying` so the user can freely scroll the row while paused. */
|
|
1858
|
+
scrollCurrentClipIntoView() {
|
|
1859
|
+
const scroller = this.clipsScrollerRef?.nativeElement;
|
|
1860
|
+
if (!scroller)
|
|
1861
|
+
return;
|
|
1862
|
+
const cards = scroller.querySelectorAll('.clip-card');
|
|
1863
|
+
const card = cards[this.currentVideoIndex];
|
|
1864
|
+
if (!card)
|
|
1865
|
+
return;
|
|
1866
|
+
const padding = 8;
|
|
1867
|
+
const cardLeft = card.offsetLeft;
|
|
1868
|
+
const cardRight = cardLeft + card.offsetWidth;
|
|
1869
|
+
const viewLeft = scroller.scrollLeft;
|
|
1870
|
+
const viewRight = viewLeft + scroller.clientWidth;
|
|
1871
|
+
if (cardLeft < viewLeft + padding) {
|
|
1872
|
+
scroller.scrollTo({ left: Math.max(0, cardLeft - padding), behavior: 'smooth' });
|
|
1873
|
+
}
|
|
1874
|
+
else if (cardRight > viewRight - padding) {
|
|
1875
|
+
scroller.scrollTo({ left: cardRight - scroller.clientWidth + padding, behavior: 'smooth' });
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
toggleVideoLibraryCollapsed() {
|
|
1879
|
+
this.isVideoLibraryCollapsed = !this.isVideoLibraryCollapsed;
|
|
1880
|
+
}
|
|
1405
1881
|
getStatusBadgeClass() {
|
|
1406
1882
|
const baseClasses = 'cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-[9px] cqa-py-[3px] cqa-rounded-[6px] cqa-h-[21px]';
|
|
1407
1883
|
switch (this.liveStatus) {
|
|
@@ -1583,6 +2059,9 @@ export class SimulatorComponent {
|
|
|
1583
2059
|
if (!video || !this.videoUrls || targetVideoIndex < 0 || targetVideoIndex >= this.videoUrls.length) {
|
|
1584
2060
|
return;
|
|
1585
2061
|
}
|
|
2062
|
+
// User-initiated navigation — reset the auto-recovery retry budget.
|
|
2063
|
+
this.recoveryAttempts = 0;
|
|
2064
|
+
this.recoveryAttemptWindowStart = 0;
|
|
1586
2065
|
if (this.currentVideoIndex === targetVideoIndex) {
|
|
1587
2066
|
await this.resetVideoStateInternal();
|
|
1588
2067
|
return;
|
|
@@ -1631,6 +2110,9 @@ export class SimulatorComponent {
|
|
|
1631
2110
|
this.enqueueOperation(() => this.switchToVideoAndSeekInternal(cumulativeTimestamp));
|
|
1632
2111
|
}
|
|
1633
2112
|
async switchToVideoAndSeekInternal(cumulativeTimestamp) {
|
|
2113
|
+
// User-initiated seek — reset the auto-recovery retry budget.
|
|
2114
|
+
this.recoveryAttempts = 0;
|
|
2115
|
+
this.recoveryAttemptWindowStart = 0;
|
|
1634
2116
|
if (!this.hasMultipleVideos) {
|
|
1635
2117
|
await this.seekToTimeInternal(cumulativeTimestamp);
|
|
1636
2118
|
return;
|
|
@@ -1714,10 +2196,10 @@ export class SimulatorComponent {
|
|
|
1714
2196
|
}
|
|
1715
2197
|
}
|
|
1716
2198
|
SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1717
|
-
SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
2199
|
+
SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig", showVideoLibrary: "showVideoLibrary", showCaptureVideo: "showCaptureVideo", isCapturingVideo: "isCapturingVideo" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }, { propertyName: "clipsScrollerRef", first: true, predicate: ["clipsScroller"], descendants: true }, { propertyName: "clipVideos", predicate: ["clipVideo"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i5.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
1718
2200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
|
|
1719
2201
|
type: Component,
|
|
1720
|
-
args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-max-h-[calc(100%-60px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
|
|
2202
|
+
args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
|
|
1721
2203
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoUrl: [{
|
|
1722
2204
|
type: Input
|
|
1723
2205
|
}], videoUrls: [{
|
|
@@ -1764,6 +2246,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1764
2246
|
type: Input
|
|
1765
2247
|
}], fastForwardConfig: [{
|
|
1766
2248
|
type: Input
|
|
2249
|
+
}], showVideoLibrary: [{
|
|
2250
|
+
type: Input
|
|
2251
|
+
}], showCaptureVideo: [{
|
|
2252
|
+
type: Input
|
|
2253
|
+
}], isCapturingVideo: [{
|
|
2254
|
+
type: Input
|
|
1767
2255
|
}], videoTimeUpdate: [{
|
|
1768
2256
|
type: Output
|
|
1769
2257
|
}], videoPlay: [{
|
|
@@ -1774,6 +2262,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1774
2262
|
type: Output
|
|
1775
2263
|
}], isVideoPlayingChange: [{
|
|
1776
2264
|
type: Output
|
|
2265
|
+
}], captureVideoRequested: [{
|
|
2266
|
+
type: Output
|
|
1777
2267
|
}], vplayerRef: [{
|
|
1778
2268
|
type: ViewChild,
|
|
1779
2269
|
args: ['vplayer']
|
|
@@ -1783,8 +2273,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1783
2273
|
}], speedControlContainerRef: [{
|
|
1784
2274
|
type: ViewChild,
|
|
1785
2275
|
args: ['speedControlContainer', { static: false }]
|
|
2276
|
+
}], clipVideos: [{
|
|
2277
|
+
type: ViewChildren,
|
|
2278
|
+
args: ['clipVideo']
|
|
2279
|
+
}], clipsScrollerRef: [{
|
|
2280
|
+
type: ViewChild,
|
|
2281
|
+
args: ['clipsScroller']
|
|
1786
2282
|
}], onWindowResize: [{
|
|
1787
2283
|
type: HostListener,
|
|
1788
2284
|
args: ['window:resize']
|
|
1789
2285
|
}] } });
|
|
1790
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLFlBQVksRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFbkwsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBOFg3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5WHZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdBQVksS0FBSyxDQUFD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QU0sRUFBRSxLQUFLLEVBQUU7Z0JBb1VyRCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZ2V0RW1wdHlTdGF0ZVByZXNldCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLXByZXNldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBGYXN0Rm9yd2FyZENvbmZpZyB7XG4gIGZyb21TdGVwOiBudW1iZXI7XG4gIHRvU3RlcDogbnVtYmVyO1xuICBjdXJyZW50U3RlcDogbnVtYmVyO1xuICB0b3RhbFN0ZXBzOiBudW1iZXI7XG4gIHRhcmdldFN0ZXBOdW1iZXI6IHN0cmluZztcbiAgdGFyZ2V0U3RlcExhYmVsOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTWFya2VyIHtcbiAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBudW1iZXI7XG4gIHJlc3VsdDogJ1NVQ0NFU1MnIHwgJ0ZBSUxVUkUnIHwgJ0FCT1JURUQnIHwgJ1NLSVBQRUQnO1xuICB0ZXN0U3RlcElkPzogbnVtYmVyO1xuICBsZXZlbD86IG51bWJlcjtcbiAgY2hpbGRTdGVwcz86IFN0ZXBNYXJrZXJbXTtcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRUeXBlID0gJ3NjcmVlbnNob3RzJyB8ICd2aWRlbycgfCAndHJhY2UnO1xuXG50eXBlIFNlZ21lbnRPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG59O1xuaW50ZXJmYWNlIERldmljZUZyYW1lQ29uZmlnIHtcbiAgbW9ja3VwSW1hZ2U6IHN0cmluZztcbiAgc2NyZWVuSW5zZXQ6IHtcbiAgICB0b3A6IHN0cmluZztcbiAgICByaWdodDogc3RyaW5nO1xuICAgIGJvdHRvbTogc3RyaW5nO1xuICAgIGxlZnQ6IHN0cmluZztcbiAgfTtcbiAgYm9yZGVyUmFkaXVzOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zaW11bGF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltdWxhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXVxufSlcblxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSB2aWRlb1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHZpZGVvVXJsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdmlkZW9DdXJyZW50RHVyYXRpb246IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHN0ZXBNYXJrZXJzOiBTdGVwTWFya2VyW10gPSBbXTtcbiAgQElucHV0KCkgc2NyZWVuU2hvdFVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRyYWNlVmlld1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtTmFtZTogc3RyaW5nID0gJ1dlYiAtIENocm9tZSc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtVHlwZTogJ2Jyb3dzZXInIHwgJ2RldmljZScgPSAnYnJvd3Nlcic7XG4gIEBJbnB1dCgpIHBsYXRmb3JtOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGV2aWNlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsaXZlU3RhdHVzOiAnSW4gUHJvZ3Jlc3MnIHwgJ1BhdXNlZCcgfCAnQWJvcnRlZCcgfCAnRmFpbGVkJyB8ICdQYXNzZWQnIHwgJ0V4ZWN1dGlvbicgPSAnSW4gUHJvZ3Jlc3MnO1xuICBASW5wdXQoKSBsaXZlTG9hZGluZ0xhYmVsOiBzdHJpbmcgPSAnTG9hZGluZy4uLic7XG4gIEBJbnB1dCgpIGlzQ29udGVudFZpZGVvTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYWlsZWRTdGF0dXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaXNWTkNTZXNzaW9uSW50cnVwcHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmlldzogU2VnbWVudFR5cGUgPSAndmlkZW8nO1xuICBASW5wdXQoKSBoaWRlVmlkZW9UYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYnJvd3NlclZpZXdQb3J0OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnJvd3NlckRldmljZTogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgaXNGYXN0Rm9yd2FyZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYXN0Rm9yd2FyZENvbmZpZzogRmFzdEZvcndhcmRDb25maWcgfCBudWxsID0gbnVsbDtcblxuICBnZXQgZmFzdEZvcndhcmRQcm9ncmVzc1BlcmNlbnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjID0gdGhpcy5mYXN0Rm9yd2FyZENvbmZpZztcbiAgICBpZiAoIWMgfHwgIWMudG90YWxTdGVwcykgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgKGMuY3VycmVudFN0ZXAgLyBjLnRvdGFsU3RlcHMpICogMTAwKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB2aWRlb1RpbWVVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGxheSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGF1c2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYXJrZXJIaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNYXJrZXI+KCk7XG4gIEBPdXRwdXQoKSBpc1ZpZGVvUGxheWluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1BsYXlQYXVzZU92ZXJsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIGdldCBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUoKTogJ2Jyb3dzZXInIHwgJ2RldmljZScge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHJldHVybiAnZGV2aWNlJztcbiAgICBpZiAodGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpKSByZXR1cm4gJ2RldmljZSc7XG4gICAgcmV0dXJuICdicm93c2VyJztcbiAgfVxuXG4gIGdldCBoYXNEZXZpY2VGcmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICB9XG5cbiAgZ2V0IGlzUGxheWVyU3dpdGNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJztcbiAgfVxuXG5cbiAgZ2V0IGlzQXNwZWN0UmF0aW9NYXRjaGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHdpbmRvd0FyID0gd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3Qgdmlld3BvcnRBciA9IHRoaXMuZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIC8gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQuaGVpZ2h0O1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDAuMTU7XG4gICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvd0FyIC0gdmlld3BvcnRBcikgLyB2aWV3cG9ydEFyIDwgdG9sZXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxpdmVDb250ZW50Q29udGFpbmVyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmlzTGl2ZSB8fCB0aGlzLmVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0FzcGVjdFJhdGlvTWF0Y2hlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtNYXRoLm1heCgyMDAsIHdpbmRvdy5pbm5lckhlaWdodCAtIDIwMCl9cHhgLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgc2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICB7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9LFxuICBdO1xuXG4gIHNwZWVkU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnMXgnLCB2YWx1ZTogJzF4JyB9LFxuICAgIHsgbGFiZWw6ICcyeCcsIHZhbHVlOiAnMngnIH0sXG4gICAgeyBsYWJlbDogJzV4JywgdmFsdWU6ICc1eCcgfSxcbiAgXTtcblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvVXJscyddKSB7XG4gICAgICBjb25zdCBhcnIgPSBjaGFuZ2VzWyd2aWRlb1VybHMnXS5jdXJyZW50VmFsdWUgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJyICYmIGFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmRldGVjdFZpZGVvRHVyYXRpb25zKGFycik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHMoYXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8vICBTSE9XIFBMQVkgUEFVU0UgT1ZFUkxBWVxuICBvblZpZGVvRnJhbWVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICB0aGlzLnNob3dQbGF5UGF1c2VPdmVybGF5ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcik7XG4gICAgdGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSBmYWxzZTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHBsYXlWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgZWxpbWluYXRlcyBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGxheVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBwbGF5aW5nIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwbGF5aW5nLCBza2lwcGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogc3RhcnRpbmcnLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIHZpZGVvIHRvIGJlIHJlYWR5IGlmIG5lZWRlZFxuICAgIGlmICh2aWRlby5yZWFkeVN0YXRlIDwgSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHdhaXRpbmcgZm9yIG1ldGFkYXRhJyk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8gbWV0YWRhdGEnKSk7XG4gICAgICAgIH07XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGhpdCBtYXJrZXJzIGlmIHN0YXJ0aW5nIGZyb20gYmVnaW5uaW5nXG4gICAgY29uc3QgY3VycmVudFRpbWVNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICBpZiAoY3VycmVudFRpbWVNcyA8IDEwMCkge1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHN0YXRlIHRvIGxvYWRpbmdcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBiZWZvcmUgcGxheWluZ1xuICAgICAgY29uc3QgY3VycmVudFZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjdXJyZW50VmlkZW8gfHwgY3VycmVudFZpZGVvICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgb3IgdW5hdmFpbGFibGUnKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBd2FpdCBwbGF5IHByb21pc2UgLSB0aGlzIGlzIGNyaXRpY2FsXG4gICAgICBhd2FpdCB2aWRlby5wbGF5KCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciBwbGF5IHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJQbGF5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlb0FmdGVyUGxheSB8fCB2aWRlb0FmdGVyUGxheSAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBwbGF5Jyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGxheSBzdWNjZWVkZWRcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGxheWluZyc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QbGF5LmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBwbGF5aW5nIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyB2LmN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgLy8gUGxheSBmYWlsZWRcbiAgICAgIC8vIENoZWNrIGlmIHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgICBjb25zdCB2aWRlb0FmdGVyRXJyb3IgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJFcnJvciB8fCB2aWRlb0FmdGVyRXJyb3IgIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBkdXJpbmcgZXJyb3InKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICBcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWJvcnRlZCAoZXhwZWN0ZWQgZHVyaW5nIHBhdXNlKScpO1xuICAgICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkLCByZXNldCB0byBwYXVzZWQgc3RhdGUgaW5zdGVhZCBvZiBlcnJvclxuICAgICAgICBpZiAodmlkZW9BZnRlckVycm9yICYmIHZpZGVvQWZ0ZXJFcnJvciA9PT0gdmlkZW8pIHtcbiAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGF1c2VWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wYXVzZVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGF1c2VWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIC8vIEFscmVhZHkgcGF1c2VkIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwYXVzZWQsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2luZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG5cbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2VkIHN1Y2Nlc3NmdWxseScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWUgbWVkaWEgb3BlcmF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqIFRoaXMgaXMgdGhlIENSSVRJQ0FMIGZpeCBmb3IgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqIEFsbCBtZWRpYSBvcGVyYXRpb25zIChwbGF5LCBwYXVzZSwgc2Vlaywgc3dpdGNoKSBnbyB0aHJvdWdoIHRoaXMgcXVldWVcbiAgICovXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gdGhpcy5vcGVyYXRpb25RdWV1ZVxuICAgICAgLnRoZW4oKCkgPT4gb3BlcmF0aW9uKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gTWVkaWEgb3BlcmF0aW9uIGZhaWxlZDonLCBlcnIpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGhhc011bHRpcGxlVmlkZW9zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqIEN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBbbXNdLiBzZWdtZW50Qm91bmRhcmllc1tpXSA9IHN1bSBvZiBkdXJhdGlvbnMgWzAuLmldICovXG4gIGdldCBzZWdtZW50Qm91bmRhcmllcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kYXJpZXM6IG51bWJlcltdID0gW107XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCBkIG9mIGR1cmF0aW9ucykge1xuICAgICAgc3VtICs9IGQ7XG4gICAgICBib3VuZGFyaWVzLnB1c2goc3VtKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKiogVG90YWwgZHVyYXRpb24gYWNyb3NzIGFsbCBzZWdtZW50cyBpbiBtcyAqL1xuICBnZXQgdG90YWxEdXJhdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMudmlkZW9EdXJhdGlvbnM7XG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiBkdXJhdGlvbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKiogVmlkZW8gZHVyYXRpb25zIGluIG1zIChkZXRlY3RlZCBvciBmcm9tIHNpbmdsZSB2aWRlbyBlbGVtZW50KSAqL1xuICBwcml2YXRlIGdldCB2aWRlb0R1cmF0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MgJiYgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh2aWRlbz8uZHVyYXRpb24gJiYgaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gW3ZpZGVvLmR1cmF0aW9uICogMTAwMF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgbGV0IG1hcmtlcnNUb1Byb2Nlc3M6IFN0ZXBNYXJrZXJbXTtcbiAgICBcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gYm91bmRhcmllcy5sZW5ndGgpIHtcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXhdO1xuICAgICAgICBcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnNcbiAgICAgICAgICAuZmlsdGVyKG1hcmtlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSBjdXJyZW50Qm91bmRhcnkuc3RhcnQgJiYgXG4gICAgICAgICAgICAgICAgICAgbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA8IGN1cnJlbnRCb3VuZGFyeS5lbmQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKG1hcmtlciA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihcbiAgICAgICAgICAgIG1hcmtlciwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5lbmRcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnMobWFya2Vyc1RvUHJvY2Vzcyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihtYXJrZXI6IFN0ZXBNYXJrZXIsIGFkanVzdG1lbnQ6IG51bWJlciwgdmlkZW9TdGFydDogbnVtYmVyLCB2aWRlb0VuZDogbnVtYmVyKTogU3RlcE1hcmtlciB7XG4gICAgY29uc3QgYWRqdXN0ZWRNYXJrZXI6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAuLi5tYXJrZXIsXG4gICAgICBjdW11bGF0aXZlRHVyYXRpb246IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgfTtcbiAgICBcbiAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYWRqdXN0ZWRNYXJrZXIuY2hpbGRTdGVwcyA9IG1hcmtlci5jaGlsZFN0ZXBzXG4gICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgIC5tYXAoY2hpbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2hpbGQ6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNoaWxkLmNoaWxkU3RlcHMgJiYgY2hpbGQuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGp1c3RlZENoaWxkLmNoaWxkU3RlcHMgPSBjaGlsZC5jaGlsZFN0ZXBzXG4gICAgICAgICAgICAgIC5maWx0ZXIobmVzdGVkQ2hpbGQgPT4gbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgICAgICAgIC5tYXAobmVzdGVkQ2hpbGQgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obmVzdGVkQ2hpbGQsIGFkanVzdG1lbnQsIHZpZGVvU3RhcnQsIHZpZGVvRW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhZGp1c3RlZENoaWxkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGFkanVzdGVkTWFya2VyO1xuICB9XG5cbiAgZ2V0U3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gZHVyYXRpb25NcykgKiAxMDA7XG4gIH1cblxuICBnZXRTdGVwQ29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ZXAubGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnIzYzNjZGMSc7XG4gIH1cblxuICBnZXRTdGVwUmVzdWx0Q29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3Ioc3RlcC5yZXN1bHQpO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyQ29sb3IobGV2ZWw/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBsZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjRkZBNTAwJztcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J10pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlICdTVUNDRVNTJzpcbiAgICAgICAgcmV0dXJuICcjMTJCNzZBJztcbiAgICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgICByZXR1cm4gJyNCOTFDMUMnO1xuICAgICAgY2FzZSAnQUJPUlRFRCc6XG4gICAgICAgIHJldHVybiAnI0Y3OTAwOSc7XG4gICAgICBjYXNlICdTS0lQUEVEJzpcbiAgICAgICAgcmV0dXJuICcjNjY3MDg1JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnIzYzNjZGMSc7XG4gICAgfVxuICB9XG5cbiAgb25NYXJrZXJDbGljayhldmVudDogTW91c2VFdmVudCwgbWFya2VyOiBTdGVwTWFya2VyKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb247XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAobWFya2VyLnRlc3RTdGVwSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb1VybCgpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4LCAwKSwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4gdGhpcy52aWRlb1VybHNbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlkZW9Vcmw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHJlc2V0VmlkZW9TdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IHJlc2V0dGluZycpO1xuXG4gICAgdmlkZW8ucGF1c2UoKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IGNvbXBsZXRlJyk7XG4gIH1cblxuICBwcmV2VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb1VybHMgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA8IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgb25UaW1lbGluZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNsaWNrWCAvIHJlY3Qud2lkdGgpKTtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IHBlcmNlbnQgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVGltZWxpbmVDbGljaycsIHtcbiAgICAgIHBlcmNlbnQsXG4gICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgcGxheWluZyBzdGF0ZSBCRUZPUkUgcGF1c2luZ1xuICAgIC8vIFVzZSBib3RoIGlzUGxheWluZyBmbGFnIGFuZCBwbGF5ZXJTdGF0ZSBmb3IgcmVsaWFiaWxpdHlcbiAgICB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnID0gdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdGFydERyYWcnLCB7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBkdXJpbmcgZHJhZyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7IC8vIEdsb2JhbCB0aW1lbGluZSBwb3NpdGlvblxuICB9XG5cbiAgc3RvcERyYWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgXG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWc7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBkcmFnIGVuZGVkJywge1xuICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmc6IHNob3VsZFJlc3VtZVBsYXlpbmcsXG4gICAgICBjdXJyZW50UGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcblxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIHNlZWsnLCB7XG4gICAgICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBsb25nZXIgdG8gZW5zdXJlIHNlZWsgaXMgZnVsbHkgY29tcGxldGVcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHN0YXRlIGlzICdwYXVzZWQnIGFmdGVyIHNlZWsgKHNlZWtUb1RpbWVJbnRlcm5hbCBzZXRzIGl0IHRvICdwYXVzZWQnKVxuICAgICAgICAvLyBJZiBzdGF0ZSBpcyBzdGlsbCAnc2Vla2luZycsIHdhaXQgYSBiaXQgbW9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBzZWVrIHN0aWxsIGluIHByb2dyZXNzLCB3YWl0aW5nIG1vcmUnKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vdyByZXN1bWUgcGxheWJhY2sgKHN0YXRlIHNob3VsZCBiZSAncGF1c2VkJyBhdCB0aGlzIHBvaW50KVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBwbGF5YmFjayByZXN1bWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3RvcERyYWc6IHVuZXhwZWN0ZWQgc3RhdGUgYWZ0ZXIgc2VlaywgYXR0ZW1wdGluZyB0byByZXN1bWUgYW55d2F5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzdW1lIGFueXdheSAtIGJldHRlciB0byB0cnkgdGhhbiB0byBsZWF2ZSBpdCBzdHVja1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB2aWRlbyB3YXMgcGF1c2VkLCBub3QgcmVzdW1pbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCcpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cbiAgXG4gIG9uVmlkZW9DYW5QbGF5KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvQ2FuUGxheScpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvblZpZGVvRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIC8vIFN3aXRjaCB0byBuZXh0IHZpZGVvIGFuZCBhdXRvLXBsYXkgaXRcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDE7XG5cbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwobmV4dEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFZpZGVvTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IDEwMCkgcmV0dXJuO1xuXG4gICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcblxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3N3aXRjaGluZycpIHtcbiAgICAgICAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoY3VycmVudE1zIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuY2hlY2tNYXJrZXJIaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICB0aGlzLm1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJscyksIDUwMCk7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVsb2FkIGFsbCB2aWRlbyBVUkxzIGluIHNlcXVlbmNlIChmaXJzdCwgdGhlbiBzZWNvbmQsIC4uLikgc28gdGhleSBhcmUgY2FjaGVkLlxuICAgKiBXaGVuIHVzZXIganVtcHMgdG8gYW55IHNlZ21lbnQsIHRoYXQgdmlkZW8gaXMgbGlrZWx5IGFscmVhZHkgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICB2aWRlby5wcmVsb2FkID0gJ2F1dG8nO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5wbGF5c0lubGluZSA9IHRydWU7XG4gICAgdmlkZW8uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSB2aWRlbztcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgbG9hZE5leHQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ICE9PSB2aWRlbyB8fCBpbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoKSB7XG4gICAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID09PSB2aWRlbykgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsID0gdmlkZW9VcmxzW2luZGV4XTtcbiAgICAgIHZpZGVvLnNyYyA9IHVybDtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb25zdCBvbkRvbmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgb25Eb25lKTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUpO1xuICAgICAgICBsb2FkTmV4dCgpO1xuICAgICAgfTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25Eb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IG9uRG9uZSgpLCAxNTAwMCk7XG4gICAgfTtcbiAgICBsb2FkTmV4dCgpO1xuICB9XG5cbiAgLyoqIFByZWxvYWQgbmV4dCBzZWdtZW50IHdoZW4gfjUtMTAgc2Vjb25kcyBmcm9tIGVuZGluZyB0byBtaW5pbWl6ZSBzd2l0Y2hpbmcgZGVsYXkgKi9cbiAgcHJpdmF0ZSBtYXliZVByZWxvYWROZXh0U2VnbWVudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MgfHwgIXRoaXMudmlkZW9VcmxzIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRpbWVMZWZ0SW5TZWdtZW50ID0gKHZpZGVvLmR1cmF0aW9uIC0gdmlkZW8uY3VycmVudFRpbWUpICogMTAwMDsgLy8gbXNcbiAgICBpZiAodGltZUxlZnRJblNlZ21lbnQgPiAxMDAwMCB8fCB0aW1lTGVmdEluU2VnbWVudCA8IDUwMDApIHJldHVybjsgLy8gUHJlbG9hZCB3aGVuIDUtMTBzIGZyb20gZW5kXG4gICAgY29uc3QgbmV4dFVybCA9IHRoaXMudmlkZW9VcmxzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxXTtcbiAgICBpZiAoIW5leHRVcmwpIHJldHVybjtcbiAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50Py5zcmMgPT09IG5leHRVcmwpIHJldHVybjsgLy8gQWxyZWFkeSBwcmVsb2FkaW5nXG4gICAgdGhpcy5wcmVsb2FkTmV4dFNlZ21lbnQobmV4dFVybCk7XG4gIH1cblxuICBwcml2YXRlIHByZWxvYWROZXh0U2VnbWVudCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICB2aWRlby5wcmVsb2FkID0gJ2F1dG8nO1xuICAgIHZpZGVvLnNyYyA9IHVybDtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCAoKSA9PiB7XG4gICAgICB2aWRlby5yZW1vdmUoKTtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgYWN0dWFsIHZpZGVvIGR1cmF0aW9ucyBieSBsb2FkaW5nIHZpZGVvIG1ldGFkYXRhXG4gICAqIFRoaXMgY3JlYXRlcyB0ZW1wb3JhcnkgdmlkZW8gZWxlbWVudHMgdG8gcmVhZCBkdXJhdGlvbiB3aXRob3V0IHBsYXlpbmdcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VmlkZW9EdXJhdGlvbnModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRldGVjdGVkIGR1cmF0aW9uc1xuICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgIGxldCBsb2FkZWRDb3VudCA9IDA7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGVtcFZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgIHRlbXBWaWRlby5wcmVsb2FkID0gJ21ldGFkYXRhJztcbiAgICAgIFxuICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHRlbXBWaWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkdXJhdGlvbk1zO1xuICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYW4gdXBcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChsb2FkZWRDb3VudCA9PT0gdmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBBbGwgdmlkZW8gZHVyYXRpb25zIGRldGVjdGVkOicsIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICB0ZW1wVmlkZW8uc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdW11bGF0aXZlIGR1cmF0aW9uIGJvdW5kYXJpZXMgZm9yIGVhY2ggdmlkZW9cbiAgICogUmV0dXJucyBhbiBhcnJheSB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgW3N0YXJ0RHVyYXRpb24sIGVuZER1cmF0aW9uXSBmb3IgdGhhdCB2aWRlb1xuICAgKiBVc2VzIGRldGVjdGVkIHZpZGVvIGR1cmF0aW9ucyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHZpZGVvRHVyYXRpb25zIGlucHV0XG4gICAqL1xuICBwcml2YXRlIGdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4ge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgZGV0ZWN0ZWQgZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBwcm92aWRlZCBkdXJhdGlvbnNcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCBcbiAgICAgID8gdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zIFxuICAgICAgOiBbXTtcbiAgICBcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBib3VuZGFyaWVzOiBBcnJheTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGN1bXVsYXRpdmVTdGFydCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBkdXJhdGlvbiBvZiBkdXJhdGlvbnMpIHtcbiAgICAgIGJvdW5kYXJpZXMucHVzaCh7XG4gICAgICAgIHN0YXJ0OiBjdW11bGF0aXZlU3RhcnQsXG4gICAgICAgIGVuZDogY3VtdWxhdGl2ZVN0YXJ0ICsgZHVyYXRpb25cbiAgICAgIH0pO1xuICAgICAgY3VtdWxhdGl2ZVN0YXJ0ICs9IGR1cmF0aW9uO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIGFsbCBtYXJrZXJzIHJlY3Vyc2l2ZWx5IGluY2x1ZGluZyBjaGlsZFN0ZXBzXG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5NYXJrZXJzKG1hcmtlcnM6IFN0ZXBNYXJrZXJbXSk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgY29uc3QgZmxhdHRlbmVkOiBTdGVwTWFya2VyW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBmbGF0dGVuUmVjdXJzaXZlID0gKG1hcmtlcnM6IFN0ZXBNYXJrZXJbXSkgPT4ge1xuICAgICAgbWFya2Vycy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICAgIC8vIEFkZCB0aGUgbWFya2VyIGl0c2VsZlxuICAgICAgICBmbGF0dGVuZWQucHVzaChtYXJrZXIpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgYWRkIGNoaWxkIG1hcmtlcnNcbiAgICAgICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmbGF0dGVuUmVjdXJzaXZlKG1hcmtlci5jaGlsZFN0ZXBzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBcbiAgICBmbGF0dGVuUmVjdXJzaXZlKG1hcmtlcnMpO1xuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTWFya2VySGl0KGdsb2JhbFRpbWVNczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGxheWluZyB8fCB0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIG1hcmtlcnMgKGluY2x1ZGluZyBuZXN0ZWQgb25lcykgZm9yIGEgbWF0Y2hcbiAgICBjb25zdCBhbGxNYXJrZXJzID0gdGhpcy5mbGF0dGVuTWFya2Vycyh0aGlzLnN0ZXBNYXJrZXJzKTtcbiAgICBjb25zdCB0b2xlcmFuY2UgPSAyMDA7IC8vIDIwMG1zIHRvbGVyYW5jZSBmb3IgbWF0Y2hpbmdcbiAgICBcbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiBhbGxNYXJrZXJzKSB7XG4gICAgICAvLyBTa2lwIGlmIG1hcmtlciBkb2Vzbid0IGhhdmUgdGVzdFN0ZXBJZFxuICAgICAgaWYgKCFtYXJrZXIudGVzdFN0ZXBJZCkgY29udGludWU7XG4gICAgICBcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBoaXRcbiAgICAgIGlmICh0aGlzLmhpdE1hcmtlcnMuaGFzKG1hcmtlci50ZXN0U3RlcElkKSkgY29udGludWU7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgdGltZSBtYXRjaGVzIG1hcmtlciB0aW1lICh3aXRoaW4gdG9sZXJhbmNlKVxuICAgICAgY29uc3QgdGltZURpZmZlcmVuY2UgPSBNYXRoLmFicyhnbG9iYWxUaW1lTXMgLSBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uKTtcbiAgICAgIGlmICh0aW1lRGlmZmVyZW5jZSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgLy8gTWFyayBhcyBoaXQgYW5kIGVtaXQgZXZlbnRcbiAgICAgICAgdGhpcy5oaXRNYXJrZXJzLmFkZChtYXJrZXIudGVzdFN0ZXBJZCk7XG4gICAgICAgIHRoaXMubWFya2VySGl0LmVtaXQobWFya2VyKTtcbiAgICAgICAgYnJlYWs7IC8vIE9ubHkgZW1pdCBvbmUgbWFya2VyIHBlciBjaGVja1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUZ1bGxTY3JlZW4oKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGJlZm9yZSBmdWxsc2NyZWVuIHRyYW5zaXRpb24gdG8gYXZvaWQgc3RhdGUgaXNzdWVzXG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUb2dnbGUgZnVsbHNjcmVlblxuICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gIXRoaXMuaXNGdWxsU2NyZWVuO1xuICAgIFxuICAgIC8vIFJlc2V0IHBsYXllciBzdGF0ZSB0byBhbGxvdyByZS1pbml0aWFsaXphdGlvbiBhZnRlciBET00gdXBkYXRlXG4gICAgLy8gVGhlIHN0YXRlIG1pZ2h0IGJlIHN0dWNrIGluICdsb2FkaW5nJyBvciAnZXJyb3InIGFmdGVyIGZ1bGxzY3JlZW4gdHJhbnNpdGlvblxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG4gICAgXG4gICAgLy8gV2FpdCBmb3IgQW5ndWxhciB0byB1cGRhdGUgdGhlIERPTSwgdGhlbiByZS1pbml0aWFsaXplIHZpZGVvXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAvLyBSZXN0b3JlIHZpZGVvIHBvc2l0aW9uIGlmIGl0IHdhcyBzZXRcbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lID4gMCAmJiB2aWRlby5kdXJhdGlvbiA+IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXBwbHkgcGxheWJhY2sgcmF0ZVxuICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXR0YWNoIGxpc3RlbmVyc1xuICAgICAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXNldCBzdGF0ZSB0byAncGF1c2VkJyAocmVhZHkgdG8gcGxheSlcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIHJlLWluaXRpYWxpemVkJywge1xuICAgICAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVGdWxsU2NyZWVuOiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCBhZnRlciB0cmFuc2l0aW9uJyk7XG4gICAgICAgIC8vIFRyeSBhZ2FpbiBhZnRlciBhIGJpdCBtb3JlIHRpbWVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9SZXRyeSA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBpZiAodmlkZW9SZXRyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyAhPT0gJ3ZpZGVvJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscykge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbCgwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0VGltZShzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghc2Vjb25kcyB8fCBpc05hTihzZWNvbmRzKSkgcmV0dXJuICcwMDowMCc7XG4gICAgXG4gICAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5mbG9vcihzZWNvbmRzKTtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XG4gICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAlIDM2MDApIC8gNjApO1xuICAgIGNvbnN0IHNlY3MgPSB0b3RhbFNlY29uZHMgJSA2MDtcbiAgICBcbiAgICAvLyBJZiBob3VycyA+IDAsIHNob3cgSEg6TU06U1MgZm9ybWF0LCBvdGhlcndpc2Ugc2hvdyBNTTpTUyBmb3JtYXRcbiAgICBpZiAoaG91cnMgPiAwKSB7XG4gICAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBgJHttaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCBlcnJvci9sb2FkaW5nIHN0YXRlcyB3aGVuIHZpZGVvIGVsZW1lbnQgaXMgcmVjcmVhdGVkIChlLmcuLCBkdXJpbmcgZnVsbHNjcmVlbiB0b2dnbGUpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0VsZW1lbnRSZWFkeTogcmVzZXR0aW5nIGVycm9yL2xvYWRpbmcgc3RhdGUnKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgY3VycmVudCBwbGF5YmFjayBzcGVlZCB3aGVuIHRoZSB2aWRlbyBlbGVtZW50IGlzIGZpcnN0IHJlYWR5XG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcblxuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnN0IG51bWVyaWMgPSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFNwZWVkLnJlcGxhY2UoJ3gnLCAnJykpO1xuICAgIGNvbnN0IHJhdGUgPSAhaXNOYU4obnVtZXJpYykgJiYgbnVtZXJpYyA+IDAgPyBudW1lcmljIDogMTtcbiAgICB2aWRlby5wbGF5YmFja1JhdGUgPSByYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kVmlkZW9JbmRleEZvclRpbWVzdGFtcChjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHdoaWNoIHZpZGVvIGNvbnRhaW5zIHRoaXMgdGltZXN0YW1wXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib3VuZGFyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBib3VuZGFyeSA9IGJvdW5kYXJpZXNbaV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA+PSBib3VuZGFyeS5zdGFydCAmJiBjdW11bGF0aXZlVGltZXN0YW1wIDwgYm91bmRhcnkuZW5kKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRpbWVzdGFtcCBpcyBleGFjdGx5IGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgdmlkZW8sIHJldHVybiB0aGUgbGFzdCB2aWRlbyBpbmRleFxuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhc3RCb3VuZGFyeSA9IGJvdW5kYXJpZXNbYm91bmRhcmllcy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdW11bGF0aXZlVGltZXN0YW1wID09PSBsYXN0Qm91bmRhcnkuZW5kKSB7XG4gICAgICAgIHJldHVybiBib3VuZGFyaWVzLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRhcmdldFZpZGVvSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXRoaXMudmlkZW9VcmxzIHx8IHRhcmdldFZpZGVvSW5kZXggPCAwIHx8IHRhcmdldFZpZGVvSW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRWaWRlb0luZGV4ID0gdGhpcy5maW5kVmlkZW9JbmRleEZvclRpbWVzdGFtcChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICBpZiAodGFyZ2V0VmlkZW9JbmRleCA9PT0gbnVsbCkge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2VlazogQ291bGQgbm90IGZpbmQgdmlkZW8gZm9yIHRpbWVzdGFtcCcsIGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgY29uc3QgdGFyZ2V0Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RhcmdldFZpZGVvSW5kZXhdO1xuICAgIGNvbnN0IHJlbGF0aXZlVGltZXN0YW1wID0gY3VtdWxhdGl2ZVRpbWVzdGFtcCAtIHRhcmdldEJvdW5kYXJ5LnN0YXJ0O1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHJlbGF0aXZlVGltZXN0YW1wKTtcbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gY3VtdWxhdGl2ZVRpbWVzdGFtcDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgY29uc3Qgc2Vla1NlY29uZHMgPSByZWxhdGl2ZVRpbWVzdGFtcCAvIDEwMDA7XG4gICAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlY29uZHMsIHZpZGVvLmR1cmF0aW9uIHx8IHNlZWtTZWNvbmRzKSk7XG4gICAgICBcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uU2Vla2VkID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMTAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdGFyZ2V0VGltZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gY3VtdWxhdGl2ZVRpbWVzdGFtcDtcbiAgICAgIFxuICAgICAgaWYgKE1hdGguYWJzKHZpZGVvLmN1cnJlbnRUaW1lIC0gdGFyZ2V0VGltZSkgPiAwLjUpIHtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBlci12aWRlbyBwcm9ncmVzc1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2VlayBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiICAgW25nU3R5bGVdPVwie1xuICBwb3NpdGlvbjogaXNGdWxsU2NyZWVuID8gJ2ZpeGVkJyA6IG51bGwsXG4gIGluc2V0OiBpc0Z1bGxTY3JlZW4gPyAnMXJlbScgOiBudWxsLFxuICB6SW5kZXg6IGlzRnVsbFNjcmVlbiA/ICc1MCcgOiBudWxsLFxuICBib3hTaGFkb3c6IGlzRnVsbFNjcmVlbiA/ICcwcHggMTNweCAyNXB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIDogbnVsbCxcbiAgYm9yZGVyUmFkaXVzOiBpc0Z1bGxTY3JlZW4gPyAnLjVyZW0nIDogbnVsbCxcbiAgYm9yZGVyOiBpc0Z1bGxTY3JlZW4gPyAnMXB4IHNvbGlkICNFNUU3RUInIDogbnVsbCxcbiAgd2lkdGg6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiBudWxsLFxuICBoZWlnaHQ6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiAnMTAwJScsXG4gIG92ZXJmbG93OiBpc0Z1bGxTY3JlZW4gPyAnaGlkZGVuJyA6IG51bGxcbn1cIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjRkZGRkZGXVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUI7Ym94LXNoYWRvdzogMHB4IDFweCAycHggMHB4ICMwMDAwMDAwRDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTGl2ZVwiIGNsYXNzPVwiY3FhLWgtWzIxcHhdIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1tci0yIGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtcm91bmRlZC1bNnB4XVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0Y5QkZCRjtcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy0yIGNxYS1oLTIgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRjQ3RjdGXSBjcWEtb3BhY2l0eS03NSBjcWEtYW5pbWF0ZS1waW5nXCI+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPkxpdmU8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfOTM1XzE1ODQ3KVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMC42MjUgNUMwLjYyNSA2LjE2MDMyIDEuMDg1OTQgNy4yNzMxMiAxLjkwNjQxIDguMDkzNTlDMi43MjY4OCA4LjkxNDA2IDMuODM5NjggOS4zNzUgNSA5LjM3NUM2LjE2MDMyIDkuMzc1IDcuMjczMTIgOC45MTQwNiA4LjA5MzU5IDguMDkzNTlDOC45MTQwNiA3LjI3MzEyIDkuMzc1IDYuMTYwMzIgOS4zNzUgNUM5LjM3NSAzLjgzOTY4IDguOTE0MDYgMi43MjY4OCA4LjA5MzU5IDEuOTA2NDFDNy4yNzMxMiAxLjA4NTk0IDYuMTYwMzIgMC42MjUgNSAwLjYyNUMzLjgzOTY4IDAuNjI1IDIuNzI2ODggMS4wODU5NCAxLjkwNjQxIDEuOTA2NDFDMS4wODU5NCAyLjcyNjg4IDAuNjI1IDMuODM5NjggMC42MjUgNVpcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0zLjEyNSA1QzMuMTI1IDMuODM5NjggMy4zMjI1NCAyLjcyNjg4IDMuNjc0MTcgMS45MDY0MUM0LjAyNTgxIDEuMDg1OTQgNC41MDI3MiAwLjYyNSA1IDAuNjI1QzUuNDk3MjggMC42MjUgNS45NzQxOSAxLjA4NTk0IDYuMzI1ODIgMS45MDY0MUM2LjY3NzQ2IDIuNzI2ODggNi44NzUgMy44Mzk2OCA2Ljg3NSA1QzYuODc1IDYuMTYwMzIgNi42Nzc0NiA3LjI3MzEyIDYuMzI1ODIgOC4wOTM1OUM1Ljk3NDE5IDguOTE0MDYgNS40OTcyOCA5LjM3NSA1IDkuMzc1QzQuNTAyNzIgOS4zNzUgNC4wMjU4MSA4LjkxNDA2IDMuNjc0MTcgOC4wOTM1OUMzLjMyMjU0IDcuMjczMTIgMy4xMjUgNi4xNjAzMiAzLjEyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjkzNzUgNi40NTg2Nkg5LjA2MjVNMC45Mzc1IDMuNTQxOTlIOS4wNjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfOTM1XzE1ODQ3XCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4wODMyNSAwLjgzMzAwOEgyLjkxNjU5QzIuNDU2MzUgMC44MzMwMDggMi4wODMyNSAxLjIwNjEgMi4wODMyNSAxLjY2NjM0VjguMzMzMDFDMi4wODMyNSA4Ljc5MzI0IDIuNDU2MzUgOS4xNjYzNCAyLjkxNjU5IDkuMTY2MzRINy4wODMyNUM3LjU0MzQ5IDkuMTY2MzQgNy45MTY1OCA4Ljc5MzI0IDcuOTE2NTggOC4zMzMwMVYxLjY2NjM0QzcuOTE2NTggMS4yMDYxIDcuNTQzNDkgMC44MzMwMDggNy4wODMyNSAwLjgzMzAwOFpcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41SDUuMDA0MTdcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gIWNxYS10ZXh0LVsxMHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1sLTJcIj5cbiAgICAgICAgICB7eyBwbGF0Zm9ybU5hbWUgfX1cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1tbC0xXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidTY3JlZW4gc2l6ZTogJyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCArICd4JyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIMK3XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1tbC0xXCI+XG4gICAgICAgICAgICAgIHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCB9fXh7eyBlZmZlY3RpdmVCcm93c2VyVmlld1BvcnQuaGVpZ2h0IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcygpXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZ2V0U3RhdHVzVGV4dENsYXNzKClcIj57eyBsaXZlU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTGl2ZVwiPlxuICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFxuICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNlZ21lbnRzXCIgXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4cGFuZFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAxLjI1SDguNzVWMy43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc0OTkyIDEuMjVMNS44MzMyNSA0LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgOC43NDk2N0w0LjE2NjY3IDUuODMzMDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NSA4Ljc1SDEuMjVWNi4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRnVsbFNjcmVlblwiIFxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeGl0IGZ1bGwgc2NyZWVuXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc1IDYuMjVINi4yNVY4Ljc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUwMDggNi4yNUw5LjE2Njc1IDkuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzMyNTIgMC44MzMwMDhMMy43NDk5MiAzLjc0OTY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgMy43NUgzLjc1VjEuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWgtW2NhbGMoMTAwJS00MXB4KV1cIj5cbiAgICA8IS0tIEZhc3QtZm9yd2FyZCBvdmVybGF5OiBjb3ZlcnMgY29udGVudCBhcmVhIGJ1dCBub3QgaGVhZGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0Zhc3RGb3J3YXJkaW5nICYmIGZhc3RGb3J3YXJkQ29uZmlnXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTZcIlxuICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC14bCBjcWEtdy1mdWxsXCJcbiAgICAgICAgICAgc3R5bGU9XCJtYXgtd2lkdGg6IDUwMHB4OyBwYWRkaW5nOiAzMnB4OyBib3gtc2hhZG93OiAwcHggMjVweCA1MHB4IC0xMnB4ICMwMDAwMDA0MDsgYm9yZGVyOiAxcHggc29saWQgI0U1RTVFNVwiPlxuICAgICAgICA8IS0tIFNwYXJrbGUgYXZhdGFyIHdpdGggcm90YXRpbmcgYXJjIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYi0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZVwiIHN0eWxlPVwid2lkdGg6IDU2cHg7IGhlaWdodDogNTZweDtcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogcmdiYSg2Myw2NywyMzgsMC4xMik7XCI+XG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuMDI1MSAwQzEyLjE3MyAwLjA2MzQxMjEgMTIuMjM2MiAwLjIxODI2NCAxMi4yOTY4IDAuMzYyMTFDMTIuMzI3MiAwLjQ0NTkyMyAxMi4zNTUgMC41MzAxOTIgMTIuMzgyMSAwLjYxNTEzM0MxMi4zOTI3IDAuNjQ3NjgyIDEyLjQwMzMgMC42ODAyMzEgMTIuNDE0MiAwLjcxMzc2NkMxMi41NTQ4IDEuMTUxNzcgMTIuNjgwMSAxLjU5NDQ3IDEyLjgwNjEgMi4wMzY4NkMxMi44MzQ2IDIuMTM2NzMgMTIuODYzMiAyLjIzNjU2IDEyLjg5MTggMi4zMzYzOEMxMy4wMzc1IDIuODQ0NjQgMTMuMTgyMSAzLjM1MzIxIDEzLjMyNTggMy44NjIwMUMxMy4zNDYgMy45MzM0NyAxMy4zNjYyIDQuMDA0OTIgMTMuMzg2NCA0LjA3NjM4QzEzLjQ0MzQgNC4yNzc4MyAxMy41MDAzIDQuNDc5MyAxMy41NTY5IDQuNjgwODdDMTMuNjc2NCA1LjEwNjc4IDEzLjc5OTMgNS41MzE0NSAxMy45MzAxIDUuOTU0MDVDMTMuOTQxNSA1Ljk5MTAyIDEzLjk1MjkgNi4wMjc5OSAxMy45NjQ3IDYuMDY2MDhDMTQuMzA0NSA3LjE1MzE4IDE0Ljc4NjIgOC4xMjc1MSAxNS41NzU3IDguOTU3NDNDMTUuNTk1MyA4Ljk3OSAxNS42MTQ4IDkuMDAwNTggMTUuNjM1IDkuMDIyODJDMTUuOTcyIDkuMzgyNDYgMTYuNDA0NSA5LjY3MDYzIDE2LjgzNjggOS45MDMyMkMxNi44NTg4IDkuOTE1MjYgMTYuODgwOCA5LjkyNzI5IDE2LjkwMzUgOS45Mzk3QzE4LjE3NTcgMTAuNjIzMSAxOS43MDUzIDEwLjkyMzcgMjEuMDgzMiAxMS4zMjM4QzIxLjY4NjkgMTEuNDk5MiAyMi4yODg4IDExLjY4MDIgMjIuODg4NSAxMS44NjkxQzIyLjkzMDYgMTEuODgyMyAyMi45NzI3IDExLjg5NTYgMjMuMDE0OSAxMS45MDg4QzIzLjE0MDkgMTEuOTQ4MyAyMy4yNjY3IDExLjk4ODUgMjMuMzkyMyAxMi4wMjkzQzIzLjQyMTYgMTIuMDM4NSAyMy40NTA5IDEyLjA0NzggMjMuNDgxIDEyLjA1NzNDMjMuNjU0MSAxMi4xMTQ2IDIzLjgxOTcgMTIuMTgyMSAyMy45NjE4IDEyLjI5OTJDMjQuMDA1MSAxMi4zOTM4IDI0LjAwNTEgMTIuMzkzOCAyMy45OTMzIDEyLjQ4ODRDMjMuODU1IDEyLjYyNTggMjMuNzE3OSAxMi42OTAyIDIzLjUzNTQgMTIuNzUzQzIzLjUwOTMgMTIuNzYyMyAyMy40ODMyIDEyLjc3MTYgMjMuNDU2NCAxMi43ODExQzIzLjE0ODMgMTIuODg5MiAyMi44MzYgMTIuOTgzOCAyMi41MjM0IDEzLjA3NzVDMjIuNDU5MiAxMy4wOTY5IDIyLjM5NSAxMy4xMTYzIDIyLjMzMDkgMTMuMTM1N0MyMS45MzUyIDEzLjI1NTEgMjEuNTM4OSAxMy4zNzE5IDIxLjE0MjEgMTMuNDg3NEMyMC42MTk1IDEzLjYzOTUgMjAuMDk3NyAxMy43OTQyIDE5LjU3NjMgMTMuOTUwNkMxOS40OTA5IDEzLjk3NjMgMTkuNDA1NSAxNC4wMDE4IDE5LjMyIDE0LjAyNzJDMTguODcxMiAxNC4xNjEgMTguNDI0NiAxNC4yOTk1IDE3Ljk4MTcgMTQuNDUxNkMxNy45NDUgMTQuNDY0MiAxNy45MDgyIDE0LjQ3NjggMTcuODcwNCAxNC40ODk3QzE2LjM4NyAxNS4wMDU5IDE1LjI1NjMgMTUuOTY4NyAxNC41NDg2IDE3LjM3NjhDMTQuMTY3IDE4LjE2ODEgMTMuOTQxOSAxOS4wMjM5IDEzLjcxMjQgMTkuODY4NUMxMy42NTAzIDIwLjA5NjQgMTMuNTg0MiAyMC4zMjMgMTMuNTE3NSAyMC41NDk2QzEzLjQ2NTEgMjAuNzI3OCAxMy40MTM5IDIwLjkwNjQgMTMuMzY0IDIxLjA4NTNDMTMuMzU4IDIxLjEwNjYgMTMuMzUyMSAyMS4xMjc5IDEzLjM0NiAyMS4xNDk5QzEzLjMxNzIgMjEuMjUzIDEzLjI4ODUgMjEuMzU2MiAxMy4yNiAyMS40NTk0QzEzLjE4NzIgMjEuNzIxMSAxMy4xMDg3IDIxLjk4MDcgMTMuMDI4MSAyMi4yNDAxQzEyLjg4NTEgMjIuNzAxMiAxMi43NTQ5IDIzLjE2NTYgMTIuNjI1NiAyMy42MzA2QzEyLjQzMDUgMjQuMzMwOCAxMi40MzA1IDI0LjMzMDggMTIuMzE5OSAyNC42Njc0QzEyLjMxMjYgMjQuNjkgMTIuMzA1MiAyNC43MTI2IDEyLjI5NzcgMjQuNzM1OUMxMi4yNTczIDI0Ljg1NTcgMTIuMjE1OCAyNC45NjYgMTIuMTM5NCAyNS4wNjc0QzEyLjAyMzEgMjUuMDkzIDEyLjAyMzEgMjUuMDkzIDExLjkxODcgMjUuMDk4OUMxMS43OTkzIDI0LjkyNDkgMTEuNzIwMiAyNC43NTYyIDExLjY1NjkgMjQuNTU1M0MxMS42NDc2IDI0LjUyNjkgMTEuNjM4NCAyNC40OTg0IDExLjYyODkgMjQuNDY5MUMxMS41MTE2IDI0LjEwMTkgMTEuNDA2NyAyMy43MzA5IDExLjMwMTggMjMuMzZDMTEuMjc3OCAyMy4yNzUyIDExLjI1MzYgMjMuMTkwNCAxMS4yMjk1IDIzLjEwNTZDMTEuMDQ5NiAyMi40NzM3IDEwLjg3MjcgMjEuODQwOSAxMC42OTYgMjEuMjA4MUM5Ljk2MDE5IDE4LjA3NzUgOS45NjAxOSAxOC4wNzc1IDguMTA0IDE1LjU0NjRDOC4wNzQyNSAxNS41MjIyIDguMDQ0NSAxNS40OTc5IDguMDEzODUgMTUuNDcyOUM2Ljc5NzY3IDE0LjQ5ODkgNS4xOTU1NiAxNC4xMzgyIDMuNzI4NCAxMy43MTU1QzMuMzY1NTMgMTMuNjEwOSAzLjAwMjggMTMuNTA1OCAyLjY0MDA5IDEzLjQwMDdDMi42MDgzNyAxMy4zOTE1IDIuNjA4MzcgMTMuMzkxNSAyLjU3NjAxIDEzLjM4MjFDMi4wNTI4MyAxMy4yMzA0IDEuNTI5OCAxMy4wNzgzIDEuMDA4NiAxMi45MTk5QzAuOTg2NTQ5IDEyLjkxMzIgMC45NjQ1IDEyLjkwNjYgMC45NDE3ODMgMTIuODk5N0MwLjE0MTA2NCAxMi42NTc4IDAuMTQxMDY0IDEyLjY1NzggMC4wMDE3MjQxIDEyLjQ4ODRDLTAuMDAyMjE2NyAxMi40MTE1IC0wLjAwMjIxNjcgMTIuNDExNSAwLjAzMzI1MDUgMTIuMzMwN0MwLjE3ODg4OSAxMi4xODggMC4zMjAyMDUgMTIuMTI2OSAwLjUxMjQyNiAxMi4wNjQ3QzAuNTQwMjU5IDEyLjA1NTQgMC41NjgwOSAxMi4wNDYgMC41OTY3NjYgMTIuMDM2NEMwLjY4MjAwOCAxMi4wMDc5IDAuNzY3NDM2IDExLjk4MDEgMC44NTI5MzYgMTEuOTUyNEMwLjg3NzMzNSAxMS45NDQ0IDAuOTAxNzM1IDExLjkzNjQgMC45MjY4NzQgMTEuOTI4MkMxLjA5OTQzIDExLjg3MTYgMS4yNzI2IDExLjgxNzEgMS40NDYwMyAxMS43NjMzQzEuNDg4NjQgMTEuNzUgMS40ODg2NCAxMS43NSAxLjUzMjEyIDExLjczNjRDMi4yNzI3MiAxMS41MDYxIDMuMDE4MTUgMTEuMjkxNyAzLjc2MzM2IDExLjA3NjlDNC4zMTg2NiAxMC45MTY4IDQuODczMDIgMTAuNzU0IDUuNDI1NjEgMTAuNTg0N0M1LjQ1MSAxMC41NzcgNS40NzY0IDEwLjU2OTIgNS41MDI1NiAxMC41NjEzQzYuNzgyNjcgMTAuMTcwNSA4LjAzNDA5IDkuNjE2MTIgOC44NjA2MyA4LjUxNjA2QzguODczIDguNDk5NzQgOC44ODUzOCA4LjQ4MzQyIDguODk4MTMgOC40NjY2MUM5LjgxODYgNy4yNDU2NCAxMC4xNzc1IDUuNzYwODIgMTAuNTc4NSA0LjMxMjAxQzEwLjcxMDUgMy44MzU1MiAxMC44NDQgMy4zNTk0NyAxMC45Nzc5IDIuODgzNTZDMTEuMDE1IDIuNzUxNzcgMTEuMDUyMSAyLjYxOTk3IDExLjA4OSAyLjQ4ODEyQzExLjIzNzIgMS45NTg1MiAxMS4zODc2IDEuNDI5NjQgMTEuNTQ2NyAwLjkwMzE4MUMxMS41NjE2IDAuODUzODgyIDExLjU3NjQgMC44MDQ1NjEgMTEuNTkxMSAwLjc1NTIxOEMxMS44MTM4IDAuMDExMTIwNSAxMS44MTM4IDAuMDExMTIwNSAxMi4wMjUxIDBaXCIgZmlsbD1cIiMzRjQzRUVcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOS4yOTYyIDEuNTQ4OTlDMTkuNDQxIDEuNzEyOCAxOS40Njk5IDEuOTA1MzIgMTkuNTE1IDIuMTE0NDlDMTkuNjY1MyAyLjc3MTYxIDE5LjgzODQgMy4zNzU4NCAyMC40Mzk0IDMuNzU3NTZDMjAuODEwMiAzLjk2MjYzIDIxLjI1MjIgNC4wNTU5NSAyMS42NjMgNC4xNDQwOUMyMS44MzY0IDQuMTgyMDUgMjEuOTgyOSA0LjIzMjQyIDIyLjEzMTYgNC4zMzMxNkMyMi4xNjUxIDQuMzg2MzYgMjIuMTY1MSA0LjM4NjM2IDIyLjE2MzIgNC40Nzg5N0MyMi4xMjg3IDQuNTkxNTkgMjIuMDk4NCA0LjYyNzkxIDIyLjAwNzUgNC43MDE2M0MyMS45MDgxIDQuNzM0ODggMjEuOTA4MSA0LjczNDg4IDIxLjc4ODggNC43NjA3NEMyMS43NDM3IDQuNzcxMSAyMS42OTg1IDQuNzgxNTggMjEuNjUzNSA0Ljc5MjE0QzIxLjYyOTMgNC43OTc3NCAyMS42MDUxIDQuODAzMzUgMjEuNTgwMyA0LjgwOTEyQzIwLjg0NTYgNC45NzkwNyAyMC44NDU2IDQuOTc5MDcgMjAuMjEwNSA1LjM2MzY4QzIwLjE4OTkgNS4zODAzIDIwLjE2OTIgNS4zOTY5MiAyMC4xNDc5IDUuNDE0MDVDMTkuNjk0MSA1LjgxNDI2IDE5LjU5ODEgNi40OCAxOS40NjE1IDcuMDM3N0MxOS40NTM2IDcuMDY4MzMgMTkuNDQ1OCA3LjA5ODk2IDE5LjQzNzcgNy4xMzA1MUMxOS40MzEgNy4xNTc2MiAxOS40MjQyIDcuMTg0NzQgMTkuNDE3MiA3LjIxMjY3QzE5LjM4NzcgNy4yOTU0NiAxOS4zNTcyIDcuMzQ5NDUgMTkuMjk2MiA3LjQxMjg5QzE5LjEyNjYgNy40MzQ0NCAxOS4xMjY2IDcuNDM0NDQgMTkuMDQ0IDcuNDEyODlDMTguOTEyOCA3LjMxMTE0IDE4Ljg4MzQgNy4xOTUyNCAxOC44NDkxIDcuMDM5NUMxOC44NDMzIDcuMDE1MzkgMTguODM3NiA2Ljk5MTI3IDE4LjgzMTcgNi45NjY0MkMxOC44MTM0IDYuODg5NCAxOC43OTU2IDYuODEyMjYgMTguNzc4IDYuNzM1MDhDMTguNjM5OCA2LjEzNDAzIDE4LjQ4MzcgNS41NDQzMiAxNy45MzI0IDUuMTkyMDFDMTcuNTAxNSA0Ljk1MTcyIDE2Ljk3NzYgNC44MzgwOCAxNi40OTYgNC43NDYzMUMxNi4zNjQgNC43MTg4MyAxNi4yODg0IDQuNjg0MjcgMTYuMjA2NyA0LjU3NTUyQzE2LjE4ODkgNC40NjUxOCAxNi4xODg5IDQuNDY1MTggMTYuMjA2NyA0LjM1NDg0QzE2LjMzMjIgNC4yMjQ4NCAxNi40NjQ0IDQuMTkzMTEgMTYuNjM0MiA0LjE1Mzg2QzE2LjY4NzcgNC4xNDA2MSAxNi43NDEyIDQuMTI3MjYgMTYuNzk0NyA0LjExMzgzQzE2LjgyMjMgNC4xMDY5NCAxNi44NSA0LjEwMDA0IDE2Ljg3ODQgNC4wOTI5NEMxNy4wMTkzIDQuMDU2NjggMTcuMTU4OCA0LjAxNjAyIDE3LjI5ODMgMy45NzQ1NUMxNy4zMjM2IDMuOTY3MiAxNy4zNDg5IDMuOTU5ODUgMTcuMzc1MSAzLjk1MjI3QzE3LjY1ODUgMy44Njc1MiAxNy45MDMyIDMuNzU5MTEgMTguMTI5OCAzLjU2NjY4QzE4LjE1MDkgMy41NDkyOCAxOC4xNzIgMy41MzE4OSAxOC4xOTM4IDMuNTEzOTdDMTguNTQ2NSAzLjE5NjU4IDE4LjY2NjMgMi43MTk3NiAxOC43NzUxIDIuMjc0ODRDMTguNzgzNCAyLjI0MTA2IDE4Ljc5MTYgMi4yMDcyOCAxOC44MDAyIDIuMTcyNDhDMTguODE2NyAyLjEwNDYzIDE4LjgzMjkgMi4wMzY3IDE4Ljg0ODggMS45Njg3QzE4Ljg2MDIgMS45MjEzOSAxOC44NjAyIDEuOTIxMzkgMTguODcxNyAxLjg3MzEyQzE4Ljg3ODQgMS44NDQ4NiAxOC44ODUgMS44MTY1OSAxOC44OTE4IDEuNzg3NDdDMTguOTIwOSAxLjY5NzQ5IDE4Ljk1OSAxLjYyNjgzIDE5LjAxMjUgMS41NDg5OUMxOS4xMTUzIDEuNDk3NjEgMTkuMTg3NCAxLjUyMDg0IDE5LjI5NjIgMS41NDg5OVpcIiBmaWxsPVwiIzBGMTJBOFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQuNzg4MSAxNy40MjE5QzQuODI1NjEgMTcuNDIyMiA0LjgyNTYxIDE3LjQyMjIgNC44NjM4NyAxNy40MjI1QzUuMTMyOTYgMTcuNDMwNyA1LjMxNTAzIDE3LjUxNjkgNS41MTMyMSAxNy42OTc4QzUuNzQzODEgMTcuOTQ2OSA1Ljg1MDI5IDE4LjIyNzkgNS44NDQyMyAxOC41NjM3QzUuODE4MzMgMTguODM1OSA1LjY1Nzc5IDE5LjA3MzYgNS40NjA4NyAxOS4yNTc2QzUuMjI5MDggMTkuNDQ0NyA0Ljk5NTI1IDE5LjUwNjUgNC42OTkwNiAxOS40OTc5QzQuNDQ5MzMgMTkuNDY4OCA0LjIxNDM4IDE5LjM1MDIgNC4wMzczOCAxOS4xNzE3QzMuODE3MjYgMTguODcxMyAzLjc1MjkxIDE4LjU5NTggMy43ODUxNyAxOC4yMjU5QzMuODUxOCAxNy45MzQ2IDQuMDQzOSAxNy42OTgxIDQuMjg5NTkgMTcuNTMyM0M0LjQ2MDI3IDE3LjQ0NTggNC41OTc1NSAxNy40MjAzIDQuNzg4MSAxNy40MjE5WlwiIGZpbGw9XCIjMTIxNkNDXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFic29sdXRlXCJcbiAgICAgICAgICAgICAgICAgd2lkdGg9XCI2MFwiIGhlaWdodD1cIjYwXCIgdmlld0JveD1cIjAgMCA2MCA2MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwidG9wOiAtMnB4OyBsZWZ0OiAtMnB4O1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMzBcIiBjeT1cIjMwXCIgcj1cIjI4XCIgc3Ryb2tlPVwiI0UyRTJFM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmYtc3BpblwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDsgdHJhbnNmb3JtLW9yaWdpbjogMzBweCAzMHB4O1wiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMwIDIgQSAyOCAyOCAwIDAgMSA1NC4yNCA0NFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTAgY3FhLW1iLTJcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICMxNjE2MTc7XCI+XG4gICAgICAgICAgRmFzdC1mb3J3YXJkaW5nIHRvIHlvdXIgc3RlcFxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLW0tMFwiXG4gICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICBTdGVwcyB7eyBmYXN0Rm9yd2FyZENvbmZpZy5mcm9tU3RlcCB9feKAk3t7IGZhc3RGb3J3YXJkQ29uZmlnLnRvU3RlcCB9fSBhcmUgcnVubmluZyBhdCBmdWxsIHNwZWVkIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjogIzZENkQ3NDsgZm9udC13ZWlnaHQ6IDYwMDtcIj5MaXZlIHZpZXcgYW5kIHNjcmVlbnNob3RzIGFyZSBwYXVzZWQ8L3N0cm9uZz5cbiAgICAgICAgICB1bnRpbCBleGVjdXRpb24gcmVhY2hlcyB5b3VyIHRhcmdldCBzdGVwIOKAlCB0aGVuIHlvdSdyZSBpbiBhdXRvbWF0aWNhbGx5LlxuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tdC02IGNxYS1tYi01XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtbWItMlwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEycHg7IGNvbG9yOiAjNEM0QzUxO1wiPlN0ZXBzIGV4ZWN1dGluZyBpbiBiYWNrZ3JvdW5kPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEycHg7IGNvbG9yOiAjNkQ2RDc0O1wiPlxuICAgICAgICAgICAgICB7eyBmYXN0Rm9yd2FyZENvbmZpZy5jdXJyZW50U3RlcCB9fSBvZiB7eyBmYXN0Rm9yd2FyZENvbmZpZy50b3RhbFN0ZXBzIH19IHN0ZXBzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogNnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUzOyBib3JkZXItcmFkaXVzOiA5OTk5cHg7IG92ZXJmbG93OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aC4lXT1cImZhc3RGb3J3YXJkUHJvZ3Jlc3NQZXJjZW50XCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzNGNDNFRSAwJSwgIzgxOENGOCAxMDAlKTsgdHJhbnNpdGlvbjogd2lkdGggMzAwbXMgY3ViaWMtYmV6aWVyKDAuNCwwLDAuMiwxKTtcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCJcbiAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogIzYzNjZGMTFBOyBib3JkZXI6IDFweCBzb2xpZCAjNjM2NkYxMzM7XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiNi41XCIgc3Ryb2tlPVwiIzNmNDNlZVwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIzXCIgc3Ryb2tlPVwiIzNmNDNlZVwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxXCIgZmlsbD1cIiMzZjQzZWVcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7XCI+SnVtcGluZyB0bzwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMzRjQzRUU7IGZvbnQtd2VpZ2h0OiA0MDA7IGRpc3BsYXk6IGJsb2NrO1wiPlxuICAgICAgICAgICAgICBTdGVwIHt7IGZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBOdW1iZXIgfX0g4oCUIHt7IGZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwhLS0gTGl2ZSBDb250ZW50IFZpZXcgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmIGlzTGl2ZVwiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAnY3FhLXctYXV0byc6IGhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgJ2NxYS13LWZ1bGwgY3FhLWZsZXgtY29sJzogIWhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgJ2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyxcbiAgICAgICAgICAgICAgICdjcWEtbWF4LWgtZnVsbCBjcWEtaC1mdWxsJzogaGFzRGV2aWNlRnJhbWUgJiYgKGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInIHx8ICFpc0xpdmUpLFxuICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1tYXgnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXG4gICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgW25nU3R5bGVdPVwibGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZVwiPlxuICAgICAgICAgIDxpbWcgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZVwiXG4gICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW1heC1oLWZ1bGwgY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgJ2NxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2wnOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlJzogIWhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLXotMjAnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyxcbiAgICAgICAgICAgICAgICAgJ2NxYS1iZy13aGl0ZSc6IGhhc0RldmljZUZyYW1lICYmIGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInXG4gICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImhhc0RldmljZUZyYW1lID8gZGV2aWNlU2NyZWVuU3R5bGUgOiB7fVwiPlxuICAgICAgICAgICAgPCEtLSBMb2FkaW5nIFN0YXRlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ29udGVudFZpZGVvTG9hZGluZ1wiIGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPnt7IGxpdmVMb2FkaW5nTGFiZWwgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBMaXZlIENvbnRlbnQgKHdoZW4gbm90IGxvYWRpbmcpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsaXZlU3RhdHVzID09PSAnRmFpbGVkJyAmJiBmYWlsZWRTdGF0dXNNZXNzYWdlXCIgY2xhc3M9XCJjcWEtcC02IGNxYS10ZXh0LWNlbnRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYmctWyNGQ0Q5RDldIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0Y5QkZCRl0gY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGNvbG9yOiAjQzYzNTM1OyBmb250LXNpemU6IDE4cHg7XCI+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1tLTBcIj57eyBmYWlsZWRTdGF0dXNNZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJsaXZlU3RhdHVzICE9PSAnRmFpbGVkJyB8fCAhZmFpbGVkU3RhdHVzTWVzc2FnZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBOb3JtYWwgVmlkZW8gVmlldyAod2hlbiBub3QgbGl2ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmICFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd2aWRlbydcIlxuICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiXG4gICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICBhcmlhLWxhYmVsPVwiVmlkZW8gcGxheWJhY2tcIlxuICAgICAgICAgKGtleWRvd24pPVwib25WaWRlb0tleWRvd24oJGV2ZW50KVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtbWF4LWgtW2NhbGMoMTAwJS02MHB4KV1cIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZX1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHZpZGVvTm9GcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW1heC1oLWZ1bGwgY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb3ZlciBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblZpZGVvRnJhbWVDbGljaygpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgICAgICAoY2FucGxheSk9XCJvblZpZGVvQ2FuUGxheSgpXCJcbiAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUsMyAxOSwxMiA1LDIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LTIgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIiBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmwgJiYgIWlzTGl2ZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1tYi0yIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtYmxvY2tcIj5cbiAgICAgICAgICBWaWRlbyB7eyBjdXJyZW50VmlkZW9JbmRleCArIDEgfX0gcGxheWluZyBvdXQgb2Yge3sgdmlkZW9VcmxzPy5sZW5ndGggfHwgMCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50VmlkZW9JbmRleCA9PT0gMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZWaWRlbygpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJQcmV2aW91cyB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogY3VycmVudFZpZGVvSW5kZXggPT09IDB9XCI+c2tpcF9wcmV2aW91czwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7XCI+XG4gICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1BsYXllclN3aXRjaGluZ1wiXG4gICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgZGlhbWV0ZXI9XCIxNlwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYXkoKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBpc1BsYXlpbmcgPyAnUGF1c2UnIDogJ1BsYXknIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNQbGF5aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJMMTMgOEwzIDE0VjJaXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxMFwiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgKm5nSWY9XCJoYXNNdWx0aXBsZVZpZGVvc1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCI+XG4gICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNwZWVkU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50U3BlZWRcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJCZ0NvbG9yXT1cIicjRjBGMEYxJ1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU3BlZWRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgI3RpbWVsaW5lQmFyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLTEgY3FhLWJnLWdyYXktMjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25UaW1lbGluZUNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1hcmtlciBvZiBjdXJyZW50VmlkZW9NYXJrZXJzXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImdldFN0ZXBMZWZ0UG9zaXRpb24obWFya2VyKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRHbG9iYWxNYXJrZXJDb2xvcihtYXJrZXIubGV2ZWwpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCInMnB4IHNvbGlkICcgKyBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihtYXJrZXIucmVzdWx0KVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3gtc2l6aW5nXT1cIidib3JkZXItYm94J1wiXG4gICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm1hcmtlci50aXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87IHotaW5kZXg6IDUwOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB0b3A6IDUwJTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXJrZXJDbGljaygkZXZlbnQsIG1hcmtlcilcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10b3AtMS8yIGNxYS13LTMgY3FhLWgtMyBjcWEtYmctYmx1ZS02MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLWdyYWIgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmcgY3FhLXNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiA2MDtcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgY3FhLW1yLTJcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uZHVyYXRpb24gfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3NjcmVlbnNob3RzJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSBzY3JlZW5zaG90Tm9GcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtbWF4LWgtW2luaGVyaXRdJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2NyZWVuc2hvdE5vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgTm8gc2NyZWVuc2hvdCBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmICFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd0cmFjZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1yZWxhdGl2ZVwiICpuZ0lmPVwidHJhY2VWaWV3VXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNDhweDsgcGFkZGluZy1ib3R0b206IDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgIDxpZnJhbWUgXG4gICAgICAgICAgICBbc3JjXT1cInNhZmVUcmFjZVVybFwiIFxuICAgICAgICAgICAgdGl0bGU9XCJUcmFjZSBWaWV3ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtbWluLWgtWzI1MHB4XSBjcWEtbWF4LWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNDhweDsgaGVpZ2h0OiBjYWxjKDEwMCUgKyA0OHB4KTtcIlxuICAgICAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGxvYWRpbmc9XCJsYXp5XCJcbiAgICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgICAgKGVycm9yKT1cIm9uVHJhY2VWaWV3ZXJFcnJvcigpXCI+XG4gICAgICAgICAgPC9pZnJhbWU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyTG9hZGluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBMb2FkaW5nIHRyYWNlIHZpZXdlci4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckVycm9yXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIHRyYWNlIHZpZXdlclxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhdHJhY2VWaWV3VXJsXCI+XG4gICAgICAgIE5vIHRyYWNlIGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+ICBcbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
2286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBNmE3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3YXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLCtCQUEwQixHQUFXLEVBQUUsQ0FBQztRQUN4QyxpQkFBWSxHQUFnQixPQUFPLENBQUM7UUFDcEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsb0JBQWUsR0FBNkMsSUFBSSxDQUFDO1FBQ2pFLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTNCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxzQkFBaUIsR0FBNkIsSUFBSSxDQUFDO1FBRW5ELHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBUWpDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM3QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN0QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUMzQyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25ELDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUF3QzNELGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQzlCLDBCQUFxQixHQUFRLElBQUksQ0FBQztRQUMxQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixnQkFBVyxHQUFXLE9BQU8sQ0FBQztRQUM5QixzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFDNUIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQzVCLDJCQUFzQixHQUFhLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtRQUN2Rix5QkFBb0IsR0FBWSxLQUFLLENBQUMsQ0FBQyxpREFBaUQ7UUFDeEYsZ0JBQVcsR0FBeUIsSUFBSSxDQUFDLENBQUMsaUNBQWlDO1FBQzNFLGVBQVUsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLG9EQUFvRDtRQUVqRyw0Q0FBNEM7UUFDcEMsZ0JBQVcsR0FBNEYsTUFBTSxDQUFDO1FBQzlHLG1CQUFjLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztRQUU1RixpRkFBaUY7UUFDakYsK0VBQStFO1FBQy9FLDZFQUE2RTtRQUM3RSx3RUFBd0U7UUFDeEUsNEJBQXVCLEdBQVksSUFBSSxDQUFDO1FBQ3hDLG9CQUFlLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7UUFDakQsMEJBQXFCLEdBQXdCLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3ZFLHVCQUFrQixHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3BELHFCQUFnQixHQUF3QixJQUFJLEdBQUcsRUFBa0IsQ0FBQyxDQUFDLHVCQUF1QjtRQUdsRix1QkFBa0IsR0FBVyxFQUFFLENBQUM7UUFDeEMsNEVBQTRFO1FBQzVFLDhEQUE4RDtRQUN0RCwwQkFBcUIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUUzQyxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSwrREFBK0Q7UUFDL0Qsa0VBQWtFO1FBQ2xFLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ3pCLDJCQUFzQixHQUFrQixJQUFJLENBQUM7UUFDN0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUM3QiwrQkFBMEIsR0FBVyxDQUFDLENBQUM7UUFDOUIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLHVCQUFrQixHQUFHLEtBQU0sQ0FBQztRQUU3QyxpRkFBaUY7UUFDakYsaUZBQWlGO1FBQ2pGLCtFQUErRTtRQUMvRSxvREFBb0Q7UUFDcEQsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsNkVBQTZFO1FBQzdFLGdGQUFnRjtRQUNoRix1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFFL0IsNEVBQTRFO1FBQ3BFLG1CQUFjLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDNUYsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFzQ2pDLGFBQVEsR0FBb0I7WUFDMUIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRztZQUM5RCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO1NBQ3JELENBQUM7UUFFRixrQkFBYSxHQUFvQjtZQUMvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUM3QixDQUFDO1FBRU0sOEJBQXlCLEdBQXdCLElBQUksQ0FBQztRQUN0RCxvQkFBZSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzdCLHlCQUFvQixHQUFxQyxJQUFJLENBQUM7UUFDOUQsdUJBQWtCLEdBQXFDLElBQUksQ0FBQztRQUM1RCxvQ0FBK0IsR0FBcUMsSUFBSSxDQUFDO1FBQ3pFLHdCQUFtQixHQUE0QixJQUFJLENBQUM7UUFDcEQsMkJBQXNCLEdBQTRCLElBQUksQ0FBQztRQUcvRCx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGtDQUE2QixHQUFZLEtBQUssQ0FBQztRQUM5QixxQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25FLGdDQUEyQixHQUFHO1lBQ3JDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUN4QixLQUFLLEVBQUUsc0JBQXNCO1lBQzdCLFdBQVcsRUFBRSxvREFBb0Q7WUFDakUsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBbUJlLDhCQUF5QixHQUEyQjtZQUNuRSxXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixlQUFlLEVBQUUsZUFBZTtZQUNoQyxXQUFXLEVBQUUsV0FBVztZQUN4QixtQkFBbUIsRUFBRSxtQkFBbUI7WUFDeEMsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsZUFBZSxFQUFFLGVBQWU7WUFDaEMsWUFBWSxFQUFFLFlBQVk7WUFDMUIsa0JBQWtCLEVBQUUsa0JBQWtCO1lBQ3RDLGdCQUFnQixFQUFFLGdCQUFnQjtTQUNuQyxDQUFDO1FBUWUsdUJBQWtCLEdBQXNDO1lBQ3ZFLFNBQVM7WUFDVCxTQUFTLEVBQUU7Z0JBQ1QsV0FBVyxFQUFFLG1DQUFtQztnQkFDaEQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxJQUFJO29CQUNULEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxJQUFJO29CQUNaLElBQUksRUFBRSxNQUFNO2lCQUNiO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsU0FBUyxFQUFFO2dCQUNULFdBQVcsRUFBRSxtQ0FBbUM7Z0JBQ2hELFdBQVcsRUFBRTtvQkFDWCxHQUFHLEVBQUUsSUFBSTtvQkFDVCxLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsTUFBTTtpQkFDYjtnQkFDRCxZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxXQUFXLEVBQUUsd0NBQXdDO2dCQUNyRCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLElBQUk7b0JBQ1QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsTUFBTSxFQUFFLElBQUk7b0JBQ1osSUFBSSxFQUFFLElBQUk7aUJBQ1g7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLG9DQUFvQztnQkFDakQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxJQUFJO29CQUNULEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxJQUFJO29CQUNaLElBQUksRUFBRSxNQUFNO2lCQUNiO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsVUFBVTtZQUNWLFdBQVcsRUFBRTtnQkFDWCxXQUFXLEVBQUUsMkNBQTJDO2dCQUN4RCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLElBQUk7b0JBQ1QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLElBQUk7b0JBQ1osSUFBSSxFQUFFLE1BQU07aUJBQ2I7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLDJDQUEyQztnQkFDeEQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxJQUFJO29CQUNULEtBQUssRUFBRSxJQUFJO29CQUNYLE1BQU0sRUFBRSxJQUFJO29CQUNaLElBQUksRUFBRSxJQUFJO2lCQUNYO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFdBQVcsRUFBRSwyQ0FBMkM7Z0JBQ3hELFdBQVcsRUFBRTtvQkFDWCxHQUFHLEVBQUUsTUFBTTtvQkFDWCxLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsTUFBTTtpQkFDYjtnQkFDRCxZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNELFdBQVcsRUFBRTtnQkFDWCxXQUFXLEVBQUUsMkNBQTJDO2dCQUN4RCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLE1BQU07aUJBQ2I7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxlQUFlLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLHlDQUF5QztnQkFDdEQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxNQUFNO29CQUNYLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxNQUFNO2lCQUNiO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFdBQVcsRUFBRSxxQ0FBcUM7Z0JBQ2xELFdBQVcsRUFBRTtvQkFDWCxHQUFHLEVBQUUsTUFBTTtvQkFDWCxLQUFLLEVBQUUsSUFBSTtvQkFDWCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsSUFBSTtpQkFDWDtnQkFDRCxZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNELG1CQUFtQixFQUFFO2dCQUNuQixXQUFXLEVBQUUsNkNBQTZDO2dCQUMxRCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLElBQUk7b0JBQ1QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsTUFBTSxFQUFFLElBQUk7b0JBQ1osSUFBSSxFQUFFLElBQUk7aUJBQ1g7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLHFDQUFxQztnQkFDbEQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxJQUFJO29CQUNULEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxJQUFJO29CQUNaLElBQUksRUFBRSxNQUFNO2lCQUNiO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0QsVUFBVTtZQUNWLGVBQWUsRUFBRTtnQkFDZixXQUFXLEVBQUUsOENBQThDO2dCQUMzRCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLElBQUk7b0JBQ1gsTUFBTSxFQUFFLE1BQU07b0JBQ2QsSUFBSSxFQUFFLElBQUk7aUJBQ1g7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osV0FBVyxFQUFFLHNDQUFzQztnQkFDbkQsV0FBVyxFQUFFO29CQUNYLEdBQUcsRUFBRSxNQUFNO29CQUNYLEtBQUssRUFBRSxJQUFJO29CQUNYLE1BQU0sRUFBRSxNQUFNO29CQUNkLElBQUksRUFBRSxJQUFJO2lCQUNYO2dCQUNELFlBQVksRUFBRSxJQUFJO2FBQ25CO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2xCLFdBQVcsRUFBRSw0Q0FBNEM7Z0JBQ3pELFdBQVcsRUFBRTtvQkFDWCxHQUFHLEVBQUUsTUFBTTtvQkFDWCxLQUFLLEVBQUUsSUFBSTtvQkFDWCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsSUFBSTtpQkFDWDtnQkFDRCxZQUFZLEVBQUUsSUFBSTthQUNuQjtZQUNELGdCQUFnQixFQUFFO2dCQUNoQixXQUFXLEVBQUUsOENBQThDO2dCQUMzRCxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLElBQUk7b0JBQ1QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsTUFBTSxFQUFFLElBQUk7b0JBQ1osSUFBSSxFQUFFLElBQUk7aUJBQ1g7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7YUFDbkI7WUFDRCxVQUFVO1lBQ1YsT0FBTyxFQUFFO2dCQUNQLFdBQVcsRUFBRSwwQ0FBMEM7Z0JBQ3ZELFdBQVcsRUFBRTtvQkFDWCxHQUFHLEVBQUUsSUFBSTtvQkFDVCxLQUFLLEVBQUUsSUFBSTtvQkFDWCxNQUFNLEVBQUUsSUFBSTtvQkFDWixJQUFJLEVBQUUsSUFBSTtpQkFDWDtnQkFDRCxZQUFZLEVBQUUsSUFBSTthQUNuQjtTQUNGLENBQUM7UUF3aERGLDZGQUE2RjtRQUNwRiw4QkFBeUIsR0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFuaEQzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFwWkQsSUFBSSwwQkFBMEI7UUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBV0QsSUFDSSxVQUFVLENBQUMsR0FBNkM7UUFDMUQsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUlELElBQ0ksY0FBYyxDQUFDLEdBQTJDO1FBQzVELElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFJRCxJQUNJLHdCQUF3QixDQUFDLEdBQTJDO1FBQ3RFLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBK0RELElBQUkscUJBQXFCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDcEQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUN2RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBR0QsSUFBSSxvQkFBb0I7UUFDdEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztRQUM5RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFJLHlCQUF5QjtRQUMzQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUM3RixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM5QixPQUFPO2dCQUNMLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUk7Z0JBQ3pELE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQztTQUNIO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBaUNELElBQUksd0JBQXdCO1FBQzFCLE1BQU0sZUFBZSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTyxlQUFlLENBQUM7U0FDeEI7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLGVBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxlQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEYsT0FBTyxlQUFlLENBQUM7U0FDeEI7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFxQk8sMEJBQTBCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQTRMRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBWSxpQkFBaUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3ZGO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNuQyw2REFBNkQ7WUFDN0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckQsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNyRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM1QztZQUNELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztTQUNuRDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU87WUFDTCxRQUFRLEVBQUUsVUFBVTtZQUNwQixHQUFHLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHO1lBQ3hCLEtBQUssRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDNUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUM5QixJQUFJLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQzFCLGVBQWUsRUFBRSxHQUFHLENBQUMsWUFBWTtZQUNqQyxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQiwyRkFBMkY7UUFDM0YsK0VBQStFO1FBQy9FLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztZQUM5QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QixNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsYUFBYSxDQUFDO1lBQzlCLElBQUksQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFDaEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xFLElBQUksVUFBVSxFQUFFO2dCQUNkLGtGQUFrRjtnQkFDbEYsSUFBSSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3hFLElBQUk7d0JBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO3FCQUFFO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFO2lCQUN4RTtnQkFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7b0JBQ2IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVTt3QkFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUEwQyxDQUFDLENBQUMsQ0FBQztpQkFDbkc7YUFDRjtpQkFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtnQkFDckIsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ1o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQW9DLENBQUM7WUFDdEUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ25GLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUNqRSw0REFBNEQ7WUFDNUQsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7YUFDMUY7WUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO29CQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ3BELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7b0JBRTdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxnQkFBZ0IsQ0FBQztvQkFFaEUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRTt3QkFDL0IsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUN6RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLENBQUM7d0JBRXhFLElBQUksV0FBVyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsZUFBZSxJQUFJLGNBQWMsR0FBRyxHQUFHLEVBQUU7NEJBQy9FLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDeEM7cUJBQ0Y7eUJBQU07d0JBQ0wsSUFBSSxXQUFXLEVBQUU7NEJBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO3lCQUMzQztxQkFDRjtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUU7b0JBQy9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDekUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLGVBQWUsSUFBSSxjQUFjLEdBQUcsR0FBRyxFQUFFO3dCQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUM5QjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7YUFDaEU7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFlBQVksQ0FBQztTQUN6RDtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDbEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztTQUNqQztRQUNELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxZQUFvQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhO1lBQUUsT0FBTztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxZQUFvQjtRQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRDLE1BQU0sT0FBTyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsRUFBRTtZQUNyRCxZQUFZO1lBQ1osVUFBVTtZQUNWLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixpQkFBaUIsRUFBRSxLQUFLLENBQUMsV0FBVztTQUNyQyxDQUFDLENBQUM7UUFFSCxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFFN0IsMERBQTBEO1FBQ3hELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVoQixlQUFlO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLGVBQWU7UUFDZixLQUFLLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztRQUVwQyxpRUFBaUU7UUFDakUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RCwrQ0FBK0M7UUFDL0MsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDekMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNGO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFbkUsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBRTVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLEVBQUU7WUFDM0QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBb0I7UUFDakMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPO1FBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpREFBaUQsRUFBRTtnQkFDL0QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztTQUNSO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssZ0JBQWdCLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNyRyxPQUFPLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxFQUFFO2dCQUN2RCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ3JDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2FBQ25CLENBQUMsQ0FBQztZQUNILE9BQU87U0FDUjtRQUVELCtGQUErRjtRQUMvRixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksZ0JBQWdCLENBQUMsYUFBYSxFQUFFO1lBQ3hGLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1NBQzdCO1FBRUQsc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLEVBQUU7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNoRyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztTQUMzQjtRQUVELHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsMENBQTBDLEVBQUU7Z0JBQ3ZELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2FBQzdCLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDeEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2lCQUNuQjtZQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNQLE9BQU87U0FDUjtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUU7WUFDckMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO2FBQU07WUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLHFCQUFxQjtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNLLFNBQVM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1lBQ3hFLE9BQU87U0FDUjtRQUVELHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUN4RSxPQUFPO1NBQ1I7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxFQUFFO1lBQ3JELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzdCLENBQUMsQ0FBQztRQUVILHVDQUF1QztRQUN2QyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELENBQUMsQ0FBQztZQUNuRSxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMxQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtvQkFDNUIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzlELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzVDLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FBQztnQkFDRixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7b0JBQ25CLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM5RCxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELCtDQUErQztRQUMvQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMvQyxJQUFJLGFBQWEsR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN6QjtRQUVELHVCQUF1QjtRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUU3QixJQUFJO1lBQ0YseURBQXlEO1lBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtnQkFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixPQUFPO2FBQ1I7WUFFRCx3Q0FBd0M7WUFDeEMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkIsc0VBQXNFO1lBQ3RFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1lBQ25ELElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxLQUFLLEtBQUssRUFBRTtnQkFDL0MsT0FBTyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUNqRixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixPQUFPO2FBQ1I7WUFFRCxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXJDLE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELEVBQUU7Z0JBQ2pFLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2FBQzlCLENBQUMsQ0FBQztZQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFO29CQUNqRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztvQkFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2xILElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUM7aUJBQzFEO1lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ1I7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixjQUFjO1lBQ2QsNENBQTRDO1lBQzVDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1lBQ3BELElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxLQUFLLEtBQUssRUFBRTtnQkFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQzthQUM3QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQzthQUM1QjtZQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtnQkFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO2dCQUM5RSxpRUFBaUU7Z0JBQ2pFLElBQUksZUFBZSxJQUFJLGVBQWUsS0FBSyxLQUFLLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO2lCQUM3QjthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDN0Q7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVU7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1lBQ3hFLE9BQU87U0FDUjtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLEVBQUU7WUFDckQsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztTQUMvQixDQUFDLENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLFNBQThCO1FBQ3JELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWM7YUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3ZCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELDBGQUEwRjtJQUMxRixJQUFJLGlCQUFpQjtRQUNuQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEMsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFJLGFBQWE7UUFDZixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQVksY0FBYztRQUN4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztTQUNwQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLElBQUksS0FBSyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxnQkFBOEIsQ0FBQztRQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDckM7YUFBTTtZQUNMLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDckM7aUJBQU07Z0JBQ0wsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUUzRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVztxQkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNmLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixJQUFJLGVBQWUsQ0FBQyxLQUFLO3dCQUNsRCxNQUFNLENBQUMsa0JBQWtCLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQztnQkFDekQsQ0FBQyxDQUFDO3FCQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDMUMsTUFBTSxFQUNOLGVBQWUsQ0FBQyxLQUFLLEVBQ3JCLGVBQWUsQ0FBQyxLQUFLLEVBQ3JCLGVBQWUsQ0FBQyxHQUFHLENBQ3BCLENBQUMsQ0FBQzthQUNOO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sd0JBQXdCLENBQUMsTUFBa0IsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsUUFBZ0I7UUFDM0csTUFBTSxjQUFjLEdBQWU7WUFDakMsR0FBRyxNQUFNO1lBQ1Qsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFVBQVU7U0FDM0QsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckQsY0FBYyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVTtpQkFDMUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO2lCQUM5RixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1gsTUFBTSxhQUFhLEdBQWU7b0JBQ2hDLEdBQUcsS0FBSztvQkFDUixrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLEdBQUcsVUFBVTtpQkFDMUQsQ0FBQztnQkFDRixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNuRCxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVO3lCQUN4QyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLElBQUksVUFBVSxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7eUJBQ2hILEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNyRztnQkFDRCxPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQWdCO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7dUZBRW1GO0lBQ25GLElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxJQUFnQjtRQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsSUFBSSxtQkFBbUI7UUFDckIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRyxPQUFPLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxJQUFJLGNBQWM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsOEZBQThGO0lBQzlGLElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBZ0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQWdCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYztRQUNqQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxNQUE0QjtRQUNyRCxRQUFRLE1BQU0sRUFBRTtZQUNkLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQztZQUNuQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sU0FBUyxDQUFDO1lBQ25CLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQztZQUNuQjtnQkFDRSxPQUFPLFNBQVMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBaUIsRUFBRSxNQUFrQjtRQUNqRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUTtZQUFFLE9BQU87UUFDN0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUMvQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1QyxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO2dCQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHVCQUF1QjtRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBRTlELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTztRQUNwQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3RjtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWE7WUFBRSxPQUFPO1FBRTdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUU5RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPO1lBQ25CLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxNQUFNLGNBQWMsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxJQUFJLG1CQUFtQixFQUFFO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhO1lBQUUsT0FBTztRQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTztRQUV6RCxNQUFNLFlBQVksR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRTNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUU7WUFDekMsT0FBTztZQUNQLFlBQVk7WUFDWixtQkFBbUI7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzVDLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3ZCLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDaEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBaUI7UUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLGlEQUFpRDtRQUNqRCwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUM7UUFFN0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRTtZQUNuQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1NBQ2hELENBQUMsQ0FBQztRQUVILDZDQUE2QztRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYTtZQUFFLE9BQU87UUFFL0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztTQUN6QzthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsNkJBQTZCO1NBQzdEO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRTNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBRXRELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUU7WUFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDL0MsbUJBQW1CLEVBQUUsbUJBQW1CO1lBQ3hDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ3JDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU87WUFDbkIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQy9ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxJQUFJLG1CQUFtQixFQUFFO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTztRQUVuRSxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTVDLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0RBQW9ELEVBQUU7b0JBQ2hFLFlBQVk7b0JBQ1osV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2lCQUM5QixDQUFDLENBQUM7Z0JBRUgscURBQXFEO2dCQUNyRCxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV2RCwrRUFBK0U7Z0JBQy9FLCtDQUErQztnQkFDL0MsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO29CQUMxRSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN4RDtnQkFFRCwrREFBK0Q7Z0JBQy9ELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7b0JBQ2pDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELEVBQUU7d0JBQ2pFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO3FCQUMxQixDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsRUFBRTt3QkFDN0YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO3FCQUM5QixDQUFDLENBQUM7b0JBQ0gsOERBQThEO29CQUM5RCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUNoQzthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQzthQUNyRTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFhLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pELHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMxQyx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLEVBQUU7WUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUM1QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFFakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7WUFDMUMsSUFBSSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckMsSUFBSTtvQkFDRixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNwRTtnQkFBQyxPQUFPLENBQUMsRUFBRSxFQUFFLCtDQUErQyxFQUFFO2FBQ2hFO1lBQ0QsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO29CQUMvQixNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OzsrRUFNMkU7SUFDM0UsWUFBWTtRQUNWLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUM7UUFFekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxREFBcUQsRUFBRTtZQUNuRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJO1lBQ3BCLFlBQVksRUFBRSxHQUFHLEVBQUUsT0FBTztZQUMxQixZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVk7WUFDakMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVO1lBQzdCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ2hDLENBQUMsQ0FBQztRQUVILHNFQUFzRTtRQUN0RSwyREFBMkQ7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU87U0FDUjtRQUVELHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFMUMsc0VBQXNFO1FBQ3RFLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0Qyx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xHLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFFN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMvQixNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFcEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUN2RCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUNoQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ2xDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7U0FDdkM7UUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTztZQUVuQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksR0FBRyxHQUFHLFVBQVUsR0FBRyxHQUFHO29CQUFFLE9BQU87Z0JBRW5DLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQ2pCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUUzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtvQkFDdEQsK0NBQStDO29CQUMvQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO3dCQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzVFO29CQUVELHNEQUFzRDtvQkFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2xILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQztvQkFFcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7b0JBQzlDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO29CQUUvQiwyRUFBMkU7b0JBQzNFLDJFQUEyRTtvQkFDM0UsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMscUJBQXFCLEVBQUU7d0JBQzNFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7d0JBQ3BELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO3FCQUNsQztpQkFDRjtZQUNILENBQUMsQ0FBQztZQUVGLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEdBQUcsRUFBRTtnQkFDcEMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUM7UUFDSixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sMEJBQTBCLENBQUMsU0FBbUI7UUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ2pELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0IsQ0FBQyxTQUFtQjtRQUM1QyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDakQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN2QixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUVwQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLFFBQVEsR0FBRyxHQUFTLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUN0RSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssS0FBSztvQkFBRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO2dCQUM5RSxPQUFPO2FBQ1I7WUFDRCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDaEIsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUFHLEdBQVMsRUFBRTtnQkFDeEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QixLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQyxRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUMsQ0FBQztZQUNGLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO1FBQ0YsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsc0ZBQXNGO0lBQzlFLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JHLE9BQU87U0FDUjtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUTtZQUFFLE9BQU87UUFDN0IsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUs7UUFDNUUsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLElBQUksaUJBQWlCLEdBQUcsSUFBSTtZQUFFLE9BQU8sQ0FBQyw4QkFBOEI7UUFDakcsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsS0FBSyxPQUFPO1lBQUUsT0FBTyxDQUFDLHFCQUFxQjtRQUM1RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQVc7UUFDcEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7U0FDakM7UUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMxRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsU0FBbUI7UUFDOUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE9BQU87U0FDUjtRQUVELDJCQUEyQjtRQUMzQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUVwQixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9CLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7WUFFL0IsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7Z0JBQzVCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNoRCxXQUFXLEVBQUUsQ0FBQztnQkFFZCxXQUFXO2dCQUNYLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsRSxTQUFTLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRCxTQUFTLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUVuQixJQUFJLFdBQVcsS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2lCQUN2RjtZQUNILENBQUMsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxpREFBaUQsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxDQUFDO2dCQUNkLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNsRSxTQUFTLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRCxTQUFTLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQztZQUVGLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDBCQUEwQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCx3RUFBd0U7UUFDeEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCO1lBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLFVBQVUsR0FBMEMsRUFBRSxDQUFDO1FBQzdELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUV4QixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtZQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNkLEtBQUssRUFBRSxlQUFlO2dCQUN0QixHQUFHLEVBQUUsZUFBZSxHQUFHLFFBQVE7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsZUFBZSxJQUFJLFFBQVEsQ0FBQztTQUM3QjtRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxPQUFxQjtRQUMxQyxNQUFNLFNBQVMsR0FBaUIsRUFBRSxDQUFDO1FBRW5DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFxQixFQUFFLEVBQUU7WUFDakQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkIsd0JBQXdCO2dCQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUV2QixnQ0FBZ0M7Z0JBQ2hDLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDckM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxjQUFjLENBQUMsWUFBb0I7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRTdDLHdEQUF3RDtRQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQywrQkFBK0I7UUFFdEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVLEVBQUU7WUFDL0IseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFBRSxTQUFTO1lBRWpDLHNCQUFzQjtZQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBQUUsU0FBUztZQUVyRCwrREFBK0Q7WUFDL0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUUsSUFBSSxjQUFjLElBQUksU0FBUyxFQUFFO2dCQUMvQiw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxpQ0FBaUM7YUFDekM7U0FDRjtJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFFbEUsaUVBQWlFO1FBQ2pFLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXZDLGlFQUFpRTtRQUNqRSwrRUFBK0U7UUFDL0UsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sRUFBRTtZQUNsRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztTQUMzQjtRQUVELCtEQUErRDtRQUMvRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7WUFDMUMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsdUNBQXVDO2dCQUN2QyxJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxXQUFXLEVBQUU7b0JBQ25ELEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO2lCQUNqQztnQkFFRCx5QkFBeUI7Z0JBQ3pCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUVoQyxzQkFBc0I7Z0JBQ3RCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUU1QiwwQ0FBMEM7Z0JBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFFdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvREFBb0QsRUFBRTtvQkFDaEUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO29CQUMvQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDOUIsQ0FBQyxDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO2dCQUN2RixrQ0FBa0M7Z0JBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7b0JBQy9DLElBQUksVUFBVSxFQUFFO3dCQUNkLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO3dCQUNoQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7d0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO3FCQUN4QjtnQkFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDVDtRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssT0FBTyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMvQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUM1QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFlO1FBQ3hCLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBRS9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRS9CLGtFQUFrRTtRQUNsRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUN2SDtRQUVELE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFDNUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsd0ZBQXdGO0lBQ3hGLG9GQUFvRjtJQUNwRix3RkFBd0Y7SUFDeEYsZ0JBQWdCLENBQUMsS0FBaUIsRUFBRSxRQUFxQjtRQUN2RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDNUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDNUQsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWlCLEVBQUUsUUFBcUI7UUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDdkQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMscURBQXFEO1NBQ25GO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUMvQixRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUNoRTtJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsTUFBa0I7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUU7WUFDL0IscUZBQXFGO1lBQ3JGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBaUI7UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OzswRUFHc0U7SUFDdEUsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUFFLE9BQU87UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDMUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsK0VBQStFO1FBQy9FLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UsOEVBQThFO1FBQzlFLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzFDLE1BQU0sY0FBYyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFDLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQy9CLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztzRUFNa0U7SUFDbEUsMkJBQTJCLENBQUMsS0FBYSxFQUFFLE9BQXlCO1FBQ2xFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQzNELE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDM0MsSUFBSTtnQkFDRixPQUFPLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzthQUMvQztZQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsaURBQWlELEVBQUU7WUFDakUsT0FBTztTQUNSO1FBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFO2dCQUNaLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3pCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBYSxFQUFFLEdBQVc7UUFDaEQsT0FBTyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7c0dBRWtHO0lBQ2xHLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYTtRQUM5QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUFFLE9BQU87UUFDeEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUV2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV4QixJQUFJO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1lBQ2hDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUVqQixPQUFPLElBQUksRUFBRTtnQkFDWCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QyxJQUFJLElBQUk7b0JBQUUsTUFBTTtnQkFDaEIsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkIsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkY7b0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDekI7YUFDRjtZQUVELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3pDO1FBQUMsT0FBTyxJQUFJLEVBQUU7WUFDYiw0RkFBNEY7WUFDNUYsd0dBQXdHO1lBQ3hHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDM0M7Z0JBQVM7WUFDUixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUNuRCxJQUFJO1lBQ0YsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxJQUFJLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxRQUFRLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7U0FDNUU7UUFBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRTtRQUM1QixPQUFPLFFBQVEsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFVLEVBQUUsUUFBZ0I7UUFDckQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJO1lBQ0YsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztZQUNuQixDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN0QixDQUFDLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQztZQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtnQkFBUztZQUNSLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUtELGdHQUFnRztJQUNoRyxzQkFBc0IsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxRQUFnQjtRQUN6RCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDdEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7UUFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQzFFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs0RUFFd0U7SUFDaEUseUJBQXlCO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBYyxZQUFZLENBQUMsQ0FBQztRQUNuRSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRWxCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFFbEQsSUFBSSxRQUFRLEdBQUcsUUFBUSxHQUFHLE9BQU8sRUFBRTtZQUNqQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNsRjthQUFNLElBQUksU0FBUyxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUU7WUFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sV0FBVyxHQUFHLHVHQUF1RyxDQUFDO1FBQzVILFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QixLQUFLLGFBQWEsQ0FBQztZQUNuQixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxHQUFHLFdBQVcsbURBQW1ELENBQUM7WUFDM0UsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxXQUFXLG1EQUFtRCxDQUFDO1lBQzNFLEtBQUssU0FBUztnQkFDWixPQUFPLEdBQUcsV0FBVyxtREFBbUQsQ0FBQztZQUMzRSxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxHQUFHLFdBQVcsbURBQW1ELENBQUM7WUFDM0UsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxXQUFXLG1EQUFtRCxDQUFDO1lBQzNFO2dCQUNFLE9BQU8sR0FBRyxXQUFXLGlEQUFpRCxDQUFDO1NBQzFFO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdkIsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sdUVBQXVFLENBQUM7WUFDakYsS0FBSyxRQUFRO2dCQUNYLE9BQU8sdUVBQXVFLENBQUM7WUFDakYsS0FBSyxTQUFTO2dCQUNaLE9BQU8sdUVBQXVFLENBQUM7WUFDakYsS0FBSyxRQUFRO2dCQUNYLE9BQU8sdUVBQXVFLENBQUM7WUFDakYsS0FBSyxRQUFRO2dCQUNYLE9BQU8sdUVBQXVFLENBQUM7WUFDakY7Z0JBQ0UsT0FBTyxzRUFBc0UsQ0FBQztTQUNqRjtJQUNILENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQ3hCLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxpQ0FBaUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7U0FDaEU7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDbkMsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hFO2FBQU07WUFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWE7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7U0FDNUM7YUFBTTtZQUNMLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVPLG1DQUFtQztRQUN6QyxJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQztRQUU5QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLCtCQUErQixHQUFHLENBQUMsQ0FBYSxFQUFFLEVBQUU7Z0JBQ3ZELE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFxQixDQUFDO2dCQUN2QyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsYUFBYTtvQkFDbkQsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztvQkFDaEMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7aUJBQy9DO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUMzRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRU8sc0NBQXNDO1FBQzVDLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQztTQUM3QztJQUNILENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sWUFBWSxHQUFvQjtZQUNwQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFHO1NBQy9ELENBQUM7UUFFRiw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztTQUN6RTtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQzNFO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFFN0IsNEVBQTRFO1FBQzVFLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBRW5CLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELEVBQUU7WUFDbEUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsOEZBQThGO1FBQzlGLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBRW5CLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRU8sMEJBQTBCLENBQUMsbUJBQTJCO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3JELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELDJDQUEyQztRQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxtQkFBbUIsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9FLE9BQU8sQ0FBQyxDQUFDO2FBQ1Y7U0FDRjtRQUVELG9GQUFvRjtRQUNwRixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksbUJBQW1CLEtBQUssWUFBWSxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsT0FBTyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLDZCQUE2QixDQUFDLGdCQUF3QjtRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDbEcsT0FBTztTQUNSO1FBRUQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxnQkFBZ0IsRUFBRTtZQUMvQyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRS9CLElBQUk7WUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzNELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFjLEVBQUUsRUFBRTtvQkFDaEMsSUFBSSxPQUFPO3dCQUFFLE9BQU87b0JBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ2YsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzlELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzVDLEVBQUUsRUFBRSxDQUFDO2dCQUNQLENBQUMsQ0FBQztnQkFDRixNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFOUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7WUFFMUMsTUFBTSxjQUFjLENBQUM7WUFFckIsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTFCLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN6QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNuQjtnQkFBUztZQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLG1CQUEyQjtRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sS0FBSyxDQUFDLDRCQUE0QixDQUFDLG1CQUEyQjtRQUNwRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNuRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0VBQXNFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUMxRyxPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNyRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwRCxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssZ0JBQWdCLEVBQUU7WUFDL0MsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLG1CQUFtQixDQUFDO1lBQzNDLE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUVuQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUUvQixJQUFJO1lBQ0YsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUU7b0JBQ2hDLElBQUksT0FBTzt3QkFBRSxPQUFPO29CQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNmLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM5RCxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxFQUFFLEVBQUUsQ0FBQztnQkFDUCxDQUFDLENBQUM7Z0JBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTlFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO1lBRTFDLE1BQU0sY0FBYyxDQUFDO1lBRXJCLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFFckYsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNsQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7b0JBQ3BCLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQzlDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLENBQUM7Z0JBRUYsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7Z0JBRS9CLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQzlDLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQztZQUUzQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLEVBQUU7Z0JBQ2xELEtBQUssQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO2dCQUMvQixNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3hEO1lBRUQscUJBQXFCO1lBQ3JCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDM0Y7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2hEO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDaEQ7Z0JBQVM7WUFDUixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7K0dBdjNFVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxdERDL0MvQiwycThDQXlwQk07MkZEMW1CTyxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0UsZUFBZTttSUFPaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVFJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFLSCxVQUFVO3NCQURiLFNBQVM7dUJBQUMsU0FBUztnQkFlaEIsY0FBYztzQkFEakIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWF2Qyx3QkFBd0I7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQXNDMUIsVUFBVTtzQkFBcEMsWUFBWTt1QkFBQyxXQUFXO2dCQUNHLGdCQUFnQjtzQkFBM0MsU0FBUzt1QkFBQyxlQUFlO2dCQXVVMUIsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZhc3RGb3J3YXJkQ29uZmlnIHtcbiAgZnJvbVN0ZXA6IG51bWJlcjtcbiAgdG9TdGVwOiBudW1iZXI7XG4gIGN1cnJlbnRTdGVwOiBudW1iZXI7XG4gIHRvdGFsU3RlcHM6IG51bWJlcjtcbiAgdGFyZ2V0U3RlcE51bWJlcjogc3RyaW5nO1xuICB0YXJnZXRTdGVwTGFiZWw6IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBicm93c2VyRGV2aWNlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSBpc0Zhc3RGb3J3YXJkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhc3RGb3J3YXJkQ29uZmlnOiBGYXN0Rm9yd2FyZENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHNob3dWaWRlb0xpYnJhcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NhcHR1cmVWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0NhcHR1cmluZ1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGZhc3RGb3J3YXJkUHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgYyA9IHRoaXMuZmFzdEZvcndhcmRDb25maWc7XG4gICAgaWYgKCFjIHx8ICFjLnRvdGFsU3RlcHMpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIChjLmN1cnJlbnRTdGVwIC8gYy50b3RhbFN0ZXBzKSAqIDEwMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlkZW9UaW1lVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWFya2VySGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdGVwTWFya2VyPigpO1xuICBAT3V0cHV0KCkgaXNWaWRlb1BsYXlpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjYXB0dXJlVmlkZW9SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfdnBsYXllcj86IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndnBsYXllcicpXG4gIHNldCB2cGxheWVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG5cbiAgICB0aGlzLl92cGxheWVyID0gcmVmO1xuICAgIHRoaXMub25WaWRlb0VsZW1lbnRSZWFkeSgpO1xuICB9XG5cbiAgZ2V0IHZwbGF5ZXIoKTogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZwbGF5ZXI7XG4gIH1cblxuICBwcml2YXRlIF90aW1lbGluZUJhcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3RpbWVsaW5lQmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCB0aW1lbGluZUJhclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl90aW1lbGluZUJhciA9IHJlZjtcbiAgfVxuXG4gIGdldCB0aW1lbGluZUJhcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lQmFyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3BlZWRDb250cm9sQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnc3BlZWRDb250cm9sQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCBzcGVlZENvbnRyb2xDb250YWluZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHNwZWVkQ29udHJvbENvbnRhaW5lcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWVkQ29udHJvbENvbnRhaW5lcjtcbiAgfVxuXG4gIHByb2dyZXNzID0gMDtcbiAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgaXNQbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dQbGF5UGF1c2VPdmVybGF5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcGxheVBhdXNlT3ZlcmxheVRpbWVyOiBhbnkgPSBudWxsO1xuICBpc0Z1bGxTY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFZpZXc6IHN0cmluZyA9ICd2aWRlbyc7XG4gIGN1cnJlbnRWaWRlb0luZGV4OiBudW1iZXIgPSAwO1xuICBjdXJyZW50U3BlZWQ6IHN0cmluZyA9ICcxeCc7XG4gIGlzU3BlZWRDb250cm9sT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGVjdGVkVmlkZW9EdXJhdGlvbnM6IG51bWJlcltdID0gW107IC8vIEFjdHVhbCBkdXJhdGlvbnMgZGV0ZWN0ZWQgZnJvbSB2aWRlbyBtZXRhZGF0YVxuICBwcml2YXRlIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiBib29sZWFuID0gZmFsc2U7IC8vIFRyYWNrIGlmIHZpZGVvIHdhcyBwbGF5aW5nIGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgcHJpdmF0ZSBwbGF5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBwbGF5IHByb21pc2VcbiAgcHJpdmF0ZSBoaXRNYXJrZXJzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTsgLy8gVHJhY2sgd2hpY2ggbWFya2VycyBoYXZlIGJlZW4gaGl0IChieSB0ZXN0U3RlcElkKVxuXG4gIC8vIFN0YXRlIG1hY2hpbmUgZm9yIHJvYnVzdCBtZWRpYSBvcGVyYXRpb25zXG4gIHByaXZhdGUgcGxheWVyU3RhdGU6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdyZWFkeScgfCAncGxheWluZycgfCAncGF1c2VkJyB8ICdzZWVraW5nJyB8ICdzd2l0Y2hpbmcnIHwgJ2Vycm9yJyA9ICdpZGxlJztcbiAgcHJpdmF0ZSBvcGVyYXRpb25RdWV1ZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpOyAvLyBTZXJpYWxpemUgYWxsIG1lZGlhIG9wZXJhdGlvbnNcblxuICAvLyBWaWRlby1vbi1kZW1hbmQgKFZpZGVvIExpYnJhcnkpIHN0YXRlIOKAlCBzaW5nbGUgc291cmNlIG9mIHRydXRoIGlzIGB2aWRlb1VybHNgLlxuICAvLyBgbmV3VmlkZW9JbmRleGVzYCBtYXJrcyB3aGljaCBpbmRleGVzIHdlcmUganVzdCBjYXB0dXJlZCAoc28gd2UgY2FuIHNob3cgdGhlXG4gIC8vIE5FVyBiYWRnZSB1bnRpbCB0aGF0IGNsaXAgaXMgc2VsZWN0ZWQpOyBgbGlicmFyeVZpZGVvRHVyYXRpb25zYCBjYWNoZXMgdGhlXG4gIC8vIG1ldGFkYXRhLWxvYWRlZCBkdXJhdGlvbiBwZXIgaW5kZXggZm9yIGVhY2ggbGlicmFyeSBjYXJkJ3MgdGh1bWJuYWlsLlxuICBpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZDogYm9vbGVhbiA9IHRydWU7XG4gIG5ld1ZpZGVvSW5kZXhlczogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGlicmFyeVZpZGVvRHVyYXRpb25zOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgZG93bmxvYWRpbmdJbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBkb3dubG9hZFByb2dyZXNzOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTsgLy8gMC0xMDAgcGVyIGNsaXAgaW5kZXhcbiAgQFZpZXdDaGlsZHJlbignY2xpcFZpZGVvJykgY2xpcFZpZGVvcz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+PjtcbiAgQFZpZXdDaGlsZCgnY2xpcHNTY3JvbGxlcicpIGNsaXBzU2Nyb2xsZXJSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJpdmF0ZSBsYXN0TGlicmFyeVN5bmNLZXk6IHN0cmluZyA9ICcnO1xuICAvLyBUcmFja3Mgd2hpY2ggY2xpcCBpbmRleCB0aGUgbGlicmFyeSByb3cgd2FzIGxhc3QgYXV0by1zY3JvbGxlZCB0bywgc28gdGhlXG4gIC8vIHRpbWV1cGRhdGUgaGFuZGxlciBkb2Vzbid0IHJlLXRyaWdnZXIgYSBzY3JvbGwgZXZlcnkgZnJhbWUuXG4gIHByaXZhdGUgbGFzdFNjcm9sbGVkQ2xpcEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBBdXRvLXJlY292ZXJ5OiB3aGVuIHRoZSA8dmlkZW8+IGZpcmVzIGFuIGVycm9yIGV2ZW50IChlLmcuIENocm9tZSdzXG4gIC8vIFwiUElQRUxJTkVfRVJST1JfUkVBRDogRkZtcGVnRGVtdXhlclwiIGFmdGVyIGEgbmV0d29yayBnbGl0Y2gpLCB3ZSBmbGlwXG4gIC8vIHRoaXMgZmxhZyB0byB1bm1vdW50IHRoZSA8dmlkZW8+IHZpYSAqbmdJZiwgdGhlbiBmbGlwIGl0IGJhY2sgc28gQW5ndWxhclxuICAvLyByZW1vdW50cyBhIGZyZXNoIGVsZW1lbnQg4oCUIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGF0IG1ha2VzIHRoZVxuICAvLyBTY3JlZW5zaG90c+KGlFZpZGVvIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZCByZWNvdmVyIHBsYXliYWNrIHRvZGF5LlxuICB2aWRlb1JlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwZW5kaW5nUmVjb3ZlcnlTZWVrU2VjOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nUmVjb3ZlcnlQbGF5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVjb3ZlcnlBdHRlbXB0czogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfUkVDT1ZFUllfQVRURU1QVFMgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBSRUNPVkVSWV9XSU5ET1dfTVMgPSAxMF8wMDA7XG5cbiAgLy8gUGhhc2UgMiDigJQgXCJTaG93IEZ1bGwgVmlkZW9cIiBtb2RlLiBXaGVuIHRydWUsIHRoZSBtYWluIHRpbWVsaW5lIHNwYW5zIHRoZSB0b3RhbFxuICAvLyBkdXJhdGlvbiBhY3Jvc3MgYWxsIGNsaXBzIGFuZCBzdGVwIG1hcmtlcnMgZnJvbSBldmVyeSBjbGlwIGFyZSBsYWlkIG91dCBvbiBpdC5cbiAgLy8gQ2xpcC10by1jbGlwIHRyYW5zaXRpb25zIGhhcHBlbiB1bmRlciB0aGUgaG9vZCB2aWEgdGhlIGV4aXN0aW5nIG9uVmlkZW9FbmRlZFxuICAvLyBhdXRvLWFkdmFuY2UgcGF0aCDigJQgdGhlIHVzZXIgZG9lc24ndCBzZWUgYSByZXNldC5cbiAgaXNWaWRlb0Z1bGxNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIDAtMTAwIHBvc2l0aW9uIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUgd2hpbGUgdGhlIHVzZXIgaXMgYWN0aXZlbHkgZHJhZ2dpbmcuXG4gIC8vIE5lZWRlZCBiZWNhdXNlIGBwcm9ncmVzc2AgaXMgcGVyLWN1cnJlbnQtY2xpcCBhbmQgd291bGQgZ2l2ZSB0aGUgd3JvbmcgdmFsdWUuXG4gIGdsb2JhbERyYWdQcm9ncmVzczogbnVtYmVyID0gMDtcblxuICAvLyBEcmFnLXRvLXNjcm9sbCBzdGF0ZSBmb3IgdGhlIGNsaXBzIHJvdyAobW91c2UgZXF1aXZhbGVudCBvZiB0b3VjaC1zd2lwZSkuXG4gIHByaXZhdGUgY2xpcHNEcmFnU3RhdGUgPSB7IGRyYWdnaW5nOiBmYWxzZSwgc3RhcnRYOiAwLCBzdGFydFNjcm9sbExlZnQ6IDAsIGRpZE1vdmU6IGZhbHNlIH07XG4gIGNsaXBzRHJhZ0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUoKTogJ2Jyb3dzZXInIHwgJ2RldmljZScge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHJldHVybiAnZGV2aWNlJztcbiAgICBpZiAodGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpKSByZXR1cm4gJ2RldmljZSc7XG4gICAgcmV0dXJuICdicm93c2VyJztcbiAgfVxuXG4gIGdldCBoYXNEZXZpY2VGcmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICB9XG5cbiAgZ2V0IGlzUGxheWVyU3dpdGNoaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJztcbiAgfVxuXG5cbiAgZ2V0IGlzQXNwZWN0UmF0aW9NYXRjaGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHdpbmRvd0FyID0gd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgY29uc3Qgdmlld3BvcnRBciA9IHRoaXMuZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIC8gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQuaGVpZ2h0O1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDAuMTU7XG4gICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvd0FyIC0gdmlld3BvcnRBcikgLyB2aWV3cG9ydEFyIDwgdG9sZXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxpdmVDb250ZW50Q29udGFpbmVyU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmlzTGl2ZSB8fCB0aGlzLmVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0FzcGVjdFJhdGlvTWF0Y2hlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtNYXRoLm1heCgyMDAsIHdpbmRvdy5pbm5lckhlaWdodCAtIDIwMCl9cHhgLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgc2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnU2NyZWVuc2hvdHMnLCB2YWx1ZTogJ3NjcmVlbnNob3RzJywgaWNvbjogJ3Bob3RvJyAgfSxcbiAgICB7IGxhYmVsOiAnVmlkZW8nLCB2YWx1ZTogJ3ZpZGVvJywgaWNvbjogJ3ZpZGVvY2FtJyB9LFxuICBdO1xuXG4gIHNwZWVkU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnMXgnLCB2YWx1ZTogJzF4JyB9LFxuICAgIHsgbGFiZWw6ICcyeCcsIHZhbHVlOiAnMngnIH0sXG4gICAgeyBsYWJlbDogJzV4JywgdmFsdWU6ICc1eCcgfSxcbiAgXTtcblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IGFyciA9IGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZGV0ZWN0VmlkZW9EdXJhdGlvbnMoYXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhhcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXSAmJiAhY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5maXJzdENoYW5nZSkge1xuICAgICAgY29uc3QgbmV3RHVyYXRpb24gPSBjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIC8vIElnbm9yZSBzZW50aW5lbCB2YWx1ZSAoLTEpIHVzZWQgdG8gZm9yY2UgY2hhbmdlIGRldGVjdGlvblxuICAgICAgaWYgKG5ld0R1cmF0aW9uID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmlzUGxheWluZykge1xuICAgICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG5nT25DaGFuZ2VzIHZpZGVvQ3VycmVudER1cmF0aW9uOiBwYXVzZWQgdmlkZW8gYmVmb3JlIHNlZWtpbmcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmlkZW9JbmRleCA9IHRoaXMuZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAobmV3RHVyYXRpb24pO1xuICAgICAgICBpZiAodGFyZ2V0VmlkZW9JbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RhcmdldFZpZGVvSW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlVGltZXN0YW1wID0gbmV3RHVyYXRpb24gLSB0YXJnZXRCb3VuZGFyeS5zdGFydDtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBuZWVkc1N3aXRjaCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggIT09IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgICAgY29uc3QgdGltZURpZmZlcmVuY2UgPSBNYXRoLmFicyhyZWxhdGl2ZVRpbWVzdGFtcCAtIGN1cnJlbnRWaWRlb1RpbWVNcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChuZWVkc1N3aXRjaCB8fCBuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2VlayhuZXdEdXJhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZWVkc1N3aXRjaCkge1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gdGFyZ2V0VmlkZW9JbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmlkZW9UaW1lTXMgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSAqIDEwMDA7XG4gICAgICAgICAgY29uc3QgdGltZURpZmZlcmVuY2UgPSBNYXRoLmFicyhuZXdEdXJhdGlvbiAtIGN1cnJlbnRWaWRlb1RpbWVNcyk7XG4gICAgICAgICAgaWYgKG5ld0R1cmF0aW9uICE9PSB0aGlzLmxhc3RTZXREdXJhdGlvbiB8fCB0aW1lRGlmZmVyZW5jZSA+IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5zZWVrVG9UaW1lKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3RyYWNlVmlld1VybCddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNhZmVUcmFjZVVybCgpO1xuICAgICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICAgICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCAmJiB0aGlzLmN1cnJlbnRWaWV3ID09PSAndHJhY2UnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXcgPSB0aGlzLmhpZGVWaWRlb1RhYiA/ICdzY3JlZW5zaG90cycgOiAndmlkZW8nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaGlkZVZpZGVvVGFiJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gY2hhbmdlc1snc2VsZWN0ZWRWaWV3J10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG5nT25EZXN0cm95OiBjbGVhbmVkIHVwIGxpc3RlbmVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBzZWVrVG9UaW1lKG1pbGxpc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwobWlsbGlzZWNvbmRzKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlayB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKiBUaGlzIHByZXZlbnRzIHBpcGVsaW5lIHJlYWQgZXJyb3JzIGR1cmluZyByYXBpZCBzZWVrIG9wZXJhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdmlkZW8uZHVyYXRpb24pIHJldHVybjtcblxuICAgIGNvbnN0IHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWNvbmRzLCB2aWRlby5kdXJhdGlvbikpO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2Vla2luZycsIHtcbiAgICAgIG1pbGxpc2Vjb25kcyxcbiAgICAgIHRhcmdldFRpbWUsXG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lQmVmb3JlOiB2aWRlby5jdXJyZW50VGltZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIFNldCBzZWVraW5nIHN0YXRlXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdzZWVraW5nJztcblxuICAgIC8vIENSSVRJQ0FMOiBQYXVzZSBiZWZvcmUgc2Vla2luZyB0byBhdm9pZCBwaXBlbGluZSBlcnJvcnNcbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0YXRlXG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAvLyBQZXJmb3JtIHNlZWtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBtaWxsaXNlY29uZHM7XG4gICAgXG4gICAgLy8gV2FpdCBicmllZmx5IGZvciBzZWVrIHRvIGNvbXBsZXRlIChwcmV2ZW50cyByYXBpZCBzZWVrIGlzc3VlcylcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTtcblxuICAgIC8vIFBlci12aWRlbyBwcm9ncmVzcyAoMC0xMDAlIG9mIGN1cnJlbnQgdmlkZW8pXG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICBpZiAoZHVyYXRpb25NcyA+IDApIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgIH1cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCArIHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgXG4gICAgLy8gU2V0IHRvIHBhdXNlZCBzdGF0ZSAodXNlciBtdXN0IGV4cGxpY2l0bHkgcGxheSlcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc2Vla1RvVGltZUludGVybmFsOiBzZWVrIGNvbXBsZXRlJywge1xuICAgICAgY3VycmVudFRpbWVBZnRlcjogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuICB9XG5cbiAgb25WaWRlb0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnICcgJiYgZXZlbnQuY29kZSAhPT0gJ1NwYWNlJykgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHBsYXkvcGF1c2UgKG5vdyB0cml2aWFsIHdpdGggc3RhdGUgbWFjaGluZSlcbiAgICovXG4gIHRvZ2dsZVBsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnLCB7XG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgc291cmNlXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWRlb1VybCB8fCB2aWRlby5uZXR3b3JrU3RhdGUgPT09IEhUTUxNZWRpYUVsZW1lbnQuTkVUV09SS19OT19TT1VSQ0UgfHwgdmlkZW8uZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IG5vIHZhbGlkIHNvdXJjZScsIHtcbiAgICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgICAgbmV0d29ya1N0YXRlOiB2aWRlby5uZXR3b3JrU3RhdGUsXG4gICAgICAgIGVycm9yOiB2aWRlby5lcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3ZlciBmcm9tIHN0dWNrICdsb2FkaW5nJyBzdGF0ZSB3aGVuIHZpZGVvIGlzIGFjdHVhbGx5IHJlYWR5IChlLmcuIGFmdGVyIGp1bXAtdG8tc2VnbWVudClcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnICYmIHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgYWxsb3cgcGxheSBkdXJpbmcgZXJyb3Igc3RhdGVcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgaW4gZXJyb3Igc3RhdGUnLCB7IHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGUgfSk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cblxuICAgIC8vIElmIHN0aWxsIGxvYWRpbmcgYW5kIHZpZGVvIG5vdCByZWFkeSwgd2FpdCBhbmQgcmV0cnlcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBub3QgcmVhZHknLCB7XG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA+PSBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3BsYXlpbmcnKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTonLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmcsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBTaW1wbGUgdG9nZ2xlIGJhc2VkIG9uIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gIFNIT1cgUExBWSBQQVVTRSBPVkVSTEFZXG4gIG9uVmlkZW9GcmFtZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSB0cnVlO1xuICAgIGlmICh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucGxheVBhdXNlT3ZlcmxheVRpbWVyKTtcbiAgICB0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UGxheVBhdXNlT3ZlcmxheSA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucztcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvPy5kdXJhdGlvbiAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBbdmlkZW8uZHVyYXRpb24gKiAxMDAwXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb01hcmtlcnMoKTogU3RlcE1hcmtlcltdIHtcbiAgICBsZXQgbWFya2Vyc1RvUHJvY2VzczogU3RlcE1hcmtlcltdO1xuICAgIFxuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLmdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk7XG4gICAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPT09IDAgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSBib3VuZGFyaWVzLmxlbmd0aCkge1xuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgICAgIFxuICAgICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2Vyc1xuICAgICAgICAgIC5maWx0ZXIobWFya2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uID49IGN1cnJlbnRCb3VuZGFyeS5zdGFydCAmJiBcbiAgICAgICAgICAgICAgICAgICBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgY3VycmVudEJvdW5kYXJ5LmVuZDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5tYXAobWFya2VyID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKFxuICAgICAgICAgICAgbWFya2VyLCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LmVuZFxuICAgICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuTWFya2VycyhtYXJrZXJzVG9Qcm9jZXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG1hcmtlcjogU3RlcE1hcmtlciwgYWRqdXN0bWVudDogbnVtYmVyLCB2aWRlb1N0YXJ0OiBudW1iZXIsIHZpZGVvRW5kOiBudW1iZXIpOiBTdGVwTWFya2VyIHtcbiAgICBjb25zdCBhZGp1c3RlZE1hcmtlcjogU3RlcE1hcmtlciA9IHtcbiAgICAgIC4uLm1hcmtlcixcbiAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICB9O1xuICAgIFxuICAgIGlmIChtYXJrZXIuY2hpbGRTdGVwcyAmJiBtYXJrZXIuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhZGp1c3RlZE1hcmtlci5jaGlsZFN0ZXBzID0gbWFya2VyLmNoaWxkU3RlcHNcbiAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgLm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgY29uc3QgYWRqdXN0ZWRDaGlsZDogU3RlcE1hcmtlciA9IHtcbiAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBjaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRTdGVwcyAmJiBjaGlsZC5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFkanVzdGVkQ2hpbGQuY2hpbGRTdGVwcyA9IGNoaWxkLmNoaWxkU3RlcHNcbiAgICAgICAgICAgICAgLmZpbHRlcihuZXN0ZWRDaGlsZCA9PiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPj0gdmlkZW9TdGFydCAmJiBuZXN0ZWRDaGlsZC5jdW11bGF0aXZlRHVyYXRpb24gPCB2aWRlb0VuZClcbiAgICAgICAgICAgICAgLm1hcChuZXN0ZWRDaGlsZCA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihuZXN0ZWRDaGlsZCwgYWRqdXN0bWVudCwgdmlkZW9TdGFydCwgdmlkZW9FbmQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFkanVzdGVkQ2hpbGQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWRqdXN0ZWRNYXJrZXI7XG4gIH1cblxuICBnZXRTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm4gMDtcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIHJldHVybiAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyBkdXJhdGlvbk1zKSAqIDEwMDtcbiAgfVxuXG4gIC8qKiBGdWxsLXZpZGVvIG1hcmtlcnM6IGV2ZXJ5IG1hcmtlciwgZmxhdHRlbmVkLCBsYWlkIG91dCBvbiB0aGUgZ2xvYmFsIHRpbWVsaW5lLlxuICAgKiBgc3RlcE1hcmtlcnNgIGlzIGFscmVhZHkgaW4gZ2xvYmFsIGNvb3JkaW5hdGVzIOKAlCBgY3VycmVudFZpZGVvTWFya2Vyc2AgZG9lcyB0aGVcbiAgICogaW52ZXJzZSAoZmlsdGVycyArIGFkanVzdHMgcGVyLWNsaXApOyBoZXJlIHdlIGp1c3QgZmxhdHRlbiB0aGUgb3JpZ2luYWwgbGlzdC4gKi9cbiAgZ2V0IGZ1bGxWaWRlb01hcmtlcnMoKTogU3RlcE1hcmtlcltdIHtcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuTWFya2Vycyh0aGlzLnN0ZXBNYXJrZXJzIHx8IFtdKTtcbiAgfVxuXG4gIGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKHN0ZXA6IFN0ZXBNYXJrZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgIGlmICghdG90YWwpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvIHRvdGFsKSAqIDEwMCkpO1xuICB9XG5cbiAgLyoqIEN1bXVsYXRpdmUgZWxhcHNlZCBtcyBvbiB0aGUgZ2xvYmFsIHRpbWVsaW5lIChwcmlvciBjbGlwIGR1cmF0aW9ucyArIGN1cnJlbnQgbG9jYWwgdGltZSkuICovXG4gIGdldCBnbG9iYWxDdXJyZW50VGltZU1zKCk6IG51bWJlciB7XG4gICAgY29uc3QgbG9jYWwgPSAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSA/PyAwKSAqIDEwMDA7XG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuc2VnbWVudEJvdW5kYXJpZXM7XG4gICAgY29uc3QgcHJpb3JFbmQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID4gMCA/IChib3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKSA6IDA7XG4gICAgcmV0dXJuIHByaW9yRW5kICsgbG9jYWw7XG4gIH1cblxuICAvKiogMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSwgZHJpdmVuIGJ5IHRpbWV1cGRhdGUuICovXG4gIGdldCBnbG9iYWxQcm9ncmVzcygpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgIGlmICghdG90YWwpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh0aGlzLmdsb2JhbEN1cnJlbnRUaW1lTXMgLyB0b3RhbCkgKiAxMDApKTtcbiAgfVxuXG4gIC8qKiBXaGlsZSBkcmFnZ2luZyBpbiBmdWxsIG1vZGUsIHRoZSBzY3J1YmJlciByZWFkcyB0aGUgb3ZlcnJpZGU7IG90aGVyd2lzZSBnbG9iYWxQcm9ncmVzcy4gKi9cbiAgZ2V0IGdsb2JhbFNjcnViYmVyUGVyY2VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRyYWdnaW5nID8gdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgOiB0aGlzLmdsb2JhbFByb2dyZXNzO1xuICB9XG5cbiAgZ2V0U3RlcENvbG9yKHN0ZXA6IFN0ZXBNYXJrZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdGVwLmxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyM2MzY2RjEnO1xuICB9XG5cbiAgZ2V0U3RlcFJlc3VsdENvbG9yKHN0ZXA6IFN0ZXBNYXJrZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHN0ZXAucmVzdWx0KTtcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlckNvbG9yKGxldmVsPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnI0ZGQTUwMCc7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihyZXN1bHQ6IFN0ZXBNYXJrZXJbJ3Jlc3VsdCddKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgY2FzZSAnU1VDQ0VTUyc6XG4gICAgICAgIHJldHVybiAnIzEyQjc2QSc7XG4gICAgICBjYXNlICdGQUlMVVJFJzpcbiAgICAgICAgcmV0dXJuICcjQjkxQzFDJztcbiAgICAgIGNhc2UgJ0FCT1JURUQnOlxuICAgICAgICByZXR1cm4gJyNGNzkwMDknO1xuICAgICAgY2FzZSAnU0tJUFBFRCc6XG4gICAgICAgIHJldHVybiAnIzY2NzA4NSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyM2MzY2RjEnO1xuICAgIH1cbiAgfVxuXG4gIG9uTWFya2VyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIG1hcmtlcjogU3RlcE1hcmtlcik6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKG1hcmtlci50ZXN0U3RlcElkICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5oaXRNYXJrZXJzLmFkZChtYXJrZXIudGVzdFN0ZXBJZCk7XG4gICAgICAgIHRoaXMubWFya2VySGl0LmVtaXQobWFya2VyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9VcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgJiYgdGhpcy52aWRlb1VybHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy5jdXJyZW50VmlkZW9JbmRleCwgMCksIHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHRoaXMudmlkZW9VcmxzW2lkeF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZGVvVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSByZXNldFZpZGVvU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsOiByZXNldHRpbmcnKTtcblxuICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsOiBjb21wbGV0ZScpO1xuICB9XG5cbiAgcHJldlZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID4gMCkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDEpKTtcbiAgICB9XG4gIH1cblxuICBuZXh0VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZWxpbmVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGltZWxpbmVCYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjbGlja1ggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGlja1ggLyByZWN0LndpZHRoKSk7XG5cbiAgICBpZiAodGhpcy5pc1ZpZGVvRnVsbE1vZGUpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBwZXJjZW50ICogdG90YWw7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEyMCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8uZHVyYXRpb24gfHwgIWlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gcGVyY2VudCAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25UaW1lbGluZUNsaWNrJywge1xuICAgICAgcGVyY2VudCxcbiAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmdcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhcnREcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBDUklUSUNBTDogQ2FwdHVyZSBwbGF5aW5nIHN0YXRlIEJFRk9SRSBwYXVzaW5nXG4gICAgLy8gVXNlIGJvdGggaXNQbGF5aW5nIGZsYWcgYW5kIHBsYXllclN0YXRlIGZvciByZWxpYWJpbGl0eVxuICAgIHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWcgPSB0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZyc7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0YXJ0RHJhZycsIHtcbiAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmcsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZ1xuICAgIH0pO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGR1cmluZyBkcmFnIHRvIGF2b2lkIGNvbmZsaWN0c1xuICAgIGlmICh0aGlzLmlzUGxheWluZyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmFkZERyYWdMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIG9uRHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZyB8fCAhdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGltZWxpbmVCYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCAvIHJlY3Qud2lkdGgsIDEpKTtcbiAgICBpZiAodGhpcy5pc1ZpZGVvRnVsbE1vZGUpIHtcbiAgICAgIHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzID0gcGVyY2VudCAqIDEwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7IC8vIFBlci1jbGlwIHRpbWVsaW5lIHBvc2l0aW9uXG4gICAgfVxuICB9XG5cbiAgc3RvcERyYWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogZHJhZyBlbmRlZCcsIHtcbiAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWcsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nOiBzaG91bGRSZXN1bWVQbGF5aW5nLFxuICAgICAgY3VycmVudFBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5pc1ZpZGVvRnVsbE1vZGUpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSAodGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgLyAxMDApICogdG90YWw7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbyB8fCAhdmlkZW8uZHVyYXRpb24gfHwgIWlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gKHRoaXMucHJvZ3Jlc3MgLyAxMDApICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBcbiAgICAgIGlmIChzaG91bGRSZXN1bWVQbGF5aW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgc2VlaycsIHtcbiAgICAgICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBXYWl0IGEgYml0IGxvbmdlciB0byBlbnN1cmUgc2VlayBpcyBmdWxseSBjb21wbGV0ZVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgIFxuICAgICAgICAvLyBWZXJpZnkgc3RhdGUgaXMgJ3BhdXNlZCcgYWZ0ZXIgc2VlayAoc2Vla1RvVGltZUludGVybmFsIHNldHMgaXQgdG8gJ3BhdXNlZCcpXG4gICAgICAgIC8vIElmIHN0YXRlIGlzIHN0aWxsICdzZWVraW5nJywgd2FpdCBhIGJpdCBtb3JlXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnc2Vla2luZycpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHNlZWsgc3RpbGwgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgbW9yZScpO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm93IHJlc3VtZSBwbGF5YmFjayAoc3RhdGUgc2hvdWxkIGJlICdwYXVzZWQnIGF0IHRoaXMgcG9pbnQpXG4gICAgICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHBsYXliYWNrIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdW5leHBlY3RlZCBzdGF0ZSBhZnRlciBzZWVrLCBhdHRlbXB0aW5nIHRvIHJlc3VtZSBhbnl3YXknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFRyeSB0byByZXN1bWUgYW55d2F5IC0gYmV0dGVyIHRvIHRyeSB0aGFuIHRvIGxlYXZlIGl0IHN0dWNrXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHZpZGVvIHdhcyBwYXVzZWQsIG5vdCByZXN1bWluZycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRHJhZyhlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnN0b3BEcmFnKCk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICAgICAgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb01ldGFkYXRhTG9hZGVkJyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgfVxuICBcbiAgb25WaWRlb0NhblBsYXkoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9DYW5QbGF5Jyk7XG4gICAgLy8gRW5zdXJlIHBsYXliYWNrIHNwZWVkIGlzIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCB2aWRlb3NcbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcblxuICAgIC8vIENvbnN1bWUgYW55IHBlbmRpbmcgcmVjb3Zlcnkgc3RhdGUgcXVldWVkIGJ5IG9uVmlkZW9FcnJvcigpOiBzZWVrIGJhY2sgdG9cbiAgICAvLyB3aGVyZSBwbGF5YmFjayBlcnJvcmVkIGFuZCBhdXRvLXJlc3VtZSBpZiB3ZSB3ZXJlIHBsYXlpbmcgYXQgdGhlIHRpbWUuXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzZWVrU2VjID0gdGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheTtcbiAgICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYyA9IG51bGw7XG4gICAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXkgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAodmlkZW8gJiYgaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2VjLCB2aWRlby5kdXJhdGlvbikpO1xuICAgICAgICB9IGNhdGNoIChfKSB7IC8qIGVsZW1lbnQgbWF5IG5vdCBiZSBzZWVrYWJsZSB5ZXQ7IGhhcm1sZXNzICovIH1cbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRQbGF5KSB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDgwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogTmF0aXZlIGVycm9yLWV2ZW50IGhhbmRsZXIgZm9yIHRoZSBtYWluIDx2aWRlbz4gZWxlbWVudC4gVGhlIENocm9tZSBtZWRpYVxuICAgKiBzdGFjayBvY2Nhc2lvbmFsbHkgdGhyb3dzIFwiUGlwZWxpbmVTdGF0dXM6OlBJUEVMSU5FX0VSUk9SX1JFQUQ6IEZGbXBlZ0RlbXV4ZXI6XG4gICAqIGRhdGEgc291cmNlIGVycm9yXCIgZHVyaW5nIHBsYXliYWNrIGFmdGVyIGEgYnJpZWYgbmV0d29yayBibGlwIG9yIGEgYnVyc3Qgb2ZcbiAgICogZmFzdCB1c2VyIGFjdGlvbnM7IG9uY2UgdGhhdCBoYXBwZW5zIHRoZSBlbGVtZW50IGJlY29tZXMgdW5yZXNwb25zaXZlIHRvXG4gICAqIHBsYXkvcGF1c2Uvc2Vlay4gV2UgcmVjb3ZlciBieSB1bm1vdW50aW5nK3JlbW91bnRpbmcgdGhlIDx2aWRlbz4gdmlhICpuZ0lmXG4gICAqIOKAlCB0aGUgc2FtZSBtZWNoYW5pc20gdGhhdCBtYWtlcyB0aGUgU2NyZWVuc2hvdHPihpRWaWRlbyB0YWItc3dpdGNoIHdvcmthcm91bmRcbiAgICogd29yayB0b2RheSDigJQgdGhlbiByZXN0b3JlIHRoZSBwcmUtZXJyb3IgcGxheWhlYWQgYW5kIHJlc3VtZSBwbGF5YmFjay4gKi9cbiAgb25WaWRlb0Vycm9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVyciA9IHZpZGVvPy5lcnJvcjtcblxuICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIG9uVmlkZW9FcnJvciDigJQgdHJpZ2dlcmluZyBhdXRvLXJlY292ZXJ5Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBlcnJvckNvZGU6IGVycj8uY29kZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyPy5tZXNzYWdlLFxuICAgICAgbmV0d29ya1N0YXRlOiB2aWRlbz8ubmV0d29ya1N0YXRlLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8/LnJlYWR5U3RhdGUsXG4gICAgICBjdXJyZW50VmlkZW9JbmRleDogdGhpcy5jdXJyZW50VmlkZW9JbmRleCxcbiAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICBhdHRlbXB0czogdGhpcy5yZWNvdmVyeUF0dGVtcHRzXG4gICAgfSk7XG5cbiAgICAvLyBCb3VuZCB0aGUgcmV0cnkgYnVkZ2V0IHRvIGEgcm9sbGluZyB3aW5kb3cgc28gYSBwZXJzaXN0ZW50bHkgYnJva2VuXG4gICAgLy8gc291cmNlICg0MDQsIHVuc3VwcG9ydGVkIGNvZGVjLCDigKYpIGRvZXNuJ3QgZmxhcCBmb3JldmVyLlxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKG5vdyAtIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPiB0aGlzLlJFQ09WRVJZX1dJTkRPV19NUykge1xuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzID0gMDtcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSBub3c7XG4gICAgfVxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cysrO1xuICAgIGlmICh0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPiB0aGlzLk1BWF9SRUNPVkVSWV9BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gb25WaWRlb0Vycm9yOiBleGNlZWRlZCByZWNvdmVyeSBhdHRlbXB0cywgZ2l2aW5nIHVwJyk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhcHR1cmUgd2hhdCB3ZSBuZWVkIHRvIHJlc3RvcmUgYWZ0ZXIgdGhlIHJlbW91bnQuXG4gICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjID0gKHZpZGVvICYmIGlzRmluaXRlKHZpZGVvLmN1cnJlbnRUaW1lKSkgPyB2aWRlby5jdXJyZW50VGltZSA6IDA7XG4gICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5ID0gdGhpcy5pc1BsYXlpbmc7XG5cbiAgICAvLyBQdXQgdGhlIHN0YXRlIG1hY2hpbmUgaW50byAnZXJyb3InIHNvIG9uVmlkZW9FbGVtZW50UmVhZHkgcmVzZXRzIGl0XG4gICAgLy8gYmFjayB0byAnaWRsZScgd2hlbiB0aGUgcmVtb3VudGVkIGVsZW1lbnQgYXJyaXZlcy5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAvLyBVbm1vdW50IOKGkiByZW1vdW50LiBCcmllZiAxMDBtcyBnYXAgbWlycm9ycyB0aGUgdGFiLXN3aXRjaCB3b3JrYXJvdW5kLlxuICAgIHRoaXMudmlkZW9SZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmlkZW9SZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgb25WaWRlb0VuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICAvLyBTd2l0Y2ggdG8gbmV4dCB2aWRlbyBhbmQgYXV0by1wbGF5IGl0XG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MgJiYgdGhpcy52aWRlb1VybHMgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA8IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxO1xuXG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKG5leHRJbmRleCk7XG5cbiAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hWaWRlb0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xuICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyAtIGxhc3RVcGRhdGUgPCAxMDApIHJldHVybjtcblxuICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xuICAgICAgICBjb25zdCBjdXJyZW50TXMgPSB2aWRlby5jdXJyZW50VGltZSAqIDEwMDA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdzd2l0Y2hpbmcnKSB7XG4gICAgICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1cnJlbnRNcyAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEVtaXQgY3VtdWxhdGl2ZSB0aW1lIGZvciBwYXJlbnQgKHN0ZXAgaGlnaGxpZ2h0aW5nKVxuICAgICAgICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgICAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIGN1cnJlbnRNcyk7XG4gICAgICAgICAgdGhpcy5tYXliZVByZWxvYWROZXh0U2VnbWVudCgpO1xuXG4gICAgICAgICAgLy8gQXV0by1zY3JvbGwgdGhlIGxpYnJhcnkgcm93IHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIHN0YXlzIHZpc2libGUuXG4gICAgICAgICAgLy8gT25seSB3aGlsZSBwbGF5aW5nOyB3aGVuIHBhdXNlZCB3ZSBsZWF2ZSB0aGUgcm93IHdoZXJlIHRoZSB1c2VyIGxlZnQgaXQuXG4gICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggIT09IHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJscyksIDUwMCk7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVsb2FkIGFsbCB2aWRlbyBVUkxzIGluIHNlcXVlbmNlIChmaXJzdCwgdGhlbiBzZWNvbmQsIC4uLikgc28gdGhleSBhcmUgY2FjaGVkLlxuICAgKiBXaGVuIHVzZXIganVtcHMgdG8gYW55IHNlZ21lbnQsIHRoYXQgdmlkZW8gaXMgbGlrZWx5IGFscmVhZHkgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICB2aWRlby5wcmVsb2FkID0gJ2F1dG8nO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5wbGF5c0lubGluZSA9IHRydWU7XG4gICAgdmlkZW8uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSB2aWRlbztcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgbG9hZE5leHQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ICE9PSB2aWRlbyB8fCBpbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoKSB7XG4gICAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID09PSB2aWRlbykgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXJsID0gdmlkZW9VcmxzW2luZGV4XTtcbiAgICAgIHZpZGVvLnNyYyA9IHVybDtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb25zdCBvbkRvbmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgb25Eb25lKTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUpO1xuICAgICAgICBsb2FkTmV4dCgpO1xuICAgICAgfTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25Eb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IG9uRG9uZSgpLCAxNTAwMCk7XG4gICAgfTtcbiAgICBsb2FkTmV4dCgpO1xuICB9XG5cbiAgLyoqIFByZWxvYWQgbmV4dCBzZWdtZW50IHdoZW4gfjUtMTAgc2Vjb25kcyBmcm9tIGVuZGluZyB0byBtaW5pbWl6ZSBzd2l0Y2hpbmcgZGVsYXkgKi9cbiAgcHJpdmF0ZSBtYXliZVByZWxvYWROZXh0U2VnbWVudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MgfHwgIXRoaXMudmlkZW9VcmxzIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRpbWVMZWZ0SW5TZWdtZW50ID0gKHZpZGVvLmR1cmF0aW9uIC0gdmlkZW8uY3VycmVudFRpbWUpICogMTAwMDsgLy8gbXNcbiAgICBpZiAodGltZUxlZnRJblNlZ21lbnQgPiAxMDAwMCB8fCB0aW1lTGVmdEluU2VnbWVudCA8IDUwMDApIHJldHVybjsgLy8gUHJlbG9hZCB3aGVuIDUtMTBzIGZyb20gZW5kXG4gICAgY29uc3QgbmV4dFVybCA9IHRoaXMudmlkZW9VcmxzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxXTtcbiAgICBpZiAoIW5leHRVcmwpIHJldHVybjtcbiAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50Py5zcmMgPT09IG5leHRVcmwpIHJldHVybjsgLy8gQWxyZWFkeSBwcmVsb2FkaW5nXG4gICAgdGhpcy5wcmVsb2FkTmV4dFNlZ21lbnQobmV4dFVybCk7XG4gIH1cblxuICBwcml2YXRlIHByZWxvYWROZXh0U2VnbWVudCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICB2aWRlby5wcmVsb2FkID0gJ2F1dG8nO1xuICAgIHZpZGVvLnNyYyA9IHVybDtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCAoKSA9PiB7XG4gICAgICB2aWRlby5yZW1vdmUoKTtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgYWN0dWFsIHZpZGVvIGR1cmF0aW9ucyBieSBsb2FkaW5nIHZpZGVvIG1ldGFkYXRhXG4gICAqIFRoaXMgY3JlYXRlcyB0ZW1wb3JhcnkgdmlkZW8gZWxlbWVudHMgdG8gcmVhZCBkdXJhdGlvbiB3aXRob3V0IHBsYXlpbmdcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0VmlkZW9EdXJhdGlvbnModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRldGVjdGVkIGR1cmF0aW9uc1xuICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgIGxldCBsb2FkZWRDb3VudCA9IDA7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGVtcFZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgIHRlbXBWaWRlby5wcmVsb2FkID0gJ21ldGFkYXRhJztcbiAgICAgIFxuICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHRlbXBWaWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkdXJhdGlvbk1zO1xuICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYW4gdXBcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChsb2FkZWRDb3VudCA9PT0gdmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBBbGwgdmlkZW8gZHVyYXRpb25zIGRldGVjdGVkOicsIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgdGVtcFZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICB0ZW1wVmlkZW8uc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdW11bGF0aXZlIGR1cmF0aW9uIGJvdW5kYXJpZXMgZm9yIGVhY2ggdmlkZW9cbiAgICogUmV0dXJucyBhbiBhcnJheSB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgW3N0YXJ0RHVyYXRpb24sIGVuZER1cmF0aW9uXSBmb3IgdGhhdCB2aWRlb1xuICAgKiBVc2VzIGRldGVjdGVkIHZpZGVvIGR1cmF0aW9ucyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHZpZGVvRHVyYXRpb25zIGlucHV0XG4gICAqL1xuICBwcml2YXRlIGdldFZpZGVvRHVyYXRpb25Cb3VuZGFyaWVzKCk6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4ge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgZGV0ZWN0ZWQgZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBwcm92aWRlZCBkdXJhdGlvbnNcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCBcbiAgICAgID8gdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zIFxuICAgICAgOiBbXTtcbiAgICBcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBib3VuZGFyaWVzOiBBcnJheTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgbGV0IGN1bXVsYXRpdmVTdGFydCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBkdXJhdGlvbiBvZiBkdXJhdGlvbnMpIHtcbiAgICAgIGJvdW5kYXJpZXMucHVzaCh7XG4gICAgICAgIHN0YXJ0OiBjdW11bGF0aXZlU3RhcnQsXG4gICAgICAgIGVuZDogY3VtdWxhdGl2ZVN0YXJ0ICsgZHVyYXRpb25cbiAgICAgIH0pO1xuICAgICAgY3VtdWxhdGl2ZVN0YXJ0ICs9IGR1cmF0aW9uO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGF0dGVuIGFsbCBtYXJrZXJzIHJlY3Vyc2l2ZWx5IGluY2x1ZGluZyBjaGlsZFN0ZXBzXG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5NYXJrZXJzKG1hcmtlcnM6IFN0ZXBNYXJrZXJbXSk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgY29uc3QgZmxhdHRlbmVkOiBTdGVwTWFya2VyW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBmbGF0dGVuUmVjdXJzaXZlID0gKG1hcmtlcnM6IFN0ZXBNYXJrZXJbXSkgPT4ge1xuICAgICAgbWFya2Vycy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICAgIC8vIEFkZCB0aGUgbWFya2VyIGl0c2VsZlxuICAgICAgICBmbGF0dGVuZWQucHVzaChtYXJrZXIpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgYWRkIGNoaWxkIG1hcmtlcnNcbiAgICAgICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmbGF0dGVuUmVjdXJzaXZlKG1hcmtlci5jaGlsZFN0ZXBzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBcbiAgICBmbGF0dGVuUmVjdXJzaXZlKG1hcmtlcnMpO1xuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTWFya2VySGl0KGdsb2JhbFRpbWVNczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUGxheWluZyB8fCB0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIG1hcmtlcnMgKGluY2x1ZGluZyBuZXN0ZWQgb25lcykgZm9yIGEgbWF0Y2hcbiAgICBjb25zdCBhbGxNYXJrZXJzID0gdGhpcy5mbGF0dGVuTWFya2Vycyh0aGlzLnN0ZXBNYXJrZXJzKTtcbiAgICBjb25zdCB0b2xlcmFuY2UgPSAyMDA7IC8vIDIwMG1zIHRvbGVyYW5jZSBmb3IgbWF0Y2hpbmdcbiAgICBcbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiBhbGxNYXJrZXJzKSB7XG4gICAgICAvLyBTa2lwIGlmIG1hcmtlciBkb2Vzbid0IGhhdmUgdGVzdFN0ZXBJZFxuICAgICAgaWYgKCFtYXJrZXIudGVzdFN0ZXBJZCkgY29udGludWU7XG4gICAgICBcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBoaXRcbiAgICAgIGlmICh0aGlzLmhpdE1hcmtlcnMuaGFzKG1hcmtlci50ZXN0U3RlcElkKSkgY29udGludWU7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgdGltZSBtYXRjaGVzIG1hcmtlciB0aW1lICh3aXRoaW4gdG9sZXJhbmNlKVxuICAgICAgY29uc3QgdGltZURpZmZlcmVuY2UgPSBNYXRoLmFicyhnbG9iYWxUaW1lTXMgLSBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uKTtcbiAgICAgIGlmICh0aW1lRGlmZmVyZW5jZSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgLy8gTWFyayBhcyBoaXQgYW5kIGVtaXQgZXZlbnRcbiAgICAgICAgdGhpcy5oaXRNYXJrZXJzLmFkZChtYXJrZXIudGVzdFN0ZXBJZCk7XG4gICAgICAgIHRoaXMubWFya2VySGl0LmVtaXQobWFya2VyKTtcbiAgICAgICAgYnJlYWs7IC8vIE9ubHkgZW1pdCBvbmUgbWFya2VyIHBlciBjaGVja1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUZ1bGxTY3JlZW4oKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGJlZm9yZSBmdWxsc2NyZWVuIHRyYW5zaXRpb24gdG8gYXZvaWQgc3RhdGUgaXNzdWVzXG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUb2dnbGUgZnVsbHNjcmVlblxuICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gIXRoaXMuaXNGdWxsU2NyZWVuO1xuICAgIFxuICAgIC8vIFJlc2V0IHBsYXllciBzdGF0ZSB0byBhbGxvdyByZS1pbml0aWFsaXphdGlvbiBhZnRlciBET00gdXBkYXRlXG4gICAgLy8gVGhlIHN0YXRlIG1pZ2h0IGJlIHN0dWNrIGluICdsb2FkaW5nJyBvciAnZXJyb3InIGFmdGVyIGZ1bGxzY3JlZW4gdHJhbnNpdGlvblxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG4gICAgXG4gICAgLy8gV2FpdCBmb3IgQW5ndWxhciB0byB1cGRhdGUgdGhlIERPTSwgdGhlbiByZS1pbml0aWFsaXplIHZpZGVvXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAvLyBSZXN0b3JlIHZpZGVvIHBvc2l0aW9uIGlmIGl0IHdhcyBzZXRcbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lID4gMCAmJiB2aWRlby5kdXJhdGlvbiA+IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXBwbHkgcGxheWJhY2sgcmF0ZVxuICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXR0YWNoIGxpc3RlbmVyc1xuICAgICAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXNldCBzdGF0ZSB0byAncGF1c2VkJyAocmVhZHkgdG8gcGxheSlcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIHJlLWluaXRpYWxpemVkJywge1xuICAgICAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVGdWxsU2NyZWVuOiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCBhZnRlciB0cmFuc2l0aW9uJyk7XG4gICAgICAgIC8vIFRyeSBhZ2FpbiBhZnRlciBhIGJpdCBtb3JlIHRpbWVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9SZXRyeSA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBpZiAodmlkZW9SZXRyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyAhPT0gJ3ZpZGVvJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscykge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbCgwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0VGltZShzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghc2Vjb25kcyB8fCBpc05hTihzZWNvbmRzKSkgcmV0dXJuICcwMDowMCc7XG4gICAgXG4gICAgY29uc3QgdG90YWxTZWNvbmRzID0gTWF0aC5mbG9vcihzZWNvbmRzKTtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XG4gICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAlIDM2MDApIC8gNjApO1xuICAgIGNvbnN0IHNlY3MgPSB0b3RhbFNlY29uZHMgJSA2MDtcbiAgICBcbiAgICAvLyBJZiBob3VycyA+IDAsIHNob3cgSEg6TU06U1MgZm9ybWF0LCBvdGhlcndpc2Ugc2hvdyBNTTpTUyBmb3JtYXRcbiAgICBpZiAoaG91cnMgPiAwKSB7XG4gICAgICByZXR1cm4gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBgJHttaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG5cbiAgY2FwdHVyZVZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93Q2FwdHVyZVZpZGVvIHx8ICF0aGlzLmlzTGl2ZSB8fCB0aGlzLmlzQ2FwdHVyaW5nVmlkZW8pIHJldHVybjtcbiAgICB0aGlzLmNhcHR1cmVWaWRlb1JlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgQ2xpcHMgcm93IGRyYWctdG8tc2Nyb2xsIChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gRGVzaWduOiB0cmFja2luZyBzdGFydHMgb24gbW91c2Vkb3duIGJ1dCB3ZSBET04nVCBmbGlwIHRvIHRoZSBcImRyYWdnaW5nXCIgdmlzdWFsIHN0YXRlXG4gIC8vIG9yIGJsb2NrIGNsaWNrcyB1bnRpbCB0aGUgcG9pbnRlciBjcm9zc2VzIGEgNXB4IHRocmVzaG9sZC4gVGhhdCB3YXkgYSBwbGFpbiBjbGlja1xuICAvLyAobm8gbW92ZW1lbnQpIHJlZ2lzdGVycyBub3JtYWxseSBvbiB0aGUgY2FyZCAvIGRvd25sb2FkIGJ1dHRvbiB3aXRoIHRoZSB1c3VhbCBjdXJzb3IuXG4gIG9uQ2xpcHNNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHNjcm9sbGVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgIXNjcm9sbGVyKSByZXR1cm47XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlID0gZmFsc2U7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRTY3JvbGxMZWZ0ID0gc2Nyb2xsZXIuc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQsIHNjcm9sbGVyOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZyB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICBjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WDtcbiAgICBpZiAoIXRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSAmJiBNYXRoLmFicyhkeCkgPiA1KSB7XG4gICAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSB0cnVlO1xuICAgICAgdGhpcy5jbGlwc0RyYWdBY3RpdmUgPSB0cnVlOyAvLyBmbGlwIHRoZSBncmFiYmluZyBjdXJzb3Igbm93IHRoYXQgaXQncyBhIHJlYWwgZHJhZ1xuICAgIH1cbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSB7XG4gICAgICBzY3JvbGxlci5zY3JvbGxMZWZ0ID0gdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgLSBkeDtcbiAgICB9XG4gIH1cblxuICBvbkNsaXBzTW91c2VVcChfZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jbGlwc0RyYWdBY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSB7XG4gICAgICAvLyBLZWVwIGRpZE1vdmU9dHJ1ZSBicmllZmx5IHNvIHRoZSBzeW50aGV0aWMgY2xpY2sgZmlyZXMgYW5kIGlzIGlnbm9yZWQsIHRoZW4gcmVzZXQuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlID0gZmFsc2U7IH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkNsaXBzTW91c2VVcChldmVudCk7XG4gIH1cblxuICAvKiogQ2xpY2sgaGFuZGxlciBvbiBhIFZpZGVvIExpYnJhcnkgY2FyZCDigJQgc3dpdGNoZXMgdGhlIG1haW4gcGxheWVyIHRvIHRoYXQgY2xpcCBhbmQgYXV0by1wbGF5cy5cbiAgICogU2VsZWN0aW5nIGEgKmRpZmZlcmVudCogY2xpcCBhbHNvIGNvbGxhcHNlcyB0aGUgbGlicmFyeSBzbyB0aGUgbmV3bHktcGxheWluZyB2aWRlbyBpcyB1bm9ic3RydWN0ZWQ7XG4gICAqIHJlLWNsaWNraW5nIHRoZSBhY3RpdmUgY2xpcCBqdXN0IHRvZ2dsZXMgcGxheS9wYXVzZSBhbmQga2VlcHMgdGhlIGRyYXdlciBzdGF0ZS5cbiAgICogSWdub3JlZCB3aGVuIHRoZSBjbGljayBvcmlnaW5hdGVkIGZyb20gYSBob3Jpem9udGFsIGRyYWctc2Nyb2xsLiAqL1xuICBzZWxlY3RMaWJyYXJ5Q2xpcChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmRlbGV0ZShpbmRleCk7XG5cbiAgICAvLyBGdWxsLW1vZGU6IHNlZWsgdGhlIGdsb2JhbCB0aW1lbGluZSB0byB0aGlzIGNsaXAncyBzdGFydC4gS2VlcCBmdWxsIG1vZGUgYW5kXG4gICAgLy8gdGhlIGxpYnJhcnkgcGFuZWwgb3BlbiBzbyB0aGUgdXNlciBjYW4gc2VlIHRoZSBoaWdobGlnaHQgZm9sbG93IGFsb25nLlxuICAgIC8vIElmIHRoZSBjbGlja2VkIGNhcmQgaXMgdGhlIG9uZSBhbHJlYWR5IHBsYXlpbmcgdW5kZXIgdGhlIGhvb2QsIHRyZWF0IHRoZVxuICAgIC8vIGNsaWNrIGFzIGEgcGxheS9wYXVzZSB0b2dnbGUgKHRoZSBjYXJkJ3Mgb3ZlcmxheSBpY29uIHJlZmxlY3RzIHRoYXQgc3RhdGUpLlxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5zZWdtZW50Qm91bmRhcmllcztcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gaW5kZXggPT09IDAgPyAwIDogKGJvdW5kYXJpZXNbaW5kZXggLSAxXSA/PyAwKTtcbiAgICAgIGNvbnN0IHNob3VsZFJlc3VtZSA9IHRoaXMuaXNQbGF5aW5nO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lKSB7XG4gICAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4KSB7XG4gICAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoaW5kZXgpO1xuICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFBlci1jYXJkIG1ldGFkYXRhIGhhbmRsZXIg4oCUIGNhY2hlcyBkdXJhdGlvbiBzbyB0aGUgYDA6NDJgIHRodW1ibmFpbCBsYWJlbCBjYW4gcmVuZGVyLlxuICAgKiBCb3VuZCB0byBCT1RIIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBkdXJhdGlvbmNoYW5nZWA6XG4gICAqICAgLSBTb21lIE1QNHMgKGVzcC4gc2hvcnQgY2xpcHMgd2l0aCBtb292IGF0IHRoZSBlbmQpIHJlcG9ydCBhIHdyb25nL3BhcnRpYWwgZHVyYXRpb25cbiAgICogICAgIG9uIGBsb2FkZWRtZXRhZGF0YWA7IENocm9tZSBsYXRlciBjb3JyZWN0cyBpdCB2aWEgYGR1cmF0aW9uY2hhbmdlYC4gTGlzdGVuaW5nIHRvXG4gICAqICAgICBib3RoICsga2VlcGluZyB0aGUgbWF4LXNvLWZhciBhdm9pZHMgc3RhbGUgd3JvbmcgdmFsdWVzIGxpa2UgXCIwMDowMVwiIGZvciBhIDVzIGNsaXAuXG4gICAqICAgLSBGb3Igc3RyZWFtZWQgTVA0cyB0aGF0IHJlcG9ydCBgSW5maW5pdHlgLCBzZWVrIHRvIHRoZSBlbmQgb25jZSBzbyBDaHJvbWUgZmV0Y2hlc1xuICAgKiAgICAgdGhlIGN1ZXMvdHJhaWxlciBhbmQgZmlyZXMgYSBjb3JyZWN0ZWQgYGR1cmF0aW9uY2hhbmdlYC4gKi9cbiAgb25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGluZGV4OiBudW1iZXIsIHZpZGVvRWw6IEhUTUxWaWRlb0VsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBkID0gdmlkZW9FbD8uZHVyYXRpb247XG4gICAgaWYgKGQgPT09IEluZmluaXR5ICYmICF2aWRlb0VsLmRhdGFzZXRbJ2NxYUR1cmF0aW9uUHJvYmVkJ10pIHtcbiAgICAgIHZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSA9ICcxJztcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZGVvRWwuY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogc29tZSBicm93c2VycyB0aHJvdyBiZWZvcmUgbWV0YWRhdGE7IGlnbm9yZSAqLyB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZCkgJiYgZCA+IDApIHtcbiAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5nZXQoaW5kZXgpIHx8IDA7XG4gICAgICBpZiAoZCA+IHByZXYpIHtcbiAgICAgICAgdGhpcy5saWJyYXJ5VmlkZW9EdXJhdGlvbnMuc2V0KGluZGV4LCBkKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhY2tMaWJyYXJ5Q2xpcEJ5SW5kZXgoaW5kZXg6IG51bWJlciwgdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpbmRleCArICc6JyArICh1cmwgfHwgJycpO1xuICB9XG5cbiAgLyoqIERvd25sb2FkIHRoZSBjbGlwIGF0IGBpbmRleGAuIFN0cmVhbXMgdGhlIGJ5dGVzIHdpdGggZmV0Y2ggc28gd2UgY2FuIHNob3cgcHJvZ3Jlc3MsXG4gICAqIHRoZW4gc2F2ZXMgdmlhIGEgdGVtcG9yYXJ5IGJsb2IgVVJMIHNvIHRoZSBmaWxlIGNvbWVzIGRvd24gb24gdGhlIHNhbWUgcGFnZVxuICAgKiAobm8gbmV3IHRhYiAvIHdpbmRvdykuIEZhbGxzIGJhY2sgdG8gYSBkaXJlY3QgYW5jaG9yIGNsaWNrIGlmIGZldGNoIGlzIHVuYXZhaWxhYmxlIG9yIGZhaWxzLiAqL1xuICBhc3luYyBkb3dubG9hZENsaXAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHJldHVybjtcbiAgICBjb25zdCB1cmwgPSBBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSA/IHRoaXMudmlkZW9VcmxzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXVybCB8fCB0aGlzLmRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaW5kZXgpKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZGVyaXZlQ2xpcEZpbGVuYW1lKHVybCwgaW5kZXgpO1xuICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmFkZChpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgMCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgbW9kZTogJ2NvcnMnLCBjcmVkZW50aWFsczogJ29taXQnIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzcG9uc2UuYm9keSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rvd25sb2FkIGZhaWxlZDogJyArIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICB9XG4gICAgICBjb25zdCB0b3RhbCA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSkgfHwgMDtcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgICAgbGV0IHJlY2VpdmVkID0gMDtcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgIGlmICh0b3RhbCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRQcm9ncmVzcy5zZXQoaW5kZXgsIE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgocmVjZWl2ZWQgLyB0b3RhbCkgKiAxMDApKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihjaHVua3MgYXMgQmxvYlBhcnRbXSwgeyB0eXBlOiAndmlkZW8vd2VibScgfSk7XG4gICAgICB0aGlzLnNhdmVCbG9iQXNEb3dubG9hZChibG9iLCBmaWxlbmFtZSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gQ09SUyBibG9jayBvciBuZXR3b3JrIGZhaWx1cmUg4oCUIGZhbGwgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgKG1heSBvcGVuIGluIGEgbmV3IHRhYlxuICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBzZXJ2ZXIncyBDb250ZW50LURpc3Bvc2l0aW9uLCBidXQgYXQgbGVhc3QgYWx3YXlzIHRyaWdnZXJzIHRoZSBicm93c2VyJ3Mgc2F2ZSBmbG93KS5cbiAgICAgIHRoaXMudHJpZ2dlckRpcmVjdERvd25sb2FkKHVybCwgZmlsZW5hbWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRvd25sb2FkaW5nSW5kZXhlcy5kZWxldGUoaW5kZXgpO1xuICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlcml2ZUNsaXBGaWxlbmFtZSh1cmw6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybCk7XG4gICAgICBjb25zdCBsYXN0ID0gKHUucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKSB8fCAnJykuc3BsaXQoJz8nKVswXTtcbiAgICAgIGlmIChsYXN0ICYmIC9cXC5bYS16MC05XSskL2kudGVzdChsYXN0KSkgcmV0dXJuIGBjbGlwLSR7aW5kZXggKyAxfS0ke2xhc3R9YDtcbiAgICB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgcmV0dXJuIGBjbGlwLSR7aW5kZXggKyAxfS53ZWJtYDtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2I6IEJsb2IsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xuICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgYS5yZWwgPSAnbm9vcGVuZXInO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpLCAyMDAwKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2lyY3VtZmVyZW5jZSBvZiB0aGUgNi1yYWRpdXMgcHJvZ3Jlc3MgcmluZyAoc2VlIGNsaXAtZG93bmxvYWQtYnRuX19yaW5nIGluIHRlbXBsYXRlKS4gKi9cbiAgcmVhZG9ubHkgZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZTogbnVtYmVyID0gMiAqIE1hdGguUEkgKiA2O1xuXG4gIC8qKiBzdHJva2UtZGFzaG9mZnNldCBmb3IgdGhlIHByb2dyZXNzIHJpbmcgb2YgY2xpcCBgaW5kZXhgOyAwID0gZnVsbCwgY2lyY3VtZmVyZW5jZSA9IGVtcHR5LiAqL1xuICBkb3dubG9hZFJpbmdEYXNob2Zmc2V0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgdGhpcy5kb3dubG9hZFByb2dyZXNzLmdldChpbmRleCkgfHwgMCkpO1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkUmluZ0NpcmN1bWZlcmVuY2UgKiAoMSAtIHBjdCAvIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJEaXJlY3REb3dubG9hZCh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICBhLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgfVxuXG4gIG9uU2hvd0Z1bGxWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1ZpZGVvTGlicmFyeSkgcmV0dXJuO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgfHwgdGhpcy52aWRlb1VybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSB0cnVlO1xuICAgIHRoaXMuaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPSB0cnVlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzID0gMDtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKDApO1xuICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgb25FeGl0RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSG9yaXpvbnRhbGx5IHNjcm9sbHMgdGhlIGAuY2xpcHMtcm93YCBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBjYXJkIGlzXG4gICAqIGluIHRoZSB2aXNpYmxlIHN0cmlwLiBOby1vcCBpZiB0aGUgY2FyZCBpcyBhbHJlYWR5IG9uIHNjcmVlbi4gQ2FsbGVyIGd1YXJkc1xuICAgKiBvbiBgaXNQbGF5aW5nYCBzbyB0aGUgdXNlciBjYW4gZnJlZWx5IHNjcm9sbCB0aGUgcm93IHdoaWxlIHBhdXNlZC4gKi9cbiAgcHJpdmF0ZSBzY3JvbGxDdXJyZW50Q2xpcEludG9WaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IHNjcm9sbGVyID0gdGhpcy5jbGlwc1Njcm9sbGVyUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghc2Nyb2xsZXIpIHJldHVybjtcbiAgICBjb25zdCBjYXJkcyA9IHNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuY2xpcC1jYXJkJyk7XG4gICAgY29uc3QgY2FyZCA9IGNhcmRzW3RoaXMuY3VycmVudFZpZGVvSW5kZXhdO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFkZGluZyA9IDg7XG4gICAgY29uc3QgY2FyZExlZnQgPSBjYXJkLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2FyZFJpZ2h0ID0gY2FyZExlZnQgKyBjYXJkLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IHZpZXdMZWZ0ID0gc2Nyb2xsZXIuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCB2aWV3UmlnaHQgPSB2aWV3TGVmdCArIHNjcm9sbGVyLmNsaWVudFdpZHRoO1xuXG4gICAgaWYgKGNhcmRMZWZ0IDwgdmlld0xlZnQgKyBwYWRkaW5nKSB7XG4gICAgICBzY3JvbGxlci5zY3JvbGxUbyh7IGxlZnQ6IE1hdGgubWF4KDAsIGNhcmRMZWZ0IC0gcGFkZGluZyksIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2UgaWYgKGNhcmRSaWdodCA+IHZpZXdSaWdodCAtIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogY2FyZFJpZ2h0IC0gc2Nyb2xsZXIuY2xpZW50V2lkdGggKyBwYWRkaW5nLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlVmlkZW9MaWJyYXJ5Q29sbGFwc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPSAhdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1oLVsyMXB4XSc7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRTBGMkZFXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM3REQzRkNdYDtcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVGM0M3XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0QzNERdYDtcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRTJFMl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNBNUE1XWA7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXWA7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0QxRkFFNV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjNkVFN0I3XWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTIwMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDBgO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRDbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwMjg0QzddIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEOTc3MDZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDU5NjY5XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNjAwIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZFRyYWNlVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybC5lbmRzV2l0aCgnLnppcCcpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgdHJhY2U6IHRoaXMudHJhY2VWaWV3VXJsLFxuICAgICAgICBoaWRlSGVhZGVyOiAndHJ1ZScsXG4gICAgICAgIGhpZGVCcmFuZGluZzogJ3RydWUnLFxuICAgICAgICBlbWJlZDogJ3RydWUnLFxuICAgICAgICBtaW5pbWFsOiAndHJ1ZScsXG4gICAgICAgIG5vSGVhZGVyOiAndHJ1ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYGh0dHBzOi8vdHJhY2UucGxheXdyaWdodC5kZXYvPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhY2VWaWV3VXJsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTYWZlVHJhY2VVcmwoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5wcm9jZXNzZWRUcmFjZVVybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB9XG4gIH1cblxuICBvblRyYWNlVmlld2VyTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgb25UcmFjZVZpZXdlckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU3BlZWRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNwZWVkID0gdmFsdWU7XG4gICAgLy8gV2hlbmV2ZXIgc3BlZWQgY2hhbmdlcywgYXBwbHkgaXQgdG8gdGhlIGN1cnJlbnQgdmlkZW9cbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVTcGVlZENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSAhdGhpcy5pc1NwZWVkQ29udHJvbE9wZW47XG4gICAgaWYgKHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuKSB7XG4gICAgICB0aGlzLmFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50ICYmIFxuICAgICAgICAgICAgIXRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWdtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIF07XG4gICAgXG4gICAgLy8gT25seSBhZGQgVmlkZW8gdGFiIGlmIGhpZGVWaWRlb1RhYiBpcyBmYWxzZVxuICAgIGlmICghdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy50cmFjZVZpZXdVcmwpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdUcmFjZScsIHZhbHVlOiAndHJhY2UnLCBpY29uOiAnZ3JhcGhpY19lcScgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VnbWVudHMgPSBiYXNlU2VnbWVudHM7XG4gICAgXG4gICAgLy8gSWYgY3VycmVudCB2aWV3IGlzICd2aWRlbycgYW5kIHZpZGVvIHRhYiBpcyBoaWRkZW4sIHN3aXRjaCB0byBzY3JlZW5zaG90c1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAndmlkZW8nICYmIHRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ3NjcmVlbnNob3RzJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uVmlkZW9FbGVtZW50UmVhZHkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLl92cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiB2aWRlbyBlbGVtZW50IHJlYWR5Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZXJyb3IvbG9hZGluZyBzdGF0ZXMgd2hlbiB2aWRlbyBlbGVtZW50IGlzIHJlY3JlYXRlZCAoZS5nLiwgZHVyaW5nIGZ1bGxzY3JlZW4gdG9nZ2xlKVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHJlc2V0dGluZyBlcnJvci9sb2FkaW5nIHN0YXRlJyk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXItaW5pdGlhdGVkIG5hdmlnYXRpb24g4oCUIHJlc2V0IHRoZSBhdXRvLXJlY292ZXJ5IHJldHJ5IGJ1ZGdldC5cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVXNlci1pbml0aWF0ZWQgc2VlayDigJQgcmVzZXQgdGhlIGF1dG8tcmVjb3ZlcnkgcmV0cnkgYnVkZ2V0LlxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IDA7XG5cbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0NhcHR1cmVWaWRlbyAmJiBpc0xpdmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImlzQ2FwdHVyaW5nVmlkZW9cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhcHR1cmluZ1ZpZGVvXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVZpZGVvKClcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NhcHR1cmluZ1ZpZGVvXCIgY2xhc3M9XCJjYXB0dXJlLXZpZGVvLWJ0bl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDYXB0dXJpbmdWaWRlb1wiIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5fX3NwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgaXNDYXB0dXJpbmdWaWRlbyA/ICdDYXB0dXJpbmfigKYnIDogJ0NhcHR1cmUgVmlkZW8nIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2wgXG4gICAgICAgICAgICBbc2VnbWVudHNdPVwic2VnbWVudHNcIiBcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50Vmlld1wiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWdtZW50Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwYW5kXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1IDEuMjVIOC43NVYzLjc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzQ5OTIgMS4yNUw1LjgzMzI1IDQuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSA4Ljc0OTY3TDQuMTY2NjcgNS44MzMwMVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc1IDguNzVIMS4yNVY2LjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4aXQgZnVsbCBzY3JlZW5cIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNzUgNi4yNUg2LjI1VjguNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNTAwOCA2LjI1TDkuMTY2NzUgOS4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjgzMzI1MiAwLjgzMzAwOEwzLjc0OTkyIDMuNzQ5NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4yNSAzLjc1SDMuNzVWMS4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLVsjRjNGNEY2XSBjcWEtaC1bY2FsYygxMDAlLTQxcHgpXVwiPlxuICAgIDwhLS0gRmFzdC1mb3J3YXJkIG92ZXJsYXk6IGNvdmVycyBjb250ZW50IGFyZWEgYnV0IG5vdCBoZWFkZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzRmFzdEZvcndhcmRpbmcgJiYgZmFzdEZvcndhcmRDb25maWdcIlxuICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNlwiXG4gICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNGM0Y0RjY7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLXhsIGNxYS13LWZ1bGxcIlxuICAgICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogNTAwcHg7IHBhZGRpbmc6IDMycHg7IGJveC1zaGFkb3c6IDBweCAyNXB4IDUwcHggLTEycHggIzAwMDAwMDQwOyBib3JkZXI6IDFweCBzb2xpZCAjRTVFNUU1XCI+XG4gICAgICAgIDwhLS0gU3BhcmtsZSBhdmF0YXIgd2l0aCByb3RhdGluZyBhcmMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1iLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlXCIgc3R5bGU9XCJ3aWR0aDogNTZweDsgaGVpZ2h0OiA1NnB4O1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDYzLDY3LDIzOCwwLjEyKTtcIj5cbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI2XCIgdmlld0JveD1cIjAgMCAyNCAyNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi4wMjUxIDBDMTIuMTczIDAuMDYzNDEyMSAxMi4yMzYyIDAuMjE4MjY0IDEyLjI5NjggMC4zNjIxMUMxMi4zMjcyIDAuNDQ1OTIzIDEyLjM1NSAwLjUzMDE5MiAxMi4zODIxIDAuNjE1MTMzQzEyLjM5MjcgMC42NDc2ODIgMTIuNDAzMyAwLjY4MDIzMSAxMi40MTQyIDAuNzEzNzY2QzEyLjU1NDggMS4xNTE3NyAxMi42ODAxIDEuNTk0NDcgMTIuODA2MSAyLjAzNjg2QzEyLjgzNDYgMi4xMzY3MyAxMi44NjMyIDIuMjM2NTYgMTIuODkxOCAyLjMzNjM4QzEzLjAzNzUgMi44NDQ2NCAxMy4xODIxIDMuMzUzMjEgMTMuMzI1OCAzLjg2MjAxQzEzLjM0NiAzLjkzMzQ3IDEzLjM2NjIgNC4wMDQ5MiAxMy4zODY0IDQuMDc2MzhDMTMuNDQzNCA0LjI3NzgzIDEzLjUwMDMgNC40NzkzIDEzLjU1NjkgNC42ODA4N0MxMy42NzY0IDUuMTA2NzggMTMuNzk5MyA1LjUzMTQ1IDEzLjkzMDEgNS45NTQwNUMxMy45NDE1IDUuOTkxMDIgMTMuOTUyOSA2LjAyNzk5IDEzLjk2NDcgNi4wNjYwOEMxNC4zMDQ1IDcuMTUzMTggMTQuNzg2MiA4LjEyNzUxIDE1LjU3NTcgOC45NTc0M0MxNS41OTUzIDguOTc5IDE1LjYxNDggOS4wMDA1OCAxNS42MzUgOS4wMjI4MkMxNS45NzIgOS4zODI0NiAxNi40MDQ1IDkuNjcwNjMgMTYuODM2OCA5LjkwMzIyQzE2Ljg1ODggOS45MTUyNiAxNi44ODA4IDkuOTI3MjkgMTYuOTAzNSA5LjkzOTdDMTguMTc1NyAxMC42MjMxIDE5LjcwNTMgMTAuOTIzNyAyMS4wODMyIDExLjMyMzhDMjEuNjg2OSAxMS40OTkyIDIyLjI4ODggMTEuNjgwMiAyMi44ODg1IDExLjg2OTFDMjIuOTMwNiAxMS44ODIzIDIyLjk3MjcgMTEuODk1NiAyMy4wMTQ5IDExLjkwODhDMjMuMTQwOSAxMS45NDgzIDIzLjI2NjcgMTEuOTg4NSAyMy4zOTIzIDEyLjAyOTNDMjMuNDIxNiAxMi4wMzg1IDIzLjQ1MDkgMTIuMDQ3OCAyMy40ODEgMTIuMDU3M0MyMy42NTQxIDEyLjExNDYgMjMuODE5NyAxMi4xODIxIDIzLjk2MTggMTIuMjk5MkMyNC4wMDUxIDEyLjM5MzggMjQuMDA1MSAxMi4zOTM4IDIzLjk5MzMgMTIuNDg4NEMyMy44NTUgMTIuNjI1OCAyMy43MTc5IDEyLjY5MDIgMjMuNTM1NCAxMi43NTNDMjMuNTA5MyAxMi43NjIzIDIzLjQ4MzIgMTIuNzcxNiAyMy40NTY0IDEyLjc4MTFDMjMuMTQ4MyAxMi44ODkyIDIyLjgzNiAxMi45ODM4IDIyLjUyMzQgMTMuMDc3NUMyMi40NTkyIDEzLjA5NjkgMjIuMzk1IDEzLjExNjMgMjIuMzMwOSAxMy4xMzU3QzIxLjkzNTIgMTMuMjU1MSAyMS41Mzg5IDEzLjM3MTkgMjEuMTQyMSAxMy40ODc0QzIwLjYxOTUgMTMuNjM5NSAyMC4wOTc3IDEzLjc5NDIgMTkuNTc2MyAxMy45NTA2QzE5LjQ5MDkgMTMuOTc2MyAxOS40MDU1IDE0LjAwMTggMTkuMzIgMTQuMDI3MkMxOC44NzEyIDE0LjE2MSAxOC40MjQ2IDE0LjI5OTUgMTcuOTgxNyAxNC40NTE2QzE3Ljk0NSAxNC40NjQyIDE3LjkwODIgMTQuNDc2OCAxNy44NzA0IDE0LjQ4OTdDMTYuMzg3IDE1LjAwNTkgMTUuMjU2MyAxNS45Njg3IDE0LjU0ODYgMTcuMzc2OEMxNC4xNjcgMTguMTY4MSAxMy45NDE5IDE5LjAyMzkgMTMuNzEyNCAxOS44Njg1QzEzLjY1MDMgMjAuMDk2NCAxMy41ODQyIDIwLjMyMyAxMy41MTc1IDIwLjU0OTZDMTMuNDY1MSAyMC43Mjc4IDEzLjQxMzkgMjAuOTA2NCAxMy4zNjQgMjEuMDg1M0MxMy4zNTggMjEuMTA2NiAxMy4zNTIxIDIxLjEyNzkgMTMuMzQ2IDIxLjE0OTlDMTMuMzE3MiAyMS4yNTMgMTMuMjg4NSAyMS4zNTYyIDEzLjI2IDIxLjQ1OTRDMTMuMTg3MiAyMS43MjExIDEzLjEwODcgMjEuOTgwNyAxMy4wMjgxIDIyLjI0MDFDMTIuODg1MSAyMi43MDEyIDEyLjc1NDkgMjMuMTY1NiAxMi42MjU2IDIzLjYzMDZDMTIuNDMwNSAyNC4zMzA4IDEyLjQzMDUgMjQuMzMwOCAxMi4zMTk5IDI0LjY2NzRDMTIuMzEyNiAyNC42OSAxMi4zMDUyIDI0LjcxMjYgMTIuMjk3NyAyNC43MzU5QzEyLjI1NzMgMjQuODU1NyAxMi4yMTU4IDI0Ljk2NiAxMi4xMzk0IDI1LjA2NzRDMTIuMDIzMSAyNS4wOTMgMTIuMDIzMSAyNS4wOTMgMTEuOTE4NyAyNS4wOTg5QzExLjc5OTMgMjQuOTI0OSAxMS43MjAyIDI0Ljc1NjIgMTEuNjU2OSAyNC41NTUzQzExLjY0NzYgMjQuNTI2OSAxMS42Mzg0IDI0LjQ5ODQgMTEuNjI4OSAyNC40NjkxQzExLjUxMTYgMjQuMTAxOSAxMS40MDY3IDIzLjczMDkgMTEuMzAxOCAyMy4zNkMxMS4yNzc4IDIzLjI3NTIgMTEuMjUzNiAyMy4xOTA0IDExLjIyOTUgMjMuMTA1NkMxMS4wNDk2IDIyLjQ3MzcgMTAuODcyNyAyMS44NDA5IDEwLjY5NiAyMS4yMDgxQzkuOTYwMTkgMTguMDc3NSA5Ljk2MDE5IDE4LjA3NzUgOC4xMDQgMTUuNTQ2NEM4LjA3NDI1IDE1LjUyMjIgOC4wNDQ1IDE1LjQ5NzkgOC4wMTM4NSAxNS40NzI5QzYuNzk3NjcgMTQuNDk4OSA1LjE5NTU2IDE0LjEzODIgMy43Mjg0IDEzLjcxNTVDMy4zNjU1MyAxMy42MTA5IDMuMDAyOCAxMy41MDU4IDIuNjQwMDkgMTMuNDAwN0MyLjYwODM3IDEzLjM5MTUgMi42MDgzNyAxMy4zOTE1IDIuNTc2MDEgMTMuMzgyMUMyLjA1MjgzIDEzLjIzMDQgMS41Mjk4IDEzLjA3ODMgMS4wMDg2IDEyLjkxOTlDMC45ODY1NDkgMTIuOTEzMiAwLjk2NDUgMTIuOTA2NiAwLjk0MTc4MyAxMi44OTk3QzAuMTQxMDY0IDEyLjY1NzggMC4xNDEwNjQgMTIuNjU3OCAwLjAwMTcyNDEgMTIuNDg4NEMtMC4wMDIyMTY3IDEyLjQxMTUgLTAuMDAyMjE2NyAxMi40MTE1IDAuMDMzMjUwNSAxMi4zMzA3QzAuMTc4ODg5IDEyLjE4OCAwLjMyMDIwNSAxMi4xMjY5IDAuNTEyNDI2IDEyLjA2NDdDMC41NDAyNTkgMTIuMDU1NCAwLjU2ODA5IDEyLjA0NiAwLjU5Njc2NiAxMi4wMzY0QzAuNjgyMDA4IDEyLjAwNzkgMC43Njc0MzYgMTEuOTgwMSAwLjg1MjkzNiAxMS45NTI0QzAuODc3MzM1IDExLjk0NDQgMC45MDE3MzUgMTEuOTM2NCAwLjkyNjg3NCAxMS45MjgyQzEuMDk5NDMgMTEuODcxNiAxLjI3MjYgMTEuODE3MSAxLjQ0NjAzIDExLjc2MzNDMS40ODg2NCAxMS43NSAxLjQ4ODY0IDExLjc1IDEuNTMyMTIgMTEuNzM2NEMyLjI3MjcyIDExLjUwNjEgMy4wMTgxNSAxMS4yOTE3IDMuNzYzMzYgMTEuMDc2OUM0LjMxODY2IDEwLjkxNjggNC44NzMwMiAxMC43NTQgNS40MjU2MSAxMC41ODQ3QzUuNDUxIDEwLjU3NyA1LjQ3NjQgMTAuNTY5MiA1LjUwMjU2IDEwLjU2MTNDNi43ODI2NyAxMC4xNzA1IDguMDM0MDkgOS42MTYxMiA4Ljg2MDYzIDguNTE2MDZDOC44NzMgOC40OTk3NCA4Ljg4NTM4IDguNDgzNDIgOC44OTgxMyA4LjQ2NjYxQzkuODE4NiA3LjI0NTY0IDEwLjE3NzUgNS43NjA4MiAxMC41Nzg1IDQuMzEyMDFDMTAuNzEwNSAzLjgzNTUyIDEwLjg0NCAzLjM1OTQ3IDEwLjk3NzkgMi44ODM1NkMxMS4wMTUgMi43NTE3NyAxMS4wNTIxIDIuNjE5OTcgMTEuMDg5IDIuNDg4MTJDMTEuMjM3MiAxLjk1ODUyIDExLjM4NzYgMS40Mjk2NCAxMS41NDY3IDAuOTAzMTgxQzExLjU2MTYgMC44NTM4ODIgMTEuNTc2NCAwLjgwNDU2MSAxMS41OTExIDAuNzU1MjE4QzExLjgxMzggMC4wMTExMjA1IDExLjgxMzggMC4wMTExMjA1IDEyLjAyNTEgMFpcIiBmaWxsPVwiIzNGNDNFRVwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5LjI5NjIgMS41NDg5OUMxOS40NDEgMS43MTI4IDE5LjQ2OTkgMS45MDUzMiAxOS41MTUgMi4xMTQ0OUMxOS42NjUzIDIuNzcxNjEgMTkuODM4NCAzLjM3NTg0IDIwLjQzOTQgMy43NTc1NkMyMC44MTAyIDMuOTYyNjMgMjEuMjUyMiA0LjA1NTk1IDIxLjY2MyA0LjE0NDA5QzIxLjgzNjQgNC4xODIwNSAyMS45ODI5IDQuMjMyNDIgMjIuMTMxNiA0LjMzMzE2QzIyLjE2NTEgNC4zODYzNiAyMi4xNjUxIDQuMzg2MzYgMjIuMTYzMiA0LjQ3ODk3QzIyLjEyODcgNC41OTE1OSAyMi4wOTg0IDQuNjI3OTEgMjIuMDA3NSA0LjcwMTYzQzIxLjkwODEgNC43MzQ4OCAyMS45MDgxIDQuNzM0ODggMjEuNzg4OCA0Ljc2MDc0QzIxLjc0MzcgNC43NzExIDIxLjY5ODUgNC43ODE1OCAyMS42NTM1IDQuNzkyMTRDMjEuNjI5MyA0Ljc5Nzc0IDIxLjYwNTEgNC44MDMzNSAyMS41ODAzIDQuODA5MTJDMjAuODQ1NiA0Ljk3OTA3IDIwLjg0NTYgNC45NzkwNyAyMC4yMTA1IDUuMzYzNjhDMjAuMTg5OSA1LjM4MDMgMjAuMTY5MiA1LjM5NjkyIDIwLjE0NzkgNS40MTQwNUMxOS42OTQxIDUuODE0MjYgMTkuNTk4MSA2LjQ4IDE5LjQ2MTUgNy4wMzc3QzE5LjQ1MzYgNy4wNjgzMyAxOS40NDU4IDcuMDk4OTYgMTkuNDM3NyA3LjEzMDUxQzE5LjQzMSA3LjE1NzYyIDE5LjQyNDIgNy4xODQ3NCAxOS40MTcyIDcuMjEyNjdDMTkuMzg3NyA3LjI5NTQ2IDE5LjM1NzIgNy4zNDk0NSAxOS4yOTYyIDcuNDEyODlDMTkuMTI2NiA3LjQzNDQ0IDE5LjEyNjYgNy40MzQ0NCAxOS4wNDQgNy40MTI4OUMxOC45MTI4IDcuMzExMTQgMTguODgzNCA3LjE5NTI0IDE4Ljg0OTEgNy4wMzk1QzE4Ljg0MzMgNy4wMTUzOSAxOC44Mzc2IDYuOTkxMjcgMTguODMxNyA2Ljk2NjQyQzE4LjgxMzQgNi44ODk0IDE4Ljc5NTYgNi44MTIyNiAxOC43NzggNi43MzUwOEMxOC42Mzk4IDYuMTM0MDMgMTguNDgzNyA1LjU0NDMyIDE3LjkzMjQgNS4xOTIwMUMxNy41MDE1IDQuOTUxNzIgMTYuOTc3NiA0LjgzODA4IDE2LjQ5NiA0Ljc0NjMxQzE2LjM2NCA0LjcxODgzIDE2LjI4ODQgNC42ODQyNyAxNi4yMDY3IDQuNTc1NTJDMTYuMTg4OSA0LjQ2NTE4IDE2LjE4ODkgNC40NjUxOCAxNi4yMDY3IDQuMzU0ODRDMTYuMzMyMiA0LjIyNDg0IDE2LjQ2NDQgNC4xOTMxMSAxNi42MzQyIDQuMTUzODZDMTYuNjg3NyA0LjE0MDYxIDE2Ljc0MTIgNC4xMjcyNiAxNi43OTQ3IDQuMTEzODNDMTYuODIyMyA0LjEwNjk0IDE2Ljg1IDQuMTAwMDQgMTYuODc4NCA0LjA5Mjk0QzE3LjAxOTMgNC4wNTY2OCAxNy4xNTg4IDQuMDE2MDIgMTcuMjk4MyAzLjk3NDU1QzE3LjMyMzYgMy45NjcyIDE3LjM0ODkgMy45NTk4NSAxNy4zNzUxIDMuOTUyMjdDMTcuNjU4NSAzLjg2NzUyIDE3LjkwMzIgMy43NTkxMSAxOC4xMjk4IDMuNTY2NjhDMTguMTUwOSAzLjU0OTI4IDE4LjE3MiAzLjUzMTg5IDE4LjE5MzggMy41MTM5N0MxOC41NDY1IDMuMTk2NTggMTguNjY2MyAyLjcxOTc2IDE4Ljc3NTEgMi4yNzQ4NEMxOC43ODM0IDIuMjQxMDYgMTguNzkxNiAyLjIwNzI4IDE4LjgwMDIgMi4xNzI0OEMxOC44MTY3IDIuMTA0NjMgMTguODMyOSAyLjAzNjcgMTguODQ4OCAxLjk2ODdDMTguODYwMiAxLjkyMTM5IDE4Ljg2MDIgMS45MjEzOSAxOC44NzE3IDEuODczMTJDMTguODc4NCAxLjg0NDg2IDE4Ljg4NSAxLjgxNjU5IDE4Ljg5MTggMS43ODc0N0MxOC45MjA5IDEuNjk3NDkgMTguOTU5IDEuNjI2ODMgMTkuMDEyNSAxLjU0ODk5QzE5LjExNTMgMS40OTc2MSAxOS4xODc0IDEuNTIwODQgMTkuMjk2MiAxLjU0ODk5WlwiIGZpbGw9XCIjMEYxMkE4XCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC43ODgxIDE3LjQyMTlDNC44MjU2MSAxNy40MjIyIDQuODI1NjEgMTcuNDIyMiA0Ljg2Mzg3IDE3LjQyMjVDNS4xMzI5NiAxNy40MzA3IDUuMzE1MDMgMTcuNTE2OSA1LjUxMzIxIDE3LjY5NzhDNS43NDM4MSAxNy45NDY5IDUuODUwMjkgMTguMjI3OSA1Ljg0NDIzIDE4LjU2MzdDNS44MTgzMyAxOC44MzU5IDUuNjU3NzkgMTkuMDczNiA1LjQ2MDg3IDE5LjI1NzZDNS4yMjkwOCAxOS40NDQ3IDQuOTk1MjUgMTkuNTA2NSA0LjY5OTA2IDE5LjQ5NzlDNC40NDkzMyAxOS40Njg4IDQuMjE0MzggMTkuMzUwMiA0LjAzNzM4IDE5LjE3MTdDMy44MTcyNiAxOC44NzEzIDMuNzUyOTEgMTguNTk1OCAzLjc4NTE3IDE4LjIyNTlDMy44NTE4IDE3LjkzNDYgNC4wNDM5IDE3LjY5ODEgNC4yODk1OSAxNy41MzIzQzQuNDYwMjcgMTcuNDQ1OCA0LjU5NzU1IDE3LjQyMDMgNC43ODgxIDE3LjQyMTlaXCIgZmlsbD1cIiMxMjE2Q0NcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGVcIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7XCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIzMFwiIGN5PVwiMzBcIiByPVwiMjhcIiBzdHJva2U9XCIjRTJFMkUzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mZi1zcGluXCJcbiAgICAgICAgICAgICAgICAgd2lkdGg9XCI2MFwiIGhlaWdodD1cIjYwXCIgdmlld0JveD1cIjAgMCA2MCA2MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwidG9wOiAtMnB4OyBsZWZ0OiAtMnB4OyB0cmFuc2Zvcm0tb3JpZ2luOiAzMHB4IDMwcHg7XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzAgMiBBIDI4IDI4IDAgMCAxIDU0LjI0IDQ0XCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzNmNDNlZVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLW0tMCBjcWEtbWItMlwiXG4gICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzE2MTYxNztcIj5cbiAgICAgICAgICBGYXN0LWZvcndhcmRpbmcgdG8geW91ciBzdGVwXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEycHg7IGNvbG9yOiAjNkQ2RDc0O1wiPlxuICAgICAgICAgIFN0ZXBzIHt7IGZhc3RGb3J3YXJkQ29uZmlnLmZyb21TdGVwIH194oCTe3sgZmFzdEZvcndhcmRDb25maWcudG9TdGVwIH19IGFyZSBydW5uaW5nIGF0IGZ1bGwgc3BlZWQgaW4gdGhlIGJhY2tncm91bmQuXG4gICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0OyBmb250LXdlaWdodDogNjAwO1wiPkxpdmUgdmlldyBhbmQgc2NyZWVuc2hvdHMgYXJlIHBhdXNlZDwvc3Ryb25nPlxuICAgICAgICAgIHVudGlsIGV4ZWN1dGlvbiByZWFjaGVzIHlvdXIgdGFyZ2V0IHN0ZXAg4oCUIHRoZW4geW91J3JlIGluIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW10LTYgY3FhLW1iLTVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1tYi0yXCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM0QzRDNTE7XCI+U3RlcHMgZXhlY3V0aW5nIGluIGJhY2tncm91bmQ8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgICAgIHt7IGZhc3RGb3J3YXJkQ29uZmlnLmN1cnJlbnRTdGVwIH19IG9mIHt7IGZhc3RGb3J3YXJkQ29uZmlnLnRvdGFsU3RlcHMgfX0gc3RlcHNcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiA2cHg7IGJhY2tncm91bmQtY29sb3I6ICNFMkUyRTM7IGJvcmRlci1yYWRpdXM6IDk5OTlweDsgb3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLiVdPVwiZmFzdEZvcndhcmRQcm9ncmVzc1BlcmNlbnRcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogMTAwJTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjM0Y0M0VFIDAlLCAjODE4Q0Y4IDEwMCUpOyB0cmFuc2l0aW9uOiB3aWR0aCAzMDBtcyBjdWJpYy1iZXppZXIoMC40LDAsMC4yLDEpO1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIlxuICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMTBweCAxNHB4OyBib3JkZXItcmFkaXVzOiAxMHB4OyBiYWNrZ3JvdW5kOiAjNjM2NkYxMUE7IGJvcmRlcjogMXB4IHNvbGlkICM2MzY2RjEzMztcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCI2LjVcIiBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjNcIiBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjFcIiBmaWxsPVwiIzNmNDNlZVwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzZENkQ3NDtcIj5KdW1waW5nIHRvPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzNGNDNFRTsgZm9udC13ZWlnaHQ6IDQwMDsgZGlzcGxheTogYmxvY2s7XCI+XG4gICAgICAgICAgICAgIFN0ZXAge3sgZmFzdEZvcndhcmRDb25maWcudGFyZ2V0U3RlcE51bWJlciB9fSDigJQge3sgZmFzdEZvcndhcmRDb25maWcudGFyZ2V0U3RlcExhYmVsIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPCEtLSBMaXZlIENvbnRlbnQgVmlldyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1vdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICdjcWEtdy1hdXRvJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAnY3FhLXctZnVsbCBjcWEtZmxleC1jb2wnOiAhaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLFxuICAgICAgICAgICAgICAgJ2NxYS1tYXgtaC1mdWxsIGNxYS1oLWZ1bGwnOiBoYXNEZXZpY2VGcmFtZSAmJiAoZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSksXG4gICAgICAgICAgICAgICAnY3FhLW1pbi13LW1heCc6IGhhc0RldmljZUZyYW1lICYmIGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSdcbiAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICBbbmdTdHlsZV09XCJsaXZlQ29udGVudENvbnRhaW5lclN0eWxlXCI+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImhhc0RldmljZUZyYW1lXCJcbiAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAnY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCc6IGhhc0RldmljZUZyYW1lLFxuICAgICAgICAgICAgICAgICAnY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmUnOiAhaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtei0yMCc6IGhhc0RldmljZUZyYW1lICYmIGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLFxuICAgICAgICAgICAgICAgICAnY3FhLWJnLXdoaXRlJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcidcbiAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGFzRGV2aWNlRnJhbWUgPyBkZXZpY2VTY3JlZW5TdHlsZSA6IHt9XCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi00XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+e3sgbGl2ZUxvYWRpbmdMYWJlbCB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQ29udGVudFZpZGVvTG9hZGluZ1wiIGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxpdmVTdGF0dXMgPT09ICdGYWlsZWQnICYmIGZhaWxlZFN0YXR1c01lc3NhZ2VcIiBjbGFzcz1cImNxYS1wLTYgY3FhLXRleHQtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY29sb3I6ICNDNjM1MzU7IGZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLW0tMFwiPnt7IGZhaWxlZFN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImxpdmVTdGF0dXMgIT09ICdGYWlsZWQnIHx8ICFmYWlsZWRTdGF0dXNNZXNzYWdlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5vcm1hbCBWaWRlbyBWaWV3ICh3aGVuIG5vdCBsaXZlKSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3ZpZGVvJ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sXCJcbiAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgIGFyaWEtbGFiZWw9XCJWaWRlbyBwbGF5YmFja1wiXG4gICAgICAgICAoa2V5ZG93bik9XCJvblZpZGVvS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJywgJ2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWUsICdjcWEtbWF4LWgtW2NhbGMoMTAwJS0xMDhweCldJzogc2hvd1ZpZGVvTGlicmFyeSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTYwcHgpXSc6ICFzaG93VmlkZW9MaWJyYXJ5fVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7IGVsc2UgdmlkZW9Ob0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtbWF4LWgtZnVsbCBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb3ZlciBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblZpZGVvRnJhbWVDbGljaygpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgICAgICAoY2FucGxheSk9XCJvblZpZGVvQ2FuUGxheSgpXCJcbiAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25WaWRlb0Vycm9yKClcIlxuICAgICAgICAgICAgICAgID48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dQbGF5UGF1c2VPdmVybGF5XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMzAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie2FuaW1hdGlvbjogJ2NxYUZhZGVPdXQgNTAwbXMgZWFzZS1vdXQgZm9yd2FyZHMnfVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNTZweDsgaGVpZ2h0OiA1NnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdmlkZW9Ob0ZyYW1lPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTQgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJvblZpZGVvRnJhbWVDbGljaygpXCI+XG4gICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmlkZW9SZWZyZXNoaW5nXCJcbiAgICAgICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgW3NyY109XCJjdXJyZW50VmlkZW9VcmxcIlxuICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAoZW5kZWQpPVwib25WaWRlb0VuZGVkKClcIlxuICAgICAgICAgICAgICAoZXJyb3IpPVwib25WaWRlb0Vycm9yKClcIlxuICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICA8IS0tIFBsYXkvUGF1c2Ugb3ZlcmxheSBpY29uIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dQbGF5UGF1c2VPdmVybGF5XCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNTZweDsgaGVpZ2h0OiA1NnB4O1wiPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwzIDE5LDEyIDUsMjFcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI1XCIgeT1cIjNcIiB3aWR0aD1cIjRcIiBoZWlnaHQ9XCIxOFwiIC8+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhY3VycmVudFZpZGVvVXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkICYmIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOyBlbHNlIG5vVmlkZW9EZWZhdWx0XCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAge3sgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2UgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vVmlkZW9EZWZhdWx0PlxuICAgICAgICAgIDxzcGFuPk5vIHZpZGVvIHJlY29yZGluZyBmb3VuZDwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPCEtLSBWaWRlbyBMaWJyYXJ5IFBhbmVsIOKAlCByZXNlcnZlcyBvbmx5IGhlYWRlci1oZWlnaHQgaW4gZmxvdzsgdGhlIGlubmVyIHBhbmVsIGlzIGFic29sdXRlbHkgYW5jaG9yZWQgdG8gaXRzIGJvdHRvbSBlZGdlLCBzbyB0aGUgYm9keSBleHBhbmRpbmcgbWFrZXMgdGhlIHBhbmVsIGdyb3cgVVBXQVJEIG92ZXIgdGhlIHZpZGVvLiBUaW1lbGluZSBzdGF5cyBwdXQuIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNob3dWaWRlb0xpYnJhcnkgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgY2xhc3M9XCJ2aWRlby1saWJyYXJ5XCJcbiAgICAgICAgICAgW2NsYXNzLnZpZGVvLWxpYnJhcnktLW9wZW5dPVwiIWlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkXCJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lfVwiPlxuICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19pbm5lclwiPlxuICAgICAgICA8IS0tIEhlYWRlciDigJQgYWx3YXlzIHZpc2libGUsIGNsaWNraW5nIHRoZSBjaGV2cm9uIHRvZ2dsZXMgdGhlIGJvZHkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGUtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2ljb25cIj5cbiAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjMzMzk4IDcuNTgzMDhMMTIuMzgwNyA5LjYxNDI1QzEyLjQyNDcgOS42NDM0OCAxMi40NzU3IDkuNjYwMjQgMTIuNTI4NCA5LjY2Mjc2QzEyLjU4MTEgOS42NjUyOCAxMi42MzM1IDkuNjUzNDcgMTIuNjggOS42Mjg1NkMxMi43MjY1IDkuNjAzNjYgMTIuNzY1NCA5LjU2NjYxIDEyLjc5MjUgOS41MjEzNkMxMi44MTk2IDkuNDc2MSAxMi44MzQgOS40MjQzNCAxMi44MzQgOS4zNzE1OFY0LjU5MDU4QzEyLjgzNCA0LjUzOTI2IDEyLjgyMDUgNC40ODg4NSAxMi43OTQ4IDQuNDQ0NDNDMTIuNzY5MSA0LjQwMDAxIDEyLjczMjEgNC4zNjMxNSAxMi42ODc2IDQuMzM3NTlDMTIuNjQzMSA0LjMxMjAzIDEyLjU5MjYgNC4yOTg2NiAxMi41NDEzIDQuMjk4ODNDMTIuNDkgNC4yOTkgMTIuNDM5NiA0LjMxMjcyIDEyLjM5NTMgNC4zMzg1OEw5LjMzMzk4IDYuMTI0NzVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjE2NjAyIDMuNUgyLjMzMjY4QzEuNjg4MzUgMy41IDEuMTY2MDIgNC4wMjIzMyAxLjE2NjAyIDQuNjY2NjdWOS4zMzMzM0MxLjE2NjAyIDkuOTc3NjcgMS42ODgzNSAxMC41IDIuMzMyNjggMTAuNUg4LjE2NjAyQzguODEwMzUgMTAuNSA5LjMzMjY4IDkuOTc3NjcgOS4zMzI2OCA5LjMzMzMzVjQuNjY2NjdDOS4zMzI2OCA0LjAyMjMzIDguODEwMzUgMy41IDguMTY2MDIgMy41WlwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX3RpdGxlXCI+VmlkZW8gTGlicmFyeTwvc3Bhbj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgaW5saW5lU3R5bGVzPVwibWluLXdpZHRoOiBtYXgtY29udGVudDtcIlxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCIjRURFOUZFXCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiIzZEMjhEOVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJ2aWRlb1VybHMubGVuZ3RoICsgJyBjbGlwJyArICh2aWRlb1VybHMubGVuZ3RoID09PSAxID8gJycgOiAncycpXCI+XG4gICAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNWaWRlb0Z1bGxNb2RlID8gJ1BsYXlpbmcgYWxsIGNsaXBzIGFzIG9uZSBjb250aW51b3VzIHZpZGVvJyA6ICdFYWNoIGNsaXAgY292ZXJzIGV4ZWN1dGlvbiBzaW5jZSBsYXN0IGNhcHR1cmUnXCJcbiAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCI+e3sgaXNWaWRlb0Z1bGxNb2RlID8gJ8K3IFBsYXlpbmcgYWxsIGNsaXBzIGFzIG9uZSBjb250aW51b3VzIHZpZGVvJyA6ICfCtyBFYWNoIGNsaXAgY292ZXJzIGV4ZWN1dGlvbiBzaW5jZSBsYXN0IGNhcHR1cmUnIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19hY3Rpb25zXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBsYXlfYXJyb3dcIlxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJzdGFydFwiXG4gICAgICAgICAgICAgIHRleHQ9XCJTaG93IEZ1bGwgVmlkZW9cIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblNob3dGdWxsVmlkZW8oKVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwiY2xvc2VcIlxuICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJzdGFydFwiXG4gICAgICAgICAgICAgIHRleHQ9XCJFeGl0IEZ1bGwgVmlkZW9cIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkV4aXRGdWxsVmlkZW8oKVwiPlxuICAgICAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19jb2xsYXBzZVwiIChjbGljayk9XCJ0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyAnU2hvdyB2aWRlbyBsaWJyYXJ5JyA6ICdIaWRlIHZpZGVvIGxpYnJhcnknXCI+XG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDcuNUw2IDQuNUw5IDcuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA0LjVMNiA3LjVMOSA0LjVcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBCb2R5IChjYXJkcykg4oCUIG1heC1oZWlnaHQgYW5pbWF0ZXMgZnJvbSAwIChjb2xsYXBzZWQpIHRvIGEgZml4ZWQgaGVpZ2h0IChvcGVuKS4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19ib2R5XCJcbiAgICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeV9fYm9keS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID8gdHJ1ZSA6IG51bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcHMtcm93XCJcbiAgICAgICAgICAgICAgICNjbGlwc1Njcm9sbGVyXG4gICAgICAgICAgICAgICBbY2xhc3MuY2xpcHMtcm93LS1kcmFnZ2luZ109XCJjbGlwc0RyYWdBY3RpdmVcIlxuICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNsaXBzTW91c2VEb3duKCRldmVudCwgY2xpcHNTY3JvbGxlcilcIlxuICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkNsaXBzTW91c2VNb3ZlKCRldmVudCwgY2xpcHNTY3JvbGxlcilcIlxuICAgICAgICAgICAgICAgKG1vdXNldXApPVwib25DbGlwc01vdXNlVXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkNsaXBzTW91c2VMZWF2ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1cmwgb2YgdmlkZW9VcmxzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0xpYnJhcnlDbGlwQnlJbmRleFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2xpcC1jYXJkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmNsaXAtY2FyZC0tcGxheWluZ109XCJpID09PSBjdXJyZW50VmlkZW9JbmRleFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYlwiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLmNsaXAtdGh1bWItLXJlYWR5XT1cImxpYnJhcnlWaWRlb0R1cmF0aW9ucy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMaWJyYXJ5Q2xpcChpKVwiPlxuICAgICAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAgICAgI2NsaXBWaWRlb1xuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLXRodW1iX192aWRlb1wiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cInVybFwiXG4gICAgICAgICAgICAgICAgICBwcmVsb2FkPVwibWV0YWRhdGFcIlxuICAgICAgICAgICAgICAgICAgcGxheXNpbmxpbmVcbiAgICAgICAgICAgICAgICAgIG11dGVkXG4gICAgICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIlxuICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uY2hhbmdlKT1cIm9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZChpLCBjbGlwVmlkZW8pXCI+PC92aWRlbz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fb3ZlcmxheVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtdGh1bWJfX3BsYXktY2lyY2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhKGkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZylcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMS43NUwxMS4zNzUgN0wzLjUgMTIuMjVWMS43NVpcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpID09PSBjdXJyZW50VmlkZW9JbmRleCAmJiBpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjMuNVwiIHk9XCIyLjVcIiB3aWR0aD1cIjIuNVwiIGhlaWdodD1cIjlcIiByeD1cIjAuNVwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI4XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpID09PSBjdXJyZW50VmlkZW9JbmRleCAmJiBpc1BsYXlpbmdcIiBjbGFzcz1cImNsaXAtdGh1bWJfX2JhZGdlIGNsaXAtdGh1bWJfX2JhZGdlLS1wbGF5aW5nXCI+UExBWUlORzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm5ld1ZpZGVvSW5kZXhlcy5oYXMoaSkgJiYgaSAhPT0gY3VycmVudFZpZGVvSW5kZXhcIiBjbGFzcz1cImNsaXAtdGh1bWJfX2JhZGdlIGNsaXAtdGh1bWJfX2JhZGdlLS1uZXdcIj5ORVc8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbGlwLXRodW1iX19kdXJhdGlvblwiPnt7IGZvcm1hdFRpbWUobGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpKSB8fCAwKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC1tZXRhX190aXRsZVwiPkNsaXAge3sgaSArIDEgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xpcC1kb3dubG9hZC1idG5cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmNsaXAtZG93bmxvYWQtYnRuLS1kb3dubG9hZGluZ109XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZENsaXAoaSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlnbWEgaWNvbjogdXB3YXJkIGFycm93IHdpdGggYSBzaG9ydCB0cmF5IGxpbmUgYXQgdGhlIGJvdHRvbSAoc2hhcmUvZXhwb3J0IGdseXBoKS4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDguNVYyTTYgMkwzIDVNNiAyTDkgNU0zIDEwLjVIOVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkRvd25sb2FkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2xpcC1kb3dubG9hZC1idG5fX3JpbmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgc3Ryb2tlPVwiI0U1RTdFQlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNoYXJyYXldPVwiZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaG9mZnNldF09XCJkb3dubG9hZFJpbmdEYXNob2Zmc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgtOTAgNyA3KVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGkpIHx8IDAgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMiBjcWEtYmctd2hpdGVcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiIFtuZ0NsYXNzXT1cInsnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSAmJiAhKHNob3dWaWRlb0xpYnJhcnkgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwKX1cIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybCAmJiAhaXNMaXZlXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW1iLTIgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1ibG9ja1wiPlxuICAgICAgICAgIFZpZGVvIHt7IGN1cnJlbnRWaWRlb0luZGV4ICsgMSB9fSBwbGF5aW5nIG91dCBvZiB7eyB2aWRlb1VybHM/Lmxlbmd0aCB8fCAwIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNNdWx0aXBsZVZpZGVvcyAmJiAhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50VmlkZW9JbmRleCA9PT0gMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZWaWRlbygpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJQcmV2aW91cyB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogY3VycmVudFZpZGVvSW5kZXggPT09IDB9XCI+c2tpcF9wcmV2aW91czwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7XCI+XG4gICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1BsYXllclN3aXRjaGluZ1wiXG4gICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgZGlhbWV0ZXI9XCIxNlwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYXkoKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBpc1BsYXlpbmcgPyAnUGF1c2UnIDogJ1BsYXknIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNQbGF5aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJMMTMgOEwzIDE0VjJaXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxMFwiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwibmV4dFZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk5leHQgdmlkZW9cIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdIGNxYS10ZXh0LVsjMzc0MTUxXVwiIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IHZpZGVvVXJscyAmJiAoY3VycmVudFZpZGVvSW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCAtIDEpfVwiPnNraXBfbmV4dDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgY3FhLWlubGluZS1ibG9ja1wiXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKGlzVmlkZW9GdWxsTW9kZSA/IChnbG9iYWxDdXJyZW50VGltZU1zIC8gMTAwMCkgOiAodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMCkpIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPGRpdiAjc3BlZWRDb250cm9sQ29udGFpbmVyIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1tci1bOHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmUgY3FhLXB4LTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU3BlZWRDb250cm9sKClcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInUGxheWJhY2sgU3BlZWQnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRTcGVlZCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNTcGVlZENvbnRyb2xPcGVuXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1mdWxsIGNxYS1tYi0yIGNxYS1yaWdodC0wIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXJvdW5kZWQtbGcgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtc2hhZG93LWxnIGNxYS16LTUwXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IG1heC1jb250ZW50OyBsZWZ0OiA1MCU7IGJvdHRvbTogMCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiAxMDE7XCI+XG4gICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNwZWVkU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50U3BlZWRcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJCZ0NvbG9yXT1cIicjRjBGMEYxJ1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU3BlZWRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgI3RpbWVsaW5lQmFyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLTEgY3FhLWJnLWdyYXktMjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25UaW1lbGluZUNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbWFya2VyIG9mIChpc1ZpZGVvRnVsbE1vZGUgPyBmdWxsVmlkZW9NYXJrZXJzIDogY3VycmVudFZpZGVvTWFya2VycylcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnZXRHbG9iYWxGdWxsU3RlcExlZnRQb3NpdGlvbihtYXJrZXIpIDogZ2V0U3RlcExlZnRQb3NpdGlvbihtYXJrZXIpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldEdsb2JhbE1hcmtlckNvbG9yKG1hcmtlci5sZXZlbClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cIicycHggc29saWQgJyArIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKG1hcmtlci5yZXN1bHQpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJveC1zaXppbmddPVwiJ2JvcmRlci1ib3gnXCJcbiAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibWFya2VyLnRpdGxlIHx8ICcnXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bzsgei1pbmRleDogNTA7IGN1cnNvcjogcG9pbnRlcjsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHRvcDogNTAlO1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbk1hcmtlckNsaWNrKCRldmVudCwgbWFya2VyKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWgtZnVsbCBjcWEtYmctYmx1ZS01MDAgY3FhLXJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdsb2JhbFNjcnViYmVyUGVyY2VudCA6IHByb2dyZXNzXCJcbiAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwiZHJhZ2dpbmcgPyAnbm9uZScgOiAnd2lkdGggMTAwbXMnXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogMjtcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10b3AtMS8yIGNxYS13LTMgY3FhLWgtMyBjcWEtYmctYmx1ZS02MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLWdyYWIgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmcgY3FhLXNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiA2MDtcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmUgY3FhLW1yLTJcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKHRvdGFsRHVyYXRpb24gLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5kdXJhdGlvbiB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3NjcmVlbnNob3RzJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSBzY3JlZW5zaG90Tm9GcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtbWF4LWgtW2luaGVyaXRdJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2NyZWVuc2hvdE5vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgTm8gc2NyZWVuc2hvdCBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0Zhc3RGb3J3YXJkaW5nICYmICFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd0cmFjZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1yZWxhdGl2ZVwiICpuZ0lmPVwidHJhY2VWaWV3VXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNDhweDsgcGFkZGluZy1ib3R0b206IDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgIDxpZnJhbWUgXG4gICAgICAgICAgICBbc3JjXT1cInNhZmVUcmFjZVVybFwiIFxuICAgICAgICAgICAgdGl0bGU9XCJUcmFjZSBWaWV3ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtbWluLWgtWzI1MHB4XSBjcWEtbWF4LWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNDhweDsgaGVpZ2h0OiBjYWxjKDEwMCUgKyA0OHB4KTtcIlxuICAgICAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGxvYWRpbmc9XCJsYXp5XCJcbiAgICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgICAgKGVycm9yKT1cIm9uVHJhY2VWaWV3ZXJFcnJvcigpXCI+XG4gICAgICAgICAgPC9pZnJhbWU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyTG9hZGluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBMb2FkaW5nIHRyYWNlIHZpZXdlci4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckVycm9yXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIHRyYWNlIHZpZXdlclxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhdHJhY2VWaWV3VXJsXCI+XG4gICAgICAgIE5vIHRyYWNlIGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+ICBcbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|