UNPKG

@project-sunbird/sunbird-video-player-v9

Version:

The Video player library is powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms _(mobile app, web portal, offline desktop app)_ to drive reusability and maintainability, hence reducing the redundant developmen

347 lines 59.9 kB
import { Component, EventEmitter, Input, Output, HostListener, ViewChild } from '@angular/core'; import { errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9'; import * as i0 from "@angular/core"; import * as i1 from "./sunbird-video-player.service"; import * as i2 from "./services/viewer.service"; import * as i3 from "@project-sunbird/sunbird-player-sdk-v9"; import * as i4 from "@angular/common"; import * as i5 from "@project-sunbird/sunbird-quml-player-v9"; import * as i6 from "./components/video-player/video-player.component"; const _c0 = ["videoPlayer"]; const _c1 = function (a0) { return { "isVisible": a0 }; }; function SunbirdVideoPlayerComponent_sb_player_side_menu_icon_2_Template(rf, ctx) { if (rf & 1) { const _r8 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sb-player-side-menu-icon", 8); i0.ɵɵlistener("sidebarMenuEvent", function SunbirdVideoPlayerComponent_sb_player_side_menu_icon_2_Template_sb_player_side_menu_icon_sidebarMenuEvent_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.sideBarEvents($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(1, _c1, ctx_r1.showControls)); } } function SunbirdVideoPlayerComponent_video_player_3_Template(rf, ctx) { if (rf & 1) { const _r10 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "video-player", 9); i0.ɵɵlistener("questionSetData", function SunbirdVideoPlayerComponent_video_player_3_Template_video_player_questionSetData_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r9.questionSetData($event)); })("playerInstance", function SunbirdVideoPlayerComponent_video_player_3_Template_video_player_playerInstance_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.playerInstance($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("config", ctx_r2.playerConfig.config)("action", ctx_r2.playerAction); } } function SunbirdVideoPlayerComponent_sb_player_sidebar_4_Template(rf, ctx) { if (rf & 1) { const _r13 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sb-player-sidebar", 10); i0.ɵɵlistener("sidebarEvent", function SunbirdVideoPlayerComponent_sb_player_sidebar_4_Template_sb_player_sidebar_sidebarEvent_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.sideBarEvents($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵproperty("playerConfig", ctx_r3.playerConfig)("title", ctx_r3.viewerService.contentName)("config", ctx_r3.sideMenuConfig); } } function SunbirdVideoPlayerComponent_sb_player_end_page_5_Template(rf, ctx) { if (rf & 1) { const _r15 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sb-player-end-page", 11); i0.ɵɵlistener("playNextContent", function SunbirdVideoPlayerComponent_sb_player_end_page_5_Template_sb_player_end_page_playNextContent_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.playContent($event)); })("exitContent", function SunbirdVideoPlayerComponent_sb_player_end_page_5_Template_sb_player_end_page_exitContent_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r16 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r16.exitContent($event)); })("replayContent", function SunbirdVideoPlayerComponent_sb_player_end_page_5_Template_sb_player_end_page_replayContent_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r17 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r17.replayContent($event)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵproperty("playerConfig", ctx_r4.playerConfig)("contentName", ctx_r4.viewerService.contentName)("outcomeLabel", ctx_r4.viewerService.showScore ? "Score: " : "")("outcome", ctx_r4.viewerService.showScore ? ctx_r4.viewerService.scoreObtained + (ctx_r4.viewerService.maxScore && ctx_r4.viewerService.maxScore > 0 ? "/" + ctx_r4.viewerService.maxScore : "") : "")("nextContent", ctx_r4.nextContent)("userName", ctx_r4.viewerService.userName)("showExit", ctx_r4.sideMenuConfig.showExit)("timeSpentLabel", ctx_r4.viewerService.timeSpent); } } function SunbirdVideoPlayerComponent_sb_player_contenterror_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sb-player-contenterror"); } } function SunbirdVideoPlayerComponent_div_7_Template(rf, ctx) { if (rf & 1) { const _r20 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 12, 13)(2, "quml-main-player", 14); i0.ɵɵlistener("playerEvent", function SunbirdVideoPlayerComponent_div_7_Template_quml_main_player_playerEvent_2_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r19.qumlPlayerEvents($event)); }); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r6 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵproperty("playerConfig", ctx_r6.QumlPlayerConfig); } } export class SunbirdVideoPlayerComponent { constructor(videoPlayerService, viewerService, cdr, renderer2, errorService) { 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.isInitialized = false; this.raiseInternetDisconnectionError = () => { const code = errorCode.internetConnectivity; const message = errorMessage.internetConnectivity; const stacktrace = `${code}: ${message}`; this.viewerService.raiseExceptionLog(code, message, stacktrace, this.traceId); }; this.playerEvent = this.viewerService.playerEvent; this.viewerService.playerEvent.subscribe(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'; this.cdr.detectChanges(); } if (event.type === 'error') { // eslint-disable-next-line one-var let code = errorCode.contentLoadFails, 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); } // eslint-disable-next-line max-len const events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' }, { type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }]; events.forEach(data => { if (event.type === data.type) { this.viewerService.raiseHeartBeatEvent(data.telemetryEvent); } }); }); } onTelemetryEvent(event) { this.telemetryEvent.emit(event.detail); } ngOnInit() { this.isInitialized = true; if (this.playerConfig) { if (typeof this.playerConfig === 'string') { try { this.playerConfig = JSON.parse(this.playerConfig); } catch (error) { console.error('Invalid playerConfig: ', error); } } } setInterval(() => { if (!this.isPaused) { this.showControls = false; } }, 5000); /* eslint-disable @typescript-eslint/dot-notation */ this.nextContent = this.playerConfig?.config?.nextContent; this.traceId = this.playerConfig.config['traceId']; this.sideMenuConfig = { ...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); } ngOnChanges(changes) { if (changes.action) { if (!this.showQumlPlayer) { this.playerAction = this.action; } } if (changes?.playerConfig?.firstChange && this.isInitialized) { // Calling for web component explicitly and life cycle works in different order this.ngOnInit(); } } ngAfterViewInit() { const videoPlayerElement = this.videoPlayerRef.nativeElement; this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', () => { this.showControls = true; }); this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', () => { this.showControls = true; }); const contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel']; if (contentCompabilityLevel) { const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel); if (!checkContentCompatible['isCompitable']) { // eslint-disable-next-line max-len this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible['error']['message'], this.traceId); } } } sideBarEvents(event) { this.playerEvent.emit(event); if (event.type === 'DOWNLOAD') { this.downloadVideo(); } const events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE']; events.forEach(data => { if (event.type === data) { this.viewerService.raiseHeartBeatEvent(data); } if (event.type === 'EXIT') { this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU'); } }); } setTelemetryObjectRollup(id) { if (this.QumlPlayerConfig.context) { const hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup; if (!hasObjectRollup) { this.QumlPlayerConfig.context.objectRollup = {}; } const levels = Object.keys(this.QumlPlayerConfig.context.objectRollup); this.QumlPlayerConfig.context.objectRollup[`l${levels.length + 1}`] = id; } } playContent(event) { this.viewerService.raiseHeartBeatEvent(event.type); } replayContent(event) { this.playerEvent.emit(event); this.viewState = 'player'; this.viewerService.isEndEventRaised = false; this.viewerService.raiseHeartBeatEvent('REPLAY'); this.cdr.detectChanges(); } exitContent(event) { this.playerEvent.emit(event); this.viewerService.raiseHeartBeatEvent('EXIT'); } downloadVideo() { const 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'); } qumlPlayerEvents(event) { if (event.eid === 'QUML_SUMMARY') { this.showQumlPlayer = false; const score = parseInt(event.edata.extra.find(p => p.id === 'score')['value'], 10); this.viewerService.interceptionResponses[this.currentInterceptionTime] = { score, isSkipped: false }; const 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((err) => console.error(err)); } } } } questionSetData({ response, time, 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((err) => 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, type: 'QuestionSet', interceptedAt: time // Time when the interception happened }); } playerInstance(event) { this.videoInstance = event; } ngOnDestroy() { this.viewerService.raiseEndEvent(true); this.unlistenTouchStart(); this.unlistenMouseMove(); this.viewerService.isEndEventRaised = false; window.removeEventListener('offline', this.raiseInternetDisconnectionError, true); } } /** @nocollapse */ SunbirdVideoPlayerComponent.ɵfac = function SunbirdVideoPlayerComponent_Factory(t) { return new (t || SunbirdVideoPlayerComponent)(i0.ɵɵdirectiveInject(i1.SunbirdVideoPlayerService), i0.ɵɵdirectiveInject(i2.ViewerService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i3.ErrorService)); }; /** @nocollapse */ SunbirdVideoPlayerComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SunbirdVideoPlayerComponent, selectors: [["sunbird-video-player"]], viewQuery: function SunbirdVideoPlayerComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.videoPlayerRef = _t.first); } }, hostBindings: function SunbirdVideoPlayerComponent_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("TelemetryEvent", function SunbirdVideoPlayerComponent_TelemetryEvent_HostBindingHandler($event) { return ctx.onTelemetryEvent($event); }, false, i0.ɵɵresolveDocument)("beforeunload", function SunbirdVideoPlayerComponent_beforeunload_HostBindingHandler() { return ctx.ngOnDestroy(); }, false, i0.ɵɵresolveWindow); } }, inputs: { playerConfig: "playerConfig", action: "action" }, outputs: { playerEvent: "playerEvent", telemetryEvent: "telemetryEvent" }, features: [i0.ɵɵNgOnChangesFeature], decls: 8, vars: 7, consts: [[1, "sunbird-video-player-container", 3, "ngClass"], ["videoPlayer", ""], ["class", "sb-player-side-menu-icon notVisible", "tabindex", "0", 3, "ngClass", "sidebarMenuEvent", 4, "ngIf"], [3, "config", "action", "questionSetData", "playerInstance", 4, "ngIf"], [3, "playerConfig", "title", "config", "sidebarEvent", 4, "ngIf"], ["tabindex", "0", 3, "playerConfig", "contentName", "outcomeLabel", "outcome", "nextContent", "userName", "showExit", "timeSpentLabel", "playNextContent", "exitContent", "replayContent", 4, "ngIf"], [4, "ngIf"], ["class", "sunbird-video-player-container", 4, "ngIf"], ["tabindex", "0", 1, "sb-player-side-menu-icon", "notVisible", 3, "ngClass", "sidebarMenuEvent"], [3, "config", "action", "questionSetData", "playerInstance"], [3, "playerConfig", "title", "config", "sidebarEvent"], ["tabindex", "0", 3, "playerConfig", "contentName", "outcomeLabel", "outcome", "nextContent", "userName", "showExit", "timeSpentLabel", "playNextContent", "exitContent", "replayContent"], [1, "sunbird-video-player-container"], ["qumlPlayer", ""], [3, "playerConfig", "playerEvent"]], template: function SunbirdVideoPlayerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0, 1); i0.ɵɵtemplate(2, SunbirdVideoPlayerComponent_sb_player_side_menu_icon_2_Template, 1, 3, "sb-player-side-menu-icon", 2); i0.ɵɵtemplate(3, SunbirdVideoPlayerComponent_video_player_3_Template, 1, 2, "video-player", 3); i0.ɵɵtemplate(4, SunbirdVideoPlayerComponent_sb_player_sidebar_4_Template, 1, 3, "sb-player-sidebar", 4); i0.ɵɵtemplate(5, SunbirdVideoPlayerComponent_sb_player_end_page_5_Template, 1, 8, "sb-player-end-page", 5); i0.ɵɵtemplate(6, SunbirdVideoPlayerComponent_sb_player_contenterror_6_Template, 1, 0, "sb-player-contenterror", 6); i0.ɵɵelementEnd(); i0.ɵɵtemplate(7, SunbirdVideoPlayerComponent_div_7_Template, 3, 1, "div", 7); } if (rf & 2) { i0.ɵɵproperty("ngClass", ctx.showQumlPlayer ? "videoPlayerHide" : "videoPlayerShow"); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.viewState === "player"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.viewState === "player"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.viewState === "player"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.viewState === "end"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showContentError); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showQumlPlayer); } }, dependencies: [i4.NgClass, i4.NgIf, i3.ɵd, i3.ɵe, i3.ɵf, i3.ɵl, i5.ɵbh, i6.VideoPlayerComponent], styles: [".sunbird-video-player-container[_ngcontent-%COMP%]{width:100%;height:100%;overflow:hidden;position:relative}.videoPlayerHide[_ngcontent-%COMP%]{display:none}.videoPlayerShow[_ngcontent-%COMP%]{display:block}pdf-menu[_ngcontent-%COMP%]{position:absolute;top:0;left:0;z-index:99}.notVisible[_ngcontent-%COMP%], .BtmNotVisible[_ngcontent-%COMP%]{transition:all 1s ease-in-out;position:absolute;width:100%}.notVisible[_ngcontent-%COMP%]{top:-10rem}.notVisible.isVisible[_ngcontent-%COMP%]{top:0rem}.BtmNotVisible[_ngcontent-%COMP%]{bottom:-10rem}.BtmNotVisible.isVisible[_ngcontent-%COMP%]{bottom:0rem} .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:none!important} .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:after, .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:before, .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:before, .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after{background-color:#ffffffb3!important} .sunbird-video-player-container .sb-player-side-menu-icon label{background:rgba(51,51,51,.5)} .sunbird-video-player-container .sb-player-side-menu-icon label span, .sunbird-video-player-container .sb-player-side-menu-icon label span:before, .sunbird-video-player-container .sb-player-side-menu-icon label span:after{background-color:#ffffffb3!important} .sunbird-pdf-player{overflow:hidden} .pdfViewer .page{background:none!important;border-image:none!important;border:0!important} #toolbarContainer{background:none!important;height:auto!important} #viewerContainer{position:relative!important;height:calc(100% - 3rem)} .html, .body, .pdf-viewer button, .pdf-viewer input, .pdf-viewer select{font-size:inherit!important} .findbar, .secondaryToolbar, html[dir=ltr] #toolbarContainer, html[dir=rtl] #toolbarContainer{box-shadow:none!important} .zoom{min-height:inherit!important} html[dir=rtl] .sb-pdf-reading-status{left:auto;right:1rem}.sb-pdf-reading-status[_ngcontent-%COMP%]{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[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{background:var(--gray-800);width:.25rem;height:.25rem;display:block;margin:0px .5rem;border-radius:50%}.sbt-pdf-footer[_ngcontent-%COMP%]{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){ .visible-only-potrait{display:none}}@media all and (orientation: portrait){ #viewerContainer{height:calc(100% - 6rem)!important} .visible-only-landscape{display:none} .visible-only-potrait{display:block} .file-download__popup{height:15.125rem} .pdf-endpage{display:block!important;position:relative} .pdf-endpage__left-panel{margin-top:6rem} .pdf-endpage__right-panel .title-section{position:absolute;top:0;left:0;right:0}}@media all and (max-width: 640px){.visible-only-landscape[_ngcontent-%COMP%]{display:none}.visible-only-potrait[_ngcontent-%COMP%]{display:block}}@media all and (min-width: 640px){.visible-only-landscape[_ngcontent-%COMP%]{display:block}.visible-only-potrait[_ngcontent-%COMP%]{display:none}}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SunbirdVideoPlayerComponent, [{ type: Component, args: [{ selector: 'sunbird-video-player', template: "<div class=\"sunbird-video-player-container\" #videoPlayer [ngClass]=\"showQumlPlayer ? 'videoPlayerHide': 'videoPlayerShow'\">\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\n\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\">\n </video-player>\n <sb-player-sidebar [playerConfig]=\"playerConfig\"\n *ngIf=\"viewState ==='player'\"\n [title]=\"viewerService.contentName\"\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\n <sb-player-end-page\n [playerConfig]=\"playerConfig\"\n [contentName]=\"viewerService.contentName\" \n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \n [showExit]=\"sideMenuConfig.showExit\"\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n</div>\n\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\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}.notVisible,.BtmNotVisible{transition:all 1s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0rem}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0rem}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:none!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:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after{background-color:#ffffffb3!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:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:after{background-color:#ffffffb3!important}::ng-deep .sunbird-pdf-player{overflow:hidden}::ng-deep .pdfViewer .page{background:none!important;border-image:none!important;border:0!important}::ng-deep #toolbarContainer{background:none!important;height:auto!important}::ng-deep #viewerContainer{position:relative!important;height:calc(100% - 3rem)}::ng-deep .html,::ng-deep .body,::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:0px .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}}\n"] }] }], function () { return [{ type: i1.SunbirdVideoPlayerService }, { type: i2.ViewerService }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i3.ErrorService }]; }, { 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'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3VuYmlyZC12aWRlby1wbGF5ZXIvc3JjL2xpYi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLXZpZGVvLXBsYXllci9zcmMvbGliL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDYyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQ2pFLFlBQVksRUFBYyxTQUFTLEVBQ3BDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBaUIsU0FBUyxFQUFHLFlBQVksRUFBaUIsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7Ozs7Ozs7O0lDSDFHLG1EQUU0RTtJQUZPLDJPQUFvQixlQUFBLDRCQUFxQixDQUFBLElBQUM7SUFFakQsaUJBQTJCOzs7SUFBbkUseUVBQXVDOzs7O0lBQzNFLHVDQUEwTDtJQUE3SSxrTkFBbUIsZUFBQSw4QkFBdUIsQ0FBQSxJQUFDLG9NQUFtQixlQUFBLDhCQUFzQixDQUFBLElBQXpDO0lBQ3hGLGlCQUFlOzs7SUFEb0gsbURBQThCLCtCQUFBOzs7O0lBRWpLLDZDQUdpRTtJQUFqRSx1TkFBZ0IsZUFBQSw2QkFBcUIsQ0FBQSxJQUFDO0lBQTJCLGlCQUFvQjs7O0lBSGxFLGtEQUE2QiwyQ0FBQSxpQ0FBQTs7OztJQUloRCw4Q0FTa0M7SUFGNEIsK05BQW1CLGVBQUEsMkJBQW1CLENBQUEsSUFBQywwTUFDaEYsZUFBQSwyQkFBbUIsQ0FBQSxJQUQ2RCw4TUFDeEMsZUFBQSw2QkFBcUIsQ0FBQSxJQURtQjtJQUVuRSxpQkFBcUI7OztJQVJ2RCxrREFBNkIsaURBQUEsaUVBQUEsdU1BQUEsbUNBQUEsMkNBQUEsNENBQUEsa0RBQUE7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QUE0QjtRQUE1QixpREFBNEI7UUFHMUMsZUFBMkI7UUFBM0IsaURBQTJCO1FBWXJCLGVBQXlCO1FBQXpCLDhDQUF5QjtRQUNQLGVBQXNCO1FBQXRCLDJDQUFzQjtRQUdSLGVBQW9CO1FBQXBCLHlDQUFvQjs7dUZEUnBELDJCQUEyQjtjQUx2QyxTQUFTOzJCQUNFLHNCQUFzQjsyTEFLdkIsWUFBWTtrQkFBcEIsS0FBSztZQUNHLE1BQU07a0JBQWQsS0FBSztZQUNJLFdBQVc7a0JBQXBCLE1BQU07WUFDRyxjQUFjO2tCQUF2QixNQUFNO1lBQ3FDLGNBQWM7a0JBQXpELFNBQVM7bUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQTJFMUMsZ0JBQWdCO2tCQURmLFlBQVk7bUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFxTG5ELFdBQVc7a0JBRFYsWUFBWTttQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLFxuICBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCwgUmVuZGVyZXIyLCBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgLCBlcnJvckNvZGUgLCBlcnJvck1lc3NhZ2UsIElTaWRlQmFyRXZlbnQgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OSc7XG5cbmltcG9ydCB7IFBsYXllckNvbmZpZyB9IGZyb20gJy4vcGxheWVySW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IFZpZXdlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1bmJpcmRWaWRlb1BsYXllclNlcnZpY2UgfSBmcm9tICcuL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VuYmlyZC12aWRlby1wbGF5ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN1bmJpcmRWaWRlb1BsYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFBsYXllckNvbmZpZztcbiAgQElucHV0KCkgYWN0aW9uPzogSUFjdGlvbjtcbiAgQE91dHB1dCgpIHBsYXllckV2ZW50OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcbiAgQE91dHB1dCgpIHRlbGVtZXRyeUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAVmlld0NoaWxkKCd2aWRlb1BsYXllcicsIHsgc3RhdGljOiB0cnVlIH0pIHZpZGVvUGxheWVyUmVmOiBFbGVtZW50UmVmO1xuICB2aWV3U3RhdGUgPSAncGxheWVyJztcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcbiAgcHVibGljIG5leHRDb250ZW50OiBhbnk7XG4gIHNob3dDb250ZW50RXJyb3I6IGJvb2xlYW47XG4gIHNob3dDb250cm9scyA9IHRydWU7XG4gIHNpZGVNZW51Q29uZmlnID0ge1xuICAgIHNob3dTaGFyZTogdHJ1ZSxcbiAgICBzaG93RG93bmxvYWQ6IHRydWUsXG4gICAgc2hvd1JlcGxheTogdHJ1ZSxcbiAgICBzaG93RXhpdDogdHJ1ZVxuICB9O1xuICBwcml2YXRlIHVubGlzdGVuVG91Y2hTdGFydDogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlTW92ZTogKCkgPT4gdm9pZDtcbiAgaXNQYXVzZWQgPSBmYWxzZTtcbiAgc2hvd1F1bWxQbGF5ZXIgPSBmYWxzZTtcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XG4gIHZpZGVvSW5zdGFuY2U6IGFueTtcbiAgY3VycmVudEludGVyY2VwdGlvblRpbWU7XG4gIGN1cnJlbnRJbnRlcmNlcHRpb25VSUlkO1xuICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTtcbiAgcGxheWVyQWN0aW9uOiBJQWN0aW9uO1xuICBwdWJsaWMgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aWRlb1BsYXllclNlcnZpY2U6IFN1bmJpcmRWaWRlb1BsYXllclNlcnZpY2UsXG4gICAgcHVibGljIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwdWJsaWMgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wbGF5ZXJFdmVudCA9IHRoaXMudmlld2VyU2VydmljZS5wbGF5ZXJFdmVudDtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucGxheWVyRXZlbnQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGF1c2UnKSB7XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3BsYXknKSB7XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbG9hZHN0YXJ0Jykge1xuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZW5kZWQnKSB7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5lbmRQYWdlU2VlbiA9IHRydWU7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUVuZEV2ZW50KCk7XG4gICAgICAgIHRoaXMudmlld1N0YXRlID0gJ2VuZCc7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvbmUtdmFyXG4gICAgICAgIGxldCBjb2RlID0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHMsXG4gICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICAgICAgY29kZSA9IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscykge1xuICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGNvZGUsIG1lc3NhZ2UsIGV2ZW50LCB0aGlzLnRyYWNlSWQpO1xuXG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgY29uc3QgZXZlbnRzID0gW3sgdHlwZTogJ3ZvbHVtZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnVk9MVU1FX0NIQU5HRScgfSwgeyB0eXBlOiAnc2Vla2luZycsIHRlbGVtZXRyeUV2ZW50OiAnRFJBRycgfSwgeyB0eXBlOiAnZnVsbHNjcmVlbicsIHRlbGVtZXRyeUV2ZW50OiAnRlVMTFNDUkVFTicgfSxcbiAgICAgIHsgdHlwZTogJ3JhdGVjaGFuZ2UnLCB0ZWxlbWV0cnlFdmVudDogJ1JBVEVfQ0hBTkdFJyB9XTtcbiAgICAgIGV2ZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gZGF0YS50eXBlKSB7XG4gICAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZGF0YS50ZWxlbWV0cnlFdmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6VGVsZW1ldHJ5RXZlbnQnLCBbJyRldmVudCddKVxuICBvblRlbGVtZXRyeUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy50ZWxlbWV0cnlFdmVudC5lbWl0KGV2ZW50LmRldGFpbCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZykge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wbGF5ZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBwbGF5ZXJDb25maWc6ICcsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9kb3Qtbm90YXRpb24gKi9cbiAgICB0aGlzLm5leHRDb250ZW50ID0gdGhpcy5wbGF5ZXJDb25maWc/LmNvbmZpZz8ubmV4dENvbnRlbnQ7XG4gICAgdGhpcy50cmFjZUlkID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnWyd0cmFjZUlkJ107XG4gICAgdGhpcy5zaWRlTWVudUNvbmZpZyA9IHsgLi4udGhpcy5zaWRlTWVudUNvbmZpZywgLi4udGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51IH07XG4gICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdGhpcy5yYWlzZUludGVybmV0RGlzY29ubmVjdGlvbkVycm9yICwgdHJ1ZSk7XG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbmZpZyA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZztcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51LmVuYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0ID0gdGhpcy5wbGF5ZXJDb25maWcuY29udGV4dDtcbiAgICB0aGlzLnNldFRlbGVtZXRyeU9iamVjdFJvbGx1cCh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5hY3Rpb24pIHtcbiAgICAgIGlmICghdGhpcy5zaG93UXVtbFBsYXllcikge1xuICAgICAgICB0aGlzLnBsYXllckFjdGlvbiA9IHRoaXMuYWN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlcz8ucGxheWVyQ29uZmlnPy5maXJzdENoYW5nZSAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIENhbGxpbmcgZm9yIHdlYiBjb21wb25lbnQgZXhwbGljaXRseSBhbmQgbGlmZSBjeWNsZSB3b3JrcyBpbiBkaWZmZXJlbnQgb3JkZXJcbiAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAg