ngx-slick-carousel
Version:
[](https://badge.fury.io/js/ngx-slick-carousel) [](https://travis-ci.com/leo6104/ngx-slick-carousel)
450 lines • 32 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: slick.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
import { Component, Directive, ElementRef, EventEmitter, forwardRef, Host, Inject, Input, NgZone, Output, PLATFORM_ID } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/**
* Slick component
*/
export class SlickCarouselComponent {
/**
* Constructor
* @param {?} el
* @param {?} zone
* @param {?} platformId
*/
constructor(el, zone, platformId) {
this.el = el;
this.zone = zone;
this.platformId = platformId;
this.afterChange = new EventEmitter();
this.beforeChange = new EventEmitter();
this.breakpoint = new EventEmitter();
this.destroy = new EventEmitter();
this.init = new EventEmitter();
// access from parent component can be a problem with change detection timing. Please use afterChange output
this.currentIndex = 0;
this.slides = [];
this.initialized = false;
this._removedSlides = [];
this._addedSlides = [];
}
/**
* On component destroy
* @return {?}
*/
ngOnDestroy() {
this.unslick();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.ngAfterViewChecked();
}
/**
* On component view checked
* @return {?}
*/
ngAfterViewChecked() {
if (isPlatformServer(this.platformId)) {
return;
}
if (this._addedSlides.length > 0 || this._removedSlides.length > 0) {
/** @type {?} */
const nextSlidesLength = this.slides.length - this._removedSlides.length + this._addedSlides.length;
if (!this.initialized) {
if (nextSlidesLength > 0) {
this.initSlick();
}
// if nextSlidesLength is zere, do nothing
}
else if (nextSlidesLength === 0) { // unslick case
this.unslick();
}
else {
this._addedSlides.forEach((/**
* @param {?} slickItem
* @return {?}
*/
slickItem => {
this.slides.push(slickItem);
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickAdd', slickItem.el.nativeElement);
}));
}));
this._addedSlides = [];
this._removedSlides.forEach((/**
* @param {?} slickItem
* @return {?}
*/
slickItem => {
/** @type {?} */
const idx = this.slides.indexOf(slickItem);
this.slides = this.slides.filter((/**
* @param {?} s
* @return {?}
*/
s => s !== slickItem));
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickRemove', idx);
}));
}));
this._removedSlides = [];
}
}
}
/**
* init slick
* @return {?}
*/
initSlick() {
this.slides = this._addedSlides;
this._addedSlides = [];
this._removedSlides = [];
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance = jQuery(this.el.nativeElement);
this.$instance.on('init', (/**
* @param {?} event
* @param {?} slick
* @return {?}
*/
(event, slick) => {
this.zone.run((/**
* @return {?}
*/
() => {
this.init.emit({ event, slick });
}));
}));
this.$instance.slick(this.config);
this.zone.run((/**
* @return {?}
*/
() => {
var _a;
this.initialized = true;
this.currentIndex = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.initialSlide) || 0;
}));
this.$instance.on('afterChange', (/**
* @param {?} event
* @param {?} slick
* @param {?} currentSlide
* @return {?}
*/
(event, slick, currentSlide) => {
this.zone.run((/**
* @return {?}
*/
() => {
this.afterChange.emit({
event,
slick,
currentSlide,
first: currentSlide === 0,
last: slick.$slides.length === currentSlide + slick.options.slidesToScroll
});
this.currentIndex = currentSlide;
}));
}));
this.$instance.on('beforeChange', (/**
* @param {?} event
* @param {?} slick
* @param {?} currentSlide
* @param {?} nextSlide
* @return {?}
*/
(event, slick, currentSlide, nextSlide) => {
this.zone.run((/**
* @return {?}
*/
() => {
this.beforeChange.emit({ event, slick, currentSlide, nextSlide });
this.currentIndex = nextSlide;
}));
}));
this.$instance.on('breakpoint', (/**
* @param {?} event
* @param {?} slick
* @param {?} breakpoint
* @return {?}
*/
(event, slick, breakpoint) => {
this.zone.run((/**
* @return {?}
*/
() => {
this.breakpoint.emit({ event, slick, breakpoint });
}));
}));
this.$instance.on('destroy', (/**
* @param {?} event
* @param {?} slick
* @return {?}
*/
(event, slick) => {
this.zone.run((/**
* @return {?}
*/
() => {
this.destroy.emit({ event, slick });
this.initialized = false;
}));
}));
}));
}
/**
* @param {?} slickItem
* @return {?}
*/
addSlide(slickItem) {
this._addedSlides.push(slickItem);
}
/**
* @param {?} slickItem
* @return {?}
*/
removeSlide(slickItem) {
this._removedSlides.push(slickItem);
}
/**
* Slick Method
* @param {?} index
* @return {?}
*/
slickGoTo(index) {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickGoTo', index);
}));
}
/**
* @return {?}
*/
slickNext() {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickNext');
}));
}
/**
* @return {?}
*/
slickPrev() {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickPrev');
}));
}
/**
* @return {?}
*/
slickPause() {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickPause');
}));
}
/**
* @return {?}
*/
slickPlay() {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickPlay');
}));
}
/**
* @return {?}
*/
unslick() {
if (this.$instance) {
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('unslick');
}));
this.$instance = undefined;
}
this.initialized = false;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.initialized) {
/** @type {?} */
const config = changes['config'];
if (config.previousValue !== config.currentValue && config.currentValue !== undefined) {
/** @type {?} */
const refresh = config.currentValue['refresh'];
/** @type {?} */
const newOptions = Object.assign({}, config.currentValue);
delete newOptions['refresh'];
this.zone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.$instance.slick('slickSetOption', newOptions, refresh);
}));
}
}
}
}
SlickCarouselComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-slick-carousel',
exportAs: 'slick-carousel',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => SlickCarouselComponent)),
multi: true
}],
template: '<ng-content></ng-content>'
}] }
];
/** @nocollapse */
SlickCarouselComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: NgZone },
{ type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
];
SlickCarouselComponent.propDecorators = {
config: [{ type: Input }],
afterChange: [{ type: Output }],
beforeChange: [{ type: Output }],
breakpoint: [{ type: Output }],
destroy: [{ type: Output }],
init: [{ type: Output }]
};
if (false) {
/** @type {?} */
SlickCarouselComponent.prototype.config;
/** @type {?} */
SlickCarouselComponent.prototype.afterChange;
/** @type {?} */
SlickCarouselComponent.prototype.beforeChange;
/** @type {?} */
SlickCarouselComponent.prototype.breakpoint;
/** @type {?} */
SlickCarouselComponent.prototype.destroy;
/** @type {?} */
SlickCarouselComponent.prototype.init;
/** @type {?} */
SlickCarouselComponent.prototype.$instance;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.currentIndex;
/** @type {?} */
SlickCarouselComponent.prototype.slides;
/** @type {?} */
SlickCarouselComponent.prototype.initialized;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype._removedSlides;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype._addedSlides;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.el;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.zone;
/**
* @type {?}
* @private
*/
SlickCarouselComponent.prototype.platformId;
}
export class SlickItemDirective {
/**
* @param {?} el
* @param {?} platformId
* @param {?} carousel
*/
constructor(el, platformId, carousel) {
this.el = el;
this.platformId = platformId;
this.carousel = carousel;
}
/**
* @return {?}
*/
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
this.carousel.addSlide(this);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (isPlatformBrowser(this.platformId)) {
this.carousel.removeSlide(this);
}
}
}
SlickItemDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxSlickItem]',
},] }
];
/** @nocollapse */
SlickItemDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: SlickCarouselComponent, decorators: [{ type: Host }] }
];
if (false) {
/** @type {?} */
SlickItemDirective.prototype.el;
/**
* @type {?}
* @private
*/
SlickItemDirective.prototype.platformId;
/**
* @type {?}
* @private
*/
SlickItemDirective.prototype.carousel;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNsaWNrLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic2xpY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFpQm5ELE1BQU0sT0FBTyxzQkFBc0I7Ozs7Ozs7SUFzQmpDLFlBQW9CLEVBQWMsRUFDZCxJQUFZLEVBQ1MsVUFBa0I7UUFGdkMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDUyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBckIvQyxnQkFBVyxHQUFrRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hJLGlCQUFZLEdBQXNGLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckgsZUFBVSxHQUE4RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNGLFlBQU8sR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2RSxTQUFJLEdBQTZDLElBQUksWUFBWSxFQUFFLENBQUM7O1FBS3hFLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDbkIsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztJQVFoRCxDQUFDOzs7OztJQUtELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FB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QUNyQiw2Q0FBMEk7O0lBQzFJLDhDQUErSDs7SUFDL0gsNENBQXFHOztJQUNyRyx5Q0FBaUY7O0lBQ2pGLHNDQUE4RTs7SUFFaEYsMkNBQXNCOzs7OztJQUd0Qiw4Q0FBeUI7O0lBRXpCLHdDQUEwQjs7SUFDMUIsNkNBQTJCOzs7OztJQUMzQixnREFBa0Q7Ozs7O0lBQ2xELDhDQUFnRDs7Ozs7SUFLcEMsb0NBQXNCOzs7OztJQUN0QixzQ0FBb0I7Ozs7O0lBQ3BCLDRDQUErQzs7QUFxTDdELE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQUM3QixZQUFtQixFQUFjLEVBQ1EsVUFBa0IsRUFDL0IsUUFBZ0M7UUFGekMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNRLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDL0IsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7SUFDNUQsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUFuQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0I7Ozs7WUEzT0MsVUFBVTt5Q0E4T0csTUFBTSxTQUFDLFdBQVc7WUFDTyxzQkFBc0IsdUJBQS9DLElBQUk7Ozs7SUFGTCxnQ0FBcUI7Ozs7O0lBQ3JCLHdDQUErQzs7Ozs7SUFDL0Msc0NBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIsIGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmRlY2xhcmUgY29uc3QgalF1ZXJ5OiBhbnk7XG5cbi8qKlxuICogU2xpY2sgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zbGljay1jYXJvdXNlbCcsXG4gIGV4cG9ydEFzOiAnc2xpY2stY2Fyb3VzZWwnLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpY2tDYXJvdXNlbENvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbiAgfV0sXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG59KVxuZXhwb3J0IGNsYXNzIFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgICBASW5wdXQoKSBjb25maWc6IGFueTtcbiAgICBAT3V0cHV0KCkgYWZ0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnksIGN1cnJlbnRTbGlkZTogbnVtYmVyLCBmaXJzdDogYm9vbGVhbiwgbGFzdDogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgYmVmb3JlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBjdXJyZW50U2xpZGU6IG51bWJlciwgbmV4dFNsaWRlOiBudW1iZXIgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGJyZWFrcG9pbnQ6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnksIGJyZWFrcG9pbnQ6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZGVzdHJveTogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgaW5pdDogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgJGluc3RhbmNlOiBhbnk7XG5cbiAgLy8gYWNjZXNzIGZyb20gcGFyZW50IGNvbXBvbmVudCBjYW4gYmUgYSBwcm9ibGVtIHdpdGggY2hhbmdlIGRldGVjdGlvbiB0aW1pbmcuIFBsZWFzZSB1c2UgYWZ0ZXJDaGFuZ2Ugb3V0cHV0XG4gIHByaXZhdGUgY3VycmVudEluZGV4ID0gMDtcblxuICBwdWJsaWMgc2xpZGVzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVtb3ZlZFNsaWRlczogU2xpY2tJdGVtRGlyZWN0aXZlW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWRkZWRTbGlkZXM6IFNsaWNrSXRlbURpcmVjdGl2ZVtdID0gW107XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnNsaWNrKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgdmlldyBjaGVja2VkXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWRkZWRTbGlkZXMubGVuZ3RoID4gMCB8fCB0aGlzLl9yZW1vdmVkU2xpZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5leHRTbGlkZXNMZW5ndGggPSB0aGlzLnNsaWRlcy5sZW5ndGggLSB0aGlzLl9yZW1vdmVkU2xpZGVzLmxlbmd0aCArIHRoaXMuX2FkZGVkU2xpZGVzLmxlbmd0aDtcbiAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICBpZiAobmV4dFNsaWRlc0xlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmluaXRTbGljaygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIG5leHRTbGlkZXNMZW5ndGggaXMgemVyZSwgZG8gbm90aGluZ1xuICAgICAgfSBlbHNlIGlmIChuZXh0U2xpZGVzTGVuZ3RoID09PSAwKSB7IC8vIHVuc2xpY2sgY2FzZVxuICAgICAgICB0aGlzLnVuc2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2FkZGVkU2xpZGVzLmZvckVhY2goc2xpY2tJdGVtID0+IHtcbiAgICAgICAgICB0aGlzLnNsaWRlcy5wdXNoKHNsaWNrSXRlbSk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja0FkZCcsIHNsaWNrSXRlbS5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2FkZGVkU2xpZGVzID0gW107XG5cbiAgICAgICAgdGhpcy5fcmVtb3ZlZFNsaWRlcy5mb3JFYWNoKHNsaWNrSXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5zbGlkZXMuaW5kZXhPZihzbGlja0l0ZW0pO1xuICAgICAgICAgIHRoaXMuc2xpZGVzID0gdGhpcy5zbGlkZXMuZmlsdGVyKHMgPT4gcyAhPT0gc2xpY2tJdGVtKTtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUmVtb3ZlJywgaWR4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlbW92ZWRTbGlkZXMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW5pdCBzbGlja1xuICAgKi9cbiAgaW5pdFNsaWNrKCkge1xuICAgIHRoaXMuc2xpZGVzID0gdGhpcy5fYWRkZWRTbGlkZXM7XG4gICAgdGhpcy5fYWRkZWRTbGlkZXMgPSBbXTtcbiAgICB0aGlzLl9yZW1vdmVkU2xpZGVzID0gW107XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlID0galF1ZXJ5KHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdpbml0JywgKGV2ZW50LCBzbGljaykgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmluaXQuZW1pdCh7IGV2ZW50LCBzbGljayB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2sodGhpcy5jb25maWcpO1xuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmNvbmZpZz8uaW5pdGlhbFNsaWRlIHx8IDA7XG4gICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2FmdGVyQ2hhbmdlJywgKGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q6IGN1cnJlbnRTbGlkZSA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IHNsaWNrLiRzbGlkZXMubGVuZ3RoID09PSBjdXJyZW50U2xpZGUgKyBzbGljay5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGN1cnJlbnRTbGlkZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignYmVmb3JlQ2hhbmdlJywgKGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlLCBuZXh0U2xpZGUpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5iZWZvcmVDaGFuZ2UuZW1pdCh7IGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlLCBuZXh0U2xpZGUgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBuZXh0U2xpZGU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdicmVha3BvaW50JywgKGV2ZW50LCBzbGljaywgYnJlYWtwb2ludCkgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJyZWFrcG9pbnQuZW1pdCh7IGV2ZW50LCBzbGljaywgYnJlYWtwb2ludCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2Rlc3Ryb3knLCAoZXZlbnQsIHNsaWNrKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVzdHJveS5lbWl0KHsgZXZlbnQsIHNsaWNrIH0pO1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFNsaWRlKHNsaWNrSXRlbTogU2xpY2tJdGVtRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5fYWRkZWRTbGlkZXMucHVzaChzbGlja0l0ZW0pO1xuICB9XG5cbiAgcmVtb3ZlU2xpZGUoc2xpY2tJdGVtOiBTbGlja0l0ZW1EaXJlY3RpdmUpIHtcbiAgICB0aGlzLl9yZW1vdmVkU2xpZGVzLnB1c2goc2xpY2tJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljayBNZXRob2RcbiAgICovXG4gIHB1YmxpYyBzbGlja0dvVG8oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tHb1RvJywgaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrTmV4dCgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrTmV4dCcpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUHJldigpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUHJldicpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUGF1c2UoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1BhdXNlJyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2xpY2tQbGF5KCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tQbGF5Jyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zbGljaygpIHtcbiAgICBpZiAodGhpcy4kaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuJGluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNoYW5nZXNbJ2NvbmZpZyddO1xuICAgICAgaWYgKGNvbmZpZy5wcmV2aW91c1ZhbHVlICE9PSBjb25maWcuY3VycmVudFZhbHVlICYmIGNvbmZpZy5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWZyZXNoID0gY29uZmlnLmN1cnJlbnRWYWx1ZVsncmVmcmVzaCddO1xuICAgICAgICBjb25zdCBuZXdPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBuZXdPcHRpb25zWydyZWZyZXNoJ107XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tTZXRPcHRpb24nLCBuZXdPcHRpb25zLCByZWZyZXNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neFNsaWNrSXRlbV0nLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlja0l0ZW1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgIEBIb3N0KCkgcHJpdmF0ZSBjYXJvdXNlbDogU2xpY2tDYXJvdXNlbENvbXBvbmVudCkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuY2Fyb3VzZWwuYWRkU2xpZGUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuY2Fyb3VzZWwucmVtb3ZlU2xpZGUodGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=