UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

370 lines 34.7 kB
import { __decorate, __metadata, __param } from "tslib"; import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Inject, Input, OnDestroy, Optional, Self } from '@angular/core'; import { AbstractControl, FormControlName, NgControl, NgModel } from '@angular/forms'; import { IgxInputGroupBase } from '../../input-group/input-group.common'; const nativeValidationAttributes = ['required', 'pattern', 'minlength', 'maxlength', 'min', 'max', 'step']; export var IgxInputState; (function (IgxInputState) { IgxInputState[IgxInputState["INITIAL"] = 0] = "INITIAL"; IgxInputState[IgxInputState["VALID"] = 1] = "VALID"; IgxInputState[IgxInputState["INVALID"] = 2] = "INVALID"; })(IgxInputState || (IgxInputState = {})); let IgxInputDirective = class IgxInputDirective { constructor(inputGroup, ngModel, formControl, element, cdr) { this.inputGroup = inputGroup; this.ngModel = ngModel; this.formControl = formControl; this.element = element; this.cdr = cdr; this._valid = IgxInputState.INITIAL; /** * Sets/gets whether the `"igx-input-group__input"` class is added to the host element. * Default value is `false`. * ```typescript * this.igxInput.isInput = true; * ``` * ```typescript * let isCLassAdded = this.igxInput.isInput; * ``` * @memberof IgxInputDirective */ this.isInput = false; /** * Sets/gets whether the `"class.igx-input-group__textarea"` class is added to the host element. * Default value is `false`. * ```typescript * this.igxInput.isTextArea = true; * ``` * ```typescript * let isCLassAdded = this.igxInput.isTextArea; * ``` * @memberof IgxInputDirective */ this.isTextArea = false; } get ngControl() { return this.ngModel ? this.ngModel : this.formControl; } /** * Sets the `value` property. * ```html * <input-group> * <input igxInput #igxInput [value]="'IgxInput Value'"> * </input-group> * ``` * @memberof IgxInputDirective */ set value(value) { this.nativeElement.value = value; this.checkValidity(); } /** * Gets the `value` propery. * ```typescript * @ViewChild('igxInput', {read: IgxInputDirective}) * public igxInput: IgxInputDirective; * let inputValue = this.igxInput.value; * ``` * @memberof IgxInputDirective */ get value() { return this.nativeElement.value; } /** * Sets the `disabled` property. * ```html * <input-group> * <input igxInput #igxInput [disabled]="true"> * </input-group> * ``` * @memberof IgxInputDirective */ set disabled(value) { this.nativeElement.disabled = value; this.inputGroup.disabled = value; } /** * Gets the `disabled` property * ```typescript * @ViewChild('igxInput', {read: IgxInputDirective}) * public igxInput: IgxInputDirective; * let isDisabled = this.igxInput.disabled; * ``` * @memberof IgxInputDirective */ get disabled() { return this.nativeElement.hasAttribute('disabled'); } /** * Sets the `required` property. * ```html * <input-group> * <input igxInput #igxInput [required]="true"> * </input-group> * ``` * @memberof IgxInputDirective */ set required(value) { if (typeof value === 'boolean') { this.nativeElement.required = this.inputGroup.isRequired = value; if (value && !this.nativeElement.checkValidity()) { this._valid = IgxInputState.INVALID; } else { this._valid = IgxInputState.INITIAL; } } } /** * Gets whether the igxInput is required. * ```typescript * let isRequired = this.igxInput.required; * ``` * @memberof IgxInputDirective */ get required() { return this.nativeElement.hasAttribute('required'); } /** *@hidden */ onFocus(event) { this.inputGroup.isFocused = true; } /** *@hidden */ onBlur(event) { this.inputGroup.isFocused = false; this._valid = IgxInputState.INITIAL; if (this.ngControl) { if (!this.ngControl.valid) { this._valid = IgxInputState.INVALID; } } else if (this._hasValidators() && !this.nativeElement.checkValidity()) { this._valid = IgxInputState.INVALID; } } /** *@hidden */ onInput() { this.checkValidity(); } /** *@hidden */ ngAfterViewInit() { this.inputGroup.hasPlaceholder = this.nativeElement.hasAttribute('placeholder'); this.inputGroup.disabled = this.inputGroup.disabled || this.nativeElement.hasAttribute('disabled'); this.inputGroup.isRequired = this.nativeElement.hasAttribute('required'); // Make sure we do not invalidate the input on init if (!this.ngControl) { this._valid = IgxInputState.INITIAL; } // Also check the control's validators for required if (!this.inputGroup.isRequired && this.ngControl && this.ngControl.control.validator) { const validation = this.ngControl.control.validator({}); this.inputGroup.isRequired = validation && validation.required; } const elTag = this.nativeElement.tagName.toLowerCase(); if (elTag === 'textarea') { this.isTextArea = true; } else { this.isInput = true; } if (this.ngControl) { this._statusChanges$ = this.ngControl.statusChanges.subscribe(this.onStatusChanged.bind(this)); } this.cdr.detectChanges(); } /** *@hidden */ ngOnDestroy() { if (this._statusChanges$) { this._statusChanges$.unsubscribe(); } } /** * Sets a focus on the igxInput. * ```typescript * this.igxInput.focus(); * ``` * @memberof IgxInputDirective */ focus() { this.nativeElement.focus(); } /** * Gets the `nativeElement` of the igxInput. * ```typescript * let igxInputNativeElement = this.igxInput.nativeElement; * ``` * @memberof IgxInputDirective */ get nativeElement() { return this.element.nativeElement; } /** *@hidden */ onStatusChanged() { if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) { if (this.ngControl.control.touched || this.ngControl.control.dirty) { // TODO: check the logic when control is touched or dirty if (this.inputGroup.isFocused) { // the user is still typing in the control this._valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID; } else { // the user had touched the control previously but now the value is changing due to changes in the form this._valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID; } } else { // if control is untouched and pristine its state is initial. This is when user did not interact // with the input or when form/control is reset this._valid = IgxInputState.INITIAL; } } } /** * Gets whether the igxInput has a placeholder. * ```typescript * let hasPlaceholder = this.igxInput.hasPlaceholder; * ``` * @memberof IgxInputDirective */ get hasPlaceholder() { return this.nativeElement.hasAttribute('placeholder'); } /** * Gets the placeholder element of the igxInput. * ```typescript * let igxInputPlaceholder = this.igxInput.placeholder; * ``` * @memberof IgxInputDirective */ get placeholder() { return this.nativeElement.placeholder; } _hasValidators() { for (const nativeValidationAttribute of nativeValidationAttributes) { if (this.nativeElement.hasAttribute(nativeValidationAttribute)) { return true; } } return !!this.ngControl && (!!this.ngControl.control.validator || !!this.ngControl.control.asyncValidator); } /** * Gets whether the igxInput is focused. * ```typescript * let isFocused = this.igxInput.focused; * ``` * @memberof IgxInputDirective */ get focused() { return this.inputGroup.isFocused; } /** * Gets the state of the igxInput. * ```typescript * let igxInputState = this.igxInput.valid; * ``` * @memberof IgxInputDirective */ get valid() { return this._valid; } /** * Gets whether the igxInput is valid. * ```typescript * let valid = this.igxInput.isValid; * ``` * @memberof IgxInputDirective */ get isValid() { return this.valid !== IgxInputState.INVALID; } /** * Sets the state of the igxInput. * ```typescript * this.igxInput.valid = IgxInputState.INVALID; * ``` * @memberof IgxInputDirective */ set valid(value) { this._valid = value; } checkValidity() { if (!this.ngControl && this._hasValidators()) { this._valid = this.nativeElement.checkValidity() ? IgxInputState.VALID : IgxInputState.INVALID; } } }; IgxInputDirective.ctorParameters = () => [ { type: IgxInputGroupBase }, { type: NgModel, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgModel,] }] }, { type: FormControlName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormControlName,] }] }, { type: ElementRef }, { type: ChangeDetectorRef } ]; __decorate([ Input('value'), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxInputDirective.prototype, "value", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputDirective.prototype, "disabled", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputDirective.prototype, "required", null); __decorate([ HostBinding('class.igx-input-group__input'), __metadata("design:type", Object) ], IgxInputDirective.prototype, "isInput", void 0); __decorate([ HostBinding('class.igx-input-group__textarea'), __metadata("design:type", Object) ], IgxInputDirective.prototype, "isTextArea", void 0); __decorate([ HostListener('focus', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onFocus", null); __decorate([ HostListener('blur', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onBlur", null); __decorate([ HostListener('input'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxInputDirective.prototype, "onInput", null); IgxInputDirective = __decorate([ Directive({ selector: '[igxInput]', exportAs: 'igxInput' }), __param(1, Optional()), __param(1, Self()), __param(1, Inject(NgModel)), __param(2, Optional()), __param(2, Self()), __param(2, Inject(FormControlName)), __metadata("design:paramtypes", [IgxInputGroupBase, NgModel, FormControlName, ElementRef, ChangeDetectorRef]) ], IgxInputDirective); export { IgxInputDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixJQUFJLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRyxNQUFNLENBQU4sSUFBWSxhQUlYO0FBSkQsV0FBWSxhQUFhO0lBQ3JCLHVEQUFPLENBQUE7SUFDUCxtREFBSyxDQUFBO0lBQ0wsdURBQU8sQ0FBQTtBQUNYLENBQUMsRUFKVyxhQUFhLEtBQWIsYUFBYSxRQUl4QjtBQU1ELElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0lBSTFCLFlBQ1csVUFBNkIsRUFDVyxPQUFnQixFQUNSLFdBQTRCLEVBQ3pFLE9BQW1CLEVBQ25CLEdBQXNCO1FBSnpCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ1csWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNSLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUN6RSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUjVCLFdBQU0sR0FBRyxhQUFhLENB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RnpCLGlCQUFpQjtRQUNvQixPQUFPO1FBQ0ssZUFBZTtRQUNoRSxVQUFVO1FBQ2QsaUJBQWlCO0dBVDNCLGlCQUFpQixDQTBUN0I7U0ExVFksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIFNlbGZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sTmFtZSwgTmdDb250cm9sLCBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQmFzZSB9IGZyb20gJy4uLy4uL2lucHV0LWdyb3VwL2lucHV0LWdyb3VwLmNvbW1vbic7XG5cbmNvbnN0IG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGVzID0gWydyZXF1aXJlZCcsICdwYXR0ZXJuJywgJ21pbmxlbmd0aCcsICdtYXhsZW5ndGgnLCAnbWluJywgJ21heCcsICdzdGVwJ107XG5cbmV4cG9ydCBlbnVtIElneElucHV0U3RhdGUge1xuICAgIElOSVRJQUwsXG4gICAgVkFMSUQsXG4gICAgSU5WQUxJRFxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hJbnB1dF0nLFxuICAgIGV4cG9ydEFzOiAnaWd4SW5wdXQnXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0RGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIF92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzJDogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQmFzZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5nTW9kZWwpIHByb3RlY3RlZCBuZ01vZGVsOiBOZ01vZGVsLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoRm9ybUNvbnRyb2xOYW1lKSBwcm90ZWN0ZWQgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sTmFtZSxcbiAgICAgICAgcHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIHByaXZhdGUgZ2V0IG5nQ29udHJvbCgpOiBOZ0NvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ01vZGVsID8gdGhpcy5uZ01vZGVsIDogdGhpcy5mb3JtQ29udHJvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHZhbHVlYCBwcm9wZXJ0eS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlucHV0LWdyb3VwPlxuICAgICAqICA8aW5wdXQgaWd4SW5wdXQgI2lneElucHV0IFt2YWx1ZV09XCInSWd4SW5wdXQgVmFsdWUnXCI+XG4gICAgICogPC9pbnB1dC1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB2YWx1ZWAgcHJvcGVyeS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnaWd4SW5wdXQnLCB7cmVhZDogSWd4SW5wdXREaXJlY3RpdmV9KVxuICAgICAqICBwdWJsaWMgaWd4SW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuICAgICAqIGxldCBpbnB1dFZhbHVlID0gdGhpcy5pZ3hJbnB1dC52YWx1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGRpc2FibGVkYCBwcm9wZXJ0eVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCdpZ3hJbnB1dCcsIHtyZWFkOiBJZ3hJbnB1dERpcmVjdGl2ZX0pXG4gICAgICogIHB1YmxpYyBpZ3hJbnB1dDogSWd4SW5wdXREaXJlY3RpdmU7XG4gICAgICogbGV0IGlzRGlzYWJsZWQgPSB0aGlzLmlneElucHV0LmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGByZXF1aXJlZGAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbcmVxdWlyZWRdPVwidHJ1ZVwiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkID0gdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLm5hdGl2ZUVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBpcyByZXF1aXJlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmVxdWlyZWQgPSB0aGlzLmlneElucHV0LnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBgXCJpZ3gtaW5wdXQtZ3JvdXBfX2lucHV0XCJgIGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBob3N0IGVsZW1lbnQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LmlzSW5wdXQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNDTGFzc0FkZGVkID0gdGhpcy5pZ3hJbnB1dC5pc0lucHV0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwX19pbnB1dCcpXG4gICAgcHVibGljIGlzSW5wdXQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYFwiY2xhc3MuaWd4LWlucHV0LWdyb3VwX190ZXh0YXJlYVwiYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgaG9zdCBlbGVtZW50LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hJbnB1dC5pc1RleHRBcmVhID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ0xhc3NBZGRlZCA9IHRoaXMuaWd4SW5wdXQuaXNUZXh0QXJlYTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cF9fdGV4dGFyZWEnKVxuICAgIHB1YmxpYyBpc1RleHRBcmVhID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc1ZhbGlkYXRvcnMoKSAmJiAhdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnKVxuICAgIHB1YmxpYyBvbklucHV0KCkge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWRpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaGFzUGxhY2Vob2xkZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgPSB0aGlzLmlucHV0R3JvdXAuZGlzYWJsZWQgfHwgdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkbyBub3QgaW52YWxpZGF0ZSB0aGUgaW5wdXQgb24gaW5pdFxuICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGNoZWNrIHRoZSBjb250cm9sJ3MgdmFsaWRhdG9ycyBmb3IgcmVxdWlyZWRcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCAmJiB0aGlzLm5nQ29udHJvbCAmJiB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCA9IHZhbGlkYXRpb24gJiYgdmFsaWRhdGlvbi5yZXF1aXJlZDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgZWxUYWcgPSB0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoZWxUYWcgPT09ICd0ZXh0YXJlYScpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXh0QXJlYSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5wdXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJCA9IHRoaXMubmdDb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXR1c0NoYW5nZXMkKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzJC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBmb2N1cyBvbiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQuZm9jdXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbmF0aXZlRWxlbWVudGAgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXROYXRpdmVFbGVtZW50ID0gdGhpcy5pZ3hJbnB1dC5uYXRpdmVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25TdGF0dXNDaGFuZ2VkKCkge1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgLy8gIFRPRE86IGNoZWNrIHRoZSBsb2dpYyB3aGVuIGNvbnRyb2wgaXMgdG91Y2hlZCBvciBkaXJ0eVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIGlzIHN0aWxsIHR5cGluZyBpbiB0aGUgY29udHJvbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5WQUxJRCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBoYWQgdG91Y2hlZCB0aGUgY29udHJvbCBwcmV2aW91c2x5IGJ1dCBub3cgdGhlIHZhbHVlIGlzIGNoYW5naW5nIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gdGhpcy5uZ0NvbnRyb2wudmFsaWQgPyBJZ3hJbnB1dFN0YXRlLklOSVRJQUwgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgaWYgY29udHJvbCBpcyB1bnRvdWNoZWQgYW5kIHByaXN0aW5lIGl0cyBzdGF0ZSBpcyBpbml0aWFsLiBUaGlzIGlzIHdoZW4gdXNlciBkaWQgbm90IGludGVyYWN0XG4gICAgICAgICAgICAgICAgLy8gIHdpdGggdGhlIGlucHV0IG9yIHdoZW4gZm9ybS9jb250cm9sIGlzIHJlc2V0XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBoYXMgYSBwbGFjZWhvbGRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGhhc1BsYWNlaG9sZGVyID0gdGhpcy5pZ3hJbnB1dC5oYXNQbGFjZWhvbGRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1BsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncGxhY2Vob2xkZXInKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGxhY2Vob2xkZXIgZWxlbWVudCBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpZ3hJbnB1dFBsYWNlaG9sZGVyID0gdGhpcy5pZ3hJbnB1dC5wbGFjZWhvbGRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhc1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZSBvZiBuYXRpdmVWYWxpZGF0aW9uQXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUobmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMubmdDb250cm9sICYmICghIXRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8ICEhdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5hc3luY1ZhbGlkYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgZm9jdXNlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRm9jdXNlZCA9IHRoaXMuaWd4SW5wdXQuZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvY3VzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGF0ZSBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpZ3hJbnB1dFN0YXRlID0gdGhpcy5pZ3hJbnB1dC52YWxpZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbGlkKCk6IElneElucHV0U3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBpZ3hJbnB1dCBpcyB2YWxpZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHZhbGlkID0gdGhpcy5pZ3hJbnB1dC5pc1ZhbGlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWQgIT09IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgaWd4SW5wdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWx1ZTogSWd4SW5wdXRTdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbCAmJiB0aGlzLl9oYXNWYWxpZGF0b3JzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=