UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

206 lines 27.4 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Directive, EventEmitter, Input, Output, TemplateRef, } from "@angular/core"; import _includes from "lodash/includes"; import _isEqual from "lodash/isEqual"; import _isFunction from "lodash/isFunction"; import _isNil from "lodash/isNil"; import _isObject from "lodash/isObject"; import _isString from "lodash/isString"; import _some from "lodash/some"; import { map } from "rxjs/operators"; import { UtilService } from "../../services/util.service"; import * as i0 from "@angular/core"; import * as i1 from "../../services/util.service"; /** * @deprecated in v11 - Use BaseSelectV2 instead - Removal: NUI-5796 */ export class BaseSelect { constructor(utilService) { this.utilService = utilService; /** * Input to set aria label text */ this.ariaLabel = ""; /** * Value for enabling remove value feature */ this.isRemoveValueEnabled = false; /** * * Change event. To subscribe to it you should pass a function, argument of which is ISelectChangeEvent object. */ this.changed = new EventEmitter(); this.valueChange = this.changed.pipe(map(({ newValue }) => newValue)); } ngOnInit() { this.selectedItem = this.value; this.inputValue = this.value ? this.value : ""; } ngOnChanges(changes) { if (changes["value"] && !changes["value"].firstChange) { const value = changes["value"].currentValue; const isInArray = this.displayValue ? _some(this.itemsSource, value) : _includes(this.itemsSource, value); if (isInArray) { this.select(changes["value"].currentValue); } } if (changes.itemsSource && this.selectedItem && this.modelValue) { if (_isString(this.selectedItem)) { const newItemsSource = changes.itemsSource.currentValue; const itemToSelect = newItemsSource.find((i) => i[this.modelValue] === this.selectedItem); if (itemToSelect) { this.select(itemToSelect); } } } } getItemDisplay(item) { if (_isNil(item)) { return ""; } if (this.displayValue) { return item[this.displayValue]; } else if (_isFunction(this.displayValueFn)) { const value = this.displayValueFn({ item }); if (value) { return value; } } return item; } getDisplayValueFormatted(item) { if (_isNil(item)) { return ""; } if (this.displayFormat) { const displayedItem = this.getItemDisplay(item); // handle the case where item isn"t empty // but is garbage w.r.t this.displayValue if (_isNil(displayedItem)) { return ""; } return this.utilService.formatString(this.displayFormat, displayedItem); } return this.getItemDisplay(item); } getIconColor() { return this.isDisabled ? "gray" : "primary-blue"; } isItemSelected(item) { const selectedItem = this.getSelectedItem(); const currentItem = this.displayValue && !_isObject(selectedItem) ? item[this.displayValue] : item; return _isEqual(selectedItem, currentItem); } getSelectedItem() { if (!_isNil(this.itemToSelect)) { return this.itemToSelect; } return this.selectedItem; } select(item) { const oldValue = this.selectedItem; if (!_isEqual(oldValue, item)) { const newValue = this.getItemModel(item); this.changed.emit({ newValue: newValue, oldValue }); this.changeValue(newValue); } else if (item === "") { // Making this check to trigger reactive form validation if initial value is set to empty string // after focus and blur they will be equal and after blur changeValue is not triggered and combobox is pristine. this.changeValue(""); } } getItemModel(item) { return item && this.modelValue ? item[this.modelValue] : item; } onChange(value) { } onTouched() { } writeValue(value) { let selectedItem; if (this.modelValue && this.itemsSource && this.itemsSource.length) { selectedItem = this.itemsSource.find((item) => this.getItemModel(item) === value); } else { selectedItem = value; } this.selectedItem = selectedItem; this.inputValue = _isObject(selectedItem) ? this.getItemDisplay(selectedItem) : selectedItem; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } changeValue(value) { this.writeValue(value); this.onChange(value); this.onTouched(); } setDisabledState(isDisabled) { this.isDisabled = isDisabled; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseSelect, deps: [{ token: i1.UtilService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: BaseSelect, inputs: { isDisabled: "isDisabled", inline: "inline", justified: "justified", itemsSource: "itemsSource", value: "value", icon: "icon", displayFormat: "displayFormat", displayValue: "displayValue", modelValue: "modelValue", placeholder: "placeholder", customTemplate: "customTemplate", isInErrorState: "isInErrorState", ariaLabel: "ariaLabel", isRemoveValueEnabled: "isRemoveValueEnabled" }, outputs: { changed: "changed", valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseSelect, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i1.UtilService }], propDecorators: { isDisabled: [{ type: Input }], inline: [{ type: Input }], justified: [{ type: Input }], itemsSource: [{ type: Input }], value: [{ type: Input }], icon: [{ type: Input }], displayFormat: [{ type: Input }], displayValue: [{ type: Input }], modelValue: [{ type: Input }], placeholder: [{ type: Input }], customTemplate: [{ type: Input }], isInErrorState: [{ type: Input }], ariaLabel: [{ type: Input }], isRemoveValueEnabled: [{ type: Input }], changed: [{ type: Output }], valueChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZWxlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlbGVjdC9iYXNlLXNlbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEdBQ2QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFDO0FBQ2xDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFHMUQ7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLFVBQVU7SUE2RTVCLFlBQWdDLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBdkJ4RDs7V0FFRztRQUNhLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFFdkM7O1dBRUc7UUFDTSx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDL0M7OztXQUdHO1FBQ08sWUFBTyxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBRXZELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQVFoQixDQUFDO0lBRXJELFFBQVE7UUFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUNyQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDbkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWTtnQkFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXpDLElBQUksU0FBUyxFQUFFO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzlDO1NBQ0o7UUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUV2QixDQUFDO2dCQUVyQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUNwQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUNsRCxDQUFDO2dCQUNGLElBQUksWUFBWSxFQUFFO29CQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQzdCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFNTSxjQUFjLENBQUMsSUFBUztRQUMzQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2xDO2FBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRTVDLElBQUksS0FBSyxFQUFFO2dCQUNQLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sd0JBQXdCLENBQUMsSUFBUztRQUNyQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoRCx5Q0FBeUM7WUFDekMseUNBQXlDO1lBQ3pDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN2QixPQUFPLEVBQUUsQ0FBQzthQUNiO1lBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDaEMsSUFBSSxDQUFDLGFBQWEsRUFDbEIsYUFBYSxDQUNoQixDQUFDO1NBQ0w7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFlBQVk7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFTSxjQUFjLENBQUMsSUFBUztRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQ2IsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFZixPQUFPLFFBQVEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzVCO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBUztRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM5QjthQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTtZQUNwQixnR0FBZ0c7WUFDaEcsZ0hBQWdIO1lBQ2hILElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDeEI7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVM7UUFDekIsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2xFLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBVSxJQUFTLENBQUM7SUFFN0IsU0FBUyxLQUFVLENBQUM7SUFFcEIsVUFBVSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxZQUFpQixDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ2hFLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDaEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUM5QyxDQUFDO1NBQ0w7YUFBTTtZQUNILFlBQVksR0FBRyxLQUFLLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUVqQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdkIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQWM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQWM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFVBQW1CO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7K0dBeE9pQixVQUFVO21HQUFWLFVBQVU7OzRGQUFWLFVBQVU7a0JBRC9CLFNBQVM7Z0ZBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxNQUFNO3NCQUFkLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLEtBQUs7c0JBQWIsS0FBSztnQkFJRyxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS1UsU0FBUztzQkFBeEIsS0FBSztnQkFLRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0ksT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IF9pc0VxdWFsIGZyb20gXCJsb2Rhc2gvaXNFcXVhbFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNPYmplY3RcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcImxvZGFzaC9pc1N0cmluZ1wiO1xuaW1wb3J0IF9zb21lIGZyb20gXCJsb2Rhc2gvc29tZVwiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmltcG9ydCB7IElTZWxlY3RDaGFuZ2VkRXZlbnQsIElTZWxlY3RHcm91cCB9IGZyb20gXCIuL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3V0aWwuc2VydmljZVwiO1xuaW1wb3J0IHsgTnVpRm9ybUZpZWxkQ29udHJvbCB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL3B1YmxpYy1hcGlcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbiB2MTEgLSBVc2UgQmFzZVNlbGVjdFYyIGluc3RlYWQgLSBSZW1vdmFsOiBOVUktNTc5NlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE51aUZvcm1GaWVsZENvbnRyb2xcbntcbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9uIHRvIGRpc2FibGUgdGhlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb24gdG8gbWFrZSBzZWxlY3QgaW5saW5lLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlubGluZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9uIHRvIGZpbGwgd2lkdGggb2YgYSBjb250YWluZXIuXG4gICAgICovXG4gICAgQElucHV0KCkganVzdGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBib3VuZCB0byB0aGUgcmVwZWF0IG9mIGRyb3Bkb3duIGl0ZW1zLiBJZiB5b3Ugd2FudCB0byBoYXZlIGdyb3VwZWQgZGF0YSB5b3UgbmVlZCB0byBwYXNzXG4gICAgICogZGF0YSBhcyBJU2VsZWN0R3JvdXBbXS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpdGVtc1NvdXJjZTogYW55W10gfCBJU2VsZWN0R3JvdXBbXTtcbiAgICAvKipcbiAgICAgKiBSZWNlaXZlcyBpdGVtIHRoYXQgd2lsbCBiZSBzZWxlY3RlZCBiZWZvcmUgdXNlciBzdGFydHMgdG8gY29tbXVuaWNhdGUgd2l0aCBzZWxlY3QgY29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KCkgdmFsdWU6IGFueTtcbiAgICAvKipcbiAgICAgKiBUaGUgaWNvbiB0byBiZSByZW5kZXJlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgZm9yIGZvcm1hdHRpbmcgc2VsZWN0ZWQgaXRlbSBvbiB0aGUgZHJvcGRvd24gYnV0dG9uLiBVc2VkIG9ubHkgd2l0aCBudWktc2VsZWN0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlGb3JtYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBpdGVtIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZHJvcGRvd24gbWVudS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNwbGF5VmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBpdGVtIHByb3BlcnR5IHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBtb2RlbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBtb2RlbFZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsdWUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc2VsZWN0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTmVlZGVkIHRvIHByb3ZpZGUgb3duIHRlbXBsYXRlIGZvciBldmVyeSBpdGVtIGluIHNlbGVjdCB5b3UgbmVlZCB0byBsaW5rIGBjdXN0b21UZW1wbGF0ZWAgaW5wdXQgd2l0aCBgVGVtcGxhdGVSZWZgXG4gICAgICogdGhhdCByZXByZXNlbnRzIGN1c3RvbSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElucHV0IHRvIGFwcGx5IGVycm9yIHN0YXRlIHN0eWxlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGlzSW5FcnJvclN0YXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW5wdXQgdG8gc2V0IGFyaWEgbGFiZWwgdGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyA9IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZSBmb3IgZW5hYmxpbmcgcmVtb3ZlIHZhbHVlIGZlYXR1cmVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBpc1JlbW92ZVZhbHVlRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQ2hhbmdlIGV2ZW50LiBUbyBzdWJzY3JpYmUgdG8gaXQgeW91IHNob3VsZCBwYXNzIGEgZnVuY3Rpb24sIGFyZ3VtZW50IG9mIHdoaWNoIGlzIElTZWxlY3RDaGFuZ2VFdmVudCBvYmplY3QuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3RDaGFuZ2VkRXZlbnQ8YW55Pj4oKTtcblxuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IHRoaXMuY2hhbmdlZC5waXBlKG1hcCgoeyBuZXdWYWx1ZSB9KSA9PiBuZXdWYWx1ZSkpO1xuXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVtOiBhbnk7XG4gICAgcHVibGljIGRpc3BsYXlWYWx1ZUZuOiAocGFyYW1zOiB7IGl0ZW06IGFueSB9KSA9PiBzdHJpbmc7XG4gICAgcHVibGljIGl0ZW1Ub1NlbGVjdDogYW55O1xuICAgIHB1YmxpYyBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZSA6IFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiAhY2hhbmdlc1tcInZhbHVlXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbXCJ2YWx1ZVwiXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICBjb25zdCBpc0luQXJyYXkgPSB0aGlzLmRpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgICAgID8gX3NvbWUodGhpcy5pdGVtc1NvdXJjZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgOiBfaW5jbHVkZXModGhpcy5pdGVtc1NvdXJjZSwgdmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoaXNJbkFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoY2hhbmdlc1tcInZhbHVlXCJdLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5pdGVtc1NvdXJjZSAmJiB0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChfaXNTdHJpbmcodGhpcy5zZWxlY3RlZEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SXRlbXNTb3VyY2UgPSBjaGFuZ2VzLml0ZW1zU291cmNlLmN1cnJlbnRWYWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgICB8IGFueVtdXG4gICAgICAgICAgICAgICAgICAgIHwgSVNlbGVjdEdyb3VwW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtVG9TZWxlY3QgPSBuZXdJdGVtc1NvdXJjZS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoaSkgPT4gaVt0aGlzLm1vZGVsVmFsdWVdID09PSB0aGlzLnNlbGVjdGVkSXRlbVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Ub1NlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChpdGVtVG9TZWxlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGRpc3BsYXlQbGFjZWhvbGRlcigpOiBib29sZWFuO1xuXG4gICAgYWJzdHJhY3QgaGFuZGxlQmx1cihldmVudDogYW55KTogdm9pZDtcblxuICAgIHB1YmxpYyBnZXRJdGVtRGlzcGxheShpdGVtOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoX2lzTmlsKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5kaXNwbGF5VmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKF9pc0Z1bmN0aW9uKHRoaXMuZGlzcGxheVZhbHVlRm4pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGlzcGxheVZhbHVlRm4oeyBpdGVtIH0pO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlRm9ybWF0dGVkKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChfaXNOaWwoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheUZvcm1hdCkge1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheWVkSXRlbSA9IHRoaXMuZ2V0SXRlbURpc3BsYXkoaXRlbSk7XG5cbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpdGVtIGlzblwidCBlbXB0eVxuICAgICAgICAgICAgLy8gYnV0IGlzIGdhcmJhZ2Ugdy5yLnQgdGhpcy5kaXNwbGF5VmFsdWVcbiAgICAgICAgICAgIGlmIChfaXNOaWwoZGlzcGxheWVkSXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXRpbFNlcnZpY2UuZm9ybWF0U3RyaW5nKFxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZvcm1hdCxcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRJdGVtXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbURpc3BsYXkoaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEljb25Db2xvcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkID8gXCJncmF5XCIgOiBcInByaW1hcnktYmx1ZVwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW0oKTtcbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPVxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgJiYgIV9pc09iamVjdChzZWxlY3RlZEl0ZW0pXG4gICAgICAgICAgICAgICAgPyBpdGVtW3RoaXMuZGlzcGxheVZhbHVlXVxuICAgICAgICAgICAgICAgIDogaXRlbTtcblxuICAgICAgICByZXR1cm4gX2lzRXF1YWwoc2VsZWN0ZWRJdGVtLCBjdXJyZW50SXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbGVjdGVkSXRlbSgpOiBhbnkge1xuICAgICAgICBpZiAoIV9pc05pbCh0aGlzLml0ZW1Ub1NlbGVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1Ub1NlbGVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0KGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRJdGVtO1xuICAgICAgICBpZiAoIV9pc0VxdWFsKG9sZFZhbHVlLCBpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdldEl0ZW1Nb2RlbChpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHsgbmV3VmFsdWU6IG5ld1ZhbHVlLCBvbGRWYWx1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIE1ha2luZyB0aGlzIGNoZWNrIHRvIHRyaWdnZXIgcmVhY3RpdmUgZm9ybSB2YWxpZGF0aW9uIGlmIGluaXRpYWwgdmFsdWUgaXMgc2V0IHRvIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgLy8gYWZ0ZXIgZm9jdXMgYW5kIGJsdXIgdGhleSB3aWxsIGJlIGVxdWFsIGFuZCBhZnRlciBibHVyIGNoYW5nZVZhbHVlIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIGNvbWJvYm94IGlzIHByaXN0aW5lLlxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZShcIlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtTW9kZWwoaXRlbTogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gJiYgdGhpcy5tb2RlbFZhbHVlID8gaXRlbVt0aGlzLm1vZGVsVmFsdWVdIDogaXRlbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGFuZ2UodmFsdWU6IGFueSk6IHZvaWQge31cblxuICAgIHB1YmxpYyBvblRvdWNoZWQoKTogdm9pZCB7fVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtOiBhbnk7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgJiYgdGhpcy5pdGVtc1NvdXJjZSAmJiB0aGlzLml0ZW1zU291cmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gdGhpcy5pdGVtc1NvdXJjZS5maW5kKFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmdldEl0ZW1Nb2RlbChpdGVtKSA9PT0gdmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkSXRlbTtcblxuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBfaXNPYmplY3Qoc2VsZWN0ZWRJdGVtKVxuICAgICAgICAgICAgPyB0aGlzLmdldEl0ZW1EaXNwbGF5KHNlbGVjdGVkSXRlbSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxufVxuIl19