@cqa-lib/cqa-ui 1.1.185 → 1.1.187

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2020/lib/execution-screen/main-step-collapse/main-step-collapse.component.mjs +20 -3
  2. package/esm2020/lib/simulator/simulator.component.mjs +188 -346
  3. package/esm2020/lib/step-builder/step-builder-api/step-builder-api.component.mjs +132 -7
  4. package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +4 -5
  5. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
  6. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +1 -1
  7. package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +24 -32
  8. package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +1 -1
  9. package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +15 -3
  10. package/esm2020/lib/test-case-details/test-case-step.models.mjs +1 -1
  11. package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +1 -1
  12. package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +51 -17
  13. package/fesm2015/cqa-lib-cqa-ui.mjs +436 -416
  14. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/fesm2020/cqa-lib-cqa-ui.mjs +424 -404
  16. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  17. package/lib/execution-screen/main-step-collapse/main-step-collapse.component.d.ts +6 -3
  18. package/lib/simulator/simulator.component.d.ts +10 -22
  19. package/lib/step-builder/step-builder-api/step-builder-api.component.d.ts +6 -0
  20. package/lib/test-case-details/normal-step/normal-step.component.d.ts +7 -2
  21. package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +7 -1
  22. package/lib/test-case-details/test-case-step.models.d.ts +1 -0
  23. package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +6 -1
  24. package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +11 -7
  25. package/package.json +1 -1
  26. package/styles.css +1 -1
