ng-spin-box
Version:
<h2>Spinbox Directive for Angular.</h2>
298 lines • 38.9 kB
JavaScript
import * as tslib_1 from "tslib";
import { Directive, ElementRef, Input, HostListener, Renderer2, Output, EventEmitter } from '@angular/core';
var SpinBoxDirective = /** @class */ (function () {
function SpinBoxDirective(el, renderer) {
this.el = el;
this.renderer = renderer;
this._hasFocus = false;
this.valueToBeSet = 0;
this.changeByMouse = new EventEmitter();
this._initView();
}
Object.defineProperty(SpinBoxDirective.prototype, "_isDisabled", {
get: function () {
return this.el.nativeElement.disabled;
},
enumerable: true,
configurable: true
});
SpinBoxDirective.prototype._initView = function () {
var _this = this;
var node = this.el.nativeElement;
var parent = node.parentNode;
// Create Wrapper Element
var wrapper = this.renderer.createElement('div');
this.renderer.addClass(wrapper, 'ng-spin-box-wrapper');
this.renderer.setAttribute(wrapper, 'style', "\n position: relative;\n display: inline-block;\n ");
// Wrap Input in our Custom Wrapper
this.renderer.appendChild(wrapper, node);
this.renderer.appendChild(parent, wrapper);
// Add Up/Down Buttons for UserInteraction
var buttonUp = this.renderer.createElement('button');
this.renderer.appendChild(wrapper, buttonUp);
this.renderer.addClass(buttonUp, 'ng-spin-box-btn-up');
this.renderer.listen(buttonUp, 'click', function (e) { _this._clickSpinBoxButton(e, true); });
this.renderer.setAttribute(buttonUp, 'tabIndex', '-1');
this.renderer.setAttribute(buttonUp, 'style', "\n position: absolute;\n top: 0;\n right: 0;\n height: 50%;\n ");
// Add Up/Down Buttons for UserInteraction
var buttonDown = this.renderer.createElement('button');
this.renderer.appendChild(wrapper, buttonDown);
this.renderer.addClass(buttonDown, 'ng-spin-box-btn-down');
this.renderer.listen(buttonDown, 'click', function (e) { _this._clickSpinBoxButton(e, false); });
this.renderer.setAttribute(buttonDown, 'tabIndex', '-1');
this.renderer.setAttribute(buttonDown, 'style', "\n position: absolute;\n bottom: 0;\n right: 0;\n height: 50%;\n ");
};
SpinBoxDirective.prototype._clickSpinBoxButton = function (event, shouldInrease) {
event.preventDefault();
event.stopPropagation();
if (!this._isDisabled) {
this.el.nativeElement.focus();
this._increaseDecreaseValue(shouldInrease);
}
};
/**
* Increase Decrease Value of SpinBox
* @param shouldInrease If true, increase the Value,
* Else Decrease the Value.
*/
SpinBoxDirective.prototype._increaseDecreaseValue = function (shouldInrease) {
var valueStr = this.el.nativeElement.value;
var value = +(valueStr || 0);
var precision = +(this.decimal || 0);
/**
* Add Decimal logic
*/
var multiplier = Math.pow(10, (precision + 2));
var decimalValue = value * multiplier;
decimalValue = +decimalValue.toFixed(precision + 2);
var step = (+this.step) || 1;
// Get Cursor Position
var cursorPosition = this.el.nativeElement.selectionStart;
var decimalPosition = valueStr.indexOf(this._getDecimalSeparator);
var cursorFactor = (cursorPosition - decimalPosition);
// Convert String type values to boolean, to stop the need of Data Binding
var shouldSnapToStep = typeof this.snapToStep === 'string' ? JSON.parse(this.snapToStep) : this.snapToStep;
if (shouldInrease) {
if (this.stepAtCursor && (cursorPosition <= valueStr.length - 2)) {
var stepMultiplier = Math.pow(10, (precision + 2) - cursorFactor);
decimalValue += (1 * stepMultiplier);
}
else {
if (shouldSnapToStep) {
var decimalVal = Math.round((decimalValue) / (step * multiplier)) * (step * multiplier);
if (decimalVal > (decimalValue)) {
decimalVal -= (step * multiplier);
}
decimalValue = (decimalVal) + (step * multiplier);
}
else {
decimalValue += (step * multiplier);
}
}
}
else {
// if (this.stepAtCursor && (cursorPosition > decimalPosition && cursorPosition <= valueStr.length - 2)) {
if (this.stepAtCursor && (cursorPosition <= valueStr.length - 2)) {
var stepMultiplier = Math.pow(10, (precision + 2) - cursorFactor);
decimalValue -= (1 * stepMultiplier);
}
else {
if (shouldSnapToStep) {
var decimalVal = Math.round((decimalValue) / (step * multiplier)) * (step * multiplier);
if (decimalVal < (decimalValue)) {
decimalVal += (step * multiplier);
}
decimalValue = (decimalVal) - (step * multiplier);
}
else {
decimalValue -= (step * multiplier);
}
}
}
var finalValue = (decimalValue / multiplier).toFixed(precision);
// If input value is entered out of bounds, then upon scrolling it, it jumps to a value within bounds.
if ((+finalValue) >= (+this.min || -Infinity) && (+finalValue) <= (+this.max || Infinity)) {
this.valueToBeSet = +finalValue;
}
else if ((+finalValue) < (+this.min || -Infinity)) {
this.valueToBeSet = this.min;
}
else if ((+finalValue) > (+this.max || Infinity)) {
this.valueToBeSet = this.max;
}
if (this.changeByMouse) {
this.changeByMouse.emit(finalValue);
}
// Value to be set needs to be string
var valueToBeSetStr = (+this.valueToBeSet).toFixed(precision);
this.renderer.setProperty(this.el.nativeElement, 'value', valueToBeSetStr);
// Trigger Input Event
var event;
try {
event = new Event('input', { bubbles: true, cancelable: false });
}
catch (e) {
event = document.createEvent('Event');
event.initEvent('input', true, false);
}
// dispatch the event
this.el.nativeElement.dispatchEvent(event);
if (valueStr.indexOf(this._getDecimalSeparator) !== -1) {
this.el.nativeElement.selectionStart = cursorPosition;
this.el.nativeElement.selectionEnd = cursorPosition;
}
};
SpinBoxDirective.prototype.onFocus = function () {
this._hasFocus = true;
};
SpinBoxDirective.prototype.onBlur = function () {
var setLimitOnBlur = typeof this.setLimitOnBlur === 'string' ? JSON.parse(this.setLimitOnBlur) : this.setLimitOnBlur;
if (setLimitOnBlur) {
this._hasFocus = false;
// On blur, if the entered values is out of bounds, it should jump within bounds
var value = +(this.el.nativeElement.value || 0);
var shouldInrease = false;
if (value > this.max) {
this._increaseDecreaseValue(shouldInrease);
}
else if (value < this.min) {
shouldInrease = true;
this._increaseDecreaseValue(shouldInrease);
}
}
};
SpinBoxDirective.prototype.onMouseWheel = function (event) {
event.preventDefault();
if (!this._hasFocus || this._isDisabled) {
return;
}
(event.deltaY > 0) ? this._increaseDecreaseValue(false) : this._increaseDecreaseValue(true);
};
SpinBoxDirective.prototype.onKeydown = function (event) {
var key = event.key;
var cursorPosition = this.el.nativeElement.selectionStart;
// console.log('The Event triggered', key, event);
if (key === 'ArrowUp' || key === 'Up') {
if (event.shiftKey) {
return;
}
else {
this._increaseDecreaseValue(true);
}
}
else if (key === 'ArrowDown' || key === 'Down') {
if (event.shiftKey) {
return;
}
else {
this._increaseDecreaseValue(false);
}
}
// Allow special key presses
if (event.ctrlKey || event.metaKey ||
key === 'ArrowLeft' || key === 'ArrowRight' || key === 'Backspace' ||
key === 'Delete' || key === 'Tab' || key === 'Left' || key === 'Right') {
return;
}
// Allow a minus sign if the value can be negative
if (key === '-' && cursorPosition === 0 && (this.min && this.min < 0)) {
return;
}
// Allow Entry with valid Precision
if (this._checkPrecision(key)) {
return;
}
// Allow digits
// if ((/[0-9]/g).test(key)) {
// return;
// }
// Prevent the default action
event.preventDefault();
};
Object.defineProperty(SpinBoxDirective.prototype, "_getDecimalSeparator", {
get: function () {
var number = 1.1;
return number.toLocaleString().substring(1, 2);
},
enumerable: true,
configurable: true
});
SpinBoxDirective.prototype._checkPrecision = function (key) {
var decimal = (+this.decimal) || 0;
var refElement = this.el.nativeElement;
var value = refElement.value.substr(0, refElement.selectionStart) + key + refElement.value.substr(refElement.selectionEnd);
var regexString = '^\\d+\\' + this._getDecimalSeparator + '?\\d{0,' + decimal + '}$';
return new RegExp(regexString, 'g').test(value);
};
SpinBoxDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 }
]; };
tslib_1.__decorate([
Input('min'),
tslib_1.__metadata("design:type", Number)
], SpinBoxDirective.prototype, "min", void 0);
tslib_1.__decorate([
Input('max'),
tslib_1.__metadata("design:type", Number)
], SpinBoxDirective.prototype, "max", void 0);
tslib_1.__decorate([
Input('step'),
tslib_1.__metadata("design:type", Number)
], SpinBoxDirective.prototype, "step", void 0);
tslib_1.__decorate([
Input('decimal'),
tslib_1.__metadata("design:type", Number)
], SpinBoxDirective.prototype, "decimal", void 0);
tslib_1.__decorate([
Input('snapToStep'),
tslib_1.__metadata("design:type", Boolean)
], SpinBoxDirective.prototype, "snapToStep", void 0);
tslib_1.__decorate([
Input('stepAtCursor'),
tslib_1.__metadata("design:type", Boolean)
], SpinBoxDirective.prototype, "stepAtCursor", void 0);
tslib_1.__decorate([
Input('setLimitOnBlur'),
tslib_1.__metadata("design:type", Boolean)
], SpinBoxDirective.prototype, "setLimitOnBlur", void 0);
tslib_1.__decorate([
Output('changeByMouse'),
tslib_1.__metadata("design:type", EventEmitter)
], SpinBoxDirective.prototype, "changeByMouse", void 0);
tslib_1.__decorate([
HostListener('focus'),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", []),
tslib_1.__metadata("design:returntype", void 0)
], SpinBoxDirective.prototype, "onFocus", null);
tslib_1.__decorate([
HostListener('blur'),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", []),
tslib_1.__metadata("design:returntype", void 0)
], SpinBoxDirective.prototype, "onBlur", null);
tslib_1.__decorate([
HostListener('wheel', ['$event']),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [WheelEvent]),
tslib_1.__metadata("design:returntype", void 0)
], SpinBoxDirective.prototype, "onMouseWheel", null);
tslib_1.__decorate([
HostListener('keydown', ['$event']),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [KeyboardEvent]),
tslib_1.__metadata("design:returntype", void 0)
], SpinBoxDirective.prototype, "onKeydown", null);
SpinBoxDirective = tslib_1.__decorate([
Directive({
// tslint:disable-next-line
selector: '[ngSpinBox]'
}),
tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2])
], SpinBoxDirective);
return SpinBoxDirective;
}());
export { SpinBoxDirective };
// this.renderer.setElementProperty(this.el.nativeElement, 'value', validString);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbi1ib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctc3Bpbi1ib3gvIiwic291cmNlcyI6WyJzcmMvYXBwL25nLXNwaW4tYm94L3NwaW4tYm94LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU81RztJQWVFLDBCQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFMdkQsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVRLGtCQUFhLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHaEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxzQkFBSSx5Q0FBVzthQUFmO1lBQ0UsTUFBTSxDQUFvQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWMsQ0FBQyxRQUFRLENBQUM7UUFDNUQsQ0FBQzs7O09BQUE7SUFFTyxvQ0FBUyxHQUFqQjtRQUFBLGlCQXdDQztRQXZDQyxJQUFNLElBQUksR0FBcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDckQsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMvQix5QkFBeUI7UUFDekIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxpRUFHNUMsQ0FB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bVE3QixpRkFBaUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIHNlbGVjdG9yOiAnW25nU3BpbkJveF0nXG59KVxuZXhwb3J0IGNsYXNzIFNwaW5Cb3hEaXJlY3RpdmUge1xuXG4gIEBJbnB1dCgnbWluJykgbWluOiBudW1iZXI7XG4gIEBJbnB1dCgnbWF4JykgbWF4OiBudW1iZXI7XG4gIEBJbnB1dCgnc3RlcCcpIHN0ZXA6IG51bWJlcjtcbiAgQElucHV0KCdkZWNpbWFsJykgZGVjaW1hbDogbnVtYmVyO1xuICBASW5wdXQoJ3NuYXBUb1N0ZXAnKSBzbmFwVG9TdGVwOiBib29sZWFuO1xuICBASW5wdXQoJ3N0ZXBBdEN1cnNvcicpIHN0ZXBBdEN1cnNvcjogYm9vbGVhbjtcbiAgQElucHV0KCdzZXRMaW1pdE9uQmx1cicpIHNldExpbWl0T25CbHVyOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2hhc0ZvY3VzID0gZmFsc2U7XG4gIHZhbHVlVG9CZVNldCA9IDA7XG5cbiAgQE91dHB1dCgnY2hhbmdlQnlNb3VzZScpIGNoYW5nZUJ5TW91c2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuX2luaXRWaWV3KCk7XG4gIH1cblxuICBnZXQgX2lzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLmRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFZpZXcoKSB7XG4gICAgY29uc3Qgbm9kZSA9IDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gQ3JlYXRlIFdyYXBwZXIgRWxlbWVudFxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Mod3JhcHBlciwgJ25nLXNwaW4tYm94LXdyYXBwZXInKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh3cmFwcGVyLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgYCk7XG5cbiAgICAvLyBXcmFwIElucHV0IGluIG91ciBDdXN0b20gV3JhcHBlclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQod3JhcHBlciwgbm9kZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnQsIHdyYXBwZXIpO1xuXG4gICAgLy8gQWRkIFVwL0Rvd24gQnV0dG9ucyBmb3IgVXNlckludGVyYWN0aW9uXG4gICAgY29uc3QgYnV0dG9uVXAgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQod3JhcHBlciwgYnV0dG9uVXApO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uVXAsICduZy1zcGluLWJveC1idG4tdXAnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihidXR0b25VcCwgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7IHRoaXMuX2NsaWNrU3BpbkJveEJ1dHRvbihlLCB0cnVlKTsgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnV0dG9uVXAsICd0YWJJbmRleCcsICctMScpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvblVwLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGhlaWdodDogNTAlO1xuICAgIGApO1xuXG4gICAgLy8gQWRkIFVwL0Rvd24gQnV0dG9ucyBmb3IgVXNlckludGVyYWN0aW9uXG4gICAgY29uc3QgYnV0dG9uRG93biA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh3cmFwcGVyLCBidXR0b25Eb3duKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbkRvd24sICduZy1zcGluLWJveC1idG4tZG93bicpO1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGJ1dHRvbkRvd24sICdjbGljaycsIChlOiBFdmVudCkgPT4geyB0aGlzLl9jbGlja1NwaW5Cb3hCdXR0b24oZSwgZmFsc2UpOyB9KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b25Eb3duLCAndGFiSW5kZXgnLCAnLTEnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b25Eb3duLCAnc3R5bGUnLCBgXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDA7XG4gICAgICByaWdodDogMDtcbiAgICAgIGhlaWdodDogNTAlO1xuICAgIGApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xpY2tTcGluQm94QnV0dG9uKGV2ZW50OiBFdmVudCwgc2hvdWxkSW5yZWFzZTogYm9vbGVhbikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9pc0Rpc2FibGVkKSB7XG4gICAgICAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5lbC5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xuICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHNob3VsZElucmVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZWFzZSBEZWNyZWFzZSBWYWx1ZSBvZiBTcGluQm94XG4gICAqIEBwYXJhbSBzaG91bGRJbnJlYXNlIElmIHRydWUsIGluY3JlYXNlIHRoZSBWYWx1ZSxcbiAgICogRWxzZSBEZWNyZWFzZSB0aGUgVmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9pbmNyZWFzZURlY3JlYXNlVmFsdWUoc2hvdWxkSW5yZWFzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHZhbHVlU3RyID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCkudmFsdWU7XG4gICAgY29uc3QgdmFsdWU6IG51bWJlciB8IHN0cmluZyA9ICsodmFsdWVTdHIgfHwgMCk7XG5cbiAgICBjb25zdCBwcmVjaXNpb24gPSArKHRoaXMuZGVjaW1hbCB8fCAwKTtcbiAgICAvKipcbiAgICAgKiBBZGQgRGVjaW1hbCBsb2dpY1xuICAgICAqL1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpKTtcbiAgICBsZXQgZGVjaW1hbFZhbHVlID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgIGRlY2ltYWxWYWx1ZSA9ICtkZWNpbWFsVmFsdWUudG9GaXhlZChwcmVjaXNpb24gKyAyKTtcblxuICAgIGNvbnN0IHN0ZXAgPSAoK3RoaXMuc3RlcCkgfHwgMTtcblxuICAgIC8vIEdldCBDdXJzb3IgUG9zaXRpb25cbiAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9ICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGRlY2ltYWxQb3NpdGlvbiA9IHZhbHVlU3RyLmluZGV4T2YodGhpcy5fZ2V0RGVjaW1hbFNlcGFyYXRvcik7XG4gICAgY29uc3QgY3Vyc29yRmFjdG9yID0gKGN1cnNvclBvc2l0aW9uIC0gZGVjaW1hbFBvc2l0aW9uKTtcblxuICAgIC8vIENvbnZlcnQgU3RyaW5nIHR5cGUgdmFsdWVzIHRvIGJvb2xlYW4sIHRvIHN0b3AgdGhlIG5lZWQgb2YgRGF0YSBCaW5kaW5nXG4gICAgY29uc3Qgc2hvdWxkU25hcFRvU3RlcCA9IHR5cGVvZiB0aGlzLnNuYXBUb1N0ZXAgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh0aGlzLnNuYXBUb1N0ZXApIDogdGhpcy5zbmFwVG9TdGVwO1xuXG4gICAgaWYgKHNob3VsZElucmVhc2UpIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgICAgY29uc3Qgc3RlcE11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpIC0gY3Vyc29yRmFjdG9yKTtcbiAgICAgICAgZGVjaW1hbFZhbHVlICs9ICgxICogc3RlcE11bHRpcGxpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZFNuYXBUb1N0ZXApIHtcbiAgICAgICAgICBsZXQgZGVjaW1hbFZhbCA9IE1hdGgucm91bmQoKGRlY2ltYWxWYWx1ZSkgLyAoc3RlcCAqIG11bHRpcGxpZXIpKSAqIChzdGVwICogbXVsdGlwbGllcik7XG4gICAgICAgICAgaWYgKGRlY2ltYWxWYWwgPiAoZGVjaW1hbFZhbHVlKSkge1xuICAgICAgICAgICAgZGVjaW1hbFZhbCAtPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNpbWFsVmFsdWUgPSAoZGVjaW1hbFZhbCkgKyAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlY2ltYWxWYWx1ZSArPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPiBkZWNpbWFsUG9zaXRpb24gJiYgY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgIGlmICh0aGlzLnN0ZXBBdEN1cnNvciAmJiAoY3Vyc29yUG9zaXRpb24gPD0gdmFsdWVTdHIubGVuZ3RoIC0gMikpIHtcbiAgICAgICAgY29uc3Qgc3RlcE11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgKHByZWNpc2lvbiArIDIpIC0gY3Vyc29yRmFjdG9yKTtcbiAgICAgICAgZGVjaW1hbFZhbHVlIC09ICgxICogc3RlcE11bHRpcGxpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZFNuYXBUb1N0ZXApIHtcbiAgICAgICAgICBsZXQgZGVjaW1hbFZhbCA9IE1hdGgucm91bmQoKGRlY2ltYWxWYWx1ZSkgLyAoc3RlcCAqIG11bHRpcGxpZXIpKSAqIChzdGVwICogbXVsdGlwbGllcik7XG4gICAgICAgICAgaWYgKGRlY2ltYWxWYWwgPCAoZGVjaW1hbFZhbHVlKSkge1xuICAgICAgICAgICAgZGVjaW1hbFZhbCArPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWNpbWFsVmFsdWUgPSAoZGVjaW1hbFZhbCkgLSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlY2ltYWxWYWx1ZSAtPSAoc3RlcCAqIG11bHRpcGxpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxWYWx1ZSA9IChkZWNpbWFsVmFsdWUgLyBtdWx0aXBsaWVyKS50b0ZpeGVkKHByZWNpc2lvbik7XG5cbiAgICAvLyBJZiBpbnB1dCB2YWx1ZSBpcyBlbnRlcmVkIG91dCBvZiBib3VuZHMsIHRoZW4gdXBvbiBzY3JvbGxpbmcgaXQsIGl0IGp1bXBzIHRvIGEgdmFsdWUgd2l0aGluIGJvdW5kcy5cbiAgICBpZiAoKCtmaW5hbFZhbHVlKSA+PSAoK3RoaXMubWluIHx8IC1JbmZpbml0eSkgJiYgKCtmaW5hbFZhbHVlKSA8PSAoK3RoaXMubWF4IHx8IEluZmluaXR5KSkge1xuICAgICAgdGhpcy52YWx1ZVRvQmVTZXQgPSArZmluYWxWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKCgrZmluYWxWYWx1ZSkgPCAoK3RoaXMubWluIHx8IC1JbmZpbml0eSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0JlU2V0ID0gdGhpcy5taW47XG4gICAgfSBlbHNlIGlmICgoK2ZpbmFsVmFsdWUpID4gKCt0aGlzLm1heCB8fCBJbmZpbml0eSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0JlU2V0ID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoYW5nZUJ5TW91c2UpIHtcbiAgICAgIHRoaXMuY2hhbmdlQnlNb3VzZS5lbWl0KGZpbmFsVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFZhbHVlIHRvIGJlIHNldCBuZWVkcyB0byBiZSBzdHJpbmdcbiAgICBjb25zdCB2YWx1ZVRvQmVTZXRTdHIgPSAoK3RoaXMudmFsdWVUb0JlU2V0KS50b0ZpeGVkKHByZWNpc2lvbik7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlVG9CZVNldFN0cik7XG5cbiAgICAvLyBUcmlnZ2VyIElucHV0IEV2ZW50XG4gICAgbGV0IGV2ZW50O1xuICAgIHRyeSB7XG4gICAgICBldmVudCA9IG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IGZhbHNlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2lucHV0JywgdHJ1ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudFxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmICh2YWx1ZVN0ci5pbmRleE9mKHRoaXMuX2dldERlY2ltYWxTZXBhcmF0b3IpICE9PSAtMSkge1xuICAgICAgKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCkuc2VsZWN0aW9uU3RhcnQgPSBjdXJzb3JQb3NpdGlvbjtcbiAgICAgICg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdGlvbkVuZCA9IGN1cnNvclBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJykgb25Gb2N1cygpIHtcbiAgICB0aGlzLl9oYXNGb2N1cyA9IHRydWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyKCkge1xuICAgIGNvbnN0IHNldExpbWl0T25CbHVyID0gdHlwZW9mIHRoaXMuc2V0TGltaXRPbkJsdXIgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh0aGlzLnNldExpbWl0T25CbHVyKSA6IHRoaXMuc2V0TGltaXRPbkJsdXI7XG4gICAgaWYgKHNldExpbWl0T25CbHVyKSB7XG4gICAgICB0aGlzLl9oYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgLy8gT24gYmx1ciwgaWYgdGhlIGVudGVyZWQgdmFsdWVzIGlzIG91dCBvZiBib3VuZHMsIGl0IHNob3VsZCBqdW1wIHdpdGhpbiBib3VuZHNcbiAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgPSArKCg8SFRNTElucHV0RWxlbWVudD50aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnZhbHVlIHx8IDApO1xuICAgICAgbGV0IHNob3VsZElucmVhc2UgPSBmYWxzZTtcbiAgICAgIGlmICh2YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICAgIHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZShzaG91bGRJbnJlYXNlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgICBzaG91bGRJbnJlYXNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHNob3VsZElucmVhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3doZWVsJywgWyckZXZlbnQnXSkgb25Nb3VzZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2hhc0ZvY3VzIHx8IHRoaXMuX2lzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKGV2ZW50LmRlbHRhWSA+IDApID8gdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKGZhbHNlKSA6IHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZSh0cnVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5lbC5uYXRpdmVFbGVtZW50KS5zZWxlY3Rpb25TdGFydDtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgRXZlbnQgdHJpZ2dlcmVkJywga2V5LCBldmVudCk7XG5cbiAgICBpZiAoa2V5ID09PSAnQXJyb3dVcCcgfHwga2V5ID09PSAnVXAnKSB7XG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5jcmVhc2VEZWNyZWFzZVZhbHVlKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dEb3duJyB8fCBrZXkgPT09ICdEb3duJykge1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luY3JlYXNlRGVjcmVhc2VWYWx1ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgc3BlY2lhbCBrZXkgcHJlc3Nlc1xuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHxcbiAgICAgIGtleSA9PT0gJ0Fycm93TGVmdCcgfHwga2V5ID09PSAnQXJyb3dSaWdodCcgfHwga2V5ID09PSAnQmFja3NwYWNlJyB8fFxuICAgICAga2V5ID09PSAnRGVsZXRlJyB8fCBrZXkgPT09ICdUYWInIHx8IGtleSA9PT0gJ0xlZnQnIHx8IGtleSA9PT0gJ1JpZ2h0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGEgbWludXMgc2lnbiBpZiB0aGUgdmFsdWUgY2FuIGJlIG5lZ2F0aXZlXG4gICAgaWYgKGtleSA9PT0gJy0nICYmIGN1cnNvclBvc2l0aW9uID09PSAwICYmICh0aGlzLm1pbiAmJiB0aGlzLm1pbiA8IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgRW50cnkgd2l0aCB2YWxpZCBQcmVjaXNpb25cbiAgICBpZiAodGhpcy5fY2hlY2tQcmVjaXNpb24oa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGRpZ2l0c1xuICAgIC8vIGlmICgoL1swLTldL2cpLnRlc3Qoa2V5KSkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYWN0aW9uXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2dldERlY2ltYWxTZXBhcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gMS4xO1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKS5zdWJzdHJpbmcoMSwgMik7XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1ByZWNpc2lvbihrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGRlY2ltYWwgPSAoK3RoaXMuZGVjaW1hbCkgfHwgMDtcbiAgICBjb25zdCByZWZFbGVtZW50ID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWUgPSByZWZFbGVtZW50LnZhbHVlLnN1YnN0cigwLCByZWZFbGVtZW50LnNlbGVjdGlvblN0YXJ0KSArIGtleSArIHJlZkVsZW1lbnQudmFsdWUuc3Vic3RyKHJlZkVsZW1lbnQuc2VsZWN0aW9uRW5kKTtcbiAgICBjb25zdCByZWdleFN0cmluZyA9ICdeXFxcXGQrXFxcXCcgKyB0aGlzLl9nZXREZWNpbWFsU2VwYXJhdG9yICsgJz9cXFxcZHswLCcgKyBkZWNpbWFsICsgJ30kJztcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleFN0cmluZywgJ2cnKS50ZXN0KHZhbHVlKTtcbiAgfVxuXG59XG4vLyB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbGlkU3RyaW5nKTtcbiJdfQ==