@taiga-ui/addon-table
Version:
A library to display tabled data with filters, search, group actions, etc.
112 lines • 22.8 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXpFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRixPQUFPLEVBQTJCLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7OztBQUV0RCxNQW1CYSxVQUFVO0lBbkJ2QjtRQW9CWSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWYsVUFBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ2xDLGtCQUFhLEdBQWlCLEVBQUUsQ0FBQztRQUN4QixZQUFPLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEMsa0JBQWEsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUdoRSxZQUFPLEdB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QWtCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsbUJBRzlELHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsUUFBUSxFQUFFLGFBQWE7eUJBQzFCO3FCQUNKLFFBQ0s7d0JBQ0YsaUJBQWlCLEVBQUUsS0FBSzt3QkFDeEIsd0JBQXdCLEVBQUUsVUFBVTt3QkFDcEMsK0JBQStCLEVBQUUsVUFBVTtxQkFDOUM7OEJBV00sT0FBTztzQkFEYixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsYUFBYTtzQkFENUIsTUFBTTtnQkFJSSxLQUFLO3NCQURmLEtBQUs7Z0JBV0MsT0FBTztzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nRm9yT2Z9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RVSV9UQUJMRV9TSE9XX0hJREVfTUVTU0FHRX0gZnJvbSAnQHRhaWdhLXVpL2FkZG9uLXRhYmxlL3Rva2Vucyc7XG5pbXBvcnQge3R5cGUgVHVpQ29udGV4dH0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge1R1aUJ1dHRvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtUVUlfVElMRVNfUkVPUkRFUiwgVHVpVGlsZXMsIHR1aVRpbGVzU2hpZnR9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy90aWxlcyc7XG5pbXBvcnQge3R5cGUgUG9seW1vcnBoZXVzQ29udGVudCwgUG9seW1vcnBoZXVzT3V0bGV0fSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcblxuaW1wb3J0IHtUVUlfUkVPUkRFUl9PUFRJT05TfSBmcm9tICcuL3Jlb3JkZXIub3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktcmVvcmRlcicsXG4gICAgaW1wb3J0czogW0FzeW5jUGlwZSwgTmdGb3JPZiwgUG9seW1vcnBoZXVzT3V0bGV0LCBUdWlCdXR0b24sIFR1aUljb24sIFR1aVRpbGVzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVvcmRlci50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yZW9yZGVyLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX1RJTEVTX1JFT1JERVIsXG4gICAgICAgICAgICB1c2VWYWx1ZTogdHVpVGlsZXNTaGlmdCxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhmb2N1c291dC5zdG9wKSc6ICcoMCknLFxuICAgICAgICAnKHBvaW50ZXJkb3duLnpvbmVsZXNzKSc6ICdvbkRyYWcoKScsXG4gICAgICAgICcoZG9jdW1lbnQ6cG9pbnRlcnVwLnpvbmVsZXNzKSc6ICdvbkRyb3AoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpUmVvcmRlcjxUPiB7XG4gICAgcHJpdmF0ZSBkcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIG9yZGVyID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBwcm90ZWN0ZWQgdW5zb3J0ZWRJdGVtczogcmVhZG9ubHkgVFtdID0gW107XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX1JFT1JERVJfT1BUSU9OUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dIaWRlVGV4dCQgPSBpbmplY3QoVFVJX1RBQkxFX1NIT1dfSElERV9NRVNTQUdFKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVuYWJsZWQ6IHJlYWRvbmx5IFRbXSA9IFtdO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKGl0ZW1zOiByZWFkb25seSBUW10pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXRlbXMubGVuZ3RoICE9PSB0aGlzLnVuc29ydGVkSXRlbXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAhaXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMudW5zb3J0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnVuc29ydGVkSXRlbXMgPSBpdGVtcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbnRlbnQ6IFBvbHltb3JwaGV1c0NvbnRlbnQ8VHVpQ29udGV4dDxUPiAmIHtpbmRleDogbnVtYmVyfT4gPSAoe1xuICAgICAgICAkaW1wbGljaXQsXG4gICAgfSkgPT4gU3RyaW5nKCRpbXBsaWNpdCk7XG5cbiAgICBwcm90ZWN0ZWQgb25EcmFnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Ecm9wKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0VuYWJsZWQoaXRlbTogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkLmluY2x1ZGVzKGl0ZW0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRJY29uKGl0ZW06IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0VuYWJsZWQoaXRlbSkgPyB0aGlzLm9wdGlvbnMuaWNvbnMuaGlkZSA6IHRoaXMub3B0aW9ucy5pY29ucy5zaG93O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGUodG9nZ2xlZDogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0aGlzLmlzRW5hYmxlZCh0b2dnbGVkKVxuICAgICAgICAgICAgPyB0aGlzLmVuYWJsZWQuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB0b2dnbGVkKVxuICAgICAgICAgICAgOiB0aGlzLmVuYWJsZWQuY29uY2F0KHRvZ2dsZWQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtb3ZlKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5vcmRlci5nZXQoaW5kZXgpID8/IGluZGV4O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICghb2xkSW5kZXggJiYgZGlyZWN0aW9uIDwgMCkgfHxcbiAgICAgICAgICAgIChvbGRJbmRleCA9PT0gdGhpcy51bnNvcnRlZEl0ZW1zLmxlbmd0aCAtIDEgJiYgZGlyZWN0aW9uID4gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IG9sZEluZGV4ICsgZGlyZWN0aW9uO1xuICAgICAgICBjb25zdCBvbGRJdGVtID0gQXJyYXkuZnJvbSh0aGlzLm9yZGVyLnZhbHVlcygpKS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSA9PT0gbmV3SW5kZXgsXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcmRlci5zZXQoaW5kZXgsIG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5vcmRlci5zZXQob2xkSXRlbSwgb2xkSW5kZXgpO1xuICAgICAgICB0aGlzLm9yZGVyID0gbmV3IE1hcCh0aGlzLm9yZGVyKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3J0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IG5ldyBBcnJheSh0aGlzLnVuc29ydGVkSXRlbXMubGVuZ3RoKTtcblxuICAgICAgICB0aGlzLnVuc29ydGVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW3RoaXMub3JkZXIuZ2V0KGluZGV4KSA/PyBpbmRleF0gPSBpdGVtO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KHRoaXMuZ2V0U29ydGVkSXRlbXMoKSk7XG4gICAgICAgIHRoaXMudXBkYXRlRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRW5hYmxlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuZ2V0U29ydGVkSXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuaXNFbmFibGVkKGl0ZW0pKTtcblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICB0aGlzLmVuYWJsZWRDaGFuZ2UuZW1pdChlbmFibGVkKTtcbiAgICB9XG59XG4iLCI8dHVpLXRpbGVzXG4gICAgY2xhc3M9XCJ0LXdyYXBwZXJcIlxuICAgIFsob3JkZXIpXT1cIm9yZGVyXCJcbj5cbiAgICA8dHVpLXRpbGVcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdW5zb3J0ZWRJdGVtczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICBbc3R5bGUub3JkZXJdPVwib3JkZXIuZ2V0KGluZGV4KVwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgICAgICBbY2xhc3MudC1pdGVtX2Rpc2FibGVkXT1cIiFpc0VuYWJsZWQoaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgdHVpVGlsZUhhbmRsZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwidC1kcmFnZ2FibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbnMuaWNvbnMuZHJhZ1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpwb2x5bW9ycGhldXNPdXRsZXQ9XCJjb250ZW50IGFzIHRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpbmRleDogaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRlbXBsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2ljb25TdGFydF09XCJnZXRJY29uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5hcnJvd0Rvd24ucHJldmVudCk9XCJtb3ZlKGluZGV4LCAxKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uYXJyb3dVcC5wcmV2ZW50KT1cIm1vdmUoaW5kZXgsIC0xKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgc2hvd0hpZGVUZXh0JCB8IGFzeW5jIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC90dWktdGlsZT5cbjwvdHVpLXRpbGVzPlxuIl19