@pepperi/lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.
293 lines • 43.1 kB
JavaScript
import { Component, ViewChild, Input, TemplateRef } from '@angular/core';
import { trigger, state, style, transition, animate } from '@angular/animations';
import { ThumbnailsPosition, ImageItem } from '@ngx-gallery/core';
import { CustomizationService } from '@pepperi/lib';
import { pepperiIconArrowRightAlt } from '@pepperi/lib/icon';
import 'hammerjs';
import * as i0 from "@angular/core";
import * as i1 from "@pepperi/lib";
import * as i2 from "@pepperi/lib/dialog";
import * as i3 from "@ngx-gallery/core";
import * as i4 from "@angular/forms";
import * as i5 from "@pepperi/lib/field-title";
import * as i6 from "@angular/common";
import * as i7 from "@angular/material/dialog";
import * as i8 from "@angular/material/icon";
import * as i9 from "@pepperi/lib/icon";
const _c0 = ["arrowRightTemplate"];
const _c1 = ["galleryCont"];
const _c2 = ["galleryDialogTemplate"];
const _c3 = ["galleryDialogCont"];
function PepperiImagesFilmstripComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
const _r7 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "h2", 8);
i0.ɵɵelementStart(1, "span", 9);
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "button", 10);
i0.ɵɵelementStart(4, "mat-icon");
i0.ɵɵelement(5, "pep-icon", 11);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(6, "div", 12, 13);
i0.ɵɵelementStart(8, "gallery", 14);
i0.ɵɵlistener("indexChange", function PepperiImagesFilmstripComponent_ng_template_6_Template_gallery_indexChange_8_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(); return ctx_r6.indexChange($event); })("error", function PepperiImagesFilmstripComponent_ng_template_6_Template_gallery_error_8_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.onError($event); });
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
const _r3 = i0.ɵɵreference(9);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r2.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("mat-dialog-close", null);
i0.ɵɵadvance(5);
i0.ɵɵstyleProp("height", "auto", "px");
i0.ɵɵpropertyInterpolate2("id", "", ctx_r2.key, "-", ctx_r2.objectId, "-dlgGallery");
i0.ɵɵproperty("itemTemplate", _r3)("autoPlay", false)("counter", false);
} }
function PepperiImagesFilmstripComponent_ng_template_8_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 16);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const data_r11 = i0.ɵɵnextContext().data;
i0.ɵɵproperty("@slideAnimation", undefined);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", data_r11 == null ? null : data_r11.title, " ");
} }
function PepperiImagesFilmstripComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, PepperiImagesFilmstripComponent_ng_template_8_span_0_Template, 2, 2, "span", 15);
} if (rf & 2) {
const index_r9 = ctx.index;
const type_r10 = ctx.type;
const currIndex_r12 = ctx.currIndex;
i0.ɵɵproperty("ngIf", type_r10 === "image" && index_r9 === currIndex_r12);
} }
export const slideInAnimation = trigger('slideAnimation', [
state('in', style({ transform: 'translateY(0)', opacity: 1 })),
transition(':enter', [
style({ transform: 'translateY(-100%)', opacity: 0 }),
animate(400)
]),
transition(':leave', [
animate(400, style({ transform: 'translateY(-100%)', opacity: 0 }))
])
]);
export class PepperiImagesFilmstripComponent {
constructor(customizationService, dialogService, layoutService, fileService, gallery, renderer, element, cd) {
this.customizationService = customizationService;
this.dialogService = dialogService;
this.layoutService = layoutService;
this.fileService = fileService;
this.gallery = gallery;
this.renderer = renderer;
this.element = element;
this.cd = cd;
// @ViewChild('ngxViewerImage') ngxViewerImage: any; // TODO: Check if we need to use this??
this.value = '';
this.key = '';
this.label = '';
this.xAlignment = '0';
this.rowSpan = 1;
this.controlType = 'images';
this.form = null;
this.objectId = null;
this.showTitle = false;
this.currIndex = 0;
this.showThumbnails = false;
this.required = false;
this.readonly = false;
this.disabled = false;
this.fieldHeight = '';
this.standAlone = false;
this.galleryWidth = 0;
this.isVertical = false;
this.config = {
// loadingMode: 'indeterminate',
autoPlay: false,
imageSize: 'contain',
loadingStrategy: 'lazy',
gestures: true,
loop: true,
dots: false,
nav: false,
counter: false // Show counter
};
}
ngOnInit() {
if (this.form === null) {
this.standAlone = true;
this.form = this.customizationService.getDefaultFromGroup(this.key, this.value, this.required, this.readonly, this.disabled);
this.renderer.addClass(this.element.nativeElement, CustomizationService.STAND_ALONE_FIELD_CLASS_NAME);
}
this.fieldHeight = this.customizationService.calculateFieldHeight(this.layoutType, this.rowSpan, this.standAlone);
const imgArr = this.value ? this.value.split(';') : [];
// add No image image when there is no images
if (imgArr.length === 0) {
const noImageSrc = this.fileService.getNoImagePath();
imgArr.push(noImageSrc);
}
this.items = imgArr.map(img => new ImageItem({ src: img, thumb: img }));
this.config.dots = this.config.nav = this.items.length > 1;
this.config.thumb = (this.key === 'ItemFilmstripImages' || this.showThumbnails) && this.items.length > 1 ? true : false;
this.config.navIcon = pepperiIconArrowRightAlt.data;
this.currIndex =
this.key === 'ItemFilmstripImages' &&
this.currIndex === 0 &&
this.items.length > 1 ?
Math.floor(this.items.length / 2) - 1 : this.currIndex;
this.galleryRef = this.gallery.ref(this.key + '-' + this.objectId + '-gallery');
}
ngAfterViewInit() {
this.initGalleryStyle(this.galleryCont, this.galleryRef);
}
ngOnDestroy() {
if (this.galleryRef) {
this.galleryRef.destroy();
}
if (this.dialogGalleryRef) {
this.dialogGalleryRef.destroy();
}
}
initGalleryStyle(galleryContainer, galleryRef) {
// Set thumbnails position and sliding direction
this.setThumbnailDimension(galleryContainer);
galleryRef.setConfig(this.config);
galleryRef.load(this.items);
const currentIndex = this.currIndex;
if (currentIndex > 0) {
galleryRef.set(currentIndex);
}
}
indexChange(item) {
this.currIndex = item.currIndex;
// if (this.ngxViewerImage && this.ngxViewerImage.scale) {
// this.ngxViewerImage.scale = 1;
// this.updateStyle();
// }
}
onError(e) {
const noImageSrc = this.fileService.getNoImagePath();
const noimg = new ImageItem({ src: noImageSrc, thumb: noImageSrc });
this.items.splice(e.itemIndex, 1, noimg);
}
enlargeImage(event) {
const dialogRef = this.dialogService.openDialog(this.galleryDialogTemplate);
dialogRef.afterOpened().subscribe(() => {
this.afterDialogOpened();
});
// Update currentIndex in galleryRef
dialogRef.afterClosed().subscribe(value => {
this.galleryRef.set(this.currIndex);
});
}
afterDialogOpened() {
this.dialogGalleryRef = this.gallery.ref(this.key + '-' + this.objectId + '-dlgGallery');
this.initGalleryStyle(this.galleryDialogCont, this.dialogGalleryRef);
}
setThumbnailDimension(galleryContainer) {
this.galleryWidth = galleryContainer.nativeElement.clientWidth;
this.galleryHeight = galleryContainer.nativeElement.clientHeight;
this.isVertical = this.galleryWidth < this.galleryHeight;
if (this.isVertical) {
let width = (this.galleryWidth - ((this.items.length - 1) * 16)) / this.items.length;
width = Math.min(Math.max(width, 24), 96);
this.config.thumbHeight = width;
this.config.thumbWidth = (width + 16);
}
else {
let height = (this.galleryHeight - ((this.items.length - 1) * 16)) / this.items.length;
height = Math.min(Math.max(height, 24), 96);
this.config.thumbHeight = (height + 16);
this.config.thumbWidth = height;
}
this.config.thumbPosition = this.isVertical ?
ThumbnailsPosition.Bottom : this.layoutService.isRtl() ?
ThumbnailsPosition.Right : ThumbnailsPosition.Left;
this.config.slidingDirection = this.key !== 'ItemFilmstripImages' ? 'horizontal' : this.isVertical ? 'horizontal' : 'vertical';
}
}
PepperiImagesFilmstripComponent.ɵfac = function PepperiImagesFilmstripComponent_Factory(t) { return new (t || PepperiImagesFilmstripComponent)(i0.ɵɵdirectiveInject(i1.CustomizationService), i0.ɵɵdirectiveInject(i2.DialogService), i0.ɵɵdirectiveInject(i1.LayoutService), i0.ɵɵdirectiveInject(i1.FileService), i0.ɵɵdirectiveInject(i3.Gallery), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
PepperiImagesFilmstripComponent.ɵcmp = i0.ɵɵdefineComponent({ type: PepperiImagesFilmstripComponent, selectors: [["pep-images-filmstrip"]], viewQuery: function PepperiImagesFilmstripComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, true);
i0.ɵɵviewQuery(_c1, true);
i0.ɵɵviewQuery(_c2, true, TemplateRef);
i0.ɵɵviewQuery(_c3, true);
} if (rf & 2) {
var _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.arrowRightTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.galleryCont = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.galleryDialogTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.galleryDialogCont = _t.first);
} }, inputs: { value: "value", key: "key", label: "label", xAlignment: "xAlignment", rowSpan: "rowSpan", form: "form", objectId: "objectId", showTitle: "showTitle", layoutType: "layoutType", currIndex: "currIndex", showThumbnails: "showThumbnails", items: "items" }, decls: 10, vars: 10, consts: [[3, "formGroup"], [1, "images-filmstrip-container"], [3, "label", "xAlignment", "showTitle"], [1, "img-wrapper", 3, "ngClass"], ["galleryCont", ""], [3, "id", "autoPlay", "itemClick", "indexChange", "error"], ["galleryDialogTemplate", ""], ["itemTemplate", ""], ["mat-dialog-title", "", 1, "pepperi-border-bottom"], [1, "pull-left", "flip"], ["mat-button", "", 1, "pepperi-button", "icon-button", "md", "weak", "pull-right", "flip", 3, "mat-dialog-close"], ["name", "system_close"], ["mat-dialog-content", ""], ["galleryDialogCont", ""], [3, "id", "itemTemplate", "autoPlay", "counter", "indexChange", "error"], ["class", "item-text", 4, "ngIf"], [1, "item-text"]], template: function PepperiImagesFilmstripComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0, 0);
i0.ɵɵelementStart(1, "div", 1);
i0.ɵɵelement(2, "pep-field-title", 2);
i0.ɵɵelementStart(3, "div", 3, 4);
i0.ɵɵelementStart(5, "gallery", 5);
i0.ɵɵlistener("itemClick", function PepperiImagesFilmstripComponent_Template_gallery_itemClick_5_listener($event) { return ctx.enlargeImage($event); })("indexChange", function PepperiImagesFilmstripComponent_Template_gallery_indexChange_5_listener($event) { return ctx.indexChange($event); })("error", function PepperiImagesFilmstripComponent_Template_gallery_error_5_listener($event) { return ctx.onError($event); });
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
i0.ɵɵtemplate(6, PepperiImagesFilmstripComponent_ng_template_6_Template, 9, 9, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
i0.ɵɵtemplate(8, PepperiImagesFilmstripComponent_ng_template_8_Template, 1, 1, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
i0.ɵɵproperty("formGroup", ctx.form);
i0.ɵɵadvance(2);
i0.ɵɵproperty("label", ctx.label)("xAlignment", ctx.xAlignment)("showTitle", ctx.showTitle);
i0.ɵɵadvance(1);
i0.ɵɵstyleProp("height", ctx.fieldHeight);
i0.ɵɵproperty("ngClass", ctx.isVertical ? "vertical-gallery" : "horizontal-gallery");
i0.ɵɵadvance(2);
i0.ɵɵpropertyInterpolate2("id", "", ctx.key, "-", ctx.objectId, "-gallery");
i0.ɵɵproperty("autoPlay", false);
} }, directives: [i4.NgControlStatusGroup, i4.FormGroupDirective, i5.PepperiFieldTitleComponent, i6.NgClass, i3.GalleryComponent, i7.MatDialogTitle, i7.MatDialogClose, i8.MatIcon, i9.PepperiIconComponent, i7.MatDialogContent, i6.NgIf], styles: ["[_nghost-%COMP%]{display:-ms-grid;display:grid;height:inherit;width:100%}[_nghost-%COMP%] > *[_ngcontent-%COMP%]{-ms-grid-row-align:center;align-self:center}.images-filmstrip-container[_ngcontent-%COMP%]{height:100%}.images-filmstrip-container[_ngcontent-%COMP%] .img-wrapper[_ngcontent-%COMP%], gallery[_ngcontent-%COMP%]{height:calc(100% - 1.5rem)}gallery[_ngcontent-%COMP%]{min-height:calc(100% - 1.5rem)}.mat-dialog-content[_ngcontent-%COMP%]{max-height:80vh;min-height:80vh}.mat-dialog-content[_ngcontent-%COMP%] gallery[_ngcontent-%COMP%]{min-height:calc(100% - 50px);min-width:65vw} gallery-thumbs{margin:0 var(--pep-spacing-lg,1rem) 0 var(--pep-spacing-sm,.5rem)} gallery-thumbs gallery-thumb{border-radius:var(--pep-border-radius-md,.25rem);margin:var(--pep-spacing-sm,.5rem) 0;padding:0!important} gallery-thumbs gallery-thumb .g-image-item{background-size:cover} gallery-item gallery-image .g-image-item{border-radius:var(--pep-border-radius-lg,.5rem)} gallery-item:hover{cursor:pointer} gallery-dots{border-radius:var(--pep-border-radius-md,.25rem);position:absolute!important} gallery-dots.pepperi-button{display:flex!important} .img-container{align-items:center;display:flex} .g-nav-next, .g-nav-prev{border-radius:var(--pep-border-radius-md,.25rem);height:2rem!important;padding:.25rem;width:2rem!important} .g-nav-next .mat-icon, .g-nav-prev .mat-icon{display:inline-block!important} .g-nav-prev{transform:translateY(-50%) perspective(1px) scaleX(-1)!important}.vertical-gallery[_ngcontent-%COMP%] gallery-thumbs{margin:var(--pep-spacing-lg,1rem) 0 var(--pep-spacing-sm,.5rem) 0}.vertical-gallery[_ngcontent-%COMP%] gallery-thumbs gallery-thumb{margin:0 var(--pep-spacing-sm,.5rem)}"], data: { animation: [slideInAnimation] } });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(PepperiImagesFilmstripComponent, [{
type: Component,
args: [{
selector: 'pep-images-filmstrip',
templateUrl: './images-filmstrip.component.html',
styleUrls: ['./images-filmstrip.component.scss'],
animations: [slideInAnimation]
}]
}], function () { return [{ type: i1.CustomizationService }, { type: i2.DialogService }, { type: i1.LayoutService }, { type: i1.FileService }, { type: i3.Gallery }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, { arrowRightTemplate: [{
type: ViewChild,
args: ['arrowRightTemplate']
}], value: [{
type: Input
}], key: [{
type: Input
}], label: [{
type: Input
}], xAlignment: [{
type: Input
}], rowSpan: [{
type: Input
}], form: [{
type: Input
}], objectId: [{
type: Input
}], showTitle: [{
type: Input
}], layoutType: [{
type: Input
}], currIndex: [{
type: Input
}], showThumbnails: [{
type: Input
}], items: [{
type: Input
}], galleryCont: [{
type: ViewChild,
args: ['galleryCont']
}], galleryDialogTemplate: [{
type: ViewChild,
args: ['galleryDialogTemplate', { read: TemplateRef }]
}], galleryDialogCont: [{
type: ViewChild,
args: ['galleryDialogCont']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLWZpbG1zdHJpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wZXBwZXJpLWxpYi9pbWFnZXMtZmlsbXN0cmlwL2ltYWdlcy1maWxtc3RyaXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGVwcGVyaS1saWIvaW1hZ2VzLWZpbG1zdHJpcC9pbWFnZXMtZmlsbXN0cmlwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQUUsU0FBUyxFQUFnRCxLQUFLLEVBQ3pFLFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBMEIsa0JBQWtCLEVBQWUsU0FBUyxFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFDbkgsT0FBTyxFQUFFLG9CQUFvQixFQUEyQyxNQUFNLGNBQWMsQ0FBQztBQUU3RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc3RCxPQUFPLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNHZCw2QkFDSTtJQUFBLCtCQUE2QjtJQUFBLFlBQVc7SUFBQSxpQkFBTztJQUMvQyxrQ0FDSTtJQUFBLGdDQUNJO0lBQUEsK0JBQ1c7SUFDZixpQkFBVztJQUNmLGlCQUFTO0lBQ2IsaUJBQUs7SUFDTCxtQ0FDSTtJQUFBLG1DQUVVO0lBRE4scU9BQW1DLHdNQUFBO0lBQ3ZDLGlCQUFVO0lBQ2QsaUJBQU07Ozs7SUFaMkIsZUFBVztJQUFYLGtDQUFXO0lBQ3JCLGVBQXlCO0lBQXpCLHVDQUF5QjtJQVNKLGVBQTBCO0lBQTFCLHNDQUEwQjtJQUR6RCxvRkFBb0M7SUFBQyxrQ0FBNkIsbUJBQUEsa0JBQUE7OztJQVMvRSxn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QUVmLGlJQUNJO1FBa0JKLGlJQUNJOztRQWpDVSxvQ0FBa0I7UUFFUCxlQUFlO1FBQWYsaUNBQWUsOEJBQUEsNEJBQUE7UUFHNUIsZUFBNEI7UUFBNUIseUNBQTRCO1FBRE0sb0ZBQWtFO1FBRTNGLGVBQWlDO1FBQWpDLDJFQUFpQztRQUFDLGdDQUFrQjs4OEREK0J6RCxDQUFDLGdCQUFnQixDQUFDO2tEQUVyQiwrQkFBK0I7Y0FOM0MsU0FBUztlQUFDO2dCQUNQLFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLFdBQVcsRUFBRSxtQ0FBbUM7Z0JBQ2hELFNBQVMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDO2dCQUNoRCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNqQztnUUFFb0Msa0JBQWtCO2tCQUFsRCxTQUFTO21CQUFDLG9CQUFvQjtZQUd0QixLQUFLO2tCQUFiLEtBQUs7WUFDRyxHQUFHO2tCQUFYLEtBQUs7WUFDRyxLQUFLO2tCQUFiLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBSUcsSUFBSTtrQkFBWixLQUFLO1lBQ0csUUFBUTtrQkFBaEIsS0FBSztZQUNHLFNBQVM7a0JBQWpCLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csU0FBUztrQkFBakIsS0FBSztZQUNHLGNBQWM7a0JBQXRCLEtBQUs7WUFDRyxLQUFLO2tCQUFiLEtBQUs7WUFFb0IsV0FBVztrQkFBcEMsU0FBUzttQkFBQyxhQUFhO1lBQ21DLHFCQUFxQjtrQkFBL0UsU0FBUzttQkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7WUFDekIsaUJBQWlCO2tCQUFoRCxTQUFTO21CQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIFZpZXdDaGlsZCwgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LFxyXG4gICAgVGVtcGxhdGVSZWYsIFJlbmRlcmVyMiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEluamVjdCwgT3B0aW9uYWwsIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IEdhbGxlcnksIEdhbGxlcnlDb25maWcsIFRodW1ibmFpbHNQb3NpdGlvbiwgR2FsbGVyeUl0ZW0sIEltYWdlSXRlbSwgR2FsbGVyeVJlZiB9IGZyb20gJ0BuZ3gtZ2FsbGVyeS9jb3JlJztcclxuaW1wb3J0IHsgQ3VzdG9taXphdGlvblNlcnZpY2UsIExBWU9VVF9UWVBFLCBMYXlvdXRTZXJ2aWNlLCBGaWxlU2VydmljZSB9IGZyb20gJ0BwZXBwZXJpL2xpYic7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAcGVwcGVyaS9saWIvZGlhbG9nJztcclxuaW1wb3J0IHsgcGVwcGVyaUljb25BcnJvd1JpZ2h0QWx0IH0gZnJvbSAnQHBlcHBlcmkvbGliL2ljb24nO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgJ2hhbW1lcmpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VzRmlsbXN0cmlwRGlhbG9nRGF0YSB7XHJcbiAgICBrZXk6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgY3VyckluZGV4OiBudW1iZXI7XHJcbiAgICBzaG93VGh1bWJuYWlsczogYm9vbGVhbjtcclxuICAgIG9iamVjdElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzbGlkZUluQW5pbWF0aW9uID0gdHJpZ2dlcignc2xpZGVBbmltYXRpb24nLCBbXHJcbiAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknLCBvcGFjaXR5OiAxIH0pKSxcclxuICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTEwMCUpJywgb3BhY2l0eTogMCB9KSxcclxuICAgICAgICBhbmltYXRlKDQwMClcclxuICAgIF0pLFxyXG4gICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xyXG4gICAgICAgIGFuaW1hdGUoNDAwLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTEwMCUpJywgb3BhY2l0eTogMCB9KSlcclxuICAgIF0pXHJcbl0pO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3BlcC1pbWFnZXMtZmlsbXN0cmlwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbWFnZXMtZmlsbXN0cmlwLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2ltYWdlcy1maWxtc3RyaXAuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGFuaW1hdGlvbnM6IFtzbGlkZUluQW5pbWF0aW9uXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVwcGVyaUltYWdlc0ZpbG1zdHJpcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBWaWV3Q2hpbGQoJ2Fycm93UmlnaHRUZW1wbGF0ZScpIGFycm93UmlnaHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIC8vIEBWaWV3Q2hpbGQoJ25neFZpZXdlckltYWdlJykgbmd4Vmlld2VySW1hZ2U6IGFueTsgLy8gVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0byB1c2UgdGhpcz8/XHJcblxyXG4gICAgQElucHV0KCkgdmFsdWUgPSAnJztcclxuICAgIEBJbnB1dCgpIGtleSA9ICcnO1xyXG4gICAgQElucHV0KCkgbGFiZWwgPSAnJztcclxuICAgIEBJbnB1dCgpIHhBbGlnbm1lbnQgPSAnMCc7XHJcbiAgICBASW5wdXQoKSByb3dTcGFuID0gMTtcclxuXHJcbiAgICBjb250cm9sVHlwZSA9ICdpbWFnZXMnO1xyXG5cclxuICAgIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cCA9IG51bGw7XHJcbiAgICBASW5wdXQoKSBvYmplY3RJZCA9IG51bGw7XHJcbiAgICBASW5wdXQoKSBzaG93VGl0bGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGxheW91dFR5cGU6IExBWU9VVF9UWVBFLlBlcHBlcmlGb3JtO1xyXG4gICAgQElucHV0KCkgY3VyckluZGV4ID0gMDtcclxuICAgIEBJbnB1dCgpIHNob3dUaHVtYm5haWxzID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBpdGVtczogR2FsbGVyeUl0ZW1bXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdnYWxsZXJ5Q29udCcpIGdhbGxlcnlDb250OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnZ2FsbGVyeURpYWxvZ1RlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSBnYWxsZXJ5RGlhbG9nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdnYWxsZXJ5RGlhbG9nQ29udCcpIGdhbGxlcnlEaWFsb2dDb250OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGNvbmZpZzogR2FsbGVyeUNvbmZpZztcclxuXHJcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICBmaWVsZEhlaWdodCA9ICcnO1xyXG4gICAgc3RhbmRBbG9uZSA9IGZhbHNlO1xyXG5cclxuICAgIGdhbGxlcnlXaWR0aCA9IDA7XHJcbiAgICBnYWxsZXJ5SGVpZ2h0O1xyXG4gICAgaXNWZXJ0aWNhbCA9IGZhbHNlO1xyXG4gICAgZ2FsbGVyeVJlZjogR2FsbGVyeVJlZjtcclxuICAgIGRpYWxvZ0dhbGxlcnlSZWY6IEdhbGxlcnlSZWY7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21pemF0aW9uU2VydmljZTogQ3VzdG9taXphdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGdhbGxlcnk6IEdhbGxlcnksXHJcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgICAgICAgIC8vIGxvYWRpbmdNb2RlOiAnaW5kZXRlcm1pbmF0ZScsXHJcbiAgICAgICAgICAgIGF1dG9QbGF5OiBmYWxzZSxcclxuICAgICAgICAgICAgaW1hZ2VTaXplOiAnY29udGFpbicsXHJcbiAgICAgICAgICAgIGxvYWRpbmdTdHJhdGVneTogJ2xhenknLFxyXG4gICAgICAgICAgICBnZXN0dXJlczogdHJ1ZSwgLy8gVXNlIHRvdWNoIGV2ZW50cyAocmVxdWlyZXMgaGFtbWVyLmpzKVxyXG4gICAgICAgICAgICBsb29wOiB0cnVlLFxyXG4gICAgICAgICAgICBkb3RzOiBmYWxzZSxcclxuICAgICAgICAgICAgbmF2OiBmYWxzZSwgLy8gU2hvdyBuYXZpZ2F0aW9uIGJ1dHRvbnNcclxuICAgICAgICAgICAgY291bnRlcjogZmFsc2UgLy8gU2hvdyBjb3VudGVyXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5mb3JtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhbmRBbG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0RGVmYXVsdEZyb21Hcm91cCh0aGlzLmtleSwgdGhpcy52YWx1ZSwgdGhpcy5yZXF1aXJlZCwgdGhpcy5yZWFkb25seSwgdGhpcy5kaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBDdXN0b21pemF0aW9uU2VydmljZS5TVEFORF9BTE9ORV9GSUVMRF9DTEFTU19OQU1FKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmllbGRIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmNhbGN1bGF0ZUZpZWxkSGVpZ2h0KHRoaXMubGF5b3V0VHlwZSwgdGhpcy5yb3dTcGFuLCB0aGlzLnN0YW5kQWxvbmUpO1xyXG5cclxuICAgICAgICBjb25zdCBpbWdBcnIgPSB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zcGxpdCgnOycpIDogW107XHJcbiAgICAgICAgLy8gYWRkIE5vIGltYWdlIGltYWdlIHdoZW4gdGhlcmUgaXMgbm8gaW1hZ2VzXHJcbiAgICAgICAgaWYgKGltZ0Fyci5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9JbWFnZVNyYyA9IHRoaXMuZmlsZVNlcnZpY2UuZ2V0Tm9JbWFnZVBhdGgoKTtcclxuICAgICAgICAgICAgaW1nQXJyLnB1c2gobm9JbWFnZVNyYyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1zID0gaW1nQXJyLm1hcChpbWcgPT4gbmV3IEltYWdlSXRlbSh7IHNyYzogaW1nLCB0aHVtYjogaW1nIH0pKTtcclxuICAgICAgICB0aGlzLmNvbmZpZy5kb3RzID0gdGhpcy5jb25maWcubmF2ID0gdGhpcy5pdGVtcy5sZW5ndGggPiAxO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLnRodW1iID0gKHRoaXMua2V5ID09PSAnSXRlbUZpbG1zdHJpcEltYWdlcycgfHwgdGhpcy5zaG93VGh1bWJuYWlscykgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAxID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29uZmlnLm5hdkljb24gPSBwZXBwZXJpSWNvbkFycm93UmlnaHRBbHQuZGF0YTtcclxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9XHJcbiAgICAgICAgICAgIHRoaXMua2V5ID09PSAnSXRlbUZpbG1zdHJpcEltYWdlcycgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID09PSAwICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmxlbmd0aCA+IDEgP1xyXG4gICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLml0ZW1zLmxlbmd0aCAvIDIpIC0gMSA6IHRoaXMuY3VyckluZGV4O1xyXG5cclxuICAgICAgICB0aGlzLmdhbGxlcnlSZWYgPSB0aGlzLmdhbGxlcnkucmVmKHRoaXMua2V5ICsgJy0nICsgdGhpcy5vYmplY3RJZCArICctZ2FsbGVyeScpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRHYWxsZXJ5U3R5bGUodGhpcy5nYWxsZXJ5Q29udCwgdGhpcy5nYWxsZXJ5UmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5nYWxsZXJ5UmVmKSB7IHRoaXMuZ2FsbGVyeVJlZi5kZXN0cm95KCk7IH1cclxuICAgICAgICBpZiAodGhpcy5kaWFsb2dHYWxsZXJ5UmVmKSB7IHRoaXMuZGlhbG9nR2FsbGVyeVJlZi5kZXN0cm95KCk7IH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0R2FsbGVyeVN0eWxlKGdhbGxlcnlDb250YWluZXIsIGdhbGxlcnlSZWYpOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGh1bWJuYWlscyBwb3NpdGlvbiBhbmQgc2xpZGluZyBkaXJlY3Rpb25cclxuICAgICAgICB0aGlzLnNldFRodW1ibmFpbERpbWVuc2lvbihnYWxsZXJ5Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgZ2FsbGVyeVJlZi5zZXRDb25maWcodGhpcy5jb25maWcpO1xyXG4gICAgICAgIGdhbGxlcnlSZWYubG9hZCh0aGlzLml0ZW1zKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5jdXJySW5kZXg7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcclxuICAgICAgICAgICAgZ2FsbGVyeVJlZi5zZXQoY3VycmVudEluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5kZXhDaGFuZ2UoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSBpdGVtLmN1cnJJbmRleDtcclxuICAgICAgICAvLyBpZiAodGhpcy5uZ3hWaWV3ZXJJbWFnZSAmJiB0aGlzLm5neFZpZXdlckltYWdlLnNjYWxlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMubmd4Vmlld2VySW1hZ2Uuc2NhbGUgPSAxO1xyXG4gICAgICAgIC8vICAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRXJyb3IoZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5vSW1hZ2VTcmMgPSB0aGlzLmZpbGVTZXJ2aWNlLmdldE5vSW1hZ2VQYXRoKCk7XHJcbiAgICAgICAgY29uc3Qgbm9pbWcgPSBuZXcgSW1hZ2VJdGVtKHsgc3JjOiBub0ltYWdlU3JjLCB0aHVtYjogbm9JbWFnZVNyYyB9KTtcclxuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShlLml0ZW1JbmRleCwgMSwgbm9pbWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGVubGFyZ2VJbWFnZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5EaWFsb2codGhpcy5nYWxsZXJ5RGlhbG9nVGVtcGxhdGUpO1xyXG5cclxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyRGlhbG9nT3BlbmVkKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSBjdXJyZW50SW5kZXggaW4gZ2FsbGVyeVJlZlxyXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2FsbGVyeVJlZi5zZXQodGhpcy5jdXJySW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFmdGVyRGlhbG9nT3BlbmVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nR2FsbGVyeVJlZiA9IHRoaXMuZ2FsbGVyeS5yZWYodGhpcy5rZXkgKyAnLScgKyB0aGlzLm9iamVjdElkICsgJy1kbGdHYWxsZXJ5Jyk7XHJcbiAgICAgICAgdGhpcy5pbml0R2FsbGVyeVN0eWxlKHRoaXMuZ2FsbGVyeURpYWxvZ0NvbnQsIHRoaXMuZGlhbG9nR2FsbGVyeVJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGh1bWJuYWlsRGltZW5zaW9uKGdhbGxlcnlDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdhbGxlcnlXaWR0aCA9IGdhbGxlcnlDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICB0aGlzLmdhbGxlcnlIZWlnaHQgPSBnYWxsZXJ5Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLmlzVmVydGljYWwgPSB0aGlzLmdhbGxlcnlXaWR0aCA8IHRoaXMuZ2FsbGVyeUhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5nYWxsZXJ5V2lkdGggLSAoKHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgKiAxNikpIC8gdGhpcy5pdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgod2lkdGgsIDI0KSwgOTYpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25maWcudGh1bWJIZWlnaHQgPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcudGh1bWJXaWR0aCA9ICh3aWR0aCArIDE2KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuZ2FsbGVyeUhlaWdodCAtICgodGhpcy5pdGVtcy5sZW5ndGggLSAxKSAqIDE2KSkgLyB0aGlzLml0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oTWF0aC5tYXgoaGVpZ2h0LCAyNCksIDk2KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRodW1iSGVpZ2h0ID0gKGhlaWdodCArIDE2KTtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcudGh1bWJXaWR0aCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlnLnRodW1iUG9zaXRpb24gPSB0aGlzLmlzVmVydGljYWwgP1xyXG4gICAgICAgICAgICBUaHVtYm5haWxzUG9zaXRpb24uQm90dG9tIDogdGhpcy5sYXlvdXRTZXJ2aWNlLmlzUnRsKCkgP1xyXG4gICAgICAgICAgICAgICAgVGh1bWJuYWlsc1Bvc2l0aW9uLlJpZ2h0IDogVGh1bWJuYWlsc1Bvc2l0aW9uLkxlZnQ7XHJcbiAgICAgICAgdGhpcy5jb25maWcuc2xpZGluZ0RpcmVjdGlvbiA9IHRoaXMua2V5ICE9PSAnSXRlbUZpbG1zdHJpcEltYWdlcycgPyAnaG9yaXpvbnRhbCcgOiB0aGlzLmlzVmVydGljYWwgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNjcm9sbEZ1bmN0aW9uKGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGUuZGVsdGFZID4gMCA/IHRoaXMuem9vbU91dCgpIDogdGhpcy56b29tSW4oKTtcclxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gem9vbUluKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLm5neFZpZXdlckltYWdlLnNjYWxlIDwgMikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLm5neFZpZXdlckltYWdlLnNjYWxlICo9ICgxICsgdGhpcy5uZ3hWaWV3ZXJJbWFnZS5jb25maWcuem9vbUZhY3Rvcik7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgdGhpcy5uZ3hWaWV3ZXJJbWFnZS5zY2FsZSA9IDI7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyB6b29tT3V0KCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLm5neFZpZXdlckltYWdlLnNjYWxlID4gdGhpcy5uZ3hWaWV3ZXJJbWFnZS5jb25maWcuem9vbUZhY3Rvcikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLm5neFZpZXdlckltYWdlLnNjYWxlIC89ICgxICsgdGhpcy5uZ3hWaWV3ZXJJbWFnZS5jb25maWcuem9vbUZhY3Rvcik7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVN0eWxlKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMubmd4Vmlld2VySW1hZ2Uuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3RoaXMubmd4Vmlld2VySW1hZ2UudHJhbnNsYXRlWH1weCxcclxuICAgIC8vICAgICAgICAgJHt0aGlzLm5neFZpZXdlckltYWdlLnRyYW5zbGF0ZVl9cHgpIHJvdGF0ZSgke3RoaXMubmd4Vmlld2VySW1hZ2Uucm90YXRpb259ZGVnKSBzY2FsZSgke3RoaXMubmd4Vmlld2VySW1hZ2Uuc2NhbGV9KWA7XHJcblxyXG4gICAgLy8gICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgLy8gfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VzLWZpbG1zdHJpcC1jb250YWluZXJcIj5cclxuICAgICAgICA8cGVwLWZpZWxkLXRpdGxlIFtsYWJlbF09XCJsYWJlbFwiIFt4QWxpZ25tZW50XT1cInhBbGlnbm1lbnRcIiBbc2hvd1RpdGxlXT1cInNob3dUaXRsZVwiPlxyXG4gICAgICAgIDwvcGVwLWZpZWxkLXRpdGxlPlxyXG4gICAgICAgIDxkaXYgI2dhbGxlcnlDb250IGNsYXNzPVwiaW1nLXdyYXBwZXJcIiBbbmdDbGFzc109XCJpc1ZlcnRpY2FsID8gJ3ZlcnRpY2FsLWdhbGxlcnknIDogJ2hvcml6b250YWwtZ2FsbGVyeSdcIlxyXG4gICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImZpZWxkSGVpZ2h0XCI+XHJcbiAgICAgICAgICAgIDxnYWxsZXJ5IGlkPVwie3trZXl9fS17e29iamVjdElkfX0tZ2FsbGVyeVwiIFthdXRvUGxheV09XCJmYWxzZVwiIChpdGVtQ2xpY2spPVwiZW5sYXJnZUltYWdlKCRldmVudCk7XCJcclxuICAgICAgICAgICAgICAgIChpbmRleENoYW5nZSk9XCJpbmRleENoYW5nZSgkZXZlbnQpXCIgKGVycm9yKT1cIm9uRXJyb3IoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L2dhbGxlcnk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI2dhbGxlcnlEaWFsb2dUZW1wbGF0ZT5cclxuICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwicGVwcGVyaS1ib3JkZXItYm90dG9tXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwdWxsLWxlZnQgZmxpcFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCIgY2xhc3M9XCJwZXBwZXJpLWJ1dHRvbiBpY29uLWJ1dHRvbiBtZCB3ZWFrIHB1bGwtcmlnaHQgZmxpcFwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8cGVwLWljb24gbmFtZT1cInN5c3RlbV9jbG9zZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9wZXAtaWNvbj5cclxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvaDI+XHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudCAjZ2FsbGVyeURpYWxvZ0NvbnQ+XHJcbiAgICAgICAgPGdhbGxlcnkgaWQ9XCJ7e2tleX19LXt7b2JqZWN0SWR9fS1kbGdHYWxsZXJ5XCIgW2l0ZW1UZW1wbGF0ZV09XCJpdGVtVGVtcGxhdGVcIiBbYXV0b1BsYXldPVwiZmFsc2VcIiBbY291bnRlcl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIChpbmRleENoYW5nZSk9XCJpbmRleENoYW5nZSgkZXZlbnQpXCIgW3N0eWxlLmhlaWdodC5weF09XCInYXV0bydcIiAoZXJyb3IpPVwib25FcnJvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9nYWxsZXJ5PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBBZGQgY3VzdG9tIHRlbXBsYXRlIHRvIGltYWdlIGl0ZW1zIC0tPlxyXG48bmctdGVtcGxhdGUgI2l0ZW1UZW1wbGF0ZSBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC10eXBlPVwidHlwZVwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC1jdXJySW5kZXg9XCJjdXJySW5kZXhcIj5cclxuICAgIDxzcGFuICpuZ0lmPVwidHlwZSA9PT0gJ2ltYWdlJyAmJiBpbmRleCA9PT0gY3VyckluZGV4XCIgW0BzbGlkZUFuaW1hdGlvbl0gY2xhc3M9XCJpdGVtLXRleHRcIj5cclxuICAgICAgICB7e2RhdGE/LnRpdGxlfX1cclxuICAgIDwvc3Bhbj5cclxuICAgIDwhLS0gPG5neC1pbWFnZS12aWV3ZXJcclxuXHRcdCpuZ0lmPVwiZGF0YS5pbmRleCA9PT0gY3VycmVudEluZGV4XCJcclxuXHRcdCNuZ3hWaWV3ZXJJbWFnZVxyXG5cdFx0W2NvbmZpZ109XCJ7IGJ0blNob3c6e3pvb21JbjogZmFsc2UsIHpvb21PdXQ6IGZhbHNlIH19XCJcclxuXHRcdFtzcmNdPVwiW2RhdGEuc3JjXVwiXHJcblx0XHQod2hlZWwpPVwic2Nyb2xsRnVuY3Rpb24oJGV2ZW50KVwiPlxyXG5cdDwvbmd4LWltYWdlLXZpZXdlcj4gLS0+XHJcbjwvbmctdGVtcGxhdGU+Il19