UNPKG

@stratio/egeo

Version:
481 lines 35.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-radio/st-radio.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { Component, Input, EventEmitter, Output, Optional, forwardRef, Directive, ContentChildren, QueryList } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { RadioChange } from './st-radio.change'; import { SelectOneDispatcher } from '../utils/unique-dispatcher'; /** @type {?} */ export const MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, // tslint:disable-next-line:no-use-before-declare useExisting: forwardRef((/** * @return {?} */ () => StRadioGroupComponent)), multi: true }; /** @type {?} */ let _uniqueIdCounter = 0; // tslint:disable-next-line:max-classes-per-file export class StRadioGroupComponent { constructor() { this.change = new EventEmitter(); // tslint:disable-next-line:no-use-before-declare this._radios = null; this._value = null; this._selected = null; this._disabled = false; this._name = `st-radio-group-${_uniqueIdCounter++}`; this._controlValueAccessorChangeFn = (/** * @param {?} value * @return {?} */ (value) => { }); this.onTouched = (/** * @return {?} */ () => { }); } /** * @return {?} */ get value() { return this._value; } /** * @param {?} newValue * @return {?} */ set value(newValue) { if (this._value !== newValue) { this._value = newValue; } this.updatedSelectRadioFromValue(); this.checkSelectRadio(); } /** * @return {?} */ get name() { return this._name; } /** * @param {?} value * @return {?} */ set name(value) { this._name = value; this.updateRadioName(); } /** * @return {?} */ get selected() { return this._selected; } /** * @param {?} selected * @return {?} */ set selected(selected) { this._selected = selected; this.value = selected ? selected.value : null; this.checkSelectRadio(); } /** * @return {?} */ get disabled() { return this._disabled; } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = (value != null && value !== false) ? true : null; } /** * @param {?} value * @return {?} */ writeValue(value) { this.value = value; } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this._controlValueAccessorChangeFn = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @return {?} */ emitChangeEvent() { /** @type {?} */ let event = new RadioChange(); event.source = this._selected; event.value = this._value; this.change.emit(event); } /** * @return {?} */ checkSelectRadio() { if (this.selected && !this._selected.checked) { this._selected.checked = true; } } /** * @return {?} */ touch() { if (this.onTouched) { this.onTouched(); } } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @private * @return {?} */ updateRadioName() { if (this._radios) { this._radios.forEach((/** * @param {?} radio * @return {?} */ (radio) => { radio.name = this.name; })); } } /** * @private * @return {?} */ updatedSelectRadioFromValue() { /** @type {?} */ let isAlreadySelected = this._selected != null && this._selected.value === this._value; if (this._radios != null && !isAlreadySelected) { this._selected = null; this._radios.forEach((/** * @param {?} radio * @return {?} */ (radio) => { radio.checked = this.value === radio.value; if (radio.checked) { this._selected = radio; } })); } } } StRadioGroupComponent.decorators = [ { type: Directive, args: [{ selector: 'st-radio-group', providers: [MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR], host: { role: 'radiogroup' } },] } ]; /** @nocollapse */ StRadioGroupComponent.ctorParameters = () => []; StRadioGroupComponent.propDecorators = { change: [{ type: Output }], qaTag: [{ type: Input }], value: [{ type: Input }], name: [{ type: Input }], selected: [{ type: Input }], disabled: [{ type: Input }], _radios: [{ type: ContentChildren, args: [forwardRef((/** * @return {?} */ () => StRadioComponent)), { descendants: true },] }] }; if (false) { /** @type {?} */ StRadioGroupComponent.prototype.change; /** @type {?} */ StRadioGroupComponent.prototype.qaTag; /** @type {?} */ StRadioGroupComponent.prototype._radios; /** @type {?} */ StRadioGroupComponent.prototype._value; /** @type {?} */ StRadioGroupComponent.prototype._selected; /** @type {?} */ StRadioGroupComponent.prototype._disabled; /** @type {?} */ StRadioGroupComponent.prototype._name; /** @type {?} */ StRadioGroupComponent.prototype._controlValueAccessorChangeFn; /** @type {?} */ StRadioGroupComponent.prototype.onTouched; } /** @type {?} */ let idUnique = 0; /** * \@description {Component} [Radio] * * The radio component is used normally in a form acting as the standard html radio input but also user can use it out of a form like a template driven form. * * \@example * * {html} * * ``` * <st-radio-group class ="radio-inline"> * <st-radio value="1">Enabled</st-radio> * <st-radio value="2" [disabled]="true">Disabled</st-radio> * <st-radio value="2" [checked]= "true" [disabled]="true">Disabled checked</st-radio> * </st-radio-group> * ``` * */ export class StRadioComponent { /** * @param {?} radioGroup * @param {?} _radioDispatcher */ constructor(radioGroup, _radioDispatcher) { this._radioDispatcher = _radioDispatcher; /** * \@Input {string} [id='st-radio-<unique id>'] Input Id value */ this.id = `st-radio-${idUnique++}`; /** * \@Input {string} [qaTag='st-radio-<unique id>'] Id value for qa test */ this.qaTag = `st-radio-${idUnique++}`; /** * \@Output {boolean} [change=''] Boolean emitted when radio button is changed */ this.change = new EventEmitter(); this._value = null; this.radioGroup = radioGroup; _radioDispatcher.listen((/** * @param {?} id * @param {?} name * @return {?} */ (id, name) => { if (id !== this.id && name === this.name) { this.checked = false; } })); } /** * \@Input {boolean} [checked=''] Boolean to check the radio button * @return {?} */ get checked() { return this._checked; } /** * @param {?} newCheckedState * @return {?} */ set checked(newCheckedState) { if (this._checked !== newCheckedState) { this._checked = newCheckedState; } if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) { this.radioGroup.selected = this; } else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) { this.radioGroup.selected = null; } if (newCheckedState) { this._radioDispatcher.notify(this.id, this.name); } } /** * \@Input {boolean} [disabled=''] Boolean to disable the radio button * @return {?} */ get disabled() { return this._disabled || (this.radioGroup != null && this.radioGroup.disabled); } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = (value != null && value !== false) ? true : null; } /** * \@Input {boolean} [value=''] Value of the radio button * @return {?} */ get value() { return this._value; } /** * @param {?} value * @return {?} */ set value(value) { if (this._value !== value) { this._value = value; if (this.radioGroup != null) { if (!this.checked) { this.checked = this.radioGroup.value === value; } else { this.radioGroup.selected = null; } } } } /** * @return {?} */ get inputId() { return `${this.id}-input`; } /** * @return {?} */ ngOnInit() { if (this.radioGroup && this.radioGroup.value) { this.checked = this.radioGroup.value === this._value; } if (this.radioGroup) { this.name = this.radioGroup.name; } } /** * @return {?} */ onInputBlur() { if (this.radioGroup) { this.radioGroup.touch(); } } /** * @param {?} event * @return {?} */ onInputClick(event) { event.stopPropagation(); } /** * @param {?} event * @return {?} */ toggleRadio(event) { event.stopPropagation(); /** @type {?} */ let groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value; if (!this.disabled) { this.checked = !this.checked; this.emitChangeEvent(); } if (this.radioGroup) { this.radioGroup._controlValueAccessorChangeFn(this.value); if (groupValueChanged) { this.radioGroup.emitChangeEvent(); } } } /** * @private * @return {?} */ emitChangeEvent() { /** @type {?} */ let event = new RadioChange(); event.source = this; event.value = this._value; this.change.emit(event); } } StRadioComponent.decorators = [ { type: Component, args: [{ selector: 'st-radio', template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<label [attr.for]=\"inputId\" class=\"st-radio\" [ngClass]=\"{'disabled': disabled}\" #label [attr.id]=\"qaTag\">\n <input\n type=\"radio\"\n [id]=\"inputId\"\n [attr.id]=\"\"\n [name]=\"name\"\n [hidden]=\"true\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (blur)=\"onInputBlur()\"\n (change)=\"toggleRadio($event)\"\n (click)=\"onInputClick($event)\"\n [value]=\"value\">\n\n <div class=\"custom-radio\" [ngClass]=\"{'checked' : checked, 'disabled': disabled}\"></div>\n <ng-content></ng-content>\n</label>\n", host: { '[class.sth-radio-checked]': 'checked', '[attr.id]': 'id' }, styles: ["@charset \"UTF-8\";.st-radio{box-sizing:border-box;display:flex;align-content:center;align-items:center;cursor:pointer}.st-radio.disabled .custom-radio{cursor:default}.st-radio .custom-radio{width:15px;height:15px;cursor:pointer;display:inline-block;border-radius:100%;text-align:center;position:relative;box-sizing:border-box;margin-right:5px}.st-radio .custom-radio.checked:before{display:block;position:absolute;content:'';border-radius:100%;height:5px;width:5px;top:4px;left:4px;margin:auto;box-sizing:border-box}"] }] } ]; /** @nocollapse */ StRadioComponent.ctorParameters = () => [ { type: StRadioGroupComponent, decorators: [{ type: Optional }] }, { type: SelectOneDispatcher } ]; StRadioComponent.propDecorators = { id: [{ type: Input }], qaTag: [{ type: Input }], name: [{ type: Input }], checked: [{ type: Input }], disabled: [{ type: Input }], value: [{ type: Input }], change: [{ type: Output }] }; if (false) { /** @type {?} */ StRadioComponent.prototype.radioGroup; /** * \@Input {string} [id='st-radio-<unique id>'] Input Id value * @type {?} */ StRadioComponent.prototype.id; /** * \@Input {string} [qaTag='st-radio-<unique id>'] Id value for qa test * @type {?} */ StRadioComponent.prototype.qaTag; /** * \@Input {string} [name=''] Input name value * @type {?} */ StRadioComponent.prototype.name; /** * \@Output {boolean} [change=''] Boolean emitted when radio button is changed * @type {?} */ StRadioComponent.prototype.change; /** @type {?} */ StRadioComponent.prototype._value; /** @type {?} */ StRadioComponent.prototype._checked; /** @type {?} */ StRadioComponent.prototype._disabled; /** * @type {?} * @private */ StRadioComponent.prototype._radioDispatcher; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtcmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC1yYWRpby9zdC1yYWRpby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFFTixRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUM3RCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVqRSxNQUFNLE9BQU8scUNBQXFDLEdBQVE7SUFDdkQsT0FBTyxFQUFFLGlCQUFpQjs7SUFFMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFDO0lBQ3BELEtBQUssRUFBRSxJQUFJO0NBQ2I7O0lBRUcsZ0JBQWdCLEdBQUcsQ0FBQzs7QUFVeEIsTUFBTSxPQUFPLHFCQUFxQjtJQXlEL0I7UUF0REEsV0FBTSxHQUE4QixJQUFJLFlBQVksRUFBZSxDQUFDOztRQStDcEUsWUFBTyxHQUFnQyxJQUFJLENBQUM7UUFFNUMsV0FBTSxHQUFRLElBQUksQ0FBQztRQUNuQixjQUFTLEdBQXFCLElBQUksQ0FBQztRQUNuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLFVBQUssR0FBVyxrQkFBa0IsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBS3ZELGtDQUE2Qjs7OztRQUF5QixDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFDO1FBRXJFLGNBQVM7OztRQUFjLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQztJ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O1lBQ2hCLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRTtRQUM3QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQzs7O1lBeElILFNBQVMsU0FBQztnQkFDUixRQUFRLEVBQUUsVUFBVTtnQkFDcEIscWdDQUF3QztnQkFFeEMsSUFBSSxFQUFFO29CQUNILDJCQUEyQixFQUFFLFNBQVM7b0JBQ3RDLFdBQVcsRUFBRSxJQUFJO2lCQUNuQjs7YUFDSDs7OztZQXlFNkIscUJBQXFCLHVCQUE1QyxRQUFRO1lBblBOLG1CQUFtQjs7O2lCQStLeEIsS0FBSztvQkFFTCxLQUFLO21CQUVMLEtBQUs7c0JBRUwsS0FBSzt1QkFzQkwsS0FBSztvQkFTTCxLQUFLO3FCQW9CTCxNQUFNOzs7O0lBM0RQLHNDQUFrQzs7Ozs7SUFFbEMsOEJBQStDOzs7OztJQUUvQyxpQ0FBa0Q7Ozs7O0lBRWxELGdDQUFzQjs7Ozs7SUFxRHRCLGtDQUE4RTs7SUFNOUUsa0NBQW1COztJQUNuQixvQ0FBa0I7O0lBQ2xCLHFDQUFtQjs7Ozs7SUFJaEIsNENBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQge1xuICAgQ29tcG9uZW50LFxuICAgSW5wdXQsXG4gICBFdmVudEVtaXR0ZXIsXG4gICBPdXRwdXQsXG4gICBPbkluaXQsXG4gICBPcHRpb25hbCwgZm9yd2FyZFJlZiwgRGlyZWN0aXZlLCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBSYWRpb0NoYW5nZSB9IGZyb20gJy4vc3QtcmFkaW8uY2hhbmdlJztcbmltcG9ydCB7IFNlbGVjdE9uZURpc3BhdGNoZXIgfSBmcm9tICcuLi91dGlscy91bmlxdWUtZGlzcGF0Y2hlcic7XG5cbmV4cG9ydCBjb25zdCBNRF9SQURJT19HUk9VUF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFN0UmFkaW9Hcm91cENvbXBvbmVudCksXG4gICBtdWx0aTogdHJ1ZVxufTtcblxubGV0IF91bmlxdWVJZENvdW50ZXIgPSAwO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWNsYXNzZXMtcGVyLWZpbGVcbkBEaXJlY3RpdmUoe1xuICAgc2VsZWN0b3I6ICdzdC1yYWRpby1ncm91cCcsXG4gICBwcm92aWRlcnM6IFtNRF9SQURJT19HUk9VUF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgIGhvc3Q6IHtcbiAgICAgIHJvbGU6ICdyYWRpb2dyb3VwJ1xuICAgfVxufSlcbmV4cG9ydCBjbGFzcyBTdFJhZGlvR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgIEBPdXRwdXQoKVxuICAgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4oKTtcblxuICAgQElucHV0KClcbiAgIHFhVGFnOiBzdHJpbmc7XG5cbiAgIEBJbnB1dCgpXG4gICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgIH1cblxuICAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlZFNlbGVjdFJhZGlvRnJvbVZhbHVlKCk7XG4gICAgICB0aGlzLmNoZWNrU2VsZWN0UmFkaW8oKTtcbiAgIH1cblxuICAgQElucHV0KClcbiAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgIH1cblxuICAgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVSYWRpb05hbWUoKTtcbiAgIH1cblxuICAgQElucHV0KClcbiAgIGdldCBzZWxlY3RlZCgpOiBTdFJhZGlvQ29tcG9uZW50IHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgIH1cbiAgIHNldCBzZWxlY3RlZChzZWxlY3RlZDogU3RSYWRpb0NvbXBvbmVudCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZCA/IHNlbGVjdGVkLnZhbHVlIDogbnVsbDtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RSYWRpbygpO1xuICAgfVxuXG4gICBASW5wdXQoKVxuICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7IH1cbiAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UpID8gdHJ1ZSA6IG51bGw7XG4gICB9XG5cbiAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11c2UtYmVmb3JlLWRlY2xhcmVcbiAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBTdFJhZGlvQ29tcG9uZW50KSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgX3JhZGlvczogUXVlcnlMaXN0PFN0UmFkaW9Db21wb25lbnQ+ID0gbnVsbDtcblxuICAgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAgX3NlbGVjdGVkOiBTdFJhZGlvQ29tcG9uZW50ID0gbnVsbDtcbiAgIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgX25hbWU6IHN0cmluZyA9IGBzdC1yYWRpby1ncm91cC0ke191bmlxdWVJZENvdW50ZXIrK31gO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICkgeyB9XG5cbiAgIF9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICh2YWx1ZSkgPT4geyB9O1xuXG4gICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICB9XG5cbiAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47XG4gICB9XG5cbiAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICB9XG5cbiAgIGVtaXRDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICAgIGxldCBldmVudCA9IG5ldyBSYWRpb0NoYW5nZSgpO1xuICAgICAgZXZlbnQuc291cmNlID0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgICBldmVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gICB9XG5cbiAgIGNoZWNrU2VsZWN0UmFkaW8oKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiAhdGhpcy5fc2VsZWN0ZWQuY2hlY2tlZCkge1xuICAgICAgICAgdGhpcy5fc2VsZWN0ZWQuY2hlY2tlZCA9IHRydWU7XG4gICAgICB9XG4gICB9XG5cbiAgIHRvdWNoKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfVxuICAgfVxuXG4gICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZVJhZGlvTmFtZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9yYWRpb3MpIHtcbiAgICAgICAgIHRoaXMuX3JhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgICAgICAgICAgcmFkaW8ubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgIH0pO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIHVwZGF0ZWRTZWxlY3RSYWRpb0Zyb21WYWx1ZSgpOiB2b2lkIHtcbiAgICAgIGxldCBpc0FscmVhZHlTZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGVkICE9IG51bGwgJiYgdGhpcy5fc2VsZWN0ZWQudmFsdWUgPT09IHRoaXMuX3ZhbHVlO1xuXG4gICAgICBpZiAodGhpcy5fcmFkaW9zICE9IG51bGwgJiYgIWlzQWxyZWFkeVNlbGVjdGVkKSB7XG4gICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICB0aGlzLl9yYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSB0aGlzLnZhbHVlID09PSByYWRpby52YWx1ZTtcbiAgICAgICAgICAgIGlmIChyYWRpby5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHJhZGlvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgICB9XG4gICB9XG59XG5cblxubGV0IGlkVW5pcXVlOiBudW1iZXIgPSAwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiB7Q29tcG9uZW50fSBbUmFkaW9dXG4gKlxuICogVGhlIHJhZGlvIGNvbXBvbmVudCBpcyB1c2VkIG5vcm1hbGx5IGluIGEgZm9ybSBhY3RpbmcgYXMgdGhlIHN0YW5kYXJkIGh0bWwgcmFkaW8gaW5wdXQgYnV0IGFsc28gdXNlciBjYW4gdXNlIGl0IG91dCBvZiBhIGZvcm0gbGlrZSBhIHRlbXBsYXRlIGRyaXZlbiBmb3JtLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICoge2h0bWx9XG4gKlxuICogYGBgXG4gKiA8c3QtcmFkaW8tZ3JvdXAgY2xhc3MgPVwicmFkaW8taW5saW5lXCI+XG4gKiAgICA8c3QtcmFkaW8gdmFsdWU9XCIxXCI+RW5hYmxlZDwvc3QtcmFkaW8+XG4gKiAgICA8c3QtcmFkaW8gdmFsdWU9XCIyXCIgW2Rpc2FibGVkXT1cInRydWVcIj5EaXNhYmxlZDwvc3QtcmFkaW8+XG4gKiAgICA8c3QtcmFkaW8gdmFsdWU9XCIyXCIgW2NoZWNrZWRdPSBcInRydWVcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPkRpc2FibGVkIGNoZWNrZWQ8L3N0LXJhZGlvPlxuICogPC9zdC1yYWRpby1ncm91cD5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXJhZGlvJyxcbiAgIHRlbXBsYXRlVXJsOiAnLi9zdC1yYWRpby5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9zdC1yYWRpby5jb21wb25lbnQuc2NzcyddLFxuICAgaG9zdDoge1xuICAgICAgJ1tjbGFzcy5zdGgtcmFkaW8tY2hlY2tlZF0nOiAnY2hlY2tlZCcsXG4gICAgICAnW2F0dHIuaWRdJzogJ2lkJ1xuICAgfVxufSlcbmV4cG9ydCBjbGFzcyBTdFJhZGlvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgcmFkaW9Hcm91cDogU3RSYWRpb0dyb3VwQ29tcG9uZW50O1xuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbaWQ9J3N0LXJhZGlvLTx1bmlxdWUgaWQ+J10gSW5wdXQgSWQgdmFsdWUgKi9cbiAgIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBgc3QtcmFkaW8tJHtpZFVuaXF1ZSsrfWA7XG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nc3QtcmFkaW8tPHVuaXF1ZSBpZD4nXSBJZCB2YWx1ZSBmb3IgcWEgdGVzdCAqL1xuICAgQElucHV0KCkgcWFUYWc6IHN0cmluZyA9IGBzdC1yYWRpby0ke2lkVW5pcXVlKyt9YDtcbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW25hbWU9JyddIElucHV0IG5hbWUgdmFsdWUgKi9cbiAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtjaGVja2VkPScnXSBCb29sZWFuIHRvIGNoZWNrIHRoZSByYWRpbyBidXR0b24gKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICAgfVxuXG4gICBzZXQgY2hlY2tlZChuZXdDaGVja2VkU3RhdGU6IGJvb2xlYW4pIHtcblxuICAgICAgaWYgKHRoaXMuX2NoZWNrZWQgIT09IG5ld0NoZWNrZWRTdGF0ZSkge1xuICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IG5ld0NoZWNrZWRTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0NoZWNrZWRTdGF0ZSAmJiB0aGlzLnJhZGlvR3JvdXAgJiYgdGhpcy5yYWRpb0dyb3VwLnZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSB0aGlzO1xuICAgICAgfSBlbHNlIGlmICghbmV3Q2hlY2tlZFN0YXRlICYmIHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgIHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdDaGVja2VkU3RhdGUpIHtcbiAgICAgICAgIHRoaXMuX3JhZGlvRGlzcGF0Y2hlci5ub3RpZnkodGhpcy5pZCwgdGhpcy5uYW1lKTtcbiAgICAgIH1cbiAgIH1cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtkaXNhYmxlZD0nJ10gQm9vbGVhbiB0byBkaXNhYmxlIHRoZSByYWRpbyBidXR0b24gKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgfHwgKHRoaXMucmFkaW9Hcm91cCAhPSBudWxsICYmIHRoaXMucmFkaW9Hcm91cC5kaXNhYmxlZCk7XG4gICB9XG5cbiAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UpID8gdHJ1ZSA6IG51bGw7XG4gICB9XG4gICAvKiogQElucHV0IHtib29sZWFufSBbdmFsdWU9JyddIFZhbHVlIG9mIHRoZSByYWRpbyBidXR0b24gKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgIH1cblxuICAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMucmFkaW9Hcm91cC52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwLnNlbGVjdGVkID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgLyoqIEBPdXRwdXQge2Jvb2xlYW59IFtjaGFuZ2U9JyddIEJvb2xlYW4gZW1pdHRlZCB3aGVuIHJhZGlvIGJ1dHRvbiBpcyBjaGFuZ2VkICovXG4gICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4oKTtcblxuICAgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmlkfS1pbnB1dGA7XG4gICB9XG5cbiAgIF92YWx1ZTogYW55ID0gbnVsbDtcbiAgIF9jaGVja2VkOiBib29sZWFuO1xuICAgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIEBPcHRpb25hbCgpIHJhZGlvR3JvdXA6IFN0UmFkaW9Hcm91cENvbXBvbmVudCxcbiAgICAgIHByaXZhdGUgX3JhZGlvRGlzcGF0Y2hlcjogU2VsZWN0T25lRGlzcGF0Y2hlclxuICAgKSB7XG5cbiAgICAgIHRoaXMucmFkaW9Hcm91cCA9IHJhZGlvR3JvdXA7XG4gICAgICBfcmFkaW9EaXNwYXRjaGVyLmxpc3RlbigoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICBpZiAoaWQgIT09IHRoaXMuaWQgJiYgbmFtZSA9PT0gdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgfVxuXG4gICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXAgJiYgdGhpcy5yYWRpb0dyb3VwLnZhbHVlKSB7XG4gICAgICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHRoaXMuX3ZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yYWRpb0dyb3VwKSB7XG4gICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnJhZGlvR3JvdXAubmFtZTtcbiAgICAgIH1cbiAgIH1cblxuICAgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5yYWRpb0dyb3VwKSB7XG4gICAgICAgICB0aGlzLnJhZGlvR3JvdXAudG91Y2goKTtcbiAgICAgIH1cbiAgIH1cblxuICAgb25JbnB1dENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICB9XG5cbiAgIHRvZ2dsZVJhZGlvKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBsZXQgZ3JvdXBWYWx1ZUNoYW5nZWQgPSB0aGlzLnJhZGlvR3JvdXAgJiYgdGhpcy52YWx1ZSAhPT0gdGhpcy5yYWRpb0dyb3VwLnZhbHVlO1xuXG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yYWRpb0dyb3VwKSB7XG4gICAgICAgICB0aGlzLnJhZGlvR3JvdXAuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG5cbiAgICAgICAgIGlmIChncm91cFZhbHVlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgICAgfVxuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGVtaXRDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICAgIGxldCBldmVudCA9IG5ldyBSYWRpb0NoYW5nZSgpO1xuICAgICAgZXZlbnQuc291cmNlID0gdGhpcztcbiAgICAgIGV2ZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgIH1cbn1cbiJdfQ==