@sumaris-net/ngx-components 18.3.5 → 18.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -333,11 +333,11 @@ export class AppImageGalleryComponent {
333
333
  this.cd.markForCheck();
334
334
  }
335
335
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AppImageGalleryComponent, deps: [{ token: i1.ImageService }, { token: i2.Platform }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
336
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: "debug", disabled: "disabled", readOnly: "readOnly", mobile: "mobile", mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: "showToolbar", showFabButton: "showFabButton", showTitle: "showTitle", showAddCardButton: "showAddCardButton", addButtonColor: "addButtonColor", dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }, { propertyName: "swiperRef", first: true, predicate: ["modalSwiper"], descendants: true }], ngImport: i0, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-button (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i11.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
336
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: "debug", disabled: "disabled", readOnly: "readOnly", mobile: "mobile", mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: "showToolbar", showFabButton: "showFabButton", showTitle: "showTitle", showAddCardButton: "showAddCardButton", addButtonColor: "addButtonColor", dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }, { propertyName: "swiperRef", first: true, predicate: ["modalSwiper"], descendants: true }], ngImport: i0, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container ion-padding-bottom {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-button (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i2.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }, { kind: "component", type: i2.IonSegment, selector: "ion-segment", inputs: ["color", "disabled", "mode", "scrollable", "selectOnFocus", "swipeGesture", "value"] }, { kind: "component", type: i2.IonSegmentButton, selector: "ion-segment-button", inputs: ["disabled", "layout", "mode", "type", "value"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "component", type: i2.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i10.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i11.NgInitDirective, selector: "[ngInit]", outputs: ["ngInit"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.ArrayLengthPipe, name: "isArrayLength" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
337
337
  }
338
338
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AppImageGalleryComponent, decorators: [{
339
339
  type: Component,
340
- args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-button (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"] }]
340
+ args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ion-toolbar color=\"light\" *ngIf=\"showToolbar\">\n <!-- Add -->\n <button\n mat-icon-button\n *ngIf=\"!readOnly && !mobile && enabled\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <ion-buttons slot=\"end\">\n <!-- Toggle view mode -->\n <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n <ion-segment-button [value]=\"4\">\n <mat-icon>view_module</mat-icon>\n </ion-segment-button>\n <ion-segment-button [value]=\"12\">\n <mat-icon>view_list</mat-icon>\n </ion-segment-button>\n </ion-segment>\n </ion-buttons>\n</ion-toolbar>\n\n<div class=\"gallery-container ion-padding-bottom {{ this.mode }}\">\n <div *ngIf=\"mobile && zoomActive\" class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; index as index; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickRow(row, index)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n <ion-toolbar color=\"transparent\" class=\"title\" *ngIf=\"image.title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n\n <!-- action toolbar (desktop only) shown when hover image -->\n <ion-toolbar #cardToolbar *ngIf=\"!mobile && !readOnly\" color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n <button\n mat-button\n *ngIf=\"showTitle\"\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"showCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n <span *ngIf=\"row.currentData.title | isNotNilOrBlank; else editLabel\" translate>\n IMAGE.GALLERY.BTN_EDIT_TITLE\n </span>\n <ng-template #editLabel>\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n </ng-template>\n </mat-label>\n </button>\n\n <div class=\"flex-spacer\"></div>\n\n <!-- delete button -->\n <button\n mat-icon-button\n slot=\"end\"\n class=\"ion-float-end\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n [disabled]=\"disabled\"\n (click)=\"delete($event, row)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </ion-toolbar>\n </ion-card>\n </ion-col>\n\n <ion-col *ngIf=\"showAddCardButton && !readOnly\" [size]=\"_colSize\" @fadeInAnimation>\n <ion-card class=\"image-card-button\" color=\"light\" (click)=\"add($event)\" [disabled]=\"disabled\" tappable>\n <ion-card-content>\n <div class=\"icon-container\">\n <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n </div>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n</div>\n\n<!-- FAB button: add -->\n<ion-fab\n slot=\"fixed\"\n vertical=\"bottom\"\n horizontal=\"end\"\n *ngIf=\"showFabButton && !readOnly\"\n [class.cdk-visually-hidden]=\"disabled\"\n @fadeInOutAnimation\n>\n <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n <ion-icon name=\"camera\"></ion-icon>\n <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n\n<!-- Zoom modal -->\n<ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <ion-content class=\"ion-no-padding ion-no-margin\">\n @let count = rows?.length || 0;\n <!-- Counter -->\n <div class=\"top-left\">\n <ion-label color=\"light\">{{ activeSlideIndex + 1 }} / {{ count }}</ion-label>\n </div>\n\n <!-- zoom button -->\n <div class=\"top-right\">\n @if (!mobile) {\n <ion-button (click)=\"zoom(modalSwiper, true)\" color=\"light\">\n <ion-icon slot=\"icon-only\" name=\"add\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"zoom(modalSwiper, false)\" color=\"light\">\n <ion-icon name=\"remove\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </div>\n\n <!-- navigation side buttons next/back -->\n <ng-container *ngIf=\"!mobile && (rows | isArrayLength: { greaterThan: 1 })\">\n <div class=\"side-buttons prev\" (click)=\"slidePrev(modalSwiper)\">\n <ion-icon name=\"chevron-back\"></ion-icon>\n </div>\n <div class=\"side-buttons next\" (click)=\"slideNext(modalSwiper)\">\n <ion-icon name=\"chevron-forward\"></ion-icon>\n </div>\n </ng-container>\n\n <!-- image slides -->\n <swiper-container #modalSwiper [modules]=\"swiperModules\" [zoom]=\"true\">\n <swiper-slide *ngFor=\"let row of rows; last as last\">\n <div\n class=\"swiper-zoom-container\"\n *ngIf=\"row | propertyGet: 'currentData'; let image\"\n (ngInit)=\"last && initModalSlides(modalSwiper)\"\n >\n <ion-img [src]=\"image.url || image.dataUrl\" />\n </div>\n </swiper-slide>\n </swiper-container>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar color=\"light\">\n <ion-row>\n <ion-col size=\"4\" class=\"ion-text-start\">\n <ion-button\n *ngIf=\"!readOnly\"\n (click)=\"deleteFromModal($event, modalSwiper)\"\n [disabled]=\"disabled\"\n fill=\"clear\"\n color=\"danger\"\n >\n <mat-icon slot=\"start\">delete</mat-icon>\n {{ 'COMMON.BTN_DELETE' | translate }}\n </ion-button>\n </ion-col>\n <ion-col size=\"4\"></ion-col>\n <ion-col size=\"4\" class=\"ion-text-end\">\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n <ng-template #desktop>\n <ion-button (click)=\"zoomModal.dismiss()\" color=\"tertiary\">\n {{ 'COMMON.BTN_CLOSE' | translate }}\n </ion-button>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-modal>\n\n<ion-popover #titlePopover>\n <ng-template>\n <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <form [formGroup]=\"_titleForm\">\n <mat-form-field floatLabel=\"auto\">\n <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n <input\n matInput\n formControlName=\"title\"\n [readonly]=\"disabled\"\n [appAutofocus]=\"_titleAutofocus\"\n (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n />\n </mat-form-field>\n </form>\n </ion-content>\n\n <ion-footer>\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col></ion-col>\n\n <ion-col size=\"auto\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n color=\"tertiary\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate\"\n >\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n </ion-footer>\n </ng-template>\n</ion-popover>\n", styles: [":host{--image-margin-inline: 10px}mat-toolbar,.mat-toolbar-single-row{padding:0;height:42px}ion-card{margin-left:unset;margin-right:unset;margin-inline:var(--image-margin-inline, 10px)}.image-slide{overflow:visible}.image-card{height:calc(100% - 23px);background-color:var(--ion-color-base);z-index:9;--img-scale: 1}.image-card .card-thumbnail{position:relative;overflow:hidden;display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:100%;height:100%}.image-card .card-thumbnail>ion-img{min-height:100%;transition:scale .2s ease-in-out;scale:var(--img-scale);max-height:var(--img-max-height)}.image-card.zoom-hover:hover{--img-scale: 1.2}.image-card ion-toolbar{--top-offset: calc(-1 * var(--ion-toolbar-height));position:absolute}.image-card ion-toolbar.title{--padding-start: 16px;--padding-end: 16px;--ion-color-base: rgba(0, 0, 0, .45) !important;position:absolute;top:calc(100% + var(--top-offset));transition:opacity .2s ease-in-out}.image-card ion-toolbar.title ion-label{color:#fff}.image-card ion-toolbar.buttons{--padding-start: 4px;--padding-end: 4px;--ion-color-base: var(--ion-color-light) !important;position:absolute;top:100%;transition:transform .2s ease-in-out}.image-card:hover ion-toolbar.buttons,.image-card ion-toolbar.buttons.focused{transform:translateY(var(--top-offset))}.image-card-button{height:calc(100% - var(--image-margin-inline, 0px) * 2 - 3px);transition:.2s ease-in-out;max-width:250px}.image-card-button ion-card-content{height:100%}.image-card-button .icon-container{height:auto;position:relative;top:calc(50% - 75px);display:flex;align-items:center;justify-content:center}.image-card-button ion-icon:first-of-type{font-size:150px;height:150px;position:relative;top:0}.image-card-button ion-icon.icon-secondary{font-size:50px;position:absolute;top:0;left:max(min(50% + 25px,100% - 50px),0px)}.image-card-button ion-button{float:right}.image-card-button:hover{--ion-color-base: var(--ion-color-shade) !important}.image-card-button:hover ion-icon{--ion-color-base: var(--ion-color-shade) !important}.backdrop{height:100vh;width:100vw;background:#000;position:absolute;z-index:10}.zoom-modal{-webkit-user-select:none;user-select:none}.zoom-modal .top-left{z-index:14;position:absolute;display:inline-grid;left:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .top-right{z-index:14;position:absolute;display:inline-grid;right:var(--ion-padding-start, 8px);top:var(--ion-padding-start, 8px)}.zoom-modal .side-buttons{--side-buttons-width: 120px;--side-buttons-margin: calc(var(--side-buttons-width) / 3);z-index:13;position:absolute;top:0;bottom:0;width:var(--side-buttons-width)}.zoom-modal .side-buttons ion-icon{top:50%;color:#fff;font-size:2.5rem;position:absolute;opacity:0;transition-duration:.15s;transition-timing-function:ease-in}.zoom-modal .side-buttons:hover{cursor:pointer}.zoom-modal .side-buttons:hover ion-icon{opacity:1}.zoom-modal .side-buttons.prev{left:0}.zoom-modal .side-buttons.prev ion-icon{left:var(--side-buttons-margin)}.zoom-modal .side-buttons.next{right:0}.zoom-modal .side-buttons.next ion-icon{right:var(--side-buttons-margin)}.zoom-modal ion-slides{height:100%;background:#000}\n"] }]
341
341
  }], ctorParameters: () => [{ type: i1.ImageService }, { type: i2.Platform }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i17.Environment, decorators: [{
342
342
  type: Optional
343
343
  }, {
@@ -385,4 +385,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
385
385
  }], onAfterEditRow: [{
386
386
  type: Output
387
387
  }] } });
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RixPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0sNENBQTRDLENBQUM7QUFHdEYsT0FBTyxFQUFtQixXQUFXLEVBQWtDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBb0IsWUFBWSxFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDckYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixF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U0FBUzt1QkFBQyxhQUFhO2dCQUVkLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50UGF0dGVybiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZURhdGFTb3VyY2UsIFRhYmxlRWxlbWVudCB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCwgRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgSW1hZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL2ltYWdlLm1vZGVsJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgSW9uaWNTbGlkZXMsIElvbk1vZGFsLCBJb25Qb3BvdmVyLCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7IGZhZGVJbkFuaW1hdGlvbiwgZmFkZUluT3V0QW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlld2VyLCBpc0RhdGFTb3VyY2UsIExpc3RSYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydHMgfSBmcm9tICcuLi8uLi9hbGVydHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXBwQ29sb3JzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXIsIGVtaXRQcm9taXNlRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgUHJlZGVmaW5lZENvbG9ycyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IFN3aXBlciB9IGZyb20gJ3N3aXBlci90eXBlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgR2FsbGVyeU1vZGUgPSAnbW9zYWljJyB8ICdsaXN0JztcblxuY29uc3QgR2FsbGVyeU1vZGVDb2xTaXplID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vc2FpYzogNCxcbiAgbGlzdDogMTIsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJU3dpcGVyIGV4dGVuZHMgU3dpcGVyIHtcbiAgYWN0aXZlSW5kZXg6IG51bWJlcjtcbiAgaW1hZ2VzTG9hZGVkOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb2xsZWN0aW9uVmlld2VyLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJvdGVjdGVkIF9kZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPjtcbiAgcHJvdGVjdGVkIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIF9zd2lwZXI6IFN3aXBlcjtcblxuICBwcm90ZWN0ZWQgc3dpcGVyTW9kdWxlcyA9IFtJb25pY1NsaWRlc107XG4gIHByb3RlY3RlZCB6b29tQWN0aXZlID0gZmFsc2U7XG4gIHByb3RlY3RlZCB6b29tU2NhbGUgPSAxO1xuXG4gIHZpZXdDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxMaXN0UmFuZ2U+O1xuXG4gIEBJbnB1dCgpIGNhcmRDb2xvcjogc3RyaW5nIHwgUHJlZGVmaW5lZENvbG9ycztcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW4gPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW4gPSBudWxsO1xuICBASW5wdXQoKSBtb2RlOiBHYWxsZXJ5TW9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93VG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dGYWJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dUaXRsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBZGRDYXJkQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkQnV0dG9uQ29sb3I6IEFwcENvbG9ycyA9ICd0ZXJ0aWFyeSc7XG5cbiAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQsIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgIT09IGRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG4gICAgfVxuICB9XG4gIGdldCBkYXRhU291cmNlKCk6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogVGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBhY3RpdmVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFN3aXBlcigpPy5hY3RpdmVJbmRleCB8fCAwO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnem9vbU1vZGFsJykgem9vbU1vZGFsOiBJb25Nb2RhbDtcbiAgQFZpZXdDaGlsZCgndGl0bGVQb3BvdmVyJykgdGl0bGVQb3BvdmVyOiBJb25Qb3BvdmVyO1xuICBAVmlld0NoaWxkKCdtb2RhbFN3aXBlcicpIHN3aXBlclJlZjogRWxlbWVudFJlZjtcblxuICBAT3V0cHV0KCkgb25CZWZvcmVEZWxldGVSb3dzID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyQWRkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+W10+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbWFnZTogSW1hZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBzdGFydDogMCwgZW5kOiBOdW1iZXIuTUFYX1ZBTFVFIH0pO1xuXG4gICAgLy8gREVWIGxvZ1xuICAgIHRoaXMuZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBpc01vYmlsZSh3aW5kb3cpKTtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLm1vYmlsZSA/ICdsaXN0JyA6ICdtb3NhaWMnO1xuICAgIHRoaXMuX2NvbFNpemUgPSBHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICB0aGlzLnNob3dUb29sYmFyID0gdG9Cb29sZWFuKHRoaXMuc2hvd1Rvb2xiYXIsICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbiA9IHRvQm9vbGVhbih0aGlzLnNob3dBZGRDYXJkQnV0dG9uLCB0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93RmFiQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0ZhYkJ1dHRvbiwgdGhpcy5tb2JpbGUgJiYgIXRoaXMuc2hvd0FkZENhcmRCdXR0b24pO1xuXG4gICAgLy8gR2V0IG1vZGFsIHByZXNlbnRpbmcgZWxlbWVudCAoaU9TIG9ubHkpXG4gICAgdGhpcy5fcHJlc2VudGluZ0VsZW1lbnQgPSB0aGlzLm1vYmlsZSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pb24tcGFnZScpIDogbnVsbDtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmICF0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29ic2VydmVSZW5kZXJDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0LmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zbGlkZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZChldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZS5hZGQoZXZlbnQpO1xuXG4gICAgaWYgKGlzRW1wdHlBcnJheShpbWFnZXMpKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFtpbWFnZS1nYWxsZXJ5XSBBZGRpbmcgbmV3ICR7aW1hZ2VzLmxlbmd0aH0gaW1hZ2UocylgLCBpbWFnZXMpO1xuXG4gICAgY29uc3Qgcm93czogVGFibGVFbGVtZW50PFQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5jcmVhdGVOZXcoKTtcbiAgICAgIHJvdy5jdXJyZW50RGF0YSA9IGltYWdlIGFzIHVua25vd24gYXMgVDtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgICAgY29uc3QgYWRkZWQgPSBhd2FpdCByb3cuY29uZmlybUVkaXRDcmVhdGUoKTtcbiAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbaW1hZ2UtZ2FsbGVyeV0gQ2Fubm90IGNvbmZpcm0gbmV3IGltYWdlIScpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uQWZ0ZXJBZGRSb3dzLmVtaXQocm93cyk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoZXZlbnQ6IEV2ZW50LCByb3c6IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5yZWFkT25seSkgcmV0dXJuIGZhbHNlO1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNhbkRlbGV0ZVJvd3MoW3Jvd10pO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgZGVsZXRlZDogYm9vbGVhbjtcbiAgICBpZiAocm93LmlkID09PSAtMSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbaW1hZ2UtZ2FsbGVyeV0gUmVtb3ZpbmcgbmV3IGltYWdlJyk7XG4gICAgICBkZWxldGVkID0gYXdhaXQgcm93LmNhbmNlbE9yRGVsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIGltYWdlIChhdCAjJyArIHJvdy5pZCArICcpJyk7XG4gICAgICBkZWxldGVkID0gYXdhaXQgcm93LmRlbGV0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgdG9nZ2xlVmlld01vZGUoXz86IEV2ZW50KSB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLm1vZGUgPSAnbW9zYWljJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLm1vZGUgPSAnbGlzdCc7XG4gICAgfVxuICAgIHRoaXMuX2NvbFNpemUgPSBHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGFzeW5jIGVkaXRUaXRsZShldmVudDogTW91c2VFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQ/LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5zaG93Q2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpO1xuXG4gICAgY29uc3QgdGl0bGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKHJvdy5jdXJyZW50RGF0YS50aXRsZSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpXSkpO1xuICAgIHRoaXMuX3RpdGxlRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyB0aXRsZTogdGl0bGVDb250cm9sIH0pO1xuICAgIHRoaXMuX3RpdGxlQXV0b2ZvY3VzID0gdGhpcy5tb2JpbGUgJiYgdGhpcy5lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5O1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIucHJlc2VudCgpO1xuXG4gICAgY29uc3QgeyBkYXRhLCByb2xlIH0gPSBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmICghcm9sZSB8fCByb2xlICE9PSAnQ0FOQ0VMJykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFVzZXIgc2V0IHRpdGxlOiAnICsgZGF0YSk7XG4gICAgICByb3cuY3VycmVudERhdGEudGl0bGUgPSBkYXRhO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMub25BZnRlckVkaXRSb3cuZW1pdChyb3cpO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIHRvb2xiYXIsIGJlY2F1c2UgdGhlIGZvY3VzIGhhdmUgYmVlbiBnaXZlbiB0byB0aGUgZXZlbnQncyBvcmlnaW4gKHRoZSBlZGl0IGJ1dHRvbilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUNhcmRUb29sYmFyKGNhcmRUb29sYmFyKSwgNzUwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93Q2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgY29uc3QgZWwgPSBjYXJkVG9vbGJhclsnZWwnXSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQ+KSB7XG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLl9kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKSB7XG4gICAgLy8gSWYgbm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0LCB0aGVyZSBpcyBub3RoaW5nIHRvIG9ic2VydmUgZm9yIGNoYW5nZXMuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRhdGFTdHJlYW06IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+O1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgZGF0YVN0cmVhbSA9IHRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAoZGF0YVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB0aGlzLmdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gZGF0YVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95U3ViamVjdCkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFJlY2VpdmVkIG5ldyByb3dzJywgZGF0YSk7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHtcbiAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjbGlja1Jvdyhyb3c6IFRhYmxlRWxlbWVudDxUPiwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPSBpbmRleDtcbiAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5wcmVzZW50KCk7XG4gICAgYXdhaXQgdGhpcy56b29tTW9kYWwub25EaWREaXNtaXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZlU2xpZGVJbmRleCA9IDA7XG5cbiAgcHJvdGVjdGVkIGdldFN3aXBlcihzd2lwZXJFbGVtZW50PzogYW55KTogU3dpcGVyIHtcbiAgICB0aGlzLl9zd2lwZXIgPSAoc3dpcGVyRWxlbWVudCB8fCB0aGlzLnN3aXBlclJlZj8ubmF0aXZlRWxlbWVudCk/LnN3aXBlciB8fCB0aGlzLl9zd2lwZXI7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0TW9kYWxTbGlkZXMoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPiAwKSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbyh0aGlzLl9zZWxlY3RlZFJvd0luZGV4LCAwKTtcbiAgICB9XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudFBhdHRlcm4oKGhhbmRsZXIpID0+IHN3aXBlci5vbignc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnLCBoYW5kbGVyKSkuc3Vic2NyaWJlKChhcmcpID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgem9vbShzd2lwZXJFbGVtZW50OiBhbnksIHpvb21JbjogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeV0gem9vbSAnICsgKHpvb21JbiA/ICdpbicgOiAnb3V0JyksIHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICBpZiAoem9vbUluKSB6b29tLmluKCk7XG4gICAgZWxzZSB6b29tLm91dCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUZyb21Nb2RhbChldmVudCwgc3dpcGVyRWxlbWVudDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudFJvdyA9IHRoaXMucm93cy5maW5kKChyb3csIGluZGV4KSA9PiBpbmRleCA9PT0gc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRSb3cpIHJldHVybiBmYWxzZTsgLy8gUm93IG5vdCBmb3VuZFxuXG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHRoaXMuZGVsZXRlKGV2ZW50LCBjdXJyZW50Um93KTtcblxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5kaXNtaXNzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IHRoZSB6b29tXG4gICAgICBzd2lwZXIuem9vbS5vdXQoKTtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlUHJldihzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IDApIHtcbiAgICAgIC8vIExvb3AgdG8gbGFzdFxuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlVG8odGhpcy5yb3dzLmxlbmd0aCAtIDEsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlTmV4dChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHRoaXMucm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAvLyBMb29wIHRvIGZpcnN0XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbygwLCAwIC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYW5EZWxldGVSb3dzKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3Mub2JzZXJ2ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3MsICdjYW5EZWxldGUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IHJvd3MgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IEFsZXJ0cy5hc2tEZWxldGVDb25maXJtYXRpb24odGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlOyAvLyBDYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIiAqbmdJZj1cInNob3dUb29sYmFyXCI+XG4gIDwhLS0gQWRkIC0tPlxuICA8YnV0dG9uXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCIhcmVhZE9ubHkgJiYgIW1vYmlsZSAmJiBlbmFibGVkXCJcbiAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiXG4gICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgIDwhLS0gVG9nZ2xlIHZpZXcgbW9kZSAtLT5cbiAgICA8aW9uLXNlZ21lbnQgKGlvbkNoYW5nZSk9XCJ0b2dnbGVWaWV3TW9kZSgkZXZlbnQpXCIgY29sb3I9XCJhY2NlbnRcIiBbdmFsdWVdPVwiX2NvbFNpemVcIj5cbiAgICAgIDxpb24tc2VnbWVudC1idXR0b24gW3ZhbHVlXT1cIjRcIj5cbiAgICAgICAgPG1hdC1pY29uPnZpZXdfbW9kdWxlPC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiMTJcIj5cbiAgICAgICAgPG1hdC1pY29uPnZpZXdfbGlzdDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1zZWdtZW50LWJ1dHRvbj5cbiAgICA8L2lvbi1zZWdtZW50PlxuICA8L2lvbi1idXR0b25zPlxuPC9pb24tdG9vbGJhcj5cblxuPGRpdiBjbGFzcz1cImdhbGxlcnktY29udGFpbmVyIHt7IHRoaXMubW9kZSB9fVwiPlxuICA8ZGl2ICpuZ0lmPVwibW9iaWxlICYmIHpvb21BY3RpdmVcIiBjbGFzcz1cImJhY2tkcm9wXCIgW3N0eWxlLm9wYWNpdHldPVwiem9vbVNjYWxlXCI+PC9kaXY+XG5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sICpyeEZvcj1cImxldCByb3cgb2YgX2RhdGEkOyBpbmRleCBhcyBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCIgW3NpemVdPVwiX2NvbFNpemVcIj5cbiAgICAgICAgQGxldCBpbWFnZSA9IHJvdyB8IHByb3BlcnR5R2V0OiAnY3VycmVudERhdGEnO1xuICAgICAgICA8aW9uLWNhcmRcbiAgICAgICAgICAjY2FyZFxuICAgICAgICAgIGNsYXNzPVwiaW1hZ2UtY2FyZFwiXG4gICAgICAgICAgW2NsYXNzLnpvb20taG92ZXJdPVwiIW1vYmlsZVwiXG4gICAgICAgICAgW2NvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUm93KHJvdywgaW5kZXgpXCJcbiAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgPlxuICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJjYXJkLXRodW1ibmFpbFwiPlxuICAgICAgICAgICAgPGlvbi1pbWcgW3NyY109XCJpbWFnZS51cmwgfHwgaW1hZ2UuZGF0YVVybFwiIC8+XG4gICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICA8IS0tIHRvb2xiYXIgZm9yIHRpdGxlICh3aGVuIG5vdCBob3ZlcikgLS0+XG4gICAgICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwidHJhbnNwYXJlbnRcIiBjbGFzcz1cInRpdGxlXCIgKm5nSWY9XCJpbWFnZS50aXRsZVwiPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBpbWFnZS50aXRsZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG5cbiAgICAgICAgICA8IS0tIGFjdGlvbiB0b29sYmFyIChkZXNrdG9wIG9ubHkpIHNob3duIHdoZW4gaG92ZXIgaW1hZ2UgLS0+XG4gICAgICAgICAgPGlvbi10b29sYmFyICNjYXJkVG9vbGJhciAqbmdJZj1cIiFtb2JpbGUgJiYgIXJlYWRPbmx5XCIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgPCEtLSBlZGl0IHRpdGxlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dUaXRsZVwiXG4gICAgICAgICAgICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGl0bGUoJGV2ZW50LCByb3csIGNhcmRUb29sYmFyKVwiXG4gICAgICAgICAgICAgIChmb2N1c2luKT1cInNob3dDYXJkVG9vbGJhcihjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuY3VycmVudERhdGEudGl0bGUgfCBpc05vdE5pbE9yQmxhbms7IGVsc2UgZWRpdExhYmVsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgSU1BR0UuR0FMTEVSWS5CVE5fRURJVF9USVRMRVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRMYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9BRERfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8aW9uLWNvbCAqbmdJZj1cInNob3dBZGRDYXJkQnV0dG9uICYmICFyZWFkT25seVwiIFtzaXplXT1cIl9jb2xTaXplXCIgQGZhZGVJbkFuaW1hdGlvbj5cbiAgICAgICAgPGlvbi1jYXJkIGNsYXNzPVwiaW1hZ2UtY2FyZC1idXR0b25cIiBjb2xvcj1cImxpZ2h0XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgdGFwcGFibGU+XG4gICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIiBbY29sb3JdPVwiYWRkQnV0dG9uQ29sb3JcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiIFtjb2xvcl09XCJhZGRCdXR0b25Db2xvclwiIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvZGl2PlxuXG48IS0tIEZBQiBidXR0b246IGFkZCAtLT5cbjxpb24tZmFiXG4gIHNsb3Q9XCJmaXhlZFwiXG4gIHZlcnRpY2FsPVwiYm90dG9tXCJcbiAgaG9yaXpvbnRhbD1cImVuZFwiXG4gICpuZ0lmPVwic2hvd0ZhYkJ1dHRvbiAmJiAhcmVhZE9ubHlcIlxuICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJkaXNhYmxlZFwiXG4gIEBmYWRlSW5PdXRBbmltYXRpb25cbj5cbiAgPGlvbi1mYWItYnV0dG9uIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiYWRkKCRldmVudClcIj5cbiAgICA8aW9uLWljb24gbmFtZT1cImNhbWVyYVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgc3R5bGU9XCJsZWZ0OiAzM3B4OyB0b3A6IDlweDsgZm9udC1zaXplOiAyMHB4XCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvaW9uLWZhYj5cblxuPCEtLSBab29tIG1vZGFsIC0tPlxuPGlvbi1tb2RhbCAjem9vbU1vZGFsIGNsYXNzPVwic3RhY2stbW9kYWwgem9vbS1tb2RhbFwiIFtjbGFzcy5tb2RhbC1mdWxsc2NyZWVuXT1cIm1vYmlsZVwiIFtjbGFzcy5tb2RhbC1sYXJnZV09XCIhbW9iaWxlXCI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tbm8tbWFyZ2luXCI+XG4gICAgICBAbGV0IGNvdW50ID0gcm93cz8ubGVuZ3RoIHx8IDA7XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1sZWZ0XCI+XG4gICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJsaWdodFwiPnt7IGFjdGl2ZVNsaWRlSW5kZXggKyAxIH19IC8ge3sgY291bnQgfX08L2lvbi1sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIHpvb20gYnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICBAaWYgKCFtb2JpbGUpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgdHJ1ZSlcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiem9vbShtb2RhbFN3aXBlciwgZmFsc2UpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZW1vdmVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG5hdmlnYXRpb24gc2lkZSBidXR0b25zIG5leHQvYmFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbW9iaWxlICYmIChyb3dzIHwgaXNBcnJheUxlbmd0aDogeyBncmVhdGVyVGhhbjogMSB9KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZS1idXR0b25zIHByZXZcIiAoY2xpY2spPVwic2xpZGVQcmV2KG1vZGFsU3dpcGVyKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlLWJ1dHRvbnMgbmV4dFwiIChjbGljayk9XCJzbGlkZU5leHQobW9kYWxTd2lwZXIpXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGV2cm9uLWZvcndhcmRcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGltYWdlIHNsaWRlcyAtLT5cbiAgICAgIDxzd2lwZXItY29udGFpbmVyICNtb2RhbFN3aXBlciBbbW9kdWxlc109XCJzd2lwZXJNb2R1bGVzXCIgW3pvb21dPVwidHJ1ZVwiPlxuICAgICAgICA8c3dpcGVyLXNsaWRlICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGFzdCBhcyBsYXN0XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzd2lwZXItem9vbS1jb250YWluZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJyb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJzsgbGV0IGltYWdlXCJcbiAgICAgICAgICAgIChuZ0luaXQpPVwibGFzdCAmJiBpbml0TW9kYWxTbGlkZXMobW9kYWxTd2lwZXIpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW9uLWltZyBbc3JjXT1cImltYWdlLnVybCB8fCBpbWFnZS5kYXRhVXJsXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zd2lwZXItc2xpZGU+XG4gICAgICA8L3N3aXBlci1jb250YWluZXI+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIj5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjRcIiBjbGFzcz1cImlvbi10ZXh0LXN0YXJ0XCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGcm9tTW9kYWwoJGV2ZW50LCBtb2RhbFN3aXBlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwic3RhcnRcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCI0XCI+PC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCI0XCIgY2xhc3M9XCJpb24tdGV4dC1lbmRcIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ6b29tTW9kYWwuZGlzbWlzcygpXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwibW9iaWxlOyBlbHNlIGRlc2t0b3BcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJjbG9zZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIHt7ICdDT01NT04uQlROX0NMT1NFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNrdG9wPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiem9vbU1vZGFsLmRpc21pc3MoKVwiIGNvbG9yPVwidGVydGlhcnlcIj5cbiAgICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tbW9kYWw+XG5cbjxpb24tcG9wb3ZlciAjdGl0bGVQb3BvdmVyPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX3RpdGxlRm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImF1dG9cIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLlRJVExFPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiX3RpdGxlQXV0b2ZvY3VzXCJcbiAgICAgICAgICAgIChrZXlkb3duLmNvbnRyb2wuZW50ZXIpPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cblxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwidGl0bGVQb3BvdmVyLmRpc21pc3MobnVsbCwgJ0NBTkNFTCcpXCI+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0FOQ0VMPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBbZmlsbF09XCJkaXNhYmxlZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9WQUxJREFURV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1mb290ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2lvbi1wb3BvdmVyPlxuIl19
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RixPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0sNENBQTRDLENBQUM7QUFHdEYsT0FBTyxFQUFtQixXQUFXLEVBQWtDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBb0IsWUFBWSxFQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDckYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixF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U0FBUzt1QkFBQyxhQUFhO2dCQUVkLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50UGF0dGVybiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJsZURhdGFTb3VyY2UsIFRhYmxlRWxlbWVudCB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCwgRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgSW1hZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJy4uL2ltYWdlLm1vZGVsJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgSW9uaWNTbGlkZXMsIElvbk1vZGFsLCBJb25Qb3BvdmVyLCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1zJztcbmltcG9ydCB7IGZhZGVJbkFuaW1hdGlvbiwgZmFkZUluT3V0QW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uVmlld2VyLCBpc0RhdGFTb3VyY2UsIExpc3RSYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydHMgfSBmcm9tICcuLi8uLi9hbGVydHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXBwQ29sb3JzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXIsIGVtaXRQcm9taXNlRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHsgUHJlZGVmaW5lZENvbG9ycyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IFN3aXBlciB9IGZyb20gJ3N3aXBlci90eXBlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgR2FsbGVyeU1vZGUgPSAnbW9zYWljJyB8ICdsaXN0JztcblxuY29uc3QgR2FsbGVyeU1vZGVDb2xTaXplID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vc2FpYzogNCxcbiAgbGlzdDogMTIsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJU3dpcGVyIGV4dGVuZHMgU3dpcGVyIHtcbiAgYWN0aXZlSW5kZXg6IG51bWJlcjtcbiAgaW1hZ2VzTG9hZGVkOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb2xsZWN0aW9uVmlld2VyLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJvdGVjdGVkIF9kZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPjtcbiAgcHJvdGVjdGVkIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIF9zd2lwZXI6IFN3aXBlcjtcblxuICBwcm90ZWN0ZWQgc3dpcGVyTW9kdWxlcyA9IFtJb25pY1NsaWRlc107XG4gIHByb3RlY3RlZCB6b29tQWN0aXZlID0gZmFsc2U7XG4gIHByb3RlY3RlZCB6b29tU2NhbGUgPSAxO1xuXG4gIHZpZXdDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxMaXN0UmFuZ2U+O1xuXG4gIEBJbnB1dCgpIGNhcmRDb2xvcjogc3RyaW5nIHwgUHJlZGVmaW5lZENvbG9ycztcbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW4gPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW4gPSBudWxsO1xuICBASW5wdXQoKSBtb2RlOiBHYWxsZXJ5TW9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93VG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dGYWJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dUaXRsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBZGRDYXJkQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkQnV0dG9uQ29sb3I6IEFwcENvbG9ycyA9ICd0ZXJ0aWFyeSc7XG5cbiAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQsIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgIT09IGRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG4gICAgfVxuICB9XG4gIGdldCBkYXRhU291cmNlKCk6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogVGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBhY3RpdmVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFN3aXBlcigpPy5hY3RpdmVJbmRleCB8fCAwO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnem9vbU1vZGFsJykgem9vbU1vZGFsOiBJb25Nb2RhbDtcbiAgQFZpZXdDaGlsZCgndGl0bGVQb3BvdmVyJykgdGl0bGVQb3BvdmVyOiBJb25Qb3BvdmVyO1xuICBAVmlld0NoaWxkKCdtb2RhbFN3aXBlcicpIHN3aXBlclJlZjogRWxlbWVudFJlZjtcblxuICBAT3V0cHV0KCkgb25CZWZvcmVEZWxldGVSb3dzID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyQWRkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+W10+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbWFnZTogSW1hZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBzdGFydDogMCwgZW5kOiBOdW1iZXIuTUFYX1ZBTFVFIH0pO1xuXG4gICAgLy8gREVWIGxvZ1xuICAgIHRoaXMuZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBpc01vYmlsZSh3aW5kb3cpKTtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLm1vYmlsZSA/ICdsaXN0JyA6ICdtb3NhaWMnO1xuICAgIHRoaXMuX2NvbFNpemUgPSBHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICB0aGlzLnNob3dUb29sYmFyID0gdG9Cb29sZWFuKHRoaXMuc2hvd1Rvb2xiYXIsICF0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbiA9IHRvQm9vbGVhbih0aGlzLnNob3dBZGRDYXJkQnV0dG9uLCB0aGlzLm1vYmlsZSk7XG4gICAgdGhpcy5zaG93RmFiQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0ZhYkJ1dHRvbiwgdGhpcy5tb2JpbGUgJiYgIXRoaXMuc2hvd0FkZENhcmRCdXR0b24pO1xuXG4gICAgLy8gR2V0IG1vZGFsIHByZXNlbnRpbmcgZWxlbWVudCAoaU9TIG9ubHkpXG4gICAgdGhpcy5fcHJlc2VudGluZ0VsZW1lbnQgPSB0aGlzLm1vYmlsZSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pb24tcGFnZScpIDogbnVsbDtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmICF0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX29ic2VydmVSZW5kZXJDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0LmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zbGlkZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFkZChldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZS5hZGQoZXZlbnQpO1xuXG4gICAgaWYgKGlzRW1wdHlBcnJheShpbWFnZXMpKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFtpbWFnZS1nYWxsZXJ5XSBBZGRpbmcgbmV3ICR7aW1hZ2VzLmxlbmd0aH0gaW1hZ2UocylgLCBpbWFnZXMpO1xuXG4gICAgY29uc3Qgcm93czogVGFibGVFbGVtZW50PFQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5jcmVhdGVOZXcoKTtcbiAgICAgIHJvdy5jdXJyZW50RGF0YSA9IGltYWdlIGFzIHVua25vd24gYXMgVDtcbiAgICAgIHJvd3MucHVzaChyb3cpO1xuICAgICAgY29uc3QgYWRkZWQgPSBhd2FpdCByb3cuY29uZmlybUVkaXRDcmVhdGUoKTtcbiAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbaW1hZ2UtZ2FsbGVyeV0gQ2Fubm90IGNvbmZpcm0gbmV3IGltYWdlIScpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uQWZ0ZXJBZGRSb3dzLmVtaXQocm93cyk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoZXZlbnQ6IEV2ZW50LCByb3c6IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5yZWFkT25seSkgcmV0dXJuIGZhbHNlO1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNhbkRlbGV0ZVJvd3MoW3Jvd10pO1xuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBsZXQgZGVsZXRlZDogYm9vbGVhbjtcbiAgICBpZiAocm93LmlkID09PSAtMSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbaW1hZ2UtZ2FsbGVyeV0gUmVtb3ZpbmcgbmV3IGltYWdlJyk7XG4gICAgICBkZWxldGVkID0gYXdhaXQgcm93LmNhbmNlbE9yRGVsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIGltYWdlIChhdCAjJyArIHJvdy5pZCArICcpJyk7XG4gICAgICBkZWxldGVkID0gYXdhaXQgcm93LmRlbGV0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgdG9nZ2xlVmlld01vZGUoXz86IEV2ZW50KSB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLm1vZGUgPSAnbW9zYWljJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLm1vZGUgPSAnbGlzdCc7XG4gICAgfVxuICAgIHRoaXMuX2NvbFNpemUgPSBHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGFzeW5jIGVkaXRUaXRsZShldmVudDogTW91c2VFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQ/LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5zaG93Q2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpO1xuXG4gICAgY29uc3QgdGl0bGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKHJvdy5jdXJyZW50RGF0YS50aXRsZSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpXSkpO1xuICAgIHRoaXMuX3RpdGxlRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyB0aXRsZTogdGl0bGVDb250cm9sIH0pO1xuICAgIHRoaXMuX3RpdGxlQXV0b2ZvY3VzID0gdGhpcy5tb2JpbGUgJiYgdGhpcy5lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5O1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIucHJlc2VudCgpO1xuXG4gICAgY29uc3QgeyBkYXRhLCByb2xlIH0gPSBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmICghcm9sZSB8fCByb2xlICE9PSAnQ0FOQ0VMJykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFVzZXIgc2V0IHRpdGxlOiAnICsgZGF0YSk7XG4gICAgICByb3cuY3VycmVudERhdGEudGl0bGUgPSBkYXRhO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMub25BZnRlckVkaXRSb3cuZW1pdChyb3cpO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIHRvb2xiYXIsIGJlY2F1c2UgdGhlIGZvY3VzIGhhdmUgYmVlbiBnaXZlbiB0byB0aGUgZXZlbnQncyBvcmlnaW4gKHRoZSBlZGl0IGJ1dHRvbilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUNhcmRUb29sYmFyKGNhcmRUb29sYmFyKSwgNzUwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93Q2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgY29uc3QgZWwgPSBjYXJkVG9vbGJhclsnZWwnXSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1c2VkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQ+KSB7XG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLl9kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKSB7XG4gICAgLy8gSWYgbm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0LCB0aGVyZSBpcyBub3RoaW5nIHRvIG9ic2VydmUgZm9yIGNoYW5nZXMuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGRhdGFTdHJlYW06IE9ic2VydmFibGU8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+O1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgZGF0YVN0cmVhbSA9IHRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAoZGF0YVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB0aGlzLmdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gZGF0YVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95U3ViamVjdCkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFJlY2VpdmVkIG5ldyByb3dzJywgZGF0YSk7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHtcbiAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjbGlja1Jvdyhyb3c6IFRhYmxlRWxlbWVudDxUPiwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPSBpbmRleDtcbiAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5wcmVzZW50KCk7XG4gICAgYXdhaXQgdGhpcy56b29tTW9kYWwub25EaWREaXNtaXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aXZlU2xpZGVJbmRleCA9IDA7XG5cbiAgcHJvdGVjdGVkIGdldFN3aXBlcihzd2lwZXJFbGVtZW50PzogYW55KTogU3dpcGVyIHtcbiAgICB0aGlzLl9zd2lwZXIgPSAoc3dpcGVyRWxlbWVudCB8fCB0aGlzLnN3aXBlclJlZj8ubmF0aXZlRWxlbWVudCk/LnN3aXBlciB8fCB0aGlzLl9zd2lwZXI7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0TW9kYWxTbGlkZXMoc3dpcGVyRWxlbWVudDogYW55KSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPiAwKSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbyh0aGlzLl9zZWxlY3RlZFJvd0luZGV4LCAwKTtcbiAgICB9XG4gICAgdGhpcy5fc2xpZGVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbiA9IGZyb21FdmVudFBhdHRlcm4oKGhhbmRsZXIpID0+IHN3aXBlci5vbignc2xpZGVDaGFuZ2VUcmFuc2l0aW9uU3RhcnQnLCBoYW5kbGVyKSkuc3Vic2NyaWJlKChhcmcpID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgem9vbShzd2lwZXJFbGVtZW50OiBhbnksIHpvb21JbjogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeV0gem9vbSAnICsgKHpvb21JbiA/ICdpbicgOiAnb3V0JyksIHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXMuZ2V0U3dpcGVyKHN3aXBlckVsZW1lbnQpO1xuICAgIGNvbnN0IHpvb20gPSBzd2lwZXIuem9vbTtcbiAgICBpZiAoem9vbUluKSB6b29tLmluKCk7XG4gICAgZWxzZSB6b29tLm91dCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUZyb21Nb2RhbChldmVudCwgc3dpcGVyRWxlbWVudDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcy5nZXRTd2lwZXIoc3dpcGVyRWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudFJvdyA9IHRoaXMucm93cy5maW5kKChyb3csIGluZGV4KSA9PiBpbmRleCA9PT0gc3dpcGVyLmFjdGl2ZUluZGV4KTtcbiAgICBpZiAoIWN1cnJlbnRSb3cpIHJldHVybiBmYWxzZTsgLy8gUm93IG5vdCBmb3VuZFxuXG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHRoaXMuZGVsZXRlKGV2ZW50LCBjdXJyZW50Um93KTtcblxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnpvb21Nb2RhbC5kaXNtaXNzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IHRoZSB6b29tXG4gICAgICBzd2lwZXIuem9vbS5vdXQoKTtcbiAgICAgIHN3aXBlci51cGRhdGUoKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlUHJldihzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IDApIHtcbiAgICAgIC8vIExvb3AgdG8gbGFzdFxuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlVG8odGhpcy5yb3dzLmxlbmd0aCAtIDEsIDAgLypubyB0cmFuc2l0aW9uLCB0byBhdm9pZCBhIFwicmV2ZXJ0XCIgZWZmZWN0Ki8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNsaWRlTmV4dChzd2lwZXJFbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzLmdldFN3aXBlcihzd2lwZXJFbGVtZW50KTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleDtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHRoaXMucm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAvLyBMb29wIHRvIGZpcnN0XG4gICAgICBhd2FpdCBzd2lwZXIuc2xpZGVUbygwLCAwIC8qbm8gdHJhbnNpdGlvbiwgdG8gYXZvaWQgYSBcInJldmVydFwiIGVmZmVjdCovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc3dpcGVyLnNsaWRlTmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYW5EZWxldGVSb3dzKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3Mub2JzZXJ2ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3MsICdjYW5EZWxldGUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IHJvd3MgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IEFsZXJ0cy5hc2tEZWxldGVDb25maXJtYXRpb24odGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlOyAvLyBDYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGlvbi10b29sYmFyIGNvbG9yPVwibGlnaHRcIiAqbmdJZj1cInNob3dUb29sYmFyXCI+XG4gIDwhLS0gQWRkIC0tPlxuICA8YnV0dG9uXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCIhcmVhZE9ubHkgJiYgIW1vYmlsZSAmJiBlbmFibGVkXCJcbiAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiXG4gICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgIDwhLS0gVG9nZ2xlIHZpZXcgbW9kZSAtLT5cbiAgICA8aW9uLXNlZ21lbnQgKGlvbkNoYW5nZSk9XCJ0b2dnbGVWaWV3TW9kZSgkZXZlbnQpXCIgY29sb3I9XCJhY2NlbnRcIiBbdmFsdWVdPVwiX2NvbFNpemVcIj5cbiAgICAgIDxpb24tc2VnbWVudC1idXR0b24gW3ZhbHVlXT1cIjRcIj5cbiAgICAgICAgPG1hdC1pY29uPnZpZXdfbW9kdWxlPC9tYXQtaWNvbj5cbiAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiMTJcIj5cbiAgICAgICAgPG1hdC1pY29uPnZpZXdfbGlzdDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1zZWdtZW50LWJ1dHRvbj5cbiAgICA8L2lvbi1zZWdtZW50PlxuICA8L2lvbi1idXR0b25zPlxuPC9pb24tdG9vbGJhcj5cblxuPGRpdiBjbGFzcz1cImdhbGxlcnktY29udGFpbmVyIGlvbi1wYWRkaW5nLWJvdHRvbSB7eyB0aGlzLm1vZGUgfX1cIj5cbiAgPGRpdiAqbmdJZj1cIm1vYmlsZSAmJiB6b29tQWN0aXZlXCIgY2xhc3M9XCJiYWNrZHJvcFwiIFtzdHlsZS5vcGFjaXR5XT1cInpvb21TY2FsZVwiPjwvZGl2PlxuXG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbCAqcnhGb3I9XCJsZXQgcm93IG9mIF9kYXRhJDsgaW5kZXggYXMgaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtzaXplXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIEBsZXQgaW1hZ2UgPSByb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJztcbiAgICAgICAgPGlvbi1jYXJkXG4gICAgICAgICAgI2NhcmRcbiAgICAgICAgICBjbGFzcz1cImltYWdlLWNhcmRcIlxuICAgICAgICAgIFtjbGFzcy56b29tLWhvdmVyXT1cIiFtb2JpbGVcIlxuICAgICAgICAgIFtjb2xvcl09XCJjYXJkQ29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJjbGlja1Jvdyhyb3csIGluZGV4KVwiXG4gICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICBAZmFkZUluQW5pbWF0aW9uXG4gICAgICAgID5cbiAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiY2FyZC10aHVtYm5haWxcIj5cbiAgICAgICAgICAgIDxpb24taW1nIFtzcmNdPVwiaW1hZ2UudXJsIHx8IGltYWdlLmRhdGFVcmxcIiAvPlxuICAgICAgICAgIDwvZmlndXJlPlxuXG4gICAgICAgICAgPCEtLSB0b29sYmFyIGZvciB0aXRsZSAod2hlbiBub3QgaG92ZXIpIC0tPlxuICAgICAgICAgIDxpb24tdG9vbGJhciBjb2xvcj1cInRyYW5zcGFyZW50XCIgY2xhc3M9XCJ0aXRsZVwiICpuZ0lmPVwiaW1hZ2UudGl0bGVcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgaW1hZ2UudGl0bGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi10b29sYmFyPlxuXG4gICAgICAgICAgPCEtLSBhY3Rpb24gdG9vbGJhciAoZGVza3RvcCBvbmx5KSBzaG93biB3aGVuIGhvdmVyIGltYWdlIC0tPlxuICAgICAgICAgIDxpb24tdG9vbGJhciAjY2FyZFRvb2xiYXIgKm5nSWY9XCIhbW9iaWxlICYmICFyZWFkT25seVwiIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDwhLS0gZWRpdCB0aXRsZSBidXR0b24gLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93VGl0bGVcIlxuICAgICAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFRpdGxlKCRldmVudCwgcm93LCBjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgICAoZm9jdXNpbik9XCJzaG93Q2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmN1cnJlbnREYXRhLnRpdGxlIHwgaXNOb3ROaWxPckJsYW5rOyBlbHNlIGVkaXRMYWJlbFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgICAgIElNQUdFLkdBTExFUlkuQlROX0VESVRfVElUTEVcbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlZGl0TGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5CVE5fQUREX1RJVExFPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGRlbGV0ZSBidXR0b24gLS0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpb24tZmxvYXQtZW5kXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPGlvbi1jb2wgKm5nSWY9XCJzaG93QWRkQ2FyZEJ1dHRvbiAmJiAhcmVhZE9ubHlcIiBbc2l6ZV09XCJfY29sU2l6ZVwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgIDxpb24tY2FyZCBjbGFzcz1cImltYWdlLWNhcmQtYnV0dG9uXCIgY29sb3I9XCJsaWdodFwiIChjbGljayk9XCJhZGQoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIHRhcHBhYmxlPlxuICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FtZXJhXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIiBbY29sb3JdPVwiYWRkQnV0dG9uQ29sb3JcIiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG48L2Rpdj5cblxuPCEtLSBGQUIgYnV0dG9uOiBhZGQgLS0+XG48aW9uLWZhYlxuICBzbG90PVwiZml4ZWRcIlxuICB2ZXJ0aWNhbD1cImJvdHRvbVwiXG4gIGhvcml6b250YWw9XCJlbmRcIlxuICAqbmdJZj1cInNob3dGYWJCdXR0b24gJiYgIXJlYWRPbmx5XCJcbiAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiZGlzYWJsZWRcIlxuICBAZmFkZUluT3V0QW5pbWF0aW9uXG4+XG4gIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMzNweDsgdG9wOiA5cHg7IGZvbnQtc2l6ZTogMjBweFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2lvbi1mYWI+XG5cbjwhLS0gWm9vbSBtb2RhbCAtLT5cbjxpb24tbW9kYWwgI3pvb21Nb2RhbCBjbGFzcz1cInN0YWNrLW1vZGFsIHpvb20tbW9kYWxcIiBbY2xhc3MubW9kYWwtZnVsbHNjcmVlbl09XCJtb2JpbGVcIiBbY2xhc3MubW9kYWwtbGFyZ2VdPVwiIW1vYmlsZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgaW9uLW5vLW1hcmdpblwiPlxuICAgICAgQGxldCBjb3VudCA9IHJvd3M/Lmxlbmd0aCB8fCAwO1xuICAgICAgPCEtLSBDb3VudGVyICAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtbGVmdFwiPlxuICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwibGlnaHRcIj57eyBhY3RpdmVTbGlkZUluZGV4ICsgMSB9fSAvIHt7IGNvdW50IH19PC9pb24tbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSB6b29tIGJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgQGlmICghbW9iaWxlKSB7XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInpvb20obW9kYWxTd2lwZXIsIHRydWUpXCIgY29sb3I9XCJsaWdodFwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInpvb20obW9kYWxTd2lwZXIsIGZhbHNlKVwiIGNvbG9yPVwibGlnaHRcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVtb3ZlXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBuYXZpZ2F0aW9uIHNpZGUgYnV0dG9ucyBuZXh0L2JhY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vYmlsZSAmJiAocm93cyB8IGlzQXJyYXlMZW5ndGg6IHsgZ3JlYXRlclRoYW46IDEgfSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNpZGUtYnV0dG9ucyBwcmV2XCIgKGNsaWNrKT1cInNsaWRlUHJldihtb2RhbFN3aXBlcilcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tYmFja1wiPjwvaW9uLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZS1idXR0b25zIG5leHRcIiAoY2xpY2spPVwic2xpZGVOZXh0KG1vZGFsU3dpcGVyKVwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBpbWFnZSBzbGlkZXMgLS0+XG4gICAgICA8c3dpcGVyLWNvbnRhaW5lciAjbW9kYWxTd2lwZXIgW21vZHVsZXNdPVwic3dpcGVyTW9kdWxlc1wiIFt6b29tXT1cInRydWVcIj5cbiAgICAgICAgPHN3aXBlci1zbGlkZSAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IGxhc3QgYXMgbGFzdFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic3dpcGVyLXpvb20tY29udGFpbmVyXCJcbiAgICAgICAgICAgICpuZ0lmPVwicm93IHwgcHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7IGxldCBpbWFnZVwiXG4gICAgICAgICAgICAobmdJbml0KT1cImxhc3QgJiYgaW5pdE1vZGFsU2xpZGVzKG1vZGFsU3dpcGVyKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pbWcgW3NyY109XCJpbWFnZS51cmwgfHwgaW1hZ2UuZGF0YVVybFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3dpcGVyLXNsaWRlPlxuICAgICAgPC9zd2lwZXItY29udGFpbmVyPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG5cbiAgICA8aW9uLWZvb3Rlcj5cbiAgICAgIDxpb24tdG9vbGJhciBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCI0XCIgY2xhc3M9XCJpb24tdGV4dC1zdGFydFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhcmVhZE9ubHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRnJvbU1vZGFsKCRldmVudCwgbW9kYWxTd2lwZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJkYW5nZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24gc2xvdD1cInN0YXJ0XCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAge3sgJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiPjwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiNFwiIGNsYXNzPVwiaW9uLXRleHQtZW5kXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiem9vbU1vZGFsLmRpc21pc3MoKVwiIGNvbG9yPVwidGVydGlhcnlcIiBmaWxsPVwiY2xlYXJcIiAqbmdJZj1cIm1vYmlsZTsgZWxzZSBkZXNrdG9wXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiY2xvc2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB7eyAnQ09NTU9OLkJUTl9DTE9TRScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVza3RvcD5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInpvb21Nb2RhbC5kaXNtaXNzKClcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgICAgICAgICAgICAge3sgJ0NPTU1PTi5CVE5fQ0xPU0UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIDwvaW9uLWZvb3Rlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvaW9uLW1vZGFsPlxuXG48aW9uLXBvcG92ZXIgI3RpdGxlUG9wb3Zlcj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCIgY2RrVHJhcEZvY3VzIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIl90aXRsZUZvcm1cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhdXRvXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5USVRMRTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cIl90aXRsZUF1dG9mb2N1c1wiXG4gICAgICAgICAgICAoa2V5ZG93bi5jb250cm9sLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG5cbiAgICA8aW9uLWZvb3Rlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIG5vd3JhcD5cbiAgICAgICAgICA8aW9uLWNvbD48L2lvbi1jb2w+XG5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKG51bGwsICdDQU5DRUwnKVwiPlxuICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgW2ZpbGxdPVwiZGlzYWJsZWQgPyAnY2xlYXInIDogJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fVkFMSURBVEVfV0lUSF9TSE9SVENVVF9IRUxQJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fVkFMSURBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tcG9wb3Zlcj5cbiJdfQ==