@nova-ui/bits
Version:
SolarWinds Nova Framework
178 lines • 28.4 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation, } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { NuiFormFieldControl } from "../form-field/public-api";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../spinner/spinner.component";
// <example-url>./../examples/index.html#/textbox</example-url>
/**
* __Name :__
* NUI Textbox component.
*
*/
export class TextboxComponent {
constructor() {
/**
* Use to enable or disable input autocomplete from browser. Default value is "on".
*/
this.autocomplete = "on";
/**
* Event fired when input text is changed.
*/
this.textChange = new EventEmitter();
/**
* The option to disable the text box.
*/
this.disabled = false;
/**
* Help content provided below the text box.
*/
this.hint = "";
/**
* Value used as a placeholder for the text box.
*/
this.placeholder = "";
/**
* The option to make the text box read only.
*/
this.readonly = false;
/**
* Makes textbox multiline (textarea), specifies rows count
*/
this.rows = 1;
/**
* Use to set type of input (number, password etc.).
*/
this.type = "text";
/**
* Input to apply error state styles
*/
this.isInErrorState = false;
/**
* Input to set aria label text
*/
this.ariaLabel = "Textbox input";
/**
* Event fired when textbox is focused out.
*/
this.blurred = new EventEmitter();
// i18n nui_textbox_optional
this.optionalText = "Optional";
}
focus() {
this.textboxInput.nativeElement.focus();
}
onBlurEventEmit() {
this._onTouched();
this.blurred.emit(this.value);
}
onChangeEvent($event) {
if ($event.target.value !== this.value) {
this.changeValue($event);
this.textChange.emit(this.value);
}
}
onChange(value) { }
_onTouched() { }
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this._onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
changeValue(event) {
this.writeValue(event.target.value);
this.onChange(this.value);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TextboxComponent, selector: "nui-textbox", inputs: { caption: "caption", autocomplete: "autocomplete", info: "info", customBoxWidth: "customBoxWidth", disabled: "disabled", hint: "hint", name: "name", placeholder: "placeholder", readonly: "readonly", rows: "rows", type: "type", value: "value", isInErrorState: "isInErrorState", ariaLabel: "ariaLabel", isBusy: "isBusy" }, outputs: { textChange: "textChange", blurred: "blurred" }, providers: [
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => TextboxComponent),
multi: true,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TextboxComponent),
multi: true,
},
], viewQueries: [{ propertyName: "textboxInput", first: true, predicate: ["textboxInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"nui-textbox\"\n [class.nui-textbox--disabled]=\"disabled\"\n [class.has-error]=\"isInErrorState\"\n>\n <div class=\"has-feedback\" [ngStyle]=\"{ width: customBoxWidth }\">\n <input\n *ngIf=\"!rows || rows <= 1\"\n class=\"form-control input-control nui-textbox__input\"\n value=\"{{ value }}\"\n [autocomplete]=\"autocomplete\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n [type]=\"type\"\n (blur)=\"onBlurEventEmit()\"\n (input)=\"onChangeEvent($event)\"\n [placeholder]=\"placeholder\"\n [readonly]=\"readonly\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-invalid]=\"isInErrorState\"\n #textboxInput\n />\n\n <textarea\n *ngIf=\"rows > 1\"\n class=\"form-control input-control nui-textbox__input\"\n value=\"{{ value }}\"\n [rows]=\"rows\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (blur)=\"onBlurEventEmit()\"\n (input)=\"onChangeEvent($event)\"\n [placeholder]=\"placeholder\"\n [readonly]=\"readonly\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-invalid]=\"isInErrorState\"\n #textboxInput\n ></textarea>\n\n <div class=\"form-control-feedback nui-textbox__busy\">\n <nui-spinner [show]=\"isBusy\"></nui-spinner>\n </div>\n </div>\n</div>\n", styles: [".nui .nui-textbox--disabled .has-feedback .input-control,.nui .nui-textbox--disabled .has-feedback .input-control:hover{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-textbox--bold .nui-textbox__input{line-height:18px;font-size:13px;font-weight:600;color:#111;color:var(--nui-color-text-default,#111)}.nui .nui-textbox__input{min-height:30px}.nui .nui-textbox .has-feedback{position:relative}.nui .nui-textbox .has-feedback .input-control{padding:5px 10px;overflow-y:hidden}.nui .nui-textbox .has-feedback .input-control.nui-textbox__input--multiline{padding-top:5px}.nui .nui-textbox .has-feedback .input-control:focus{outline:none;z-index:500;box-shadow:0 0 0 2px #00c4d280}.nui .nui .nui-textbox--centered .has-feedback .input-control{padding:0;text-align:center}.nui .nui-textbox .input-control{resize:vertical}.nui .nui-textbox .input-control[hidden]{display:none!important}.nui .nui-textbox.has-error .help-block,.nui .nui-textbox.has-error .control-label,.nui .nui-textbox.has-error .radio,.nui .nui-textbox.has-error .checkbox,.nui .nui-textbox.has-error .radio-inline,.nui .nui-textbox.has-error .checkbox-inline,.nui .nui-textbox.has-error.nui-radio label,.nui .nui-textbox.has-error.checkbox label,.nui .nui-textbox.has-error.radio-inline label,.nui .nui-textbox.has-error.checkbox-inline label{color:var(--nui-color-text-default,#111)}.nui .nui-textbox.has-error .nui-validation>div{padding:5px 0;color:var(--nui-color-text-default,#111)}.nui .nui-textbox.has-error .input-group-addon{color:var(--nui-color-text-default,#111);border-color:var(--nui-color-line-critical,#dd2c00);background-color:var(--nui-color-bg-content,#fff)}.nui .nui-textbox.has-error .form-control-feedback{color:var(--nui-color-text-default,#111)}.nui .nui-textbox .form-control-feedback{top:12px;margin:0 7px 0 0;position:absolute;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}.nui .nui-textbox .form-control-feedback.nui-textbox__busy{top:0;margin:0 1px 0 0}.nui .nui-textbox .form-control-feedback svg{position:relative;bottom:3px}.nui .textarea-scrollable .has-feedback .input-control{overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.SpinnerComponent, selector: "nui-spinner", inputs: ["percent", "show", "delay", "allowCancel", "message", "helpText", "ariaLabel", "size"], outputs: ["cancel"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TextboxComponent, decorators: [{
type: Component,
args: [{ selector: "nui-textbox", providers: [
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => TextboxComponent),
multi: true,
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TextboxComponent),
multi: true,
},
], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"nui-textbox\"\n [class.nui-textbox--disabled]=\"disabled\"\n [class.has-error]=\"isInErrorState\"\n>\n <div class=\"has-feedback\" [ngStyle]=\"{ width: customBoxWidth }\">\n <input\n *ngIf=\"!rows || rows <= 1\"\n class=\"form-control input-control nui-textbox__input\"\n value=\"{{ value }}\"\n [autocomplete]=\"autocomplete\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n [type]=\"type\"\n (blur)=\"onBlurEventEmit()\"\n (input)=\"onChangeEvent($event)\"\n [placeholder]=\"placeholder\"\n [readonly]=\"readonly\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-invalid]=\"isInErrorState\"\n #textboxInput\n />\n\n <textarea\n *ngIf=\"rows > 1\"\n class=\"form-control input-control nui-textbox__input\"\n value=\"{{ value }}\"\n [rows]=\"rows\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (blur)=\"onBlurEventEmit()\"\n (input)=\"onChangeEvent($event)\"\n [placeholder]=\"placeholder\"\n [readonly]=\"readonly\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-invalid]=\"isInErrorState\"\n #textboxInput\n ></textarea>\n\n <div class=\"form-control-feedback nui-textbox__busy\">\n <nui-spinner [show]=\"isBusy\"></nui-spinner>\n </div>\n </div>\n</div>\n", styles: [".nui .nui-textbox--disabled .has-feedback .input-control,.nui .nui-textbox--disabled .has-feedback .input-control:hover{color:var(--nui-color-text-disabled,rgba(17, 17, 17, .3))}.nui .nui-textbox--bold .nui-textbox__input{line-height:18px;font-size:13px;font-weight:600;color:#111;color:var(--nui-color-text-default,#111)}.nui .nui-textbox__input{min-height:30px}.nui .nui-textbox .has-feedback{position:relative}.nui .nui-textbox .has-feedback .input-control{padding:5px 10px;overflow-y:hidden}.nui .nui-textbox .has-feedback .input-control.nui-textbox__input--multiline{padding-top:5px}.nui .nui-textbox .has-feedback .input-control:focus{outline:none;z-index:500;box-shadow:0 0 0 2px #00c4d280}.nui .nui .nui-textbox--centered .has-feedback .input-control{padding:0;text-align:center}.nui .nui-textbox .input-control{resize:vertical}.nui .nui-textbox .input-control[hidden]{display:none!important}.nui .nui-textbox.has-error .help-block,.nui .nui-textbox.has-error .control-label,.nui .nui-textbox.has-error .radio,.nui .nui-textbox.has-error .checkbox,.nui .nui-textbox.has-error .radio-inline,.nui .nui-textbox.has-error .checkbox-inline,.nui .nui-textbox.has-error.nui-radio label,.nui .nui-textbox.has-error.checkbox label,.nui .nui-textbox.has-error.radio-inline label,.nui .nui-textbox.has-error.checkbox-inline label{color:var(--nui-color-text-default,#111)}.nui .nui-textbox.has-error .nui-validation>div{padding:5px 0;color:var(--nui-color-text-default,#111)}.nui .nui-textbox.has-error .input-group-addon{color:var(--nui-color-text-default,#111);border-color:var(--nui-color-line-critical,#dd2c00);background-color:var(--nui-color-bg-content,#fff)}.nui .nui-textbox.has-error .form-control-feedback{color:var(--nui-color-text-default,#111)}.nui .nui-textbox .form-control-feedback{top:12px;margin:0 7px 0 0;position:absolute;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}.nui .nui-textbox .form-control-feedback.nui-textbox__busy{top:0;margin:0 1px 0 0}.nui .nui-textbox .form-control-feedback svg{position:relative;bottom:3px}.nui .textarea-scrollable .has-feedback .input-control{overflow-y:auto}\n"] }]
}], propDecorators: { textboxInput: [{
type: ViewChild,
args: ["textboxInput"]
}], caption: [{
type: Input
}], autocomplete: [{
type: Input
}], info: [{
type: Input
}], customBoxWidth: [{
type: Input
}], textChange: [{
type: Output
}], disabled: [{
type: Input
}], hint: [{
type: Input
}], name: [{
type: Input
}], placeholder: [{
type: Input
}], readonly: [{
type: Input
}], rows: [{
type: Input
}], type: [{
type: Input
}], value: [{
type: Input
}], isInErrorState: [{
type: Input
}], ariaLabel: [{
type: Input
}], isBusy: [{
type: Input
}], blurred: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7O0FBRS9ELCtEQUErRDtBQUUvRDs7OztHQUlHO0FBbUJILE1BQU0sT0FBTyxnQkFBZ0I7SUFsQjdCO1FBNkJJOztXQUVHO1FBQ2EsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBVWxEOztXQUVHO1FBQ2MsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBQ2xFOztXQUVHO1FBQ2EsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQzs7V0FFRztRQUNhLFNBQUksR0FBRyxFQUFFLENBQUM7UUFLMUI7O1dBRUc7UUFDYSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztR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QWM7c0JBQTdCLEtBQUs7Z0JBSVcsVUFBVTtzQkFBMUIsTUFBTTtnQkFJUyxRQUFRO3NCQUF2QixLQUFLO2dCQUlVLElBQUk7c0JBQW5CLEtBQUs7Z0JBSVUsSUFBSTtzQkFBbkIsS0FBSztnQkFJVSxXQUFXO3NCQUExQixLQUFLO2dCQUlVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSVUsSUFBSTtzQkFBbkIsS0FBSztnQkFLVSxJQUFJO3NCQUFuQixLQUFLO2dCQUtVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBS1UsY0FBYztzQkFBN0IsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQUtVLE1BQU07c0JBQXJCLEtBQUs7Z0JBS0ksT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuaW1wb3J0IHsgTnVpRm9ybUZpZWxkQ29udHJvbCB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL3B1YmxpYy1hcGlcIjtcblxuLy8gPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvdGV4dGJveDwvZXhhbXBsZS11cmw+XG5cbi8qKlxuICogX19OYW1lIDpfX1xuICogTlVJIFRleHRib3ggY29tcG9uZW50LlxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXRleHRib3hcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3RleHRib3guY29tcG9uZW50Lmh0bWxcIixcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTnVpRm9ybUZpZWxkQ29udHJvbCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRleHRib3hDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGV4dGJveENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIHN0eWxlVXJsczogW1wiLi90ZXh0Ym94LmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFRleHRib3hDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOdWlGb3JtRmllbGRDb250cm9sXG57XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBhY2Nlc3MgaW5wdXQgYW5kIHRleHRhcmVhIG5hdGl2ZSBlbGVtZW50c1xuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoXCJ0ZXh0Ym94SW5wdXRcIikgcHVibGljIHRleHRib3hJbnB1dDogRWxlbWVudFJlZjtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSB1c2VkIGFzIGEgbGFiZWwgZm9yIHRoZSB0ZXh0IGJveC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgY2FwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0byBlbmFibGUgb3IgZGlzYWJsZSBpbnB1dCBhdXRvY29tcGxldGUgZnJvbSBicm93c2VyLiBEZWZhdWx0IHZhbHVlIGlzIFwib25cIi5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b2NvbXBsZXRlOiBcIm9uXCIgfCBcIm9mZlwiID0gXCJvblwiO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIHVzZWQgYXMgYSBpbmZvIGluIHBvcG92ZXIgZm9yIHRoZSB0ZXh0IGJveC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5mbzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVXNlIHRvIHNldCBhIGN1c3RvbSB3aWR0aCBmb3IgdGhlIGlucHV0IGZpZWxkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21Cb3hXaWR0aDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gaW5wdXQgdGV4dCBpcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgdGV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVtYmVyPigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb24gdG8gZGlzYWJsZSB0aGUgdGV4dCBib3guXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogSGVscCBjb250ZW50IHByb3ZpZGVkIGJlbG93IHRoZSB0ZXh0IGJveC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaGludCA9IFwiXCI7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbHVlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHRleHQgYm94LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlciA9IFwiXCI7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbiB0byBtYWtlIHRoZSB0ZXh0IGJveCByZWFkIG9ubHkuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGV4dGJveCBtdWx0aWxpbmUgKHRleHRhcmVhKSwgc3BlY2lmaWVzIHJvd3MgY291bnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcm93cyA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdG8gc2V0IHR5cGUgb2YgaW5wdXQgKG51bWJlciwgcGFzc3dvcmQgZXRjLikuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHR5cGUgPSBcInRleHRcIjtcblxuICAgIC8qKlxuICAgICAqIElucHV0IGluaXRpYWwgdmFsdWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElucHV0IHRvIGFwcGx5IGVycm9yIHN0YXRlIHN0eWxlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc0luRXJyb3JTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogSW5wdXQgdG8gc2V0IGFyaWEgbGFiZWwgdGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyA9IFwiVGV4dGJveCBpbnB1dFwiO1xuXG4gICAgLyoqXG4gICAgICogSW5wdXQgdG8gYXBwbHkgYnVzeSBzdGF0ZSBhbmQgc2hvdyBzcGlubmVyXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGlzQnVzeTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdGV4dGJveCBpcyBmb2N1c2VkIG91dC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgYmx1cnJlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIGkxOG4gbnVpX3RleHRib3hfb3B0aW9uYWxcbiAgICBwcml2YXRlIG9wdGlvbmFsVGV4dCA9IFwiT3B0aW9uYWxcIjtcblxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZXh0Ym94SW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXJFdmVudEVtaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmJsdXJyZWQuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGFuZ2VFdmVudCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC52YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSgkZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy50ZXh0Q2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7fVxuXG4gICAgX29uVG91Y2hlZCgpOiB2b2lkIHt9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VWYWx1ZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cIm51aS10ZXh0Ym94XCJcbiAgICBbY2xhc3MubnVpLXRleHRib3gtLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbY2xhc3MuaGFzLWVycm9yXT1cImlzSW5FcnJvclN0YXRlXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwiaGFzLWZlZWRiYWNrXCIgW25nU3R5bGVdPVwieyB3aWR0aDogY3VzdG9tQm94V2lkdGggfVwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICpuZ0lmPVwiIXJvd3MgfHwgcm93cyA8PSAxXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWNvbnRyb2wgbnVpLXRleHRib3hfX2lucHV0XCJcbiAgICAgICAgICAgIHZhbHVlPVwie3sgdmFsdWUgfX1cIlxuICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1ckV2ZW50RW1pdCgpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpc0luRXJyb3JTdGF0ZVwiXG4gICAgICAgICAgICAjdGV4dGJveElucHV0XG4gICAgICAgIC8+XG5cbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAqbmdJZj1cInJvd3MgPiAxXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWNvbnRyb2wgbnVpLXRleHRib3hfX2lucHV0XCJcbiAgICAgICAgICAgIHZhbHVlPVwie3sgdmFsdWUgfX1cIlxuICAgICAgICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1ckV2ZW50RW1pdCgpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbkNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpc0luRXJyb3JTdGF0ZVwiXG4gICAgICAgICAgICAjdGV4dGJveElucHV0XG4gICAgICAgID48L3RleHRhcmVhPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wtZmVlZGJhY2sgbnVpLXRleHRib3hfX2J1c3lcIj5cbiAgICAgICAgICAgIDxudWktc3Bpbm5lciBbc2hvd109XCJpc0J1c3lcIj48L251aS1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19