dictrigyn-video-player
Version:
Contains Video player library components powered by angular. These components are designed to be used in sunbird consumption platforms *(mobile app, web portal, offline desktop app)* to drive reusability, maintainability hence reducing the redundant devel
488 lines • 50.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/sunbird-video-player.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign } from "tslib";
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { ErrorService, errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9';
import { ViewerService } from './services/viewer.service';
import { SunbirdVideoPlayerService } from './sunbird-video-player.service';
var SunbirdVideoPlayerComponent = /** @class */ (function () {
function SunbirdVideoPlayerComponent(videoPlayerService, viewerService, cdr, renderer2, errorService) {
var _this = this;
this.videoPlayerService = videoPlayerService;
this.viewerService = viewerService;
this.cdr = cdr;
this.renderer2 = renderer2;
this.errorService = errorService;
this.telemetryEvent = new EventEmitter();
this.viewState = 'player';
this.showControls = true;
this.sideMenuConfig = {
showShare: true,
showDownload: true,
showReplay: true,
showExit: true
};
this.isPaused = false;
this.showQumlPlayer = false;
this.QumlPlayerConfig = {};
this.isFullScreen = false;
this.raiseInternetDisconnectionError = (/**
* @return {?}
*/
function () {
/** @type {?} */
var code = errorCode.internetConnectivity;
/** @type {?} */
var message = errorMessage.internetConnectivity;
/** @type {?} */
var stacktrace = code + ": " + message;
_this.viewerService.raiseExceptionLog(code, message, stacktrace, _this.traceId);
});
this.playerEvent = this.viewerService.playerEvent;
this.viewerService.playerEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.type === 'pause') {
_this.isPaused = true;
_this.showControls = true;
}
if (event.type === 'play') {
_this.isPaused = false;
}
if (event.type === 'loadstart') {
_this.viewerService.raiseStartEvent(event);
}
if (event.type === 'ended') {
_this.viewerService.endPageSeen = true;
_this.viewerService.raiseEndEvent();
_this.viewState = 'end';
}
if (event.type === 'error') {
// tslint:disable-next-line:one-variable-per-declaration
/** @type {?} */
var code = errorCode.contentLoadFails;
/** @type {?} */
var message = errorMessage.contentLoadFails;
if (_this.viewerService.isAvailableLocally) {
code = errorCode.contentLoadFails;
message = errorMessage.contentLoadFails;
}
if (code === errorCode.contentLoadFails) {
_this.showContentError = true;
}
_this.viewerService.raiseExceptionLog(code, message, event, _this.traceId);
}
// tslint:disable-next-line:max-line-length
/** @type {?} */
var events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' },
{ type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data.type) {
_this.viewerService.raiseHeartBeatEvent(data.telemetryEvent);
}
}));
}));
}
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.onTelemetryEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.telemetryEvent.emit(event.detail);
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (typeof this.playerConfig === 'string') {
try {
this.playerConfig = JSON.parse(this.playerConfig);
}
catch (error) {
console.error('Invalid playerConfig: ', error);
}
}
setInterval((/**
* @return {?}
*/
function () {
if (!_this.isPaused) {
_this.showControls = false;
}
}), 5000);
/* tslint:disable:no-string-literal */
this.nextContent = this.playerConfig.config.nextContent;
this.traceId = this.playerConfig.config['traceId'];
this.sideMenuConfig = __assign(__assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu);
this.videoPlayerService.initialize(this.playerConfig);
this.viewerService.initialize(this.playerConfig);
window.addEventListener('offline', this.raiseInternetDisconnectionError, true);
this.QumlPlayerConfig.config = this.playerConfig.config;
this.QumlPlayerConfig.config.sideMenu.enable = false;
this.QumlPlayerConfig.context = this.playerConfig.context;
this.setTelemetryObjectRollup(this.playerConfig.metadata.identifier);
};
/**
* @param {?} changes
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.action) {
if (!this.showQumlPlayer) {
this.playerAction = this.action;
}
}
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var videoPlayerElement = this.videoPlayerRef.nativeElement;
this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
/** @type {?} */
var contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel'];
if (contentCompabilityLevel) {
/** @type {?} */
var checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel);
if (!checkContentCompatible['isCompitable']) {
// tslint:disable-next-line:max-line-length
this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible['error']['message'], this.traceId);
}
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.sideBarEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.playerEvent.emit(event);
if (event.type === 'DOWNLOAD') {
this.downloadVideo();
}
/** @type {?} */
var events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE'];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data) {
_this.viewerService.raiseHeartBeatEvent(data);
}
if (event.type === 'EXIT') {
_this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU');
}
}));
};
/**
* @param {?} id
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.setTelemetryObjectRollup = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.QumlPlayerConfig.context) {
/** @type {?} */
var hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup;
if (!hasObjectRollup) {
this.QumlPlayerConfig.context.objectRollup = {};
}
/** @type {?} */
var levels = Object.keys(this.QumlPlayerConfig.context.objectRollup);
this.QumlPlayerConfig.context.objectRollup["l" + (levels.length + 1)] = id;
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.viewerService.raiseHeartBeatEvent(event.type);
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.replayContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewState = 'player';
this.viewerService.isEndEventRaised = false;
this.viewerService.raiseHeartBeatEvent('REPLAY');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.exitContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewerService.raiseHeartBeatEvent('EXIT');
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.downloadVideo = /**
* @return {?}
*/
function () {
/** @type {?} */
var a = document.createElement('a');
a.href = this.viewerService.artifactUrl;
a.download = this.viewerService.contentName;
a.target = '_blank';
document.body.appendChild(a);
a.click();
a.remove();
this.viewerService.raiseHeartBeatEvent('DOWNLOAD');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.qumlPlayerEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.eid === 'QUML_SUMMARY') {
this.showQumlPlayer = false;
/** @type {?} */
var score = parseInt(event.edata.extra.find((/**
* @param {?} p
* @return {?}
*/
function (p) { return p.id === 'score'; }))['value'], 10);
this.viewerService.interceptionResponses[this.currentInterceptionTime] = {
score: score,
isSkipped: false
};
/** @type {?} */
var interceptPointElement = document.querySelector("[data-marker-time=\"" + this.currentInterceptionTime + "\"]");
if (interceptPointElement) {
interceptPointElement['style'].background = 'green';
}
this.videoInstance.play();
this.videoInstance.controls(true);
this.viewerService.raiseImpressionEvent('video');
// if currently video is not in full screen and was previously full screen then set it back to full screen again
if (!document.fullscreenElement && this.isFullScreen) {
if (document.getElementsByClassName('video-js')[0]) {
document.getElementsByClassName('video-js')[0].requestFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
}
}
};
/**
* @param {?} __0
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.questionSetData = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var response = _a.response, time = _a.time, identifier = _a.identifier;
this.QumlPlayerConfig.metadata = response;
this.QumlPlayerConfig.metadata['showStartPage'] = 'No';
this.QumlPlayerConfig.metadata['showEndPage'] = 'No';
this.currentInterceptionTime = time;
this.currentInterceptionUIId = identifier;
if (document.fullscreenElement) {
this.isFullScreen = true;
document.exitFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
else {
this.isFullScreen = false;
}
this.showQumlPlayer = true;
this.viewerService.raiseImpressionEvent('interactive-question-set', { id: identifier, type: 'QuestionSet' });
this.viewerService.raiseHeartBeatEvent('VIDEO_MARKER_SELECTED', {
identifier: identifier,
// Question set id,
type: 'QuestionSet',
// Type of interaction
interceptedAt: time // Time when the interception happened
});
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playerInstance = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.videoInstance = event;
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.viewerService.raiseEndEvent();
this.unlistenTouchStart();
this.unlistenMouseMove();
this.viewerService.isEndEventRaised = false;
window.removeEventListener('offline', this.raiseInternetDisconnectionError, true);
};
SunbirdVideoPlayerComponent.decorators = [
{ type: Component, args: [{
selector: 'sunbird-video-player',
template: "<div class=\"sunbird-video-player-container\" #videoPlayer [ngClass]=\"showQumlPlayer ? 'videoPlayerHide': 'videoPlayerShow'\">\r\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\r\n\r\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\r\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\">\r\n </video-player>\r\n <sb-player-sidebar *ngIf=\"viewState ==='player'\"\r\n [title]=\"viewerService.contentName\"\r\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <sb-player-end-page \r\n [contentName]=\"viewerService.contentName\" \r\n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \r\n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\r\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \r\n [showExit]=\"sideMenuConfig.showExit\"\r\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \r\n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\r\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\r\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n\r\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\r\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\r\n</div>",
styles: [".sunbird-video-player-container{width:100%;height:100%;overflow:hidden;position:relative}.videoPlayerHide{display:none}.videoPlayerShow{display:block}pdf-menu{position:absolute;top:0;left:0;z-index:99}.BtmNotVisible,.notVisible{transition:1s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:0 0!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label{background:rgba(51,51,51,.5)}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-pdf-player{overflow:hidden}::ng-deep .pdfViewer .page{background:0 0!important;-o-border-image:none!important;border-image:none!important;border:0!important}::ng-deep #toolbarContainer{background:0 0!important;height:auto!important}::ng-deep #viewerContainer{position:relative!important;height:calc(100% - 3rem)}::ng-deep .body,::ng-deep .html,::ng-deep .pdf-viewer button,::ng-deep .pdf-viewer input,::ng-deep .pdf-viewer select{font-size:inherit!important}::ng-deep .findbar,::ng-deep .secondaryToolbar,::ng-deep html[dir=ltr] #toolbarContainer,::ng-deep html[dir=rtl] #toolbarContainer{box-shadow:none!important}::ng-deep .zoom{min-height:inherit!important}::ng-deep html[dir=rtl] .sb-pdf-reading-status{left:auto;right:1rem}.sb-pdf-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:1rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-pdf-reading-status span{background:var(--gray-800);width:.25rem;height:.25rem;display:block;margin:0 .5rem;border-radius:50%}.sbt-pdf-footer{background:var(--white);position:absolute;bottom:0;width:100%;height:3rem;display:flex;align-items:center;justify-content:flex-end;padding:.75rem .5rem}@media all and (orientation:landscape){::ng-deep .visible-only-potrait{display:none}}@media all and (orientation:portrait){::ng-deep #viewerContainer{height:calc(100% - 6rem)!important}::ng-deep .visible-only-landscape{display:none}::ng-deep .visible-only-potrait{display:block}::ng-deep .file-download__popup{height:15.125rem}::ng-deep .pdf-endpage{display:block!important;position:relative}::ng-deep .pdf-endpage__left-panel{margin-top:6rem}::ng-deep .pdf-endpage__right-panel .title-section{position:absolute;top:0;left:0;right:0}}@media all and (max-width:640px){.visible-only-landscape{display:none}.visible-only-potrait{display:block}}@media all and (min-width:640px){.visible-only-landscape{display:block}.visible-only-potrait{display:none}}"]
}] }
];
/** @nocollapse */
SunbirdVideoPlayerComponent.ctorParameters = function () { return [
{ type: SunbirdVideoPlayerService },
{ type: ViewerService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: ErrorService }
]; };
SunbirdVideoPlayerComponent.propDecorators = {
playerConfig: [{ type: Input }],
action: [{ type: Input }],
playerEvent: [{ type: Output }],
telemetryEvent: [{ type: Output }],
videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: true },] }],
onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }],
ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }]
};
return SunbirdVideoPlayerComponent;
}());
export { SunbirdVideoPlayerComponent };
if (false) {
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.action;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.telemetryEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerRef;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewState;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.traceId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.nextContent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showContentError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showControls;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.sideMenuConfig;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenTouchStart;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenMouseMove;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isPaused;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showQumlPlayer;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.QumlPlayerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoInstance;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionTime;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionUIId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isFullScreen;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerAction;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.raiseInternetDisconnectionError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.renderer2;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.errorService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGljdHJpZ3luLXZpZGVvLXBsYXllci8iLCJzb3VyY2VzIjpbImxpYi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFDakUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQWlCLFNBQVMsRUFDOUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRyxTQUFTLEVBQUcsWUFBWSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBSXJHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUzRTtJQWtDRSxxQ0FDUyxrQkFBNkMsRUFDN0MsYUFBNEIsRUFDNUIsR0FBc0IsRUFDckIsU0FBb0IsRUFDckIsWUFBMEI7UUFMbkMsaUJBK0NDO1FBOUNRLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMkI7UUFDN0Msa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTdCekIsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0RSxjQUFTLEdBQUcsUUFBUSxDQUFDO1FBSXJCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLG1CQUFjLEdBQUc7WUFDZixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztRQUdGLGFBQVEsR0FBRyxL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bUMsU0FBUztnQkFFdEQsWUFBWTs7OytCQWNsQixLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsTUFBTTtpQ0FDTixNQUFNO2lDQUNOLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO21DQXdFekMsWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzhCQTZLbEQsWUFBWSxTQUFDLHFCQUFxQjs7SUFRckMsa0NBQUM7Q0FBQSxBQXhRRCxJQXdRQztTQW5RWSwyQkFBMkI7OztJQUV0QyxtREFBb0M7O0lBQ3BDLDZDQUEwQjs7SUFDMUIsa0RBQTRDOztJQUM1QyxxREFBc0U7O0lBQ3RFLHFEQUF1RTs7SUFDdkUsZ0RBQXFCOztJQUNyQiw4Q0FBdUI7O0lBQ3ZCLGtEQUF3Qjs7SUFDeEIsdURBQTBCOztJQUMxQixtREFBb0I7O0lBQ3BCLHFEQUtFOzs7OztJQUNGLHlEQUF1Qzs7Ozs7SUFDdkMsd0RBQXNDOztJQUN0QywrQ0FBaUI7O0lBQ2pCLHFEQUF1Qjs7SUFDdkIsdURBQTJCOztJQUMzQixvREFBbUI7O0lBQ25CLDhEQUF3Qjs7SUFDeEIsOERBQXdCOztJQUN4QixtREFBcUI7O0lBQ3JCLG1EQUFzQjs7SUE0RnRCLHNFQUtDOztJQTlGQyx5REFBb0Q7O0lBQ3BELG9EQUFtQzs7SUFDbkMsMENBQTZCOzs7OztJQUM3QixnREFBNEI7O0lBQzVCLG1EQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRocm93U3RtdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLFxyXG4gIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBSZW5kZXJlcjIsIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgLCBlcnJvckNvZGUgLCBlcnJvck1lc3NhZ2UsIElTaWRlQmFyRXZlbnQgfSBmcm9tICdAZGljZGlrc2hhb3JnL3BsYXllci1zZGstdjknO1xyXG5cclxuaW1wb3J0IHsgUGxheWVyQ29uZmlnIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgSUFjdGlvbiB9IGZyb20gJy4vcGxheWVySW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFZpZXdlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3N1bmJpcmQtdmlkZW8tcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFN1bmJpcmRWaWRlb1BsYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFBsYXllckNvbmZpZztcclxuICBASW5wdXQoKSBhY3Rpb24/OiBJQWN0aW9uO1xyXG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQE91dHB1dCgpIHRlbGVtZXRyeUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvUGxheWVyJywgeyBzdGF0aWM6IHRydWUgfSkgdmlkZW9QbGF5ZXJSZWY6IEVsZW1lbnRSZWY7XHJcbiAgdmlld1N0YXRlID0gJ3BsYXllcic7XHJcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcclxuICBwdWJsaWMgbmV4dENvbnRlbnQ6IGFueTtcclxuICBzaG93Q29udGVudEVycm9yOiBib29sZWFuO1xyXG4gIHNob3dDb250cm9scyA9IHRydWU7XHJcbiAgc2lkZU1lbnVDb25maWcgPSB7XHJcbiAgICBzaG93U2hhcmU6IHRydWUsXHJcbiAgICBzaG93RG93bmxvYWQ6IHRydWUsXHJcbiAgICBzaG93UmVwbGF5OiB0cnVlLFxyXG4gICAgc2hvd0V4aXQ6IHRydWVcclxuICB9O1xyXG4gIHByaXZhdGUgdW5saXN0ZW5Ub3VjaFN0YXJ0OiAoKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgdW5saXN0ZW5Nb3VzZU1vdmU6ICgpID0+IHZvaWQ7XHJcbiAgaXNQYXVzZWQgPSBmYWxzZTtcclxuICBzaG93UXVtbFBsYXllciA9IGZhbHNlO1xyXG4gIFF1bWxQbGF5ZXJDb25maWc6IGFueSA9IHt9O1xyXG4gIHZpZGVvSW5zdGFuY2U6IGFueTtcclxuICBjdXJyZW50SW50ZXJjZXB0aW9uVGltZTtcclxuICBjdXJyZW50SW50ZXJjZXB0aW9uVUlJZDtcclxuICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICBwbGF5ZXJBY3Rpb246IElBY3Rpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZpZGVvUGxheWVyU2VydmljZTogU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSxcclxuICAgIHB1YmxpYyB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxyXG4gICAgcHVibGljIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50ID0gdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50O1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50LnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGF1c2UnKSB7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGxheScpIHtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdsb2Fkc3RhcnQnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlU3RhcnRFdmVudChldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlbmRlZCcpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UuZW5kUGFnZVNlZW4gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUVuZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSAnZW5kJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXHJcbiAgICAgICAgbGV0IGNvZGUgPSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscyxcclxuICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlscztcclxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xyXG4gICAgICAgICAgICBjb2RlID0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHM7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlscztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dDb250ZW50RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgZXZlbnQsIHRoaXMudHJhY2VJZCk7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgY29uc3QgZXZlbnRzID0gW3sgdHlwZTogJ3ZvbHVtZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnVk9MVU1FX0NIQU5HRScgfSwgeyB0eXBlOiAnc2Vla2luZycsIHRlbGVtZXRyeUV2ZW50OiAnRFJBRycgfSwgeyB0eXBlOiAnZnVsbHNjcmVlbicsIHRlbGVtZXRyeUV2ZW50OiAnRlVMTFNDUkVFTicgfSxcclxuICAgICAgeyB0eXBlOiAncmF0ZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnUkFURV9DSEFOR0UnIH1dO1xyXG4gICAgICBldmVudHMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhLnRlbGVtZXRyeUV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpUZWxlbWV0cnlFdmVudCcsIFsnJGV2ZW50J10pXHJcbiAgb25UZWxlbWV0cnlFdmVudChldmVudCkge1xyXG4gICAgdGhpcy50ZWxlbWV0cnlFdmVudC5lbWl0KGV2ZW50LmRldGFpbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5wbGF5ZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXJDb25maWcgPSBKU09OLnBhcnNlKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHBsYXllckNvbmZpZzogJywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcclxuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MDAwKTtcclxuXHJcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1zdHJpbmctbGl0ZXJhbCAqL1xyXG4gICAgdGhpcy5uZXh0Q29udGVudCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5uZXh0Q29udGVudDtcclxuICAgIHRoaXMudHJhY2VJZCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZ1sndHJhY2VJZCddO1xyXG4gICAgdGhpcy5zaWRlTWVudUNvbmZpZyA9IHsgLi4udGhpcy5zaWRlTWVudUNvbmZpZywgLi4udGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51IH07XHJcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdGhpcy5yYWlzZUludGVybmV0RGlzY29ubmVjdGlvbkVycm9yICwgdHJ1ZSk7XHJcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbmZpZy5zaWRlTWVudS5lbmFibGUgPSBmYWxzZTtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0ID0gdGhpcy5wbGF5ZXJDb25maWcuY29udGV4dDtcclxuICAgIHRoaXMuc2V0VGVsZW1ldHJ5T2JqZWN0Um9sbHVwKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMuYWN0aW9uKSB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93UXVtbFBsYXllcikge1xyXG4gICAgICAgIHRoaXMucGxheWVyQWN0aW9uID0gdGhpcy5hY3Rpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhaXNlSW50ZXJuZXREaXNjb25uZWN0aW9uRXJyb3IgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBjb2RlID0gZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5O1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5pbnRlcm5ldENvbm5lY3Rpdml0eTtcclxuICAgIGNvbnN0IHN0YWNrdHJhY2UgPSBgJHtjb2RlfTogJHttZXNzYWdlfWA7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSwgdGhpcy50cmFjZUlkKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IHZpZGVvUGxheWVyRWxlbWVudCA9IHRoaXMudmlkZW9QbGF5ZXJSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4odmlkZW9QbGF5ZXJFbGVtZW50LCAnbW91c2Vtb3ZlJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICd0b3VjaHN0YXJ0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb250ZW50Q29tcGFiaWxpdHlMZXZlbCA9IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhWydjb21wYXRpYmlsaXR5TGV2ZWwnXTtcclxuICAgIGlmIChjb250ZW50Q29tcGFiaWxpdHlMZXZlbCkge1xyXG4gICAgICBjb25zdCBjaGVja0NvbnRlbnRDb21wYXRpYmxlID0gdGhpcy5lcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb250ZW50Q29tcGFiaWxpdHlMZXZlbCk7XHJcbiAgICAgIGlmICghY2hlY2tDb250ZW50Q29tcGF0aWJsZVsnaXNDb21waXRhYmxlJ10pIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgZXJyb3JNZXNzYWdlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBjaGVja0NvbnRlbnRDb21wYXRpYmxlWydlcnJvciddWydtZXNzYWdlJ10sIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNpZGVCYXJFdmVudHMoZXZlbnQ6IElTaWRlQmFyRXZlbnQpIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0RPV05MT0FEJykge1xyXG4gICAgICB0aGlzLmRvd25sb2FkVmlkZW8oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV2ZW50cyA9IFsnU0hBUkUnLCAnRE9XTkxPQURfTUVOVScsICdFWElUJywgJ0NMT1NFX01FTlUnLCAnT1BFTl9NRU5VJywgJ0RPV05MT0FEX1BPUFVQX0NBTkNFTCcsICdET1dOTE9BRF9QT1BVUF9DTE9TRSddO1xyXG4gICAgZXZlbnRzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdFWElUJykge1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5zaWRlYmFyTWVudUV2ZW50LmVtaXQoJ0NMT1NFX01FTlUnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRUZWxlbWV0cnlPYmplY3RSb2xsdXAoaWQpIHtcclxuICAgIGlmICh0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCkge1xyXG4gICAgICBjb25zdCBoYXNPYmplY3RSb2xsdXAgPSB0aGlzLlF1bWxQbGF5ZXJDb25maWcgJiYgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQgJiYgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwO1xyXG4gICAgICBpZiAoIWhhc09iamVjdFJvbGx1cCkge1xyXG4gICAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGxldmVscyA9IE9iamVjdC5rZXlzKHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCk7XHJcbiAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cFtgbCR7bGV2ZWxzLmxlbmd0aCArICAxfWBdID0gaWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwbGF5Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnQudHlwZSk7XHJcbiAgfVxyXG5cclxuICByZXBsYXlDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy52aWV3U3RhdGUgPSAncGxheWVyJztcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnUkVQTEFZJyk7XHJcbiAgfVxyXG5cclxuICBleGl0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdFWElUJyk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFZpZGVvKCkge1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHRoaXMudmlld2VyU2VydmljZS5hcnRpZmFjdFVybDtcclxuICAgIGEuZG93bmxvYWQgPSB0aGlzLnZpZXdlclNlcnZpY2UuY29udGVudE5hbWU7XHJcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIGEucmVtb3ZlKCk7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnRE9XTkxPQUQnKTtcclxuICB9XHJcblxyXG4gIHF1bWxQbGF5ZXJFdmVudHMoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5laWQgPT09ICdRVU1MX1NVTU1BUlknKSB7XHJcbiAgICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSBmYWxzZTtcclxuICAgICAgY29uc3Qgc2NvcmUgPSBwYXJzZUludChldmVudC5lZGF0YS5leHRyYS5maW5kKHAgPT4gcC5pZCA9PT0gJ3Njb3JlJylbJ3ZhbHVlJ10sIDEwKTtcclxuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmludGVyY2VwdGlvblJlc3BvbnNlc1t0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lXSA9IHtcclxuICAgICAgICBzY29yZSxcclxuICAgICAgICBpc1NraXBwZWQ6IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGludGVyY2VwdFBvaW50RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1hcmtlci10aW1lPVwiJHt0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lfVwiXWApO1xyXG4gICAgICBpZiAoaW50ZXJjZXB0UG9pbnRFbGVtZW50KSB7XHJcbiAgICAgICAgaW50ZXJjZXB0UG9pbnRFbGVtZW50WydzdHlsZSddLmJhY2tncm91bmQgPSAnZ3JlZW4nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmlkZW9JbnN0YW5jZS5wbGF5KCk7XHJcbiAgICAgIHRoaXMudmlkZW9JbnN0YW5jZS5jb250cm9scyh0cnVlKTtcclxuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCd2aWRlbycpO1xyXG4gICAgICAvLyBpZiBjdXJyZW50bHkgdmlkZW8gaXMgbm90IGluIGZ1bGwgc2NyZWVuIGFuZCB3YXMgcHJldmlvdXNseSBmdWxsIHNjcmVlbiB0aGVuIHNldCBpdCBiYWNrIHRvIGZ1bGwgc2NyZWVuIGFnYWluXHJcbiAgICAgIGlmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgJiYgdGhpcy5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXSkge1xyXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXS5yZXF1ZXN0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHF1ZXN0aW9uU2V0RGF0YSh7cmVzcG9uc2UsIHRpbWUsIGlkZW50aWZpZXJ9KSB7XHJcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcubWV0YWRhdGEgPSByZXNwb25zZTtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5tZXRhZGF0YVsnc2hvd1N0YXJ0UGFnZSddID0gJ05vJztcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5tZXRhZGF0YVsnc2hvd0VuZFBhZ2UnXSA9ICdObyc7XHJcbiAgICB0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lID0gdGltZTtcclxuICAgIHRoaXMuY3VycmVudEludGVyY2VwdGlvblVJSWQgPSBpZGVudGlmaWVyO1xyXG4gICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dRdW1sUGxheWVyID0gdHJ1ZTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUltcHJlc3Npb25FdmVudCgnaW50ZXJhY3RpdmUtcXVlc3Rpb24tc2V0JywgeyBpZDogaWRlbnRpZmllciwgdHlwZTogJ1F1ZXN0aW9uU2V0JyB9KTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdWSURFT19NQVJLRVJfU0VMRUNURUQnLCB7XHJcbiAgICAgIGlkZW50aWZpZXIsIC8vIFF1ZXN0aW9uIHNldCBpZCxcclxuICAgICAgdHlwZTogJ1F1ZXN0aW9uU2V0JywgLy8gVHlwZSBvZiBpbnRlcmFjdGlvblxy