@cqa-lib/cqa-ui 1.1.552 → 1.1.554
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 +58 -26
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +60 -27
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +59 -27
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/simulator/simulator.component.d.ts +17 -1
- package/package.json +1 -1
|
@@ -55,6 +55,13 @@ export class SimulatorComponent {
|
|
|
55
55
|
this.dragging = false;
|
|
56
56
|
this.isPlaying = false;
|
|
57
57
|
this.showPlayPauseOverlay = false;
|
|
58
|
+
/**
|
|
59
|
+
* Icon shown by the play/pause overlay during its 500ms lifetime. Pinned at click time
|
|
60
|
+
* so the icon doesn't flicker as `isPlaying` flips async between
|
|
61
|
+
* `<video>.play()` invocation and its promise resolving. Mirrors the YouTube-style
|
|
62
|
+
* convention: show the action just taken (▶ after play, ∥ after pause).
|
|
63
|
+
*/
|
|
64
|
+
this.overlayShowsPlayingIcon = false;
|
|
58
65
|
this.playPauseOverlayTimer = null;
|
|
59
66
|
this.isFullScreen = false;
|
|
60
67
|
this.currentView = 'video';
|
|
@@ -731,7 +738,16 @@ export class SimulatorComponent {
|
|
|
731
738
|
}
|
|
732
739
|
}
|
|
733
740
|
/**
|
|
734
|
-
* Toggle play/pause
|
|
741
|
+
* Toggle play/pause.
|
|
742
|
+
*
|
|
743
|
+
* Decision is based on the video element's native `paused` property (ground truth)
|
|
744
|
+
* rather than on `playerState`, which lags during async play() / pause() transitions.
|
|
745
|
+
* The previous implementation would, on a rapid second click during the ~50-200ms
|
|
746
|
+
* `video.play()` await window, see `playerState === 'loading'` and queue another
|
|
747
|
+
* `playVideo()` instead of the intended `pauseVideo()` — so the second click
|
|
748
|
+
* silently "did nothing" while the video kept playing. Reading `video.paused`
|
|
749
|
+
* directly makes the toggle correct regardless of what stage the state machine
|
|
750
|
+
* happens to be in.
|
|
735
751
|
*/
|
|
736
752
|
togglePlay() {
|
|
737
753
|
const video = this.vplayer?.nativeElement;
|
|
@@ -751,43 +767,37 @@ export class SimulatorComponent {
|
|
|
751
767
|
});
|
|
752
768
|
return;
|
|
753
769
|
}
|
|
754
|
-
//
|
|
755
|
-
if (this.playerState === 'loading' && video.readyState >= HTMLMediaElement.HAVE_METADATA) {
|
|
756
|
-
this.playerState = 'paused';
|
|
757
|
-
}
|
|
758
|
-
// Don't allow play during error state
|
|
770
|
+
// Clear error state so the next play attempt can proceed.
|
|
759
771
|
if (this.playerState === 'error') {
|
|
760
772
|
console.warn('[Simulator] togglePlay: player in error state', { readyState: video.readyState });
|
|
761
773
|
this.playerState = 'idle';
|
|
762
774
|
}
|
|
763
|
-
// If still loading and video not ready, wait and retry
|
|
764
|
-
if (this.playerState === 'loading') {
|
|
765
|
-
console.warn('[Simulator] togglePlay: player not ready', {
|
|
766
|
-
playerState: this.playerState,
|
|
767
|
-
readyState: video.readyState
|
|
768
|
-
});
|
|
769
|
-
setTimeout(() => {
|
|
770
|
-
if (video.readyState >= HTMLMediaElement.HAVE_METADATA && this.playerState !== 'playing') {
|
|
771
|
-
this.togglePlay();
|
|
772
|
-
}
|
|
773
|
-
}, 50);
|
|
774
|
-
return;
|
|
775
|
-
}
|
|
776
775
|
console.log('[Simulator] togglePlay:', {
|
|
777
776
|
playerState: this.playerState,
|
|
778
777
|
isPlaying: this.isPlaying,
|
|
778
|
+
videoPaused: video.paused,
|
|
779
779
|
readyState: video.readyState
|
|
780
780
|
});
|
|
781
|
-
//
|
|
782
|
-
|
|
783
|
-
|
|
781
|
+
// Ground truth: if the video element is paused (or hasn't started yet), play; else pause.
|
|
782
|
+
// The operation queue serializes these so back-to-back clicks resolve in order.
|
|
783
|
+
if (video.paused) {
|
|
784
|
+
this.playVideo();
|
|
784
785
|
}
|
|
785
786
|
else {
|
|
786
|
-
this.
|
|
787
|
+
this.pauseVideo();
|
|
787
788
|
}
|
|
788
789
|
}
|
|
789
790
|
// SHOW PLAY PAUSE OVERLAY
|
|
790
791
|
onVideoFrameClick() {
|
|
792
|
+
// Pin the overlay icon to the user's INTENT for this click (the action just taken),
|
|
793
|
+
// independent of how the async play/pause resolves. Prevents flicker where the icon
|
|
794
|
+
// briefly shows the pre-click state before flipping when `isPlaying` updates.
|
|
795
|
+
const video = this.vplayer?.nativeElement;
|
|
796
|
+
const wasPaused = video ? video.paused : !this.isPlaying;
|
|
797
|
+
// YouTube convention: after clicking to PLAY, show ▶ ("just played"); after PAUSE,
|
|
798
|
+
// show ∥. Template branches on `overlayShowsPlayingIcon` so it stays stable for
|
|
799
|
+
// the entire 500ms overlay lifetime.
|
|
800
|
+
this.overlayShowsPlayingIcon = wasPaused;
|
|
791
801
|
this.togglePlay();
|
|
792
802
|
this.showPlayPauseOverlay = true;
|
|
793
803
|
if (this.playPauseOverlayTimer)
|
|
@@ -1452,6 +1462,15 @@ export class SimulatorComponent {
|
|
|
1452
1462
|
return;
|
|
1453
1463
|
lastUpdate = now;
|
|
1454
1464
|
const currentMs = video.currentTime * 1000;
|
|
1465
|
+
// Safety net: if `isPlaying` drifted from the element's actual state
|
|
1466
|
+
// (e.g. a queued op set it false but playback never actually stopped,
|
|
1467
|
+
// or the play promise hasn't resolved yet but `play` fired), realign
|
|
1468
|
+
// here so the toolbar Play/Pause icon doesn't get stuck on the wrong
|
|
1469
|
+
// glyph while playback continues.
|
|
1470
|
+
const videoIsPlaying = !video.paused;
|
|
1471
|
+
if (this.isPlaying !== videoIsPlaying) {
|
|
1472
|
+
this.isPlaying = videoIsPlaying;
|
|
1473
|
+
}
|
|
1455
1474
|
if (!this.dragging && this.playerState !== 'switching') {
|
|
1456
1475
|
// Per-video progress (0-100% of current video)
|
|
1457
1476
|
const durationMs = video.duration * 1000;
|
|
@@ -1471,9 +1490,22 @@ export class SimulatorComponent {
|
|
|
1471
1490
|
}
|
|
1472
1491
|
}
|
|
1473
1492
|
};
|
|
1493
|
+
// Mirror the <video> element's native state into `isPlaying`. The element
|
|
1494
|
+
// is the source of truth — the existing playVideoInternal / pauseVideoInternal
|
|
1495
|
+
// paths set `isPlaying` after their async work, but other paths (element
|
|
1496
|
+
// remounts via onVideoElementReady, dropped queue ops, etc.) can leave it
|
|
1497
|
+
// out of sync with reality. These listeners make the field self-correcting.
|
|
1498
|
+
const onPlay = () => { this.isPlaying = true; };
|
|
1499
|
+
const onPause = () => { this.isPlaying = false; };
|
|
1474
1500
|
video.addEventListener('timeupdate', handler);
|
|
1501
|
+
video.addEventListener('play', onPlay);
|
|
1502
|
+
video.addEventListener('playing', onPlay);
|
|
1503
|
+
video.addEventListener('pause', onPause);
|
|
1475
1504
|
this.videoEventListenerCleanup = () => {
|
|
1476
1505
|
video.removeEventListener('timeupdate', handler);
|
|
1506
|
+
video.removeEventListener('play', onPlay);
|
|
1507
|
+
video.removeEventListener('playing', onPlay);
|
|
1508
|
+
video.removeEventListener('pause', onPause);
|
|
1477
1509
|
};
|
|
1478
1510
|
}, 100);
|
|
1479
1511
|
}
|
|
@@ -2380,10 +2412,10 @@ export class SimulatorComponent {
|
|
|
2380
2412
|
}
|
|
2381
2413
|
}
|
|
2382
2414
|
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 });
|
|
2383
|
-
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", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, 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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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 || liveSessionView === 'captured')\">\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", "size"], 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"] }] });
|
|
2415
|
+
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", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, 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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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 <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" 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=\"!overlayShowsPlayingIcon\" 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 <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" 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=\"!overlayShowsPlayingIcon\" 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 || liveSessionView === 'captured')\">\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", "size"], 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"] }] });
|
|
2384
2416
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
|
|
2385
2417
|
type: Component,
|
|
2386
|
-
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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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 || liveSessionView === 'captured')\">\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: [] }]
|
|
2418
|
+
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 <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\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 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" 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 <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\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 <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" 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=\"!overlayShowsPlayingIcon\" 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 <!-- Icon pinned to the just-taken action (set in onVideoFrameClick) so it\n doesn't flicker as `isPlaying` flips async between play() invocation\n and its promise resolving. -->\n <svg *ngIf=\"overlayShowsPlayingIcon\" 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=\"!overlayShowsPlayingIcon\" 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 || liveSessionView === 'captured')\">\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: [] }]
|
|
2387
2419
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoUrl: [{
|
|
2388
2420
|
type: Input
|
|
2389
2421
|
}], videoUrls: [{
|
|
@@ -2471,4 +2503,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2471
2503
|
type: HostListener,
|
|
2472
2504
|
args: ['window:resize']
|
|
2473
2505
|
}] } });
|
|
2474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBd2U3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4ZXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdB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YztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZhc3RGb3J3YXJkQ29uZmlnIHtcbiAgZnJvbVN0ZXA6IG51bWJlcjtcbiAgdG9TdGVwOiBudW1iZXI7XG4gIGN1cnJlbnRTdGVwOiBudW1iZXI7XG4gIHRvdGFsU3RlcHM6IG51bWJlcjtcbiAgdGFyZ2V0U3RlcE51bWJlcjogc3RyaW5nO1xuICB0YXJnZXRTdGVwTGFiZWw6IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBicm93c2VyRGV2aWNlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSBpc0Zhc3RGb3J3YXJkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhc3RGb3J3YXJkQ29uZmlnOiBGYXN0Rm9yd2FyZENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHNob3dWaWRlb0xpYnJhcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NhcHR1cmVWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0NhcHR1cmluZ1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gV2hlbiBgaXNMaXZlYCBhbmQgYXQgbGVhc3Qgb25lIGNsaXAgaXMgcHJlc2VudCBpbiBgdmlkZW9VcmxzYCwgdGhlIHNpbXVsYXRvclxuICAvLyBoZWFkZXIgc2hvd3MgYSBMaXZlL0NhcHR1cmVkIHNlZ21lbnQgY29udHJvbC4gUGFyZW50IGNhbiBhbHNvIGRyaXZlIHRoZSB2aWV3XG4gIC8vIGltcGVyYXRpdmVseSAoZS5nLiBcIldhdGNoIE5vd1wiIGJ1dHRvbiBpbiB0aGUgY2FwdHVyZSBkaWFsb2cpIGJ5IHB1c2hpbmcgYVxuICAvLyBuZXcgdmFsdWUgdGhyb3VnaCB0aGlzIGlucHV0LlxuICBASW5wdXQoKSBsaXZlU2Vzc2lvblZpZXc6ICdsaXZlJyB8ICdjYXB0dXJlZCcgPSAnbGl2ZSc7XG5cbiAgZ2V0IGZhc3RGb3J3YXJkUHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgYyA9IHRoaXMuZmFzdEZvcndhcmRDb25maWc7XG4gICAgaWYgKCFjIHx8ICFjLnRvdGFsU3RlcHMpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIChjLmN1cnJlbnRTdGVwIC8gYy50b3RhbFN0ZXBzKSAqIDEwMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlkZW9UaW1lVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWFya2VySGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdGVwTWFya2VyPigpO1xuICBAT3V0cHV0KCkgaXNWaWRlb1BsYXlpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjYXB0dXJlVmlkZW9SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsaXZlU2Vzc2lvblZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdsaXZlJyB8ICdjYXB0dXJlZCc+KCk7XG5cbiAgcHJpdmF0ZSBfdnBsYXllcj86IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndnBsYXllcicpXG4gIHNldCB2cGxheWVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSB7XG4gICAgICAvLyBFbGVtZW50IGlzIGJlaW5nIHVubW91bnRlZCAoZS5nLiB1c2VyIHRvZ2dsZWQgZnJvbSBDYXB0dXJlZCDihpIgTGl2ZSBkdXJpbmcgYVxuICAgICAgLy8gbWlkLWZsaWdodCBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCkuIERyb3AgdGhlIHN0YWxlIHJlZmVyZW5jZSBzbyBhbnlcbiAgICAgIC8vIGZvbGxvdy11cCBhdHRlbXB0IHRvIG9wZXJhdGUgb24gLm5hdGl2ZUVsZW1lbnQgc2hvcnQtY2lyY3VpdHMgb3V0IGNsZWFubHkuXG4gICAgICB0aGlzLl92cGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1BsYXlQYXVzZU92ZXJsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIC8vIFZpZGVvLW9uLWRlbWFuZCAoVmlkZW8gTGlicmFyeSkgc3RhdGUg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaXMgYHZpZGVvVXJsc2AuXG4gIC8vIGBuZXdWaWRlb0luZGV4ZXNgIG1hcmtzIHdoaWNoIGluZGV4ZXMgd2VyZSBqdXN0IGNhcHR1cmVkIChzbyB3ZSBjYW4gc2hvdyB0aGVcbiAgLy8gTkVXIGJhZGdlIHVudGlsIHRoYXQgY2xpcCBpcyBzZWxlY3RlZCk7IGBsaWJyYXJ5VmlkZW9EdXJhdGlvbnNgIGNhY2hlcyB0aGVcbiAgLy8gbWV0YWRhdGEtbG9hZGVkIGR1cmF0aW9uIHBlciBpbmRleCBmb3IgZWFjaCBsaWJyYXJ5IGNhcmQncyB0aHVtYm5haWwuXG4gIGlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgbmV3VmlkZW9JbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsaWJyYXJ5VmlkZW9EdXJhdGlvbnM6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBkb3dubG9hZGluZ0luZGV4ZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGRvd25sb2FkUHJvZ3Jlc3M6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyAwLTEwMCBwZXIgY2xpcCBpbmRleFxuICBAVmlld0NoaWxkcmVuKCdjbGlwVmlkZW8nKSBjbGlwVmlkZW9zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdjbGlwc1Njcm9sbGVyJykgY2xpcHNTY3JvbGxlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhc3RMaWJyYXJ5U3luY0tleTogc3RyaW5nID0gJyc7XG4gIC8vIFRyYWNrcyB3aGljaCBjbGlwIGluZGV4IHRoZSBsaWJyYXJ5IHJvdyB3YXMgbGFzdCBhdXRvLXNjcm9sbGVkIHRvLCBzbyB0aGVcbiAgLy8gdGltZXVwZGF0ZSBoYW5kbGVyIGRvZXNuJ3QgcmUtdHJpZ2dlciBhIHNjcm9sbCBldmVyeSBmcmFtZS5cbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsZWRDbGlwSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIEF1dG8tcmVjb3Zlcnk6IHdoZW4gdGhlIDx2aWRlbz4gZmlyZXMgYW4gZXJyb3IgZXZlbnQgKGUuZy4gQ2hyb21lJ3NcbiAgLy8gXCJQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyXCIgYWZ0ZXIgYSBuZXR3b3JrIGdsaXRjaCksIHdlIGZsaXBcbiAgLy8gdGhpcyBmbGFnIHRvIHVubW91bnQgdGhlIDx2aWRlbz4gdmlhICpuZ0lmLCB0aGVuIGZsaXAgaXQgYmFjayBzbyBBbmd1bGFyXG4gIC8vIHJlbW91bnRzIGEgZnJlc2ggZWxlbWVudCDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlXG4gIC8vIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kIHJlY292ZXIgcGxheWJhY2sgdG9kYXkuXG4gIHZpZGVvUmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVNlZWtTZWM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVBsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRUNPVkVSWV9BVFRFTVBUUyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFJFQ09WRVJZX1dJTkRPV19NUyA9IDEwXzAwMDtcblxuICAvLyBQaGFzZSAyIOKAlCBcIlNob3cgRnVsbCBWaWRlb1wiIG1vZGUuIFdoZW4gdHJ1ZSwgdGhlIG1haW4gdGltZWxpbmUgc3BhbnMgdGhlIHRvdGFsXG4gIC8vIGR1cmF0aW9uIGFjcm9zcyBhbGwgY2xpcHMgYW5kIHN0ZXAgbWFya2VycyBmcm9tIGV2ZXJ5IGNsaXAgYXJlIGxhaWQgb3V0IG9uIGl0LlxuICAvLyBDbGlwLXRvLWNsaXAgdHJhbnNpdGlvbnMgaGFwcGVuIHVuZGVyIHRoZSBob29kIHZpYSB0aGUgZXhpc3Rpbmcgb25WaWRlb0VuZGVkXG4gIC8vIGF1dG8tYWR2YW5jZSBwYXRoIOKAlCB0aGUgdXNlciBkb2Vzbid0IHNlZSBhIHJlc2V0LlxuICBpc1ZpZGVvRnVsbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmVseSBkcmFnZ2luZy5cbiAgLy8gTmVlZGVkIGJlY2F1c2UgYHByb2dyZXNzYCBpcyBwZXItY3VycmVudC1jbGlwIGFuZCB3b3VsZCBnaXZlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgZ2xvYmFsRHJhZ1Byb2dyZXNzOiBudW1iZXIgPSAwO1xuXG4gIC8vIERyYWctdG8tc2Nyb2xsIHN0YXRlIGZvciB0aGUgY2xpcHMgcm93IChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKS5cbiAgcHJpdmF0ZSBjbGlwc0RyYWdTdGF0ZSA9IHsgZHJhZ2dpbmc6IGZhbHNlLCBzdGFydFg6IDAsIHN0YXJ0U2Nyb2xsTGVmdDogMCwgZGlkTW92ZTogZmFsc2UgfTtcbiAgY2xpcHNEcmFnQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSgpOiAnYnJvd3NlcicgfCAnZGV2aWNlJyB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykgcmV0dXJuICdkZXZpY2UnO1xuICAgIGlmICh0aGlzLnJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCkpIHJldHVybiAnZGV2aWNlJztcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8vICBTSE9XIFBMQVkgUEFVU0UgT1ZFUkxBWVxuICBvblZpZGVvRnJhbWVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICB0aGlzLnNob3dQbGF5UGF1c2VPdmVybGF5ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcik7XG4gICAgdGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSBmYWxzZTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHBsYXlWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgZWxpbWluYXRlcyBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGxheVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBwbGF5aW5nIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwbGF5aW5nLCBza2lwcGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogc3RhcnRpbmcnLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIHZpZGVvIHRvIGJlIHJlYWR5IGlmIG5lZWRlZFxuICAgIGlmICh2aWRlby5yZWFkeVN0YXRlIDwgSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHdhaXRpbmcgZm9yIG1ldGFkYXRhJyk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8gbWV0YWRhdGEnKSk7XG4gICAgICAgIH07XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGhpdCBtYXJrZXJzIGlmIHN0YXJ0aW5nIGZyb20gYmVnaW5uaW5nXG4gICAgY29uc3QgY3VycmVudFRpbWVNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICBpZiAoY3VycmVudFRpbWVNcyA8IDEwMCkge1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHN0YXRlIHRvIGxvYWRpbmdcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBiZWZvcmUgcGxheWluZ1xuICAgICAgY29uc3QgY3VycmVudFZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjdXJyZW50VmlkZW8gfHwgY3VycmVudFZpZGVvICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgb3IgdW5hdmFpbGFibGUnKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBd2FpdCBwbGF5IHByb21pc2UgLSB0aGlzIGlzIGNyaXRpY2FsXG4gICAgICBhd2FpdCB2aWRlby5wbGF5KCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciBwbGF5IHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJQbGF5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlb0FmdGVyUGxheSB8fCB2aWRlb0FmdGVyUGxheSAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBwbGF5Jyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGxheSBzdWNjZWVkZWRcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGxheWluZyc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QbGF5LmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBwbGF5aW5nIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyB2LmN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgLy8gUGxheSBmYWlsZWRcbiAgICAgIC8vIENoZWNrIGlmIHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgICBjb25zdCB2aWRlb0FmdGVyRXJyb3IgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJFcnJvciB8fCB2aWRlb0FmdGVyRXJyb3IgIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBkdXJpbmcgZXJyb3InKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICBcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWJvcnRlZCAoZXhwZWN0ZWQgZHVyaW5nIHBhdXNlKScpO1xuICAgICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkLCByZXNldCB0byBwYXVzZWQgc3RhdGUgaW5zdGVhZCBvZiBlcnJvclxuICAgICAgICBpZiAodmlkZW9BZnRlckVycm9yICYmIHZpZGVvQWZ0ZXJFcnJvciA9PT0gdmlkZW8pIHtcbiAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGF1c2VWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wYXVzZVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGF1c2VWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIC8vIEFscmVhZHkgcGF1c2VkIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwYXVzZWQsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2luZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG5cbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2VkIHN1Y2Nlc3NmdWxseScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWUgbWVkaWEgb3BlcmF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqIFRoaXMgaXMgdGhlIENSSVRJQ0FMIGZpeCBmb3IgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqIEFsbCBtZWRpYSBvcGVyYXRpb25zIChwbGF5LCBwYXVzZSwgc2Vlaywgc3dpdGNoKSBnbyB0aHJvdWdoIHRoaXMgcXVldWVcbiAgICovXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gdGhpcy5vcGVyYXRpb25RdWV1ZVxuICAgICAgLnRoZW4oKCkgPT4gb3BlcmF0aW9uKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gTWVkaWEgb3BlcmF0aW9uIGZhaWxlZDonLCBlcnIpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGhhc011bHRpcGxlVmlkZW9zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqIEN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBbbXNdLiBzZWdtZW50Qm91bmRhcmllc1tpXSA9IHN1bSBvZiBkdXJhdGlvbnMgWzAuLmldICovXG4gIGdldCBzZWdtZW50Qm91bmRhcmllcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kYXJpZXM6IG51bWJlcltdID0gW107XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCBkIG9mIGR1cmF0aW9ucykge1xuICAgICAgc3VtICs9IGQ7XG4gICAgICBib3VuZGFyaWVzLnB1c2goc3VtKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKiogVG90YWwgZHVyYXRpb24gYWNyb3NzIGFsbCBzZWdtZW50cyBpbiBtcyAqL1xuICBnZXQgdG90YWxEdXJhdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMudmlkZW9EdXJhdGlvbnM7XG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiBkdXJhdGlvbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKiogVmlkZW8gZHVyYXRpb25zIGluIG1zIChkZXRlY3RlZCBvciBmcm9tIHNpbmdsZSB2aWRlbyBlbGVtZW50KS5cbiAgICpcbiAgICogIE1lcmdlcyB0d28gaW5kZXBlbmRlbnQgcHJvYmVzOiBgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc2AgKG9mZi1ET00gdGVtcCB2aWRlb3MpXG4gICAqICBhbmQgYGxpYnJhcnlWaWRlb0R1cmF0aW9uc2AgKHRoZSByZW5kZXJlZCBsaWJyYXJ5IHRodW1ibmFpbHMpLiBFaXRoZXIgY2FuXG4gICAqICByZXNvbHZlIGZpcnN0IGRlcGVuZGluZyBvbiBicm93c2VyIHF1aXJrcyB3aXRoIFdlYk0vSW5maW5pdHktZHVyYXRpb24gY2xpcHM7XG4gICAqICB3ZSB0YWtlIHRoZSBmaXJzdCBmaW5pdGUgdmFsdWUgcGVyIGluZGV4LiAqL1xuICBwcml2YXRlIGdldCB2aWRlb0R1cmF0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnZpZGVvVXJscyB8fCBbXTtcbiAgICAgIGlmICh1cmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgY29uc3QgbWVyZ2VkOiBudW1iZXJbXSA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGRldGVjdGVkKSAmJiBkZXRlY3RlZCA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBkZXRlY3RlZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tTGlicmFyeVMgPSB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5nZXQoaSk7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUxpYnJhcnlTID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShmcm9tTGlicmFyeVMpICYmIGZyb21MaWJyYXJ5UyA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBmcm9tTGlicmFyeVMgKiAxMDAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVua25vd24geWV0IOKAlCBsZWF2ZSB0aGUgc2xvdCBhcyBhIGhvbGUgc28gY2FsbGVycyBjYW4gZGV0ZWN0IHBhcnRpYWwgc3RhdGUuXG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodmlkZW8/LmR1cmF0aW9uICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFt2aWRlby5kdXJhdGlvbiAqIDEwMDBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIGxldCBtYXJrZXJzVG9Qcm9jZXNzOiBTdGVwTWFya2VyW107XG4gICAgXG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IGJvdW5kYXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4XTtcbiAgICAgICAgXG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzXG4gICAgICAgICAgLmZpbHRlcihtYXJrZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPj0gY3VycmVudEJvdW5kYXJ5LnN0YXJ0ICYmIFxuICAgICAgICAgICAgICAgICAgIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPCBjdXJyZW50Qm91bmRhcnkuZW5kO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChtYXJrZXIgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24oXG4gICAgICAgICAgICBtYXJrZXIsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuZW5kXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKG1hcmtlcnNUb1Byb2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obWFya2VyOiBTdGVwTWFya2VyLCBhZGp1c3RtZW50OiBudW1iZXIsIHZpZGVvU3RhcnQ6IG51bWJlciwgdmlkZW9FbmQ6IG51bWJlcik6IFN0ZXBNYXJrZXIge1xuICAgIGNvbnN0IGFkanVzdGVkTWFya2VyOiBTdGVwTWFya2VyID0ge1xuICAgICAgLi4ubWFya2VyLFxuICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgIH07XG4gICAgXG4gICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFkanVzdGVkTWFya2VyLmNoaWxkU3RlcHMgPSBtYXJrZXIuY2hpbGRTdGVwc1xuICAgICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBjb25zdCBhZGp1c3RlZENoaWxkOiBTdGVwTWFya2VyID0ge1xuICAgICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgICBjdW11bGF0aXZlRHVyYXRpb246IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjaGlsZC5jaGlsZFN0ZXBzICYmIGNoaWxkLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWRqdXN0ZWRDaGlsZC5jaGlsZFN0ZXBzID0gY2hpbGQuY2hpbGRTdGVwc1xuICAgICAgICAgICAgICAuZmlsdGVyKG5lc3RlZENoaWxkID0+IG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAgICAgICAubWFwKG5lc3RlZENoaWxkID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG5lc3RlZENoaWxkLCBhZGp1c3RtZW50LCB2aWRlb1N0YXJ0LCB2aWRlb0VuZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRDaGlsZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZGp1c3RlZE1hcmtlcjtcbiAgfVxuXG4gIGdldFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybiAwO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvIGR1cmF0aW9uTXMpICogMTAwO1xuICB9XG5cbiAgLyoqIEZ1bGwtdmlkZW8gbWFya2VyczogZXZlcnkgbWFya2VyLCBmbGF0dGVuZWQsIGxhaWQgb3V0IG9uIHRoZSBnbG9iYWwgdGltZWxpbmUuXG4gICAqIGBzdGVwTWFya2Vyc2AgaXMgYWxyZWFkeSBpbiBnbG9iYWwgY29vcmRpbmF0ZXMg4oCUIGBjdXJyZW50VmlkZW9NYXJrZXJzYCBkb2VzIHRoZVxuICAgKiBpbnZlcnNlIChmaWx0ZXJzICsgYWRqdXN0cyBwZXItY2xpcCk7IGhlcmUgd2UganVzdCBmbGF0dGVuIHRoZSBvcmlnaW5hbCBsaXN0LiAqL1xuICBnZXQgZnVsbFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMgfHwgW10pO1xuICB9XG5cbiAgZ2V0R2xvYmFsRnVsbFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBlbGFwc2VkIG1zIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUgKHByaW9yIGNsaXAgZHVyYXRpb25zICsgY3VycmVudCBsb2NhbCB0aW1lKS4gKi9cbiAgZ2V0IGdsb2JhbEN1cnJlbnRUaW1lTXMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBsb2NhbCA9ICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lID8/IDApICogMTAwMDtcbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5zZWdtZW50Qm91bmRhcmllcztcbiAgICBjb25zdCBwcmlvckVuZCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwID8gKGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApIDogMDtcbiAgICByZXR1cm4gcHJpb3JFbmQgKyBsb2NhbDtcbiAgfVxuXG4gIC8qKiAwLTEwMCBwb3NpdGlvbiBvbiB0aGUgZ2xvYmFsIHRpbWVsaW5lLCBkcml2ZW4gYnkgdGltZXVwZGF0ZS4gKi9cbiAgZ2V0IGdsb2JhbFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHRoaXMuZ2xvYmFsQ3VycmVudFRpbWVNcyAvIHRvdGFsKSAqIDEwMCkpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGRyYWdnaW5nIGluIGZ1bGwgbW9kZSwgdGhlIHNjcnViYmVyIHJlYWRzIHRoZSBvdmVycmlkZTsgb3RoZXJ3aXNlIGdsb2JhbFByb2dyZXNzLiAqL1xuICBnZXQgZ2xvYmFsU2NydWJiZXJQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmcgPyB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA6IHRoaXMuZ2xvYmFsUHJvZ3Jlc3M7XG4gIH1cblxuICBnZXRTdGVwQ29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ZXAubGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnIzYzNjZGMSc7XG4gIH1cblxuICBnZXRTdGVwUmVzdWx0Q29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3Ioc3RlcC5yZXN1bHQpO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyQ29sb3IobGV2ZWw/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBsZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjRkZBNTAwJztcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J10pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlICdTVUNDRVNTJzpcbiAgICAgICAgcmV0dXJuICcjMTJCNzZBJztcbiAgICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgICByZXR1cm4gJyNCOTFDMUMnO1xuICAgICAgY2FzZSAnQUJPUlRFRCc6XG4gICAgICAgIHJldHVybiAnI0Y3OTAwOSc7XG4gICAgICBjYXNlICdTS0lQUEVEJzpcbiAgICAgICAgcmV0dXJuICcjNjY3MDg1JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnIzYzNjZGMSc7XG4gICAgfVxuICB9XG5cbiAgb25NYXJrZXJDbGljayhldmVudDogTW91c2VFdmVudCwgbWFya2VyOiBTdGVwTWFya2VyKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb247XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAobWFya2VyLnRlc3RTdGVwSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb1VybCgpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4LCAwKSwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4gdGhpcy52aWRlb1VybHNbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlkZW9Vcmw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHJlc2V0VmlkZW9TdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IHJlc2V0dGluZycpO1xuXG4gICAgdmlkZW8ucGF1c2UoKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IGNvbXBsZXRlJyk7XG4gIH1cblxuICBwcmV2VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb1VybHMgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA8IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgb25UaW1lbGluZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNsaWNrWCAvIHJlY3Qud2lkdGgpKTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9IHBlcmNlbnQgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTIwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBwZXJjZW50ICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblRpbWVsaW5lQ2xpY2snLCB7XG4gICAgICBwZXJjZW50LFxuICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMOiBDYXB0dXJlIHBsYXlpbmcgc3RhdGUgQkVGT1JFIHBhdXNpbmdcbiAgICAvLyBVc2UgYm90aCBpc1BsYXlpbmcgZmxhZyBhbmQgcGxheWVyU3RhdGUgZm9yIHJlbGlhYmlsaXR5XG4gICAgdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyA9IHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RhcnREcmFnJywge1xuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gZHVyaW5nIGRyYWcgdG8gYXZvaWQgY29uZmxpY3RzXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25EcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4IC8gcmVjdC53aWR0aCwgMSkpO1xuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gcGVyY2VudCAqIDEwMDsgLy8gUGVyLWNsaXAgdGltZWxpbmUgcG9zaXRpb25cbiAgICB9XG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBkcmFnIGVuZGVkJywge1xuICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmc6IHNob3VsZFJlc3VtZVBsYXlpbmcsXG4gICAgICBjdXJyZW50UGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9ICh0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyAvIDEwMCkgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSAodGhpcy5wcm9ncmVzcyAvIDEwMCkgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG5cbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIFxuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiByZXN1bWluZyBwbGF5YmFjayBhZnRlciBzZWVrJywge1xuICAgICAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFdhaXQgYSBiaXQgbG9uZ2VyIHRvIGVuc3VyZSBzZWVrIGlzIGZ1bGx5IGNvbXBsZXRlXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxNTApKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzdGF0ZSBpcyAncGF1c2VkJyBhZnRlciBzZWVrIChzZWVrVG9UaW1lSW50ZXJuYWwgc2V0cyBpdCB0byAncGF1c2VkJylcbiAgICAgICAgLy8gSWYgc3RhdGUgaXMgc3RpbGwgJ3NlZWtpbmcnLCB3YWl0IGEgYml0IG1vcmVcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdzZWVraW5nJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogc2VlayBzdGlsbCBpbiBwcm9ncmVzcywgd2FpdGluZyBtb3JlJyk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3cgcmVzdW1lIHBsYXliYWNrIChzdGF0ZSBzaG91bGQgYmUgJ3BhdXNlZCcgYXQgdGhpcyBwb2ludClcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcGxheWJhY2sgcmVzdW1lZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB1bmV4cGVjdGVkIHN0YXRlIGFmdGVyIHNlZWssIGF0dGVtcHRpbmcgdG8gcmVzdW1lIGFueXdheScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gVHJ5IHRvIHJlc3VtZSBhbnl3YXkgLSBiZXR0ZXIgdG8gdHJ5IHRoYW4gdG8gbGVhdmUgaXQgc3R1Y2tcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdmlkZW8gd2FzIHBhdXNlZCwgbm90IHJlc3VtaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMub25EcmFnKGUpO1xuICAgIH07XG5cbiAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3RvcERyYWcoKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25WaWRlb01ldGFkYXRhTG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvTWV0YWRhdGFMb2FkZWQnKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG4gIFxuICBvblZpZGVvQ2FuUGxheSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0NhblBsYXknKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuXG4gICAgLy8gQ29uc3VtZSBhbnkgcGVuZGluZyByZWNvdmVyeSBzdGF0ZSBxdWV1ZWQgYnkgb25WaWRlb0Vycm9yKCk6IHNlZWsgYmFjayB0b1xuICAgIC8vIHdoZXJlIHBsYXliYWNrIGVycm9yZWQgYW5kIGF1dG8tcmVzdW1lIGlmIHdlIHdlcmUgcGxheWluZyBhdCB0aGUgdGltZS5cbiAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlZWtTZWMgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWM7XG4gICAgICBjb25zdCBzaG91bGRQbGF5ID0gdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5O1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjID0gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlZWtTZWMsIHZpZGVvLmR1cmF0aW9uKSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHsgLyogZWxlbWVudCBtYXkgbm90IGJlIHNlZWthYmxlIHlldDsgaGFybWxlc3MgKi8gfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFBsYXkpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgODApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBOYXRpdmUgZXJyb3ItZXZlbnQgaGFuZGxlciBmb3IgdGhlIG1haW4gPHZpZGVvPiBlbGVtZW50LiBUaGUgQ2hyb21lIG1lZGlhXG4gICAqIHN0YWNrIG9jY2FzaW9uYWxseSB0aHJvd3MgXCJQaXBlbGluZVN0YXR1czo6UElQRUxJTkVfRVJST1JfUkVBRDogRkZtcGVnRGVtdXhlcjpcbiAgICogZGF0YSBzb3VyY2UgZXJyb3JcIiBkdXJpbmcgcGxheWJhY2sgYWZ0ZXIgYSBicmllZiBuZXR3b3JrIGJsaXAgb3IgYSBidXJzdCBvZlxuICAgKiBmYXN0IHVzZXIgYWN0aW9uczsgb25jZSB0aGF0IGhhcHBlbnMgdGhlIGVsZW1lbnQgYmVjb21lcyB1bnJlc3BvbnNpdmUgdG9cbiAgICogcGxheS9wYXVzZS9zZWVrLiBXZSByZWNvdmVyIGJ5IHVubW91bnRpbmcrcmVtb3VudGluZyB0aGUgPHZpZGVvPiB2aWEgKm5nSWZcbiAgICog4oCUIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGF0IG1ha2VzIHRoZSBTY3JlZW5zaG90c+KGlFZpZGVvIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZFxuICAgKiB3b3JrIHRvZGF5IOKAlCB0aGVuIHJlc3RvcmUgdGhlIHByZS1lcnJvciBwbGF5aGVhZCBhbmQgcmVzdW1lIHBsYXliYWNrLiAqL1xuICBvblZpZGVvRXJyb3IoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZXJyID0gdmlkZW8/LmVycm9yO1xuXG4gICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gb25WaWRlb0Vycm9yIOKAlCB0cmlnZ2VyaW5nIGF1dG8tcmVjb3ZlcnknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGVycm9yQ29kZTogZXJyPy5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnI/Lm1lc3NhZ2UsXG4gICAgICBuZXR3b3JrU3RhdGU6IHZpZGVvPy5uZXR3b3JrU3RhdGUsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlbz8ucmVhZHlTdGF0ZSxcbiAgICAgIGN1cnJlbnRWaWRlb0luZGV4OiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4LFxuICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgIGF0dGVtcHRzOiB0aGlzLnJlY292ZXJ5QXR0ZW1wdHNcbiAgICB9KTtcblxuICAgIC8vIEJvdW5kIHRoZSByZXRyeSBidWRnZXQgdG8gYSByb2xsaW5nIHdpbmRvdyBzbyBhIHBlcnNpc3RlbnRseSBicm9rZW5cbiAgICAvLyBzb3VyY2UgKDQwNCwgdW5zdXBwb3J0ZWQgY29kZWMsIOKApikgZG9lc24ndCBmbGFwIGZvcmV2ZXIuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA+IHRoaXMuUkVDT1ZFUllfV0lORE9XX01TKSB7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IG5vdztcbiAgICB9XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzKys7XG4gICAgaWYgKHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA+IHRoaXMuTUFYX1JFQ09WRVJZX0FUVEVNUFRTKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3I6IGV4Y2VlZGVkIHJlY292ZXJ5IGF0dGVtcHRzLCBnaXZpbmcgdXAnKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB3aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSBhZnRlciB0aGUgcmVtb3VudC5cbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSAodmlkZW8gJiYgaXNGaW5pdGUodmlkZW8uY3VycmVudFRpbWUpKSA/IHZpZGVvLmN1cnJlbnRUaW1lIDogMDtcbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXkgPSB0aGlzLmlzUGxheWluZztcblxuICAgIC8vIFB1dCB0aGUgc3RhdGUgbWFjaGluZSBpbnRvICdlcnJvcicgc28gb25WaWRlb0VsZW1lbnRSZWFkeSByZXNldHMgaXRcbiAgICAvLyBiYWNrIHRvICdpZGxlJyB3aGVuIHRoZSByZW1vdW50ZWQgZWxlbWVudCBhcnJpdmVzLlxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIC8vIFVubW91bnQg4oaSIHJlbW91bnQuIEJyaWVmIDEwMG1zIGdhcCBtaXJyb3JzIHRoZSB0YWItc3dpdGNoIHdvcmthcm91bmQuXG4gICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblZpZGVvRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIC8vIFN3aXRjaCB0byBuZXh0IHZpZGVvIGFuZCBhdXRvLXBsYXkgaXRcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDE7XG5cbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwobmV4dEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFZpZGVvTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IDEwMCkgcmV0dXJuO1xuXG4gICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcblxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3N3aXRjaGluZycpIHtcbiAgICAgICAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoY3VycmVudE1zIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuY2hlY2tNYXJrZXJIaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICB0aGlzLm1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk7XG5cbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0aGUgbGlicmFyeSByb3cgc28gdGhlIGN1cnJlbnRseS1wbGF5aW5nIGNsaXAgc3RheXMgdmlzaWJsZS5cbiAgICAgICAgICAvLyBPbmx5IHdoaWxlIHBsYXlpbmc7IHdoZW4gcGF1c2VkIHdlIGxlYXZlIHRoZSByb3cgd2hlcmUgdGhlIHVzZXIgbGVmdCBpdC5cbiAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleDtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3VycmVudENsaXBJbnRvVmlldygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuXG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+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+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCA8c3BhbiBbaW5uZXJIVE1MXT1cImZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlkZW8gVmlldzogcG9zdC1leGVjdXRpb24gVmlkZW8gdGFiLCBvciBtaWQtc2Vzc2lvbiBDYXB0dXJlZCB2aWV3IGluc2lkZSBhIGxpdmUgc2Vzc2lvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgKCghaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nKSB8fCAoaXNMaXZlICYmIGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJykpXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTEwOHB4KV0nOiBzaG93VmlkZW9MaWJyYXJ5LCAnY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldJzogIXNob3dWaWRlb0xpYnJhcnl9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUsMyAxOSwxMiA1LDIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8IS0tIFZpZGVvIExpYnJhcnkgUGFuZWwg4oCUIHJlc2VydmVzIG9ubHkgaGVhZGVyLWhlaWdodCBpbiBmbG93OyB0aGUgaW5uZXIgcGFuZWwgaXMgYWJzb2x1dGVseSBhbmNob3JlZCB0byBpdHMgYm90dG9tIGVkZ2UsIHNvIHRoZSBib2R5IGV4cGFuZGluZyBtYWtlcyB0aGUgcGFuZWwgZ3JvdyBVUFdBUkQgb3ZlciB0aGUgdmlkZW8uIFRpbWVsaW5lIHN0YXlzIHB1dC4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cInZpZGVvLWxpYnJhcnlcIlxuICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2lubmVyXCI+XG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBhbHdheXMgdmlzaWJsZSwgY2xpY2tpbmcgdGhlIGNoZXZyb24gdG9nZ2xlcyB0aGUgYm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2hlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlkZW8tbGlicmFyeV9faWNvblwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzOTggNy41ODMwOEwxMi4zODA3IDkuNjE0MjVDMTIuNDI0NyA5LjY0MzQ4IDEyLjQ3NTcgOS42NjAyNCAxMi41Mjg0IDkuNjYyNzZDMTIuNTgxMSA5LjY2NTI4IDEyLjYzMzUgOS42NTM0NyAxMi42OCA5LjYyODU2QzEyLjcyNjUgOS42MDM2NiAxMi43NjU0IDkuNTY2NjEgMTIuNzkyNSA5LjUyMTM2QzEyLjgxOTYgOS40NzYxIDEyLjgzNCA5LjQyNDM0IDEyLjgzNCA5LjM3MTU4VjQuNTkwNThDMTIuODM0IDQuNTM5MjYgMTIuODIwNSA0LjQ4ODg1IDEyLjc5NDggNC40NDQ0M0MxMi43NjkxIDQuNDAwMDEgMTIuNzMyMSA0LjM2MzE1IDEyLjY4NzYgNC4zMzc1OUMxMi42NDMxIDQuMzEyMDMgMTIuNTkyNiA0LjI5ODY2IDEyLjU0MTMgNC4yOTg4M0MxMi40OSA0LjI5OSAxMi40Mzk2IDQuMzEyNzIgMTIuMzk1MyA0LjMzODU4TDkuMzMzOTggNi4xMjQ3NVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgMy41SDIuMzMyNjhDMS42ODgzNSAzLjUgMS4xNjYwMiA0LjAyMjMzIDEuMTY2MDIgNC42NjY2N1Y5LjMzMzMzQzEuMTY2MDIgOS45Nzc2NyAxLjY4ODM1IDEwLjUgMi4zMzI2OCAxMC41SDguMTY2MDJDOC44MTAzNSAxMC41IDkuMzMyNjggOS45Nzc2NyA5LjMzMjY4IDkuMzMzMzNWNC42NjY2N0M5LjMzMjY4IDQuMDIyMzMgOC44MTAzNSAzLjUgOC4xNjYwMiAzLjVaXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGVcIj5WaWRlbyBMaWJyYXJ5PC9zcGFuPlxuICAgICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBpbmxpbmVTdHlsZXM9XCJtaW4td2lkdGg6IG1heC1jb250ZW50O1wiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFREU5RkVcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCIjNkQyOEQ5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInZpZGVvVXJscy5sZW5ndGggKyAnIGNsaXAnICsgKHZpZGVvVXJscy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJylcIj5cbiAgICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc1ZpZGVvRnVsbE1vZGUgPyAnUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ0VhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZSdcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj57eyBpc1ZpZGVvRnVsbE1vZGUgPyAnwrcgUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ8K3IEVhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZScgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIlNob3cgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0Z1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIkV4aXQgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uRXhpdEZ1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2NvbGxhcHNlXCIgKGNsaWNrKT1cInRvZ2dsZVZpZGVvTGlicmFyeUNvbGxhcHNlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/ICdTaG93IHZpZGVvIGxpYnJhcnknIDogJ0hpZGUgdmlkZW8gbGlicmFyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41TDYgNC41TDkgNy41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDcuNUw5IDQuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvZHkgKGNhcmRzKSDigJQgbWF4LWhlaWdodCBhbmltYXRlcyBmcm9tIDAgKGNvbGxhcHNlZCkgdG8gYSBmaXhlZCBoZWlnaHQgKG9wZW4pLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2JvZHlcIlxuICAgICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5X19ib2R5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwcy1yb3dcIlxuICAgICAgICAgICAgICAgI2NsaXBzU2Nyb2xsZXJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwcy1yb3ctLWRyYWdnaW5nXT1cImNsaXBzRHJhZ0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xpcHNNb3VzZURvd24oJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2xpcHNNb3VzZU1vdmUoJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2V1cCk9XCJvbkNsaXBzTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2xpcHNNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVybCBvZiB2aWRlb1VybHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrTGlicmFyeUNsaXBCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1jYXJkLS1wbGF5aW5nXT1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC10aHVtYi0tcmVhZHldPVwibGlicmFyeVZpZGVvRHVyYXRpb25zLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpYnJhcnlDbGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjY2xpcFZpZGVvXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtdGh1bWJfX3ZpZGVvXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgbXV0ZWRcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiXG4gICAgICAgICAgICAgICAgICAoZHVyYXRpb25jaGFuZ2UpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIj48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19vdmVybGF5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fcGxheS1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiEoaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjc1TDExLjM3NSA3TDMuNSAxMi4yNVYxLjc1WlwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLXBsYXlpbmdcIj5QTEFZSU5HPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3VmlkZW9JbmRleGVzLmhhcyhpKSAmJiBpICE9PSBjdXJyZW50VmlkZW9JbmRleFwiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLW5ld1wiPk5FVzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsaXAtdGh1bWJfX2R1cmF0aW9uXCI+e3sgZm9ybWF0VGltZShsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuZ2V0KGkpIHx8IDApIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFfX3RpdGxlXCI+Q2xpcCB7eyBpICsgMSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1kb3dubG9hZC1idG4tLWRvd25sb2FkaW5nXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2xpcChpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWdtYSBpY29uOiB1cHdhcmQgYXJyb3cgd2l0aCBhIHNob3J0IHRyYXkgbGluZSBhdCB0aGUgYm90dG9tIChzaGFyZS9leHBvcnQgZ2x5cGgpLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgOC41VjJNNiAyTDMgNU02IDJMOSA1TTMgMTAuNUg5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0bl9fcmluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA3IDcpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG93bmxvYWRQcm9ncmVzcy5nZXQoaSkgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lICYmICEoc2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDApfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICghaXNMaXZlIHx8IGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJylcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKGdsb2JhbEN1cnJlbnRUaW1lTXMgLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwMTtcIj5cbiAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgICAgICBbc2VnbWVudHNdPVwic3BlZWRTZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRTcGVlZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRhaW5lckJnQ29sb3JdPVwiJyNGMEYwRjEnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TcGVlZENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRpbWVsaW5lQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgKGlzVmlkZW9GdWxsTW9kZSA/IGZ1bGxWaWRlb01hcmtlcnMgOiBjdXJyZW50VmlkZW9NYXJrZXJzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcikgOiBnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC0xLzIgY3FhLXctMyBjcWEtaC0zIGNxYS1iZy1ibHVlLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDYwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItMlwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiAhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHNjcmVlbnNob3ROb0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tYXgtaC1baW5oZXJpdF0nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1tYXgtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
2506
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBK2U3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEvZXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdB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QXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU1HLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFLSCxVQUFVO3NCQURiLFNBQVM7dUJBQUMsU0FBUztnQkFxQmhCLGNBQWM7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFhdkMsd0JBQXdCO3NCQUQzQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkE2QzFCLFVBQVU7c0JBQXBDLFlBQVk7dUJBQUMsV0FBVztnQkFDRyxnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTtnQkFxWDFCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZ2V0RW1wdHlTdGF0ZVByZXNldCB9IGZyb20gJy4uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLXByZXNldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBGYXN0Rm9yd2FyZENvbmZpZyB7XG4gIGZyb21TdGVwOiBudW1iZXI7XG4gIHRvU3RlcDogbnVtYmVyO1xuICBjdXJyZW50U3RlcDogbnVtYmVyO1xuICB0b3RhbFN0ZXBzOiBudW1iZXI7XG4gIHRhcmdldFN0ZXBOdW1iZXI6IHN0cmluZztcbiAgdGFyZ2V0U3RlcExhYmVsOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTWFya2VyIHtcbiAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBudW1iZXI7XG4gIHJlc3VsdDogJ1NVQ0NFU1MnIHwgJ0ZBSUxVUkUnIHwgJ0FCT1JURUQnIHwgJ1NLSVBQRUQnO1xuICB0ZXN0U3RlcElkPzogbnVtYmVyO1xuICBsZXZlbD86IG51bWJlcjtcbiAgY2hpbGRTdGVwcz86IFN0ZXBNYXJrZXJbXTtcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRUeXBlID0gJ3NjcmVlbnNob3RzJyB8ICd2aWRlbycgfCAndHJhY2UnO1xuXG50eXBlIFNlZ21lbnRPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG59O1xuaW50ZXJmYWNlIERldmljZUZyYW1lQ29uZmlnIHtcbiAgbW9ja3VwSW1hZ2U6IHN0cmluZztcbiAgc2NyZWVuSW5zZXQ6IHtcbiAgICB0b3A6IHN0cmluZztcbiAgICByaWdodDogc3RyaW5nO1xuICAgIGJvdHRvbTogc3RyaW5nO1xuICAgIGxlZnQ6IHN0cmluZztcbiAgfTtcbiAgYm9yZGVyUmFkaXVzOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zaW11bGF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vc2ltdWxhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXVxufSlcblxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSB2aWRlb1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHZpZGVvVXJsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdmlkZW9DdXJyZW50RHVyYXRpb246IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHN0ZXBNYXJrZXJzOiBTdGVwTWFya2VyW10gPSBbXTtcbiAgQElucHV0KCkgc2NyZWVuU2hvdFVybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRyYWNlVmlld1VybDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtTmFtZTogc3RyaW5nID0gJ1dlYiAtIENocm9tZSc7XG4gIEBJbnB1dCgpIHBsYXRmb3JtVHlwZTogJ2Jyb3dzZXInIHwgJ2RldmljZScgPSAnYnJvd3Nlcic7XG4gIEBJbnB1dCgpIHBsYXRmb3JtOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGV2aWNlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsaXZlU3RhdHVzOiAnSW4gUHJvZ3Jlc3MnIHwgJ1BhdXNlZCcgfCAnQWJvcnRlZCcgfCAnRmFpbGVkJyB8ICdQYXNzZWQnIHwgJ0V4ZWN1dGlvbicgPSAnSW4gUHJvZ3Jlc3MnO1xuICBASW5wdXQoKSBsaXZlTG9hZGluZ0xhYmVsOiBzdHJpbmcgPSAnTG9hZGluZy4uLic7XG4gIEBJbnB1dCgpIGlzQ29udGVudFZpZGVvTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYWlsZWRTdGF0dXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgaXNWTkNTZXNzaW9uSW50cnVwcHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmlldzogU2VnbWVudFR5cGUgPSAndmlkZW8nO1xuICBASW5wdXQoKSBoaWRlVmlkZW9UYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYnJvd3NlclZpZXdQb3J0OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnJvd3NlckRldmljZTogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KCkgaXNGYXN0Rm9yd2FyZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmYXN0Rm9yd2FyZENvbmZpZzogRmFzdEZvcndhcmRDb25maWcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBzaG93VmlkZW9MaWJyYXJ5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dDYXB0dXJlVmlkZW86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNDYXB0dXJpbmdWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFdoZW4gYGlzTGl2ZWAgYW5kIGF0IGxlYXN0IG9uZSBjbGlwIGlzIHByZXNlbnQgaW4gYHZpZGVvVXJsc2AsIHRoZSBzaW11bGF0b3JcbiAgLy8gaGVhZGVyIHNob3dzIGEgTGl2ZS9DYXB0dXJlZCBzZWdtZW50IGNvbnRyb2wuIFBhcmVudCBjYW4gYWxzbyBkcml2ZSB0aGUgdmlld1xuICAvLyBpbXBlcmF0aXZlbHkgKGUuZy4gXCJXYXRjaCBOb3dcIiBidXR0b24gaW4gdGhlIGNhcHR1cmUgZGlhbG9nKSBieSBwdXNoaW5nIGFcbiAgLy8gbmV3IHZhbHVlIHRocm91Z2ggdGhpcyBpbnB1dC5cbiAgQElucHV0KCkgbGl2ZVNlc3Npb25WaWV3OiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gJ2xpdmUnO1xuXG4gIGdldCBmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGMgPSB0aGlzLmZhc3RGb3J3YXJkQ29uZmlnO1xuICAgIGlmICghYyB8fCAhYy50b3RhbFN0ZXBzKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCAoYy5jdXJyZW50U3RlcCAvIGMudG90YWxTdGVwcykgKiAxMDApO1xuICB9XG5cbiAgQE91dHB1dCgpIHZpZGVvVGltZVVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QbGF5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QYXVzZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1hcmtlckhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RlcE1hcmtlcj4oKTtcbiAgQE91dHB1dCgpIGlzVmlkZW9QbGF5aW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2FwdHVyZVZpZGVvUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbGl2ZVNlc3Npb25WaWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnbGl2ZScgfCAnY2FwdHVyZWQnPigpO1xuXG4gIHByaXZhdGUgX3ZwbGF5ZXI/OiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ZwbGF5ZXInKVxuICBzZXQgdnBsYXllclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikge1xuICAgICAgLy8gRWxlbWVudCBpcyBiZWluZyB1bm1vdW50ZWQgKGUuZy4gdXNlciB0b2dnbGVkIGZyb20gQ2FwdHVyZWQg4oaSIExpdmUgZHVyaW5nIGFcbiAgICAgIC8vIG1pZC1mbGlnaHQgc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwpLiBEcm9wIHRoZSBzdGFsZSByZWZlcmVuY2Ugc28gYW55XG4gICAgICAvLyBmb2xsb3ctdXAgYXR0ZW1wdCB0byBvcGVyYXRlIG9uIC5uYXRpdmVFbGVtZW50IHNob3J0LWNpcmN1aXRzIG91dCBjbGVhbmx5LlxuICAgICAgdGhpcy5fdnBsYXllciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl92cGxheWVyID0gcmVmO1xuICAgIHRoaXMub25WaWRlb0VsZW1lbnRSZWFkeSgpO1xuICB9XG5cbiAgZ2V0IHZwbGF5ZXIoKTogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZwbGF5ZXI7XG4gIH1cblxuICBwcml2YXRlIF90aW1lbGluZUJhcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3RpbWVsaW5lQmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCB0aW1lbGluZUJhclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl90aW1lbGluZUJhciA9IHJlZjtcbiAgfVxuXG4gIGdldCB0aW1lbGluZUJhcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lQmFyO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3BlZWRDb250cm9sQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnc3BlZWRDb250cm9sQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCBzcGVlZENvbnRyb2xDb250YWluZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHNwZWVkQ29udHJvbENvbnRhaW5lcigpOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NwZWVkQ29udHJvbENvbnRhaW5lcjtcbiAgfVxuXG4gIHByb2dyZXNzID0gMDtcbiAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgaXNQbGF5aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dQbGF5UGF1c2VPdmVybGF5OiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJY29uIHNob3duIGJ5IHRoZSBwbGF5L3BhdXNlIG92ZXJsYXkgZHVyaW5nIGl0cyA1MDBtcyBsaWZldGltZS4gUGlubmVkIGF0IGNsaWNrIHRpbWVcbiAgICogc28gdGhlIGljb24gZG9lc24ndCBmbGlja2VyIGFzIGBpc1BsYXlpbmdgIGZsaXBzIGFzeW5jIGJldHdlZW5cbiAgICogYDx2aWRlbz4ucGxheSgpYCBpbnZvY2F0aW9uIGFuZCBpdHMgcHJvbWlzZSByZXNvbHZpbmcuIE1pcnJvcnMgdGhlIFlvdVR1YmUtc3R5bGVcbiAgICogY29udmVudGlvbjogc2hvdyB0aGUgYWN0aW9uIGp1c3QgdGFrZW4gKOKWtiBhZnRlciBwbGF5LCDiiKUgYWZ0ZXIgcGF1c2UpLlxuICAgKi9cbiAgb3ZlcmxheVNob3dzUGxheWluZ0ljb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIC8vIFZpZGVvLW9uLWRlbWFuZCAoVmlkZW8gTGlicmFyeSkgc3RhdGUg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaXMgYHZpZGVvVXJsc2AuXG4gIC8vIGBuZXdWaWRlb0luZGV4ZXNgIG1hcmtzIHdoaWNoIGluZGV4ZXMgd2VyZSBqdXN0IGNhcHR1cmVkIChzbyB3ZSBjYW4gc2hvdyB0aGVcbiAgLy8gTkVXIGJhZGdlIHVudGlsIHRoYXQgY2xpcCBpcyBzZWxlY3RlZCk7IGBsaWJyYXJ5VmlkZW9EdXJhdGlvbnNgIGNhY2hlcyB0aGVcbiAgLy8gbWV0YWRhdGEtbG9hZGVkIGR1cmF0aW9uIHBlciBpbmRleCBmb3IgZWFjaCBsaWJyYXJ5IGNhcmQncyB0aHVtYm5haWwuXG4gIGlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgbmV3VmlkZW9JbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsaWJyYXJ5VmlkZW9EdXJhdGlvbnM6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBkb3dubG9hZGluZ0luZGV4ZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGRvd25sb2FkUHJvZ3Jlc3M6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyAwLTEwMCBwZXIgY2xpcCBpbmRleFxuICBAVmlld0NoaWxkcmVuKCdjbGlwVmlkZW8nKSBjbGlwVmlkZW9zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdjbGlwc1Njcm9sbGVyJykgY2xpcHNTY3JvbGxlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhc3RMaWJyYXJ5U3luY0tleTogc3RyaW5nID0gJyc7XG4gIC8vIFRyYWNrcyB3aGljaCBjbGlwIGluZGV4IHRoZSBsaWJyYXJ5IHJvdyB3YXMgbGFzdCBhdXRvLXNjcm9sbGVkIHRvLCBzbyB0aGVcbiAgLy8gdGltZXVwZGF0ZSBoYW5kbGVyIGRvZXNuJ3QgcmUtdHJpZ2dlciBhIHNjcm9sbCBldmVyeSBmcmFtZS5cbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsZWRDbGlwSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIEF1dG8tcmVjb3Zlcnk6IHdoZW4gdGhlIDx2aWRlbz4gZmlyZXMgYW4gZXJyb3IgZXZlbnQgKGUuZy4gQ2hyb21lJ3NcbiAgLy8gXCJQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyXCIgYWZ0ZXIgYSBuZXR3b3JrIGdsaXRjaCksIHdlIGZsaXBcbiAgLy8gdGhpcyBmbGFnIHRvIHVubW91bnQgdGhlIDx2aWRlbz4gdmlhICpuZ0lmLCB0aGVuIGZsaXAgaXQgYmFjayBzbyBBbmd1bGFyXG4gIC8vIHJlbW91bnRzIGEgZnJlc2ggZWxlbWVudCDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlXG4gIC8vIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kIHJlY292ZXIgcGxheWJhY2sgdG9kYXkuXG4gIHZpZGVvUmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVNlZWtTZWM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVBsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRUNPVkVSWV9BVFRFTVBUUyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFJFQ09WRVJZX1dJTkRPV19NUyA9IDEwXzAwMDtcblxuICAvLyBQaGFzZSAyIOKAlCBcIlNob3cgRnVsbCBWaWRlb1wiIG1vZGUuIFdoZW4gdHJ1ZSwgdGhlIG1haW4gdGltZWxpbmUgc3BhbnMgdGhlIHRvdGFsXG4gIC8vIGR1cmF0aW9uIGFjcm9zcyBhbGwgY2xpcHMgYW5kIHN0ZXAgbWFya2VycyBmcm9tIGV2ZXJ5IGNsaXAgYXJlIGxhaWQgb3V0IG9uIGl0LlxuICAvLyBDbGlwLXRvLWNsaXAgdHJhbnNpdGlvbnMgaGFwcGVuIHVuZGVyIHRoZSBob29kIHZpYSB0aGUgZXhpc3Rpbmcgb25WaWRlb0VuZGVkXG4gIC8vIGF1dG8tYWR2YW5jZSBwYXRoIOKAlCB0aGUgdXNlciBkb2Vzbid0IHNlZSBhIHJlc2V0LlxuICBpc1ZpZGVvRnVsbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmVseSBkcmFnZ2luZy5cbiAgLy8gTmVlZGVkIGJlY2F1c2UgYHByb2dyZXNzYCBpcyBwZXItY3VycmVudC1jbGlwIGFuZCB3b3VsZCBnaXZlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgZ2xvYmFsRHJhZ1Byb2dyZXNzOiBudW1iZXIgPSAwO1xuXG4gIC8vIERyYWctdG8tc2Nyb2xsIHN0YXRlIGZvciB0aGUgY2xpcHMgcm93IChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKS5cbiAgcHJpdmF0ZSBjbGlwc0RyYWdTdGF0ZSA9IHsgZHJhZ2dpbmc6IGZhbHNlLCBzdGFydFg6IDAsIHN0YXJ0U2Nyb2xsTGVmdDogMCwgZGlkTW92ZTogZmFsc2UgfTtcbiAgY2xpcHNEcmFnQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSgpOiAnYnJvd3NlcicgfCAnZGV2aWNlJyB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykgcmV0dXJuICdkZXZpY2UnO1xuICAgIGlmICh0aGlzLnJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCkpIHJldHVybiAnZGV2aWNlJztcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlLlxuICAgKlxuICAgKiBEZWNpc2lvbiBpcyBiYXNlZCBvbiB0aGUgdmlkZW8gZWxlbWVudCdzIG5hdGl2ZSBgcGF1c2VkYCBwcm9wZXJ0eSAoZ3JvdW5kIHRydXRoKVxuICAgKiByYXRoZXIgdGhhbiBvbiBgcGxheWVyU3RhdGVgLCB3aGljaCBsYWdzIGR1cmluZyBhc3luYyBwbGF5KCkgLyBwYXVzZSgpIHRyYW5zaXRpb25zLlxuICAgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gd291bGQsIG9uIGEgcmFwaWQgc2Vjb25kIGNsaWNrIGR1cmluZyB0aGUgfjUwLTIwMG1zXG4gICAqIGB2aWRlby5wbGF5KClgIGF3YWl0IHdpbmRvdywgc2VlIGBwbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnYCBhbmQgcXVldWUgYW5vdGhlclxuICAgKiBgcGxheVZpZGVvKClgIGluc3RlYWQgb2YgdGhlIGludGVuZGVkIGBwYXVzZVZpZGVvKClgIOKAlCBzbyB0aGUgc2Vjb25kIGNsaWNrXG4gICAqIHNpbGVudGx5IFwiZGlkIG5vdGhpbmdcIiB3aGlsZSB0aGUgdmlkZW8ga2VwdCBwbGF5aW5nLiBSZWFkaW5nIGB2aWRlby5wYXVzZWRgXG4gICAqIGRpcmVjdGx5IG1ha2VzIHRoZSB0b2dnbGUgY29ycmVjdCByZWdhcmRsZXNzIG9mIHdoYXQgc3RhZ2UgdGhlIHN0YXRlIG1hY2hpbmVcbiAgICogaGFwcGVucyB0byBiZSBpbi5cbiAgICovXG4gIHRvZ2dsZVBsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnLCB7XG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdmFsaWQgc291cmNlXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRWaWRlb1VybCB8fCB2aWRlby5uZXR3b3JrU3RhdGUgPT09IEhUTUxNZWRpYUVsZW1lbnQuTkVUV09SS19OT19TT1VSQ0UgfHwgdmlkZW8uZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IG5vIHZhbGlkIHNvdXJjZScsIHtcbiAgICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgICAgbmV0d29ya1N0YXRlOiB2aWRlby5uZXR3b3JrU3RhdGUsXG4gICAgICAgIGVycm9yOiB2aWRlby5lcnJvclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXJyb3Igc3RhdGUgc28gdGhlIG5leHQgcGxheSBhdHRlbXB0IGNhbiBwcm9jZWVkLlxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHBsYXllciBpbiBlcnJvciBzdGF0ZScsIHsgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSB9KTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgdmlkZW9QYXVzZWQ6IHZpZGVvLnBhdXNlZCxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIEdyb3VuZCB0cnV0aDogaWYgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGF1c2VkIChvciBoYXNuJ3Qgc3RhcnRlZCB5ZXQpLCBwbGF5OyBlbHNlIHBhdXNlLlxuICAgIC8vIFRoZSBvcGVyYXRpb24gcXVldWUgc2VyaWFsaXplcyB0aGVzZSBzbyBiYWNrLXRvLWJhY2sgY2xpY2tzIHJlc29sdmUgaW4gb3JkZXIuXG4gICAgaWYgKHZpZGVvLnBhdXNlZCkge1xuICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gIFNIT1cgUExBWSBQQVVTRSBPVkVSTEFZXG4gIG9uVmlkZW9GcmFtZUNsaWNrKCk6IHZvaWQge1xuICAgIC8vIFBpbiB0aGUgb3ZlcmxheSBpY29uIHRvIHRoZSB1c2VyJ3MgSU5URU5UIGZvciB0aGlzIGNsaWNrICh0aGUgYWN0aW9uIGp1c3QgdGFrZW4pLFxuICAgIC8vIGluZGVwZW5kZW50IG9mIGhvdyB0aGUgYXN5bmMgcGxheS9wYXVzZSByZXNvbHZlcy4gUHJldmVudHMgZmxpY2tlciB3aGVyZSB0aGUgaWNvblxuICAgIC8vIGJyaWVmbHkgc2hvd3MgdGhlIHByZS1jbGljayBzdGF0ZSBiZWZvcmUgZmxpcHBpbmcgd2hlbiBgaXNQbGF5aW5nYCB1cGRhdGVzLlxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHdhc1BhdXNlZCA9IHZpZGVvID8gdmlkZW8ucGF1c2VkIDogIXRoaXMuaXNQbGF5aW5nO1xuICAgIC8vIFlvdVR1YmUgY29udmVudGlvbjogYWZ0ZXIgY2xpY2tpbmcgdG8gUExBWSwgc2hvdyDilrYgKFwianVzdCBwbGF5ZWRcIik7IGFmdGVyIFBBVVNFLFxuICAgIC8vIHNob3cg4oilLiBUZW1wbGF0ZSBicmFuY2hlcyBvbiBgb3ZlcmxheVNob3dzUGxheWluZ0ljb25gIHNvIGl0IHN0YXlzIHN0YWJsZSBmb3JcbiAgICAvLyB0aGUgZW50aXJlIDUwMG1zIG92ZXJsYXkgbGlmZXRpbWUuXG4gICAgdGhpcy5vdmVybGF5U2hvd3NQbGF5aW5nSWNvbiA9IHdhc1BhdXNlZDtcblxuICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSB0cnVlO1xuICAgIGlmICh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucGxheVBhdXNlT3ZlcmxheVRpbWVyKTtcbiAgICB0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93UGxheVBhdXNlT3ZlcmxheSA9IGZhbHNlO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGxheVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBlbGltaW5hdGVzIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwbGF5VmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IHBsYXlpbmcgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBsYXlpbmcsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBzdGFydGluZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3IgdmlkZW8gdG8gYmUgcmVhZHkgaWYgbmVlZGVkXG4gICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogd2FpdGluZyBmb3IgbWV0YWRhdGEnKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nICYmIHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSAwID8gMCA6ICh0aGlzLnNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxXSA/PyAwKTtcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIHYuY3VycmVudFRpbWUgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpLlxuICAgKlxuICAgKiAgTWVyZ2VzIHR3byBpbmRlcGVuZGVudCBwcm9iZXM6IGBkZXRlY3RlZFZpZGVvRHVyYXRpb25zYCAob2ZmLURPTSB0ZW1wIHZpZGVvcylcbiAgICogIGFuZCBgbGlicmFyeVZpZGVvRHVyYXRpb25zYCAodGhlIHJlbmRlcmVkIGxpYnJhcnkgdGh1bWJuYWlscykuIEVpdGhlciBjYW5cbiAgICogIHJlc29sdmUgZmlyc3QgZGVwZW5kaW5nIG9uIGJyb3dzZXIgcXVpcmtzIHdpdGggV2ViTS9JbmZpbml0eS1kdXJhdGlvbiBjbGlwcztcbiAgICogIHdlIHRha2UgdGhlIGZpcnN0IGZpbml0ZSB2YWx1ZSBwZXIgaW5kZXguICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgY29uc3QgdXJscyA9IHRoaXMudmlkZW9VcmxzIHx8IFtdO1xuICAgICAgaWYgKHVybHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICBjb25zdCBtZXJnZWQ6IG51bWJlcltdID0gbmV3IEFycmF5KHVybHMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkZXRlY3RlZCA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXRlY3RlZCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZGV0ZWN0ZWQpICYmIGRldGVjdGVkID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGRldGVjdGVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyb21MaWJyYXJ5UyA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tTGlicmFyeVMgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGZyb21MaWJyYXJ5UykgJiYgZnJvbUxpYnJhcnlTID4gMCkge1xuICAgICAgICAgIG1lcmdlZFtpXSA9IGZyb21MaWJyYXJ5UyAqIDEwMDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5rbm93biB5ZXQg4oCUIGxlYXZlIHRoZSBzbG90IGFzIGEgaG9sZSBzbyBjYWxsZXJzIGNhbiBkZXRlY3QgcGFydGlhbCBzdGF0ZS5cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh2aWRlbz8uZHVyYXRpb24gJiYgaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gW3ZpZGVvLmR1cmF0aW9uICogMTAwMF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgbGV0IG1hcmtlcnNUb1Byb2Nlc3M6IFN0ZXBNYXJrZXJbXTtcbiAgICBcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gYm91bmRhcmllcy5sZW5ndGgpIHtcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSBib3VuZGFyaWVzW3RoaXMuY3VycmVudFZpZGVvSW5kZXhdO1xuICAgICAgICBcbiAgICAgICAgbWFya2Vyc1RvUHJvY2VzcyA9IHRoaXMuc3RlcE1hcmtlcnNcbiAgICAgICAgICAuZmlsdGVyKG1hcmtlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSBjdXJyZW50Qm91bmRhcnkuc3RhcnQgJiYgXG4gICAgICAgICAgICAgICAgICAgbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbiA8IGN1cnJlbnRCb3VuZGFyeS5lbmQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAubWFwKG1hcmtlciA9PiB0aGlzLmFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihcbiAgICAgICAgICAgIG1hcmtlciwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuc3RhcnQsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5lbmRcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnMobWFya2Vyc1RvUHJvY2Vzcyk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdENoaWxkU3RlcHNEdXJhdGlvbihtYXJrZXI6IFN0ZXBNYXJrZXIsIGFkanVzdG1lbnQ6IG51bWJlciwgdmlkZW9TdGFydDogbnVtYmVyLCB2aWRlb0VuZDogbnVtYmVyKTogU3RlcE1hcmtlciB7XG4gICAgY29uc3QgYWRqdXN0ZWRNYXJrZXI6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAuLi5tYXJrZXIsXG4gICAgICBjdW11bGF0aXZlRHVyYXRpb246IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gLSBhZGp1c3RtZW50XG4gICAgfTtcbiAgICBcbiAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgYWRqdXN0ZWRNYXJrZXIuY2hpbGRTdGVwcyA9IG1hcmtlci5jaGlsZFN0ZXBzXG4gICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgIC5tYXAoY2hpbGQgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2hpbGQ6IFN0ZXBNYXJrZXIgPSB7XG4gICAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogY2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNoaWxkLmNoaWxkU3RlcHMgJiYgY2hpbGQuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGp1c3RlZENoaWxkLmNoaWxkU3RlcHMgPSBjaGlsZC5jaGlsZFN0ZXBzXG4gICAgICAgICAgICAgIC5maWx0ZXIobmVzdGVkQ2hpbGQgPT4gbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uID49IHZpZGVvU3RhcnQgJiYgbmVzdGVkQ2hpbGQuY3VtdWxhdGl2ZUR1cmF0aW9uIDwgdmlkZW9FbmQpXG4gICAgICAgICAgICAgIC5tYXAobmVzdGVkQ2hpbGQgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obmVzdGVkQ2hpbGQsIGFkanVzdG1lbnQsIHZpZGVvU3RhcnQsIHZpZGVvRW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhZGp1c3RlZENoaWxkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGFkanVzdGVkTWFya2VyO1xuICB9XG5cbiAgZ2V0U3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gZHVyYXRpb25NcykgKiAxMDA7XG4gIH1cblxuICAvKiogRnVsbC12aWRlbyBtYXJrZXJzOiBldmVyeSBtYXJrZXIsIGZsYXR0ZW5lZCwgbGFpZCBvdXQgb24gdGhlIGdsb2JhbCB0aW1lbGluZS5cbiAgICogYHN0ZXBNYXJrZXJzYCBpcyBhbHJlYWR5IGluIGdsb2JhbCBjb29yZGluYXRlcyDigJQgYGN1cnJlbnRWaWRlb01hcmtlcnNgIGRvZXMgdGhlXG4gICAqIGludmVyc2UgKGZpbHRlcnMgKyBhZGp1c3RzIHBlci1jbGlwKTsgaGVyZSB3ZSBqdXN0IGZsYXR0ZW4gdGhlIG9yaWdpbmFsIGxpc3QuICovXG4gIGdldCBmdWxsVmlkZW9NYXJrZXJzKCk6IFN0ZXBNYXJrZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2VycyB8fCBbXSk7XG4gIH1cblxuICBnZXRHbG9iYWxGdWxsU3RlcExlZnRQb3NpdGlvbihzdGVwOiBTdGVwTWFya2VyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoc3RlcC5jdW11bGF0aXZlRHVyYXRpb24gLyB0b3RhbCkgKiAxMDApKTtcbiAgfVxuXG4gIC8qKiBDdW11bGF0aXZlIGVsYXBzZWQgbXMgb24gdGhlIGdsb2JhbCB0aW1lbGluZSAocHJpb3IgY2xpcCBkdXJhdGlvbnMgKyBjdXJyZW50IGxvY2FsIHRpbWUpLiAqL1xuICBnZXQgZ2xvYmFsQ3VycmVudFRpbWVNcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGxvY2FsID0gKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgPz8gMCkgKiAxMDAwO1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgIGNvbnN0IHByaW9yRW5kID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDAgPyAoYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCkgOiAwO1xuICAgIHJldHVybiBwcmlvckVuZCArIGxvY2FsO1xuICB9XG5cbiAgLyoqIDAtMTAwIHBvc2l0aW9uIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUsIGRyaXZlbiBieSB0aW1ldXBkYXRlLiAqL1xuICBnZXQgZ2xvYmFsUHJvZ3Jlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAoIXRvdGFsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZU1zIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogV2hpbGUgZHJhZ2dpbmcgaW4gZnVsbCBtb2RlLCB0aGUgc2NydWJiZXIgcmVhZHMgdGhlIG92ZXJyaWRlOyBvdGhlcndpc2UgZ2xvYmFsUHJvZ3Jlc3MuICovXG4gIGdldCBnbG9iYWxTY3J1YmJlclBlcmNlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZyA/IHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIDogdGhpcy5nbG9iYWxQcm9ncmVzcztcbiAgfVxuXG4gIGdldFN0ZXBDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RlcC5sZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjNjM2NkYxJztcbiAgfVxuXG4gIGdldFN0ZXBSZXN1bHRDb2xvcihzdGVwOiBTdGVwTWFya2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihzdGVwLnJlc3VsdCk7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJDb2xvcihsZXZlbD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyNGRkE1MDAnO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IocmVzdWx0OiBTdGVwTWFya2VyWydyZXN1bHQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgJ1NVQ0NFU1MnOlxuICAgICAgICByZXR1cm4gJyMxMkI3NkEnO1xuICAgICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICAgIHJldHVybiAnI0I5MUMxQyc7XG4gICAgICBjYXNlICdBQk9SVEVEJzpcbiAgICAgICAgcmV0dXJuICcjRjc5MDA5JztcbiAgICAgIGNhc2UgJ1NLSVBQRUQnOlxuICAgICAgICByZXR1cm4gJyM2NjcwODUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcjNjM2NkYxJztcbiAgICB9XG4gIH1cblxuICBvbk1hcmtlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBtYXJrZXI6IFN0ZXBNYXJrZXIpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0VGltZU1zID0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIGlmIChtYXJrZXIudGVzdFN0ZXBJZCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDEpKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gcGVyY2VudCAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMjApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IHBlcmNlbnQgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVGltZWxpbmVDbGljaycsIHtcbiAgICAgIHBlcmNlbnQsXG4gICAgICB0YXJnZXRUaW1lTXMsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgcGxheWluZyBzdGF0ZSBCRUZPUkUgcGF1c2luZ1xuICAgIC8vIFVzZSBib3RoIGlzUGxheWluZyBmbGFnIGFuZCBwbGF5ZXJTdGF0ZSBmb3IgcmVsaWFiaWxpdHlcbiAgICB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnID0gdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdGFydERyYWcnLCB7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBkdXJpbmcgZHJhZyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwOyAvLyBQZXItY2xpcCB0aW1lbGluZSBwb3NpdGlvblxuICAgIH1cbiAgfVxuXG4gIHN0b3BEcmFnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuXG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IGRyYWcgZW5kZWQnLCB7XG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzcyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZzogc2hvdWxkUmVzdW1lUGxheWluZyxcbiAgICAgIGN1cnJlbnRQbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgIGlmICghdG90YWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhcmdldEdsb2JhbE1zID0gKHRoaXMuZ2xvYmFsRHJhZ1Byb2dyZXNzIC8gMTAwKSAqIHRvdGFsO1xuICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vlayh0YXJnZXRHbG9iYWxNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybjtcblxuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9ICh0aGlzLnByb2dyZXNzIC8gMTAwKSAqIHZpZGVvLmR1cmF0aW9uICogMTAwMDtcblxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIHNlZWsnLCB7XG4gICAgICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBsb25nZXIgdG8gZW5zdXJlIHNlZWsgaXMgZnVsbHkgY29tcGxldGVcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHN0YXRlIGlzICdwYXVzZWQnIGFmdGVyIHNlZWsgKHNlZWtUb1RpbWVJbnRlcm5hbCBzZXRzIGl0IHRvICdwYXVzZWQnKVxuICAgICAgICAvLyBJZiBzdGF0ZSBpcyBzdGlsbCAnc2Vla2luZycsIHdhaXQgYSBiaXQgbW9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBzZWVrIHN0aWxsIGluIHByb2dyZXNzLCB3YWl0aW5nIG1vcmUnKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vdyByZXN1bWUgcGxheWJhY2sgKHN0YXRlIHNob3VsZCBiZSAncGF1c2VkJyBhdCB0aGlzIHBvaW50KVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBwbGF5YmFjayByZXN1bWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3RvcERyYWc6IHVuZXhwZWN0ZWQgc3RhdGUgYWZ0ZXIgc2VlaywgYXR0ZW1wdGluZyB0byByZXN1bWUgYW55d2F5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzdW1lIGFueXdheSAtIGJldHRlciB0byB0cnkgdGhhbiB0byBsZWF2ZSBpdCBzdHVja1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB2aWRlbyB3YXMgcGF1c2VkLCBub3QgcmVzdW1pbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCcpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cbiAgXG4gIG9uVmlkZW9DYW5QbGF5KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvQ2FuUGxheScpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG5cbiAgICAvLyBDb25zdW1lIGFueSBwZW5kaW5nIHJlY292ZXJ5IHN0YXRlIHF1ZXVlZCBieSBvblZpZGVvRXJyb3IoKTogc2VlayBiYWNrIHRvXG4gICAgLy8gd2hlcmUgcGxheWJhY2sgZXJyb3JlZCBhbmQgYXV0by1yZXN1bWUgaWYgd2Ugd2VyZSBwbGF5aW5nIGF0IHRoZSB0aW1lLlxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2Vla1NlYyA9IHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYztcbiAgICAgIGNvbnN0IHNob3VsZFBsYXkgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXk7XG4gICAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5ID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlYywgdmlkZW8uZHVyYXRpb24pKTtcbiAgICAgICAgfSBjYXRjaCAoXykgeyAvKiBlbGVtZW50IG1heSBub3QgYmUgc2Vla2FibGUgeWV0OyBoYXJtbGVzcyAqLyB9XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA4MCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIE5hdGl2ZSBlcnJvci1ldmVudCBoYW5kbGVyIGZvciB0aGUgbWFpbiA8dmlkZW8+IGVsZW1lbnQuIFRoZSBDaHJvbWUgbWVkaWFcbiAgICogc3RhY2sgb2NjYXNpb25hbGx5IHRocm93cyBcIlBpcGVsaW5lU3RhdHVzOjpQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyOlxuICAgKiBkYXRhIHNvdXJjZSBlcnJvclwiIGR1cmluZyBwbGF5YmFjayBhZnRlciBhIGJyaWVmIG5ldHdvcmsgYmxpcCBvciBhIGJ1cnN0IG9mXG4gICAqIGZhc3QgdXNlciBhY3Rpb25zOyBvbmNlIHRoYXQgaGFwcGVucyB0aGUgZWxlbWVudCBiZWNvbWVzIHVucmVzcG9uc2l2ZSB0b1xuICAgKiBwbGF5L3BhdXNlL3NlZWsuIFdlIHJlY292ZXIgYnkgdW5tb3VudGluZytyZW1vdW50aW5nIHRoZSA8dmlkZW8+IHZpYSAqbmdJZlxuICAgKiDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kXG4gICAqIHdvcmsgdG9kYXkg4oCUIHRoZW4gcmVzdG9yZSB0aGUgcHJlLWVycm9yIHBsYXloZWFkIGFuZCByZXN1bWUgcGxheWJhY2suICovXG4gIG9uVmlkZW9FcnJvcigpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlcnIgPSB2aWRlbz8uZXJyb3I7XG5cbiAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3Ig4oCUIHRyaWdnZXJpbmcgYXV0by1yZWNvdmVyeScsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgZXJyb3JDb2RlOiBlcnI/LmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycj8ubWVzc2FnZSxcbiAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8/Lm5ldHdvcmtTdGF0ZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvPy5yZWFkeVN0YXRlLFxuICAgICAgY3VycmVudFZpZGVvSW5kZXg6IHRoaXMuY3VycmVudFZpZGVvSW5kZXgsXG4gICAgICBjdXJyZW50VmlkZW9Vcmw6IHRoaXMuY3VycmVudFZpZGVvVXJsLFxuICAgICAgYXR0ZW1wdHM6IHRoaXMucmVjb3ZlcnlBdHRlbXB0c1xuICAgIH0pO1xuXG4gICAgLy8gQm91bmQgdGhlIHJldHJ5IGJ1ZGdldCB0byBhIHJvbGxpbmcgd2luZG93IHNvIGEgcGVyc2lzdGVudGx5IGJyb2tlblxuICAgIC8vIHNvdXJjZSAoNDA0LCB1bnN1cHBvcnRlZCBjb2RlYywg4oCmKSBkb2Vzbid0IGZsYXAgZm9yZXZlci5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID4gdGhpcy5SRUNPVkVSWV9XSU5ET1dfTVMpIHtcbiAgICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0ID0gbm93O1xuICAgIH1cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMrKztcbiAgICBpZiAodGhpcy5yZWNvdmVyeUF0dGVtcHRzID4gdGhpcy5NQVhfUkVDT1ZFUllfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIG9uVmlkZW9FcnJvcjogZXhjZWVkZWQgcmVjb3ZlcnkgYXR0ZW1wdHMsIGdpdmluZyB1cCcpO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIHdoYXQgd2UgbmVlZCB0byByZXN0b3JlIGFmdGVyIHRoZSByZW1vdW50LlxuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5U2Vla1NlYyA9ICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5jdXJyZW50VGltZSkpID8gdmlkZW8uY3VycmVudFRpbWUgOiAwO1xuICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IHRoaXMuaXNQbGF5aW5nO1xuXG4gICAgLy8gUHV0IHRoZSBzdGF0ZSBtYWNoaW5lIGludG8gJ2Vycm9yJyBzbyBvblZpZGVvRWxlbWVudFJlYWR5IHJlc2V0cyBpdFxuICAgIC8vIGJhY2sgdG8gJ2lkbGUnIHdoZW4gdGhlIHJlbW91bnRlZCBlbGVtZW50IGFycml2ZXMuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gVW5tb3VudCDihpIgcmVtb3VudC4gQnJpZWYgMTAwbXMgZ2FwIG1pcnJvcnMgdGhlIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZC5cbiAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZpZGVvUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uVmlkZW9FbmRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgLy8gU3dpdGNoIHRvIG5leHQgdmlkZW8gYW5kIGF1dG8tcGxheSBpdFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMTtcblxuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChuZXh0SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5jdXJyZW50VmlkZW9VcmwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSBudWxsO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgMTAwKSByZXR1cm47XG5cbiAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcbiAgICAgICAgY29uc3QgY3VycmVudE1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuXG4gICAgICAgIC8vIFNhZmV0eSBuZXQ6IGlmIGBpc1BsYXlpbmdgIGRyaWZ0ZWQgZnJvbSB0aGUgZWxlbWVudCdzIGFjdHVhbCBzdGF0ZVxuICAgICAgICAvLyAoZS5nLiBhIHF1ZXVlZCBvcCBzZXQgaXQgZmFsc2UgYnV0IHBsYXliYWNrIG5ldmVyIGFjdHVhbGx5IHN0b3BwZWQsXG4gICAgICAgIC8vIG9yIHRoZSBwbGF5IHByb21pc2UgaGFzbid0IHJlc29sdmVkIHlldCBidXQgYHBsYXlgIGZpcmVkKSwgcmVhbGlnblxuICAgICAgICAvLyBoZXJlIHNvIHRoZSB0b29sYmFyIFBsYXkvUGF1c2UgaWNvbiBkb2Vzbid0IGdldCBzdHVjayBvbiB0aGUgd3JvbmdcbiAgICAgICAgLy8gZ2x5cGggd2hpbGUgcGxheWJhY2sgY29udGludWVzLlxuICAgICAgICBjb25zdCB2aWRlb0lzUGxheWluZyA9ICF2aWRlby5wYXVzZWQ7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAhPT0gdmlkZW9Jc1BsYXlpbmcpIHtcbiAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IHZpZGVvSXNQbGF5aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdzd2l0Y2hpbmcnKSB7XG4gICAgICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1cnJlbnRNcyAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuXG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIHRoaXMubWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRoZSBsaWJyYXJ5IHJvdyBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBzdGF5cyB2aXNpYmxlLlxuICAgICAgICAgIC8vIE9ubHkgd2hpbGUgcGxheWluZzsgd2hlbiBwYXVzZWQgd2UgbGVhdmUgdGhlIHJvdyB3aGVyZSB0aGUgdXNlciBsZWZ0IGl0LlxuICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4O1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDdXJyZW50Q2xpcEludG9WaWV3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBNaXJyb3IgdGhlIDx2aWRlbz4gZWxlbWVudCdzIG5hdGl2ZSBzdGF0ZSBpbnRvIGBpc1BsYXlpbmdgLiBUaGUgZWxlbWVudFxuICAgICAgLy8gaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCDigJQgdGhlIGV4aXN0aW5nIHBsYXlWaWRlb0ludGVybmFsIC8gcGF1c2VWaWRlb0ludGVybmFsXG4gICAgICAvLyBwYXRocyBzZXQgYGlzUGxheWluZ2AgYWZ0ZXIgdGhlaXIgYXN5bmMgd29yaywgYnV0IG90aGVyIHBhdGhzIChlbGVtZW50XG4gICAgICAvLyByZW1vdW50cyB2aWEgb25WaWRlb0VsZW1lbnRSZWFkeSwgZHJvcHBlZCBxdWV1ZSBvcHMsIGV0Yy4pIGNhbiBsZWF2ZSBpdFxuICAgICAgLy8gb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5LiBUaGVzZSBsaXN0ZW5lcnMgbWFrZSB0aGUgZmllbGQgc2VsZi1jb3JyZWN0aW5nLlxuICAgICAgY29uc3Qgb25QbGF5ID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IHRydWU7IH07XG4gICAgICBjb25zdCBvblBhdXNlID0gKCkgPT4geyB0aGlzLmlzUGxheWluZyA9IGZhbHNlOyB9O1xuXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5Jywgb25QbGF5KTtcbiAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCBvblBsYXkpO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCBvblBsYXkpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgb25QbGF5KTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+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+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCA8c3BhbiBbaW5uZXJIVE1MXT1cImZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlkZW8gVmlldzogcG9zdC1leGVjdXRpb24gVmlkZW8gdGFiLCBvciBtaWQtc2Vzc2lvbiBDYXB0dXJlZCB2aWV3IGluc2lkZSBhIGxpdmUgc2Vzc2lvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgKCghaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nKSB8fCAoaXNMaXZlICYmIGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJykpXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTEwOHB4KV0nOiBzaG93VmlkZW9MaWJyYXJ5LCAnY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldJzogIXNob3dWaWRlb0xpYnJhcnl9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSWNvbiBwaW5uZWQgdG8gdGhlIGp1c3QtdGFrZW4gYWN0aW9uIChzZXQgaW4gb25WaWRlb0ZyYW1lQ2xpY2spIHNvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgZG9lc24ndCBmbGlja2VyIGFzIGBpc1BsYXlpbmdgIGZsaXBzIGFzeW5jIGJldHdlZW4gcGxheSgpIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIHByb21pc2UgcmVzb2x2aW5nLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm92ZXJsYXlTaG93c1BsYXlpbmdJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIW92ZXJsYXlTaG93c1BsYXlpbmdJY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBJY29uIHBpbm5lZCB0byB0aGUganVzdC10YWtlbiBhY3Rpb24gKHNldCBpbiBvblZpZGVvRnJhbWVDbGljaykgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgIGRvZXNuJ3QgZmxpY2tlciBhcyBgaXNQbGF5aW5nYCBmbGlwcyBhc3luYyBiZXR3ZWVuIHBsYXkoKSBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIHByb21pc2UgcmVzb2x2aW5nLiAtLT5cbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwib3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwzIDE5LDEyIDUsMjFcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhb3ZlcmxheVNob3dzUGxheWluZ0ljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8IS0tIFZpZGVvIExpYnJhcnkgUGFuZWwg4oCUIHJlc2VydmVzIG9ubHkgaGVhZGVyLWhlaWdodCBpbiBmbG93OyB0aGUgaW5uZXIgcGFuZWwgaXMgYWJzb2x1dGVseSBhbmNob3JlZCB0byBpdHMgYm90dG9tIGVkZ2UsIHNvIHRoZSBib2R5IGV4cGFuZGluZyBtYWtlcyB0aGUgcGFuZWwgZ3JvdyBVUFdBUkQgb3ZlciB0aGUgdmlkZW8uIFRpbWVsaW5lIHN0YXlzIHB1dC4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cInZpZGVvLWxpYnJhcnlcIlxuICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2lubmVyXCI+XG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBhbHdheXMgdmlzaWJsZSwgY2xpY2tpbmcgdGhlIGNoZXZyb24gdG9nZ2xlcyB0aGUgYm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2hlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlkZW8tbGlicmFyeV9faWNvblwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzOTggNy41ODMwOEwxMi4zODA3IDkuNjE0MjVDMTIuNDI0NyA5LjY0MzQ4IDEyLjQ3NTcgOS42NjAyNCAxMi41Mjg0IDkuNjYyNzZDMTIuNTgxMSA5LjY2NTI4IDEyLjYzMzUgOS42NTM0NyAxMi42OCA5LjYyODU2QzEyLjcyNjUgOS42MDM2NiAxMi43NjU0IDkuNTY2NjEgMTIuNzkyNSA5LjUyMTM2QzEyLjgxOTYgOS40NzYxIDEyLjgzNCA5LjQyNDM0IDEyLjgzNCA5LjM3MTU4VjQuNTkwNThDMTIuODM0IDQuNTM5MjYgMTIuODIwNSA0LjQ4ODg1IDEyLjc5NDggNC40NDQ0M0MxMi43NjkxIDQuNDAwMDEgMTIuNzMyMSA0LjM2MzE1IDEyLjY4NzYgNC4zMzc1OUMxMi42NDMxIDQuMzEyMDMgMTIuNTkyNiA0LjI5ODY2IDEyLjU0MTMgNC4yOTg4M0MxMi40OSA0LjI5OSAxMi40Mzk2IDQuMzEyNzIgMTIuMzk1MyA0LjMzODU4TDkuMzMzOTggNi4xMjQ3NVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgMy41SDIuMzMyNjhDMS42ODgzNSAzLjUgMS4xNjYwMiA0LjAyMjMzIDEuMTY2MDIgNC42NjY2N1Y5LjMzMzMzQzEuMTY2MDIgOS45Nzc2NyAxLjY4ODM1IDEwLjUgMi4zMzI2OCAxMC41SDguMTY2MDJDOC44MTAzNSAxMC41IDkuMzMyNjggOS45Nzc2NyA5LjMzMjY4IDkuMzMzMzNWNC42NjY2N0M5LjMzMjY4IDQuMDIyMzMgOC44MTAzNSAzLjUgOC4xNjYwMiAzLjVaXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGVcIj5WaWRlbyBMaWJyYXJ5PC9zcGFuPlxuICAgICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBpbmxpbmVTdHlsZXM9XCJtaW4td2lkdGg6IG1heC1jb250ZW50O1wiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFREU5RkVcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCIjNkQyOEQ5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInZpZGVvVXJscy5sZW5ndGggKyAnIGNsaXAnICsgKHZpZGVvVXJscy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJylcIj5cbiAgICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc1ZpZGVvRnVsbE1vZGUgPyAnUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ0VhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZSdcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj57eyBpc1ZpZGVvRnVsbE1vZGUgPyAnwrcgUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ8K3IEVhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZScgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIlNob3cgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0Z1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIkV4aXQgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uRXhpdEZ1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2NvbGxhcHNlXCIgKGNsaWNrKT1cInRvZ2dsZVZpZGVvTGlicmFyeUNvbGxhcHNlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/ICdTaG93IHZpZGVvIGxpYnJhcnknIDogJ0hpZGUgdmlkZW8gbGlicmFyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41TDYgNC41TDkgNy41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDcuNUw5IDQuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvZHkgKGNhcmRzKSDigJQgbWF4LWhlaWdodCBhbmltYXRlcyBmcm9tIDAgKGNvbGxhcHNlZCkgdG8gYSBmaXhlZCBoZWlnaHQgKG9wZW4pLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2JvZHlcIlxuICAgICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5X19ib2R5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwcy1yb3dcIlxuICAgICAgICAgICAgICAgI2NsaXBzU2Nyb2xsZXJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwcy1yb3ctLWRyYWdnaW5nXT1cImNsaXBzRHJhZ0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xpcHNNb3VzZURvd24oJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2xpcHNNb3VzZU1vdmUoJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2V1cCk9XCJvbkNsaXBzTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2xpcHNNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVybCBvZiB2aWRlb1VybHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrTGlicmFyeUNsaXBCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1jYXJkLS1wbGF5aW5nXT1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC10aHVtYi0tcmVhZHldPVwibGlicmFyeVZpZGVvRHVyYXRpb25zLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpYnJhcnlDbGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjY2xpcFZpZGVvXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtdGh1bWJfX3ZpZGVvXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgbXV0ZWRcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiXG4gICAgICAgICAgICAgICAgICAoZHVyYXRpb25jaGFuZ2UpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIj48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19vdmVybGF5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fcGxheS1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiEoaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjc1TDExLjM3NSA3TDMuNSAxMi4yNVYxLjc1WlwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLXBsYXlpbmdcIj5QTEFZSU5HPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3VmlkZW9JbmRleGVzLmhhcyhpKSAmJiBpICE9PSBjdXJyZW50VmlkZW9JbmRleFwiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLW5ld1wiPk5FVzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsaXAtdGh1bWJfX2R1cmF0aW9uXCI+e3sgZm9ybWF0VGltZShsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuZ2V0KGkpIHx8IDApIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFfX3RpdGxlXCI+Q2xpcCB7eyBpICsgMSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1kb3dubG9hZC1idG4tLWRvd25sb2FkaW5nXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2xpcChpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWdtYSBpY29uOiB1cHdhcmQgYXJyb3cgd2l0aCBhIHNob3J0IHRyYXkgbGluZSBhdCB0aGUgYm90dG9tIChzaGFyZS9leHBvcnQgZ2x5cGgpLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgOC41VjJNNiAyTDMgNU02IDJMOSA1TTMgMTAuNUg5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0bl9fcmluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA3IDcpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG93bmxvYWRQcm9ncmVzcy5nZXQoaSkgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lICYmICEoc2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDApfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICghaXNMaXZlIHx8IGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJylcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKGdsb2JhbEN1cnJlbnRUaW1lTXMgLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwMTtcIj5cbiAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgICAgICBbc2VnbWVudHNdPVwic3BlZWRTZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRTcGVlZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRhaW5lckJnQ29sb3JdPVwiJyNGMEYwRjEnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TcGVlZENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRpbWVsaW5lQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgKGlzVmlkZW9GdWxsTW9kZSA/IGZ1bGxWaWRlb01hcmtlcnMgOiBjdXJyZW50VmlkZW9NYXJrZXJzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcikgOiBnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC0xLzIgY3FhLXctMyBjcWEtaC0zIGNxYS1iZy1ibHVlLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDYwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItMlwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiAhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHNjcmVlbnNob3ROb0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tYXgtaC1baW5oZXJpdF0nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1tYXgtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|