UNPKG

@catull/igniteui-angular

Version:

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

453 lines 40.7 kB
var IgxCheckboxComponent_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 LabelPosition; (function (LabelPosition) { LabelPosition["BEFORE"] = "before"; LabelPosition["AFTER"] = "after"; })(LabelPosition || (LabelPosition = {})); const noop = () => { }; const ɵ0 = noop; let 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> * ``` */ let IgxCheckboxComponent = IgxCheckboxComponent_1 = class IgxCheckboxComponent { constructor() { /** * 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; } /** * If `disabled` is `false`, switches the `checked` state. * ```typescript * this.checkbox.toggle(); * ``` * @memberof IgxCheckboxComponent */ toggle() { 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 */ _onCheckboxChange(event) { // We have to stop the original checkbox change event // from bubbling up since we emit our own change event event.stopPropagation(); } /** *@hidden */ _onCheckboxClick(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 */ _onLabelClick(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 */ onFocus(event) { this.focused = true; } /** *@hidden */ onBlur(event) { this.focused = false; this._onTouchedCallback(); } /** *@hidden */ writeValue(value) { this._value = value; this.checked = !!this._value; } /** *@hidden */ get labelClass() { switch (this.labelPosition) { case LabelPosition.BEFORE: return `${this.cssClass}__label--before`; case LabelPosition.AFTER: default: return `${this.cssClass}__label`; } } /** *@hidden */ registerOnChange(fn) { this._onChangeCallback = fn; } /** *@hidden */ registerOnTouched(fn) { this._onTouchedCallback = fn; } /** @hidden */ getEditElement() { return this.nativeCheckbox.nativeElement; } }; __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); export { IgxCheckboxComponent }; export const IGX_CHECKBOX_REQUIRED_VALIDATOR = { provide: NG_VALIDATORS, useExisting: forwardRef(() => IgxCheckboxRequiredDirective), multi: true }; /* tslint:disable directive-selector */ let IgxCheckboxRequiredDirective = class IgxCheckboxRequiredDirective extends CheckboxRequiredValidator { }; IgxCheckboxRequiredDirective = __decorate([ Directive({ selector: `igx-checkbox[required][formControlName], igx-checkbox[required][formControl], igx-checkbox[required][ngModel]`, providers: [IGX_CHECKBOX_REQUIRED_VALIDATOR] }) ], IgxCheckboxRequiredDirective); export { IgxCheckboxRequiredDirective }; /** * @hidden */ let IgxCheckboxModule = class IgxCheckboxModule { }; IgxCheckboxModule = __decorate([ NgModule({ declarations: [IgxCheckboxComponent, IgxCheckboxRequiredDirective], exports: [IgxCheckboxComponent, IgxCheckboxRequiredDirective], imports: [IgxRippleModule] }) ], IgxCheckboxModule); export { IgxCheckboxModule }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1QsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBR3JELE1BQU0sQ0FBTixJQUFZLGFBR1g7QUFIRCxXQUFZLGFBQWE7SUFDckIsa0NBQWlCLENBQUE7SUFDakIsZ0NBQWUsQ0FBQTtBQUNuQixDQUFDLEVBSFcsYUFBYSxLQUFiLGFBQWEsUUFHeEI7QUFPRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBQ3ZCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNmOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFPSCxJQUFhLG9CQUFvQiw0QkFBakMsTUFBYSxvQkFBb0I7SUFBakM7UUE2Qkk7Ozs7Ozs7Ozs7V0FVRztRQUVhLE9BQUUsR0FBRyxnQkFBZ0IsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNoRDs7Ozs7Ozs7OztXQVVHO1FBQ2EsWUFBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDO1FBdUI3Qzs7Ozs7Ozs7O1dBU0c7UUFDYSxhQUFRLEdBQVcsSUFBSSxDQUFDO1FBQ3hDOzs7Ozs7Ozs7O1dBVUc7UUFDYSxrQkFBYSxHQUEy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b0IsQ0FzV2hDO1NBdFdZLG9CQUFvQjtBQXdXakMsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQWE7SUFDckQsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztJQUMzRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRix1Q0FBdUM7QUFPdkMsSUFBYSw0QkFBNEIsR0FBekMsTUFBYSw0QkFBNkIsU0FBUSx5QkFBeUI7Q0FBSSxDQUFBO0FBQWxFLDRCQUE0QjtJQU54QyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUU7O29DQUVzQjtRQUNoQyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztLQUMvQyxDQUFDO0dBQ1csNEJBQTRCLENBQXNDO1NBQWxFLDRCQUE0QjtBQUV6Qzs7R0FFRztBQU1ILElBQWEsaUJBQWlCLEdBQTlCLE1BQWEsaUJBQWlCO0NBQUksQ0FBQTtBQUFyQixpQkFBaUI7SUFMN0IsUUFBUSxDQUFDO1FBQ04sWUFBWSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsNEJBQTRCLENBQUM7UUFDbEUsT0FBTyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsNEJBQTRCLENBQUM7UUFDN0QsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQzdCLENBQUM7R0FDVyxpQkFBaUIsQ0FBSTtTQUFyQixpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgTmdNb2R1bGUsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4UmlwcGxlTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpc0lFLCBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgRWRpdG9yUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL2VkaXQtcHJvdmlkZXInO1xuXG5leHBvcnQgZW51bSBMYWJlbFBvc2l0aW9uIHtcbiAgICBCRUZPUkUgPSAnYmVmb3JlJyxcbiAgICBBRlRFUiA9ICdhZnRlcidcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbmdlQ2hlY2tib3hFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBjaGVja2JveDogSWd4Q2hlY2tib3hDb21wb25lbnQ7XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5sZXQgbmV4dElkID0gMDtcbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgQ2hlY2tib3gqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvY2hlY2tib3guaHRtbClcbiAqXG4gKiBUaGUgSWduaXRlIFVJIENoZWNrYm94IGlzIGEgc2VsZWN0aW9uIGNvbnRyb2wgdGhhdCBhbGxvd3MgdXNlcnMgdG8gbWFrZSBhIGJpbmFyeSBjaG9pY2UuIEl0IGJlaGF2ZXMgc2ltaWxhcmx5XG4gKiB0byB0aGUgbmF0aXZlIGJyb3dzZXIgY2hlY2tib3guXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtY2hlY2tib3ggY2hlY2tlZD1cInRydWVcIj5cbiAqICAgc2ltcGxlIGNoZWNrYm94XG4gKiA8L2lneC1jaGVja2JveD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4Q2hlY2tib3hDb21wb25lbnQsIG11bHRpOiB0cnVlIH1dLFxuICAgIHNlbGVjdG9yOiAnaWd4LWNoZWNrYm94JyxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICB0ZW1wbGF0ZVVybDogJ2NoZWNrYm94LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDaGVja2JveENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBFZGl0b3JQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWx1ZTogYW55O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgY2hlY2tib3ggZWxlbWVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNoZWNrYm94RWxlbWVudCA9ICB0aGlzLmNoZWNrYm94LmNoZWNrYm94RWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U3dpdGNoQ29tcG9uZW50XG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tib3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmF0aXZlQ2hlY2tib3g6IEVsZW1lbnRSZWY7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBsYWJlbCBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxFbGVtZW50ID0gIHRoaXMuY2hlY2tib3gubmF0aXZlTGFiZWw7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5hdGl2ZUxhYmVsO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBsYWJlbCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxQbGFjZWhvbGRlciA9ICB0aGlzLmNoZWNrYm94LnBsYWNlaG9sZGVyTGFiZWw7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFN3aXRjaENvbXBvbmVudFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BsYWNlaG9sZGVyTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgcGxhY2Vob2xkZXJMYWJlbDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBpZGAgb2YgdGhlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3QgY2hlY2tib3ggY29tcG9uZW50IHdpbGwgYmUgYFwiaWd4LWNoZWNrYm94LTBcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggaWQ9XCJteS1maXJzdC1jaGVja2JveFwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2hlY2tib3hJZCA9ICB0aGlzLmNoZWNrYm94LmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KCkgcHVibGljIGlkID0gYGlneC1jaGVja2JveC0ke25leHRJZCsrfWA7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBpZCBvZiB0aGUgYGxhYmVsYCBlbGVtZW50LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBpZCBvZiB0aGUgYGxhYmVsYCBpbiB0aGUgZmlyc3QgY2hlY2tib3ggY29tcG9uZW50IHdpbGwgYmUgYFwiaWd4LWNoZWNrYm94LTAtbGFiZWxcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggbGFiZWxJZCA9IFwiTGFiZWwxXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsYWJlbElkID0gIHRoaXMuY2hlY2tib3gubGFiZWxJZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbGFiZWxJZCA9IGAke3RoaXMuaWR9LWxhYmVsYDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGB2YWx1ZWAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFt2YWx1ZV0gPSBcIidDaGVja2JveFZhbHVlJ1wiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdmFsdWUgPSAgdGhpcy5jaGVja2JveC52YWx1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBuYW1lYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggbmFtZSA9IFwiQ2hlY2tib3gxXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBuYW1lID0gIHRoaXMuY2hlY2tib3gubmFtZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGB0YWJpbmRleGAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFt0YWJpbmRleF0gPSBcIjFcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRhYkluZGV4ID0gIHRoaXMuY2hlY2tib3gudGFiaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSBudWxsO1xuICAgIC8qKlxuICAgICAqICBTZXRzL2dldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBgbGFiZWxgLlxuICAgICAqICBJZiBub3Qgc2V0LCB0aGUgYGxhYmVsUG9zaXRpb25gIHdpbGwgaGF2ZSB2YWx1ZSBgXCJhZnRlclwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBsYWJlbFBvc2l0aW9uID0gXCJiZWZvcmVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxhYmVsUG9zaXRpb24gPSAgdGhpcy5jaGVja2JveC5sYWJlbFBvc2l0aW9uO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbFBvc2l0aW9uOiBMYWJlbFBvc2l0aW9uIHwgc3RyaW5nID0gTGFiZWxQb3NpdGlvbi5BRlRFUjtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSByaXBwbGUgZWZmZWN0LlxuICAgICAqIElmIG5vdCBzZXQsIGBkaXNhYmxlUmlwcGxlYCB3aWxsIGhhdmUgdmFsdWUgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbZGlzYWJsZVJpcHBsZV0gPSBcInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmlwcGxlRGlzYWJsZWQgPSB0aGlzLmNoZWNrYm94LmRlc2FibGVSaXBwbGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVSaXBwbGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY2hlY2tib3ggaXMgcmVxdWlyZWQuXG4gICAgICogSWYgbm90IHNldCwgYHJlcXVpcmVkYCB3aWxsIGhhdmUgdmFsdWUgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbcmVxdWlyZWRdID0gXCJ0cnVlXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JlcXVpcmVkID0gIHRoaXMuY2hlY2tib3gucmVxdWlyZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHJlcXVpcmVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIGBsYWJlbElkYCBhdHRyaWJ1dGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggYXJpYS1sYWJlbGxlZGJ5ID0gXCJDaGVja2JveDFcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGFyaWFMYWJlbGxlZEJ5ID0gIHRoaXMuY2hlY2tib3guYXJpYUxhYmVsbGVkQnk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKVxuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IHRoaXMubGFiZWxJZDtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHZhbHVlIG9mIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IGFyaWEtbGFiZWwgPSBcIkNoZWNrYm94MVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXJpYUxhYmVsID0gdGhpcy5jaGVja2JveC5hcnVhTGFiZWw7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJylcbiAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgdGhlIGNoZWNrYm94IHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneENoZWNrYm94Q29tcG9uZW50YCBhbmQgdGhlIGBjaGVja2VkYCBwcm9wZXJ0eSBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNoYW5nZUNoZWNrYm94RXZlbnRBcmdzPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYW5nZUNoZWNrYm94RXZlbnRBcmdzPigpO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjbGFzcyA9ICB0aGlzLmNoZWNrYm94LmNzc0NsYXNzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNoZWNrYm94JylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNoZWNrYm94JztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY2hlY2tib3ggY29tcG9uZW50IGlzIG9uIGZvY3VzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jaGVja2JveC5mb2N1c2VkID0gIHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0ZvY3VzZWQgPSAgdGhpcy5jaGVja2JveC5mb2N1c2VkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNoZWNrYm94LS1mb2N1c2VkJylcbiAgICBwdWJsaWMgZm9jdXNlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgY2hlY2tib3ggaW5kZXRlcm1pbmF0ZSB2aXN1YWwgc3RhdGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgO1xuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNoZWNrYm94IFtpbmRldGVybWluYXRlXSA9IFwidHJ1ZVwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNJbmRldGVybWluYXRlID0gdGhpcy5jaGVja2JveC5pbmRldGVybWluYXRlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDaGVja2JveENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNoZWNrYm94LS1pbmRldGVybWluYXRlJylcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbY2hlY2tlZF0gPSBcInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ2hlY2tlZCA9ICB0aGlzLmNoZWNrYm94LmNoZWNrZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENoZWNrYm94Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2hlY2tib3gtLWNoZWNrZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBjaGVja2VkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGRpc2FibGVkLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jaGVja2JveCBbZGlzYWJsZWRdID0gXCJ0cnVlXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0Rpc2FibGVkID0gdGhpcy5jaGVja2JveC5kaXNhYmxlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jaGVja2JveC0tZGlzYWJsZWQnKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjaGVja2JveCBpcyByZWFkb25seS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggW3JlYWRvbmx5XT1cInRydWVcIj48L2lneC1jaGVja2JveD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHJlYWRvbmx5ID0gdGhpcy5jaGVja2JveC5yZWFkb25seTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY2hlY2tib3ggc2hvdWxkIGRpc2FibGUgYWxsIGNzcyB0cmFuc2l0aW9ucy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2hlY2tib3ggW2Rpc2FibGVUcmFuc2l0aW9uc109XCJ0cnVlXCI+PC9pZ3gtY2hlY2tib3g+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBkaXNhYmxlVHJhbnNpdGlvbnMgPSB0aGlzLmNoZWNrYm94LmRpc2FibGVUcmFuc2l0aW9ucztcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jaGVja2JveC0tcGxhaW4nKVxuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5wdXRJZCA9IGAke3RoaXMuaWR9LWlucHV0YDtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICAgIC8qKlxuICAgICAqIElmIGBkaXNhYmxlZGAgaXMgYGZhbHNlYCwgc3dpdGNoZXMgdGhlIGBjaGVja2VkYCBzdGF0ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jaGVja2JveC50b2dnbGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2hlY2tib3hDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh7IGNoZWNrZWQ6IHRoaXMuY2hlY2tlZCwgY2hlY2tib3g6IHRoaXMgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5jaGVja2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9vbkNoZWNrYm94Q2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIC8vIFdlIGhhdmUgdG8gc3RvcCB0aGUgb3JpZ2luYWwgY2hlY2tib3ggY2hhbmdlIGV2ZW50XG4gICAgICAgIC8vIGZyb20gYnViYmxpbmcgdXAgc2luY2Ugd2UgZW1pdCBvdXIgb3duIGNoYW5nZSBldmVudFxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9vbkNoZWNrYm94Q2xpY2soZXZlbnQpIHtcbiAgICAgICAgLy8gU2luY2UgdGhlIG9yaWdpbmFsIGNoZWNrYm94IGlzIGhpZGRlbiBhbmQgdGhlIGxhYmVsXG4gICAgICAgIC8vIGlzIHVzZWQgZm9yIHN0eWxpbmcgYW5kIHRvIGNoYW5nZSB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgY2hlY2tib3gsXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgY2hlY2tib3ggY2xpY2sgZXZlbnQgZnJvbSBidWJibGluZyB1cFxuICAgICAgICAvLyBhcyBpdCBnZXRzIHRyaWdnZXJlZCBvbiBsYWJlbCBjbGlja1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgICAgICAgLy8gcmVhZG9ubHkgcHJldmVudHMgdGhlIGNvbXBvbmVudCBmcm9tIGNoYW5naW5nIHN0YXRlIChzZWUgdG9nZ2xlKCkgbWV0aG9kKS5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBuYXRpdmUgY2hlY2tib3ggY2FuIHN0aWxsIGJlIGFjdGl2YXRlZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb24gKGZvY3VzICsgc3BhY2UsIGxhYmVsIGNsaWNrKVxuICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgbmF0aXZlIGNoYW5nZSBzbyB0aGUgaW5wdXQgcmVtYWlucyBpbiBzeW5jXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSUUoKSkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfb25MYWJlbENsaWNrKGV2ZW50KSB7XG4gICAgICAgIC8vIFdlIHVzZSBhIHNwYW4gZWxlbWVudCBhcyBhIHBsYWNlaG9sZGVyIGxhYmVsXG4gICAgICAgIC8vIGluIHBsYWNlIG9mIHRoZSBuYXRpdmUgbGFiZWwsIHdlIG5lZWQgdG8gZW1pdFxuICAgICAgICAvLyB0aGUgY2hhbmdlIGV2ZW50IHNlcGFyYXRlbHkgaGVyZSBhbG9uZ3NpZGVcbiAgICAgICAgLy8gdGhlIGNsaWNrIGV2ZW50IGVtaXR0ZWQgb24gY2xpY2tcbiAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uRm9jdXMoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cihldmVudCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jaGVja2VkID0gISF0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBsYWJlbENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5sYWJlbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIExhYmVsUG9zaXRpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWwtLWJlZm9yZWA7XG4gICAgICAgICAgICBjYXNlIExhYmVsUG9zaXRpb24uQUZURVI6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNzc0NsYXNzfV9fbGFiZWxgO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKSB7IHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjsgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkgeyB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuOyB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGdldEVkaXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVDaGVja2JveC5uYXRpdmVFbGVtZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IElHWF9DSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1I6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWd4Q2hlY2tib3hSZXF1aXJlZERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbi8qIHRzbGludDpkaXNhYmxlIGRpcmVjdGl2ZS1zZWxlY3RvciAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6IGBpZ3gtY2hlY2tib3hbcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sXG4gICAgaWd4LWNoZWNrYm94W3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sXG4gICAgaWd4LWNoZWNrYm94W3JlcXVpcmVkXVtuZ01vZGVsXWAsXG4gICAgcHJvdmlkZXJzOiBbSUdYX0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUl1cbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2hlY2tib3hSZXF1aXJlZERpcmVjdGl2ZSBleHRlbmRzIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgeyB9XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW0lneENoZWNrYm94Q29tcG9uZW50LCBJZ3hDaGVja2JveFJlcXVpcmVkRGlyZWN0aXZlXSxcbiAgICBleHBvcnRzOiBbSWd4Q2hlY2tib3hDb21wb25lbnQsIElneENoZWNrYm94UmVxdWlyZWREaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtJZ3hSaXBwbGVNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIElneENoZWNrYm94TW9kdWxlIHsgfVxuIl19