UNPKG

@neocomplexx/ngx-neo-directives-mat

Version:
221 lines 31.2 kB
import { __decorate, __metadata } from "tslib"; import { Directive, HostListener, Input, ElementRef, Renderer2, OnInit, AfterViewInit } from '@angular/core'; import { NgModel } from '@angular/forms'; let NeoDecimalNumbersDirective = class NeoDecimalNumbersDirective { constructor(el, renderer, model) { this.el = el; this.renderer = renderer; this.model = model; this.allowNullValue = false; this.decimals = 2; this.haveDecimalPoint = false; } ngOnInit() { var _a, _b; if (this.options && !this.options.apply) { return; } this.decimals = (_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.decimals) !== null && _b !== void 0 ? _b : 2; if (this.decimals == "") this.decimals = 2; if (this.allowNullValue === "") this.allowNullValue = true; this.el.nativeElement.type = "number"; this.regex = new RegExp('^[0-9]+(\\.[0-9]{0,' + this.decimals + '})?$'); } blockPaste(e) { if (this.options && !this.options.apply) { return; } const clipboardData = e.clipboardData || window['clipboardData']; let pastedData = clipboardData.getData('text/plain').split(",").join("."); let posPoint = pastedData.lastIndexOf('.'); if (posPoint > -1) { pastedData = pastedData.substring(0, posPoint).split(".").join("") + pastedData.substring(posPoint); posPoint = pastedData.lastIndexOf('.'); if (posPoint + this.decimals < pastedData.length) { pastedData = pastedData.substring(0, posPoint + this.decimals + 1); } } const onlyNumbers = Array.from(pastedData).map(x => this.isNumber(x)).reduce((prev, el) => prev && el, true); const a = this.regex.test(pastedData); setTimeout(() => { if (onlyNumbers && a) { this.el.nativeElement.value = pastedData; } else { this.el.nativeElement.value = '0'; } }, 10); } onfocus() { if (this.options && !this.options.apply) { return; } if (this.el.nativeElement.value == "0") { this.el.nativeElement.value = null; } } onBlur() { if (this.options && !this.options.apply) { return; } let current = this.el.nativeElement.value; if (current == "") { if (this.allowNullValue) { this.el.nativeElement.value = null; this.model.control.setValue(null); } else { this.el.nativeElement.value = "0"; this.model.control.setValue(0); } } else { this.el.nativeElement.type = "text"; this.el.nativeElement.type = "number"; if (this.el.nativeElement.max && this.el.nativeElement.valueAsNumber > +this.el.nativeElement.max) { this.el.nativeElement.value = this.el.nativeElement.max; this.model.control.setValue(this.el.nativeElement.valueAsNumber); } } } onKeyUp(event) { if (this.options && !this.options.apply) { return; } let current = this.el.nativeElement.value; current = current.split("-").join(""); let posPoint = current.indexOf('.'); if (posPoint > -1) { this.el.nativeElement.value = current.substring(0, posPoint + 1) + current.substring(posPoint).split(".").join(""); } if (this.haveDecimalPoint && current == "" && this.prev > "") { this.haveDecimalPoint = false; this.el.nativeElement.value = this.prev + (this.prev.endsWith(".0") ? "" : ".0"); this.el.nativeElement.type = "text"; this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1; this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length; this.el.nativeElement.type = "number"; return; } if (this.isSpecial(event) || current == "") { if (event.keyCode == 8 || current != "") { this.prev = current; const dotIndex = current.toString().indexOf('.'); if (dotIndex >= 0) this.haveDecimalPoint = false; } return; } if (!this.isNumber(event)) { event.preventDefault(); event.stopPropagation(); return false; } if (current) { current = current.toString(); const dotIndex = current.indexOf('.'); if ((dotIndex >= 0) && ((current.length - 1) - dotIndex > this.decimals)) { this.renderer.setProperty(this.el.nativeElement, 'value', current.slice(0, dotIndex + this.decimals + 1)); } } else { this.renderer.setProperty(this.el.nativeElement, 'value', this.prev); } } onKeyDown(event) { if (this.options && !this.options.apply) { return; } if (this.isSpecial(event)) { return; } if (!this.isNumber(event)) { event.preventDefault(); event.stopPropagation(); return false; } let current = this.el.nativeElement.value; if (this.isDecimalPoint(event)) { this.haveDecimalPoint = true; if (!current.endsWith(".0")) { this.el.nativeElement.value = current + ".0"; this.el.nativeElement.type = "text"; this.el.nativeElement.selectionStart = this.el.nativeElement.value.length - 1; this.el.nativeElement.selectionEnd = this.el.nativeElement.value.length; this.el.nativeElement.type = "number"; } } this.prev = current; } isSpecial(e) { return e.key === 'Delete' || (e.key === 'Tab' || e.keyCode == 9) || (e.key === 'Backspace' || e.keyCode == 8) || e.key === 'ArrowLeft' || e.altKey || e.ctrlKey || e.key === 'Home' || e.key === 'End' || e.key === 'PageDown' || e.key === 'PageUp' || e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'ArrowRight' || e.key === 'Control' || e.key === 'Alt' || e.key === 'Shift' || (e.keyIdentifier == 'Down' || e.keyIdentifier == 'Up'); } isNumber(e) { if (e instanceof KeyboardEvent) { return ((e.key >= '0' && e.key <= '9') || ((e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)) || (e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229)); } else { return ((e >= '0' && e <= '9') || (e === '.' || e === ',')); } } isDecimalPoint(e) { return (e.key === '.' || e.key === ',') || (e.keyCode === 188 || e.keyCode === 190 || e.keyCode === 229); } }; NeoDecimalNumbersDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: NgModel } ]; __decorate([ Input('isDecimal'), __metadata("design:type", Object) ], NeoDecimalNumbersDirective.prototype, "options", void 0); __decorate([ Input('allowNullValue'), __metadata("design:type", Object) ], NeoDecimalNumbersDirective.prototype, "allowNullValue", void 0); __decorate([ HostListener('paste', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [ClipboardEvent]), __metadata("design:returntype", void 0) ], NeoDecimalNumbersDirective.prototype, "blockPaste", null); __decorate([ HostListener('focus'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], NeoDecimalNumbersDirective.prototype, "onfocus", null); __decorate([ HostListener('blur'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], NeoDecimalNumbersDirective.prototype, "onBlur", null); __decorate([ HostListener('keyup', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], NeoDecimalNumbersDirective.prototype, "onKeyUp", null); __decorate([ HostListener('keydown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], NeoDecimalNumbersDirective.prototype, "onKeyDown", null); NeoDecimalNumbersDirective = __decorate([ Directive({ selector: '[isDecimal]' }), __metadata("design:paramtypes", [ElementRef, Renderer2, NgModel]) ], NeoDecimalNumbersDirective); export { NeoDecimalNumbersDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvLWRlY2ltYWxOdW1iZXJzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWRpcmVjdGl2ZXMtbWF0LyIsInNvdXJjZXMiOlsibGliL25lby1kZWNpbWFsTnVtYmVycy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVXpDLElBQWEsMEJBQTBCLEdBQXZDLE1BQWEsMEJBQTBCO0lBVW5DLFlBQW9CLEVBQWMsRUFBVSxRQUFtQixFQUFVLEtBQWM7UUFBbkUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFTO1FBUDlELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFJckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBR2pDLENBQUM7SUFFRCxRQUFROztRQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3BELElBQUksQ0FBQyxRQUFRLGVBQUcsSUFBSSxDQUFDLE9BQU8sMENBQUUsUUFBUSxtQ0FBSSxDQUFDLENBQUM7UUFFNUMsSUFBUyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFTLElBQUksQ0FBQyxjQUFjLEtBQUssRUFBRTtZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFB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RUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztxQ0FBZSxjQUFjOzs0REF5QjlEO0FBRXNCO0lBQXRCLFlBQVksQ0FBQyxPQUFPLENBQUM7Ozs7eURBTXJCO0FBRXFCO0lBQXJCLFlBQVksQ0FBQyxNQUFNLENBQUM7Ozs7d0RBb0JwQjtBQUVrQztJQUFsQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7O3FDQUFnQixhQUFhOzt5REE2QzlEO0FBRW9DO0lBQXBDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7cUNBQWtCLGFBQWE7OzJEQXdCbEU7QUF2SlEsMEJBQTBCO0lBSHRDLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxhQUFhO0tBQzFCLENBQUM7cUNBVzBCLFVBQVUsRUFBb0IsU0FBUyxFQUFpQixPQUFPO0dBVjlFLDBCQUEwQixDQTRLdEM7U0E1S1ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIElucHV0LCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSAgSURlY2ltYWxDb25mIHtcclxuICAgIGFwcGx5OiBib29sZWFuO1xyXG4gICAgZGVjaW1hbHM6IG51bWJlcjtcclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tpc0RlY2ltYWxdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTmVvRGVjaW1hbE51bWJlcnNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIEBJbnB1dCgnaXNEZWNpbWFsJykgb3B0aW9uczogSURlY2ltYWxDb25mO1xyXG4gICAgQElucHV0KCdhbGxvd051bGxWYWx1ZScpIGFsbG93TnVsbFZhbHVlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGRlY2ltYWxzOiBudW1iZXIgPSAyO1xyXG4gICAgcHJpdmF0ZSBwcmV2OiBhbnk7XHJcbiAgICBwcml2YXRlIHJlZ2V4OiBSZWdFeHA7XHJcblxyXG4gICAgcHJpdmF0ZSBoYXZlRGVjaW1hbFBvaW50ID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIG1vZGVsOiBOZ01vZGVsKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiAhdGhpcy5vcHRpb25zLmFwcGx5KSB7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZGVjaW1hbHMgPSB0aGlzLm9wdGlvbnM/LmRlY2ltYWxzID8/IDI7XHJcblxyXG4gICAgICAgIGlmICg8YW55PnRoaXMuZGVjaW1hbHMgPT0gXCJcIikgdGhpcy5kZWNpbWFscyA9IDI7XHJcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5hbGxvd051bGxWYWx1ZSA9PT0gXCJcIikgdGhpcy5hbGxvd051bGxWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiXHJcbiAgICAgICAgdGhpcy5yZWdleCA9IG5ldyBSZWdFeHAoJ15bMC05XSsoXFxcXC5bMC05XXswLCcgKyB0aGlzLmRlY2ltYWxzICsgJ30pPyQnKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pIGJsb2NrUGFzdGUoZTogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGE6IERhdGFUcmFuc2ZlciA9IGUuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3dbJ2NsaXBib2FyZERhdGEnXTtcclxuICAgICAgICBsZXQgcGFzdGVkRGF0YTogc3RyaW5nID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykuc3BsaXQoXCIsXCIpLmpvaW4oXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgcG9zUG9pbnQgPSBwYXN0ZWREYXRhLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgICAgaWYgKHBvc1BvaW50ID4gLTEpIHtcclxuICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50KS5zcGxpdChcIi5cIikuam9pbihcIlwiKSArIHBhc3RlZERhdGEuc3Vic3RyaW5nKHBvc1BvaW50KTtcclxuICAgICAgICAgICAgcG9zUG9pbnQgPSBwYXN0ZWREYXRhLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NQb2ludCArIHRoaXMuZGVjaW1hbHMgPCBwYXN0ZWREYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcGFzdGVkRGF0YSA9IHBhc3RlZERhdGEuc3Vic3RyaW5nKDAsIHBvc1BvaW50ICsgdGhpcy5kZWNpbWFscyArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbmx5TnVtYmVycyA9IEFycmF5LmZyb20ocGFzdGVkRGF0YSkubWFwKHggPT4gdGhpcy5pc051bWJlcih4KSkucmVkdWNlKChwcmV2LCBlbCkgPT4gcHJldiAmJiBlbCwgdHJ1ZSk7XHJcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucmVnZXgudGVzdChwYXN0ZWREYXRhKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9ubHlOdW1iZXJzICYmIGEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHBhc3RlZERhdGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnMCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJykgb25mb2N1cygpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1cigpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gXCJcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGxWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lbC5uYXRpdmVFbGVtZW50Lm1heCAmJiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWVBc051bWJlciA+ICt0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubWF4KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQubWF4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jb250cm9sLnNldFZhbHVlKHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZUFzTnVtYmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuYXBwbHkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc3BsaXQoXCItXCIpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgbGV0IHBvc1BvaW50ID0gY3VycmVudC5pbmRleE9mKCcuJyk7XHJcbiAgICAgICAgaWYgKHBvc1BvaW50ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gY3VycmVudC5zdWJzdHJpbmcoMCwgcG9zUG9pbnQgKyAxKSArIGN1cnJlbnQuc3Vic3RyaW5nKHBvc1BvaW50KS5zcGxpdChcIi5cIikuam9pbihcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhhdmVEZWNpbWFsUG9pbnQgJiYgY3VycmVudCA9PSBcIlwiICYmIHRoaXMucHJldiA+IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5oYXZlRGVjaW1hbFBvaW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMucHJldiArICh0aGlzLnByZXYuZW5kc1dpdGgoXCIuMFwiKSA/IFwiXCIgOiBcIi4wXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC50eXBlID0gXCJudW1iZXJcIjtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsKGV2ZW50KSB8fCBjdXJyZW50ID09IFwiXCIpIHsgXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDggfHwgY3VycmVudCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXYgPSBjdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG90SW5kZXggPSBjdXJyZW50LnRvU3RyaW5nKCkuaW5kZXhPZignLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvdEluZGV4ID49IDApIHRoaXMuaGF2ZURlY2ltYWxQb2ludCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjsgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNOdW1iZXIoZXZlbnQpKSB7IFxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBkb3RJbmRleCA9IGN1cnJlbnQuaW5kZXhPZignLicpO1xyXG4gICAgICAgICAgICBpZiAoKGRvdEluZGV4ID49IDApICYmICgoY3VycmVudC5sZW5ndGggLSAxKSAtIGRvdEluZGV4ID4gdGhpcy5kZWNpbWFscykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBjdXJyZW50LnNsaWNlKDAsIGRvdEluZGV4ICsgdGhpcy5kZWNpbWFscyArIDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0aGlzLnByZXYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgIXRoaXMub3B0aW9ucy5hcHBseSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTcGVjaWFsKGV2ZW50KSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTnVtYmVyKGV2ZW50KSkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBjdXJyZW50OiBzdHJpbmcgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRGVjaW1hbFBvaW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhdmVEZWNpbWFsUG9pbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQuZW5kc1dpdGgoXCIuMFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gY3VycmVudCArIFwiLjBcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJldiA9IGN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1NwZWNpYWwoZTogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBlLmtleSA9PT0gJ0RlbGV0ZScgfHwgKGUua2V5ID09PSAnVGFiJyB8fCBlLmtleUNvZGUgPT0gOSkgfHwgKGUua2V5ID09PSAnQmFja3NwYWNlJyB8fCBlLmtleUNvZGUgPT0gOCkgfHwgZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8XHJcbiAgICAgICAgICAgIGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLmtleSA9PT0gJ0hvbWUnIHx8IGUua2V5ID09PSAnRW5kJyB8fCBlLmtleSA9PT0gJ1BhZ2VEb3duJyB8fCBlLmtleSA9PT0gJ1BhZ2VVcCcgfHxcclxuICAgICAgICAgICAgZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcgfHwgZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0NvbnRyb2wnIHx8IGUua2V5ID09PSAnQWx0JyB8fCBlLmtleSA9PT0gJ1NoaWZ0JyB8fFxyXG4gICAgICAgICAgICAoKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnRG93bicgfHwgKDxhbnk+ZSkua2V5SWRlbnRpZmllciA9PSAnVXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTnVtYmVyKGU6IEtleWJvYXJkRXZlbnQgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICgoZS5rZXkgPj0gJzAnICYmIGUua2V5IDw9ICc5JykgfHwgKChlLmtleUNvZGUgPj0gNDggJiYgZS5rZXlDb2RlIDw9IDU3KSB8fCAoZS5rZXlDb2RlID49IDk2ICYmIGUua2V5Q29kZSA8PSAxMDUpKSB8fCBcclxuICAgICAgICAgICAgICAgICAgICAoZS5rZXkgPT09ICcuJyB8fCBlLmtleSA9PT0gJywnKSB8fCAoZS5rZXlDb2RlID09PSAxODggfHwgZS5rZXlDb2RlID09PSAxOTAgfHwgZS5rZXlDb2RlID09PSAyMjkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gKChlID49ICcwJyAmJiBlIDw9ICc5JykgfHwgKGUgPT09ICcuJyB8fCBlID09PSAnLCcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0RlY2ltYWxQb2ludChlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChlLmtleSA9PT0gJy4nIHx8IGUua2V5ID09PSAnLCcpIHx8IChlLmtleUNvZGUgPT09IDE4OCB8fCBlLmtleUNvZGUgPT09IDE5MCB8fCBlLmtleUNvZGUgPT09IDIyOSk7XHJcbiAgICB9XHJcbn1cclxuIl19