@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
465 lines • 42.2 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 LabelPosition;
(function (LabelPosition) {
LabelPosition["BEFORE"] = "before";
LabelPosition["AFTER"] = "after";
})(LabelPosition || (LabelPosition = {}));
var noop = function () { };
var ɵ0 = noop;
var nextId = 0;
/**
* **Ignite UI for Angular Checkbox** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/checkbox.html)
*
* The Ignite UI Checkbox is a selection control that allows users to make a binary choice. It behaves similarly
* to the native browser checkbox.
*
* Example:
* ```html
* <igx-checkbox checked="true">
* simple checkbox
* </igx-checkbox>
* ```
*/
var IgxCheckboxComponent = /** @class */ (function () {
function IgxCheckboxComponent() {
/**
* Sets/gets the `id` of the checkbox component.
* If not set, the `id` of the first checkbox component will be `"igx-checkbox-0"`.
* ```html
* <igx-checkbox id="my-first-checkbox"></igx-checkbox>
* ```
* ```typescript
* let checkboxId = this.checkbox.id;
* ```
* @memberof IgxCheckboxComponent
*/
this.id = "igx-checkbox-" + nextId++;
/**
* Sets/gets the id of the `label` element.
* If not set, the id of the `label` in the first checkbox component will be `"igx-checkbox-0-label"`.
* ```html
* <igx-checkbox labelId = "Label1"></igx-checkbox>
* ```
* ```typescript
* let labelId = this.checkbox.labelId;
* ```
* @memberof IgxCheckboxComponent
*/
this.labelId = this.id + "-label";
/**
* Sets/gets the value of the `tabindex` attribute.
* ```html
* <igx-checkbox [tabindex] = "1"></igx-checkbox>
* ```
* ```typescript
* let tabIndex = this.checkbox.tabindex;
* ```
* @memberof IgxCheckboxComponent
*/
this.tabindex = null;
/**
* Sets/gets the position of the `label`.
* If not set, the `labelPosition` will have value `"after"`.
* ```html
* <igx-checkbox labelPosition = "before"></igx-checkbox>
* ```
* ```typescript
* let labelPosition = this.checkbox.labelPosition;
* ```
* @memberof IgxCheckboxComponent
*/
this.labelPosition = LabelPosition.AFTER;
/**
* Enables/Disables the ripple effect.
* If not set, `disableRipple` will have value `false`.
* ```html
* <igx-checkbox [disableRipple] = "true"></igx-checkbox>
* ```
* ```typescript
* let isRippleDisabled = this.checkbox.desableRipple;
* ```
* @memberof IgxCheckboxComponent
*/
this.disableRipple = false;
/**
* Sets/gets whether the checkbox is required.
* If not set, `required` will have value `false`.
* ```html
* <igx-checkbox [required] = "true"></igx-checkbox>
* ```
* ```typescript
* let isRequired = this.checkbox.required;
* ```
* @memberof IgxCheckboxComponent
*/
this.required = false;
/**
* Sets/gets the `aria-labelledby` attribute.
* If not set, the `aria-labelledby` will be equal to the value of `labelId` attribute.
* ```html
* <igx-checkbox aria-labelledby = "Checkbox1"></igx-checkbox>
* ```
* ```typescript
* let ariaLabelledBy = this.checkbox.ariaLabelledBy;
* ```
* @memberof IgxCheckboxComponent
*/
this.ariaLabelledBy = this.labelId;
/**
* Sets/gets the value of the `aria-label` attribute.
* ```html
* <igx-checkbox aria-label = "Checkbox1"></igx-checkbox>
* ```
* ```typescript
* let ariaLabel = this.checkbox.aruaLabel;
* ```
* @memberof IgxCheckboxComponent
*/
this.ariaLabel = null;
/**
* An event that is emitted after the checkbox state is changed.
* Provides references to the `IgxCheckboxComponent` and the `checked` property as event arguments.
* @memberof IgxCheckboxComponent
*/
this.change = new EventEmitter();
/**
* Returns the class of the checkbox component.
* ```typescript
* let class = this.checkbox.cssClass;
* ```
* @memberof IgxCheckboxComponent
*/
this.cssClass = 'igx-checkbox';
/**
* Sets/gets whether the checkbox component is on focus.
* Default value is `false`.
* ```typescript
* this.checkbox.focused = true;
* ```
* ```typescript
* let isFocused = this.checkbox.focused;
* ```
* @memberof IgxCheckboxComponent
*/
this.focused = false;
/**
* Sets/gets the checkbox indeterminate visual state.
* Default value is `false`;
* ```html
* <igx-checkbox [indeterminate] = "true"></igx-checkbox>
* ```
* ```typescript
* let isIndeterminate = this.checkbox.indeterminate;
* ```
* @memberof IgxCheckboxComponent
*/
this.indeterminate = false;
/**
* Sets/gets whether the checkbox is checked.
* Default value is `false`.
* ```html
* <igx-checkbox [checked] = "true"></igx-checkbox>
* ```
* ```typescript
* let isChecked = this.checkbox.checked;
* ```
* @memberof IgxCheckboxComponent
*/
this.checked = false;
/**
* Sets/gets whether the checkbox is disabled.
* Default value is `false`.
* ```html
* <igx-checkbox [disabled] = "true"></igx-checkbox>
* ```
* ```typescript
* let isDisabled = this.checkbox.disabled;
* ```
* @memberof IgxCheckboxComponent
*/
this.disabled = false;
/**
* Sets/gets whether the checkbox is readonly.
* Default value is `false`.
* ```html
* <igx-checkbox [readonly]="true"></igx-checkbox>
* ```
* ```typescript
* let readonly = this.checkbox.readonly;
* ```
* @memberof IgxCheckboxComponent
*/
this.readonly = false;
/**
* Sets/gets whether the checkbox should disable all css transitions.
* Default value is `false`.
* ```html
* <igx-checkbox [disableTransitions]="true"></igx-checkbox>
* ```
* ```typescript
* let disableTransitions = this.checkbox.disableTransitions;
* ```
* @memberof IgxCheckboxComponent
*/
this.disableTransitions = false;
/**
*@hidden
*/
this.inputId = this.id + "-input";
/**
*@hidden
*/
this._onTouchedCallback = noop;
/**
* @hidden
*/
this._onChangeCallback = noop;
}
IgxCheckboxComponent_1 = IgxCheckboxComponent;
/**
* If `disabled` is `false`, switches the `checked` state.
* ```typescript
* this.checkbox.toggle();
* ```
* @memberof IgxCheckboxComponent
*/
IgxCheckboxComponent.prototype.toggle = function () {
if (this.disabled || this.readonly) {
return;
}
this.indeterminate = false;
this.focused = false;
this.checked = !this.checked;
this.change.emit({ checked: this.checked, checkbox: this });
this._onChangeCallback(this.checked);
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype._onCheckboxChange = function (event) {
// We have to stop the original checkbox change event
// from bubbling up since we emit our own change event
event.stopPropagation();
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype._onCheckboxClick = function (event) {
// Since the original checkbox is hidden and the label
// is used for styling and to change the checked state of the checkbox,
// we need to prevent the checkbox click event from bubbling up
// as it gets triggered on label click
event.stopPropagation();
if (this.readonly) {
// readonly prevents the component from changing state (see toggle() method).
// However, the native checkbox can still be activated through user interaction (focus + space, label click)
// Prevent the native change so the input remains in sync
event.preventDefault();
}
if (isIE()) {
this.nativeCheckbox.nativeElement.blur();
}
this.toggle();
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype._onLabelClick = function (event) {
// We use a span element as a placeholder label
// in place of the native label, we need to emit
// the change event separately here alongside
// the click event emitted on click
this.toggle();
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype.onFocus = function (event) {
this.focused = true;
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype.onBlur = function (event) {
this.focused = false;
this._onTouchedCallback();
};
/**
*@hidden
*/
IgxCheckboxComponent.prototype.writeValue = function (value) {
this._value = value;
this.checked = !!this._value;
};
Object.defineProperty(IgxCheckboxComponent.prototype, "labelClass", {
/**
*@hidden
*/
get: function () {
switch (this.labelPosition) {
case LabelPosition.BEFORE:
return this.cssClass + "__label--before";
case LabelPosition.AFTER:
default:
return this.cssClass + "__label";
}
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxCheckboxComponent.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };
/**
*@hidden
*/
IgxCheckboxComponent.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; };
/** @hidden */
IgxCheckboxComponent.prototype.getEditElement = function () {
return this.nativeCheckbox.nativeElement;
};
var IgxCheckboxComponent_1;
__decorate([
ViewChild('checkbox', { static: true }),
__metadata("design:type", ElementRef)
], IgxCheckboxComponent.prototype, "nativeCheckbox", void 0);
__decorate([
ViewChild('label', { static: true }),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "nativeLabel", void 0);
__decorate([
ViewChild('placeholderLabel', { static: true }),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "placeholderLabel", void 0);
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "id", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "labelId", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "value", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxCheckboxComponent.prototype, "name", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], IgxCheckboxComponent.prototype, "tabindex", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxCheckboxComponent.prototype, "labelPosition", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "disableRipple", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "required", void 0);
__decorate([
Input('aria-labelledby'),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "ariaLabelledBy", void 0);
__decorate([
Input('aria-label'),
__metadata("design:type", String)
], IgxCheckboxComponent.prototype, "ariaLabel", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], IgxCheckboxComponent.prototype, "change", void 0);
__decorate([
HostBinding('class.igx-checkbox'),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "cssClass", void 0);
__decorate([
HostBinding('class.igx-checkbox--focused'),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "focused", void 0);
__decorate([
HostBinding('class.igx-checkbox--indeterminate'),
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "indeterminate", void 0);
__decorate([
HostBinding('class.igx-checkbox--checked'),
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "checked", void 0);
__decorate([
HostBinding('class.igx-checkbox--disabled'),
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "disabled", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "readonly", void 0);
__decorate([
HostBinding('class.igx-checkbox--plain'),
Input(),
__metadata("design:type", Object)
], IgxCheckboxComponent.prototype, "disableTransitions", void 0);
IgxCheckboxComponent = IgxCheckboxComponent_1 = __decorate([
Component({
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxCheckboxComponent_1, multi: true }],
selector: 'igx-checkbox',
preserveWhitespaces: false,
template: "<input #checkbox class=\"igx-checkbox__input\"\n type=\"checkbox\"\n [id]=\"inputId\"\n [name]=\"name\"\n [value]=\"value\"\n [tabindex]=\"tabindex\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n [checked]=\"checked\"\n [required]=\"required\"\n [attr.aria-checked]=\"checked\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-label]=\"ariaLabel\"\n (change)=\"_onCheckboxChange($event)\"\n (click)=\"_onCheckboxClick($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n\n<div\n igxRipple\n igxRippleTarget=\".igx-checkbox__ripple\"\n [igxRippleDisabled]=\"disableRipple\"\n [igxRippleCentered]=\"true\"\n [igxRippleDuration]=\"300\"\n class=\"igx-checkbox__composite-wrapper\"\n>\n <label #label class=\"igx-checkbox__composite\"\n [attr.for]=\"inputId\">\n <svg class=\"igx-checkbox__composite-mark\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M4.1,12.7 9,17.6 20.3,6.3\" />\n </svg>\n </label>\n\n <div class=\"igx-checkbox__ripple\"></div>\n</div>\n\n<span #placeholderLabel role=\"label\"\n [class]=\"labelClass\"\n [id]=\"labelId\"\n (click)=\"_onLabelClick($event)\">\n <ng-content></ng-content>\n</span>\n"
})
], IgxCheckboxComponent);
return IgxCheckboxComponent;
}());
export { IgxCheckboxComponent };
export var IGX_CHECKBOX_REQUIRED_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(function () { return IgxCheckboxRequiredDirective; }),
multi: true
};
/* tslint:disable directive-selector */
var IgxCheckboxRequiredDirective = /** @class */ (function (_super) {
__extends(IgxCheckboxRequiredDirective, _super);
function IgxCheckboxRequiredDirective() {
return _super !== null && _super.apply(this, arguments) || this;
}
IgxCheckboxRequiredDirective = __decorate([
Directive({
selector: "igx-checkbox[required][formControlName],\n igx-checkbox[required][formControl],\n igx-checkbox[required][ngModel]",
providers: [IGX_CHECKBOX_REQUIRED_VALIDATOR]
})
], IgxCheckboxRequiredDirective);
return IgxCheckboxRequiredDirective;
}(CheckboxRequiredValidator));
export { IgxCheckboxRequiredDirective };
/**
* @hidden
*/
var IgxCheckboxModule = /** @class */ (function () {
function IgxCheckboxModule() {
}
IgxCheckboxModule = __decorate([
NgModule({
declarations: [IgxCheckboxComponent, IgxCheckboxRequiredDirective],
exports: [IgxCheckboxComponent, IgxCheckboxRequiredDirective],
imports: [IgxRippleModule]
})
], IgxCheckboxModule);
return IgxCheckboxModule;
}());
export { IgxCheckboxModule };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxVQUFVLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFHckQsTUFBTSxDQUFOLElBQVksYUFHWDtBQUhELFdBQVksYUFBYTtJQUNyQixrQ0FBaUIsQ0FBQTtJQUNqQixnQ0FBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyxhQUFhLEtBQWIsYUFBYSxRQUd4QjtBQU9ELElBQU0sSUFBSSxHQUFHLGNBQVEsQ0FBQyxDQUFDOztBQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZjs7Ozs7Ozs7Ozs7OztHQWFHO0FBT0g7SUFBQTtRQTZCSTs7Ozs7Ozs7OztXQVVHO1FBRWEsT0FBRSxHQUFHLGtCQUFnQixNQUFNLEVBQUksQ0FBQztRQUNoRDs7Ozs7Ozs7OztXQVVHO1FBQ2EsWUFBTyxHQUFNLElBQUksQ0FBQyxFQUFFLFdBQVEsQ0FBQztRQXVCN0M7Ozs7Ozs7OztXQVNHO1FBQ2EsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4Qzs7Ozs7Ozs7OztXQVVHO1FBQ2Esa0JBQWEsR0FBMkIsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUM1RTs7Ozs7Ozs7OztXQVVHO1FBQ2Esa0JBQWEs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c0M7U0FDekMsQ0FBQztPQUNXLG9CQUFvQixDQXNXaEM7SUFBRCwyQkFBQztDQUFBLEFBdFdELElBc1dDO1NBdFdZLG9CQUFvQjtBQXdXakMsTUFBTSxDQUFDLElBQU0sK0JBQStCLEdBQWE7SUFDckQsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsNEJBQTRCLEVBQTVCLENBQTRCLENBQUM7SUFDM0QsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBRUYsdUNBQXVDO0FBT3ZDO0lBQWtELGdEQUF5QjtJQUEzRTs7SUFBOEUsQ0FBQztJQUFsRSw0QkFBNEI7UUFOeEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLHlIQUVzQjtZQUNoQyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztTQUMvQyxDQUFDO09BQ1csNEJBQTRCLENBQXNDO0lBQUQsbUNBQUM7Q0FBQSxBQUEvRSxDQUFrRCx5QkFBeUIsR0FBSTtTQUFsRSw0QkFBNEI7QUFFekM7O0dBRUc7QUFNSDtJQUFBO0lBQWlDLENBQUM7SUFBckIsaUJBQWlCO1FBTDdCLFFBQVEsQ0FBQztZQUNOLFlBQVksRUFBRSxDQUFDLG9CQUFvQixFQUFFLDRCQUE0QixDQUFDO1lBQ2xFLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixFQUFFLDRCQUE0QixDQUFDO1lBQzdELE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUM3QixDQUFDO09BQ1csaUJBQWlCLENBQUk7SUFBRCx3QkFBQztDQUFBLEFBQWxDLElBQWtDO1NBQXJCLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPdXRwdXQsXG4gICAgUHJvdmlkZXIsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IGlzSUUsIElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5cbmV4cG9ydCBlbnVtIExhYmVsUG9zaXRpb24ge1xuICAgIEJFRk9SRSA9ICdiZWZvcmUnLFxuICAgIEFGVEVSID0gJ2FmdGVyJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGFuZ2VDaGVja2JveEV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBjaGVja2VkOiBib29sZWFuO1xuICAgIGNoZWNrYm94OiBJZ3hDaGVja2JveENvbXBvbmVudDtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcbmxldCBuZXh0SWQgPSAwO1xuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDaGVja2JveCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9jaGVja2JveC5odG1sKVxuICpcbiAqIFRoZSBJZ25pdGUgVUkgQ2hlY2tib3ggaXMgYSBzZWxlY3Rpb24gY29udHJvbCB0aGF0IGFsbG93cyB1c2VycyB0byBtYWtlIGEgYmluYXJ5IGNob2ljZS4gSXQgYmVoYXZlcyBzaW1pbGFybHlcbiAqIHRvIHRoZSBuYXRpdmUgYnJvd3NlciBjaGVja2JveC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1jaGVja2JveCBjaGVja2VkPVwidHJ1ZVwiPlxuICogICBzaW1wbGUgY2hlY2tib3hcbiAqIDwvaWd4LWNoZWNrYm94PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBJZ3hDaGVja2JveENvbXBvbmVudCwgbXVsdGk6IHRydWUgfV0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtY2hlY2tib3gnLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHRlbXBsYXRlVXJsOiAnY2hlY2tib3guY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENoZWNrYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEVkaXRvclByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBjaGVja2JveCBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2hlY2tib3hFbGVtZW50ID0gIHRoaXMuY2hlY2tib3guY2hlY2tib3hFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTd2l0Y2hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjaGVja2JveCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuYXRpdmVDaGVja2JveDogRWxlbWVudFJlZjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byB0aGUgbmF0aXZlIGxhYmVsIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbEVsZW1lbnQgPSAgdGhpcy5jaGVja2JveC5uYXRpdmVMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlTGFiZWw7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGxhYmVsIHBsYWNlaG9sZGVyIGVsZW1lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbFBsYWNlaG9sZGVyID0gIHRoaXMuY2hlY2tib3gucGxhY2Vob2xkZXJMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXJMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBwbGFjZWhvbGRlckxhYmVsO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgY2hlY2tib3ggY29tcG9uZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBgaWRgIG9mIHRoZSBmaXJzdCBjaGVja2JveCBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtY2hlY2tib3gtMFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBpZD1cIm15LWZpcnN0LWNoZWNrYm94XCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjaGVja2JveElkID0gIHRoaXMuY2hlY2tib3guaWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQgPSBgaWd4LWNoZWNrYm94LSR7bmV4dElkKyt9YDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGlkIG9mIHRoZSBgbGFiZWxgIGVsZW1lbnQuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGlkIG9mIHRoZSBgbGFiZWxgIGluIHRoZSBmaXJzdCBjaGVja2JveCBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtY2hlY2tib3gtMC1sYWJlbFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBsYWJlbElkID0gXCJMYWJlbDFcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsSWQgPSAgdGhpcy5jaGVja2JveC5sYWJlbElkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbElkID0gYCR7dGhpcy5pZH0tbGFiZWxgO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggW3ZhbHVlXSA9IFwiJ0NoZWNrYm94VmFsdWUnXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB2YWx1ZSA9ICB0aGlzLmNoZWNrYm94LnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYG5hbWVgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBuYW1lID0gXCJDaGVja2JveDFcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG5hbWUgPSAgdGhpcy5jaGVja2JveC5uYW1lO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggW3RhYmluZGV4XSA9IFwiMVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGFiSW5kZXggPSAgdGhpcy5jaGVja2JveC50YWJpbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdGFiaW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgLyoqXG4gICAgICogIFNldHMvZ2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGBsYWJlbGAuXG4gICAgICogIElmIG5vdCBzZXQsIHRoZSBgbGFiZWxQb3NpdGlvbmAgd2lsbCBoYXZlIHZhbHVlIGBcImFmdGVyXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IGxhYmVsUG9zaXRpb24gPSBcImJlZm9yZVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxQb3NpdGlvbiA9ICB0aGlzLmNoZWNrYm94LmxhYmVsUG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsUG9zaXRpb246IExhYmVsUG9zaXRpb24gfCBzdHJpbmcgPSBMYWJlbFBvc2l0aW9uLkFGVEVSO1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMvRGlzYWJsZXMgdGhlIHJpcHBsZSBlZmZlY3QuXG4gICAgICogSWYgbm90IHNldCwgYGRpc2FibGVSaXBwbGVgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFtkaXNhYmxlUmlwcGxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSaXBwbGVEaXNhYmxlZCA9IHRoaXMuY2hlY2tib3guZGVzYWJsZVJpcHBsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZVJpcHBsZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjaGVja2JveCBpcyByZXF1aXJlZC5cbiAgICAgKiBJZiBub3Qgc2V0LCBgcmVxdWlyZWRgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFtyZXF1aXJlZF0gPSBcInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmVxdWlyZWQgPSAgdGhpcy5jaGVja2JveC5yZXF1aXJlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVxdWlyZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGFyaWEtbGFiZWxsZWRieWAgd2lsbCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgYGxhYmVsSWRgIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBhcmlhLWxhYmVsbGVkYnkgPSBcIkNoZWNrYm94MVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsbGVkQnkgPSAgdGhpcy5jaGVja2JveC5hcmlhTGFiZWxsZWRCeTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5sYWJlbElkO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggYXJpYS1sYWJlbCA9IFwiQ2hlY2tib3gxXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhcmlhTGFiZWwgPSB0aGlzLmNoZWNrYm94LmFydWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciB0aGUgY2hlY2tib3ggc3RhdGUgaXMgY2hhbmdlZC5cbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2VzIHRvIHRoZSBgSWd4Q2hlY2tib3hDb21wb25lbnRgIGFuZCB0aGUgYGNoZWNrZWRgIHByb3BlcnR5IGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3M+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3M+KCk7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNsYXNzID0gIHRoaXMuY2hlY2tib3guY3NzQ2xhc3M7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2hlY2tib3gnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2hlY2tib3gnO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjaGVja2JveCBjb21wb25lbnQgaXMgb24gZm9jdXMuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNoZWNrYm94LmZvY3VzZWQgPSAgdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRm9jdXNlZCA9ICB0aGlzLmNoZWNrYm94LmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2hlY2tib3gtLWZvY3VzZWQnKVxuICAgIHB1YmxpYyBmb2N1c2VkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBjaGVja2JveCBpbmRldGVybWluYXRlIHZpc3VhbCBzdGF0ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWA7XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggW2luZGV0ZXJtaW5hdGVdID0gXCJ0cnVlXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0luZGV0ZXJtaW5hdGUgPSB0aGlzLmNoZWNrYm94LmluZGV0ZXJtaW5hdGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2hlY2tib3gtLWluZGV0ZXJtaW5hdGUnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBpbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFtjaGVja2VkXSA9IFwidHJ1ZVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNDaGVja2VkID0gIHRoaXMuY2hlY2tib3guY2hlY2tlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jaGVja2JveC0tY2hlY2tlZCcpXG4gICAgQElucHV0KCkgcHVibGljIGNoZWNrZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFtkaXNhYmxlZF0gPSBcInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRGlzYWJsZWQgPSB0aGlzLmNoZWNrYm94LmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNoZWNrYm94LS1kaXNhYmxlZCcpXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIHJlYWRvbmx5LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbcmVhZG9ubHldPVwidHJ1ZVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcmVhZG9ubHkgPSB0aGlzLmNoZWNrYm94LnJlYWRvbmx5O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjaGVja2JveCBzaG91bGQgZGlzYWJsZSBhbGwgY3NzIHRyYW5zaXRpb25zLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbZGlzYWJsZVRyYW5zaXRpb25zXT1cInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGRpc2FibGVUcmFuc2l0aW9ucyA9IHRoaXMuY2hlY2tib3guZGlzYWJsZVRyYW5zaXRpb25zO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNoZWNrYm94LS1wbGFpbicpXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpbnB1dElkID0gYCR7dGhpcy5pZH0taW5wdXRgO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICogSWYgYGRpc2FibGVkYCBpcyBgZmFsc2VgLCBzd2l0Y2hlcyB0aGUgYGNoZWNrZWRgIHN0YXRlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNoZWNrYm94LnRvZ2dsZSgpO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcblxuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHsgY2hlY2tlZDogdGhpcy5jaGVja2VkLCBjaGVja2JveDogdGhpcyB9KTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLmNoZWNrZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uQ2hlY2tib3hDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSB0byBzdG9wIHRoZSBvcmlnaW5hbCBjaGVja2JveCBjaGFuZ2UgZXZlbnRcbiAgICAgICAgLy8gZnJvbSBidWJibGluZyB1cCBzaW5jZSB3ZSBlbWl0IG91ciBvd24gY2hhbmdlIGV2ZW50XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgX29uQ2hlY2tib3hDbGljayhldmVudCkge1xuICAgICAgICAvLyBTaW5jZSB0aGUgb3JpZ2luYWwgY2hlY2tib3ggaXMgaGlkZGVuIGFuZCB0aGUgbGFiZWxcbiAgICAgICAgLy8gaXMgdXNlZCBmb3Igc3R5bGluZyBhbmQgdG8gY2hhbmdlIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBjaGVja2JveCxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBjaGVja2JveCBjbGljayBldmVudCBmcm9tIGJ1YmJsaW5nIHVwXG4gICAgICAgIC8vIGFzIGl0IGdldHMgdHJpZ2dlcmVkIG9uIGxhYmVsIGNsaWNrXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAvLyByZWFkb25seSBwcmV2ZW50cyB0aGUgY29tcG9uZW50IGZyb20gY2hhbmdpbmcgc3RhdGUgKHNlZSB0b2dnbGUoKSBtZXRob2QpLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIG5hdGl2ZSBjaGVja2JveCBjYW4gc3RpbGwgYmUgYWN0aXZhdGVkIHRocm91Z2ggdXNlciBpbnRlcmFjdGlvbiAoZm9jdXMgKyBzcGFjZSwgbGFiZWwgY2xpY2spXG4gICAgICAgICAgICAvLyBQcmV2ZW50IHRoZSBuYXRpdmUgY2hhbmdlIHNvIHRoZSBpbnB1dCByZW1haW5zIGluIHN5bmNcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJRSgpKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9vbkxhYmVsQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgLy8gV2UgdXNlIGEgc3BhbiBlbGVtZW50IGFzIGEgcGxhY2Vob2xkZXIgbGFiZWxcbiAgICAgICAgLy8gaW4gcGxhY2Ugb2YgdGhlIG5hdGl2ZSBsYWJlbCwgd2UgbmVlZCB0byBlbWl0XG4gICAgICAgIC8vIHRoZSBjaGFuZ2UgZXZlbnQgc2VwYXJhdGVseSBoZXJlIGFsb25nc2lkZVxuICAgICAgICAvLyB0aGUgY2xpY2sgZXZlbnQgZW1pdHRlZCBvbiBjbGlja1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNoZWNrZWQgPSAhIXRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhYmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmxhYmVsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgTGFiZWxQb3NpdGlvbi5CRUZPUkU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY3NzQ2xhc3N9X19sYWJlbC0tYmVmb3JlYDtcbiAgICAgICAgICAgIGNhc2UgTGFiZWxQb3NpdGlvbi5BRlRFUjpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuY3NzQ2xhc3N9X19sYWJlbGA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpIHsgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuOyB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7IHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47IH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgSUdYX0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJZ3hDaGVja2JveFJlcXVpcmVkRGlyZWN0aXZlKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyogdHNsaW50OmRpc2FibGUgZGlyZWN0aXZlLXNlbGVjdG9yICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogYGlneC1jaGVja2JveFtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICBpZ3gtY2hlY2tib3hbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxcbiAgICBpZ3gtY2hlY2tib3hbcmVxdWlyZWRdW25nTW9kZWxdYCxcbiAgICBwcm92aWRlcnM6IFtJR1hfQ0hFQ0tCT1hfUkVRVUlSRURfVkFMSURBVE9SXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDaGVja2JveFJlcXVpcmVkRGlyZWN0aXZlIGV4dGVuZHMgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciB7IH1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4Q2hlY2tib3hDb21wb25lbnQsIElneENoZWNrYm94UmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hDaGVja2JveENvbXBvbmVudCwgSWd4Q2hlY2tib3hSZXF1aXJlZERpcmVjdGl2ZV0sXG4gICAgaW1wb3J0czogW0lneFJpcHBsZU1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2hlY2tib3hNb2R1bGUgeyB9XG4iXX0=