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.

96 lines 19.5 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../pdf-toggle-sidebar/pdf-toggle-sidebar.component"; import * as i2 from "../pdf-find-button/pdf-find-button.component"; import * as i3 from "../pdf-paging-area/pdf-paging-area.component"; import * as i4 from "../pdf-zoom-toolbar/pdf-zoom-toolbar.component"; import * as i5 from "../pdf-hand-tool/pdf-hand-tool.component"; import * as i6 from "../pdf-select-tool/pdf-select-tool.component"; import * as i7 from "../pdf-rotate-page/pdf-rotate-page.component"; import * as i8 from "../pdf-presentation-mode/pdf-presentation-mode.component"; import * as i9 from "../pdf-open-file/pdf-open-file.component"; import * as i10 from "../pdf-print/pdf-print.component"; import * as i11 from "../pdf-download/pdf-download.component"; import * as i12 from "../pdf-editor/pdf-editor.component"; import * as i13 from "../pdf-toggle-secondary-toolbar/pdf-toggle-secondary-toolbar.component"; import * as i14 from "@angular/common"; export class PdfToolbarComponent { constructor(elementRef) { this.elementRef = elementRef; this.mobileFriendlyZoomScale = 1; this.primaryMenuVisible = true; this.showBookmarkButton = true; this.showDownloadButton = true; this.showDrawEditor = false; this.showTextEditor = false; this.showFindButton = undefined; this.showHandToolButton = true; this.showOpenFileButton = true; this.showPrintButton = true; this.showPagingButtons = true; this.showPresentationModeButton = false; this.showRotateButton = true; this.showSecondaryToolbarButton = true; this.showSidebarButton = true; this.showZoomButtons = true; this.textLayer = undefined; this.toolbarMarginTop = '0px'; this.toolbarWidth = '100%'; this.zoomLevels = ['auto', 'page-actual', 'page-fit', 'page-width', 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4]; this.onToolbarLoaded = new EventEmitter(); } ngAfterViewInit() { this.onToolbarLoaded.emit(this.elementRef.nativeElement.getElementsByClassName('toolbar')[0]); } } PdfToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfToolbarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); PdfToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PdfToolbarComponent, selector: "pdf-toolbar", inputs: { customToolbar: "customToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale", primaryMenuVisible: "primaryMenuVisible", showBookmarkButton: "showBookmarkButton", showDownloadButton: "showDownloadButton", showDrawEditor: "showDrawEditor", showTextEditor: "showTextEditor", showFindButton: "showFindButton", showHandToolButton: "showHandToolButton", showOpenFileButton: "showOpenFileButton", showPrintButton: "showPrintButton", showPagingButtons: "showPagingButtons", showPresentationModeButton: "showPresentationModeButton", showRotateButton: "showRotateButton", showSecondaryToolbarButton: "showSecondaryToolbarButton", showSidebarButton: "showSidebarButton", showZoomButtons: "showZoomButtons", textLayer: "textLayer", toolbarMarginTop: "toolbarMarginTop", toolbarWidth: "toolbarWidth", zoomLevels: "zoomLevels" }, outputs: { onToolbarLoaded: "onToolbarLoaded" }, ngImport: i0, template: "<div\n class=\"toolbar\"\n [class.invisible]=\"!primaryMenuVisible\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n [style.transformOrigin]=\"'left center'\"\n [style.width]=\"toolbarWidth\"\n [style.marginTop]=\"toolbarMarginTop\"\n>\n <div id=\"toolbarContainer\">\n <ng-content *ngTemplateOutlet=\"customToolbar ? customToolbar : defaultToolbar\"></ng-content>\n <div id=\"loadingBar\">\n <div class=\"progress\">\n <div class=\"glimmer\"></div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultToolbar>\n <div id=\"toolbarViewer\">\n <div id=\"toolbarViewerLeft\">\n <pdf-toggle-sidebar [showSidebarButton]=\"showSidebarButton\"></pdf-toggle-sidebar>\n <pdf-find-button [showFindButton]=\"showFindButton\" [textLayer]=\"textLayer\"></pdf-find-button>\n <pdf-paging-area [showPagingButtons]=\"showPagingButtons\"></pdf-paging-area>\n </div>\n <pdf-zoom-toolbar [showZoomButtons]=\"showZoomButtons\" [zoomLevels]=\"zoomLevels\"></pdf-zoom-toolbar>\n <div id=\"toolbarViewerRight\">\n <pdf-hand-tool [showHandToolButton]=\"showHandToolButton\"></pdf-hand-tool>\n <pdf-select-tool [showSelectToolButton]=\"showHandToolButton\"></pdf-select-tool>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"true\" [counterClockwise]=\"false\"> </pdf-rotate-page>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"false\" [counterClockwise]=\"true\"> </pdf-rotate-page>\n <pdf-presentation-mode [showPresentationModeButton]=\"showPresentationModeButton\"></pdf-presentation-mode>\n <pdf-open-file [showOpenFileButton]=\"showOpenFileButton\"></pdf-open-file>\n <pdf-print [showPrintButton]=\"showPrintButton\"></pdf-print>\n <pdf-download [showDownloadButton]=\"showDownloadButton\"></pdf-download>\n\n <pdf-editor [showDrawEditor]=\"showDrawEditor\" [showTextEditor]=\"showTextEditor\"></pdf-editor>\n <pdf-toggle-secondary-toolbar [showSecondaryToolbarButton]=\"showSecondaryToolbarButton\"> </pdf-toggle-secondary-toolbar>\n </div>\n </div>\n</ng-template>\n", styles: [""], components: [{ type: i1.PdfToggleSidebarComponent, selector: "pdf-toggle-sidebar", inputs: ["showSidebarButton"] }, { type: i2.PdfFindButtonComponent, selector: "pdf-find-button", inputs: ["showFindButton", "textLayer"] }, { type: i3.PdfPagingAreaComponent, selector: "pdf-paging-area", inputs: ["showPagingButtons"] }, { type: i4.PdfZoomToolbarComponent, selector: "pdf-zoom-toolbar", inputs: ["showZoomButtons", "zoomLevels"] }, { type: i5.PdfHandToolComponent, selector: "pdf-hand-tool", inputs: ["showHandToolButton"] }, { type: i6.PdfSelectToolComponent, selector: "pdf-select-tool", inputs: ["showSelectToolButton"] }, { type: i7.PdfRotatePageComponent, selector: "pdf-rotate-page", inputs: ["showRotateButton", "clockwise", "counterClockwise"] }, { type: i8.PdfPresentationModeComponent, selector: "pdf-presentation-mode", inputs: ["showPresentationModeButton"] }, { type: i9.PdfOpenFileComponent, selector: "pdf-open-file", inputs: ["showOpenFileButton"] }, { type: i10.PdfPrintComponent, selector: "pdf-print", inputs: ["showPrintButton"] }, { type: i11.PdfDownloadComponent, selector: "pdf-download", inputs: ["showDownloadButton"] }, { type: i12.PdfEditorComponent, selector: "pdf-editor", inputs: ["showDrawEditor", "showTextEditor"] }, { type: i13.PdfToggleSecondaryToolbarComponent, selector: "pdf-toggle-secondary-toolbar", inputs: ["showSecondaryToolbarButton"] }], directives: [{ type: i14.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfToolbarComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-toolbar', template: "<div\n class=\"toolbar\"\n [class.invisible]=\"!primaryMenuVisible\"\n [style.transform]=\"'scale(' + mobileFriendlyZoomScale + ')'\"\n [style.transformOrigin]=\"'left center'\"\n [style.width]=\"toolbarWidth\"\n [style.marginTop]=\"toolbarMarginTop\"\n>\n <div id=\"toolbarContainer\">\n <ng-content *ngTemplateOutlet=\"customToolbar ? customToolbar : defaultToolbar\"></ng-content>\n <div id=\"loadingBar\">\n <div class=\"progress\">\n <div class=\"glimmer\"></div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #defaultToolbar>\n <div id=\"toolbarViewer\">\n <div id=\"toolbarViewerLeft\">\n <pdf-toggle-sidebar [showSidebarButton]=\"showSidebarButton\"></pdf-toggle-sidebar>\n <pdf-find-button [showFindButton]=\"showFindButton\" [textLayer]=\"textLayer\"></pdf-find-button>\n <pdf-paging-area [showPagingButtons]=\"showPagingButtons\"></pdf-paging-area>\n </div>\n <pdf-zoom-toolbar [showZoomButtons]=\"showZoomButtons\" [zoomLevels]=\"zoomLevels\"></pdf-zoom-toolbar>\n <div id=\"toolbarViewerRight\">\n <pdf-hand-tool [showHandToolButton]=\"showHandToolButton\"></pdf-hand-tool>\n <pdf-select-tool [showSelectToolButton]=\"showHandToolButton\"></pdf-select-tool>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"true\" [counterClockwise]=\"false\"> </pdf-rotate-page>\n <pdf-rotate-page [showRotateButton]=\"showRotateButton\" [clockwise]=\"false\" [counterClockwise]=\"true\"> </pdf-rotate-page>\n <pdf-presentation-mode [showPresentationModeButton]=\"showPresentationModeButton\"></pdf-presentation-mode>\n <pdf-open-file [showOpenFileButton]=\"showOpenFileButton\"></pdf-open-file>\n <pdf-print [showPrintButton]=\"showPrintButton\"></pdf-print>\n <pdf-download [showDownloadButton]=\"showDownloadButton\"></pdf-download>\n\n <pdf-editor [showDrawEditor]=\"showDrawEditor\" [showTextEditor]=\"showTextEditor\"></pdf-editor>\n <pdf-toggle-secondary-toolbar [showSecondaryToolbarButton]=\"showSecondaryToolbarButton\"> </pdf-toggle-secondary-toolbar>\n </div>\n </div>\n</ng-template>\n", styles: [""] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { customToolbar: [{ type: Input }], mobileFriendlyZoomScale: [{ type: Input }], primaryMenuVisible: [{ type: Input }], showBookmarkButton: [{ type: Input }], showDownloadButton: [{ type: Input }], showDrawEditor: [{ type: Input }], showTextEditor: [{ type: Input }], showFindButton: [{ type: Input }], showHandToolButton: [{ type: Input }], showOpenFileButton: [{ type: Input }], showPrintButton: [{ type: Input }], showPagingButtons: [{ type: Input }], showPresentationModeButton: [{ type: Input }], showRotateButton: [{ type: Input }], showSecondaryToolbarButton: [{ type: Input }], showSidebarButton: [{ type: Input }], showZoomButtons: [{ type: Input }], textLayer: [{ type: Input }], toolbarMarginTop: [{ type: Input }], toolbarWidth: [{ type: Input }], zoomLevels: [{ type: Input }], onToolbarLoaded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi10b29sYmFyL3BkZi10b29sYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtdG9vbGJhci9wZGYtdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVEvRyxNQUFNLE9BQU8sbUJBQW1CO0lBbUU5QixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBOURuQyw0QkFBdUIsR0FBRyxDQUFDLENBQUM7UUFHNUIsdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBRzFCLHVCQUFrQixHQUF5QixJQUFJLENBQUM7UUFHaEQsdUJBQWtCLEdBQXlCLElBQUksQ0FBQztRQUdoRCxtQkFBYyxHQUF5QixLQUFLLENBQUM7UUFHN0MsbUJBQWMsR0FBeUIsS0FBSyxDQUFDO1FBRzdDLG1CQUFjLEdBQXFDLFNBQVMsQ0FBQztRQUc3RCx1QkFBa0IsR0FBeUIsSUFBSSxDQUFDO1FBR2hELHVCQUFrQixHQUF5QixJQUFJLENBQUM7UUFHaEQsb0JBQWUsR0FBeUIsSUFBSSxDQUFDO1FBRzdDLHNCQUFpQixHQUF5QixJQUFJLENBQUM7UUFHL0MsK0JBQTBCLEdBQXlCLEtBQUssQ0FBQztRQUd6RCxxQkFBZ0IsR0FBeUIsSUFBSSxDQUFDO1FBRzlDLCtCQUEwQixHQUF5QixJQUFJLENBQUM7UUFHeEQsc0JBQWlCLEdBQXlCLElBQUksQ0FBQztRQUcvQyxvQkFBZSxHQUF5QixJQUFJLENBQUM7UUFHN0MsY0FBUyxHQUF3QixTQUFTLENBQUM7UUFHM0MscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBR3pCLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBR3RCLGVBQVUsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFHakcsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO0lBRVosQ0FBQztJQUU5QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFnQixDQUFDLENBQUM7SUFDL0csQ0FBQzs7Z0hBdkVVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLG82QkNSaEMsOGxFQXlDQTsyRkRqQ2EsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGFBQWE7aUdBTWhCLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsMEJBQTBCO3NCQURoQyxLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJQywwQkFBMEI7c0JBRGhDLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLFVBQVU7c0JBRGhCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVzcG9uc2l2ZVZpc2liaWxpdHkgfSBmcm9tICcuLi8uLi9yZXNwb25zaXZlLXZpc2liaWxpdHknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGYtdG9vbGJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtdG9vbGJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BkZi10b29sYmFyLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUGRmVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgY3VzdG9tVG9vbGJhcjogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgPSAxO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwcmltYXJ5TWVudVZpc2libGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Qm9va21hcmtCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0Rvd25sb2FkQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dEcmF3RWRpdG9yOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93VGV4dEVkaXRvcjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd0ZpbmRCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93SGFuZFRvb2xCdXR0b246IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd09wZW5GaWxlQnV0dG9uOiBSZXNwb25zaXZlVmlzaWJpbGl0eSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNob3dQcmludEJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93UGFnaW5nQnV0dG9uczogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93UHJlc2VudGF0aW9uTW9kZUJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1JvdGF0ZUJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2lkZWJhckJ1dHRvbjogUmVzcG9uc2l2ZVZpc2liaWxpdHkgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93Wm9vbUJ1dHRvbnM6IFJlc3BvbnNpdmVWaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGV4dExheWVyOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0b29sYmFyTWFyZ2luVG9wID0gJzBweCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvb2xiYXJXaWR0aCA9ICcxMDAlJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgem9vbUxldmVscyA9IFsnYXV0bycsICdwYWdlLWFjdHVhbCcsICdwYWdlLWZpdCcsICdwYWdlLXdpZHRoJywgMC41LCAwLjc1LCAxLCAxLjI1LCAxLjUsIDIsIDMsIDRdO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25Ub29sYmFyTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25Ub29sYmFyTG9hZGVkLmVtaXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndG9vbGJhcicpWzBdIGFzIEhUTUxFbGVtZW50KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRvb2xiYXJcIlxuICBbY2xhc3MuaW52aXNpYmxlXT1cIiFwcmltYXJ5TWVudVZpc2libGVcIlxuICBbc3R5bGUudHJhbnNmb3JtXT1cIidzY2FsZSgnICsgbW9iaWxlRnJpZW5kbHlab29tU2NhbGUgKyAnKSdcIlxuICBbc3R5bGUudHJhbnNmb3JtT3JpZ2luXT1cIidsZWZ0IGNlbnRlcidcIlxuICBbc3R5bGUud2lkdGhdPVwidG9vbGJhcldpZHRoXCJcbiAgW3N0eWxlLm1hcmdpblRvcF09XCJ0b29sYmFyTWFyZ2luVG9wXCJcbj5cbiAgPGRpdiBpZD1cInRvb2xiYXJDb250YWluZXJcIj5cbiAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRvb2xiYXIgPyBjdXN0b21Ub29sYmFyIDogZGVmYXVsdFRvb2xiYXJcIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBpZD1cImxvYWRpbmdCYXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xpbW1lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRvb2xiYXI+XG4gIDxkaXYgaWQ9XCJ0b29sYmFyVmlld2VyXCI+XG4gICAgPGRpdiBpZD1cInRvb2xiYXJWaWV3ZXJMZWZ0XCI+XG4gICAgICA8cGRmLXRvZ2dsZS1zaWRlYmFyIFtzaG93U2lkZWJhckJ1dHRvbl09XCJzaG93U2lkZWJhckJ1dHRvblwiPjwvcGRmLXRvZ2dsZS1zaWRlYmFyPlxuICAgICAgPHBkZi1maW5kLWJ1dHRvbiBbc2hvd0ZpbmRCdXR0b25dPVwic2hvd0ZpbmRCdXR0b25cIiBbdGV4dExheWVyXT1cInRleHRMYXllclwiPjwvcGRmLWZpbmQtYnV0dG9uPlxuICAgICAgPHBkZi1wYWdpbmctYXJlYSBbc2hvd1BhZ2luZ0J1dHRvbnNdPVwic2hvd1BhZ2luZ0J1dHRvbnNcIj48L3BkZi1wYWdpbmctYXJlYT5cbiAgICA8L2Rpdj5cbiAgICA8cGRmLXpvb20tdG9vbGJhciBbc2hvd1pvb21CdXR0b25zXT1cInNob3dab29tQnV0dG9uc1wiIFt6b29tTGV2ZWxzXT1cInpvb21MZXZlbHNcIj48L3BkZi16b29tLXRvb2xiYXI+XG4gICAgPGRpdiBpZD1cInRvb2xiYXJWaWV3ZXJSaWdodFwiPlxuICAgICAgPHBkZi1oYW5kLXRvb2wgW3Nob3dIYW5kVG9vbEJ1dHRvbl09XCJzaG93SGFuZFRvb2xCdXR0b25cIj48L3BkZi1oYW5kLXRvb2w+XG4gICAgICA8cGRmLXNlbGVjdC10b29sIFtzaG93U2VsZWN0VG9vbEJ1dHRvbl09XCJzaG93SGFuZFRvb2xCdXR0b25cIj48L3BkZi1zZWxlY3QtdG9vbD5cbiAgICAgIDxwZGYtcm90YXRlLXBhZ2UgW3Nob3dSb3RhdGVCdXR0b25dPVwic2hvd1JvdGF0ZUJ1dHRvblwiIFtjbG9ja3dpc2VdPVwidHJ1ZVwiIFtjb3VudGVyQ2xvY2t3aXNlXT1cImZhbHNlXCI+IDwvcGRmLXJvdGF0ZS1wYWdlPlxuICAgICAgPHBkZi1yb3RhdGUtcGFnZSBbc2hvd1JvdGF0ZUJ1dHRvbl09XCJzaG93Um90YXRlQnV0dG9uXCIgW2Nsb2Nrd2lzZV09XCJmYWxzZVwiIFtjb3VudGVyQ2xvY2t3aXNlXT1cInRydWVcIj4gPC9wZGYtcm90YXRlLXBhZ2U+XG4gICAgICA8cGRmLXByZXNlbnRhdGlvbi1tb2RlIFtzaG93UHJlc2VudGF0aW9uTW9kZUJ1dHRvbl09XCJzaG93UHJlc2VudGF0aW9uTW9kZUJ1dHRvblwiPjwvcGRmLXByZXNlbnRhdGlvbi1tb2RlPlxuICAgICAgPHBkZi1vcGVuLWZpbGUgW3Nob3dPcGVuRmlsZUJ1dHRvbl09XCJzaG93T3BlbkZpbGVCdXR0b25cIj48L3BkZi1vcGVuLWZpbGU+XG4gICAgICA8cGRmLXByaW50IFtzaG93UHJpbnRCdXR0b25dPVwic2hvd1ByaW50QnV0dG9uXCI+PC9wZGYtcHJpbnQ+XG4gICAgICA8cGRmLWRvd25sb2FkIFtzaG93RG93bmxvYWRCdXR0b25dPVwic2hvd0Rvd25sb2FkQnV0dG9uXCI+PC9wZGYtZG93bmxvYWQ+XG5cbiAgICAgIDxwZGYtZWRpdG9yIFtzaG93RHJhd0VkaXRvcl09XCJzaG93RHJhd0VkaXRvclwiIFtzaG93VGV4dEVkaXRvcl09XCJzaG93VGV4dEVkaXRvclwiPjwvcGRmLWVkaXRvcj5cbiAgICAgIDxwZGYtdG9nZ2xlLXNlY29uZGFyeS10b29sYmFyIFtzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvbl09XCJzaG93U2Vjb25kYXJ5VG9vbGJhckJ1dHRvblwiPiA8L3BkZi10b2dnbGUtc2Vjb25kYXJ5LXRvb2xiYXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==