UNPKG

@stratio/egeo

Version:
585 lines 42.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-search/st-search.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * © 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 { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { EventWindowManager } from '../utils/event-window-manager'; import { debounceTime } from 'rxjs/operators'; import { StSearchEventOrigin } from './st-search.model'; /** * \@description {Component} [Search] * * The search component has been designed to allow user to find a specific content according to his needs. * * \@example * * {html} * * ``` * Search without filters * <st-search [placeholder]="placeholder" [qaTag]="qaTag" * [value]="searched" [debounce]="debounceTime" [minLength]="minLength" * (search)="onSearchResult($event)"></st-search> * * * Search with filters * <st-search [placeholder]="placeholder" [qaTag]="qaTag" * [value]="searched" [debounce]="debounceTime" [minLength]="minLength" [filterOptions]="[ * { label: 'All', value: 1 }, * { label: 'Type ', value: 2 }, * { label: 'Color', value: 3 } * ]" (search)="onSearchResult($event)"></st-search> * ``` * */ var StSearchComponent = /** @class */ (function (_super) { tslib_1.__extends(StSearchComponent, _super); function StSearchComponent(_render, cd, buttonElement) { var _this = _super.call(this, _render, cd, buttonElement) || this; _this._render = _render; _this.cd = cd; _this.buttonElement = buttonElement; /** * \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list */ _this.debounce = 0; /** * \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing */ _this.liveSearch = true; /** * \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search */ _this.minLength = 0; /** * \@Input {string} [placeholder='Search'] Text displayed in the search input */ _this.placeholder = 'Search'; /** * \@Input {boolean} [disabled=false] Boolean to enable or disable the search */ _this.disabled = false; /** * \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing */ _this.withAutocomplete = false; /** * \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing */ _this.autocompleteList = []; /** * \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon */ _this.showIcon = true; /** * \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but * there are not any item with the typed text */ _this.emptyAutocompleteListMessage = ''; /** * \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains * the text typed by the user and the filter value selected (only if filter is displayed) */ _this.search = new EventEmitter(); /** * \@Output {any} [value=''] Event emitted when filter is changed. It contains * the filter value selected */ _this.selectFilter = new EventEmitter(); /** * \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard */ _this.keyBoardMove = false; _this.searchBox = new FormControl(); _this.subscriptionSearch = undefined; _this.subscriptionSearchClearButton = undefined; _this.lastEmittedText = undefined; return _this; } Object.defineProperty(StSearchComponent.prototype, "menuId", { get: /** * @return {?} */ function () { return this.qaTag ? this.qaTag + '-autocomplete-menu' : null; }, enumerable: true, configurable: true }); /** * @return {?} */ StSearchComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; if (this.value) { this.searchBox.setValue(this.value); } // Show clear button if have text this.subscriptionSearchClearButton = this.searchBox.valueChanges.subscribe((/** * @param {?} val * @return {?} */ function (val) { return _this.showClear = (val && val.length > 0); })); this.checkDisabled(); this.manageSubscription(); if (this.filterOptions) { this.filter = this.filterOptions[0].value; } }; /** * @param {?} changes * @return {?} */ StSearchComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { this.checkDebounceChange(changes); this.checkValueChange(changes); this.checkDisableChange(changes); this.checkAutoCompleteMenuChange(changes); }; /** * @param {?} value * @return {?} */ StSearchComponent.prototype.onChangeFilter = /** * @param {?} value * @return {?} */ function (value) { this.selectFilter.emit(value); this.emitValue(false, StSearchEventOrigin.FILTER); }; /** * @return {?} */ StSearchComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.subscriptionSearch !== undefined) { this.subscriptionSearch.unsubscribe(); } if (this.subscriptionSearchClearButton !== undefined) { this.subscriptionSearchClearButton.unsubscribe(); } this.closeElement(); }; /** * @param {?} force * @param {?} origin * @return {?} */ StSearchComponent.prototype.launchSearch = /** * @param {?} force * @param {?} origin * @return {?} */ function (force, origin) { if (this.canSearch()) { this.showAutoCompleteMenu(); this.emitValue(force, origin); } else { this.closeElement(); } }; /** * @param {?} event * @return {?} */ StSearchComponent.prototype.onKeyPress = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var key = event.keyCode || event.which; if (key === 13) { this.launchSearch(true, StSearchEventOrigin.ENTER); } }; /** * @param {?} item * @return {?} */ StSearchComponent.prototype.changeOption = /** * @param {?} item * @return {?} */ function (item) { if (item && item.label) { this.subscriptionSearch.unsubscribe(); this.searchBox.setValue(item.value); this.cd.markForCheck(); this.closeElement(); this.emitValue(true, StSearchEventOrigin.LIST); this.manageSubscription(); } }; /** * @return {?} */ StSearchComponent.prototype.clearInput = /** * @return {?} */ function () { this.searchBox.setValue(''); this.closeElement(); this.emitValue(true, StSearchEventOrigin.INPUT); }; /** * @return {?} */ StSearchComponent.prototype.showAutoCompleteMenu = /** * @return {?} */ function () { if (this.withAutocomplete && !this.isActive) { this.openElement(); } if (this.searchBox.value === '') { this.closeElement(); } this.cd.markForCheck(); }; /** * @private * @param {?} force * @param {?} origin * @return {?} */ StSearchComponent.prototype.emitValue = /** * @private * @param {?} force * @param {?} origin * @return {?} */ function (force, origin) { if (this.isEqualPrevious(force)) { this.lastEmittedText = this.searchBox.value; /** @type {?} */ var newSearch = { text: this.lastEmittedText || '', origin: origin }; if (this.filter) { newSearch.filter = this.filter; } this.search.emit(newSearch); } }; /** * @private * @return {?} */ StSearchComponent.prototype.checkDisabled = /** * @private * @return {?} */ function () { if (this.disabled) { this.searchBox.disable(); } else { this.searchBox.enable(); } }; /** * @private * @return {?} */ StSearchComponent.prototype.canSearch = /** * @private * @return {?} */ function () { return this.isDefined() && !this.disabled && this.checkMins(); }; /** * @private * @return {?} */ StSearchComponent.prototype.isDefined = /** * @private * @return {?} */ function () { return this.searchBox && this.searchBox.value !== null && this.searchBox.value !== undefined; }; /** * @private * @return {?} */ StSearchComponent.prototype.checkMins = /** * @private * @return {?} */ function () { return this.minLength <= (this.searchBox && this.searchBox.value && this.searchBox.value.length) || this.searchBox.value.trim().length === 0; }; /** * @private * @param {?} force * @return {?} */ StSearchComponent.prototype.isEqualPrevious = /** * @private * @param {?} force * @return {?} */ function (force) { return this.lastEmittedText !== this.searchBox.value || force; }; /** * @private * @param {?} changes * @return {?} */ StSearchComponent.prototype.checkValueChange = /** * @private * @param {?} changes * @return {?} */ function (changes) { if (changes && changes.value) { if (this.subscriptionSearch) { this.subscriptionSearch.unsubscribe(); } this.searchBox.setValue(changes.value.currentValue); this.manageSubscription(); } }; /** * @private * @param {?} changes * @return {?} */ StSearchComponent.prototype.checkDebounceChange = /** * @private * @param {?} changes * @return {?} */ function (changes) { if (changes && changes.debounce) { this.manageSubscription(); } }; /** * @private * @param {?} changes * @return {?} */ StSearchComponent.prototype.checkDisableChange = /** * @private * @param {?} changes * @return {?} */ function (changes) { if (changes && changes.disabled) { this.checkDisabled(); } }; /** * @private * @param {?} changes * @return {?} */ StSearchComponent.prototype.checkAutoCompleteMenuChange = /** * @private * @param {?} changes * @return {?} */ function (changes) { if (changes && changes.autocompleteList) { this.cd.markForCheck(); } }; /** * @private * @return {?} */ StSearchComponent.prototype.manageSubscription = /** * @private * @return {?} */ function () { var _this = this; if (this.subscriptionSearch !== undefined) { this.subscriptionSearch.unsubscribe(); } if (this.liveSearch) { this.subscriptionSearch = this.searchBox .valueChanges.pipe(debounceTime(this.debounce)) .subscribe((/** * @param {?} event * @return {?} */ function (event) { return _this.launchSearch(false, StSearchEventOrigin.INPUT); })); } }; StSearchComponent.decorators = [ { type: Component, args: [{ selector: 'st-search', 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<div class=\"st-search sth-search\">\n <st-select\n *ngIf=\"filterOptions && filterOptions.length > 0\"\n [options]=\"filterOptions\"\n [(ngModel)]=\"filter\"\n [disabled]=\"disabled\"\n name=\"search-filter\"\n (select)=\"onChangeFilter($event)\"\n class=\"sth-search-filter st-search-filter\"\n [ngClass]=\"{'disabled': disabled}\"\n ></st-select>\n\n <st-dropdown-menu [items]=\"autocompleteList\" [attr.id]=\"menuId\" class=\"st-search-box\" (change)=\"changeOption($event)\"\n [active]=\"isActive && (autocompleteList && autocompleteList.length || emptyAutocompleteListMessage !== '')\"\n [placement]=\"'bottom-start'\" [emptyListMessage]=\"emptyAutocompleteListMessage\"\n [keyBoardMove]=\"keyBoardMove\">\n <div #buttonId>\n <input [attr.id]=\"qaTag\" [formControl]=\"searchBox\" [placeholder]=\"placeholder\" (keypress)=\"onKeyPress($event)\"\n (focus)=\"showAutoCompleteMenu()\"\n class=\"st-search-input sth-search-input\"/>\n <i class=\"st-search-icon sth-search-icon icon-search\" tabindex=\"0\" *ngIf=\"!showClear && showIcon\"></i>\n <i class=\"st-search-icon sth-search-icon icon-cross\" tabindex=\"0\" *ngIf=\"showClear\" (mousedown)=\"clearInput()\"\n (keyup.enter)=\"clearInput()\"></i>\n </div>\n </st-dropdown-menu>\n\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";input{outline:0;border:none;padding:0;height:40px}.st-search{position:relative;display:flex;min-width:100%}.st-search :invalid{box-shadow:none}.st-search-box{display:flex;flex:2 0}.st-search-input{padding-left:12px;padding-right:40px;width:100%}.st-search-filter{flex:auto 1;height:40px;padding:0;max-width:37%}.st-search-icon{position:absolute;right:10px;top:13px;cursor:pointer}.st-search-icon:focus{outline:0}"] }] } ]; /** @nocollapse */ StSearchComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: ChangeDetectorRef }, { type: ElementRef, decorators: [{ type: ViewChild, args: ['buttonId', { static: false },] }] } ]; }; StSearchComponent.propDecorators = { debounce: [{ type: Input }], liveSearch: [{ type: Input }], minLength: [{ type: Input }], placeholder: [{ type: Input }], qaTag: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], withAutocomplete: [{ type: Input }], autocompleteList: [{ type: Input }], showIcon: [{ type: Input }], emptyAutocompleteListMessage: [{ type: Input }], filterOptions: [{ type: Input }], search: [{ type: Output }], selectFilter: [{ type: Output }], keyBoardMove: [{ type: Input }] }; return StSearchComponent; }(EventWindowManager)); export { StSearchComponent }; if (false) { /** * \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list * @type {?} */ StSearchComponent.prototype.debounce; /** * \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing * @type {?} */ StSearchComponent.prototype.liveSearch; /** * \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search * @type {?} */ StSearchComponent.prototype.minLength; /** * \@Input {string} [placeholder='Search'] Text displayed in the search input * @type {?} */ StSearchComponent.prototype.placeholder; /** * \@Input {string} [qaTag=''] Label used as id * @type {?} */ StSearchComponent.prototype.qaTag; /** * \@Input {string} [value=''] Initial value of the search text * @type {?} */ StSearchComponent.prototype.value; /** * \@Input {boolean} [disabled=false] Boolean to enable or disable the search * @type {?} */ StSearchComponent.prototype.disabled; /** * \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing * @type {?} */ StSearchComponent.prototype.withAutocomplete; /** * \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing * @type {?} */ StSearchComponent.prototype.autocompleteList; /** * \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon * @type {?} */ StSearchComponent.prototype.showIcon; /** * \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but * there are not any item with the typed text * @type {?} */ StSearchComponent.prototype.emptyAutocompleteListMessage; /** * \@Input {StDropDownMenuItem[]} [filterOptions=''] Options displayed at the filter select. If it is not introduced, * filter will not be displayed * @type {?} */ StSearchComponent.prototype.filterOptions; /** * \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains * the text typed by the user and the filter value selected (only if filter is displayed) * @type {?} */ StSearchComponent.prototype.search; /** * \@Output {any} [value=''] Event emitted when filter is changed. It contains * the filter value selected * @type {?} */ StSearchComponent.prototype.selectFilter; /** * \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard * @type {?} */ StSearchComponent.prototype.keyBoardMove; /** @type {?} */ StSearchComponent.prototype.searchBox; /** @type {?} */ StSearchComponent.prototype.showClear; /** @type {?} */ StSearchComponent.prototype.filter; /** * @type {?} * @private */ StSearchComponent.prototype.subscriptionSearch; /** * @type {?} * @private */ StSearchComponent.prototype.subscriptionSearchClearButton; /** * @type {?} * @private */ StSearchComponent.prototype.lastEmittedText; /** * @type {?} * @private */ StSearchComponent.prototype._render; /** * @type {?} * @private */ StSearchComponent.prototype.cd; /** @type {?} */ StSearchComponent.prototype.buttonElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3Qtc2VhcmNoL3N0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFDSix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBaUIsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJ2RTtJQU11Qyw2Q0FBa0I7SUErRHRELDJCQUFvQixPQUFrQixFQUNsQixFQUFxQixFQUNrQixhQUF5QjtRQUZwRixZQUdHLGtCQUFNLE9BQU8sRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQ25DO1FBSm1CLGFBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsUUFBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDa0IsbUJBQWEsR0FBYixhQUFhLENBQVk7Ozs7UUEvRDNFLGNBQVEsR0FBVyxDQUFDLENBQUM7Ozs7UUFHckIsZ0JBQVUsR0FBWSxJQUFJLENBQUM7Ozs7UUFHM0IsZUFBUyxHQUFXLENBQUMsQ0FBQzs7OztRQUd0QixpQkFBVyxHQUFXLFFBQVEsQ0FBQzs7OztRQVMvQixjQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBRzFCLHNCQUFnQixHQUFZLEtBQUssQ0FBQzs7OztRQUdsQyxzQkFBZ0IsR0FBeUIsRUFB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QSxBQTFPRCxDQU11QyxrQkFBa0IsR0FvT3hEO1NBcE9ZLGlCQUFpQjs7Ozs7O0lBRTNCLHFDQUE4Qjs7Ozs7SUFHOUIsdUNBQW9DOzs7OztJQUdwQyxzQ0FBK0I7Ozs7O0lBRy9CLHdDQUF3Qzs7Ozs7SUFHeEMsa0NBQXVCOzs7OztJQUd2QixrQ0FBdUI7Ozs7O0lBR3ZCLHFDQUFtQzs7Ozs7SUFHbkMsNkNBQTJDOzs7OztJQUczQyw2Q0FBcUQ7Ozs7O0lBR3JELHFDQUFtQzs7Ozs7O0lBS25DLHlEQUFtRDs7Ozs7O0lBS25ELDBDQUE2Qzs7Ozs7O0lBSzdDLG1DQUFrRjs7Ozs7O0lBS2xGLHlDQUFvRTs7Ozs7SUFJcEUseUNBQXVDOztJQUV2QyxzQ0FBa0Q7O0lBQ2xELHNDQUEwQjs7SUFDMUIsbUNBQXNCOzs7OztJQUV0QiwrQ0FBaUU7Ozs7O0lBQ2pFLDBEQUE0RTs7Ozs7SUFDNUUsNENBQXdEOzs7OztJQUU1QyxvQ0FBMEI7Ozs7O0lBQzFCLCtCQUE2Qjs7SUFDN0IsMENBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQge1xuICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIEVsZW1lbnRSZWYsXG4gICBFdmVudEVtaXR0ZXIsXG4gICBJbnB1dCxcbiAgIE9uQ2hhbmdlcyxcbiAgIE9uRGVzdHJveSxcbiAgIE9uSW5pdCxcbiAgIE91dHB1dCxcbiAgIFJlbmRlcmVyMixcbiAgIFNpbXBsZUNoYW5nZXMsXG4gICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTdERyb3BEb3duTWVudUl0ZW0gfSBmcm9tICcuLi9zdC1kcm9wZG93bi1tZW51L3N0LWRyb3Bkb3duLW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEV2ZW50V2luZG93TWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LXdpbmRvdy1tYW5hZ2VyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN0U2VhcmNoRXZlbnQsIFN0U2VhcmNoRXZlbnRPcmlnaW4gfSBmcm9tICcuL3N0LXNlYXJjaC5tb2RlbCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtTZWFyY2hdXG4gKlxuICogVGhlIHNlYXJjaCBjb21wb25lbnQgaGFzIGJlZW4gZGVzaWduZWQgdG8gYWxsb3cgdXNlciB0byBmaW5kIGEgc3BlY2lmaWMgY29udGVudCBhY2NvcmRpbmcgdG8gaGlzIG5lZWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICoge2h0bWx9XG4gKlxuICogYGBgXG4gKiBTZWFyY2ggd2l0aG91dCBmaWx0ZXJzXG4gKiAgPHN0LXNlYXJjaCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcWFUYWddPVwicWFUYWdcIlxuICogIFt2YWx1ZV09XCJzZWFyY2hlZFwiIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIiBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gKiAgKHNlYXJjaCk9XCJvblNlYXJjaFJlc3VsdCgkZXZlbnQpXCI+PC9zdC1zZWFyY2g+XG4gKlxuICpcbiAqIFNlYXJjaCB3aXRoIGZpbHRlcnNcbiAqICA8c3Qtc2VhcmNoIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtxYVRhZ109XCJxYVRhZ1wiXG4gKiAgW3ZhbHVlXT1cInNlYXJjaGVkXCIgW2RlYm91bmNlXT1cImRlYm91bmNlVGltZVwiIFttaW5MZW5ndGhdPVwibWluTGVuZ3RoXCIgW2ZpbHRlck9wdGlvbnNdPVwiW1xuICogIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogMSB9LFxuICogIHsgbGFiZWw6ICdUeXBlICcsIHZhbHVlOiAyIH0sXG4gKiAgeyBsYWJlbDogJ0NvbG9yJywgdmFsdWU6IDMgfVxuICogIF1cIiAoc2VhcmNoKT1cIm9uU2VhcmNoUmVzdWx0KCRldmVudClcIj48L3N0LXNlYXJjaD5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXNlYXJjaCcsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3Qtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBFdmVudFdpbmRvd01hbmFnZXIgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgIC8qKiBASW5wdXQge251bWJlcn0gW2RlYm91bmNlPTBdIFRpbWUgZWxhcHNlZCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIGF1dG9jb21wbGV0ZSBsaXN0ICovXG4gICBASW5wdXQoKSBkZWJvdW5jZTogbnVtYmVyID0gMDtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2xpdmVTZWFyY2g9dHJ1ZV0gQm9vbGVhbiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIHNlYXJjaCB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGxpdmVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAvKiogQElucHV0IHtudW1iZXJ9IFttaW5MZW5ndGg9MF0gTWluaW11bSBvZiBjaGFyYWN0ZXJzIHR5cGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBsYXVuY2hpbmcgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtwbGFjZWhvbGRlcj0nU2VhcmNoJ10gVGV4dCBkaXNwbGF5ZWQgaW4gdGhlIHNlYXJjaCBpbnB1dCAqL1xuICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2gnO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gTGFiZWwgdXNlZCBhcyBpZCAqL1xuICAgQElucHV0KCkgcWFUYWc6IHN0cmluZztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbdmFsdWU9JyddIEluaXRpYWwgdmFsdWUgb2YgdGhlIHNlYXJjaCB0ZXh0ICovXG4gICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbZGlzYWJsZWQ9ZmFsc2VdIEJvb2xlYW4gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW3dpdGhBdXRvY29tcGxldGU9ZmFsc2VdIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvY29tcGxldGUgbGlzdCB3aGVuIHVzZXIgaXMgdHlwaW5nICovXG4gICBASW5wdXQoKSB3aXRoQXV0b2NvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge1N0RHJvcERvd25NZW51SXRlbVtdfSBbYXV0b2NvbXBsZXRlTGlzdD0nJ10gTGlzdCBvZiBpdGVtcyBkaXNwbGF5ZWQgaW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0IHdoZW4gdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGF1dG9jb21wbGV0ZUxpc3Q6IFN0RHJvcERvd25NZW51SXRlbVtdID0gW107XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzaG93SWNvbj10cnVlXSBCb29sZWFuIHRvIGhpZGUvc2hvdyB0aGUgbG91cGUgaWNvbiAqL1xuICAgQElucHV0KCkgc2hvd0ljb246IGJvb2xlYW4gPSAgdHJ1ZTtcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbZW1wdHlBdXRvY29tcGxldGVMaXN0TWVzc2FnZT0nJ10gTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgaXMgZW5hYmxlZCBidXRcbiAgICAqIHRoZXJlIGFyZSBub3QgYW55IGl0ZW0gd2l0aCB0aGUgdHlwZWQgdGV4dFxuICAgICovXG4gICBASW5wdXQoKSBlbXB0eUF1dG9jb21wbGV0ZUxpc3RNZXNzYWdlOiBzdHJpbmcgPSAnJztcblxuICAgLyoqIEBJbnB1dCB7U3REcm9wRG93bk1lbnVJdGVtW119IFtmaWx0ZXJPcHRpb25zPScnXSBPcHRpb25zIGRpc3BsYXllZCBhdCB0aGUgZmlsdGVyIHNlbGVjdC4gSWYgaXQgaXMgbm90IGludHJvZHVjZWQsXG4gICAgKiBmaWx0ZXIgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGZpbHRlck9wdGlvbnM6IFN0RHJvcERvd25NZW51SXRlbVtdO1xuXG4gICAvKiogQE91dHB1dCB7IE9iamVjdChmaWx0ZXI/OiBzdHJpbmcsIHRleHQ6IHN0cmluZyl9IFtzZWFyY2g9JyddIEV2ZW50IGVtaXR0ZWQgd2hlbiBzZWFyY2ggaXMgbGF1bmNoZWQuIEl0IGNvbnRhaW5zXG4gICAgKiB0aGUgdGV4dCB0eXBlZCBieSB0aGUgdXNlciBhbmQgdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZCAob25seSBpZiBmaWx0ZXIgaXMgZGlzcGxheWVkKVxuICAgICovXG4gICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8U3RTZWFyY2hFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFN0U2VhcmNoRXZlbnQ+KCk7XG5cbiAgIC8qKiBAT3V0cHV0IHthbnl9IFt2YWx1ZT0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIGZpbHRlciBpcyBjaGFuZ2VkLiBJdCBjb250YWluc1xuICAgICogdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZFxuICAgICovXG4gICBAT3V0cHV0KCkgc2VsZWN0RmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBba2V5Qm9hcmRNb3ZlPWZhbHNlXSBJdCBpcyBuZWVkZWQgdG8gYWN0aXZhdGUgbmF2aWdhdGlvbiB0aHJvdWdoIG9wdGlvbnMgdXNpbmcgdGhlIGtleWJvYXJkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGtleUJvYXJkTW92ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICBwdWJsaWMgc2VhcmNoQm94OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgcHVibGljIHNob3dDbGVhcjogYm9vbGVhbjtcbiAgIHB1YmxpYyBmaWx0ZXI6IHN0cmluZztcblxuICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25TZWFyY2g6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgbGFzdEVtaXR0ZWRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICBAVmlld0NoaWxkKCdidXR0b25JZCcsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIGJ1dHRvbkVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgIHN1cGVyKF9yZW5kZXIsIGNkLCBidXR0b25FbGVtZW50KTtcbiAgIH1cblxuICAgZ2V0IG1lbnVJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMucWFUYWcgPyB0aGlzLnFhVGFnICsgJy1hdXRvY29tcGxldGUtbWVudScgOiBudWxsO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBTaG93IGNsZWFyIGJ1dHRvbiBpZiBoYXZlIHRleHRcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24gPSB0aGlzLnNlYXJjaEJveC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMuc2hvd0NsZWFyID0gKHZhbCAmJiB2YWwubGVuZ3RoID4gMCkpO1xuICAgICAgdGhpcy5jaGVja0Rpc2FibGVkKCk7XG4gICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAgdGhpcy5maWx0ZXIgPSB0aGlzLmZpbHRlck9wdGlvbnNbMF0udmFsdWU7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICB0aGlzLmNoZWNrRGVib3VuY2VDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrVmFsdWVDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzKTtcbiAgICAgIHRoaXMuY2hlY2tBdXRvQ29tcGxldGVNZW51Q2hhbmdlKGNoYW5nZXMpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VGaWx0ZXIodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZShmYWxzZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5GSUxURVIpO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICB9XG5cbiAgIHB1YmxpYyBsYXVuY2hTZWFyY2goZm9yY2U6IGJvb2xlYW4sIG9yaWdpbjogU3RTZWFyY2hFdmVudE9yaWdpbik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY2FuU2VhcmNoKCkpIHtcbiAgICAgICAgIHRoaXMuc2hvd0F1dG9Db21wbGV0ZU1lbnUoKTtcbiAgICAgICAgIHRoaXMuZW1pdFZhbHVlKGZvcmNlLCBvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICBsZXQga2V5OiBudW1iZXIgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoO1xuICAgICAgaWYgKGtleSA9PT0gMTMpIHtcbiAgICAgICAgIHRoaXMubGF1bmNoU2VhcmNoKHRydWUsIFN0U2VhcmNoRXZlbnRPcmlnaW4uRU5URVIpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgY2hhbmdlT3B0aW9uKGl0ZW06IFN0RHJvcERvd25NZW51SXRlbSk6IHZvaWQge1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5sYWJlbCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGl0ZW0udmFsdWUpO1xuICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICAgICB0aGlzLmVtaXRWYWx1ZSh0cnVlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLkxJU1QpO1xuICAgICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGNsZWFySW5wdXQoKTogdm9pZCB7XG4gICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUodHJ1ZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCk7XG4gICB9XG5cbiAgIHB1YmxpYyBzaG93QXV0b0NvbXBsZXRlTWVudSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLndpdGhBdXRvY29tcGxldGUgJiYgIXRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgIHRoaXMub3BlbkVsZW1lbnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlYXJjaEJveC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwcml2YXRlIGVtaXRWYWx1ZShmb3JjZTogYm9vbGVhbiwgb3JpZ2luOiBTdFNlYXJjaEV2ZW50T3JpZ2luKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0VxdWFsUHJldmlvdXMoZm9yY2UpKSB7XG4gICAgICAgICB0aGlzLmxhc3RFbWl0dGVkVGV4dCA9IHRoaXMuc2VhcmNoQm94LnZhbHVlO1xuICAgICAgICAgbGV0IG5ld1NlYXJjaDogU3RTZWFyY2hFdmVudCA9IHt0ZXh0OiB0aGlzLmxhc3RFbWl0dGVkVGV4dCB8fCAnJywgb3JpZ2luOiBvcmlnaW59O1xuICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBuZXdTZWFyY2guZmlsdGVyID0gdGhpcy5maWx0ZXI7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KG5ld1NlYXJjaCk7XG4gICAgICB9XG4gICB9XG5cblxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LmVuYWJsZSgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNhblNlYXJjaCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCgpICYmICF0aGlzLmRpc2FibGVkICYmIHRoaXMuY2hlY2tNaW5zKCk7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNEZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQm94ICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSBudWxsICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tNaW5zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubWluTGVuZ3RoIDw9ICh0aGlzLnNlYXJjaEJveCAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZSAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZS5sZW5ndGgpIHx8XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC52YWx1ZS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgfVxuXG4gICBwcml2YXRlIGlzRXF1YWxQcmV2aW91cyhmb3JjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdEVtaXR0ZWRUZXh0ICE9PSB0aGlzLnNlYXJjaEJveC52YWx1ZSB8fCBmb3JjZTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja1ZhbHVlQ2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMudmFsdWUpIHtcbiAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tEZWJvdW5jZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRlYm91bmNlKSB7XG4gICAgICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRpc2FibGVkKSB7XG4gICAgICAgICB0aGlzLmNoZWNrRGlzYWJsZWQoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0F1dG9Db21wbGV0ZU1lbnVDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5hdXRvY29tcGxldGVMaXN0KSB7XG4gICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIG1hbmFnZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGl2ZVNlYXJjaCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggPSB0aGlzLnNlYXJjaEJveFxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMubGF1bmNoU2VhcmNoKGZhbHNlLCAgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCkpO1xuICAgICAgfVxuICAgfVxufVxuIl19