UNPKG

ngsl-carousel

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.

238 lines (237 loc) 22.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ContentChildren, Directive, ElementRef, Input, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { NgslCarouselItemDirective } from './ngsl-carousel-item.directive'; import { NgslCarouselDotDirective } from './ngsl-carousel-dot.directive'; import { animate, AnimationBuilder, style } from '@angular/animations'; // tslint:disable-next-line:directive-class-suffix export class CarouselItemElement { } CarouselItemElement.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-item-directive' },] } ]; // tslint:disable-next-line:directive-class-suffix export class CarouselDotElement { } CarouselDotElement.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '.ngsl-carousel-dot-directive' },] } ]; export class NgslCarouselComponent { /** * @param {?} builder */ constructor(builder) { this.builder = builder; /* carousel end dot */ /* Input props start*/ this.timing = 450; this.rewindTiming = 900; this.arrows = true; this.dots = true; this.infinity = true; this.dynamicTiming = false; this.autoplay = true; this.perView = 1; this.action = null; this.currentSlide = 0; this.prevSlide = null; this.nextSlide = null; this.trackWidth = {}; } /** * @param {?} offset * @return {?} */ buildAnimation(offset) { /** @type {?} */ const duration = this.action === 'REWIND' ? this.rewindTiming : this.timing; return this.builder.build([ animate(`${duration}ms cubic-bezier(0.165, 0.840, 0.440, 1.000)`, style({ transform: `translateX(${offset}%)` })) ]); } /** * @param {?} action * @return {?} */ changeSlide(action) { this.setSlidesIndex(); /** @type {?} */ const itemW = (100 / this.items.length) / this.perView; /** @type {?} */ const offset = (itemW * this.currentSlide) * this.perView; /** @type {?} */ const myAnimation = this.buildAnimation(-offset); this.player = myAnimation.create(this.carousel.nativeElement); this.player.play(); // console.log(`changeSlide action: ${action}, is current slide: `, this.currentSlide + 1); } /** * @param {?} index * @return {?} */ goToSlide(index) { if (this.dynamicTiming) { // В разработке, тестовая опция this.timing = this.timing + (55 * (index - this.currentSlide)); } this.currentSlide = index; this.changeSlide('go to slide'); } /** * @return {?} */ next() { /** @type {?} */ const countSlides = this.items.length; if (this.currentSlide + 1 === countSlides && this.infinity) { this.currentSlide = 0; this.action = 'REWIND'; this.changeSlide('rewind to first slide'); return; } if (this.currentSlide + 1 === countSlides && !this.infinity) { return; } this.currentSlide++; this.action = 'NEXT_SLIDE'; this.changeSlide('next slide'); } /** * @return {?} */ prev() { /** @type {?} */ const countSlides = this.items.length; if (this.currentSlide === 0 && this.infinity) { this.currentSlide = countSlides - 1; this.action = 'REWIND'; this.changeSlide('rewind to last slide'); return; } if (this.currentSlide === 0 && !this.infinity) { return; } this.currentSlide--; this.action = 'PREV_SLIDE'; this.changeSlide('prev slide'); } /** * @return {?} */ setSlidesIndex() { this.prevSlide = this.currentSlide === 0 ? this.items.length - 1 : this.currentSlide - 1; this.nextSlide = this.currentSlide === this.items.length - 1 ? 0 : this.currentSlide + 1; } /** * @return {?} */ removeDotsInDomElements() { /** @type {?} */ const position = this.perView > 1 ? this.dotsList.length - this.perView : null; this.dotsList.toArray().forEach((dot, i) => { if (i > position) { dot.isVisible = false; } }); } /** * @return {?} */ setInitValues() { this.setSlidesIndex(); if (this.perView > 1) { this.removeDotsInDomElements(); } this.trackWidth = { width: `${(100 * this.items.length) / this.perView}%` }; } /** * @return {?} */ ngAfterContentInit() { this.setInitValues(); } } NgslCarouselComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngsl-carousel', exportAs: 'ngsl-carousel', template: "<div class=\"ngsl-carousel\">\n <div *ngIf=\"dots\" class=\"dots\" #dotsTrack>\n <div *ngFor=\"let item of dotsList; let i = index\"\n class=\"ngsl-carousel-dot-directive dot\"\n (click)=\"goToSlide(i)\"\n [class.is-current-item]=\"currentSlide === i\">\n <ng-container *ngIf=\"item.isVisible\" [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n <div class=\"slide\">\n <div class=\"content\">\n <div *ngIf=\"arrows\" class=\"slide-arrows\">\n <input type=\"button\" (click)=\"prev()\" class=\"prev\" [class.is-disabled]=\"currentSlide === 0\" />\n <input type=\"button\" (click)=\"next()\" class=\"next\" [class.is-disabled]=\"currentSlide === items.length - 1\" />\n </div>\n <div class=\"slide-track\" #track [ngStyle]=\"trackWidth\">\n <div *ngFor=\"let item of items\" class=\"ngsl-carousel-item-directive\">\n <ng-container [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".ngsl-carousel{overflow:hidden;position:relative}.ngsl-carousel .dots{position:absolute;top:30px;right:40px;font-size:0;z-index:10}.ngsl-carousel .dots .dot{display:inline-block;vertical-align:middle;width:10px;height:10px;border-radius:100%;background-color:#768692;box-sizing:border-box;cursor:pointer}.ngsl-carousel .dots .dot+.dot{margin-left:10px}.ngsl-carousel .dots .dot.is-current-item{width:22px;height:22px;position:relative;border:1px solid #fff;background-color:transparent}.ngsl-carousel .dots .dot.is-current-item:after{content:\"\";position:absolute;left:50%;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);width:10px;height:10px;border-radius:100%;background-color:#fff}.slide-track{display:flex;flex-direction:row;flex-wrap:nowrap;height:100%}.ngsl-carousel-item-directive{width:100%;height:100%}.slide-arrows input[type=button]{z-index:10;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:40px;height:40px;background-color:#768692;opacity:.7;border:0;cursor:pointer;background-repeat:no-repeat;background-position:center}.slide-arrows input[type=button]:hover{opacity:.9}.slide-arrows input[type=button].is-disabled{background-color:#c4bcb7}.slide-arrows input[type=button].is-disabled:hover{opacity:.7}.slide-arrows input[type=button]:focus{outline:0}.slide-arrows input[type=button].prev{-webkit-transform:translateY(-50%) rotate(-180deg);transform:translateY(-50%) rotate(-180deg)}.slide-arrows input[type=button].next{left:auto;right:0}"] }] } ]; /** @nocollapse */ NgslCarouselComponent.ctorParameters = () => [ { type: AnimationBuilder } ]; NgslCarouselComponent.propDecorators = { items: [{ type: ContentChildren, args: [NgslCarouselItemDirective,] }], itemsElements: [{ type: ViewChildren, args: [CarouselItemElement, { read: ElementRef },] }], carousel: [{ type: ViewChild, args: ['track',] }], dotsList: [{ type: ContentChildren, args: [NgslCarouselDotDirective,] }], dotElements: [{ type: ViewChildren, args: [CarouselDotElement, { read: ElementRef },] }], dotTrack: [{ type: ViewChild, args: ['dotTrack',] }], timing: [{ type: Input }], rewindTiming: [{ type: Input }], arrows: [{ type: Input }], dots: [{ type: Input }], infinity: [{ type: Input }], dynamicTiming: [{ type: Input }], autoplay: [{ type: Input }], perView: [{ type: Input }] }; if (false) { /** @type {?} */ NgslCarouselComponent.prototype.items; /** @type {?} */ NgslCarouselComponent.prototype.itemsElements; /** @type {?} */ NgslCarouselComponent.prototype.carousel; /** @type {?} */ NgslCarouselComponent.prototype.dotsList; /** @type {?} */ NgslCarouselComponent.prototype.dotElements; /** @type {?} */ NgslCarouselComponent.prototype.dotTrack; /** @type {?} */ NgslCarouselComponent.prototype.timing; /** @type {?} */ NgslCarouselComponent.prototype.rewindTiming; /** @type {?} */ NgslCarouselComponent.prototype.arrows; /** @type {?} */ NgslCarouselComponent.prototype.dots; /** @type {?} */ NgslCarouselComponent.prototype.infinity; /** @type {?} */ NgslCarouselComponent.prototype.dynamicTiming; /** @type {?} */ NgslCarouselComponent.prototype.autoplay; /** @type {?} */ NgslCarouselComponent.prototype.perView; /** @type {?} */ NgslCarouselComponent.prototype.player; /** @type {?} */ NgslCarouselComponent.prototype.action; /** @type {?} */ NgslCarouselComponent.prototype.currentSlide; /** @type {?} */ NgslCarouselComponent.prototype.prevSlide; /** @type {?} */ NgslCarouselComponent.prototype.nextSlide; /** @type {?} */ NgslCarouselComponent.prototype.trackWidth; /** @type {?} */ NgslCarouselComponent.prototype.builder; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3NsLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsT0FBTyxFQUNQLGdCQUFnQixFQUdoQixLQUFLLEVBQ04sTUFBTSxxQkFBcUIsQ0FBQztBQUU3QjtBQUtBLE1BQU07OztZQUxMLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLCtCQUErQjthQUMxQzs7QUFHRDtBQUtBLE1BQU07OztZQUxMLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLDhCQUE4QjthQUN6Qzs7QUFXRCxNQUFNOzs7O0lBZ0hKLFlBQW9CLE9BQXlCO1FBQXpCLFlBQU8sR0FBUCxPQUFPLENBQWtCOzs7c0JBbEczQixHQUFHOzRCQUNHLEdBQUc7c0JBQ1QsSUFBSTtvQkFDTixJQUFJO3dCQUNBLElBQUk7NkJBQ0MsS0FBSzt3QkFDVixJQUFJO3VCQUNMLENBQUM7c0JBR0gsSUFBSTs0QkFDTixDQUFDO3lCQUNKLElBQUk7eUJBQ0osSUFBSTswQkFDSCxFQUFFO0tBb0ZrQzs7Ozs7SUFsRnpDLGNBQWMsQ0FBQyxNQUFNOztRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLFFBQVEsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGNBQWMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ2xILENBQUMsQ0FBQzs7Ozs7O0lBR0csV0FBVyxDQUFDLE1BQU07UUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOztRQUN0QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7O1FBQ3ZELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOztRQUMxRCxNQUFNLFdBQVcsR0FBcUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Ozs7Ozs7SUFJckIsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7O1lBRXRCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDakM7Ozs7SUFFRCxJQUFJOztRQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzFDLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUNoQzs7OztJQUVELElBQUk7O1FBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDekMsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDN0MsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDaEM7Ozs7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs7Ozs7SUFHbkYsdUJBQXVCOztRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRTtnQkFBRSxHQUFHLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUFFO1NBQzdDLENBQUMsQ0FBQzs7Ozs7SUFHRyxhQUFhO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUc7U0FDdEQsQ0FBQzs7Ozs7SUFLSixrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ3RCOzs7WUEzSEYsU0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLDhoQ0FBNkM7O2FBRTlDOzs7O1lBekJDLGdCQUFnQjs7O29CQTRCZixlQUFlLFNBQUMseUJBQXlCOzRCQUN6QyxZQUFZLFNBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO3VCQUN0RCxTQUFTLFNBQUMsT0FBTzt1QkFJakIsZUFBZSxTQUFDLHdCQUF3QjswQkFDeEMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTt1QkFDckQsU0FBUyxTQUFDLFVBQVU7cUJBSXBCLEtBQUs7MkJBQ0wsS0FBSztxQkFDTCxLQUFLO21CQUNMLEtBQUs7dUJBQ0wsS0FBSzs0QkFDTCxLQUFLO3VCQUNMLEtBQUs7c0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIGFuaW1hdGUsXG4gIEFuaW1hdGlvbkJ1aWxkZXIsXG4gIEFuaW1hdGlvbkZhY3RvcnksXG4gIEFuaW1hdGlvblBsYXllcixcbiAgc3R5bGVcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnLm5nc2wtY2Fyb3VzZWwtaXRlbS1kaXJlY3RpdmUnXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbEl0ZW1FbGVtZW50IHt9XG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJy5uZ3NsLWNhcm91c2VsLWRvdC1kaXJlY3RpdmUnXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbERvdEVsZW1lbnQge31cblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICduZ3NsLWNhcm91c2VsJyxcbiAgZXhwb3J0QXM6ICduZ3NsLWNhcm91c2VsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIC8qIGNhcm91c2VsIHN0YXJ0IGl0ZW0gKi9cbiAgQENvbnRlbnRDaGlsZHJlbihOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlKSBpdGVtczogUXVlcnlMaXN0PE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmU+O1xuICBAVmlld0NoaWxkcmVuKENhcm91c2VsSXRlbUVsZW1lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGl0ZW1zRWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgndHJhY2snKSBwcml2YXRlIGNhcm91c2VsOiBFbGVtZW50UmVmO1xuICAvKiBjYXJvdXNlbCBlbmQgaXRlbSAqL1xuXG4gIC8qIGNhcm91c2VsIHN0YXJ0IGRvdCAqL1xuICBAQ29udGVudENoaWxkcmVuKE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSkgZG90c0xpc3Q6IFF1ZXJ5TGlzdDxOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmU+O1xuICBAVmlld0NoaWxkcmVuKENhcm91c2VsRG90RWxlbWVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgZG90RWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZG90VHJhY2snKSBwcml2YXRlIGRvdFRyYWNrOiBFbGVtZW50UmVmO1xuICAvKiBjYXJvdXNlbCBlbmQgZG90ICovXG5cbiAgLyogSW5wdXQgcHJvcHMgc3RhcnQqL1xuICBASW5wdXQoKSB0aW1pbmcgPSA0NTA7XG4gIEBJbnB1dCgpIHJld2luZFRpbWluZyA9IDkwMDtcbiAgQElucHV0KCkgYXJyb3dzID0gdHJ1ZTtcbiAgQElucHV0KCkgZG90cyA9IHRydWU7XG4gIEBJbnB1dCgpIGluZmluaXR5ID0gdHJ1ZTtcbiAgQElucHV0KCkgZHluYW1pY1RpbWluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvcGxheSA9IHRydWU7XG4gIEBJbnB1dCgpIHBlclZpZXcgPSAxO1xuICAvKiBJbnB1dCBwcm9wcyBlbmQqL1xuICBwcml2YXRlIHBsYXllcjogQW5pbWF0aW9uUGxheWVyO1xuICBwcml2YXRlIGFjdGlvbiA9IG51bGw7XG4gIGN1cnJlbnRTbGlkZSA9IDA7XG4gIHByZXZTbGlkZSA9IG51bGw7XG4gIG5leHRTbGlkZSA9IG51bGw7XG4gIHRyYWNrV2lkdGggPSB7fTtcblxuICBwcml2YXRlIGJ1aWxkQW5pbWF0aW9uKG9mZnNldCkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5hY3Rpb24gPT09ICdSRVdJTkQnID8gdGhpcy5yZXdpbmRUaW1pbmcgOiB0aGlzLnRpbWluZztcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkKFtcbiAgICAgIGFuaW1hdGUoYCR7ZHVyYXRpb259bXMgY3ViaWMtYmV6aWVyKDAuMTY1LCAwLjg0MCwgMC40NDAsIDEuMDAwKWAsIHN0eWxlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke29mZnNldH0lKWAgfSkpXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZVNsaWRlKGFjdGlvbikge1xuICAgIHRoaXMuc2V0U2xpZGVzSW5kZXgoKTtcbiAgICBjb25zdCBpdGVtVyA9ICgxMDAgLyB0aGlzLml0ZW1zLmxlbmd0aCkgLyB0aGlzLnBlclZpZXc7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKGl0ZW1XICogdGhpcy5jdXJyZW50U2xpZGUpICogdGhpcy5wZXJWaWV3O1xuICAgIGNvbnN0IG15QW5pbWF0aW9uOiBBbmltYXRpb25GYWN0b3J5ID0gdGhpcy5idWlsZEFuaW1hdGlvbigtb2Zmc2V0KTtcbiAgICB0aGlzLnBsYXllciA9IG15QW5pbWF0aW9uLmNyZWF0ZSh0aGlzLmNhcm91c2VsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgY2hhbmdlU2xpZGUgYWN0aW9uOiAke2FjdGlvbn0sIGlzIGN1cnJlbnQgc2xpZGU6IGAsIHRoaXMuY3VycmVudFNsaWRlICsgMSk7XG4gIH1cblxuICBnb1RvU2xpZGUoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5keW5hbWljVGltaW5nKSB7XG4gICAgICAvLyDQkiDRgNCw0LfRgNCw0LHQvtGC0LrQtSwg0YLQtdGB0YLQvtCy0LDRjyDQvtC/0YbQuNGPXG4gICAgICB0aGlzLnRpbWluZyA9IHRoaXMudGltaW5nICsgKDU1ICogKGluZGV4IC0gdGhpcy5jdXJyZW50U2xpZGUpKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSBpbmRleDtcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCdnbyB0byBzbGlkZScpO1xuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBjb25zdCBjb3VudFNsaWRlcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSArIDEgPT09IGNvdW50U2xpZGVzICYmIHRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gMDtcbiAgICAgIHRoaXMuYWN0aW9uID0gJ1JFV0lORCc7XG4gICAgICB0aGlzLmNoYW5nZVNsaWRlKCdyZXdpbmQgdG8gZmlyc3Qgc2xpZGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlICsgMSA9PT0gY291bnRTbGlkZXMgJiYgIXRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRTbGlkZSsrO1xuICAgIHRoaXMuYWN0aW9uID0gJ05FWFRfU0xJREUnO1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ25leHQgc2xpZGUnKTtcbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgY29uc3QgY291bnRTbGlkZXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPT09IDAgJiYgdGhpcy5pbmZpbml0eSkge1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSBjb3VudFNsaWRlcyAtIDE7XG4gICAgICB0aGlzLmFjdGlvbiA9ICdSRVdJTkQnO1xuICAgICAgdGhpcy5jaGFuZ2VTbGlkZSgncmV3aW5kIHRvIGxhc3Qgc2xpZGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlID09PSAwICYmICF0aGlzLmluZmluaXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50U2xpZGUtLTtcbiAgICB0aGlzLmFjdGlvbiA9ICdQUkVWX1NMSURFJztcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCdwcmV2IHNsaWRlJyk7XG4gIH1cblxuICBwcml2YXRlIHNldFNsaWRlc0luZGV4KCkge1xuICAgIHRoaXMucHJldlNsaWRlID0gdGhpcy5jdXJyZW50U2xpZGUgPT09IDAgPyB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgOiB0aGlzLmN1cnJlbnRTbGlkZSAtIDE7XG4gICAgdGhpcy5uZXh0U2xpZGUgPSB0aGlzLmN1cnJlbnRTbGlkZSA9PT0gdGhpcy5pdGVtcy5sZW5ndGggLSAxID8gMCA6IHRoaXMuY3VycmVudFNsaWRlICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG90c0luRG9tRWxlbWVudHMoKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBlclZpZXcgPiAxID8gdGhpcy5kb3RzTGlzdC5sZW5ndGggLSB0aGlzLnBlclZpZXcgOiBudWxsO1xuICAgIHRoaXMuZG90c0xpc3QudG9BcnJheSgpLmZvckVhY2goKGRvdCwgaSkgPT4ge1xuICAgICAgaWYgKGkgPiBwb3NpdGlvbikgeyBkb3QuaXNWaXNpYmxlID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5pdFZhbHVlcygpIHtcbiAgICB0aGlzLnNldFNsaWRlc0luZGV4KCk7XG4gICAgaWYgKHRoaXMucGVyVmlldyA+IDEpIHtcbiAgICAgIHRoaXMucmVtb3ZlRG90c0luRG9tRWxlbWVudHMoKTtcbiAgICB9XG4gICAgdGhpcy50cmFja1dpZHRoID0ge1xuICAgICAgd2lkdGg6IGAkeygxMDAgKiB0aGlzLml0ZW1zLmxlbmd0aCkgLyB0aGlzLnBlclZpZXd9JWBcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNldEluaXRWYWx1ZXMoKTtcbiAgfVxufVxuIl19