ngx-carousel-ease
Version:
ngx-carousel-ease is a versatile Angular library providing a feature-rich, simple, and performant carousel component. This library supports infinite and responsive mode, mouse and touch event. Attention has been put to accessibility, performance, and frie
151 lines • 49.5 kB
JavaScript
import { ChangeDetectionStrategy, Component, computed, Inject, input, PLATFORM_ID, signal, ViewChild, } from '@angular/core';
import { Carousel } from './carousel';
import { CommonModule, isPlatformBrowser } from '@angular/common';
import { Validation } from './validation';
import { InfiniteSlider } from './infiniteSlider';
import { FiniteSlider } from './finiteSlider';
import * as i0 from "@angular/core";
import * as i1 from "./carousel.service";
export class CarouselComponent {
constructor(cd, carouselService, platformId) {
this.cd = cd;
this.carouselService = carouselService;
this.maxWidthCarousel = input();
this.infinite = input(false);
this.responsive = input(true);
this.autoSlide = input(true);
this.slideToShow = input(3);
this.slideToScroll = input(2);
this.autoslideLimitPercentCard = input(30);
this.strechingLimit = input(60);
this.slideWidth = input(300);
this.slideMaxWidth = input(500);
this.dots = input(true);
this.arrows = input(true);
this.counter = input(true);
this.enableMouseDrag = input(true);
this.enableTouch = input(true);
this.counterSeparator = input('/');
this.gapBetweenSlides = input(16);
this.animationTimingMs = input(300);
this.maxDomSize = input(4);
this.animationTimingFn = input('ease-out');
this.autoPlay = input(false);
this.autoPlayInterval = input(1500);
this.autoPlayAtStart = input(false);
this.displayAutoPlayControls = input(true);
this.autoPlaySlideToScroll = input(1);
this.autoPlayDirection = input('ltr');
this.previousWidth = 0;
this.currentWidth = 0;
this.isBrowser = true;
// Template variables
this.carouselDots = signal(0);
this.carouselMaxScrollableContent = signal(0);
this.carouselArrayNumberDots = signal([]);
this.sliderCurrentSlide = signal(0);
this.sliderCurrentTranslation = signal(0);
this.sliderPlayActive = signal(false);
this.sliderPlayButtonDisabled = signal(false);
this.sliderDragging = signal(false);
this.isBrowser = isPlatformBrowser(platformId);
}
ngAfterViewInit() {
if (!this.isBrowser)
return;
const carouselContainer = this.carouselContainer.nativeElement;
this.previousWidth = window.innerWidth;
this.currentWidth = window.innerWidth;
new Validation(carouselContainer, this.slideWidth(), this.slideMaxWidth(), this.gapBetweenSlides(), this.slideToScroll());
this.carousel = new Carousel(carouselContainer, this.maxWidthCarousel(), this.slideToShow(), this.slideWidth(), this.slideMaxWidth(), this.gapBetweenSlides(), this.responsive(), this.infinite());
this.instantiateSlider();
this.listeners();
this.cd.detectChanges();
}
instantiateSlider() {
if (this.infinite()) {
this.slider = new InfiniteSlider(this.carousel, this.responsive(), this.slideToScroll(), this.autoslideLimitPercentCard(), this.strechingLimit(), this.autoSlide(), this.animationTimingFn(), this.animationTimingMs(), this.maxDomSize(), this.enableMouseDrag(), this.enableTouch(), this.autoPlay(), this.autoPlayInterval(), this.autoPlayAtStart(), this.autoPlayDirection(), this.autoPlaySlideToScroll(), this.carouselService, this.cd);
}
else {
this.slider = new FiniteSlider(this.carousel, this.responsive(), this.slideToScroll(), this.autoslideLimitPercentCard(), this.strechingLimit(), this.autoSlide(), this.animationTimingFn(), this.animationTimingMs(), this.enableMouseDrag(), this.enableTouch(), this.autoPlay(), this.autoPlayInterval(), this.autoPlayAtStart(), this.autoPlayDirection(), this.autoPlaySlideToScroll(), this.carouselService, this.cd);
}
this.carouselDots = computed(() => this.carousel.numberDots());
this.carouselMaxScrollableContent = computed(() => this.carousel.maxScrollableContent());
this.carouselArrayNumberDots = computed(() => this.carousel.arrayNumberDots());
this.sliderCurrentSlide = computed(() => this.slider.currentSlide());
this.sliderCurrentTranslation = computed(() => this.slider.currentTranslation());
this.sliderCurrentTranslation = computed(() => this.slider.currentTranslation());
this.sliderPlayActive = computed(() => this.slider.playActive());
this.sliderPlayButtonDisabled = computed(() => this.slider.playButtonDisabled());
this.sliderDragging = computed(() => this.slider.dragging());
}
listeners() {
this.mouseUpEvent = (event) => {
if (!this.sliderDragging())
return;
this.slider.dragStop(event);
this.slider.relaunchAutoPlay();
this.cd.markForCheck();
};
this.visibilityEvent = (event) => {
const visibility = event.target.visibilityState;
this.slider.dragStop(event);
if (visibility === 'hidden') {
clearInterval(this.slider.autoInterval);
}
if (visibility === 'visible') {
this.slider.relaunchAutoPlay();
}
this.cd.markForCheck();
};
this.resizeEvent = () => {
this.resize();
};
window.addEventListener('mouseup', this.mouseUpEvent);
window.addEventListener('resize', this.resizeEvent);
document.addEventListener('visibilitychange', this.visibilityEvent);
}
/**
* Reinitialise variables at resize
*/
resize() {
// on smartphones a vertical scroll triggers a resize event
this.currentWidth = window.innerWidth;
if (this.currentWidth === this.previousWidth)
return;
this.previousWidth = window.innerWidth;
this.carousel.updateProperties();
this.slider.updateProperties();
this.slider.stopAutoPlay();
const slideNumberBeforeChange = this.slider.currentSlide();
this.slider.currentSlide.set(0);
const slideHasChanged = slideNumberBeforeChange !== this.slider.currentSlide();
this.slider.accumulatedSlide = 0;
this.slider.computeTransformation(0);
this.slider.changePrevAndNextLimits(0);
this.slider.fireSlideChangeEvent(slideHasChanged, 0);
this.cd.markForCheck();
}
/**
* Removes active subscriptions and clear interval autoplay.
*/
ngOnDestroy() {
window.removeEventListener('resize', this.resizeEvent);
window.removeEventListener('mouseup', this.mouseUpEvent);
document.removeEventListener('visibilitychange', this.visibilityEvent);
this.slider.stopAutoPlay();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.CarouselService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CarouselComponent, isStandalone: true, selector: "carousel", inputs: { maxWidthCarousel: { classPropertyName: "maxWidthCarousel", publicName: "maxWidthCarousel", isSignal: true, isRequired: false, transformFunction: null }, infinite: { classPropertyName: "infinite", publicName: "infinite", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null }, autoSlide: { classPropertyName: "autoSlide", publicName: "autoSlide", isSignal: true, isRequired: false, transformFunction: null }, slideToShow: { classPropertyName: "slideToShow", publicName: "slideToShow", isSignal: true, isRequired: false, transformFunction: null }, slideToScroll: { classPropertyName: "slideToScroll", publicName: "slideToScroll", isSignal: true, isRequired: false, transformFunction: null }, autoslideLimitPercentCard: { classPropertyName: "autoslideLimitPercentCard", publicName: "autoslideLimitPercentCard", isSignal: true, isRequired: false, transformFunction: null }, strechingLimit: { classPropertyName: "strechingLimit", publicName: "strechingLimit", isSignal: true, isRequired: false, transformFunction: null }, slideWidth: { classPropertyName: "slideWidth", publicName: "slideWidth", isSignal: true, isRequired: false, transformFunction: null }, slideMaxWidth: { classPropertyName: "slideMaxWidth", publicName: "slideMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, dots: { classPropertyName: "dots", publicName: "dots", isSignal: true, isRequired: false, transformFunction: null }, arrows: { classPropertyName: "arrows", publicName: "arrows", isSignal: true, isRequired: false, transformFunction: null }, counter: { classPropertyName: "counter", publicName: "counter", isSignal: true, isRequired: false, transformFunction: null }, enableMouseDrag: { classPropertyName: "enableMouseDrag", publicName: "enableMouseDrag", isSignal: true, isRequired: false, transformFunction: null }, enableTouch: { classPropertyName: "enableTouch", publicName: "enableTouch", isSignal: true, isRequired: false, transformFunction: null }, counterSeparator: { classPropertyName: "counterSeparator", publicName: "counterSeparator", isSignal: true, isRequired: false, transformFunction: null }, gapBetweenSlides: { classPropertyName: "gapBetweenSlides", publicName: "gapBetweenSlides", isSignal: true, isRequired: false, transformFunction: null }, animationTimingMs: { classPropertyName: "animationTimingMs", publicName: "animationTimingMs", isSignal: true, isRequired: false, transformFunction: null }, maxDomSize: { classPropertyName: "maxDomSize", publicName: "maxDomSize", isSignal: true, isRequired: false, transformFunction: null }, animationTimingFn: { classPropertyName: "animationTimingFn", publicName: "animationTimingFn", isSignal: true, isRequired: false, transformFunction: null }, autoPlay: { classPropertyName: "autoPlay", publicName: "autoPlay", isSignal: true, isRequired: false, transformFunction: null }, autoPlayInterval: { classPropertyName: "autoPlayInterval", publicName: "autoPlayInterval", isSignal: true, isRequired: false, transformFunction: null }, autoPlayAtStart: { classPropertyName: "autoPlayAtStart", publicName: "autoPlayAtStart", isSignal: true, isRequired: false, transformFunction: null }, displayAutoPlayControls: { classPropertyName: "displayAutoPlayControls", publicName: "displayAutoPlayControls", isSignal: true, isRequired: false, transformFunction: null }, autoPlaySlideToScroll: { classPropertyName: "autoPlaySlideToScroll", publicName: "autoPlaySlideToScroll", isSignal: true, isRequired: false, transformFunction: null }, autoPlayDirection: { classPropertyName: "autoPlayDirection", publicName: "autoPlayDirection", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "carouselContainer", first: true, predicate: ["carouselContainer"], descendants: true }], ngImport: i0, template: "<div class=\"carousel-container\" #carouselContainer>\r\n <div class=\"banner-container\">\r\n @if (arrows()) {\r\n <div class=\"btn-container\">\r\n <button\r\n class=\"prev\"\r\n aria-label=\"previous button navigation\"\r\n (click)=\"slider.prev()\"\r\n [disabled]=\"\r\n !infinite() &&\r\n ((this.sliderCurrentSlide() === 0 &&\r\n this.sliderCurrentTranslation() >= 0) ||\r\n carouselDots() === 1)\r\n \"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n height=\"16\"\r\n width=\"16\"\r\n viewBox=\"0 0 512 512\"\r\n >\r\n <path\r\n d=\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 288 480 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-370.7 0 73.4-73.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-128 128z\"\r\n />\r\n </svg>\r\n </button>\r\n <button\r\n class=\"next\"\r\n aria-label=\"next button navigation\"\r\n (click)=\"slider.next()\"\r\n [disabled]=\"\r\n !infinite() &&\r\n ((this.sliderCurrentSlide() === carouselDots() - 1 &&\r\n this.sliderCurrentTranslation() <=\r\n -this.carouselMaxScrollableContent()) ||\r\n carouselDots() === 1)\r\n \"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n height=\"16\"\r\n width=\"16\"\r\n viewBox=\"0 0 512 512\"\r\n >\r\n <path\r\n d=\"M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l370.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n } @if (autoPlay() && displayAutoPlayControls()) {\r\n <div class=\"autoplay-container\">\r\n <button\r\n class=\"play\"\r\n [disabled]=\"this.sliderPlayActive() || this.sliderPlayButtonDisabled()\"\r\n (click)=\"slider.launchAutoPlay()\"\r\n aria-label=\"play button navigation\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\r\n <path\r\n d=\"M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z\"\r\n />\r\n </svg>\r\n </button>\r\n <button\r\n class=\"pause\"\r\n [disabled]=\"!this.sliderPlayActive()\"\r\n (click)=\"slider.stopAutoPlay()\"\r\n aria-label=\"pause button navigation\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n d=\"M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n } @if (counter()) {\r\n <div class=\"counter\">\r\n <p>\r\n {{ this.sliderCurrentSlide() + 1 }} {{ counterSeparator() }}\r\n {{ carouselDots() }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"slides-container\"\r\n [class.dragging]=\"this.sliderDragging()\"\r\n (mousedown)=\"slider.dragStart($event)\"\r\n (touchstart)=\"slider.dragStart($event)\"\r\n (mousemove)=\"slider.dragMove($event)\"\r\n (touchmove)=\"slider.dragMove($event)\"\r\n (touchend)=\"slider.dragStop($event); this.slider.relaunchAutoPlay()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (dots()) {\r\n <div class=\"bullets-container\">\r\n @for (bullet of this.carouselArrayNumberDots(); track $index) {\r\n <button\r\n class=\"bullet\"\r\n aria-label=\"bullet point navigation\"\r\n [class.current]=\"bullet === slider.currentSlide()\"\r\n (click)=\"slider.goTo(bullet)\"\r\n ></button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["*{margin:0;padding:0;box-sizing:border-box}.carousel-container{position:relative;overflow-x:hidden;padding:.2rem}.slides-container{display:grid;grid-auto-flow:column;justify-items:center;transform:translateZ(0);margin:auto}.banner-container{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:.5rem}.btn-container{min-width:3.75rem}.autoplay-container{display:flex;gap:1rem}.autoplay-container button{border:none;background:none;display:flex;cursor:pointer}.autoplay-container svg{fill:#3b3b3b;width:1.8rem;height:1.8rem;transition:fill .3s}.play:disabled svg,.pause:disabled svg{fill:#b1b1b1;cursor:not-allowed}.counter{background:#e6e6e6;padding:.3rem .7rem;border-radius:1rem;min-width:3.75rem;text-align:center}.prev,.next{background:#0079b4;padding:.5rem;color:#fff;border-radius:.3rem;box-shadow:0 2px 4px #9e9e9ed4;border:none;cursor:pointer;z-index:1;transition:.4s}.prev svg,.next svg{fill:#fff}.prev,.next{display:inline-flex;align-items:center;justify-content:center}.prev{margin-right:1rem}.prev:disabled,.next:disabled{opacity:.3;cursor:not-allowed}.bullets-container{display:flex;justify-content:center;gap:1rem;margin-top:2rem}.bullet{display:block;width:.8rem;height:.8rem;border:none;border-radius:50%;background:#dbdada;cursor:pointer;transition:background-color .4s}.bullet.current{background:#0079b4}.slides-container.dragging{cursor:grab}@media (min-width: 650px){.prev,.next{position:absolute;top:50%;left:0;transform:translateY(-50%)}.prev{margin-left:2rem}.next{margin-right:2rem;right:0;left:auto}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CarouselComponent, decorators: [{
type: Component,
args: [{ selector: 'carousel', imports: [CommonModule], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"carousel-container\" #carouselContainer>\r\n <div class=\"banner-container\">\r\n @if (arrows()) {\r\n <div class=\"btn-container\">\r\n <button\r\n class=\"prev\"\r\n aria-label=\"previous button navigation\"\r\n (click)=\"slider.prev()\"\r\n [disabled]=\"\r\n !infinite() &&\r\n ((this.sliderCurrentSlide() === 0 &&\r\n this.sliderCurrentTranslation() >= 0) ||\r\n carouselDots() === 1)\r\n \"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n height=\"16\"\r\n width=\"16\"\r\n viewBox=\"0 0 512 512\"\r\n >\r\n <path\r\n d=\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 288 480 288c17.7 0 32-14.3 32-32s-14.3-32-32-32l-370.7 0 73.4-73.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-128 128z\"\r\n />\r\n </svg>\r\n </button>\r\n <button\r\n class=\"next\"\r\n aria-label=\"next button navigation\"\r\n (click)=\"slider.next()\"\r\n [disabled]=\"\r\n !infinite() &&\r\n ((this.sliderCurrentSlide() === carouselDots() - 1 &&\r\n this.sliderCurrentTranslation() <=\r\n -this.carouselMaxScrollableContent()) ||\r\n carouselDots() === 1)\r\n \"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n height=\"16\"\r\n width=\"16\"\r\n viewBox=\"0 0 512 512\"\r\n >\r\n <path\r\n d=\"M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l370.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n } @if (autoPlay() && displayAutoPlayControls()) {\r\n <div class=\"autoplay-container\">\r\n <button\r\n class=\"play\"\r\n [disabled]=\"this.sliderPlayActive() || this.sliderPlayButtonDisabled()\"\r\n (click)=\"slider.launchAutoPlay()\"\r\n aria-label=\"play button navigation\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\r\n <path\r\n d=\"M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z\"\r\n />\r\n </svg>\r\n </button>\r\n <button\r\n class=\"pause\"\r\n [disabled]=\"!this.sliderPlayActive()\"\r\n (click)=\"slider.stopAutoPlay()\"\r\n aria-label=\"pause button navigation\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\r\n <path\r\n d=\"M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n } @if (counter()) {\r\n <div class=\"counter\">\r\n <p>\r\n {{ this.sliderCurrentSlide() + 1 }} {{ counterSeparator() }}\r\n {{ carouselDots() }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"slides-container\"\r\n [class.dragging]=\"this.sliderDragging()\"\r\n (mousedown)=\"slider.dragStart($event)\"\r\n (touchstart)=\"slider.dragStart($event)\"\r\n (mousemove)=\"slider.dragMove($event)\"\r\n (touchmove)=\"slider.dragMove($event)\"\r\n (touchend)=\"slider.dragStop($event); this.slider.relaunchAutoPlay()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (dots()) {\r\n <div class=\"bullets-container\">\r\n @for (bullet of this.carouselArrayNumberDots(); track $index) {\r\n <button\r\n class=\"bullet\"\r\n aria-label=\"bullet point navigation\"\r\n [class.current]=\"bullet === slider.currentSlide()\"\r\n (click)=\"slider.goTo(bullet)\"\r\n ></button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: ["*{margin:0;padding:0;box-sizing:border-box}.carousel-container{position:relative;overflow-x:hidden;padding:.2rem}.slides-container{display:grid;grid-auto-flow:column;justify-items:center;transform:translateZ(0);margin:auto}.banner-container{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:.5rem}.btn-container{min-width:3.75rem}.autoplay-container{display:flex;gap:1rem}.autoplay-container button{border:none;background:none;display:flex;cursor:pointer}.autoplay-container svg{fill:#3b3b3b;width:1.8rem;height:1.8rem;transition:fill .3s}.play:disabled svg,.pause:disabled svg{fill:#b1b1b1;cursor:not-allowed}.counter{background:#e6e6e6;padding:.3rem .7rem;border-radius:1rem;min-width:3.75rem;text-align:center}.prev,.next{background:#0079b4;padding:.5rem;color:#fff;border-radius:.3rem;box-shadow:0 2px 4px #9e9e9ed4;border:none;cursor:pointer;z-index:1;transition:.4s}.prev svg,.next svg{fill:#fff}.prev,.next{display:inline-flex;align-items:center;justify-content:center}.prev{margin-right:1rem}.prev:disabled,.next:disabled{opacity:.3;cursor:not-allowed}.bullets-container{display:flex;justify-content:center;gap:1rem;margin-top:2rem}.bullet{display:block;width:.8rem;height:.8rem;border:none;border-radius:50%;background:#dbdada;cursor:pointer;transition:background-color .4s}.bullet.current{background:#0079b4}.slides-container.dragging{cursor:grab}@media (min-width: 650px){.prev,.next{position:absolute;top:50%;left:0;transform:translateY(-50%)}.prev{margin-left:2rem}.next{margin-right:2rem;right:0;left:auto}}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.CarouselService }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }], propDecorators: { carouselContainer: [{
type: ViewChild,
args: ['carouselContainer']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2Fyb3VzZWwvc3JjL2xpYi9jYXJvdXNlbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jYXJvdXNlbC9zcmMvbGliL2Nhcm91c2VsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFFBQVEsRUFFUixNQUFNLEVBQ04sS0FBSyxFQUNMLFdBQVcsRUFFWCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBVTlDLE1BQU0sT0FBTyxpQkFBaUI7SUFrRDVCLFlBQ1UsRUFBcUIsRUFDckIsZUFBZ0MsRUFDbkIsVUFBa0I7UUFGL0IsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDckIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBbkQxQyxxQkFBZ0IsR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUNuQyxhQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsY0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixnQkFBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixrQkFBYSxHQUFHLEtBQUss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QyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQTdOVSxpQkFBaUIsa0ZBcURsQixXQUFXO21HQXJEVixpQkFBaUIsczRIQzlCOUIsd2xJQWdIQSx3a0REdEZZLFlBQVk7OzRGQUlYLGlCQUFpQjtrQkFSN0IsU0FBUzsrQkFDRSxVQUFVLFdBR1gsQ0FBQyxZQUFZLENBQUMsY0FDWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU07OzBCQXVENUMsTUFBTTsyQkFBQyxXQUFXO3lDQXZCYixpQkFBaUI7c0JBRHhCLFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBjb21wdXRlZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBpbnB1dCxcclxuICBQTEFURk9STV9JRCxcclxuICBTaWduYWwsXHJcbiAgc2lnbmFsLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2Fyb3VzZWwgfSBmcm9tICcuL2Nhcm91c2VsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xyXG5pbXBvcnQgeyBDYXJvdXNlbFNlcnZpY2UgfSBmcm9tICcuL2Nhcm91c2VsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25zVGltaW5nIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgSW5maW5pdGVTbGlkZXIgfSBmcm9tICcuL2luZmluaXRlU2xpZGVyJztcclxuaW1wb3J0IHsgRmluaXRlU2xpZGVyIH0gZnJvbSAnLi9maW5pdGVTbGlkZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjYXJvdXNlbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Nhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYXJvdXNlbC5jb21wb25lbnQuY3NzJ10sXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgbWF4V2lkdGhDYXJvdXNlbCA9IGlucHV0PG51bWJlcj4oKTtcclxuICBpbmZpbml0ZSA9IGlucHV0KGZhbHNlKTtcclxuICByZXNwb25zaXZlID0gaW5wdXQodHJ1ZSk7XHJcbiAgYXV0b1NsaWRlID0gaW5wdXQodHJ1ZSk7XHJcbiAgc2xpZGVUb1Nob3cgPSBpbnB1dCgzKTtcclxuICBzbGlkZVRvU2Nyb2xsID0gaW5wdXQoMik7XHJcbiAgYXV0b3NsaWRlTGltaXRQZXJjZW50Q2FyZCA9IGlucHV0KDMwKTtcclxuICBzdHJlY2hpbmdMaW1pdCA9IGlucHV0KDYwKTtcclxuICBzbGlkZVdpZHRoID0gaW5wdXQoMzAwKTtcclxuICBzbGlkZU1heFdpZHRoID0gaW5wdXQoNTAwKTtcclxuICBkb3RzID0gaW5wdXQodHJ1ZSk7XHJcbiAgYXJyb3dzID0gaW5wdXQodHJ1ZSk7XHJcbiAgY291bnRlciA9IGlucHV0KHRydWUpO1xyXG4gIGVuYWJsZU1vdXNlRHJhZyA9IGlucHV0KHRydWUpO1xyXG4gIGVuYWJsZVRvdWNoID0gaW5wdXQodHJ1ZSk7XHJcbiAgY291bnRlclNlcGFyYXRvciA9IGlucHV0KCcvJyk7XHJcbiAgZ2FwQmV0d2VlblNsaWRlcyA9IGlucHV0KDE2KTtcclxuICBhbmltYXRpb25UaW1pbmdNcyA9IGlucHV0KDMwMCk7XHJcbiAgbWF4RG9tU2l6ZSA9IGlucHV0KDQpO1xyXG4gIGFuaW1hdGlvblRpbWluZ0ZuID0gaW5wdXQ8QW5pbWF0aW9uc1RpbWluZz4oJ2Vhc2Utb3V0Jyk7XHJcblxyXG4gIGF1dG9QbGF5ID0gaW5wdXQoZmFsc2UpO1xyXG4gIGF1dG9QbGF5SW50ZXJ2YWwgPSBpbnB1dCgxNTAwKTtcclxuICBhdXRvUGxheUF0U3RhcnQgPSBpbnB1dChmYWxzZSk7XHJcbiAgZGlzcGxheUF1dG9QbGF5Q29udHJvbHMgPSBpbnB1dCh0cnVlKTtcclxuICBhdXRvUGxheVNsaWRlVG9TY3JvbGwgPSBpbnB1dCgxKTtcclxuICBhdXRvUGxheURpcmVjdGlvbiA9IGlucHV0PCdsdHInIHwgJ3J0bCc+KCdsdHInKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2Fyb3VzZWxDb250YWluZXInKVxyXG4gIHByaXZhdGUgY2Fyb3VzZWxDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBwcml2YXRlIHJlc2l6ZUV2ZW50ITogKCkgPT4gdm9pZDtcclxuICBwcml2YXRlIG1vdXNlVXBFdmVudCE6IChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSB2aXNpYmlsaXR5RXZlbnQhOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcclxuICBwcml2YXRlIHByZXZpb3VzV2lkdGggPSAwO1xyXG4gIHByaXZhdGUgY3VycmVudFdpZHRoID0gMDtcclxuICBwcml2YXRlIGlzQnJvd3NlciA9IHRydWU7XHJcbiAgcHJpdmF0ZSBjYXJvdXNlbCE6IENhcm91c2VsO1xyXG4gIHNsaWRlciE6IEluZmluaXRlU2xpZGVyIHwgRmluaXRlU2xpZGVyO1xyXG5cclxuICAvLyBUZW1wbGF0ZSB2YXJpYWJsZXNcclxuICBjYXJvdXNlbERvdHM6IFNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDApO1xyXG4gIGNhcm91c2VsTWF4U2Nyb2xsYWJsZUNvbnRlbnQ6IFNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDApO1xyXG4gIGNhcm91c2VsQXJyYXlOdW1iZXJEb3RzOiBTaWduYWw8bnVtYmVyW10+ID0gc2lnbmFsPG51bWJlcltdPihbXSk7XHJcbiAgc2xpZGVyQ3VycmVudFNsaWRlOiBTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcclxuICBzbGlkZXJDdXJyZW50VHJhbnNsYXRpb246IFNpZ25hbDxudW1iZXI+ID0gc2lnbmFsKDApO1xyXG4gIHNsaWRlclBsYXlBY3RpdmU6IFNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgc2xpZGVyUGxheUJ1dHRvbkRpc2FibGVkOiBTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHNsaWRlckRyYWdnaW5nOiBTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBjYXJvdXNlbFNlcnZpY2U6IENhcm91c2VsU2VydmljZSxcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IE9iamVjdFxyXG4gICkge1xyXG4gICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjYXJvdXNlbENvbnRhaW5lciA9IHRoaXMuY2Fyb3VzZWxDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMucHJldmlvdXNXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgdGhpcy5jdXJyZW50V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICBuZXcgVmFsaWRhdGlvbihcclxuICAgICAgY2Fyb3VzZWxDb250YWluZXIsXHJcbiAgICAgIHRoaXMuc2xpZGVXaWR0aCgpLFxyXG4gICAgICB0aGlzLnNsaWRlTWF4V2lkdGgoKSxcclxuICAgICAgdGhpcy5nYXBCZXR3ZWVuU2xpZGVzKCksXHJcbiAgICAgIHRoaXMuc2xpZGVUb1Njcm9sbCgpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY2Fyb3VzZWwgPSBuZXcgQ2Fyb3VzZWwoXHJcbiAgICAgIGNhcm91c2VsQ29udGFpbmVyLFxyXG4gICAgICB0aGlzLm1heFdpZHRoQ2Fyb3VzZWwoKSxcclxuICAgICAgdGhpcy5zbGlkZVRvU2hvdygpLFxyXG4gICAgICB0aGlzLnNsaWRlV2lkdGgoKSxcclxuICAgICAgdGhpcy5zbGlkZU1heFdpZHRoKCksXHJcbiAgICAgIHRoaXMuZ2FwQmV0d2VlblNsaWRlcygpLFxyXG4gICAgICB0aGlzLnJlc3BvbnNpdmUoKSxcclxuICAgICAgdGhpcy5pbmZpbml0ZSgpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuaW5zdGFudGlhdGVTbGlkZXIoKTtcclxuICAgIHRoaXMubGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGluc3RhbnRpYXRlU2xpZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuaW5maW5pdGUoKSkge1xyXG4gICAgICB0aGlzLnNsaWRlciA9IG5ldyBJbmZpbml0ZVNsaWRlcihcclxuICAgICAgICB0aGlzLmNhcm91c2VsLFxyXG4gICAgICAgIHRoaXMucmVzcG9uc2l2ZSgpLFxyXG4gICAgICAgIHRoaXMuc2xpZGVUb1Njcm9sbCgpLFxyXG4gICAgICAgIHRoaXMuYXV0b3NsaWRlTGltaXRQZXJjZW50Q2FyZCgpLFxyXG4gICAgICAgIHRoaXMuc3RyZWNoaW5nTGltaXQoKSxcclxuICAgICAgICB0aGlzLmF1dG9TbGlkZSgpLFxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uVGltaW5nRm4oKSxcclxuICAgICAgICB0aGlzLmFuaW1hdGlvblRpbWluZ01zKCksXHJcbiAgICAgICAgdGhpcy5tYXhEb21TaXplKCksXHJcbiAgICAgICAgdGhpcy5lbmFibGVNb3VzZURyYWcoKSxcclxuICAgICAgICB0aGlzLmVuYWJsZVRvdWNoKCksXHJcbiAgICAgICAgdGhpcy5hdXRvUGxheSgpLFxyXG4gICAgICAgIHRoaXMuYXV0b1BsYXlJbnRlcnZhbCgpLFxyXG4gICAgICAgIHRoaXMuYXV0b1BsYXlBdFN0YXJ0KCksXHJcbiAgICAgICAgdGhpcy5hdXRvUGxheURpcmVjdGlvbigpLFxyXG4gICAgICAgIHRoaXMuYXV0b1BsYXlTbGlkZVRvU2Nyb2xsKCksXHJcbiAgICAgICAgdGhpcy5jYXJvdXNlbFNlcnZpY2UsXHJcbiAgICAgICAgdGhpcy5jZFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zbGlkZXIgPSBuZXcgRmluaXRlU2xpZGVyKFxyXG4gICAgICAgIHRoaXMuY2Fyb3VzZWwsXHJcbiAgICAgICAgdGhpcy5yZXNwb25zaXZlKCksXHJcbiAgICAgICAgdGhpcy5zbGlkZVRvU2Nyb2xsKCksXHJcbiAgICAgICAgdGhpcy5hdXRvc2xpZGVMaW1pdFBlcmNlbnRDYXJkKCksXHJcbiAgICAgICAgdGhpcy5zdHJlY2hpbmdMaW1pdCgpLFxyXG4gICAgICAgIHRoaXMuYXV0b1NsaWRlKCksXHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25UaW1pbmdGbigpLFxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uVGltaW5nTXMoKSxcclxuICAgICAgICB0aGlzLmVuYWJsZU1vdXNlRHJhZygpLFxyXG4gICAgICAgIHRoaXMuZW5hYmxlVG91Y2goKSxcclxuICAgICAgICB0aGlzLmF1dG9QbGF5KCksXHJcbiAgICAgICAgdGhpcy5hdXRvUGxheUludGVydmFsKCksXHJcbiAgICAgICAgdGhpcy5hdXRvUGxheUF0U3RhcnQoKSxcclxuICAgICAgICB0aGlzLmF1dG9QbGF5RGlyZWN0aW9uKCksXHJcbiAgICAgICAgdGhpcy5hdXRvUGxheVNsaWRlVG9TY3JvbGwoKSxcclxuICAgICAgICB0aGlzLmNhcm91c2VsU2VydmljZSxcclxuICAgICAgICB0aGlzLmNkXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYXJvdXNlbERvdHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNhcm91c2VsLm51bWJlckRvdHMoKSk7XHJcbiAgICB0aGlzLmNhcm91c2VsTWF4U2Nyb2xsYWJsZUNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PlxyXG4gICAgICB0aGlzLmNhcm91c2VsLm1heFNjcm9sbGFibGVDb250ZW50KClcclxuICAgICk7XHJcbiAgICB0aGlzLmNhcm91c2VsQXJyYXlOdW1iZXJEb3RzID0gY29tcHV0ZWQoKCkgPT5cclxuICAgICAgdGhpcy5jYXJvdXNlbC5hcnJheU51bWJlckRvdHMoKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnNsaWRlckN1cnJlbnRTbGlkZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2xpZGVyLmN1cnJlbnRTbGlkZSgpKTtcclxuICAgIHRoaXMuc2xpZGVyQ3VycmVudFRyYW5zbGF0aW9uID0gY29tcHV0ZWQoKCkgPT5cclxuICAgICAgdGhpcy5zbGlkZXIuY3VycmVudFRyYW5zbGF0aW9uKClcclxuICAgICk7XHJcbiAgICB0aGlzLnNsaWRlckN1cnJlbnRUcmFuc2xhdGlvbiA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICAgIHRoaXMuc2xpZGVyLmN1cnJlbnRUcmFuc2xhdGlvbigpXHJcbiAgICApO1xyXG4gICAgdGhpcy5zbGlkZXJQbGF5QWN0aXZlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zbGlkZXIucGxheUFjdGl2ZSgpKTtcclxuICAgIHRoaXMuc2xpZGVyUGxheUJ1dHRvbkRpc2FibGVkID0gY29tcHV0ZWQoKCkgPT5cclxuICAgICAgdGhpcy5zbGlkZXIucGxheUJ1dHRvbkRpc2FibGVkKClcclxuICAgICk7XHJcbiAgICB0aGlzLnNsaWRlckRyYWdnaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zbGlkZXIuZHJhZ2dpbmcoKSk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5lcnMoKSB7XHJcbiAgICB0aGlzLm1vdXNlVXBFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuc2xpZGVyRHJhZ2dpbmcoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5zbGlkZXIuZHJhZ1N0b3AoZXZlbnQpO1xyXG4gICAgICB0aGlzLnNsaWRlci5yZWxhdW5jaEF1dG9QbGF5KCk7XHJcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudmlzaWJpbGl0eUV2ZW50ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHZpc2liaWxpdHkgPSBldmVudC50YXJnZXQudmlzaWJpbGl0eVN0YXRlO1xyXG4gICAgICB0aGlzLnNsaWRlci5kcmFnU3RvcChldmVudCk7XHJcblxyXG4gICAgICBpZiAodmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2xpZGVyLmF1dG9JbnRlcnZhbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2aXNpYmlsaXR5ID09PSAndmlzaWJsZScpIHtcclxuICAgICAgICB0aGlzLnNsaWRlci5yZWxhdW5jaEF1dG9QbGF5KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVzaXplRXZlbnQgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzaXplKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwRXZlbnQpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplRXZlbnQpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMudmlzaWJpbGl0eUV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlaW5pdGlhbGlzZSB2YXJpYWJsZXMgYXQgcmVzaXplXHJcbiAgICovXHJcbiAgcmVzaXplKCkge1xyXG4gICAgLy8gb24gc21hcnRwaG9uZXMgYSB2ZXJ0aWNhbCBzY3JvbGwgdHJpZ2dlcnMgYSByZXNpemUgZXZlbnRcclxuICAgIHRoaXMuY3VycmVudFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50V2lkdGggPT09IHRoaXMucHJldmlvdXNXaWR0aCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMucHJldmlvdXNXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgdGhpcy5jYXJvdXNlbC51cGRhdGVQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNsaWRlci51cGRhdGVQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgdGhpcy5zbGlkZXIuc3RvcEF1dG9QbGF5KCk7XHJcbiAgICBjb25zdCBzbGlkZU51bWJlckJlZm9yZUNoYW5nZSA9IHRoaXMuc2xpZGVyLmN1cnJlbnRTbGlkZSgpO1xyXG4gICAgdGhpcy5zbGlkZXIuY3VycmVudFNsaWRlLnNldCgwKTtcclxuICAgIGNvbnN0IHNsaWRlSGFzQ2hhbmdlZCA9XHJcbiAgICAgIHNsaWRlTnVtYmVyQmVmb3JlQ2hhbmdlICE9PSB0aGlzLnNsaWRlci5jdXJyZW50U2xpZGUoKTtcclxuICAgIHRoaXMuc2xpZGVyLmFjY3VtdWxhdGVkU2xpZGUgPSAwO1xyXG4gICAgdGhpcy5zbGlkZXIuY29tcHV0ZVRyYW5zZm9ybWF0aW9uKDApO1xyXG4gICAgdGhpcy5zbGlkZXIuY2hhbmdlUHJldkFuZE5leHRMaW1pdHMoMCk7XHJcbiAgICB0aGlzLnNsaWRlci5maXJlU2xpZGVDaGFuZ2VFdmVudChzbGlkZUhhc0NoYW5nZWQsIDApO1xyXG5cclxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFjdGl2ZSBzdWJzY3JpcHRpb25zIGFuZCBjbGVhciBpbnRlcnZhbCBhdXRvcGxheS5cclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUV2ZW50KTtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwRXZlbnQpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMudmlzaWJpbGl0eUV2ZW50KTtcclxuICAgIHRoaXMuc2xpZGVyLnN0b3BBdXRvUGxheSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtY29udGFpbmVyXCIgI2Nhcm91c2VsQ29udGFpbmVyPlxyXG4gIDxkaXYgY2xhc3M9XCJiYW5uZXItY29udGFpbmVyXCI+XHJcbiAgICBAaWYgKGFycm93cygpKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lclwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJwcmV2XCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwicHJldmlvdXMgYnV0dG9uIG5hdmlnYXRpb25cIlxyXG4gICAgICAgIChjbGljayk9XCJzbGlkZXIucHJldigpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAhaW5maW5pdGUoKSAmJlxyXG4gICAgICAgICAgKCh0aGlzLnNsaWRlckN1cnJlbnRTbGlkZSgpID09PSAwICYmXHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVyQ3VycmVudFRyYW5zbGF0aW9uKCkgPj0gMCkgfHxcclxuICAgICAgICAgICAgY2Fyb3VzZWxEb3RzKCkgPT09IDEpXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzdmdcclxuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNOS40IDIzMy40Yy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM2wxMjggMTI4YzEyLjUgMTIuNSAzMi44IDEyLjUgNDUuMyAwczEyLjUtMzIuOCAwLTQ1LjNMMTA5LjMgMjg4IDQ4MCAyODhjMTcuNyAwIDMyLTE0LjMgMzItMzJzLTE0LjMtMzItMzItMzJsLTM3MC43IDAgNzMuNC03My40YzEyLjUtMTIuNSAxMi41LTMyLjggMC00NS4zcy0zMi44LTEyLjUtNDUuMyAwbC0xMjggMTI4elwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwibmV4dFwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cIm5leHQgYnV0dG9uIG5hdmlnYXRpb25cIlxyXG4gICAgICAgIChjbGljayk9XCJzbGlkZXIubmV4dCgpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAhaW5maW5pdGUoKSAmJlxyXG4gICAgICAgICAgKCh0aGlzLnNsaWRlckN1cnJlbnRTbGlkZSgpID09PSBjYXJvdXNlbERvdHMoKSAtIDEgJiZcclxuICAgICAgICAgICAgdGhpcy5zbGlkZXJDdXJyZW50VHJhbnNsYXRpb24oKSA8PVxyXG4gICAgICAgICAgICAgIC10aGlzLmNhcm91c2VsTWF4U2Nyb2xsYWJsZUNvbnRlbnQoKSkgfHxcclxuICAgICAgICAgICAgY2Fyb3VzZWxEb3RzKCkgPT09IDEpXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzdmdcclxuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNNTAyLjYgMjc4LjZjMTIuNS0xMi41IDEyLjUtMzIuOCAwLTQ1LjNsLTEyOC0xMjhjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwcy0xMi41IDMyLjggMCA0NS4zTDQwMi43IDIyNCAzMiAyMjRjLTE3LjcgMC0zMiAxNC4zLTMyIDMyczE0LjMgMzIgMzIgMzJsMzcwLjcgMC03My40IDczLjRjLTEyLjUgMTIuNS0xMi41IDMyLjggMCA0NS4zczMyLjggMTIuNSA0NS4zIDBsMTI4LTEyOHpcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIH0gQGlmIChhdXRvUGxheSgpICYmIGRpc3BsYXlBdXRvUGxheUNvbnRyb2xzKCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJhdXRvcGxheS1jb250YWluZXJcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwicGxheVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuc2xpZGVyUGxheUFjdGl2ZSgpIHx8IHRoaXMuc2xpZGVyUGxheUJ1dHRvbkRpc2FibGVkKClcIlxyXG4gICAgICAgIChjbGljayk9XCJzbGlkZXIubGF1bmNoQXV0b1BsYXkoKVwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cInBsYXkgYnV0dG9uIG5hdmlnYXRpb25cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzODQgNTEyXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTczIDM5Yy0xNC44LTkuMS0zMy40LTkuNC00OC41LS45UzAgNjIuNiAwIDgwVjQzMmMwIDE3LjQgOS40IDMzLjQgMjQuNSA0MS45czMzLjcgOC4xIDQ4LjUtLjlMMzYxIDI5N2MxNC4zLTguNyAyMy0yNC4yIDIzLTQxcy04LjctMzIuMi0yMy00MUw3MyAzOXpcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cInBhdXNlXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIXRoaXMuc2xpZGVyUGxheUFjdGl2ZSgpXCJcclxuICAgICAgICAoY2xpY2spPVwic2xpZGVyLnN0b3BBdXRvUGxheSgpXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwicGF1c2UgYnV0dG9uIG5hdmlnYXRpb25cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzMjAgNTEyXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTQ4IDY0QzIxLjUgNjQgMCA4NS41IDAgMTEyVjQwMGMwIDI2LjUgMjEuNSA0OCA0OCA0OEg4MGMyNi41IDAgNDgtMjEuNSA0OC00OFYxMTJjMC0yNi41LTIxLjUtNDgtNDgtNDhINDh6bTE5MiAwYy0yNi41IDAtNDggMjEuNS00OCA0OFY0MDBjMCAyNi41IDIxLjUgNDggNDggNDhoMzJjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWMTEyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4SDI0MHpcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIH0gQGlmIChjb3VudGVyKCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyXCI+XHJcbiAgICAgIDxwPlxyXG4gICAgICAgIHt7IHRoaXMuc2xpZGVyQ3VycmVudFNsaWRlKCkgKyAxIH19IHt7IGNvdW50ZXJTZXBhcmF0b3IoKSB9fVxyXG4gICAgICAgIHt7IGNhcm91c2VsRG90cygpIH19XHJcbiAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInNsaWRlcy1jb250YWluZXJcIlxyXG4gICAgW2NsYXNzLmRyYWdnaW5nXT1cInRoaXMuc2xpZGVyRHJhZ2dpbmcoKVwiXHJcbiAgICAobW91c2Vkb3duKT1cInNsaWRlci5kcmFnU3RhcnQoJGV2ZW50KVwiXHJcbiAgICAodG91Y2hzdGFydCk9XCJzbGlkZXIuZHJhZ1N0YXJ0KCRldmVudClcIlxyXG4gICAgKG1vdXNlbW92ZSk9XCJzbGlkZXIuZHJhZ01vdmUoJGV2ZW50KVwiXHJcbiAgICAodG91Y2htb3ZlKT1cInNsaWRlci5kcmFnTW92ZSgkZXZlbnQpXCJcclxuICAgICh0b3VjaGVuZCk9XCJzbGlkZXIuZHJhZ1N0b3AoJGV2ZW50KTsgdGhpcy5zbGlkZXIucmVsYXVuY2hBdXRvUGxheSgpXCJcclxuICA+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIEBpZiAoZG90cygpKSB7XHJcbiAgPGRpdiBjbGFzcz1cImJ1bGxldHMtY29udGFpbmVyXCI+XHJcbiAgICBAZm9yIChidWxsZXQgb2YgdGhpcy5jYXJvdXNlbEFycmF5TnVtYmVyRG90cygpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJidWxsZXRcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiYnVsbGV0IHBvaW50IG5hdmlnYXRpb25cIlxyXG4gICAgICBbY2xhc3MuY3VycmVudF09XCJidWxsZXQgPT09IHNsaWRlci5jdXJyZW50U2xpZGUoKVwiXHJcbiAgICAgIChjbGljayk9XCJzbGlkZXIuZ29UbyhidWxsZXQpXCJcclxuICAgID48L2J1dHRvbj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvZGl2PlxyXG4iXX0=