UNPKG

@taiga-ui/addon-table

Version:

A library to display tabled data with filters, search, group actions, etc.

112 lines 22.8 kB
import { AsyncPipe, NgForOf } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core'; import { TUI_TABLE_SHOW_HIDE_MESSAGE } from '@taiga-ui/addon-table/tokens'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { TUI_TILES_REORDER, TuiTiles, tuiTilesShift } from '@taiga-ui/kit/components/tiles'; import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus'; import { TUI_REORDER_OPTIONS } from './reorder.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/kit/components/tiles"; class TuiReorder { constructor() { this.dragging = false; this.order = new Map(); this.unsortedItems = []; this.options = inject(TUI_REORDER_OPTIONS); this.showHideText$ = inject(TUI_TABLE_SHOW_HIDE_MESSAGE); this.enabled = []; this.itemsChange = new EventEmitter(); this.enabledChange = new EventEmitter(); this.content = ({ $implicit, }) => String($implicit); } set items(items) { if (items.length !== this.unsortedItems.length || !items.every((item) => this.unsortedItems.includes(item))) { this.unsortedItems = items; } } onDrag() { this.dragging = true; } onDrop() { if (!this.dragging) { return; } this.dragging = false; this.updateItems(); } isEnabled(item) { return this.enabled.includes(item); } getIcon(item) { return this.isEnabled(item) ? this.options.icons.hide : this.options.icons.show; } toggle(toggled) { this.enabled = this.isEnabled(toggled) ? this.enabled.filter((item) => item !== toggled) : this.enabled.concat(toggled); this.updateEnabled(); } move(index, direction) { const oldIndex = this.order.get(index) ?? index; if ((!oldIndex && direction < 0) || (oldIndex === this.unsortedItems.length - 1 && direction > 0)) { return; } const newIndex = oldIndex + direction; const oldItem = Array.from(this.order.values()).findIndex((item) => item === newIndex); this.order.set(index, newIndex); this.order.set(oldItem, oldIndex); this.order = new Map(this.order); this.updateItems(); } getSortedItems() { const items = new Array(this.unsortedItems.length); this.unsortedItems.forEach((item, index) => { items[this.order.get(index) ?? index] = item; }); return items; } updateItems() { this.itemsChange.emit(this.getSortedItems()); this.updateEnabled(); } updateEnabled() { const enabled = this.getSortedItems().filter((item) => this.isEnabled(item)); this.enabled = enabled; this.enabledChange.emit(enabled); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiReorder, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiReorder, isStandalone: true, selector: "tui-reorder", inputs: { enabled: "enabled", items: "items", content: "content" }, outputs: { itemsChange: "itemsChange", enabledChange: "enabledChange" }, host: { listeners: { "focusout.stop": "(0)", "pointerdown.zoneless": "onDrag()", "document:pointerup.zoneless": "onDrop()" } }, providers: [ { provide: TUI_TILES_REORDER, useValue: tuiTilesShift, }, ], ngImport: i0, template: "<tui-tiles\n class=\"t-wrapper\"\n [(order)]=\"order\"\n>\n <tui-tile\n *ngFor=\"let item of unsortedItems; let index = index\"\n [style.order]=\"order.get(index)\"\n >\n <div\n class=\"t-item\"\n [class.t-item_disabled]=\"!isEnabled(item)\"\n >\n <div\n tuiTileHandle\n class=\"t-draggable\"\n >\n <tui-icon\n class=\"t-icon\"\n [icon]=\"options.icons.drag\"\n />\n <ng-container *polymorpheusOutlet=\"content as template; context: {$implicit: item, index: index}\">\n {{ template }}\n </ng-container>\n </div>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [iconStart]=\"getIcon(item)\"\n (click)=\"toggle(item)\"\n (keydown.arrowDown.prevent)=\"move(index, 1)\"\n (keydown.arrowUp.prevent)=\"move(index, -1)\"\n >\n {{ showHideText$ | async }}\n </button>\n </div>\n </tui-tile>\n</tui-tiles>\n", styles: [":host{display:block;font:var(--tui-font-text-s);padding:.5rem 0;-webkit-user-select:none;user-select:none}.t-wrapper{grid-auto-rows:2rem}.t-draggable{cursor:ns-resize;flex:1 1 auto}.t-item{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:flex;block-size:2rem;align-items:center;padding:0 .75rem;background:var(--tui-background-base)}.t-item_disabled{opacity:var(--tui-disabled-opacity)}.t-item_disabled .t-button{color:var(--tui-text-primary);opacity:1}.t-item:hover{background:var(--tui-background-base-alt)}.t-item:hover .t-button{opacity:1}.t-icon{margin-inline-end:.5rem;color:var(--tui-text-tertiary);border-width:.25rem}.t-button{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;margin-inline-start:auto;opacity:0}.t-button:focus{opacity:1}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "component", type: i1.TuiTilesComponent, selector: "tui-tiles", inputs: ["debounce", "order"], outputs: ["orderChange"] }, { kind: "component", type: i1.TuiTile, selector: "tui-tile", inputs: ["width", "height"] }, { kind: "directive", type: i1.TuiTileHandle, selector: "[tuiTileHandle]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiReorder }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiReorder, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-reorder', imports: [AsyncPipe, NgForOf, PolymorpheusOutlet, TuiButton, TuiIcon, TuiTiles], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_TILES_REORDER, useValue: tuiTilesShift, }, ], host: { '(focusout.stop)': '(0)', '(pointerdown.zoneless)': 'onDrag()', '(document:pointerup.zoneless)': 'onDrop()', }, template: "<tui-tiles\n class=\"t-wrapper\"\n [(order)]=\"order\"\n>\n <tui-tile\n *ngFor=\"let item of unsortedItems; let index = index\"\n [style.order]=\"order.get(index)\"\n >\n <div\n class=\"t-item\"\n [class.t-item_disabled]=\"!isEnabled(item)\"\n >\n <div\n tuiTileHandle\n class=\"t-draggable\"\n >\n <tui-icon\n class=\"t-icon\"\n [icon]=\"options.icons.drag\"\n />\n <ng-container *polymorpheusOutlet=\"content as template; context: {$implicit: item, index: index}\">\n {{ template }}\n </ng-container>\n </div>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [iconStart]=\"getIcon(item)\"\n (click)=\"toggle(item)\"\n (keydown.arrowDown.prevent)=\"move(index, 1)\"\n (keydown.arrowUp.prevent)=\"move(index, -1)\"\n >\n {{ showHideText$ | async }}\n </button>\n </div>\n </tui-tile>\n</tui-tiles>\n", styles: [":host{display:block;font:var(--tui-font-text-s);padding:.5rem 0;-webkit-user-select:none;user-select:none}.t-wrapper{grid-auto-rows:2rem}.t-draggable{cursor:ns-resize;flex:1 1 auto}.t-item{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:flex;block-size:2rem;align-items:center;padding:0 .75rem;background:var(--tui-background-base)}.t-item_disabled{opacity:var(--tui-disabled-opacity)}.t-item_disabled .t-button{color:var(--tui-text-primary);opacity:1}.t-item:hover{background:var(--tui-background-base-alt)}.t-item:hover .t-button{opacity:1}.t-icon{margin-inline-end:.5rem;color:var(--tui-text-tertiary);border-width:.25rem}.t-button{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;margin-inline-start:auto;opacity:0}.t-button:focus{opacity:1}\n"] }] }], propDecorators: { enabled: [{ type: Input }], itemsChange: [{ type: Output }], enabledChange: [{ type: Output }], items: [{ type: Input }], content: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXpFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBRXRELE1BbUJhLFVBQVU7SUFuQnZCO1FBb0JZLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFZixVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDbEMsa0JBQWEsR0FBaUIsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0QyxrQkFBYSxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBR2hFLFlBQU8sR0FB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a0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxtQkFHOUQsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixRQUFRLEVBQUUsYUFBYTt5QkFDMUI7cUJBQ0osUUFDSzt3QkFDRixpQkFBaUIsRUFBRSxLQUFLO3dCQUN4Qix3QkFBd0IsRUFBRSxVQUFVO3dCQUNwQywrQkFBK0IsRUFBRSxVQUFVO3FCQUM5Qzs4QkFXTSxPQUFPO3NCQURiLEtBQUs7Z0JBSVUsV0FBVztzQkFEMUIsTUFBTTtnQkFJUyxhQUFhO3NCQUQ1QixNQUFNO2dCQUlJLEtBQUs7c0JBRGYsS0FBSztnQkFXQyxPQUFPO3NCQURiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VFVJX1RBQkxFX1NIT1dfSElERV9NRVNTQUdFfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUvdG9rZW5zJztcbmltcG9ydCB0eXBlIHtUdWlDb250ZXh0fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3R5cGVzJztcbmltcG9ydCB7VHVpQnV0dG9ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQge1R1aUljb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQge1RVSV9USUxFU19SRU9SREVSLCBUdWlUaWxlcywgdHVpVGlsZXNTaGlmdH0gZnJvbSAnQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3RpbGVzJztcbmltcG9ydCB0eXBlIHtQb2x5bW9ycGhldXNDb250ZW50fSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcbmltcG9ydCB7UG9seW1vcnBoZXVzT3V0bGV0fSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcblxuaW1wb3J0IHtUVUlfUkVPUkRFUl9PUFRJT05TfSBmcm9tICcuL3Jlb3JkZXIub3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktcmVvcmRlcicsXG4gICAgaW1wb3J0czogW0FzeW5jUGlwZSwgTmdGb3JPZiwgUG9seW1vcnBoZXVzT3V0bGV0LCBUdWlCdXR0b24sIFR1aUljb24sIFR1aVRpbGVzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVvcmRlci50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yZW9yZGVyLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX1RJTEVTX1JFT1JERVIsXG4gICAgICAgICAgICB1c2VWYWx1ZTogdHVpVGlsZXNTaGlmdCxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhmb2N1c291dC5zdG9wKSc6ICcoMCknLFxuICAgICAgICAnKHBvaW50ZXJkb3duLnpvbmVsZXNzKSc6ICdvbkRyYWcoKScsXG4gICAgICAgICcoZG9jdW1lbnQ6cG9pbnRlcnVwLnpvbmVsZXNzKSc6ICdvbkRyb3AoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpUmVvcmRlcjxUPiB7XG4gICAgcHJpdmF0ZSBkcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIG9yZGVyID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBwcm90ZWN0ZWQgdW5zb3J0ZWRJdGVtczogcmVhZG9ubHkgVFtdID0gW107XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX1JFT1JERVJfT1BUSU9OUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dIaWRlVGV4dCQgPSBpbmplY3QoVFVJX1RBQkxFX1NIT1dfSElERV9NRVNTQUdFKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVuYWJsZWQ6IHJlYWRvbmx5IFRbXSA9IFtdO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKGl0ZW1zOiByZWFkb25seSBUW10pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXRlbXMubGVuZ3RoICE9PSB0aGlzLnVuc29ydGVkSXRlbXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAhaXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMudW5zb3J0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnVuc29ydGVkSXRlbXMgPSBpdGVtcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbnRlbnQ6IFBvbHltb3JwaGV1c0NvbnRlbnQ8VHVpQ29udGV4dDxUPiAmIHtpbmRleDogbnVtYmVyfT4gPSAoe1xuICAgICAgICAkaW1wbGljaXQsXG4gICAgfSkgPT4gU3RyaW5nKCRpbXBsaWNpdCk7XG5cbiAgICBwcm90ZWN0ZWQgb25EcmFnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Ecm9wKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0VuYWJsZWQoaXRlbTogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkLmluY2x1ZGVzKGl0ZW0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJY29uKGl0ZW06IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0VuYWJsZWQoaXRlbSkgPyB0aGlzLm9wdGlvbnMuaWNvbnMuaGlkZSA6IHRoaXMub3B0aW9ucy5pY29ucy5zaG93O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGUodG9nZ2xlZDogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0aGlzLmlzRW5hYmxlZCh0b2dnbGVkKVxuICAgICAgICAgICAgPyB0aGlzLmVuYWJsZWQuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB0b2dnbGVkKVxuICAgICAgICAgICAgOiB0aGlzLmVuYWJsZWQuY29uY2F0KHRvZ2dsZWQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtb3ZlKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5vcmRlci5nZXQoaW5kZXgpID8/IGluZGV4O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICghb2xkSW5kZXggJiYgZGlyZWN0aW9uIDwgMCkgfHxcbiAgICAgICAgICAgIChvbGRJbmRleCA9PT0gdGhpcy51bnNvcnRlZEl0ZW1zLmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID4gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IG9sZEluZGV4ICsgZGlyZWN0aW9uO1xuICAgICAgICBjb25zdCBvbGRJdGVtID0gQXJyYXkuZnJvbSh0aGlzLm9yZGVyLnZhbHVlcygpKS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSA9PT0gbmV3SW5kZXgsXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcmRlci5zZXQoaW5kZXgsIG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5vcmRlci5zZXQob2xkSXRlbSwgb2xkSW5kZXgpO1xuICAgICAgICB0aGlzLm9yZGVyID0gbmV3IE1hcCh0aGlzLm9yZGVyKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IG5ldyBBcnJheSh0aGlzLnVuc29ydGVkSXRlbXMubGVuZ3RoKTtcblxuICAgICAgICB0aGlzLnVuc29ydGVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW3RoaXMub3JkZXIuZ2V0KGluZGV4KSA/PyBpbmRleF0gPSBpdGVtO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KHRoaXMuZ2V0U29ydGVkSXRlbXMoKSk7XG4gICAgICAgIHRoaXMudXBkYXRlRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRW5hYmxlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuZ2V0U29ydGVkSXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuaXNFbmFibGVkKGl0ZW0pKTtcblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICB0aGlzLmVuYWJsZWRDaGFuZ2UuZW1pdChlbmFibGVkKTtcbiAgICB9XG59XG4iLCI8dHVpLXRpbGVzXG4gICAgY2xhc3M9XCJ0LXdyYXBwZXJcIlxuICAgIFsob3JkZXIpXT1cIm9yZGVyXCJcbj5cbiAgICA8dHVpLXRpbGVcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdW5zb3J0ZWRJdGVtczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICBbc3R5bGUub3JkZXJdPVwib3JkZXIuZ2V0KGluZGV4KVwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgICAgICBbY2xhc3MudC1pdGVtX2Rpc2FibGVkXT1cIiFpc0VuYWJsZWQoaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgdHVpVGlsZUhhbmRsZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwidC1kcmFnZ2FibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbnMuaWNvbnMuZHJhZ1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpwb2x5bW9ycGhldXNPdXRsZXQ9XCJjb250ZW50IGFzIHRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpbmRleDogaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2ljb25TdGFydF09XCJnZXRJY29uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5hcnJvd0Rvd24ucHJldmVudCk9XCJtb3ZlKGluZGV4LCAxKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uYXJyb3dVcC5wcmV2ZW50KT1cIm1vdmUoaW5kZXgsIC0xKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgc2hvd0hpZGVUZXh0JCB8IGFzeW5jIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC90dWktdGlsZT5cbjwvdHVpLXRpbGVzPlxuIl19