UNPKG

@taiga-ui/addon-table

Version:

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

81 lines 20.5 kB
/// <reference types="@taiga-ui/tsconfig/ng-dev-mode" /> /// <reference types="@taiga-ui/tsconfig/ng-dev-mode" /> import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, Input, } from '@angular/core'; import { tuiDefaultSort } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { TuiTableHead } from '../directives/head.directive'; import { TuiTableResized } from '../directives/resized.directive'; import { TuiTableDirective } from '../directives/table.directive'; import { TUI_TABLE_OPTIONS, TuiSortDirection } from '../table.options'; import * as i0 from "@angular/core"; class TuiTableTh { constructor() { this.options = inject(TUI_TABLE_OPTIONS); this.head = inject(TuiTableHead, { optional: true, }); this.width = null; this.table = inject(forwardRef(() => TuiTableDirective), { optional: true }); this.sorter = this.head ? (a, b) => tuiDefaultSort(a[this.key], b[this.key]) : null; this.resizable = this.options.resizable; this.sticky = this.options.sticky; this.requiredSort = this.options.requiredSort; } get key() { if (!this.head) { throw new TuiTableSortKeyException(); } return this.head.tuiHead; } get isCurrent() { return !!this.sorter && !!this.table && this.sorter === this.table.sorter; } get icon() { if (this.isCurrent) { return this.table?.direction === TuiSortDirection.Asc ? this.options.sortIcons.asc : this.options.sortIcons.desc; } return this.options.sortIcons.off; } updateSorterAndDirection() { const sorter = this.requiredSort ? this.sorter : null; this.table?.updateSorterAndDirection(this.isCurrentAndDescDirection ? sorter : this.sorter); } onResized(width) { this.width = width; } get isCurrentAndDescDirection() { return (this.sorter === this.table?.sorter && this.table?.direction === TuiSortDirection.Desc); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableTh, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableTh, isStandalone: true, selector: "th[tuiTh]", inputs: { sorter: "sorter", resizable: "resizable", sticky: "sticky", requiredSort: "requiredSort" }, host: { properties: { "style.min-width.px": "width", "style.width.px": "width", "style.max-width.px": "width", "class._sticky": "sticky" } }, ngImport: i0, template: "<button\n *ngIf=\"sorter && table; else content\"\n type=\"button\"\n class=\"t-sort\"\n [class.t-sort_sorted]=\"isCurrent\"\n (click)=\"updateSorterAndDirection()\"\n>\n <ng-container [ngTemplateOutlet]=\"content\" />\n {{ table && table.change$ | async }}\n <tui-icon\n class=\"t-icon\"\n [icon]=\"icon\"\n />\n</button>\n<ng-template #content>\n <ng-content />\n</ng-template>\n<div\n *ngIf=\"resizable\"\n class=\"t-bar\"\n (tuiResized)=\"onResized($event)\"\n></div>\n", styles: [":host{transition-property:box-shadow;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:0;block-size:var(--tui-height-m);font:var(--tui-font-text-s);text-align:start;font-weight:700;color:var(--tui-text-secondary);background:var(--tui-background-base);cursor:default;padding:0 .75rem;box-sizing:border-box;box-shadow:0 .3125rem #ededed00;border:1px solid var(--tui-border-normal);filter:opacity(1)}@supports (-webkit-hyphens: none){:host{transform:translateZ(0)}}:host:not(:first-child){border-inline-start:none}:host._sticky,:host-context(._stuck) :host._sticky{position:sticky;z-index:30}:host._sticky:first-child,:host-context(._stuck) :host._sticky:first-child{left:0}:host._sticky:after,:host-context(._stuck) :host._sticky:after{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;content:\"\";position:absolute;top:0;left:100%;bottom:0;inline-size:.3125rem;pointer-events:none;background:#edededb3;opacity:0}:host-context(._stuck) :host{z-index:20}:host-context(tr:not(:first-child)){border-block-start:none}:host-context(table[data-size=\"l\"]){block-size:var(--tui-height-l);font:var(--tui-font-text-m);font-weight:700;padding:0 1rem}:host-context(table[data-size=\"s\"]){block-size:var(--tui-height-s);font:var(--tui-font-text-s);font-weight:700;padding:0 .5rem}:host-context(thead[tuiThead]){position:sticky}:host-context(table._stuck)._sticky:after{opacity:1}:host-context(thead[tuiThead]._stuck){box-shadow:0 .3125rem #edededb3}:host-context([tuiTheme=\"dark\"])._sticky:after{background:#3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck){box-shadow:0 .3125rem #3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck):first-child{box-shadow:.0625rem .3125rem #3c3c3ce6}:host-context(table[data-size=\"l\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-l)}:host-context(table[data-size=\"m\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-m)}:host-context(table[data-size=\"s\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-s)}.t-sort{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;-webkit-appearance:none;appearance:none;padding:0;border:0;background:none;line-height:inherit;text-decoration:none;display:flex;flex-direction:inherit;align-items:center;outline:none;font:inherit;text-transform:inherit;color:inherit;cursor:pointer}.t-sort_sorted{color:var(--tui-text-primary)}.t-sort:focus-visible{background:var(--tui-service-selection-background)}.t-sort:hover{color:var(--tui-text-primary)}.t-bar{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:0;bottom:0;right:-1px;inline-size:3px;justify-self:flex-end;border-inline-start:2px solid transparent;background:var(--tui-status-warning);background-clip:content-box;cursor:ew-resize;opacity:0}.t-bar:hover,.t-bar:active{opacity:1}.t-icon{border-width:.25rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiTableResized, selector: "[tuiResized]", outputs: ["tuiResized"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiTableTh }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableTh, decorators: [{ type: Component, args: [{ standalone: true, selector: 'th[tuiTh]', imports: [AsyncPipe, NgIf, NgTemplateOutlet, TuiIcon, TuiTableResized], changeDetection: ChangeDetectionStrategy.OnPush, host: { '[style.min-width.px]': 'width', '[style.width.px]': 'width', '[style.max-width.px]': 'width', '[class._sticky]': 'sticky', }, template: "<button\n *ngIf=\"sorter && table; else content\"\n type=\"button\"\n class=\"t-sort\"\n [class.t-sort_sorted]=\"isCurrent\"\n (click)=\"updateSorterAndDirection()\"\n>\n <ng-container [ngTemplateOutlet]=\"content\" />\n {{ table && table.change$ | async }}\n <tui-icon\n class=\"t-icon\"\n [icon]=\"icon\"\n />\n</button>\n<ng-template #content>\n <ng-content />\n</ng-template>\n<div\n *ngIf=\"resizable\"\n class=\"t-bar\"\n (tuiResized)=\"onResized($event)\"\n></div>\n", styles: [":host{transition-property:box-shadow;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:0;block-size:var(--tui-height-m);font:var(--tui-font-text-s);text-align:start;font-weight:700;color:var(--tui-text-secondary);background:var(--tui-background-base);cursor:default;padding:0 .75rem;box-sizing:border-box;box-shadow:0 .3125rem #ededed00;border:1px solid var(--tui-border-normal);filter:opacity(1)}@supports (-webkit-hyphens: none){:host{transform:translateZ(0)}}:host:not(:first-child){border-inline-start:none}:host._sticky,:host-context(._stuck) :host._sticky{position:sticky;z-index:30}:host._sticky:first-child,:host-context(._stuck) :host._sticky:first-child{left:0}:host._sticky:after,:host-context(._stuck) :host._sticky:after{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;content:\"\";position:absolute;top:0;left:100%;bottom:0;inline-size:.3125rem;pointer-events:none;background:#edededb3;opacity:0}:host-context(._stuck) :host{z-index:20}:host-context(tr:not(:first-child)){border-block-start:none}:host-context(table[data-size=\"l\"]){block-size:var(--tui-height-l);font:var(--tui-font-text-m);font-weight:700;padding:0 1rem}:host-context(table[data-size=\"s\"]){block-size:var(--tui-height-s);font:var(--tui-font-text-s);font-weight:700;padding:0 .5rem}:host-context(thead[tuiThead]){position:sticky}:host-context(table._stuck)._sticky:after{opacity:1}:host-context(thead[tuiThead]._stuck){box-shadow:0 .3125rem #edededb3}:host-context([tuiTheme=\"dark\"])._sticky:after{background:#3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck){box-shadow:0 .3125rem #3c3c3ce6}:host-context([tuiTheme=\"dark\"] thead[tuiThead]._stuck):first-child{box-shadow:.0625rem .3125rem #3c3c3ce6}:host-context(table[data-size=\"l\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-l)}:host-context(table[data-size=\"m\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-m)}:host-context(table[data-size=\"s\"] thead[tuiThead] tr:nth-child(2)){top:var(--tui-height-s)}.t-sort{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;-webkit-appearance:none;appearance:none;padding:0;border:0;background:none;line-height:inherit;text-decoration:none;display:flex;flex-direction:inherit;align-items:center;outline:none;font:inherit;text-transform:inherit;color:inherit;cursor:pointer}.t-sort_sorted{color:var(--tui-text-primary)}.t-sort:focus-visible{background:var(--tui-service-selection-background)}.t-sort:hover{color:var(--tui-text-primary)}.t-bar{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:0;bottom:0;right:-1px;inline-size:3px;justify-self:flex-end;border-inline-start:2px solid transparent;background:var(--tui-status-warning);background-clip:content-box;cursor:ew-resize;opacity:0}.t-bar:hover,.t-bar:active{opacity:1}.t-icon{border-width:.25rem}\n"] }] }], propDecorators: { sorter: [{ type: Input }], resizable: [{ type: Input }], sticky: [{ type: Input }], requiredSort: [{ type: Input }] } }); export class TuiTableSortKeyException extends Error { constructor() { super(ngDevMode ? 'Trying to sort with no key' : ''); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tdGFibGUvY29tcG9uZW50cy90YWJsZS90aC90aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlL3RoL3RoLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBQXhELHdEQUF3RDtBQUN4RCxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFckUsTUFjYSxVQUFVO0lBZHZCO1FBZXFCLFlBQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVwQyxTQUFJLEdBQUcsTUFBTSxDQUFrQixZQUFZLEVBQUU7WUFDMUQsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBRU8sVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFbkIsVUFBSyxHQUFHLE1BQU0sQ0FDN0IsVUFBVSxDQUFDLEdBQUcs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S0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSzs7QUE2Q1YsTUFBTSxPQUFPLHdCQUF5QixTQUFRLEtBQUs7SUFDL0M7UUFDSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJAdGFpZ2EtdWkvdHNjb25maWcvbmctZGV2LW1vZGVcIiAvPlxuaW1wb3J0IHtBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7VHVpQ29tcGFyYXRvcn0gZnJvbSAnQHRhaWdhLXVpL2FkZG9uLXRhYmxlL3R5cGVzJztcbmltcG9ydCB7dHVpRGVmYXVsdFNvcnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aUljb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvaWNvbic7XG5cbmltcG9ydCB7VHVpVGFibGVIZWFkfSBmcm9tICcuLi9kaXJlY3RpdmVzL2hlYWQuZGlyZWN0aXZlJztcbmltcG9ydCB7VHVpVGFibGVSZXNpemVkfSBmcm9tICcuLi9kaXJlY3RpdmVzL3Jlc2l6ZWQuZGlyZWN0aXZlJztcbmltcG9ydCB7VHVpVGFibGVEaXJlY3RpdmV9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7VFVJX1RBQkxFX09QVElPTlMsIFR1aVNvcnREaXJlY3Rpb259IGZyb20gJy4uL3RhYmxlLm9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndGhbdHVpVGhdJyxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBUdWlJY29uLCBUdWlUYWJsZVJlc2l6ZWRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90aC50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90aC5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICAnW3N0eWxlLm1pbi13aWR0aC5weF0nOiAnd2lkdGgnLFxuICAgICAgICAnW3N0eWxlLndpZHRoLnB4XSc6ICd3aWR0aCcsXG4gICAgICAgICdbc3R5bGUubWF4LXdpZHRoLnB4XSc6ICd3aWR0aCcsXG4gICAgICAgICdbY2xhc3MuX3N0aWNreV0nOiAnc3RpY2t5JyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlUYWJsZVRoPFQgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBhbnk+Pj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfVEFCTEVfT1BUSU9OUyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlYWQgPSBpbmplY3Q8VHVpVGFibGVIZWFkPFQ+PihUdWlUYWJsZUhlYWQsIHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgd2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlID0gaW5qZWN0PFR1aVRhYmxlRGlyZWN0aXZlPFQ+PihcbiAgICAgICAgZm9yd2FyZFJlZigoKSA9PiBUdWlUYWJsZURpcmVjdGl2ZSksXG4gICAgICAgIHtvcHRpb25hbDogdHJ1ZX0sXG4gICAgKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNvcnRlcjogVHVpQ29tcGFyYXRvcjxUPiB8IG51bGwgPSB0aGlzLmhlYWRcbiAgICAgICAgPyAoYSwgYikgPT4gdHVpRGVmYXVsdFNvcnQoYVt0aGlzLmtleV0sIGJbdGhpcy5rZXldKVxuICAgICAgICA6IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZXNpemFibGUgPSB0aGlzLm9wdGlvbnMucmVzaXphYmxlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3RpY2t5ID0gdGhpcy5vcHRpb25zLnN0aWNreTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlcXVpcmVkU29ydCA9IHRoaXMub3B0aW9ucy5yZXF1aXJlZFNvcnQ7XG5cbiAgICBwdWJsaWMgZ2V0IGtleSgpOiBrZXlvZiBUIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUdWlUYWJsZVNvcnRLZXlFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhlYWQudHVpSGVhZCBhcyBrZXlvZiBUO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaXNDdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnNvcnRlciAmJiAhIXRoaXMudGFibGUgJiYgdGhpcy5zb3J0ZXIgPT09IHRoaXMudGFibGUuc29ydGVyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaWNvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5pc0N1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhYmxlPy5kaXJlY3Rpb24gPT09IFR1aVNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMuc29ydEljb25zLmFzY1xuICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnNvcnRJY29ucy5kZXNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zb3J0SWNvbnMub2ZmO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVTb3J0ZXJBbmREaXJlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNvcnRlciA9IHRoaXMucmVxdWlyZWRTb3J0ID8gdGhpcy5zb3J0ZXIgOiBudWxsO1xuXG4gICAgICAgIHRoaXMudGFibGU/LnVwZGF0ZVNvcnRlckFuZERpcmVjdGlvbihcbiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50QW5kRGVzY0RpcmVjdGlvbiA/IHNvcnRlciA6IHRoaXMuc29ydGVyLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblJlc2l6ZWQod2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXNDdXJyZW50QW5kRGVzY0RpcmVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuc29ydGVyID09PSB0aGlzLnRhYmxlPy5zb3J0ZXIgJiZcbiAgICAgICAgICAgIHRoaXMudGFibGU/LmRpcmVjdGlvbiA9PT0gVHVpU29ydERpcmVjdGlvbi5EZXNjXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHVpVGFibGVTb3J0S2V5RXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihuZ0Rldk1vZGUgPyAnVHJ5aW5nIHRvIHNvcnQgd2l0aCBubyBrZXknIDogJycpO1xuICAgIH1cbn1cbiIsIjxidXR0b25cbiAgICAqbmdJZj1cInNvcnRlciAmJiB0YWJsZTsgZWxzZSBjb250ZW50XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInQtc29ydFwiXG4gICAgW2NsYXNzLnQtc29ydF9zb3J0ZWRdPVwiaXNDdXJyZW50XCJcbiAgICAoY2xpY2spPVwidXBkYXRlU29ydGVyQW5kRGlyZWN0aW9uKClcIlxuPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFwiIC8+XG4gICAge3sgdGFibGUgJiYgdGFibGUuY2hhbmdlJCB8IGFzeW5jIH19XG4gICAgPHR1aS1pY29uXG4gICAgICAgIGNsYXNzPVwidC1pY29uXCJcbiAgICAgICAgW2ljb25dPVwiaWNvblwiXG4gICAgLz5cbjwvYnV0dG9uPlxuPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICAgIDxuZy1jb250ZW50IC8+XG48L25nLXRlbXBsYXRlPlxuPGRpdlxuICAgICpuZ0lmPVwicmVzaXphYmxlXCJcbiAgICBjbGFzcz1cInQtYmFyXCJcbiAgICAodHVpUmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXG4+PC9kaXY+XG4iXX0=