UNPKG

@catull/igniteui-angular

Version:

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

386 lines 33.4 kB
var IgxSwitchComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, Directive, EventEmitter, forwardRef, HostBinding, Input, NgModule, Output, ViewChild, ElementRef } from '@angular/core'; import { CheckboxRequiredValidator, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { IgxRippleModule } from '../directives/ripple/ripple.directive'; import { isIE } from '../core/utils'; export var SwitchLabelPosition; (function (SwitchLabelPosition) { SwitchLabelPosition["BEFORE"] = "before"; SwitchLabelPosition["AFTER"] = "after"; })(SwitchLabelPosition || (SwitchLabelPosition = {})); const noop = () => { }; const ɵ0 = noop; let nextId = 0; /** * **Ignite UI for Angular Switch** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/switch.html) * * The Ignite UI Switch lets the user toggle between on/off or true/false states. * * Example: * ```html * <igx-switch [checked]="true"> * Simple switch * </igx-switch> * ``` */ let IgxSwitchComponent = IgxSwitchComponent_1 = class IgxSwitchComponent { constructor() { /** * Sets/gets the `id` of the switch component. * If not set, the `id` of the first switch component will be `"igx-switch-0"`. * ```html * <igx-switch id="my-first-switch"></igx-switch> * ``` * ```typescript * let switchId = this.switch.id; * ``` * @memberof IgxSwitchComponent */ this.id = `igx-switch-${nextId++}`; /** * Sets/gets the id of the `label` element in the switch component. * If not set, the label of the first switch component will have value `"igx-switch-0-label"`. * ```html * <igx-switch labelId="Label1"></igx-switch> * ``` * ```typescript * let labelId = this.switch.labelId; * ``` * @memberof IgxSwitchComponent */ this.labelId = `${this.id}-label`; /** * Sets/gets the value of the `tabindex` attribute. * ```html * <igx-switch [tabindex]="1"></igx-switch> * ``` * ```typescript * let tabIndex = this.switch.tabindex; * ``` * @memberof IgxSwitchComponent */ this.tabindex = null; /** * Sets/gets the position of the `label` in the switch component. * If not set, `labelPosition` will have value `"after"`. * ```html * <igx-switch labelPosition="before"></igx-switch> * ``` * ```typescript * let labelPosition = this.switch.labelPosition; * ``` * @memberof IgxSwitchComponent */ this.labelPosition = 'after'; /** * Enables/Disables the ripple effect * If not set, `disableRipple` will have value `false`. * ```html * <igx-switch [disableRipple]="true"></igx-switch> * ``` * ```typescript * let isRippleDisabled = this.switch.disableRipple; * ``` * @memberof IgxSwitchComponent */ this.disableRipple = false; /** * Sets/gets whether switch is required. * If not set, `required` will have value `false`. * ```html * <igx-switch [required]="true"></igx-switch> * ``` * ```typescript * let isRequired = this.switch.required; * ``` * @memberof IgxSwitchComponent */ this.required = false; /** * Sets/gets the `aria-labelledBy` attribute. * If not set, the value of `aria-labelledBy` will be equal to the value of `labelId` attribute. * ```html * <igx-switch aria-labelledby = "Label1"></igx-switch> * ``` * ```typescript * let ariaLabelledBy = this.switch.ariaLabelledBy; * ``` * @memberof IgxSwitchComponent */ this.ariaLabelledBy = this.labelId; /** * Sets/gets the value of the `aria-label` attribute. * ```html * <igx-switch aria-label="Label1"></igx-switch> * ``` * ```typescript * let ariaLabel = this.switch.ariaLabel; * ``` * @memberof IgxSwitchComponent */ this.ariaLabel = null; /** * An event that is emitted after the switch state is changed. * Provides references to the `IgxSwitchComponent` and the `checked` property as event arguments. * @memberof IgxSwitchComponent */ this.change = new EventEmitter(); /** *@hidden * @memberof IgxSwitchComponent */ this._onTouchedCallback = noop; /** *@hidden * @memberof IgxSwitchComponent */ this._onChangeCallback = noop; /** * Returns the class of the switch component. * ```typescript * let switchClass = this.switch.cssClass; * ``` * @memberof IgxSwitchComponent */ this.cssClass = 'igx-switch'; /** * Sets/gets whether the switch is on or off. * Default value is 'false'. * ```html * <igx-switch [checked] = "true"></igx-switch> * ``` * ```typescript * let isChecked = this.switch.checked; * ``` * @memberof IgxSwitchComponent */ this.checked = false; /** * Sets/gets the `disabled` attribute. * Default value is `false`. * ```html * <igx-switch [disabled] = "true"><igx-switch> * ``` * ```typescript * let isDisabled = this.switch.disabled; * ``` * @memberof IgxSwitchComponent */ this.disabled = false; /** * Sets/gets whether the switch component is on focus. * Default value is `false`. * ```typescript * this.switch.focused = true; * ``` * ```typescript * let isFocused = this.switch.focused; * ``` * @memberof IgxSwitchComponent */ this.focused = false; /** *@hidden */ this.inputId = `${this.id}-input`; } /** * Toggles the checked state of the switch. * ```typescript * this.switch.toggle(); * ``` * @memberof IgxSwitchComponent */ toggle() { if (this.disabled) { return; } this.checked = !this.checked; this.focused = false; this.change.emit({ checked: this.checked, switch: this }); this._onChangeCallback(this.checked); } /** *@hidden */ _onSwitchChange(event) { event.stopPropagation(); } /** *@hidden */ _onSwitchClick(event) { event.stopPropagation(); this.toggle(); if (isIE()) { this.nativeCheckbox.nativeElement.blur(); } } /** *@hidden */ _onLabelClick(event) { this.toggle(); } /** *@hidden */ onFocus(event) { this.focused = true; } /** *@hidden */ onBlur(event) { this.focused = false; this._onTouchedCallback(); } /** *@hidden */ writeValue(value) { this._value = value; this.checked = !!this._value; } /** @hidden */ getEditElement() { return this.nativeCheckbox.nativeElement; } /** *@hidden */ get labelClass() { switch (this.labelPosition) { case SwitchLabelPosition.BEFORE: return `${this.cssClass}__label--before`; case SwitchLabelPosition.AFTER: default: return `${this.cssClass}__label`; } } /** *@hidden */ registerOnChange(fn) { this._onChangeCallback = fn; } /** *@hidden */ registerOnTouched(fn) { this._onTouchedCallback = fn; } }; __decorate([ ViewChild('checkbox', { static: true }), __metadata("design:type", ElementRef) ], IgxSwitchComponent.prototype, "nativeCheckbox", void 0); __decorate([ ViewChild('label', { static: true }), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "nativeLabel", void 0); __decorate([ ViewChild('placeholderLabel', { static: true }), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "placeholderLabel", void 0); __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "labelId", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "value", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxSwitchComponent.prototype, "name", void 0); __decorate([ Input(), __metadata("design:type", Number) ], IgxSwitchComponent.prototype, "tabindex", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxSwitchComponent.prototype, "labelPosition", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "disableRipple", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "required", void 0); __decorate([ Input('aria-labelledby'), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "ariaLabelledBy", void 0); __decorate([ Input('aria-label'), __metadata("design:type", String) ], IgxSwitchComponent.prototype, "ariaLabel", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], IgxSwitchComponent.prototype, "change", void 0); __decorate([ HostBinding('class.igx-switch'), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "cssClass", void 0); __decorate([ HostBinding('class.igx-switch--checked'), Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "checked", void 0); __decorate([ HostBinding('class.igx-switch--disabled'), Input(), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "disabled", void 0); __decorate([ HostBinding('class.igx-switch--focused'), __metadata("design:type", Object) ], IgxSwitchComponent.prototype, "focused", void 0); IgxSwitchComponent = IgxSwitchComponent_1 = __decorate([ Component({ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxSwitchComponent_1, multi: true }], selector: 'igx-switch', template: "<input #checkbox class=\"igx-switch__input\" type=\"checkbox\"\n [id]=\"inputId\"\n [name]=\"name\"\n [value]=\"value\"\n [tabindex]=\"tabindex\"\n [disabled]=\"disabled\"\n [checked]=\"checked\"\n [required]=\"required\"\n [attr.aria-checked]=\"checked\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-label]=\"ariaLabel\"\n (change)=\"_onSwitchChange($event)\"\n (click)=\"_onSwitchClick($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n\n<label #label class =\"igx-switch__composite\" [for]=\"inputId\"\n igxRipple\n igxRippleTarget=\".igx-switch__ripple\"\n [igxRippleDisabled]=\"disableRipple\"\n [igxRippleCentered]=\"true\"\n [igxRippleDuration]=\"300\">\n <div class=\"igx-switch__composite-thumb\">\n <div class=\"igx-switch__ripple\"></div>\n </div>\n</label>\n\n<span #placeholderLabel role=\"label\"\n [class]=\"labelClass\"\n [id]=\"labelId\"\n (click)=\"_onLabelClick($event)\">\n <ng-content></ng-content>\n</span>\n" }) ], IgxSwitchComponent); export { IgxSwitchComponent }; export const IGX_SWITCH_REQUIRED_VALIDATOR = { provide: NG_VALIDATORS, useExisting: forwardRef(() => IgxSwitchRequiredDirective), multi: true }; /* tslint:disable directive-selector */ let IgxSwitchRequiredDirective = class IgxSwitchRequiredDirective extends CheckboxRequiredValidator { }; IgxSwitchRequiredDirective = __decorate([ Directive({ selector: `igx-switch[required][formControlName], igx-switch[required][formControl], igx-switch[required][ngModel]`, providers: [IGX_SWITCH_REQUIRED_VALIDATOR] }) ], IgxSwitchRequiredDirective); export { IgxSwitchRequiredDirective }; /** * @hidden */ let IgxSwitchModule = class IgxSwitchModule { }; IgxSwitchModule = __decorate([ NgModule({ declarations: [IgxSwitchComponent, IgxSwitchRequiredDirective], exports: [IgxSwitchComponent, IgxSwitchRequiredDirective], imports: [IgxRippleModule] }) ], IgxSwitchModule); export { IgxSwitchModule }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc3dpdGNoL3N3aXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBR3JELE1BQU0sQ0FBTixJQUFZLG1CQUdYO0FBSEQsV0FBWSxtQkFBbUI7SUFDM0Isd0NBQWlCLENBQUE7SUFDakIsc0NBQWUsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUc5QjtBQU9ELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7QUFDdkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2Y7Ozs7Ozs7Ozs7OztHQVlHO0FBTUgsSUFBYSxrQkFBa0IsMEJBQS9CLE1BQWEsa0JBQWtCO0lBQS9CO1FBOEJJOzs7Ozs7Ozs7O1dBVUc7UUFFYSxPQUFFLEdBQUcsY0FBYyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlDOzs7Ozs7Ozs7O1dBVUc7UUFDYSxZQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUM7UUF1QjdDOzs7Ozs7Ozs7V0FTRztRQUNhLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFDeEM7Ozs7Ozs7Ozs7V0FVRztRQUNhLGtCQUFhLEdBQWlD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Q29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgTmdNb2R1bGUsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4UmlwcGxlTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpc0lFLCBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRWRpdG9yUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL2VkaXQtcHJvdmlkZXInO1xuXG5leHBvcnQgZW51bSBTd2l0Y2hMYWJlbFBvc2l0aW9uIHtcbiAgICBCRUZPUkUgPSAnYmVmb3JlJyxcbiAgICBBRlRFUiA9ICdhZnRlcidcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbmdlU3dpdGNoRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgc3dpdGNoOiBJZ3hTd2l0Y2hDb21wb25lbnQ7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5sZXQgbmV4dElkID0gMDtcbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgU3dpdGNoKiogLVxuICogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvYW5ndWxhci9jb21wb25lbnRzL3N3aXRjaC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgU3dpdGNoIGxldHMgdGhlIHVzZXIgdG9nZ2xlIGJldHdlZW4gb24vb2ZmIG9yIHRydWUvZmFsc2Ugc3RhdGVzLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LXN3aXRjaCBbY2hlY2tlZF09XCJ0cnVlXCI+XG4gKiAgIFNpbXBsZSBzd2l0Y2hcbiAqIDwvaWd4LXN3aXRjaD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4U3dpdGNoQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XSxcbiAgICBzZWxlY3RvcjogJ2lneC1zd2l0Y2gnLFxuICAgIHRlbXBsYXRlVXJsOiAnc3dpdGNoLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRWRpdG9yUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbmF0aXZlIGNoZWNrYm94IGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjaGVja2JveEVsZW1lbnQgPSAgdGhpcy5zd2l0Y2gubmF0aXZlQ2hlY2tib3g7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NoZWNrYm94JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5hdGl2ZUNoZWNrYm94OiBFbGVtZW50UmVmO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgbGFiZWwgZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsRWxlbWVudCA9ICB0aGlzLnN3aXRjaC5uYXRpdmVMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlTGFiZWw7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGxhYmVsIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBsYWNlaG9sZGVyID0gIHRoaXMuc3dpdGNoLnBsYWNlaG9sZGVyTGFiZWw7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BsYWNlaG9sZGVyTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgcGxhY2Vob2xkZXJMYWJlbDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3Qgc3dpdGNoIGNvbXBvbmVudCB3aWxsIGJlIGBcImlneC1zd2l0Y2gtMFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggaWQ9XCJteS1maXJzdC1zd2l0Y2hcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzd2l0Y2hJZCA9ICB0aGlzLnN3aXRjaC5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQgPSBgaWd4LXN3aXRjaC0ke25leHRJZCsrfWA7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBpZCBvZiB0aGUgYGxhYmVsYCBlbGVtZW50IGluIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBsYWJlbCBvZiB0aGUgZmlyc3Qgc3dpdGNoIGNvbXBvbmVudCB3aWxsIGhhdmUgdmFsdWUgYFwiaWd4LXN3aXRjaC0wLWxhYmVsXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBsYWJlbElkPVwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxJZCA9ICB0aGlzLnN3aXRjaC5sYWJlbElkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWxJZCA9IGAke3RoaXMuaWR9LWxhYmVsYDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIG9mIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbdmFsdWVdID0gXCJzd2l0Y2hWYWx1ZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHZhbHVlID0gIHRoaXMuc3dpdGNoLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIG5hbWUgPSBcIlN3aXRjaDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBuYW1lID0gIHRoaXMuc3dpdGNoLm5hbWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFt0YWJpbmRleF09XCIxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGFiSW5kZXggPSAgdGhpcy5zd2l0Y2gudGFiaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBgbGFiZWxgIGluIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIGBsYWJlbFBvc2l0aW9uYCB3aWxsIGhhdmUgdmFsdWUgYFwiYWZ0ZXJcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGxhYmVsUG9zaXRpb249XCJiZWZvcmVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBvc2l0aW9uID0gIHRoaXMuc3dpdGNoLmxhYmVsUG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbFBvc2l0aW9uOiBTd2l0Y2hMYWJlbFBvc2l0aW9uIHwgc3RyaW5nID0gJ2FmdGVyJztcbiAgICAvKipcbiAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSByaXBwbGUgZWZmZWN0XG4gICAgICogSWYgbm90IHNldCwgYGRpc2FibGVSaXBwbGVgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSaXBwbGVEaXNhYmxlZCA9IHRoaXMuc3dpdGNoLmRpc2FibGVSaXBwbGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgc3dpdGNoIGlzIHJlcXVpcmVkLlxuICAgICAqIElmIG5vdCBzZXQsIGByZXF1aXJlZGAgd2lsbCBoYXZlIHZhbHVlIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtyZXF1aXJlZF09XCJ0cnVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSZXF1aXJlZCA9IHRoaXMuc3dpdGNoLnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVxdWlyZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsbGVkQnlgIGF0dHJpYnV0ZS5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgIHZhbHVlIG9mIGBhcmlhLWxhYmVsbGVkQnlgIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIGBsYWJlbElkYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGFyaWEtbGFiZWxsZWRieSA9IFwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsbGVkQnkgPSB0aGlzLnN3aXRjaC5hcmlhTGFiZWxsZWRCeTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKVxuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IHRoaXMubGFiZWxJZDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHZhbHVlIG9mIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBhcmlhLWxhYmVsPVwiTGFiZWwxXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsID0gIHRoaXMuc3dpdGNoLmFyaWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJylcbiAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgdGhlIHN3aXRjaCBzdGF0ZSBpcyBjaGFuZ2VkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hTd2l0Y2hDb21wb25lbnRgIGFuZCB0aGUgYGNoZWNrZWRgIHByb3BlcnR5IGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNoYW5nZVN3aXRjaEV2ZW50QXJncz4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFuZ2VTd2l0Y2hFdmVudEFyZ3M+KCk7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzd2l0Y2hDbGFzcyA9IHRoaXMuc3dpdGNoLmNzc0NsYXNzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtc3dpdGNoJztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgc3dpdGNoIGlzIG9uIG9yIG9mZi5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzICdmYWxzZScuXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LXN3aXRjaCBbY2hlY2tlZF0gPSBcInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0NoZWNrZWQgPSAgdGhpcy5zd2l0Y2guY2hlY2tlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc3dpdGNoLS1jaGVja2VkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgY2hlY2tlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBbZGlzYWJsZWRdID0gXCJ0cnVlXCI+PGlneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0Rpc2FibGVkID0gIHRoaXMuc3dpdGNoLmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gtLWRpc2FibGVkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgc3dpdGNoIGNvbXBvbmVudCBpcyBvbiBmb2N1cy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuc3dpdGNoLmZvY3VzZWQgPSB0cnVlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNGb2N1c2VkID0gIHRoaXMuc3dpdGNoLmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaC0tZm9jdXNlZCcpXG4gICAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5wdXRJZCA9IGAke3RoaXMuaWR9LWlucHV0YDtcbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuc3dpdGNoLnRvZ2dsZSgpO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoeyBjaGVja2VkOiB0aGlzLmNoZWNrZWQsIHN3aXRjaDogdGhpcyB9KTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLmNoZWNrZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uU3dpdGNoQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uU3dpdGNoQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG5cbiAgICAgICAgaWYgKGlzSUUoKSkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uTGFiZWxDbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhIXRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldEVkaXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFiZWxDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubGFiZWxQb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBTd2l0Y2hMYWJlbFBvc2l0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jc3NDbGFzc31fX2xhYmVsLS1iZWZvcmVgO1xuICAgICAgICAgICAgY2FzZSBTd2l0Y2hMYWJlbFBvc2l0aW9uLkFGVEVSOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5jc3NDbGFzc31fX2xhYmVsYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCkgeyB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47IH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHsgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjsgfVxufVxuXG5leHBvcnQgY29uc3QgSUdYX1NXSVRDSF9SRVFVSVJFRF9WQUxJREFUT1I6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSBkaXJlY3RpdmUtc2VsZWN0b3IgKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiBgaWd4LXN3aXRjaFtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaWd4LXN3aXRjaFtyZXF1aXJlZF1bbmdNb2RlbF1gLFxuICAgIHByb3ZpZGVyczogW0lHWF9TV0lUQ0hfUkVRVUlSRURfVkFMSURBVE9SXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZSBleHRlbmRzIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgeyB9XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneFN3aXRjaENvbXBvbmVudCwgSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hTd2l0Y2hDb21wb25lbnQsIElneFN3aXRjaFJlcXVpcmVkRGlyZWN0aXZlXSxcbiAgICBpbXBvcnRzOiBbSWd4UmlwcGxlTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hTd2l0Y2hNb2R1bGUgeyB9XG4iXX0=