@eui/ecl 15.0.0-rc.12 → 15.0.0-rc.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.
@@ -178,7 +178,7 @@ export class EclCarouselComponent extends ECLBaseDirective {
178
178
  }
179
179
  }
180
180
  /** @nocollapse */ EclCarouselComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: EclCarouselComponent, deps: [{ token: i0.Renderer2 }, { token: i1.BreakpointObserver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
181
- /** @nocollapse */ EclCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: EclCarouselComponent, selector: "ecl-carousel", inputs: { isAutoplay: "isAutoplay", playInterval: "playInterval" }, outputs: { slide: "slide" }, host: { properties: { "class": "this.cssClasses" } }, queries: [{ propertyName: "slides", predicate: i0.forwardRef(function () { return EclCarouselItemComponent; }) }], viewQueries: [{ propertyName: "carouselContainerElement", first: true, predicate: ["carouselContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "isInverted", "ariaHidden", "focusable"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
181
+ /** @nocollapse */ EclCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: EclCarouselComponent, selector: "ecl-carousel", inputs: { isAutoplay: "isAutoplay", playInterval: "playInterval" }, outputs: { slide: "slide" }, host: { properties: { "class": "this.cssClasses" } }, queries: [{ propertyName: "slides", predicate: i0.forwardRef(function () { return EclCarouselItemComponent; }) }], viewQueries: [{ propertyName: "carouselContainerElement", first: true, predicate: ["carouselContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.AUTOPLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "isInverted", "ariaHidden", "focusable"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
182
182
  __decorate([
183
183
  coerceBoolean
184
184
  ], EclCarouselComponent.prototype, "isAutoplay", void 0);
@@ -190,7 +190,7 @@ __decorate([
190
190
  ], EclCarouselComponent.prototype, "carouselContainerElement", void 0);
191
191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: EclCarouselComponent, decorators: [{
192
192
  type: Component,
193
- args: [{ selector: 'ecl-carousel', template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"] }]
193
+ args: [{ selector: 'ecl-carousel', template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.AUTOPLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"] }]
194
194
  }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.BreakpointObserver }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isAutoplay: [{
195
195
  type: Input
196
196
  }], playInterval: [{
@@ -207,4 +207,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImpor
207
207
  type: HostBinding,
208
208
  args: ['class']
209
209
  }] } });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsLWNhcm91c2VsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtY2Fyb3VzZWwvZWNsLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtY2Fyb3VzZWwvZWNsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQXNELFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBd0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RNLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFtQix3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7QUFFMUYsTUFBTSxPQUFPLGFBQWMsU0FBUSxZQUFZO0lBQzNDLFlBQW1CLElBQXFCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBRE8sU0FBSSxHQUFKLElBQUksQ0FBaUI7SUFFeEMsQ0FBQztDQUNKO0FBb0JELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFldEQsWUFDWSxRQUFtQixFQUNuQixxQkFBeUMsRUFDekMsRUFBcUI7UUFFN0IsS0FBSyxFQUFFLENBQUM7UUFKQSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBb0I7UUFDekMsT0FB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R0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7Z0JBQ2pELEtBQUs7c0JBQWQsTUFBTTtnQkFrQkgsVUFBVTtzQkFEYixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhbiwgY29lcmNlRWxlbWVudCwgY29lcmNlTnVtYmVyIH0gZnJvbSAnQGV1aS9iYXNlJztcbmltcG9ydCB7IGludGVydmFsLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRWNsQmFzZUV2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuaW1wb3J0IHsgRUNMQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2VjbC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFY2xDYXJvdXNlbEl0ZW0sIEVjbENhcm91c2VsSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZWNsLWNhcm91c2VsLWl0ZW0uY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIEVjbFNsaWRlRXZlbnQgZXh0ZW5kcyBFY2xCYXNlRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpdGVtOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZWNsLWNhcm91c2VsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWNsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZXM6IFtgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVE9ETzogcmVtb3ZlIGJ5IGltcGxlbWVudGluZyBmdWxsIEVDTCBzcGVjcyAqL1xuICAgICAgICAuZWNsLWNhcm91c2VsX19jb250YWluZXIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZWNsLWNhcm91c2VsX19zbGlkZXMge1xuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgfVxuICAgIGBdXG59KVxuZXhwb3J0IGNsYXNzIEVjbENhcm91c2VsQ29tcG9uZW50IGV4dGVuZHMgRUNMQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIEBjb2VyY2VCb29sZWFuIEBJbnB1dCgpIGlzQXV0b3BsYXk6IGJvb2xlYW4gfCBhbnkgPSB0cnVlO1xuICAgIEBjb2VyY2VOdW1iZXIgQElucHV0KCkgcGxheUludGVydmFsOiBudW1iZXIgfCBhbnkgPSA1MDAwO1xuXG4gICAgQGNvZXJjZUVsZW1lbnQgQFZpZXdDaGlsZCgnY2Fyb3VzZWxDb250YWluZXInKSBjYXJvdXNlbENvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBFY2xDYXJvdXNlbEl0ZW1Db21wb25lbnQpKSBzbGlkZXM6IFF1ZXJ5TGlzdDxFY2xDYXJvdXNlbEl0ZW1Db21wb25lbnQ+O1xuICAgIEBPdXRwdXQoKSBzbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8RWNsU2xpZGVFdmVudD4oKTtcblxuICAgIHB1YmxpYyBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGxheUludGVydmFsJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgcGxheUludGVydmFsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIGlzTW9iaWxlQnJlYWtwb2ludDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjZGtCcmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgY3NzQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHN1cGVyLmdldENzc0NsYXNzZXMoJ2VjbC1jYXJvdXNlbCcpXG4gICAgICAgIF0uam9pbignICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUJyZWFrcG9pbnRDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNsaWRlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlRWxlbWVudFNpemVDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBvblBsYXlDbGljaygpIHtcbiAgICAgICAgdGhpcy5zdGFydFBsYXlpbmcoKTtcbiAgICB9XG5cbiAgICBvblBhdXNlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICB9XG5cbiAgICBvblNsaWRlQ29udHJvbENsaWNrKHNsaWRlOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgdGhpcy5zdG9wUGxheWluZygpO1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2xpZGUoc2xpZGUpO1xuICAgIH1cblxuICAgIG9uTmV4dFNsaWRlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgdGhpcy5nb1RvTmV4dFNsaWRlKCk7XG4gICAgfVxuXG4gICAgb25QcmV2aW91c1NsaWRlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgdGhpcy5nb1RvUHJldmlvdXNTbGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhZGRlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzTW9iaWxlQnJlYWtwb2ludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQ29udHJvbHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNsaWRlc0NvdW50KCkgPiAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U2xpZGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgY3VycmVudEluZGV4OiBudW1iZXI7XG5cbiAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pc0N1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhcm91c2VsU2xpZGVzV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxDb250YWluZXJFbGVtZW50Py5vZmZzZXRXaWR0aCAqIHRoaXMuZ2V0U2xpZGVzQ291bnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2Fyb3VzZWxTbGlkZXNPZmZzZXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIC0xICogdGhpcy5jYXJvdXNlbENvbnRhaW5lckVsZW1lbnQ/Lm9mZnNldFdpZHRoICogdGhpcy5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVNsaWRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmluZGV4ID0gaWR4O1xuICAgICAgICAgICAgaXRlbS5hcmlhTGFiZWwgPSBgc2xpZGUgJHtpZHggKyAxfSBvZiAke3RoaXMuZ2V0U2xpZGVzQ291bnQoKX1gXG4gICAgICAgICAgICBpdGVtLndpZHRoID0gMTAwIC8gdGhpcy5nZXRTbGlkZXNDb3VudCgpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbnRyb2xzKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlJbnRlcnZhbCQgPSBpbnRlcnZhbCh0aGlzLnBsYXlJbnRlcnZhbCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTm9TbGlkZVNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlU2xpZGUodGhpcy5zbGlkZXMuZmlyc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0F1dG9wbGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXlpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnNsaWRlQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ29Ub05leHRTbGlkZSgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNsaWRlKFxuICAgICAgICAgICAgdGhpcy5nZXROZXh0U2xpZGUoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ29Ub1ByZXZpb3VzU2xpZGUoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTbGlkZShcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJldmlvdXNTbGlkZSgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZVNsaWRlKHNsaWRlOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgaWYgKHNsaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWRlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uaXNDdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2xpZGUuaXNDdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5zbGlkZS5uZXh0KG5ldyBFY2xTbGlkZUV2ZW50KHNsaWRlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0UGxheWluZygpIHtcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMucGxheUludGVydmFsU3Vic2NyaXB0aW9uID0gdGhpcy5wbGF5SW50ZXJ2YWwkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKG4gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ29Ub05leHRTbGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9wUGxheWluZygpIHtcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5wbGF5SW50ZXJ2YWxTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGxheUludGVydmFsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHRTbGlkZSgpOiBFY2xDYXJvdXNlbEl0ZW0ge1xuICAgICAgICBjb25zdCBzbGlkZXNDb3VudCA9IHRoaXMuZ2V0U2xpZGVzQ291bnQoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc2xpZGVzQ291bnQgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMuZmlyc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMuZ2V0KGN1cnJlbnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c1NsaWRlKCk6IEVjbENhcm91c2VsSXRlbSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNsaWRlcy5sYXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmdldChjdXJyZW50SW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2xpZGVzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTm9TbGlkZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuc2xpZGVzLnNvbWUoaXRlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5pc0N1cnJlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlQnJlYWtwb2ludENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RrQnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoWycobWF4LXdpZHRoOiA5OTZweCknXSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlQnJlYWtwb2ludCA9IHJlc3VsdC5tYXRjaGVzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRWxlbWVudFNpemVDaGFuZ2VzKCkge1xuICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pLm9ic2VydmUodGhpcy5jYXJvdXNlbENvbnRhaW5lckVsZW1lbnQpO1xuICAgIH1cbn0iLCI8ZGl2ICNjYXJvdXNlbENvbnRhaW5lciBcbiAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fY29udGFpbmVyXCIgXG4gICAgW2NsYXNzLmVjbC1jYXJvdXNlbC1jb250YWluZXItLXBhZGRlZF09XCJpc1BhZGRlZCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImVjbC1jYXJvdXNlbF9fc2xpZGVzXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldENhcm91c2VsU2xpZGVzV2lkdGgoKVwiIFxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRDYXJvdXNlbFNsaWRlc09mZnNldCgpXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gKm5nSWY9XCJoYXNDb250cm9scygpICYmICFpc01vYmlsZUJyZWFrcG9pbnRcIlxuICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fcHJldlwiIFxuICAgICAgICAoY2xpY2spPVwib25QcmV2aW91c1NsaWRlQ2xpY2soKVwiPlxuICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICBpY29uPVwiY29ybmVyLWFycm93XCIgXG4gICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTI3MFwiIFxuICAgICAgICAgICAgaXNJbnZlcnRlZCBcbiAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19pY29uLWRlZmF1bHRcIj5cbiAgICAgICAgPC9lY2wtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5QUkVWLVNMSURFUycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaGFzQ29udHJvbHMoKSAmJiAhaXNNb2JpbGVCcmVha3BvaW50XCJcbiAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX25leHRcIiBcbiAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFNsaWRlQ2xpY2soKVwiPlxuICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICBpY29uPVwiY29ybmVyLWFycm93XCIgXG4gICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTkwXCIgXG4gICAgICAgICAgICBpc0ludmVydGVkIFxuICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tZGVmYXVsdFwiPlxuICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLXUtc3Itb25seVwiPnt7ICdlY2wuY2Fyb3VzZWwuTkVYVC1TTElERVMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBcbiAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fY29udHJvbHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWNsLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLWNhcm91c2VsX19hdXRvcGxheVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBcbiAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fcGxheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGxheUNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwbGF5XCIgXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJsXCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19pY29uLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICBpc0ludmVydGVkPlxuICAgICAgICAgICAgICAgIDwvZWNsLWljb24+XG4gICAgICAgICAgICAgICAgPGVjbC1pY29uIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGxheS1maWxsZWRcIiBcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cImxcIiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZlcnRlZD5cbiAgICAgICAgICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5QTEFZJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNQbGF5aW5nXCIgXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX3BhdXNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25QYXVzZUNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwYXVzZVwiIFxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9faWNvbi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZlcnRlZD5cbiAgICAgICAgICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICAgICAgICAgIDxlY2wtaWNvbiBcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBhdXNlLWZpbGxlZFwiIFxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9faWNvbi1hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICBpc0ludmVydGVkPlxuICAgICAgICAgICAgICAgIDwvZWNsLWljb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjbC11LXNyLW9ubHlcIj57eyAnZWNsLmNhcm91c2VsLlBBVVNFJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX25hdmlnYXRpb25cIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNsaWRlIG9mIHNsaWRlczsgbGV0IGkgPSBpbmRleFwiIFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJzbGlkZS5pc0N1cnJlbnRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19uYXZpZ2F0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNsaWRlQ29udHJvbENsaWNrKHNsaWRlKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNsLXUtc3Itb25seVwiPnt7ICdlY2wuY2Fyb3VzZWwuR08tVE8tU0xJREUnIHwgdHJhbnNsYXRlIH19IHt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJpc01vYmlsZUJyZWFrcG9pbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX3ByZXZcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJvblByZXZpb3VzU2xpZGVDbGljaygpXCI+XG4gICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgaWNvbj1cImNvcm5lci1hcnJvd1wiIFxuICAgICAgICAgICAgICAgIHNpemU9XCJtXCIgXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTI3MFwiIFxuICAgICAgICAgICAgICAgIGlzSW52ZXJ0ZWQgXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tZGVmYXVsdFwiPlxuICAgICAgICAgICAgPC9lY2wtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNsLXUtc3Itb25seVwiPnt7ICdlY2wuY2Fyb3VzZWwuUFJFVi1TTElERVMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX3BhZ2luYXRpb25cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNsLWNhcm91c2VsX19jdXJyZW50XCI+e3sgZ2V0Q3VycmVudFNsaWRlSW5kZXgoKSArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICB7eyAnZWNsLmNvbW1vbi5PRicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNsLWNhcm91c2VsX19tYXhcIj57eyBzbGlkZXMubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNNb2JpbGVCcmVha3BvaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19uZXh0XCIgXG4gICAgICAgICAgICAoY2xpY2spPVwib25OZXh0U2xpZGVDbGljaygpXCI+XG4gICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgaWNvbj1cImNvcm5lci1hcnJvd1wiIFxuICAgICAgICAgICAgICAgIHNpemU9XCJtXCIgXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTkwXCIgXG4gICAgICAgICAgICAgICAgaXNJbnZlcnRlZCBcbiAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9faWNvbi1kZWZhdWx0XCI+XG4gICAgICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjbC11LXNyLW9ubHlcIj57eyAnZWNsLmNhcm91c2VsLk5FWFQtU0xJREVTJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsLWNhcm91c2VsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtY2Fyb3VzZWwvZWNsLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lY2wtY2Fyb3VzZWwvZWNsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQXNELFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBd0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RNLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFtQix3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7QUFFMUYsTUFBTSxPQUFPLGFBQWMsU0FBUSxZQUFZO0lBQzNDLFlBQW1CLElBQXFCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBRE8sU0FBSSxHQUFKLElBQUksQ0FBaUI7SUFFeEMsQ0FBQztDQUNKO0FBb0JELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxnQkFBZ0I7SUFldEQsWUFDWSxRQUFtQixFQUNuQixxQkFBeUMsRUFDekMsRUFBcUI7UUFFN0IsS0FBSyxFQUFFLENBQUM7UUFKQSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBb0I7UUFDekMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFqQlQsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDbEMsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBSS9DLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUU3QyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBSTNCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNuQyxhQUFRLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFRNUQsQ0FBQztJQUVELElBQ0ksVUFBVTtRQUNWLE9BQU87WUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQztTQUN0QyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBc0I7UUFDdEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQjtRQUNaLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLFFBQVE7UUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ3BDLENBQUM7SUFFTSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxvQkFBb0I7UUFDdkIsSUFBSSxZQUFvQixDQUFDO1FBRXpCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDaEIsWUFBWSxHQUFHLEdBQUcsQ0FBQzthQUN0QjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVNLHNCQUFzQjtRQUN6QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFTSx1QkFBdUI7UUFDMUIsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3pGLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUE7WUFDL0QsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBR0gsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVqRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekM7WUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN2QjtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsVUFBVTtxQkFDVixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDOUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUN0QixDQUFDO0lBQ04sQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsYUFBYSxDQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUMxQixDQUFDO0lBQ04sQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFzQjtRQUN4QyxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRXZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDN0M7SUFDTCxDQUFDO0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFdBQVc7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0M7SUFDTCxDQUFDO0lBRU8sWUFBWTtRQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFakQsSUFBSSxZQUFZLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzVCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFakQsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDM0I7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVDO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRU8sd0JBQXdCO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyx5QkFBeUI7UUFDN0IsSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O29JQWxOUSxvQkFBb0I7d0hBQXBCLG9CQUFvQixxUUFLSyx3QkFBd0IsdUxDckM5RCw4OUlBc0hNO0FEckZhO0lBQWQsYUFBYTt3REFBMkM7QUFDM0M7SUFBYixZQUFZOzBEQUE0QztBQUUxQztJQUFkLGFBQWE7c0VBQXVFOzJGQUo1RSxvQkFBb0I7a0JBbEJoQyxTQUFTOytCQUNJLGNBQWM7aUtBa0JBLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSztnQkFFMkIsd0JBQXdCO3NCQUF2RCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDZ0IsTUFBTTtzQkFBbEUsZUFBZTt1QkFBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7Z0JBQ2pELEtBQUs7c0JBQWQsTUFBTTtnQkFrQkgsVUFBVTtzQkFEYixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE91dHB1dCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29lcmNlQm9vbGVhbiwgY29lcmNlRWxlbWVudCwgY29lcmNlTnVtYmVyIH0gZnJvbSAnQGV1aS9iYXNlJztcbmltcG9ydCB7IGludGVydmFsLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRWNsQmFzZUV2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuaW1wb3J0IHsgRUNMQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2VjbC1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFY2xDYXJvdXNlbEl0ZW0sIEVjbENhcm91c2VsSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZWNsLWNhcm91c2VsLWl0ZW0uY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIEVjbFNsaWRlRXZlbnQgZXh0ZW5kcyBFY2xCYXNlRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpdGVtOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZWNsLWNhcm91c2VsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWNsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZXM6IFtgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVE9ETzogcmVtb3ZlIGJ5IGltcGxlbWVudGluZyBmdWxsIEVDTCBzcGVjcyAqL1xuICAgICAgICAuZWNsLWNhcm91c2VsX19jb250YWluZXIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZWNsLWNhcm91c2VsX19zbGlkZXMge1xuICAgICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgfVxuICAgIGBdXG59KVxuZXhwb3J0IGNsYXNzIEVjbENhcm91c2VsQ29tcG9uZW50IGV4dGVuZHMgRUNMQmFzZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIEBjb2VyY2VCb29sZWFuIEBJbnB1dCgpIGlzQXV0b3BsYXk6IGJvb2xlYW4gfCBhbnkgPSB0cnVlO1xuICAgIEBjb2VyY2VOdW1iZXIgQElucHV0KCkgcGxheUludGVydmFsOiBudW1iZXIgfCBhbnkgPSA1MDAwO1xuXG4gICAgQGNvZXJjZUVsZW1lbnQgQFZpZXdDaGlsZCgnY2Fyb3VzZWxDb250YWluZXInKSBjYXJvdXNlbENvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBFY2xDYXJvdXNlbEl0ZW1Db21wb25lbnQpKSBzbGlkZXM6IFF1ZXJ5TGlzdDxFY2xDYXJvdXNlbEl0ZW1Db21wb25lbnQ+O1xuICAgIEBPdXRwdXQoKSBzbGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8RWNsU2xpZGVFdmVudD4oKTtcblxuICAgIHB1YmxpYyBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGxheUludGVydmFsJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgcGxheUludGVydmFsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIGlzTW9iaWxlQnJlYWtwb2ludDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjZGtCcmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgY3NzQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHN1cGVyLmdldENzc0NsYXNzZXMoJ2VjbC1jYXJvdXNlbCcpXG4gICAgICAgIF0uam9pbignICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUJyZWFrcG9pbnRDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNsaWRlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlRWxlbWVudFNpemVDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBvblBsYXlDbGljaygpIHtcbiAgICAgICAgdGhpcy5zdGFydFBsYXlpbmcoKTtcbiAgICB9XG5cbiAgICBvblBhdXNlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICB9XG5cbiAgICBvblNsaWRlQ29udHJvbENsaWNrKHNsaWRlOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgdGhpcy5zdG9wUGxheWluZygpO1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2xpZGUoc2xpZGUpO1xuICAgIH1cblxuICAgIG9uTmV4dFNsaWRlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgdGhpcy5nb1RvTmV4dFNsaWRlKCk7XG4gICAgfVxuXG4gICAgb25QcmV2aW91c1NsaWRlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgdGhpcy5nb1RvUHJldmlvdXNTbGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhZGRlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzTW9iaWxlQnJlYWtwb2ludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQ29udHJvbHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNsaWRlc0NvdW50KCkgPiAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U2xpZGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgY3VycmVudEluZGV4OiBudW1iZXI7XG5cbiAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pc0N1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50SW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENhcm91c2VsU2xpZGVzV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxDb250YWluZXJFbGVtZW50Py5vZmZzZXRXaWR0aCAqIHRoaXMuZ2V0U2xpZGVzQ291bnQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2Fyb3VzZWxTbGlkZXNPZmZzZXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIC0xICogdGhpcy5jYXJvdXNlbENvbnRhaW5lckVsZW1lbnQ/Lm9mZnNldFdpZHRoICogdGhpcy5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVNsaWRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmluZGV4ID0gaWR4O1xuICAgICAgICAgICAgaXRlbS5hcmlhTGFiZWwgPSBgc2xpZGUgJHtpZHggKyAxfSBvZiAke3RoaXMuZ2V0U2xpZGVzQ291bnQoKX1gXG4gICAgICAgICAgICBpdGVtLndpZHRoID0gMTAwIC8gdGhpcy5nZXRTbGlkZXNDb3VudCgpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbnRyb2xzKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlJbnRlcnZhbCQgPSBpbnRlcnZhbCh0aGlzLnBsYXlJbnRlcnZhbCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTm9TbGlkZVNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlU2xpZGUodGhpcy5zbGlkZXMuZmlyc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0F1dG9wbGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXlpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnNsaWRlQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFBsYXlpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ29Ub05leHRTbGlkZSgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNsaWRlKFxuICAgICAgICAgICAgdGhpcy5nZXROZXh0U2xpZGUoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ29Ub1ByZXZpb3VzU2xpZGUoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTbGlkZShcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJldmlvdXNTbGlkZSgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZVNsaWRlKHNsaWRlOiBFY2xDYXJvdXNlbEl0ZW0pIHtcbiAgICAgICAgaWYgKHNsaWRlKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWRlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0uaXNDdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2xpZGUuaXNDdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5zbGlkZS5uZXh0KG5ldyBFY2xTbGlkZUV2ZW50KHNsaWRlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0UGxheWluZygpIHtcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMucGxheUludGVydmFsU3Vic2NyaXB0aW9uID0gdGhpcy5wbGF5SW50ZXJ2YWwkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKG4gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ29Ub05leHRTbGlkZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9wUGxheWluZygpIHtcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5wbGF5SW50ZXJ2YWxTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGxheUludGVydmFsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHRTbGlkZSgpOiBFY2xDYXJvdXNlbEl0ZW0ge1xuICAgICAgICBjb25zdCBzbGlkZXNDb3VudCA9IHRoaXMuZ2V0U2xpZGVzQ291bnQoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5nZXRDdXJyZW50U2xpZGVJbmRleCgpO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc2xpZGVzQ291bnQgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMuZmlyc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMuZ2V0KGN1cnJlbnRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c1NsaWRlKCk6IEVjbENhcm91c2VsSXRlbSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuZ2V0Q3VycmVudFNsaWRlSW5kZXgoKTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNsaWRlcy5sYXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmdldChjdXJyZW50SW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2xpZGVzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTm9TbGlkZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuc2xpZGVzLnNvbWUoaXRlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5pc0N1cnJlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlQnJlYWtwb2ludENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RrQnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoWycobWF4LXdpZHRoOiA5OTZweCknXSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlQnJlYWtwb2ludCA9IHJlc3VsdC5tYXRjaGVzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRWxlbWVudFNpemVDaGFuZ2VzKCkge1xuICAgICAgICBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pLm9ic2VydmUodGhpcy5jYXJvdXNlbENvbnRhaW5lckVsZW1lbnQpO1xuICAgIH1cbn0iLCI8ZGl2ICNjYXJvdXNlbENvbnRhaW5lciBcbiAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fY29udGFpbmVyXCIgXG4gICAgW2NsYXNzLmVjbC1jYXJvdXNlbC1jb250YWluZXItLXBhZGRlZF09XCJpc1BhZGRlZCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cImVjbC1jYXJvdXNlbF9fc2xpZGVzXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldENhcm91c2VsU2xpZGVzV2lkdGgoKVwiIFxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJnZXRDYXJvdXNlbFNsaWRlc09mZnNldCgpXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gKm5nSWY9XCJoYXNDb250cm9scygpICYmICFpc01vYmlsZUJyZWFrcG9pbnRcIlxuICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fcHJldlwiIFxuICAgICAgICAoY2xpY2spPVwib25QcmV2aW91c1NsaWRlQ2xpY2soKVwiPlxuICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICBpY29uPVwiY29ybmVyLWFycm93XCIgXG4gICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTI3MFwiIFxuICAgICAgICAgICAgaXNJbnZlcnRlZCBcbiAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19pY29uLWRlZmF1bHRcIj5cbiAgICAgICAgPC9lY2wtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5QUkVWLVNMSURFUycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaGFzQ29udHJvbHMoKSAmJiAhaXNNb2JpbGVCcmVha3BvaW50XCJcbiAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX25leHRcIiBcbiAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFNsaWRlQ2xpY2soKVwiPlxuICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICBpY29uPVwiY29ybmVyLWFycm93XCIgXG4gICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlLTkwXCIgXG4gICAgICAgICAgICBpc0ludmVydGVkIFxuICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tZGVmYXVsdFwiPlxuICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLXUtc3Itb25seVwiPnt7ICdlY2wuY2Fyb3VzZWwuTkVYVC1TTElERVMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBcbiAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fY29udHJvbHNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWNsLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLWNhcm91c2VsX19hdXRvcGxheVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBcbiAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fcGxheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGxheUNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwbGF5XCIgXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJsXCIgXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19pY29uLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICBpc0ludmVydGVkPlxuICAgICAgICAgICAgICAgIDwvZWNsLWljb24+XG4gICAgICAgICAgICAgICAgPGVjbC1pY29uIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGxheS1maWxsZWRcIiBcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cImxcIiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZlcnRlZD5cbiAgICAgICAgICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5BVVRPUExBWScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUGxheWluZ1wiIFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19wYXVzZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUGF1c2VDbGljaygpXCI+XG4gICAgICAgICAgICAgICAgPGVjbC1pY29uIFxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGF1c2VcIiBcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cImxcIiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgIGlzSW52ZXJ0ZWQ+XG4gICAgICAgICAgICAgICAgPC9lY2wtaWNvbj5cbiAgICAgICAgICAgICAgICA8ZWNsLWljb24gXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwYXVzZS1maWxsZWRcIiBcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cImxcIiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZlcnRlZD5cbiAgICAgICAgICAgICAgICA8L2VjbC1pY29uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5QQVVTRScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLWNhcm91c2VsX19uYXZpZ2F0aW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbGlkZSBvZiBzbGlkZXM7IGxldCBpID0gaW5kZXhcIiBcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwic2xpZGUuaXNDdXJyZW50XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fbmF2aWdhdGlvbi1pdGVtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TbGlkZUNvbnRyb2xDbGljayhzbGlkZSlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjbC11LXNyLW9ubHlcIj57eyAnZWNsLmNhcm91c2VsLkdPLVRPLVNMSURFJyB8IHRyYW5zbGF0ZSB9fSB7eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNNb2JpbGVCcmVha3BvaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19wcmV2XCIgXG4gICAgICAgICAgICAoY2xpY2spPVwib25QcmV2aW91c1NsaWRlQ2xpY2soKVwiPlxuICAgICAgICAgICAgPGVjbC1pY29uIFxuICAgICAgICAgICAgICAgIGljb249XCJjb3JuZXItYXJyb3dcIiBcbiAgICAgICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZS0yNzBcIiBcbiAgICAgICAgICAgICAgICBpc0ludmVydGVkIFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZWNsLWNhcm91c2VsX19pY29uLWRlZmF1bHRcIj5cbiAgICAgICAgICAgIDwvZWNsLWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjbC11LXNyLW9ubHlcIj57eyAnZWNsLmNhcm91c2VsLlBSRVYtU0xJREVTJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWNsLWNhcm91c2VsX19wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjbC1jYXJvdXNlbF9fY3VycmVudFwiPnt7IGdldEN1cnJlbnRTbGlkZUluZGV4KCkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAge3sgJ2VjbC5jb21tb24uT0YnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjbC1jYXJvdXNlbF9fbWF4XCI+e3sgc2xpZGVzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzTW9iaWxlQnJlYWtwb2ludFwiXG4gICAgICAgICAgICBjbGFzcz1cImVjbC1jYXJvdXNlbF9fbmV4dFwiIFxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFNsaWRlQ2xpY2soKVwiPlxuICAgICAgICAgICAgPGVjbC1pY29uIFxuICAgICAgICAgICAgICAgIGljb249XCJjb3JuZXItYXJyb3dcIiBcbiAgICAgICAgICAgICAgICBzaXplPVwibVwiIFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZS05MFwiIFxuICAgICAgICAgICAgICAgIGlzSW52ZXJ0ZWQgXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJlY2wtY2Fyb3VzZWxfX2ljb24tZGVmYXVsdFwiPlxuICAgICAgICAgICAgPC9lY2wtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2wtdS1zci1vbmx5XCI+e3sgJ2VjbC5jYXJvdXNlbC5ORVhULVNMSURFUycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -4102,7 +4102,7 @@ class EclCarouselComponent extends ECLBaseDirective {
4102
4102
  }
4103
4103
  }
4104
4104
  /** @nocollapse */ EclCarouselComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: EclCarouselComponent, deps: [{ token: i0.Renderer2 }, { token: i1$2.BreakpointObserver }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
4105
- /** @nocollapse */ EclCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: EclCarouselComponent, selector: "ecl-carousel", inputs: { isAutoplay: "isAutoplay", playInterval: "playInterval" }, outputs: { slide: "slide" }, host: { properties: { "class": "this.cssClasses" } }, queries: [{ propertyName: "slides", predicate: i0.forwardRef(function () { return EclCarouselItemComponent; }) }], viewQueries: [{ propertyName: "carouselContainerElement", first: true, predicate: ["carouselContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "isInverted", "ariaHidden", "focusable"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
4105
+ /** @nocollapse */ EclCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: EclCarouselComponent, selector: "ecl-carousel", inputs: { isAutoplay: "isAutoplay", playInterval: "playInterval" }, outputs: { slide: "slide" }, host: { properties: { "class": "this.cssClasses" } }, queries: [{ propertyName: "slides", predicate: i0.forwardRef(function () { return EclCarouselItemComponent; }) }], viewQueries: [{ propertyName: "carouselContainerElement", first: true, predicate: ["carouselContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.AUTOPLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "isInverted", "ariaHidden", "focusable"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
4106
4106
  __decorate([
4107
4107
  coerceBoolean
4108
4108
  ], EclCarouselComponent.prototype, "isAutoplay", void 0);
@@ -4114,7 +4114,7 @@ __decorate([
4114
4114
  ], EclCarouselComponent.prototype, "carouselContainerElement", void 0);
4115
4115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: EclCarouselComponent, decorators: [{
4116
4116
  type: Component,
4117
- args: [{ selector: 'ecl-carousel', template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"] }]
4117
+ args: [{ selector: 'ecl-carousel', template: "<div #carouselContainer \n class=\"ecl-carousel__container\" \n [class.ecl-carousel-container--padded]=\"isPadded()\">\n <div class=\"ecl-carousel__slides\"\n [style.width.px]=\"getCarouselSlidesWidth()\" \n [style.left.px]=\"getCarouselSlidesOffset()\">\n <ng-content></ng-content>\n </div>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n\n <button *ngIf=\"hasControls() && !isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n</div>\n\n<div *ngIf=\"hasControls()\" \n class=\"ecl-carousel__controls\">\n <div class=\"ecl-container\">\n <div class=\"ecl-carousel__autoplay\">\n <button *ngIf=\"!isPlaying\" \n class=\"ecl-carousel__play\"\n (click)=\"onPlayClick()\">\n <ecl-icon \n icon=\"play\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"play-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.AUTOPLAY' | translate }}</div>\n </button>\n <button *ngIf=\"isPlaying\" \n class=\"ecl-carousel__pause\"\n (click)=\"onPauseClick()\">\n <ecl-icon \n icon=\"pause\" \n size=\"l\" \n class=\"ecl-carousel__icon-default\"\n isInverted>\n </ecl-icon>\n <ecl-icon \n icon=\"pause-filled\" \n size=\"l\" \n class=\"ecl-carousel__icon-active\"\n isInverted>\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PAUSE' | translate }}</div>\n </button>\n </div>\n\n <div class=\"ecl-carousel__navigation\">\n <button \n *ngFor=\"let slide of slides; let i = index\" \n [attr.aria-current]=\"slide.isCurrent\"\n class=\"ecl-carousel__navigation-item\"\n (click)=\"onSlideControlClick(slide)\">\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.GO-TO-SLIDE' | translate }} {{ i + 1 }}</span>\n </button>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__prev\" \n (click)=\"onPreviousSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-270\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <span class=\"ecl-u-sr-only\">{{ 'ecl.carousel.PREV-SLIDES' | translate }}</span>\n </button>\n \n <div class=\"ecl-carousel__pagination\">\n <span class=\"ecl-carousel__current\">{{ getCurrentSlideIndex() + 1 }}</span>\n {{ 'ecl.common.OF' | translate }}\n <span class=\"ecl-carousel__max\">{{ slides.length }}</span>\n </div>\n\n <button *ngIf=\"isMobileBreakpoint\"\n class=\"ecl-carousel__next\" \n (click)=\"onNextSlideClick()\">\n <ecl-icon \n icon=\"corner-arrow\" \n size=\"m\" \n transform=\"rotate-90\" \n isInverted \n class=\"ecl-carousel__icon-default\">\n </ecl-icon>\n <div class=\"ecl-u-sr-only\">{{ 'ecl.carousel.NEXT-SLIDES' | translate }}</div>\n </button>\n </div>\n</div>", styles: [":host{display:block}.ecl-carousel__container{width:100%}.ecl-carousel__slides{transition-duration:.4s}\n"] }]
4118
4118
  }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1$2.BreakpointObserver }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isAutoplay: [{
4119
4119
  type: Input
4120
4120
  }], playInterval: [{