UNPKG

@taiga-ui/layout

Version:

A package with Taiga UI layout components

96 lines 18.3 kB
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, TemplateRef, ViewChild, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { tuiContainsOrAfter, tuiInjectElement, tuiIsElement, } from '@taiga-ui/cdk/utils/dom'; import { tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus'; import { tuiDirectiveBinding } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiTextfieldComponent, TuiWithTextfield, } from '@taiga-ui/core/components/textfield'; import { TuiIcons } from '@taiga-ui/core/directives/icons'; import { TuiPopupService } from '@taiga-ui/core/directives/popup'; import { TUI_COMMON_ICONS } from '@taiga-ui/core/tokens'; import { tuiCellOptionsProvider } from '@taiga-ui/layout/components/cell'; import { TUI_INPUT_SEARCH } from '@taiga-ui/layout/tokens'; import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/textfield"; class TuiInputSearch { constructor() { this.el = tuiInjectElement(); this.service = inject(TuiPopupService); this.textfield = inject(TuiTextfieldComponent); this.i18n = toSignal(inject(TUI_INPUT_SEARCH)); this.parent = this.textfield.el.parentElement; this.neighbor = this.textfield.el.nextSibling; this.placeholder = ''; this.icon = tuiDirectiveBinding(TuiIcons, 'iconStart', inject(TUI_COMMON_ICONS).search, {}); this.tuiInputSearchOpen = false; this.tuiInputSearchOpenChange = new EventEmitter(); } ngOnChanges() { if (this.tuiInputSearchOpen) { this.open(); } else { this.close(); } } open() { if (this.ref?.destroyed === false || !this.template) { return; } this.placeholder = this.el.placeholder; this.parent = this.textfield.el.parentElement; this.neighbor = this.textfield.el.nextSibling; this.ref = this.service.addTemplate(this.template); this.ref.rootNodes[0]?.insertAdjacentElement('afterbegin', this.textfield.el); this.el.focus({ preventScroll: true }); this.el.placeholder = this.i18n()?.placeholder || this.el.placeholder; this.tuiInputSearchOpen = true; this.tuiInputSearchOpenChange.emit(true); } close() { this.el.placeholder = this.placeholder || this.el.placeholder; this.parent?.insertBefore(this.textfield.el, this.neighbor); this.ref?.destroy(); this.tuiInputSearchOpen = false; this.tuiInputSearchOpenChange.emit(false); } onArrow() { tuiGetClosestFocusable({ initial: this.container?.nativeElement || this.el, root: this.container?.nativeElement || this.el, })?.focus(); } onFocus({ target }) { if (this.container && target !== this.el && tuiIsElement(target) && !tuiContainsOrAfter(this.container.nativeElement, target)) { this.close(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputSearch, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiInputSearch, isStandalone: true, selector: "input[tuiInputSearch]", inputs: { tuiInputSearch: "tuiInputSearch", tuiInputSearchOpen: "tuiInputSearchOpen" }, outputs: { tuiInputSearchOpenChange: "tuiInputSearchOpenChange" }, host: { attributes: { "ngSkipHydration": "true" }, listeners: { "focus": "open()", "keydown.tab.prevent": "0", "keydown.arrowDown.prevent": "onArrow()" } }, providers: [tuiCellOptionsProvider({ size: 'm' })], viewQueries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0, template: "<ng-template>\n <div\n tuiTheme=\"dark\"\n class=\"t-container\"\n (document:focusin)=\"onFocus($event)\"\n (keydown.esc)=\"close()\"\n (pointerdown.self)=\"close()\"\n >\n <div\n #container\n class=\"t-content\"\n >\n <ng-container *polymorpheusOutlet=\"tuiInputSearch\" />\n </div>\n </div>\n</ng-template>\n", styles: [".t-container{position:fixed;top:0;left:0;bottom:0;right:0;display:grid;gap:.25rem;grid-template:-webkit-min-content / minmax(auto,50rem);grid-template:min-content / minmax(auto,50rem);place-content:start center;padding:.5rem;background:var(--tui-service-backdrop);box-shadow:0 0 0 5rem var(--tui-service-backdrop)}.t-container ::ng-deep>tui-textfield{background:var(--tui-background-base-alt)}.t-content{overflow:hidden}\n"], dependencies: [{ kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiInputSearch }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiInputSearch, decorators: [{ type: Component, args: [{ standalone: true, selector: 'input[tuiInputSearch]', imports: [PolymorpheusOutlet], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiCellOptionsProvider({ size: 'm' })], hostDirectives: [TuiWithTextfield], host: { ngSkipHydration: 'true', '(focus)': 'open()', '(keydown.tab.prevent)': '0', '(keydown.arrowDown.prevent)': 'onArrow()', }, template: "<ng-template>\n <div\n tuiTheme=\"dark\"\n class=\"t-container\"\n (document:focusin)=\"onFocus($event)\"\n (keydown.esc)=\"close()\"\n (pointerdown.self)=\"close()\"\n >\n <div\n #container\n class=\"t-content\"\n >\n <ng-container *polymorpheusOutlet=\"tuiInputSearch\" />\n </div>\n </div>\n</ng-template>\n", styles: [".t-container{position:fixed;top:0;left:0;bottom:0;right:0;display:grid;gap:.25rem;grid-template:-webkit-min-content / minmax(auto,50rem);grid-template:min-content / minmax(auto,50rem);place-content:start center;padding:.5rem;background:var(--tui-service-backdrop);box-shadow:0 0 0 5rem var(--tui-service-backdrop)}.t-container ::ng-deep>tui-textfield{background:var(--tui-background-base-alt)}.t-content{overflow:hidden}\n"] }] }], propDecorators: { template: [{ type: ViewChild, args: [TemplateRef] }], container: [{ type: ViewChild, args: ['container'] }], tuiInputSearch: [{ type: Input }], tuiInputSearchOpen: [{ type: Input }], tuiInputSearchOpenChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9jb21wb25lbnRzL2lucHV0LXNlYXJjaC9pbnB1dC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGF5b3V0L2NvbXBvbmVudHMvaW5wdXQtc2VhcmNoL2lucHV0LXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUNILGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNmLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUNILHFCQUFxQixFQUNyQixnQkFBZ0IsR0FDbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBMkIsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBRXBGLE1BZ0JhLGNBQWM7SUFoQjNCO1FBdUJxQixPQUFFLEdBQUcsZ0JBQWdCLEVBQW9CLENBQUM7UUFDMUMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsQyxjQUFTLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUMsU0FBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBQ25ELFdBQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDekMsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUdOLFNBQUksR0FBRyxtQkFBbUIsQ0FDekMsUUFBUSxFQUNSLFdBQVcsRUFDWCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEVBQy9CLEVBQUUsQ0FDTCxDQUFDO1FBTUssdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBR2xCLDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7S0FtRDFFO0lBakRVLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDZjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVNLElBQUk7UUFDUCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakQsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDdEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxLQUFLO1FBQ1IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLE9BQU87UUFDYixzQkFBc0IsQ0FBQztZQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDakQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxFQUFFO1NBQ2pELENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRVMsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFRO1FBQzdCLElBQ0ksSUFBSSxDQUFDLFNBQVM7WUFDZCxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDbEIsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNwQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxFQUMzRDtZQUNFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjtJQUNMLENBQUM7K0dBaEZRLGNBQWM7bUdBQWQsY0FBYyw0WEFUWixDQUFDLHNCQUFzQixDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUMsb0VBVXJDLFdBQVcsb05DakQxQiwwWkFnQkEsZ2VEbUJjLGtCQUFrQjs7U0FhbkIsY0FBYzs0RkFBZCxjQUFjO2tCQWhCMUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sdUJBQXVCLFdBQ3hCLENBQUMsa0JBQWtCLENBQUMsbUJBR1osdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLHNCQUFzQixDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUMsa0JBQ2hDLENBQUMsZ0JBQWdCLENBQUMsUUFDNUI7d0JBQ0YsZUFBZSxFQUFFLE1BQU07d0JBQ3ZCLFNBQVMsRUFBRSxRQUFRO3dCQUNuQix1QkFBdUIsRUFBRSxHQUFHO3dCQUM1Qiw2QkFBNkIsRUFBRSxXQUFXO3FCQUM3Qzs4QkFJZ0IsUUFBUTtzQkFEeEIsU0FBUzt1QkFBQyxXQUFXO2dCQUlMLFNBQVM7c0JBRHpCLFNBQVM7dUJBQUMsV0FBVztnQkFvQmYsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSVUsd0JBQXdCO3NCQUR2QyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgdHlwZSBFbGVtZW50UmVmLFxuICAgIHR5cGUgRW1iZWRkZWRWaWV3UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgdHlwZSBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3RvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIHR1aUNvbnRhaW5zT3JBZnRlcixcbiAgICB0dWlJbmplY3RFbGVtZW50LFxuICAgIHR1aUlzRWxlbWVudCxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHt0dWlHZXRDbG9zZXN0Rm9jdXNhYmxlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7dHVpRGlyZWN0aXZlQmluZGluZ30gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7XG4gICAgVHVpVGV4dGZpZWxkQ29tcG9uZW50LFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7VHVpSWNvbnN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaWNvbnMnO1xuaW1wb3J0IHtUdWlQb3B1cFNlcnZpY2V9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvcG9wdXAnO1xuaW1wb3J0IHtUVUlfQ09NTU9OX0lDT05TfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHt0dWlDZWxsT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkvbGF5b3V0L2NvbXBvbmVudHMvY2VsbCc7XG5pbXBvcnQge1RVSV9JTlBVVF9TRUFSQ0h9IGZyb20gJ0B0YWlnYS11aS9sYXlvdXQvdG9rZW5zJztcbmltcG9ydCB7dHlwZSBQb2x5bW9ycGhldXNDb250ZW50LCBQb2x5bW9ycGhldXNPdXRsZXR9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpSW5wdXRTZWFyY2hdJyxcbiAgICBpbXBvcnRzOiBbUG9seW1vcnBoZXVzT3V0bGV0XSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC1zZWFyY2guY29tcG9uZW50Lmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFt0dWlDZWxsT3B0aW9uc1Byb3ZpZGVyKHtzaXplOiAnbSd9KV0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlXaXRoVGV4dGZpZWxkXSxcbiAgICBob3N0OiB7XG4gICAgICAgIG5nU2tpcEh5ZHJhdGlvbjogJ3RydWUnLFxuICAgICAgICAnKGZvY3VzKSc6ICdvcGVuKCknLFxuICAgICAgICAnKGtleWRvd24udGFiLnByZXZlbnQpJzogJzAnLFxuICAgICAgICAnKGtleWRvd24uYXJyb3dEb3duLnByZXZlbnQpJzogJ29uQXJyb3coKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpSW5wdXRTZWFyY2ggaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGQoVGVtcGxhdGVSZWYpXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudDxIVE1MSW5wdXRFbGVtZW50PigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChUdWlQb3B1cFNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGV4dGZpZWxkID0gaW5qZWN0KFR1aVRleHRmaWVsZENvbXBvbmVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gdG9TaWduYWwoaW5qZWN0KFRVSV9JTlBVVF9TRUFSQ0gpKTtcbiAgICBwcml2YXRlIHBhcmVudCA9IHRoaXMudGV4dGZpZWxkLmVsLnBhcmVudEVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBuZWlnaGJvciA9IHRoaXMudGV4dGZpZWxkLmVsLm5leHRTaWJsaW5nO1xuICAgIHByaXZhdGUgcGxhY2Vob2xkZXIgPSAnJztcbiAgICBwcml2YXRlIHJlZj86IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBpY29uID0gdHVpRGlyZWN0aXZlQmluZGluZyhcbiAgICAgICAgVHVpSWNvbnMsXG4gICAgICAgICdpY29uU3RhcnQnLFxuICAgICAgICBpbmplY3QoVFVJX0NPTU1PTl9JQ09OUykuc2VhcmNoLFxuICAgICAgICB7fSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHVpSW5wdXRTZWFyY2g6IFBvbHltb3JwaGV1c0NvbnRlbnQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0dWlJbnB1dFNlYXJjaE9wZW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSB0dWlJbnB1dFNlYXJjaE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnR1aUlucHV0U2VhcmNoT3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVmPy5kZXN0cm95ZWQgPT09IGZhbHNlIHx8ICF0aGlzLnRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5lbC5wbGFjZWhvbGRlcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLnRleHRmaWVsZC5lbC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB0aGlzLm5laWdoYm9yID0gdGhpcy50ZXh0ZmllbGQuZWwubmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMucmVmID0gdGhpcy5zZXJ2aWNlLmFkZFRlbXBsYXRlKHRoaXMudGVtcGxhdGUpO1xuICAgICAgICB0aGlzLnJlZi5yb290Tm9kZXNbMF0/Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIHRoaXMudGV4dGZpZWxkLmVsKTtcbiAgICAgICAgdGhpcy5lbC5mb2N1cyh7cHJldmVudFNjcm9sbDogdHJ1ZX0pO1xuICAgICAgICB0aGlzLmVsLnBsYWNlaG9sZGVyID0gdGhpcy5pMThuKCk/LnBsYWNlaG9sZGVyIHx8IHRoaXMuZWwucGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMudHVpSW5wdXRTZWFyY2hPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50dWlJbnB1dFNlYXJjaE9wZW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWwucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMuZWwucGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMucGFyZW50Py5pbnNlcnRCZWZvcmUodGhpcy50ZXh0ZmllbGQuZWwsIHRoaXMubmVpZ2hib3IpO1xuICAgICAgICB0aGlzLnJlZj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnR1aUlucHV0U2VhcmNoT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnR1aUlucHV0U2VhcmNoT3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25BcnJvdygpOiB2b2lkIHtcbiAgICAgICAgdHVpR2V0Q2xvc2VzdEZvY3VzYWJsZSh7XG4gICAgICAgICAgICBpbml0aWFsOiB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCB8fCB0aGlzLmVsLFxuICAgICAgICAgICAgcm9vdDogdGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5lbCxcbiAgICAgICAgfSk/LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9jdXMoe3RhcmdldH06IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyICYmXG4gICAgICAgICAgICB0YXJnZXQgIT09IHRoaXMuZWwgJiZcbiAgICAgICAgICAgIHR1aUlzRWxlbWVudCh0YXJnZXQpICYmXG4gICAgICAgICAgICAhdHVpQ29udGFpbnNPckFmdGVyKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHRhcmdldClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICB0dWlUaGVtZT1cImRhcmtcIlxuICAgICAgICBjbGFzcz1cInQtY29udGFpbmVyXCJcbiAgICAgICAgKGRvY3VtZW50OmZvY3VzaW4pPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZXNjKT1cImNsb3NlKClcIlxuICAgICAgICAocG9pbnRlcmRvd24uc2VsZik9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICNjb250YWluZXJcbiAgICAgICAgICAgIGNsYXNzPVwidC1jb250ZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqcG9seW1vcnBoZXVzT3V0bGV0PVwidHVpSW5wdXRTZWFyY2hcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=