UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

155 lines 14.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild } from '@angular/core'; import { ViewerAnchorDirective } from './viewer-anchor.directive'; import { DocumentViewerService } from './document-viewer.service'; import { ViewerFactoryService } from '../viewers/viewer-factory.service'; import { UrlFixerService } from '../data/url-fixer.service'; import { EmLoggerService } from '../logging/em-logger.service'; import { AnnotationStoreService } from '../data/annotation-store.service'; export class DocumentViewerComponent { /** * @param {?} log * @param {?} viewerFactoryService * @param {?} annotationStoreService * @param {?} urlFixer * @param {?} documentViewerService */ constructor(log, viewerFactoryService, annotationStoreService, urlFixer, documentViewerService) { this.log = log; this.viewerFactoryService = viewerFactoryService; this.annotationStoreService = annotationStoreService; this.urlFixer = urlFixer; this.documentViewerService = documentViewerService; this.url = ''; this.rotate = false; log.setClass('DocumentViewerComponent'); } /** * @return {?} */ ngOnInit() { } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.url || changes.annotate) { this.buildViewer(); } } /** * @return {?} */ buildViewer() { if (!this.url) { this.log.error('url is required argument'); throw new Error('url is required argument'); } if (this.isDM) { this.documentViewerService.getDocumentMetadata(`${this.urlFixer.fixDm(this.url, this.baseUrl)}`).subscribe(metadata => { this.log.info(metadata); if (metadata && metadata._links) { /** @type {?} */ const url = this.urlFixer.fixDm(metadata._links.binary.href, this.baseUrl); /** @type {?} */ const dmDocumentId = this.viewerFactoryService.getDocumentId(metadata); if (this.annotate) { this.annotationStoreService.getAnnotationSet(this.baseUrl, dmDocumentId).subscribe(annotationSet => { this.buildComponent(metadata, url, annotationSet.body); }); } else { this.buildComponent(metadata, url, null); } } }, err => { this.log.error('An error has occured while fetching document' + err); this.error = err; }); } else { this.viewerComponent = this.viewerFactoryService.buildComponent(this.viewerAnchor.viewContainerRef, this.contentType, this.url, this.baseUrl, this.url, this.annotate, null, this.rotate); } } /** * @param {?} metadata * @param {?} url * @param {?=} annotationSet * @return {?} */ buildComponent(metadata, url, annotationSet) { this.viewerFactoryService.buildComponent(this.viewerAnchor.viewContainerRef, metadata.mimeType, url, this.baseUrl, metadata._links.self.href, this.annotate, annotationSet, this.rotate); } } DocumentViewerComponent.decorators = [ { type: Component, args: [{ selector: 'app-document-viewer', template: "\n<ng-template appViewerAnchor></ng-template>\n\n<div class=\"grid-row\">\n <div *ngIf=\"error\" class=\"error-summary\" role=\"alert\" aria-labelledby=\"error-summary-heading-example-1\" tabindex=\"-1\">\n <h2 class=\"heading-medium error-summary-heading\" id=\"error-summary-heading-example-1\">There was an error while loading your document.</h2>\n <p>Response status was {{error.status}}.</p>\n </div>\n</div>\n\n" }] } ]; DocumentViewerComponent.ctorParameters = () => [ { type: EmLoggerService }, { type: ViewerFactoryService }, { type: AnnotationStoreService }, { type: UrlFixerService }, { type: DocumentViewerService } ]; DocumentViewerComponent.propDecorators = { viewerAnchor: [{ type: ViewChild, args: [ViewerAnchorDirective,] }], url: [{ type: Input }], annotate: [{ type: Input }], baseUrl: [{ type: Input }], isDM: [{ type: Input }], contentType: [{ type: Input }], rotate: [{ type: Input }] }; if (false) { /** @type {?} */ DocumentViewerComponent.prototype.viewerAnchor; /** @type {?} */ DocumentViewerComponent.prototype.url; /** @type {?} */ DocumentViewerComponent.prototype.annotate; /** @type {?} */ DocumentViewerComponent.prototype.baseUrl; /** @type {?} */ DocumentViewerComponent.prototype.isDM; /** @type {?} */ DocumentViewerComponent.prototype.contentType; /** @type {?} */ DocumentViewerComponent.prototype.rotate; /** @type {?} */ DocumentViewerComponent.prototype.viewerComponent; /** @type {?} */ DocumentViewerComponent.prototype.error; /** * @type {?} * @private */ DocumentViewerComponent.prototype.log; /** * @type {?} * @private */ DocumentViewerComponent.prototype.viewerFactoryService; /** * @type {?} * @private */ DocumentViewerComponent.prototype.annotationStoreService; /** * @type {?} * @private */ DocumentViewerComponent.prototype.urlFixer; /** * @type {?} * @private */ DocumentViewerComponent.prototype.documentViewerService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kb2N1bWVudC12aWV3ZXIvZG9jdW1lbnQtdmlld2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1RixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBTXhFLE1BQU07Ozs7Ozs7O0lBYUYsWUFBb0IsR0FBb0IsRUFDcEIsb0JBQTBDLEVBQzFDLHNCQUE4QyxFQUM5QyxRQUF5QixFQUN6QixxQkFBNEM7UUFKNUMsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFkdkQsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUtULFdBQU0sR0FBRyxLQUFLLENBQUM7UUFVcEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7SUFFRCxRQUFRO0lBQ1IsQ0FBQzs7Ozs7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1AsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBRXBILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QixFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7OzBCQUMxQixHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7OzBCQUNwRSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7b0JBQ3RFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUNsQixJQUFJLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7NEJBQ2pHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3pELENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsOENBQThDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQ2hHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFGLENBQUM7SUFDTCxDQUFDOzs7Ozs7O0lBRUQsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsYUFBYztRQUMxQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQ3pFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoSCxDQUFDOzs7WUFuRUosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLHNiQUErQzthQUNsRDs7O1lBTlEsZUFBZTtZQUZmLG9CQUFvQjtZQUdyQixzQkFBc0I7WUFGckIsZUFBZTtZQUZoQixxQkFBcUI7OzsyQkFZeEIsU0FBUyxTQUFDLHFCQUFxQjtrQkFDL0IsS0FBSzt1QkFDTCxLQUFLO3NCQUNMLEtBQUs7bUJBQ0wsS0FBSzswQkFDTCxLQUFLO3FCQUNMLEtBQUs7Ozs7SUFOTiwrQ0FBc0U7O0lBQ3RFLHNDQUFrQjs7SUFDbEIsMkNBQTJCOztJQUMzQiwwQ0FBeUI7O0lBQ3pCLHVDQUF1Qjs7SUFDdkIsOENBQTZCOztJQUM3Qix5Q0FBd0I7O0lBRXhCLGtEQUFxQjs7SUFDckIsd0NBQXlCOzs7OztJQUViLHNDQUE0Qjs7Ozs7SUFDNUIsdURBQWtEOzs7OztJQUNsRCx5REFBc0Q7Ozs7O0lBQ3RELDJDQUFpQzs7Ozs7SUFDakMsd0RBQW9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtWaWV3ZXJBbmNob3JEaXJlY3RpdmV9IGZyb20gJy4vdmlld2VyLWFuY2hvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHtEb2N1bWVudFZpZXdlclNlcnZpY2V9IGZyb20gJy4vZG9jdW1lbnQtdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi92aWV3ZXJzL3ZpZXdlci1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXJsRml4ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0YS91cmwtZml4ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7QW5ub3RhdGlvblN0b3JlU2VydmljZX0gZnJvbSAnLi4vZGF0YS9hbm5vdGF0aW9uLXN0b3JlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1kb2N1bWVudC12aWV3ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kb2N1bWVudC12aWV3ZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERvY3VtZW50Vmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuXG4gICAgQFZpZXdDaGlsZChWaWV3ZXJBbmNob3JEaXJlY3RpdmUpIHZpZXdlckFuY2hvcjogVmlld2VyQW5jaG9yRGlyZWN0aXZlO1xuICAgIEBJbnB1dCgpIHVybCA9ICcnO1xuICAgIEBJbnB1dCgpIGFubm90YXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZztcbiAgICBASW5wdXQoKSBpc0RNOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcm90YXRlID0gZmFsc2U7XG5cbiAgICB2aWV3ZXJDb21wb25lbnQ6IGFueTtcbiAgICBlcnJvcjogSHR0cEVycm9yUmVzcG9uc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZzogRW1Mb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgdmlld2VyRmFjdG9yeVNlcnZpY2U6IFZpZXdlckZhY3RvcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHVybEZpeGVyOiBVcmxGaXhlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkb2N1bWVudFZpZXdlclNlcnZpY2U6IERvY3VtZW50Vmlld2VyU2VydmljZSkge1xuICAgICAgICBsb2cuc2V0Q2xhc3MoJ0RvY3VtZW50Vmlld2VyQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy51cmwgfHwgY2hhbmdlcy5hbm5vdGF0ZSkge1xuICAgICAgICAgIHRoaXMuYnVpbGRWaWV3ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkVmlld2VyKCkge1xuICAgICAgICBpZiAoIXRoaXMudXJsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcigndXJsIGlzIHJlcXVpcmVkIGFyZ3VtZW50Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VybCBpcyByZXF1aXJlZCBhcmd1bWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRE0pIHtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50Vmlld2VyU2VydmljZS5nZXREb2N1bWVudE1ldGFkYXRhKGAke3RoaXMudXJsRml4ZXIuZml4RG0odGhpcy51cmwsIHRoaXMuYmFzZVVybCl9YCkuc3Vic2NyaWJlKG1ldGFkYXRhID0+IHtcblxuICAgICAgICAgICAgdGhpcy5sb2cuaW5mbyhtZXRhZGF0YSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEuX2xpbmtzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMudXJsRml4ZXIuZml4RG0obWV0YWRhdGEuX2xpbmtzLmJpbmFyeS5ocmVmLCB0aGlzLmJhc2VVcmwpO1xuICAgICAgICAgICAgICBjb25zdCBkbURvY3VtZW50SWQgPSB0aGlzLnZpZXdlckZhY3RvcnlTZXJ2aWNlLmdldERvY3VtZW50SWQobWV0YWRhdGEpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5hbm5vdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5nZXRBbm5vdGF0aW9uU2V0KHRoaXMuYmFzZVVybCwgZG1Eb2N1bWVudElkKS5zdWJzY3JpYmUoYW5ub3RhdGlvblNldCA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50KG1ldGFkYXRhLCB1cmwsIGFubm90YXRpb25TZXQuYm9keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudChtZXRhZGF0YSwgdXJsLCBudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcignQW4gZXJyb3IgaGFzIG9jY3VyZWQgd2hpbGUgZmV0Y2hpbmcgZG9jdW1lbnQnICsgZXJyKTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aWV3ZXJDb21wb25lbnQgPSB0aGlzLnZpZXdlckZhY3RvcnlTZXJ2aWNlLmJ1aWxkQ29tcG9uZW50KHRoaXMudmlld2VyQW5jaG9yLnZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlLCB0aGlzLnVybCwgdGhpcy5iYXNlVXJsLCB0aGlzLnVybCwgdGhpcy5hbm5vdGF0ZSwgbnVsbCwgdGhpcy5yb3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRDb21wb25lbnQobWV0YWRhdGEsIHVybCwgYW5ub3RhdGlvblNldD8pIHtcbiAgICAgIHRoaXMudmlld2VyRmFjdG9yeVNlcnZpY2UuYnVpbGRDb21wb25lbnQodGhpcy52aWV3ZXJBbmNob3Iudmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgbWV0YWRhdGEubWltZVR5cGUsIHVybCwgdGhpcy5iYXNlVXJsLCBtZXRhZGF0YS5fbGlua3Muc2VsZi5ocmVmLCB0aGlzLmFubm90YXRlLCBhbm5vdGF0aW9uU2V0LCB0aGlzLnJvdGF0ZSk7XG4gICAgfVxuXG59XG4iXX0=