@sumaris-net/ngx-components 18.26.11 → 18.26.13
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.
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +23 -4
- package/esm2022/src/app/shared/image/gallery/slideshow/image-gallery-slideshow.component.mjs +17 -10
- package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +38 -12
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +6 -1
- package/src/app/shared/image/gallery/slideshow/image-gallery-slideshow.component.d.ts +4 -3
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +2 -2
- package/src/assets/manifest.json +1 -1
|
@@ -50,6 +50,7 @@ export class AppImageGalleryComponent {
|
|
|
50
50
|
_titleForm;
|
|
51
51
|
_titleAutofocus = false;
|
|
52
52
|
_slidesSubscription;
|
|
53
|
+
_showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });
|
|
53
54
|
zoomActive = false;
|
|
54
55
|
zoomScale = 1;
|
|
55
56
|
/** Whether the inline slideshow overlay is currently shown (only relevant when zoomPresentation === 'inline'). */
|
|
@@ -150,7 +151,12 @@ export class AppImageGalleryComponent {
|
|
|
150
151
|
fetchMore = createPromiseEventEmitter();
|
|
151
152
|
slideshowOpened = new EventEmitter();
|
|
152
153
|
slideshowClosed = new EventEmitter();
|
|
153
|
-
|
|
154
|
+
get activeIndex() {
|
|
155
|
+
if (!this.inlineSlideshow)
|
|
156
|
+
throw new Error('Cannot get slide active index while inline slideshow is open');
|
|
157
|
+
return this.inlineSlideshow.activeIndex;
|
|
158
|
+
}
|
|
159
|
+
inlineSlideshow;
|
|
154
160
|
constructor(imageService, platform, alterCtrl, translate, cd, environment) {
|
|
155
161
|
this.imageService = imageService;
|
|
156
162
|
this.platform = platform;
|
|
@@ -242,6 +248,16 @@ export class AppImageGalleryComponent {
|
|
|
242
248
|
this.markForCheck();
|
|
243
249
|
}
|
|
244
250
|
}
|
|
251
|
+
slideNext() {
|
|
252
|
+
if (!this.inlineSlideshow)
|
|
253
|
+
throw new Error('Cannot slide previous while inline slideshow is open');
|
|
254
|
+
return this.inlineSlideshow.slideNext();
|
|
255
|
+
}
|
|
256
|
+
slidePrev() {
|
|
257
|
+
if (!this.inlineSlideshow)
|
|
258
|
+
throw new Error('Cannot slide previous while inline slideshow is open');
|
|
259
|
+
return this.inlineSlideshow.slidePrev();
|
|
260
|
+
}
|
|
245
261
|
trackByFn(index, row) {
|
|
246
262
|
return row.id;
|
|
247
263
|
}
|
|
@@ -417,11 +433,11 @@ export class AppImageGalleryComponent {
|
|
|
417
433
|
this.cd.markForCheck();
|
|
418
434
|
}
|
|
419
435
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", 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 });
|
|
420
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: ["debug", "debug", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: ["showToolbar", "showToolbar", booleanAttribute], showFabButton: ["showFabButton", "showFabButton", booleanAttribute], showTitle: ["showTitle", "showTitle", booleanAttribute], showAddToolbarButton: ["showAddToolbarButton", "showAddToolbarButton", booleanAttribute], showAddTextButton: ["showAddTextButton", "showAddTextButton", booleanAttribute], showAddCardButton: ["showAddCardButton", "showAddCardButton", booleanAttribute], showCardToolbar: ["showCardToolbar", "showCardToolbar", booleanAttribute], addButtonColor: "addButtonColor", addButtonText: "addButtonText", cardTemplate: "cardTemplate", imageSizes: "imageSizes", imageSizeQueryParam: "imageSizeQueryParam", enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", slideshowMode: "slideshowMode", inlineZoomHeight: "inlineZoomHeight", enableSlideshowLoop: ["enableSlideshowLoop", "enableSlideshowLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute], dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow", onAfterEditImage: "onAfterEditImage", cardClicked: "clickCard", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore", slideshowOpened: "slideshowOpened", slideshowClosed: "slideshowClosed" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }], ngImport: i0, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\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\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickCard($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\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]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('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 }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\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 }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n [debug]=\"debug\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\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\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\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]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('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;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}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{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%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{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-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));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}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "component", type: i14.AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: ["rows", "selectedIndex", "mobile", "readOnly", "disabled", "debug", "enableMouseZoom", "wheelZoomStep", "maxZoomRatio", "enableRotate", "enableCrop", "editionFormat", "editionQuality", "imageSizeQueryParam", "modalImageSize", "enableLoop", "canFetchMore"], outputs: ["deleteRequested", "closeRequested", "afterEditImage", "afterEditRow", "previousSlide", "nextSlide", "fetchMore"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i17.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
436
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AppImageGalleryComponent, selector: "app-image-gallery", inputs: { cardColor: "cardColor", debug: ["debug", "debug", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], readOnly: ["readOnly", "readOnly", booleanAttribute], mobile: ["mobile", "mobile", booleanAttribute], mode: "mode", confirmBeforeDelete: "confirmBeforeDelete", showToolbar: ["showToolbar", "showToolbar", booleanAttribute], showFabButton: ["showFabButton", "showFabButton", booleanAttribute], showTitle: ["showTitle", "showTitle", booleanAttribute], showAddToolbarButton: ["showAddToolbarButton", "showAddToolbarButton", booleanAttribute], showAddTextButton: ["showAddTextButton", "showAddTextButton", booleanAttribute], showAddCardButton: ["showAddCardButton", "showAddCardButton", booleanAttribute], showCardToolbar: ["showCardToolbar", "showCardToolbar", booleanAttribute], addButtonColor: "addButtonColor", addButtonText: "addButtonText", cardTemplate: "cardTemplate", imageSizes: "imageSizes", imageSizeQueryParam: "imageSizeQueryParam", enableMouseZoom: ["enableMouseZoom", "enableMouseZoom", booleanAttribute], wheelZoomStep: "wheelZoomStep", maxZoomRatio: "maxZoomRatio", enableRotate: ["enableRotate", "enableRotate", booleanAttribute], enableCrop: ["enableCrop", "enableCrop", booleanAttribute], editionFormat: "editionFormat", editionQuality: "editionQuality", slideshowMode: "slideshowMode", inlineZoomHeight: "inlineZoomHeight", enableSlideshowLoop: ["enableSlideshowLoop", "enableSlideshowLoop", booleanAttribute], canFetchMore: ["canFetchMore", "canFetchMore", booleanAttribute], dataSource: "dataSource" }, outputs: { onBeforeDeleteRows: "onBeforeDeleteRows", onAfterAddRows: "onAfterAddRows", onAfterEditRow: "onAfterEditRow", onAfterEditImage: "onAfterEditImage", cardClicked: "clickCard", previousSlide: "previousSlide", nextSlide: "nextSlide", fetchMore: "fetchMore", slideshowOpened: "slideshowOpened", slideshowClosed: "slideshowClosed" }, viewQueries: [{ propertyName: "zoomModal", first: true, predicate: ["zoomModal"], descendants: true }, { propertyName: "titlePopover", first: true, predicate: ["titlePopover"], descendants: true }, { propertyName: "inlineSlideshow", first: true, predicate: ["inlineSlideshow"], descendants: true }], ngImport: i0, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\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\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickCard($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\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]=\"!_showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('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 }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!_showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"_showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\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 }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow #inlineSlideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n [debug]=\"debug\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\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\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\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]=\"!_showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('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;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}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{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%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{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-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));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}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i13.RxFor, selector: "[rxFor][rxForOf]", inputs: ["rxForOf", "rxForTemplate", "rxForStrategy", "rxForParent", "rxForPatchZone", "rxForTrackBy", "rxForRenderCallback"] }, { kind: "component", type: i14.AppImageGallerySlideshowComponent, selector: "app-image-gallery-slideshow", inputs: ["rows", "selectedIndex", "mobile", "readOnly", "disabled", "debug", "enableMouseZoom", "wheelZoomStep", "maxZoomRatio", "enableRotate", "enableCrop", "editionFormat", "editionQuality", "imageSizeQueryParam", "modalImageSize", "enableLoop", "canFetchMore"], outputs: ["deleteRequested", "closeRequested", "afterEditImage", "afterEditRow", "previousSlide", "nextSlide", "fetchMore"] }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i17.AppendQueryParamsPipePipe, name: "appendQueryParams" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
421
437
|
}
|
|
422
438
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppImageGalleryComponent, decorators: [{
|
|
423
439
|
type: Component,
|
|
424
|
-
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\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\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickCard($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\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]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('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 }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\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 }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n [debug]=\"debug\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\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\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\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]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('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;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}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{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%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{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-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));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}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"] }]
|
|
440
|
+
args: [{ selector: 'app-image-gallery', animations: [fadeInAnimation, fadeInOutAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showToolbar && !isInlineSlideshowOpen) {\n <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n <!-- Add -->\n @if (!readOnly && showAddToolbarButton && enabled) {\n <button\n mat-icon-button\n [title]=\"!_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n\n <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\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\n<div\n class=\"gallery-container ion-padding-bottom {{ mode }}\"\n [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n @if (mobile && zoomActive) {\n <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n }\n\n <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n <ion-row>\n <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n @let image = row | propertyGet: 'currentData';\n @if (cardTemplate) {\n <ng-container\n *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n ></ng-container>\n } @else {\n <ion-card\n #card\n class=\"image-card\"\n [class.zoom-hover]=\"!mobile\"\n [color]=\"cardColor\"\n (click)=\"clickCard($event, row)\"\n tappable\n @fadeInAnimation\n >\n <figure class=\"card-thumbnail\">\n @if (image.url) {\n <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n } @else {\n <ion-img [src]=\"image.dataUrl\" />\n }\n </figure>\n\n <!-- toolbar for title (when not hover) -->\n @if (showTitle && image.title) {\n <ion-toolbar color=\"transparent\" class=\"title\">\n <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n </ion-toolbar>\n }\n\n <!-- action toolbar shown when hover image -->\n @if (!readOnly && !mobile && showCardToolbar) {\n <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n <!-- edit title button -->\n @if (showTitle) {\n <button\n mat-button\n slot=\"start\"\n [disabled]=\"disabled\"\n (click)=\"editTitle($event, row, cardToolbar)\"\n (focusin)=\"focusCardToolbar(cardToolbar)\"\n >\n <mat-icon>edit</mat-icon>\n <mat-label>\n @if (row.currentData.title | isNotNilOrBlank) {\n <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n } @else {\n <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n }\n </mat-label>\n </button>\n }\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]=\"!_showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('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 }\n </ion-card>\n }\n </ion-col>\n\n <!-- add button -->\n @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n <ion-col [size]=\"_colSize\" @fadeInAnimation>\n @if (showAddTextButton) {\n <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n <mat-label>{{ addButtonText | translate }}</mat-label>\n <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n </ion-button>\n } @else if (showAddCardButton) {\n <ion-card\n class=\"image-card-button\"\n color=\"light\"\n (click)=\"add($event)\"\n [disabled]=\"disabled\"\n [title]=\"!_showTooltip ? (addButtonText | translate) : ''\"\n [matTooltip]=\"_showTooltip ? (addButtonText | translate) : ''\"\n tappable\n >\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 }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n @if (isInlineSlideshowOpen) {\n <app-image-gallery-slideshow #inlineSlideshow\n class=\"inline-overlay\"\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n [debug]=\"debug\"\n ></app-image-gallery-slideshow>\n }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\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\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n <ng-template>\n <app-image-gallery-slideshow\n [rows]=\"rows\"\n [selectedIndex]=\"_selectedRowIndex\"\n [mobile]=\"mobile\"\n [readOnly]=\"readOnly\"\n [disabled]=\"disabled\"\n [debug]=\"debug\"\n [enableMouseZoom]=\"enableMouseZoom\"\n [wheelZoomStep]=\"wheelZoomStep\"\n [maxZoomRatio]=\"maxZoomRatio\"\n [enableRotate]=\"enableRotate\"\n [enableCrop]=\"enableCrop\"\n [enableLoop]=\"enableSlideshowLoop\"\n [editionFormat]=\"editionFormat\"\n [editionQuality]=\"editionQuality\"\n [imageSizeQueryParam]=\"imageSizeQueryParam\"\n [modalImageSize]=\"imageSizes?.modal\"\n (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n (closeRequested)=\"closeSlideshow()\"\n (afterEditImage)=\"onAfterEditImage.emit($event)\"\n (afterEditRow)=\"onAfterEditRow.emit($event)\"\n (previousSlide)=\"previousSlide.emit($event)\"\n (nextSlide)=\"nextSlide.emit($event)\"\n [canFetchMore]=\"canFetchMore\"\n (fetchMore)=\"fetchMore.emit($event)\"\n ></app-image-gallery-slideshow>\n </ng-template>\n </ion-modal>\n}\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]=\"!_showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"_showTooltip ? ('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;--image-margin-safe-area: var(--image-margin-inline, 0px) * 2 - 3px;--segment-max-width: 150px}ion-toolbar{position:sticky;top:0}ion-toolbar ion-segment{max-width:var(--segment-max-width)}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{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%;max-height:var(--img-max-height, calc(100% - var(--image-margin-safe-area, 0px)))}.image-card .card-thumbnail>ion-img{min-height:100%;height:100%;object-fit:cover;object-position:center;transition:scale .2s ease-in-out;scale:var(--img-scale)}.image-card .card-thumbnail>ion-img img{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-safe-area, 0px));max-height:max(min(30vh,200px),var(--img-max-height, 0px));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}.gallery-container{position:relative}.gallery-container.inline-zoom-active{min-height:var(--inline-zoom-height, 60vh)}.inline-overlay{position:absolute;inset:0;z-index:20;background:#000}\n"] }]
|
|
425
441
|
}], ctorParameters: () => [{ type: i1.ImageService }, { type: i2.Platform }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i18.Environment, decorators: [{
|
|
426
442
|
type: Optional
|
|
427
443
|
}, {
|
|
@@ -532,5 +548,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
532
548
|
type: Output
|
|
533
549
|
}], slideshowClosed: [{
|
|
534
550
|
type: Output
|
|
551
|
+
}], inlineSlideshow: [{
|
|
552
|
+
type: ViewChild,
|
|
553
|
+
args: ['inlineSlideshow', { static: false }]
|
|
535
554
|
}] } });
|
|
536
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFBQyxXQUFXLEVBQWMsTUFBTSw0Q0FBNEMsQ0FBQztBQUlwRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBbUIsWUFBWSxFQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFlLE1BQU0sY0FB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QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFekIsVUFBVTtzQkFBdEIsS0FBSztnQkFpQ2tCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBRWYsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ2MsV0FBVztzQkFBL0IsTUFBTTt1QkFBQyxXQUFXO2dCQUVULGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTTtnQkFLRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1RhYmxlRGF0YVNvdXJjZSwgVGFibGVFbGVtZW50fSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVCwgRW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge0ltYWdlU2VydmljZX0gZnJvbSAnLi4vaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQge0ltYWdlLCBJbWFnZVNpemV9IGZyb20gJy4uL2ltYWdlLm1vZGVsJztcbmltcG9ydCB7QWxlcnRDb250cm9sbGVyLCBJb25Nb2RhbCwgSW9uUG9wb3ZlciwgUGxhdGZvcm19IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7aXNNb2JpbGV9IGZyb20gJy4uLy4uL3BsYXRmb3Jtcyc7XG5pbXBvcnQge2ZhZGVJbkFuaW1hdGlvbiwgZmFkZUluT3V0QW5pbWF0aW9ufSBmcm9tICcuLi8uLi9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbE9yQmxhbmssIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7Q29sbGVjdGlvblZpZXdlciwgaXNEYXRhU291cmNlLCBMaXN0UmFuZ2V9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBbGVydHN9IGZyb20gJy4uLy4uL2FsZXJ0cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBcHBDb2xvcnN9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7Rm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyLCBlbWl0UHJvbWlzZUV2ZW50LCBQcm9taXNlRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50cyc7XG5pbXBvcnQge1ByZWRlZmluZWRDb2xvcnN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7SW1hZ2VPcHRpb25zfSBmcm9tICdAY2FwYWNpdG9yL2NhbWVyYSc7XG5cbmltcG9ydCB7QVBQX1NIT1dfVE9PTFRJUH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7R2FsbGVyeU1vZGUsIEltYWdlRWRpdEV2ZW50LCBJbWFnZUVkaXRGb3JtYXQsIEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnR9IGZyb20gJy4vaW1hZ2UtZ2FsbGVyeS5tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIEltYWdlR2FsbGVyeVNsaWRlc2hvd01vZGUgPSAnbW9kYWwnIHwgJ2lubGluZSc7XG5cbmNvbnN0IEltYWdlR2FsbGVyeU1vZGVDb2xTaXplID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vc2FpYzogNCxcbiAgbGlzdDogMTIsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdhbGxlcnlTaXplcyB7XG4gIG1vc2FpYzogSW1hZ2VTaXplIHwgc3RyaW5nO1xuICBsaXN0OiBJbWFnZVNpemUgfCBzdHJpbmc7XG4gIG1vZGFsOiBJbWFnZVNpemUgfCBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb2xsZWN0aW9uVmlld2VyLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJvdGVjdGVkIF9kZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPjtcbiAgcHJvdGVjdGVkIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcm90ZWN0ZWQgem9vbUFjdGl2ZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgem9vbVNjYWxlID0gMTtcbiAgLyoqIFdoZXRoZXIgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSBpcyBjdXJyZW50bHkgc2hvd24gKG9ubHkgcmVsZXZhbnQgd2hlbiB6b29tUHJlc2VudGF0aW9uID09PSAnaW5saW5lJykuICovXG4gIHByb3RlY3RlZCBfc2xpZGVzaG93VmlzaWJsZSA9IGZhbHNlO1xuXG4gIHZpZXdDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxMaXN0UmFuZ2U+O1xuXG4gIEBJbnB1dCgpIGNhcmRDb2xvcjogc3RyaW5nIHwgUHJlZGVmaW5lZENvbG9ycztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRlYnVnOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCkgbW9kZTogR2FsbGVyeU1vZGUgPSBudWxsO1xuICBASW5wdXQoKSBjb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dUb29sYmFyID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dGYWJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93VGl0bGUgPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZFRvb2xiYXJCdXR0b246IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWRkVGV4dEJ1dHRvbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZENhcmRCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0NhcmRUb29sYmFyID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkQnV0dG9uQ29sb3I6IEFwcENvbG9ycyA9ICd0ZXJ0aWFyeSc7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvblRleHQ6IHN0cmluZyA9ICdDT01NT04uQlROX0FERCc7XG4gIEBJbnB1dCgpIGNhcmRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IFRhYmxlRWxlbWVudDxUPjsgaW1hZ2U6IFQ7IG1vZGU6IEdhbGxlcnlNb2RlIH0+O1xuICBASW5wdXQoKSBpbWFnZVNpemVzOiBJbWFnZUdhbGxlcnlTaXplcyA9IHtcbiAgICBtb3NhaWM6IDxJbWFnZVNpemU+J3NtYWxsJyxcbiAgICBsaXN0OiA8SW1hZ2VTaXplPidtZWRpdW0nLFxuICAgIG1vZGFsOiA8SW1hZ2VTaXplPidsYXJnZScsXG4gIH07XG4gIEBJbnB1dCgpIGltYWdlU2l6ZVF1ZXJ5UGFyYW0gPSAnc2l6ZSc7XG5cbiAgLyoqIEVuYWJsZSBtb3VzZS13aGVlbCB6b29tIGFuZCBtb3VzZS1kcmFnIHBhbiBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlIG9uIGRlc2t0b3ApLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlTW91c2Vab29tOiBib29sZWFuID0gbnVsbDtcbiAgLyoqIFpvb20gc3RlcCBhcHBsaWVkIG9uIGVhY2ggbW91c2Utd2hlZWwgdGljayAoZGVmYXVsdCAwLjMpLiAqL1xuICBASW5wdXQoKSB3aGVlbFpvb21TdGVwID0gMC4zO1xuICAvKiogTWF4aW11bSB6b29tIHJhdGlvIHJlYWNoYWJsZSB2aWEgbW91c2Ugd2hlZWwgKGRlZmF1bHQgMykuICovXG4gIEBJbnB1dCgpIG1heFpvb21SYXRpbyA9IDM7XG4gIC8qKiBFbmFibGUgOTDCsCByb3RhdGlvbiBidXR0b25zIGluIHRoZSBzbGlkZXNob3cgKGRlZmF1bHRzIHRvIHRydWUpLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlUm90YXRlOiBib29sZWFuID0gbnVsbDtcbiAgLyoqIEVuYWJsZSB0aGUgY3JvcCB0b29sIGluIHRoZSBzbGlkZXNob3cgKGRlZmF1bHRzIHRvIHRydWUpLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZW5hYmxlQ3JvcDogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBJbWFnZSBmb3JtYXQgdXNlZCB3aGVuIGVtaXR0aW5nIHRoZSBlZGl0ZWQgKGNyb3BwZWQvcm90YXRlZCkgaW1hZ2UuICovXG4gIEBJbnB1dCgpIGVkaXRpb25Gb3JtYXQ6IEltYWdlRWRpdEZvcm1hdCA9ICdwbmcnO1xuICAvKiogRXhwb3J0IHF1YWxpdHksIGFwcGxpZWQgb25seSB3aGVuIGVkaXRpb25Gb3JtYXQgaXMgJ2pwZWcnICgwIHRvIDEpLiAqL1xuICBASW5wdXQoKSBlZGl0aW9uUXVhbGl0eSA9IDAuOTI7XG4gIC8qKiBXaGVyZSB0byBzaG93IHRoZSBzbGlkZXNob3c6IGluIGEgZnVsbC1zY3JlZW4gbW9kYWwgKGRlZmF1bHQpLCBvciBpbmxpbmUsIGFzIGFuIG92ZXJsYXkgb3ZlciB0aGUgZ2FsbGVyeSBpdHNlbGYgKGRlc2t0b3Agb25seSkuICovXG4gIEBJbnB1dCgpIHNsaWRlc2hvd01vZGU6IEltYWdlR2FsbGVyeVNsaWRlc2hvd01vZGUgPSAnaW5saW5lJztcbiAgLyoqIEhlaWdodCBvZiB0aGUgaW5saW5lIHNsaWRlc2hvdyBvdmVybGF5IChDU1MgdmFsdWUsIGUuZy4gJzYwdmgnKS4gT25seSB1c2VkIHdoZW4gem9vbVByZXNlbnRhdGlvbiBpcyAnaW5saW5lJy4gKi9cbiAgQElucHV0KCkgaW5saW5lWm9vbUhlaWdodCA9ICcxMDAlJztcbiAgLyoqIFdoZXRoZXIgcmVhY2hpbmcgdGhlIGxhc3QgKHJlc3AuIGZpcnN0KSBpbWFnZSBzaG91bGQgd3JhcCBhcm91bmQgdG8gdGhlIGZpcnN0IChyZXNwLiBsYXN0KSBvbmUuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZVNsaWRlc2hvd0xvb3AgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciBtb3JlIHJvd3MgbWF5IGV4aXN0IGJleW9uZCB0aGUgb25lcyBjdXJyZW50bHkgbG9hZGVkIChlLmcuIGEgZnVydGhlciBwYWdlLCBub3QgeWV0IGZldGNoZWQpLlxuICAgKiBXaGVuIHRydWUsIHJlYWNoaW5nIHRoZSBsYXN0IGltYWdlIGFza3MgdGhlIHBhcmVudCAodmlhIGBmZXRjaE1vcmVgKSBpbnN0ZWFkIG9mIGxvb3Bpbmcvc3RvcHBpbmcuXG4gICAqIFRoZSBnYWxsZXJ5IGhhcyBubyBvcGluaW9uIG9uIGhvdyBmZXRjaGluZyBpcyBhY3R1YWxseSBkb25lOiBpdCdzIGVudGlyZWx5IHVwIHRvIHRoZSBwYXJlbnQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2FuRmV0Y2hNb3JlID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPFQsIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgIT09IGRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XG4gICAgfVxuICB9XG4gIGdldCBkYXRhU291cmNlKCk6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgZ2V0IGVuYWJsZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogVGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBpc1NsaWRlc2hvd1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NsaWRlc2hvd1Zpc2libGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5saW5lIHNsaWRlc2hvdyBvdmVybGF5IGlzIGN1cnJlbnRseSBzaG93biBvdmVyIHRoZSBnYWxsZXJ5IGdyaWQuIE9ubHkgbWVhbmluZ2Z1bCBmb3JcbiAgICogYHNsaWRlc2hvd01vZGUgPT09ICdpbmxpbmUnYDogaW4gJ21vZGFsJyBtb2RlLCB0aGUgZ3JpZCBiZWhpbmQgdGhlIChmdWxseSBvcGFxdWUpIG1vZGFsIG11c3Qgc3RheVxuICAgKiB1bnRvdWNoZWQsIG90aGVyd2lzZSB0b2dnbGluZyBpdCBpbi9vdXQgb2YgdmlldyBjYXVzZXMgYSBsYXlvdXQganVtcCB3aGVuIHRoZSBtb2RhbCBpcyBkaXNtaXNzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzSW5saW5lU2xpZGVzaG93T3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zbGlkZXNob3dNb2RlID09PSAnaW5saW5lJyAmJiB0aGlzLl9zbGlkZXNob3dWaXNpYmxlO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnem9vbU1vZGFsJykgem9vbU1vZGFsOiBJb25Nb2RhbDtcbiAgQFZpZXdDaGlsZCgndGl0bGVQb3BvdmVyJykgdGl0bGVQb3BvdmVyOiBJb25Qb3BvdmVyO1xuXG4gIEBPdXRwdXQoKSBvbkJlZm9yZURlbGV0ZVJvd3MgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPGJvb2xlYW4sIHsgcm93czogVGFibGVFbGVtZW50PFQ+W10gfT4oKTtcbiAgQE91dHB1dCgpIG9uQWZ0ZXJBZGRSb3dzID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVsZW1lbnQ8VD5bXT4oKTtcbiAgQE91dHB1dCgpIG9uQWZ0ZXJFZGl0Um93ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRWRpdEltYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUVkaXRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgnY2xpY2tDYXJkJykgY2FyZENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgLyoqIEVtaXR0ZWQgZnJvbSB0aGUgc2xpZGVzaG93IHdoZW5ldmVyIHRoZSBhY3RpdmUgc2xpZGUgbW92ZXMgYmFja3dhcmQgKHByZXZpb3VzIGltYWdlKS4gKi9cbiAgQE91dHB1dCgpIHByZXZpb3VzU2xpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPEltYWdlR2FsbGVyeVNsaWRlQ2hhbmdlRXZlbnQ8VD4+KCk7XG4gIC8qKiBFbWl0dGVkIGZyb20gdGhlIHNsaWRlc2hvdyB3aGVuZXZlciB0aGUgYWN0aXZlIHNsaWRlIG1vdmVzIGZvcndhcmQgKG5leHQgaW1hZ2UpLiAqL1xuICBAT3V0cHV0KCkgbmV4dFNsaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+PigpO1xuICAvKipcbiAgICogRm9yd2FyZGVkIGFzLWlzIGZyb20gdGhlIHNsaWRlc2hvdyB3aGVuIHJlYWNoaW5nIHRoZSBsYXN0IGltYWdlIHdoaWxlIGBjYW5GZXRjaE1vcmVgIGlzIHRydWU6IHRoZVxuICAgKiBwYXJlbnQgbXVzdCBmZXRjaCB0aGUgbmV4dCBwYWdlIChob3dldmVyIGl0IGRvZXMgc28pIGFuZCByZXNvbHZlIHdpdGggd2hldGhlciBuZXcgcm93cyB3ZXJlIGFkZGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGZldGNoTW9yZSA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwgdm9pZD4oKTtcblxuICBAT3V0cHV0KCkgc2xpZGVzaG93T3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgc2xpZGVzaG93Q2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGltYWdlU2VydmljZTogSW1hZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBzdGFydDogMCwgZW5kOiBOdW1iZXIuTUFYX1ZBTFVFIH0pO1xuXG4gICAgLy8gREVWIGxvZ1xuICAgIHRoaXMuZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBpc01vYmlsZSh3aW5kb3cpKTtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPz8gKHRoaXMubW9iaWxlID8gJ2xpc3QnIDogJ21vc2FpYycpO1xuICAgIHRoaXMuX2NvbFNpemUgPSBJbWFnZUdhbGxlcnlNb2RlQ29sU2l6ZVt0aGlzLm1vZGVdO1xuICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0b0Jvb2xlYW4odGhpcy5zaG93VG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dDYXJkVG9vbGJhciA9IHRvQm9vbGVhbih0aGlzLnNob3dDYXJkVG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dBZGRDYXJkQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0FkZENhcmRCdXR0b24sIHRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dGYWJCdXR0b24gPSB0b0Jvb2xlYW4odGhpcy5zaG93RmFiQnV0dG9uLCB0aGlzLm1vYmlsZSAmJiAhdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbik7XG4gICAgdGhpcy5zaG93QWRkVG9vbGJhckJ1dHRvbiA9IHRoaXMuc2hvd0FkZFRvb2xiYXJCdXR0b24gPz8gKHRoaXMuc2hvd1Rvb2xiYXIgJiYgIXRoaXMucmVhZE9ubHkpO1xuICAgIHRoaXMuZW5hYmxlTW91c2Vab29tID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlTW91c2Vab29tLCAhdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlUm90YXRlLCB0cnVlKTtcbiAgICB0aGlzLmVuYWJsZUNyb3AgPSB0b0Jvb2xlYW4odGhpcy5lbmFibGVDcm9wLCB0cnVlKTtcbiAgICAvLyBUaGUgaW5saW5lIHByZXNlbnRhdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gZGVza3RvcDogdGhlcmUgaXMgbm8gXCJyZXN0IG9mIHRoZSBwYWdlXCIgd29ydGhcbiAgICAvLyBwcmVzZXJ2aW5nIG9uIGEgc21hbGwgbW9iaWxlIHNjcmVlbiwgYW5kIHRoZSBmdWxsc2NyZWVuIG1vZGFsIGFscmVhZHkgd29ya3Mgd2VsbCB0aGVyZS5cbiAgICBpZiAodGhpcy5tb2JpbGUpIHRoaXMuc2xpZGVzaG93TW9kZSA9ICdtb2RhbCc7XG5cbiAgICAvLyBHZXQgbW9kYWwgcHJlc2VudGluZyBlbGVtZW50IChpT1Mgb25seSlcbiAgICB0aGlzLl9wcmVzZW50aW5nRWxlbWVudCA9IHRoaXMubW9iaWxlID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlvbi1wYWdlJykgOiBudWxsO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgIXRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkKFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgb3B0cz86IHsgbWF4SGVpZ2h0PzogbnVtYmVyOyBtYXdXaWR0aD86IG51bWJlcjsgcXVhbGl0eT86IG51bWJlcjsgbXVsdGlwbGU/OiBib29sZWFuOyBhdXRvSGlkZURyb3BBcmVhPzogYm9vbGVhbiB9ICYgT21pdDxcbiAgICAgIEltYWdlT3B0aW9ucyxcbiAgICAgICdyZXN1bHRUeXBlJ1xuICAgID5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2UuYWRkKGV2ZW50LCBvcHRzKTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkoaW1hZ2VzKSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBbaW1hZ2UtZ2FsbGVyeV0gQWRkaW5nIG5ldyAke2ltYWdlcy5sZW5ndGh9IGltYWdlKHMpYCwgaW1hZ2VzKTtcblxuICAgIGNvbnN0IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdID0gW107XG4gICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KCk7XG4gICAgICByb3cuY3VycmVudERhdGEgPSBpbWFnZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgIGNvbnN0IGFkZGVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2ltYWdlLWdhbGxlcnldIENhbm5vdCBjb25maXJtIG5ldyBpbWFnZSEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkFmdGVyQWRkUm93cy5lbWl0KHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKFtyb3ddKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIG5ldyBpbWFnZScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5jYW5jZWxPckRlbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tpbWFnZS1nYWxsZXJ5XSBSZW1vdmluZyBpbWFnZSAoYXQgIycgKyByb3cuaWQgKyAnKScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHRvZ2dsZVZpZXdNb2RlKF8/OiBFdmVudCkge1xuICAgIHRoaXMuc2V0Vmlld01vZGUodGhpcy5tb2RlID09PSAnbGlzdCcgPyAnbW9zYWljJyA6ICdsaXN0Jyk7XG4gIH1cblxuICBzZXRWaWV3TW9kZShtb2RlOiBHYWxsZXJ5TW9kZSkge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IG1vZGUpIHtcbiAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLl9jb2xTaXplID0gSW1hZ2VHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGFzeW5jIGVkaXRUaXRsZShldmVudDogTW91c2VFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQ/LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5mb2N1c0NhcmRUb29sYmFyKGNhcmRUb29sYmFyKTtcblxuICAgIGNvbnN0IHRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cuY3VycmVudERhdGEudGl0bGUsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KV0pKTtcbiAgICB0aGlzLl90aXRsZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHsgdGl0bGU6IHRpdGxlQ29udHJvbCB9KTtcbiAgICB0aGlzLl90aXRsZUF1dG9mb2N1cyA9IHRoaXMubW9iaWxlICYmIHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5yZWFkT25seTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGF3YWl0IHRoaXMudGl0bGVQb3BvdmVyLnByZXNlbnQoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcm9sZSB9ID0gYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoIXJvbGUgfHwgcm9sZSAhPT0gJ0NBTkNFTCcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5XSBVc2VyIHNldCB0aXRsZTogJyArIGRhdGEpO1xuICAgICAgcm93LmN1cnJlbnREYXRhLnRpdGxlID0gZGF0YTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLm9uQWZ0ZXJFZGl0Um93LmVtaXQocm93KTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSB0b29sYmFyLCBiZWNhdXNlIHRoZSBmb2N1cyBoYXZlIGJlZW4gZ2l2ZW4gdG8gdGhlIGV2ZW50J3Mgb3JpZ2luICh0aGUgZWRpdCBidXR0b24pXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVDYXJkVG9vbGJhcihjYXJkVG9vbGJhciksIDc1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNDYXJkVG9vbGJhcihjYXJkVG9vbGJhcjogYW55KSB7XG4gICAgY29uc3QgZWwgPSBjYXJkVG9vbGJhclsnZWwnXSBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdmb2N1c2VkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGlkZUNhcmRUb29sYmFyKGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBjb25zdCBlbCA9IGNhcmRUb29sYmFyWydlbCddIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3dpdGNoRGF0YVNvdXJjZShkYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8VD4pIHtcbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuX2RhdGFTb3VyY2UpKSB7XG4gICAgICB0aGlzLl9kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpIHtcbiAgICAvLyBJZiBubyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBmb3IgY2hhbmdlcy5cbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGF0YVN0cmVhbTogT2JzZXJ2YWJsZTxUYWJsZUVsZW1lbnQ8VD5bXSB8IFJlYWRvbmx5QXJyYXk8VGFibGVFbGVtZW50PFQ+Pj47XG4gICAgaWYgKGlzRGF0YVNvdXJjZSh0aGlzLmRhdGFTb3VyY2UpKSB7XG4gICAgICBkYXRhU3RyZWFtID0gdGhpcy5kYXRhU291cmNlLmNvbm5lY3QodGhpcyk7XG4gICAgfVxuICAgIGlmIChkYXRhU3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IHRoaXMuZ2V0VGFibGVVbmtub3duRGF0YVNvdXJjZUVycm9yKCk7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24gPSBkYXRhU3RyZWFtLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3lTdWJqZWN0KSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbaW1hZ2UtZ2FsbGVyeV0gUmVjZWl2ZWQgbmV3IHJvd3MnLCBkYXRhKTtcbiAgICAgIHRoaXMuX2RhdGEkLm5leHQoZGF0YSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHtcbiAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTtcbiAgfVxuXG4gIGNsaWNrQ2FyZChldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgLy8gRGVsZWdhdGUgY2xpY2sgYWN0aW9uXG4gICAgaWYgKHRoaXMuY2FyZENsaWNrZWQub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMuY2FyZENsaWNrZWQuZW1pdChyb3cpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgb3BlbiB0aGUgc2xpZGVzaG93XG4gICAgdGhpcy5vcGVuU2xpZGVzaG93KGV2ZW50LCByb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBzbGlkZXNob3cgKGlubGluZSBvdmVybGF5LCBvciBmdWxsLXNjcmVlbiBtb2RhbCwgZGVwZW5kaW5nIG9uIGB6b29tUHJlc2VudGF0aW9uYCkgb24gdGhlIHJvdyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqIENhbiBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQgKGUuZy4gdG8gb3BlbiB0aGUgZ2FsbGVyeSBkaXJlY3RseSBvbiBhIGdpdmVuIGltYWdlKS5cbiAgICovXG4gIGFzeW5jIG9wZW5TbGlkZXNob3coZXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkLCByb3c6IFRhYmxlRWxlbWVudDxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3dzPy5maW5kSW5kZXgoKHIpID0+IHIgPT09IHJvdyk7XG4gICAgaWYgKGluZGV4ID09IG51bGwgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93Q291bnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2ltYWdlLWdhbGxlcnldIENhbm5vdCBvcGVuIHNsaWRlc2hvdzogaW52YWxpZCBpbmRleCAoJHtpbmRleH0pYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkUm93SW5kZXggIT0gaW5kZXgpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMubWFya1NsaWRlc2hvd0FzT3BlbmVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLnByZXNlbnQoKTtcbiAgICAgIHRoaXMubWFya1NsaWRlc2hvd0FzT3BlbmVkKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuem9vbU1vZGFsLm9uRGlkRGlzbWlzcygpO1xuXG4gICAgICAvLyBNYXJrIGFzIGNsb3NlZFxuICAgICAgdGhpcy5tYXJrU2xpZGVzaG93QXNDbG9zZWQoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbG9zZVNsaWRlc2hvdyhyb2xlPzogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMubWFya1NsaWRlc2hvd0FzQ2xvc2VkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuem9vbU1vZGFsLmRpc21pc3MobnVsbCwgcm9sZSA/PyAnY2FuY2VsJyk7XG4gICAgICB0aGlzLm1hcmtTbGlkZXNob3dBc0Nsb3NlZCgpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtTbGlkZXNob3dBc09wZW5lZCgpIHtcbiAgICBpZiAoIXRoaXMuX3NsaWRlc2hvd1Zpc2libGUpIHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSB0cnVlO1xuICAgICAgdGhpcy5zbGlkZXNob3dPcGVuZWQuZW1pdCh0cnVlKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBtYXJrU2xpZGVzaG93QXNDbG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuX3NsaWRlc2hvd1Zpc2libGUpIHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2xpZGVzaG93T3BlbmVkLmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5zbGlkZXNob3dDbG9zZWQuZW1pdCgpO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRlbGV0ZSByZXF1ZXN0IGNvbWluZyBmcm9tIHRoZSBzbGlkZXNob3cgY29tcG9uZW50IChlaXRoZXIgaW5saW5lIG9yIGluIHRoZSBtb2RhbCk6XG4gICAqIHJ1bnMgdGhlIHNhbWUgY29uZmlybWF0aW9uL2RlbGV0aW9uIGZsb3cgYXMgYSBjYXJkJ3MgZGVsZXRlIGJ1dHRvbiwgdGhlbiByZXNvbHZlcyB0aGUgcHJvbWlzZVxuICAgKiBzbyB0aGUgc2xpZGVzaG93IGtub3dzIHdoZXRoZXIgdG8gcmVzZXQgaXRzIHpvb20gb3IgY2xvc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TbGlkZXNob3dEZWxldGVSZXF1ZXN0ZWQocHJvbWlzZUV2ZW50OiBQcm9taXNlRXZlbnQ8Ym9vbGVhbiwgeyByb3c6IFRhYmxlRWxlbWVudDxUPiB9Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGUocHJvbWlzZUV2ZW50LCBwcm9taXNlRXZlbnQuZGV0YWlsLnJvdyk7XG4gICAgICBwcm9taXNlRXZlbnQuZGV0YWlsLnN1Y2Nlc3MoZGVsZXRlZCk7XG4gICAgICBpZiAoZGVsZXRlZCAmJiBpc0VtcHR5QXJyYXkodGhpcy5yb3dzKSAmJiB0aGlzLnNsaWRlc2hvd01vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTbGlkZXNob3coKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHByb21pc2VFdmVudC5kZXRhaWwuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuRGVsZXRlUm93cyhyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgaWYgKHRoaXMub25CZWZvcmVEZWxldGVSb3dzLm9ic2VydmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW5EZWxldGUgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMub25CZWZvcmVEZWxldGVSb3dzLCAnY2FuRGVsZXRlJywge1xuICAgICAgICAgIGRldGFpbDogeyByb3dzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbkRlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGlmIGNhbiBkZWxldGUgcm93cycsIGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maXJtQmVmb3JlRGVsZXRlKSB7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBBbGVydHMuYXNrRGVsZXRlQ29uZmlybWF0aW9uKHRoaXMuYWx0ZXJDdHJsLCB0aGlzLnRyYW5zbGF0ZSwgZXZlbnQpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybiBmYWxzZTsgLy8gQ2FuY2VsbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW1hZ2VTaXplUXVlcnlQYXJhbXMobW9kZT86IEdhbGxlcnlNb2RlIHwgJ21vZGFsJyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIG1vZGUgPSBtb2RlID8/IHRoaXMubW9kZTtcbiAgICBpZiAoIXRoaXMuaW1hZ2VTaXplUXVlcnlQYXJhbSB8fCBpc05pbE9yQmxhbmsodGhpcy5pbWFnZVNpemVzPy5bbW9kZV0pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtXTogdGhpcy5pbWFnZVNpemVzW21vZGVdLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIkBpZiAoc2hvd1Rvb2xiYXIgJiYgIWlzSW5saW5lU2xpZGVzaG93T3Blbikge1xuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiZ2FsbGVyeS10b29sYmFyXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaW9uLWJ1dHRvbnNbc2xvdD1zdGFydF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8IS0tIEFkZCAtLT5cbiAgICBAaWYgKCFyZWFkT25seSAmJiBzaG93QWRkVG9vbGJhckJ1dHRvbiAmJiBlbmFibGVkKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpb24tYnV0dG9uc1tzbG90PWVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPCEtLSBUb2dnbGUgdmlldyBtb2RlIC0tPlxuICAgICAgPGlvbi1zZWdtZW50IChpb25DaGFuZ2UpPVwidG9nZ2xlVmlld01vZGUoJGV2ZW50KVwiIGNvbG9yPVwiYWNjZW50XCIgW3ZhbHVlXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gW3ZhbHVlXT1cIjRcIj5cbiAgICAgICAgICA8bWF0LWljb24+dmlld19tb2R1bGU8L21hdC1pY29uPlxuICAgICAgICA8L2lvbi1zZWdtZW50LWJ1dHRvbj5cbiAgICAgICAgPGlvbi1zZWdtZW50LWJ1dHRvbiBbdmFsdWVdPVwiMTJcIj5cbiAgICAgICAgICA8bWF0LWljb24+dmlld19saXN0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICA8L2lvbi1zZWdtZW50PlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gIDwvaW9uLXRvb2xiYXI+XG59XG5cbjxkaXZcbiAgY2xhc3M9XCJnYWxsZXJ5LWNvbnRhaW5lciBpb24tcGFkZGluZy1ib3R0b20ge3sgbW9kZSB9fVwiXG4gIFtjbGFzcy5pbmxpbmUtem9vbS1hY3RpdmVdPVwiaXNJbmxpbmVTbGlkZXNob3dPcGVuXCJcbiAgW3N0eWxlLi0taW5saW5lLXpvb20taGVpZ2h0XT1cImlubGluZVpvb21IZWlnaHRcIlxuPlxuICBAaWYgKG1vYmlsZSAmJiB6b29tQWN0aXZlKSB7XG4gICAgPGRpdiBjbGFzcz1cImJhY2tkcm9wXCIgW3N0eWxlLm9wYWNpdHldPVwiem9vbVNjYWxlXCI+PC9kaXY+XG4gIH1cblxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cImlzSW5saW5lU2xpZGVzaG93T3BlblwiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2wgKnJ4Rm9yPVwibGV0IHJvdyBvZiBfZGF0YSQ7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtzaXplXT1cIl9jb2xTaXplXCI+XG4gICAgICAgIEBsZXQgaW1hZ2UgPSByb3cgfCBwcm9wZXJ0eUdldDogJ2N1cnJlbnREYXRhJztcbiAgICAgICAgQGlmIChjYXJkVGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdywgbW9kZTogbW9kZSwgaW1hZ2U6IGltYWdlIH1cIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGlvbi1jYXJkXG4gICAgICAgICAgICAjY2FyZFxuICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS1jYXJkXCJcbiAgICAgICAgICAgIFtjbGFzcy56b29tLWhvdmVyXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgW2NvbG9yXT1cImNhcmRDb2xvclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tDYXJkKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgQGZhZGVJbkFuaW1hdGlvblxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJjYXJkLXRodW1ibmFpbFwiPlxuICAgICAgICAgICAgICBAaWYgKGltYWdlLnVybCkge1xuICAgICAgICAgICAgICAgIDxpb24taW1nIFtzcmNdPVwiaW1hZ2UudXJsIHwgYXBwZW5kUXVlcnlQYXJhbXM6IGdldEltYWdlU2l6ZVF1ZXJ5UGFyYW1zKClcIiAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8aW9uLWltZyBbc3JjXT1cImltYWdlLmRhdGFVcmxcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2ZpZ3VyZT5cblxuICAgICAgICAgICAgPCEtLSB0b29sYmFyIGZvciB0aXRsZSAod2hlbiBub3QgaG92ZXIpIC0tPlxuICAgICAgICAgICAgQGlmIChzaG93VGl0bGUgJiYgaW1hZ2UudGl0bGUpIHtcbiAgICAgICAgICAgICAgPGlvbi10b29sYmFyIGNvbG9yPVwidHJhbnNwYXJlbnRcIiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBpbWFnZS50aXRsZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIGFjdGlvbiB0b29sYmFyIHNob3duIHdoZW4gaG92ZXIgaW1hZ2UgLS0+XG4gICAgICAgICAgICBAaWYgKCFyZWFkT25seSAmJiAhbW9iaWxlICYmIHNob3dDYXJkVG9vbGJhcikge1xuICAgICAgICAgICAgICA8aW9uLXRvb2xiYXIgI2NhcmRUb29sYmFyIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICA8IS0tIGVkaXQgdGl0bGUgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgc2xvdD1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUaXRsZSgkZXZlbnQsIHJvdywgY2FyZFRvb2xiYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvY3VzaW4pPVwiZm9jdXNDYXJkVG9vbGJhcihjYXJkVG9vbGJhcilcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuY3VycmVudERhdGEudGl0bGUgfCBpc05vdE5pbE9yQmxhbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9FRElUX1RJVExFPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPklNQUdFLkdBTExFUlkuQlROX0FERF9USVRMRTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIGRlbGV0ZSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICBzbG90PVwiZW5kXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLWZsb2F0LWVuZFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPCEtLSBhZGQgYnV0dG9uIC0tPlxuICAgICAgQGlmICgoc2hvd0FkZFRleHRCdXR0b24gfHwgc2hvd0FkZENhcmRCdXR0b24pICYmICFyZWFkT25seSkge1xuICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJfY29sU2l6ZVwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgQGlmIChzaG93QWRkVGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImFkZCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgYWRkQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKHNob3dBZGRDYXJkQnV0dG9uKSB7XG4gICAgICAgICAgICA8aW9uLWNhcmRcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS1jYXJkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkKCRldmVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGFkZEJ1dHRvblRleHQgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChhZGRCdXR0b25UZXh0IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNhbWVyYVwiIFtjb2xvcl09XCJhZGRCdXR0b25Db2xvclwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiIFtjb2xvcl09XCJhZGRCdXR0b25Db2xvclwiIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgfVxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cblxuICA8IS0tIElubGluZSBzbGlkZXNob3c6IHNob3duIGFzIGFuIG92ZXJsYXkgZGlyZWN0bHkgd2l0aGluIHRoZSBnYWxsZXJ5LCBpbnN0ZWFkIG9mIGEgZnVsbC1zY3JlZW4gbW9kYWwuXG4gICAgICAgVGhlIHJlc3Qgb2YgdGhlIHBhZ2UgKG91dHNpZGUgdGhlIGdhbGxlcnkpIHN0YXlzIGZ1bGx5IHZpc2libGUgYW5kIHVzYWJsZSwgdW5saWtlIHRoZSBtb2RhbCdzIGJhY2tkcm9wLiAtLT5cbiAgQGlmIChpc0lubGluZVNsaWRlc2hvd09wZW4pIHtcbiAgICA8YXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93XG4gICAgICBjbGFzcz1cImlubGluZS1vdmVybGF5XCJcbiAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgW3NlbGVjdGVkSW5kZXhdPVwiX3NlbGVjdGVkUm93SW5kZXhcIlxuICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbZW5hYmxlTW91c2Vab29tXT1cImVuYWJsZU1vdXNlWm9vbVwiXG4gICAgICBbd2hlZWxab29tU3RlcF09XCJ3aGVlbFpvb21TdGVwXCJcbiAgICAgIFttYXhab29tUmF0aW9dPVwibWF4Wm9vbVJhdGlvXCJcbiAgICAgIFtlbmFibGVSb3RhdGVdPVwiZW5hYmxlUm90YXRlXCJcbiAgICAgIFtlbmFibGVDcm9wXT1cImVuYWJsZUNyb3BcIlxuICAgICAgW2VuYWJsZUxvb3BdPVwiZW5hYmxlU2xpZGVzaG93TG9vcFwiXG4gICAgICBbZWRpdGlvbkZvcm1hdF09XCJlZGl0aW9uRm9ybWF0XCJcbiAgICAgIFtlZGl0aW9uUXVhbGl0eV09XCJlZGl0aW9uUXVhbGl0eVwiXG4gICAgICBbaW1hZ2VTaXplUXVlcnlQYXJhbV09XCJpbWFnZVNpemVRdWVyeVBhcmFtXCJcbiAgICAgIFttb2RhbEltYWdlU2l6ZV09XCJpbWFnZVNpemVzPy5tb2RhbFwiXG4gICAgICAoZGVsZXRlUmVxdWVzdGVkKT1cIm9uU2xpZGVzaG93RGVsZXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgKGNsb3NlUmVxdWVzdGVkKT1cImNsb3NlU2xpZGVzaG93KClcIlxuICAgICAgKGFmdGVyRWRpdEltYWdlKT1cIm9uQWZ0ZXJFZGl0SW1hZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChhZnRlckVkaXRSb3cpPVwib25BZnRlckVkaXRSb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChwcmV2aW91c1NsaWRlKT1cInByZXZpb3VzU2xpZGUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIChuZXh0U2xpZGUpPVwibmV4dFNsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICBbY2FuRmV0Y2hNb3JlXT1cImNhbkZldGNoTW9yZVwiXG4gICAgICAoZmV0Y2hNb3JlKT1cImZldGNoTW9yZS5lbWl0KCRldmVudClcIlxuICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICA+PC9hcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3c+XG4gIH1cbjwvZGl2PlxuXG48IS0tIEZBQiBidXR0b246IGFkZCAtLT5cbkBpZiAoc2hvd0ZhYkJ1dHRvbiAmJiAhcmVhZE9ubHkpIHtcbiAgPGlvbi1mYWIgc2xvdD1cImZpeGVkXCIgdmVydGljYWw9XCJib3R0b21cIiBob3Jpem9udGFsPVwiZW5kXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiZGlzYWJsZWRcIiBAZmFkZUluT3V0QW5pbWF0aW9uPlxuICAgIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cImFkZCgkZXZlbnQpXCI+XG4gICAgICA8aW9uLWljb24gbmFtZT1cImNhbWVyYVwiPjwvaW9uLWljb24+XG4gICAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIiBzdHlsZT1cImxlZnQ6IDMzcHg7IHRvcDogOXB4OyBmb250LXNpemU6IDIwcHhcIj48L2lvbi1pY29uPlxuICAgIDwvaW9uLWZhYi1idXR0b24+XG4gIDwvaW9uLWZhYj5cbn1cblxuPCEtLSBab29tIG1vZGFsIC0tPlxuQGlmIChzbGlkZXNob3dNb2RlID09PSAnbW9kYWwnKSB7XG4gIDxpb24tbW9kYWwgI3pvb21Nb2RhbCBjbGFzcz1cInN0YWNrLW1vZGFsIHpvb20tbW9kYWxcIiBbY2xhc3MubW9kYWwtZnVsbHNjcmVlbl09XCJtb2JpbGVcIiBbY2xhc3MubW9kYWwtbGFyZ2VdPVwiIW1vYmlsZVwiPlxuICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgIDxhcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3dcbiAgICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICAgIFtzZWxlY3RlZEluZGV4XT1cIl9zZWxlY3RlZFJvd0luZGV4XCJcbiAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICBbcmVhZE9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbZGVidWddPVwiZGVidWdcIlxuICAgICAgICBbZW5hYmxlTW91c2Vab29tXT1cImVuYWJsZU1vdXNlWm9vbVwiXG4gICAgICAgIFt3aGVlbFpvb21TdGVwXT1cIndoZWVsWm9vbVN0ZXBcIlxuICAgICAgICBbbWF4Wm9vbVJhdGlvXT1cIm1heFpvb21SYXRpb1wiXG4gICAgICAgIFtlbmFibGVSb3RhdGVdPVwiZW5hYmxlUm90YXRlXCJcbiAgICAgICAgW2VuYWJsZUNyb3BdPVwiZW5hYmxlQ3JvcFwiXG4gICAgICAgIFtlbmFibGVMb29wXT1cImVuYWJsZVNsaWRlc2hvd0xvb3BcIlxuICAgICAgICBbZWRpdGlvbkZvcm1hdF09XCJlZGl0aW9uRm9ybWF0XCJcbiAgICAgICAgW2VkaXRpb25RdWFsaXR5XT1cImVkaXRpb25RdWFsaXR5XCJcbiAgICAgICAgW2ltYWdlU2l6ZVF1ZXJ5UGFyYW1dPVwiaW1hZ2VTaXplUXVlcnlQYXJhbVwiXG4gICAgICAgIFttb2RhbEltYWdlU2l6ZV09XCJpbWFnZVNpemVzPy5tb2RhbFwiXG4gICAgICAgIChkZWxldGVSZXF1ZXN0ZWQpPVwib25TbGlkZXNob3dEZWxldGVSZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChjbG9zZVJlcXVlc3RlZCk9XCJjbG9zZVNsaWRlc2hvdygpXCJcbiAgICAgICAgKGFmdGVyRWRpdEltYWdlKT1cIm9uQWZ0ZXJFZGl0SW1hZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGFmdGVyRWRpdFJvdyk9XCJvbkFmdGVyRWRpdFJvdy5lbWl0KCRldmVudClcIlxuICAgICAgICAocHJldmlvdXNTbGlkZSk9XCJwcmV2aW91c1NsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChuZXh0U2xpZGUpPVwibmV4dFNsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIFtjYW5GZXRjaE1vcmVdPVwiY2FuRmV0Y2hNb3JlXCJcbiAgICAgICAgKGZldGNoTW9yZSk9XCJmZXRjaE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgID48L2FwcC1pbWFnZS1nYWxsZXJ5LXNsaWRlc2hvdz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2lvbi1tb2RhbD5cbn1cblxuPGlvbi1wb3BvdmVyICN0aXRsZVBvcG92ZXI+XG4gIDxuZy10ZW1wbGF0ZT5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiIGNka1RyYXBGb2N1cyBbY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJfdGl0bGVGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYXV0b1wiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgdHJhbnNsYXRlPklNQUdFLkdBTExFUlkuVElUTEU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJfdGl0bGVBdXRvZm9jdXNcIlxuICAgICAgICAgICAgKGtleWRvd24uY29udHJvbC5lbnRlcik9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhfdGl0bGVGb3JtLmNvbnRyb2xzLnRpdGxlLnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2lvbi1jb250ZW50PlxuXG4gICAgPGlvbi1mb290ZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBub3dyYXA+XG4gICAgICAgICAgPGlvbi1jb2w+PC9pb24tY29sPlxuXG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJ0aXRsZVBvcG92ZXIuZGlzbWlzcyhudWxsLCAnQ0FOQ0VMJylcIj5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIFtmaWxsXT1cImRpc2FibGVkID8gJ2NsZWFyJyA6ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgICAgICBjb2xvcj1cInRlcnRpYXJ5XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9WQUxJREFURV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fVkFMSURBVEVfV0lUSF9TSE9SVENVVF9IRUxQJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fVkFMSURBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tcG9wb3Zlcj5cbiJdfQ==
|
|
555
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9pbWFnZS9nYWxsZXJ5L2ltYWdlLWdhbGxlcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaW1hZ2UvZ2FsbGVyeS9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFBQyxXQUFXLEVBQWMsTUFBTSw0Q0FBNEMsQ0FBQztBQUlwRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBbUIsWUFBWSxFQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHcEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGdCQUFnQixFQUFlLE1BQU0sY0FB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e1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUYWJsZURhdGFTb3VyY2UsIFRhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RU5WSVJPTk1FTlQsIEVudmlyb25tZW50fSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtJbWFnZVNlcnZpY2V9IGZyb20gJy4uL2ltYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtJbWFnZSwgSW1hZ2VTaXplfSBmcm9tICcuLi9pbWFnZS5tb2RlbCc7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlciwgSW9uTW9kYWwsIElvblBvcG92ZXIsIFBsYXRmb3JtfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbn0gZnJvbSAnLi4vLi4vbWF0ZXJpYWwvbWF0ZXJpYWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWxPckJsYW5rLCB0b0Jvb2xlYW59IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0NvbGxlY3Rpb25WaWV3ZXIsIGlzRGF0YVNvdXJjZSwgTGlzdFJhbmdlfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QWxlcnRzfSBmcm9tICcuLi8uLi9hbGVydHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7QXBwQ29sb3JzfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Y3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlciwgZW1pdFByb21pc2VFdmVudCwgUHJvbWlzZUV2ZW50fSBmcm9tICcuLi8uLi9ldmVudHMnO1xuaW1wb3J0IHtQcmVkZWZpbmVkQ29sb3JzfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge0ltYWdlT3B0aW9uc30gZnJvbSAnQGNhcGFjaXRvci9jYW1lcmEnO1xuXG5pbXBvcnQge0FQUF9TSE9XX1RPT0xUSVB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge0dhbGxlcnlNb2RlLCBJbWFnZUVkaXRFdmVudCwgSW1hZ2VFZGl0Rm9ybWF0LCBJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50fSBmcm9tICcuL2ltYWdlLWdhbGxlcnkubW9kZWwnO1xuaW1wb3J0IHtBcHBJbWFnZUdhbGxlcnlTbGlkZXNob3dDb21wb25lbnR9IGZyb20gJy4vc2xpZGVzaG93L2ltYWdlLWdhbGxlcnktc2xpZGVzaG93LmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIEltYWdlR2FsbGVyeVNsaWRlc2hvd01vZGUgPSAnbW9kYWwnIHwgJ2lubGluZSc7XG5cbmNvbnN0IEltYWdlR2FsbGVyeU1vZGVDb2xTaXplID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vc2FpYzogNCxcbiAgbGlzdDogMTIsXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdhbGxlcnlTaXplcyB7XG4gIG1vc2FpYzogSW1hZ2VTaXplIHwgc3RyaW5nO1xuICBsaXN0OiBJbWFnZVNpemUgfCBzdHJpbmc7XG4gIG1vZGFsOiBJbWFnZVNpemUgfCBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbWFnZS1nYWxsZXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWdhbGxlcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1nYWxsZXJ5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5BbmltYXRpb24sIGZhZGVJbk91dEFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbWFnZUdhbGxlcnlDb21wb25lbnQ8VCBleHRlbmRzIEltYWdlPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb2xsZWN0aW9uVmlld2VyLCBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgcHJvdGVjdGVkIF9kZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPjtcbiAgcHJvdGVjdGVkIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFibGVFbGVtZW50PFQ+W10gfCBSZWFkb25seUFycmF5PFRhYmxlRWxlbWVudDxUPj4+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBfY29sU2l6ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkUm93SW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9wcmVzZW50aW5nRWxlbWVudDogRWxlbWVudCA9IG51bGw7XG4gIHByb3RlY3RlZCBfdGl0bGVGb3JtOiBGb3JtR3JvdXA7XG4gIHByb3RlY3RlZCBfdGl0bGVBdXRvZm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zbGlkZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJvdGVjdGVkIF9zaG93VG9vbHRpcCA9IGluamVjdChBUFBfU0hPV19UT09MVElQLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByb3RlY3RlZCB6b29tQWN0aXZlID0gZmFsc2U7XG4gIHByb3RlY3RlZCB6b29tU2NhbGUgPSAxO1xuICAvKiogV2hldGhlciB0aGUgaW5saW5lIHNsaWRlc2hvdyBvdmVybGF5IGlzIGN1cnJlbnRseSBzaG93biAob25seSByZWxldmFudCB3aGVuIHpvb21QcmVzZW50YXRpb24gPT09ICdpbmxpbmUnKS4gKi9cbiAgcHJvdGVjdGVkIF9zbGlkZXNob3dWaXNpYmxlID0gZmFsc2U7XG5cblxuICB2aWV3Q2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8TGlzdFJhbmdlPjtcblxuICBASW5wdXQoKSBjYXJkQ29sb3I6IHN0cmluZyB8IFByZWRlZmluZWRDb2xvcnM7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZWJ1ZzogYm9vbGVhbiA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbiA9IG51bGw7XG4gIEBJbnB1dCgpIG1vZGU6IEdhbGxlcnlNb2RlID0gbnVsbDtcbiAgQElucHV0KCkgY29uZmlybUJlZm9yZURlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93VG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93RmFiQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1RpdGxlID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBZGRUb29sYmFyQnV0dG9uOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0FkZFRleHRCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dBZGRDYXJkQnV0dG9uID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dDYXJkVG9vbGJhciA9IHRydWU7XG4gIEBJbnB1dCgpIGFkZEJ1dHRvbkNvbG9yOiBBcHBDb2xvcnMgPSAndGVydGlhcnknO1xuICBASW5wdXQoKSBhZGRCdXR0b25UZXh0OiBzdHJpbmcgPSAnQ09NTU9OLkJUTl9BREQnO1xuICBASW5wdXQoKSBjYXJkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBUYWJsZUVsZW1lbnQ8VD47IGltYWdlOiBUOyBtb2RlOiBHYWxsZXJ5TW9kZSB9PjtcbiAgQElucHV0KCkgaW1hZ2VTaXplczogSW1hZ2VHYWxsZXJ5U2l6ZXMgPSB7XG4gICAgbW9zYWljOiA8SW1hZ2VTaXplPidzbWFsbCcsXG4gICAgbGlzdDogPEltYWdlU2l6ZT4nbWVkaXVtJyxcbiAgICBtb2RhbDogPEltYWdlU2l6ZT4nbGFyZ2UnLFxuICB9O1xuICBASW5wdXQoKSBpbWFnZVNpemVRdWVyeVBhcmFtID0gJ3NpemUnO1xuXG4gIC8qKiBFbmFibGUgbW91c2Utd2hlZWwgem9vbSBhbmQgbW91c2UtZHJhZyBwYW4gaW4gdGhlIHNsaWRlc2hvdyAoZGVmYXVsdHMgdG8gdHJ1ZSBvbiBkZXNrdG9wKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZU1vdXNlWm9vbTogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBab29tIHN0ZXAgYXBwbGllZCBvbiBlYWNoIG1vdXNlLXdoZWVsIHRpY2sgKGRlZmF1bHQgMC4zKS4gKi9cbiAgQElucHV0KCkgd2hlZWxab29tU3RlcCA9IDAuMztcbiAgLyoqIE1heGltdW0gem9vbSByYXRpbyByZWFjaGFibGUgdmlhIG1vdXNlIHdoZWVsIChkZWZhdWx0IDMpLiAqL1xuICBASW5wdXQoKSBtYXhab29tUmF0aW8gPSAzO1xuICAvKiogRW5hYmxlIDkwwrAgcm90YXRpb24gYnV0dG9ucyBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZVJvdGF0ZTogYm9vbGVhbiA9IG51bGw7XG4gIC8qKiBFbmFibGUgdGhlIGNyb3AgdG9vbCBpbiB0aGUgc2xpZGVzaG93IChkZWZhdWx0cyB0byB0cnVlKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGVuYWJsZUNyb3A6IGJvb2xlYW4gPSBudWxsO1xuICAvKiogSW1hZ2UgZm9ybWF0IHVzZWQgd2hlbiBlbWl0dGluZyB0aGUgZWRpdGVkIChjcm9wcGVkL3JvdGF0ZWQpIGltYWdlLiAqL1xuICBASW5wdXQoKSBlZGl0aW9uRm9ybWF0OiBJbWFnZUVkaXRGb3JtYXQgPSAncG5nJztcbiAgLyoqIEV4cG9ydCBxdWFsaXR5LCBhcHBsaWVkIG9ubHkgd2hlbiBlZGl0aW9uRm9ybWF0IGlzICdqcGVnJyAoMCB0byAxKS4gKi9cbiAgQElucHV0KCkgZWRpdGlvblF1YWxpdHkgPSAwLjkyO1xuICAvKiogV2hlcmUgdG8gc2hvdyB0aGUgc2xpZGVzaG93OiBpbiBhIGZ1bGwtc2NyZWVuIG1vZGFsIChkZWZhdWx0KSwgb3IgaW5saW5lLCBhcyBhbiBvdmVybGF5IG92ZXIgdGhlIGdhbGxlcnkgaXRzZWxmIChkZXNrdG9wIG9ubHkpLiAqL1xuICBASW5wdXQoKSBzbGlkZXNob3dNb2RlOiBJbWFnZUdhbGxlcnlTbGlkZXNob3dNb2RlID0gJ2lubGluZSc7XG4gIC8qKiBIZWlnaHQgb2YgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSAoQ1NTIHZhbHVlLCBlLmcuICc2MHZoJykuIE9ubHkgdXNlZCB3aGVuIHpvb21QcmVzZW50YXRpb24gaXMgJ2lubGluZScuICovXG4gIEBJbnB1dCgpIGlubGluZVpvb21IZWlnaHQgPSAnMTAwJSc7XG4gIC8qKiBXaGV0aGVyIHJlYWNoaW5nIHRoZSBsYXN0IChyZXNwLiBmaXJzdCkgaW1hZ2Ugc2hvdWxkIHdyYXAgYXJvdW5kIHRvIHRoZSBmaXJzdCAocmVzcC4gbGFzdCkgb25lLiBEZWZhdWx0IHRydWUuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBlbmFibGVTbGlkZXNob3dMb29wID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbW9yZSByb3dzIG1heSBleGlzdCBiZXlvbmQgdGhlIG9uZXMgY3VycmVudGx5IGxvYWRlZCAoZS5nLiBhIGZ1cnRoZXIgcGFnZSwgbm90IHlldCBmZXRjaGVkKS5cbiAgICogV2hlbiB0cnVlLCByZWFjaGluZyB0aGUgbGFzdCBpbWFnZSBhc2tzIHRoZSBwYXJlbnQgKHZpYSBgZmV0Y2hNb3JlYCkgaW5zdGVhZCBvZiBsb29waW5nL3N0b3BwaW5nLlxuICAgKiBUaGUgZ2FsbGVyeSBoYXMgbm8gb3BpbmlvbiBvbiBob3cgZmV0Y2hpbmcgaXMgYWN0dWFsbHkgZG9uZTogaXQncyBlbnRpcmVseSB1cCB0byB0aGUgcGFyZW50LlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhbkZldGNoTW9yZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxULCBhbnksIGFueSwgYW55Pikge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhU291cmNlKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YVNvdXJjZSgpOiBUYWJsZURhdGFTb3VyY2U8VCwgYW55LCBhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG4gIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCByb3dzKCk6IFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YSQudmFsdWU7XG4gIH1cblxuICBnZXQgcm93Q291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cz8ubGVuZ3RoIHx8IDA7XG4gIH1cblxuICBnZXQgaXNTbGlkZXNob3dWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9zbGlkZXNob3dWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlubGluZSBzbGlkZXNob3cgb3ZlcmxheSBpcyBjdXJyZW50bHkgc2hvd24gb3ZlciB0aGUgZ2FsbGVyeSBncmlkLiBPbmx5IG1lYW5pbmdmdWwgZm9yXG4gICAqIGBzbGlkZXNob3dNb2RlID09PSAnaW5saW5lJ2A6IGluICdtb2RhbCcgbW9kZSwgdGhlIGdyaWQgYmVoaW5kIHRoZSAoZnVsbHkgb3BhcXVlKSBtb2RhbCBtdXN0IHN0YXlcbiAgICogdW50b3VjaGVkLCBvdGhlcndpc2UgdG9nZ2xpbmcgaXQgaW4vb3V0IG9mIHZpZXcgY2F1c2VzIGEgbGF5b3V0IGp1bXAgd2hlbiB0aGUgbW9kYWwgaXMgZGlzbWlzc2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBpc0lubGluZVNsaWRlc2hvd09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScgJiYgdGhpcy5fc2xpZGVzaG93VmlzaWJsZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3pvb21Nb2RhbCcpIHpvb21Nb2RhbDogSW9uTW9kYWw7XG4gIEBWaWV3Q2hpbGQoJ3RpdGxlUG9wb3ZlcicpIHRpdGxlUG9wb3ZlcjogSW9uUG9wb3ZlcjtcblxuICBAT3V0cHV0KCkgb25CZWZvcmVEZWxldGVSb3dzID0gY3JlYXRlUHJvbWlzZUV2ZW50RW1pdHRlcjxib29sZWFuLCB7IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIH0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyQWRkUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+W10+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRWRpdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVFbGVtZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25BZnRlckVkaXRJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VFZGl0RXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoJ2NsaWNrQ2FyZCcpIGNhcmRDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZUVsZW1lbnQ8VD4+KCk7XG4gIC8qKiBFbWl0dGVkIGZyb20gdGhlIHNsaWRlc2hvdyB3aGVuZXZlciB0aGUgYWN0aXZlIHNsaWRlIG1vdmVzIGJhY2t3YXJkIChwcmV2aW91cyBpbWFnZSkuICovXG4gIEBPdXRwdXQoKSBwcmV2aW91c1NsaWRlID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUdhbGxlcnlTbGlkZUNoYW5nZUV2ZW50PFQ+PigpO1xuICAvKiogRW1pdHRlZCBmcm9tIHRoZSBzbGlkZXNob3cgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBzbGlkZSBtb3ZlcyBmb3J3YXJkIChuZXh0IGltYWdlKS4gKi9cbiAgQE91dHB1dCgpIG5leHRTbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VHYWxsZXJ5U2xpZGVDaGFuZ2VFdmVudDxUPj4oKTtcbiAgLyoqXG4gICAqIEZvcndhcmRlZCBhcy1pcyBmcm9tIHRoZSBzbGlkZXNob3cgd2hlbiByZWFjaGluZyB0aGUgbGFzdCBpbWFnZSB3aGlsZSBgY2FuRmV0Y2hNb3JlYCBpcyB0cnVlOiB0aGVcbiAgICogcGFyZW50IG11c3QgZmV0Y2ggdGhlIG5leHQgcGFnZSAoaG93ZXZlciBpdCBkb2VzIHNvKSBhbmQgcmVzb2x2ZSB3aXRoIHdoZXRoZXIgbmV3IHJvd3Mgd2VyZSBhZGRlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBmZXRjaE1vcmUgPSBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyPGJvb2xlYW4sIHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpIHNsaWRlc2hvd09wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNsaWRlc2hvd0Nsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuXG4gIGdldCBhY3RpdmVJbmRleCgpIHtcbiAgICBpZiAoIXRoaXMuaW5saW5lU2xpZGVzaG93KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgc2xpZGUgYWN0aXZlIGluZGV4IHdoaWxlIGlubGluZSBzbGlkZXNob3cgaXMgb3BlbicpO1xuICAgIHJldHVybiB0aGlzLmlubGluZVNsaWRlc2hvdy5hY3RpdmVJbmRleDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2lubGluZVNsaWRlc2hvdycsIHtzdGF0aWM6IGZhbHNlfSkgaW5saW5lU2xpZGVzaG93OiBBcHBJbWFnZUdhbGxlcnlTbGlkZXNob3dDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGltYWdlU2VydmljZTogSW1hZ2VTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJvdGVjdGVkIGFsdGVyQ3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50XG4gICkge1xuICAgIHRoaXMudmlld0NoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoeyBzdGFydDogMCwgZW5kOiBOdW1iZXIuTUFYX1ZBTFVFIH0pO1xuXG4gICAgLy8gREVWIGxvZ1xuICAgIHRoaXMuZGVidWcgPSBlbnZpcm9ubWVudCAmJiAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdG9Cb29sZWFuKHRoaXMubW9iaWxlLCBpc01vYmlsZSh3aW5kb3cpKTtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLm1vZGUgPz8gKHRoaXMubW9iaWxlID8gJ2xpc3QnIDogJ21vc2FpYycpO1xuICAgIHRoaXMuX2NvbFNpemUgPSBJbWFnZUdhbGxlcnlNb2RlQ29sU2l6ZVt0aGlzLm1vZGVdO1xuICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0b0Jvb2xlYW4odGhpcy5zaG93VG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dDYXJkVG9vbGJhciA9IHRvQm9vbGVhbih0aGlzLnNob3dDYXJkVG9vbGJhciwgIXRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dBZGRDYXJkQnV0dG9uID0gdG9Cb29sZWFuKHRoaXMuc2hvd0FkZENhcmRCdXR0b24sIHRoaXMubW9iaWxlKTtcbiAgICB0aGlzLnNob3dGYWJCdXR0b24gPSB0b0Jvb2xlYW4odGhpcy5zaG93RmFiQnV0dG9uLCB0aGlzLm1vYmlsZSAmJiAhdGhpcy5zaG93QWRkQ2FyZEJ1dHRvbik7XG4gICAgdGhpcy5zaG93QWRkVG9vbGJhckJ1dHRvbiA9IHRoaXMuc2hvd0FkZFRvb2xiYXJCdXR0b24gPz8gKHRoaXMuc2hvd1Rvb2xiYXIgJiYgIXRoaXMucmVhZE9ubHkpO1xuICAgIHRoaXMuZW5hYmxlTW91c2Vab29tID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlTW91c2Vab29tLCAhdGhpcy5tb2JpbGUpO1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdG9Cb29sZWFuKHRoaXMuZW5hYmxlUm90YXRlLCB0cnVlKTtcbiAgICB0aGlzLmVuYWJsZUNyb3AgPSB0b0Jvb2xlYW4odGhpcy5lbmFibGVDcm9wLCB0cnVlKTtcbiAgICAvLyBUaGUgaW5saW5lIHByZXNlbnRhdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgb24gZGVza3RvcDogdGhlcmUgaXMgbm8gXCJyZXN0IG9mIHRoZSBwYWdlXCIgd29ydGhcbiAgICAvLyBwcmVzZXJ2aW5nIG9uIGEgc21hbGwgbW9iaWxlIHNjcmVlbiwgYW5kIHRoZSBmdWxsc2NyZWVuIG1vZGFsIGFscmVhZHkgd29ya3Mgd2VsbCB0aGVyZS5cbiAgICBpZiAodGhpcy5tb2JpbGUpIHRoaXMuc2xpZGVzaG93TW9kZSA9ICdtb2RhbCc7XG5cbiAgICAvLyBHZXQgbW9kYWwgcHJlc2VudGluZyBlbGVtZW50IChpT1Mgb25seSlcbiAgICB0aGlzLl9wcmVzZW50aW5nRWxlbWVudCA9IHRoaXMubW9iaWxlID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlvbi1wYWdlJykgOiBudWxsO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgIXRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveVN1YmplY3QuY29tcGxldGUoKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3NsaWRlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkKFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgb3B0cz86IHsgbWF4SGVpZ2h0PzogbnVtYmVyOyBtYXdXaWR0aD86IG51bWJlcjsgcXVhbGl0eT86IG51bWJlcjsgbXVsdGlwbGU/OiBib29sZWFuOyBhdXRvSGlkZURyb3BBcmVhPzogYm9vbGVhbiB9ICYgT21pdDxcbiAgICAgIEltYWdlT3B0aW9ucyxcbiAgICAgICdyZXN1bHRUeXBlJ1xuICAgID5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5pbWFnZVNlcnZpY2UuYWRkKGV2ZW50LCBvcHRzKTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkoaW1hZ2VzKSkgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBbaW1hZ2UtZ2FsbGVyeV0gQWRkaW5nIG5ldyAke2ltYWdlcy5sZW5ndGh9IGltYWdlKHMpYCwgaW1hZ2VzKTtcblxuICAgIGNvbnN0IHJvd3M6IFRhYmxlRWxlbWVudDxUPltdID0gW107XG4gICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KCk7XG4gICAgICByb3cuY3VycmVudERhdGEgPSBpbWFnZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICByb3dzLnB1c2gocm93KTtcbiAgICAgIGNvbnN0IGFkZGVkID0gYXdhaXQgcm93LmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2ltYWdlLWdhbGxlcnldIENhbm5vdCBjb25maXJtIG5ldyBpbWFnZSEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkFmdGVyQWRkUm93cy5lbWl0KHJvd3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGV2ZW50OiBFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IGludGVyYWN0aXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkIHx8IHRoaXMucmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKFtyb3ddKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgbGV0IGRlbGV0ZWQ6IGJvb2xlYW47XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2ltYWdlLWdhbGxlcnldIFJlbW92aW5nIG5ldyBpbWFnZScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5jYW5jZWxPckRlbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tpbWFnZS1nYWxsZXJ5XSBSZW1vdmluZyBpbWFnZSAoYXQgIycgKyByb3cuaWQgKyAnKScpO1xuICAgICAgZGVsZXRlZCA9IGF3YWl0IHJvdy5kZWxldGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHRvZ2dsZVZpZXdNb2RlKF8/OiBFdmVudCkge1xuICAgIHRoaXMuc2V0Vmlld01vZGUodGhpcy5tb2RlID09PSAnbGlzdCcgPyAnbW9zYWljJyA6ICdsaXN0Jyk7XG4gIH1cblxuICBzZXRWaWV3TW9kZShtb2RlOiBHYWxsZXJ5TW9kZSkge1xuICAgIGlmICh0aGlzLm1vZGUgIT09IG1vZGUpIHtcbiAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLl9jb2xTaXplID0gSW1hZ2VHYWxsZXJ5TW9kZUNvbFNpemVbdGhpcy5tb2RlXTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgc2xpZGVOZXh0KCkge1xuICAgIGlmICghdGhpcy5pbmxpbmVTbGlkZXNob3cpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNsaWRlIHByZXZpb3VzIHdoaWxlIGlubGluZSBzbGlkZXNob3cgaXMgb3BlbicpO1xuICAgIHJldHVybiB0aGlzLmlubGluZVNsaWRlc2hvdy5zbGlkZU5leHQoKTtcbiAgfVxuXG4gIHNsaWRlUHJldigpIHtcbiAgICBpZiAoIXRoaXMuaW5saW5lU2xpZGVzaG93KSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzbGlkZSBwcmV2aW91cyB3aGlsZSBpbmxpbmUgc2xpZGVzaG93IGlzIG9wZW4nKTtcbiAgICByZXR1cm4gdGhpcy5pbmxpbmVTbGlkZXNob3cuc2xpZGVQcmV2KCk7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICByZXR1cm4gcm93LmlkO1xuICB9XG5cbiAgYXN5bmMgZWRpdFRpdGxlKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IFRhYmxlRWxlbWVudDxUPiwgY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudD8uc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmZvY3VzQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpO1xuXG4gICAgY29uc3QgdGl0bGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKHJvdy5jdXJyZW50RGF0YS50aXRsZSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpXSkpO1xuICAgIHRoaXMuX3RpdGxlRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyB0aXRsZTogdGl0bGVDb250cm9sIH0pO1xuICAgIHRoaXMuX3RpdGxlQXV0b2ZvY3VzID0gdGhpcy5tb2JpbGUgJiYgdGhpcy5lbmFibGVkICYmICF0aGlzLnJlYWRPbmx5O1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgYXdhaXQgdGhpcy50aXRsZVBvcG92ZXIucHJlc2VudCgpO1xuXG4gICAgY29uc3QgeyBkYXRhLCByb2xlIH0gPSBhd2FpdCB0aGlzLnRpdGxlUG9wb3Zlci5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmICghcm9sZSB8fCByb2xlICE9PSAnQ0FOQ0VMJykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW2ltYWdlLWdhbGxlcnldIFVzZXIgc2V0IHRpdGxlOiAnICsgZGF0YSk7XG4gICAgICByb3cuY3VycmVudERhdGEudGl0bGUgPSBkYXRhO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMub25BZnRlckVkaXRSb3cuZW1pdChyb3cpO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIHRvb2xiYXIsIGJlY2F1c2UgdGhlIGZvY3VzIGhhdmUgYmVlbiBnaXZlbiB0byB0aGUgZXZlbnQncyBvcmlnaW4gKHRoZSBlZGl0IGJ1dHRvbilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGlkZUNhcmRUb29sYmFyKGNhcmRUb29sYmFyKSwgNzUwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c0NhcmRUb29sYmFyKGNhcmRUb29sYmFyOiBhbnkpIHtcbiAgICBjb25zdCBlbCA9IGNhcmRUb29sYmFyWydlbCddIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoaWRlQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXI6IGFueSkge1xuICAgIGNvbnN0IGVsID0gY2FyZFRvb2xiYXJbJ2VsJ10gYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXNlZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxUPikge1xuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5fZGF0YVNvdXJjZSkpIHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2UuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29ic2VydmVSZW5kZXJDaGFuZ2VzKCkge1xuICAgIC8vIElmIG5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCwgdGhlcmUgaXMgbm90aGluZyB0byBvYnNlcnZlIGZvciBjaGFuZ2VzLlxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkYXRhU3RyZWFtOiBPYnNlcnZhYmxlPFRhYmxlRWxlbWVudDxUPltdIHwgUmVhZG9ubHlBcnJheTxUYWJsZUVsZW1lbnQ8VD4+PjtcbiAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgIGRhdGFTdHJlYW0gPSB0aGlzLmRhdGFTb3VyY2UuY29ubmVjdCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKGRhdGFTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgdGhpcy5nZXRUYWJsZVVua25vd25EYXRhU291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbiA9IGRhdGFTdHJlYW0ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveVN1YmplY3QpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tpbWFnZS1nYWxsZXJ5XSBSZWNlaXZlZCBuZXcgcm93cycsIGRhdGEpO1xuICAgICAgdGhpcy5fZGF0YSQubmV4dChkYXRhKTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VGFibGVVbmtub3duRGF0YVNvdXJjZUVycm9yKCkge1xuICAgIHJldHVybiBFcnJvcihgUHJvdmlkZWQgZGF0YSBzb3VyY2UgZGlkIG5vdCBtYXRjaCBhbiBhcnJheSwgT2JzZXJ2YWJsZSwgb3IgRGF0YVNvdXJjZWApO1xuICB9XG5cbiAgY2xpY2tDYXJkKGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBib29sZWFuIHtcbiAgICAvLyBEZWxlZ2F0ZSBjbGljayBhY3Rpb25cbiAgICBpZiAodGhpcy5jYXJkQ2xpY2tlZC5vYnNlcnZlZCkge1xuICAgICAgdGhpcy5jYXJkQ2xpY2tlZC5lbWl0KHJvdyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBvcGVuIHRoZSBzbGlkZXNob3dcbiAgICB0aGlzLm9wZW5TbGlkZXNob3coZXZlbnQsIHJvdyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHNsaWRlc2hvdyAoaW5saW5lIG92ZXJsYXksIG9yIGZ1bGwtc2NyZWVuIG1vZGFsLCBkZXBlbmRpbmcgb24gYHpvb21QcmVzZW50YXRpb25gKSBvbiB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICogQ2FuIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIGNvbXBvbmVudCAoZS5nLiB0byBvcGVuIHRoZSBnYWxsZXJ5IGRpcmVjdGx5IG9uIGEgZ2l2ZW4gaW1hZ2UpLlxuICAgKi9cbiAgYXN5bmMgb3BlblNsaWRlc2hvdyhldmVudDogRXZlbnQgfCB1bmRlZmluZWQsIHJvdzogVGFibGVFbGVtZW50PFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJvd3M/LmZpbmRJbmRleCgocikgPT4gciA9PT0gcm93KTtcbiAgICBpZiAoaW5kZXggPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkge1xuICAgICAgY29uc29sZS53YXJuKGBbaW1hZ2UtZ2FsbGVyeV0gQ2Fubm90IG9wZW4gc2xpZGVzaG93OiBpbnZhbGlkIGluZGV4ICgke2luZGV4fSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dJbmRleCAhPSBpbmRleCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJbmRleCA9IGluZGV4O1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zbGlkZXNob3dNb2RlID09PSAnaW5saW5lJykge1xuICAgICAgdGhpcy5tYXJrU2xpZGVzaG93QXNPcGVuZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy56b29tTW9kYWwucHJlc2VudCgpO1xuICAgICAgdGhpcy5tYXJrU2xpZGVzaG93QXNPcGVuZWQoKTtcblxuICAgICAgYXdhaXQgdGhpcy56b29tTW9kYWwub25EaWREaXNtaXNzKCk7XG5cbiAgICAgIC8vIE1hcmsgYXMgY2xvc2VkXG4gICAgICB0aGlzLm1hcmtTbGlkZXNob3dBc0Nsb3NlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsb3NlU2xpZGVzaG93KHJvbGU/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5zbGlkZXNob3dNb2RlID09PSAnaW5saW5lJykge1xuICAgICAgdGhpcy5tYXJrU2xpZGVzaG93QXNDbG9zZWQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcm9taXNlID0gdGhpcy56b29tTW9kYWwuZGlzbWlzcyhudWxsLCByb2xlID8/ICdjYW5jZWwnKTtcbiAgICAgIHRoaXMubWFya1NsaWRlc2hvd0FzQ2xvc2VkKCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya1NsaWRlc2hvd0FzT3BlbmVkKCkge1xuICAgIGlmICghdGhpcy5fc2xpZGVzaG93VmlzaWJsZSkge1xuICAgICAgdGhpcy5fc2xpZGVzaG93VmlzaWJsZSA9IHRydWU7XG4gICAgICB0aGlzLnNsaWRlc2hvd09wZW5lZC5lbWl0KHRydWUpO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG1hcmtTbGlkZXNob3dBc0Nsb3NlZCgpIHtcbiAgICBpZiAodGhpcy5fc2xpZGVzaG93VmlzaWJsZSkge1xuICAgICAgdGhpcy5fc2xpZGVzaG93VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zbGlkZXNob3dPcGVuZWQuZW1pdChmYWxzZSk7XG4gICAgICB0aGlzLnNsaWRlc2hvd0Nsb3NlZC5lbWl0KCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgZGVsZXRlIHJlcXVlc3QgY29taW5nIGZyb20gdGhlIHNsaWRlc2hvdyBjb21wb25lbnQgKGVpdGhlciBpbmxpbmUgb3IgaW4gdGhlIG1vZGFsKTpcbiAgICogcnVucyB0aGUgc2FtZSBjb25maXJtYXRpb24vZGVsZXRpb24gZmxvdyBhcyBhIGNhcmQncyBkZWxldGUgYnV0dG9uLCB0aGVuIHJlc29sdmVzIHRoZSBwcm9taXNlXG4gICAqIHNvIHRoZSBzbGlkZXNob3cga25vd3Mgd2hldGhlciB0byByZXNldCBpdHMgem9vbSBvciBjbG9zZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNsaWRlc2hvd0RlbGV0ZVJlcXVlc3RlZChwcm9taXNlRXZlbnQ6IFByb21pc2VFdmVudDxib29sZWFuLCB7IHJvdzogVGFibGVFbGVtZW50PFQ+IH0+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB0aGlzLmRlbGV0ZShwcm9taXNlRXZlbnQsIHByb21pc2VFdmVudC5kZXRhaWwucm93KTtcbiAgICAgIHByb21pc2VFdmVudC5kZXRhaWwuc3VjY2VzcyhkZWxldGVkKTtcbiAgICAgIGlmIChkZWxldGVkICYmIGlzRW1wdHlBcnJheSh0aGlzLnJvd3MpICYmIHRoaXMuc2xpZGVzaG93TW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNsaWRlc2hvdygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcHJvbWlzZUV2ZW50LmRldGFpbC5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjYW5EZWxldGVSb3dzKHJvd3M6IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3Mub2JzZXJ2ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbkRlbGV0ZSA9IGF3YWl0IGVtaXRQcm9taXNlRXZlbnQodGhpcy5vbkJlZm9yZURlbGV0ZVJvd3MsICdjYW5EZWxldGUnLCB7XG4gICAgICAgICAgZGV0YWlsOiB7IHJvd3MgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiBmYWxzZTsgLy8gVXNlciBjYW5jZWxcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgY2hlY2tpbmcgaWYgY2FuIGRlbGV0ZSByb3dzJywgZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IEFsZXJ0cy5hc2tEZWxldGVDb25maXJtYXRpb24odGhpcy5hbHRlckN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlOyAvLyBDYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJbWFnZVNpemVRdWVyeVBhcmFtcyhtb2RlPzogR2FsbGVyeU1vZGUgfCAnbW9kYWwnKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbW9kZSA9IG1vZGUgPz8gdGhpcy5tb2RlO1xuICAgIGlmICghdGhpcy5pbWFnZVNpemVRdWVyeVBhcmFtIHx8IGlzTmlsT3JCbGFuayh0aGlzLmltYWdlU2l6ZXM/Llttb2RlXSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIFt0aGlzLmltYWdlU2l6ZVF1ZXJ5UGFyYW1dOiB0aGlzLmltYWdlU2l6ZXNbbW9kZV0sXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiQGlmIChzaG93VG9vbGJhciAmJiAhaXNJbmxpbmVTbGlkZXNob3dPcGVuKSB7XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cImxpZ2h0XCIgY2xhc3M9XCJnYWxsZXJ5LXRvb2xiYXJcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpb24tYnV0dG9uc1tzbG90PXN0YXJ0XVwiPjwvbmctY29udGVudD5cblxuICAgIDwhLS0gQWRkIC0tPlxuICAgIEBpZiAoIXJlYWRPbmx5ICYmIHNob3dBZGRUb29sYmFyQnV0dG9uICYmIGVuYWJsZWQpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIFt0aXRsZV09XCIhX3Nob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJfc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIChjbGljayk9XCJhZGQoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaW9uLWJ1dHRvbnNbc2xvdD1lbmRdXCI+PC9uZy1jb250ZW50PlxuXG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgIDwhLS0gVG9nZ2xlIHZpZXcgbW9kZSAtLT5cbiAgICAgIDxpb24tc2VnbWVudCAoaW9uQ2hhbmdlKT1cInRvZ2dsZVZpZXdNb2RlKCRldmVudClcIiBjb2xvcj1cImFjY2VudFwiIFt2YWx1ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgICA8aW9uLXNlZ21lbnQtYnV0dG9uIFt2YWx1ZV09XCI0XCI+XG4gICAgICAgICAgPG1hdC1pY29uPnZpZXdfbW9kdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9pb24tc2VnbWVudC1idXR0b24+XG4gICAgICAgIDxpb24tc2VnbWVudC1idXR0b24gW3ZhbHVlXT1cIjEyXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnZpZXdfbGlzdDwvbWF0LWljb24+XG4gICAgICAgIDwvaW9uLXNlZ21lbnQtYnV0dG9uPlxuICAgICAgPC9pb24tc2VnbWVudD5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxufVxuXG48ZGl2XG4gIGNsYXNzPVwiZ2FsbGVyeS1jb250YWluZXIgaW9uLXBhZGRpbmctYm90dG9tIHt7IG1vZGUgfX1cIlxuICBbY2xhc3MuaW5saW5lLXpvb20tYWN0aXZlXT1cImlzSW5saW5lU2xpZGVzaG93T3BlblwiXG4gIFtzdHlsZS4tLWlubGluZS16b29tLWhlaWdodF09XCJpbmxpbmVab29tSGVpZ2h0XCJcbj5cbiAgQGlmIChtb2JpbGUgJiYgem9vbUFjdGl2ZSkge1xuICAgIDxkaXYgY2xhc3M9XCJiYWNrZHJvcFwiIFtzdHlsZS5vcGFjaXR5XT1cInpvb21TY2FsZVwiPjwvZGl2PlxuICB9XG5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJpc0lubGluZVNsaWRlc2hvd09wZW5cIj5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sICpyeEZvcj1cImxldCByb3cgb2YgX2RhdGEkOyB0cmFja0J5OiB0cmFja0J5Rm5cIiBbc2l6ZV09XCJfY29sU2l6ZVwiPlxuICAgICAgICBAbGV0IGltYWdlID0gcm93IHwgcHJvcGVydHlHZXQ6ICdjdXJyZW50RGF0YSc7XG4gICAgICAgIEBpZiAoY2FyZFRlbXBsYXRlKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIG1vZGU6IG1vZGUsIGltYWdlOiBpbWFnZSB9XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxpb24tY2FyZFxuICAgICAgICAgICAgI2NhcmRcbiAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2UtY2FyZFwiXG4gICAgICAgICAgICBbY2xhc3Muem9vbS1ob3Zlcl09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjYXJkQ29sb3JcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQ2FyZCgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgdGFwcGFibGVcbiAgICAgICAgICAgIEBmYWRlSW5BbmltYXRpb25cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiY2FyZC10aHVtYm5haWxcIj5cbiAgICAgICAgICAgICAgQGlmIChpbWFnZS51cmwpIHtcbiAgICAgICAgICAgICAgICA8aW9uLWltZyBbc3JjXT1cImltYWdlLnVybCB8IGFwcGVuZFF1ZXJ5UGFyYW1zOiBnZXRJbWFnZVNpemVRdWVyeVBhcmFtcygpXCIgLz5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pbWcgW3NyY109XCJpbWFnZS5kYXRhVXJsXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICAgIDwhLS0gdG9vbGJhciBmb3IgdGl0bGUgKHdoZW4gbm90IGhvdmVyKSAtLT5cbiAgICAgICAgICAgIEBpZiAoc2hvd1RpdGxlICYmIGltYWdlLnRpdGxlKSB7XG4gICAgICAgICAgICAgIDxpb24tdG9vbGJhciBjb2xvcj1cInRyYW5zcGFyZW50XCIgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgaW1hZ2UudGl0bGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBhY3Rpb24gdG9vbGJhciBzaG93biB3aGVuIGhvdmVyIGltYWdlIC0tPlxuICAgICAgICAgICAgQGlmICghcmVhZE9ubHkgJiYgIW1vYmlsZSAmJiBzaG93Q2FyZFRvb2xiYXIpIHtcbiAgICAgICAgICAgICAgPGlvbi10b29sYmFyICNjYXJkVG9vbGJhciBjb2xvcj1cImxpZ2h0XCIgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBlZGl0IHRpdGxlIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dUaXRsZSkge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0VGl0bGUoJGV2ZW50LCByb3csIGNhcmRUb29sYmFyKVwiXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c2luKT1cImZvY3VzQ2FyZFRvb2xiYXIoY2FyZFRvb2xiYXIpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93LmN1cnJlbnREYXRhLnRpdGxlIHwgaXNOb3ROaWxPckJsYW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+SU1BR0UuR0FMTEVSWS5CVE5fRURJVF9USVRMRTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLkJUTl9BRERfVElUTEU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBkZWxldGUgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgc2xvdD1cImVuZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIiFfc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJfc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgkZXZlbnQsIHJvdylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2lvbi10b29sYmFyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPCEtLSBhZGQgYnV0dG9uIC0tPlxuICAgICAgQGlmICgoc2hvd0FkZFRleHRCdXR0b24gfHwgc2hvd0FkZENhcmRCdXR0b24pICYmICFyZWFkT25seSkge1xuICAgICAgICA8aW9uLWNvbCBbc2l6ZV09XCJfY29sU2l6ZVwiIEBmYWRlSW5BbmltYXRpb24+XG4gICAgICAgICAgQGlmIChzaG93QWRkVGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImFkZCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgYWRkQnV0dG9uVGV4dCB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImVuZFwiIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKHNob3dBZGRDYXJkQnV0dG9uKSB7XG4gICAgICAgICAgICA8aW9uLWNhcmRcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS1jYXJkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkKCRldmVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIV9zaG93VG9vbHRpcCA/IChhZGRCdXR0b25UZXh0IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiX3Nob3dUb29sdGlwID8gKGFkZEJ1dHRvblRleHQgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICB0YXBwYWJsZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2FtZXJhXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWRkXCIgW2NvbG9yXT1cImFkZEJ1dHRvbkNvbG9yXCIgY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvaW9uLWNhcmQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG4gIDwhLS0gSW5saW5lIHNsaWRlc2hvdzogc2hvd24gYXMgYW4gb3ZlcmxheSBkaXJlY3RseSB3aXRoaW4gdGhlIGdhbGxlcnksIGluc3RlYWQgb2YgYSBmdWxsLXNjcmVlbiBtb2RhbC5cbiAgICAgICBUaGUgcmVzdCBvZiB0aGUgcGFnZSAob3V0c2lkZSB0aGUgZ2FsbGVyeSkgc3RheXMgZnVsbHkgdmlzaWJsZSBhbmQgdXNhYmxlLCB1bmxpa2UgdGhlIG1vZGFsJ3MgYmFja2Ryb3AuIC0tPlxuICBAaWYgKGlzSW5saW5lU2xpZGVzaG93T3Blbikge1xuICAgIDxhcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3cgI2lubGluZVNsaWRlc2hvd1xuICAgICAgY2xhc3M9XCJpbmxpbmUtb3ZlcmxheVwiXG4gICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgIFtzZWxlY3RlZEluZGV4XT1cIl9zZWxlY3RlZFJvd0luZGV4XCJcbiAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2VuYWJsZU1vdXNlWm9vbV09XCJlbmFibGVNb3VzZVpvb21cIlxuICAgICAgW3doZWVsWm9vbVN0ZXBdPVwid2hlZWxab29tU3RlcFwiXG4gICAgICBbbWF4Wm9vbVJhdGlvXT1cIm1heFpvb21SYXRpb1wiXG4gICAgICBbZW5hYmxlUm90YXRlXT1cImVuYWJsZVJvdGF0ZVwiXG4gICAgICBbZW5hYmxlQ3JvcF09XCJlbmFibGVDcm9wXCJcbiAgICAgIFtlbmFibGVMb29wXT1cImVuYWJsZVNsaWRlc2hvd0xvb3BcIlxuICAgICAgW2VkaXRpb25Gb3JtYXRdPVwiZWRpdGlvbkZvcm1hdFwiXG4gICAgICBbZWRpdGlvblF1YWxpdHldPVwiZWRpdGlvblF1YWxpdHlcIlxuICAgICAgW2ltYWdlU2l6ZVF1ZXJ5UGFyYW1dPVwiaW1hZ2VTaXplUXVlcnlQYXJhbVwiXG4gICAgICBbbW9kYWxJbWFnZVNpemVdPVwiaW1hZ2VTaXplcz8ubW9kYWxcIlxuICAgICAgKGRlbGV0ZVJlcXVlc3RlZCk9XCJvblNsaWRlc2hvd0RlbGV0ZVJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgIChjbG9zZVJlcXVlc3RlZCk9XCJjbG9zZVNsaWRlc2hvdygpXCJcbiAgICAgIChhZnRlckVkaXRJbWFnZSk9XCJvbkFmdGVyRWRpdEltYWdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAoYWZ0ZXJFZGl0Um93KT1cIm9uQWZ0ZXJFZGl0Um93LmVtaXQoJGV2ZW50KVwiXG4gICAgICAocHJldmlvdXNTbGlkZSk9XCJwcmV2aW91c1NsaWRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAobmV4dFNsaWRlKT1cIm5leHRTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgW2NhbkZldGNoTW9yZV09XCJjYW5GZXRjaE1vcmVcIlxuICAgICAgKGZldGNoTW9yZSk9XCJmZXRjaE1vcmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgIFtkZWJ1Z109XCJkZWJ1Z1wiXG4gICAgPjwvYXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93PlxuICB9XG48L2Rpdj5cblxuPCEtLSBGQUIgYnV0dG9uOiBhZGQgLS0+XG5AaWYgKHNob3dGYWJCdXR0b24gJiYgIXJlYWRPbmx5KSB7XG4gIDxpb24tZmFiIHNsb3Q9XCJmaXhlZFwiIHZlcnRpY2FsPVwiYm90dG9tXCIgaG9yaXpvbnRhbD1cImVuZFwiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cImRpc2FibGVkXCIgQGZhZGVJbk91dEFuaW1hdGlvbj5cbiAgICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGQoJGV2ZW50KVwiPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJjYW1lcmFcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIiBjbGFzcz1cImljb24tc2Vjb25kYXJ5XCIgc3R5bGU9XCJsZWZ0OiAzM3B4OyB0b3A6IDlweDsgZm9udC1zaXplOiAyMHB4XCI+PC9pb24taWNvbj5cbiAgICA8L2lvbi1mYWItYnV0dG9uPlxuICA8L2lvbi1mYWI+XG59XG5cbjwhLS0gWm9vbSBtb2RhbCAtLT5cbkBpZiAoc2xpZGVzaG93TW9kZSA9PT0gJ21vZGFsJykge1xuICA8aW9uLW1vZGFsICN6b29tTW9kYWwgY2xhc3M9XCJzdGFjay1tb2RhbCB6b29tLW1vZGFsXCIgW2NsYXNzLm1vZGFsLWZ1bGxzY3JlZW5dPVwibW9iaWxlXCIgW2NsYXNzLm1vZGFsLWxhcmdlXT1cIiFtb2JpbGVcIj5cbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICA8YXBwLWltYWdlLWdhbGxlcnktc2xpZGVzaG93XG4gICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICBbc2VsZWN0ZWRJbmRleF09XCJfc2VsZWN0ZWRSb3dJbmRleFwiXG4gICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICAgICAgW2VuYWJsZU1vdXNlWm9vbV09XCJlbmFibGVNb3VzZVpvb21cIlxuICAgICAgICBbd2hlZWxab29tU3RlcF09XCJ3aGVlbFpvb21TdGVwXCJcbiAgICAgICAgW21heFpvb21SYXRpb109XCJtYXhab29tUmF0aW9cIlxuICAgICAgICBbZW5hYmxlUm90YXRlXT1cImVuYWJsZVJvdGF0ZVwiXG4gICAgICAgIFtlbmFibGVDcm9wXT1cImVuYWJsZUNyb3BcIlxuICAgICAgICBbZW5hYmxlTG9vcF09XCJlbmFibGVTbGlkZXNob3dMb29wXCJcbiAgICAgICAgW2VkaXRpb25Gb3JtYXRdPVwiZWRpdGlvbkZvcm1hdFwiXG4gICAgICAgIFtlZGl0aW9uUXVhbGl0eV09XCJlZGl0aW9uUXVhbGl0eVwiXG4gICAgICAgIFtpbWFnZVNpemVRdWVyeVBhcmFtXT1cImltYWdlU2l6ZVF1ZXJ5UGFyYW1cIlxuICAgICAgICBbbW9kYWxJbWFnZVNpemVdPVwiaW1hZ2VTaXplcz8ubW9kYWxcIlxuICAgICAgICAoZGVsZXRlUmVxdWVzdGVkKT1cIm9uU2xpZGVzaG93RGVsZXRlUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAoY2xvc2VSZXF1ZXN0ZWQpPVwiY2xvc2VTbGlkZXNob3coKVwiXG4gICAgICAgIChhZnRlckVkaXRJbWFnZSk9XCJvbkFmdGVyRWRpdEltYWdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChhZnRlckVkaXRSb3cpPVwib25BZnRlckVkaXRSb3cuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHByZXZpb3VzU2xpZGUpPVwicHJldmlvdXNTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgICAobmV4dFNsaWRlKT1cIm5leHRTbGlkZS5lbWl0KCRldmVudClcIlxuICAgICAgICBbY2FuRmV0Y2hNb3JlXT1cImNhbkZldGNoTW9yZVwiXG4gICAgICAgIChmZXRjaE1vcmUpPVwiZmV0Y2hNb3JlLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+PC9hcHAtaW1hZ2UtZ2FsbGVyeS1zbGlkZXNob3c+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9pb24tbW9kYWw+XG59XG5cbjxpb24tcG9wb3ZlciAjdGl0bGVQb3BvdmVyPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIiBjZGtUcmFwRm9jdXMgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX3RpdGxlRm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImF1dG9cIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIHRyYW5zbGF0ZT5JTUFHRS5HQUxMRVJZLlRJVExFPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiX3RpdGxlQXV0b2ZvY3VzXCJcbiAgICAgICAgICAgIChrZXlkb3duLmNvbnRyb2wuZW50ZXIpPVwidGl0bGVQb3BvdmVyLmRpc21pc3MoX3RpdGxlRm9ybS5jb250cm9scy50aXRsZS52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29udGVudD5cblxuICAgIDxpb24tZm9vdGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgICAgICAgIDxpb24tY29sPjwvaW9uLWNvbD5cblxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwidGl0bGVQb3BvdmVyLmRpc21pc3MobnVsbCwgJ0NBTkNFTCcpXCI+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0FOQ0VMPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBbZmlsbF09XCJkaXNhYmxlZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInRpdGxlUG9wb3Zlci5kaXNtaXNzKF90aXRsZUZvcm0uY29udHJvbHMudGl0bGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIhX3Nob3dUb29sdGlwID8gKCdDT01NT04uQlROX1ZBTElEQVRFX1dJVEhfU0hPUlRDVVRfSEVMUCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJfc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fVkFMSURBVEVfV0lUSF9TSE9SVENVVF9IRUxQJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fVkFMSURBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24tZm9vdGVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9pb24tcG9wb3Zlcj5cbiJdfQ==
|