ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
459 lines • 32.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
export class SliderHandleComponent {
/**
* @param {?} _elf
* @param {?} _sanitizer
*/
constructor(_elf, _sanitizer) {
this._elf = _elf;
this._sanitizer = _sanitizer;
this._disabled = false;
this._marks = {};
this._isDraging = false;
this.onChange = new EventEmitter();
this.onAfterChange = new EventEmitter();
this.mouseDown = (/**
* @param {?} event
* @return {?}
*/
event => {
if (!this._disabled && this.isMouseTarget(event)) {
this._startX = event.clientX;
this._handleStatus = 'start';
this._isDraging = true;
document.addEventListener('mousemove', this.mouseMove, false);
document.addEventListener('mouseup', this.mouseUp, false);
this.pauseEvent(event);
}
});
this.mouseMove = (/**
* @param {?} event
* @return {?}
*/
event => {
if (!this._disabled && this._isDraging) {
this.pauseEvent(event);
/** @type {?} */
const pos = event.clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
if (this._oldValue !== this._value) {
this._oldValue = this._value;
this.onChange.emit(this._value);
}
}
});
this.mouseUp = (/**
* @param {?} event
* @return {?}
*/
event => {
if (!this._disabled && this._isDraging) {
this._handleStatus = 'end';
this._isDraging = false;
/** @type {?} */
const pos = event.clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
this.onAfterChange.emit(this._value);
}
});
}
/**
* @param {?} value
* @return {?}
*/
set min(value) {
this._min = value;
}
/**
* @param {?} value
* @return {?}
*/
set max(value) {
this._max = value;
}
/**
* @param {?} value
* @return {?}
*/
set minBound(value) {
this._minBound = value;
}
/**
* @param {?} value
* @return {?}
*/
set maxBound(value) {
this._maxBound = value;
}
/**
* @param {?} value
* @return {?}
*/
set step(value) {
this._step = value;
}
/**
* @param {?} value
* @return {?}
*/
set value(value) {
this._value = value;
if (this._value) {
this.left = this.calcOffset(this._value);
}
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
}
/**
* @param {?} value
* @return {?}
*/
set sliderLength(value) {
this._sliderLength = value;
}
/**
* @param {?} value
* @return {?}
*/
set sliderStart(value) {
this._sliderStart = value;
}
/**
* @return {?}
*/
get handleStyle() {
return this._handleStyle;
}
/**
* @param {?} value
* @return {?}
*/
set handleStyle(value) {
this._handleStyle = value;
}
/* 手势操作 */
/**
* @param {?} event
* @return {?}
*/
panstart(event) {
// event.preventDefault();
if (!this._disabled) {
this._startX = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
this._handleStatus = 'start';
this._isDraging = true;
}
}
/**
* @param {?} event
* @return {?}
*/
panmove(event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
/** @type {?} */
const pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
if (this._oldValue !== this._value) {
this._oldValue = this._value;
this.onChange.emit(this._value);
}
}
}
/**
* @param {?} event
* @return {?}
*/
panend(event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
this._handleStatus = 'end';
this._isDraging = false;
/** @type {?} */
const pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
this.onAfterChange.emit(this._value);
}
}
/**
* @param {?} pos
* @return {?}
*/
calcValueByPos(pos) {
/** @type {?} */
const offset = pos - this._sliderStart;
/** @type {?} */
let value = this.calcValue(offset);
if (value <= this._minBound) {
value = this._minBound;
}
if (value >= this._maxBound) {
value = this._maxBound;
}
/** @type {?} */
const closestPoint = this.getClosestPoint(value);
return this._step === null ? closestPoint : parseFloat(closestPoint.toFixed(this.getPrecision(this._step)));
}
/**
* @param {?} offset
* @return {?}
*/
calcValue(offset) {
/** @type {?} */
const ratio = Math.abs(Math.max(offset, 0) / this._sliderLength);
/** @type {?} */
const value = ratio * (this._max - this._min) + this._min;
return value;
}
/**
* @param {?} val
* @return {?}
*/
getClosestPoint(val) {
/** @type {?} */
const points = Object.keys(this._marks).map(parseFloat);
if (this._step !== null) {
/** @type {?} */
const closestStep = Math.round((val - this._min) / this._step) * this._step + this._min;
points.push(closestStep);
}
/** @type {?} */
const diffs = points.map((/**
* @param {?} point
* @return {?}
*/
function (point) {
return Math.abs(val - point);
}));
return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))];
}
/**
* @param {?} step
* @return {?}
*/
getPrecision(step) {
/** @type {?} */
const stepString = step.toString();
/** @type {?} */
let precision = 0;
if (stepString.indexOf('.') >= 0) {
precision = stepString.length - stepString.indexOf('.') - 1;
}
return precision;
}
/**
* @param {?} value
* @return {?}
*/
calcOffset(value) {
/** @type {?} */
const ratio = (value - this._min) / (this._max - this._min);
return ratio * 100;
}
/**
* @param {?} e
* @return {?}
*/
pauseEvent(e) {
e.stopPropagation();
e.preventDefault();
}
/**
* @param {?} event
* @return {?}
*/
isMouseTarget(event) {
/** @type {?} */
let target = event.target;
/** @type {?} */
let parentFound = false;
while (target !== null && !parentFound) {
if (target === this._elf.nativeElement) {
parentFound = true;
}
target = target.parentElement;
}
return parentFound;
}
/**
* @param {?} arr
* @return {?}
*/
toConsumableArray(arr) {
if (Array.isArray(arr)) {
/** @type {?} */
const arr2 = Array(arr.length);
for (let i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
}
/**
* @return {?}
*/
ngOnInit() {
/** @type {?} */
const self = this;
this._elf.nativeElement.addEventListener('mousedown', this.mouseDown, false);
this._handleOffsetX = this._elf.nativeElement.getBoundingClientRect().x;
this.left = this.calcOffset(this._value);
this._minBound = this._minBound === undefined ? this._min : this._minBound;
this._maxBound = this._maxBound === undefined ? this._max : this._maxBound;
}
/**
* @return {?}
*/
ngOnDestroy() {
document.removeEventListener('mousemove', this.mouseMove, false);
document.removeEventListener('mouseup', this.mouseUp, false);
}
}
SliderHandleComponent.decorators = [
{ type: Component, args: [{
selector: 'SliderHandle, nzm-slider-handle',
template: "<div role=\"slider\" class=\"am-slider-handle\" [ngStyle]=\"handleStyle\" [style.left.%]=\"left\"></div>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
SliderHandleComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: DomSanitizer }
];
SliderHandleComponent.propDecorators = {
min: [{ type: Input }],
max: [{ type: Input }],
minBound: [{ type: Input }],
maxBound: [{ type: Input }],
step: [{ type: Input }],
value: [{ type: Input }],
disabled: [{ type: Input }],
sliderLength: [{ type: Input }],
sliderStart: [{ type: Input }],
handleStyle: [{ type: Input }],
onChange: [{ type: Output }],
onAfterChange: [{ type: Output }],
panstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
panmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
panend: [{ type: HostListener, args: ['touchend', ['$event'],] }]
};
if (false) {
/** @type {?} */
SliderHandleComponent.prototype.left;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._min;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._max;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._step;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._value;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._marks;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleStyle;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sliderLength;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sliderStart;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._minBound;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._maxBound;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._startX;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._isDraging;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleStatus;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._handleOffsetX;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._oldValue;
/** @type {?} */
SliderHandleComponent.prototype.onChange;
/** @type {?} */
SliderHandleComponent.prototype.onAfterChange;
/** @type {?} */
SliderHandleComponent.prototype.mouseDown;
/** @type {?} */
SliderHandleComponent.prototype.mouseMove;
/** @type {?} */
SliderHandleComponent.prototype.mouseUp;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._elf;
/**
* @type {?}
* @private
*/
SliderHandleComponent.prototype._sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRVosaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU96RCxNQUFNLE9BQU8scUJBQXFCOzs7OztJQTRHaEMsWUFBb0IsSUFBZ0IsRUFBVSxVQUF3QjtRQUFsRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQXJHOUQsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBT3BCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFvRHBDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQXlDeEMsY0FBUzs7OztRQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlELFFBQVEs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aW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1NsaWRlckhhbmRsZSwgbnptLXNsaWRlci1oYW5kbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWhhbmRsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVySGFuZGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBsZWZ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX21hcmtzOiBvYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3R5bGU6IG9iamVjdDtcbiAgcHJpdmF0ZSBfc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3NsaWRlclN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgX21pbkJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX21heEJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIF9pc0RyYWdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3RhdHVzOiBzdHJpbmc7XG4gIHByaXZhdGUgX2hhbmRsZU9mZnNldFg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2xkVmFsdWU6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluQm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbkJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heEJvdW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZXJMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyU3RhcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlclN0YXJ0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5faGFuZGxlU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiDmiYvlir/mk43kvZwgKi9cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgLy8gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fb2xkVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX29sZFZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ2VuZCc7XG4gICAgICB0aGlzLl9pc0RyYWdpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBtb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLmlzTW91c2VUYXJnZXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICAgICAgdGhpcy5wYXVzZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBtb3VzZU1vdmUgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMucGF1c2VFdmVudChldmVudCk7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKHRoaXMuX29sZFZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgICB0aGlzLl9vbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVN0YXR1cyA9ICdlbmQnO1xuICAgICAgdGhpcy5faXNEcmFnaW5nID0gZmFsc2U7XG4gICAgICBjb25zdCBwb3MgPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5fdmFsdWUgPSBNYXRoLnJvdW5kKHRoaXMuY2FsY1ZhbHVlQnlQb3MocG9zKSk7XG4gICAgICB0aGlzLmxlZnQgPSB0aGlzLmNhbGNPZmZzZXQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5vbkFmdGVyQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGNWYWx1ZUJ5UG9zKHBvcykge1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcyAtIHRoaXMuX3NsaWRlclN0YXJ0O1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FsY1ZhbHVlKG9mZnNldCk7XG4gICAgaWYgKHZhbHVlIDw9IHRoaXMuX21pbkJvdW5kKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX21pbkJvdW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPj0gdGhpcy5fbWF4Qm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWF4Qm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RQb2ludCA9IHRoaXMuZ2V0Q2xvc2VzdFBvaW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fc3RlcCA9PT0gbnVsbCA/IGNsb3Nlc3RQb2ludCA6IHBhcnNlRmxvYXQoY2xvc2VzdFBvaW50LnRvRml4ZWQodGhpcy5nZXRQcmVjaXNpb24odGhpcy5fc3RlcCkpKTtcbiAgfVxuXG4gIGNhbGNWYWx1ZShvZmZzZXQpIHtcbiAgICBjb25zdCByYXRpbyA9IE1hdGguYWJzKE1hdGgubWF4KG9mZnNldCwgMCkgLyB0aGlzLl9zbGlkZXJMZW5ndGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcmF0aW8gKiAodGhpcy5fbWF4IC0gdGhpcy5fbWluKSArIHRoaXMuX21pbjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRDbG9zZXN0UG9pbnQodmFsKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWFya3MpLm1hcChwYXJzZUZsb2F0KTtcbiAgICBpZiAodGhpcy5fc3RlcCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xvc2VzdFN0ZXAgPSBNYXRoLnJvdW5kKCh2YWwgLSB0aGlzLl9taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwICsgdGhpcy5fbWluO1xuICAgICAgcG9pbnRzLnB1c2goY2xvc2VzdFN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBkaWZmcyA9IHBvaW50cy5tYXAoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh2YWwgLSBwb2ludCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBvaW50c1tkaWZmcy5pbmRleE9mKE1hdGgubWluLmFwcGx5KE1hdGgsIHRoaXMudG9Db25zdW1hYmxlQXJyYXkoZGlmZnMpKSldO1xuICB9XG5cbiAgZ2V0UHJlY2lzaW9uKHN0ZXApIHtcbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC50b1N0cmluZygpO1xuICAgIGxldCBwcmVjaXNpb24gPSAwO1xuICAgIGlmIChzdGVwU3RyaW5nLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICBwcmVjaXNpb24gPSBzdGVwU3RyaW5nLmxlbmd0aCAtIHN0ZXBTdHJpbmcuaW5kZXhPZignLicpIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuXG4gIGNhbGNPZmZzZXQodmFsdWUpIHtcbiAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMuX21pbikgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICByZXR1cm4gcmF0aW8gKiAxMDA7XG4gIH1cblxuICBwYXVzZUV2ZW50KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGlzTW91c2VUYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlICh0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEZvdW5kO1xuICB9XG5cbiAgdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgY29uc3QgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyMltpXSA9IGFycltpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIyO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2VEb3duLCBmYWxzZSk7XG4gICAgdGhpcy5faGFuZGxlT2Zmc2V0WCA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl9taW5Cb3VuZCA9IHRoaXMuX21pbkJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9taW4gOiB0aGlzLl9taW5Cb3VuZDtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHRoaXMuX21heEJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9tYXggOiB0aGlzLl9tYXhCb3VuZDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICB9XG59XG4iXX0=