materialize-angular
Version:
Material UI Angular library
428 lines • 36.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/slider/slider.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { supportedEvents, supportTouchEvents } from '../../utils/get-supported-events.util';
import { config } from '../../config';
import { SliderOptionComponent } from './slider-option/slider-option.component';
export class SliderComponent {
/**
* @param {?} renderer
*/
constructor(renderer) {
this.renderer = renderer;
this.className = SliderComponent.defaultProps.className;
this.disabled = SliderComponent.defaultProps.disabled;
this.required = SliderComponent.defaultProps.required;
this.showLabels = SliderComponent.defaultProps.showLabels;
this.showTicks = SliderComponent.defaultProps.showTicks;
this.value = SliderComponent.defaultProps.value;
this.prefix = config.components.prefix;
this.isFocused = false;
this.supportedEvents = supportedEvents();
this.onChangeEmitter = new EventEmitter();
this.actionDown = this.actionDown.bind(this);
this.actionMove = this.actionMove.bind(this);
this.actionUp = this.actionUp.bind(this);
this.onOptionClick = this.onOptionClick.bind(this);
this.update = this.update.bind(this);
window.addEventListener(this.supportedEvents.resize, this.update);
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.sliderTrack.nativeElement.addEventListener(this.supportedEvents.down, this.actionDown);
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.update();
this.options.changes.subscribe(this.update);
}
/**
* @return {?}
*/
update() {
setTimeout((/**
* @return {?}
*/
() => {
this.registerEventOptions();
this.renderPositions();
this.moveToValue(this.value, false);
}), 0);
}
/**
* @return {?}
*/
registerEventOptions() {
this.options.forEach((/**
* @param {?} option
* @return {?}
*/
option => {
option.onClickEmitter.subscribe(this.onOptionClick);
}));
}
/**
* @param {?} value
* @return {?}
*/
onOptionClick(value) {
this.value = value;
this.onChangeEmitter.emit(this.value);
this.onChange(this.value);
this.moveToValue(this.value, true);
}
/**
* @return {?}
*/
renderPositions() {
/** @type {?} */
const pixelInterval = this.getPixelInterval();
this.removeTicks();
this.options.forEach((/**
* @param {?} option
* @param {?} index
* @return {?}
*/
(option, index) => {
/** @type {?} */
const leftSpace = pixelInterval * index;
const { nativeElement } = option.templateRef;
this.renderer.setStyle(nativeElement, 'left', `${leftSpace}px`);
if (this.showTicks) {
/** @type {?} */
const tick = this.renderer.createElement('div');
this.renderer.setStyle(tick, 'left', `${leftSpace}px`);
this.renderer.addClass(tick, SliderComponent.tickClassName);
this.renderer.appendChild(this.sliderTrackInterval.nativeElement, tick);
}
}));
}
/**
* @return {?}
*/
removeTicks() {
const { nativeElement } = this.sliderTrackInterval;
while (nativeElement.firstChild) {
this.renderer.removeChild(nativeElement, nativeElement.firstChild);
}
}
/**
* @param {?} event
* @return {?}
*/
actionDown(event) {
if (!this.disabled) {
/** @type {?} */
const x = this.getXCoordinate(event, this.supportedEvents.down);
this.animate(x, true);
window.addEventListener(this.supportedEvents.up, this.actionUp);
window.addEventListener(this.supportedEvents.move, this.actionMove);
}
}
/**
* @param {?} event
* @return {?}
*/
actionMove(event) {
/** @type {?} */
const x = this.getXCoordinate(event, this.supportedEvents.move);
this.value = this.getValueFromXCoordinate(x);
this.animate(x, false);
}
/**
* @param {?} event
* @return {?}
*/
actionUp(event) {
window.removeEventListener(this.supportedEvents.up, this.actionUp);
window.removeEventListener(this.supportedEvents.move, this.actionMove);
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', null);
/** @type {?} */
const x = this.getXCoordinate(event, this.supportedEvents.up);
this.value = this.getValueFromXCoordinate(x);
this.onChangeEmitter.emit(this.value);
this.onChange(this.value);
this.moveToValue(this.value, true);
}
/**
* @param {?} value
* @param {?} hasAnimation
* @return {?}
*/
moveToValue(value, hasAnimation) {
/** @type {?} */
const options = this.options.toArray();
/** @type {?} */
const index = options.findIndex((/**
* @param {?} option
* @return {?}
*/
option => option.value === value));
/** @type {?} */
const validatedIndex = index >= 0
? index
: 0;
/** @type {?} */
const pixelInterval = this.getPixelInterval();
/** @type {?} */
const nextXCoordinate = validatedIndex * pixelInterval;
this.animate(nextXCoordinate, hasAnimation);
}
/**
* @param {?} value
* @return {?}
*/
activeOption(value) {
this.options.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
item.isActive = (item.value === value);
}));
}
/**
* @param {?} x
* @return {?}
*/
getValueFromXCoordinate(x) {
/** @type {?} */
const index = this.getIndexFromXCoordinate(x);
/** @type {?} */
const options = this.options.toArray();
/** @type {?} */
const value = options[index].value;
return value;
}
/**
* @param {?} x
* @return {?}
*/
getIndexFromXCoordinate(x) {
/** @type {?} */
const pixelInterval = this.getPixelInterval();
if (pixelInterval) {
/** @type {?} */
const index = Math.round(x / pixelInterval);
if (index >= 0 && index <= this.options.length) {
return index;
}
}
return 0;
}
/**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
getXCoordinateByEventType(event, eventType) {
if (supportTouchEvents()) {
if (eventType === this.supportedEvents.up) {
return event.changedTouches[0].clientX;
}
return event.touches[0].clientX;
}
return event.clientX;
}
/**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
getXCoordinate(event, eventType) {
/** @type {?} */
const rect = this.sliderTrack.nativeElement.getBoundingClientRect();
/** @type {?} */
const xCoordinateEvent = this.getXCoordinateByEventType(event, eventType);
/** @type {?} */
const x = xCoordinateEvent - rect.left;
if (x < 0) {
return 0;
}
if (x > this.sliderTrack.nativeElement.offsetWidth) {
return this.sliderTrack.nativeElement.offsetWidth;
}
return x;
}
/**
* @return {?}
*/
getPixelInterval() {
/** @type {?} */
const maxOptionsSize = this.options.length - 1;
if (maxOptionsSize > 0) {
return this.sliderTrack.nativeElement.offsetWidth / maxOptionsSize;
}
return 0;
}
/**
* @param {?} x
* @param {?} hasAnimation
* @return {?}
*/
animate(x, hasAnimation) {
this.activeOption(this.value);
/** @type {?} */
const transitionDuration = hasAnimation
? null
: '0ms';
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', transitionDuration);
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'left', `${x}px`);
}
/**
* @return {?}
*/
onFocus() {
if (!this.disabled) {
this.isFocused = true;
this.onTouched();
}
}
/**
* @return {?}
*/
onBlur() {
this.isFocused = false;
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
setTimeout((/**
* @return {?}
*/
() => {
this.value = value;
this.moveToValue(value, false);
}), 0);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} value
* @return {?}
*/
onChange(value) { }
/**
* @return {?}
*/
onTouched() { }
}
SliderComponent.tickClassName = config.components.prefix + '-slider-step';
SliderComponent.defaultProps = {
className: '',
disabled: false,
required: false,
showLabels: true,
showTicks: false,
value: null
};
SliderComponent.decorators = [
{ type: Component, args: [{
providers: [{
multi: true,
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => SliderComponent))
}],
selector: `${config.components.prefix}-slider }`,
template: "<div [ngClass]=\"[prefix + '-slider', className]\" [class.focused]=\"isFocused\" [class.disabled]=\"disabled\">\n\n <div [ngClass]=\"prefix + '-slider-track-container'\" #sliderTrack [tabindex]=\"disabled ? '-1' : '0'\" (focus)=\"onFocus()\" (blur)=\"onBlur()\">\n <div #sliderTrackInterval></div>\n\n <div [ngClass]=\"prefix + '-slider-track'\" #sliderTrackBackground></div>\n\n <div [ngClass]=\"prefix + '-slider-indicator-container'\" #sliderIndicatorContainer>\n <ng-content select=\"materialize-slider-indicator\"></ng-content>\n </div>\n </div>\n\n <div [ngClass]=\"prefix + '-slider-labels-container'\" *ngIf=\"showLabels\">\n <ng-content select=\"materialize-slider-option\"></ng-content>\n </div>\n</div>\n"
}] }
];
/** @nocollapse */
SliderComponent.ctorParameters = () => [
{ type: Renderer2 }
];
SliderComponent.propDecorators = {
options: [{ type: ContentChildren, args: [SliderOptionComponent,] }],
sliderIndicatorContainer: [{ type: ViewChild, args: ['sliderIndicatorContainer', { static: true },] }],
sliderTrack: [{ type: ViewChild, args: ['sliderTrack', { static: true },] }],
sliderTrackBackground: [{ type: ViewChild, args: ['sliderTrackBackground', { static: true },] }],
sliderTrackInterval: [{ type: ViewChild, args: ['sliderTrackInterval', { static: true },] }],
onChangeEmitter: [{ type: Output, args: ['onChange',] }],
className: [{ type: Input }],
disabled: [{ type: Input }],
required: [{ type: Input }],
showLabels: [{ type: Input }],
showTicks: [{ type: Input }],
value: [{ type: Input }]
};
if (false) {
/** @type {?} */
SliderComponent.tickClassName;
/** @type {?} */
SliderComponent.defaultProps;
/** @type {?} */
SliderComponent.prototype.options;
/** @type {?} */
SliderComponent.prototype.sliderIndicatorContainer;
/** @type {?} */
SliderComponent.prototype.sliderTrack;
/** @type {?} */
SliderComponent.prototype.sliderTrackBackground;
/** @type {?} */
SliderComponent.prototype.sliderTrackInterval;
/** @type {?} */
SliderComponent.prototype.onChangeEmitter;
/** @type {?} */
SliderComponent.prototype.className;
/** @type {?} */
SliderComponent.prototype.disabled;
/** @type {?} */
SliderComponent.prototype.required;
/** @type {?} */
SliderComponent.prototype.showLabels;
/** @type {?} */
SliderComponent.prototype.showTicks;
/** @type {?} */
SliderComponent.prototype.value;
/** @type {?} */
SliderComponent.prototype.prefix;
/** @type {?} */
SliderComponent.prototype.isFocused;
/** @type {?} */
SliderComponent.prototype.supportedEvents;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFZaEYsTUFBTSxPQUFPLGVBQWU7Ozs7SUFpQzFCLFlBQW9CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFaOUIsY0FBUyxHQUFXLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzNELGFBQVEsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFRLEdBQVksZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDMUQsZUFBVSxHQUFZLGVBQWUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQzlELGNBQVMsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM1RCxVQUFLLEdBQXFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRS9FLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQU12QyxJ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O0lBRUYsa0NBQWtGOztJQUVsRixtREFBOEY7O0lBQzlGLHNDQUFvRTs7SUFDcEUsZ0RBQXdGOztJQUN4Riw4Q0FBb0Y7O0lBRXBGLDBDQUFvRjs7SUFFcEYsb0NBQW9FOztJQUNwRSxtQ0FBbUU7O0lBQ25FLG1DQUFtRTs7SUFDbkUscUNBQXVFOztJQUN2RSxvQ0FBcUU7O0lBQ3JFLGdDQUFzRjs7SUFFdEYsaUNBQXlDOztJQUV6QyxvQ0FBMEI7O0lBQzFCLDBDQUE2Qzs7Ozs7SUFFakMsbUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IFdvcmt5bGFiLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS93b3JreWxhYi9tYXRlcmlhbGl6ZS1hbmd1bGFyL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHN1cHBvcnRlZEV2ZW50cywgc3VwcG9ydFRvdWNoRXZlbnRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2V0LXN1cHBvcnRlZC1ldmVudHMudXRpbCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgU2xpZGVyTW9kZWwgfSBmcm9tICcuL3NsaWRlci5tb2RlbCc7XG5pbXBvcnQgeyBTbGlkZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL3NsaWRlci1vcHRpb24vc2xpZGVyLW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRzTW9kZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NvbW1vbi9tb2RlbHMvc3VwcG9ydGVkLWV2ZW50cy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBwcm92aWRlcnM6IFt7XG4gICAgbXVsdGk6IHRydWUsXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpZGVyQ29tcG9uZW50KVxuICB9XSxcbiAgc2VsZWN0b3I6IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1zbGlkZXIgfWAsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGlkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBTbGlkZXJNb2RlbCB7XG4gIHN0YXRpYyByZWFkb25seSB0aWNrQ2xhc3NOYW1lID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4ICsgJy1zbGlkZXItc3RlcCc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRQcm9wczogU2xpZGVyTW9kZWwgPSB7XG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIHNob3dMYWJlbHM6IHRydWUsXG4gICAgc2hvd1RpY2tzOiBmYWxzZSxcbiAgICB2YWx1ZTogbnVsbFxuICB9O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2xpZGVyT3B0aW9uQ29tcG9uZW50KSBvcHRpb25zOiBRdWVyeUxpc3Q8U2xpZGVyT3B0aW9uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkKCdzbGlkZXJJbmRpY2F0b3JDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJJbmRpY2F0b3JDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclRyYWNrJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2s6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NsaWRlclRyYWNrQmFja2dyb3VuZCcsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrQmFja2dyb3VuZDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2tJbnRlcnZhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlclRyYWNrSW50ZXJ2YWw6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgnb25DaGFuZ2UnKSBvbkNoYW5nZUVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbD47XG5cbiAgQElucHV0KCkgY2xhc3NOYW1lOiBzdHJpbmcgPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmNsYXNzTmFtZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmRpc2FibGVkO1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMucmVxdWlyZWQ7XG4gIEBJbnB1dCgpIHNob3dMYWJlbHM6IGJvb2xlYW4gPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnNob3dMYWJlbHM7XG4gIEBJbnB1dCgpIHNob3dUaWNrczogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuc2hvd1RpY2tzO1xuICBASW5wdXQoKSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwgPSBTbGlkZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnZhbHVlO1xuXG4gIHB1YmxpYyBwcmVmaXggPSBjb25maWcuY29tcG9uZW50cy5wcmVmaXg7XG5cbiAgcHVibGljIGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgcHVibGljIHN1cHBvcnRlZEV2ZW50czogU3VwcG9ydGVkRXZlbnRzTW9kZWw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1cHBvcnRlZEV2ZW50cyA9IHN1cHBvcnRlZEV2ZW50cygpO1xuICAgIHRoaXMub25DaGFuZ2VFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgdGhpcy5hY3Rpb25Eb3duID0gdGhpcy5hY3Rpb25Eb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hY3Rpb25Nb3ZlID0gdGhpcy5hY3Rpb25Nb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hY3Rpb25VcCA9IHRoaXMuYWN0aW9uVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uT3B0aW9uQ2xpY2sgPSB0aGlzLm9uT3B0aW9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZSA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5yZXNpemUsIHRoaXMudXBkYXRlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5kb3duLCB0aGlzLmFjdGlvbkRvd24pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUodGhpcy51cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlckV2ZW50T3B0aW9ucygpO1xuICAgICAgdGhpcy5yZW5kZXJQb3NpdGlvbnMoKTtcbiAgICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVnaXN0ZXJFdmVudE9wdGlvbnMoKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIG9wdGlvbi5vbkNsaWNrRW1pdHRlci5zdWJzY3JpYmUodGhpcy5vbk9wdGlvbkNsaWNrKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uT3B0aW9uQ2xpY2sodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2VFbWl0dGVyLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm1vdmVUb1ZhbHVlKHRoaXMudmFsdWUsIHRydWUpO1xuICB9XG5cbiAgcmVuZGVyUG9zaXRpb25zKCkge1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcblxuICAgIHRoaXMucmVtb3ZlVGlja3MoKTtcblxuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBsZWZ0U3BhY2UgPSBwaXhlbEludGVydmFsICogaW5kZXg7XG4gICAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQgfSA9IG9wdGlvbi50ZW1wbGF0ZVJlZjtcblxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAkeyBsZWZ0U3BhY2UgfXB4YCk7XG5cbiAgICAgIGlmICh0aGlzLnNob3dUaWNrcykge1xuICAgICAgICBjb25zdCB0aWNrID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRpY2ssICdsZWZ0JywgYCR7IGxlZnRTcGFjZSB9cHhgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aWNrLCBTbGlkZXJDb21wb25lbnQudGlja0NsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXJUcmFja0ludGVydmFsLm5hdGl2ZUVsZW1lbnQsIHRpY2spO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlVGlja3MoKSB7XG4gICAgY29uc3QgeyBuYXRpdmVFbGVtZW50IH0gPSB0aGlzLnNsaWRlclRyYWNrSW50ZXJ2YWw7XG5cbiAgICB3aGlsZSAobmF0aXZlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKG5hdGl2ZUVsZW1lbnQsIG5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uRG93bihldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMuZG93bik7XG5cbiAgICAgIHRoaXMuYW5pbWF0ZSh4LCB0cnVlKTtcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMudXAsIHRoaXMuYWN0aW9uVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMubW92ZSwgdGhpcy5hY3Rpb25Nb3ZlKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25Nb3ZlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMubW92ZSk7XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICB0aGlzLmFuaW1hdGUoeCwgZmFsc2UpO1xuICB9XG5cbiAgYWN0aW9uVXAoZXZlbnQ6IGFueSkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLnVwLCB0aGlzLmFjdGlvblVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlLCB0aGlzLmFjdGlvbk1vdmUpO1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJywgbnVsbCk7XG5cbiAgICBjb25zdCB4ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZShldmVudCwgdGhpcy5zdXBwb3J0ZWRFdmVudHMudXApO1xuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tWENvb3JkaW5hdGUoeCk7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICBtb3ZlVG9WYWx1ZSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwsIGhhc0FuaW1hdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpO1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIGNvbnN0IHZhbGlkYXRlZEluZGV4ID0gaW5kZXggPj0gMFxuICAgICAgPyBpbmRleFxuICAgICAgOiAwO1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcbiAgICBjb25zdCBuZXh0WENvb3JkaW5hdGUgPSB2YWxpZGF0ZWRJbmRleCAqIHBpeGVsSW50ZXJ2YWw7XG5cbiAgICB0aGlzLmFuaW1hdGUobmV4dFhDb29yZGluYXRlLCBoYXNBbmltYXRpb24pO1xuICB9XG5cbiAgYWN0aXZlT3B0aW9uKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCkge1xuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5pc0FjdGl2ZSA9IChpdGVtLnZhbHVlID09PSB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhGcm9tWENvb3JkaW5hdGUoeCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW2luZGV4XS52YWx1ZTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGdldEluZGV4RnJvbVhDb29yZGluYXRlKHg6IG51bWJlcikge1xuICAgIGNvbnN0IHBpeGVsSW50ZXJ2YWwgPSB0aGlzLmdldFBpeGVsSW50ZXJ2YWwoKTtcblxuICAgIGlmIChwaXhlbEludGVydmFsKSB7XG4gICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoeCAvIHBpeGVsSW50ZXJ2YWwpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGdldFhDb29yZGluYXRlQnlFdmVudFR5cGUoZXZlbnQ6IGFueSwgZXZlbnRUeXBlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChzdXBwb3J0VG91Y2hFdmVudHMoKSkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gdGhpcy5zdXBwb3J0ZWRFdmVudHMudXApIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFg7XG4gIH1cblxuICBnZXRYQ29vcmRpbmF0ZShldmVudDogYW55LCBldmVudFR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeENvb3JkaW5hdGVFdmVudCA9IHRoaXMuZ2V0WENvb3JkaW5hdGVCeUV2ZW50VHlwZShldmVudCwgZXZlbnRUeXBlKTtcbiAgICBjb25zdCB4ID0geENvb3JkaW5hdGVFdmVudCAtIHJlY3QubGVmdDtcblxuICAgIGlmICh4IDwgMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHggPiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG4gIH1cblxuICBnZXRQaXhlbEludGVydmFsKCkge1xuICAgIGNvbnN0IG1heE9wdGlvbnNTaXplID0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAobWF4T3B0aW9uc1NpemUgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGlkZXJUcmFjay5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC8gbWF4T3B0aW9uc1NpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBhbmltYXRlKHg6IG51bWJlciwgaGFzQW5pbWF0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy5hY3RpdmVPcHRpb24odGhpcy52YWx1ZSk7XG5cbiAgICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb24gPSBoYXNBbmltYXRpb25cbiAgICAgID8gbnVsbFxuICAgICAgOiAnMG1zJztcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zbGlkZXJJbmRpY2F0b3JDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb25EdXJhdGlvbicsIHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAkeyB4IH1weGApO1xuICB9XG5cbiAgb25Gb2N1cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgdGhpcy5tb3ZlVG9WYWx1ZSh2YWx1ZSwgZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIG9uQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IHZvaWQge31cblxuICBvblRvdWNoZWQoKTogdm9pZCB7fVxufVxuIl19