UNPKG

@project-sunbird/sunbird-epub-player-v9

Version:

The Epub 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 development

200 lines 25.5 kB
import { ViewChild, Component, Input, EventEmitter, Output } from '@angular/core'; import Epub from 'epubjs'; import { epubPlayerConstants as fromConst } from '../sunbird-epub.constant'; import { errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9'; import * as i0 from "@angular/core"; import * as i1 from "../services/viewerService/viwer-service"; import * as i2 from "../services/utilService/util.service"; const _c0 = ["epubViewer"]; const MAX_TIME_TO_LOAD_SPINE = 5 * 60 * 1000; // 5 minutes export class EpubViewerComponent { constructor(viwerService, utilService) { this.viwerService = viwerService; this.utilService = utilService; this.actions = new EventEmitter(); this.showFullScreen = false; this.viewerEvent = new EventEmitter(); } ngOnInit() { this.idForRendition = `${this.identifier}-content`; } ngOnChanges(changes) { if (this.rendition && !changes?.showFullScreen?.firstChange) { this.rendition.resize(); } } async ngAfterViewInit() { try { if (!this.viwerService.isAvailableLocally) { this.epubBlob = await this.viwerService.isValidEpubSrc(this.epubSrc); this.eBook = Epub(this.epubBlob); } else if (this.viwerService.isAvailableLocally) { this.eBook = Epub(this.epubSrc); } this.rendition = this.eBook.renderTo(this.idForRendition, { flow: 'paginated', width: '100%', }); this.rendition.on('layout', (layout) => { this.viwerService.totalNumberOfPages = this.eBook?.navigation?.length; if (this.eBook.navigation.length > 2) { this.rendition.spread('none'); this.rendition.flow('scrolled'); this.scrolled = true; } else { this.rendition.spread('auto'); this.scrolled = false; } }); this.rendition.on('displayError', (error) => { this.emitErrorEvent(); }); const spine = await this.utilService.fulfillWithTimeLimit(MAX_TIME_TO_LOAD_SPINE, this.eBook.loaded.spine, null); if (spine) { this.displayEpub(); this.lastSection = spine.last(); this.viewerEvent.emit({ type: fromConst.EPUBLOADED, data: spine }); this.handleActions(spine); } else { this.emitErrorEvent(); } } catch (error) { this.emitErrorEvent(); } } displayEpub() { const { currentLocation } = this.config; if (!currentLocation) { this.rendition.display(); } this.eBook.ready.then(() => { return this.eBook.locations.generate(1000); }).then((locations) => { const totalPages = this.eBook?.spine?.length; this.viwerService.totalNumberOfPages = totalPages ? (totalPages - 1) : 0; if (currentLocation) { const cfi = this.eBook.locations.cfiFromPercentage(Number(currentLocation)); this.rendition.display(cfi); } }); } handleActions(spine) { this.actions.subscribe((event) => { const type = event.type; if (this.rendition?.location?.start) { const data = this.rendition.location.start; if (this.scrolled && data.href === this.lastSection.href) { this.viwerService.metaData.currentLocation = 0; this.emitEndEvent(); } else { if (this.rendition.location.atEnd || (spine.length === 1 && (this.rendition.location.end.displayed.page + 1 >= this.rendition.location.end.displayed.total))) { this.viwerService.metaData.currentLocation = 0; this.emitEndEvent(); } } if (type === fromConst.NEXT) { this.rendition.next().then(() => { this.saveCurrentLocation(); this.viewerEvent.emit({ type: fromConst.PAGECHANGE, data, interaction: fromConst.NEXT }); }); } else if (type === fromConst.PREVIOUS) { this.rendition.prev().then(() => { this.saveCurrentLocation(); this.viewerEvent.emit({ type: fromConst.PAGECHANGE, data, interaction: fromConst.PREVIOUS }); }); } if (type === fromConst.NAVIGATE_TO_PAGE) { this.rendition.display(event.data); this.viewerEvent.emit({ type: fromConst.NAVIGATE_TO_PAGE, event, interaction: fromConst.NAVIGATE_TO_PAGE }); } if (type === fromConst.INVALID_PAGE_ERROR) { this.viewerEvent.emit({ type: fromConst.INVALID_PAGE_ERROR, event, interaction: fromConst.INVALID_PAGE_ERROR }); } } }); } saveCurrentLocation() { const currentLocation = this.rendition.currentLocation(); if (currentLocation?.start?.cfi) { // Get the Percentage (or location) from that CFI const currentPageLocation = this.eBook.locations.percentageFromCfi(currentLocation.start.cfi); this.viwerService.metaData.currentLocation = currentPageLocation; } } emitEndEvent() { this.viewerEvent.emit({ type: fromConst.END, data: { percentage: 100 } }); } emitErrorEvent() { this.viewerEvent.emit({ type: fromConst.ERROR, errorCode: errorCode.contentLoadFails, errorMessage: errorMessage.contentLoadFails }); } ngOnDestroy() { this.eBook?.destroy(); } /** @nocollapse */ static { this.ɵfac = function EpubViewerComponent_Factory(t) { return new (t || EpubViewerComponent)(i0.ɵɵdirectiveInject(i1.ViwerService), i0.ɵɵdirectiveInject(i2.UtilService)); }; } /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: EpubViewerComponent, selectors: [["epub-viewer"]], viewQuery: function EpubViewerComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.epubViewer = _t.first); } }, inputs: { epubSrc: "epubSrc", config: "config", identifier: "identifier", actions: "actions", showFullScreen: "showFullScreen" }, outputs: { viewerEvent: "viewerEvent" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["epubViewer", ""], [1, "rendition", 3, "id"]], template: function EpubViewerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 1, 0); } if (rf & 2) { i0.ɵɵproperty("id", ctx.idForRendition); } } }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EpubViewerComponent, [{ type: Component, args: [{ selector: 'epub-viewer', template: "<div class=\"rendition\" [id]=\"idForRendition\" #epubViewer></div>" }] }], () => [{ type: i1.ViwerService }, { type: i2.UtilService }], { epubViewer: [{ type: ViewChild, args: ['epubViewer', { static: true }] }], epubSrc: [{ type: Input }], config: [{ type: Input }], identifier: [{ type: Input }], actions: [{ type: Input }], showFullScreen: [{ type: Input }], viewerEvent: [{ type: Output }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EpubViewerComponent, { className: "EpubViewerComponent", filePath: "lib/epub-viewer/epub-viewer.component.ts", lineNumber: 16 }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXB1Yi12aWV3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3VuYmlyZC1lcHViLXBsYXllci9zcmMvbGliL2VwdWItdmlld2VyL2VwdWItdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N1bmJpcmQtZXB1Yi1wbGF5ZXIvc3JjL2xpYi9lcHViLXZpZXdlci9lcHViLXZpZXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUM3RCxZQUFZLEVBQUUsTUFBTSxFQUErQyxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLElBQUksTUFBTSxRQUFRLENBQUM7QUFFMUIsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7O0FBR2pGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBTzFELE1BQU0sT0FBTyxtQkFBbUI7SUFlOUIsWUFDUyxZQUEwQixFQUN6QixXQUF3QjtRQUR6QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQVJ6QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNsQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFPNUMsQ0FBQztJQUNMLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsVUFBVSxDQUFDO0lBQ3JELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJ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QUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUcsbUJBQW1CLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ25CLElBQUksRUFBRTtnQkFDSixVQUFVLEVBQUUsR0FBRzthQUNoQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLO1lBQ3JCLFNBQVMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1lBQ3JDLFlBQVksRUFBRSxZQUFZLENBQUMsZ0JBQWdCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO3VHQTlLVSxtQkFBbUI7bUdBQW5CLG1CQUFtQjs7Ozs7O1lDZmhDLDRCQUErRDs7WUFBeEMsdUNBQXFCOzs7aUZEZS9CLG1CQUFtQjtjQU4vQixTQUFTOzJCQUVFLGFBQWE7dUVBU29CLFVBQVU7a0JBQXBELFNBQVM7bUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNoQyxPQUFPO2tCQUFmLEtBQUs7WUFDRyxNQUFNO2tCQUFkLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBQ0csY0FBYztrQkFBdEIsS0FBSztZQUNJLFdBQVc7a0JBQXBCLE1BQU07O2tGQVhJLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCxcbiAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uSW5pdCwgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBFcHViIGZyb20gJ2VwdWJqcyc7XG5pbXBvcnQgeyBWaXdlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgZXB1YlBsYXllckNvbnN0YW50cyBhcyBmcm9tQ29uc3QgfSBmcm9tICcuLi9zdW5iaXJkLWVwdWIuY29uc3RhbnQnO1xuaW1wb3J0IHsgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OSc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3V0aWxTZXJ2aWNlL3V0aWwuc2VydmljZSc7XG5cbmNvbnN0IE1BWF9USU1FX1RPX0xPQURfU1BJTkUgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXNcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2VwdWItdmlld2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VwdWItdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZXB1Yi12aWV3ZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVwdWJWaWV3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgZUJvb2s6IGFueTtcbiAgcmVuZGl0aW9uOiBhbnk7XG4gIGxhc3RTZWN0aW9uOiBhbnk7XG4gIHNjcm9sbGVkOiBib29sZWFuO1xuICBAVmlld0NoaWxkKCdlcHViVmlld2VyJywgeyBzdGF0aWM6IHRydWUgfSkgZXB1YlZpZXdlcjogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgZXB1YlNyYzogc3RyaW5nO1xuICBASW5wdXQoKSBjb25maWc6IGFueTtcbiAgQElucHV0KCkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBASW5wdXQoKSBhY3Rpb25zID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIHNob3dGdWxsU2NyZWVuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB2aWV3ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBpZEZvclJlbmRpdGlvbjogYW55O1xuICBlcHViQmxvYjogb2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aXdlclNlcnZpY2U6IFZpd2VyU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZVxuICApIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlkRm9yUmVuZGl0aW9uID0gYCR7dGhpcy5pZGVudGlmaWVyfS1jb250ZW50YDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5yZW5kaXRpb24gJiYgIWNoYW5nZXM/LnNob3dGdWxsU2NyZWVuPy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZW5kaXRpb24ucmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMudml3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICB0aGlzLmVwdWJCbG9iID0gYXdhaXQgdGhpcy52aXdlclNlcnZpY2UuaXNWYWxpZEVwdWJTcmModGhpcy5lcHViU3JjKTtcbiAgICAgICAgdGhpcy5lQm9vayA9IEVwdWIodGhpcy5lcHViQmxvYik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudml3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICB0aGlzLmVCb29rID0gRXB1Yih0aGlzLmVwdWJTcmMpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW5kaXRpb24gPSB0aGlzLmVCb29rLnJlbmRlclRvKHRoaXMuaWRGb3JSZW5kaXRpb24sIHtcbiAgICAgICAgZmxvdzogJ3BhZ2luYXRlZCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVuZGl0aW9uLm9uKCdsYXlvdXQnLCAobGF5b3V0KSA9PiB7XG4gICAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRoaXMuZUJvb2s/Lm5hdmlnYXRpb24/Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuZUJvb2submF2aWdhdGlvbi5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uc3ByZWFkKCdub25lJyk7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24uZmxvdygnc2Nyb2xsZWQnKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5zcHJlYWQoJ2F1dG8nKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJlbmRpdGlvbi5vbignZGlzcGxheUVycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdEVycm9yRXZlbnQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzcGluZSA9IGF3YWl0IHRoaXMudXRpbFNlcnZpY2UuZnVsZmlsbFdpdGhUaW1lTGltaXQoTUFYX1RJTUVfVE9fTE9BRF9TUElORSwgdGhpcy5lQm9vay5sb2FkZWQuc3BpbmUsIG51bGwpO1xuXG4gICAgICBpZiAoc3BpbmUpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RXB1YigpO1xuICAgICAgICB0aGlzLmxhc3RTZWN0aW9uID0gc3BpbmUubGFzdCgpO1xuICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xuICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5FUFVCTE9BREVELFxuICAgICAgICAgIGRhdGE6IHNwaW5lXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbnMoc3BpbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0RXJyb3JFdmVudCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXRFcnJvckV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZGlzcGxheUVwdWIoKSB7XG4gICAgY29uc3QgeyBjdXJyZW50TG9jYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgIGlmICghY3VycmVudExvY2F0aW9uKSB7XG4gICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KCk7XG4gICAgfVxuICAgIHRoaXMuZUJvb2sucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lQm9vay5sb2NhdGlvbnMuZ2VuZXJhdGUoMTAwMCk7XG4gICAgfSkudGhlbigobG9jYXRpb25zKSA9PiB7XG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy5lQm9vaz8uc3BpbmU/Lmxlbmd0aDtcbiAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLnRvdGFsTnVtYmVyT2ZQYWdlcyA9IHRvdGFsUGFnZXMgPyAodG90YWxQYWdlcyAtIDEpIDogMDtcbiAgICAgIGlmIChjdXJyZW50TG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgY2ZpID0gdGhpcy5lQm9vay5sb2NhdGlvbnMuY2ZpRnJvbVBlcmNlbnRhZ2UoTnVtYmVyKGN1cnJlbnRMb2NhdGlvbikpO1xuICAgICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KGNmaSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVBY3Rpb25zKHNwaW5lKSB7XG4gICAgdGhpcy5hY3Rpb25zLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBldmVudC50eXBlO1xuICAgICAgaWYgKHRoaXMucmVuZGl0aW9uPy5sb2NhdGlvbj8uc3RhcnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVuZGl0aW9uLmxvY2F0aW9uLnN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxlZCAmJiBkYXRhLmhyZWYgPT09IHRoaXMubGFzdFNlY3Rpb24uaHJlZikge1xuICAgICAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLmN1cnJlbnRMb2NhdGlvbiA9IDA7XG4gICAgICAgICAgdGhpcy5lbWl0RW5kRXZlbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5yZW5kaXRpb24ubG9jYXRpb24uYXRFbmQgfHwgKHNwaW5lLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgKHRoaXMucmVuZGl0aW9uLmxvY2F0aW9uLmVuZC5kaXNwbGF5ZWQucGFnZSArIDEgPj0gdGhpcy5yZW5kaXRpb24ubG9jYXRpb24uZW5kLmRpc3BsYXllZC50b3RhbCkpKSB7XG4gICAgICAgICAgICB0aGlzLnZpd2VyU2VydmljZS5tZXRhRGF0YS5jdXJyZW50TG9jYXRpb24gPSAwO1xuICAgICAgICAgICAgdGhpcy5lbWl0RW5kRXZlbnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGZyb21Db25zdC5ORVhUKSB7XG4gICAgICAgICAgdGhpcy5yZW5kaXRpb24ubmV4dCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudExvY2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdlckV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuUEFHRUNIQU5HRSxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5ORVhUXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBmcm9tQ29uc3QuUFJFVklPVVMpIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5wcmV2KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICAgIHR5cGU6IGZyb21Db25zdC5QQUdFQ0hBTkdFLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBpbnRlcmFjdGlvbjogZnJvbUNvbnN0LlBSRVZJT1VTXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gZnJvbUNvbnN0Lk5BVklHQVRFX1RPX1BBR0UpIHtcbiAgICAgICAgICB0aGlzLnJlbmRpdGlvbi5kaXNwbGF5KGV2ZW50LmRhdGEpO1xuICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuTkFWSUdBVEVfVE9fUEFHRSxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgaW50ZXJhY3Rpb246IGZyb21Db25zdC5OQVZJR0FURV9UT19QQUdFXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gZnJvbUNvbnN0LklOVkFMSURfUEFHRV9FUlJPUikge1xuICAgICAgICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiBmcm9tQ29uc3QuSU5WQUxJRF9QQUdFX0VSUk9SLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbjogZnJvbUNvbnN0LklOVkFMSURfUEFHRV9FUlJPUlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzYXZlQ3VycmVudExvY2F0aW9uKCkge1xuICAgIGNvbnN0IGN1cnJlbnRMb2NhdGlvbiA9IHRoaXMucmVuZGl0aW9uLmN1cnJlbnRMb2NhdGlvbigpO1xuICAgIGlmIChjdXJyZW50TG9jYXRpb24/LnN0YXJ0Py5jZmkpIHtcbiAgICAgIC8vIEdldCB0aGUgUGVyY2VudGFnZSAob3IgbG9jYXRpb24pIGZyb20gdGhhdCBDRklcbiAgICAgIGNvbnN0IGN1cnJlbnRQYWdlTG9jYXRpb24gPSB0aGlzLmVCb29rLmxvY2F0aW9ucy5wZXJjZW50YWdlRnJvbUNmaShjdXJyZW50TG9jYXRpb24uc3RhcnQuY2ZpKTtcbiAgICAgIHRoaXMudml3ZXJTZXJ2aWNlLm1ldGFEYXRhLmN1cnJlbnRMb2NhdGlvbiA9IGN1cnJlbnRQYWdlTG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgZW1pdEVuZEV2ZW50KCkge1xuICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICB0eXBlOiBmcm9tQ29uc3QuRU5ELFxuICAgICAgZGF0YToge1xuICAgICAgICBwZXJjZW50YWdlOiAxMDBcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVtaXRFcnJvckV2ZW50KCkge1xuICAgIHRoaXMudmlld2VyRXZlbnQuZW1pdCh7XG4gICAgICB0eXBlOiBmcm9tQ29uc3QuRVJST1IsXG4gICAgICBlcnJvckNvZGU6IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlsc1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5lQm9vaz8uZGVzdHJveSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmVuZGl0aW9uXCIgW2lkXT1cImlkRm9yUmVuZGl0aW9uXCIgI2VwdWJWaWV3ZXI+PC9kaXY+Il19