truly-ui
Version:
Web Components for Desktop Applications.
507 lines • 61.8 kB
JavaScript
import { KeyEvent } from '../../core/enums/key-events';
import { Subject } from 'rxjs';
export class InputMask {
constructor(element, renderer, maskValue) {
this.renderer = renderer;
// Desativa a mascara dos Input preenchendo com Underline ( _ )
this.maskGuides = false;
this.addNinthDigit = false;
this.shiftStart = '';
this.maskSpecialCharacters = ['/', '(', ')', '.', ':', '-', ' ', '+'];
this.maskAwaliablePatterns = {
'0': /\d/,
'9': /\d/,
'H': /[0-1-2]/,
'h': /[0-9]/,
'M': /[0-5]/,
'm': /[0-9]/,
'A': /[a-zA-Z]/,
};
this.tlInput = element;
this.input = element.input;
this.setMaskExpression(maskValue);
this.initializeMask();
this.complete = new Subject();
}
setMaskExpression(value) {
if (!value) {
return;
}
if (typeof value === 'string') {
this.maskExpression = value;
return;
}
if (value['guides'] === false) {
this.maskGuides = value['guides'];
}
if (value['addNinthDigit']) {
this.addNinthDigit = value['addNinthDigit'];
}
this.literalChar = value['withLiteralChar'];
this.valueUppercase = value['uppercase'];
this.maskExpression = value['mask'];
}
get value() {
return this.input.nativeElement.value;
}
set value(value) {
this.input.nativeElement.value = value;
}
initializeMask() {
this.initializeOnFocus();
this.generateMaskGuideExpression();
this.applyMaskOnInit();
this.setPlaceholder();
this.setValidation();
this.onKeyPressInputListener();
this.onMouseUpInputListener();
this.onKeyDownInputListener();
this.onPastListener();
}
onPastListener() {
this.renderer.listen(this.input.nativeElement, 'paste', ($event) => {
const clipboardData = $event.clipboardData || window['clipboardData'];
let value = clipboardData
.getData('text')
.replace(/ /g, '')
.replace(/[^\w\s]/gi, '');
value = this.handleAddNinthDigit(value);
this.applyMask(value, false);
});
}
handleAddNinthDigit(value) {
if (this.addNinthDigit) {
if (value.length <= 10) {
value = value.slice(0, 2) + '9' + value.slice(2);
}
}
return value;
}
onKeyPressInputListener() {
this.renderer.listen(this.input.nativeElement, 'keypress', $event => {
this.handleKeypress($event);
this.updateModel();
this.onComplete();
});
}
onMouseUpInputListener() {
this.renderer.listen(this.input.nativeElement, 'mouseup', $event => {
$event.stopPropagation();
this.getPosition();
});
}
onKeyDownInputListener() {
this.renderer.listen(this.input.nativeElement, 'keydown', $event => {
switch ($event.code) {
case KeyEvent.BACKSPACE:
this.handleBackspace($event);
break;
case KeyEvent.DELETE:
this.handleDelete($event);
break;
case KeyEvent.ARROWRIGHT:
this.handleArrowRight($event);
break;
case KeyEvent.ARROWLEFT:
this.handleArrowLeft($event);
break;
case KeyEvent.HOME:
this.handleHome($event);
break;
case KeyEvent.END:
this.handleEnd($event);
break;
case 'KeyA':
this.handleSelectAll($event);
break;
}
});
}
isDateString(x) {
return !isNaN(Date.parse(x));
}
applyMaskOnInit() {
setTimeout(() => {
if (this.value !== this.maskGuideExpression) {
if (this.value.length > 0) {
if (this.isDateString(this.value)) {
return;
}
this.value = this.cleanValue(this.value);
this.setValueOnInitialize();
this.applyGuides();
this.applyMask();
}
}
}, 10);
}
getPosition() {
this.startPosition = this.input.nativeElement.selectionStart;
this.endPosition = this.input.nativeElement.selectionEnd;
}
initializeOnFocus() {
this.renderer.listen(this.input.nativeElement, 'focus', () => {
this.onFocus();
});
this.renderer.listen(this.input.nativeElement, 'focusout', () => {
this.handleNotMath();
});
}
onFocus() {
this.applyGuides();
setTimeout(() => {
if (!this.isTextLengthMatchWithExpressionLength()) {
this.setPosition(0);
}
else {
this.setPosition(0, this.value.length);
}
}, 0);
}
handleNotMath() {
if (!this.isTextLengthMatchWithExpressionLength()) {
this.value = '';
this.updateModel();
this.tlInput.value = '';
}
}
handleBackspace(event) {
const value = this.value;
const start = this.input.nativeElement.selectionStart;
const endPosition = this.input.nativeElement.selectionEnd;
const valueArray = value.split('');
this.getPosition();
if (this.hasTextSelected(this.startPosition, this.endPosition)) {
event.preventDefault();
this.deleteTextOnKeyPress(valueArray, this.startPosition, this.endPosition);
return;
}
if (this.maskGuides) {
event.preventDefault();
if (this.isCharBeforeEqualMaskGuide(value, endPosition)) {
this.jumpCharMask(start, endPosition);
}
else {
this.deleteTextOnKeyPress(valueArray, start, endPosition);
}
}
this.updateModel();
this.onComplete();
}
handleDelete(event) {
const valueArray = this.value.split('');
const self = this;
this.getPosition();
event.preventDefault();
if (this.maskGuides) {
if (this.hasTextSelected(this.startPosition, this.endPosition)) {
this.deleteTextOnKeyPress(valueArray, this.startPosition, this.endPosition);
}
else {
this.value = this.deleteCharOnDeleteKey(valueArray);
this.setPosition(self.endPosition);
}
}
this.updateModel();
this.onComplete();
}
handleKeypress(event) {
const charInputted = event.key;
let inputArray = this.value.split('');
if (event.key === 'Enter') {
return;
}
if (this.hasTextSelected(this.startPosition, this.endPosition)) {
this.deleteTextOnKeyPress(inputArray, this.startPosition, this.endPosition);
this.setPosition(this.startPosition);
inputArray = this.value.split('');
}
if (this.maskGuides) {
this.getPosition();
this.replaceValidChar(charInputted, this.getCursorPosition(this.endPosition), inputArray);
event.preventDefault();
}
else {
this.applyMask(charInputted);
event.preventDefault();
}
}
handleArrowRight(event) {
this.getPosition();
if (event.shiftKey) {
this.setShiftKey('Right');
event.preventDefault();
if (this.shiftStart === 'Left') {
this.setPosition(this.startPosition + 1, this.endPosition);
}
else {
this.setPosition(this.startPosition, this.endPosition + 1);
}
}
}
handleArrowLeft(event) {
this.getPosition();
if (event.shiftKey) {
this.setShiftKey('Left');
event.preventDefault();
if (this.shiftStart === 'Right') {
this.setPosition(this.startPosition, this.endPosition - 1);
}
else {
if (this.startPosition !== 0) {
this.setPosition(this.startPosition - 1, this.endPosition);
}
}
}
}
handleHome(event) {
event.preventDefault();
this.getPosition();
if (event.shiftKey) {
this.setShiftKey('Left');
this.setPosition(0, this.endPosition);
}
else {
this.setPosition(0);
}
}
handleEnd(event) {
event.preventDefault();
this.getPosition();
if (event.shiftKey) {
this.setShiftKey('Right');
this.setPosition(this.startPosition, this.value.length);
}
else {
this.setPosition(this.value.length);
}
}
handleSelectAll(event) {
if (event.ctrlKey) {
this.setPosition(0, this.value.length);
}
}
setShiftKey(value) {
if (this.startPosition === this.endPosition) {
this.shiftStart = '';
}
if (this.shiftStart === '') {
this.shiftStart = value;
}
}
applyMask(charInputted, utilizeOriginal = true) {
let cursor = 0;
let result = '';
if (charInputted !== undefined) {
this.value += charInputted;
}
const inputArray = utilizeOriginal ? this.value.split('') : charInputted.split('');
for (let i = 0, inputSymbol = inputArray[0]; i < inputArray.length; i++, inputSymbol = inputArray[i]) {
if (result.length === this.maskExpression.length) {
break;
}
if (this.isValidSymbolMask(inputSymbol, this.maskExpression[cursor])) {
result += inputSymbol;
cursor++;
}
else if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursor]) !== -1) {
result += this.maskExpression[cursor];
cursor++;
i--;
}
else if (this.maskExpression[cursor] === '9') {
cursor++;
i--;
}
}
this.value = result;
this.updateModel();
this.onComplete();
}
deleteTextOnKeyPress(valueArray, startPosition, endPosition) {
if (this.hasTextSelected(startPosition, endPosition)) {
this.value = this.deleteTextSelected(valueArray, startPosition, endPosition);
this.setPosition(startPosition, startPosition);
}
else {
this.value = this.deleteCharOnBackspaceKey(valueArray, endPosition);
this.setPosition(startPosition - 1, endPosition - 1);
}
}
deleteTextSelected(valueArray, startPosition, endPosition) {
const self = this;
let valueResult = '';
valueArray.forEach(function (myValue, index) {
if (index >= startPosition && index < endPosition && self.maskGuides
&& self.maskSpecialCharacters.indexOf(index) < 0) {
valueResult = valueResult + self.maskGuideExpression[index];
}
else if (index >= startPosition && index < endPosition && self.maskSpecialCharacters.indexOf(index) < 0) {
valueResult = valueResult + '';
}
else {
valueResult = valueResult + myValue;
}
});
return valueResult;
}
deleteCharOnBackspaceKey(valueArray, endPosition) {
const self = this;
let valueResult = '';
valueArray.forEach(function (myValue, index) {
if (index === endPosition - 1) {
valueResult = valueResult + self.maskGuideExpression[endPosition - 1];
}
else {
valueResult = valueResult + myValue;
}
});
return valueResult;
}
deleteCharOnDeleteKey(valueArray) {
const self = this;
valueArray.forEach(function (value, index, array) {
if (index === self.endPosition) {
array[index] = self.maskGuideExpression[self.endPosition];
}
});
return String(valueArray).replace(/,/gi, '');
}
replaceUnderscoreForChar(valueArray, charInputted, cursorEnd) {
if (valueArray.length === 0) {
valueArray = [...this.maskGuideExpression];
}
if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursorEnd]) >= 0) {
cursorEnd++;
}
valueArray.forEach(function (value, index, array) {
if (index === cursorEnd) {
array[index] = charInputted;
}
});
return valueArray.toString().replace(/,/gi, '');
}
getCursorPosition(endPosition) {
let cursor = endPosition;
while (this.maskExpression.length - 1 > cursor) {
if (this.maskSpecialCharacters.indexOf(this.maskExpression[cursor]) >= 0) {
cursor++;
this.setPosition(cursor);
}
else {
break;
}
}
return cursor;
}
replaceValidChar(charInputted, cursor, inputArray) {
if (this.isValidSymbolMask(charInputted, this.maskExpression[cursor]) &&
this.validateHourMatch(charInputted, this.maskExpression[cursor])) {
this.value = this.replaceUnderscoreForChar(inputArray, charInputted, cursor);
this.setPosition(cursor + 1);
}
}
onComplete() {
if (this.isTextLengthMatchWithExpressionLength()) {
this.tlInput.value = this.value;
this.complete.next(true);
}
}
isTextLengthMatchWithExpressionLength() {
return (this.removeUnderscore(this.maskExpression).length === this.removeUnderscore(this.value).length);
}
isValidSymbolMask(inputSymbol, maskSymbolChar) {
if (this.maskSpecialCharacters.indexOf(inputSymbol) >= 0) {
return false;
}
return (inputSymbol === maskSymbolChar || this.maskAwaliablePatterns[maskSymbolChar])
&& (this.maskAwaliablePatterns[maskSymbolChar].test(inputSymbol));
}
validateHourMatch(inputSymbol, maskSymbolChar) {
if (maskSymbolChar !== 'h') {
return true;
}
if (Number(this.value[0]) < 2) {
return true;
}
return maskSymbolChar === 'h' && Number(inputSymbol) <= 3;
}
updateModel() {
const endPosition = this.input.nativeElement.selectionEnd;
if (this.valueUppercase) {
this.value = this.value.toUpperCase();
}
this.setModelValue();
this.setPosition(endPosition);
}
setModelValue() {
setTimeout(() => {
this.tlInput.value = this.value;
}, 0);
}
setValidation() {
this.input.nativeElement.maxLength = this.maskExpression.length;
this.input.nativeElement.minLength = this.maskExpression.length;
}
applyGuides() {
const self = this;
if (this.maskGuides) {
setTimeout(function () {
if (self.input.nativeElement.value.length === 0) {
self.input.nativeElement.value = self.maskGuideExpression;
}
}, 1);
}
}
generateMaskGuideExpression() {
let mask = this.maskExpression;
mask = mask.replace(/9/gi, '_');
mask = mask.replace(/0/gi, '_');
mask = mask.replace(/A/gi, '_');
mask = mask.replace(/H/gi, '_');
mask = mask.replace(/h/gi, '_');
mask = mask.replace(/M/gi, '_');
mask = mask.replace(/m/gi, '_');
return this.maskGuideExpression = mask;
}
clearMask(value) {
if (!(this.literalChar)) {
return this.cleanValue(value);
}
return this.removeUnderscore(value);
}
jumpCharMask(startPosition, endPosition) {
if (this.isFirstPosition(startPosition)) {
this.setPosition(startPosition - 1, endPosition - 1);
}
}
setPosition(startPosition, endPosition) {
if (endPosition === undefined) {
endPosition = startPosition;
}
this.input.nativeElement.setSelectionRange(startPosition, endPosition);
this.getPosition();
}
isCharBeforeEqualMaskGuide(value, position) {
return value[position - 1] === this.maskGuideExpression[position - 1];
}
isFirstPosition(startPosition) {
return startPosition > 0;
}
hasTextSelected(startPosition, endPosition) {
return startPosition !== endPosition;
}
removeUnderscore(value) {
return value.replace(/_/gi, '');
}
setPlaceholder() {
this.input.nativeElement.placeholder = this.maskExpression;
}
setValueOnInitialize() {
this._value = this.value;
}
cleanValue(value) {
return value.replace(/[^\d]+/g, '');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2lucHV0L2NvcmUvaW5wdXQtbWFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixNQUFNLE9BQU8sU0FBUztJQXlDcEIsWUFBYSxPQUFPLEVBQVUsUUFBbUIsRUFBRSxTQUFTO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFyQ2pELCtEQUErRDtRQUN2RCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBY3RCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFNaEIsMEJBQXFCLEdBQWEsQ0FBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFFLENBQUM7UUFJN0UsMEJBQXFCLEdBQThCO1lBQ3pELEdBQUcsRUFBRSxJQUFJO1lBQ1QsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxFQUFFLE9BQU87WUFDWixHQUFHLEVBQUUsT0FBTztZQUNaLEdBQUcsRUFBRSxVQUFVO1NBQ2hCLENBQUM7UUFHQSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFFLFNBQVMsQ0FBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENB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QztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0QsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVPLFVBQVUsQ0FBRSxLQUFLO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBRSxTQUFTLEVBQUUsRUFBRSxDQUFFLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVuZGVyZXIyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgS2V5RXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL2tleS1ldmVudHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrIHtcblxuICBwcml2YXRlIHRsSW5wdXQ7XG5cbiAgLy8gRGVzYXRpdmEgYSBtYXNjYXJhIGRvcyBJbnB1dCBwcmVlbmNoZW5kbyBjb20gVW5kZXJsaW5lICggXyApXG4gIHByaXZhdGUgbWFza0d1aWRlcyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYWRkTmludGhEaWdpdCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmFsdWVVcHBlcmNhc2U7XG5cbiAgcHJpdmF0ZSBsaXRlcmFsQ2hhcjtcblxuICBwcml2YXRlIF92YWx1ZTtcblxuICBwcml2YXRlIGlucHV0O1xuXG4gIHByaXZhdGUgc3RhcnRQb3NpdGlvbjogbnVtYmVyO1xuXG4gIHByaXZhdGUgZW5kUG9zaXRpb246IG51bWJlcjtcblxuICBwcml2YXRlIHNoaWZ0U3RhcnQgPSAnJztcblxuICBwcml2YXRlIG1hc2tFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtYXNrR3VpZGVFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBtYXNrU3BlY2lhbENoYXJhY3RlcnM6IHN0cmluZ1tdID0gWyAnLycsICcoJywgJyknLCAnLicsICc6JywgJy0nLCAnICcsICcrJyBdO1xuXG4gIHB1YmxpYyBjb21wbGV0ZTogU3ViamVjdDxib29sZWFuPjtcblxuICBwcml2YXRlIG1hc2tBd2FsaWFibGVQYXR0ZXJuczogeyBba2V5OiBzdHJpbmddOiBSZWdFeHAgfSA9IHtcbiAgICAnMCc6IC9cXGQvLFxuICAgICc5JzogL1xcZC8sXG4gICAgJ0gnOiAvWzAtMS0yXS8sXG4gICAgJ2gnOiAvWzAtOV0vLFxuICAgICdNJzogL1swLTVdLyxcbiAgICAnbSc6IC9bMC05XS8sXG4gICAgJ0EnOiAvW2EtekEtWl0vLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCBlbGVtZW50LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIG1hc2tWYWx1ZSApIHtcbiAgICB0aGlzLnRsSW5wdXQgPSBlbGVtZW50O1xuICAgIHRoaXMuaW5wdXQgPSBlbGVtZW50LmlucHV0O1xuICAgIHRoaXMuc2V0TWFza0V4cHJlc3Npb24oIG1hc2tWYWx1ZSApO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1hc2soKTtcbiAgICB0aGlzLmNvbXBsZXRlID0gbmV3IFN1YmplY3QoKTtcbiAgfVxuXG4gIHNldE1hc2tFeHByZXNzaW9uKCB2YWx1ZSApIHtcbiAgICBpZiAoICF2YWx1ZSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuICAgICAgdGhpcy5tYXNrRXhwcmVzc2lvbiA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIHZhbHVlWyAnZ3VpZGVzJyBdID09PSBmYWxzZSApIHtcbiAgICAgIHRoaXMubWFza0d1aWRlcyA9IHZhbHVlWyAnZ3VpZGVzJyBdO1xuICAgIH1cbiAgICBpZiAoIHZhbHVlWyAnYWRkTmludGhEaWdpdCcgXSApIHtcbiAgICAgIHRoaXMuYWRkTmludGhEaWdpdCA9IHZhbHVlWyAnYWRkTmludGhEaWdpdCcgXTtcbiAgICB9XG4gICAgdGhpcy5saXRlcmFsQ2hhciA9IHZhbHVlWyAnd2l0aExpdGVyYWxDaGFyJyBdO1xuICAgIHRoaXMudmFsdWVVcHBlcmNhc2UgPSB2YWx1ZVsgJ3VwcGVyY2FzZScgXTtcbiAgICB0aGlzLm1hc2tFeHByZXNzaW9uID0gdmFsdWVbICdtYXNrJyBdO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUoIHZhbHVlICkge1xuICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZU1hc2soKSB7XG4gICAgdGhpcy5pbml0aWFsaXplT25Gb2N1cygpO1xuICAgIHRoaXMuZ2VuZXJhdGVNYXNrR3VpZGVFeHByZXNzaW9uKCk7XG4gICAgdGhpcy5hcHBseU1hc2tPbkluaXQoKTtcblxuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcbiAgICB0aGlzLnNldFZhbGlkYXRpb24oKTtcblxuICAgIHRoaXMub25LZXlQcmVzc0lucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uTW91c2VVcElucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uS2V5RG93bklucHV0TGlzdGVuZXIoKTtcbiAgICB0aGlzLm9uUGFzdExpc3RlbmVyKCk7XG4gIH1cblxuICBvblBhc3RMaXN0ZW5lcigpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAncGFzdGUnLCAoJGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9ICRldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvd1snY2xpcGJvYXJkRGF0YSddO1xuICAgICAgbGV0IHZhbHVlID0gY2xpcGJvYXJkRGF0YVxuICAgICAgICAuZ2V0RGF0YSgndGV4dCcpXG4gICAgICAgIC5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvW15cXHdcXHNdL2dpLCAnJyk7XG4gICAgICB2YWx1ZSA9IHRoaXMuaGFuZGxlQWRkTmludGhEaWdpdCh2YWx1ZSk7XG4gICAgICB0aGlzLmFwcGx5TWFzayggdmFsdWUsIGZhbHNlICk7XG4gICAgfSApO1xuICB9XG5cbiAgaGFuZGxlQWRkTmludGhEaWdpdCggdmFsdWUgKSB7XG4gICAgaWYgKCB0aGlzLmFkZE5pbnRoRGlnaXQgKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDEwICkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDIpICsgJzknICsgdmFsdWUuc2xpY2UoMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG9uS2V5UHJlc3NJbnB1dExpc3RlbmVyKCkge1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdrZXlwcmVzcycsICRldmVudCA9PiB7XG4gICAgICB0aGlzLmhhbmRsZUtleXByZXNzKCAkZXZlbnQgKTtcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9uTW91c2VVcElucHV0TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ21vdXNldXAnLCAkZXZlbnQgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9uS2V5RG93bklucHV0TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nLCAkZXZlbnQgPT4ge1xuICAgICAgc3dpdGNoICggJGV2ZW50LmNvZGUgKSB7XG4gICAgICAgIGNhc2UgS2V5RXZlbnQuQkFDS1NQQUNFOlxuICAgICAgICAgIHRoaXMuaGFuZGxlQmFja3NwYWNlKCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ERUxFVEU6XG4gICAgICAgICAgdGhpcy5oYW5kbGVEZWxldGUoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkFSUk9XUklHSFQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd1JpZ2h0KCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5BUlJPV0xFRlQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0xlZnQoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkhPTUU6XG4gICAgICAgICAgdGhpcy5oYW5kbGVIb21lKCAkZXZlbnQgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5FTkQ6XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmQoICRldmVudCApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdLZXlBJzpcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdEFsbCggJGV2ZW50ICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgaXNEYXRlU3RyaW5nKCB4ICkge1xuICAgIHJldHVybiAhaXNOYU4oIERhdGUucGFyc2UoIHggKSApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseU1hc2tPbkluaXQoKSB7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgaWYgKCB0aGlzLnZhbHVlICE9PSB0aGlzLm1hc2tHdWlkZUV4cHJlc3Npb24gKSB7XG4gICAgICAgIGlmICggdGhpcy52YWx1ZS5sZW5ndGggPiAwICkge1xuICAgICAgICAgIGlmICh0aGlzLmlzRGF0ZVN0cmluZyh0aGlzLnZhbHVlICkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2xlYW5WYWx1ZSggdGhpcy52YWx1ZSApO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVPbkluaXRpYWxpemUoKTtcbiAgICAgICAgICB0aGlzLmFwcGx5R3VpZGVzKCk7XG4gICAgICAgICAgdGhpcy5hcHBseU1hc2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwICk7XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uKCkge1xuICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB0aGlzLmVuZFBvc2l0aW9uID0gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU9uRm9jdXMoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgdGhpcy5vbkZvY3VzKCk7XG4gICAgfSApO1xuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcsICgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlTm90TWF0aCgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb2N1cygpIHtcbiAgICB0aGlzLmFwcGx5R3VpZGVzKCk7XG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xuICAgICAgaWYgKCAhdGhpcy5pc1RleHRMZW5ndGhNYXRjaFdpdGhFeHByZXNzaW9uTGVuZ3RoKCkgKSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIDAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIDAsIHRoaXMudmFsdWUubGVuZ3RoICk7XG4gICAgICB9XG4gICAgfSwgMCApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RNYXRoKCkge1xuICAgIGlmICggIXRoaXMuaXNUZXh0TGVuZ3RoTWF0Y2hXaXRoRXhwcmVzc2lvbkxlbmd0aCgpICkge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgICAgdGhpcy50bElucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYWNrc3BhY2UoIGV2ZW50ICkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQ7XG4gICAgY29uc3QgdmFsdWVBcnJheSA9IHZhbHVlLnNwbGl0KCAnJyApO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24oKTtcblxuICAgIGlmICggdGhpcy5oYXNUZXh0U2VsZWN0ZWQoIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVsZXRlVGV4dE9uS2V5UHJlc3MoIHZhbHVlQXJyYXksIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIHRoaXMubWFza0d1aWRlcyApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoIHRoaXMuaXNDaGFyQmVmb3JlRXF1YWxNYXNrR3VpZGUoIHZhbHVlLCBlbmRQb3NpdGlvbiApICkge1xuICAgICAgICB0aGlzLmp1bXBDaGFyTWFzayggc3RhcnQsIGVuZFBvc2l0aW9uICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZVRleHRPbktleVByZXNzKCB2YWx1ZUFycmF5LCBzdGFydCwgZW5kUG9zaXRpb24gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoIGV2ZW50ICkge1xuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLnZhbHVlLnNwbGl0KCAnJyApO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZ2V0UG9zaXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICggdGhpcy5tYXNrR3VpZGVzICkge1xuICAgICAgaWYgKCB0aGlzLmhhc1RleHRTZWxlY3RlZCggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICkgKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlVGV4dE9uS2V5UHJlc3MoIHZhbHVlQXJyYXksIHRoaXMuc3RhcnRQb3NpdGlvbiwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVsZXRlQ2hhck9uRGVsZXRlS2V5KCB2YWx1ZUFycmF5ICk7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oIHNlbGYuZW5kUG9zaXRpb24gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgIHRoaXMub25Db21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlwcmVzcyggZXZlbnQ6IEtleWJvYXJkRXZlbnQgKSB7XG4gICAgY29uc3QgY2hhcklucHV0dGVkID0gZXZlbnQua2V5O1xuICAgIGxldCBpbnB1dEFycmF5ID0gdGhpcy52YWx1ZS5zcGxpdCggJycgKTtcbiAgICBpZiAoIGV2ZW50LmtleSA9PT0gJ0VudGVyJyApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0aGlzLmhhc1RleHRTZWxlY3RlZCggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICkgKSB7XG4gICAgICB0aGlzLmRlbGV0ZVRleHRPbktleVByZXNzKCBpbnB1dEFycmF5LCB0aGlzLnN0YXJ0UG9zaXRpb24sIHRoaXMuZW5kUG9zaXRpb24gKTtcbiAgICAgIHRoaXMuc2V0UG9zaXRpb24oIHRoaXMuc3RhcnRQb3NpdGlvbiApO1xuICAgICAgaW5wdXRBcnJheSA9IHRoaXMudmFsdWUuc3BsaXQoICcnICk7XG4gICAgfVxuICAgIGlmICggdGhpcy5tYXNrR3VpZGVzICkge1xuICAgICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgICAgdGhpcy5yZXBsYWNlVmFsaWRDaGFyKCBjaGFySW5wdXR0ZWQsIHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oIHRoaXMuZW5kUG9zaXRpb24gKSwgaW5wdXRBcnJheSApO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGx5TWFzayggY2hhcklucHV0dGVkICk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dSaWdodCggZXZlbnQgKSB7XG4gICAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAgIGlmICggZXZlbnQuc2hpZnRLZXkgKSB7XG4gICAgICB0aGlzLnNldFNoaWZ0S2V5KCAnUmlnaHQnICk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKCB0aGlzLnNoaWZ0U3RhcnQgPT09ICdMZWZ0JyApIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbiggdGhpcy5zdGFydFBvc2l0aW9uICsgMSwgdGhpcy5lbmRQb3NpdGlvbiApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbiggdGhpcy5zdGFydFBvc2l0aW9uLCB0aGlzLmVuZFBvc2l0aW9uICsgMSApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dMZWZ0KCBldmVudCApIHtcbiAgICB0aGlzLmdldFBvc2l0aW9uKCk7XG4gICAgaWYgKCBldmVudC5zaGlmdEtleSApIHtcbiAgIC