UNPKG

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

508 lines 44.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/services/viewer.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __awaiter, __generator } from "tslib"; import { HttpClient } from '@angular/common/http'; import { EventEmitter, Injectable, Optional } from '@angular/core'; import { SunbirdVideoPlayerService } from '../sunbird-video-player.service'; import { UtilService } from './util.service'; import { errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9'; import { QuestionCursor } from '@project-sunbird/sunbird-quml-player-v9'; import { of } from 'rxjs'; import { map } from 'rxjs/operators'; import * as _ from 'lodash-es'; import * as i0 from "@angular/core"; import * as i1 from "../sunbird-video-player.service"; import * as i2 from "./util.service"; import * as i3 from "@angular/common/http"; import * as i4 from "@project-sunbird/sunbird-quml-player-v9"; var ViewerService = /** @class */ (function () { function ViewerService(videoPlayerService, utilService, http, questionCursor) { this.videoPlayerService = videoPlayerService; this.utilService = utilService; this.http = http; this.questionCursor = questionCursor; this.endPageSeen = false; this.timeSpent = '0:0'; this.version = '1.0'; this.playerEvent = new EventEmitter(); this.sidebarMenuEvent = new EventEmitter(); this.isAvailableLocally = false; this.interceptionResponses = {}; this.showScore = false; this.scoreObtained = 0; this.contentMap = {}; this.isEndEventRaised = false; this.PlayerLoadStartedAt = new Date().getTime(); } /** * @param {?} __0 * @return {?} */ ViewerService.prototype.initialize = /** * @param {?} __0 * @return {?} */ function (_a) { var context = _a.context, config = _a.config, metadata = _a.metadata; this.contentName = metadata.name; this.isAvailableLocally = metadata.isAvailableLocally; this.streamingUrl = metadata.streamingUrl; this.artifactUrl = metadata.artifactUrl; this.mimeType = metadata.streamingUrl ? 'application/x-mpegURL' : metadata.mimeType; this.artifactMimeType = metadata.mimeType; this.isAvailableLocally = metadata.isAvailableLocally; this.traceId = config.traceId; this.interceptionPoints = metadata.interceptionPoints; if (context.userData) { var _b = context.userData, firstName = _b.firstName, lastName = _b.lastName; this.userName = firstName === lastName ? firstName : firstName + " " + lastName; } this.metaData = { actions: [], volume: [], playBackSpeeds: [], totalDuration: 0, muted: undefined, currentDuration: undefined, transcripts: [] }; this.transcripts = metadata.transcripts ? metadata.transcripts : []; this.showDownloadPopup = false; this.endPageSeen = false; if (this.isAvailableLocally) { /** @type {?} */ var basePath = (metadata.streamingUrl) ? (metadata.streamingUrl) : (metadata.basePath || metadata.baseDir); this.streamingUrl = basePath + "/" + metadata.artifactUrl; this.mimeType = metadata.mimeType; } }; /** * @param {?} selectedTranscripts * @return {?} */ ViewerService.prototype.handleTranscriptsData = /** * @param {?} selectedTranscripts * @return {?} */ function (selectedTranscripts) { var _this = this; this.metaData.transcripts = selectedTranscripts; if (!_.isArray(this.transcripts)) { this.raiseExceptionLog('INVALID_TRANSCRIPT_DATATYPE', 'TRANSCRIPT', new Error('Transcript data should be array'), this.traceId); return []; } else { _.forEach(this.transcripts, (/** * @param {?} value * @return {?} */ function (value) { if (!(_.some(_this.transcripts, { language: value.language, artifactUrl: value.artifactUrl, languageCode: value.languageCode, identifier: value.identifier }))) { _this.raiseExceptionLog('TRANSCRIPT_DATA_MISSING', 'TRANSCRIPT', new Error('Transcript object dose not have required fields'), _this.traceId); return []; } else if (!_.isEmpty(selectedTranscripts) && (_.last(selectedTranscripts) !== 'off' && _.last(selectedTranscripts) === value.languageCode)) { value.default = true; } })); } return this.transcripts; }; /** * @return {?} */ ViewerService.prototype.getPlayerOptions = /** * @return {?} */ function () { return __awaiter(this, void 0, void 0, function () { var data; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!!this.streamingUrl) return [3 /*break*/, 1]; return [2 /*return*/, [{ src: this.artifactUrl, type: this.artifactMimeType }]]; case 1: return [4 /*yield*/, this.http.head(this.streamingUrl, { responseType: 'blob' }).toPromise().catch((/** * @param {?} error * @return {?} */ function (error) { // tslint:disable-next-line:max-line-length _this.raiseExceptionLog(errorCode.streamingUrlSupport, errorMessage.streamingUrlSupport, new Error("Streaming Url Not Supported " + _this.streamingUrl), _this.traceId); }))]; case 2: data = _a.sent(); if (data) { return [2 /*return*/, [{ src: this.streamingUrl, type: this.mimeType }]]; } else { return [2 /*return*/, [{ src: this.artifactUrl, type: this.artifactMimeType }]]; } _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; /** * @return {?} */ ViewerService.prototype.getMarkers = /** * @return {?} */ function () { var _a, _b; if ((_b = (_a = this) === null || _a === void 0 ? void 0 : _a.interceptionPoints) === null || _b === void 0 ? void 0 : _b.items) { try { /** @type {?} */ var interceptionPoints = this.interceptionPoints; this.showScore = true; return interceptionPoints.items.map((/** * @param {?} __0 * @return {?} */ function (_a) { var interceptionPoint = _a.interceptionPoint, identifier = _a.identifier, type = _a.type; return { time: interceptionPoint, type: type, identifier: identifier, duration: 3 }; })); } catch (error) { console.log(error); this.raiseExceptionLog('CPV2_CONT_INTERCEPTION_PARSE', 'error parsing the inteception points string', error, ''); this.showScore = false; } } return null; }; /** * @param {?} identifier * @return {?} */ ViewerService.prototype.getQuestionSet = /** * @param {?} identifier * @return {?} */ function (identifier) { var _this = this; /** @type {?} */ var content = this.contentMap[identifier]; if (!content) { if (!this.questionCursor) { return null; } else { return this.questionCursor.getQuestionSet(identifier) .pipe(map((/** * @param {?} response * @return {?} */ function (response) { _this.contentMap[identifier] = response.questionSet; return _this.contentMap[identifier]; }))); } } else { return of(content); } }; /** * @return {?} */ ViewerService.prototype.preFetchContent = /** * @return {?} */ function () { /** @type {?} */ var nextMarker = this.getNextMarker(); if (nextMarker) { /** @type {?} */ var identifier = nextMarker.identifier; this.getQuestionSet(nextMarker.identifier); } }; /** * @return {?} */ ViewerService.prototype.getNextMarker = /** * @return {?} */ function () { /** @type {?} */ var currentTime = this.playerInstance.currentTime(); /** @type {?} */ var markersList = this.getMarkers(); if (!markersList) { return null; } return markersList.find((/** * @param {?} marker * @return {?} */ function (marker) { /** @type {?} */ var markerTime = marker.time; return markerTime > currentTime; })); }; /** * @param {?} event * @return {?} */ ViewerService.prototype.raiseStartEvent = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var duration = new Date().getTime() - this.PlayerLoadStartedAt; /** @type {?} */ var startEvent = { eid: 'START', ver: this.version, edata: { type: 'START', mode: 'play', duration: duration }, metaData: this.metaData }; this.playerEvent.emit(startEvent); this.videoPlayerService.start(duration); this.PlayerLoadStartedAt = new Date().getTime(); }; /** * @return {?} */ ViewerService.prototype.calculateScore = /** * @return {?} */ function () { this.scoreObtained = Object.values(this.interceptionResponses).reduce(( // tslint:disable-next-line:no-string-literal // tslint:disable-next-line:no-string-literal /** * @param {?} acc * @param {?} response * @return {?} */ function (acc, response) { return acc + response['score']; }), 0); }; /** * @return {?} */ ViewerService.prototype.raiseEndEvent = /** * @return {?} */ function () { if (!this.isEndEventRaised) { this.calculateScore(); /** @type {?} */ var duration = new Date().getTime() - this.PlayerLoadStartedAt; /** @type {?} */ var endEvent = { eid: 'END', ver: this.version, edata: { type: 'END', currentTime: this.currentlength, totalTime: this.totalLength, duration: duration }, metaData: this.metaData }; this.playerEvent.emit(endEvent); this.timeSpent = this.utilService.getTimeSpentText(this.visitedLength); this.videoPlayerService.end(duration, this.totalLength, this.currentlength, this.endPageSeen, this.totalSeekedLength, this.visitedLength / 1000, this.scoreObtained); this.isEndEventRaised = true; } }; /** * @param {?} type * @param {?=} extraValues * @return {?} */ ViewerService.prototype.raiseHeartBeatEvent = /** * @param {?} type * @param {?=} extraValues * @return {?} */ function (type, extraValues) { if (type === 'REPLAY') { this.interceptionResponses = {}; this.showScore = false; this.scoreObtained = 0; } /** @type {?} */ var hearBeatEvent = { eid: 'HEARTBEAT', ver: this.version, edata: { type: type, currentPage: 'videostage', extra: extraValues }, metaData: this.metaData }; this.playerEvent.emit(hearBeatEvent); this.videoPlayerService.heartBeat(hearBeatEvent); /** @type {?} */ var interactItems = ['PLAY', 'PAUSE', 'EXIT', 'VOLUME_CHANGE', 'DRAG', 'RATE_CHANGE', 'CLOSE_DOWNLOAD', 'DOWNLOAD', 'NAVIGATE_TO_PAGE', 'NEXT', 'OPEN_MENU', 'PREVIOUS', 'CLOSE_MENU', 'DOWNLOAD_MENU', 'DOWNLOAD_POPUP_CLOSE', 'DOWNLOAD_POPUP_CANCEL', 'SHARE', 'REPLAY', 'FORWARD', 'BACKWARD', 'FULLSCREEN', 'NEXT_CONTENT_PLAY', 'TRANSCRIPT_LANGUAGE_OFF', 'TRANSCRIPT_LANGUAGE_SELECTED', 'VIDEO_MARKER_SELECTED' ]; if (interactItems.includes(type)) { this.videoPlayerService.interact(type.toLowerCase(), 'videostage', extraValues); } }; /** * @param {?} pageId * @param {?=} cdata * @return {?} */ ViewerService.prototype.raiseImpressionEvent = /** * @param {?} pageId * @param {?=} cdata * @return {?} */ function (pageId, cdata) { if (cdata === void 0) { cdata = {}; } this.videoPlayerService.impression(pageId, cdata); }; // tslint:disable-next-line:no-shadowed-variable // tslint:disable-next-line:no-shadowed-variable /** * @param {?} errorCode * @param {?} errorType * @param {?} stacktrace * @param {?} traceId * @return {?} */ ViewerService.prototype.raiseExceptionLog = // tslint:disable-next-line:no-shadowed-variable /** * @param {?} errorCode * @param {?} errorType * @param {?} stacktrace * @param {?} traceId * @return {?} */ function (errorCode, errorType, stacktrace, traceId) { /** @type {?} */ var exceptionLogEvent = { eid: 'ERROR', edata: { err: errorCode, errtype: errorType, requestid: traceId || '', stacktrace: (stacktrace && stacktrace.toString()) || '', } }; this.playerEvent.emit(exceptionLogEvent); this.videoPlayerService.error(errorCode, errorType, stacktrace); }; ViewerService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ ViewerService.ctorParameters = function () { return [ { type: SunbirdVideoPlayerService }, { type: UtilService }, { type: HttpClient }, { type: QuestionCursor, decorators: [{ type: Optional }] } ]; }; /** @nocollapse */ ViewerService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ViewerService_Factory() { return new ViewerService(i0.ɵɵinject(i1.SunbirdVideoPlayerService), i0.ɵɵinject(i2.UtilService), i0.ɵɵinject(i3.HttpClient), i0.ɵɵinject(i4.QuestionCursor, 8)); }, token: ViewerService, providedIn: "root" }); return ViewerService; }()); export { ViewerService }; if (false) { /** @type {?} */ ViewerService.prototype.endPageSeen; /** @type {?} */ ViewerService.prototype.timeSpent; /** * @type {?} * @private */ ViewerService.prototype.version; /** @type {?} */ ViewerService.prototype.playerEvent; /** @type {?} */ ViewerService.prototype.contentName; /** @type {?} */ ViewerService.prototype.showDownloadPopup; /** @type {?} */ ViewerService.prototype.streamingUrl; /** @type {?} */ ViewerService.prototype.mimeType; /** @type {?} */ ViewerService.prototype.artifactMimeType; /** @type {?} */ ViewerService.prototype.userName; /** @type {?} */ ViewerService.prototype.metaData; /** @type {?} */ ViewerService.prototype.PlayerLoadStartedAt; /** @type {?} */ ViewerService.prototype.totalLength; /** @type {?} */ ViewerService.prototype.currentlength; /** @type {?} */ ViewerService.prototype.totalSeekedLength; /** @type {?} */ ViewerService.prototype.artifactUrl; /** @type {?} */ ViewerService.prototype.visitedLength; /** @type {?} */ ViewerService.prototype.sidebarMenuEvent; /** @type {?} */ ViewerService.prototype.traceId; /** @type {?} */ ViewerService.prototype.isAvailableLocally; /** @type {?} */ ViewerService.prototype.interceptionPoints; /** @type {?} */ ViewerService.prototype.interceptionResponses; /** @type {?} */ ViewerService.prototype.showScore; /** @type {?} */ ViewerService.prototype.scoreObtained; /** @type {?} */ ViewerService.prototype.maxScore; /** @type {?} */ ViewerService.prototype.playerInstance; /** @type {?} */ ViewerService.prototype.contentMap; /** @type {?} */ ViewerService.prototype.isEndEventRaised; /** @type {?} */ ViewerService.prototype.transcripts; /** * @type {?} * @private */ ViewerService.prototype.videoPlayerService; /** * @type {?} * @private */ ViewerService.prototype.utilService; /** * @type {?} * @private */ ViewerService.prototype.http; /** @type {?} */ ViewerService.prototype.questionCursor; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kaWN0cmlneW4tdmlkZW8tcGxheWVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUcsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7QUFFL0I7SUFrQ0UsdUJBQW9CLGtCQUE2QyxFQUM3QyxXQUF3QixFQUN4QixJQUFnQixFQUNMLGNBQThCO1FBSHpDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMkI7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNMLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWhDdEQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQWN0QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FB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eEIsaUNBQXFCOztJQUNyQiw0Q0FBbUM7O0lBQ25DLG9DQUFtQjs7SUFDbkIsc0NBQXFCOztJQUNyQiwwQ0FBeUI7O0lBQ3pCLG9DQUFtQjs7SUFDbkIsc0NBQXFCOztJQUNyQix5Q0FBa0Q7O0lBQ2xELGdDQUF1Qjs7SUFDdkIsMkNBQWtDOztJQUNsQywyQ0FBK0I7O0lBQy9CLDhDQUF1Qzs7SUFDdkMsa0NBQXlCOztJQUN6QixzQ0FBOEI7O0lBQzlCLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixtQ0FBdUI7O0lBQ3ZCLHlDQUFnQzs7SUFDaEMsb0NBQWdDOzs7OztJQUNwQiwyQ0FBcUQ7Ozs7O0lBQ3JELG9DQUFnQzs7Ozs7SUFDaEMsNkJBQXdCOztJQUN4Qix1Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBsYXllckNvbmZpZywgVHJhbnNjcmlwdHMgfSBmcm9tICcuLi9wbGF5ZXJJbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4uL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vdXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZXJyb3JDb2RlICwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQGRpY2Rpa3NoYW9yZy9wbGF5ZXItc2RrLXY5JztcclxuaW1wb3J0IHsgUXVlc3Rpb25DdXJzb3IgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcXVtbC1wbGF5ZXItdjknO1xyXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZXdlclNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgZW5kUGFnZVNlZW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdGltZVNwZW50ID0gJzA6MCc7XHJcbiAgcHJpdmF0ZSB2ZXJzaW9uID0gJzEuMCc7XHJcbiAgcHVibGljIHBsYXllckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgcHVibGljIGNvbnRlbnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIHNob3dEb3dubG9hZFBvcHVwOiBib29sZWFuO1xyXG4gIHB1YmxpYyBzdHJlYW1pbmdVcmw6IHN0cmluZztcclxuICBwdWJsaWMgbWltZVR5cGU6IHN0cmluZztcclxuICBwdWJsaWMgYXJ0aWZhY3RNaW1lVHlwZTogc3RyaW5nO1xyXG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBtZXRhRGF0YTogYW55O1xyXG4gIHB1YmxpYyBQbGF5ZXJMb2FkU3RhcnRlZEF0OiBudW1iZXI7XHJcbiAgcHVibGljIHRvdGFsTGVuZ3RoO1xyXG4gIHB1YmxpYyBjdXJyZW50bGVuZ3RoO1xyXG4gIHB1YmxpYyB0b3RhbFNlZWtlZExlbmd0aDtcclxuICBwdWJsaWMgYXJ0aWZhY3RVcmw7XHJcbiAgcHVibGljIHZpc2l0ZWRMZW5ndGg7XHJcbiAgcHVibGljIHNpZGViYXJNZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xyXG4gIHB1YmxpYyBpc0F2YWlsYWJsZUxvY2FsbHkgPSBmYWxzZTtcclxuICBwdWJsaWMgaW50ZXJjZXB0aW9uUG9pbnRzOiBhbnk7XHJcbiAgcHVibGljIGludGVyY2VwdGlvblJlc3BvbnNlczogYW55ID0ge307XHJcbiAgcHVibGljIHNob3dTY29yZSA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzY29yZU9idGFpbmVkOiBhbnkgPSAwO1xyXG4gIHB1YmxpYyBtYXhTY29yZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBwbGF5ZXJJbnN0YW5jZTogYW55O1xyXG4gIHB1YmxpYyBjb250ZW50TWFwID0ge307XHJcbiAgcHVibGljIGlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgdHJhbnNjcmlwdHM6IFRyYW5zY3JpcHRzO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcXVlc3Rpb25DdXJzb3I6IFF1ZXN0aW9uQ3Vyc29yKSB7XHJcbiAgICB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemUoeyBjb250ZXh0LCBjb25maWcsIG1ldGFkYXRhIH06IFBsYXllckNvbmZpZykge1xyXG4gICAgdGhpcy5jb250ZW50TmFtZSA9IG1ldGFkYXRhLm5hbWU7XHJcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcclxuICAgIHRoaXMuc3RyZWFtaW5nVXJsID0gbWV0YWRhdGEuc3RyZWFtaW5nVXJsO1xyXG4gICAgdGhpcy5hcnRpZmFjdFVybCA9IG1ldGFkYXRhLmFydGlmYWN0VXJsO1xyXG4gICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybCA/ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnIDogbWV0YWRhdGEubWltZVR5cGU7XHJcbiAgICB0aGlzLmFydGlmYWN0TWltZVR5cGUgPSBtZXRhZGF0YS5taW1lVHlwZTtcclxuICAgIHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5ID0gbWV0YWRhdGEuaXNBdmFpbGFibGVMb2NhbGx5O1xyXG4gICAgdGhpcy50cmFjZUlkID0gY29uZmlnLnRyYWNlSWQ7XHJcbiAgICB0aGlzLmludGVyY2VwdGlvblBvaW50cyA9IG1ldGFkYXRhLmludGVyY2VwdGlvblBvaW50cztcclxuICAgIGlmIChjb250ZXh0LnVzZXJEYXRhKSB7XHJcbiAgICAgIGNvbnN0IHsgdXNlckRhdGE6IHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9IH0gPSBjb250ZXh0O1xyXG4gICAgICB0aGlzLnVzZXJOYW1lID0gZmlyc3ROYW1lID09PSBsYXN0TmFtZSA/IGZpcnN0TmFtZSA6IGAke2ZpcnN0TmFtZX0gJHtsYXN0TmFtZX1gO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tZXRhRGF0YSA9IHtcclxuICAgICAgYWN0aW9uczogW1xyXG4gICAgICBdLFxyXG4gICAgICB2b2x1bWU6IFtdLFxyXG4gICAgICBwbGF5QmFja1NwZWVkczogW10sXHJcbiAgICAgIHRvdGFsRHVyYXRpb246IDAsXHJcbiAgICAgIG11dGVkOiB1bmRlZmluZWQsXHJcbiAgICAgIGN1cnJlbnREdXJhdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICB0cmFuc2NyaXB0czogW11cclxuICAgIH07XHJcbiAgICB0aGlzLnRyYW5zY3JpcHRzID0gbWV0YWRhdGEudHJhbnNjcmlwdHMgPyBtZXRhZGF0YS50cmFuc2NyaXB0cyA6IFtdO1xyXG4gICAgdGhpcy5zaG93RG93bmxvYWRQb3B1cCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbmRQYWdlU2VlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5KSB7XHJcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gKG1ldGFkYXRhLnN0cmVhbWluZ1VybCkgPyAobWV0YWRhdGEuc3RyZWFtaW5nVXJsKSA6IChtZXRhZGF0YS5iYXNlUGF0aCB8fCBtZXRhZGF0YS5iYXNlRGlyKTtcclxuICAgICAgdGhpcy5zdHJlYW1pbmdVcmwgPSBgJHtiYXNlUGF0aH0vJHttZXRhZGF0YS5hcnRpZmFjdFVybH1gO1xyXG4gICAgICB0aGlzLm1pbWVUeXBlID0gbWV0YWRhdGEubWltZVR5cGU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZVRyYW5zY3JpcHRzRGF0YShzZWxlY3RlZFRyYW5zY3JpcHRzKSB7XHJcbiAgICB0aGlzLm1ldGFEYXRhLnRyYW5zY3JpcHRzID0gc2VsZWN0ZWRUcmFuc2NyaXB0cztcclxuICAgIGlmICghXy5pc0FycmF5KHRoaXMudHJhbnNjcmlwdHMpKSB7XHJcbiAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coJ0lOVkFMSURfVFJBTlNDUklQVF9EQVRBVFlQRScsICdUUkFOU0NSSVBUJywgbmV3IEVycm9yKCdUcmFuc2NyaXB0IGRhdGEgc2hvdWxkIGJlIGFycmF5JyksIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudHJhbnNjcmlwdHMsICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghKF8uc29tZSh0aGlzLnRyYW5zY3JpcHRzLCB7IGxhbmd1YWdlOiB2YWx1ZS5sYW5ndWFnZSwgYXJ0aWZhY3RVcmw6IHZhbHVlLmFydGlmYWN0VXJsICxcclxuICAgICAgICAgIGxhbmd1YWdlQ29kZTogdmFsdWUubGFuZ3VhZ2VDb2RlLCBpZGVudGlmaWVyOiB2YWx1ZS5pZGVudGlmaWVyfSkpKSB7XHJcbiAgICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdUUkFOU0NSSVBUX0RBVEFfTUlTU0lORycsICdUUkFOU0NSSVBUJyxcclxuICAgICAgICAgICBuZXcgRXJyb3IoJ1RyYW5zY3JpcHQgb2JqZWN0IGRvc2Ugbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzJyksIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHNlbGVjdGVkVHJhbnNjcmlwdHMpICYmXHJcbiAgICAgICAgICAoIF8ubGFzdChzZWxlY3RlZFRyYW5zY3JpcHRzKSAhPT0gJ29mZicgJiYgIF8ubGFzdChzZWxlY3RlZFRyYW5zY3JpcHRzKSA9PT0gdmFsdWUubGFuZ3VhZ2VDb2RlKSkge1xyXG4gICAgICAgICAgdmFsdWUuZGVmYXVsdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRyYW5zY3JpcHRzO1xyXG4gIH1cclxuICBhc3luYyBnZXRQbGF5ZXJPcHRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLnN0cmVhbWluZ1VybCkge1xyXG4gICAgICByZXR1cm4gW3sgc3JjOiB0aGlzLmFydGlmYWN0VXJsLCB0eXBlOiB0aGlzLmFydGlmYWN0TWltZVR5cGUgfV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5odHRwLmhlYWQodGhpcy5zdHJlYW1pbmdVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5zdHJlYW1pbmdVcmxTdXBwb3J0ICwgZXJyb3JNZXNzYWdlLnN0cmVhbWluZ1VybFN1cHBvcnQgLCBuZXcgRXJyb3IoYFN0cmVhbWluZyBVcmwgTm90IFN1cHBvcnRlZCAgJHt0aGlzLnN0cmVhbWluZ1VybH1gKSwgdGhpcy50cmFjZUlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5zdHJlYW1pbmdVcmwsIHR5cGU6IHRoaXMubWltZVR5cGUgfV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5hcnRpZmFjdFVybCwgdHlwZTogdGhpcy5hcnRpZmFjdE1pbWVUeXBlIH1dO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNYXJrZXJzKCkgIHtcclxuICAgIGlmICh0aGlzPy5pbnRlcmNlcHRpb25Qb2ludHM/Lml0ZW1zKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0aW9uUG9pbnRzID0gdGhpcy5pbnRlcmNlcHRpb25Qb2ludHM7XHJcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRpb25Qb2ludHMuaXRlbXMubWFwKCh7aW50ZXJjZXB0aW9uUG9pbnQsIGlkZW50aWZpZXIsIHR5cGV9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgdGltZTogaW50ZXJjZXB0aW9uUG9pbnQsIHR5cGUsIGlkZW50aWZpZXIsIGR1cmF0aW9uOiAzIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coJ0NQVjJfQ09OVF9JTlRFUkNFUFRJT05fUEFSU0UnLCAnZXJyb3IgcGFyc2luZyB0aGUgaW50ZWNlcHRpb24gcG9pbnRzIHN0cmluZycsIGVycm9yLCAnJyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0UXVlc3Rpb25TZXQoaWRlbnRpZmllcikge1xyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudE1hcFtpZGVudGlmaWVyXTtcclxuICAgIGlmICghY29udGVudCkge1xyXG4gICAgICBpZiAoIXRoaXMucXVlc3Rpb25DdXJzb3IpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkN1cnNvci5nZXRRdWVzdGlvblNldChpZGVudGlmaWVyKVxyXG4gICAgIC5waXBlKG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRNYXBbaWRlbnRpZmllcl0gPSByZXNwb25zZS5xdWVzdGlvblNldDtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50TWFwW2lkZW50aWZpZXJdO1xyXG4gICAgICAgfSkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmVGZXRjaENvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBuZXh0TWFya2VyID0gdGhpcy5nZXROZXh0TWFya2VyKCk7XHJcbiAgICBpZiAobmV4dE1hcmtlcikge1xyXG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gbmV4dE1hcmtlci5pZGVudGlmaWVyO1xyXG4gICAgICB0aGlzLmdldFF1ZXN0aW9uU2V0KG5leHRNYXJrZXIuaWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROZXh0TWFya2VyKCkge1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKCk7XHJcbiAgICBjb25zdCBtYXJrZXJzTGlzdCA9IHRoaXMuZ2V0TWFya2VycygpO1xyXG4gICAgaWYgKCFtYXJrZXJzTGlzdCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgIHJldHVybiBtYXJrZXJzTGlzdC5maW5kKG1hcmtlciA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcmtlclRpbWUgPSBtYXJrZXIudGltZTtcclxuICAgICAgcmV0dXJuIG1hcmtlclRpbWUgPiBjdXJyZW50VGltZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmFpc2VTdGFydEV2ZW50KGV2ZW50KSB7XHJcbiAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xyXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHtcclxuICAgICAgZWlkOiAnU1RBUlQnLFxyXG4gICAgICB2ZXI6IHRoaXMudmVyc2lvbixcclxuICAgICAgZWRhdGE6IHtcclxuICAgICAgICB0eXBlOiAnU1RBUlQnLFxyXG4gICAgICAgIG1vZGU6ICdwbGF5JyxcclxuICAgICAgICBkdXJhdGlvblxyXG4gICAgICB9LFxyXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxyXG4gICAgfTtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChzdGFydEV2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLnN0YXJ0KGR1cmF0aW9uKTtcclxuICAgIHRoaXMuUGxheWVyTG9hZFN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlU2NvcmUoKSB7XHJcbiAgICB0aGlzLnNjb3JlT2J0YWluZWQgPSAgT2JqZWN0LnZhbHVlcyh0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcykucmVkdWNlKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcclxuICAgICAgKGFjYywgcmVzcG9uc2UpID0+IGFjYyArIHJlc3BvbnNlWydzY29yZSddICwgMCk7XHJcbiAgfVxyXG5cclxuICByYWlzZUVuZEV2ZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmlzRW5kRXZlbnRSYWlzZWQpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVTY29yZSgpO1xyXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xyXG4gICAgICBjb25zdCBlbmRFdmVudCA9IHtcclxuICAgICAgICBlaWQ6ICdFTkQnLFxyXG4gICAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxyXG4gICAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnRU5EJyxcclxuICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aGlzLmN1cnJlbnRsZW5ndGgsXHJcbiAgICAgICAgICB0b3RhbFRpbWU6IHRoaXMudG90YWxMZW5ndGgsXHJcbiAgICAgICAgICBkdXJhdGlvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWV0YURhdGE6IHRoaXMubWV0YURhdGFcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGVuZEV2ZW50KTtcclxuICAgICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnV0aWxTZXJ2aWNlLmdldFRpbWVTcGVudFRleHQodGhpcy52aXNpdGVkTGVuZ3RoKTtcclxuICAgICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuZW5kKFxyXG4gICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgIHRoaXMudG90YWxMZW5ndGgsXHJcbiAgICAgICAgdGhpcy5jdXJyZW50bGVuZ3RoLFxyXG4gICAgICAgIHRoaXMuZW5kUGFnZVNlZW4sXHJcbiAgICAgICAgdGhpcy50b3RhbFNlZWtlZExlbmd0aCxcclxuICAgICAgICB0aGlzLnZpc2l0ZWRMZW5ndGggLyAxMDAwLFxyXG4gICAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzRW5kRXZlbnRSYWlzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZTogc3RyaW5nLCBleHRyYVZhbHVlcz8pIHtcclxuICAgIGlmICh0eXBlID09PSAnUkVQTEFZJykge1xyXG4gICAgICB0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcyA9IHt9O1xyXG4gICAgICB0aGlzLnNob3dTY29yZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNjb3JlT2J0YWluZWQgPSAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhckJlYXRFdmVudCA9IHtcclxuICAgICAgZWlkOiAnSEVBUlRCRUFUJyxcclxuICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXHJcbiAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgdHlwZSxcclxuICAgICAgICBjdXJyZW50UGFnZTogJ3ZpZGVvc3RhZ2UnLFxyXG4gICAgICAgIGV4dHJhOiBleHRyYVZhbHVlc1xyXG4gICAgICB9LFxyXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxyXG4gICAgfTtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChoZWFyQmVhdEV2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmhlYXJ0QmVhdChoZWFyQmVhdEV2ZW50KTtcclxuICAgIGNvbnN0IGludGVyYWN0SXRlbXMgPSBbJ1BMQVknLCAnUEFVU0UnLCAnRVhJVCcsICdWT0xVTUVfQ0hBTkdFJywgJ0RSQUcnLFxyXG4gICAgICAnUkFURV9DSEFOR0UnLCAnQ0xPU0VfRE9XTkxPQUQnLCAnRE9XTkxPQUQnLCAnTkFWSUdBVEVfVE9fUEFHRScsXHJcbiAgICAgICdORVhUJywgJ09QRU5fTUVOVScsICdQUkVWSU9VUycsICdDTE9TRV9NRU5VJywgJ0RPV05MT0FEX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0xPU0UnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJyxcclxuICAgICAgJ1NIQVJFJywgJ1JFUExBWScsICdGT1JXQVJEJywgJ0JBQ0tXQVJEJywgJ0ZVTExTQ1JFRU4nLCAnTkVYVF9DT05URU5UX1BMQVknLCAnVFJBTlNDUklQVF9MQU5HVUFHRV9PRkYnLFxyXG4gICAgICAnVFJBTlNDUklQVF9MQU5HVUFHRV9TRUxFQ1RFRCcsICdWSURFT19NQVJLRVJfU0VMRUNURUQnXHJcbiAgICBdO1xyXG4gICAgaWYgKGludGVyYWN0SXRlbXMuaW5jbHVkZXModHlwZSkpIHtcclxuICAgICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuaW50ZXJhY3QodHlwZS50b0xvd2VyQ2FzZSgpLCAndmlkZW9zdGFnZScsIGV4dHJhVmFsdWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhaXNlSW1wcmVzc2lvbkV2ZW50KHBhZ2VJZDogc3RyaW5nLCBjZGF0YTogYW55ID0ge30pIHtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmltcHJlc3Npb24ocGFnZUlkLCBjZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICByYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGU6IHN0cmluZywgZXJyb3JUeXBlOiBzdHJpbmcsIHN0YWNrdHJhY2UsIHRyYWNlSWQpIHtcclxuICAgIGNvbnN0IGV4Y2VwdGlvbkxvZ0V2ZW50ID0ge1xyXG4gICAgICBlaWQ6ICdFUlJPUicsXHJcbiAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgZXJyOiBlcnJvckNvZGUsXHJcbiAgICAgICAgZXJydHlwZTogZXJyb3JUeXBlLFxyXG4gICAgICAgIHJlcXVlc3RpZDogdHJhY2VJZCB8fCAnJyxcclxuICAgICAgICBzdGFja3RyYWNlOiAoc3RhY2t0cmFjZSAmJiBzdGFja3RyYWNlLnRvU3RyaW5nKCkpIHx8ICcnLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV4Y2VwdGlvbkxvZ0V2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmVycm9yKGVycm9yQ29kZSAsIGVycm9yVHlwZSAsIHN0YWNrdHJhY2UpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19