@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
417 lines • 37.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Directive, NgModule, Input, QueryList, Output, EventEmitter, ContentChildren, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { IgxRadioComponent, RadioLabelPosition } from '../../radio/radio.component';
import { IgxRippleModule } from '../ripple/ripple.directive';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
var noop = function () { };
var ɵ0 = noop;
var nextId = 0;
/**
* **Ignite UI for Angular Radio Group** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/radio_button.html)
*
* The Ignite UI Radio Group allows the user to select a single option from an available set of options that are listed side by side.
*
* Example:
* ```html
* <igx-radio-group name="radioGroup">
* <igx-radio *ngFor="let item of ['Foo', 'Bar', 'Baz']" value="{{item}}">
* {{item}}
* </igx-radio>
* </igx-radio-group>
* ```
*/
var IgxRadioGroupDirective = /** @class */ (function () {
function IgxRadioGroupDirective() {
/**
* An event that is emitted after the radio group `value` is changed.
* Provides references to the selected `IgxRadioComponent` and the `value` property as event arguments.
* @memberof IgxRadioGroupDirective
*/
this.change = new EventEmitter();
/**
*@hidden
*/
this.cssClass = 'igx-radio-group';
/**
*@hidden
*/
this._onChangeCallback = noop;
/**
*@hidden
*/
this._name = "igx-radio-group-" + nextId++;
/**
*@hidden
*/
this._value = null;
/**
*@hidden
*/
this._selected = null;
/**
*@hidden
*/
this._isInitialized = false;
/**
*@hidden
*/
this._labelPosition = 'after';
/**
*@hidden
*/
this._disabled = false;
/**
*@hidden
*/
this._required = false;
/**
*@hidden
*/
this.destroy$ = new Subject();
}
IgxRadioGroupDirective_1 = IgxRadioGroupDirective;
Object.defineProperty(IgxRadioGroupDirective.prototype, "value", {
/**
* Sets/gets the `value` attribute.
* ```html
* <igx-radio-group [value] = "'radioButtonValue'"></igx-radio-group>
* ```
* ```typescript
* let value = this.radioGroup.value;
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._value; },
set: function (newValue) {
if (this._value !== newValue) {
this._value = newValue;
this._selectRadioButton();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRadioGroupDirective.prototype, "name", {
/**
* Sets/gets the `name` attribute of the radio group component. All child radio buttons inherits this name.
* ```html
* <igx-radio-group name = "Radio1"></igx-radio-group>
* ```
* ```typescript
* let name = this.radioGroup.name;
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._name; },
set: function (newValue) {
if (this._name !== newValue) {
this._name = newValue;
this._setRadioButtonNames();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRadioGroupDirective.prototype, "required", {
/**
* Sets/gets whether the radio group is required.
* If not set, `required` will have value `false`.
* ```html
* <igx-radio-group [required] = "true"></igx-radio-group>
* ```
* ```typescript
* let isRequired = this.radioGroup.required;
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._required; },
set: function (newValue) {
if (this._required !== newValue) {
this._required = newValue;
this._setRadioButtonsRequired();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRadioGroupDirective.prototype, "disabled", {
/**
* An @Input property that allows you to disable the radio group. By default it's false.
* ```html
* <igx-radio-group [disabled]="true"></igx-radio-group>
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._disabled; },
set: function (newValue) {
if (this._disabled !== newValue) {
this._disabled = newValue;
this._disableRadioButtons();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRadioGroupDirective.prototype, "labelPosition", {
/**
* Sets/gets the position of the `label` in the child radio buttons.
* If not set, `labelPosition` will have value `"after"`.
* ```html
* <igx-radio-group labelPosition = "before"></igx-radio-group>
* ```
* ```typescript
* let labelPosition = this.radioGroup.labelPosition;
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._labelPosition; },
set: function (newValue) {
if (this._labelPosition !== newValue) {
this._labelPosition = newValue === RadioLabelPosition.BEFORE ? RadioLabelPosition.BEFORE : RadioLabelPosition.AFTER;
this._setRadioButtonLabelPosition();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxRadioGroupDirective.prototype, "selected", {
/**
* Sets/gets the selected child radio button.
* ```typescript
* let selectedButton = this.radioGroup.selected;
* this.radioGroup.selected = selectedButton;
* ```
* @memberof IgxRadioGroupDirective
*/
get: function () { return this._selected; },
set: function (selected) {
if (this._selected !== selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
}
},
enumerable: true,
configurable: true
});
IgxRadioGroupDirective.prototype.ngAfterContentInit = function () {
var _this = this;
// The initial value can possibly be set by NgModel and it is possible that
// the OnInit of the NgModel occurs after the OnInit of this class.
this._isInitialized = true;
setTimeout(function () { _this._initRadioButtons(); });
};
/**
* Checks whether the provided value is consistent to the current radio button.
* If it is, the checked attribute will have value `true` and selected property will contain the selected `IgxRadioComponent`.
* ```typescript
* this.radioGroup.writeValue('radioButtonValue');
* ```
*/
IgxRadioGroupDirective.prototype.writeValue = function (value) {
this.value = value;
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; };
/**
*@hidden
*/
IgxRadioGroupDirective.prototype.registerOnTouched = function (fn) {
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
button.registerOnTouched(fn);
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype.ngOnDestroy = function () {
this.destroy$.next(true);
this.destroy$.complete();
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._initRadioButtons = function () {
var _this = this;
if (this.radioButtons) {
var props_1 = { name: this._name, labelPosition: this._labelPosition, disabled: this._disabled, required: this._required };
this.radioButtons.forEach(function (button) {
Object.assign(button, props_1);
if (button.value === _this._value) {
button.checked = true;
_this._selected = button;
}
button.change.pipe(takeUntil(_this.destroy$)).subscribe(function (ev) { return _this._selectedRadioButtonChanged(ev); });
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._selectedRadioButtonChanged = function (args) {
if (this._selected !== args.radio) {
if (this._selected) {
this._selected.checked = false;
}
this._selected = args.radio;
}
this._value = args.value;
if (this._isInitialized) {
this.change.emit(args);
this._onChangeCallback(this.value);
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._setRadioButtonNames = function () {
var _this = this;
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
button.name = _this._name;
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._selectRadioButton = function () {
var _this = this;
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
if (!_this._value) {
// no value - uncheck all radio buttons
if (button.checked) {
button.checked = false;
}
}
else {
if (_this._value === button.value) {
// selected button
if (_this._selected !== button) {
_this._selected = button;
}
if (!button.checked) {
button.select();
}
}
else {
// non-selected button
if (button.checked) {
button.checked = false;
}
}
}
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._setRadioButtonLabelPosition = function () {
var _this = this;
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
button.labelPosition = _this._labelPosition;
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._disableRadioButtons = function () {
var _this = this;
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
button.disabled = _this._disabled;
});
}
};
/**
*@hidden
*/
IgxRadioGroupDirective.prototype._setRadioButtonsRequired = function () {
var _this = this;
if (this.radioButtons) {
this.radioButtons.forEach(function (button) {
button.required = _this._required;
});
}
};
var IgxRadioGroupDirective_1;
__decorate([
ContentChildren(IgxRadioComponent, { descendants: true }),
__metadata("design:type", QueryList)
], IgxRadioGroupDirective.prototype, "radioButtons", void 0);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxRadioGroupDirective.prototype, "value", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxRadioGroupDirective.prototype, "name", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxRadioGroupDirective.prototype, "required", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxRadioGroupDirective.prototype, "disabled", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxRadioGroupDirective.prototype, "labelPosition", null);
__decorate([
Input(),
__metadata("design:type", IgxRadioComponent),
__metadata("design:paramtypes", [IgxRadioComponent])
], IgxRadioGroupDirective.prototype, "selected", null);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], IgxRadioGroupDirective.prototype, "change", void 0);
__decorate([
HostBinding('class.igx-radio-group'),
__metadata("design:type", Object)
], IgxRadioGroupDirective.prototype, "cssClass", void 0);
IgxRadioGroupDirective = IgxRadioGroupDirective_1 = __decorate([
Directive({
exportAs: 'igxRadioGroup',
selector: 'igx-radio-group, [igxRadioGroup]',
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxRadioGroupDirective_1, multi: true }]
})
], IgxRadioGroupDirective);
return IgxRadioGroupDirective;
}());
export { IgxRadioGroupDirective };
/**
* @hidden
*/
var IgxRadioModule = /** @class */ (function () {
function IgxRadioModule() {
}
IgxRadioModule = __decorate([
NgModule({
declarations: [IgxRadioGroupDirective, IgxRadioComponent],
exports: [IgxRadioGroupDirective, IgxRadioComponent],
imports: [IgxRippleModule]
})
], IgxRadioModule);
return IgxRadioModule;
}());
export { IgxRadioModule };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL3JhZGlvL3JhZGlvLWdyb3VwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUVaLGVBQWUsRUFFZixXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsSUFBTSxJQUFJLEdBQUcsY0FBUSxDQUFDLENBQUM7O0FBQ3ZCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVmOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBTUg7SUFBQTtRQXlISTs7OztXQUlHO1FBRU0sV0FBTSxHQUF3QyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUVqRzs7V0FFRztRQUVJLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUVwQzs7V0FFRztRQUNLLHNCQUFpQixHQUFxQixJQUFJLENBQUM7UUFDbkQ7O1dBRUc7UUFDSyxVQUFLLEdBQUcscUJBQW1CLE1BQU0sRUFBSSxDQUFDO1FBQzlDOztXQUVHO1FBQ0ssV0FBTSxHQUFRLElBQUksQ0FBQztRQUMzQjs7V0FFRztRQUNLLGNBQVMsR0FBNkIsSUFBSSxDQUFDO1FBQ25EOztXQUVHO1FBQ0ssbUJBQWMsR0FBRyxLQUFLLENB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QUFpQixFQUFFLFdBQVcsRUFBRSx3QkFBc0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDaEcsQ0FBQztPQUNXLHNCQUFzQixDQXdVbEM7SUFBRCw2QkFBQztDQUFBLEFBeFVELElBd1VDO1NBeFVZLHNCQUFzQjtBQTBVbkM7O0dBRUc7QUFNSDtJQUFBO0lBQThCLENBQUM7SUFBbEIsY0FBYztRQUwxQixRQUFRLENBQUM7WUFDTixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxpQkFBaUIsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxpQkFBaUIsQ0FBQztZQUNwRCxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDN0IsQ0FBQztPQUNXLGNBQWMsQ0FBSTtJQUFELHFCQUFDO0NBQUEsQUFBL0IsSUFBK0I7U0FBbEIsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIE5nTW9kdWxlLFxuICAgIElucHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIE9uRGVzdHJveSxcbiAgICBIb3N0QmluZGluZ1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElneFJhZGlvQ29tcG9uZW50LCBSYWRpb0xhYmVsUG9zaXRpb24sIElDaGFuZ2VSYWRpb0V2ZW50QXJncyB9IGZyb20gJy4uLy4uL3JhZGlvL3JhZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5sZXQgbmV4dElkID0gMDtcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBSYWRpbyBHcm91cCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9yYWRpb19idXR0b24uaHRtbClcbiAqXG4gKiBUaGUgSWduaXRlIFVJIFJhZGlvIEdyb3VwIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYSBzaW5nbGUgb3B0aW9uIGZyb20gYW4gYXZhaWxhYmxlIHNldCBvZiBvcHRpb25zIHRoYXQgYXJlIGxpc3RlZCBzaWRlIGJ5IHNpZGUuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtcmFkaW8tZ3JvdXAgbmFtZT1cInJhZGlvR3JvdXBcIj5cbiAqICAgPGlneC1yYWRpbyAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbJ0ZvbycsICdCYXInLCAnQmF6J11cIiB2YWx1ZT1cInt7aXRlbX19XCI+XG4gKiAgICAgIHt7aXRlbX19XG4gKiAgIDwvaWd4LXJhZGlvPlxuICogPC9pZ3gtcmFkaW8tZ3JvdXA+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgZXhwb3J0QXM6ICdpZ3hSYWRpb0dyb3VwJyxcbiAgICBzZWxlY3RvcjogJ2lneC1yYWRpby1ncm91cCwgW2lneFJhZGlvR3JvdXBdJyxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4UmFkaW9Hcm91cERpcmVjdGl2ZSwgbXVsdGk6IHRydWUgfV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UmFkaW9Hcm91cERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCByYWRpbyBidXR0b25zLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcmFkaW9CdXR0b25zID0gIHRoaXMucmFkaW9Hcm91cC5yYWRpb0J1dHRvbnM7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvR3JvdXBEaXJlY3RpdmVcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJhZGlvQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHB1YmxpYyByYWRpb0J1dHRvbnM6IFF1ZXJ5TGlzdDxJZ3hSYWRpb0NvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGB2YWx1ZWAgYXR0cmlidXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvLWdyb3VwIFt2YWx1ZV0gPSBcIidyYWRpb0J1dHRvblZhbHVlJ1wiPjwvaWd4LXJhZGlvLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdmFsdWUgPSAgdGhpcy5yYWRpb0dyb3VwLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0dyb3VwRGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG4gICAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdFJhZGlvQnV0dG9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgb2YgdGhlIHJhZGlvIGdyb3VwIGNvbXBvbmVudC4gQWxsIGNoaWxkIHJhZGlvIGJ1dHRvbnMgaW5oZXJpdHMgdGhpcyBuYW1lLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvLWdyb3VwIG5hbWUgPSBcIlJhZGlvMVwiPjwvaWd4LXJhZGlvLWdyb3VwPlxuICAgICAqICBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG5hbWUgPSAgdGhpcy5yYWRpb0dyb3VwLm5hbWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFJhZGlvR3JvdXBEaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9uYW1lOyB9XG4gICAgc2V0IG5hbWUobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5fbmFtZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldFJhZGlvQnV0dG9uTmFtZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSByYWRpbyBncm91cCBpcyByZXF1aXJlZC5cbiAgICAgKiBJZiBub3Qgc2V0LCBgcmVxdWlyZWRgIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvLWdyb3VwIFtyZXF1aXJlZF0gPSBcInRydWVcIj48L2lneC1yYWRpby1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmVxdWlyZWQgPSAgdGhpcy5yYWRpb0dyb3VwLnJlcXVpcmVkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0dyb3VwRGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZXF1aXJlZDsgfVxuICAgIHNldCByZXF1aXJlZChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fcmVxdWlyZWQgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0UmFkaW9CdXR0b25zUmVxdWlyZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGUgcmFkaW8gZ3JvdXAuIEJ5IGRlZmF1bHQgaXQncyBmYWxzZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1yYWRpby1ncm91cCBbZGlzYWJsZWRdPVwidHJ1ZVwiPjwvaWd4LXJhZGlvLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0dyb3VwRGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICAgIHNldCBkaXNhYmxlZChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVJhZGlvQnV0dG9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYGxhYmVsYCBpbiB0aGUgY2hpbGQgcmFkaW8gYnV0dG9ucy5cbiAgICAgKiBJZiBub3Qgc2V0LCBgbGFiZWxQb3NpdGlvbmAgd2lsbCBoYXZlIHZhbHVlIGBcImFmdGVyXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXJhZGlvLWdyb3VwIGxhYmVsUG9zaXRpb24gPSBcImJlZm9yZVwiPjwvaWd4LXJhZGlvLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGFiZWxQb3NpdGlvbiA9ICB0aGlzLnJhZGlvR3JvdXAubGFiZWxQb3NpdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Hcm91cERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGxhYmVsUG9zaXRpb24oKTogUmFkaW9MYWJlbFBvc2l0aW9uIHwgc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2xhYmVsUG9zaXRpb247IH1cbiAgICBzZXQgbGFiZWxQb3NpdGlvbihuZXdWYWx1ZTogUmFkaW9MYWJlbFBvc2l0aW9uIHwgc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9sYWJlbFBvc2l0aW9uICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFiZWxQb3NpdGlvbiA9IG5ld1ZhbHVlID09PSBSYWRpb0xhYmVsUG9zaXRpb24uQkVGT1JFID8gUmFkaW9MYWJlbFBvc2l0aW9uLkJFRk9SRSA6IFJhZGlvTGFiZWxQb3NpdGlvbi5BRlRFUjtcbiAgICAgICAgICAgIHRoaXMuX3NldFJhZGlvQnV0dG9uTGFiZWxQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBzZWxlY3RlZCBjaGlsZCByYWRpbyBidXR0b24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzZWxlY3RlZEJ1dHRvbiA9IHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZDtcbiAgICAgKiB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSBzZWxlY3RlZEJ1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4UmFkaW9Hcm91cERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7IH1cbiAgICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IElneFJhZGlvQ29tcG9uZW50IHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSByYWRpbyBncm91cCBgdmFsdWVgIGlzIGNoYW5nZWQuXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgc2VsZWN0ZWQgYElneFJhZGlvQ29tcG9uZW50YCBhbmQgdGhlIGB2YWx1ZWAgcHJvcGVydHkgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqIEBtZW1iZXJvZiBJZ3hSYWRpb0dyb3VwRGlyZWN0aXZlXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8SUNoYW5nZVJhZGlvRXZlbnRBcmdzPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYW5nZVJhZGlvRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcmFkaW8tZ3JvdXAnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtcmFkaW8tZ3JvdXAnO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbmFtZSA9IGBpZ3gtcmFkaW8tZ3JvdXAtJHtuZXh0SWQrK31gO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkOiBJZ3hSYWRpb0NvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sYWJlbFBvc2l0aW9uOiBSYWRpb0xhYmVsUG9zaXRpb24gfCBzdHJpbmcgPSAnYWZ0ZXInO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgLy8gVGhlIGluaXRpYWwgdmFsdWUgY2FuIHBvc3NpYmx5IGJlIHNldCBieSBOZ01vZGVsIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0XG4gICAgICAgIC8vIHRoZSBPbkluaXQgb2YgdGhlIE5nTW9kZWwgb2NjdXJzIGFmdGVyIHRoZSBPbkluaXQgb2YgdGhpcyBjbGFzcy5cbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuX2luaXRSYWRpb0J1dHRvbnMoKTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHZhbHVlIGlzIGNvbnNpc3RlbnQgdG8gdGhlIGN1cnJlbnQgcmFkaW8gYnV0dG9uLlxuICAgICAqIElmIGl0IGlzLCB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUgd2lsbCBoYXZlIHZhbHVlIGB0cnVlYCBhbmQgc2VsZWN0ZWQgcHJvcGVydHkgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCBgSWd4UmFkaW9Db21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnJhZGlvR3JvdXAud3JpdGVWYWx1ZSgncmFkaW9CdXR0b25WYWx1ZScpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKSB7IHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjsgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvQnV0dG9ucykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnJlZ2lzdGVyT25Ub3VjaGVkKGZuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pbml0UmFkaW9CdXR0b25zKCkge1xuICAgICAgICBpZiAodGhpcy5yYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0geyBuYW1lOiB0aGlzLl9uYW1lLCBsYWJlbFBvc2l0aW9uOiB0aGlzLl9sYWJlbFBvc2l0aW9uLCBkaXNhYmxlZDogdGhpcy5fZGlzYWJsZWQsIHJlcXVpcmVkOiB0aGlzLl9yZXF1aXJlZCB9O1xuICAgICAgICAgICAgdGhpcy5yYWRpb0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihidXR0b24sIHByb3BzKTtcblxuICAgICAgICAgICAgICAgIGlmIChidXR0b24udmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBidXR0b247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChldikgPT4gdGhpcy5fc2VsZWN0ZWRSYWRpb0J1dHRvbkNoYW5nZWQoZXYpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRSYWRpb0J1dHRvbkNoYW5nZWQoYXJnczogSUNoYW5nZVJhZGlvRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZCAhPT0gYXJncy5yYWRpbykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBhcmdzLnJhZGlvO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmFsdWUgPSBhcmdzLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFJhZGlvQnV0dG9uTmFtZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvQnV0dG9ucykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLm5hbWUgPSB0aGlzLl9uYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RSYWRpb0J1dHRvbigpIHtcbiAgICAgICAgaWYgKHRoaXMucmFkaW9CdXR0b25zKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vIHZhbHVlIC0gdW5jaGVjayBhbGwgcmFkaW8gYnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnV0dG9uLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT09IGJ1dHRvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQgIT09IGJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gYnV0dG9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbi5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXNlbGVjdGVkIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1dHRvbi5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0UmFkaW9CdXR0b25MYWJlbFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5yYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmFkaW9CdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5sYWJlbFBvc2l0aW9uID0gdGhpcy5fbGFiZWxQb3NpdGlvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlzYWJsZVJhZGlvQnV0dG9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMucmFkaW9CdXR0b25zKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0aGlzLl9kaXNhYmxlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0UmFkaW9CdXR0b25zUmVxdWlyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvQnV0dG9ucykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0J1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnJlcXVpcmVkID0gdGhpcy5fcmVxdWlyZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4UmFkaW9Hcm91cERpcmVjdGl2ZSwgSWd4UmFkaW9Db21wb25lbnRdLFxuICAgIGV4cG9ydHM6IFtJZ3hSYWRpb0dyb3VwRGlyZWN0aXZlLCBJZ3hSYWRpb0NvbXBvbmVudF0sXG4gICAgaW1wb3J0czogW0lneFJpcHBsZU1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UmFkaW9Nb2R1bGUgeyB9XG4iXX0=