ngx-materialize
Version:
An Angular wrap around Materialize library
231 lines (230 loc) • 22.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ComponentFactoryResolver, ElementRef, HostBinding, HostListener, Input, Renderer, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
import { NgControl } from '@angular/forms';
import { ErrorMessageResource, MzErrorMessageComponent } from './error-message/index';
export class MzValidationComponent {
/**
* @param {?} elementRef
* @param {?} resolver
* @param {?} viewContainerRef
* @param {?} ngControl
* @param {?} renderer
*/
constructor(elementRef, resolver, viewContainerRef, ngControl, renderer) {
this.elementRef = elementRef;
this.resolver = resolver;
this.viewContainerRef = viewContainerRef;
this.ngControl = ngControl;
this.renderer = renderer;
this.errorMessageComponent = null;
this._formControlDisabled = false;
this._required = false;
}
/**
* @return {?}
*/
get required() { return this._required; }
/**
* @param {?} value
* @return {?}
*/
set required(value) { this._required = (value != null && `${value}` !== 'false'); }
/**
* @return {?}
*/
get formControlDisabled() { return this._formControlDisabled; }
/**
* @param {?} value
* @return {?}
*/
set formControlDisabled(value) {
this._formControlDisabled = value;
if (this._formControlDisabled) {
this.ngControl.control.disable();
}
else {
this.ngControl.control.enable();
}
}
/**
* @return {?}
*/
get elementToAddValidation() {
return this.isNativeSelectElement
? this.inputSelectDropdown
: this.nativeElement;
}
/**
* @return {?}
*/
get inputSelectDropdown() {
return this.nativeElement.siblings('input.select-dropdown');
}
/**
* @return {?}
*/
get isNativeSelectElement() {
return this.nativeElement[0].nodeName === 'SELECT';
}
/**
* @param {?} target
* @return {?}
*/
onFocusOut(target) {
this.ngControl.control.markAsTouched();
this.setValidationState();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.initElements();
this.initErrorMessageComponent();
this.subscribeStatusChanges();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.statusChangesSubscription.unsubscribe();
this.errorMessageComponent.destroy();
}
/**
* @param {?} element
* @return {?}
*/
clearValidationState(element) {
this.renderer.setElementClass(element[0], 'valid', false);
this.renderer.setElementClass(element[0], 'invalid', false);
}
/**
* @return {?}
*/
createRequiredSpanElement() {
if (this.required && this.labelElement) {
const /** @type {?} */ spanElement = document.createElement('span');
spanElement.setAttribute('class', 'placeholder-required');
spanElement.textContent = ' *';
this.renderer.invokeElementMethod(this.labelElement, 'appendChild', [spanElement]);
}
}
/**
* @return {?}
*/
initElements() {
this.labelElement = $('label[for="' + this.id + '"]')[0];
this.nativeElement = $(this.elementRef.nativeElement);
this.createRequiredSpanElement();
}
/**
* @return {?}
*/
initErrorMessageComponent() {
const /** @type {?} */ errorMessageFactory = this.resolver.resolveComponentFactory(MzErrorMessageComponent);
this.errorMessageComponent = this.viewContainerRef.createComponent(errorMessageFactory);
this.errorMessageComponent.instance.errorMessageResource = this.errorMessageResource;
this.errorMessageComponent.instance.control = this.ngControl.control;
this.errorMessageComponent.changeDetectorRef.detectChanges();
const /** @type {?} */ errorMessage = this.nativeElement.parent().children('mz-error-message');
this.renderer.invokeElementMethod(errorMessage, 'insertAfter', [this.labelElement]);
}
/**
* @return {?}
*/
setValidationState() {
// to handle reset form
if (this.ngControl.control.untouched && this.ngControl.control.pristine) {
this.clearValidationState(this.elementToAddValidation);
return;
}
// to handle field validity
if (this.ngControl.control.enabled) {
if (this.ngControl.control.valid) {
this.renderer.setElementClass(this.elementToAddValidation[0], 'valid', true);
this.renderer.setElementClass(this.elementToAddValidation[0], 'invalid', false);
}
else {
this.renderer.setElementClass(this.elementToAddValidation[0], 'valid', false);
this.renderer.setElementClass(this.elementToAddValidation[0], 'invalid', true);
}
}
else {
this.clearValidationState(this.elementToAddValidation);
}
}
/**
* @return {?}
*/
subscribeStatusChanges() {
this.statusChangesSubscription = this.ngControl.control.statusChanges.subscribe((status) => {
// TODO Find a better way to handle validation after the form subscription. (see demo form-validation)
// wait for the valueChanges method from FormGroup to have been triggered before handling the validation state
// /!\ race condition warning /!\
setTimeout(() => this.setValidationState());
});
}
}
MzValidationComponent.decorators = [
{ type: Component, args: [{
encapsulation: ViewEncapsulation.None,
selector: 'mz-validation, [mz-validation], [mzValidation]',
template: `<ng-content></ng-content>`,
styles: [`.select-wrapper input.select-dropdown.invalid,textarea.ng-invalid.ng-touched:focus{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}.select-wrapper input.select-dropdown.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type=checkbox]):focus+label.active span.placeholder-required,textarea:focus+label.active span.placeholder-required{color:#f44336}`],
},] },
];
/** @nocollapse */
MzValidationComponent.ctorParameters = () => [
{ type: ElementRef, },
{ type: ComponentFactoryResolver, },
{ type: ViewContainerRef, },
{ type: NgControl, },
{ type: Renderer, },
];
MzValidationComponent.propDecorators = {
"id": [{ type: Input },],
"errorMessageResource": [{ type: Input },],
"required": [{ type: HostBinding, args: ['attr.required',] }, { type: Input },],
"formControlDisabled": [{ type: Input },],
"onFocusOut": [{ type: HostListener, args: ['focusout', ['$event.target'],] },],
};
function MzValidationComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzValidationComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzValidationComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MzValidationComponent.propDecorators;
/** @type {?} */
MzValidationComponent.prototype.errorMessageComponent;
/** @type {?} */
MzValidationComponent.prototype.labelElement;
/** @type {?} */
MzValidationComponent.prototype.nativeElement;
/** @type {?} */
MzValidationComponent.prototype.statusChangesSubscription;
/** @type {?} */
MzValidationComponent.prototype.id;
/** @type {?} */
MzValidationComponent.prototype.errorMessageResource;
/** @type {?} */
MzValidationComponent.prototype._formControlDisabled;
/** @type {?} */
MzValidationComponent.prototype._required;
/** @type {?} */
MzValidationComponent.prototype.elementRef;
/** @type {?} */
MzValidationComponent.prototype.resolver;
/** @type {?} */
MzValidationComponent.prototype.viewContainerRef;
/** @type {?} */
MzValidationComponent.prototype.ngControl;
/** @type {?} */
MzValidationComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWxpemUvIiwic291cmNlcyI6WyJzcmMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVF0RixNQUFNOzs7Ozs7OztJQW1ESixZQUNVLFlBQ0EsVUFDQSxrQkFDRCxXQUNBO1FBSkMsZUFBVSxHQUFWLFVBQVU7UUFDVixhQUFRLEdBQVIsUUFBUTtRQUNSLHFCQUFnQixHQUFoQixnQkFBZ0I7UUFDakIsY0FBUyxHQUFULFNBQVM7UUFDVCxhQUFRLEdBQVIsUUFBUTtxQ0F2RCtDLElBQUk7b0NBV3JDLEtBQUs7eUJBQ2hCLEtBQUs7S0E0Q3BCOzs7O1FBeENELFFBQVEsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7SUFDdkMsSUFBSSxRQUFRLENBQUMsS0FBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsRUFBRTs7OztRQUdwRixtQkFBbUIsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDOzs7OztJQUM3RCxJQUFJLG1CQUFtQixDQUFDLEtBQWM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxFQUFFLENBQUMs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QUNOLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEY7U0FDRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hEO0tBQ0Y7Ozs7SUFFRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTs7OztZQUlqRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7S0FDSjs7O1lBdElGLFNBQVMsU0FBQztnQkFDVCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtnQkFDckMsUUFBUSxFQUFFLGdEQUFnRDtnQkFDMUQsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsTUFBTSxFQUFFLENBQUMsdVlBQXVZLENBQUM7YUFDbFo7Ozs7WUFuQkMsVUFBVTtZQUZWLHdCQUF3QjtZQVF4QixnQkFBZ0I7WUFHVCxTQUFTO1lBSmhCLFFBQVE7OzttQkFzQlAsS0FBSztxQ0FHTCxLQUFLO3lCQUtMLFdBQVcsU0FBQyxlQUFlLGNBQzNCLEtBQUs7b0NBSUwsS0FBSzsyQkF5QkwsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgUmVuZGVyZXIsXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IEVycm9yTWVzc2FnZVJlc291cmNlLCBNekVycm9yTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4vZXJyb3ItbWVzc2FnZS9pbmRleCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHNlbGVjdG9yOiAnbXotdmFsaWRhdGlvbiwgW216LXZhbGlkYXRpb25dLCBbbXpWYWxpZGF0aW9uXScsXHJcbiAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcclxuICBzdHlsZXM6IFtgLnNlbGVjdC13cmFwcGVyIGlucHV0LnNlbGVjdC1kcm9wZG93bi5pbnZhbGlkLHRleHRhcmVhLm5nLWludmFsaWQubmctdG91Y2hlZDpmb2N1c3tib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZjQ0MzM2O2JveC1zaGFkb3c6MCAxcHggMCAwICNmNDQzMzZ9LnNlbGVjdC13cmFwcGVyIGlucHV0LnNlbGVjdC1kcm9wZG93bi52YWxpZHtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNGNhZjUwO2JveC1zaGFkb3c6MCAxcHggMCAwICM0Y2FmNTB9aW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSk6Zm9jdXMrbGFiZWwuYWN0aXZlIHNwYW4ucGxhY2Vob2xkZXItcmVxdWlyZWQsdGV4dGFyZWE6Zm9jdXMrbGFiZWwuYWN0aXZlIHNwYW4ucGxhY2Vob2xkZXItcmVxdWlyZWR7Y29sb3I6I2Y0NDMzNn1gXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE16VmFsaWRhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgZXJyb3JNZXNzYWdlQ29tcG9uZW50PzogQ29tcG9uZW50UmVmPE16RXJyb3JNZXNzYWdlQ29tcG9uZW50PiA9IG51bGw7XHJcbiAgbGFiZWxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBuYXRpdmVFbGVtZW50OiBKUXVlcnk7XHJcbiAgc3RhdHVzQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvLyBuYXRpdmUgcHJvcGVydGllc1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcblxyXG4gIC8vIGNvbXBvbmVudCBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlUmVzb3VyY2U6IEVycm9yTWVzc2FnZVJlc291cmNlO1xyXG5cclxuICBwcml2YXRlIF9mb3JtQ29udHJvbERpc2FibGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJlcXVpcmVkJylcclxuICBASW5wdXQoKVxyXG4gIGdldCByZXF1aXJlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9XHJcbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBhbnkpIHsgdGhpcy5fcmVxdWlyZWQgPSAodmFsdWUgIT0gbnVsbCAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnKTsgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBmb3JtQ29udHJvbERpc2FibGVkKCkgeyByZXR1cm4gdGhpcy5fZm9ybUNvbnRyb2xEaXNhYmxlZDsgfVxyXG4gIHNldCBmb3JtQ29udHJvbERpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9mb3JtQ29udHJvbERpc2FibGVkID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fZm9ybUNvbnRyb2xEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZWxlbWVudFRvQWRkVmFsaWRhdGlvbigpOiBKUXVlcnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNOYXRpdmVTZWxlY3RFbGVtZW50XHJcbiAgICAgID8gdGhpcy5pbnB1dFNlbGVjdERyb3Bkb3duXHJcbiAgICAgIDogdGhpcy5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlucHV0U2VsZWN0RHJvcGRvd24oKTogSlF1ZXJ5IHtcclxuICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuc2libGluZ3MoJ2lucHV0LnNlbGVjdC1kcm9wZG93bicpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTmF0aXZlU2VsZWN0RWxlbWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnRbMF0ubm9kZU5hbWUgPT09ICdTRUxFQ1QnO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNvdXQnLCBbJyRldmVudC50YXJnZXQnXSlcclxuICBvbkZvY3VzT3V0KHRhcmdldDogRXZlbnQpIHtcclxuICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5zZXRWYWxpZGF0aW9uU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmluaXRFbGVtZW50cygpO1xyXG4gICAgdGhpcy5pbml0RXJyb3JNZXNzYWdlQ29tcG9uZW50KCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVN0YXR1c0NoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZUNvbXBvbmVudC5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICBjbGVhclZhbGlkYXRpb25TdGF0ZShlbGVtZW50OiBKUXVlcnkpIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnRbMF0sICd2YWxpZCcsIGZhbHNlKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnRbMF0sICdpbnZhbGlkJywgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlUmVxdWlyZWRTcGFuRWxlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmIHRoaXMubGFiZWxFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICBzcGFuRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3BsYWNlaG9sZGVyLXJlcXVpcmVkJyk7XHJcbiAgICAgIHNwYW5FbGVtZW50LnRleHRDb250ZW50ID0gJyAqJztcclxuICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMubGFiZWxFbGVtZW50LCAnYXBwZW5kQ2hpbGQnLCBbc3BhbkVsZW1lbnRdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRFbGVtZW50cygpIHtcclxuICAgIHRoaXMubGFiZWxFbGVtZW50ID0gJCgnbGFiZWxbZm9yPVwiJyArIHRoaXMuaWQgKyAnXCJdJylbMF07XHJcbiAgICB0aGlzLm5hdGl2ZUVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuY3JlYXRlUmVxdWlyZWRTcGFuRWxlbWVudCgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdEVycm9yTWVzc2FnZUNvbXBvbmVudCgpIHtcclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZUZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE16RXJyb3JNZXNzYWdlQ29tcG9uZW50KTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChlcnJvck1lc3NhZ2VGYWN0b3J5KTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlQ29tcG9uZW50Lmluc3RhbmNlLmVycm9yTWVzc2FnZVJlc291cmNlID0gdGhpcy5lcnJvck1lc3NhZ2VSZXNvdXJjZTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlQ29tcG9uZW50Lmluc3RhbmNlLmNvbnRyb2wgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VDb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbignbXotZXJyb3ItbWVzc2FnZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKGVycm9yTWVzc2FnZSwgJ2luc2VydEFmdGVyJywgW3RoaXMubGFiZWxFbGVtZW50XSk7XHJcbiAgfVxyXG5cclxuICBzZXRWYWxpZGF0aW9uU3RhdGUoKSB7XHJcbiAgICAvLyB0byBoYW5kbGUgcmVzZXQgZm9ybVxyXG4gICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudW50b3VjaGVkICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wucHJpc3RpbmUpIHtcclxuICAgICAgdGhpcy5jbGVhclZhbGlkYXRpb25TdGF0ZSh0aGlzLmVsZW1lbnRUb0FkZFZhbGlkYXRpb24pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyB0byBoYW5kbGUgZmllbGQgdmFsaWRpdHlcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbC5jb250cm9sLmVuYWJsZWQpIHtcclxuICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWQpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmVsZW1lbnRUb0FkZFZhbGlkYXRpb25bMF0sICd2YWxpZCcsIHRydWUpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuZWxlbWVudFRvQWRkVmFsaWRhdGlvblswXSwgJ2ludmFsaWQnLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5lbGVtZW50VG9BZGRWYWxpZGF0aW9uWzBdLCAndmFsaWQnLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5lbGVtZW50VG9BZGRWYWxpZGF0aW9uWzBdLCAnaW52YWxpZCcsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFyVmFsaWRhdGlvblN0YXRlKHRoaXMuZWxlbWVudFRvQWRkVmFsaWRhdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVTdGF0dXNDaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5zdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgLy8gVE9ETyBGaW5kIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdmFsaWRhdGlvbiBhZnRlciB0aGUgZm9ybSBzdWJzY3JpcHRpb24uIChzZWUgZGVtbyBmb3JtLXZhbGlkYXRpb24pXHJcbiAgICAgIC8vIHdhaXQgZm9yIHRoZSB2YWx1ZUNoYW5nZXMgbWV0aG9kIGZyb20gRm9ybUdyb3VwIHRvIGhhdmUgYmVlbiB0cmlnZ2VyZWQgYmVmb3JlIGhhbmRsaW5nIHRoZSB2YWxpZGF0aW9uIHN0YXRlXHJcbiAgICAgIC8vIC8hXFwgcmFjZSBjb25kaXRpb24gd2FybmluZyAvIVxcXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRWYWxpZGF0aW9uU3RhdGUoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19