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.
136 lines • 23.5 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
const THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // one pixel
export class PdfSidebarContentComponent {
constructor() {
this.hideSidebarToolbar = false;
this.mobileFriendlyZoomScale = 1.0;
this.thumbnailDrawn = new EventEmitter();
if (typeof window !== 'undefined') {
window.pdfThumbnailGeneratorReady = () => this.pdfThumbnailGeneratorReady();
window.pdfThumbnailGenerator = (pdfThumbnailView, linkService, id, container, thumbPageTitlePromise) => this.createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromise);
}
}
get top() {
let top = 0;
if (!this.hideSidebarToolbar) {
top = 32 * this.mobileFriendlyZoomScale;
if (top === 32) {
top = 33; // prevent the border of the sidebar toolbar from being cut off
}
}
return `${top}px`;
}
ngOnDestroy() {
this.linkService = undefined;
}
pdfThumbnailGeneratorReady() {
if (!this.thumbnailViewTemplate) {
return false;
}
const t = this.thumbnailViewTemplate.nativeElement;
return !!t && !!t.innerHTML && t.innerHTML.length > 0;
}
createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromise) {
this.linkService = linkService;
const template = this.thumbnailViewTemplate;
// get the inner HTML without the attributes and classes added by Angular
const inner = template.nativeElement.innerHTML
.split(/_ng\w+-\w+-\w+=""/g)
.join('')
.split(/ng-\w+-\w+/g)
.join('')
.split(/<!--[\s\S]*?-->/g)
.join('');
const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
const widthOfRing = `${pdfThumbnailView.canvasWidth + borderAdjustment}px`;
const heightOfRing = `${pdfThumbnailView.canvasHeight + borderAdjustment}px`;
const newHtml = inner.split('WIDTH_OF_RING').join(widthOfRing).split('HEIGHT_OF_RING').join(heightOfRing).split('PAGE_NUMBER').join(id);
const newElement = this.createElementFromHTML(newHtml);
newElement.classList.remove('pdf-viewer-template');
const anchor = newElement;
anchor.href = linkService.getAnchorUrl(`#page=${id}`);
thumbPageTitlePromise.then((msg) => {
anchor.title = msg;
});
anchor.onclick = () => {
linkService.page = id;
return false;
};
pdfThumbnailView.anchor = anchor;
const ring = newElement.getElementsByClassName('image-container')[0];
pdfThumbnailView.ring = ring;
pdfThumbnailView.div = newElement.getElementsByClassName('thumbnail')[0];
container.appendChild(newElement);
const thumbnailDrawnEvent = {
thumbnail: newElement,
container: container,
pageId: id,
};
this.thumbnailDrawn.emit(thumbnailDrawnEvent);
}
getTrustedHtml(html) {
const ttWindow = window;
if (ttWindow.trustedTypes) {
// Create a policy that can create TrustedHTML values
// after sanitizing the input strings with DOMPurify library.
const sanitizer = ttWindow.trustedTypes.createPolicy('foo', {
createHTML: (input) => input,
});
return sanitizer.createHTML(html); // Puts the sanitized value into the DOM.
}
else {
return html;
}
}
createElementFromHTML(htmlString) {
const div = document.createElement('div');
const trustedHtml = this.getTrustedHtml(htmlString.trim());
div.innerHTML = trustedHtml;
// Change this to div.childNodes to support multiple top-level nodes
return div.firstChild;
}
onKeyDown(event) {
if (event.code === 'ArrowDown') {
if (this.linkService) {
if (event.ctrlKey || event.metaKey) {
this.linkService.page = this.linkService.pagesCount;
}
else if (this.linkService.page < this.linkService.pagesCount) {
this.linkService.page = this.linkService.page + 1;
}
event.preventDefault();
}
}
else if (event.code === 'ArrowUp') {
if (this.linkService) {
if (event.ctrlKey || event.metaKey) {
this.linkService.page = 1;
}
else if (this.linkService.page > 1) {
this.linkService.page = this.linkService.page - 1;
}
event.preventDefault();
}
}
}
}
PdfSidebarContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PdfSidebarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfSidebarContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PdfSidebarContentComponent, selector: "pdf-sidebar-content", inputs: { customThumbnail: "customThumbnail", hideSidebarToolbar: "hideSidebarToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale" }, outputs: { thumbnailDrawn: "thumbnailDrawn" }, viewQueries: [{ propertyName: "thumbnailViewTemplate", first: true, predicate: ["thumbnailViewTemplate"], descendants: true }], ngImport: i0, template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"$page\">\n <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n", styles: [""], directives: [{ type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PdfSidebarContentComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-sidebar-content', template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"$page\">\n <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n", styles: [""] }]
}], ctorParameters: function () { return []; }, propDecorators: { customThumbnail: [{
type: Input
}], hideSidebarToolbar: [{
type: Input
}], mobileFriendlyZoomScale: [{
type: Input
}], thumbnailViewTemplate: [{
type: ViewChild,
args: ['thumbnailViewTemplate']
}], thumbnailDrawn: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3NpZGViYXIvcGRmLXNpZGViYXIvcGRmLXNpZGViYXItY29udGVudC9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvc2lkZWJhci9wZGYtc2lkZWJhci9wZGYtc2lkZWJhci1jb250ZW50L3BkZi1zaWRlYmFyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQWtCdEgsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZO0FBT3JELE1BQU0sT0FBTywwQkFBMEI7SUE2QnJDO1FBeEJPLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUczQiw0QkFBdUIsR0FBRyxHQUFHLENBQUM7UUFROUIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQWNqRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtZQUNoQyxNQUFjLENBQUMsMEJBQTBCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDcEYsTUFBYyxDQUFDLHFCQUFxQixHQUFHLENBQ3RDLGdCQUFrQyxFQUNsQyxXQUFnQixFQUNoQixFQUFVLEVBQ1YsU0FBeUIsRUFDekIscUJBQXNDLEVBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7U0FDaEc7SUFDSCxDQUFDO0lBdEJELElBQVcsR0FBRztRQUNaLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDeEMsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO2dCQUNkLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQywrREFBK0Q7YUFDMUU7U0FDRjtRQUNELE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBZU0sV0FBVztRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRU0sMEJBQTBCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDL0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUE0QixDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLGVBQWUsQ0FDckIsZ0JBQWtDLEVBQ2xDLFdBQTJCLEVBQzNCLEVBQVUsRUFDVixTQUF5QixFQUN6QixxQkFBc0M7UUFFdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQzVDLHlFQUF5RTtRQUN6RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVM7YUFDM0MsS0FBSyxDQUFDLG9CQUFvQixDQUFDO2FBQzNCLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDUixLQUFLLENBQUMsYUFBYSxDQUFDO2FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDUixLQUFLLENBQUMsa0JBQWtCLENBQUM7YUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRVosTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsNkJBQTZCLENBQUM7UUFFM0QsTUFBTSxXQUFXLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLElBQUksQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBRyxHQUFHLGdCQUFnQixDQUFDLFlBQVksR0FBRyxnQkFBZ0IsSUFBSSxDQUFDO1FBRTdFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hJLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sTUFBTSxHQUFHLFVBQStCLENBQUM7UUFDL0MsTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0RCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVqQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQWdCLENBQUM7UUFDcEYsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUM3QixnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQztRQUV4RixTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sbUJBQW1CLEdBQTJCO1lBQ2xELFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFZO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQXVDLENBQUM7UUFDekQsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3pCLHFEQUFxRDtZQUNyRCw2REFBNkQ7WUFDN0QsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUMxRCxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7YUFDN0IsQ0FBQyxDQUFDO1lBRUgsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBbUIsQ0FBQyxDQUFDLHlDQUF5QztTQUMvRjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxVQUFVO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRCxHQUFHLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUU1QixvRUFBb0U7UUFDcEUsT0FBTyxHQUFHLENBQUMsVUFBeUIsQ0FBQztJQUN2QyxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQW9CO1FBQ25DLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7aUJBQ3JEO3FCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7b0JBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDbkQ7Z0JBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7YUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ25DLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDM0I7cUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztpQkFDbkQ7Z0JBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7SUFDSCxDQUFDOzt3SEF0SlUsMEJBQTBCOzRHQUExQiwwQkFBMEIsd1hDekJ2Qyx1MkJBb0JBOzRGREthLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSxxQkFBcUI7MEVBTXhCLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQUlDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkFJQyxxQkFBcUI7c0JBRDNCLFNBQVM7dUJBQUMsdUJBQXVCO2dCQU0zQixjQUFjO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJ1c3RlZFR5cGVzV2luZG93IH0gZnJvbSAndHJ1c3RlZC10eXBlcy9saWInO1xuaW1wb3J0IHsgUGRmVGh1bWJuYWlsRHJhd25FdmVudCB9IGZyb20gJy4uLy4uLy4uL2V2ZW50cy9wZGYtdGh1bWJuYWlsLWRyYXduLWV2ZW50JztcblxuZGVjbGFyZSBjbGFzcyBQREZUaHVtYm5haWxWaWV3IHtcbiAgYW5jaG9yOiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgZGl2OiBIVE1MRWxlbWVudDtcbiAgcmluZzogSFRNTEVsZW1lbnQ7XG4gIGNhbnZhc1dpZHRoOiBudW1iZXI7XG4gIGNhbnZhc0hlaWdodDogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGNsYXNzIFBERkxpbmtTZXJ2aWNlIHtcbiAgcHVibGljIHBhZ2U6IG51bWJlcjtcbiAgcHVibGljIHBhZ2VzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIGdldEFuY2hvclVybCh0YXJnZXRVcmw6IHN0cmluZyk6IHN0cmluZztcbn1cblxuY29uc3QgVEhVTUJOQUlMX0NBTlZBU19CT1JERVJfV0lEVEggPSAxOyAvLyBvbmUgcGl4ZWxcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLXNpZGViYXItY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNpZGViYXJDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVRodW1ibmFpbDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZVNpZGViYXJUb29sYmFyID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlID0gMS4wO1xuXG4gIEBWaWV3Q2hpbGQoJ3RodW1ibmFpbFZpZXdUZW1wbGF0ZScpXG4gIHB1YmxpYyB0aHVtYm5haWxWaWV3VGVtcGxhdGU6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBsaW5rU2VydmljZTogUERGTGlua1NlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0aHVtYm5haWxEcmF3biA9IG5ldyBFdmVudEVtaXR0ZXI8UGRmVGh1bWJuYWlsRHJhd25FdmVudD4oKTtcblxuICBwdWJsaWMgZ2V0IHRvcCgpOiBzdHJpbmcge1xuICAgIGxldCB0b3AgPSAwO1xuICAgIGlmICghdGhpcy5oaWRlU2lkZWJhclRvb2xiYXIpIHtcbiAgICAgIHRvcCA9IDMyICogdGhpcy5tb2JpbGVGcmllbmRseVpvb21TY2FsZTtcbiAgICAgIGlmICh0b3AgPT09IDMyKSB7XG4gICAgICAgIHRvcCA9IDMzOyAvLyBwcmV2ZW50IHRoZSBib3JkZXIgb2YgdGhlIHNpZGViYXIgdG9vbGJhciBmcm9tIGJlaW5nIGN1dCBvZmZcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3RvcH1weGA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5wZGZUaHVtYm5haWxHZW5lcmF0b3JSZWFkeSA9ICgpID0+IHRoaXMucGRmVGh1bWJuYWlsR2VuZXJhdG9yUmVhZHkoKTtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5wZGZUaHVtYm5haWxHZW5lcmF0b3IgPSAoXG4gICAgICAgIHBkZlRodW1ibmFpbFZpZXc6IFBERlRodW1ibmFpbFZpZXcsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiBhbnksXG4gICAgICAgIGlkOiBudW1iZXIsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsXG4gICAgICAgIHRodW1iUGFnZVRpdGxlUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+XG4gICAgICApID0+IHRoaXMuY3JlYXRlVGh1bWJuYWlsKHBkZlRodW1ibmFpbFZpZXcsIGxpbmtTZXJ2aWNlLCBpZCwgY29udGFpbmVyLCB0aHVtYlBhZ2VUaXRsZVByb21pc2UpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHBkZlRodW1ibmFpbEdlbmVyYXRvclJlYWR5KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50aHVtYm5haWxWaWV3VGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdCA9IHRoaXMudGh1bWJuYWlsVmlld1RlbXBsYXRlLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgcmV0dXJuICEhdCAmJiAhIXQuaW5uZXJIVE1MICYmIHQuaW5uZXJIVE1MLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRodW1ibmFpbChcbiAgICBwZGZUaHVtYm5haWxWaWV3OiBQREZUaHVtYm5haWxWaWV3LFxuICAgIGxpbmtTZXJ2aWNlOiBQREZMaW5rU2VydmljZSxcbiAgICBpZDogbnVtYmVyLFxuICAgIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsXG4gICAgdGh1bWJQYWdlVGl0bGVQcm9taXNlOiBQcm9taXNlPHN0cmluZz5cbiAgKSB7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy50aHVtYm5haWxWaWV3VGVtcGxhdGU7XG4gICAgLy8gZ2V0IHRoZSBpbm5lciBIVE1MIHdpdGhvdXQgdGhlIGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgYWRkZWQgYnkgQW5ndWxhclxuICAgIGNvbnN0IGlubmVyID0gdGVtcGxhdGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUxcbiAgICAgIC5zcGxpdCgvX25nXFx3Ky1cXHcrLVxcdys9XCJcIi9nKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAuc3BsaXQoL25nLVxcdystXFx3Ky9nKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAuc3BsaXQoLzwhLS1bXFxzXFxTXSo/LS0+L2cpXG4gICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCBib3JkZXJBZGp1c3RtZW50ID0gMiAqIFRIVU1CTkFJTF9DQU5WQVNfQk9SREVSX1dJRFRIO1xuXG4gICAgY29uc3Qgd2lkdGhPZlJpbmcgPSBgJHtwZGZUaHVtYm5haWxWaWV3LmNhbnZhc1dpZHRoICsgYm9yZGVyQWRqdXN0bWVudH1weGA7XG4gICAgY29uc3QgaGVpZ2h0T2ZSaW5nID0gYCR7cGRmVGh1bWJuYWlsVmlldy5jYW52YXNIZWlnaHQgKyBib3JkZXJBZGp1c3RtZW50fXB4YDtcblxuICAgIGNvbnN0IG5ld0h0bWwgPSBpbm5lci5zcGxpdCgnV0lEVEhfT0ZfUklORycpLmpvaW4od2lkdGhPZlJpbmcpLnNwbGl0KCdIRUlHSFRfT0ZfUklORycpLmpvaW4oaGVpZ2h0T2ZSaW5nKS5zcGxpdCgnUEFHRV9OVU1CRVInKS5qb2luKGlkKTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50RnJvbUhUTUwobmV3SHRtbCk7XG4gICAgbmV3RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwZGYtdmlld2VyLXRlbXBsYXRlJyk7XG5cbiAgICBjb25zdCBhbmNob3IgPSBuZXdFbGVtZW50IGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGFuY2hvci5ocmVmID0gbGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKGAjcGFnZT0ke2lkfWApO1xuICAgIHRodW1iUGFnZVRpdGxlUHJvbWlzZS50aGVuKChtc2cpID0+IHtcbiAgICAgIGFuY2hvci50aXRsZSA9IG1zZztcbiAgICB9KTtcbiAgICBhbmNob3Iub25jbGljayA9ICgpID0+IHtcbiAgICAgIGxpbmtTZXJ2aWNlLnBhZ2UgPSBpZDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHBkZlRodW1ibmFpbFZpZXcuYW5jaG9yID0gYW5jaG9yO1xuXG4gICAgY29uc3QgcmluZyA9IG5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW1hZ2UtY29udGFpbmVyJylbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgcGRmVGh1bWJuYWlsVmlldy5yaW5nID0gcmluZztcbiAgICBwZGZUaHVtYm5haWxWaWV3LmRpdiA9IG5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGh1bWJuYWlsJylbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG5cbiAgICBjb25zdCB0aHVtYm5haWxEcmF3bkV2ZW50OiBQZGZUaHVtYm5haWxEcmF3bkV2ZW50ID0ge1xuICAgICAgdGh1bWJuYWlsOiBuZXdFbGVtZW50LFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBwYWdlSWQ6IGlkLFxuICAgIH07XG4gICAgdGhpcy50aHVtYm5haWxEcmF3bi5lbWl0KHRodW1ibmFpbERyYXduRXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUcnVzdGVkSHRtbChodG1sOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0dFdpbmRvdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIFRydXN0ZWRUeXBlc1dpbmRvdztcbiAgICBpZiAodHRXaW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb2xpY3kgdGhhdCBjYW4gY3JlYXRlIFRydXN0ZWRIVE1MIHZhbHVlc1xuICAgICAgLy8gYWZ0ZXIgc2FuaXRpemluZyB0aGUgaW5wdXQgc3RyaW5ncyB3aXRoIERPTVB1cmlmeSBsaWJyYXJ5LlxuICAgICAgY29uc3Qgc2FuaXRpemVyID0gdHRXaW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnZm9vJywge1xuICAgICAgICBjcmVhdGVIVE1MOiAoaW5wdXQpID0+IGlucHV0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzYW5pdGl6ZXIuY3JlYXRlSFRNTChodG1sKSBhcyB1bmtub3duIGFzIGFueTsgLy8gUHV0cyB0aGUgc2FuaXRpemVkIHZhbHVlIGludG8gdGhlIERPTS5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbGVtZW50RnJvbUhUTUwoaHRtbFN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCB0cnVzdGVkSHRtbCA9IHRoaXMuZ2V0VHJ1c3RlZEh0bWwoaHRtbFN0cmluZy50cmltKCkpO1xuICAgIGRpdi5pbm5lckhUTUwgPSB0cnVzdGVkSHRtbDtcblxuICAgIC8vIENoYW5nZSB0aGlzIHRvIGRpdi5jaGlsZE5vZGVzIHRvIHN1cHBvcnQgbXVsdGlwbGUgdG9wLWxldmVsIG5vZGVzXG4gICAgcmV0dXJuIGRpdi5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5jb2RlID09PSAnQXJyb3dEb3duJykge1xuICAgICAgaWYgKHRoaXMubGlua1NlcnZpY2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPCB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudC5jb2RlID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGlmICh0aGlzLmxpbmtTZXJ2aWNlKSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGlua1NlcnZpY2UucGFnZSA+IDEpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGlkPVwic2lkZWJhckNvbnRlbnRcIiBbc3R5bGUudG9wXT1cInRvcFwiPlxuICA8ZGl2ICN0aHVtYm5haWxWaWV3VGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UaHVtYm5haWwgPyBjdXN0b21UaHVtYm5haWwgOiBkZWZhdWx0VGh1bWJuYWlsXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbiAgPGRpdiBpZD1cInRodW1ibmFpbFZpZXdcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiPjwvZGl2PlxuICA8ZGl2IGlkPVwib3V0bGluZVZpZXdcIiBjbGFzcz1cImhpZGRlblwiPjwvZGl2PlxuICA8ZGl2IGlkPVwiYXR0YWNobWVudHNWaWV3XCIgY2xhc3M9XCJoaWRkZW5cIj48L2Rpdj5cbiAgPGRpdiBpZD1cImxheWVyc1ZpZXdcIiBjbGFzcz1cImhpZGRlblwiPjwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRodW1ibmFpbD5cbiAgPGEgY2xhc3M9XCJwZGYtdmlld2VyLXRlbXBsYXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cInRodW1ibmFpbFwiIGRhdGEtcGFnZS1udW1iZXI9XCIkcGFnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRodW1ibmFpbFNlbGVjdGlvblJpbmcgaW1hZ2UtY29udGFpbmVyXCIgc3R5bGU9XCJ3aWR0aDogV0lEVEhfT0ZfUklORzsgaGVpZ2h0OiBIRUlHSFRfT0ZfUklOR1wiPlxuICAgICAgICA8IS0tIGltYWdlIGlzIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaGVyZSAtLT5cbiAgICAgICAgPCEtLSA8aW1nIGNsYXNzPVwidGh1bWJuYWlsSW1hZ2VcIiBzdHlsZT1cIndpZHRoOiA5OHB4OyBoZWlnaHQ6IDczcHg7XCIgLz4gLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9hPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==