UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

751 lines 57.1 kB
/** * @fileoverview added by tsickle * Generated from: input-number.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent } from 'rxjs'; /** @type {?} */ var INPUT_NUMBER_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, // tslint:disable-next-line useExisting: forwardRef((/** * @return {?} */ function () { return InputNumberComponent; })), multi: true }; var InputNumberComponent = /** @class */ (function () { function InputNumberComponent(cdr, el) { this.cdr = cdr; this.el = el; this.max = 100; this.min = 0; this.step = 1; this.disabled = false; this.size = ''; this.autoFocus = false; this.allowEmpty = false; this.placeholder = ''; this.maxLength = 0; this.afterValueChanged = new EventEmitter(); this.whileValueChanging = new EventEmitter(); this.disabledInc = false; this.disabledDec = false; this.onTouchedCallback = (/** * @param {?} v * @return {?} */ function (v) { }); this.onChangeCallback = (/** * @param {?} v * @return {?} */ function (v) { }); } /** * @param {?} fn * @return {?} */ InputNumberComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeCallback = fn; }; /** * @param {?} fn * @return {?} */ InputNumberComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouchedCallback = fn; }; /** * @param {?} isDisabled * @return {?} */ InputNumberComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; this.toggleDisabled(isDisabled); }; /** * @param {?} newValue * @return {?} */ InputNumberComponent.prototype.writeValue = /** * @param {?} newValue * @return {?} */ function (newValue) { this.lastEmittedValue = newValue; this.setValue(this.ensureValueInRange(newValue)); }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.valueMustBeValid = /** * @private * @param {?} value * @return {?} */ function (value) { return !isNaN(typeof value !== 'number' ? parseFloat(value) : value); }; /** * @private * @param {?} min * @param {?} n * @param {?} max * @return {?} */ InputNumberComponent.prototype.clamp = /** * @private * @param {?} min * @param {?} n * @param {?} max * @return {?} */ function (min, n, max) { return Math.max(min, Math.min(n, max)); }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.ensureValueInRange = /** * @private * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var safeValue; if (this.allowEmpty && (value === null || value === undefined)) { safeValue = value; } else if (!this.valueMustBeValid(value)) { safeValue = this.min; } else { /** @type {?} */ var currentValue = value; if (!value) { currentValue = 0; } safeValue = this.clamp(this.min, currentValue, this.max); } return safeValue; }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.setValue = /** * @private * @param {?} value * @return {?} */ function (value) { this.value = value; this.valueInput = value; if (this.disabled) { return; } if (this.allowEmpty && (value === null || value === undefined)) { this.subscribeDecAction(); this.subscribeIncAction(); } else { if (!this.canDecrease()) { this.unsubscribeDecAction(); } else { this.subscribeDecAction(); } if (!this.canIncrease()) { this.unsubscribeIncAction(); } else { this.subscribeIncAction(); } } this.cdr.detectChanges(); }; /** * @return {?} */ InputNumberComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.registerListeners(); this.subscribeActions(); this.toggleDisabled(this.disabled); this.el.nativeElement.addEventListener('click', this.registerBlurListener.bind(this)); if (this.autoFocus) { this.el.nativeElement.click(); this.inputElement.nativeElement.focus(); } }; /** * @param {?} changes * @return {?} */ InputNumberComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.hasOwnProperty('min') || changes.hasOwnProperty('max')) { this.checkRangeValues(this.min, this.max); } }; /** * @return {?} */ InputNumberComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.unsubscribeActions(); }; /** * @return {?} */ InputNumberComponent.prototype.registerListeners = /** * @return {?} */ function () { if (this.incButton && this.incButton.nativeElement) { this.incListener = fromEvent(this.incButton.nativeElement, 'click'); } if (this.decButton && this.decButton.nativeElement) { this.decListener = fromEvent(this.decButton.nativeElement, 'click'); } }; /** * @return {?} */ InputNumberComponent.prototype.subscribeActions = /** * @return {?} */ function () { this.subscribeIncAction(); this.subscribeDecAction(); }; /** * @return {?} */ InputNumberComponent.prototype.subscribeIncAction = /** * @return {?} */ function () { if (this.incListener && !this.incAction) { this.incAction = this.incListener.subscribe(this.increaseValue.bind(this)); this.disabledInc = false; } }; /** * @return {?} */ InputNumberComponent.prototype.subscribeDecAction = /** * @return {?} */ function () { if (this.decListener && !this.decAction) { this.decAction = this.decListener.subscribe(this.decreaseValue.bind(this)); this.disabledDec = false; } }; /** * @return {?} */ InputNumberComponent.prototype.unsubscribeActions = /** * @return {?} */ function () { this.unsubscribeIncAction(); this.unsubscribeDecAction(); }; /** * @return {?} */ InputNumberComponent.prototype.unsubscribeIncAction = /** * @return {?} */ function () { if (this.incListener && this.incAction) { this.incAction.unsubscribe(); this.incAction = null; this.disabledInc = true; } }; /** * @return {?} */ InputNumberComponent.prototype.unsubscribeDecAction = /** * @return {?} */ function () { if (this.incListener && this.decAction) { this.decAction.unsubscribe(); this.decAction = null; this.disabledDec = true; } }; /** * @private * @return {?} */ InputNumberComponent.prototype.increaseValue = /** * @private * @return {?} */ function () { if (this.canIncrease()) { if (this.allowEmpty && (this.value === null || this.value === undefined)) { this.updateValue(this.min); } else { /** @type {?} */ var decimals = this.getMaxDecimals(this.value); this.updateValue(parseFloat((this.value + this.step).toFixed(decimals))); } } }; /** * @private * @return {?} */ InputNumberComponent.prototype.decreaseValue = /** * @private * @return {?} */ function () { if (this.canDecrease()) { if (this.allowEmpty && (this.value === null || this.value === undefined)) { this.updateValue(this.min); } else { /** @type {?} */ var decimals = this.getMaxDecimals(this.value); this.updateValue(parseFloat((this.value - this.step).toFixed(decimals))); } } }; /** * @private * @return {?} */ InputNumberComponent.prototype.canIncrease = /** * @private * @return {?} */ function () { if (this.allowEmpty && (this.value === null || this.value === undefined)) { return (this.min + this.step) <= this.max; } else { return (this.value + this.step) <= this.max; } }; /** * @private * @return {?} */ InputNumberComponent.prototype.canDecrease = /** * @private * @return {?} */ function () { if (this.allowEmpty && (this.value === null || this.value === undefined)) { return (this.min + this.step) <= this.max; } else { return (this.value - this.step) >= this.min; } }; /** * @private * @param {?} disabled * @return {?} */ InputNumberComponent.prototype.toggleDisabled = /** * @private * @param {?} disabled * @return {?} */ function (disabled) { if (disabled) { this.unsubscribeActions(); } else { this.subscribeActions(); } }; /** * @param {?} event * @return {?} */ InputNumberComponent.prototype.ensureValueIsValid = /** * @param {?} event * @return {?} */ function (event) { event.stopPropagation(); /** @type {?} */ var newValue = event.target['value']; /** @type {?} */ var parseValue = parseFloat((/** @type {?} */ (newValue))); if (this.allowEmpty && newValue === '') { this.updateValue(this.ensureValueInRange(null)); } else if (!isNaN(parseValue)) { this.updateValue(this.ensureValueInRange(parseValue)); } else { this.updateValue(this.ensureValueInRange(this.value)); } }; /** * @private * @param {?} minValue * @param {?} maxValue * @return {?} */ InputNumberComponent.prototype.checkRangeValues = /** * @private * @param {?} minValue * @param {?} maxValue * @return {?} */ function (minValue, maxValue) { if (maxValue < minValue) { throw new Error("max value must be greater than or equal to min value"); } }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.getDecimals = /** * @private * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var valueString = value.toString(); /** @type {?} */ var integerLength = valueString.indexOf('.') + 1; return integerLength >= 0 ? valueString.length - integerLength : 0; }; /** * @private * @param {?} currentValue * @return {?} */ InputNumberComponent.prototype.getMaxDecimals = /** * @private * @param {?} currentValue * @return {?} */ function (currentValue) { /** @type {?} */ var stepPrecision = this.getDecimals(this.step); /** @type {?} */ var currentValuePrecision = this.getDecimals((/** @type {?} */ (currentValue))); if (!currentValue) { return stepPrecision; } if (this.decimalLimit !== undefined && this.decimalLimit !== null) { return this.decimalLimit; } return Math.max(currentValuePrecision, stepPrecision); }; /** * @param {?} event * @return {?} */ InputNumberComponent.prototype.protectInput = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var value = event.target['value']; /** @type {?} */ var input = String.fromCharCode(event.which); /** @type {?} */ var selectionStart = event.target['selectionStart']; /** @type {?} */ var selectionEnd = event.target['selectionEnd']; value = value.substring(0, selectionStart) + input + value.substring(selectionEnd); if (this.maxLength && value.length > this.maxLength) { event.preventDefault(); return; } if (this.reg && !value.match(new RegExp(this.reg))) { event.preventDefault(); return; } else if (value === '-' || value.match(/^\s*(-|\+)?\d+\.$/) || value.match(/^\s*(-|\+)?\d+\.[0-9]*0$/) || value.match(/^\s*(-|\+)0+$/)) { // indeterminate state return; } else if (value.match(/^\s*(-|\+)?(\d+|(\d*(\.\d*)))$/)) { event.preventDefault(); if (this.decimalLimit !== undefined && this.decimalLimit !== null) { value = parseFloat(value).toFixed(this.decimalLimit); } value = parseFloat((/** @type {?} */ (value))); if (!isNaN(value)) { this.valueInput = value; this.notifyWhileValueChanging(value); // updateValue会使输入游标跳到最后,这里设置输入游标归位 setTimeout((/** * @return {?} */ function () { event.target['setSelectionRange'](selectionStart + 1, selectionStart + 1); }), 0); return; } } else { event.preventDefault(); } }; /** * @private * @return {?} */ InputNumberComponent.prototype.notifyValueChange = /** * @private * @return {?} */ function () { this.afterValueChanged.emit(this.value); this.onChangeCallback(this.value); }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.notifyWhileValueChanging = /** * @private * @param {?} value * @return {?} */ function (value) { this.whileValueChanging.emit(value); }; /** * @private * @param {?} value * @return {?} */ InputNumberComponent.prototype.updateValue = /** * @private * @param {?} value * @return {?} */ function (value) { this.setValue(value); if (this.lastEmittedValue !== value) { this.lastEmittedValue = value; this.notifyValueChange(); } }; /** * @param {?} event * @return {?} */ InputNumberComponent.prototype.handleBackspace = /** * @param {?} event * @return {?} */ function (event) { if (event.key === 'Backspace') { /** @type {?} */ var oldValue = event.target['value']; /** @type {?} */ var selectionStart = event.target['selectionStart']; /** @type {?} */ var selectionEnd = event.target['selectionEnd']; /** @type {?} */ var newValue = oldValue.substring(0, selectionStart - 1) + oldValue.substring(selectionEnd); oldValue = oldValue === '' ? null : this.ensureValueInRange(oldValue); newValue = newValue === '' ? null : this.ensureValueInRange(newValue); if (oldValue !== newValue && newValue !== '-') { this.notifyWhileValueChanging(newValue); } } }; /** * @return {?} */ InputNumberComponent.prototype.registerBlurListener = /** * @return {?} */ function () { document.addEventListener('click', this.emitBlurEvent.bind(this), { capture: true, once: true, }); }; /** * @param {?} event * @return {?} */ InputNumberComponent.prototype.emitBlurEvent = /** * @param {?} event * @return {?} */ function (event) { if (this.el.nativeElement !== event.target && !this.el.nativeElement.contains(event.target)) { this.el.nativeElement.dispatchEvent(new Event('blur', { bubbles: false })); } }; InputNumberComponent.decorators = [ { type: Component, args: [{ selector: 'd-input-number', template: "<div\r\n class=\"input-control-buttons\"\r\n [ngClass]=\"{\r\n disabled: disabled,\r\n 'devui-input-number-lg': size === 'lg',\r\n 'devui-input-number-sm': size === 'sm'\r\n }\"\r\n>\r\n <span class=\"input-control-button input-control-inc\" [ngClass]=\"{ disabled: disabledInc }\" #incButton>\r\n <svg class=\"devui-svg-icon-arrow\" width=\"15px\" height=\"15px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"chevron-up\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\r\n <polygon points=\"11.5 12 8 8.23076923 4.5 12 3 10.3846154 8 5 13 10.3846154\"></polygon>\r\n </g>\r\n </svg>\r\n </span>\r\n <span class=\"input-control-button input-control-dec\" [ngClass]=\"{ disabled: disabledDec }\" #decButton>\r\n <svg class=\"devui-svg-icon-arrow\" width=\"15px\" height=\"15px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"chevron-down\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\r\n <polygon points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\r\n </g>\r\n </svg>\r\n </span>\r\n</div>\r\n<div\r\n class=\"input-container\"\r\n [ngClass]=\"{\r\n 'devui-input-number-lg': size === 'lg',\r\n 'devui-input-number-sm': size === 'sm'\r\n }\"\r\n>\r\n <input\r\n class=\"input-box\"\r\n [(ngModel)]=\"valueInput\"\r\n [ngClass]=\"{ disabled: disabled }\"\r\n [placeholder]=\"placeholder\"\r\n [attr.readonly]=\"disabled ? '' : null\"\r\n (keypress)=\"protectInput($event)\"\r\n (blur)=\"ensureValueIsValid($event)\"\r\n (keydown)=\"handleBackspace($event)\"\r\n #inputElement\r\n />\r\n</div>\r\n", providers: [INPUT_NUMBER_CONTROL_VALUE_ACCESSOR], styles: [":host{display:inline-block;position:relative;width:80px}:host .disabled{cursor:not-allowed;opacity:.3}:host:hover .input-box:not(.disabled){border:1px solid #344899;padding-right:26px}:host:hover .input-control-buttons:not(.disabled){border-color:#344899;display:-webkit-box;display:flex}:host:focus-within .input-box:not(.disabled){border:1px solid #344899;padding-right:26px}:host:focus-within .input-control-buttons:not(.disabled){border-color:#344899;display:-webkit-box;display:flex}:host .input-box{box-sizing:border-box;padding:5px 10px;font-size:14px;color:#252b3a;vertical-align:middle;border:1px solid #adb0b8;border-radius:2px;outline:0;width:100%;background-color:#fff;line-height:20px;height:32px}:host .input-control-buttons{position:absolute;right:0;width:25px;height:100%;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;border:1px solid transparent;border-left-color:#adb0b8;box-sizing:border-box;line-height:100%}:host .input-control-buttons .input-control-button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;height:50%;line-height:50%;border-width:0 1px;cursor:pointer;-webkit-transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}:host .input-control-buttons .input-control-button svg>g{fill:#252b3a}:host .input-control-buttons .input-control-button:not(.disabled):hover>svg>g{fill:#344899}.devui-input-number-lg>.input-box{font-size:18px;line-height:24px;height:46px}.devui-input-number-lg ::ng-deep .devui-svg-icon-arrow{width:16px;height:16px}.devui-input-number-sm>.input-box{font-size:12px;line-height:18px;height:30px}.devui-input-number-sm ::ng-deep .devui-svg-icon-arrow{width:13px;height:13px}.input-container{line-height:100%}"] }] } ]; /** @nocollapse */ InputNumberComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef }, { type: ElementRef } ]; }; InputNumberComponent.propDecorators = { max: [{ type: Input }], min: [{ type: Input }], step: [{ type: Input }], disabled: [{ type: Input }], size: [{ type: Input }], decimalLimit: [{ type: Input }], autoFocus: [{ type: Input }], allowEmpty: [{ type: Input }], placeholder: [{ type: Input }], maxLength: [{ type: Input }], reg: [{ type: Input }], afterValueChanged: [{ type: Output }], whileValueChanging: [{ type: Output }], incButton: [{ type: ViewChild, args: ['incButton', { static: true },] }], decButton: [{ type: ViewChild, args: ['decButton', { static: true },] }], inputElement: [{ type: ViewChild, args: ['inputElement', { static: true },] }] }; return InputNumberComponent; }()); export { InputNumberComponent }; if (false) { /** @type {?} */ InputNumberComponent.prototype.max; /** @type {?} */ InputNumberComponent.prototype.min; /** @type {?} */ InputNumberComponent.prototype.step; /** @type {?} */ InputNumberComponent.prototype.disabled; /** @type {?} */ InputNumberComponent.prototype.size; /** @type {?} */ InputNumberComponent.prototype.decimalLimit; /** @type {?} */ InputNumberComponent.prototype.autoFocus; /** @type {?} */ InputNumberComponent.prototype.allowEmpty; /** @type {?} */ InputNumberComponent.prototype.placeholder; /** @type {?} */ InputNumberComponent.prototype.maxLength; /** @type {?} */ InputNumberComponent.prototype.reg; /** @type {?} */ InputNumberComponent.prototype.afterValueChanged; /** @type {?} */ InputNumberComponent.prototype.whileValueChanging; /** @type {?} */ InputNumberComponent.prototype.incButton; /** @type {?} */ InputNumberComponent.prototype.decButton; /** @type {?} */ InputNumberComponent.prototype.inputElement; /** * @type {?} * @private */ InputNumberComponent.prototype.value; /** * @type {?} * @private */ InputNumberComponent.prototype.incListener; /** * @type {?} * @private */ InputNumberComponent.prototype.decListener; /** * @type {?} * @private */ InputNumberComponent.prototype.incAction; /** * @type {?} * @private */ InputNumberComponent.prototype.decAction; /** @type {?} */ InputNumberComponent.prototype.disabledInc; /** @type {?} */ InputNumberComponent.prototype.disabledDec; /** @type {?} */ InputNumberComponent.prototype.valueInput; /** @type {?} */ InputNumberComponent.prototype.lastEmittedValue; /** * @type {?} * @private */ InputNumberComponent.prototype.onTouchedCallback; /** * @type {?} * @private */ InputNumberComponent.prototype.onChangeCallback; /** * @type {?} * @private */ InputNumberComponent.prototype.cdr; /** * @type {?} * @private */ InputNumberComponent.prototype.el; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2lucHV0LW51bWJlci8iLCJzb3VyY2VzIjpbImlucHV0LW51bWJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBNEIsTUFBTSxNQUFNLENBQUM7O0lBRXJELG1DQUFtQyxHQUFRO0lBQy9DLE9BQU8sRUFBRSxpQkFBaUI7O0lBRTFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEsb0JBQW9CLEVBQXBCLENBQW9CLEVBQUM7SUFDbkQsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQUlEO0lBd0NFLDhCQUFvQixHQUFzQixFQUFVLEVBQWM7UUFBOUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBaEN6RCxRQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBa0IsRUFBRSxDQUFDO1FBRXpCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWIsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvQyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBVTFELGdCQUFXLEdB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Ozs7SUFBRSxrQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuY29uc3QgSU5QVVRfTlVNQkVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE51bWJlckNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWVcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIElucHV0U2l6ZVR5cGUgPSAnJyB8ICdzbScgfCAnbGcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWlucHV0LW51bWJlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LW51bWJlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbSU5QVVRfTlVNQkVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXROdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIG1heCA9IDEwMDtcclxuICBASW5wdXQoKSBtaW4gPSAwO1xyXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2l6ZTogSW5wdXRTaXplVHlwZSA9ICcnO1xyXG4gIEBJbnB1dCgpIGRlY2ltYWxMaW1pdDtcclxuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhbGxvd0VtcHR5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuICBASW5wdXQoKSBtYXhMZW5ndGggPSAwO1xyXG4gIEBJbnB1dCgpIHJlZzogUmVnRXhwIHwgc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSBhZnRlclZhbHVlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSB3aGlsZVZhbHVlQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAVmlld0NoaWxkKCdpbmNCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbmNCdXR0b246IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZGVjQnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSkgZGVjQnV0dG9uOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgaW5jTGlzdGVuZXI6IE9ic2VydmFibGU8YW55PjtcclxuICBwcml2YXRlIGRlY0xpc3RlbmVyOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgcHJpdmF0ZSBpbmNBY3Rpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGRlY0FjdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRpc2FibGVkSW5jID0gZmFsc2U7XHJcbiAgZGlzYWJsZWREZWMgPSBmYWxzZTtcclxuICB2YWx1ZUlucHV0OiBudW1iZXI7XHJcbiAgbGFzdEVtaXR0ZWRWYWx1ZTogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrID0gKHY6IGFueSkgPT4ge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrID0gKHY6IGFueSkgPT4ge1xyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy50b2dnbGVEaXNhYmxlZChpc0Rpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUobmV3VmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0RW1pdHRlZFZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5zdXJlVmFsdWVJblJhbmdlKG5ld1ZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlTXVzdEJlVmFsaWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICFpc05hTih0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wKG1pbjogbnVtYmVyLCBuOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5zdXJlVmFsdWVJblJhbmdlKHZhbHVlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcclxuICAgIGxldCBzYWZlVmFsdWU7XHJcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICBzYWZlVmFsdWUgPSB2YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsdWVNdXN0QmVWYWxpZCh2YWx1ZSkpIHtcclxuICAgICAgc2FmZVZhbHVlID0gdGhpcy5taW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgY3VycmVudFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIHNhZmVWYWx1ZSA9IHRoaXMuY2xhbXAodGhpcy5taW4sIGN1cnJlbnRWYWx1ZSwgdGhpcy5tYXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhZmVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMudmFsdWVJbnB1dCA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICB0aGlzLnN1YnNjcmliZURlY0FjdGlvbigpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZUluY0FjdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmNhbkRlY3JlYXNlKCkpIHtcclxuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRGVjQWN0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVEZWNBY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuY2FuSW5jcmVhc2UoKSkge1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVJbmNBY3Rpb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZUluY0FjdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUFjdGlvbnMoKTtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlZ2lzdGVyQmx1ckxpc3RlbmVyLmJpbmQodGhpcykpO1xyXG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWluJykgfHwgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWF4JykpIHtcclxuICAgICAgdGhpcy5jaGVja1JhbmdlVmFsdWVzKHRoaXMubWluLCB0aGlzLm1heCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcclxuICAgIGlmICh0aGlzLmluY0J1dHRvbiAmJiB0aGlzLmluY0J1dHRvbi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuaW5jTGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5pbmNCdXR0b24ubmF0aXZlRWxlbWVudCwgJ2NsaWNrJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kZWNCdXR0b24gJiYgdGhpcy5kZWNCdXR0b24ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmRlY0xpc3RlbmVyID0gZnJvbUV2ZW50KHRoaXMuZGVjQnV0dG9uLm5hdGl2ZUVsZW1lbnQsICdjbGljaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlQWN0aW9ucygpIHtcclxuICAgIHRoaXMuc3Vic2NyaWJlSW5jQWN0aW9uKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZURlY0FjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlSW5jQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgIXRoaXMuaW5jQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5jQWN0aW9uID0gdGhpcy5pbmNMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5pbmNyZWFzZVZhbHVlLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmRpc2FibGVkSW5jID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVEZWNBY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5kZWNMaXN0ZW5lciAmJiAhdGhpcy5kZWNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24gPSB0aGlzLmRlY0xpc3RlbmVyLnN1YnNjcmliZSh0aGlzLmRlY3JlYXNlVmFsdWUuYmluZCh0aGlzKSk7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWREZWMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlQWN0aW9ucygpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVJbmNBY3Rpb24oKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVEZWNBY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlSW5jQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgdGhpcy5pbmNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5pbmNBY3Rpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5pbmNBY3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc2FibGVkSW5jID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRGVjQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgdGhpcy5kZWNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc2FibGVkRGVjID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5jcmVhc2VWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLmNhbkluY3JlYXNlKCkpIHtcclxuICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSAmJiAodGhpcy52YWx1ZSA9PT0gbnVsbCB8fCB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLm1pbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZGVjaW1hbHMgPSB0aGlzLmdldE1heERlY2ltYWxzKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUocGFyc2VGbG9hdCgodGhpcy52YWx1ZSArIHRoaXMuc3RlcCkudG9GaXhlZChkZWNpbWFscykpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNyZWFzZVZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuRGVjcmVhc2UoKSkge1xyXG4gICAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWluKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBkZWNpbWFscyA9IHRoaXMuZ2V0TW