ngsl-carousel
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.
329 lines (319 loc) • 29.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/animations'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('ngsl-carousel', ['exports', '@angular/core', '@angular/animations', '@angular/common'], factory) :
(factory((global['ngsl-carousel'] = {}),global.ng.core,global.ng.animations,global.ng.common));
}(this, (function (exports,core,animations,common) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselItemDirective = /** @class */ (function () {
function NgslCarouselItemDirective(tpl) {
this.tpl = tpl;
}
NgslCarouselItemDirective.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[ngslCarouselItem]'
},] }
];
/** @nocollapse */
NgslCarouselItemDirective.ctorParameters = function () {
return [
{ type: core.TemplateRef }
];
};
return NgslCarouselItemDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselDotDirective = /** @class */ (function () {
function NgslCarouselDotDirective(tpl) {
this.tpl = tpl;
this.isVisible = true;
}
NgslCarouselDotDirective.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[ngslCarouselDot]'
},] }
];
/** @nocollapse */
NgslCarouselDotDirective.ctorParameters = function () {
return [
{ type: core.TemplateRef }
];
};
return NgslCarouselDotDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CarouselItemElement = /** @class */ (function () {
function CarouselItemElement() {
}
CarouselItemElement.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-item-directive'
},] }
];
return CarouselItemElement;
}());
var CarouselDotElement = /** @class */ (function () {
function CarouselDotElement() {
}
CarouselDotElement.decorators = [
{ type: core.Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-dot-directive'
},] }
];
return CarouselDotElement;
}());
var NgslCarouselComponent = /** @class */ (function () {
function NgslCarouselComponent(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 {?}
*/
NgslCarouselComponent.prototype.buildAnimation = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
/** @type {?} */
var duration = this.action === 'REWIND' ? this.rewindTiming : this.timing;
return this.builder.build([
animations.animate(duration + "ms cubic-bezier(0.165, 0.840, 0.440, 1.000)", animations.style({ transform: "translateX(" + offset + "%)" }))
]);
};
/**
* @param {?} action
* @return {?}
*/
NgslCarouselComponent.prototype.changeSlide = /**
* @param {?} action
* @return {?}
*/
function (action) {
this.setSlidesIndex();
/** @type {?} */
var itemW = (100 / this.items.length) / this.perView;
/** @type {?} */
var offset = (itemW * this.currentSlide) * this.perView;
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.goToSlide = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.dynamicTiming) {
// В разработке, тестовая опция
this.timing = this.timing + (55 * (index - this.currentSlide));
}
this.currentSlide = index;
this.changeSlide('go to slide');
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.next = /**
* @return {?}
*/
function () {
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.prev = /**
* @return {?}
*/
function () {
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.setSlidesIndex = /**
* @return {?}
*/
function () {
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 {?}
*/
NgslCarouselComponent.prototype.removeDotsInDomElements = /**
* @return {?}
*/
function () {
/** @type {?} */
var position = this.perView > 1 ? this.dotsList.length - this.perView : null;
this.dotsList.toArray().forEach(function (dot, i) {
if (i > position) {
dot.isVisible = false;
}
});
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.setInitValues = /**
* @return {?}
*/
function () {
this.setSlidesIndex();
if (this.perView > 1) {
this.removeDotsInDomElements();
}
this.trackWidth = {
width: (100 * this.items.length) / this.perView + "%"
};
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.setInitValues();
};
NgslCarouselComponent.decorators = [
{ type: core.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 = function () {
return [
{ type: animations.AnimationBuilder }
];
};
NgslCarouselComponent.propDecorators = {
items: [{ type: core.ContentChildren, args: [NgslCarouselItemDirective,] }],
itemsElements: [{ type: core.ViewChildren, args: [CarouselItemElement, { read: core.ElementRef },] }],
carousel: [{ type: core.ViewChild, args: ['track',] }],
dotsList: [{ type: core.ContentChildren, args: [NgslCarouselDotDirective,] }],
dotElements: [{ type: core.ViewChildren, args: [CarouselDotElement, { read: core.ElementRef },] }],
dotTrack: [{ type: core.ViewChild, args: ['dotTrack',] }],
timing: [{ type: core.Input }],
rewindTiming: [{ type: core.Input }],
arrows: [{ type: core.Input }],
dots: [{ type: core.Input }],
infinity: [{ type: core.Input }],
dynamicTiming: [{ type: core.Input }],
autoplay: [{ type: core.Input }],
perView: [{ type: core.Input }]
};
return NgslCarouselComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselModule = /** @class */ (function () {
function NgslCarouselModule() {
}
NgslCarouselModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
],
declarations: [
NgslCarouselComponent,
NgslCarouselItemDirective,
NgslCarouselDotDirective,
CarouselItemElement,
CarouselDotElement
],
exports: [
NgslCarouselComponent,
NgslCarouselItemDirective,
NgslCarouselDotDirective,
CarouselItemElement,
CarouselDotElement
]
},] }
];
return NgslCarouselModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.NgslCarouselModule = NgslCarouselModule;
exports.ɵe = NgslCarouselDotDirective;
exports.ɵd = NgslCarouselItemDirective;
exports.ɵb = CarouselDotElement;
exports.ɵa = CarouselItemElement;
exports.ɵc = NgslCarouselComponent;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUudHMiLCJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwtZG90LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC5jb21wb25lbnQudHMiLCJuZzovL25nc2wtY2Fyb3VzZWwvc3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbbmdzbENhcm91c2VsSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHBsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tuZ3NsQ2Fyb3VzZWxEb3RdJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUge1xuICBpc1Zpc2libGUgPSB0cnVlO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHBsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuIiwiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWRvdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgYW5pbWF0ZSxcbiAgQW5pbWF0aW9uQnVpbGRlcixcbiAgQW5pbWF0aW9uRmFjdG9yeSxcbiAgQW5pbWF0aW9uUGxheWVyLFxuICBzdHlsZVxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICcubmdzbC1jYXJvdXNlbC1pdGVtLWRpcmVjdGl2ZSdcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENhcm91c2VsSXRlbUVsZW1lbnQge31cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnLm5nc2wtY2Fyb3VzZWwtZG90LWRpcmVjdGl2ZSdcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENhcm91c2VsRG90RWxlbWVudCB7fVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25nc2wtY2Fyb3VzZWwnLFxuICBleHBvcnRBczogJ25nc2wtY2Fyb3VzZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmdzbC1jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgLyogY2Fyb3VzZWwgc3RhcnQgaXRlbSAqL1xuICBAQ29udGVudENoaWxkcmVuKE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUpIGl0ZW1zOiBRdWVyeUxpc3Q8TmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2Fyb3VzZWxJdGVtRWxlbWVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgaXRlbXNFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCd0cmFjaycpIHByaXZhdGUgY2Fyb3VzZWw6IEVsZW1lbnRSZWY7XG4gIC8qIGNhcm91c2VsIGVuZCBpdGVtICovXG5cbiAgLyogY2Fyb3VzZWwgc3RhcnQgZG90ICovXG4gIEBDb250ZW50Q2hpbGRyZW4oTmdzbENhcm91c2VsRG90RGlyZWN0aXZlKSBkb3RzTGlzdDogUXVlcnlMaXN0PE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2Fyb3VzZWxEb3RFbGVtZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBkb3RFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdkb3RUcmFjaycpIHByaXZhdGUgZG90VHJhY2s6IEVsZW1lbnRSZWY7XG4gIC8qIGNhcm91c2VsIGVuZCBkb3QgKi9cblxuICAvKiBJbnB1dCBwcm9wcyBzdGFydCovXG4gIEBJbnB1dCgpIHRpbWluZyA9IDQ1MDtcbiAgQElucHV0KCkgcmV3aW5kVGltaW5nID0gOTAwO1xuICBASW5wdXQoKSBhcnJvd3MgPSB0cnVlO1xuICBASW5wdXQoKSBkb3RzID0gdHJ1ZTtcbiAgQElucHV0KCkgaW5maW5pdHkgPSB0cnVlO1xuICBASW5wdXQoKSBkeW5hbWljVGltaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGF1dG9wbGF5ID0gdHJ1ZTtcbiAgQElucHV0KCkgcGVyVmlldyA9IDE7XG4gIC8qIElucHV0IHByb3BzIGVuZCovXG4gIHByaXZhdGUgcGxheWVyOiBBbmltYXRpb25QbGF5ZXI7XG4gIHByaXZhdGUgYWN0aW9uID0gbnVsbDtcbiAgY3VycmVudFNsaWRlID0gMDtcbiAgcHJldlNsaWRlID0gbnVsbDtcbiAgbmV4dFNsaWRlID0gbnVsbDtcbiAgdHJhY2tXaWR0aCA9IHt9O1xuXG4gIHByaXZhdGUgYnVpbGRBbmltYXRpb24ob2Zmc2V0KSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmFjdGlvbiA9PT0gJ1JFV0lORCcgPyB0aGlzLnJld2luZFRpbWluZyA6IHRoaXMudGltaW5nO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuYnVpbGQoW1xuICAgICAgYW5pbWF0ZShgJHtkdXJhdGlvbn1tcyBjdWJpYy1iZXppZXIoMC4xNjUsIDAuODQwLCAwLjQ0MCwgMS4wMDApYCwgc3R5bGUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVYKCR7b2Zmc2V0fSUpYCB9KSlcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlU2xpZGUoYWN0aW9uKSB7XG4gICAgdGhpcy5zZXRTbGlkZXNJbmRleCgpO1xuICAgIGNvbnN0IGl0ZW1XID0gKDEwMCAvIHRoaXMuaXRlbXMubGVuZ3RoKSAvIHRoaXMucGVyVmlldztcbiAgICBjb25zdCBvZmZzZXQgPSAoaXRlbVcgKiB0aGlzLmN1cnJlbnRTbGlkZSkgKiB0aGlzLnBlclZpZXc7XG4gICAgY29uc3QgbXlBbmltYXRpb246IEFuaW1hdGlvbkZhY3RvcnkgPSB0aGlzLmJ1aWxkQW5pbWF0aW9uKC1vZmZzZXQpO1xuICAgIHRoaXMucGxheWVyID0gbXlBbmltYXRpb24uY3JlYXRlKHRoaXMuY2Fyb3VzZWwubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgIC8vIGNvbnNvbGUubG9nKGBjaGFuZ2VTbGlkZSBhY3Rpb246ICR7YWN0aW9ufSwgaXMgY3VycmVudCBzbGlkZTogYCwgdGhpcy5jdXJyZW50U2xpZGUgKyAxKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNUaW1pbmcpIHtcbiAgICAgIC8vIMOQwpIgw5HCgMOQwrDDkMK3w5HCgMOQwrDDkMKxw5DCvsORwoLDkMK6w5DCtSwgw5HCgsOQwrXDkcKBw5HCgsOQwr7DkMKyw5DCsMORwo8gw5DCvsOQwr/DkcKGw5DCuMORwo9cbiAgICAgIHRoaXMudGltaW5nID0gdGhpcy50aW1pbmcgKyAoNTUgKiAoaW5kZXggLSB0aGlzLmN1cnJlbnRTbGlkZSkpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IGluZGV4O1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ2dvIHRvIHNsaWRlJyk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGNvbnN0IGNvdW50U2xpZGVzID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlICsgMSA9PT0gY291bnRTbGlkZXMgJiYgdGhpcy5pbmZpbml0eSkge1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuICAgICAgdGhpcy5hY3Rpb24gPSAnUkVXSU5EJztcbiAgICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3Jld2luZCB0byBmaXJzdCBzbGlkZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgKyAxID09PSBjb3VudFNsaWRlcyAmJiAhdGhpcy5pbmZpbml0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNsaWRlKys7XG4gICAgdGhpcy5hY3Rpb24gPSAnTkVYVF9TTElERSc7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgnbmV4dCBzbGlkZScpO1xuICB9XG5cbiAgcHJldigpIHtcbiAgICBjb25zdCBjb3VudFNsaWRlcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCAmJiB0aGlzLmluZmluaXR5KSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IGNvdW50U2xpZGVzIC0gMTtcbiAgICAgIHRoaXMuYWN0aW9uID0gJ1JFV0lORCc7XG4gICAgICB0aGlzLmNoYW5nZVNsaWRlKCdyZXdpbmQgdG8gbGFzdCBzbGlkZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPT09IDAgJiYgIXRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRTbGlkZS0tO1xuICAgIHRoaXMuYWN0aW9uID0gJ1BSRVZfU0xJREUnO1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3ByZXYgc2xpZGUnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2xpZGVzSW5kZXgoKSB7XG4gICAgdGhpcy5wcmV2U2xpZGUgPSB0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCA/IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA6IHRoaXMuY3VycmVudFNsaWRlIC0gMTtcbiAgICB0aGlzLm5leHRTbGlkZSA9IHRoaXMuY3VycmVudFNsaWRlID09PSB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgPyAwIDogdGhpcy5jdXJyZW50U2xpZGUgKyAxO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3RzSW5Eb21FbGVtZW50cygpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucGVyVmlldyA+IDEgPyB0aGlzLmRvdHNMaXN0Lmxlbmd0aCAtIHRoaXMucGVyVmlldyA6IG51bGw7XG4gICAgdGhpcy5kb3RzTGlzdC50b0FycmF5KCkuZm9yRWFjaCgoZG90LCBpKSA9PiB7XG4gICAgICBpZiAoaSA+IHBvc2l0aW9uKSB7IGRvdC5pc1Zpc2libGUgPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0VmFsdWVzKCkge1xuICAgIHRoaXMuc2V0U2xpZGVzSW5kZXgoKTtcbiAgICBpZiAodGhpcy5wZXJWaWV3ID4gMSkge1xuICAgICAgdGhpcy5yZW1vdmVEb3RzSW5Eb21FbGVtZW50cygpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrV2lkdGggPSB7XG4gICAgICB3aWR0aDogYCR7KDEwMCAqIHRoaXMuaXRlbXMubGVuZ3RoKSAvIHRoaXMucGVyVmlld30lYFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2V0SW5pdFZhbHVlcygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbENvbXBvbmVudCwgQ2Fyb3VzZWxJdGVtRWxlbWVudCwgQ2Fyb3VzZWxEb3RFbGVtZW50IH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBOZ3NsQ2Fyb3VzZWxDb21wb25lbnQsXG4gICAgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSxcbiAgICBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUsXG4gICAgQ2Fyb3VzZWxJdGVtRWxlbWVudCxcbiAgICBDYXJvdXNlbERvdEVsZW1lbnRcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIE5nc2xDYXJvdXNlbENvbXBvbmVudCxcbiAgICBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlLFxuICAgIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSxcbiAgICBDYXJvdXNlbEl0ZW1FbGVtZW50LFxuICAgIENhcm91c2VsRG90RWxlbWVudFxuICBdXG5cbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbIkRpcmVjdGl2ZSIsIlRlbXBsYXRlUmVmIiwiYW5pbWF0ZSIsInN0eWxlIiwiQ29tcG9uZW50IiwiQW5pbWF0aW9uQnVpbGRlciIsIkNvbnRlbnRDaGlsZHJlbiIsIlZpZXdDaGlsZHJlbiIsIkVsZW1lbnRSZWYiLCJWaWV3Q2hpbGQiLCJJbnB1dCIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7UUFPRSxtQ0FBbUIsR0FBcUI7WUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7U0FBSTs7b0JBTDdDQSxjQUFTLFNBQUM7O3dCQUVULFFBQVEsRUFBRSxvQkFBb0I7cUJBQy9COzs7Ozt3QkFMbUJDLGdCQUFXOzs7d0NBQS9COzs7Ozs7O0FDQUE7UUFRRSxrQ0FBbUIsR0FBcUI7WUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7NkJBRDVCLElBQUk7U0FDNEI7O29CQU43Q0QsY0FBUyxTQUFDOzt3QkFFVCxRQUFRLEVBQUUsbUJBQW1CO3FCQUM5Qjs7Ozs7d0JBTG1CQyxnQkFBVzs7O3VDQUEvQjs7Ozs7OztBQ0FBOzs7O29CQXNCQ0QsY0FBUyxTQUFDOzt3QkFFVCxRQUFRLEVBQUUsK0JBQStCO3FCQUMxQzs7a0NBekJEOzs7Ozs7b0JB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