@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
398 lines • 34.9 kB
JavaScript
import { __decorate, __extends, __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 = {}));
var noop = function () { };
var ɵ0 = noop;
var 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>
* ```
*/
var IgxSwitchComponent = /** @class */ (function () {
function IgxSwitchComponent() {
/**
* 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";
}
IgxSwitchComponent_1 = IgxSwitchComponent;
/**
* Toggles the checked state of the switch.
* ```typescript
* this.switch.toggle();
* ```
* @memberof IgxSwitchComponent
*/
IgxSwitchComponent.prototype.toggle = function () {
if (this.disabled) {
return;
}
this.checked = !this.checked;
this.focused = false;
this.change.emit({ checked: this.checked, switch: this });
this._onChangeCallback(this.checked);
};
/**
*@hidden
*/
IgxSwitchComponent.prototype._onSwitchChange = function (event) {
event.stopPropagation();
};
/**
*@hidden
*/
IgxSwitchComponent.prototype._onSwitchClick = function (event) {
event.stopPropagation();
this.toggle();
if (isIE()) {
this.nativeCheckbox.nativeElement.blur();
}
};
/**
*@hidden
*/
IgxSwitchComponent.prototype._onLabelClick = function (event) {
this.toggle();
};
/**
*@hidden
*/
IgxSwitchComponent.prototype.onFocus = function (event) {
this.focused = true;
};
/**
*@hidden
*/
IgxSwitchComponent.prototype.onBlur = function (event) {
this.focused = false;
this._onTouchedCallback();
};
/**
*@hidden
*/
IgxSwitchComponent.prototype.writeValue = function (value) {
this._value = value;
this.checked = !!this._value;
};
/** @hidden */
IgxSwitchComponent.prototype.getEditElement = function () {
return this.nativeCheckbox.nativeElement;
};
Object.defineProperty(IgxSwitchComponent.prototype, "labelClass", {
/**
*@hidden
*/
get: function () {
switch (this.labelPosition) {
case SwitchLabelPosition.BEFORE:
return this.cssClass + "__label--before";
case SwitchLabelPosition.AFTER:
default:
return this.cssClass + "__label";
}
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxSwitchComponent.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };
/**
*@hidden
*/
IgxSwitchComponent.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };
var IgxSwitchComponent_1;
__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);
return IgxSwitchComponent;
}());
export { IgxSwitchComponent };
export var IGX_SWITCH_REQUIRED_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(function () { return IgxSwitchRequiredDirective; }),
multi: true
};
/* tslint:disable directive-selector */
var IgxSwitchRequiredDirective = /** @class */ (function (_super) {
__extends(IgxSwitchRequiredDirective, _super);
function IgxSwitchRequiredDirective() {
return _super !== null && _super.apply(this, arguments) || this;
}
IgxSwitchRequiredDirective = __decorate([
Directive({
selector: "igx-switch[required][formControlName],\n igx-switch[required][formControl],\n igx-switch[required][ngModel]",
providers: [IGX_SWITCH_REQUIRED_VALIDATOR]
})
], IgxSwitchRequiredDirective);
return IgxSwitchRequiredDirective;
}(CheckboxRequiredValidator));
export { IgxSwitchRequiredDirective };
/**
* @hidden
*/
var IgxSwitchModule = /** @class */ (function () {
function IgxSwitchModule() {
}
IgxSwitchModule = __decorate([
NgModule({
declarations: [IgxSwitchComponent, IgxSwitchRequiredDirective],
exports: [IgxSwitchComponent, IgxSwitchRequiredDirective],
imports: [IgxRippleModule]
})
], IgxSwitchModule);
return IgxSwitchModule;
}());
export { IgxSwitchModule };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc3dpdGNoL3N3aXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxVQUFVLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFHckQsTUFBTSxDQUFOLElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUMzQix3Q0FBaUIsQ0FBQTtJQUNqQixzQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBRzlCO0FBT0QsSUFBTSxJQUFJLEdBQUcsY0FBUSxDQUFDLENBQUM7O0FBQ3ZCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNmOzs7Ozs7Ozs7Ozs7R0FZRztBQU1IO0lBQUE7UUE4Qkk7Ozs7Ozs7Ozs7V0FVRztRQUVhLE9BQUUsR0FBRyxnQkFBYyxNQUFNLEVBQUksQ0FBQztRQUM5Qzs7Ozs7Ozs7OztXQVVHO1FBQ2EsWUFBTyxHQUFNLElBQUksQ0FBQyxFQUFFLFdBQVEsQ0FBQztRQXVCN0M7Ozs7Ozs7OztXQVNHO1FBQ2EsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4Qzs7Ozs7Ozs7OztXQVVHO1FBQ2Esa0JBQWEsR0FBaUMsT0FBTyxDQUFDO1FBQ3RFOzs7Ozs7Ozs7O1dBVUc7UUFDYSxrQkFBYSxHQUFHLEtBQUss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QyxlQUFlLENBQUM7U0FDN0IsQ0FBQztPQUNXLGVBQWUsQ0FBSTtJQUFELHNCQUFDO0NBQUEsQUFBaEMsSUFBZ0M7U0FBbkIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPdXRwdXQsXG4gICAgUHJvdmlkZXIsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IGlzSUUsIElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5cbmV4cG9ydCBlbnVtIFN3aXRjaExhYmVsUG9zaXRpb24ge1xuICAgIEJFRk9SRSA9ICdiZWZvcmUnLFxuICAgIEFGVEVSID0gJ2FmdGVyJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VTd2l0Y2hFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBzd2l0Y2g6IElneFN3aXRjaENvbXBvbmVudDtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcbmxldCBuZXh0SWQgPSAwO1xuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBTd2l0Y2gqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvc3dpdGNoLmh0bWwpXG4gKlxuICogVGhlIElnbml0ZSBVSSBTd2l0Y2ggbGV0cyB0aGUgdXNlciB0b2dnbGUgYmV0d2VlbiBvbi9vZmYgb3IgdHJ1ZS9mYWxzZSBzdGF0ZXMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtc3dpdGNoIFtjaGVja2VkXT1cInRydWVcIj5cbiAqICAgU2ltcGxlIHN3aXRjaFxuICogPC9pZ3gtc3dpdGNoPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBJZ3hTd2l0Y2hDb21wb25lbnQsIG11bHRpOiB0cnVlIH1dLFxuICAgIHNlbGVjdG9yOiAnaWd4LXN3aXRjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICdzd2l0Y2guY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBFZGl0b3JQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgY2hlY2tib3ggZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoZWNrYm94RWxlbWVudCA9ICB0aGlzLnN3aXRjaC5uYXRpdmVDaGVja2JveDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlQ2hlY2tib3g6IEVsZW1lbnRSZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBsYWJlbCBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxFbGVtZW50ID0gIHRoaXMuc3dpdGNoLm5hdGl2ZUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuYXRpdmVMYWJlbDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbGFiZWwgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsUGxhY2Vob2xkZXIgPSAgdGhpcy5zd2l0Y2gucGxhY2Vob2xkZXJMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXJMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBwbGFjZWhvbGRlckxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBzd2l0Y2ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBgaWRgIG9mIHRoZSBmaXJzdCBzd2l0Y2ggY29tcG9uZW50IHdpbGwgYmUgYFwiaWd4LXN3aXRjaC0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXN3aXRjaCBpZD1cIm15LWZpcnN0LXN3aXRjaFwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN3aXRjaElkID0gIHRoaXMuc3dpdGNoLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZCA9IGBpZ3gtc3dpdGNoLSR7bmV4dElkKyt9YDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGlkIG9mIHRoZSBgbGFiZWxgIGVsZW1lbnQgaW4gdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGxhYmVsIG9mIHRoZSBmaXJzdCBzd2l0Y2ggY29tcG9uZW50IHdpbGwgaGF2ZSB2YWx1ZSBgXCJpZ3gtc3dpdGNoLTAtbGFiZWxcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGxhYmVsSWQ9XCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbElkID0gIHRoaXMuc3dpdGNoLmxhYmVsSWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbElkID0gYCR7dGhpcy5pZH0tbGFiZWxgO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFt2YWx1ZV0gPSBcInN3aXRjaFZhbHVlXCI+PC9pZ3gtc3dpdGNoPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdmFsdWUgPSAgdGhpcy5zd2l0Y2gudmFsdWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYG5hbWVgIGF0dHJpYnV0ZSBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggbmFtZSA9IFwiU3dpdGNoMVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG5hbWUgPSAgdGhpcy5zd2l0Y2gubmFtZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHZhbHVlIG9mIHRoZSBgdGFiaW5kZXhgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggW3RhYmluZGV4XT1cIjFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0YWJJbmRleCA9ICB0aGlzLnN3aXRjaC50YWJpbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGBsYWJlbGAgaW4gdGhlIHN3aXRjaCBjb21wb25lbnQuXG4gICAgICogSWYgbm90IHNldCwgYGxhYmVsUG9zaXRpb25gIHdpbGwgaGF2ZSB2YWx1ZSBgXCJhZnRlclwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggbGFiZWxQb3NpdGlvbj1cImJlZm9yZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsUG9zaXRpb24gPSAgdGhpcy5zd2l0Y2gubGFiZWxQb3NpdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsUG9zaXRpb246IFN3aXRjaExhYmVsUG9zaXRpb24gfCBzdHJpbmcgPSAnYWZ0ZXInO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvRGlzYWJsZXMgdGhlIHJpcHBsZSBlZmZlY3RcbiAgICAgKiBJZiBub3Qgc2V0LCBgZGlzYWJsZVJpcHBsZWAgd2lsbCBoYXZlIHZhbHVlIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtkaXNhYmxlUmlwcGxlXT1cInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JpcHBsZURpc2FibGVkID0gdGhpcy5zd2l0Y2guZGlzYWJsZVJpcHBsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciBzd2l0Y2ggaXMgcmVxdWlyZWQuXG4gICAgICogSWYgbm90IHNldCwgYHJlcXVpcmVkYCB3aWxsIGhhdmUgdmFsdWUgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggW3JlcXVpcmVkXT1cInRydWVcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JlcXVpcmVkID0gdGhpcy5zd2l0Y2gucmVxdWlyZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGFyaWEtbGFiZWxsZWRCeWAgYXR0cmlidXRlLlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSAgdmFsdWUgb2YgYGFyaWEtbGFiZWxsZWRCeWAgd2lsbCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgYGxhYmVsSWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zd2l0Y2ggYXJpYS1sYWJlbGxlZGJ5ID0gXCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWxsZWRCeSA9IHRoaXMuc3dpdGNoLmFyaWFMYWJlbGxlZEJ5O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5sYWJlbElkO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIGFyaWEtbGFiZWw9XCJMYWJlbDFcIj48L2lneC1zd2l0Y2g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWwgPSAgdGhpcy5zd2l0Y2guYXJpYUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgc3dpdGNoIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneFN3aXRjaENvbXBvbmVudGAgYW5kIHRoZSBgY2hlY2tlZGAgcHJvcGVydHkgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ2hhbmdlU3dpdGNoRXZlbnRBcmdzPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYW5nZVN3aXRjaEV2ZW50QXJncz4oKTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgc3dpdGNoIGNvbXBvbmVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN3aXRjaENsYXNzID0gdGhpcy5zd2l0Y2guY3NzQ2xhc3M7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaCcpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1zd2l0Y2gnO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBzd2l0Y2ggaXMgb24gb3Igb2ZmLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgJ2ZhbHNlJy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtc3dpdGNoIFtjaGVja2VkXSA9IFwidHJ1ZVwiPjwvaWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ2hlY2tlZCA9ICB0aGlzLnN3aXRjaC5jaGVja2VkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1zd2l0Y2gtLWNoZWNrZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGVja2VkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgZGlzYWJsZWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc3dpdGNoIFtkaXNhYmxlZF0gPSBcInRydWVcIj48aWd4LXN3aXRjaD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRGlzYWJsZWQgPSAgdGhpcy5zd2l0Y2guZGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXN3aXRjaC0tZGlzYWJsZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBzd2l0Y2ggY29tcG9uZW50IGlzIG9uIGZvY3VzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zd2l0Y2guZm9jdXNlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0ZvY3VzZWQgPSAgdGhpcy5zd2l0Y2guZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtc3dpdGNoLS1mb2N1c2VkJylcbiAgICBwdWJsaWMgZm9jdXNlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpbnB1dElkID0gYCR7dGhpcy5pZH0taW5wdXRgO1xuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zd2l0Y2gudG9nZ2xlKCk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh7IGNoZWNrZWQ6IHRoaXMuY2hlY2tlZCwgc3dpdGNoOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuY2hlY2tlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25Td2l0Y2hDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25Td2l0Y2hDbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcblxuICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25MYWJlbENsaWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkJsdXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9ICEhdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5sYWJlbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFN3aXRjaExhYmVsUG9zaXRpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWwtLWJlZm9yZWA7XG4gICAgICAgICAgICBjYXNlIFN3aXRjaExhYmVsUG9zaXRpb24uQUZURVI6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWxgO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKSB7IHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjsgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkgeyB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuOyB9XG59XG5cbmV4cG9ydCBjb25zdCBJR1hfU1dJVENIX1JFUVVJUkVEX1ZBTElEQVRPUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbi8qIHRzbGludDpkaXNhYmxlIGRpcmVjdGl2ZS1zZWxlY3RvciAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6IGBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtmb3JtQ29udHJvbE5hbWVdLFxuICAgIGlneC1zd2l0Y2hbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpZ3gtc3dpdGNoW3JlcXVpcmVkXVtuZ01vZGVsXWAsXG4gICAgcHJvdmlkZXJzOiBbSUdYX1NXSVRDSF9SRVFVSVJFRF9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaFJlcXVpcmVkRGlyZWN0aXZlIGV4dGVuZHMgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciB7IH1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4U3dpdGNoQ29tcG9uZW50LCBJZ3hTd2l0Y2hSZXF1aXJlZERpcmVjdGl2ZV0sXG4gICAgZXhwb3J0czogW0lneFN3aXRjaENvbXBvbmVudCwgSWd4U3dpdGNoUmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtJZ3hSaXBwbGVNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIElneFN3aXRjaE1vZHVsZSB7IH1cbiJdfQ==