@stratio/egeo
Version:
495 lines • 34.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-textarea/st-textarea.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, ViewChildren, Output, EventEmitter } from '@angular/core';
import { FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
/**
* \@description {Component} [Textare]
*
* The textarea component is for use normally inside a form, you can use too outside a form like a template driven form.
*
* \@example
*
* {html}
*
* ```
* <st-textarea
* label="Components"
* placeholder="Number of components"
* [forceValidations]="forceValidations"
* [errors]="errorsTextarea"
* name="components-template"
* qaTag="components-textarea-template"
* required
* [(ngModel)]="model.components"
* contextualHelp="This is the contextual help of the components"
* [cols]="50" [rows]="10">
* </st-textarea>
* ```
*
*/
var StTextareaComponent = /** @class */ (function () {
function StTextareaComponent(_cd) {
this._cd = _cd;
/**
* \@Input {string} [placeholder=''] The text that appears as placeholder of the textarea. It is empty by default
*/
this.placeholder = '';
/**
* \@Input {string} [name=''] Name of the textarea
*/
this.name = '';
/**
* \@Input {string} [label=''] Label to show over the textarea. It is empty by default
*/
this.label = '';
/**
* \@Input {boolean} [forceValidations=false] If you specify it to 'true', the textarea checks the errors before being modified by user
*/
this.forceValidations = false;
/**
* \@Input {boolean} [isFocused=false] If true, the textarea will be focused on view init.
*/
this.isFocused = false;
/**
* \@Input {string} [wrap='soft'] Define type of wrap as html standard
*/
this.wrap = 'soft';
/**
* \@Output {} [blur] Notify when user leaves a field
*/
this.blur = new EventEmitter();
this.isDisabled = false; // To check disable
// To check disable
this.focus = false;
this.errorMessage = undefined;
this.showErrorValue = false;
this.internalTextareaModel = '';
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
this.onTouched = (/**
* @return {?}
*/
function () { });
}
/**
* @param {?} control
* @return {?}
*/
StTextareaComponent.prototype.validate = /**
* @param {?} control
* @return {?}
*/
function (control) {
var _this = this;
if (this.sub) {
this.sub.unsubscribe();
}
this.sub = control.statusChanges.subscribe((/**
* @return {?}
*/
function () { return _this.checkErrors(control); }));
};
/**
* @param {?} change
* @return {?}
*/
StTextareaComponent.prototype.ngOnChanges = /**
* @param {?} change
* @return {?}
*/
function (change) {
if (this.forceValidations) {
this.writeValue(this.internalControl.value);
}
this._cd.markForCheck();
};
/**
* @return {?}
*/
StTextareaComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.internalControl = new FormControl(this.internalTextareaModel);
this.valueChangeSub = this.internalControl.valueChanges.subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) { return _this.onChange(value); }));
this.showErrorValue = this.showError();
};
/**
* @return {?}
*/
StTextareaComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.isFocused) {
this.focus = true;
this.vc.first.nativeElement.focus();
}
};
/**
* @return {?}
*/
StTextareaComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.valueChangeSub) {
this.valueChangeSub.unsubscribe();
}
if (this.sub) {
this.sub.unsubscribe();
}
};
// When value is received from outside
// When value is received from outside
/**
* @param {?} value
* @return {?}
*/
StTextareaComponent.prototype.writeValue =
// When value is received from outside
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.internalControl.setValue(value);
this.internalTextareaModel = value;
};
// Registry the change function to propagate internal model changes
// Registry the change function to propagate internal model changes
/**
* @param {?} fn
* @return {?}
*/
StTextareaComponent.prototype.registerOnChange =
// Registry the change function to propagate internal model changes
/**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
// Registry the touch function to propagate internal touch events TODO: make this function.
// Registry the touch function to propagate internal touch events TODO: make this function.
/**
* @param {?} fn
* @return {?}
*/
StTextareaComponent.prototype.registerOnTouched =
// Registry the touch function to propagate internal touch events TODO: make this function.
/**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} disable
* @return {?}
*/
StTextareaComponent.prototype.setDisabledState = /**
* @param {?} disable
* @return {?}
*/
function (disable) {
this.isDisabled = disable;
if (this.isDisabled && this.internalControl && this.internalControl.enabled) {
this.internalControl.disable();
}
else if (!this.isDisabled && this.internalControl && this.internalControl.disabled) {
this.internalControl.enable();
}
this._cd.markForCheck();
};
/**
* @return {?}
*/
StTextareaComponent.prototype.showError = /**
* @return {?}
*/
function () {
return this.errorMessage !== undefined && (!this.internalControl.pristine || this.forceValidations) && !this.focus && !this.isDisabled;
};
/** Style functions */
/**
* Style functions
* @param {?} event
* @return {?}
*/
StTextareaComponent.prototype.onFocus = /**
* Style functions
* @param {?} event
* @return {?}
*/
function (event) {
this.focus = true;
this.showErrorValue = this.showError();
};
/**
* @param {?} event
* @param {?} emitEvent
* @return {?}
*/
StTextareaComponent.prototype.onFocusOut = /**
* @param {?} event
* @param {?} emitEvent
* @return {?}
*/
function (event, emitEvent) {
this.focus = false;
if (emitEvent) {
this.blur.emit();
}
this.showErrorValue = this.showError();
};
/**
* @return {?}
*/
StTextareaComponent.prototype.displayResetButton = /**
* @return {?}
*/
function () {
return this.default !== undefined && this.internalControl.dirty && this.internalControl.value !== this.default;
};
/**
* @return {?}
*/
StTextareaComponent.prototype.resetToDefault = /**
* @return {?}
*/
function () {
this.writeValue(this.default);
this._cd.markForCheck();
};
// When status change call this function to check if have errors
// When status change call this function to check if have errors
/**
* @private
* @param {?} control
* @return {?}
*/
StTextareaComponent.prototype.checkErrors =
// When status change call this function to check if have errors
/**
* @private
* @param {?} control
* @return {?}
*/
function (control) {
/** @type {?} */
var errors = control.errors;
this.errorMessage = this.getErrorMessage(errors);
this.showErrorValue = this.showError();
this._cd.markForCheck();
};
// Get error message in function of error list.
// Get error message in function of error list.
/**
* @private
* @param {?} errors
* @return {?}
*/
StTextareaComponent.prototype.getErrorMessage =
// Get error message in function of error list.
/**
* @private
* @param {?} errors
* @return {?}
*/
function (errors) {
if (!errors) {
return undefined;
}
if (!this.errors) {
return '';
}
if (errors.hasOwnProperty('required')) {
return this.errors.required || this.errors.generic || '';
}
if (errors.hasOwnProperty('minlength')) {
return this.errors.minLength || this.errors.generic || '';
}
if (errors.hasOwnProperty('maxlength')) {
return this.errors.maxLength || this.errors.generic || '';
}
if (errors.hasOwnProperty('pattern')) {
return this.errors.pattern || this.errors.generic || '';
}
return '';
};
StTextareaComponent.decorators = [
{ type: Component, args: [{
selector: 'st-textarea',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<label st-label [attr.title]=\"contextualHelp\" class=\"st-textarea-title\"\n [ngClass]=\"{error: showErrorValue, active: focus, disabled: isDisabled}\" [attr.for]=\"name\">\n {{label}}\n</label>\n<textarea class=\"st-textarea\" #textarea\n (focus)=\"onFocus($event)\"\n (focusout)=\"onFocusOut($event, false)\"\n (blur)=\"onFocusOut($event, true)\"\n [formControl]=\"internalControl\"\n [ngClass]=\"{error: showErrorValue, disabled: isDisabled}\"\n [placeholder]=\"placeholder\" [name]=\"name\" [cols]=\"cols\" [rows]=\"rows || null\" [wrap]=\"wrap\"\n [attr.maxlength]=\"maxLength\" [attr.id]=\"qaTag\">\n</textarea>\n<span *ngIf=\"displayResetButton()\" class=\"st-form-control-reset-button\" (click)=\"resetToDefault()\"\n [style.opacity]=\"focus ? 1 : 0\">\n <i class=\"icon-reload2\"></i>\n</span>\n\n<div class=\"st-textarea-error-layout\">\n <div *ngIf=\"showErrorValue\">\n <span class=\"st-textarea-error-message\">{{errorMessage}}</span>\n </div>\n</div>\n",
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/**
* @return {?}
*/
function () { return StTextareaComponent; })), multi: true },
{ provide: NG_VALIDATORS, useExisting: forwardRef((/**
* @return {?}
*/
function () { return StTextareaComponent; })), multi: true }
],
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";:host{position:relative;display:inline-block;width:100%}.st-textarea-title{padding:0;position:relative;display:block;float:left;width:100%}.st-textarea{min-width:100%;height:100%;display:inline-block}.st-textarea-error-layout{height:15px;bottom:0}"]
}] }
];
/** @nocollapse */
StTextareaComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
StTextareaComponent.propDecorators = {
placeholder: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
errors: [{ type: Input }],
qaTag: [{ type: Input }],
forceValidations: [{ type: Input }],
contextualHelp: [{ type: Input }],
maxLength: [{ type: Input }],
isFocused: [{ type: Input }],
cols: [{ type: Input }],
rows: [{ type: Input }],
wrap: [{ type: Input }],
default: [{ type: Input }],
blur: [{ type: Output }],
vc: [{ type: ViewChildren, args: ['textarea',] }]
};
return StTextareaComponent;
}());
export { StTextareaComponent };
if (false) {
/**
* \@Input {string} [placeholder=''] The text that appears as placeholder of the textarea. It is empty by default
* @type {?}
*/
StTextareaComponent.prototype.placeholder;
/**
* \@Input {string} [name=''] Name of the textarea
* @type {?}
*/
StTextareaComponent.prototype.name;
/**
* \@Input {string} [label=''] Label to show over the textarea. It is empty by default
* @type {?}
*/
StTextareaComponent.prototype.label;
/**
* \@Input {StTextareaError} [errors=''] Error to show for each error case, if you don\'t provide this parameter,
* the default behaviour is only to change color without message
* @type {?}
*/
StTextareaComponent.prototype.errors;
/**
* \@Input {string} [qaTag=''] Id for QA test
* @type {?}
*/
StTextareaComponent.prototype.qaTag;
/**
* \@Input {boolean} [forceValidations=false] If you specify it to 'true', the textarea checks the errors before being modified by user
* @type {?}
*/
StTextareaComponent.prototype.forceValidations;
/**
* \@Input {string} [contextualHelp=''] It will be displayed when user clicks on the info button
* @type {?}
*/
StTextareaComponent.prototype.contextualHelp;
/**
* \@Input {string} [maxLength=''] Define a max-length for textarea field
* @type {?}
*/
StTextareaComponent.prototype.maxLength;
/**
* \@Input {boolean} [isFocused=false] If true, the textarea will be focused on view init.
* @type {?}
*/
StTextareaComponent.prototype.isFocused;
/**
* \@Input {number} [cols=''] Define textarea number of cols
* @type {?}
*/
StTextareaComponent.prototype.cols;
/**
* \@Input {number} [rows=''] Define textarea number of rows
* @type {?}
*/
StTextareaComponent.prototype.rows;
/**
* \@Input {string} [wrap='soft'] Define type of wrap as html standard
* @type {?}
*/
StTextareaComponent.prototype.wrap;
/**
* \@Input {string} [default=] Default value of textarea
* @type {?}
*/
StTextareaComponent.prototype.default;
/**
* \@Output {} [blur] Notify when user leaves a field
* @type {?}
*/
StTextareaComponent.prototype.blur;
/** @type {?} */
StTextareaComponent.prototype.vc;
/** @type {?} */
StTextareaComponent.prototype.isDisabled;
/** @type {?} */
StTextareaComponent.prototype.focus;
/** @type {?} */
StTextareaComponent.prototype.internalControl;
/** @type {?} */
StTextareaComponent.prototype.errorMessage;
/** @type {?} */
StTextareaComponent.prototype.showErrorValue;
/**
* @type {?}
* @private
*/
StTextareaComponent.prototype.sub;
/**
* @type {?}
* @private
*/
StTextareaComponent.prototype.valueChangeSub;
/**
* @type {?}
* @private
*/
StTextareaComponent.prototype.internalTextareaModel;
/** @type {?} */
StTextareaComponent.prototype.onChange;
/** @type {?} */
StTextareaComponent.prototype.onTouched;
/**
* @type {?}
* @private
*/
StTextareaComponent.prototype._cd;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10ZXh0YXJlYS9zdC10ZXh0YXJlYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUMxQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDbEUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJyRztJQW9FRyw2QkFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7Ozs7UUF2RGpDLGdCQUFXLEdBQVcsRUFBRSxDQUFDOzs7O1FBR3pCLFNBQUksR0FBVyxFQUFFLENBQUM7Ozs7UUFHbEIsVUFBSyxHQUFXLEVBQUUsQ0FBQzs7OztRQVduQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7Ozs7UUFTbEMsY0FBUyxHQUFZLEtBQUssQ0FBQzs7OztRQVMzQixTQUFJLEdBQVcsTUFBTSxDQUFDOzs7O1FBTXJCLFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUlyRCxlQUFVLEdBQVksS0FBSyxDQUFDLENBQUMsbUJBQW1COztRQUNoRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBRXZCLGlCQUFZLEdBQVcsU0FBUyxDQUFDO1FBQ2pDLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBSS9CLDBCQUFxQixHQUFRLEVBQUUsQ0FBQztRQUt4QyxhQUFROzs7O1FBQUcsVUFBQyxDQUFNLElBQU8sQ0FBQyxFQUFDO1FBQzNCLGNBQVM7OztRQUFHLGNBQVEsQ0FBQyxFQUFDO0lBSHRCLENBQUM7Ozs7O0lBS0Qsc0NB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Qzs7SUFDeEMsNkNBQXVDOzs7OztJQUV2QyxrQ0FBMEI7Ozs7O0lBQzFCLDZDQUFxQzs7Ozs7SUFDckMsb0RBQXdDOztJQUt4Qyx1Q0FBMkI7O0lBQzNCLHdDQUFzQjs7Ozs7SUFKVixrQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsXG4gICBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGRyZW4sIE91dHB1dCwgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTdFRleHRhcmVhRXJyb3IgfSBmcm9tICcuL3N0LXRleHRhcmVhLmVycm9yLm1vZGVsJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24ge0NvbXBvbmVudH0gW1RleHRhcmVdXG4gKlxuICogVGhlIHRleHRhcmVhIGNvbXBvbmVudCBpcyBmb3IgdXNlIG5vcm1hbGx5IGluc2lkZSBhIGZvcm0sIHlvdSBjYW4gdXNlIHRvbyBvdXRzaWRlIGEgZm9ybSBsaWtlIGEgdGVtcGxhdGUgZHJpdmVuIGZvcm0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxzdC10ZXh0YXJlYVxuICogICAgbGFiZWw9XCJDb21wb25lbnRzXCJcbiAqICAgIHBsYWNlaG9sZGVyPVwiTnVtYmVyIG9mIGNvbXBvbmVudHNcIlxuICogICAgW2ZvcmNlVmFsaWRhdGlvbnNdPVwiZm9yY2VWYWxpZGF0aW9uc1wiXG4gKiAgICBbZXJyb3JzXT1cImVycm9yc1RleHRhcmVhXCJcbiAqICAgIG5hbWU9XCJjb21wb25lbnRzLXRlbXBsYXRlXCJcbiAqICAgIHFhVGFnPVwiY29tcG9uZW50cy10ZXh0YXJlYS10ZW1wbGF0ZVwiXG4gKiAgICByZXF1aXJlZFxuICogICAgWyhuZ01vZGVsKV09XCJtb2RlbC5jb21wb25lbnRzXCJcbiAqICAgIGNvbnRleHR1YWxIZWxwPVwiVGhpcyBpcyB0aGUgY29udGV4dHVhbCBoZWxwIG9mIHRoZSBjb21wb25lbnRzXCJcbiAqICAgIFtjb2xzXT1cIjUwXCIgW3Jvd3NdPVwiMTBcIj5cbiAqIDwvc3QtdGV4dGFyZWE+XG4gKiBgYGBcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdzdC10ZXh0YXJlYScsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3QtdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vc3QtdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnXSxcbiAgIHByb3ZpZGVyczogW1xuICAgICAgeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3RUZXh0YXJlYUNvbXBvbmVudCksIG11bHRpOiB0cnVlIH0sXG4gICAgICB7IHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0VGV4dGFyZWFDb21wb25lbnQpLCBtdWx0aTogdHJ1ZSB9XG4gICBdLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5cbmV4cG9ydCBjbGFzcyBTdFRleHRhcmVhQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kgIHtcbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3BsYWNlaG9sZGVyPScnXSBUaGUgdGV4dCB0aGF0IGFwcGVhcnMgYXMgcGxhY2Vob2xkZXIgb2YgdGhlIHRleHRhcmVhLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0ICovXG4gICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW25hbWU9JyddIE5hbWUgb2YgdGhlIHRleHRhcmVhICovXG4gICBASW5wdXQoKSBuYW1lOiBzdHJpbmcgPSAnJztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbbGFiZWw9JyddIExhYmVsIHRvIHNob3cgb3ZlciB0aGUgdGV4dGFyZWEuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQgKi9cbiAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgLyoqIEBJbnB1dCB7U3RUZXh0YXJlYUVycm9yfSBbZXJyb3JzPScnXSBFcnJvciB0byBzaG93IGZvciBlYWNoIGVycm9yIGNhc2UsIGlmIHlvdSBkb25cXCd0IHByb3ZpZGUgdGhpcyBwYXJhbWV0ZXIsXG4gICAgKiB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgb25seSB0byBjaGFuZ2UgY29sb3Igd2l0aG91dCBtZXNzYWdlXG4gICAgKi9cbiAgIEBJbnB1dCgpIGVycm9yczogU3RUZXh0YXJlYUVycm9yO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gSWQgZm9yIFFBIHRlc3QgKi9cbiAgIEBJbnB1dCgpIHFhVGFnOiBzdHJpbmc7XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtmb3JjZVZhbGlkYXRpb25zPWZhbHNlXSBJZiB5b3Ugc3BlY2lmeSBpdCB0byAndHJ1ZScsIHRoZSB0ZXh0YXJlYSBjaGVja3MgdGhlIGVycm9ycyBiZWZvcmUgYmVpbmcgbW9kaWZpZWQgYnkgdXNlciAqL1xuICAgQElucHV0KCkgZm9yY2VWYWxpZGF0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtjb250ZXh0dWFsSGVscD0nJ10gSXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiB0aGUgaW5mbyBidXR0b24gKi9cbiAgIEBJbnB1dCgpIGNvbnRleHR1YWxIZWxwOiBzdHJpbmc7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW21heExlbmd0aD0nJ10gRGVmaW5lIGEgbWF4LWxlbmd0aCBmb3IgdGV4dGFyZWEgZmllbGQgKi9cbiAgIEBJbnB1dCgpIG1heExlbmd0aDogbnVtYmVyO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbaXNGb2N1c2VkPWZhbHNlXSBJZiB0cnVlLCB0aGUgdGV4dGFyZWEgd2lsbCBiZSBmb2N1c2VkIG9uIHZpZXcgaW5pdC4gKi9cbiAgIEBJbnB1dCgpIGlzRm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAvKiogQElucHV0IHtudW1iZXJ9IFtjb2xzPScnXSBEZWZpbmUgdGV4dGFyZWEgbnVtYmVyIG9mIGNvbHMgKi9cbiAgIEBJbnB1dCgpIGNvbHM6IG51bWJlcjtcblxuICAgLyoqIEBJbnB1dCB7bnVtYmVyfSBbcm93cz0nJ10gRGVmaW5lIHRleHRhcmVhIG51bWJlciBvZiByb3dzICovXG4gICBASW5wdXQoKSByb3dzOiBudW1iZXI7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3dyYXA9J3NvZnQnXSBEZWZpbmUgdHlwZSBvZiB3cmFwIGFzIGh0bWwgc3RhbmRhcmQgKi9cbiAgIEBJbnB1dCgpIHdyYXA6IHN0cmluZyA9ICdzb2Z0JztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbZGVmYXVsdD1dIERlZmF1bHQgdmFsdWUgb2YgdGV4dGFyZWEgKi9cbiAgIEBJbnB1dCgpIGRlZmF1bHQ6IHN0cmluZztcblxuICAgLyoqIEBPdXRwdXQge30gW2JsdXJdIE5vdGlmeSB3aGVuIHVzZXIgbGVhdmVzIGEgZmllbGQgKi9cbiAgIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICBAVmlld0NoaWxkcmVuKCd0ZXh0YXJlYScpIHZjOiBhbnk7XG5cbiAgIHB1YmxpYyBpc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7IC8vIFRvIGNoZWNrIGRpc2FibGVcbiAgIHB1YmxpYyBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHVibGljIGludGVybmFsQ29udHJvbDogRm9ybUNvbnRyb2w7XG4gICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICBwdWJsaWMgc2hvd0Vycm9yVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcbiAgIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcbiAgIHByaXZhdGUgaW50ZXJuYWxUZXh0YXJlYU1vZGVsOiBhbnkgPSAnJztcblxuICAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICB9XG5cbiAgIG9uQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuICAgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xuXG4gICB2YWxpZGF0ZShjb250cm9sOiBGb3JtQ29udHJvbCk6IGFueSB7XG4gICAgICBpZiAodGhpcy5zdWIpIHtcbiAgICAgICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN1YiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVja0Vycm9ycyhjb250cm9sKSk7XG4gICB9XG5cbiAgIG5nT25DaGFuZ2VzKGNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5mb3JjZVZhbGlkYXRpb25zKSB7XG4gICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5pbnRlcm5hbENvbnRyb2wudmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgdGhpcy5pbnRlcm5hbENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5pbnRlcm5hbFRleHRhcmVhTW9kZWwpO1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZVN1YiA9IHRoaXMuaW50ZXJuYWxDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLm9uQ2hhbmdlKHZhbHVlKSk7XG4gICAgICB0aGlzLnNob3dFcnJvclZhbHVlID0gdGhpcy5zaG93RXJyb3IoKTtcblxuICAgfVxuXG4gICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0ZvY3VzZWQpIHtcbiAgICAgICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgICAgICAgdGhpcy52Yy5maXJzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMudmFsdWVDaGFuZ2VTdWIpIHtcbiAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN1Yikge1xuICAgICAgICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLy8gV2hlbiB2YWx1ZSBpcyByZWNlaXZlZCBmcm9tIG91dHNpZGVcbiAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgdGhpcy5pbnRlcm5hbENvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pbnRlcm5hbFRleHRhcmVhTW9kZWwgPSB2YWx1ZTtcbiAgIH1cblxuICAgLy8gUmVnaXN0cnkgdGhlIGNoYW5nZSBmdW5jdGlvbiB0byBwcm9wYWdhdGUgaW50ZXJuYWwgbW9kZWwgY2hhbmdlc1xuICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgfVxuXG4gICAvLyBSZWdpc3RyeSB0aGUgdG91Y2ggZnVuY3Rpb24gdG8gcHJvcGFnYXRlIGludGVybmFsIHRvdWNoIGV2ZW50cyBUT0RPOiBtYWtlIHRoaXMgZnVuY3Rpb24uXG4gICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgIH1cblxuICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBkaXNhYmxlO1xuICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZCAmJiB0aGlzLmludGVybmFsQ29udHJvbCAmJiB0aGlzLmludGVybmFsQ29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgICB0aGlzLmludGVybmFsQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRGlzYWJsZWQgJiYgdGhpcy5pbnRlcm5hbENvbnRyb2wgJiYgdGhpcy5pbnRlcm5hbENvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgICAgIHRoaXMuaW50ZXJuYWxDb250cm9sLmVuYWJsZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHNob3dFcnJvcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yTWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmICghdGhpcy5pbnRlcm5hbENvbnRyb2wucHJpc3RpbmUgfHwgdGhpcy5mb3JjZVZhbGlkYXRpb25zKSAmJiAhdGhpcy5mb2N1cyAmJiAhdGhpcy5pc0Rpc2FibGVkO1xuICAgfVxuXG4gICAvKiogU3R5bGUgZnVuY3Rpb25zICovXG4gICBvbkZvY3VzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG5cbiAgICAgIHRoaXMuc2hvd0Vycm9yVmFsdWUgPSB0aGlzLnNob3dFcnJvcigpO1xuICAgfVxuXG4gICBvbkZvY3VzT3V0KGV2ZW50OiBFdmVudCwgZW1pdEV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG5cbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgIHRoaXMuYmx1ci5lbWl0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvd0Vycm9yVmFsdWUgPSB0aGlzLnNob3dFcnJvcigpO1xuICAgfVxuXG4gICBkaXNwbGF5UmVzZXRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pbnRlcm5hbENvbnRyb2wuZGlydHkgJiYgdGhpcy5pbnRlcm5hbENvbnRyb2wudmFsdWUgIT09IHRoaXMuZGVmYXVsdDtcbiAgIH1cblxuICAgcmVzZXRUb0RlZmF1bHQoKTogdm9pZCB7XG4gICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5kZWZhdWx0KTtcblxuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIC8vIFdoZW4gc3RhdHVzIGNoYW5nZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgaWYgaGF2ZSBlcnJvcnNcbiAgIHByaXZhdGUgY2hlY2tFcnJvcnMoY29udHJvbDogRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICAgIGxldCBlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSBjb250cm9sLmVycm9ycztcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3JzKTtcbiAgICAgIHRoaXMuc2hvd0Vycm9yVmFsdWUgPSB0aGlzLnNob3dFcnJvcigpO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIC8vIEdldCBlcnJvciBtZXNzYWdlIGluIGZ1bmN0aW9uIG9mIGVycm9yIGxpc3QuXG4gICBwcml2YXRlIGdldEVycm9yTWVzc2FnZShlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBzdHJpbmcge1xuICAgICAgaWYgKCFlcnJvcnMpIHtcbiAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5lcnJvcnMpIHtcbiAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eSgncmVxdWlyZWQnKSkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzLnJlcXVpcmVkIHx8IHRoaXMuZXJyb3JzLmdlbmVyaWMgfHwgJyc7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzLmhhc093blByb3BlcnR5KCdtaW5sZW5ndGgnKSkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzLm1pbkxlbmd0aCB8fCB0aGlzLmVycm9ycy5nZW5lcmljIHx8ICcnO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eSgnbWF4bGVuZ3RoJykpIHtcbiAgICAgICAgIHJldHVybiB0aGlzLmVycm9ycy5tYXhMZW5ndGggfHwgdGhpcy5lcnJvcnMuZ2VuZXJpYyB8fCAnJztcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMuaGFzT3duUHJvcGVydHkoJ3BhdHRlcm4nKSkge1xuICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzLnBhdHRlcm4gfHwgdGhpcy5lcnJvcnMuZ2VuZXJpYyB8fCAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcnO1xuICAgfVxuXG59XG4iXX0=