UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

165 lines 17.1 kB
import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./pdf-shy-button-service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "@angular/common"; export class PdfShyButtonComponent { pdfShyButtonServiceService; sanitizer; primaryToolbarId; secondaryMenuId; cssClass; eventBusName = undefined; l10nId; l10nLabel; title; toggled; disabled; order; action = undefined; closeOnClick = true; onlySecondaryMenu = false; _imageHtml; get imageHtml() { return this._imageHtml; } set image(value) { const svgTags = [ // 'a' is not allowed! 'animate', 'animateMotion', 'animateTransform', 'audio', 'canvas', 'circle', 'clipPath', 'defs', 'desc', 'discard', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'iframe', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tspan', 'unknown', 'use', 'video', 'view', ]; // only <svg> and SVG tags are allowed const tags = value.split('<').filter((tag) => tag.length > 0); const legal = tags.every((tag) => tag.startsWith('svg') || tag.startsWith('/') || svgTags.includes(tag.split(/\s|>/)[0])); if (!legal) { throw new Error('Illegal image for PDFShyButton. Only SVG images are allowed. Please use only the tags <svg> and <path>. ' + value); } this._imageHtml = this.sanitizeHtml(value); } constructor(pdfShyButtonServiceService, sanitizer) { this.pdfShyButtonServiceService = pdfShyButtonServiceService; this.sanitizer = sanitizer; } ngOnInit() { this.pdfShyButtonServiceService.add(this); } ngOnChanges(changes) { this.pdfShyButtonServiceService.update(this); } sanitizeHtml(html) { return this.sanitizer.bypassSecurityTrustHtml(html); // NOSONAR } onClick(htmlEvent) { if (this.action) { this.action(htmlEvent, false); htmlEvent.preventDefault(); } else if (this.eventBusName) { const PDFViewerApplication = window.PDFViewerApplication; PDFViewerApplication.eventBus.dispatch(this.eventBusName); htmlEvent.preventDefault(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PdfShyButtonComponent, deps: [{ token: i1.PdfShyButtonService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: PdfShyButtonComponent, selector: "pdf-shy-button", inputs: { primaryToolbarId: "primaryToolbarId", secondaryMenuId: "secondaryMenuId", cssClass: "cssClass", eventBusName: "eventBusName", l10nId: "l10nId", l10nLabel: "l10nLabel", title: "title", toggled: "toggled", disabled: "disabled", order: "order", action: "action", closeOnClick: "closeOnClick", onlySecondaryMenu: "onlySecondaryMenu", image: "image" }, usesOnChanges: true, ngImport: i0, template: "<button\n *ngIf=\"!onlySecondaryMenu\"\n type=\"button\"\n [id]=\"primaryToolbarId\"\n class=\"toolbarButton\"\n [class]=\"cssClass\"\n [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\"\n [class.toggled]=\"toggled\"\n [disabled]=\"disabled\"\n [innerHTML]=\"imageHtml\"\n (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\"\n role=\"button\"\n>\n <ng-content *ngIf=\"!image\" role=\"img\" aria-hidden=\"true\"></ng-content>\n <span [attr.data-l10n-id]=\"l10nLabel\">{{ title }}</span>\n</button>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PdfShyButtonComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-shy-button', template: "<button\n *ngIf=\"!onlySecondaryMenu\"\n type=\"button\"\n [id]=\"primaryToolbarId\"\n class=\"toolbarButton\"\n [class]=\"cssClass\"\n [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\"\n [class.toggled]=\"toggled\"\n [disabled]=\"disabled\"\n [innerHTML]=\"imageHtml\"\n (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\"\n role=\"button\"\n>\n <ng-content *ngIf=\"!image\" role=\"img\" aria-hidden=\"true\"></ng-content>\n <span [attr.data-l10n-id]=\"l10nLabel\">{{ title }}</span>\n</button>\n" }] }], ctorParameters: () => [{ type: i1.PdfShyButtonService }, { type: i2.DomSanitizer }], propDecorators: { primaryToolbarId: [{ type: Input }], secondaryMenuId: [{ type: Input }], cssClass: [{ type: Input }], eventBusName: [{ type: Input }], l10nId: [{ type: Input }], l10nLabel: [{ type: Input }], title: [{ type: Input }], toggled: [{ type: Input }], disabled: [{ type: Input }], order: [{ type: Input }], action: [{ type: Input }], closeOnClick: [{ type: Input }], onlySecondaryMenu: [{ type: Input }], image: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7Ozs7O0FBVXBFLE1BQU0sT0FBTyxxQkFBcUI7SUFpSVo7SUFBeUQ7SUEvSHRFLGdCQUFnQixDQUFTO0lBR3pCLGVBQWUsQ0FBUztJQUd4QixRQUFRLENBQXFCO0lBRzdCLFlBQVksR0FBdUIsU0FBUyxDQUFDO0lBRzdDLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUdsQixLQUFLLENBQVM7SUFHZCxPQUFPLENBQVU7SUFHakIsUUFBUSxDQUFVO0lBR2xCLEtBQUssQ0FBUztJQUdkLE1BQU0sR0FBMEUsU0FBUyxDQUFDO0lBRzFGLFlBQVksR0FBWSxJQUFJLENBQUM7SUFHN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBRWxDLFVBQVUsQ0FBVztJQUU3QixJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUNXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLE1BQU0sT0FBTyxHQUFHO1lBQ2Qsc0JBQXNCO1lBQ3RCLFNBQVM7WUFDVCxlQUFlO1lBQ2Ysa0JBQWtCO1lBQ2xCLE9BQU87WUFDUCxRQUFRO1lBQ1IsUUFBUTtZQUNSLFVBQVU7WUFDVixNQUFNO1lBQ04sTUFBTTtZQUNOLFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULGVBQWU7WUFDZixxQkFBcUI7WUFDckIsYUFBYTtZQUNiLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIsbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQixjQUFjO1lBQ2QsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIsU0FBUztZQUNULFNBQVM7WUFDVCxhQUFhO1lBQ2IsY0FBYztZQUNkLFVBQVU7WUFDVixjQUFjO1lBQ2Qsb0JBQW9CO1lBQ3BCLGFBQWE7WUFDYixRQUFRO1lBQ1IsY0FBYztZQUNkLFFBQVE7WUFDUixlQUFlO1lBQ2YsR0FBRztZQUNILFFBQVE7WUFDUixPQUFPO1lBQ1AsTUFBTTtZQUNOLGdCQUFnQjtZQUNoQixRQUFRO1lBQ1IsTUFBTTtZQUNOLFVBQVU7WUFDVixPQUFPO1lBQ1AsTUFBTTtZQUNOLFNBQVM7WUFDVCxTQUFTO1lBQ1QsVUFBVTtZQUNWLGdCQUFnQjtZQUNoQixNQUFNO1lBQ04sUUFBUTtZQUNSLEtBQUs7WUFDTCxNQUFNO1lBQ04sT0FBTztZQUNQLEtBQUs7WUFDTCxRQUFRO1lBQ1IsUUFBUTtZQUNSLE1BQU07WUFDTixVQUFVO1lBQ1YsT0FBTztZQUNQLE9BQU87WUFDUCxTQUFTO1lBQ1QsS0FBSztZQUNMLE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQztRQUVGLHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxSCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywwR0FBMEcsR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNySTtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFBb0IsMEJBQStDLEVBQVUsU0FBdUI7UUFBaEYsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUFxQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWM7SUFBRyxDQUFDO0lBRWpHLFFBQVE7UUFDYixJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBWTtRQUM3QixJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVO0lBQ2pFLENBQUM7SUFFTSxPQUFPLENBQUMsU0FBZ0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUIsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzVCO2FBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzVCLE1BQU0sb0JBQW9CLEdBQTJCLE1BQWMsQ0FBQyxvQkFBb0IsQ0FBQztZQUN6RixvQkFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRCxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDO3VHQXhKVSxxQkFBcUI7MkZBQXJCLHFCQUFxQixpYkNWbEMseWdCQWtCQTs7MkZEUmEscUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLGdCQUFnQjttSEFLbkIsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQVVLLEtBQUs7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBJUERGVmlld2VyQXBwbGljYXRpb24gfSBmcm9tICcuLi8uLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZUNTU0NsYXNzIH0gZnJvbSAnLi4vLi4vcmVzcG9uc2l2ZS12aXNpYmlsaXR5JztcbmltcG9ydCB7IFBkZlNoeUJ1dHRvblNlcnZpY2UgfSBmcm9tICcuL3BkZi1zaHktYnV0dG9uLXNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGYtc2h5LWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNoeUJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgcHVibGljIHByaW1hcnlUb29sYmFySWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2Vjb25kYXJ5TWVudUlkOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNzc0NsYXNzOiBSZXNwb25zaXZlQ1NTQ2xhc3M7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGV2ZW50QnVzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuSWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbDEwbkxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvZ2dsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmRlcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY3Rpb246ICgoaHRtbEV2ZW50PzogRXZlbnQsIGlzU2Vjb25kYXJ5TWVudWU/OiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY2xvc2VPbkNsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb25seVNlY29uZGFyeU1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9pbWFnZUh0bWw6IFNhZmVIdG1sO1xuXG4gIHB1YmxpYyBnZXQgaW1hZ2VIdG1sKCk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5faW1hZ2VIdG1sO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbWFnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ZnVGFncyA9IFtcbiAgICAgIC8vICdhJyBpcyBub3QgYWxsb3dlZCFcbiAgICAgICdhbmltYXRlJyxcbiAgICAgICdhbmltYXRlTW90aW9uJyxcbiAgICAgICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICAgICdhdWRpbycsXG4gICAgICAnY2FudmFzJyxcbiAgICAgICdjaXJjbGUnLFxuICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICdkZWZzJyxcbiAgICAgICdkZXNjJyxcbiAgICAgICdkaXNjYXJkJyxcbiAgICAgICdlbGxpcHNlJyxcbiAgICAgICdmZUJsZW5kJyxcbiAgICAgICdmZUNvbG9yTWF0cml4JyxcbiAgICAgICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICAgICdmZUNvbXBvc2l0ZScsXG4gICAgICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICAgICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAgICAgJ2ZlRGlzcGxhY2VtZW50TWFwJyxcbiAgICAgICdmZURpc3RhbnRMaWdodCcsXG4gICAgICAnZmVEcm9wU2hhZG93JyxcbiAgICAgICdmZUZsb29kJyxcbiAgICAgICdmZUZ1bmNBJyxcbiAgICAgICdmZUZ1bmNCJyxcbiAgICAgICdmZUZ1bmNHJyxcbiAgICAgICdmZUZ1bmNSJyxcbiAgICAgICdmZUdhdXNzaWFuQmx1cicsXG4gICAgICAnZmVJbWFnZScsXG4gICAgICAnZmVNZXJnZScsXG4gICAgICAnZmVNZXJnZU5vZGUnLFxuICAgICAgJ2ZlTW9ycGhvbG9neScsXG4gICAgICAnZmVPZmZzZXQnLFxuICAgICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgICAnZmVTcGVjdWxhckxpZ2h0aW5nJyxcbiAgICAgICdmZVNwb3RMaWdodCcsXG4gICAgICAnZmVUaWxlJyxcbiAgICAgICdmZVR1cmJ1bGVuY2UnLFxuICAgICAgJ2ZpbHRlcicsXG4gICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAnZycsXG4gICAgICAnaWZyYW1lJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnbGluZScsXG4gICAgICAnbGluZWFyR3JhZGllbnQnLFxuICAgICAgJ21hcmtlcicsXG4gICAgICAnbWFzaycsXG4gICAgICAnbWV0YWRhdGEnLFxuICAgICAgJ21wYXRoJyxcbiAgICAgICdwYXRoJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwb2x5Z29uJyxcbiAgICAgICdwb2x5bGluZScsXG4gICAgICAncmFkaWFsR3JhZGllbnQnLFxuICAgICAgJ3JlY3QnLFxuICAgICAgJ3NjcmlwdCcsXG4gICAgICAnc2V0JyxcbiAgICAgICdzdG9wJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3ZnJyxcbiAgICAgICdzd2l0Y2gnLFxuICAgICAgJ3N5bWJvbCcsXG4gICAgICAndGV4dCcsXG4gICAgICAndGV4dFBhdGgnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0c3BhbicsXG4gICAgICAndW5rbm93bicsXG4gICAgICAndXNlJyxcbiAgICAgICd2aWRlbycsXG4gICAgICAndmlldycsXG4gICAgXTtcblxuICAgIC8vIG9ubHkgPHN2Zz4gYW5kIFNWRyB0YWdzIGFyZSBhbGxvd2VkXG4gICAgY29uc3QgdGFncyA9IHZhbHVlLnNwbGl0KCc8JykuZmlsdGVyKCh0YWcpID0+IHRhZy5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBsZWdhbCA9IHRhZ3MuZXZlcnkoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgoJ3N2ZycpIHx8IHRhZy5zdGFydHNXaXRoKCcvJykgfHwgc3ZnVGFncy5pbmNsdWRlcyh0YWcuc3BsaXQoL1xcc3w+LylbMF0pKTtcbiAgICBpZiAoIWxlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgaW1hZ2UgZm9yIFBERlNoeUJ1dHRvbi4gT25seSBTVkcgaW1hZ2VzIGFyZSBhbGxvd2VkLiBQbGVhc2UgdXNlIG9ubHkgdGhlIHRhZ3MgPHN2Zz4gYW5kIDxwYXRoPi4gJyArIHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VIdG1sID0gdGhpcy5zYW5pdGl6ZUh0bWwodmFsdWUpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZTogUGRmU2h5QnV0dG9uU2VydmljZSwgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS5hZGQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wZGZTaHlCdXR0b25TZXJ2aWNlU2VydmljZS51cGRhdGUodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplSHRtbChodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpOyAvLyBOT1NPTkFSXG4gIH1cblxuICBwdWJsaWMgb25DbGljayhodG1sRXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICB0aGlzLmFjdGlvbihodG1sRXZlbnQsIGZhbHNlKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudEJ1c05hbWUpIHtcbiAgICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSAod2luZG93IGFzIGFueSkuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgICBQREZWaWV3ZXJBcHBsaWNhdGlvbi5ldmVudEJ1cy5kaXNwYXRjaCh0aGlzLmV2ZW50QnVzTmFtZSk7XG4gICAgICBodG1sRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxidXR0b25cbiAgKm5nSWY9XCIhb25seVNlY29uZGFyeU1lbnVcIlxuICB0eXBlPVwiYnV0dG9uXCJcbiAgW2lkXT1cInByaW1hcnlUb29sYmFySWRcIlxuICBjbGFzcz1cInRvb2xiYXJCdXR0b25cIlxuICBbY2xhc3NdPVwiY3NzQ2xhc3NcIlxuICBbdGl0bGVdPVwidGl0bGVcIlxuICBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbklkXCJcbiAgW2NsYXNzLnRvZ2dsZWRdPVwidG9nZ2xlZFwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtpbm5lckhUTUxdPVwiaW1hZ2VIdG1sXCJcbiAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwidGl0bGVcIlxuICByb2xlPVwiYnV0dG9uXCJcbj5cbiAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhaW1hZ2VcIiByb2xlPVwiaW1nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9uZy1jb250ZW50PlxuICA8c3BhbiBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbkxhYmVsXCI+e3sgdGl0bGUgfX08L3NwYW4+XG48L2J1dHRvbj5cbiJdfQ==