@@ -66,7 +66,6 @@ export class SimulatorComponent {
66
66
  this.speedControlClickOutsideHandler = null;
67
67
  this.preloadVideoElement = null;
68
68
  this.preloadAllVideoElement = null;
69
- this.targetGlobalTimeDuringSwitch = null;
70
69
  this.traceViewerLoading = false;
71
70
  this.traceViewerError = false;
72
71
  this.isCorrectDeviceFrameAvailable = false;
@@ -205,6 +204,9 @@ export class SimulatorComponent {
205
204
  get isPlayerSwitching() {
206
205
  return this.playerState === 'switching';
207
206
  }
207
+ get shouldApplySmallHeightClasses() {
208
+ return typeof window !== 'undefined' && window.innerHeight < 600 && this.platformType === 'browser' && this.isLive;
209
+ }
208
210
  get effectiveBrowserViewPort() {
209
211
  const defaultViewport = { width: 1280, height: 720 };
210
212
  if (!this.browserViewPort) {
@@ -350,44 +352,6 @@ export class SimulatorComponent {
350
352
  return;
351
353
  this.enqueueOperation(() => this.seekToTimeInternal(milliseconds));
352
354
  }
353
- /**
354
- * Seek to a global time on the combined timeline (converts to segment + local time)
355
- */
356
- async seekToGlobalTime(globalTimeMs) {
357
- const total = this.totalDuration;
358
- if (total <= 0)
359
- return;
360
- const clampedGlobal = Math.max(0, Math.min(globalTimeMs, total));
361
- const boundaries = this.segmentBoundaries;
362
- let segmentIndex = 0;
363
- let segmentStart = 0;
364
- for (let i = 0; i < boundaries.length; i++) {
365
- if (clampedGlobal < boundaries[i]) {
366
- segmentIndex = i;
367
- segmentStart = i === 0 ? 0 : boundaries[i - 1];
368
- break;
369
- }
370
- segmentIndex = i;
371
- segmentStart = i === 0 ? 0 : boundaries[i - 1];
372
- }
373
- if (boundaries.length > 0 && clampedGlobal >= boundaries[boundaries.length - 1]) {
374
- segmentIndex = boundaries.length - 1;
375
- segmentStart = segmentIndex === 0 ? 0 : boundaries[segmentIndex - 1];
376
- }
377
- const localTimeMs = clampedGlobal - segmentStart;
378
- if (this.currentVideoIndex === segmentIndex) {
379
- await this.seekToTimeInternal(localTimeMs);
380
- // Update progress after seek in same segment
381
- if (this.totalDuration > 0) {
382
- this.progress = Math.min(100, Math.max(0, (this.globalCurrentTime / this.totalDuration) * 100));
383
- }
384
- }
385
- else {
386
- const cumulativeTimestamp = segmentStart + localTimeMs;
387
- await this.switchToVideoAndSeekInternal(cumulativeTimestamp);
388
- // Progress is already updated inside switchToVideoAndSeekInternal
389
- }
390
- }
391
355
  /**
392
356
  * Seek video internal implementation (no enqueue - called from queue)
393
357
  * This prevents pipeline read errors during rapid seek operations
@@ -418,11 +382,13 @@ export class SimulatorComponent {
418
382
  this.lastSetDuration = milliseconds;
419
383
  // Wait briefly for seek to complete (prevents rapid seek issues)
420
384
  await new Promise(resolve => setTimeout(resolve, 50));
421
- const total = this.totalDuration;
422
- if (total > 0) {
423
- this.progress = Math.min(100, Math.max(0, (this.globalCurrentTime / total) * 100));
385
+ // Per-video progress (0-100% of current video)
386
+ const durationMs = video.duration * 1000;
387
+ if (durationMs > 0) {
388
+ this.progress = Math.min(100, Math.max(0, (video.currentTime * 1000 / durationMs) * 100));
424
389
  }
425
- this.videoTimeUpdate.emit(this.globalCurrentTime);
390
+ const segmentStart = this.currentVideoIndex === 0 ? 0 : (this.segmentBoundaries[this.currentVideoIndex - 1] ?? 0);
391
+ this.videoTimeUpdate.emit(segmentStart + video.currentTime * 1000);
426
392
  // Set to paused state (user must explicitly play)
427
393
  this.playerState = 'paused';
428
394
  console.log('[Simulator] seekToTimeInternal: seek complete', {
@@ -516,91 +482,6 @@ export class SimulatorComponent {
516
482
  console.log('[Simulator] playVideoInternal: already playing, skipping');
517
483
  return;
518
484
  }
519
- if (this.hasMultipleVideos && this.videoUrls) {
520
- const total = this.totalDuration;
521
- const currentGlobalTime = this.globalCurrentTime;
522
- const isAtEnd = total > 0 && (this.progress >= 100 || currentGlobalTime >= total);
523
- const isLastVideo = this.currentVideoIndex >= this.videoUrls.length - 1;
524
- const isLastVideoAtEnd = isLastVideo && video.duration && video.currentTime >= video.duration - 0.1;
525
- if (isAtEnd || isLastVideoAtEnd) {
526
- console.log('[Simulator] playVideoInternal: all videos completed, resetting to first video', {
527
- progress: this.progress,
528
- currentGlobalTime,
529
- total,
530
- currentVideoIndex: this.currentVideoIndex,
531
- isAtEnd,
532
- isLastVideoAtEnd
533
- });
534
- // Reset to first video at 0 progress
535
- this.currentVideoIndex = 0;
536
- this.progress = 0;
537
- this.targetGlobalTimeDuringSwitch = 0;
538
- this.hitMarkers.clear();
539
- // Switch to first video and seek to 0
540
- await this.switchToVideoAndSeekInternal(0);
541
- // Update video reference after switch
542
- const videoAfterSwitch = this.vplayer?.nativeElement;
543
- if (!videoAfterSwitch) {
544
- console.error('[Simulator] playVideoInternal: video element not found after switch');
545
- return;
546
- }
547
- // Continue with normal play logic below
548
- // The video element reference has changed, so we'll use videoAfterSwitch
549
- // But we need to wait for metadata again
550
- if (videoAfterSwitch.readyState < HTMLMediaElement.HAVE_METADATA) {
551
- await new Promise((resolve, reject) => {
552
- const onLoadedMetadata = () => {
553
- videoAfterSwitch.removeEventListener('loadedmetadata', onLoadedMetadata);
554
- videoAfterSwitch.removeEventListener('error', onError);
555
- resolve();
556
- };
557
- const onError = () => {
558
- videoAfterSwitch.removeEventListener('loadedmetadata', onLoadedMetadata);
559
- videoAfterSwitch.removeEventListener('error', onError);
560
- reject(new Error('Failed to load video metadata'));
561
- };
562
- videoAfterSwitch.addEventListener('loadedmetadata', onLoadedMetadata, { once: true });
563
- videoAfterSwitch.addEventListener('error', onError, { once: true });
564
- setTimeout(() => {
565
- videoAfterSwitch.removeEventListener('loadedmetadata', onLoadedMetadata);
566
- videoAfterSwitch.removeEventListener('error', onError);
567
- if (videoAfterSwitch.readyState >= HTMLMediaElement.HAVE_METADATA) {
568
- resolve();
569
- }
570
- else {
571
- reject(new Error('Timeout waiting for metadata'));
572
- }
573
- }, 500);
574
- });
575
- }
576
- // Set state to loading
577
- this.playerState = 'loading';
578
- try {
579
- await videoAfterSwitch.play();
580
- this.playerState = 'playing';
581
- this.isPlaying = true;
582
- this.playPromise = null;
583
- this.videoPlay.emit();
584
- this.isVideoPlayingChange.emit(true);
585
- this.targetGlobalTimeDuringSwitch = null;
586
- console.log('[Simulator] playVideoInternal: restarted from first video');
587
- return;
588
- }
589
- catch (err) {
590
- this.playerState = 'error';
591
- this.isPlaying = false;
592
- this.playPromise = null;
593
- this.isVideoPlayingChange.emit(false);
594
- if (err.name === 'AbortError') {
595
- this.playerState = 'paused';
596
- }
597
- else {
598
- console.error('[Simulator] playVideoInternal: failed after reset', err);
599
- }
600
- return;
601
- }
602
- }
603
- }
604
485
  console.log('[Simulator] playVideoInternal: starting', {
605
486
  playerState: this.playerState,
606
487
  currentTime: video.currentTime,
@@ -622,17 +503,6 @@ export class SimulatorComponent {
622
503
  };
623
504
  video.addEventListener('loadedmetadata', onLoadedMetadata, { once: true });
624
505
  video.addEventListener('error', onError, { once: true });
625
- // Timeout fallback
626
- setTimeout(() => {
627
- video.removeEventListener('loadedmetadata', onLoadedMetadata);
628
- video.removeEventListener('error', onError);
629
- if (video.readyState >= HTMLMediaElement.HAVE_METADATA) {
630
- resolve();
631
- }
632
- else {
633
- reject(new Error('Timeout waiting for metadata'));
634
- }
635
- }, 500);
636
506
  });
637
507
  }
638
508
  // Clear hit markers if starting from beginning
@@ -673,10 +543,11 @@ export class SimulatorComponent {
673
543
  currentTime: video.currentTime,
674
544
  playerState: this.playerState
675
545
  });
676
- // Check early markers (non-blocking, doesn't need to be queued)
677
546
  setTimeout(() => {
678
- if (this.isPlaying) {
679
- this.checkMarkerHit(this.globalCurrentTime);
547
+ if (this.isPlaying && this.vplayer?.nativeElement) {
548
+ const v = this.vplayer.nativeElement;
549
+ const segmentStart = this.currentVideoIndex === 0 ? 0 : (this.segmentBoundaries[this.currentVideoIndex - 1] ?? 0);
550
+ this.checkMarkerHit(segmentStart + v.currentTime * 1000);
680
551
  }
681
552
  }, 50);
682
553
  }
@@ -783,38 +654,95 @@ export class SimulatorComponent {
783
654
  }
784
655
  return [];
785
656
  }
786
- get globalCurrentTime() {
787
- if (this.targetGlobalTimeDuringSwitch !== null && !this.isPlaying && this.playerState !== 'playing') {
788
- return this.targetGlobalTimeDuringSwitch;
657
+ get currentVideoMarkers() {
658
+ let markersToProcess;
659
+ if (!this.hasMultipleVideos) {
660
+ markersToProcess = this.stepMarkers;
789
661
  }
790
- const video = this.vplayer?.nativeElement;
791
- if (!video?.duration || !isFinite(video.duration)) {
792
- // Fallback to override if video not ready yet
793
- if (this.targetGlobalTimeDuringSwitch !== null) {
794
- return this.targetGlobalTimeDuringSwitch;
662
+ else {
663
+ const boundaries = this.getVideoDurationBoundaries();
664
+ if (boundaries.length === 0 || this.currentVideoIndex >= boundaries.length) {
665
+ markersToProcess = this.stepMarkers;
666
+ }
667
+ else {
668
+ const currentBoundary = boundaries[this.currentVideoIndex];
669
+ markersToProcess = this.stepMarkers
670
+ .filter(marker => {
671
+ return marker.cumulativeDuration >= currentBoundary.start &&
672
+ marker.cumulativeDuration < currentBoundary.end;
673
+ })
674
+ .map(marker => this.adjustChildStepsDuration(marker, currentBoundary.start, currentBoundary.start, currentBoundary.end));
795
675
  }
796
- return 0;
797
676
  }
798
- const segmentStart = this.currentVideoIndex === 0 ? 0 : (this.segmentBoundaries[this.currentVideoIndex - 1] ?? 0);
799
- return segmentStart + video.currentTime * 1000;
677
+ return this.flattenMarkers(markersToProcess);
678
+ }
679
+ adjustChildStepsDuration(marker, adjustment, videoStart, videoEnd) {
680
+ const adjustedMarker = {
681
+ ...marker,
682
+ cumulativeDuration: marker.cumulativeDuration - adjustment
683
+ };
684
+ if (marker.childSteps && marker.childSteps.length > 0) {
685
+ adjustedMarker.childSteps = marker.childSteps
686
+ .filter(child => child.cumulativeDuration >= videoStart && child.cumulativeDuration < videoEnd)
687
+ .map(child => {
688
+ const adjustedChild = {
689
+ ...child,
690
+ cumulativeDuration: child.cumulativeDuration - adjustment
691
+ };
692
+ if (child.childSteps && child.childSteps.length > 0) {
693
+ adjustedChild.childSteps = child.childSteps
694
+ .filter(nestedChild => nestedChild.cumulativeDuration >= videoStart && nestedChild.cumulativeDuration < videoEnd)
695
+ .map(nestedChild => this.adjustChildStepsDuration(nestedChild, adjustment, videoStart, videoEnd));
696
+ }
697
+ return adjustedChild;
698
+ });
699
+ }
700
+ return adjustedMarker;
800
701
  }
801
- getActualGlobalTime() {
702
+ getStepLeftPosition(step) {
802
703
  const video = this.vplayer?.nativeElement;
803
- if (!video?.duration || !isFinite(video.duration))
704
+ if (!video?.duration)
804
705
  return 0;
805
- const segmentStart = this.currentVideoIndex === 0 ? 0 : (this.segmentBoundaries[this.currentVideoIndex - 1] ?? 0);
806
- return segmentStart + video.currentTime * 1000;
706
+ const durationMs = video.duration * 1000;
707
+ return (step.cumulativeDuration / durationMs) * 100;
807
708
  }
808
- /** Global step markers for rendering on the combined timeline */
809
- get globalStepMarkers() {
810
- const allMarkers = this.flattenMarkers(this.stepMarkers);
811
- return allMarkers.map(m => ({
812
- globalTime: m.cumulativeDuration,
813
- result: m.result,
814
- testStepId: m.testStepId,
815
- title: m.title,
816
- level: m.level
817
- }));
709
+ getStepColor(step) {
710
+ return step.level === 1 ? '#000000' : '#6366F1';
711
+ }
712
+ getStepResultColor(step) {
713
+ return this.getGlobalMarkerResultColor(step.result);
714
+ }
715
+ getGlobalMarkerColor(level) {
716
+ return level === 1 ? '#000000' : '#FFA500';
717
+ }
718
+ getGlobalMarkerResultColor(result) {
719
+ switch (result) {
720
+ case 'SUCCESS':
721
+ return '#12B76A';
722
+ case 'FAILURE':
723
+ return '#B91C1C';
724
+ case 'ABORTED':
725
+ return '#F79009';
726
+ case 'SKIPPED':
727
+ return '#667085';
728
+ default:
729
+ return '#6366F1';
730
+ }
731
+ }
732
+ onMarkerClick(event, marker) {
733
+ event.stopPropagation();
734
+ event.preventDefault();
735
+ const video = this.vplayer?.nativeElement;
736
+ if (!video?.duration)
737
+ return;
738
+ const targetTimeMs = marker.cumulativeDuration;
739
+ this.enqueueOperation(async () => {
740
+ await this.seekToTimeInternal(targetTimeMs);
741
+ if (marker.testStepId != null) {
742
+ this.hitMarkers.add(marker.testStepId);
743
+ this.markerHit.emit(marker);
744
+ }
745
+ });
818
746
  }
819
747
  get currentVideoUrl() {
820
748
  if (Array.isArray(this.videoUrls) && this.videoUrls.length > 0) {
@@ -852,36 +780,34 @@ export class SimulatorComponent {
852
780
  if (!this.hasMultipleVideos)
853
781
  return;
854
782
  if (this.currentVideoIndex > 0) {
855
- this.currentVideoIndex -= 1;
856
- this.resetVideoState();
783
+ this.enqueueOperation(() => this.switchToVideoAndResetInternal(this.currentVideoIndex - 1));
857
784
  }
858
785
  }
859
786
  nextVideo() {
860
787
  if (!this.hasMultipleVideos)
861
788
  return;
862
789
  if (this.videoUrls && this.currentVideoIndex < this.videoUrls.length - 1) {
863
- this.currentVideoIndex += 1;
864
- this.resetVideoState();
790
+ this.enqueueOperation(() => this.switchToVideoAndResetInternal(this.currentVideoIndex + 1));
865
791
  }
866
792
  }
867
793
  onTimelineClick(event) {
868
- if (!this.timelineBar?.nativeElement)
794
+ if (!this.timelineBar?.nativeElement || !this.vplayer?.nativeElement)
795
+ return;
796
+ const video = this.vplayer.nativeElement;
797
+ if (!video.duration || !isFinite(video.duration))
869
798
  return;
870
799
  const rect = this.timelineBar.nativeElement.getBoundingClientRect();
871
800
  const clickX = event.clientX - rect.left;
872
801
  const percent = Math.max(0, Math.min(1, clickX / rect.width));
873
- const total = this.totalDuration;
874
- if (total <= 0)
875
- return;
876
- const globalTimeMs = percent * total;
802
+ const targetTimeMs = percent * video.duration * 1000;
877
803
  const shouldResumePlaying = this.isPlaying;
878
804
  console.log('[Simulator] onTimelineClick', {
879
805
  percent,
880
- globalTimeMs,
806
+ targetTimeMs,
881
807
  shouldResumePlaying
882
808
  });
883
809
  this.enqueueOperation(async () => {
884
- await this.seekToGlobalTime(globalTimeMs);
810
+ await this.seekToTimeInternal(targetTimeMs);
885
811
  if (shouldResumePlaying) {
886
812
  await new Promise(resolve => setTimeout(resolve, 100));
887
813
  await this.playVideoInternal();
@@ -919,7 +845,6 @@ export class SimulatorComponent {
919
845
  return;
920
846
  this.dragging = false;
921
847
  this.removeDragListeners();
922
- // CRITICAL: Capture the playing state BEFORE any async operations
923
848
  const shouldResumePlaying = this.wasPlayingBeforeDrag;
924
849
  console.log('[Simulator] stopDrag: drag ended', {
925
850
  progress: this.progress,
@@ -927,19 +852,15 @@ export class SimulatorComponent {
927
852
  shouldResumePlaying: shouldResumePlaying,
928
853
  currentPlayerState: this.playerState
929
854
  });
930
- const total = this.totalDuration;
931
- if (total <= 0)
855
+ const video = this.vplayer?.nativeElement;
856
+ if (!video || !video.duration || !isFinite(video.duration))
932
857
  return;
933
- const globalTimeMs = (this.progress / 100) * total;
934
- // CRITICAL FIX: Queue both seek and resume play together
935
- // This ensures seek completes before attempting to play
858
+ const targetTimeMs = (this.progress / 100) * video.duration * 1000;
936
859
  this.enqueueOperation(async () => {
937
- // Perform seek (this will pause the video)
938
- await this.seekToGlobalTime(globalTimeMs);
939
- // If video was playing before drag, resume it
860
+ await this.seekToTimeInternal(targetTimeMs);
940
861
  if (shouldResumePlaying) {
941
862
  console.log('[Simulator] stopDrag: resuming playback after seek', {
942
- globalTimeMs,
863
+ targetTimeMs,
943
864
  playerState: this.playerState
944
865
  });
945
866
  // Wait a bit longer to ensure seek is fully complete
@@ -1009,12 +930,12 @@ export class SimulatorComponent {
1009
930
  this.playerState = 'paused';
1010
931
  this.videoPause.emit();
1011
932
  this.isVideoPlayingChange.emit(false);
1012
- // Seamlessly load and play next segment
933
+ // Switch to next video and reset to 0
1013
934
  if (this.hasMultipleVideos && this.videoUrls && this.currentVideoIndex < this.videoUrls.length - 1) {
1014
- const nextIndex = this.currentVideoIndex + 1;
1015
- const segmentStart = nextIndex === 0 ? 0 : (this.segmentBoundaries[nextIndex - 1] ?? 0);
935
+ this.currentVideoIndex += 1;
1016
936
  this.enqueueOperation(async () => {
1017
- await this.switchToVideoAndSeekInternal(segmentStart);
937
+ await this.resetVideoStateInternal();
938
+ await new Promise(resolve => setTimeout(resolve, 100));
1018
939
  if (this.vplayer?.nativeElement && this.currentVideoUrl) {
1019
940
  await this.playVideoInternal();
1020
941
  }
@@ -1038,24 +959,15 @@ export class SimulatorComponent {
1038
959
  lastUpdate = now;
1039
960
  const currentMs = video.currentTime * 1000;
1040
961
  if (!this.dragging && this.playerState !== 'switching') {
1041
- const total = this.totalDuration;
1042
- // Clear targetGlobalTimeDuringSwitch if we've reached the target position
1043
- // When playing, be more aggressive about clearing to allow live updates
1044
- if (this.targetGlobalTimeDuringSwitch !== null) {
1045
- const currentGlobal = this.getActualGlobalTime();
1046
- const tolerance = this.isPlaying ? 1000 : 500; // More tolerance when playing
1047
- if (Math.abs(currentGlobal - this.targetGlobalTimeDuringSwitch) < tolerance) {
1048
- this.targetGlobalTimeDuringSwitch = null;
1049
- }
1050
- }
1051
- // globalCurrentTime now handles override logic - use it directly
1052
- if (total > 0) {
1053
- this.progress = Math.min(100, Math.max(0, (this.globalCurrentTime / total) * 100));
962
+ // Per-video progress (0-100% of current video)
963
+ const durationMs = video.duration * 1000;
964
+ if (durationMs > 0) {
965
+ this.progress = Math.min(100, Math.max(0, (currentMs / durationMs) * 100));
1054
966
  }
1055
- this.videoTimeUpdate.emit(this.globalCurrentTime);
1056
- // Check if current time hits any marker
1057
- this.checkMarkerHit(this.globalCurrentTime);
1058
- // Preload next segment when ~5-10 seconds from ending
967
+ // Emit cumulative time for parent (step highlighting)
968
+ const segmentStart = this.currentVideoIndex === 0 ? 0 : (this.segmentBoundaries[this.currentVideoIndex - 1] ?? 0);
969
+ this.videoTimeUpdate.emit(segmentStart + currentMs);
970
+ this.checkMarkerHit(segmentStart + currentMs);
1059
971
  this.maybePreloadNextSegment();
1060
972
  }
1061
973
  };
@@ -1258,48 +1170,10 @@ export class SimulatorComponent {
1258
1170
  // Mark as hit and emit event
1259
1171
  this.hitMarkers.add(marker.testStepId);
1260
1172
  this.markerHit.emit(marker);
1261
- console.log('[Simulator] Marker hit detected', {
1262
- testStepId: marker.testStepId,
1263
- cumulativeDuration: marker.cumulativeDuration,
1264
- currentTime: globalTimeMs,
1265
- timeDifference,
1266
- title: marker.title,
1267
- level: marker.level
1268
- });
1269
1173
  break; // Only emit one marker per check
1270
1174
  }
1271
1175
  }
1272
1176
  }
1273
- getGlobalMarkerResultColor(result) {
1274
- switch (result) {
1275
- case 'SUCCESS':
1276
- return '#12B76A';
1277
- case 'FAILURE':
1278
- return '#B91C1C';
1279
- case 'ABORTED':
1280
- return '#F79009';
1281
- case 'SKIPPED':
1282
- return '#667085';
1283
- default:
1284
- return '#6366F1';
1285
- }
1286
- }
1287
- getGlobalMarkerColor(level) {
1288
- return level === 1 ? '#000000' : '#FFA500';
1289
- }
1290
- onMarkerClick(event, marker) {
1291
- event.stopPropagation();
1292
- event.preventDefault();
1293
- this.enqueueOperation(async () => {
1294
- await this.seekToGlobalTime(marker.globalTime);
1295
- if (marker.testStepId != null) {
1296
- this.hitMarkers.add(marker.testStepId);
1297
- const fullMarker = this.flattenMarkers(this.stepMarkers).find(m => m.testStepId === marker.testStepId);
1298
- if (fullMarker)
1299
- this.markerHit.emit(fullMarker);
1300
- }
1301
- });
1302
- }
1303
1177
  toggleFullScreen() {
1304
1178
  const wasPlaying = this.isPlaying;
1305
1179
  const currentTime = this.vplayer?.nativeElement?.currentTime || 0;
@@ -1352,20 +1226,15 @@ export class SimulatorComponent {
1352
1226
  }
1353
1227
  onSegmentChange(value) {
1354
1228
  this.currentView = value;
1355
- // Pause video when switching away from video view
1356
1229
  if (this.currentView !== 'video') {
1357
1230
  this.pauseVideo();
1358
1231
  this.progress = 0;
1359
1232
  }
1360
1233
  else {
1361
- // Reset everything when switching back to video view
1362
1234
  this.enqueueOperation(async () => {
1363
1235
  await this.resetVideoStateInternal();
1364
- // If multiple videos, reset to first video
1365
1236
  if (this.hasMultipleVideos && this.videoUrls) {
1366
1237
  this.currentVideoIndex = 0;
1367
- this.targetGlobalTimeDuringSwitch = 0;
1368
- // Switch to first video and seek to 0
1369
1238
  await this.switchToVideoAndSeekInternal(0);
1370
1239
  }
1371
1240
  });
@@ -1560,6 +1429,63 @@ export class SimulatorComponent {
1560
1429
  }
1561
1430
  return null;
1562
1431
  }
1432
+ async switchToVideoAndResetInternal(targetVideoIndex) {
1433
+ const video = this.vplayer?.nativeElement;
1434
+ if (!video || !this.videoUrls || targetVideoIndex < 0 || targetVideoIndex >= this.videoUrls.length) {
1435
+ return;
1436
+ }
1437
+ if (this.currentVideoIndex === targetVideoIndex) {
1438
+ await this.resetVideoStateInternal();
1439
+ return;
1440
+ }
1441
+ this.playerState = 'switching';
1442
+ try {
1443
+ video.pause();
1444
+ this.isPlaying = false;
1445
+ this.playPromise = null;
1446
+ this.videoPause.emit();
1447
+ this.isVideoPlayingChange.emit(false);
1448
+ this.currentVideoIndex = targetVideoIndex;
1449
+ await new Promise((resolve, reject) => {
1450
+ let resolved = false;
1451
+ const cleanup = () => {
1452
+ if (resolved)
1453
+ return;
1454
+ resolved = true;
1455
+ video.removeEventListener('loadedmetadata', onLoadedMetadata);
1456
+ video.removeEventListener('error', onError);
1457
+ };
1458
+ const onLoadedMetadata = () => {
1459
+ cleanup();
1460
+ resolve();
1461
+ };
1462
+ const onError = () => {
1463
+ cleanup();
1464
+ reject(new Error('Failed to load video'));
1465
+ };
1466
+ setTimeout(() => {
1467
+ if (resolved)
1468
+ return;
1469
+ video.addEventListener('loadedmetadata', onLoadedMetadata, { once: true });
1470
+ video.addEventListener('error', onError, { once: true });
1471
+ }, 100);
1472
+ });
1473
+ video.currentTime = 0;
1474
+ this.progress = 0;
1475
+ this.playPromise = null;
1476
+ this.hitMarkers.clear();
1477
+ this.lastSetDuration = -1;
1478
+ const segmentStart = targetVideoIndex === 0 ? 0 : (this.segmentBoundaries[targetVideoIndex - 1] ?? 0);
1479
+ this.videoTimeUpdate.emit(segmentStart);
1480
+ }
1481
+ catch (err) {
1482
+ console.error('[Simulator] switchToVideoAndReset failed:', err);
1483
+ this.progress = 0;
1484
+ }
1485
+ finally {
1486
+ this.playerState = 'paused';
1487
+ }
1488
+ }
1563
1489
  switchToVideoAndSeek(cumulativeTimestamp) {
1564
1490
  this.enqueueOperation(() => this.switchToVideoAndSeekInternal(cumulativeTimestamp));
1565
1491
  }
@@ -1584,20 +1510,13 @@ export class SimulatorComponent {
1584
1510
  const video = this.vplayer?.nativeElement;
1585
1511
  if (!video)
1586
1512
  return;
1587
- const total = this.totalDuration;
1588
- this.targetGlobalTimeDuringSwitch = cumulativeTimestamp;
1589
- if (total > 0) {
1590
- this.progress = Math.min(100, Math.max(0, (cumulativeTimestamp / total) * 100));
1591
- }
1592
1513
  this.playerState = 'switching';
1593
1514
  try {
1594
- // CRITICAL: Pause before switching source
1595
1515
  video.pause();
1596
1516
  this.isPlaying = false;
1597
1517
  this.playPromise = null;
1598
1518
  this.videoPause.emit();
1599
1519
  this.isVideoPlayingChange.emit(false);
1600
- // Switch video source
1601
1520
  this.currentVideoIndex = targetVideoIndex;
1602
1521
  await new Promise((resolve, reject) => {
1603
1522
  let resolved = false;
@@ -1607,20 +1526,13 @@ export class SimulatorComponent {
1607
1526
  resolved = true;
1608
1527
  video.removeEventListener('loadedmetadata', onLoadedMetadata);
1609
1528
  video.removeEventListener('error', onError);
1610
- clearTimeout(timeoutId);
1611
1529
  };
1612
1530
  const onLoadedMetadata = () => {
1613
1531
  cleanup();
1614
- console.log('[Simulator] switchToVideoAndSeek: loadedmetadata', {
1615
- readyState: video.readyState,
1616
- duration: video.duration,
1617
- currentTime: video.currentTime
1618
- });
1619
1532
  resolve();
1620
1533
  };
1621
1534
  const onError = () => {
1622
1535
  cleanup();
1623
- console.error('[Simulator] switchToVideoAndSeek: video error');
1624
1536
  reject(new Error('Failed to load video'));
1625
1537
  };
1626
1538
  setTimeout(() => {
@@ -1629,120 +1541,50 @@ export class SimulatorComponent {
1629
1541
  video.addEventListener('loadedmetadata', onLoadedMetadata, { once: true });
1630
1542
  video.addEventListener('error', onError, { once: true });
1631
1543
  }, 100);
1632
- const timeoutId = setTimeout(() => {
1633
- cleanup();
1634
- if (video.readyState >= HTMLMediaElement.HAVE_METADATA) {
1635
- console.log('[Simulator] switchToVideoAndSeek: metadata timeout but video ready', {
1636
- readyState: video.readyState,
1637
- duration: video.duration
1638
- });
1639
- resolve();
1640
- }
1641
- else {
1642
- console.error('[Simulator] switchToVideoAndSeek: metadata timeout and video not ready');
1643
- reject(new Error('Timeout waiting for video to load'));
1644
- }
1645
- }, 2000);
1646
1544
  });
1647
- // Seek to the target position using 'seeked' event for reliability
1648
1545
  const seekSeconds = relativeTimestamp / 1000;
1649
1546
  const targetTime = Math.max(0, Math.min(seekSeconds, video.duration || seekSeconds));
1650
- console.log('[Simulator] switchToVideoAndSeek: setting currentTime', {
1651
- targetTime,
1652
- seekSeconds,
1653
- relativeTimestamp,
1654
- videoDuration: video.duration
1655
- });
1656
1547
  await new Promise((resolve) => {
1657
- let resolved = false;
1658
1548
  const onSeeked = () => {
1659
- if (resolved)
1660
- return;
1661
- resolved = true;
1662
1549
  video.removeEventListener('seeked', onSeeked);
1663
1550
  clearTimeout(timeoutId);
1664
- console.log('[Simulator] switchToVideoAndSeek: seeked event fired', {
1665
- currentTime: video.currentTime,
1666
- targetTime,
1667
- diff: Math.abs(video.currentTime - targetTime)
1668
- });
1669
- // Small delay to ensure browser has processed the seek
1670
1551
  setTimeout(() => resolve(), 100);
1671
1552
  };
1672
1553
  video.addEventListener('seeked', onSeeked, { once: true });
1673
1554
  video.currentTime = targetTime;
1674
- // Fallback timeout
1675
1555
  const timeoutId = setTimeout(() => {
1676
- if (resolved)
1677
- return;
1678
- resolved = true;
1679
1556
  video.removeEventListener('seeked', onSeeked);
1680
- console.log('[Simulator] switchToVideoAndSeek: seeked timeout, current time is', video.currentTime);
1681
1557
  resolve();
1682
1558
  }, 1000);
1683
1559
  });
1684
1560
  this.lastSetDuration = cumulativeTimestamp;
1685
- // Double-check: if video is not at target, force it again
1686
1561
  if (Math.abs(video.currentTime - targetTime) > 0.5) {
1687
- console.warn('[Simulator] switchToVideoAndSeek: video not at target after seeked, forcing again', {
1688
- currentTime: video.currentTime,
1689
- targetTime
1690
- });
1691
1562
  video.currentTime = targetTime;
1692
1563
  await new Promise(resolve => setTimeout(resolve, 200));
1693
1564
  }
1694
- // Verify seek completed
1695
- const actualGlobal = this.getActualGlobalTime();
1696
- const actualVideoTime = video.currentTime;
1697
- console.log('[Simulator] switchToVideoAndSeek: seek verification', {
1698
- actualGlobal,
1699
- targetGlobal: cumulativeTimestamp,
1700
- diff: Math.abs(actualGlobal - cumulativeTimestamp),
1701
- actualVideoTime,
1702
- targetVideoTime: targetTime,
1703
- videoDiff: Math.abs(actualVideoTime - targetTime)
1704
- });
1705
- // Clear override only if video is actually at the target
1706
- const tolerance = 500;
1707
- if (Math.abs(actualGlobal - cumulativeTimestamp) < tolerance) {
1708
- this.targetGlobalTimeDuringSwitch = null;
1709
- console.log('[Simulator] switchToVideoAndSeek: cleared override - video at target');
1710
- }
1711
- // Update UI with actual current position
1712
- if (total > 0) {
1713
- this.progress = Math.min(100, Math.max(0, (this.globalCurrentTime / total) * 100));
1565
+ // Per-video progress
1566
+ const durationMs = video.duration * 1000;
1567
+ if (durationMs > 0) {
1568
+ this.progress = Math.min(100, Math.max(0, (video.currentTime * 1000 / durationMs) * 100));
1714
1569
  }
1715
- this.videoTimeUpdate.emit(this.globalCurrentTime);
1570
+ this.videoTimeUpdate.emit(cumulativeTimestamp);
1716
1571
  }
1717
1572
  catch (err) {
1718
1573
  console.error('[Simulator] switchToVideoAndSeek failed:', err);
1719
- // Even on error, try to update to target position
1720
- if (total > 0) {
1721
- this.progress = Math.min(100, Math.max(0, (cumulativeTimestamp / total) * 100));
1722
- }
1574
+ this.progress = 0;
1723
1575
  this.videoTimeUpdate.emit(cumulativeTimestamp);
1724
1576
  }
1725
1577
  finally {
1726
1578
  this.playerState = 'paused';
1727
1579
  this.hitMarkers.clear();
1728
- // Don't clear targetGlobalTimeDuringSwitch here - it's either already cleared
1729
- // or will be cleared by timeupdate handler when video reaches target
1730
- }
1731
- console.log('[Simulator] switchToVideoAndSeek: complete', {
1732
- currentVideoIndex: this.currentVideoIndex,
1733
- videoCurrentTime: video.currentTime,
1734
- globalCurrentTime: this.globalCurrentTime,
1735
- targetGlobalTimeDuringSwitch: this.targetGlobalTimeDuringSwitch,
1736
- playerState: this.playerState,
1737
- progress: this.progress
1738
- });
1580
+ }
1739
1581
  }
1740
1582
  }
1741
1583
  SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
1742
- 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" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange" }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === '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=\"platformType === '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=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\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\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-full cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-min-w-max': platformType === '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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-83px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\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 <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(globalCurrentTime / 1000) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of globalStepMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"totalDuration > 0 ? (marker.globalTime / totalDuration) * 100 : 0\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(totalDuration / 1000) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === '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 </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=\"!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': platformType === '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"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1584
+ 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" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange" }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"platformType === '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=\"platformType === '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=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\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\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-full cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-min-w-max': platformType === 'device', '!cqa-h-full !cqa-max-h-[500px]': shouldApplySmallHeightClasses}\">\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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-97px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === '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 </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=\"!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': platformType === '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"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
1743
1585
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
1744
1586
  type: Component,
1745
- 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=\"platformType === '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=\"platformType === '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=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\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\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-full cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-min-w-max': platformType === '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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-83px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\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 <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(globalCurrentTime / 1000) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-flex-1\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of globalStepMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"totalDuration > 0 ? (marker.globalTime / totalDuration) * 100 : 0\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(totalDuration / 1000) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === '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 </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=\"!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': platformType === '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: [] }]
1587
+ 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=\"platformType === '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=\"platformType === '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=\"platformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control \n [segments]=\"segments\" \n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n \n <div *ngIf=\"!isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Live Content View -->\n <div *ngIf=\"isLive\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <ng-container *ngIf=\"hasDeviceFrame;\">\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\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': platformType === 'browser', 'cqa-max-h-full cqa-h-full': platformType !== 'browser' || !isLive, 'cqa-min-w-max': platformType === 'device', '!cqa-h-full !cqa-max-h-[500px]': shouldApplySmallHeightClasses}\">\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-z-20': platformType === 'browser', 'cqa-bg-white': platformType !== 'browser'}\">\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 </ng-container>\n </div>\n\n <!-- Normal Video View (when not live) -->\n <div *ngIf=\"!isLive && currentView === 'video'\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-py-4 cqa-flex cqa-items-center cqa-max-h-[calc(100%-97px)]\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': platformType === 'device', 'cqa-mt-auto': hasDeviceFrame}\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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': platformType !== 'browser'}\">\n <video\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': platformType === 'browser'}\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n ></video>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\" *ngIf=\"currentVideoUrl && !isLive\">\n <span class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button \n *ngIf=\"hasMultipleVideos\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.currentTime || 0) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%);\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div \n *ngFor=\"let marker of currentVideoMarkers\" \n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div \n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none\">\n {{ formatTime(vplayer?.nativeElement?.duration || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-py-4 cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" [ngClass]=\"{'cqa-p-4': platformType === 'browser'}\">\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': platformType === 'browser', 'cqa-min-w-max': platformType === '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]': platformType === 'browser', 'cqa-max-h-full': platformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': platformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': platformType === '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 </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=\"!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': platformType === '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: [] }]
1746
1588
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { videoUrl: [{
1747
1589
  type: Input
1748
1590
  }], videoUrls: [{
@@ -1803,4 +1645,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1803
1645
  type: ViewChild,
1804
1646
  args: ['speedControlContainer', { static: false }]
1805
1647
  }] } });
1806
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBRWxKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQW1DbkYsTUFBTSxPQUFPLGtCQUFrQjtJQThPN0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTVPbEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQTZFLGFBQWEsQ0FBQztRQUNyRyxxQkFBZ0IsR0FBVyxZQUFZLENBQUM7UUFDeEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsK0JBQTBCLEdBQVcsRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQWdCLE9B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QU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGdldEVtcHR5U3RhdGVQcmVzZXQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1wcmVzZXRzLmNvbnN0YW50cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hcmtlciB7XG4gIGN1bXVsYXRpdmVEdXJhdGlvbjogbnVtYmVyO1xuICByZXN1bHQ6ICdTVUNDRVNTJyB8ICdGQUlMVVJFJyB8ICdBQk9SVEVEJyB8ICdTS0lQUEVEJztcbiAgdGVzdFN0ZXBJZD86IG51bWJlcjtcbiAgbGV2ZWw/OiBudW1iZXI7XG4gIGNoaWxkU3RlcHM/OiBTdGVwTWFya2VyW107XG4gIHRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTZWdtZW50VHlwZSA9ICdzY3JlZW5zaG90cycgfCAndmlkZW8nIHwgJ3RyYWNlJztcblxudHlwZSBTZWdtZW50T3B0aW9uID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xufTtcbmludGVyZmFjZSBEZXZpY2VGcmFtZUNvbmZpZyB7XG4gIG1vY2t1cEltYWdlOiBzdHJpbmc7XG4gIHNjcmVlbkluc2V0OiB7XG4gICAgdG9wOiBzdHJpbmc7XG4gICAgcmlnaHQ6IHN0cmluZztcbiAgICBib3R0b206IHN0cmluZztcbiAgICBsZWZ0OiBzdHJpbmc7XG4gIH07XG4gIGJvcmRlclJhZGl1czogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc2ltdWxhdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXVsYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5cbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgdmlkZW9Vcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB2aWRlb1VybHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHZpZGVvQ3VycmVudER1cmF0aW9uOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzdGVwTWFya2VyczogU3RlcE1hcmtlcltdID0gW107XG4gIEBJbnB1dCgpIHNjcmVlblNob3RVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0cmFjZVZpZXdVcmw6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwbGF0Zm9ybU5hbWU6IHN0cmluZyA9ICdXZWIgLSBDaHJvbWUnO1xuICBASW5wdXQoKSBwbGF0Zm9ybVR5cGU6ICdicm93c2VyJyB8ICdkZXZpY2UnID0gJ2Jyb3dzZXInO1xuICBASW5wdXQoKSBwbGF0Zm9ybTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGRldmljZU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbGl2ZVN0YXR1czogJ0luIFByb2dyZXNzJyB8ICdQYXVzZWQnIHwgJ0Fib3J0ZWQnIHwgJ0ZhaWxlZCcgfCAnUGFzc2VkJyB8ICdFeGVjdXRpb24nID0gJ0luIFByb2dyZXNzJztcbiAgQElucHV0KCkgbGl2ZUxvYWRpbmdMYWJlbDogc3RyaW5nID0gJ0xvYWRpbmcuLi4nO1xuICBASW5wdXQoKSBpc0NvbnRlbnRWaWRlb0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmFpbGVkU3RhdHVzTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RlZFZpZXc6IFNlZ21lbnRUeXBlID0gJ3ZpZGVvJztcbiAgQElucHV0KCkgaGlkZVZpZGVvVGFiOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGJyb3dzZXJWaWV3UG9ydDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIHZpZGVvVGltZVVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QbGF5ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgdmlkZW9QYXVzZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1hcmtlckhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RlcE1hcmtlcj4oKTtcbiAgQE91dHB1dCgpIGlzVmlkZW9QbGF5aW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgX3ZwbGF5ZXI/OiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3ZwbGF5ZXInKVxuICBzZXQgdnBsYXllclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuXG4gICAgdGhpcy5fdnBsYXllciA9IHJlZjtcbiAgICB0aGlzLm9uVmlkZW9FbGVtZW50UmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2cGxheWVyKCk6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92cGxheWVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGltZWxpbmVCYXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd0aW1lbGluZUJhcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgdGltZWxpbmVCYXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgdGhpcy5fdGltZWxpbmVCYXIgPSByZWY7XG4gIH1cblxuICBnZXQgdGltZWxpbmVCYXIoKTogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90aW1lbGluZUJhcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NwZWVkQ29udHJvbENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NwZWVkQ29udHJvbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgc3BlZWRDb250cm9sQ29udGFpbmVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3NwZWVkQ29udHJvbENvbnRhaW5lciA9IHJlZjtcbiAgfVxuXG4gIGdldCBzcGVlZENvbnRyb2xDb250YWluZXIoKTogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXI7XG4gIH1cblxuICBwcm9ncmVzcyA9IDA7XG4gIGRyYWdnaW5nID0gZmFsc2U7XG4gIGlzUGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0Z1bGxTY3JlZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFZpZXc6IHN0cmluZyA9ICd2aWRlbyc7XG4gIGN1cnJlbnRWaWRlb0luZGV4OiBudW1iZXIgPSAwO1xuICBjdXJyZW50U3BlZWQ6IHN0cmluZyA9ICcxeCc7XG4gIGlzU3BlZWRDb250cm9sT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGRldGVjdGVkVmlkZW9EdXJhdGlvbnM6IG51bWJlcltdID0gW107IC8vIEFjdHVhbCBkdXJhdGlvbnMgZGV0ZWN0ZWQgZnJvbSB2aWRlbyBtZXRhZGF0YVxuICBwcml2YXRlIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiBib29sZWFuID0gZmFsc2U7IC8vIFRyYWNrIGlmIHZpZGVvIHdhcyBwbGF5aW5nIGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgcHJpdmF0ZSBwbGF5UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBwbGF5IHByb21pc2VcbiAgcHJpdmF0ZSBoaXRNYXJrZXJzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTsgLy8gVHJhY2sgd2hpY2ggbWFya2VycyBoYXZlIGJlZW4gaGl0IChieSB0ZXN0U3RlcElkKVxuXG4gIC8vIFN0YXRlIG1hY2hpbmUgZm9yIHJvYnVzdCBtZWRpYSBvcGVyYXRpb25zXG4gIHByaXZhdGUgcGxheWVyU3RhdGU6ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdyZWFkeScgfCAncGxheWluZycgfCAncGF1c2VkJyB8ICdzZWVraW5nJyB8ICdzd2l0Y2hpbmcnIHwgJ2Vycm9yJyA9ICdpZGxlJztcbiAgcHJpdmF0ZSBvcGVyYXRpb25RdWV1ZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpOyAvLyBTZXJpYWxpemUgYWxsIG1lZGlhIG9wZXJhdGlvbnNcblxuICBnZXQgaGFzRGV2aWNlRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXZpY2VGcmFtZUNvbmZpZztcbiAgfVxuXG4gIGdldCBpc1BsYXllclN3aXRjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3N3aXRjaGluZyc7XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIHByaXZhdGUgdmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNldER1cmF0aW9uOiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBkcmFnTW91c2VNb3ZlSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdNb3VzZVVwSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmVsb2FkVmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZEFsbFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhcmdldEdsb2JhbFRpbWVEdXJpbmdTd2l0Y2g6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBcbiAgc2FmZVRyYWNlVXJsOiBTYWZlUmVzb3VyY2VVcmw7XG4gIHRyYWNlVmlld2VyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICB0cmFjZVZpZXdlckVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQ29ycmVjdERldmljZUZyYW1lQXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1wdHlTdGF0ZUNvbmZpZyA9IGdldEVtcHR5U3RhdGVQcmVzZXQoJ25vdGhpbmdUb0Rpc3BsYXknKTtcbiAgcmVhZG9ubHkgZGV2aWNlRXJyb3JFbXB0eVN0YXRlQ29uZmlnID0ge1xuICAgIC4uLnRoaXMuZW1wdHlTdGF0ZUNvbmZpZyxcbiAgICB0aXRsZTogJ0RldmljZSBOb3QgU3VwcG9ydGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZXZpY2UgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGlzIG5vdCBzdXBwb3J0ZWQuJyxcbiAgICBhY3Rpb25zOiBbXVxuICB9O1xuXG4gIGdldCBlZmZlY3RpdmVCcm93c2VyVmlld1BvcnQoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB7IHdpZHRoOiAxMjgwLCBoZWlnaHQ6IDcyMCB9O1xuXG4gICAgaWYgKCF0aGlzLmJyb3dzZXJWaWV3UG9ydCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3cG9ydDtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS53aWR0aCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyKCh0aGlzLmJyb3dzZXJWaWV3UG9ydCBhcyBhbnkpLmhlaWdodCk7XG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh3aWR0aCkgfHwgIU51bWJlci5pc0Zpbml0ZShoZWlnaHQpIHx8IHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VGcmFtZUNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIERldmljZUZyYW1lQ29uZmlnPiA9IHtcbiAgICAvLyBQaXhlbHNcbiAgICAnUGl4ZWwgNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMiUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdQaXhlbCA4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtOC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcyLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTktcHJvLndlYnAnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNCUnLFxuICAgICAgICByaWdodDogJzUlJyxcbiAgICAgICAgYm90dG9tOiAnNCUnLFxuICAgICAgICBsZWZ0OiAnNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnOCUnXG4gICAgfSxcbiAgICAvLyBpUGhvbmVzXG4gICAgJ2lQaG9uZSAxMSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS0xMS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMyUnLFxuICAgICAgICByaWdodDogJzcuNSUnLFxuICAgICAgICBib3R0b206ICczJScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxMyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS0xMy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzUlJyxcbiAgICAgICAgYm90dG9tOiAnMiUnLFxuICAgICAgICBsZWZ0OiAnNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDE1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTE1LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSBYUic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2FwcGxlLWlwaG9uZS14ci5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMy41JScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMuNSUnLFxuICAgICAgICBsZWZ0OiAnNy41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuXG4gICAgJ0dhbGF4eSBTMjAgRkUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9zYW1zdW5nLWdhbGF4eS1zMjAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuXG4gICAgYnJvd3Nlcjoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYnJvd3Nlci1tb2NrdXAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzYlJyxcbiAgICAgICAgcmlnaHQ6ICcwJScsXG4gICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgbGVmdDogJzAlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzAlJ1xuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRldmljZUZyYW1lQ29uZmlnKCk6IERldmljZUZyYW1lQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRldmljZU5hbWUgYW5kIGl0cyBmcmFtZSBpcyBhdmFpbGFibGUsIHJldHVybiBpdFxuICAgICAgaWYgKHRoaXMuZGV2aWNlTmFtZSAmJiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1t0aGlzLmRldmljZU5hbWVdO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBubyBkZXZpY2VOYW1lIG9yIGRldmljZU5hbWUncyBmcmFtZSBub3QgYXZhaWxhYmxlLCB1c2UgZGVmYXVsdHMgYmFzZWQgb24gcGxhdGZvcm1cbiAgICAgIGlmICh0aGlzLnBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzWydQaXhlbCA5J10gfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBsYXRmb3JtID09PSAnaW9zJykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZ3NbJ2lQaG9uZSAxNSddIHx8IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGRldmljZU1vY2t1cEltYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWcgPyB0aGlzLmRldmljZUZyYW1lQ29uZmlnLm1vY2t1cEltYWdlIDogJyc7XG4gIH1cblxuICBnZXQgZGV2aWNlU2NyZWVuU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZztcbiAgICBpZiAoIWNmZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogY2ZnLnNjcmVlbkluc2V0LnRvcCxcbiAgICAgIHJpZ2h0OiBjZmcuc2NyZWVuSW5zZXQucmlnaHQsXG4gICAgICBib3R0b206IGNmZy5zY3JlZW5JbnNldC5ib3R0b20sXG4gICAgICBsZWZ0OiBjZmcuc2NyZWVuSW5zZXQubGVmdCxcbiAgICAgICdib3JkZXItcmFkaXVzJzogY2ZnLmJvcmRlclJhZGl1cyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRWaWV3O1xuICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnVwZGF0ZVNhZmVUcmFjZVVybCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2aWRlb1VybHMnXSkge1xuICAgICAgY29uc3QgYXJyID0gY2hhbmdlc1sndmlkZW9VcmxzJ10uY3VycmVudFZhbHVlIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyciAmJiBhcnIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhhcnIpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUHJlbG9hZEFsbFNlZ21lbnRzKGFycik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddICYmICFjaGFuZ2VzWyd2aWRlb0N1cnJlbnREdXJhdGlvbiddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBuZXdEdXJhdGlvbiA9IGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uY3VycmVudFZhbHVlO1xuICAgICAgLy8gSWdub3JlIHNlbnRpbmVsIHZhbHVlICgtMSkgdXNlZCB0byBmb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBpZiAobmV3RHVyYXRpb24gPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkNoYW5nZXMgdmlkZW9DdXJyZW50RHVyYXRpb246IHBhdXNlZCB2aWRlbyBiZWZvcmUgc2Vla2luZycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgICBjb25zdCB0YXJnZXRWaWRlb0luZGV4ID0gdGhpcy5maW5kVmlkZW9JbmRleEZvclRpbWVzdGFtcChuZXdEdXJhdGlvbik7XG4gICAgICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBuZXdEdXJhdGlvbiAtIHRhcmdldEJvdW5kYXJ5LnN0YXJ0O1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG5lZWRzU3dpdGNoID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGFyZ2V0VmlkZW9JbmRleDtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmlkZW9UaW1lTXMgPSB0aGlzLnZwbGF5ZXIubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKHJlbGF0aXZlVGltZXN0YW1wIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoIHx8IG5ld0R1cmF0aW9uICE9PSB0aGlzLmxhc3RTZXREdXJhdGlvbiB8fCB0aW1lRGlmZmVyZW5jZSA+IDEwMCkge1xuICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5lZWRzU3dpdGNoKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKG5ld0R1cmF0aW9uIC0gY3VycmVudFZpZGVvVGltZU1zKTtcbiAgICAgICAgICBpZiAobmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlZWtUb1RpbWUobmV3RHVyYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndHJhY2VWaWV3VXJsJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsICYmIHRoaXMuY3VycmVudFZpZXcgPT09ICd0cmFjZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHRoaXMuaGlkZVZpZGVvVGFiID8gJ3NjcmVlbnNob3RzJyA6ICd2aWRlbyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoaWRlVmlkZW9UYWInXSkge1xuICAgICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRWaWV3J10pIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSBjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCkge1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gbmdPbkRlc3Ryb3k6IGNsZWFuZWQgdXAgbGlzdGVuZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VlayB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHNlZWtUb1RpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRvIGEgZ2xvYmFsIHRpbWUgb24gdGhlIGNvbWJpbmVkIHRpbWVsaW5lIChjb252ZXJ0cyB0byBzZWdtZW50ICsgbG9jYWwgdGltZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2Vla1RvR2xvYmFsVGltZShnbG9iYWxUaW1lTXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgIGlmICh0b3RhbCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGFtcGVkR2xvYmFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZ2xvYmFsVGltZU1zLCB0b3RhbCkpO1xuICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuXG4gICAgbGV0IHNlZ21lbnRJbmRleCA9IDA7XG4gICAgbGV0IHNlZ21lbnRTdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib3VuZGFyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2xhbXBlZEdsb2JhbCA8IGJvdW5kYXJpZXNbaV0pIHtcbiAgICAgICAgc2VnbWVudEluZGV4ID0gaTtcbiAgICAgICAgc2VnbWVudFN0YXJ0ID0gaSA9PT0gMCA/IDAgOiBib3VuZGFyaWVzW2kgLSAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzZWdtZW50SW5kZXggPSBpO1xuICAgICAgc2VnbWVudFN0YXJ0ID0gaSA9PT0gMCA/IDAgOiBib3VuZGFyaWVzW2kgLSAxXTtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJpZXMubGVuZ3RoID4gMCAmJiBjbGFtcGVkR2xvYmFsID49IGJvdW5kYXJpZXNbYm91bmRhcmllcy5sZW5ndGggLSAxXSkge1xuICAgICAgc2VnbWVudEluZGV4ID0gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgc2VnbWVudFN0YXJ0ID0gc2VnbWVudEluZGV4ID09PSAwID8gMCA6IGJvdW5kYXJpZXNbc2VnbWVudEluZGV4IC0gMV07XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxUaW1lTXMgPSBjbGFtcGVkR2xvYmFsIC0gc2VnbWVudFN0YXJ0O1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHNlZ21lbnRJbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwobG9jYWxUaW1lTXMpO1xuICAgICAgLy8gVXBkYXRlIHByb2dyZXNzIGFmdGVyIHNlZWsgaW4gc2FtZSBzZWdtZW50XG4gICAgICBpZiAodGhpcy50b3RhbER1cmF0aW9uID4gMCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZSAvIHRoaXMudG90YWxEdXJhdGlvbikgKiAxMDApKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VtdWxhdGl2ZVRpbWVzdGFtcCA9IHNlZ21lbnRTdGFydCArIGxvY2FsVGltZU1zO1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgLy8gUHJvZ3Jlc3MgaXMgYWxyZWFkeSB1cGRhdGVkIGluc2lkZSBzd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICBpZiAodG90YWwgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZSAvIHRvdGFsKSAqIDEwMCkpO1xuICAgIH1cbiAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHRoaXMuZ2xvYmFsQ3VycmVudFRpbWUpO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwbGF5VmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKiBUaGlzIGVsaW1pbmF0ZXMgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBsYXlWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgcGxheWluZyAtIHNraXBcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGFscmVhZHkgcGxheWluZywgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscykge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBjb25zdCBjdXJyZW50R2xvYmFsVGltZSA9IHRoaXMuZ2xvYmFsQ3VycmVudFRpbWU7XG4gICAgICBjb25zdCBpc0F0RW5kID0gdG90YWwgPiAwICYmICh0aGlzLnByb2dyZXNzID49IDEwMCB8fCBjdXJyZW50R2xvYmFsVGltZSA+PSB0b3RhbCk7XG4gICAgICBjb25zdCBpc0xhc3RWaWRlbyA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IGlzTGFzdFZpZGVvQXRFbmQgPSBpc0xhc3RWaWRlbyAmJiB2aWRlby5kdXJhdGlvbiAmJiB2aWRlby5jdXJyZW50VGltZSA+PSB2aWRlby5kdXJhdGlvbiAtIDAuMTtcbiAgICAgIFxuICAgICAgaWYgKGlzQXRFbmQgfHwgaXNMYXN0VmlkZW9BdEVuZCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGFsbCB2aWRlb3MgY29tcGxldGVkLCByZXNldHRpbmcgdG8gZmlyc3QgdmlkZW8nLCB7XG4gICAgICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICAgICAgY3VycmVudEdsb2JhbFRpbWUsXG4gICAgICAgICAgdG90YWwsXG4gICAgICAgICAgY3VycmVudFZpZGVvSW5kZXg6IHRoaXMuY3VycmVudFZpZGVvSW5kZXgsXG4gICAgICAgICAgaXNBdEVuZCxcbiAgICAgICAgICBpc0xhc3RWaWRlb0F0RW5kXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgdG8gZmlyc3QgdmlkZW8gYXQgMCBwcm9ncmVzc1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgIHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCA9IDA7XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgICBcbiAgICAgICAgLy8gU3dpdGNoIHRvIGZpcnN0IHZpZGVvIGFuZCBzZWVrIHRvIDBcbiAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZpZGVvIHJlZmVyZW5jZSBhZnRlciBzd2l0Y2hcbiAgICAgICAgY29uc3QgdmlkZW9BZnRlclN3aXRjaCA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCF2aWRlb0FmdGVyU3dpdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHN3aXRjaCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQ29udGludWUgd2l0aCBub3JtYWwgcGxheSBsb2dpYyBiZWxvd1xuICAgICAgICAvLyBUaGUgdmlkZW8gZWxlbWVudCByZWZlcmVuY2UgaGFzIGNoYW5nZWQsIHNvIHdlJ2xsIHVzZSB2aWRlb0FmdGVyU3dpdGNoXG4gICAgICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIHdhaXQgZm9yIG1ldGFkYXRhIGFnYWluXG4gICAgICAgIGlmICh2aWRlb0FmdGVyU3dpdGNoLnJlYWR5U3RhdGUgPCBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgICB2aWRlb0FmdGVyU3dpdGNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgIHZpZGVvQWZ0ZXJTd2l0Y2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIHZpZGVvQWZ0ZXJTd2l0Y2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgdmlkZW9BZnRlclN3aXRjaC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbyBtZXRhZGF0YScpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWRlb0FmdGVyU3dpdGNoLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgdmlkZW9BZnRlclN3aXRjaC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB2aWRlb0FmdGVyU3dpdGNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgIHZpZGVvQWZ0ZXJTd2l0Y2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKHZpZGVvQWZ0ZXJTd2l0Y2gucmVhZHlTdGF0ZSA+PSBIVE1MTWVkaWFFbGVtZW50LkhBVkVfTUVUQURBVEEpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCB3YWl0aW5nIGZvciBtZXRhZGF0YScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGxvYWRpbmdcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdsb2FkaW5nJztcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdmlkZW9BZnRlclN3aXRjaC5wbGF5KCk7XG4gICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgICB0aGlzLnRhcmdldEdsb2JhbFRpbWVEdXJpbmdTd2l0Y2ggPSBudWxsO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogcmVzdGFydGVkIGZyb20gZmlyc3QgdmlkZW8nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBmYWlsZWQgYWZ0ZXIgcmVzZXQnLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHN0YXJ0aW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBXYWl0IGZvciB2aWRlbyB0byBiZSByZWFkeSBpZiBuZWVkZWRcbiAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA8IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB3YWl0aW5nIGZvciBtZXRhZGF0YScpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvIG1ldGFkYXRhJykpO1xuICAgICAgICB9O1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gVGltZW91dCBmYWxsYmFja1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgd2FpdGluZyBmb3IgbWV0YWRhdGEnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgaGl0IG1hcmtlcnMgaWYgc3RhcnRpbmcgZnJvbSBiZWdpbm5pbmdcbiAgICBjb25zdCBjdXJyZW50VGltZU1zID0gdmlkZW8uY3VycmVudFRpbWUgKiAxMDAwO1xuICAgIGlmIChjdXJyZW50VGltZU1zIDwgMTAwKSB7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgc3RhdGUgdG8gbG9hZGluZ1xuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGJlZm9yZSBwbGF5aW5nXG4gICAgICBjb25zdCBjdXJyZW50VmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWN1cnJlbnRWaWRlbyB8fCBjdXJyZW50VmlkZW8gIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBvciB1bmF2YWlsYWJsZScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF3YWl0IHBsYXkgcHJvbWlzZSAtIHRoaXMgaXMgY3JpdGljYWxcbiAgICAgIGF3YWl0IHZpZGVvLnBsYXkoKTtcbiAgICAgIFxuICAgICAgLy8gVmVyaWZ5IHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHBsYXkgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgY29uc3QgdmlkZW9BZnRlclBsYXkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJQbGF5IHx8IHZpZGVvQWZ0ZXJQbGF5ICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIHBsYXknKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQbGF5IHN1Y2NlZWRlZFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwbGF5aW5nJztcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BsYXkuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KHRydWUpO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHBsYXlpbmcgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICB9KTtcbiAgICAgICAgXG4gICAgICAvLyBDaGVjayBlYXJseSBtYXJrZXJzIChub24tYmxvY2tpbmcsIGRvZXNuJ3QgbmVlZCB0byBiZSBxdWV1ZWQpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKSB7XG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdCh0aGlzLmdsb2JhbEN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAvLyBQbGF5IGZhaWxlZFxuICAgICAgLy8gQ2hlY2sgaWYgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJFcnJvciA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlckVycm9yIHx8IHZpZGVvQWZ0ZXJFcnJvciAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBlcnJvcicpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIFxuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBhYm9ydGVkIChleHBlY3RlZCBkdXJpbmcgcGF1c2UpJyk7XG4gICAgICAgIC8vIEFib3J0RXJyb3IgaXMgZXhwZWN0ZWQsIHJlc2V0IHRvIHBhdXNlZCBzdGF0ZSBpbnN0ZWFkIG9mIGVycm9yXG4gICAgICAgIGlmICh2aWRlb0FmdGVyRXJyb3IgJiYgdmlkZW9BZnRlckVycm9yID09PSB2aWRlbykge1xuICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGZhaWxlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZVZpZGVvKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnBhdXNlVmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXVzZVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgLy8gQWxyZWFkeSBwYXVzZWQgLSBza2lwXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBhbHJlYWR5IHBhdXNlZCwgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzaW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcblxuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICBcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGF1c2VWaWRlb0ludGVybmFsOiBwYXVzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZSBtZWRpYSBvcGVyYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyB0aGUgQ1JJVElDQUwgZml4IGZvciBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICogQWxsIG1lZGlhIG9wZXJhdGlvbnMgKHBsYXksIHBhdXNlLCBzZWVrLCBzd2l0Y2gpIGdvIHRocm91Z2ggdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgPSB0aGlzLm9wZXJhdGlvblF1ZXVlXG4gICAgICAudGhlbigoKSA9PiBvcGVyYXRpb24oKSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBNZWRpYSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgaGFzTXVsdGlwbGVWaWRlb3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIFttc10uIHNlZ21lbnRCb3VuZGFyaWVzW2ldID0gc3VtIG9mIGR1cmF0aW9ucyBbMC4uaV0gKi9cbiAgZ2V0IHNlZ21lbnRCb3VuZGFyaWVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgYm91bmRhcmllczogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgZHVyYXRpb25zKSB7XG4gICAgICBzdW0gKz0gZDtcbiAgICAgIGJvdW5kYXJpZXMucHVzaChzdW0pO1xuICAgIH1cbiAgICByZXR1cm4gYm91bmRhcmllcztcbiAgfVxuXG4gIC8qKiBUb3RhbCBkdXJhdGlvbiBhY3Jvc3MgYWxsIHNlZ21lbnRzIGluIG1zICovXG4gIGdldCB0b3RhbER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxuXG4gIC8qKiBWaWRlbyBkdXJhdGlvbnMgaW4gbXMgKGRldGVjdGVkIG9yIGZyb20gc2luZ2xlIHZpZGVvIGVsZW1lbnQpICovXG4gIHByaXZhdGUgZ2V0IHZpZGVvRHVyYXRpb25zKCk6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucztcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvPy5kdXJhdGlvbiAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgIHJldHVybiBbdmlkZW8uZHVyYXRpb24gKiAxMDAwXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGdsb2JhbEN1cnJlbnRUaW1lKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCAhPT0gbnVsbCAmJiAhdGhpcy5pc1BsYXlpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3BsYXlpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXJnZXRHbG9iYWxUaW1lRHVyaW5nU3dpdGNoO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBvdmVycmlkZSBpZiB2aWRlbyBub3QgcmVhZHkgeWV0XG4gICAgICBpZiAodGhpcy50YXJnZXRHbG9iYWxUaW1lRHVyaW5nU3dpdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldEdsb2JhbFRpbWVEdXJpbmdTd2l0Y2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgcmV0dXJuIHNlZ21lbnRTdGFydCArIHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0dWFsR2xvYmFsVGltZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uIHx8ICFpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHJldHVybiAwO1xuICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgIHJldHVybiBzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDA7XG4gIH1cblxuICAvKiogR2xvYmFsIHN0ZXAgbWFya2VycyBmb3IgcmVuZGVyaW5nIG9uIHRoZSBjb21iaW5lZCB0aW1lbGluZSAqL1xuICBnZXQgZ2xvYmFsU3RlcE1hcmtlcnMoKTogQXJyYXk8eyBnbG9iYWxUaW1lOiBudW1iZXI7IHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J107IHRlc3RTdGVwSWQ/OiBudW1iZXI7IHRpdGxlPzogc3RyaW5nOyBsZXZlbD86IG51bWJlciB9PiB7XG4gICAgY29uc3QgYWxsTWFya2VycyA9IHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2Vycyk7XG4gICAgcmV0dXJuIGFsbE1hcmtlcnMubWFwKG0gPT4gKHtcbiAgICAgIGdsb2JhbFRpbWU6IG0uY3VtdWxhdGl2ZUR1cmF0aW9uLFxuICAgICAgcmVzdWx0OiBtLnJlc3VsdCxcbiAgICAgIHRlc3RTdGVwSWQ6IG0udGVzdFN0ZXBJZCxcbiAgICAgIHRpdGxlOiBtLnRpdGxlLFxuICAgICAgbGV2ZWw6IG0ubGV2ZWxcbiAgICB9KSk7XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpICYmIHRoaXMudmlkZW9VcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMuY3VycmVudFZpZGVvSW5kZXgsIDApLCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0aGlzLnZpZGVvVXJsc1tpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWRlb1VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcmVzZXRWaWRlb1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogcmVzZXR0aW5nJyk7XG5cbiAgICB2aWRlby5wYXVzZSgpO1xuICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSByZXNldFZpZGVvU3RhdGVJbnRlcm5hbDogY29tcGxldGUnKTtcbiAgfVxuXG4gIHByZXZWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggLT0gMTtcbiAgICAgIHRoaXMucmVzZXRWaWRlb1N0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCArPSAxO1xuICAgICAgdGhpcy5yZXNldFZpZGVvU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBvblRpbWVsaW5lQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY2xpY2tYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgY2xpY2tYIC8gcmVjdC53aWR0aCkpO1xuXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKHRvdGFsIDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdsb2JhbFRpbWVNcyA9IHBlcmNlbnQgKiB0b3RhbDtcbiAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25UaW1lbGluZUNsaWNrJywge1xuICAgICAgcGVyY2VudCxcbiAgICAgIGdsb2JhbFRpbWVNcyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmdcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9HbG9iYWxUaW1lKGdsb2JhbFRpbWVNcyk7XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgcGxheWluZyBzdGF0ZSBCRUZPUkUgcGF1c2luZ1xuICAgIC8vIFVzZSBib3RoIGlzUGxheWluZyBmbGFnIGFuZCBwbGF5ZXJTdGF0ZSBmb3IgcmVsaWFiaWxpdHlcbiAgICB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnID0gdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdGFydERyYWcnLCB7XG4gICAgICBjbGllbnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWdcbiAgICB9KTtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBkdXJpbmcgZHJhZyB0byBhdm9pZCBjb25mbGljdHNcbiAgICBpZiAodGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5hZGREcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvbkRyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgfHwgIXRoaXMudGltZWxpbmVCYXI/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRpbWVsaW5lQmFyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHggLyByZWN0LndpZHRoLCAxKSk7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHBlcmNlbnQgKiAxMDA7IC8vIEdsb2JhbCB0aW1lbGluZSBwb3NpdGlvblxuICB9XG5cbiAgc3RvcERyYWcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENhcHR1cmUgdGhlIHBsYXlpbmcgc3RhdGUgQkVGT1JFIGFueSBhc3luYyBvcGVyYXRpb25zXG4gICAgY29uc3Qgc2hvdWxkUmVzdW1lUGxheWluZyA9IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWc7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBkcmFnIGVuZGVkJywge1xuICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmc6IHNob3VsZFJlc3VtZVBsYXlpbmcsXG4gICAgICBjdXJyZW50UGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgIGlmICh0b3RhbCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBnbG9iYWxUaW1lTXMgPSAodGhpcy5wcm9ncmVzcyAvIDEwMCkgKiB0b3RhbDtcblxuICAgIC8vIENSSVRJQ0FMIEZJWDogUXVldWUgYm90aCBzZWVrIGFuZCByZXN1bWUgcGxheSB0b2dldGhlclxuICAgIC8vIFRoaXMgZW5zdXJlcyBzZWVrIGNvbXBsZXRlcyBiZWZvcmUgYXR0ZW1wdGluZyB0byBwbGF5XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFBlcmZvcm0gc2VlayAodGhpcyB3aWxsIHBhdXNlIHRoZSB2aWRlbylcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvR2xvYmFsVGltZShnbG9iYWxUaW1lTXMpO1xuICAgICAgXG4gICAgICAvLyBJZiB2aWRlbyB3YXMgcGxheWluZyBiZWZvcmUgZHJhZywgcmVzdW1lIGl0XG4gICAgICBpZiAoc2hvdWxkUmVzdW1lUGxheWluZykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RvcERyYWc6IHJlc3VtaW5nIHBsYXliYWNrIGFmdGVyIHNlZWsnLCB7XG4gICAgICAgICAgZ2xvYmFsVGltZU1zLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBhIGJpdCBsb25nZXIgdG8gZW5zdXJlIHNlZWsgaXMgZnVsbHkgY29tcGxldGVcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDE1MCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IHN0YXRlIGlzICdwYXVzZWQnIGFmdGVyIHNlZWsgKHNlZWtUb1RpbWVJbnRlcm5hbCBzZXRzIGl0IHRvICdwYXVzZWQnKVxuICAgICAgICAvLyBJZiBzdGF0ZSBpcyBzdGlsbCAnc2Vla2luZycsIHdhaXQgYSBiaXQgbW9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBzZWVrIHN0aWxsIGluIHByb2dyZXNzLCB3YWl0aW5nIG1vcmUnKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIE5vdyByZXN1bWUgcGxheWJhY2sgKHN0YXRlIHNob3VsZCBiZSAncGF1c2VkJyBhdCB0aGlzIHBvaW50KVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBwbGF5YmFjayByZXN1bWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3RvcERyYWc6IHVuZXhwZWN0ZWQgc3RhdGUgYWZ0ZXIgc2VlaywgYXR0ZW1wdGluZyB0byByZXN1bWUgYW55d2F5Jywge1xuICAgICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzdW1lIGFueXdheSAtIGJldHRlciB0byB0cnkgdGhhbiB0byBsZWF2ZSBpdCBzdHVja1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB2aWRlbyB3YXMgcGF1c2VkLCBub3QgcmVzdW1pbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5vbkRyYWcoZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zdG9wRHJhZygpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgICAgIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvblZpZGVvTWV0YWRhdGFMb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9NZXRhZGF0YUxvYWRlZCcpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cbiAgXG4gIG9uVmlkZW9DYW5QbGF5KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvQ2FuUGxheScpO1xuICAgIC8vIEVuc3VyZSBwbGF5YmFjayBzcGVlZCBpcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdmlkZW9zXG4gICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBvblZpZGVvRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIC8vIFNlYW1sZXNzbHkgbG9hZCBhbmQgcGxheSBuZXh0IHNlZ21lbnRcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDE7XG4gICAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBuZXh0SW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbbmV4dEluZGV4IC0gMV0gPz8gMCk7XG4gICAgICBcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChzZWdtZW50U3RhcnQpO1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFZpZGVvTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IDEwMCkgcmV0dXJuO1xuXG4gICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcblxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3N3aXRjaGluZycpIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxEdXJhdGlvbjtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRHbG9iYWxUaW1lRHVyaW5nU3dpdGNoIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIHRhcmdldCBwb3NpdGlvblxuICAgICAgICAgIC8vIFdoZW4gcGxheWluZywgYmUgbW9yZSBhZ2dyZXNzaXZlIGFib3V0IGNsZWFyaW5nIHRvIGFsbG93IGxpdmUgdXBkYXRlc1xuICAgICAgICAgIGlmICh0aGlzLnRhcmdldEdsb2JhbFRpbWVEdXJpbmdTd2l0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRHbG9iYWwgPSB0aGlzLmdldEFjdHVhbEdsb2JhbFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IHRoaXMuaXNQbGF5aW5nID8gMTAwMCA6IDUwMDsgLy8gTW9yZSB0b2xlcmFuY2Ugd2hlbiBwbGF5aW5nXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoY3VycmVudEdsb2JhbCAtIHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCkgPCB0b2xlcmFuY2UpIHtcbiAgICAgICAgICAgICAgdGhpcy50YXJnZXRHbG9iYWxUaW1lRHVyaW5nU3dpdGNoID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gZ2xvYmFsQ3VycmVudFRpbWUgbm93IGhhbmRsZXMgb3ZlcnJpZGUgbG9naWMgLSB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgICBpZiAodG90YWwgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZSAvIHRvdGFsKSAqIDEwMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHRoaXMuZ2xvYmFsQ3VycmVudFRpbWUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgdGltZSBoaXRzIGFueSBtYXJrZXJcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHRoaXMuZ2xvYmFsQ3VycmVudFRpbWUpO1xuXG4gICAgICAgICAgLy8gUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nXG4gICAgICAgICAgdGhpcy5tYXliZVByZWxvYWROZXh0U2VnbWVudCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG5cbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuICAgICAgfTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHMpLCA1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlbG9hZCBhbGwgdmlkZW8gVVJMcyBpbiBzZXF1ZW5jZSAoZmlyc3QsIHRoZW4gc2Vjb25kLCAuLi4pIHNvIHRoZXkgYXJlIGNhY2hlZC5cbiAgICogV2hlbiB1c2VyIGp1bXBzIHRvIGFueSBzZWdtZW50LCB0aGF0IHZpZGVvIGlzIGxpa2VseSBhbHJlYWR5IGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTtcbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ucHJlbG9hZCA9ICdhdXRvJztcbiAgICB2aWRlby5tdXRlZCA9IHRydWU7XG4gICAgdmlkZW8ucGxheXNJbmxpbmUgPSB0cnVlO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gdmlkZW87XG5cbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IGxvYWROZXh0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCAhPT0gdmlkZW8gfHwgaW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgICB2aWRlby5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVybCA9IHZpZGVvVXJsc1tpbmRleF07XG4gICAgICB2aWRlby5zcmMgPSB1cmw7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29uc3Qgb25Eb25lID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25Eb25lKTtcbiAgICAgICAgbG9hZE5leHQoKTtcbiAgICAgIH07XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgb25Eb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBvbkRvbmUoKSwgMTUwMDApO1xuICAgIH07XG4gICAgbG9hZE5leHQoKTtcbiAgfVxuXG4gIC8qKiBQcmVsb2FkIG5leHQgc2VnbWVudCB3aGVuIH41LTEwIHNlY29uZHMgZnJvbSBlbmRpbmcgdG8gbWluaW1pemUgc3dpdGNoaW5nIGRlbGF5ICovXG4gIHByaXZhdGUgbWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCB0aW1lTGVmdEluU2VnbWVudCA9ICh2aWRlby5kdXJhdGlvbiAtIHZpZGVvLmN1cnJlbnRUaW1lKSAqIDEwMDA7IC8vIG1zXG4gICAgaWYgKHRpbWVMZWZ0SW5TZWdtZW50ID4gMTAwMDAgfHwgdGltZUxlZnRJblNlZ21lbnQgPCA1MDAwKSByZXR1cm47IC8vIFByZWxvYWQgd2hlbiA1LTEwcyBmcm9tIGVuZFxuICAgIGNvbnN0IG5leHRVcmwgPSB0aGlzLnZpZGVvVXJsc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMV07XG4gICAgaWYgKCFuZXh0VXJsKSByZXR1cm47XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudD8uc3JjID09PSBuZXh0VXJsKSByZXR1cm47IC8vIEFscmVhZHkgcHJlbG9hZGluZ1xuICAgIHRoaXMucHJlbG9hZE5leHRTZWdtZW50KG5leHRVcmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVsb2FkTmV4dFNlZ21lbnQodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ucHJlbG9hZCA9ICdhdXRvJztcbiAgICB2aWRlby5zcmMgPSB1cmw7XG4gICAgdmlkZW8uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSB2aWRlbztcbiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgKCkgPT4ge1xuICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID09PSB2aWRlbykgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IGFjdHVhbCB2aWRlbyBkdXJhdGlvbnMgYnkgbG9hZGluZyB2aWRlbyBtZXRhZGF0YVxuICAgKiBUaGlzIGNyZWF0ZXMgdGVtcG9yYXJ5IHZpZGVvIGVsZW1lbnRzIHRvIHJlYWQgZHVyYXRpb24gd2l0aG91dCBwbGF5aW5nXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkZXRlY3RlZCBkdXJhdGlvbnNcbiAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICBsZXQgbG9hZGVkQ291bnQgPSAwO1xuXG4gICAgdmlkZW9VcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICBcbiAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB0ZW1wVmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gZHVyYXRpb25NcztcbiAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFuIHVwXG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgdGVtcFZpZGVvLnNyYyA9ICcnO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAobG9hZGVkQ291bnQgPT09IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gQWxsIHZpZGVvIGR1cmF0aW9ucyBkZXRlY3RlZDonLCB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTaW11bGF0b3JdIEZhaWxlZCB0byBsb2FkIG1ldGFkYXRhIGZvciB2aWRlbyAke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zW2luZGV4XSA9IDA7XG4gICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgdGVtcFZpZGVvLnNyYyA9ICcnO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlKCk7XG4gICAgICB9O1xuICAgICAgXG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgdGVtcFZpZGVvLnNyYyA9IHVybDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIGZvciBlYWNoIHZpZGVvXG4gICAqIFJldHVybnMgYW4gYXJyYXkgd2hlcmUgZWFjaCBlbGVtZW50IGlzIFtzdGFydER1cmF0aW9uLCBlbmREdXJhdGlvbl0gZm9yIHRoYXQgdmlkZW9cbiAgICogVXNlcyBkZXRlY3RlZCB2aWRlbyBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB2aWRlb0R1cmF0aW9ucyBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpOiBBcnJheTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+IHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGRldGVjdGVkIGR1cmF0aW9ucyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvdmlkZWQgZHVyYXRpb25zXG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zLmxlbmd0aCA+IDAgXG4gICAgICA/IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyBcbiAgICAgIDogW107XG4gICAgXG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYm91bmRhcmllczogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBjdW11bGF0aXZlU3RhcnQgPSAwO1xuICAgIFxuICAgIGZvciAoY29uc3QgZHVyYXRpb24gb2YgZHVyYXRpb25zKSB7XG4gICAgICBib3VuZGFyaWVzLnB1c2goe1xuICAgICAgICBzdGFydDogY3VtdWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGN1bXVsYXRpdmVTdGFydCArIGR1cmF0aW9uXG4gICAgICB9KTtcbiAgICAgIGN1bXVsYXRpdmVTdGFydCArPSBkdXJhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBhbGwgbWFya2VycyByZWN1cnNpdmVseSBpbmNsdWRpbmcgY2hpbGRTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBmbGF0dGVuTWFya2VycyhtYXJrZXJzOiBTdGVwTWFya2VyW10pOiBTdGVwTWFya2VyW10ge1xuICAgIGNvbnN0IGZsYXR0ZW5lZDogU3RlcE1hcmtlcltdID0gW107XG4gICAgXG4gICAgY29uc3QgZmxhdHRlblJlY3Vyc2l2ZSA9IChtYXJrZXJzOiBTdGVwTWFya2VyW10pID0+IHtcbiAgICAgIG1hcmtlcnMuZm9yRWFjaChtYXJrZXIgPT4ge1xuICAgICAgICAvLyBBZGQgdGhlIG1hcmtlciBpdHNlbGZcbiAgICAgICAgZmxhdHRlbmVkLnB1c2gobWFya2VyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGFkZCBjaGlsZCBtYXJrZXJzXG4gICAgICAgIGlmIChtYXJrZXIuY2hpbGRTdGVwcyAmJiBtYXJrZXIuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmxhdHRlblJlY3Vyc2l2ZShtYXJrZXIuY2hpbGRTdGVwcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgXG4gICAgZmxhdHRlblJlY3Vyc2l2ZShtYXJrZXJzKTtcbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja01hcmtlckhpdChnbG9iYWxUaW1lTXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENoZWNrIGFsbCBtYXJrZXJzIChpbmNsdWRpbmcgbmVzdGVkIG9uZXMpIGZvciBhIG1hdGNoXG4gICAgY29uc3QgYWxsTWFya2VycyA9IHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2Vycyk7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMjAwOyAvLyAyMDBtcyB0b2xlcmFuY2UgZm9yIG1hdGNoaW5nXG4gICAgXG4gICAgZm9yIChjb25zdCBtYXJrZXIgb2YgYWxsTWFya2Vycykge1xuICAgICAgLy8gU2tpcCBpZiBtYXJrZXIgZG9lc24ndCBoYXZlIHRlc3RTdGVwSWRcbiAgICAgIGlmICghbWFya2VyLnRlc3RTdGVwSWQpIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaGl0XG4gICAgICBpZiAodGhpcy5oaXRNYXJrZXJzLmhhcyhtYXJrZXIudGVzdFN0ZXBJZCkpIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IHRpbWUgbWF0Y2hlcyBtYXJrZXIgdGltZSAod2l0aGluIHRvbGVyYW5jZSlcbiAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMoZ2xvYmFsVGltZU1zIC0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbik7XG4gICAgICBpZiAodGltZURpZmZlcmVuY2UgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgIC8vIE1hcmsgYXMgaGl0IGFuZCBlbWl0IGV2ZW50XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBNYXJrZXIgaGl0IGRldGVjdGVkJywge1xuICAgICAgICAgIHRlc3RTdGVwSWQ6IG1hcmtlci50ZXN0U3RlcElkLFxuICAgICAgICAgIGN1bXVsYXRpdmVEdXJhdGlvbjogbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbixcbiAgICAgICAgICBjdXJyZW50VGltZTogZ2xvYmFsVGltZU1zLFxuICAgICAgICAgIHRpbWVEaWZmZXJlbmNlLFxuICAgICAgICAgIHRpdGxlOiBtYXJrZXIudGl0bGUsXG4gICAgICAgICAgbGV2ZWw6IG1hcmtlci5sZXZlbFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7IC8vIE9ubHkgZW1pdCBvbmUgbWFya2VyIHBlciBjaGVja1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J10pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlICdTVUNDRVNTJzpcbiAgICAgICAgcmV0dXJuICcjMTJCNzZBJztcbiAgICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgICByZXR1cm4gJyNCOTFDMUMnO1xuICAgICAgY2FzZSAnQUJPUlRFRCc6XG4gICAgICAgIHJldHVybiAnI0Y3OTAwOSc7XG4gICAgICBjYXNlICdTS0lQUEVEJzpcbiAgICAgICAgcmV0dXJuICcjNjY3MDg1JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnIzYzNjZGMSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyQ29sb3IobGV2ZWw/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBsZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjRkZBNTAwJztcbiAgfVxuXG4gIG9uTWFya2VyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIG1hcmtlcjogeyBnbG9iYWxUaW1lOiBudW1iZXI7IHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J107IHRlc3RTdGVwSWQ/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvR2xvYmFsVGltZShtYXJrZXIuZ2xvYmFsVGltZSk7XG4gICAgICBpZiAobWFya2VyLnRlc3RTdGVwSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgY29uc3QgZnVsbE1hcmtlciA9IHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2VycykuZmluZChtID0+IG0udGVzdFN0ZXBJZCA9PT0gbWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICBpZiAoZnVsbE1hcmtlcikgdGhpcy5tYXJrZXJIaXQuZW1pdChmdWxsTWFya2VyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZUZ1bGxTY3JlZW4oKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzUGxheWluZyA9IHRoaXMuaXNQbGF5aW5nO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwO1xuICAgIFxuICAgIC8vIFBhdXNlIHZpZGVvIGJlZm9yZSBmdWxsc2NyZWVuIHRyYW5zaXRpb24gdG8gYXZvaWQgc3RhdGUgaXNzdWVzXG4gICAgaWYgKHdhc1BsYXlpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUb2dnbGUgZnVsbHNjcmVlblxuICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gIXRoaXMuaXNGdWxsU2NyZWVuO1xuICAgIFxuICAgIC8vIFJlc2V0IHBsYXllciBzdGF0ZSB0byBhbGxvdyByZS1pbml0aWFsaXphdGlvbiBhZnRlciBET00gdXBkYXRlXG4gICAgLy8gVGhlIHN0YXRlIG1pZ2h0IGJlIHN0dWNrIGluICdsb2FkaW5nJyBvciAnZXJyb3InIGFmdGVyIGZ1bGxzY3JlZW4gdHJhbnNpdGlvblxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnbG9hZGluZycgfHwgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG4gICAgXG4gICAgLy8gV2FpdCBmb3IgQW5ndWxhciB0byB1cGRhdGUgdGhlIERPTSwgdGhlbiByZS1pbml0aWFsaXplIHZpZGVvXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAvLyBSZXN0b3JlIHZpZGVvIHBvc2l0aW9uIGlmIGl0IHdhcyBzZXRcbiAgICAgICAgaWYgKGN1cnJlbnRUaW1lID4gMCAmJiB2aWRlby5kdXJhdGlvbiA+IGN1cnJlbnRUaW1lKSB7XG4gICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXBwbHkgcGxheWJhY2sgcmF0ZVxuICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmUtYXR0YWNoIGxpc3RlbmVyc1xuICAgICAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXNldCBzdGF0ZSB0byAncGF1c2VkJyAocmVhZHkgdG8gcGxheSlcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIHJlLWluaXRpYWxpemVkJywge1xuICAgICAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVGdWxsU2NyZWVuOiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCBhZnRlciB0cmFuc2l0aW9uJyk7XG4gICAgICAgIC8vIFRyeSBhZ2FpbiBhZnRlciBhIGJpdCBtb3JlIHRpbWVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9SZXRyeSA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICBpZiAodmlkZW9SZXRyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2YWx1ZTtcbiAgICAvLyBQYXVzZSB2aWRlbyB3aGVuIHN3aXRjaGluZyBhd2F5IGZyb20gdmlkZW8gdmlld1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBldmVyeXRoaW5nIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gdmlkZW8gdmlld1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgbXVsdGlwbGUgdmlkZW9zLCByZXNldCB0byBmaXJzdCB2aWRlb1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscykge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCA9IDA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU3dpdGNoIHRvIGZpcnN0IHZpZGVvIGFuZCBzZWVrIHRvIDBcbiAgICAgICAgICBhd2FpdCB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY29uZHMgfHwgaXNOYU4oc2Vjb25kcykpIHJldHVybiAnMDA6MDAnO1xuICAgIFxuICAgIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyk7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKCh0b3RhbFNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gdG90YWxTZWNvbmRzICUgNjA7XG4gICAgXG4gICAgLy8gSWYgaG91cnMgPiAwLCBzaG93IEhIOk1NOlNTIGZvcm1hdCwgb3RoZXJ3aXNlIHNob3cgTU06U1MgZm9ybWF0XG4gICAgaWYgKGhvdXJzID4gMCkge1xuICAgICAgcmV0dXJuIGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYCR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1oLVsyMXB4XSc7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRTBGMkZFXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM3REQzRkNdYDtcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVGM0M3XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0QzNERdYDtcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRTJFMl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNBNUE1XWA7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXWA7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0QxRkFFNV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjNkVFN0I3XWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTIwMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDBgO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRDbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwMjg0QzddIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEOTc3MDZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDU5NjY5XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNjAwIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZFRyYWNlVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybC5lbmRzV2l0aCgnLnppcCcpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgdHJhY2U6IHRoaXMudHJhY2VWaWV3VXJsLFxuICAgICAgICBoaWRlSGVhZGVyOiAndHJ1ZScsXG4gICAgICAgIGhpZGVCcmFuZGluZzogJ3RydWUnLFxuICAgICAgICBlbWJlZDogJ3RydWUnLFxuICAgICAgICBtaW5pbWFsOiAndHJ1ZScsXG4gICAgICAgIG5vSGVhZGVyOiAndHJ1ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYGh0dHBzOi8vdHJhY2UucGxheXdyaWdodC5kZXYvPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhY2VWaWV3VXJsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTYWZlVHJhY2VVcmwoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5wcm9jZXNzZWRUcmFjZVVybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB9XG4gIH1cblxuICBvblRyYWNlVmlld2VyTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgb25UcmFjZVZpZXdlckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU3BlZWRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNwZWVkID0gdmFsdWU7XG4gICAgLy8gV2hlbmV2ZXIgc3BlZWQgY2hhbmdlcywgYXBwbHkgaXQgdG8gdGhlIGN1cnJlbnQgdmlkZW9cbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVTcGVlZENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSAhdGhpcy5pc1NwZWVkQ29udHJvbE9wZW47XG4gICAgaWYgKHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuKSB7XG4gICAgICB0aGlzLmFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50ICYmIFxuICAgICAgICAgICAgIXRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWdtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIF07XG4gICAgXG4gICAgLy8gT25seSBhZGQgVmlkZW8gdGFiIGlmIGhpZGVWaWRlb1RhYiBpcyBmYWxzZVxuICAgIGlmICghdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy50cmFjZVZpZXdVcmwpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdUcmFjZScsIHZhbHVlOiAndHJhY2UnLCBpY29uOiAnZ3JhcGhpY19lcScgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VnbWVudHMgPSBiYXNlU2VnbWVudHM7XG4gICAgXG4gICAgLy8gSWYgY3VycmVudCB2aWV3IGlzICd2aWRlbycgYW5kIHZpZGVvIHRhYiBpcyBoaWRkZW4sIHN3aXRjaCB0byBzY3JlZW5zaG90c1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAndmlkZW8nICYmIHRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ3NjcmVlbnNob3RzJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uVmlkZW9FbGVtZW50UmVhZHkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLl92cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiB2aWRlbyBlbGVtZW50IHJlYWR5Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZXJyb3IvbG9hZGluZyBzdGF0ZXMgd2hlbiB2aWRlbyBlbGVtZW50IGlzIHJlY3JlYXRlZCAoZS5nLiwgZHVyaW5nIGZ1bGxzY3JlZW4gdG9nZ2xlKVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHJlc2V0dGluZyBlcnJvci9sb2FkaW5nIHN0YXRlJyk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzd2l0Y2hUb1ZpZGVvQW5kU2VlayhjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbER1cmF0aW9uO1xuICAgIHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCA9IGN1bXVsYXRpdmVUaW1lc3RhbXA7XG4gICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1bXVsYXRpdmVUaW1lc3RhbXAgLyB0b3RhbCkgKiAxMDApKTtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ1JJVElDQUw6IFBhdXNlIGJlZm9yZSBzd2l0Y2hpbmcgc291cmNlXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIC8vIFN3aXRjaCB2aWRlbyBzb3VyY2VcbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFNlZWs6IGxvYWRlZG1ldGFkYXRhJywge1xuICAgICAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB2aWRlby5kdXJhdGlvbixcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFNlZWs6IHZpZGVvIGVycm9yJyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8nKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIH0sIDEwMCk7XG5cbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIGlmICh2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBtZXRhZGF0YSB0aW1lb3V0IGJ1dCB2aWRlbyByZWFkeScsIHtcbiAgICAgICAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHZpZGVvLmR1cmF0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFNlZWs6IG1ldGFkYXRhIHRpbWVvdXQgYW5kIHZpZGVvIG5vdCByZWFkeScpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCB3YWl0aW5nIGZvciB2aWRlbyB0byBsb2FkJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwMCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2VlayB0byB0aGUgdGFyZ2V0IHBvc2l0aW9uIHVzaW5nICdzZWVrZWQnIGV2ZW50IGZvciByZWxpYWJpbGl0eVxuICAgICAgY29uc3Qgc2Vla1NlY29uZHMgPSByZWxhdGl2ZVRpbWVzdGFtcCAvIDEwMDA7XG4gICAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlY29uZHMsIHZpZGVvLmR1cmF0aW9uIHx8IHNlZWtTZWNvbmRzKSk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2Vlazogc2V0dGluZyBjdXJyZW50VGltZScsIHtcbiAgICAgICAgdGFyZ2V0VGltZSxcbiAgICAgICAgc2Vla1NlY29uZHMsXG4gICAgICAgIHJlbGF0aXZlVGltZXN0YW1wLFxuICAgICAgICB2aWRlb0R1cmF0aW9uOiB2aWRlby5kdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvblNlZWtlZCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2Vlazogc2Vla2VkIGV2ZW50IGZpcmVkJywge1xuICAgICAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICAgICAgdGFyZ2V0VGltZSxcbiAgICAgICAgICAgIGRpZmY6IE1hdGguYWJzKHZpZGVvLmN1cnJlbnRUaW1lIC0gdGFyZ2V0VGltZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgYnJvd3NlciBoYXMgcHJvY2Vzc2VkIHRoZSBzZWVrXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDEwMCk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdzZWVrZWQnLCBvblNlZWtlZCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIFxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0XG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWVrZWQnLCBvblNlZWtlZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBzZWVrZWQgdGltZW91dCwgY3VycmVudCB0aW1lIGlzJywgdmlkZW8uY3VycmVudFRpbWUpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICAvLyBEb3VibGUtY2hlY2s6IGlmIHZpZGVvIGlzIG5vdCBhdCB0YXJnZXQsIGZvcmNlIGl0IGFnYWluXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiB2aWRlbyBub3QgYXQgdGFyZ2V0IGFmdGVyIHNlZWtlZCwgZm9yY2luZyBhZ2FpbicsIHtcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgdGFyZ2V0VGltZVxuICAgICAgICB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSBzZWVrIGNvbXBsZXRlZFxuICAgICAgY29uc3QgYWN0dWFsR2xvYmFsID0gdGhpcy5nZXRBY3R1YWxHbG9iYWxUaW1lKCk7XG4gICAgICBjb25zdCBhY3R1YWxWaWRlb1RpbWUgPSB2aWRlby5jdXJyZW50VGltZTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBzZWVrIHZlcmlmaWNhdGlvbicsIHtcbiAgICAgICAgYWN0dWFsR2xvYmFsLFxuICAgICAgICB0YXJnZXRHbG9iYWw6IGN1bXVsYXRpdmVUaW1lc3RhbXAsXG4gICAgICAgIGRpZmY6IE1hdGguYWJzKGFjdHVhbEdsb2JhbCAtIGN1bXVsYXRpdmVUaW1lc3RhbXApLFxuICAgICAgICBhY3R1YWxWaWRlb1RpbWUsXG4gICAgICAgIHRhcmdldFZpZGVvVGltZTogdGFyZ2V0VGltZSxcbiAgICAgICAgdmlkZW9EaWZmOiBNYXRoLmFicyhhY3R1YWxWaWRlb1RpbWUgLSB0YXJnZXRUaW1lKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIG92ZXJyaWRlIG9ubHkgaWYgdmlkZW8gaXMgYWN0dWFsbHkgYXQgdGhlIHRhcmdldFxuICAgICAgY29uc3QgdG9sZXJhbmNlID0gNTAwO1xuICAgICAgaWYgKE1hdGguYWJzKGFjdHVhbEdsb2JhbCAtIGN1bXVsYXRpdmVUaW1lc3RhbXApIDwgdG9sZXJhbmNlKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCA9IG51bGw7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2VlazogY2xlYXJlZCBvdmVycmlkZSAtIHZpZGVvIGF0IHRhcmdldCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgVUkgd2l0aCBhY3R1YWwgY3VycmVudCBwb3NpdGlvblxuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodGhpcy5nbG9iYWxDdXJyZW50VGltZSAvIHRvdGFsKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdCh0aGlzLmdsb2JhbEN1cnJlbnRUaW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgLy8gRXZlbiBvbiBlcnJvciwgdHJ5IHRvIHVwZGF0ZSB0byB0YXJnZXQgcG9zaXRpb25cbiAgICAgIGlmICh0b3RhbCA+IDApIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1bXVsYXRpdmVUaW1lc3RhbXAgLyB0b3RhbCkgKiAxMDApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgLy8gRG9uJ3QgY2xlYXIgdGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaCBoZXJlIC0gaXQncyBlaXRoZXIgYWxyZWFkeSBjbGVhcmVkXG4gICAgICAvLyBvciB3aWxsIGJlIGNsZWFyZWQgYnkgdGltZXVwZGF0ZSBoYW5kbGVyIHdoZW4gdmlkZW8gcmVhY2hlcyB0YXJnZXRcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFNlZWs6IGNvbXBsZXRlJywge1xuICAgICAgY3VycmVudFZpZGVvSW5kZXg6IHRoaXMuY3VycmVudFZpZGVvSW5kZXgsXG4gICAgICB2aWRlb0N1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIGdsb2JhbEN1cnJlbnRUaW1lOiB0aGlzLmdsb2JhbEN1cnJlbnRUaW1lLFxuICAgICAgdGFyZ2V0R2xvYmFsVGltZUR1cmluZ1N3aXRjaDogdGhpcy50YXJnZXRHbG9iYWxUaW1lRHVyaW5nU3dpdGNoLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBwcm9ncmVzczogdGhpcy5wcm9ncmVzc1xuICAgIH0pO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiICAgW25nU3R5bGVdPVwie1xuICBwb3NpdGlvbjogaXNGdWxsU2NyZWVuID8gJ2ZpeGVkJyA6IG51bGwsXG4gIGluc2V0OiBpc0Z1bGxTY3JlZW4gPyAnMXJlbScgOiBudWxsLFxuICB6SW5kZXg6IGlzRnVsbFNjcmVlbiA/ICc1MCcgOiBudWxsLFxuICBib3hTaGFkb3c6IGlzRnVsbFNjcmVlbiA/ICcwcHggMTNweCAyNXB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIDogbnVsbCxcbiAgYm9yZGVyUmFkaXVzOiBpc0Z1bGxTY3JlZW4gPyAnLjVyZW0nIDogbnVsbCxcbiAgYm9yZGVyOiBpc0Z1bGxTY3JlZW4gPyAnMXB4IHNvbGlkICNFNUU3RUInIDogbnVsbCxcbiAgd2lkdGg6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiBudWxsLFxuICBoZWlnaHQ6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiAnMTAwJScsXG4gIG92ZXJmbG93OiBpc0Z1bGxTY3JlZW4gPyAnaGlkZGVuJyA6IG51bGxcbn1cIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjRkZGRkZGXVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUI7Ym94LXNoYWRvdzogMHB4IDFweCAycHggMHB4ICMwMDAwMDAwRDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTGl2ZVwiIGNsYXNzPVwiY3FhLWgtWzIxcHhdIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1tci0yIGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtcm91bmRlZC1bNnB4XVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0Y5QkZCRjtcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy0yIGNxYS1oLTIgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRjQ3RjdGXSBjcWEtb3BhY2l0eS03NSBjcWEtYW5pbWF0ZS1waW5nXCI+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPkxpdmU8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfOTM1XzE1ODQ3KVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMC42MjUgNUMwLjYyNSA2LjE2MDMyIDEuMDg1OTQgNy4yNzMxMiAxLjkwNjQxIDguMDkzNTlDMi43MjY4OCA4LjkxNDA2IDMuODM5NjggOS4zNzUgNSA5LjM3NUM2LjE2MDMyIDkuMzc1IDcuMjczMTIgOC45MTQwNiA4LjA5MzU5IDguMDkzNTlDOC45MTQwNiA3LjI3MzEyIDkuMzc1IDYuMTYwMzIgOS4zNzUgNUM5LjM3NSAzLjgzOTY4IDguOTE0MDYgMi43MjY4OCA4LjA5MzU5IDEuOTA2NDFDNy4yNzMxMiAxLjA4NTk0IDYuMTYwMzIgMC42MjUgNSAwLjYyNUMzLjgzOTY4IDAuNjI1IDIuNzI2ODggMS4wODU5NCAxLjkwNjQxIDEuOTA2NDFDMS4wODU5NCAyLjcyNjg4IDAuNjI1IDMuODM5NjggMC42MjUgNVpcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0zLjEyNSA1QzMuMTI1IDMuODM5NjggMy4zMjI1NCAyLjcyNjg4IDMuNjc0MTcgMS45MDY0MUM0LjAyNTgxIDEuMDg1OTQgNC41MDI3MiAwLjYyNSA1IDAuNjI1QzUuNDk3MjggMC42MjUgNS45NzQxOSAxLjA4NTk0IDYuMzI1ODIgMS45MDY0MUM2LjY3NzQ2IDIuNzI2ODggNi44NzUgMy44Mzk2OCA2Ljg3NSA1QzYuODc1IDYuMTYwMzIgNi42Nzc0NiA3LjI3MzEyIDYuMzI1ODIgOC4wOTM1OUM1Ljk3NDE5IDguOTE0MDYgNS40OTcyOCA5LjM3NSA1IDkuMzc1QzQuNTAyNzIgOS4zNzUgNC4wMjU4MSA4LjkxNDA2IDMuNjc0MTcgOC4wOTM1OUMzLjMyMjU0IDcuMjczMTIgMy4xMjUgNi4xNjAzMiAzLjEyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjkzNzUgNi40NTg2Nkg5LjA2MjVNMC45Mzc1IDMuNTQxOTlIOS4wNjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfOTM1XzE1ODQ3XCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4wODMyNSAwLjgzMzAwOEgyLjkxNjU5QzIuNDU2MzUgMC44MzMwMDggMi4wODMyNSAxLjIwNjEgMi4wODMyNSAxLjY2NjM0VjguMzMzMDFDMi4wODMyNSA4Ljc5MzI0IDIuNDU2MzUgOS4xNjYzNCAyLjkxNjU5IDkuMTY2MzRINy4wODMyNUM3LjU0MzQ5IDkuMTY2MzQgNy45MTY1OCA4Ljc5MzI0IDcuOTE2NTggOC4zMzMwMVYxLjY2NjM0QzcuOTE2NTggMS4yMDYxIDcuNTQzNDkgMC44MzMwMDggNy4wODMyNSAwLjgzMzAwOFpcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41SDUuMDA0MTdcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gIWNxYS10ZXh0LVsxMHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1sLTJcIj5cbiAgICAgICAgICB7eyBwbGF0Zm9ybU5hbWUgfX1cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1tbC0xXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidTY3JlZW4gc2l6ZTogJyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCArICd4JyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIMK3XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1tbC0xXCI+XG4gICAgICAgICAgICAgIHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCB9fXh7eyBlZmZlY3RpdmVCcm93c2VyVmlld1BvcnQuaGVpZ2h0IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcygpXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZ2V0U3RhdHVzVGV4dENsYXNzKClcIj57eyBsaXZlU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTGl2ZVwiPlxuICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFxuICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNlZ21lbnRzXCIgXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4cGFuZFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAxLjI1SDguNzVWMy43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc0OTkyIDEuMjVMNS44MzMyNSA0LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgOC43NDk2N0w0LjE2NjY3IDUuODMzMDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NSA4Ljc1SDEuMjVWNi4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRnVsbFNjcmVlblwiIFxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeGl0IGZ1bGwgc2NyZWVuXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc1IDYuMjVINi4yNVY4Ljc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUwMDggNi4yNUw5LjE2Njc1IDkuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzMyNTIgMC44MzMwMDhMMy43NDk5MiAzLjc0OTY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgMy43NUgzLjc1VjEuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWgtW2NhbGMoMTAwJS00MXB4KV1cIj5cbiAgPCEtLSBMaXZlIENvbnRlbnQgVmlldyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCBjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSwgJ2NxYS1taW4tdy1tYXgnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgPCEtLSBMb2FkaW5nIFN0YXRlIC0tPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIExpdmUgQ29udGVudCAod2hlbiBub3QgbG9hZGluZykgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsaXZlU3RhdHVzID09PSAnRmFpbGVkJyAmJiBmYWlsZWRTdGF0dXNNZXNzYWdlXCIgY2xhc3M9XCJjcWEtcC02IGNxYS10ZXh0LWNlbnRlciBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC00IGNxYS1weS0zIGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS1tLTBcIj57eyBmYWlsZWRTdGF0dXNNZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJsaXZlU3RhdHVzICE9PSAnRmFpbGVkJyB8fCAhZmFpbGVkU3RhdHVzTWVzc2FnZVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm9ybWFsIFZpZGVvIFZpZXcgKHdoZW4gbm90IGxpdmUpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1weS00IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLW1heC1oLVtjYWxjKDEwMCUtODNweCldXCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJywgJ2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7J2NxYS1wLTQnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICN2cGxheWVyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY292ZXIgY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvblZpZGVvTWV0YWRhdGFMb2FkZWQoKVwiXG4gICAgICAgICAgICAgICAgICAoY2FucGxheSk9XCJvblZpZGVvQ2FuUGxheSgpXCJcbiAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTIgY3FhLXB5LTIgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTdFQjtcIiBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCIgKm5nSWY9XCJjdXJyZW50VmlkZW9VcmwgJiYgIWlzTGl2ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7XCI+XG4gICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1BsYXllclN3aXRjaGluZ1wiXG4gICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgZGlhbWV0ZXI9XCIxNlwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBsYXkoKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyBpc1BsYXlpbmcgPyAnUGF1c2UnIDogJ1BsYXknIH19XCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNQbGF5aW5nXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDJMMTMgOEwzIDE0VjJaXCIgZmlsbD1cIiMzNzQxNTFcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxMFwiIHk9XCIyXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZVwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShnbG9iYWxDdXJyZW50VGltZSAvIDEwMDApIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPGRpdiAjc3BlZWRDb250cm9sQ29udGFpbmVyIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1tci1bOHB4XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmUgY3FhLXB4LTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU3BlZWRDb250cm9sKClcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInUGxheWJhY2sgU3BlZWQnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCI+XG4gICAgICAgICAgICAgIHt7IGN1cnJlbnRTcGVlZCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNTcGVlZENvbnRyb2xPcGVuXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1mdWxsIGNxYS1tYi0yIGNxYS1yaWdodC0wIGNxYS1iZy1bI0YwRjBGMV0gY3FhLXJvdW5kZWQtbGcgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtc2hhZG93LWxnIGNxYS16LTUwXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IG1heC1jb250ZW50OyBsZWZ0OiA1MCU7IGJvdHRvbTogMCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPlxuICAgICAgICAgICAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgICAgICAgICAgIFtzZWdtZW50c109XCJzcGVlZFNlZ21lbnRzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFNwZWVkXCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyQmdDb2xvcl09XCInI0YwRjBGMSdcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNwZWVkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgXG4gICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICN0aW1lbGluZUJhclxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWZsZXgtMVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25UaW1lbGluZUNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1hcmtlciBvZiBnbG9iYWxTdGVwTWFya2Vyc1wiIFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJ0b3RhbER1cmF0aW9uID4gMCA/IChtYXJrZXIuZ2xvYmFsVGltZSAvIHRvdGFsRHVyYXRpb24pICogMTAwIDogMFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRHbG9iYWxNYXJrZXJDb2xvcihtYXJrZXIubGV2ZWwpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCInMnB4IHNvbGlkICcgKyBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihtYXJrZXIucmVzdWx0KVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3gtc2l6aW5nXT1cIidib3JkZXItYm94J1wiXG4gICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm1hcmtlci50aXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87IHotaW5kZXg6IDUwOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB0b3A6IDUwJTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXJrZXJDbGljaygkZXZlbnQsIG1hcmtlcilcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10b3AtMS8yIGNxYS13LTMgY3FhLWgtMyBjcWEtYmctYmx1ZS02MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLWdyYWIgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmcgY3FhLXNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiA2MDtcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVs5cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lXCI+XG4gICAgICAgICAgICB7eyBmb3JtYXRUaW1lKHRvdGFsRHVyYXRpb24gLyAxMDAwKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktNCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIFtuZ0NsYXNzXT1cInsnY3FhLXAtNCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtbWF4LWgtW2luaGVyaXRdJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwic2NyZWVuU2hvdFVybFwiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJTY3JlZW5zaG90XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgTm8gc2NyZWVuc2hvdCBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd0cmFjZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1yZWxhdGl2ZVwiICpuZ0lmPVwidHJhY2VWaWV3VXJsXCIgW25nQ2xhc3NdPVwieychY3FhLWgtZnVsbCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNDhweDsgcGFkZGluZy1ib3R0b206IDBweDtcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgIDxpZnJhbWUgXG4gICAgICAgICAgICBbc3JjXT1cInNhZmVUcmFjZVVybFwiIFxuICAgICAgICAgICAgdGl0bGU9XCJUcmFjZSBWaWV3ZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLXctZnVsbCBjcWEtbWluLWgtWzI1MHB4XSBjcWEtbWF4LWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNDhweDsgaGVpZ2h0OiBjYWxjKDEwMCUgKyA0OHB4KTtcIlxuICAgICAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGxvYWRpbmc9XCJsYXp5XCJcbiAgICAgICAgICAgIChsb2FkKT1cIm9uVHJhY2VWaWV3ZXJMb2FkKClcIlxuICAgICAgICAgICAgKGVycm9yKT1cIm9uVHJhY2VWaWV3ZXJFcnJvcigpXCI+XG4gICAgICAgICAgPC9pZnJhbWU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyTG9hZGluZ1wiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBMb2FkaW5nIHRyYWNlIHZpZXdlci4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckVycm9yXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIHRyYWNlIHZpZXdlclxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhdHJhY2VWaWV3VXJsXCI+XG4gICAgICAgIE5vIHRyYWNlIGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+ICBcbiAgPC9kaXY+XG48L2Rpdj4iXX0=
1648
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBRWxKLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7OztBQW1DbkYsTUFBTSxPQUFPLGtCQUFrQjtJQWlQN0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQS9PbEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBVyxjQUFjLENBQUM7UUFDdEMsaUJBQVksR0FBeUIsU0FBUyxDQUFDO1FBQy9DLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixlQUFVLEdBQTZFLGFBQWEsQ0FBQztRQUNyRyxxQkFBZ0IsR0FBVyxZQUFZLENBQUM7UUFDeEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsK0JBQTBCLEdBQVcsRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQWdCLE9B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c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFLSCxVQUFVO3NCQURiLFNBQVM7dUJBQUMsU0FBUztnQkFlaEIsY0FBYztzQkFEakIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWF2Qyx3QkFBd0I7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSB2aWRlb1RpbWVVcGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGxheSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZGVvUGF1c2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYXJrZXJIaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNYXJrZXI+KCk7XG4gIEBPdXRwdXQoKSBpc1ZpZGVvUGxheWluZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF92cGxheWVyPzogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCd2cGxheWVyJylcbiAgc2V0IHZwbGF5ZXJSZWYocmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRWaWV3OiBzdHJpbmcgPSAndmlkZW8nO1xuICBjdXJyZW50VmlkZW9JbmRleDogbnVtYmVyID0gMDtcbiAgY3VycmVudFNwZWVkOiBzdHJpbmcgPSAnMXgnO1xuICBpc1NwZWVkQ29udHJvbE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXRlY3RlZFZpZGVvRHVyYXRpb25zOiBudW1iZXJbXSA9IFtdOyAvLyBBY3R1YWwgZHVyYXRpb25zIGRldGVjdGVkIGZyb20gdmlkZW8gbWV0YWRhdGFcbiAgcHJpdmF0ZSB3YXNQbGF5aW5nQmVmb3JlRHJhZzogYm9vbGVhbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB2aWRlbyB3YXMgcGxheWluZyBiZWZvcmUgZHJhZyBzdGFydGVkXG4gIHByaXZhdGUgcGxheVByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgcGxheSBwcm9taXNlXG4gIHByaXZhdGUgaGl0TWFya2VyczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7IC8vIFRyYWNrIHdoaWNoIG1hcmtlcnMgaGF2ZSBiZWVuIGhpdCAoYnkgdGVzdFN0ZXBJZClcblxuICAvLyBTdGF0ZSBtYWNoaW5lIGZvciByb2J1c3QgbWVkaWEgb3BlcmF0aW9uc1xuICBwcml2YXRlIHBsYXllclN0YXRlOiAnaWRsZScgfCAnbG9hZGluZycgfCAncmVhZHknIHwgJ3BsYXlpbmcnIHwgJ3BhdXNlZCcgfCAnc2Vla2luZycgfCAnc3dpdGNoaW5nJyB8ICdlcnJvcicgPSAnaWRsZSc7XG4gIHByaXZhdGUgb3BlcmF0aW9uUXVldWU6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTsgLy8gU2VyaWFsaXplIGFsbCBtZWRpYSBvcGVyYXRpb25zXG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cbiAgZ2V0IHNob3VsZEFwcGx5U21hbGxIZWlnaHRDbGFzc2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJIZWlnaHQgPCA2MDAgJiYgdGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJyAmJiB0aGlzLmlzTGl2ZTtcbiAgfVxuXG4gIHNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSxcbiAgXTtcblxuICBzcGVlZFNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJzF4JywgdmFsdWU6ICcxeCcgfSxcbiAgICB7IGxhYmVsOiAnMngnLCB2YWx1ZTogJzJ4JyB9LFxuICAgIHsgbGFiZWw6ICc1eCcsIHZhbHVlOiAnNXgnIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSB2aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2V0RHVyYXRpb246IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGRyYWdNb3VzZU1vdmVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZHJhZ01vdXNlVXBIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcjogKChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmVsb2FkQWxsVmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIFxuICBzYWZlVHJhY2VVcmw6IFNhZmVSZXNvdXJjZVVybDtcbiAgdHJhY2VWaWV3ZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHRyYWNlVmlld2VyRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb3JyZWN0RGV2aWNlRnJhbWVBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbXB0eVN0YXRlQ29uZmlnID0gZ2V0RW1wdHlTdGF0ZVByZXNldCgnbm90aGluZ1RvRGlzcGxheScpO1xuICByZWFkb25seSBkZXZpY2VFcnJvckVtcHR5U3RhdGVDb25maWcgPSB7XG4gICAgLi4udGhpcy5lbXB0eVN0YXRlQ29uZmlnLFxuICAgIHRpdGxlOiAnRGV2aWNlIE5vdCBTdXBwb3J0ZWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRldmljZSB5b3UgYXJlIHRyeWluZyB0byB1c2UgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgIGFjdGlvbnM6IFtdXG4gIH07XG5cbiAgZ2V0IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHsgd2lkdGg6IDEyODAsIGhlaWdodDogNzIwIH07XG5cbiAgICBpZiAoIXRoaXMuYnJvd3NlclZpZXdQb3J0KSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gTnVtYmVyKCh0aGlzLmJyb3dzZXJWaWV3UG9ydCBhcyBhbnkpLndpZHRoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkuaGVpZ2h0KTtcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCAhTnVtYmVyLmlzRmluaXRlKGhlaWdodCkgfHwgd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWaWV3cG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGRldmljZUZyYW1lQ29uZmlnczogUmVjb3JkPHN0cmluZywgRGV2aWNlRnJhbWVDb25maWc+ID0ge1xuICAgIC8vIFBpeGVsc1xuICAgICdQaXhlbCA1Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtNS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMiUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDgnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC04LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIuNSUnLFxuICAgICAgICBsZWZ0OiAnNC41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdQaXhlbCA5Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtOS1wcm8ud2VicCcsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICc0JScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICc0JScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG5cbiAgICAnR2FsYXh5IFMyMCBGRSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3NhbXN1bmctZ2FsYXh5LXMyMC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMS41JScsXG4gICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG5cbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICB0aGlzLnNhZmVUcmFjZVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgnJyk7XG4gICAgdGhpcy51cGRhdGVTZWdtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGV2aWNlRnJhbWVDb25maWcoKTogRGV2aWNlRnJhbWVDb25maWcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzWydicm93c2VyJ10gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgZGV2aWNlTmFtZSBhbmQgaXRzIGZyYW1lIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0XG4gICAgICBpZiAodGhpcy5kZXZpY2VOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW3RoaXMuZGV2aWNlTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW3RoaXMuZGV2aWNlTmFtZV07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIG5vIGRldmljZU5hbWUgb3IgZGV2aWNlTmFtZSdzIGZyYW1lIG5vdCBhdmFpbGFibGUsIHVzZSBkZWZhdWx0cyBiYXNlZCBvbiBwbGF0Zm9ybVxuICAgICAgaWYgKHRoaXMucGxhdGZvcm0gPT09ICdhbmRyb2lkJykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZ3NbJ1BpeGVsIDknXSB8fCBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGxhdGZvcm0gPT09ICdpb3MnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snaVBob25lIDE1J10gfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvVXJscyddKSB7XG4gICAgICBjb25zdCBhcnIgPSBjaGFuZ2VzWyd2aWRlb1VybHMnXS5jdXJyZW50VmFsdWUgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJyICYmIGFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmRldGVjdFZpZGVvRHVyYXRpb25zKGFycik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHMoYXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBwbGF5VmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB2aWRlbyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKiBUaGlzIGVsaW1pbmF0ZXMgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBsYXlWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IG5vdCBmb3VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgcGxheWluZyAtIHNraXBcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGFscmVhZHkgcGxheWluZywgc2tpcHBpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHN0YXJ0aW5nJywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBXYWl0IGZvciB2aWRlbyB0byBiZSByZWFkeSBpZiBuZWVkZWRcbiAgICBpZiAodmlkZW8ucmVhZHlTdGF0ZSA8IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB3YWl0aW5nIGZvciBtZXRhZGF0YScpO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvIG1ldGFkYXRhJykpO1xuICAgICAgICB9O1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBoaXQgbWFya2VycyBpZiBzdGFydGluZyBmcm9tIGJlZ2lubmluZ1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lTXMgPSB2aWRlby5jdXJyZW50VGltZSAqIDEwMDA7XG4gICAgaWYgKGN1cnJlbnRUaW1lTXMgPCAxMDApIHtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIFNldCBzdGF0ZSB0byBsb2FkaW5nXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdsb2FkaW5nJztcblxuICAgIHRyeSB7XG4gICAgICAvLyBWZXJpZnkgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGUgYmVmb3JlIHBsYXlpbmdcbiAgICAgIGNvbnN0IGN1cnJlbnRWaWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghY3VycmVudFZpZGVvIHx8IGN1cnJlbnRWaWRlbyAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIG9yIHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQXdhaXQgcGxheSBwcm9taXNlIC0gdGhpcyBpcyBjcml0aWNhbFxuICAgICAgYXdhaXQgdmlkZW8ucGxheSgpO1xuICAgICAgXG4gICAgICAvLyBWZXJpZnkgdmlkZW8gZWxlbWVudCBpcyBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgcGxheSBwcm9taXNlIHJlc29sdmVzXG4gICAgICBjb25zdCB2aWRlb0FmdGVyUGxheSA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW9BZnRlclBsYXkgfHwgdmlkZW9BZnRlclBsYXkgIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBkdXJpbmcgcGxheScpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFBsYXkgc3VjY2VlZGVkXG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BsYXlpbmcnO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLnZpZGVvUGxheS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogcGxheWluZyBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgIH0pO1xuICAgICAgICBcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgJiYgdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgdiA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgICAgICAgIHRoaXMuY2hlY2tNYXJrZXJIaXQoc2VnbWVudFN0YXJ0ICsgdi5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIC8vIFBsYXkgZmFpbGVkXG4gICAgICAvLyBDaGVjayBpZiB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZVxuICAgICAgY29uc3QgdmlkZW9BZnRlckVycm9yID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlb0FmdGVyRXJyb3IgfHwgdmlkZW9BZnRlckVycm9yICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgZHVyaW5nIGVycm9yJyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgICAgXG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IGFib3J0ZWQgKGV4cGVjdGVkIGR1cmluZyBwYXVzZSknKTtcbiAgICAgICAgLy8gQWJvcnRFcnJvciBpcyBleHBlY3RlZCwgcmVzZXQgdG8gcGF1c2VkIHN0YXRlIGluc3RlYWQgb2YgZXJyb3JcbiAgICAgICAgaWYgKHZpZGVvQWZ0ZXJFcnJvciAmJiB2aWRlb0FmdGVyRXJyb3IgPT09IHZpZGVvKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogZmFpbGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHBhdXNlVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucGF1c2VWaWRlb0ludGVybmFsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhdXNlVmlkZW9JbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICAvLyBBbHJlYWR5IHBhdXNlZCAtIHNraXBcbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwYXVzZVZpZGVvSW50ZXJuYWw6IGFscmVhZHkgcGF1c2VkLCBza2lwcGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwYXVzZVZpZGVvSW50ZXJuYWw6IHBhdXNpbmcnLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZVxuICAgIH0pO1xuXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwYXVzZVZpZGVvSW50ZXJuYWw6IHBhdXNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlIG1lZGlhIG9wZXJhdGlvbiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKiBUaGlzIGlzIHRoZSBDUklUSUNBTCBmaXggZm9yIEZGbXBlZ0RlbXV4ZXIgZXJyb3JzIGFuZCBwbGF5IHByb21pc2UgaW50ZXJydXB0aW9uc1xuICAgKiBBbGwgbWVkaWEgb3BlcmF0aW9ucyAocGxheSwgcGF1c2UsIHNlZWssIHN3aXRjaCkgZ28gdGhyb3VnaCB0aGlzIHF1ZXVlXG4gICAqL1xuICBwcml2YXRlIGVucXVldWVPcGVyYXRpb24ob3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gICAgdGhpcy5vcGVyYXRpb25RdWV1ZSA9IHRoaXMub3BlcmF0aW9uUXVldWVcbiAgICAgIC50aGVuKCgpID0+IG9wZXJhdGlvbigpKVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIE1lZGlhIG9wZXJhdGlvbiBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBoYXNNdWx0aXBsZVZpZGVvcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgJiYgdGhpcy52aWRlb1VybHMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIC8qKiBDdW11bGF0aXZlIGR1cmF0aW9uIGJvdW5kYXJpZXMgW21zXS4gc2VnbWVudEJvdW5kYXJpZXNbaV0gPSBzdW0gb2YgZHVyYXRpb25zIFswLi5pXSAqL1xuICBnZXQgc2VnbWVudEJvdW5kYXJpZXMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMudmlkZW9EdXJhdGlvbnM7XG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBib3VuZGFyaWVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAoY29uc3QgZCBvZiBkdXJhdGlvbnMpIHtcbiAgICAgIHN1bSArPSBkO1xuICAgICAgYm91bmRhcmllcy5wdXNoKHN1bSk7XG4gICAgfVxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqIFRvdGFsIGR1cmF0aW9uIGFjcm9zcyBhbGwgc2VnbWVudHMgaW4gbXMgKi9cbiAgZ2V0IHRvdGFsRHVyYXRpb24oKTogbnVtYmVyIHtcbiAgICBjb25zdCBkdXJhdGlvbnMgPSB0aGlzLnZpZGVvRHVyYXRpb25zO1xuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICByZXR1cm4gZHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9XG5cbiAgLyoqIFZpZGVvIGR1cmF0aW9ucyBpbiBtcyAoZGV0ZWN0ZWQgb3IgZnJvbSBzaW5nbGUgdmlkZW8gZWxlbWVudCkgKi9cbiAgcHJpdmF0ZSBnZXQgdmlkZW9EdXJhdGlvbnMoKTogbnVtYmVyW10ge1xuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodmlkZW8/LmR1cmF0aW9uICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFt2aWRlby5kdXJhdGlvbiAqIDEwMDBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIGxldCBtYXJrZXJzVG9Qcm9jZXNzOiBTdGVwTWFya2VyW107XG4gICAgXG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IGJvdW5kYXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4XTtcbiAgICAgICAgXG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzXG4gICAgICAgICAgLmZpbHRlcihtYXJrZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPj0gY3VycmVudEJvdW5kYXJ5LnN0YXJ0ICYmIFxuICAgICAgICAgICAgICAgICAgIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPCBjdXJyZW50Qm91bmRhcnkuZW5kO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChtYXJrZXIgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24oXG4gICAgICAgICAgICBtYXJrZXIsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuZW5kXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKG1hcmtlcnNUb1Byb2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obWFya2VyOiBTdGVwTWFya2VyLCBhZGp1c3RtZW50OiBudW1iZXIsIHZpZGVvU3RhcnQ6IG51bWJlciwgdmlkZW9FbmQ6IG51bWJlcik6IFN0ZXBNYXJrZXIge1xuICAgIGNvbnN0IGFkanVzdGVkTWFya2VyOiBTdGVwTWFya2VyID0ge1xuICAgICAgLi4ubWFya2VyLFxuICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgIH07XG4gICAgXG4gICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFkanVzdGVkTWFya2VyLmNoaWxkU3RlcHMgPSBtYXJrZXIuY2hpbGRTdGVwc1xuICAgICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBjb25zdCBhZGp1c3RlZENoaWxkOiBTdGVwTWFya2VyID0ge1xuICAgICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgICBjdW11bGF0aXZlRHVyYXRpb246IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjaGlsZC5jaGlsZFN0ZXBzICYmIGNoaWxkLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWRqdXN0ZWRDaGlsZC5jaGlsZFN0ZXBzID0gY2hpbGQuY2hpbGRTdGVwc1xuICAgICAgICAgICAgICAuZmlsdGVyKG5lc3RlZENoaWxkID0+IG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAgICAgICAubWFwKG5lc3RlZENoaWxkID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG5lc3RlZENoaWxkLCBhZGp1c3RtZW50LCB2aWRlb1N0YXJ0LCB2aWRlb0VuZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRDaGlsZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZGp1c3RlZE1hcmtlcjtcbiAgfVxuXG4gIGdldFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybiAwO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvIGR1cmF0aW9uTXMpICogMTAwO1xuICB9XG5cbiAgZ2V0U3RlcENvbG9yKHN0ZXA6IFN0ZXBNYXJrZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdGVwLmxldmVsID09PSAxID8gJyMwMDAwMDAnIDogJyM2MzY2RjEnO1xuICB9XG5cbiAgZ2V0U3RlcFJlc3VsdENvbG9yKHN0ZXA6IFN0ZXBNYXJrZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHN0ZXAucmVzdWx0KTtcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlckNvbG9yKGxldmVsPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnI0ZGQTUwMCc7XG4gIH1cblxuICBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihyZXN1bHQ6IFN0ZXBNYXJrZXJbJ3Jlc3VsdCddKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgY2FzZSAnU1VDQ0VTUyc6XG4gICAgICAgIHJldHVybiAnIzEyQjc2QSc7XG4gICAgICBjYXNlICdGQUlMVVJFJzpcbiAgICAgICAgcmV0dXJuICcjQjkxQzFDJztcbiAgICAgIGNhc2UgJ0FCT1JURUQnOlxuICAgICAgICByZXR1cm4gJyNGNzkwMDknO1xuICAgICAgY2FzZSAnU0tJUFBFRCc6XG4gICAgICAgIHJldHVybiAnIzY2NzA4NSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyM2MzY2RjEnO1xuICAgIH1cbiAgfVxuXG4gIG9uTWFya2VyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIG1hcmtlcjogU3RlcE1hcmtlcik6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uO1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKG1hcmtlci50ZXN0U3RlcElkICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5oaXRNYXJrZXJzLmFkZChtYXJrZXIudGVzdFN0ZXBJZCk7XG4gICAgICAgIHRoaXMubWFya2VySGl0LmVtaXQobWFya2VyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VmlkZW9VcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZpZGVvVXJscykgJiYgdGhpcy52aWRlb1VybHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy5jdXJyZW50VmlkZW9JbmRleCwgMCksIHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHRoaXMudmlkZW9VcmxzW2lkeF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZGVvVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHZpZGVvIHN0YXRlIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSByZXNldFZpZGVvU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsOiByZXNldHRpbmcnKTtcblxuICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHJlc2V0VmlkZW9TdGF0ZUludGVybmFsOiBjb21wbGV0ZScpO1xuICB9XG5cbiAgcHJldlZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID4gMCkge1xuICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwodGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDEpKTtcbiAgICB9XG4gIH1cblxuICBuZXh0VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZWxpbmVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aW1lbGluZUJhcj8ubmF0aXZlRWxlbWVudCB8fCAhdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8uZHVyYXRpb24gfHwgIWlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGltZWxpbmVCYXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjbGlja1ggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGlja1ggLyByZWN0LndpZHRoKSk7XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBwZXJjZW50ICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblRpbWVsaW5lQ2xpY2snLCB7XG4gICAgICBwZXJjZW50LFxuICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMOiBDYXB0dXJlIHBsYXlpbmcgc3RhdGUgQkVGT1JFIHBhdXNpbmdcbiAgICAvLyBVc2UgYm90aCBpc1BsYXlpbmcgZmxhZyBhbmQgcGxheWVyU3RhdGUgZm9yIHJlbGlhYmlsaXR5XG4gICAgdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyA9IHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RhcnREcmFnJywge1xuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gZHVyaW5nIGRyYWcgdG8gYXZvaWQgY29uZmxpY3RzXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25EcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4IC8gcmVjdC53aWR0aCwgMSkpO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwOyAvLyBHbG9iYWwgdGltZWxpbmUgcG9zaXRpb25cbiAgfVxuXG4gIHN0b3BEcmFnKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVycygpO1xuICAgIFxuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogZHJhZyBlbmRlZCcsIHtcbiAgICAgIHByb2dyZXNzOiB0aGlzLnByb2dyZXNzLFxuICAgICAgd2FzUGxheWluZ0JlZm9yZURyYWc6IHRoaXMud2FzUGxheWluZ0JlZm9yZURyYWcsXG4gICAgICBzaG91bGRSZXN1bWVQbGF5aW5nOiBzaG91bGRSZXN1bWVQbGF5aW5nLFxuICAgICAgY3VycmVudFBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgfSk7XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSAodGhpcy5wcm9ncmVzcyAvIDEwMCkgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG5cbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIFxuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiByZXN1bWluZyBwbGF5YmFjayBhZnRlciBzZWVrJywge1xuICAgICAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFdhaXQgYSBiaXQgbG9uZ2VyIHRvIGVuc3VyZSBzZWVrIGlzIGZ1bGx5IGNvbXBsZXRlXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxNTApKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzdGF0ZSBpcyAncGF1c2VkJyBhZnRlciBzZWVrIChzZWVrVG9UaW1lSW50ZXJuYWwgc2V0cyBpdCB0byAncGF1c2VkJylcbiAgICAgICAgLy8gSWYgc3RhdGUgaXMgc3RpbGwgJ3NlZWtpbmcnLCB3YWl0IGEgYml0IG1vcmVcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdzZWVraW5nJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogc2VlayBzdGlsbCBpbiBwcm9ncmVzcywgd2FpdGluZyBtb3JlJyk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3cgcmVzdW1lIHBsYXliYWNrIChzdGF0ZSBzaG91bGQgYmUgJ3BhdXNlZCcgYXQgdGhpcyBwb2ludClcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcGxheWJhY2sgcmVzdW1lZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB1bmV4cGVjdGVkIHN0YXRlIGFmdGVyIHNlZWssIGF0dGVtcHRpbmcgdG8gcmVzdW1lIGFueXdheScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gVHJ5IHRvIHJlc3VtZSBhbnl3YXkgLSBiZXR0ZXIgdG8gdHJ5IHRoYW4gdG8gbGVhdmUgaXQgc3R1Y2tcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdmlkZW8gd2FzIHBhdXNlZCwgbm90IHJlc3VtaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMub25EcmFnKGUpO1xuICAgIH07XG5cbiAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3RvcERyYWcoKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25WaWRlb01ldGFkYXRhTG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvTWV0YWRhdGFMb2FkZWQnKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG4gIFxuICBvblZpZGVvQ2FuUGxheSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0NhblBsYXknKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25WaWRlb0VuZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICAvLyBTd2l0Y2ggdG8gbmV4dCB2aWRlbyBhbmQgcmVzZXQgdG8gMFxuICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzICYmIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPCB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICs9IDE7XG4gICAgICBcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGxheVZpZGVvSW50ZXJuYWwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hWaWRlb0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xuICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyAtIGxhc3RVcGRhdGUgPCAxMDApIHJldHVybjtcblxuICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xuICAgICAgICBjb25zdCBjdXJyZW50TXMgPSB2aWRlby5jdXJyZW50VGltZSAqIDEwMDA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdzd2l0Y2hpbmcnKSB7XG4gICAgICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzICgwLTEwMCUgb2YgY3VycmVudCB2aWRlbylcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKGN1cnJlbnRNcyAvIGR1cmF0aW9uTXMpICogMTAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEVtaXQgY3VtdWxhdGl2ZSB0aW1lIGZvciBwYXJlbnQgKHN0ZXAgaGlnaGxpZ2h0aW5nKVxuICAgICAgICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgICAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmNoZWNrTWFya2VySGl0KHNlZ21lbnRTdGFydCArIGN1cnJlbnRNcyk7XG4gICAgICAgICAgdGhpcy5tYXliZVByZWxvYWROZXh0U2VnbWVudCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlcik7XG5cbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuICAgICAgfTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHMpLCA1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlbG9hZCBhbGwgdmlkZW8gVVJMcyBpbiBzZXF1ZW5jZSAoZmlyc3QsIHRoZW4gc2Vjb25kLCAuLi4pIHNvIHRoZXkgYXJlIGNhY2hlZC5cbiAgICogV2hlbiB1c2VyIGp1bXBzIHRvIGFueSBzZWdtZW50LCB0aGF0IHZpZGVvIGlzIGxpa2VseSBhbHJlYWR5IGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgcHJlbG9hZEFsbFNlZ21lbnRzKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxQcmVsb2FkQWxsU2VnbWVudHMoKTtcbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ucHJlbG9hZCA9ICdhdXRvJztcbiAgICB2aWRlby5tdXRlZCA9IHRydWU7XG4gICAgdmlkZW8ucGxheXNJbmxpbmUgPSB0cnVlO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gdmlkZW87XG5cbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGNvbnN0IGxvYWROZXh0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCAhPT0gdmlkZW8gfHwgaW5kZXggPj0gdmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgICB2aWRlby5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVybCA9IHZpZGVvVXJsc1tpbmRleF07XG4gICAgICB2aWRlby5zcmMgPSB1cmw7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29uc3Qgb25Eb25lID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25Eb25lKTtcbiAgICAgICAgbG9hZE5leHQoKTtcbiAgICAgIH07XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgb25Eb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBvbkRvbmUoKSwgMTUwMDApO1xuICAgIH07XG4gICAgbG9hZE5leHQoKTtcbiAgfVxuXG4gIC8qKiBQcmVsb2FkIG5leHQgc2VnbWVudCB3aGVuIH41LTEwIHNlY29uZHMgZnJvbSBlbmRpbmcgdG8gbWluaW1pemUgc3dpdGNoaW5nIGRlbGF5ICovXG4gIHByaXZhdGUgbWF5YmVQcmVsb2FkTmV4dFNlZ21lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCB0aW1lTGVmdEluU2VnbWVudCA9ICh2aWRlby5kdXJhdGlvbiAtIHZpZGVvLmN1cnJlbnRUaW1lKSAqIDEwMDA7IC8vIG1zXG4gICAgaWYgKHRpbWVMZWZ0SW5TZWdtZW50ID4gMTAwMDAgfHwgdGltZUxlZnRJblNlZ21lbnQgPCA1MDAwKSByZXR1cm47IC8vIFByZWxvYWQgd2hlbiA1LTEwcyBmcm9tIGVuZFxuICAgIGNvbnN0IG5leHRVcmwgPSB0aGlzLnZpZGVvVXJsc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICsgMV07XG4gICAgaWYgKCFuZXh0VXJsKSByZXR1cm47XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudD8uc3JjID09PSBuZXh0VXJsKSByZXR1cm47IC8vIEFscmVhZHkgcHJlbG9hZGluZ1xuICAgIHRoaXMucHJlbG9hZE5leHRTZWdtZW50KG5leHRVcmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVsb2FkTmV4dFNlZ21lbnQodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50KSB7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgdmlkZW8ucHJlbG9hZCA9ICdhdXRvJztcbiAgICB2aWRlby5zcmMgPSB1cmw7XG4gICAgdmlkZW8uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZpZGVvKTtcbiAgICB0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQgPSB2aWRlbztcbiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgKCkgPT4ge1xuICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICBpZiAodGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID09PSB2aWRlbykgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IGFjdHVhbCB2aWRlbyBkdXJhdGlvbnMgYnkgbG9hZGluZyB2aWRlbyBtZXRhZGF0YVxuICAgKiBUaGlzIGNyZWF0ZXMgdGVtcG9yYXJ5IHZpZGVvIGVsZW1lbnRzIHRvIHJlYWQgZHVyYXRpb24gd2l0aG91dCBwbGF5aW5nXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBkZXRlY3RlZCBkdXJhdGlvbnNcbiAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICBsZXQgbG9hZGVkQ291bnQgPSAwO1xuXG4gICAgdmlkZW9VcmxzLmZvckVhY2goKHVybCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICBcbiAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB0ZW1wVmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gZHVyYXRpb25NcztcbiAgICAgICAgbG9hZGVkQ291bnQrKztcbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFuIHVwXG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgdGVtcFZpZGVvLnNyYyA9ICcnO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAobG9hZGVkQ291bnQgPT09IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gQWxsIHZpZGVvIGR1cmF0aW9ucyBkZXRlY3RlZDonLCB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTaW11bGF0b3JdIEZhaWxlZCB0byBsb2FkIG1ldGFkYXRhIGZvciB2aWRlbyAke2luZGV4ICsgMX1gKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zW2luZGV4XSA9IDA7XG4gICAgICAgIGxvYWRlZENvdW50Kys7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgdGVtcFZpZGVvLnNyYyA9ICcnO1xuICAgICAgICB0ZW1wVmlkZW8ucmVtb3ZlKCk7XG4gICAgICB9O1xuICAgICAgXG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgdGVtcFZpZGVvLnNyYyA9IHVybDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VtdWxhdGl2ZSBkdXJhdGlvbiBib3VuZGFyaWVzIGZvciBlYWNoIHZpZGVvXG4gICAqIFJldHVybnMgYW4gYXJyYXkgd2hlcmUgZWFjaCBlbGVtZW50IGlzIFtzdGFydER1cmF0aW9uLCBlbmREdXJhdGlvbl0gZm9yIHRoYXQgdmlkZW9cbiAgICogVXNlcyBkZXRlY3RlZCB2aWRlbyBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB2aWRlb0R1cmF0aW9ucyBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpOiBBcnJheTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+IHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGRldGVjdGVkIGR1cmF0aW9ucyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgcHJvdmlkZWQgZHVyYXRpb25zXG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zLmxlbmd0aCA+IDAgXG4gICAgICA/IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyBcbiAgICAgIDogW107XG4gICAgXG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYm91bmRhcmllczogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBjdW11bGF0aXZlU3RhcnQgPSAwO1xuICAgIFxuICAgIGZvciAoY29uc3QgZHVyYXRpb24gb2YgZHVyYXRpb25zKSB7XG4gICAgICBib3VuZGFyaWVzLnB1c2goe1xuICAgICAgICBzdGFydDogY3VtdWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGN1bXVsYXRpdmVTdGFydCArIGR1cmF0aW9uXG4gICAgICB9KTtcbiAgICAgIGN1bXVsYXRpdmVTdGFydCArPSBkdXJhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBhbGwgbWFya2VycyByZWN1cnNpdmVseSBpbmNsdWRpbmcgY2hpbGRTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBmbGF0dGVuTWFya2VycyhtYXJrZXJzOiBTdGVwTWFya2VyW10pOiBTdGVwTWFya2VyW10ge1xuICAgIGNvbnN0IGZsYXR0ZW5lZDogU3RlcE1hcmtlcltdID0gW107XG4gICAgXG4gICAgY29uc3QgZmxhdHRlblJlY3Vyc2l2ZSA9IChtYXJrZXJzOiBTdGVwTWFya2VyW10pID0+IHtcbiAgICAgIG1hcmtlcnMuZm9yRWFjaChtYXJrZXIgPT4ge1xuICAgICAgICAvLyBBZGQgdGhlIG1hcmtlciBpdHNlbGZcbiAgICAgICAgZmxhdHRlbmVkLnB1c2gobWFya2VyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGFkZCBjaGlsZCBtYXJrZXJzXG4gICAgICAgIGlmIChtYXJrZXIuY2hpbGRTdGVwcyAmJiBtYXJrZXIuY2hpbGRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmxhdHRlblJlY3Vyc2l2ZShtYXJrZXIuY2hpbGRTdGVwcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgXG4gICAgZmxhdHRlblJlY3Vyc2l2ZShtYXJrZXJzKTtcbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja01hcmtlckhpdChnbG9iYWxUaW1lTXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1BsYXlpbmcgfHwgdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENoZWNrIGFsbCBtYXJrZXJzIChpbmNsdWRpbmcgbmVzdGVkIG9uZXMpIGZvciBhIG1hdGNoXG4gICAgY29uc3QgYWxsTWFya2VycyA9IHRoaXMuZmxhdHRlbk1hcmtlcnModGhpcy5zdGVwTWFya2Vycyk7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMjAwOyAvLyAyMDBtcyB0b2xlcmFuY2UgZm9yIG1hdGNoaW5nXG4gICAgXG4gICAgZm9yIChjb25zdCBtYXJrZXIgb2YgYWxsTWFya2Vycykge1xuICAgICAgLy8gU2tpcCBpZiBtYXJrZXIgZG9lc24ndCBoYXZlIHRlc3RTdGVwSWRcbiAgICAgIGlmICghbWFya2VyLnRlc3RTdGVwSWQpIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaGl0XG4gICAgICBpZiAodGhpcy5oaXRNYXJrZXJzLmhhcyhtYXJrZXIudGVzdFN0ZXBJZCkpIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBjdXJyZW50IHRpbWUgbWF0Y2hlcyBtYXJrZXIgdGltZSAod2l0aGluIHRvbGVyYW5jZSlcbiAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMoZ2xvYmFsVGltZU1zIC0gbWFya2VyLmN1bXVsYXRpdmVEdXJhdGlvbik7XG4gICAgICBpZiAodGltZURpZmZlcmVuY2UgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgIC8vIE1hcmsgYXMgaGl0IGFuZCBlbWl0IGV2ZW50XG4gICAgICAgIHRoaXMuaGl0TWFya2Vycy5hZGQobWFya2VyLnRlc3RTdGVwSWQpO1xuICAgICAgICB0aGlzLm1hcmtlckhpdC5lbWl0KG1hcmtlcik7XG4gICAgICAgIGJyZWFrOyAvLyBPbmx5IGVtaXQgb25lIG1hcmtlciBwZXIgY2hlY2tcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVGdWxsU2NyZWVuKCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc1BsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMDtcbiAgICBcbiAgICAvLyBQYXVzZSB2aWRlbyBiZWZvcmUgZnVsbHNjcmVlbiB0cmFuc2l0aW9uIHRvIGF2b2lkIHN0YXRlIGlzc3Vlc1xuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVG9nZ2xlIGZ1bGxzY3JlZW5cbiAgICB0aGlzLmlzRnVsbFNjcmVlbiA9ICF0aGlzLmlzRnVsbFNjcmVlbjtcbiAgICBcbiAgICAvLyBSZXNldCBwbGF5ZXIgc3RhdGUgdG8gYWxsb3cgcmUtaW5pdGlhbGl6YXRpb24gYWZ0ZXIgRE9NIHVwZGF0ZVxuICAgIC8vIFRoZSBzdGF0ZSBtaWdodCBiZSBzdHVjayBpbiAnbG9hZGluZycgb3IgJ2Vycm9yJyBhZnRlciBmdWxsc2NyZWVuIHRyYW5zaXRpb25cbiAgICBpZiAodGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIFxuICAgIC8vIFdhaXQgZm9yIEFuZ3VsYXIgdG8gdXBkYXRlIHRoZSBET00sIHRoZW4gcmUtaW5pdGlhbGl6ZSB2aWRlb1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAodmlkZW8pIHtcbiAgICAgICAgLy8gUmVzdG9yZSB2aWRlbyBwb3NpdGlvbiBpZiBpdCB3YXMgc2V0XG4gICAgICAgIGlmIChjdXJyZW50VGltZSA+IDAgJiYgdmlkZW8uZHVyYXRpb24gPiBjdXJyZW50VGltZSkge1xuICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJlLWFwcGx5IHBsYXliYWNrIHJhdGVcbiAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRQbGF5YmFja1JhdGUoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlLWF0dGFjaCBsaXN0ZW5lcnNcbiAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVzZXQgc3RhdGUgdG8gJ3BhdXNlZCcgKHJlYWR5IHRvIHBsYXkpXG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSB0b2dnbGVGdWxsU2NyZWVuOiB2aWRlbyByZS1pbml0aWFsaXplZCcsIHtcbiAgICAgICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuLFxuICAgICAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gZWxlbWVudCBub3QgZm91bmQgYWZ0ZXIgdHJhbnNpdGlvbicpO1xuICAgICAgICAvLyBUcnkgYWdhaW4gYWZ0ZXIgYSBiaXQgbW9yZSB0aW1lXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZpZGVvUmV0cnkgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgaWYgKHZpZGVvUmV0cnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgb25TZWdtZW50Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgIT09ICd2aWRlbycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MgJiYgdGhpcy52aWRlb1VybHMpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID0gMDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXNlY29uZHMgfHwgaXNOYU4oc2Vjb25kcykpIHJldHVybiAnMDA6MDAnO1xuICAgIFxuICAgIGNvbnN0IHRvdGFsU2Vjb25kcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyk7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKCh0b3RhbFNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gdG90YWxTZWNvbmRzICUgNjA7XG4gICAgXG4gICAgLy8gSWYgaG91cnMgPiAwLCBzaG93IEhIOk1NOlNTIGZvcm1hdCwgb3RoZXJ3aXNlIHNob3cgTU06U1MgZm9ybWF0XG4gICAgaWYgKGhvdXJzID4gMCkge1xuICAgICAgcmV0dXJuIGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttaW5zLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHtzZWNzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYCR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtcHgtWzlweF0gY3FhLXB5LVszcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1oLVsyMXB4XSc7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRTBGMkZFXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM3REQzRkNdYDtcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVGM0M3XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0QzNERdYDtcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZFRTJFMl0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRkNBNUE1XWA7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0ZDRDlEOV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRjlCRkJGXWA7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1bI0QxRkFFNV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjNkVFN0I3XWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTIwMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItZ3JheS0zMDBgO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRDbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5saXZlU3RhdHVzKSB7XG4gICAgICBjYXNlICdJbiBQcm9ncmVzcyc6XG4gICAgICBjYXNlICdFeGVjdXRpb24nOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwMjg0QzddIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXVzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEOTc3MDZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdBYm9ydGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjREMyNjI2XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnRmFpbGVkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgY2FzZSAnUGFzc2VkJzpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDU5NjY5XSBjcWEtbGVhZGluZy1bMTVweF0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtdGV4dC1bMTBweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNjAwIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZFRyYWNlVXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnRyYWNlVmlld1VybCkgcmV0dXJuICcnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybC5lbmRzV2l0aCgnLnppcCcpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgdHJhY2U6IHRoaXMudHJhY2VWaWV3VXJsLFxuICAgICAgICBoaWRlSGVhZGVyOiAndHJ1ZScsXG4gICAgICAgIGhpZGVCcmFuZGluZzogJ3RydWUnLFxuICAgICAgICBlbWJlZDogJ3RydWUnLFxuICAgICAgICBtaW5pbWFsOiAndHJ1ZScsXG4gICAgICAgIG5vSGVhZGVyOiAndHJ1ZSdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gYGh0dHBzOi8vdHJhY2UucGxheXdyaWdodC5kZXYvPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhY2VWaWV3VXJsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTYWZlVHJhY2VVcmwoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5wcm9jZXNzZWRUcmFjZVVybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB9XG4gIH1cblxuICBvblRyYWNlVmlld2VyTG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNlVmlld2VyTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgb25UcmFjZVZpZXdlckVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU3BlZWRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNwZWVkID0gdmFsdWU7XG4gICAgLy8gV2hlbmV2ZXIgc3BlZWQgY2hhbmdlcywgYXBwbHkgaXQgdG8gdGhlIGN1cnJlbnQgdmlkZW9cbiAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVTcGVlZENvbnRyb2woKTogdm9pZCB7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSAhdGhpcy5pc1NwZWVkQ29udHJvbE9wZW47XG4gICAgaWYgKHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuKSB7XG4gICAgICB0aGlzLmFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50ICYmIFxuICAgICAgICAgICAgIXRoaXMuc3BlZWRDb250cm9sQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgIHRoaXMuaXNTcGVlZENvbnRyb2xPcGVuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICAgIHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWdtZW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIF07XG4gICAgXG4gICAgLy8gT25seSBhZGQgVmlkZW8gdGFiIGlmIGhpZGVWaWRlb1RhYiBpcyBmYWxzZVxuICAgIGlmICghdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy50cmFjZVZpZXdVcmwpIHtcbiAgICAgIGJhc2VTZWdtZW50cy5wdXNoKHsgbGFiZWw6ICdUcmFjZScsIHZhbHVlOiAndHJhY2UnLCBpY29uOiAnZ3JhcGhpY19lcScgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VnbWVudHMgPSBiYXNlU2VnbWVudHM7XG4gICAgXG4gICAgLy8gSWYgY3VycmVudCB2aWV3IGlzICd2aWRlbycgYW5kIHZpZGVvIHRhYiBpcyBoaWRkZW4sIHN3aXRjaCB0byBzY3JlZW5zaG90c1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAndmlkZW8nICYmIHRoaXMuaGlkZVZpZGVvVGFiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ3NjcmVlbnNob3RzJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uVmlkZW9FbGVtZW50UmVhZHkoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLl92cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiB2aWRlbyBlbGVtZW50IHJlYWR5Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc0Z1bGxTY3JlZW46IHRoaXMuaXNGdWxsU2NyZWVuLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZXJyb3IvbG9hZGluZyBzdGF0ZXMgd2hlbiB2aWRlbyBlbGVtZW50IGlzIHJlY3JlYXRlZCAoZS5nLiwgZHVyaW5nIGZ1bGxzY3JlZW4gdG9nZ2xlKVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHJlc2V0dGluZyBlcnJvci9sb2FkaW5nIHN0YXRlJyk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSB0YXJnZXRWaWRlb0luZGV4KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdzd2l0Y2hpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSk7XG5cbiAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gLTE7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRTdGFydCA9IHRhcmdldFZpZGVvSW5kZXggPT09IDAgPyAwIDogKHRoaXMuc2VnbWVudEJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleCAtIDFdID8/IDApO1xuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFJlc2V0IGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN3aXRjaFRvVmlkZW9BbmRTZWVrKGN1bXVsYXRpdmVUaW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXA6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcykge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VmlkZW9JbmRleCA9IHRoaXMuZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgaWYgKHRhcmdldFZpZGVvSW5kZXggPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gc3dpdGNoVG9WaWRlb0FuZFNlZWs6IENvdWxkIG5vdCBmaW5kIHZpZGVvIGZvciB0aW1lc3RhbXAnLCBjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IGN1bXVsYXRpdmVUaW1lc3RhbXAgLSB0YXJnZXRCb3VuZGFyeS5zdGFydDtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID09PSB0YXJnZXRWaWRlb0luZGV4KSB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbChyZWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IGN1bXVsYXRpdmVUaW1lc3RhbXA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdzd2l0Y2hpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8nKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2Vla1NlY29uZHMgPSByZWxhdGl2ZVRpbWVzdGFtcCAvIDEwMDA7XG4gICAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vla1NlY29uZHMsIHZpZGVvLmR1cmF0aW9uIHx8IHNlZWtTZWNvbmRzKSk7XG4gICAgICBcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uU2Vla2VkID0gKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMTAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gdGFyZ2V0VGltZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlZWtlZCcsIG9uU2Vla2VkKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gY3VtdWxhdGl2ZVRpbWVzdGFtcDtcbiAgICAgIFxuICAgICAgaWYgKE1hdGguYWJzKHZpZGVvLmN1cnJlbnRUaW1lIC0gdGFyZ2V0VGltZSkgPiAwLjUpIHtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBlci12aWRlbyBwcm9ncmVzc1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHZpZGVvLmR1cmF0aW9uICogMTAwMDtcbiAgICAgIGlmIChkdXJhdGlvbk1zID4gMCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlkZW9UaW1lVXBkYXRlLmVtaXQoY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kU2VlayBmYWlsZWQ6JywgZXJyKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdWktcm9vdFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjsgaGVpZ2h0OiAxMDAlOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiICAgW25nU3R5bGVdPVwie1xuICBwb3NpdGlvbjogaXNGdWxsU2NyZWVuID8gJ2ZpeGVkJyA6IG51bGwsXG4gIGluc2V0OiBpc0Z1bGxTY3JlZW4gPyAnMXJlbScgOiBudWxsLFxuICB6SW5kZXg6IGlzRnVsbFNjcmVlbiA/ICc1MCcgOiBudWxsLFxuICBib3hTaGFkb3c6IGlzRnVsbFNjcmVlbiA/ICcwcHggMTNweCAyNXB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIDogbnVsbCxcbiAgYm9yZGVyUmFkaXVzOiBpc0Z1bGxTY3JlZW4gPyAnLjVyZW0nIDogbnVsbCxcbiAgYm9yZGVyOiBpc0Z1bGxTY3JlZW4gPyAnMXB4IHNvbGlkICNFNUU3RUInIDogbnVsbCxcbiAgd2lkdGg6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiBudWxsLFxuICBoZWlnaHQ6IGlzRnVsbFNjcmVlbiA/ICdjYWxjKDEwMCUgLSAzMnB4KScgOiAnMTAwJScsXG4gIG92ZXJmbG93OiBpc0Z1bGxTY3JlZW4gPyAnaGlkZGVuJyA6IG51bGxcbn1cIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTEgY3FhLXB4LTIgY3FhLWJnLVsjRkZGRkZGXVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUI7Ym94LXNoYWRvdzogMHB4IDFweCAycHggMHB4ICMwMDAwMDAwRDtcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTGl2ZVwiIGNsYXNzPVwiY3FhLWgtWzIxcHhdIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1tci0yIGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtcm91bmRlZC1bNnB4XVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0Y5QkZCRjtcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy0yIGNxYS1oLTIgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRjQ3RjdGXSBjcWEtb3BhY2l0eS03NSBjcWEtYW5pbWF0ZS1waW5nXCI+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPkxpdmU8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfOTM1XzE1ODQ3KVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMC42MjUgNUMwLjYyNSA2LjE2MDMyIDEuMDg1OTQgNy4yNzMxMiAxLjkwNjQxIDguMDkzNTlDMi43MjY4OCA4LjkxNDA2IDMuODM5NjggOS4zNzUgNSA5LjM3NUM2LjE2MDMyIDkuMzc1IDcuMjczMTIgOC45MTQwNiA4LjA5MzU5IDguMDkzNTlDOC45MTQwNiA3LjI3MzEyIDkuMzc1IDYuMTYwMzIgOS4zNzUgNUM5LjM3NSAzLjgzOTY4IDguOTE0MDYgMi43MjY4OCA4LjA5MzU5IDEuOTA2NDFDNy4yNzMxMiAxLjA4NTk0IDYuMTYwMzIgMC42MjUgNSAwLjYyNUMzLjgzOTY4IDAuNjI1IDIuNzI2ODggMS4wODU5NCAxLjkwNjQxIDEuOTA2NDFDMS4wODU5NCAyLjcyNjg4IDAuNjI1IDMuODM5NjggMC42MjUgNVpcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0zLjEyNSA1QzMuMTI1IDMuODM5NjggMy4zMjI1NCAyLjcyNjg4IDMuNjc0MTcgMS45MDY0MUM0LjAyNTgxIDEuMDg1OTQgNC41MDI3MiAwLjYyNSA1IDAuNjI1QzUuNDk3MjggMC42MjUgNS45NzQxOSAxLjA4NTk0IDYuMzI1ODIgMS45MDY0MUM2LjY3NzQ2IDIuNzI2ODggNi44NzUgMy44Mzk2OCA2Ljg3NSA1QzYuODc1IDYuMTYwMzIgNi42Nzc0NiA3LjI3MzEyIDYuMzI1ODIgOC4wOTM1OUM1Ljk3NDE5IDguOTE0MDYgNS40OTcyOCA5LjM3NSA1IDkuMzc1QzQuNTAyNzIgOS4zNzUgNC4wMjU4MSA4LjkxNDA2IDMuNjc0MTcgOC4wOTM1OUMzLjMyMjU0IDcuMjczMTIgMy4xMjUgNi4xNjAzMiAzLjEyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjkzNzUgNi40NTg2Nkg5LjA2MjVNMC45Mzc1IDMuNTQxOTlIOS4wNjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfOTM1XzE1ODQ3XCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1wiIHN0eWxlPVwid2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtcIj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4wODMyNSAwLjgzMzAwOEgyLjkxNjU5QzIuNDU2MzUgMC44MzMwMDggMi4wODMyNSAxLjIwNjEgMi4wODMyNSAxLjY2NjM0VjguMzMzMDFDMi4wODMyNSA4Ljc5MzI0IDIuNDU2MzUgOS4xNjYzNCAyLjkxNjU5IDkuMTY2MzRINy4wODMyNUM3LjU0MzQ5IDkuMTY2MzQgNy45MTY1OCA4Ljc5MzI0IDcuOTE2NTggOC4zMzMwMVYxLjY2NjM0QzcuOTE2NTggMS4yMDYxIDcuNTQzNDkgMC44MzMwMDggNy4wODMyNSAwLjgzMzAwOFpcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41SDUuMDA0MTdcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gIWNxYS10ZXh0LVsxMHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW1sLTJcIj5cbiAgICAgICAgICB7eyBwbGF0Zm9ybU5hbWUgfX1cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1tbC0xXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidTY3JlZW4gc2l6ZTogJyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCArICd4JyArIGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIMK3XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1tbC0xXCI+XG4gICAgICAgICAgICAgIHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC53aWR0aCB9fXh7eyBlZmZlY3RpdmVCcm93c2VyVmlld1BvcnQuaGVpZ2h0IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcygpXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZ2V0U3RhdHVzVGV4dENsYXNzKClcIj57eyBsaXZlU3RhdHVzIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTGl2ZVwiPlxuICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sIFxuICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNlZ21lbnRzXCIgXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNGdWxsU2NyZWVuXCIgXG4gICAgICAgICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1ncmF5LTEwMCBjcWEtcm91bmRlZC1zbSBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxTY3JlZW4oKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkV4cGFuZFwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAxLjI1SDguNzVWMy43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc0OTkyIDEuMjVMNS44MzMyNSA0LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgOC43NDk2N0w0LjE2NjY3IDUuODMzMDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NSA4Ljc1SDEuMjVWNi4yNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlzRnVsbFNjcmVlblwiIFxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeGl0IGZ1bGwgc2NyZWVuXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04Ljc1IDYuMjVINi4yNVY4Ljc1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUwMDggNi4yNUw5LjE2Njc1IDkuMTY2NjdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzMyNTIgMC44MzMwMDhMMy43NDk5MiAzLjc0OTY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuMjUgMy43NUgzLjc1VjEuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWgtW2NhbGMoMTAwJS00MXB4KV1cIj5cbiAgPCEtLSBMaXZlIENvbnRlbnQgVmlldyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWU7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWF4LWgtZnVsbCBjcWEtaC1mdWxsJzogcGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicgfHwgIWlzTGl2ZSwgJ2NxYS1taW4tdy1tYXgnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnIWNxYS1oLWZ1bGwgIWNxYS1tYXgtaC1bNTAwcHhdJzogc2hvdWxkQXBwbHlTbWFsbEhlaWdodENsYXNzZXN9XCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW1heC1oLWZ1bGwgY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1iZy13aGl0ZSc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZGlhbWV0ZXI9XCI0MFwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPnt7IGxpdmVMb2FkaW5nTGFiZWwgfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxpdmVTdGF0dXMgPT09ICdGYWlsZWQnICYmIGZhaWxlZFN0YXR1c01lc3NhZ2VcIiBjbGFzcz1cImNxYS1wLTYgY3FhLXRleHQtY2VudGVyIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7IGNvbG9yOiAjQzYzNTM1OyBmb250LXNpemU6IDE4cHg7XCI+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsjQzYzNTM1XSBjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLW0tMFwiPnt7IGZhaWxlZFN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cImxpdmVTdGF0dXMgIT09ICdGYWlsZWQnIHx8ICFmYWlsZWRTdGF0dXNNZXNzYWdlXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBOb3JtYWwgVmlkZW8gVmlldyAod2hlbiBub3QgbGl2ZSkgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0xpdmUgJiYgY3VycmVudFZpZXcgPT09ICd2aWRlbydcIlxuICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiXG4gICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICBhcmlhLWxhYmVsPVwiVmlkZW8gcGxheWJhY2tcIlxuICAgICAgICAgKGtleWRvd24pPVwib25WaWRlb0tleWRvd24oJGV2ZW50KVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtbWF4LWgtW2NhbGMoMTAwJS05N3B4KV1cIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZX1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIFtuZ0NsYXNzXT1cInsnY3FhLXAtNCc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW1heC1oLWZ1bGxcIiBbbmdDbGFzc109XCJ7J2NxYS1yb3VuZGVkLW1kIGNxYS1vdmVyZmxvdy1oaWRkZW4nOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1taW4tdy1tYXgnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICAgICAgYWx0PVwiRGV2aWNlIG1vY2t1cFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS13LWF1dG8gY3FhLW1heC1oLWZ1bGwgY3FhLW9iamVjdC1jb250YWluIGNxYS1ibG9jayBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgW25nU3R5bGVdPVwiZGV2aWNlU2NyZWVuU3R5bGVcIiBbbmdDbGFzc109XCJ7J2NxYS1iZy13aGl0ZSc6IHBsYXRmb3JtVHlwZSAhPT0gJ2Jyb3dzZXInfVwiPlxuICAgICAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAgICAgI3ZwbGF5ZXJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb3ZlciBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIWN1cnJlbnRWaWRlb1VybFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWTkNTZXNzaW9uSW50cnVwcHRlZCAmJiB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZTsgZWxzZSBub1ZpZGVvRGVmYXVsdFwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgIHt7IHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1ZpZGVvRGVmYXVsdD5cbiAgICAgICAgICA8c3Bhbj5ObyB2aWRlbyByZWNvcmRpbmcgZm91bmQ8L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMiBjcWEtYmctd2hpdGVcIiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCAjRTVFN0VCO1wiIFtuZ0NsYXNzXT1cInsnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZX1cIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybCAmJiAhaXNMaXZlXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW1iLTIgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1ibG9ja1wiPlxuICAgICAgICAgIFZpZGVvIHt7IGN1cnJlbnRWaWRlb0luZGV4ICsgMSB9fSBwbGF5aW5nIG91dCBvZiB7eyB2aWRlb1VybHM/Lmxlbmd0aCB8fCAwIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3NcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRWaWRlbygpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOZXh0IHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiB2aWRlb1VybHMgJiYgKGN1cnJlbnRWaWRlb0luZGV4ID49IHZpZGVvVXJscy5sZW5ndGggLSAxKX1cIj5za2lwX25leHQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmVcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uY3VycmVudFRpbWUgfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCI+XG4gICAgICAgICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgICAgICAgW3NlZ21lbnRzXT1cInNwZWVkU2VnbWVudHNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50U3BlZWRcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJCZ0NvbG9yXT1cIicjRjBGMEYxJ1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU3BlZWRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1zZWdtZW50LWNvbnRyb2w+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgI3RpbWVsaW5lQmFyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLTEgY3FhLWJnLWdyYXktMjAwIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWN1cnNvci1wb2ludGVyIGNxYS13LWZ1bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25UaW1lbGluZUNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1hcmtlciBvZiBjdXJyZW50VmlkZW9NYXJrZXJzXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImdldFN0ZXBMZWZ0UG9zaXRpb24obWFya2VyKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInOHB4J1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRHbG9iYWxNYXJrZXJDb2xvcihtYXJrZXIubGV2ZWwpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCInMnB4IHNvbGlkICcgKyBnZXRHbG9iYWxNYXJrZXJSZXN1bHRDb2xvcihtYXJrZXIucmVzdWx0KVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3gtc2l6aW5nXT1cIidib3JkZXItYm94J1wiXG4gICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm1hcmtlci50aXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IGF1dG87IHotaW5kZXg6IDUwOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB0b3A6IDUwJTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXJrZXJDbGljaygkZXZlbnQsIG1hcmtlcilcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS10b3AtMS8yIGNxYS13LTMgY3FhLWgtMyBjcWEtYmctYmx1ZS02MDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLWdyYWIgYWN0aXZlOmNxYS1jdXJzb3ItZ3JhYmJpbmcgY3FhLXNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LiVdPVwicHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB6LWluZGV4OiA2MDtcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLXRleHQtWzlweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtc2VsZWN0LW5vbmVcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUodnBsYXllcj8ubmF0aXZlRWxlbWVudD8uZHVyYXRpb24gfHwgMCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3NjcmVlbnNob3RzJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXB5LTQgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7J2NxYS1wLTQnOiBwbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogcGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW1heC1oLVtpbmhlcml0XSc6IHBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1heC1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBwbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cInNjcmVlblNob3RVcmxcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS16LTIwJzogcGxhdGZvcm1UeXBlID09PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFzY3JlZW5TaG90VXJsXCI+XG4gICAgICAgIE5vIHNjcmVlbnNob3QgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndHJhY2UnXCIgY2xhc3M9XCJjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcmVsYXRpdmVcIiAqbmdJZj1cInRyYWNlVmlld1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBwbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnfVwiIHN0eWxlPVwicGFkZGluZy10b3A6IDQ4cHg7IHBhZGRpbmctYm90dG9tOiAwcHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtcmVsYXRpdmVcIj5cbiAgICAgICAgICA8aWZyYW1lIFxuICAgICAgICAgICAgW3NyY109XCJzYWZlVHJhY2VVcmxcIiBcbiAgICAgICAgICAgIHRpdGxlPVwiVHJhY2UgVmlld2VyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLW1pbi1oLVsyNTBweF0gY3FhLW1heC1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogLTQ4cHg7IGhlaWdodDogY2FsYygxMDAlICsgNDhweCk7XCJcbiAgICAgICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW5cbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBsb2FkaW5nPVwibGF6eVwiXG4gICAgICAgICAgICAobG9hZCk9XCJvblRyYWNlVmlld2VyTG9hZCgpXCJcbiAgICAgICAgICAgIChlcnJvcik9XCJvblRyYWNlVmlld2VyRXJyb3IoKVwiPlxuICAgICAgICAgIDwvaWZyYW1lPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0cmFjZVZpZXdlckxvYWRpbmdcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgTG9hZGluZyB0cmFjZSB2aWV3ZXIuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJFcnJvclwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1iZy1bI0YzRjRGNl0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXotMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtXCI+XG4gICAgICAgICAgICBGYWlsZWQgdG8gbG9hZCB0cmFjZSB2aWV3ZXJcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcC0xMCBjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc20gY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiIXRyYWNlVmlld1VybFwiPlxuICAgICAgICBObyB0cmFjZSBhdmFpbGFibGVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiAgXG4gIDwvZGl2PlxuPC9kaXY+Il19