UNPKG

sunbird-epub-player-v1

Version:

Contains Epub 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 develo

255 lines 40.1 kB
import { __awaiter } from "tslib"; import { EventEmitter, Component, Output, Input, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core'; import { ViwerService } from './services/viewerService/viwer-service'; import { EpubPlayerService } from './sunbird-epub-player.service'; import { epubPlayerConstants, pageId, telemetryType } from './sunbird-epub.constant'; import { ErrorService, errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9'; import { UtilService } from './services/utilService/util.service'; export class EpubPlayerComponent { constructor(viwerService, epubPlayerService, errorService, utilService, renderer2) { this.viwerService = viwerService; this.epubPlayerService = epubPlayerService; this.errorService = errorService; this.utilService = utilService; this.renderer2 = renderer2; this.fromConst = epubPlayerConstants; this.showFullScreen = false; this.headerActionsEvent = new EventEmitter(); this.telemetryEvent = new EventEmitter(); this.showControls = true; this.validPage = true; this.sideMenuConfig = { showShare: false, showDownload: false, showReplay: false, showExit: false, showPrint: false }; this.isInitialized = false; this.viewState = this.fromConst.LOADING; this.progress = 0; this.currentPageIndex = 1; this.headerConfiguration = { rotation: false, goto: true, navigation: true, zoom: false }; this.playerEvent = this.viwerService.playerEvent; } onTelemetryEvent(event) { this.telemetryEvent.emit(event.detail); } ngOnInit() { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { 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); } } } // initializing services this.viwerService.initialize(this.playerConfig); this.epubPlayerService.initialize(this.playerConfig); this.traceId = (_b = (_a = this.playerConfig) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.traceId; // checks online error while loading epub if (!navigator.onLine && !this.viwerService.isAvailableLocally) { // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(errorCode.internetConnectivity, this.currentPageIndex, errorMessage.internetConnectivity, this.traceId, new Error(errorMessage.internetConnectivity)); } // checks content compatibility error const contentCompabilityLevel = (_d = (_c = this.playerConfig) === null || _c === void 0 ? void 0 : _c.metadata) === null || _d === void 0 ? void 0 : _d.compatibilityLevel; if (contentCompabilityLevel) { const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel); if (!(checkContentCompatible === null || checkContentCompatible === void 0 ? void 0 : checkContentCompatible.isCompitable)) { // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(errorCode.contentCompatibility, this.currentPageIndex, errorCode.contentCompatibility, this.traceId, checkContentCompatible.error); } } this.showEpubViewer = true; this.sideMenuConfig = Object.assign(Object.assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu); this.getEpubLoadingProgress(); console.log('preview1', this.playerConfig); this.nextContent = this.playerConfig.config.nextContent; }); } ngOnChanges(changes) { var _a; if (changes.showFullScreen && !((_a = changes === null || changes === void 0 ? void 0 : changes.showFullScreen) === null || _a === void 0 ? void 0 : _a.firstChange)) { this.showFullScreen = changes.showFullScreen.currentValue; } if (changes.playerConfig.firstChange && this.isInitialized) { // Calling for web component explicitly and life cycle works in different order this.ngOnInit(); } } ngAfterViewInit() { const epubPlayerElement = this.epubPlayerRef.nativeElement; this.unlistenMouseEnter = this.renderer2.listen(epubPlayerElement, 'mouseenter', () => { this.showControls = true; }); this.unlistenMouseLeave = this.renderer2.listen(epubPlayerElement, 'mouseleave', () => { this.showControls = false; }); } headerActions(eventdata) { this.headerActionsEvent.emit(eventdata); } viewerEvent(event) { if (event.type === this.fromConst.EPUBLOADED) { this.onEpubLoaded(event); } if (event.type === this.fromConst.PAGECHANGE) { this.onPageChange(event); } if (event.type === this.fromConst.END) { this.onEpubEnded(event); } if (event.type === this.fromConst.ERROR) { this.onEpubLoadFailed(event); } if (event.type === this.fromConst.NAVIGATE_TO_PAGE) { this.onJumpToPage(event); } if (event.type === this.fromConst.INVALID_PAGE_ERROR) { this.validPage = event.data; this.resetValidPage(); } } resetValidPage() { setTimeout(() => { this.validPage = true; }, 5000); } onEpubLoaded(event) { var _a, _b, _c; clearInterval(this.intervalRef); this.viewState = this.fromConst.START; this.viwerService.raiseStartEvent(event.data); if (((_b = (_a = this.playerConfig.config) === null || _a === void 0 ? void 0 : _a.pagesVisited) === null || _b === void 0 ? void 0 : _b.length) && ((_c = this.playerConfig.config) === null || _c === void 0 ? void 0 : _c.currentLocation)) { this.currentPageIndex = this.playerConfig.config.pagesVisited[this.playerConfig.config.pagesVisited.length - 1]; } this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onPageChange(event) { var _a; if ((_a = event === null || event === void 0 ? void 0 : event.data) === null || _a === void 0 ? void 0 : _a.index) { this.currentPageIndex = event.data.index; } this.currentPageIndex = this.utilService.getCurrentIndex(event, this.currentPageIndex); this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); this.viwerService.raiseHeartBeatEvent(event, telemetryType.IMPRESSION); this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onJumpToPage(type) { var _a; this.currentPageIndex = (_a = type === null || type === void 0 ? void 0 : type.event) === null || _a === void 0 ? void 0 : _a.data; this.viwerService.raiseHeartBeatEvent(type, telemetryType.INTERACT); this.viwerService.raiseHeartBeatEvent(type, telemetryType.IMPRESSION); this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onEpubEnded(event) { this.viewState = this.fromConst.END; this.showEpubViewer = false; event.data.index = this.currentPageIndex; this.viwerService.raiseEndEvent(event); } onEpubLoadFailed(error) { this.showContentError = true; this.viewState = this.fromConst.LOADING; // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(error.errorCode, this.currentPageIndex, error.errorMessage, this.traceId, new Error(error.errorMessage)); } replayContent(event) { this.currentPageIndex = 1; this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); this.viewState = this.fromConst.START; this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); this.ngOnInit(); } exitContent(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); } sideBarEvents(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); if (event.type === 'DOWNLOAD') { this.downloadEpub(); } } sidebarMenuEvent(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); } getEpubLoadingProgress() { this.intervalRef = setInterval(() => { if (this.progress < 95) { this.progress = this.progress + 5; } }, 10); } downloadEpub() { const a = document.createElement('a'); a.href = this.viwerService.artifactUrl; a.download = this.viwerService.contentName; a.target = '_blank'; document.body.appendChild(a); a.click(); a.remove(); this.viwerService.raiseHeartBeatEvent('DOWNLOAD'); } ngOnDestroy() { const EndEvent = { type: this.fromConst.END, data: { index: this.currentPageIndex } }; this.viwerService.raiseEndEvent(EndEvent); this.viwerService.isEndEventRaised = false; this.unlistenMouseEnter(); this.unlistenMouseLeave(); } playNextContent(event) { this.viwerService.raiseHeartBeatEventNew(event === null || event === void 0 ? void 0 : event.type, telemetryType.INTERACT, pageId.endPage, event === null || event === void 0 ? void 0 : event.identifier); } } /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ EpubPlayerComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'sunbird-epub-player', template: "<div class=\"sunbird-epub-container\" #epubPlayer>\r\n<div *ngIf=\"viewState === fromConst.LOADING\">\r\n <sb-player-start-page [title]=\"viwerService.contentName\" [progress]=\"progress\"></sb-player-start-page>\r\n</div>\r\n<div class=\"epub-container\" *ngIf=\"showEpubViewer\">\r\n <ng-container *ngIf=\"viewState === fromConst.START\">\r\n <sb-player-header class=\"notVisible\" [totalPages]=\"viwerService?.totalNumberOfPages\" [pageNumber]=\"currentPageIndex\" [config]=\"headerConfiguration\" (actions)=\"headerActions($event)\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-header>\r\n <sb-player-side-menu-icon class=\"notVisible\" [ngClass]=\"{'isVisible': showControls}\" (sidebarMenuEvent)=\"sidebarMenuEvent($event)\">\r\n </sb-player-side-menu-icon>\r\n <sb-player-sidebar [title]=\"viwerService.contentName\" (sidebarEvent)=\"sideBarEvents($event)\"\r\n [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <div class=\"sb-epub-reading-status\" *ngIf=\"currentPageIndex && viwerService?.totalNumberOfPages\">\r\n Page {{currentPageIndex}} of {{viwerService?.totalNumberOfPages}} <span></span> {{((currentPageIndex/viwerService?.totalNumberOfPages) * 100).toFixed(0)}}%\r\n </div>\r\n \r\n </ng-container>\r\n <epub-viewer [actions]=\"headerActionsEvent\" [epubSrc]=\"viwerService.src\" [identifier]=\"viwerService.identifier\"\r\n (viewerEvent)=\"viewerEvent($event)\" [config]=\"playerConfig.config\" [showFullScreen]=\"showFullScreen\">\r\n </epub-viewer>\r\n</div>\r\n<sb-player-end-page *ngIf=\"viewState === fromConst.END\" [contentName]=\"viwerService.contentName\"\r\n [outcomeLabel]=\"'Pages read: '\" [outcome]=\"(currentPageIndex -1)\" [showExit]=\"sideMenuConfig.showExit\" [userName]=\"viwerService.userName\"\r\n [timeSpentLabel]=\"viwerService.timeSpent\" (replayContent)=\"replayContent($event)\" (exitContent)=\"exitContent($event)\" [nextContent]=\"nextContent\" (playNextContent)=\"playNextContent($event)\">\r\n</sb-player-end-page>\r\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n<div class=\"pagenotfound__tooltip\" *ngIf=\"!validPage\">\r\n <div class=\"pagenotfound__icon\"></div>\r\n <div class=\"pagenotfound__text\">Page Not Found</div>\r\n</div>\r\n", styles: [".sunbird-epub-container{height:100%;width:100%;background-color:#fff}.sunbird-epub-palyer-container{width:100%;height:100%;overflow:hidden;position:relative}.sb-epub-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:.75rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-epub-reading-status span{background:var(--gray-800);width:4px;height:4px;display:block;margin:0 .5em;border-radius:50%}.notVisible,.BtmNotVisible{transition:all .3s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0rem}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0rem}:host::ng-deep .sb-player-splash-container{height:100vh!important}:host::ng-deep epub-viewer{position:absolute;top:48px;width:100%;height:calc(100% - 48px);overflow-y:auto;overflow-x:hidden;left:0;background-color:#fff}:host::ng-deep .epub-container{height:100%;position:relative;overflow-x:hidden!important}.pagenotfound__tooltip{position:absolute;top:10%;left:50%;transform:translate(-50%);background:#333;z-index:11111;padding:calculateRem(8px) calculateRem(20px);font-size:calculateRem(14px);color:#fff;border-radius:calculateRem(4px);display:flex;align-items:center}.pagenotfound__icon{width:calculateRem(22px);height:calculateRem(22px);margin-right:calculateRem(12px);background:white;border-radius:50%;position:relative}.pagenotfound__icon:after{content:\"!\";position:absolute;top:50%;left:50%;color:#333;font-size:18px;transform:translate(-50%,-50%)}\n"] },] } ]; /** * @type {function(): !Array<(null|{ * type: ?, * decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>), * })>} * @nocollapse */ EpubPlayerComponent.ctorParameters = () => [ { type: ViwerService }, { type: EpubPlayerService }, { type: ErrorService }, { type: UtilService }, { type: Renderer2 } ]; /** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ EpubPlayerComponent.propDecorators = { epubPlayerRef: [{ type: ViewChild, args: ['epubPlayer', { static: true },] }], playerConfig: [{ type: Input }], showFullScreen: [{ type: Input }], headerActionsEvent: [{ type: Output }], telemetryEvent: [{ type: Output }], playerEvent: [{ type: Output }], onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }], ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLWVwdWItcGxheWVyL3NyYy9saWIvc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsWUFBWSxFQUNqRCxVQUFVLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQzNELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQVVsRSxNQUFNLE9BQU8sbUJBQW1CO0lBbUM5QixZQUNTLFlBQTBCLEVBQ3pCLGlCQUFvQyxFQUNyQyxZQUEwQixFQUMxQixXQUF3QixFQUN2QixTQUFvQjtRQUpyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3JDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUF2QzlCLGNBQVMsR0FBRyxtQkFBbUIsQ0FBQztRQUd2QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0Qix1QkFBa0IsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRSxtQkFBYyxH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QkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBSztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxVQUFVLENBQUMsQ0FBQztJQUNuSCxDQUFDOzs7O1lBeFBGLFNBQVMsU0FBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLDJ6RUFBbUQ7O2FBRXBEOzs7Ozs7Ozs7O1lBZFEsWUFBWTtZQUVaLGlCQUFpQjtZQUVqQixZQUFZO1lBQ1osV0FBVztZQVArQixTQUFTOzs7OzRCQW1CekQsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MkJBQ3hDLEtBQUs7NkJBQ0wsS0FBSztpQ0FDTCxNQUFNOzZCQUNOLE1BQU07MEJBQ04sTUFBTTsrQkFzQ04sWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzBCQXFMbEQsWUFBWSxTQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRXZlbnRFbWl0dGVyLCBDb21wb25lbnQsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLFxyXG4gIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaXdlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdlclNlcnZpY2Uvdml3ZXItc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYXllckNvbmZpZyB9IGZyb20gJy4vc3VuYmlyZC1lcHViLXBsYXllci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBFcHViUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC1lcHViLXBsYXllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZXB1YlBsYXllckNvbnN0YW50cywgcGFnZUlkLCB0ZWxlbWV0cnlUeXBlIH0gZnJvbSAnLi9zdW5iaXJkLWVwdWIuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjknO1xyXG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdXRpbFNlcnZpY2UvdXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmV4dENvbnRlbnQgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OS9zdW5iaXJkLXBsYXllci1zZGsuaW50ZXJmYWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdzdW5iaXJkLWVwdWItcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcHViUGxheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgZnJvbUNvbnN0ID0gZXB1YlBsYXllckNvbnN0YW50cztcclxuICBAVmlld0NoaWxkKCdlcHViUGxheWVyJywgeyBzdGF0aWM6IHRydWUgfSkgZXB1YlBsYXllclJlZjogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBwbGF5ZXJDb25maWc6IFBsYXllckNvbmZpZztcclxuICBASW5wdXQoKSBzaG93RnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJBY3Rpb25zRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHRlbGVtZXRyeUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlRW50ZXI6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlTGVhdmU6ICgpID0+IHZvaWQ7XHJcbiAgcHVibGljIHNob3dDb250cm9scyA9IHRydWU7XHJcbiAgcHVibGljIHZhbGlkUGFnZSA9IHRydWU7XHJcbiAgc2hvd0NvbnRlbnRFcnJvcjogYm9vbGVhbjtcclxuICBzaWRlTWVudUNvbmZpZyA9IHtcclxuICAgIHNob3dTaGFyZTogZmFsc2UsXHJcbiAgICBzaG93RG93bmxvYWQ6IGZhbHNlLFxyXG4gICAgc2hvd1JlcGxheTogZmFsc2UsXHJcbiAgICBzaG93RXhpdDogZmFsc2UsXHJcbiAgICBzaG93UHJpbnQ6IGZhbHNlXHJcbiAgfTtcclxuICBwdWJsaWMgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LkxPQURJTkc7XHJcbiAgaW50ZXJ2YWxSZWY6IGFueTtcclxuICBwcm9ncmVzcyA9IDA7XHJcbiAgc2hvd0VwdWJWaWV3ZXI6IGJvb2xlYW47XHJcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcclxuICBjdXJyZW50UGFnZUluZGV4ID0gMTtcclxuICBoZWFkZXJDb25maWd1cmF0aW9uID0ge1xyXG4gICAgcm90YXRpb246IGZhbHNlLFxyXG4gICAgZ290bzogdHJ1ZSxcclxuICAgIG5hdmlnYXRpb246IHRydWUsXHJcbiAgICB6b29tOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIG5leHRDb250ZW50OiBOZXh0Q29udGVudDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB2aXdlclNlcnZpY2U6IFZpd2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgZXB1YlBsYXllclNlcnZpY2U6IEVwdWJQbGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHVibGljIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQgPSB0aGlzLnZpd2VyU2VydmljZS5wbGF5ZXJFdmVudDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcclxuICBvblRlbGVtZXRyeUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZykge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucGxheWVyQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHBsYXllckNvbmZpZzogJywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaW5pdGlhbGl6aW5nIHNlcnZpY2VzXHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMuZXB1YlBsYXllclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XHJcbiAgICB0aGlzLnRyYWNlSWQgPSB0aGlzLnBsYXllckNvbmZpZz8uY29uZmlnPy50cmFjZUlkO1xyXG5cclxuXHJcbiAgICAvLyBjaGVja3Mgb25saW5lIGVycm9yIHdoaWxlIGxvYWRpbmcgZXB1YlxyXG4gICAgaWYgKCFuYXZpZ2F0b3Iub25MaW5lICYmICF0aGlzLnZpd2VyU2VydmljZS5pc0F2YWlsYWJsZUxvY2FsbHkpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGUuaW50ZXJuZXRDb25uZWN0aXZpdHksIHRoaXMuY3VycmVudFBhZ2VJbmRleCwgZXJyb3JNZXNzYWdlLmludGVybmV0Q29ubmVjdGl2aXR5LCB0aGlzLnRyYWNlSWQsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVja3MgY29udGVudCBjb21wYXRpYmlsaXR5IGVycm9yXHJcbiAgICBjb25zdCBjb250ZW50Q29tcGFiaWxpdHlMZXZlbCA9IHRoaXMucGxheWVyQ29uZmlnPy5tZXRhZGF0YT8uY29tcGF0aWJpbGl0eUxldmVsO1xyXG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrQ29udGVudENvbXBhdGlibGUgPSB0aGlzLmVycm9yU2VydmljZS5jaGVja0NvbnRlbnRDb21wYXRpYmlsaXR5KGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKTtcclxuICAgICAgaWYgKCFjaGVja0NvbnRlbnRDb21wYXRpYmxlPy5pc0NvbXBpdGFibGUpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgsIGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgdGhpcy50cmFjZUlkLCBjaGVja0NvbnRlbnRDb21wYXRpYmxlLmVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2hvd0VwdWJWaWV3ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zaWRlTWVudUNvbmZpZyA9IHsgLi4udGhpcy5zaWRlTWVudUNvbmZpZywgLi4udGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51IH07XHJcbiAgICB0aGlzLmdldEVwdWJMb2FkaW5nUHJvZ3Jlc3MoKTtcclxuICAgIGNvbnNvbGUubG9nKCdwcmV2aWV3MScsIHRoaXMucGxheWVyQ29uZmlnKTtcclxuICAgIHRoaXMubmV4dENvbnRlbnQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWcubmV4dENvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5zaG93RnVsbFNjcmVlbiAmJiAhY2hhbmdlcz8uc2hvd0Z1bGxTY3JlZW4/LmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Z1bGxTY3JlZW4gPSBjaGFuZ2VzLnNob3dGdWxsU2NyZWVuLmN1cnJlbnRWYWx1ZTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzLnBsYXllckNvbmZpZy5maXJzdENoYW5nZSAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgLy8gQ2FsbGluZyBmb3Igd2ViIGNvbXBvbmVudCBleHBsaWNpdGx5IGFuZCBsaWZlIGN5Y2xlIHdvcmtzIGluIGRpZmZlcmVudCBvcmRlclxyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IGVwdWJQbGF5ZXJFbGVtZW50ID0gdGhpcy5lcHViUGxheWVyUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlciA9IHRoaXMucmVuZGVyZXIyLmxpc3RlbihlcHViUGxheWVyRWxlbWVudCwgJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZUxlYXZlID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKGVwdWJQbGF5ZXJFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcclxuICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGVhZGVyQWN0aW9ucyhldmVudGRhdGEpIHtcclxuICAgIHRoaXMuaGVhZGVyQWN0aW9uc0V2ZW50LmVtaXQoZXZlbnRkYXRhKTtcclxuICB9XHJcblxyXG4gIHZpZXdlckV2ZW50KGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuRVBVQkxPQURFRCkge1xyXG4gICAgICB0aGlzLm9uRXB1YkxvYWRlZChldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuUEFHRUNIQU5HRSkge1xyXG4gICAgICB0aGlzLm9uUGFnZUNoYW5nZShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuRU5EKSB7XHJcbiAgICAgIHRoaXMub25FcHViRW5kZWQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IHRoaXMuZnJvbUNvbnN0LkVSUk9SKSB7XHJcbiAgICAgIHRoaXMub25FcHViTG9hZEZhaWxlZChldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuTkFWSUdBVEVfVE9fUEFHRSkge1xyXG4gICAgICB0aGlzLm9uSnVtcFRvUGFnZShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gdGhpcy5mcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SKSB7XHJcbiAgICAgIHRoaXMudmFsaWRQYWdlID0gZXZlbnQuZGF0YTtcclxuICAgICAgdGhpcy5yZXNldFZhbGlkUGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRWYWxpZFBhZ2UoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy52YWxpZFBhZ2UgPSB0cnVlO1xyXG4gICAgfSwgNTAwMCk7XHJcbiAgfVxyXG5cclxuICBvbkVwdWJMb2FkZWQoZXZlbnQpIHtcclxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFJlZik7XHJcbiAgICB0aGlzLnZpZXdTdGF0ZSA9IHRoaXMuZnJvbUNvbnN0LlNUQVJUO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KGV2ZW50LmRhdGEpO1xyXG5cclxuICAgIGlmICh0aGlzLnBsYXllckNvbmZpZy5jb25maWc/LnBhZ2VzVmlzaXRlZD8ubGVuZ3RoICYmIHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZz8uY3VycmVudExvY2F0aW9uKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5wYWdlc1Zpc2l0ZWRbdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLnBhZ2VzVmlzaXRlZC5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudD8uZGF0YT8uaW5kZXgpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gZXZlbnQuZGF0YS5pbmRleDtcclxuICAgIH1cclxuICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IHRoaXMudXRpbFNlcnZpY2UuZ2V0Q3VycmVudEluZGV4KGV2ZW50LCB0aGlzLmN1cnJlbnRQYWdlSW5kZXgpO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklNUFJFU1NJT04pO1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UubWV0YURhdGEucGFnZXNWaXNpdGVkLnB1c2godGhpcy5jdXJyZW50UGFnZUluZGV4KTtcclxuICB9XHJcblxyXG4gIG9uSnVtcFRvUGFnZSh0eXBlKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlSW5kZXggPSB0eXBlPy5ldmVudD8uZGF0YTtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZSwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KHR5cGUsIHRlbGVtZXRyeVR5cGUuSU1QUkVTU0lPTik7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5tZXRhRGF0YS5wYWdlc1Zpc2l0ZWQucHVzaCh0aGlzLmN1cnJlbnRQYWdlSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgb25FcHViRW5kZWQoZXZlbnQpIHtcclxuICAgIHRoaXMudmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuRU5EO1xyXG4gICAgdGhpcy5zaG93RXB1YlZpZXdlciA9IGZhbHNlO1xyXG4gICAgZXZlbnQuZGF0YS5pbmRleCA9IHRoaXMuY3VycmVudFBhZ2VJbmRleDtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25FcHViTG9hZEZhaWxlZChlcnJvcikge1xyXG4gICAgdGhpcy5zaG93Q29udGVudEVycm9yID0gdHJ1ZTtcclxuICAgIHRoaXMudmlld1N0YXRlID0gdGhpcy5mcm9tQ29uc3QuTE9BRElORztcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yLmVycm9yQ29kZSwgdGhpcy5jdXJyZW50UGFnZUluZGV4LCBlcnJvci5lcnJvck1lc3NhZ2UsIHRoaXMudHJhY2VJZCwgbmV3IEVycm9yKGVycm9yLmVycm9yTWVzc2FnZSkpO1xyXG4gIH1cclxuXHJcbiAgcmVwbGF5Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnQsIHRlbGVtZXRyeVR5cGUuSU5URVJBQ1QpO1xyXG4gICAgdGhpcy52aWV3U3RhdGUgPSB0aGlzLmZyb21Db25zdC5TVEFSVDtcclxuICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLnBhZ2VzVmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XHJcbiAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBleGl0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudCwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCk7XHJcbiAgfVxyXG5cclxuICBzaWRlQmFyRXZlbnRzKGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcclxuICAgIGlmIChldmVudC50eXBlID09PSAnRE9XTkxPQUQnKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRFcHViKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaWRlYmFyTWVudUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGV2ZW50LCB0ZWxlbWV0cnlUeXBlLklOVEVSQUNUKTtcclxuICB9XHJcblxyXG4gIGdldEVwdWJMb2FkaW5nUHJvZ3Jlc3MoKSB7XHJcbiAgICB0aGlzLmludGVydmFsUmVmID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wcm9ncmVzcyA8IDk1KSB7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3MgKyA1O1xyXG4gICAgICB9XHJcbiAgICB9LCAxMCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEVwdWIoKSB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdGhpcy52aXdlclNlcnZpY2UuYXJ0aWZhY3RVcmw7XHJcbiAgICBhLmRvd25sb2FkID0gdGhpcy52aXdlclNlcnZpY2UuY29udGVudE5hbWU7XHJcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIGEucmVtb3ZlKCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdET1dOTE9BRCcpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcpXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBjb25zdCBFbmRFdmVudCA9IHtcclxuICAgICAgdHlwZTogdGhpcy5mcm9tQ29uc3QuRU5ELFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgaW5kZXg6IHRoaXMuY3VycmVudFBhZ2VJbmRleFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VFbmRFdmVudChFbmRFdmVudCk7XHJcbiAgICB0aGlzLnZpd2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLnVubGlzdGVuTW91c2VFbnRlcigpO1xyXG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTGVhdmUoKTtcclxuICB9XHJcblxyXG4gIHBsYXlOZXh0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudE5ldyhldmVudD8udHlwZSwgdGVsZW1ldHJ5VHlwZS5JTlRFUkFDVCwgcGFnZUlkLmVuZFBhZ2UsIGV2ZW50Py5pZGVudGlmaWVyKTtcclxuICB9XHJcbn1cclxuIl19